有时我会看到以下字词: X = a:b 要么 X = a-b
我可以这样做 X = Y:Z 并且编译器将Y与a和Z统一为b,如预期的那样。
现在我的回答: 我允许使用哪些字符(或字符序列)来组合两个Prolog原子?!
也许你可以给我一些关于这个问题的进一步信息的链接。
感谢您的帮助和来自德国的亲切问候
答案 0 :(得分:3)
我允许使用哪些字符(或字符序列)来组合两个Prolog原子?!
您在这里要求的是Prolog的整个运算符语法定义。要获得完整的答案,请参阅the tag iso-prolog以获取有关如何获得Prolog标准ISO / IEC 13211-1的完整信息。
但作为一个简短的答案开头:
Prolog语法包含
功能表示法,如+(a,b)
,加上
动态可重定义的运算符语法,加上
一些额外的。
您似乎想知道哪些“字符”可以用作运算符。
简短回答是您可以使用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种要考虑:
修改的
仿函数(函数构造函数的简写,我认为,但是在Prolog上下文中函数有误导性)它是“联系”几个参数的符号。参数的数量名为 arity 。在Prolog中,术语是原子文字(如数字或原子),或递归结构,由仿函数和许多参数组成,每个参数都是术语本身(至少1)。
鉴于适当的声明,即op / 3,一元和二元术语可以表示为表达式,就像你展示的那样。
使用:special char的运算符示例是': - '
member(X,[X|_]).
member(X,[_|T]) :- member(X, T).
答案 2 :(得分:1)
O.P.说(我引用):
有时我会看到以下字词:
X = a:b
或X = 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) )