3

有时我会看到以下术语:X = a:b 或 X = ab

正如预期的那样,我可以执行 X = Y:Z 之类的请求,并且编译器将 Y 与 a 和 Z 与 b 统一起来。

现在我的答案是:我可以使用哪些字符(或字符序列)来组合两个 Prolog 原子?!

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

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

4

3 回答 3

4

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

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

但作为一个简短的回答开始:

Prolog 语法包括

  1. 函数符号,like +(a,b), plus

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

  3. 一些额外的。

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

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

?- current_op(Pri, Fix, Op)。
普里 = 1,
修复 = fx,
操作 = ($) ;
普里 = 1150,
修复 = fx,
操作 = (module_transparent) ;
普里 = 700,
修复 = xfx,
操作 = (=@=) ;
普里 = 700,
修复 = xfx,
操作 = (@>=) ;
普里 = 700,
修复 = xfx,
操作 = (>=)
...

所有这些运算符都可以以指定的方式使用,作为具有指定优先级的前缀、中或后缀。其中一些运算符是特定于 SWI 的,有些是由标准定义的。以上,只有@>=>=是标准运算符。

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

要查看运算符如何嵌套,请使用write_canonical(Term).

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

我建议在您了解更多有关 Prolog 语言的信息之前避免定义新的运算符。

于 2013-10-11T19:44:10.673 回答
3

让我们看看里面有什么X = Y:Z

?- display( X = Y:Z ).
=(_G3,:(_G1,_G2))
true.

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

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

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

编辑

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

给定适当的声明,即 op/3,一元和二元项可以表示为表达式,就像您展示的那样。

使用 : 特殊字符的运算符示例是 ':-'

member(X,[X|_]).
member(X,[_|T]) :- member(X, T).
于 2013-10-10T17:50:52.390 回答
1

OP,说(我引用):

有时我会看到以下术语:X = a:bX = a-b

我可以像X = Y:Z预期的那样做请求,编译器将 Y 与 a 和 Z 与 b 统一起来。

现在我的答案是:我可以使用哪些字符(或字符序列)来组合两个 Prolog 原子?!

简短的回答几乎是你想要的任何东西(只要它是一个原子)

更长的答案是这样的:

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

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

优先级与运算符绑定的紧密程度有关。a + b * c像绑定这样的表达式( a + ( b * c )不是因为关联性,而是因为 '*'/2(乘法)比 '+'/2(加法)具有更高的优先级。

您可以随心所欲地添加、删除和更改运算符。并不是说这会给你很大的空间来打破 prolog 的语法。

然而,应该注意的是,任何运算符表达式也可以通过普通符号来编写:

a + b * c

_

'+'( a , '*'(b,c) )
于 2013-10-11T18:02:10.227 回答