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),但总体上存在一个很大的误解:断言/撤回不是实现此功能所必需的,应该避免。计数匹配可以(例如)使用库(聚合)来完成:

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

你不应该这里使用任何assert/retract电话。

然后,琐碎地,

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