Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Prolog参数没有充分实例化。列表/递归_List_Prolog_Instantiation Error - Fatal编程技术网

List Prolog参数没有充分实例化。列表/递归

List Prolog参数没有充分实例化。列表/递归,list,prolog,instantiation-error,List,Prolog,Instantiation Error,我试图从给定列表“L”中获取最大值并将其分配给变量,因此我编写了以下函数: max(L,X):- [H|Q]=L, (X<H -> X=H), length(Q,QLEN), (QLEN>0 -> max(Q,X)), true. max(L,X):- [H | Q]=L, (X=H), 长度(Q,QLEN), (QLEN>0->max(Q,X)), 对。 但是,在编译代码并在内部提示max([1,2,3],X)后,我得到以下错

我试图从给定列表“L”中获取最大值并将其分配给变量,因此我编写了以下函数:

max(L,X):-
    [H|Q]=L,
    (X<H -> X=H),
    length(Q,QLEN),
    (QLEN>0 -> max(Q,X)),
    true.
max(L,X):-
[H | Q]=L,
(X=H),
长度(Q,QLEN),
(QLEN>0->max(Q,X)),
对。
但是,在编译代码并在内部提示
max([1,2,3],X)
后,我得到以下错误:

错误:参数未充分实例化错误:在:错误:

[9] _1064如评论中所述,您试图将
H
与未实例化的
X
进行比较。此问题的解决方案是创建一个谓词
maxList/3
,并在
maxList/2
中调用它,如下所示:

maxList([H|T], Max) :-
    maxList(T, H, Max).

maxList([], Max, Max).
maxList([H|T], Max0, Max) :-
    Max1 is max(H, Max0),
    maxList(T, Max1, Max).

?- maxList([1,2,3],X).
X = 3.
max/2
只返回两个参数之间的最大值。
max/2
的一种可能实现方式是:

myMax(M,A,B):-
    A > B ->  M = A;
    M = B.

?- myMax(A,1,2).
A = 2.
maxList([X],X).
maxList([H|T],H) :-
  maxList(T,M),
  H >= M.
maxList([H|T],M) :-
  maxList(T,M),
  H < M.
顺便说一句,SWI中已经有一个内置谓词来执行此操作,称为
max\u list/2
(我之前发布的代码实际上来自此实现):


如评论中所述,您尝试将
H
与未实例化的
X
进行比较。此问题的解决方案是创建一个谓词
maxList/3
,并在
maxList/2
中调用它,如下所示:

maxList([H|T], Max) :-
    maxList(T, H, Max).

maxList([], Max, Max).
maxList([H|T], Max0, Max) :-
    Max1 is max(H, Max0),
    maxList(T, Max1, Max).

?- maxList([1,2,3],X).
X = 3.
max/2
只返回两个参数之间的最大值。
max/2
的一种可能实现方式是:

myMax(M,A,B):-
    A > B ->  M = A;
    M = B.

?- myMax(A,1,2).
A = 2.
maxList([X],X).
maxList([H|T],H) :-
  maxList(T,M),
  H >= M.
maxList([H|T],M) :-
  maxList(T,M),
  H < M.
顺便说一句,SWI中已经有一个内置谓词来执行此操作,称为
max\u list/2
(我之前发布的代码实际上来自此实现):


另一种不依赖辅助谓词的可能实现可以根据以下逻辑完成:

  • 如果列表仅包含一个元素,则为最大值
  • 如果列表
    L
    包含多个元素,即其形式为
    [H | T]
    ,且
    T
    的最大元素为
    M
    ,则
    L
    的最大元素将为
    H
    如果
    H>=M
    ,否则将为
    M
  • 粗略编码可以是:

    myMax(M,A,B):-
        A > B ->  M = A;
        M = B.
    
    ?- myMax(A,1,2).
    A = 2.
    
    maxList([X],X).
    maxList([H|T],H) :-
      maxList(T,M),
      H >= M.
    maxList([H|T],M) :-
      maxList(T,M),
      H < M.
    
    maxList([X],X)。
    最大列表([H | T],H):-
    最大列表(T,M),
    H>=M。
    最大列表([H | T],M):-
    最大列表(T,M),
    H

    这留下了改进的余地,但尊重上述逻辑,并返回每个非空整数列表的最大元素。

    另一种可能的实现,不依赖辅助谓词,可以根据以下逻辑完成:

  • 如果列表仅包含一个元素,则为最大值
  • 如果列表
    L
    包含多个元素,即其形式为
    [H | T]
    ,且
    T
    的最大元素为
    M
    ,则
    L
    的最大元素将为
    H
    如果
    H>=M
    ,否则将为
    M
  • 粗略编码可以是:

    myMax(M,A,B):-
        A > B ->  M = A;
        M = B.
    
    ?- myMax(A,1,2).
    A = 2.
    
    maxList([X],X).
    maxList([H|T],H) :-
      maxList(T,M),
      H >= M.
    maxList([H|T],M) :-
      maxList(T,M),
      H < M.
    
    maxList([X],X)。
    最大列表([H | T],H):-
    最大列表(T,M),
    H>=M。
    最大列表([H | T],M):-
    最大列表(T,M),
    H


    这留下了改进的余地,但尊重上述逻辑,并为每个非空整数列表返回最大元素。

    因为当您尝试将
    X
    H
    进行比较时,它没有值。这整句话在序言中毫无意义。到目前为止,最大值还需要一些其他参数。不要试图在每一步计算长度。当列表为空时,搜索结束。@TomasBy如果我在函数中初始化X,我将丢失下一个递归的值。@coredump好的。@Kais:在下面的答案中,
    maxList/3
    的基本情况是您的
    X
    被实例化,ie在末尾。因为当您尝试将其与
    H
    进行比较时,
    X
    没有值。这整句话在序言中毫无意义。到目前为止,最大值还需要一些其他参数。不要试图在每一步计算长度。当列表为空时,搜索结束。@TomasBy如果我在函数中初始化X,我将在下一次递归中丢失它的值。@coredump好。@Kais:在下面的答案中,
    maxList/3
    的基本情况是在
    X
    被实例化的地方,即在末尾。尝试该方法后,我得到一个错误,以帮助OP的学习过程,在没有累加器的情况下展示正确的计算方法会很好。而且,也许还有另一种选择,使用否定和member/2代替递归…@Kais您不能在Prolog中将一个谓词作为算术函数调用。因此,您链接到的代码在此行无效:
    Max1是maxP(H,Max0)
    is/2
    需要表达式中的已知Prolog算术函数。为什么不使用现有的Prolog
    max/2
    算术函数,正如这个答案所示?或者,你可以让你的
    maxP
    版本有3个参数,正如这个答案所示,
    myMax
    @lowerer我习惯于做一个硬件,要求我实现
    max(L,X)
    @Kais如果你必须实现你自己的
    max
    ,那么你需要使用这个答案所显示的3个参数的方法。你根本无法在SWI Prolog中重新定义你自己的算术函数。在尝试了这个方法之后,我得到了一个错误来帮助OP的学习过程,如果能在没有累加器的情况下展示正确的计算方法,那就太好了。而且,也许还有另一种选择,使用否定和member/2代替递归…@Kais您不能在Prolog中将一个谓词作为算术函数调用。因此,您链接到的代码在此行无效:
    Max1是maxP(H,Max0)
    is/2
    需要表达式中的已知Prolog算术函数。为什么不使用现有的Prolog
    max/2
    算术函数,正如这个答案所示?或者,你可以让你的
    maxP
    版本有3个参数,正如这个答案所示,
    myMax
    @lower我习惯于做一个硬件,要求我实现
    max(L,