跳过/传递非标准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中

我在SWI-Prolog下开发,但我的目标是Erlog()。我需要一种使用非标准Prolog语法的方法。 有没有一种方法可以编写被SWI编译器忽略的prolog代码,即使其不可见

下面是一个示例,它看起来如何:

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!