【问题标题】:What is the difference between :- and ?- in Prolog?Prolog 中的 :- 和 ?- 有什么区别?
【发布时间】:2018-10-24 09:18:12
【问题描述】:

这个 Prolog 程序打印 Hello:

main :-
    write('Hello'), nl.

:- main.

我把(:-)/1改成了(?-)/1

main :-
    write('Hello'), nl.

?- main.

这会产生完全相同的结果。这也会打印出Hello

那么(:-)/1(?-)/1 有什么区别?

【问题讨论】:

    标签: prolog iso-prolog


    【解决方案1】:

    主函子(:-)/1 的term 参数称为指令。在 Prolog 标准中,它在 7.4.2 指令中定义。

    此外,5.5.5 规定:

    处理器可能支持一个或多个附加指令 指标 (7.4.2) 作为实现特定的功能。

    因此,在某些 Prolog 系统中,(?-)/1 可用作附加指令指示符。

    【讨论】:

    • 对于 SWI Prolog,:-?- 可以互换吗?
    • 是的,您可以看到?-(D) 在内部被完全视为:-(D)github.com/SWI-Prolog/swipl-devel/blob/… 但是,将(:-)/1 用于指令是常见(和标准)的做法。这适用于所有 Prolog 系统。请注意,您应该使用initialization/1 指令可移植地执行 Prolog 代码。比如写:- initialization main.
    • 有趣的是,在 SWI 和 Gnu Prologs 中,?- 运算符不适用于 include/1 指令。
    【解决方案2】:

    在 ISO Prolog 中,:- 仅用于运算符声明等指令。 ?- 运算符也已定义,但没有赋予它任何意义。

    这些运算符源自~1978 年的 DEC 系统 10 Prolog,它们分别被称为命令和问题。虽然:- p(X). 只是在咨询期间测试了p(X) 的成功,但?- p(X). 显示了实际答案并提示您提供进一步的答案。因此,您在加载文件时进行了一些交互,这些交互在后续系统中被放弃,从而使两个操作员的行为方式相同。

    自 DEC10 以来,许多系统打印 ?- 作为顶层循环的提示,提醒读入的下一个术语将被解释为一个问题并回答。有些系统更进一步,在其前面添加解释器提示|

    【讨论】:

      【解决方案3】:

      :-?- 在 ISO Prolog 核心标准中都被指定为前缀运算符:

      Priority   Specifier   Operator(s)
      ...
      1200       fx          :- ?-
      

      ?- 前缀运算符主要是历史原因。它的语义与 :- 前缀运算符相同,尽管除了 Markus 的回答中提到的之外,我没有在标准中找到澄清它的声明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-18
        • 1970-01-01
        • 1970-01-01
        • 2011-09-12
        • 2010-10-02
        • 2011-12-12
        • 2010-09-16
        相关资源
        最近更新 更多