2

C ++dllからSWIPrologエンジンを呼び出していますが、すべてのアサートされた/動的な述語にアクセスできるようにしたいと考えています(通常のリストと同様)。

GNU Prologでは、dynamic / 1述語を変数と呼び、Prologはそれをすべての動的述語インジケーターと統合します。次のステップでは、これらの述語を変数で呼び出し、完全なリストを取得します。

残念ながら、SWIプロローグではそれを行うことができません(エラー:引数が十分にインスタンス化されていません)。別の方法はありますか?

4

1 に答える 1

2

たとえば、自分でロールしてみませんか。

get_dynamic_predicates(M, H, B, R) :-
    current_predicate(_, P),
    strip_module(P, M, H),
    predicate_property(P, dynamic), 
    \+ predicate_property(P, built_in), 
    \+ predicate_property(P, imported_from(_)),
    clause(P, B, R).

このバックトラックを呼び出して、述語のインスタンスを本体と句の参照を持つHモジュールのヘッドにバインドします。取得したいのが動的述語の名前だけである場合は、これを呼び出して、のすべてのバインディングのセットまたはそのファンクターを取得できます。MBRH

述語のプロパティを好みのプロパティに変更します(または、さらに良いことに、引数として渡します)。上記の定義は、すべてのユーザー定義の動的述語を取得します。これは、あなたが求めているものだと私は推測しています。

于 2012-02-26T22:38:07.527 に答える