我可以发出请求,例如 X = Y:Z 编译器将Y与a统一,Z与b统一,如预期的那样。
现在我的问题是: 我可以使用哪些字符(或字符序列)来组合两个Prolog原子?!
也许您可以给我一些有关此问题的进一步信息链接。
感谢您的帮助和来自德国的亲切问候。
+(a,b)
,加号。
2.可动态重新定义的运算符语法。
3.一些额外的内容。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 = (>=) ; ... .
所有这些运算符都可以按指定的方式使用,作为前缀、中缀或后缀,并具有指定的优先级。其中一些运算符是特定于SWI的,而一些是由标准定义的。上面,只有@>=
和>=
是标准运算符。
大多数运算符仅由图形字符#$&*+-./:<=>?@^~
或以小写字母开头的字母、数字和下划线组成。有两个独立的字符!;
,还有更特殊的,|
。与上述不同的运算符名称需要引用-您很少会遇到它们。
要查看运算符的嵌套方式,请使用write_canonical(Term)
。
长答案是您也可以自己定义这样的运算符。但是,请注意更改运算符语法通常会有许多非常难以理解的影响。更重要的是,由于许多系统在某些很少使用的配置方面存在差异。例如,您提到的系统,SWI在几个方面存在差异。
我建议在学习更多关于Prolog语言之前避免定义新的运算符。
让我们看看 X = Y:Z
的内部结构。
?- display( X = Y:Z ).
=(_G3,:(_G1,_G2))
true.
然后我们有一个嵌套结构,其中functor是运算符。
运算符是一个原子,原子语法规则表示我们有3种类型要考虑:
编辑
functor(缩写为函数构造器,在Prolog上下文中使用函数会产生误导)是将多个参数“绑定”在一起的符号。参数的数量称为arity。在Prolog中,一个术语是一个原子文字(如数字或原子),或者是一个递归结构,由一个functor和若干个参数组成,每个参数本身都是一个术语(至少1个)。
给定适当的声明,即op / 3,可以将一元和二元术语表示为表达式,就像您展示的那个一样。
使用:特殊字符的运算符示例是“:-”
member(X,[X|_]).
member(X,[_|T]) :- member(X, T).
原话是:“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
)运算符。任何具有2元数的结构都可以是中缀运算符。任何具有1元数的结构都可以是前缀或后缀运算符。因此,任何原子都可以是运算符。
a + b * c
是完全相同的
'+'( a , '*'(b,c) )
+(a, *(b,c))
中,没有引用 +
或 *
的理由。 - false'*'/2
表示“名称为 *
,元数为 2 的谓词或结构”。 - Nicholas Carey
write_canonical/1
谓词来实现更便携的解决方案。 - Paulo Moura”并不是一个“特殊”的字符,就像您所写的那样。它是像
#$&*+-./:<=>?@^~` 一样的图形字符。 - false