3

collCount/2リスト内の同一のアイテムをそれぞれの出現回数でタプルにグループ化する再帰ルールを作成しようとしています。

たとえば、 とcollCount([a,b,a,b,c,b],F)バインドF[(a,2),(b,3),(c,1)]ます。このクエリを実行すると、Prolog は単純に を返しますno

以下は、私がこれまでになんとかしたことです:

collCount([H|T],[(H,N)|L2]) :-
    countDel(H,[H|T],L,N),
    collCount(L,L2).

countDel(X,T,Rest,N) :-
    occur(X,T,N),
    delAll(X,T,Rest).

occur(_,[],0).
occur(X,[X|T],N) :-
    occur(X,T,NN),
    N is NN + 1.
occur(X,[H|T],N) :-
    occur(X,T,N),
    X \= H.

delAll(_,[],[]).
delAll(X,[X|T],Ans) :-
    delAll(X,T,Ans).
delAll(X,[H|T],[H|Rest]) :-
    delAll(X,T,Rest),
    X \= H.

述語countDel/4は、リスト内の特定の項目のすべての出現をカウントして削除します。たとえば、countDel(2,[1,2,3,2,2],L,N)は L を[1,3]およびNとバインドし3ます。

述語occur/3は、リスト内の特定の項目のすべての出現をカウントします。たとえば、 とoccur(3,[1,2,3,4,3],Num)バインドNum2ます。

述語delAll/3は、リスト内の特定の項目のすべての出現を削除します。たとえば、 とdelAll(3,[1,2,3,4,3],L)バインドL[1,2,4]ます。

どんな助けでも大歓迎です。

4

4 に答える 4

0

あなたのコードはほとんど正しいです。修正したところにコメントを入れました。

collCount([],[]).  % miss base case
collCount([H|T],[(H,N)|L2]) :-
    countDel(H,[H|T],L,N),
    collCount(L,L2).

countDel(X,T,Rest,N) :-
    occur(X,T,N),
    delAll(X,T,Rest).

occur(_,[],0).
occur(X,[X|T],N) :-
    occur(X,T,NN),
    N is NN + 1.
occur(X,[H|T],N) :-
    occur(X,T,N),
    X \= H.

delAll(_,[],[]).
delAll(X,[X|T],Ans) :-
    delAll(X,T,Ans).
delAll(X,[H|T],[H|Rest]) :-
    X \= H,  % moved before recursive call
    delAll(X,T,Rest).

これは

?- collCount([a,b,a,b,c,b],F).
F = [ (a, 2), (b, 3), (c, 1)] ;
false.
于 2014-06-27T20:21:23.517 に答える