Prolog 序言句可以是模棱两可的吗?

Prolog 序言句可以是模棱两可的吗?,prolog,Prolog,序言句子是否可能模棱两可,你能给我举个例子吗 我知道解析器可能会产生两个不同的解析树,从而产生歧义…不,Prolog在形式上并不含糊,但它提供了一个语法特性,可能导致难以理解的程序,即/3声明。正如您在文档中看到的那样 应用程序必须小心(重新)定义运算符,因为更改运算符可能会导致(其他)文件的解释不同 这就像C++操作符在类固醇上的重载,定义新操作符(或重新定义一些已经知道的系统)的能力在编程DSL(特定于域的语言)时非常有价值。请参见实例库()或 与历史相关的是点运算符。它的主要用途是作为子句

序言句子是否可能模棱两可,你能给我举个例子吗


我知道解析器可能会产生两个不同的解析树,从而产生歧义…

不,Prolog在形式上并不含糊,但它提供了一个语法特性,可能导致难以理解的程序,即/3声明。正如您在文档中看到的那样

应用程序必须小心(重新)定义运算符,因为更改运算符可能会导致(其他)文件的解释不同

这就像C++操作符在类固醇上的重载,定义新操作符(或重新定义一些已经知道的系统)的能力在编程DSL(特定于域的语言)时非常有价值。请参见实例库()或

与历史相关的是点运算符。它的主要用途是作为子句终止符,但较旧的Prolog将其用作“list cons”。这是我对这个话题的回答。注意最初的声明

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

值得注意的是,如果改用
xfx
,则可以通过执行类似
X.Y.Z
的操作,强制Prolog中出现操作员优先级冲突错误。但这个错误“解决”了歧义。@DanielLyons:我不确定我是否理解。xfx完全是为了禁止op B op C。yfy是不允许的,因为它会导致歧义。我认为xfx意味着操作符是非关联的,其中xfy意味着右关联,yfx意味着左关联(IIRC)。我的观点是,用户可以像这样创建歧义,Prolog通过一个错误而不是多次成功解析来解决它。
seek_call([A|As], [_|Ms], [B|As], V) :-
    nonvar(A),
    A =.. [F|FAs],
    seek_call(FAs, Ms, FBs, V),
    !, B =.. [F|FBs].