0

Ivan Bratko の本: Programming fro Artificial Intelligence を使用して、DCG の文法解析ツリーを勉強しています。

この本で、構文木を生成する DCG 文法と、いくつかの移動後の位置を意味するために使用される意味/2述語を示す次の例を見つけました。

これはコードです:

move(move(Step)) --> step(Step).
move(move(Step, Move)) --> step(Step), move(Move).

step(step(up)) --> [up].
step(step(down)) --> [down].

meaning(move(Step, Move), Dist):- meaning(Step, D1),
                      meaning(Move, D2),
                      Dist is (D1 + D2).

meaning(step(Step), Dist):- meaning(Step, Dist).

meaning(step(up), 1).

meaning(step(down), -1).

本で、次の出力を含む次のクエリを表示します。

move(Tree, [up,up,down, up, up], []), meaning(Tree, Dist).
Tree = move(step(up), move(step(up), move(step(down), move(step(up), move(step(up)))))),
Dist = 3

問題は、前のクエリを実行しようとすると、常に FALSE を取得することです (どのクエリでも false を取得します...)

?- move(Tree, [up,up,down, up, up], []), meaning(Tree, Dist).
false.

なんで?なにが問題ですか?何が足りないの?

4

1 に答える 1

1

の第二項meaning/2が間違っているようです。そのはず:

meaning(move(Step), Dist):- meaning(Step, Dist).

このエラーを特定するには、1 回の操作で試すことができます。

?- move(Tree, [up], []).
Tree = move(step(up))

したがってmeaning/2、単一の移動を処理する基本ケースが必要であり、コードを検査すると、それは正確に 2 番目の句である必要があります。

move(step(X))実際、移動のすべてのリストはX、{上、下}というこの種の用語の 1 つで終わります。

于 2013-05-16T14:19:58.553 に答える