0

我正在尝试编写一个 Prolog 函数,该函数给定一个列表,返回在该列表中重复次数最多的元素,例如:

['a', 'a', 'b', 'c', 'b'] 应该返回 ['a', 'b'] ['c', 'a', 'a', 'c', ' b', 'c', 'b'] 应该返回 ['c'] 等等...

我正在尝试使用另一个函数(计算列表中存在的次数(计数列表),但我没有得到任何帮助。请帮忙?

listMax(In, Out) :-
    listMax(In, Out, 0).

listMax([H | L], [H | O], Max) :-
    countlist(H, [H | L], N),   
    N > Max,
    listMax(L, [H | O], N).

listMax([H | L], O, Max) :-
    countlist(H, [H | L], N),
    <=(Max, N),
    listMax(L, O, Max).

listMax([], [], _Max).

listMax([], _O, _Max).
4

2 回答 2

1

这个怎么样:

listmax(L, M):-
 listmax(L, [], [], M).

listmax([], Seen, MMax, Max):-
  MMax=[] -> Max=Seen ; listmax(MMax, [], [], Max).
listmax([H|T], Seen, MMax, Max):-
  (member(H, Seen) ->
    listmax(T, Seen, [H|MMax], Max) ;
    listmax(T, [H|Seen], MMax, Max)).

这里对这个算法做一点解释:

这个想法是遍历列表,删除每个项目的第一次出现,从而产生一个新列表。然后,递归地将相同的算法应用于这个新列表,直到我们得到一个空列表作为结果。至此我们知道前面的列表就是我们要找的列表。

listmax/4 的第二个子句是迭代子句,它检查这是否是第一次看到该项目。所见项目的列表保存在此谓词的第二个参数中。第三个参数收集剩余的项目(第一次没有看到的项目)。

listmax/4 的第一个子句是基本情况。当我们完成对列表的迭代时,它就会发挥作用。此时它会检查剩余项目列表是否为空,在这种情况下,我们知道 Seen 列表就是我们要查找的列表。否则,我们再次应用该算法,但使用“剩余列表”作为输入列表。

于 2011-05-20T17:51:11.407 回答
0

listmax(In,Out) :-
        setof(A,member(A,In),L1),
        findall([Count,A],(
                    member(A,L1),
                    count(A,In,Count)),
               L2),
        max_1(L2,Max),
        findall(A,member([Max,A],L2),Out).

count(A,[],0).
count(A,[A|R],X) :-
        count(A,R,Y),
        X is Y + 1.
count(A,[_|R],X) :-
        count(A,R,X).

max_1(L,Max) :-
        findall(A,member([A|_],L),L1),
        max(L1,Max).
于 2011-05-20T21:21:07.057 回答