有没有办法检查是否有一些可能的输出列表重复?

时间:2014-04-08 11:11:38

标签: list prolog

对于某些代码,我有大量可能的L输出列表,但有没有办法检查这些列表是否有重复?

3 个答案:

答案 0 :(得分:2)

我建议使用Prolog'数据库,对列表进行散列以提高效率:

:- dynamic generated_lists/2.

...
build_a_list(L),
term_hash(L, HashKey),
(  generated_lists(HashKey, Previous)
-> (  L == Previous
   -> writeln(duplicate(L)) % do something sensible
   ;  true % maybe duplicate hashing: assertz(generated_lists(HashKey, L))
   )
;  assertz(generated_lists(HashKey, L)) % unique so far
),
...

应尽快“推”检查,以修剪评估时间......

作为替代方案,效率更高,您可以使用red black tree,但可行性取决于您是否可以沿着计算路径“携带”。

答案 1 :(得分:1)

目前尚不清楚大量可能的输出列表是什么意思,所以我不得不猜测。

如果您想确保特定目标(生成列表或其他任何条款)确实有重复的解决方案:

实际上,这将成功解决所有冗余解决方案:

call_dups(Goal) :-
    bagof(t,Goal,[_,_|_]).

p([]).
p([a]).
p([b, c]).
p([a]).
p([c]).
p([]).


?- call_dups(p(L)).
L = [] ;
L = [a] ;
false.

答案 2 :(得分:0)

有趣的是我要求的内容已经在prolog中预定义...我应该使用bagof和setof并获得两个输出列表的长度,如果类似,那么没有重复