X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_paramodulation%2Fterms.ml;h=169d19b80b68a52d0eb062162464e451a96a5757;hb=772def9075b7b62870ebf4cecec6bcd37a549b1d;hp=38e1723c20c3368bacc3861565335620733fa6b5;hpb=b97a7976503b2d2e5cbc9199f848135a324775a8;p=helm.git diff --git a/helm/software/components/ng_paramodulation/terms.ml b/helm/software/components/ng_paramodulation/terms.ml index 38e1723c2..169d19b80 100644 --- a/helm/software/components/ng_paramodulation/terms.ml +++ b/helm/software/components/ng_paramodulation/terms.ml @@ -20,12 +20,12 @@ type 'a substitution = (int * 'a foterm) list type comparison = Lt | Eq | Gt | Incomparable -type rule = SuperpositionRight | SuperpositionLeft | Demodulation +type rule = Superposition | Demodulation type direction = Left2Right | Right2Left | Nodir type position = int list type 'a proof = - | Exact of 'a + | Exact of 'a foterm | Step of rule * int * int * direction * position * 'a substitution (* rule, eq1, eq2, direction of eq2, position, substitution *) @@ -56,72 +56,36 @@ module OT = module M : Map.S with type key = int = Map.Make(OT) -type 'a bag = 'a unit_clause M.t +type 'a bag = int + * (('a unit_clause * bool * int) M.t) + + let add_to_bag (_,lit,vl,proof) (id,bag) = + let id = id+1 in + let clause = (id, lit, vl, proof) in + let bag = M.add id (clause,false,0) bag in + (id,bag), clause + ;; + + let replace_in_bag ((id,_,_,_),_,_ as cl) (max_id,bag) = + let bag = M.add id cl bag in + (max_id,bag) + ;; + + let get_from_bag id (_,bag) = + M.find id bag + ;; + + let empty_bag = (0,M.empty);; module type Blob = sig type t val eq : t -> t -> bool val compare : t -> t -> int + val eqP : t val pp : t -> string - val embed : t -> t foterm * int list + type input + val embed : input -> t foterm + val saturate : input -> input -> t foterm * t foterm end -module Utils (B : Blob) = struct - let rec eq_foterm x y = - x == y || - match x, y with - | Leaf t1, Leaf t2 -> B.eq t1 t2 - | Var i, Var j -> i = j - | Node l1, Node l2 -> List.for_all2 eq_foterm l1 l2 - | _ -> false - ;; - - let rec lexicograph f l1 l2 = - match l1, l2 with - | [], [] -> 0 - | x::xs, y::ys -> - let c = f x y in - if c <> 0 then c else lexicograph f xs ys - | [],_ -> ~-1 - | _,[] -> 1 - ;; - - let rec compare_foterm x y = - match x, y with - | Leaf t1, Leaf t2 -> B.compare t1 t2 - | Var i, Var j -> i - j - | Node l1, Node l2 -> lexicograph compare_foterm l1 l2 - | Leaf _, ( Node _ | Var _ ) -> ~-1 - | Node _, Leaf _ -> 1 - | Node _, Var _ -> ~-1 - | Var _, _ -> 1 - ;; - - let eq_literal l1 l2 = - match l1, l2 with - | Predicate p1, Predicate p2 -> eq_foterm p1 p2 - | Equation (l1,r1,ty1,o1), Equation (l2,r2,ty2,o2) -> - o1 = o2 && eq_foterm l1 l2 && eq_foterm r1 r2 && eq_foterm ty1 ty2 - | _ -> false - ;; - - let compare_literal l1 l2 = - match l1, l2 with - | Predicate p1, Predicate p2 -> compare_foterm p1 p2 - | Equation (l1,r1,ty1,o1), Equation (l2,r2,ty2,o2) -> - let c = Pervasives.compare o1 o2 in - if c <> 0 then c else - let c = compare_foterm l1 l2 in - if c <> 0 then c else - let c = compare_foterm r1 r2 in - if c <> 0 then c else - compare_foterm ty1 ty2 - | Predicate _, Equation _ -> ~-1 - | Equation _, Predicate _ -> 1 - ;; - - let eq_unit_clause (id1,_,_,_) (id2,_,_,_) = id1 = id2 - let compare_unit_clause (id1,_,_,_) (id2,_,_,_) = Pervasives.compare id1 id2 - -end