変数試合用語、およびanonimus変数は例外ではありません。リストは、頭と尾の間のバイナリリレーションの構文砂糖です。したがって、変数はリスト、頭、または尾に一致することができますが、不特定の順序には一致しません。
私はあなたを助けることを願っていますいくつかの注意事項:
listcount(L、N): - listcountA(LS、[]、N)。プロローグで
、述語はそうファンクタとアリティ呼ばれ、名前と num.of.argumentsによって識別されます。したがって、通常、追加された引数を持つ 'service'述部は同じ名前を保持します。
listcountA([X |テール]、N [X、B]、?]): - Bは、B + 1であるlistcountA(尾、N [X、B]?] )。
Bは成功しません。は新しい変数を使用する必要があります。そしてあなたがしているように、ワイルドカードを使ってリスト内で一致させる方法はありません。代わりに、カウンターを見つけて更新する述部を記述します。
最後の注記:通常の対の要素は、バイナリリレーション、便利には(任意の)演算子を使用して表示されます。たとえば、ほとんどがダッシュです。
だから私は、更新/ 3は再帰「を内部に移動する」、いくつかのライブラリの述語を使用して簡略化することができ
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
を記述します。選択/ 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).
+1:これは基本的に、アキュムレータを使用してこれを解決する方法です。 – sharky