有时我会看到以下术语:X = a:b 或 X = ab
正如预期的那样,我可以执行 X = Y:Z 之类的请求,并且编译器将 Y 与 a 和 Z 与 b 统一起来。
现在我的答案是:我可以使用哪些字符(或字符序列)来组合两个 Prolog 原子?!
也许你可以给我一些关于这个问题的更多信息的链接。
感谢您的帮助和来自德国的亲切问候
有时我会看到以下术语:X = a:b 或 X = ab
正如预期的那样,我可以执行 X = Y:Z 之类的请求,并且编译器将 Y 与 a 和 Z 与 b 统一起来。
现在我的答案是:我可以使用哪些字符(或字符序列)来组合两个 Prolog 原子?!
也许你可以给我一些关于这个问题的更多信息的链接。
感谢您的帮助和来自德国的亲切问候
我可以使用哪些字符(或字符序列)来组合两个 Prolog 原子?!
您在这里要求的是 Prolog 的整个运算符语法定义。要获得对此的完整答案,请参阅标签 iso-prolog以获取有关如何获取 Prolog 标准 ISO/IEC 13211-1 的完整信息。
但作为一个简短的回答开始:
Prolog 语法包括
函数符号,like +(a,b)
, plus
动态可重新定义的运算符语法,加上
一些额外的。
您似乎想知道哪些“字符”可以用作运算符。
简短的回答是你可以使用所有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 语言的信息之前避免定义新的运算符。
让我们看看里面有什么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).
OP,说(我引用):
有时我会看到以下术语:
X = a:b
或X = 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) )