0

Prolog でこのテーマに問題があります。問題は、リストに表示される繰り返し要素の数をカウントしたいということです。また、別のリストに、重複した要素が出現するたびに 1 を入力し、重複していない場合は 0 を入力したいと考えています。

[420,325,420,582,135,430,582] のようなリストがあり、結果は [1,0,1,1,0,0,1] になります。

いくつかのコード スニペットを試してみましたが、気が狂いそうです。

私が試した最後のコードは次のとおりです。

count_duplicates([],[]).
count_duplicates([Head|Tail],[1|LS]):-
    member(Head,Tail),
    count_duplicates([Tail|Head],LS).

count_duplicates([Head|Tail],[0|LS]):-
    \+ member(Head,Tail),
    count_duplicates([Tail|Head],LS).

この述語はリストを受け取り、結果リストを生成する必要があります

前もって感謝します

4

2 に答える 2

1

これを試すことができます:

count_duplicate(In, Out) :-
    maplist(test(In), In, Out).


test(Src, Elem, 1) :-
    select(Elem, Src, Result),
    member(Elem, Result).

test(_Src, _Elem, 0).

編集maplist がなくても、できる

count_duplicate(In, Out) :-
    test(In, In, Out).

test(_, [], []).

test(In, [Elem | T], [R0 | R]) :-
    select(Elem, In, Rest),
    (   member(Elem, Rest) -> R0 = 1; R0 = 0),
    test(In, T, R).
于 2012-12-29T11:41:18.813 に答える
0

利用可能なリスト処理ビルトインのいくつかを使用して書き直します。

count_duplicates(L, R) :-
    maplist(check(L), L, R).

check(L, E, C) :-
    aggregate(count, member(E, L), Occurs),
    ( Occurs > 1 -> C = 1 ; C = 0 ).

それと

?- count_duplicates([420,325,420,582,135,430,582],L).
L = [1, 0, 1, 1, 0, 0, 1].

あなたのコードについては、終了するのは簡単だと思います:

count_duplicates([],[]).
count_duplicates([Head|Tail],[1|LS]):-
    member(Head,Tail),
    count_duplicates(Tail,LS).
count_duplicates([Head|Tail],[0|LS]):-
    \+ member(Head,Tail),
    count_duplicates(Tail,LS).

再帰呼び出しを修正したことに注意してください。これは、if .. then .. else .. 構造を使用して、(ソースとランタイムの両方で) もう少し効率的な方法で実行できると考えています。

count_duplicates([],[]).
count_duplicates([Head|Tail],[R|LS]):-
    ( member(Head,Tail) -> R = 1 ; R = 0 ),
    count_duplicates(Tail,LS).

よりきれいですね。member/2 一度だけ呼び出されるので、これは大きなメリットです。member/2 の代わりにmemberchk /2 を使用することを検討してください。

しかし、そのコードは、最後のオカレンスの倍数としてタグ付けできません。

于 2012-12-29T12:48:50.917 に答える