我试图用Prolog解决爱因斯坦的谜语。当我试图通过房屋(Hs)运行时,它显示否。任务是
houses(Hs) :- length(Hs, 5), member(h(english,_,_,_,red), Hs), member(h(swede,dog,_,_,_), Hs), member(h(_,_,_,coffee,green), Hs), member(h(dane,_,_,tea,_), Hs), next(h(_,_,_,_,green), h(_,_,_,_,white), Hs), member(h(_,bird,'Pall Mall',_,_), Hs), member(h(_,_,'Dunhill',_,yellow), Hs), Hs = [_,_,h(_,_,_,milk,_),_,_], Hs = [h(norwegian,_,_,_,_)|_], next(h(_,horse,_,_,_), h(_,_,'Dunhill',_,_), Hs), next(h(_,_,blend,_,_), h(_,cat,_,_,_), Hs), member(h(_,_,'Blue Master',beer,_), Hs), member(h(german,_,'Prince',_,_), Hs), next(h(norwegian,_,_,_,_), h(_,_,_,_,blue), Hs), next(h(_,_,'Blend',_,_), h(_,_,_,water,_), Hs), member(h(_,fish,_,_,_), Hs). next(A, B, Ls) :- append(_, [A,B|_], Ls). next(A, B, Ls) :- append(_, [B,A|_], Ls).
我不知道出了什么问题。感谢
答案 0 :(得分:5)
以下是您的计划的概括。我添加了一些额外的*
来删除多个目标,并用_/*origterm*/
替换了一些术语。然而,由此产生的程序仍然失败。因此,剩余片段中的错误必须。你没有对程序说什么(编辑:你后来添加了一些东西),所以我没有(编辑:想要)知道它是什么。但无论如何,错误必须在剩下的可见部分:
:- initialization(houses(_Sol)). :- op(950, fy, *). *_. houses(Hs) :- length(Hs, 5), *member(h(english,_,_,_,red), Hs), % 2 *member(h(swede,dog,_,_,_), Hs), *member(h(_,_,_,coffee,green), Hs), *member(h(dane,_,_,tea,_), Hs), *next(h(_,_,_,_,green), h(_,_,_,_,white), Hs), member(h(_,_/*bird*/,'Pall Mall',_,_), Hs), member(h(_,_,'Dunhill',_,_/*yellow*/), Hs), *Hs = [_,_,h(_,_,_,milk,_),_,_], *Hs = [h(norwegian,_,_,_,_)|_], *next(h(_,horse,_,_,_), h(_,_,'Dunhill',_,_), Hs), next(h(_,_,blend,_,_), _/*h(_,cat,_,_,_)*/, Hs), member(h(_,_,'Blue Master',_/*beer*/,_), Hs), member(h(_/*german*/,_,'Prince',_,_), Hs), *next(h(norwegian,_,_,_,_), h(_,_,_,_,blue), Hs), next(h(_,_,'Blend',_,_), _/*h(_,_,_,water,_)*/, Hs), *member(h(_,fish,_,_,_), Hs). next(A, B, Ls) :- append(_, [A,B|_], Ls). next(A, B, Ls) :- append(_, [B,A|_], Ls).
剩下的不多了!在可见部分至少有一个错误! (严格来说,其他部分可能会有更多错误。我们根本就不知道。)