これはスコープ関連の問題だと思います。オブジェクトに次のようなルールがある場合:
:- public(new/2).
:- mode(new(+list, -object_identifier), one).
new(Args, Instance) :-
self(Self),
create_object(Instance, [instantiates(Self)], [], []),
Instance::process_arguments(Args).
私がこのダンスをするなら、これはうまくいくと思います:
:- object(name, instantiates(name)).
なぜこれが必要なのか完全には理解していませんが、それが私の実際の問題に関連しているのではないかと思います。つまり、オブジェクトに標準のPrologループがある場合、次のようになります。
process_arguments([Arg|Args]) :- process_arg(Arg), process_arguments(Args).
process_arguments([]).
process_arg(Arg) :- ::asserta(something(Arg)).
::asserta
この使用により、ファクトが(新しく作成されたインスタンスの)正しい名前空間に配置されることがわかりました。ただし、機知に富み、の本体process_arguments/1
をこのラムダ式に置き換えると、次のようになります。
process_arguments(Args) :- meta::map([Arg]>>process_arg(Arg), Args).
次に、ファクトが親クラスに追加され、すべてのインスタンスで共有されることになります。これに置き換えると:
process_arguments(Args) :-
self(Self),
meta::map([Arg]>>(Self::process_arg(Arg)), Args).
それでうまくいきますが、したくないときは公のルールを作らprocess_arg/1
なければなりません。私は何が欠けていますか?