List Prolog参数没有充分实例化。列表/递归
我试图从给定列表“L”中获取最大值并将其分配给变量,因此我编写了以下函数: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)后,我得到以下错
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算术函数。为什么不使用现有的Prologmax/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算术函数。为什么不使用现有的Prologmax/2
算术函数,正如这个答案所示?或者,你可以让你的maxP
版本有3个参数,正如这个答案所示,myMax
@lower我习惯于做一个硬件,要求我实现max(L,