2

次のチュートリアル: http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/7_3.html

次の部分があります。

test_parser :- repeat,
               write('?? '), 
               read_line(X),
               ( c(F,X,[])   | q(F,X,[])  ),
               nl, write(X), nl, write(F), nl, fail.

c(F,X,[]) と q(F,X,[]) の部分については、私が見たものと一致しないように見えるため、非常に混乱しています。これらのパラメーターは q には意味がないようです。ここで何が起こっているのかを理解するのを手伝ってください。

4

2 に答える 2

6

c//1q//1は、以下に定義されているDefinite Clauses Grammarのエントリポイント(別名トップレベルのプロダクション)です。

c(F) --> ....
q(F) --> ....

DCGエントリポイントでのこのスタイルの「呼び出し」は推奨されません。通常、この場合はフレーズ(Grammar、TextToAnalyze、TextAfterAnalysis)を呼び出す方が適切です。phrase((c(F) ; q(F)), "some text", "")...

-->演算子は通常、懸念の原因となる2つの引数を追加して書き直されます。

編集

つまり c(L) --> lead_in,arrange(L),end.

に書き換えられます

c(L,X,Y) :- lead_in(X,X1),arrange(L,X1,X2),end(X2,Y).

于 2012-01-31T19:26:32.407 に答える
2

cは で定義され-->、実際には 2 つの隠し引数が追加されます。これらの最初のものは、文法規則によって解析されるリストです。2 つ目は、解析後の「残り」です。結果を取得するためのリストのc(F,X,[])呼び出し。残っていることを期待します。つまり、パーサーはリスト全体を消費する必要があります。cXF[]X

于 2012-01-31T20:08:27.030 に答える