关于Prolog语法

时间:2013-10-10 17:28:59

标签: prolog iso-prolog

有时我会看到以下字词:     X = a:b 要么     X = a-b

我可以这样做     X = Y:Z 并且编译器将Y与a和Z统一为b,如预期的那样。

现在我的回答: 我允许使用哪些字符(或字符序列)来组合两个Prolog原子?!

也许你可以给我一些关于这个问题的进一步信息的链接。

感谢您的帮助和来自德国的亲切问候

3 个答案:

答案 0 :(得分:3)

  

我允许使用哪些字符(或字符序列)来组合两个Prolog原子?!

您在这里要求的是Prolog的整个运算符语法定义。要获得完整的答案,请参阅the tag iso-prolog以获取有关如何获得Prolog标准ISO / IEC 13211-1的完整信息。

但作为一个简短的答案开头:

Prolog语法包含

  1. 功能表示法,如+(a,b),加上

  2. 动态可重定义的运算符语法,加上

  3. 一些额外的。

  4. 您似乎想知道哪些“字符”可以用作运算符。

    简短回答是您可以使用Op成功的所有原子current_op(Pri,Fix,Op)。因此,您可以动态询问哪些运算符存在:

    ?- current_op(Pri, Fix, Op).
    Pri = 1,
    Fix = fx,
    Op = ($) ;
    Pri = 1150,
    Fix = fx,
    Op = (module_transparent) ;
    Pri = 700,
    Fix = xfx,
    Op = (=@=) ;
    Pri = 700,
    Fix = xfx,
    Op = (@>=) ;
    Pri = 700,
    Fix = xfx,
    Op = (>=)
    ...
    

    所有这些运算符都可以以指定的方式使用,如指定优先级的pre-in,in-或postfix。其中一些运算符特定于SWI,一些运算符由标准定义。以上,只有@>=>=是标准运营商。

    大多数运算符仅包含图形字符#$&*+-./:<=>?@^~或以小写字母开头的字母,数字和下划线。有两个独奏角色!;,然后有,|更加特别。与上述不同的运营商名称需要引用 - 您很少会遇到它们。

    要了解运算符的嵌套方式,请使用write_canonical(Term)

    答案很长是您也可以自己定义此类运算符。但是,请注意,更改运算符语法通常会产生许多难以理解的含义。更是如此,因为许多系统在一些很少使用的配置上有所不同。例如,您提到的系统,SWI differs in several ways

    我建议在你学习更多关于Prolog语言之前避免定义新的操作符。

答案 1 :(得分:2)

让我们看看X = Y:Z

里面的内容
?- display( X = Y:Z ).
=(_G3,:(_G1,_G2))
true.

然后我们有一个嵌套结构,其中仿函数是运算符。

运算符是一个原子,原子语法的规则说我们有3种要考虑:

  • 用单引号括起来的任何可打印字符的序列
  • 一系列特殊字符 only ,其中一个特殊字符是`。=: - + * /&gt;&lt;#@〜? (我希望我找到所有这些,从this page你可以检查我是否忘记了某人!)
  • 一系列小写/大写字符或下划线,以小写字符开头

修改

仿函数(函数构造函数的简写,我认为,但是在Prolog上下文中函数有误导性)它是“联系”几个参数的符号。参数的数量名为 arity 。在Prolog中,术语是原子文字(如数字或原子),递归结构,由仿函数和许多参数组成,每个参数都是术语本身(至少1)。

鉴于适当的声明,即op / 3,一元和二元术语可以表示为表达式,就像你展示的那样。

使用:special char的运算符示例是': - '

member(X,[X|_]).
member(X,[_|T]) :- member(X, T).

答案 2 :(得分:1)

O.P.说(我引用):

  

有时我会看到以下字词:X = a:bX = a-b

     

我可以执行像X = Y:Z这样的请求,并且编译器会根据预期将Y与a和Z与b统一起来。

     

现在我的回答:我允许哪些字符(或字符序列)   用来组合两个Prolog原子?!

简短的回答是几乎无论你想要什么(只要它是一个原子)

答案越长越好:

所看到的是中缀(x infix_op b),前缀(pfx_op b)和后缀(b sfx_op运算符。 arity为2的任何结构都可以是中缀运算符。 arity为1的任何结构都可以是前缀或后缀运算符。因此,任何原子都可能是操作者。

Prolog通过优先驱动的递归下降解析器解析(自然地用Prolog编写)。定义和枚举运算符,以及它们在operator/3谓词中的优先级和关联性。关联性与解析树的构造方式有关。像a - b - c这样的表达式可以解析为( a - ( b - c ) )(右关联)或( ( a - b ) - c )(左关联)。

优先级与紧密运算符的绑定方式有关。类似a + b * c的表达式绑定为( a + ( b * c )不是因为关联性,而是因为'*'/ 2(乘法)的优先级高于'+'/ 2(加法)。

您可以根据自己的内容添加,删除和更改运算符。并不是说通过打破prolog的语法,这给了你足够的空间来射击自己。

但是,应该注意的是,任何运算符表达式也可以通过普通表示法编写:

a + b * c

完全相同
'+'( a , '*'(b,c) )