Prolog查找具有两个值的列表的最大值



所以我使用prolog,我有一个类似的函数:

ratingList(X):-goalKeeperRating(X,A),centreForwardRating(X,B),secondStrikerRating(X,C),centreDefenseRating(X,D),fullBackRating(X,E),centerMidfieldRating(X,F),attackingMidfieldRating(X,G),defendingMidfieldRating(X,H),
Y=[[goalKeeper,A],[centerForward,B],[secondStriker,C],[centerDefense,D],[fullBack,E],[centerMidfield,F],[attackingMidfieldRating,G],[defendingMidfieldRating,H]],
maxlist(Y,N),N=[L,M],write('Best Position ' + L + ' with rating ' +M).

基本上,第一行找到数字并将其放在第二个元素中,然后我们将数字放在列表(Y(中。Y中的所有内容都是一个长度为2的列表,其中包含一个足球位置名称和我们得到的数字。MaxList只找到最大数字。看起来像这个

maxlist([A],A).
maxlist([A,B|C],D):- A=[_,X],E=[_,Y],D=[_,Z],maxlist([B|C],E),max(X,Y,Z),.
max(A,B,A):-A>=B.
max(A,B,B):-A<B.

然而,每当我尝试打印单词时,总是会打印地址。有什么我可以解决的吗?

您在构造D时没有给它的第一个元素任何值。max函数必须处理整个元素,而不仅仅是列表的第二个元素。在你自己的风格

maxlist([A], A).
maxlist([A, B | As], M) :-
maxlist([B | As], M1), max(A, M1, M).
max(A, B, A) :- A = [_, X], B = [_, Y], X >= Y.
max(A, B, B) :- A = [_, X], B = [_, Y], X < Y.

找到列表最大值的迭代方法

maxlist([X | Xs], Max) :- maxlist(Xs, X, Max).
maxlist([], A, A).
maxlist([B | Bs], A, C) :-
A = [_, X], B = [_, Y],
(X > Y -> T = A ; T = B),
maxlist(Bs, T, C).

最新更新