5

これには制限があることは承知していますが、GNU または SWI のいずれかで合理的に機能するように、Prolog コードに条件付きディレクティブを配置する合理的な方法はありますか? sumlist少なくとも、 SWI やGNUなどの組み込み述語sum_listのスペルが一致しない最も単純なケースを考えています。または、SWI にはありますassertが、GNU にはありません。したがって、次のようなものがあればいいでしょう。

:- if($SWI).
SWI version of stuff
:- else.
GNU version of stuff
:- endif.

または単に:

:- if(not_a_builtin(sumlist))
sumlist(L, S) :- sum_list(L, S).
:- endif.

または、そうではありません。条件付きディレクティブは両方の言語に存在しますが、この種のことを行うために必要な条件を提供するまでには至らないようです。手動検索では見つからなかったものを見逃している可能性があります。

4

3 に答える 3

1

移植性は Prolog の最も弱い点の 1 つです。ISO 標準では current_prolog_flag/2 が定義されていますが、実装の「名前」をフラグの中にリストしていません。

次のコードを使用して、SWI と YAP を切り替えました

swi :- prolog_impl(swi).
yap :- prolog_impl(yap).

prolog_impl(K) :-
    F =.. [K,_,_,_,_],
    current_prolog_flag(version_data, F).

そしてそれを次のように使用しました

:- if(swi).

 gen_hash_lin_probe(Key, HashTable, Value) :-
    arg(_, HashTable, E),
    nonvar(E),
    E = Key-Value.

:- elif(yap).

 gen_hash_lin_probe(Key, HashTable, Value) :-
    HashTable =.. [htlp|Args],
    nth1(_, Args, E),
    nonvar(E),
    E = Key-Value.

:- endif.

しかし、GNU は を定義していませんversion_data。次に、そのコードは多かれ少なかれ次のように拡張する必要があります

...
   catch(current_prolog_flag(version_data,F),_,K = gnu).

(注:テストされていません)

ビルトインの存在をテストするには predicate_property/2 (AFAIK ではなく ISO) があり、実際の動作を決定するために、いつものように実験する必要があります。

OT: sumlist/2 は非推奨です。sum_list /2があります。

于 2013-06-11T06:06:03.053 に答える
0

フラグは、dialect基盤となるシステムをテストするのに最も適しています。ただし、GNU Prolog は も提供しますversion_dataprolog_implところで:使用するためのより良い定義version_dataは次のとおりです。

prolog_impl(K) :-
    current_prolog_flag(version_data, F),
    functor(F, K, _).
于 2013-06-11T16:33:40.177 に答える