Prolog句子是否可能含糊不清,你能告诉我一个例子吗?
我知道解析器的含义可能会产生两种不同的解析树......
答案 0 :(得分:3)
不,Prolog在形式上并不含糊,但它提供了一种语法特征,可能导致难以理解的程序,即op / 3声明。正如您可以在文档中看到的那样
应用程序必须小心(重新)定义运算符,因为更改运算符可能会导致(其他)文件的解释不同。
就像C ++运算符在类固醇上重载一样,并且在编写DSL(特定于域的语言)时,定义新运算符(或重新定义一些已经知道的系统)的能力非常有价值。例如,请参阅库(clpfd)或lambda。
历史相关性,它是点运算符。它的主要用途是作为子句终止符,但较旧的Prolog使用它作为“列表缺点”。 Here是我对此主题的回答。请注意初始声明
:- op(103, xfy, (.)).
允许紧凑的定义(例如)
seek_call(A.As, _.Ms, B.As, V) :-
nonvar(A),
A =.. F.FAs,
seek_call(FAs, Ms, FBs, V),
!, B =.. F.FBs.
它相当于
seek_call([A|As], [_|Ms], [B|As], V) :-
nonvar(A),
A =.. [F|FAs],
seek_call(FAs, Ms, FBs, V),
!, B =.. [F|FBs].