Prolog约束逻辑编程-检查列表元素是否不同(列表列表)

Prolog约束逻辑编程-检查列表元素是否不同(列表列表),prolog,constraint-programming,Prolog,Constraint Programming,我做这个练习已经有一段时间了。我正在努力实现的是: 给定列表列表,检查所有元素是否不同。例如: 例1- 例2- 例3- 我的目标是,在知道这个问题的解决方案之后,将它应用到Prolog约束逻辑编程中,以限制任何列表L(列表列表列表)的元素相同的可能性 换言之: 在Sicstus Prolog上应用所有不同的谓词,但这次是针对列表列表。这里是使用布尔变量的解决方案(我使用ECLiPSe Prolog编写的,在另一个Prolog中翻译它并不困难…) :-lib(fd)。 allListsDiffer

我做这个练习已经有一段时间了。我正在努力实现的是:

给定列表列表,检查所有元素是否不同。例如:

例1-

例2-

例3-

我的目标是,在知道这个问题的解决方案之后,将它应用到Prolog约束逻辑编程中,以限制任何列表L(列表列表列表)的元素相同的可能性

换言之:
在Sicstus Prolog上应用所有不同的谓词,但这次是针对列表列表。

这里是使用布尔变量的解决方案(我使用ECLiPSe Prolog编写的,在另一个Prolog中翻译它并不困难…)

:-lib(fd)。
allListsDifferent2([]、[]、[])。
所有列表差异2([H1 | T1]、[H2 | T2]、[HB | TB]):-
H1#=H2#HB,
所有列表都有差异2(T1、T2、TB)。
allListsDifferent1(,[])。
所有列表差异1(HA[HB|T]):-
长度(HA,N),
长度(磅,N),
LB::0..1,
fd_global:sumlist(LB,S),
S#
因为这里的列表差异似乎是由它们无法统一定义的,它们不是相同的元素,或者列表中相同元素的顺序不同,所以对简单原子进行求解,您应该能够应用结果。现在不要把元素本身挂在列表上。您可以使用具体化谓词,如
P#Q
,以及布尔变量。对于列表的每个组合
(L1,…,Ln)
,对于每个元素
(L1E1,…,LnEn)
L1E1#=L2E1#B1
ecc,其中
Bk
是一个布尔变量,然后约束列表与所有
Bk
相对某个组合的总和小于每个列表中的元素数。顺便说一句,这种方法没有做很多传播…谢谢你所有的答案!我想我现在能做了。你的回答真的帮了我的忙!可以肯定的是,在Sicstus Prolog I'v上更改:LB::0..1到domain(LB,0,1)和sumlist(LB,S),S#L=[[1,2,3],[3,2,1],[2,1,3]], check_diff(L). %must return true
L=[[1,2,3],[2,3,1],[2,1,3]], check_diff(L).
%must return true
L=[[1,2,3],[1,2,3],[3,1,2]], check_diff(L).
%must return false
:-lib(fd).

allListsDifferent2([],[],[]).
allListsDifferent2([H1|T1],[H2|T2],[HB|TB]):-
    H1 #= H2 #<=> HB,
    allListsDifferent2(T1,T2,TB).

allListsDifferent1(_,[]).
allListsDifferent1(HA,[HB|T]):-
    length(HA,N),
    length(LB,N),
    LB::0..1,
    fd_global:sumlist(LB,S),
    S #< N,
    allListsDifferent2(HA,HB,LB),
    allListsDifferent1(HA,T).

allListsDifferent([_]).
allListsDifferent([HA,HB|T]):-
    allListsDifferent1(HA,[HB|T]),
    allListsDifferent([HB|T]).

?- allListsDifferent([[1, 2, 3], [3, 2, 1], [2, 1, 3]]).
Yes (0.02s cpu, solution 1, maybe more)
No (0.03s cpu)
?- allListsDifferent([[1, 2, 3], [3, 2, 1], [3, 2, 1]]).
No (0.00s cpu)