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 の 2 番目の句は、項目が初めて見られるかどうかをチェックする反復句です。表示されたアイテムのリストは、この述語の 2 番目の引数に保持されます。3 番目の引数は、残りのアイテム (初めて表示されないアイテム) を収集します。

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 に答える