序言参数未充分实例化

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

如果失败,程序将完全回溯到子句的开头。所以现在 AC 再次未实例化并且 Prolog 通过检查执行新尝试:

Y>=A,Y=<C

但现在AC没有停飞。

您可以通过添加括号解决问题:

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]).