Prolog和逻辑谜题

时间:2017-11-17 10:30:19

标签: prolog zebra-puzzle

我似乎对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)视为谓词或规则,只是一个文本块,所以我甚至无法测试它是否正确。我最感兴趣的是为什么它甚至不起作用。

1 个答案:

答案 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中是件好事:你可以进行这样的概括以获得清晰的诊断。