あなたが達成したいことは完全に明確ではありません。文法規則の暗黙の引数は、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でパラメトリック オブジェクトとパラメーター変数の詳細を読むこともできます。