【发布时间】: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 #<==> B1ecc,其中Bk是一个布尔变量,然后约束列表的总和与所有Bk相对某个组合,为小于每个列表中的元素数。顺便说一句,这种方法并没有做很多传播...... -
感谢您的所有回答!我想我现在可以做到。
标签: prolog constraint-programming