我怎样才能在列表中找到对,Prolog?

时间:2012-12-13 20:54:50

标签: list prolog logic

我有问题, 我有一个包含数字元素的列表,例如在示例中。 我想找到所有对,并计算它。 (每个元素只能是一对中的一部分)

?- num_pairs([4,1,1,1,4],N).
N=1;

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

你需要几件事才能使它发挥作用:

  • 能够计算项目在列表中重复的数量
  • 能够从列表中删除与值匹配的所有元素
  • 有条件地增加数字的能力

以下是您的计算方法:

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谓词进行删除;这是一个内置的谓词。

有条件地添加一个规则需要两个规则 - 一个在计数等于一时,另一个用于当计数不等于一时。

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

空列表没有对;当一个项目被计为一对项目的一部分时,其副本将从列表的其余部分中删除。

Here is this running program on ideone.