2017-01-22 3 views
0

나는 다음과 같은 조건이 있습니다Prolog에서 출력을 정렬하는 방법?

나는 REPL에서 호출
soln(L,M,O,R,S,V) :- 
    permutation([L,M,O,R,S,V],[1,2,3,4,5,6]), 
    R=\=S+1, 
    R=\=S-1, 
    M=:=L+1, 
    O>M, 
    O<S. 

, 그것은 출력한다 정답 : 그러나

?- soln(L,M,O,R,S,V). 
L = 1, 
M = 2, 
O = 3, 
R = 4, 
S = 6, 
V = 5 ; 
L = 1, 
M = 2, 
O = 3, 
R = 6, 
S = 4, 
V = 5 . 

, 나에게 더 유용한 변수가 분류되어 출력 될 것을 그들의 가치에 따라; 이전 예제를 사용하려면 [L,M,O,R,V,S], [L,M,O,S,V,R], ...과 같은 것이 이상적입니다.

REPL 및 독립 실행 형 스크립트에서이 작업을 수행하고 싶습니다.

답변

3

값에 따라 이름을 정렬하려면 변수와 해당 변수의 연관을 추적하고 이름이이어야합니다.

변수 이름이 Prolog 프로그램에서 액세스 할 수 없기 때문에 소스 코드에서 볼 수 있습니다. 따라서 Prolog 내에서 액세스 할 수있는 방식으로 이름을 추적해야합니다.

(Variable-Name)의 목록을 추적하는 한 가지 방법이 있습니다. 이렇게하면 변수가 값에 바인딩 될 때 여전히 의도 된 값인   을 알게됩니다. 지금은 이제 변수의을 이름을 표시하기 위해 o원자l, m을 사용하고

 
:- 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.