Prolog解析树生成失败

时间:2012-10-27 03:50:48

标签: prolog dcg

我有以下prolog规则。

b(b(true)) --> [true].
b(b(false)) --> [false].
b(b(E,[=],E)) --> e(E),[=],e(E).
b(b([not],B)) --> [not],b(B).
e(e(I)) --> i(I).
e(e(N)) --> n(N).
e(e(N,O,E)) --> n(N),o(O),e(E).
e(e(I,O,E)) --> i(I),o(O),e(E).
o(o(+)) --> [+].
o(o(-))--> [-].
o(o(*))--> [*].
o(o(/)) --> [/].
i(i(x)) --> [x].
i(i(y)) --> [y].
i(i(z)) --> [z].
i(i(u)) --> [u].
i(i(v)) --> [v].
n(n(0)) --> [0].
n(n(1)) --> [1].
n(n(2)) --> [2].
n(n(3)) --> [3].
n(n(4)) --> [4].
n(n(5)) --> [5].
n(n(6)) --> [6].
n(n(7)) --> [7].
n(n(8)) --> [8].
n(n(9)) --> [9].

但我不知道为什么

[6] 26 ?- b(A,[x,=,4],[]).
false

失败。我试着调试代码。 4与n(n(4))不匹配。我无法理解问题是什么。

1 个答案:

答案 0 :(得分:3)

(如果您使用代码,则会更早收到答案)

那么,我们如何本地化错误呢?让我们从您的查询开始:

?- phrase(b(A),[x,=,4]).
false.

坏!
我真的要启动一个跟踪/调试器吗? 你现在要问的是:A对于一个结构合理的句子有什么解决方案 唉,没有。

我们不能问Prolog更普遍的问题吗? 所以,亲爱的Prolog - 至少 - 你知道任何句子吗? 请说一句话!

?- phrase(b(A),L).
A = b(true),
L = [true] ;
A = b(false),
L = [false] ...

所以有一些东西 - 我会删除A,因为我们想先查看句子。

?- phrase(b(_),L).
L = [true] ;
L = [false] ;
L = [x, =, x] ;
L = [y, =, y] ;
L = [z, =, z] ;
L = [u, =, u] ;
L = [v, =, v] ;
L = [0, =, 0] ;
L = [1, =, 1] ;
L = [2, =, 2] ;
L = [3, =, 3] ;
L = [4, =, 4] ;
L = [5, =, 5] ;
L = [6, =, 6] ;
L = [7, =, 7] ;
L = [8, =, 8] ;
L = [9, =, 9] ;
L = [0, +, x, =, 0, +, x] ...

你在这里看到一种模式吗? 也许我们可以改进这一点 你知道的长度为3的句子是什么?

?- L = [_,_,_], phrase(b(_),L).
L = [x, =, x] ;
L = [y, =, y] ;
L = [z, =, z] ;
L = [u, =, u] ;
L = [v, =, v] ;
L = [0, =, 0] ;
L = [1, =, 1] ;
L = [2, =, 2] ;
L = [3, =, 3] ;
L = [4, =, 4] ;
L = [5, =, 5] ;
L = [6, =, 6] ;
L = [7, =, 7] ;
L = [8, =, 8] ;
L = [9, =, 9] ;
L = [not, not, true] ;
L = [not, not, false] ;
false.

换句话说:没有其他三个单词的句子 现在,你明白了吗? 句子有=

的规则
b(b(E,[=],E)) -->
   e(E),[=],e(E).

它要求左侧的表达式与右侧的表达式相同。因此只有上面那些句子。


调试Prolog程序时,与其他语言相比,键入(在键盘上)测试数据的需要要少得多。相反,使用变量让Prolog填充变量。毕竟,Prolog比我们快得多;并且它不会遭受CTS。