Prolog 通过列表约束变量的域

Prolog 通过列表约束变量的域,prolog,constraint-programming,clpfd,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>. 设置(组计数):- 长度(组、组计数), 人(X),

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

people([tom,betty,sue,fred,charles,chay])
我想在这个域中将一个变量限制为N个值。 比如:

setup(GroupCount) :-
    length(Group, GroupCount),
    people(X),
    Group :: X,
    all_different(Group),
    <other predicates>.
设置(组计数):-
长度(组、组计数),
人(X),,
组::X,
各不相同(组),
.
目前,Prolog抱怨“在eclipse.Abort中调用未定义的过程组::[…]


我已经浏览了关于lib(clpfd)和lib(list)的SWI Prolog文档以及其他地方,但是找不到合适的方法。有什么线索吗?

从您的错误消息中,我推断您正在使用ECLiPSe,因此您可能希望参考而不是SWI Prolog;)

大多数有限域约束求解器实现将自己限制为整数域,因此必须将人名编码为整数。但是,ECLiPSe确实提供了一个可用于第一次实验的:

:- 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)
...

对于进一步的工作,您可能希望切换到适用于整型/实型域(而不是符号)但功能更丰富的模式。

从您的错误消息中,我推断您使用的是ECLiPSe,因此您可能希望参考而不是SWI Prolog;)

大多数有限域约束求解器实现将自己限制为整数域,因此必须将人名编码为整数。但是,ECLiPSe确实提供了一个可用于第一次实验的:

:- 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)
...
对于进一步的工作,您可能希望切换到适用于整型/实型域(而不是符号)但功能更丰富的域