Prolog 和逻辑难题

标签 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) 视为谓词或规则,而只是一段文本,因此我什至无法测试它是否正确。我最感兴趣的是为什么它甚至不起作用。

最佳答案

起初,我认为这个 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 中的好处:您可以进行此类概括以获得清晰的诊断。

关于Prolog 和逻辑难题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47348548/

相关文章:

PROLOG,含义

Prolog 房间邻接难题

list - Prolog 从列表中删除元素

Prolog - 尝试解决文本难题

Prolog if else 语法

prolog - 约束逻辑程序中的异常警告和计算结果

prolog - 如何在 Prolog 中修复这个循环谓词?

prolog - Prolog 中的 % 符号是什么意思?

prolog - swi-prolog 和 yap 的不同结果