2

我正在使用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 newbie here),但我在网上找不到任何东西。有没有更简洁的方式来表达我的约束?

4

1 回答 1

2

您可以使用(未​​记录的){}/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],因为这里很清楚每个术语的含义。

于 2015-09-29T08:44:42.153 回答