【问题标题】:How to specify custom order of values in variable's domain?如何指定变量域中值的自定义顺序?
【发布时间】:2013-06-07 16:04:28
【问题描述】:

假设我有一个变量VV 的值可以是0..5 范围内的任何数字。但是,某些值比其他值更受欢迎,因此它将V 的域指定为有序序列。

我可以在 SICStus Prolog 中执行此操作吗?

示例:

% PSEUDOCODE
%
% 3 is more preferred than 4; 4 is more preferred than 2; and so on..
% So I would write something like this: 

V in {3,4,2,5,1,0},
getDomainAsList(V, List), % the predicate do not exist
% and the List would be: [3,4,2,5,1,0] and not [1,2,3,4,5]

我阅读了手册,但没有找到任何有用的信息。我可以通过自定义标签来解决这个问题(即将 V 的域转换为列表,对其进行排序并将值分配给V),但我预计性能会更差。

【问题讨论】:

  • 您可能错过了标签“clpfd”。如果没有,请告诉我如何声明变量。
  • 我知道 Prolog 中的列表是如何工作的。我有自己的 CLPFD 变量标签,我执行以下操作:1) 取一个变量 X 2) 找出它的域 3) 为 X 分配一个值。显然,分配第一个值会快得多(示例中的 3)而不是取 V 的域并对其进行排序。

标签: prolog clpfd sicstus-prolog


【解决方案1】:

有一个手册页对此进行了描述。

查看 labeling/2 的 value(Enum) 选项,here:

【讨论】:

    【解决方案2】:

    您可以按首选顺序拥有所有值的数组或列表。

    然后在程序中使用数组索引,最后返回与索引对应的值。

    【讨论】:

    • 这适用于一个变量。但无论如何,这是一个有趣的想法。
    • 顺便说一句,请问您为什么使用非免费的 SICStus Prolog,而不是免费和开源的 ECLiPSe eclipseclp.org
    • ECLiPSe 在我开始编写任务时没有提供 distinct2 约束。但是,我发现 ECLiPSe 6.1 将支持 distinct2,然后我可以轻松切换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多