我刚看到(source)上math.SE这样一个问题:如何用Prolog解决'6书'难题?
六种不同的书籍(A,B,C,d,E,F)相同大小的层叠作为 图:
我们知道以下事实:
- A和d都没有接触。
- E是两本既垂直又水平的书。
- C正好碰到两本书。
- A和F触摸。
- E和F触摸沿其盖(长边)
多少书他们的位置知道?
我以为我可以用Prolog的解决这个问题:
% Those are the books:
book(a).
book(b).
book(c).
book(d).
book(e).
book(f).
% This is how 'touching' works:
touching(X,Y):- touching(Y,X). % touching is symmetric
touching(p1,p2).
touching(p2,p3).
touching(p3,p4).
touching(p3,p5).
touching(p3,p6).
touching(p4,p5).
touching(p5,p6).
% List all possible positions:
position(a):- p1,p2,p3,p4,p5,p6.
position(b):- p1,p2,p3,p4,p5,p6.
position(c):- p1,p2,p3,p4,p5,p6.
position(d):- p1,p2,p3,p4,p5,p6.
position(e):- p1,p2,p3,p4,p5,p6.
position(f):- p1,p2,p3,p4,p5,p6.
% Every position has one book
getBook(p1) :- a,b,c,d,e,f.
getBook(p2) :- a,b,c,d,e,f.
getBook(p3) :- a,b,c,d,e,f.
getBook(p4) :- a,b,c,d,e,f.
getBook(p5) :- a,b,c,d,e,f.
getBook(p6) :- a,b,c,d,e,f.
% Add your facts:
not(touching(position(a),position(d))).
position(e):- p5,p2.
% C touches exactly two books: eventually something like aggregate_all(count, touching(e,X), Count):-2.
position(c):- p2, p4,p6.
touching(position(a),position(f)).
touching(position(e),position(f)).
但是当我尝试position(a)
我得到:
?- consult(books).
Warning: /home/moose/Downloads/LaTeX-examples/documents/Programmierparadigmen/scripts/prolog/books.pl:37:
Clauses of position/1 are not together in the source-file
Warning: /home/moose/Downloads/LaTeX-examples/documents/Programmierparadigmen/scripts/prolog/books.pl:40:
Clauses of touching/2 are not together in the source-file
% books compiled 0.00 sec, 32 clauses
true.
?- position(a).
ERROR: position/1: Undefined procedure: p1/0
Exception: (7) p1 ?
- 问题1:为什么我会得到一个异常,以及如何我是否修复它?
- 问题2:是否有一种方法来描述更接近于文本的序言中的事实3?
- 问题3:如何打印所有组合?
您还没有定义的'P1事实。为了解决这个问题,你需要以完全不同的方式设置程序。 –
你能解释我如何解决这个问题吗?我是Prolog新手,目前我不知道解决这个问题的另一种方法。 –
这是一个例外,因为你没有没有参数的叫做“p1”的事实或谓词。你会用'p2'到'p6'来达到同样的例外。 '位置(a): - p1,p2,p3,p4,p5,p6。“试图查询”p1“等全部作为谓词或事实,但它们不存在。 – lurker