Sicstus Prolog通过使用变量(Sel)和值(Enum)自定义标签

时间:2013-07-06 08:20:49

标签: prolog sicstus-prolog clpfd

假设我将以下域变量列表传递给标签谓词:

Z=[X1,Y1,X2,X3,Y2,X4,Y3.......Xn,Ym],
labeling(...., Z).

对于变量(Sel): 此外,我希望标签可以在继续使用X之前先选择所有Y. 或者更复杂: 从X开始或在Y上开始,如果与Y相比有更多未标记,则继续标记X,反之亦然。

对于价值(枚举): 为了使其复杂化,我可能希望使用不同的策略,具体取决于它是否为X,如果它是Y.

我的第一次尝试是使用属性变量并为每个变量添加更多信息:

put_atts( X1,  type_var(is_xvar)),
put_atts( X2,  type_var(is_xvar)),
put_atts( Y1,  type_var(is_yvar)),
.
.

内部变量(Sel)和值(Enum)我可以使用此属性进行搜索和选择。

但由于fd_var已经是一个属性变量,因此这种尝试效果不佳。

所以我的问题是:使用归因变量是解决此类任务的正确策略吗?有没有其他方法可以做到这一点?

这只是一个简化的例子。我需要大约10种不同的变量类型,而不仅仅是这里显示的两种变量类型。

1 个答案:

答案 0 :(得分:3)

域变量的其他属性绝对没有问题。只要您依靠标签/ 2进行变量选择,这是最自然的解决方案。

另一种方法是编写自己不依赖于标记/ 2的搜索过程。