我正在尝试创建这个谓词来计算从一个列表到另一个列表的匹配数,但每当我运行它时,我一直得到关于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
答案 0 :(得分:1)
有几个拼写错误(例如listcount vs listCount),但总体上存在一个很大的误解:断言/撤销是不实现此功能所必需的,应该避免。可以使用库(聚合)来计算匹配(例如):
counts_matches(L1,L2,N) :-
aggregate_all(count, (member(X,L1),memberchk(X,L2)), N).
答案 1 :(得分:0)
SWI Prolog已将intersection
predicate作为其库的一部分。
如果你必须自己写,
my_intersection(A,B,C):-
findall( X, (member(X,A), memberchk(X,B)), C).
您应 在此处使用assert
/ retract
次来电。
然后,平凡,
intersection_count(A,B,N):-
my_intersection(A,B,C),
length(C,N).