2

我试图通过解决节点和弧的存在约束来确定有向图的形状,例如,二进制变量V1V21是否存在从节点V1到的弧V2。我想表达可达性约束(或者,找到一个传递闭包),例如,要求图是连接的,或者有一条从一个给定节点到另一个给定节点的路径。

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

4

2 回答 2

3

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

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

您可以在不使用任何这些谓词的情况下表达具有有限域约束的图。例如,如果存在从节点i到节点j的弧,B_i_j则使用 1 的有限域变量。

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

于 2013-11-16T21:15:12.387 回答
1

使用copy_term/3andterm_variables/2你应该能够获得(编辑:几乎)与fd_closure/2.

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

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

于 2013-11-16T21:10:34.613 回答