使用变量(Sel)和值(枚举)的 Sicstus Prolog 自定义标签

Sicstus Prolog custom labeling by use of variable(Sel) and value(Enum)

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

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

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

对于值(枚举):
更复杂的是,我可能希望根据它是 X 还是 Y 来使用不同的策略。

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

1
2
3
4
5
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 种不同的变量类型,而不仅仅是这里显示的两种。


域变量的附加属性绝对没有问题。只要你依赖 label/2 进行变量选择,那是最自然的解决方案。

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