我试图通过解决节点和弧的存在约束来确定有向图的形状,例如,二进制变量V1V2
是1
是否存在从节点V1
到的弧V2
。我想表达可达性约束(或者,找到一个传递闭包),例如,要求图是连接的,或者有一条从一个给定节点到另一个给定节点的路径。
我已经看到 SICStus Prologfd_closure
用于此目的,但我在 SWI Prolog 中找不到类似的东西。我应该使用CHR吗?我一直在查看弧/路径一致性示例,但我不确定我是否在寻找正确的方向。
我试图通过解决节点和弧的存在约束来确定有向图的形状,例如,二进制变量V1V2
是1
是否存在从节点V1
到的弧V2
。我想表达可达性约束(或者,找到一个传递闭包),例如,要求图是连接的,或者有一条从一个给定节点到另一个给定节点的路径。
我已经看到 SICStus Prologfd_closure
用于此目的,但我在 SWI Prolog 中找不到类似的东西。我应该使用CHR吗?我一直在查看弧/路径一致性示例,但我不确定我是否在寻找正确的方向。
SICStus'fd_closure/2
与 SWI-Prolog 的term_attvars/2
. 它为您提供了可以通过属性传递到达的所有变量(并且 SWI 的 CLP(FD) 使用属性来存储约束)。
请注意,您通常不需要这些谓词。例如,它们用于顶层以获得剩余目标。
您可以在不使用任何这些谓词的情况下表达具有有限域约束的图。例如,如果存在从节点i到节点j的弧,B_i_j
则使用 1 的有限域变量。
如果您需要更强的属性,则可能需要更强的约束。例如,circuit/1
在 SICStus 和 SWI 中可用并描述了哈密顿电路。对于其他属性,您可以实现专用的过滤算法。
使用copy_term/3
andterm_variables/2
你应该能够获得(编辑:几乎)与fd_closure/2
.
请注意,fd_closure
在 SICStus 中仅适用于 FD 约束。不考虑变量之间的其他联系。
编辑:这样你只会得到内部变量的副本——这应该足以确定形状。但是,您可能希望稍后引用这些变量,在这种情况下,@mat 的解决方案就是它。