我有一个问题,我有一个包含数字元素的列表,例如示例中的。我想找到所有的配对,然后数一数。(每个元素只能是一对的一部分)
?- num_pairs([4,1,1,1,4],N).
N=1;
谁能帮我解决这个问题??
您需要几件事才能使其工作:
以下是您可以计算的方法:
count([], _, 0).
count([H|T], H, R) :- count(T, H, RT), R is RT + 1.
count([H|T], X, R) :- H \= X, count(T, X, R).
可以使用 SWI 的delete/3
谓词进行删除;这是一个内置谓词。
有条件地添加一个需要两个规则 - 一个是当计数等于 1 时,另一个是当计数不等于 1 时。
add_if_count_is_one(H, T, RT, R) :- count(T, H, 1), R is RT + 1.
add_if_count_is_one(H, T, R, R) :- count(T, H, X), X \= 1.
最后,计数对可能如下所示:
num_pairs([], 0).
num_pairs([H|T], R) :- delete(T, H, TT),
num_pairs(TT, RT),
add_if_count_is_one(H, T, RT, R).
空列表没有对;当一个项目被计为一对的一部分时,它的副本将从列表的其余部分中删除。