2

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

4

1 回答 1

3

起初,我认为这girl/1是许多人所说的罪魁祸首。但即使删除所有此类事件,您的定义仍然会失败(并且在修复该语法错误之后)。这是仍然失败的负责部分solution(L)

:- op(950, fy, *)。
*(_)。

解决方案(L):-
   *长度(L,4) ,
   L= [学生(_/* teo */, 三明治,_,_),_,_,_],
   成员(学生(_/* mira */, pite, _/*填字游戏*/,_),L),
   *成员(学生(女孩(女孩名),_,_,白色),L),
   *成员(学生(布鲁诺,_,_,黄色),L),
   成员(学生(_,汉堡包,_/*写作*/,_),L),
   L= [_, 学生(_,pie,_,_)|_/* [_,_] */],
   *下一个(学生(_,pie,_,_), 学生(teo,_,_,_), L) ,
   下一个(_ /*学生(布鲁诺,_,_,_)*/ , 学生(_,pizza,_,_), L),
   *下一个(学生(_,_,_,white), 学生(_,pizza,_,_), L) ,
   *成员(学生(igor,_,阅读,_),L),
   *下一个(学生(_,_,_,蓝色),学生(女孩(女孩名),_,_,_),L)。

下一个(A,B,Ls):-追加(_,[A,B|_],Ls)。
下一个(A,B,Ls):-追加(_,[B,A|_],Ls)。

所有的名字都无关紧要,就像他们的爱好一样。真正重要的是食物!

你只有四个地方,但总共有五种食物(三明治、派、派、汉堡包、比萨饼)——只给我一个!

这就是 Prolog 中的好处:您可以进行这样的概括以获得清晰的诊断。

于 2017-11-17T22:29:36.463 回答