我正在使用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是Domain的元素。域是以下之一:
整数单例集仅包含整数。
我已经尝试搜索单例集是什么(这里是Prolog新手),但是我在网上找不到任何东西。有没有更清晰的表达我的约束的方法?
您可以使用(未公开的){}/1
语法显式枚举集合,这在SICStus Prolog中也可用:
?- X in {0,1,3,5,7}.
X in 0..1\/3\/5\/7.
个人,我不想鼓励大量的多余记号,特别是如果它们是(例如此变体)defaulty:如果元素是整数或此类的另一个析取项,则不能仅通过模式匹配来区分域表达式:
?- write_canonical({0,1,3,5,7}).
{','(0,','(1,','(3,','(5,7))))}
在此表示形式中的每个位置出现整数,也可以替换域表达式,从而使该表示形式非常不明确。但是如果您需要它,它就在那里。
为了纯粹起见,支持像X in [0,1,3,5,7]
这样的语法会更合适,因为在这里清楚每个术语的含义。