123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197(* This file is free software, part of Zipperposition. See file "license" for more details. *)(** {1 The state of a proof, contains a set of active clauses (processed),
a set of passive clauses (to be processed), and an ordering
that is used for redundancy elimination.} *)openLogtkmoduleT=TermmoduleC=ClausemoduleS=Subst.FOmoduleLit=LiteralmoduleLits=LiteralsmodulePos=PositionmodulePB=Position.BuildmoduleCQ=ClauseQueueletprof_next_passive=ZProf.make"proofState.next_passive"(** {2 Set of active clauses} *)moduletypeS=ProofState_intf.SmoduleMake(C:Clause.S):SwithmoduleC=CandmoduleCtx=C.Ctx=structmoduleCtx=C.CtxmoduleC=CmoduleCQueue=ClauseQueue.Make(C)(* module TermIndex = NPDtree.MakeTerm(C.WithPos) *)moduleTermIndex=Fingerprint.Make(C.WithPos)moduleUnitIndex=(* NPDtree *)Dtree.Make(structtypet=T.t*T.t*bool*C.ttyperhs=T.tletcompare(t11,t12,s1,c1)(t21,t22,s2,c2)=letopenCCOrd.InfixinT.comparet11t21<?>(T.compare,t12,t22)<?>(compare,s1,s2)<?>(C.compare,c1,c2)letextract(t1,t2,sign,_)=t1,t2,signletpriority(_,_,_,c)=ifC.is_oriented_rulecthen2else1end)moduleSubsumptionIndex=FV_tree.Make(structtypet=C.tletcompare=C.compareletto_litsc=C.to_formsc|>Iter.of_listletlabelsc=C.trailc|>Trail.labelsend)(* XXX: no customization of indexing for now
let _indexes =
let table = Hashtbl.create 2 in
let mk_fingerprint fp =
Fingerprint.mk_index ~cmp:Clauses.compare_clause_pos fp in
Hashtbl.add table "fp" (mk_fingerprint Fingerprint.fp6m);
Hashtbl.add table "fp7m" (mk_fingerprint Fingerprint.fp7m);
Hashtbl.add table "fp16" (mk_fingerprint Fingerprint.fp16);
table
*)(** {5 Common Interface for Sets} *)moduletypeCLAUSE_SET=sigvalon_add_clause:C.tSignal.t(** signal triggered when a clause is added to the set *)valon_remove_clause:C.tSignal.t(** signal triggered when a clause is removed from the set *)valadd:C.tIter.t->unit(** Add clauses to the set *)valremove:C.tIter.t->unit(** Remove clauses from the set *)endmoduleMakeClauseSet(X:sigend)=structletclauses_=refC.ClauseSet.emptyleton_add_clause=Signal.create()leton_remove_clause=Signal.create()letclauses()=!clauses_letnum_clauses()=C.ClauseSet.cardinal!clauses_letaddseq=seq(func->ifnot(C.ClauseSet.memc!clauses_)then(clauses_:=C.ClauseSet.addc!clauses_;Signal.sendon_add_clausec));()letremoveseq=seq(func->ifC.ClauseSet.memc!clauses_then(clauses_:=C.ClauseSet.removec!clauses_;Signal.sendon_remove_clausec));()end(** {2 Sets} *)moduleActiveSet=MakeClauseSet(structend)moduleSimplSet=structleton_add_clause=Signal.create()leton_remove_clause=Signal.create()letaddseq=seq(func->Signal.sendon_add_clausec)letremoveseq=seq(func->Signal.sendon_remove_clausec)endmodulePassiveSet=structincludeMakeClauseSet(structend)letqueue=letp=ClauseQueue.get_profile()inCQueue.of_profilepletnext_()=ifCQueue.is_emptyqueuethenNoneelse(tryletx=CQueue.take_firstqueueinSignal.sendon_remove_clausex;clauses_:=C.ClauseSet.removex!clauses_;SomexwithNot_found->None)letnext()=ZProf.with_profprof_next_passivenext_()letremoveseq=seq(func->ifCQueue.removequeuecthen(Signal.sendon_remove_clausec))letaddseq=seq(func->ifCQueue.addqueuecthen(Signal.sendon_add_clausec))letis_passivecl=CQueue.mem_clqueueclletclauses()=C.ClauseSet.of_iter(CQueue.all_clausesqueue)letnum_clauses()=CQueue.lengthqueueendtypestats=int*int*int(* num passive, num active, num simplification *)letstats()=C.ClauseSet.cardinal(ActiveSet.clauses()),C.ClauseSet.cardinal(PassiveSet.clauses()),0letppoutstate=letnum_active,num_passive,num_simpl=statsstateinFormat.fprintfout"state {%d active clauses; %d passive clauses; \
%d simplification_rules; %a}"num_activenum_passivenum_simplCQueue.ppPassiveSet.queueletdebugoutstate=letnum_active,num_passive,num_simpl=statsstateinFormat.fprintfout"@[<v2>state {%d active clauses;@ %d passive clauses;@ \
%d simplification_rules;@ queues@[<hv>%a@] \
@,active:@[<hv>%a@]@,passive:@[<hv>%a@]@,}@]"num_activenum_passivenum_simplCQueue.ppPassiveSet.queueC.pp_set(ActiveSet.clauses())C.pp_set(PassiveSet.clauses())end