我是Prolog的新手,我有兴趣将以下单词问题转换为(SWI)Prolog:
有4个孩子:安倍,丹,玛丽和苏.他们的年龄没有特别的顺序,分别为3,5,6和8岁.Abe比Dan年长.苏比玛丽年轻.苏的年龄是丹的年龄加上3年.玛丽比安倍年长.
到目前为止,我已经想到了
child(X) :-
member(X, [3,5,6,8]).
solution(Abe, Dan, Mary, Sue) :-
child(Abe),
child(Dan),
child(Mary),
child(Sue),
Abe > Dan,
Sue < Mary,
Sue == Dan+3,
Mary > Abe,
Abe \== Dan,
Abe \== Mary,
Abe \== Sue,
Dan \== Mary,
Dan \== Sue,
Mary \== Sue.
Run Code Online (Sandbox Code Playgroud)
但是运行查询
?- solution(Abe, Dan, Mary, Sue)
Run Code Online (Sandbox Code Playgroud)
我得到了false
.作为一个附带问题,Prolog会执行暴力搜索解决方案,还是有一些机器能够比O(n!)更好地解决这个(某种)问题?
我想要的结果是Abe = 5, Dan = 3, Mary = 9, Sue = 6
.
整数的算术约束,例如这个难题中的约束,最好用Prolog系统的CLP(FD)约束表示.
例如,在SICStus Prolog,YAP或SWI中:
:- use_module(library(clpfd)). ages(As) :- As = [Abe,Dan,Mary,Sue], % There are 4 children: Abe, Dan, Mary, Sue As ins 3\/5\/6\/8, % Their ages are 3, 5, 6 and 8 all_different(As), Abe #> Dan, % Abe is older than Dan Sue #< Mary, % Sue is younger than Mary Sue #= Dan + 3, % Sue's age is Dan's age plus 3 years Mary #> Abe. % Mary is older than Abe
示例查询及其结果:
?- ages([Abe,Dan,Mary,Sue]). Abe = 5, Dan = 3, Mary = 8, Sue = 6.
我们从这个答案看到这个谜题有一个独特的解决方案.
请注意,无需任何搜索即可获得此答案!约束求解器通过称为约束传播的强大隐式机制推导出唯一解,这是CLP系统相对于强力搜索的关键优势.在此示例中成功使用约束传播来修剪搜索树中除了一个剩余分支之外的所有分支.