在 Prolog 中,如何将运算符“关系”定义为关系/3 谓词?例如:
relation a b c.
并制作它:
relation(a, b, c).
谢谢!
首先,运算符不是关系,也不是谓词。运算符是一种语法特性,它们只是为了帮助我们节省键入括号的时间:
:- 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) .