:- use_module(library(clpfd)).
solution(Pairs) :-
Vs = [L,M,O,R,S,_V],
Names = [l,m,o,r,s,v],
pairs_keys_values(Pairs, Vs, Names),
R #\= S+1,
R #\= S-1,
M #= L+1,
O #> M,
O #< S,
Vs ins 1..6.
주, 그리고 I :
따라서, 나는 다음과 같은 약간의 재 작성을 제안 약 쌍의 이유는입니다. 더구나 나는이 모든 것을 제약으로 표현할 자유를 취 했으므로 각 순열을 시도하는 대신 전파의 제약을받는 이점이 있습니다. 제약 조건을 사용하면 Prolog 엔진은 을 시도하지 않고도 검색 의 상당 부분을 prune 할 수 있습니다. 변수 V
을 나타내는 데 _V
을 사용하고 있는데,이 변수는 다른 곳에서 언급되지 않았으므로 V
을 사용하면 경고가 이됩니다.
우리는 이미 그것을 밖으로 시도 할 수 있습니다 : 종류 이름에 이제
?- solution(Pairs),
pairs_keys_values(Pairs, Vs, Names),
label(Vs).
Pairs = [1-l, 2-m, 3-o, 1-r, 4-s, 1-v],
Vs = [1, 2, 3, 1, 4, 1],
Names = [l, m, o, r, s, v] ;
Pairs = [1-l, 2-m, 3-o, 1-r, 4-s, 2-v],
Vs = [1, 2, 3, 1, 4, 2],
Names = [l, m, o, r, s, v] ;
Pairs = [1-l, 2-m, 3-o, 1-r, 4-s, 3-v],
Vs = [1, 2, 3, 1, 4, 3],
Names = [l, m, o, r, s, v] ;
etc.
을,이 변수의 값에 따라, 쌍을 정렬합니다 ISO 조건 keysort/2
를 사용하는 자신의 키에 따라 즉, 첫 번째 구성 요소 :
?- solution(Pairs0),
pairs_keys_values(Pairs0, Vs0, Names0),
label(Vs0),
keysort(Pairs0, Pairs),
pairs_values(Pairs, Names).
Pairs0 = [1-l, 2-m, 3-o, 1-r, 4-s, 1-v],
Vs0 = [1, 2, 3, 1, 4, 1],
Names0 = [l, m, o, r, s, v],
Pairs = [1-l, 1-r, 1-v, 2-m, 3-o, 4-s],
Names = [l, r, v, m, o, s] ;
Pairs0 = [1-l, 2-m, 3-o, 1-r, 4-s, 2-v],
Vs0 = [1, 2, 3, 1, 4, 2],
Names0 = [l, m, o, r, s, v],
Pairs = [1-l, 1-r, 2-m, 2-v, 3-o, 4-s],
Names = [l, r, m, v, o, s] ;
Pairs0 = [1-l, 2-m, 3-o, 1-r, 4-s, 3-v],
Vs0 = [1, 2, 3, 1, 4, 3],
Names0 = [l, m, o, r, s, v],
Pairs = [1-l, 1-r, 2-m, 3-o, 3-v, 4-s],
Names = [l, r, m, o, v, s] ;
Pairs0 = [1-l, 2-m, 3-o, 1-r, 4-s, 4-v],
Vs0 = [1, 2, 3, 1, 4, 4],
Names0 = [l, m, o, r, s, v],
Pairs = [1-l, 1-r, 2-m, 3-o, 4-s, 4-v],
Names = [l, r, m, o, s, v] ;
etc.