Is it possible for a Prolog sentence to be ambiguous and could you show me an example?
I know parsers can be ambiguous in a way that they could generate two different parse trees...
Is it possible for a Prolog sentence to be ambiguous and could you show me an example?
I know parsers can be ambiguous in a way that they could generate two different parse trees...
不,Prolog 形式上并不模棱两可,但它提供了一个可能导致难以理解的程序的语法特性,即op /3 声明。正如您在文档中所读到的
应用程序必须小心(重新)定义运算符,因为更改运算符可能会导致(其他)文件被不同地解释。
就像 C++ 运算符重载在类固醇上一样,并且定义新运算符(或重新定义系统已知的一些运算符)的能力在编程 DSL(特定于域的语言)时可能非常有价值。参见例如 library( clpfd ) 或lambda。
具有历史意义的是点运算符。它的主要用途是作为子句终止符,但较旧的 Prolog 将其用作“列表缺点”。这是关于这个主题的我的答案。注意初始声明
:- 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].