使用CLPFD生成不同值的列表

时间:2017-04-15 02:26:02

标签: 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, _7380]),
_7380 in 2..3.

?- 

如何显示带有可能整数值的列表?

1 个答案:

答案 0 :(得分:1)

如果要使用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]].