约束要设置的整数

问题描述 投票:2回答:1

我正在使用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新手),但是我在网上找不到任何东西。有没有更清晰的表达我的约束的方法?

prolog clpfd prolog-defaulty
1个回答
2
投票

您可以使用(未​​公开的){}/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]这样的语法会更合适,因为在这里清楚每个术语的含义。

© www.soinside.com 2019 - 2024. All rights reserved.