-1

私はこのようにPrologで演習をしようとしています:私はこのリスト[10,20, 10, 20, 30]を導入し、プログラムは示しています:

10 - 2 time; 20 - 2 times; 30 - 1 times.

これが私のコードです:

conta(_,[], 0).
conta(X, [X|T], N) :-   conta(X,T, N2), N is N2 + 1 . 
conta(X, [Y|T], N) :-  X \= Y,   conta(X,T,N).  

aux([],[]).
aux([X|L],L1):-conta(X,L1,C),write(X),write(C), write('vezes'),aux(L,L1).

しかし、結果は次のとおりです。

10 - 2times  20 -2time 10-2times 20-2times 30-1 time
false.

彼は、要素がリストにある回数を要素に示します。助けてください!!

4

1 に答える 1

1

問題文では、副作用との純粋な関係が散在しています。この方法で問題を解決することはできますが、Prolog の興味深い特性はごくわずかです。代わりに、問題を純粋な関係として定式化してみてください。想像してみてください、すでに実装されており、それに対していくつかのクエリを作成しています。

?- list_vezes([10,20, 10, 20, 30], [10-2,20-2,30-1]).
true.

次のソリューションでは、対応する要素をカウントして削除します。n 2のランタイムがあります。

list_vezes([], []).
list_vezes([E|Es1], [E-N|Vezes]) :-
   n_occ(E, Es1,Es2, 1,N),
   list_vezes(Es2, Vezes).

n_occ(_, [],[], N,N).
n_occ(E, [E|Es0],Es, N0,N) :-
   N1 is N0+1,
   n_occ(E, Es0,Es, N1,N).
n_occ(E, [F|Es0],[F|Es], N0,N) :-
   dif(F,E),
   n_occ(E, Es0,Es, N0,N).

多くの Prolog システムでは、 が組み込まれています。持っていない場合のリンクを参照してください。

今、あなたが言ったテキストをまだ印刷したい場合は、この新しいリストでこれを行うことができます:

printitem(E-N) :-
   writeq(E-N), write(' times\n').


compter_et_imprimer(L) :-
   list_vezes(L, Vezes),
   maplist(printitem, Vezes).
于 2014-06-13T14:51:54.323 に答える