Prolog 如何指定变量域中值的自定义顺序?

Prolog 如何指定变量域中值的自定义顺序?,prolog,clpfd,sicstus-prolog,Prolog,Clpfd,Sicstus Prolog,假设我有一个变量V,V的值可以是0到5范围内的任何数字。但是,有些值比其他值更可取,因此将V的域指定为有序序列将有助于我 我能用SICStus Prolog做吗 例如: 我看了手册,没有发现任何有用的东西。我可以通过自定义标签来解决这个问题,例如,将V的域转换为列表,对其进行排序并为V指定一个值,但我希望性能更差。您可以按首选顺序拥有一个数组或所有值的列表 然后在程序中使用数组索引,最后返回与索引对应的值。您可以按首选顺序创建一个数组或所有值的列表 然后在程序中处理数组索引,最后返回与索引相对应

假设我有一个变量V,V的值可以是0到5范围内的任何数字。但是,有些值比其他值更可取,因此将V的域指定为有序序列将有助于我

我能用SICStus Prolog做吗

例如:


我看了手册,没有发现任何有用的东西。我可以通过自定义标签来解决这个问题,例如,将V的域转换为列表,对其进行排序并为V指定一个值,但我希望性能更差。

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


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

您可以按首选顺序创建一个数组或所有值的列表


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

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


请参见标签/2的valueEnum选项:

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


请参阅标签/2的valueEnum选项:

您可能错过了标签clpfd。如果没有,请告诉我如何声明变量。我知道列表在Prolog中是如何工作的。我对CLPFD变量有自己的标签,我做了以下工作:1取一个变量X 2找出它的域3给X赋值。显然,从示例中给第一个值3赋值要比取域V并对其排序快得多。你可能错过了标签CLPFD。如果没有,请告诉我如何声明变量。我知道列表在Prolog中是如何工作的。我对CLPFD变量有自己的标签,我做了以下工作:1取一个变量x2找出它的域3给X赋值。显然,从示例中给第一个值3赋值要比取域V并排序快得多。这对一个变量有效。但无论如何,这是一个有趣的想法。顺便说一句,我可以问你为什么要使用非免费的SICStus Prolog,而不是免费的开源ECLiPSe吗?当我开始编程我的任务时,ECLiPSe没有提供distinct2约束。然而,我发现Eclipse6.1将支持distinct2,然后我可以很容易地进行切换。但无论如何,这是一个有趣的想法。顺便说一句,我可以问你为什么要使用非免费的SICStus Prolog,而不是免费的开源ECLiPSe吗?当我开始编程我的任务时,ECLiPSe没有提供distinct2约束。然而,我发现Eclipse6.1将支持distinct2,然后我可以轻松地切换。
% 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]