由于某种原因,这两段代码并不等效,第一段代码产生的结果很奇怪(结果不正确)。
-- Method 1
highestElement1([],A,A).
highestElement1([H|T],A,Max) :-
H > A,
highestElement1(T,H,Max);
highestElement1(T,A,Max).
-- Method 2
highestElement2([],A,A).
highestElement2([H|T],A,Max) :-
H > A,
highestElement2(T,H,Max).
highestElement2([H|T],A,Max) :-
H =< A,
highestElement2(T,A,Max).
根据我的理解,它们应该是相同的,因为我相信(d)模式匹配和“或”基本上是彼此的合成糖。不是吗?
答案 0 :(得分:2)
Method1实际上等效于:
highestElement2([],A,A).
highestElement2([H|T],A,Max) :-
H > A,
highestElement2(T,H,Max).
highestElement2([H|T],A,Max) :-
highestElement2(T,A,Max).
这是由于(,)/2
和(;)/2
运算符的相对优先级:
| ?- current_op(Priority, Type, ',').
Priority = 1000
Type = xfy
yes
| ?- current_op(Priority, Type, ';').
Priority = 1100
Type = xfy
yes
即highestElement1
的第二个子句被解析为:
highestElement1([H|T],A,Max) :-
(H > A, highestElement1(T,H,Max))
;
highestElement1(T,A,Max).
在不确定操作符表示法时,可视化术语解析方式的一种方法是使用标准的write_canonical/1
内置谓词:
| ?- write_canonical((a :- b,c; d)).
:-(a,;(','(b,c),d))
(1 ms) yes
输出告诉我们,我们有一个名称为:-
和两个自变量a
和;(','(b,c),d)
的复合词。第二个参数也是名称为;
和两个参数','(b,c)
和d
的复合术语。