将整数约束为set

时间:2015-09-29 08:14:00

标签: prolog clpfd

我正在使用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的一个元素。域名是以下之一:

     

整数       单例集仅由Integer组成。

我已经尝试过搜索单身套装(Prolog新手在这里),但我在网上找不到任何东西。是否有更清晰的表达约束的方式?

1 个答案:

答案 0 :(得分: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]这样的语法会更合适,因为这里很清楚每个术语的含义。