2

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...

4

1 回答 1

3

不,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].
于 2013-10-01T22:09:34.897 回答