通过列表约束变量的域
Constraining domain for variable through list
我在程序的一部分中定义了一个列表
people([tom,betty,sue,fred,charles,chay])
我想将一个变量约束为该域中的 N 个值。
像 :
setup(GroupCount) :-
length(Group, GroupCount),
people(X),
Group :: X,
all_different(Group),
<other predicates>.
目前,Prolog 抱怨 "calling undefined procedure Group :: [....] in eclipse. Abort"
我查看了 lib(clpfd) 和 lib(lists) 以及其他地方的 SWI-Prolog 文档,但找不到合适的方法。有什么线索吗?
根据您的错误消息,我推断您正在使用 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),它适用于 integer/real 个域(而不是符号),但功能更丰富。
我在程序的一部分中定义了一个列表
people([tom,betty,sue,fred,charles,chay])
我想将一个变量约束为该域中的 N 个值。 像 :
setup(GroupCount) :-
length(Group, GroupCount),
people(X),
Group :: X,
all_different(Group),
<other predicates>.
目前,Prolog 抱怨 "calling undefined procedure Group :: [....] in eclipse. Abort"
我查看了 lib(clpfd) 和 lib(lists) 以及其他地方的 SWI-Prolog 文档,但找不到合适的方法。有什么线索吗?
根据您的错误消息,我推断您正在使用 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),它适用于 integer/real 个域(而不是符号),但功能更丰富。