在Prolog中使用“或”

时间:2019-01-09 21:16:57

标签: prolog

由于某种原因,这两段代码并不等效,第一段代码产生的结果很奇怪(结果不正确)。

-- 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)模式匹配和“或”基本上是彼此的合成糖。不是吗?

1 个答案:

答案 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的复合术语。