通过列表约束变量的域

时间:2019-05-02 09:20:19

标签: prolog constraint-programming clpfd

我在程序的一部分中定义了一个列表,

people([tom,betty,sue,fred,charles,chay])

我想在此域中将变量约束为N个值。 像这样:

setup(GroupCount) :-
    length(Group, GroupCount),
    people(X),
    Group :: X,
    all_different(Group),
    <other predicates>.

当前,Prolog抱怨“在Eclipse中调用未定义的程序组:: [....]。中止”

我已经遍历了SWI-Prolog文档中的lib(clpfd)和lib(lists)以及其他地方,但是找不到合适的方法。有任何线索吗?

1 个答案:

答案 0 :(得分:2)

从您的错误消息中,我推断您正在使用ECLiPSe,因此您可能要引用ECLiPSe's documentation而不是SWI-Prolog的;)

大多数有限域约束求解器实现都将自己限制为整数域,因此您必须将人员姓名编码为整数。但是,ECLiPSe确实提供了minimalist solver for symbolic domains,您可以将其用于首次实验:

:- lib(sd).    % load symbolic finite-domain solver

people([tom,betty,sue,fred,charles,chay]).

setup(GroupCount, Group) :-
    length(Group, GroupCount),
    people(X),
    Group &:: X,
    alldifferent(Group),
    labeling(Group).

其工作原理如下

?- setup(3, G).
G = [betty, charles, chay]
Yes (0.00s cpu, solution 1, maybe more)
G = [betty, charles, fred]
Yes (0.00s cpu, solution 2, maybe more)
...

为进行进一步的工作,您可能希望切换到library(ic),它可以在整数/实数域(而不是符号)上运行,但是功能更丰富。