2017-04-15 6 views
1

모든 요소가 다른 세 요소의 가능한 모든 조합을 생성하려고합니다. CLPFD 라이브러리를 사용하여 변수의 도메인을 정의합니다. CLPFD를 사용하여 다른 값 목록 생성

나는 쿼리에 다음

listDif(F,X):-F ins 1..3,findall(F,all_distinct(F),X). 

그리고 답변

?- listDif([1,_,2],X). 
X = [[1, 3, 2]]. 

?- listDif([1,_,_],X). 
X = [[1, _7374, _7380]], 
_7374 in 2..3, 
all_distinct([1, _7374, _7380]), 
_7380 in 2..3. 

?- 

이 어떻게 가능한 정수 값 목록을 표시 할 수 있습니다 정의?

답변

1

CLPFD로 목록을 생성하려면 목록을 사용해야합니다. :) 귀하의 코드는 단지 개별 정수를 사용하고 있습니다. 당신이 목록의 모든 목록을 갖고 싶어

?- list3(F), label(F). 
F = [1, 2, 3] ; 
F = [1, 3, 2] ; 
F = [2, 1, 3] ; 
F = [2, 3, 1] ; 
F = [3, 1, 2] ; 
F = [3, 2, 1]. 

이 그럼 당신은 findall/3를 사용할 수 있습니다

list3(F) :- 
    length(F, 3),   % F is a list of length 3 
    F ins 1..3,   % Elements of F are in the range 1..3 
    all_distinct(F).  % F has distinct elements 

이제 2, 1로 구성된 고유의 목록에 대한 성공 술어, 3을 가지고 :

?- findall(F, (list3(F), label(F)), AllList3). 
AllList3 = [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]. 
+0

이제 오류를 이해하고 있습니다. @lurker! 인사말. – MLStud