可移植性是Prolog的最弱点之一 - ISO标准定义了current_prolog_flag / 2,但没有列出'name'实现的标志 .
我使用以下代码在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