当前位置: 首页 > 工具软件 > SWI-Prolog > 使用案例 >

swi prolog 和java_制作适用于GNU和SWI的Prolog代码

方茂
2023-12-01

可移植性是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

 类似资料: