Prolog解析树生成失败

Prolog解析树生成失败,prolog,dcg,Prolog,Dcg,我有以下序言规则 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(+)

我有以下序言规则

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))不匹配。我不明白问题出在哪里

(如果使用标签,您会更早收到答案)

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

?- phrase(b(A),[x,=,4]). 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] ... 它要求左侧的表达式与右侧的表达式相同。因此,只有上面的句子


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

?- 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] ... ?- 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).