Prolog中的Arity 3运营商

时间:2013-11-12 11:23:55

标签: prolog operators

在Prolog中,如何定义运算符“relation”作为关系/ 3谓词?例如:

relation a b c.

并制作它:

relation(a, b, c).

谢谢!

1 个答案:

答案 0 :(得分:5)

首先,运营商不是关系,也不是谓词。运算符是一种语法特征,它们只是为了帮助我们节省输入括号:

:- op(250,xfy,#).

然后

4 ?- X = 2#3#5, write_canonical(X).
#(2,#(3,5))
X = 2#3#5.

现在,您可以根据需要定义将处理此类复合词的谓词。这当然与

没什么不同
5 ?- X=[2,3|5], write_canonical(X).
'.'(2,'.'(3,5))
X = [2, 3|5].

语法级别无法将复合术语的嵌套限制为仅两个级别。处理它们的谓词必须从无效的案例中辨别出有效性。

7 ?- Y=2#3#5#7, write_canonical(Y).
#(2,#(3,#(5,7)))
Y = 2#3#5#7.

或者,您可以串联使用两个非关联运算符:

:- op(250,xfx,#).
:- op(350,xfx,@).

然后

10 ?- X=2@3#5, write_canonical(X).
@(2,#(3,5))
X = 2@3#5.

11 ?- X=2@3#5#7, write_canonical(X).
ERROR: Syntax error: Operator priority clash
ERROR: X=2@3#
ERROR: ** here **
ERROR: 5#7, write_canonical(X) .