【问题标题】:Prolog constraint logic programming - Check if elements of list are different (list of lists)Prolog约束逻辑编程 - 检查列表元素是否不同(列表列表)
【发布时间】:2017-12-10 15:41:25
【问题描述】:

我在这个练习上坚持了一段时间。我想要完成的是:

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

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 谓词,但这次是针对 List of Lists。

【问题讨论】:

  • 由于这里的列表差异似乎是由它们无法统一来定义的,这不是相同的元素,或者列表中相同的元素顺序不同,那么解决它为简单的原子,你应该能够应用结果。暂时不要纠结于元素本身就是列表。
  • 您可以使用具体化谓词(如P#<==>Q)和布尔变量。对于列表(L1,...,Ln)的每个组合,对于每个元素(L1E1,...,LnEn)L1E1 #= L2E1 #<==> B1 ecc,其中Bk是一个布尔变量,然后约束列表的总和与所有Bk相对某个组合,为小于每个列表中的元素数。顺便说一句,这种方法并没有做很多传播......
  • 感谢您的所有回答!我想我现在可以做到。

标签: prolog constraint-programming


【解决方案1】:

这里是使用布尔变量的解决方案(我使用 ECLiPSe prolog 编写的,应该不难将它翻译成另一个 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)

【讨论】:

  • 您的回答对我很有帮助!可以肯定的是,在 Sicstus Prolog 上我要更改: LB::0..1 到 domain(LB,0,1) 和 sumlist(LB,S), S #
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
相关资源
最近更新 更多