问题是;
优先级低于,
你所写的绑定的绑定相当于:
t_max(X, Y, Z) :-
( A is max(max(X, Y), max(Y, Z)),
C is min(min(X, Y), min(Y, Z)),
X>=A,
X=<C
-> B is X
; Y>=A,
Y=<C
-> B is Y
; Z>=A,
Z=<C
-> B is Z
; format('~w ~w ~w', [A, B, C])
).
这是什么意思:Prolog 评估:
A is max(max(X,Y),max(Y,Z)),
C is min(min(X,Y),min(Y,Z)),
首先然后检查条件:
X>=A,X=<C
但是,如果失败,程序将完全回溯到子句的开头。所以现在A
和C
再次未实例化,Prolog 通过检查执行新的尝试:
Y>=A,Y=<C
但现在A
并C
没有接地。
您可以通过添加括号来解决问题:
t_max(X,Y,Z):-
A is max(max(X,Y),max(Y,Z)),
C is min(min(X,Y),min(Y,Z)),
((X>=C,X=<A)
-> B is X
; ((Y>=C,Y=<A)
->B is Y
; ((Z>=C,Z=<A)
-> B is Z;
true
)
)
),
format('~w ~w ~w',[A,B,C]).
如果我正确理解您的问题。但是,如果您想将它们从大到小排序,对三个数字执行此操作的紧凑方法是:
t_max(X,Y,Z) :-
Max is max(X,max(Y,Z)),
Min is min(X,min(Y,Z)),
Mid is X+Y+Z-Max-Min,
format('~w ~w ~w',[Max,Mid,Min]).