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 在列表中查找max元素及其索引-Prolog_List_Prolog_Clpfd_Meta Predicate - Fatal编程技术网

List 在列表中查找max元素及其索引-Prolog

List 在列表中查找max元素及其索引-Prolog,list,prolog,clpfd,meta-predicate,List,Prolog,Clpfd,Meta Predicate,我对序言一无所知。我试着写一个谓词,找到整数列表的最大值及其索引。i、 emax\u列表([2,3,4],max,INDEX)将产生max=4,INDEX=2 谢谢你的回复~我道歉!这是我第一次在stackoverflow中提问。我可以编写谓词来查找列表的最大值或最小值,但我不知道如何获得值在列表中的确切位置。我只是想理解答案 我自己不是Prolog专家,所以这可能不是最漂亮的解决方案,但这个谓词应该满足您的需要: max_list([X|Xs],Max,Index):- max_lis

我对序言一无所知。我试着写一个谓词,找到整数列表的最大值及其索引。i、 e
max\u列表([2,3,4],max,INDEX)
将产生
max=4
INDEX=2


谢谢你的回复~我道歉!这是我第一次在stackoverflow中提问。我可以编写谓词来查找列表的最大值或最小值,但我不知道如何获得值在列表中的确切位置。我只是想理解答案

我自己不是Prolog专家,所以这可能不是最漂亮的解决方案,但这个谓词应该满足您的需要:

max_list([X|Xs],Max,Index):-
    max_list(Xs,X,0,0,Max,Index).

max_list([],OldMax,OldIndex,_, OldMax, OldIndex).
max_list([X|Xs],OldMax,_,CurrentIndex, Max, Index):-
    X > OldMax,
    NewCurrentIndex is CurrentIndex + 1,
    NewIndex is NewCurrentIndex,
    max_list(Xs, X, NewIndex, NewCurrentIndex, Max, Index).
max_list([X|Xs],OldMax,OldIndex,CurrentIndex, Max, Index):-
    X =< OldMax,
    NewCurrentIndex is CurrentIndex + 1,
    max_list(Xs, OldMax, OldIndex, NewCurrentIndex, Max, Index).
max|u列表([X|Xs],max,Index):-
max_列表(Xs,X,0,0,max,Index)。
最大值列表([]、OldMax、oldinex、\ux、OldMax、oldinex)。
max|u列表([X|Xs],OldMax,|,CurrentIndex,max,Index):-
X>OldMax,
NewCurrentIndex是CurrentIndex+1,
NewIndex是NewCurrentIndex,
max_列表(Xs,X,NewIndex,NewCurrentIndex,max,Index)。
max|u列表([X|Xs],OldMax,oldinex,CurrentIndex,max,Index):-
X=
另一种不是很有效但更“前卫”的方法是: 列表的最大值是多少?它是列表中的一个成员,此列表中没有其他成员大于最大值! 因此:

使用

…和
nth0/3
我们定义:

zs_maximum_at(Zs,Max,Pos) :-
   maplist(#>=(Max),Zs),
   nth0(Pos,Zs,Max).
以下是OP提出的问题:

?- zs_maximum_at([2,3,4],M,I).
I = 2, M = 4.
好的。。。最一般的查询是什么


编辑:算术表达式呢

  • 我们可以通过添加额外的目标
    (#=)/2
    ,来允许使用算术表达式:

    zs_maximum_at(Zs,Expr,Pos) :- maplist(#>=(Max),Zs), nth0(Pos,Zs,Expr), Expr #= Max. 再次运行上述查询,我们现在得到:

    ?- zs_maximum_at([0+1,1+1,2-0,3-1,1+0],M,I). ERROR: Type error: `integer' expected, found `0+1' (a compound) ([0+1,1+1,2-0,3-1,1+0],M,I)处的-zs_最大值。 错误:类型错误:应为'integer',找到'0+1'(复合)

  • 请注意,(是否允许算术表达式)的问题不仅限于。
    当使用普通的旧Prolog算术谓词(如
    is/2
    和friends)时,它也会出现。

    joel76答案的变体:

    max_list(L, M, I) :- nth0(I, L, M), \+ (member(E, L), E > M).
    

    您需要展示一次尝试,并解释您遇到的问题您希望
    ?-max\u list([1,2,1],max,Index)有哪些解决方案。
    ?s(X):好!可以使用
    maplist(>=(Max),而不是
    \+((成员(N,Lst),N>Max))
    。(这不是100%等价的,但允许使用普通的旧式Prolog整数算法代替…)s(X):好的,现在更好了!谢谢~这个解决方案很容易理解!非常优雅和通用的解决方案!非常感谢。你的回答和解释很清楚! zs_maximum_at(Zs,Expr,Pos) :- maplist(#>=(Max),Zs), nth0(Pos,Zs,Expr), Expr #= Max. ?- zs_maximum_at([0+1,1+1,2-0,3-1,1+0],M,I). I = 1, M = 1+1 ; I = 2, M = 2-0 ; I = 3, M = 3-1 ; false. zs_maximum_at(Zs,Max,Pos) :- length(Zs,_), Zs ins inf..sup, maplist(#>=(Max),Zs), nth0(Pos,Zs,Max). ?- zs_maximum_at([0+1,1+1,2-0,3-1,1+0],M,I). ERROR: Type error: `integer' expected, found `0+1' (a compound)
    max_list(L, M, I) :- nth0(I, L, M), \+ (member(E, L), E > M).