序言参数未充分实例化
prolog arguments are not sufficently instantiated
我正在尝试从给定的 3 个数字中找出最大值、中间值和最小值。代码是:
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]).
当我尝试 运行 使用任意三个数字的方法时,出现此错误
ERROR: >=/2: Arguments are not sufficiently instantiated
为什么会出现此错误?
问题是 ;
的绑定优先级低于 ,
所以你写的相当于:
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]).
我正在尝试从给定的 3 个数字中找出最大值、中间值和最小值。代码是:
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]).
当我尝试 运行 使用任意三个数字的方法时,出现此错误
ERROR: >=/2: Arguments are not sufficiently instantiated
为什么会出现此错误?
问题是 ;
的绑定优先级低于 ,
所以你写的相当于:
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]).