我已经坚持了一段时间。我想要完成的是:
给定列表列表,检查所有元素是否不同。例如:
Ex1 -
L=[[1,2,3],[3,2,1],[2,1,3]], check_diff(L).
%must return true
Ex2 -
L=[[1,2,3],[2,3,1],[2,1,3]], check_diff(L).
%must return true
Ex3 -
L=[[1,2,3],[1,2,3],[3,1,2]], check_diff(L).
%must return false
我的目标是,在知道解决方案后,将其应用于Prolog约束逻辑编程,以限制任何列表L(列表列表)的元素相同的可能性。
换句话说: 在Sicstus Prolog上应用all_different谓词,但这次是列表列表。
答案 0 :(得分:2)
这里使用布尔变量的解决方案(我使用ECLiPSe prolog编写它,sholud并不难将其转换为另一个prolog ...)
:-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)