对于某些代码,我有大量可能的L输出列表,但有没有办法检查这些列表是否有重复?
答案 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并获得两个输出列表的长度,如果类似,那么没有重复