Prolog 使用CLPFD生成不同值的列表

Prolog 使用CLPFD生成不同值的列表,prolog,clpfd,Prolog,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,

我试图生成三个元素列表的所有可能组合,其中所有元素都是不同的。我正在使用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.

?- 

如何使用可能的整数值显示列表?

如果要使用CLPFD生成列表,则需要使用列表:您的代码只使用单个整数

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
现在您有了一个谓词,该谓词对由1、2、3组成的唯一列表成功:

?- 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

?- 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]].

现在我明白我的错误了,非常感谢@Lower!问候语。