首先,运营商不是关系,也不是谓词.运算符是一个语法特性,它们只是为了帮助我们节省输入括号:
:- 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)
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |