我似乎对Prolog中事实的统一存在问题,但无法证实。一切看起来都应该应该工作,而且我已经查找了使用Prolog解决逻辑谜题的例子没有实际效果,考虑到Prolog的相对稀有性。
这个 是一个额外的信用分配,所以我不确定它是否有效,但我真的很难知道如何从这里开始
% Names
name(teo).
name(mira).
name(bruno).
name(igor).
%Food
food(sandwich).
food(pie).
food(hamburger).
food(pizza).
%Hobby
hobby(crosswords).
hobby(writing).
hobby(reading).
hobby(photography).
%Shirt Colour
shirt(white).
shirt(yellow).
shirt(blue).
shirt(red).
%Other
girl(mira).
student((Name, Food, Hobby, Shirt)) :-
name(Name), food(Food), hobby(Hobby), shirt(Shirt).
solution(L):-
length(L,4),
L= [student(teo, sandwich,_,_),_,_,_],
member(student(mira, pite, crosswords,_),L),
member(student(girl(GirlName),_,_,white),L),
member(student(bruno,_,_,yellow),L),
member(student(_,hamburger,writing,_),
L= [_, student(_,pie,_,_),_,_],
next(student(_,pie,_,_), student(teo,_,_,_), L),
next(student(bruno,_,_,_), student(_,pizza,_,_), L),
next(student(_,_,_,white), student(_,pizza,_,_), L),
member(student(igor,_,reading,_),L),
next(student(_,_,_,blue), student(girl(GirlName),_,_,_), L).
next(A, B, Ls) :- append(_, [A,B|_], Ls).
next(A, B, Ls) :- append(_, [B,A|_], Ls).
问题在于它不会将solution(L)
视为谓词或规则,只是一个文本块,所以我甚至无法测试它是否正确。我最感兴趣的是为什么它甚至不起作用。
答案 0 :(得分:3)
起初,我认为girl/1
是许多人所说的罪魁祸首。但即使删除所有这些事件,您的定义仍然会失败(并在修复语法错误后)。以下是solution(L)
仍然失败的责任部分:
:- op(950, fy, *). *(_). solution(L) :- *length(L,4), L= [student(_/*teo*/, sandwich,_,_),_,_,_], member(student(_/*mira*/, pite, _/*crosswords*/,_),L), *member(student(girl(GirlName),_,_,white),L), *member(student(bruno,_,_,yellow),L), member(student(_,hamburger,_/*writing*/,_),L), L= [_, student(_,pie,_,_)|_/*[_,_]*/], *next(student(_,pie,_,_), student(teo,_,_,_), L), next(_/*student(bruno,_,_,_)*/, student(_,pizza,_,_), L), *next(student(_,_,_,white), student(_,pizza,_,_), L), *member(student(igor,_,reading,_),L), *next(student(_,_,_,blue), student(girl(GirlName),_,_,_), L). next(A, B, Ls) :- append(_, [A,B|_], Ls). next(A, B, Ls) :- append(_, [B,A|_], Ls).
所有名字都无关紧要,就像他们的爱好一样。真正重要的是食物!
你只有四个地方,但共有五种食物(三明治,馅饼,土耳其,汉堡包,披萨) - 只给我一个!
这在Prolog中是件好事:你可以进行这样的概括以获得清晰的诊断。