【问题标题】:Prolog parse tree generation failsProlog 解析树生成失败
【发布时间】:2016-12-22 03:13:53
【问题描述】:

我有以下序言规则。

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

【问题讨论】:

    标签: prolog dcg


    【解决方案1】:

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

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

    ?- 短语(b(A),[x,=,4])。 错误的。

    糟糕!
    我真的要启动跟踪/调试器吗?
    您目前要问的是:A 对于格式正确的句子有什么解决方案。
    唉,没有。

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

    ?- 短语(b(A),L)。 A = b(真), L = [真] ; A = b(假), L = [假] ...

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

    ?- 短语(b(_),L)。 L = [真] ; 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 = [0, +, x, =, 0, +, x] ...

    你在这里看到一个模式吗?
    也许我们可以改进一下。
    你知道的长度为 3 的句子有哪些?

    ?- L = [_,_,_], 短语(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 = [不,不,真];
    L = [不,不,假];
    错误的。
    

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

    b(b(E,[=],E)) --> e(E),[=],e(E)。

    要求左边的表达式与右边的表达式相同。所以只有上面那几句话。


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      相关资源
      最近更新 更多