4

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

relation a b c.

并制作它:

relation(a, b, c).

谢谢!

4

1 回答 1

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) . 
于 2013-11-12T14:30:36.230 回答