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

时间:2017-12-10 15:41:26

标签: prolog constraint-programming

我已经坚持了一段时间。我想要完成的是:

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

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谓词,但这次是列表列表。

1 个答案:

答案 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)