将整数限制在集合中
Constrain integer to be in set
我正在使用 in/1
谓词来尝试限制一个整数从特定集合中获取值:
?- use_module(library(clpfd)).
gen_in_set(X) :-
X in [0, 1, 3, 5, 7].
我没想到这会起作用,因为 [...]
是列表表示法。我当然可以使用:
X #= 0 #\/ X #= 1 #\/ X #= 3 #\/ X #= 5 #\/ X #= 7.
但这非常冗长。以下也适用:
X in 0 \/ 1 \/ 3 \/ 5 \/ 7.
而且短了一点,但还是很丑。
文档指出:
Var is an element of Domain. Domain is one of:
Integer
Singleton set consisting only of Integer.
我试过搜索什么是单例集(这里是 Prolog 新手),但我在网上找不到任何东西。有没有更简洁的方式来表达我的约束?
您可以使用(未记录的){}/1
语法显式枚举集合,这在 SICStus Prolog 中也可用:
?- X in {0,1,3,5,7}.
X in 0..1\/3\/5\/7.
就我个人而言,我不想鼓励一堆多余的符号,特别是如果它们是(像这个变体)默认:如果一个元素是整数或此类域表达式的另一个析取:
?- write_canonical({0,1,3,5,7}).
{','(0,','(1,','(3,','(5,7))))}
在此表示中每个出现整数的地方,也可以替换域表达式,使此表示非常模糊。但如果您需要它,它就在那里。
为了简洁起见,支持X in [0,1,3,5,7]
这样的语法会更合适,因为这里每个术语的含义都很清楚。
我正在使用 in/1
谓词来尝试限制一个整数从特定集合中获取值:
?- use_module(library(clpfd)).
gen_in_set(X) :-
X in [0, 1, 3, 5, 7].
我没想到这会起作用,因为 [...]
是列表表示法。我当然可以使用:
X #= 0 #\/ X #= 1 #\/ X #= 3 #\/ X #= 5 #\/ X #= 7.
但这非常冗长。以下也适用:
X in 0 \/ 1 \/ 3 \/ 5 \/ 7.
而且短了一点,但还是很丑。
文档指出:
Var is an element of Domain. Domain is one of:
Integer Singleton set consisting only of Integer.
我试过搜索什么是单例集(这里是 Prolog 新手),但我在网上找不到任何东西。有没有更简洁的方式来表达我的约束?
您可以使用(未记录的){}/1
语法显式枚举集合,这在 SICStus Prolog 中也可用:
?- X in {0,1,3,5,7}.
X in 0..1\/3\/5\/7.
就我个人而言,我不想鼓励一堆多余的符号,特别是如果它们是(像这个变体)默认:如果一个元素是整数或此类域表达式的另一个析取:
?- write_canonical({0,1,3,5,7}).
{','(0,','(1,','(3,','(5,7))))}
在此表示中每个出现整数的地方,也可以替换域表达式,使此表示非常模糊。但如果您需要它,它就在那里。
为了简洁起见,支持X in [0,1,3,5,7]
这样的语法会更合适,因为这里每个术语的含义都很清楚。