1

あるリストから別のリストへの一致数をカウントするこの述語を作成しようとしていますが、実行するたびに、X および Y の値が正しくインスタンス化されていないというエラーが発生し続けます。これを修正する方法を知っている人はいますか?

:- dynamic listCount/1.
listCount(0).

intersection([],_,_).
intersection([H|T], CheckingList, _):-
    member(H,CheckingList),                      %checks if it's within the list
    deleteFromList(CheckingList, H, NewList),    %deletes all occurrences form the list
    listCount(X),                                %retrieves the persistent value
    retractall(listcount(_)),
    Y is X + 1,                                  &increments the value
    assert(listcount(Y)),
    intersection(T, NewList,Y).                  %recurses  on the remaining list
4

2 に答える 2

1

いくつかのタイプミス (listcount と listCount など) がありますが、全体的に大きな誤解があります。この機能を実装するために assert/retract は必要ないため、避ける必要があります。一致のカウントは、(たとえば) library(aggregate) を使用して実行できます。

counts_matches(L1,L2,N) :-
  aggregate_all(count, (member(X,L1),memberchk(X,L2)), N).
于 2013-04-28T16:39:31.110 に答える
0

SWI Prolog には、ライブラリの一部としてintersection述語があります。

これを自分で書かなければならない場合は、

my_intersection(A,B,C):-
  findall( X, (member(X,A), memberchk(X,B)), C).

ここでは/呼び出しを使用しないでください。assertretract

それから、ささいなことに、

intersection_count(A,B,N):-
  my_intersection(A,B,C),
  length(C,N).
于 2013-04-28T16:38:19.113 に答える