gpt4 book ai didi

prolog - 跳过/通过非标准序言代码

转载 作者:行者123 更新时间:2023-12-04 22:58:43 32 4
gpt4 key购买 nike

我正在 SWI-Prolog 下开发,但我的目标是 Erlog​​ (https://github.com/rvirding/erlog)。我需要一种使用非标准 Prolog 语法的方法。
有没有办法编写将被 SWI 编译器忽略的序言代码,即使其不可见。

这是它的外观示例:

do_stuff(G,Amt) :- ecall(erlog_demo:efunc('Elixir.Blah':stuff({G,Amt})).

我在想是否有办法让 SWI 跳过它,而我有另一个什么都不做的声明。
do_stuff(_,_).

一种选择可能是对其进行注释,然后在运行 Erlog​​ 之前使用解析器删除注释,但这似乎很麻烦。

任何其他想法。

======
is_dialect(swi) :- catch(current_prolog_flag(dialect, swi), _, fail).
:- if(is_dialect(swi)).
do_stuff(_,_).
:- else.
do_stuff(G,Amt) :- ecall(erlog_demo:efunc('Elixir.Blah':stuff({G,Amt})).
:- endif.

语法错误:应为运算符

最佳答案

我使用这个习惯用法来保持代码在不同的实现中运行

:- 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.

其中谓词 swi/0 或 yap/0 是从此模块导入的(prolog_impl)
:- module(prolog_impl, [swi/0, yap/0, prolog_impl/1]).

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

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

关于prolog - 跳过/通过非标准序言代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33058603/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com