-1

.in DCG には、引数を非表示にする方法があります。つまり、引数は最上位のルールで渡されますが、残りのルールでは言及しませんが、まだアクセスできます。

 S(Ctx,A,B) --> ...
 R1(A) --> ....
 R2(A) --> ..R5(A), { write(Ctx) }
 R3(A) --> ..add2ctx(abc,Ctx), remove4ctx(bcd,Ctx)..

DCG が差分リストに対する構文糖であるのと同じように、ルール ヘッドで変数を宣言するのをスキップしたいだけで、別のルールを呼び出すときに ?

4

3 に答える 3

2

あなたが達成したいことは完全に明確ではありません。文法規則の暗黙の引数は、David の回答などで説明されているように、スレッド化状態に使用されます。ただし、暗黙の論理変数をすべての文法規則と共有することもできます (ただし、これらはスレッド状態には使用できないことに注意してください)。これは、文法規則を Logtalk パラメトリック オブジェクトにカプセル化することで簡単に実現できます。例えば:

:- object(grammar(_Ctx_)).

    :- public(test/2).
    test(L, Z) :-
        phrase((a(Z); b(Z)), L).

    a(Y) --> [aa, X], {atom_concat(X, _Ctx_, Y)}.
    
    b(Y) --> [bb, X], {atom_concat(_Ctx_, X, Y)}.

:- end_object.

いくつかのサンプル クエリ:

?- {grammar}.
% [ /Users/pmoura/grammar.lgt loaded ]
% (0 warnings)
true.

?- grammar(foo)::test([aa,cc], Z).
Z = ccfoo .

?- grammar(foo)::test([bb,cc], Z).
Z = foocc.

これはあなたの場合にうまくいきますか?この例は、Logtalk がサポートするすべての Prolog システムで実行できます。https://logtalk.org/manuals/userman/objects.html#parametric-objectsでパラメトリック オブジェクトとパラメーター変数の詳細を読むこともできます。

于 2021-01-15T21:41:01.003 に答える