変数はtermに一致し、anonimus 変数も例外ではありません。リストは、頭と尾の間の二項関係の単なる構文糖衣です。したがって、変数はリスト、ヘッド、またはテールに一致できますが、未指定のシーケンスには一致しません。
役立つことを願っています。
listcount(L, N) :- listcountA(LS, [], N).
Prolog では、述語は名前とnum.of.arguments (ファンクターとアリティと呼ばれる) で識別されます。したがって、通常、引数が追加された「サービス」述語は同じ名前を保持します。
listcountA([X|Tail], [? [X, B], ?], N) :- B は B+1、listcountA(Tail, [? [X,B] ?], N)。
B is B+1 は成功しません。新しい変数を使用する必要があります。そして、あなたがしているように、「ワイルドカード」を使用してリスト内で一致させる方法はありません。代わりに、カウンターを見つけて更新する述語を記述します。
最後の注意: 通常、要素のペアは、便利な (任意の) 演算子である二項関係を使用して示されます。たとえば、最もよく使用されるのはダッシュです。
だから私は書くだろう
listcount(L, Counters) :-
listcount(L, [], Counters).
listcount([X | Tail], Counted, Counters) :-
update(X, Counted, Updated),
!, listcount(Tail, Updated, Counters).
listcount([], Counters, Counters).
update(X, [X - C | R], [X - S | R]) :-
S is C + 1.
update(X, [H | T], [H | R]) :-
update(X, T, R).
update(X, [], [X - 1]). % X just inserted
update/3 は、再帰の「内側に移動」するライブラリ述語を使用して簡略化できます。たとえば、select/3 を使用すると、次のようになります。
listcount([X | Tail], Counted, Counters) :-
( select(X - C, Counted, Without)
-> S is C + 1
; S = 1, Without = Counted
),
listcount(Tail, [X - S | Without], Counters).
listcount([], Counters, Counters).