Prolog 中的 :- 和 ?- 有什么区别?

What is the difference between :- and ?- in Prolog?

这个 Prolog 程序打印 Hello:

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

:- main.

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

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

?- main.

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

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

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

此外,5.5.5 指出:

A processor may support one or more additional directive indicators (7.4.2) as an implementation specific feature.

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

:-?- 都被指定为 ISO Prolog Core 标准中的前缀运算符:

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

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

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

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

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