2

次のプロローグ ルールがあります。

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)) と一致しません。問題が何であるか理解できませんでした。

4

1 に答える 1

3

タグを使用していれば、はるかに早く回答を受け取ることができたでしょう)

では、どうすればエラーをローカライズできるでしょうか? クエリから始めましょう:

?- 句(b(A),[x,=,4])。
間違い。

悪い!
本当にトレース/デバッガーを起動しますか?
あなたが現在求めているのはA、整形式の文の解決策は何ですか.
残念ながら、何もありません。

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 = [ない、ない、偽] ;
間違い。

つまり、それら以外の 3 単語文はありません。
さて、わかりましたか?
を含む文には次の規則があります=

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

左側の式が右側の式と同じである必要があります。したがって、上記の文のみ。


Prolog プログラムをデバッグするときは、他の言語よりも (キーボードで) テスト データを入力する必要がはるかに少なくなります。代わりに、変数を使用して、Prolog に変数を入力させます。結局のところ、Prolog は私たちよりもはるかに高速です。CTS の影響を受けません。

于 2012-11-15T16:07:49.573 に答える