123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127(* This file is free software, part of Logtk. See file "license" for more details. *)(** {1 Generic term indexing} *)typeterm=Term.ttypesubst=Subst.tmoduleT=Term(** {2 Leaf} *)(** A leaf maps terms to a set of elements *)moduletypeLEAF=Index_intf.LEAFmoduleMakeLeaf(X:Set.OrderedType):LEAFwithtypeelt=X.t=structmoduleS=Set.Make(X)typet=S.tT.Map.ttypeelt=X.tletempty=T.Map.emptyletfind_leaft=tryT.Map.findtleafwithNot_found->S.emptyletaddleaftdata=letset=find_leaftinletset=S.adddatasetinT.Map.addtsetleafletremove_ifleaftset_filter=tryletset=T.Map.findtleafinletset=set_filtersetinifS.is_emptysetthenT.Map.removetleafelseT.Map.addtsetleafwithNot_found->leafletremoveleaftdata=remove_ifleaft(funset->S.removedataset)letupdate_leafleaftdata_filter=remove_ifleaft(funset->S.filterdata_filterset)letis_empty=T.Map.is_emptyletiterleaff=T.Map.iter(funtset->S.iter(funelt->ftelt)set)leafletfoldleafaccf=T.Map.fold(funtsetacc->S.fold(funeltacc->facctelt)setacc)leafaccletsizeleaf=T.Map.fold(fun_setacc->S.cardinalset+acc)leaf0letfold_unify(leaf,sc_l)tk=T.Map.iter(funt'set->tryletsubst=Unif.FO.unify_full(t',sc_l)tinS.iter(fundata->k(t',data,subst))setwithUnif.Fail->())leafletfold_unify_complete~unif_alg(leaf,sc_l)tk=T.Map.iter(funt'set->letsubsts=unif_alg(t',sc_l)tinS.iter(fundata->k(t',data,substs))set)leafletfold_match?(subst=Subst.empty)(leaf,sc_l)tk=T.Map.iter(funt'set->tryletsubst=Unif.FO.matching~subst~pattern:(t',sc_l)tinS.iter(fundata->k(t',data,subst))setwithUnif.Fail->())leafletfold_matched?(subst=Subst.empty)(leaf,sc_l)tk=T.Map.iter(funt'set->tryletsubst=Unif.FO.matching~subst~pattern:t(t',sc_l)inS.iter(fundata->k(t',data,subst))setwithUnif.Fail->())leafend(** {2 Term index} *)moduletypeTERM_IDX=Index_intf.TERM_IDX(** {2 Subsumption Index} *)moduletypeCLAUSE=Index_intf.CLAUSE(** A subsumption index (non perfect!) *)moduletypeSUBSUMPTION_IDX=Index_intf.SUBSUMPTION_IDX(** {2 Specialized rewriting index} *)moduletypeEQUATION=Index_intf.EQUATIONmoduletypeUNIT_IDX=Index_intf.UNIT_IDXmoduleBasicEquation=structtypet=T.t*T.ttyperhs=T.tletcompare(l1,r1)(l2,r2)=letc=T.comparel1l2inifc<>0thencelseT.comparer1r2letextract(l,r)=l,r,trueletpriority_=1end