在不使用 CLP(FD) 的情况下,您应该使用 Prolog 的组合能力以适当的方式表达问题和约束。例如
puzzle(Name) :-
L = [[mason, Pos1, Blond1, Handsome1, UnScared1],
[alex, Pos2, Blond2, Handsome2, UnScared2],
[steve, Pos3, Blond3, Handsome3, UnScared3],
[simon, Pos4, Blond4, Handsome4, UnScared4]
],
permutation([1,2,3,4], [Pos1,Pos2,Pos3,Pos4]),
maplist(yn,
[Blond1, Handsome1, UnScared1,
Blond2, Handsome2, UnScared2,
Blond3, Handsome3, UnScared3,
Blond4, Handsome4, UnScared4
]),
...
每个变量(那些以大写字母开头的符号!)都是一个人的属性,并且可以假定来自域的值。yn/1 这是一个服务事实,允许这些二进制值假设是或否:
yn(y).
yn(n).
然后可以用这种方式表达约束(这里只是第一个)
...
% Two of them who are not blond are standing on either side of Mason.
member([mason, I1, _,_,_], L),
member([_, I2, n,_,_], L),
member([_, I3, n,_,_], L),
(I2>I1, I3>I1 ; I2<I1, I3<I1),
...
解决方案将是
% One of them is blond, handsome, and unscarred.
member([Name, _, y, y, y], L).
我不确定我是否理解每个约束(英文),确实我的程序没有找到解决方案。
该程序相当慢,并且需要 CLP(FD)。如果您对 CLP(FD) 解决方案感兴趣,请编辑您的问题(例如添加适当的标签)。