SWI / CLP(FD)中的可达性约束

时间:2013-11-16 20:53:56

标签: swi-prolog sicstus-prolog clpfd chr transitive-closure

我试图通过解决节点和弧的存在的约束来确定有向图的形状,例如,如果存在来自节点{{1的弧',则二进制变量V1V21V1。我想表达可达性约束(或者,替代地,找到传递闭包),例如,要求图形连接,或者存在从一个给定节点到另一个给定节点的路径。

我已经看到SICStus Prolog有V2用于此目的,但我在SWI Prolog中找不到类似的东西。我应该使用CHR吗?我一直在研究弧/路径一致性示例,但我不确定我是否正在寻找正确的方向。

2 个答案:

答案 0 :(得分:3)

SICStus'fd_closure/2与SWI-Prolog的term_attvars/2非常相似。它为您提供了可以通过属性传递的所有变量(SWI的CLP(FD)使用属性来存储约束)。

请注意,您通常需要这些谓词。例如,它们用于顶层以获得残余目标。

您可以使用有限域约束来表示图形,而无需使用任何这些谓词。例如,使用有限域变量B_i_j,即1 iff ,从节点 i 到节点 j 有一个弧。 / p>

如果您需要更强大的属性,则可能需要更强的约束。例如,circuit/1在SICStus和SWI中可用,并描述了哈密顿电路。对于其他属性,您可以实现专用的过滤算法。

答案 1 :(得分:1)

使用copy_term/3term_variables/2,您应该能够获得(编辑:差不多)与fd_closure/2相同的效果。

请注意,SICStus中的fd_closure仅适用于FD约束。不考虑变量之间的其他连接。

编辑:这样你只能获得内部变量的副本 - 这应该足以确定形状。但是,您可能希望稍后引用这些变量,在这种情况下,@ mat的解决方案就是它。