此Prolog程序打印Hello
:
main :-
write('Hello'), nl.
:- main.
我将(:-)/1
更改为(?-)/1
:
main :-
write('Hello'), nl.
?- main.
这将产生完全相同的结果。这也会打印Hello
。
那么(:-)/1
和(?-)/1
有什么区别?
答案 0 :(得分:4)
带有主函数(:-)/1
的term的自变量称为指令。在Prolog标准中,它是在7.4.2指令中定义的。
此外,5.5.5指出:
处理器可以支持一个或多个其他指令 指标(7.4.2)作为实现的特定功能。
因此,在某些Prolog系统中,(?-)/1
可作为附加的指令指示符。
答案 1 :(得分:4)
在ISO Prolog中,:-
仅用于诸如运算符声明之类的指令。 ?-
运算符也已定义,但未赋予其含义。
这些运算符源自1978年DEC系统10 Prolog,分别被称为命令和问题。 :- p(X).
刚刚在咨询过程中测试了p(X)
的成功,而?- p(X).
显示了实际答案并提示您进一步的答案。因此,您在加载文件时会产生一些交互作用,而这些交互作用在后续系统中被放弃,从而使两个操作员的行为都相同。
从DEC10开始,许多系统都会将?-
打印为顶层循环的提示,提醒您,读入的下一个术语将被解释为一个问题。一些系统甚至更进一步,在其前面添加了解释器提示|
。
答案 2 :(得分:2)
在ISO Prolog Core标准中,:-
和?-
都被指定为前缀运算符:
Priority Specifier Operator(s)
...
1200 fx :- ?-
?-
前缀运算符主要是历史原因。它的语义与:-
前缀运算符相同,尽管除了在Markus的答案中提到的那个语句外,我在标准中没有找到澄清它的语句。