List 在列表中查找max元素及其索引-Prolog
我对序言一无所知。我试着写一个谓词,找到整数列表的最大值及其索引。i、 eList 在列表中查找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
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).