跳过/传递非标准prolog代码
我在SWI-Prolog下开发,但我的目标是Erlog()。我需要一种使用非标准Prolog语法的方法。 有没有一种方法可以编写被SWI编译器忽略的prolog代码,即使其不可见 下面是一个示例,它看起来如何:跳过/传递非标准prolog代码,prolog,swi-prolog,erlog,Prolog,Swi Prolog,Erlog,我在SWI-Prolog下开发,但我的目标是Erlog()。我需要一种使用非标准Prolog语法的方法。 有没有一种方法可以编写被SWI编译器忽略的prolog代码,即使其不可见 下面是一个示例,它看起来如何: do_stuff(G,Amt) :- ecall(erlog_demo:efunc('Elixir.Blah':stuff({G,Amt})). 我在想,是否有一种方法可以让SWI跳过这一点,而我有另一个声明,它什么也不做 do_stuff(_,_). 一种可能的选择是在Erlog中
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)
这个答案部分基于 以及你对他的候选人方案的评论 我们提出了一种不同的方法。一步一步地跟随这些点
- 首先,我们采用以下简化和缩短的代码段
:- if(true). p(3).
:- elif(false). p(4+3).
:- endif.
考虑以下变化:
:- if(true). p(2).
:- elif(false). :- op(500,xfx,=>). % is moving the `op/3` here ok?
p(3 => 3).
:- endif.
使用SICStus Prolog进行简单测试:
$ sicstus SICStus 4.3.2 (x86_64-linux-glibc2.12): Fri May 8 01:05:09 PDT 2015 [... License information ...] | ?- compile(snip_at_end). % compiling /home/stefan/prolog/snip_at_end.pl... % compiled /home/stefan/prolog/snip_at_end.pl in module user, 40 msec 400672 bytes yes | ?- xxx1. yes | ?- xxx2. yes | ?- xxx3. ! Existence error in user:xxx3/0 ! procedure user:xxx3/0 does not exist ! goal: user:xxx3
希望这有帮助!我很好奇/感兴趣我的答案是否符合您的问题:)在“else”分支中缺少一个右括号 只需计算左括号的数量。当达到
(句点,整步)时,打开与关闭的差异计数必须精确为零
希望有帮助 您可以使用事实上的标准
Prolog标志来简化代码。@PauloMoura:谢谢。您的建议将有助于操作它,但仍然会得到“语法错误:运算符预期”,可能是因为这是prolog的外来语法!!!这只在语法大致相同的情况下有效。我觉得你的问题描述相当令人费解。你想要实现什么?是“如何进行Prolog处理”吗?一旦理解并可见,每一个错误都是微不足道且显而易见的:)在工具箱上打上“Prolog”的标记。了解技巧、黑客、工具等。为什么不使用具有适当扩展名的编辑器呢?每天至少应该有一个TIL时刻。 :- op(500,xfx,=>). :- if(true). p(2). :- elif(false). p(3 => 3). :- endif. :- if(true). p(2). :- elif(false). :- op(500,xfx,=>). % is moving the `op/3` here ok? p(3 => 3). :- endif. % snip_at_end.pl xxx1. xxx2. end_of_file. xxx3. :- op (500, xfx,eat). % broken syntax (pt.1) 1 ]][[ v % broken syntax (pt.2)方言
$ sicstus SICStus 4.3.2 (x86_64-linux-glibc2.12): Fri May 8 01:05:09 PDT 2015 [... License information ...] | ?- compile(snip_at_end). % compiling /home/stefan/prolog/snip_at_end.pl... % compiled /home/stefan/prolog/snip_at_end.pl in module user, 40 msec 400672 bytes yes | ?- xxx1. yes | ?- xxx2. yes | ?- xxx3. ! Existence error in user:xxx3/0 ! procedure user:xxx3/0 does not exist ! goal: user:xxx3
do_stuff(G,Amt) :- ecall(erlog_demo:efunc('Elixir.Blah':stuff({G,Amt})). % BAD do_stuff(G,Amt) :- ecall(erlog_demo:efunc('Elixir.Blah':stuff({G,Amt}))). % OK!