列出交集谓词问题

时间:2013-04-28 16:28:21

标签: list prolog

我正在尝试创建这个谓词来计算从一个列表到另一个列表的匹配数,但每当我运行它时,我一直得到关于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

2 个答案:

答案 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).