【问题标题】:Prolog finding max of list with two valuesProlog查找具有两个值的列表的最大值
【发布时间】:2020-11-21 00:09:01
【问题描述】:

所以我正在使用 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.

但是,每当我尝试打印单词时,它总是会导致打印地址。无论如何我可以解决这个问题吗?

【问题讨论】:

  • 你能给我们一个你正在使用的输入和输出示例吗?打印地址是什么意思?
  • @rajashekar 我想我找到了问题所在。在 maxlist 函数中,D 应该返回整个元素(这是一个名称和数字的列表)。但是,D 中的名称类似于 G1562。但是,我仍然不知道如何解决它

标签: prolog


【解决方案1】:

你在构造 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).

【讨论】:

  • 该死的男人,这很管用。非常感谢,特别是因为这个概念我可以应用于我的其余代码。再次感谢一堆
猜你喜欢
  • 2013-11-16
  • 2017-09-19
  • 2012-04-18
  • 1970-01-01
  • 2020-07-29
  • 2016-10-04
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
相关资源
最近更新 更多