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 获取列表的最小值_List_Prolog_Syntax Error_Minimum_Iso Prolog_Clpfd_Clpq - Fatal编程技术网

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.