List 获取列表的最小值
我试图找到列表的最小值(作为一种学习体验,因此没有List 获取列表的最小值,list,prolog,syntax-error,minimum,iso-prolog,clpfd,clpq,List,Prolog,Syntax Error,Minimum,Iso Prolog,Clpfd,Clpq,我试图找到列表的最小值(作为一种学习体验,因此没有min) 我的做法如下: minimo([X], X). minimo([X,Y|Tail], N):- (X > Y, minimo([Y,Tail], Y)); (X <= Y, minimo([X,Tail], X)). minimo([X],X)。 最小值([X,Y |尾],N):- (X>Y,极小值([Y,尾部],Y)); (X语法错误是,因为Prolog is=中的less或equal是语法错误,因为Pr
min
)
我的做法如下:
minimo([X], X).
minimo([X,Y|Tail], N):-
(X > Y, minimo([Y,Tail], Y));
(X <= Y, minimo([X,Tail], X)).
minimo([X],X)。
最小值([X,Y |尾],N):-
(X>Y,极小值([Y,尾部],Y));
(X语法错误是,因为Prolog is=中的less或equal是语法错误,因为Prolog is=中的less或equal是程序中有几个错误:
正如Joe Lehmann所指出的,没有'
+;
):
您的程序中有几个错误:
正如Joe Lehmann所指出的,没有'
+代码>):
min([H | T],min):-min(T,H,min)。
最小值([],最小值,最小值)。
最小值([H | T],最小值,最小值1):-
(H最小值(T,H,Min1)
;min(T,min,Min1))。
min([H | T],min):-min(T,H,min)。
最小值([],最小值,最小值)。
最小值([H | T],最小值,最小值1):-
(H最小值(T,H,Min1)
;min(T,min,Min1))。
除了已经发布的其他版本,还考虑一个没有IF的版本,并且使用关系的更描述性名称(它将列表与它的最小值联系起来):
这种模式称为折叠(从左起),我们可以使用`foldl/4:
list_min([L|Ls], Min) :- foldl(min_, Ls, L, Min).
min_(A, B, Min) :- Min is min(A, B).
查询示例:
?- list_min([1,0,2], Min).
Min = 0.
但请注意,这不是一个真正的关系,由于使用了低级算术,因此不能在所有方向上使用。例如,如果我们尝试在另一个方向使用它,我们会得到:
?- list_min([X,Y], 3).
ERROR: is/2: Arguments are not sufficiently instantiated
这在各个方向都起作用:
?- list_min([X,Y], 3).
X in 3..sup,
3#=min(Y, X),
Y in 3..sup.
除了已经发布的其他版本之外,还考虑一个没有IF的版本,并且使用关系的更描述性名称(它将列表与它的最小值联系起来):
这种模式称为折叠(从左起),我们可以使用`foldl/4:
list_min([L|Ls], Min) :- foldl(min_, Ls, L, Min).
min_(A, B, Min) :- Min is min(A, B).
查询示例:
?- list_min([1,0,2], Min).
Min = 0.
但请注意,这不是一个真正的关系,由于使用了低级算术,因此不能在所有方向上使用。例如,如果我们尝试在另一个方向使用它,我们会得到:
?- list_min([X,Y], 3).
ERROR: is/2: Arguments are not sufficiently instantiated
这在各个方向都起作用:
?- list_min([X,Y], 3).
X in 3..sup,
3#=min(Y, X),
Y in 3..sup.
=
/2:算术:`[]/0'不是函数异常:(8)极小值([[3],]],[3])?
谢谢+1=
/2:算术:`[]/0'不是函数异常:(8)极小值([[3],]],[3])?
谢谢+1.