Prolog中的Arity 3运营商

Lau*_*sar 4 operators prolog

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

relation a b c.

并生产它:

relation(a, b, c).

谢谢!

Wil*_*ess 5

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

:- op(250,xfy,#).
Run Code Online (Sandbox Code Playgroud)

然后

4 ?- X = 2#3#5, write_canonical(X).
#(2,#(3,5))
X = 2#3#5.
Run Code Online (Sandbox Code Playgroud)

现在,您可以根据需要定义将处理此类复合词的谓词.这当然没有太大的不同

5 ?- X=[2,3|5], write_canonical(X).
'.'(2,'.'(3,5))
X = [2, 3|5].
Run Code Online (Sandbox Code Playgroud)

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

7 ?- Y=2#3#5#7, write_canonical(Y).
#(2,#(3,#(5,7)))
Y = 2#3#5#7.
Run Code Online (Sandbox Code Playgroud)

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

:- op(250,xfx,#).
:- op(350,xfx,@).
Run Code Online (Sandbox Code Playgroud)

然后

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) . 
Run Code Online (Sandbox Code Playgroud)