prolog - 限制整数在集合中

标签 prolog clpfd prolog-defaulty

我使用 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.

就我个人而言,我不想鼓励大量多余的符号,特别是如果它们是(像这个变体)defaulty:您无法仅通过模式匹配来区分元素是整数还是整数。此类域表达式的另一个析取:

?- write_canonical({0,1,3,5,7}).
{','(0,','(1,','(3,','(5,7))))}

在这个表示中出现整数的每个地方,域表达式也可以被替换,使得这个表示非常不明确。但如果您需要它,它就在那里。

为了简洁起见,支持像 X in [0,1,3,5,7] 这样的语法会更合适,因为这里每个术语的含义很清楚。

关于prolog - 限制整数在集合中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32839029/

相关文章:

prolog - 使用CLP(FD)约束任意长度的子列表

prolog - PROLOG 中的深度逆向 - 列表

parsing - 如何在 Prolog 中创建高阶 DCG 解析器?

Prolog编译器返回错误

list - 序言:计数e在列表中出现在奇数位置的次数

Prolog:游戏中的每个玩家都打出一张牌。在知道谁打了哪些牌的情况下,推断出谁打了其他牌

prolog - Prolog 中的迷你数独求解器中途停止

prolog - CLP(FD) 互斥

prolog - 在序言中定义多个规则的最短方法

Prolog - 命题逻辑中的公式