From d0fd0449d8fc28e635fb423544b0b970db4fa197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr> Date: Wed, 29 May 2019 13:53:30 +0200 Subject: [PATCH] [qed] cleanup e_repr ; add Subst.filter --- src/plugins/qed/logic.ml | 6 +++++- src/plugins/qed/term.ml | 38 ++++++++++++++++++++++++++------------ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/plugins/qed/logic.ml b/src/plugins/qed/logic.ml index 35ea3ead82d..5a29bdd6166 100644 --- a/src/plugins/qed/logic.ml +++ b/src/plugins/qed/logic.ml @@ -293,8 +293,8 @@ sig val e_getfield : term -> Field.t -> term val e_record : record -> term val e_fun : Fun.t -> term list -> term - val e_repr : repr -> term + (** @raise Invalid_argument on [Bvar] and [Bind] *) (** {3 Quantification and Binding} *) @@ -325,6 +325,7 @@ sig val create : ?pool:pool -> unit -> t val fresh : t -> tau -> var val get : t -> term -> term + val filter : t -> term -> bool val add : t -> term -> term -> unit (** Must bind lc-closed terms, or raise Invalid_argument *) @@ -335,6 +336,9 @@ sig val add_fun : t -> (term -> term) -> unit (** Must bind lc-closed terms, or raise Invalid_argument *) + val add_filter : t -> (term -> bool) -> unit + (** Only modifies terms that {i not} pass the filter. *) + val add_var : t -> var -> unit (** To the pool *) diff --git a/src/plugins/qed/term.ml b/src/plugins/qed/term.ml index f835162ca78..f7e80b8320e 100644 --- a/src/plugins/qed/term.ml +++ b/src/plugins/qed/term.ml @@ -2070,6 +2070,7 @@ struct type sigma = { pool : pool ; + mutable filter : (term -> bool) list ; mutable shared : sfun ; } and sfun = | EMPTY @@ -2083,6 +2084,7 @@ struct let create ?pool () = { pool = POOL.create ?copy:pool () ; shared = EMPTY ; + filter = [] ; } let fresh sigma t = fresh sigma.pool t @@ -2096,6 +2098,9 @@ struct let get sigma a = compute a sigma.shared + let filter sigma a = + List.for_all (fun f -> f a) sigma.filter + let add sigma a b = sigma.shared <- match sigma.shared with | MAP(m,s) -> MAP (Tmap.add a b m,s) @@ -2108,6 +2113,9 @@ struct let add_fun sigma f = sigma.shared <- FUN(f,sigma.shared) + let add_filter sigma f = + sigma.filter <- f :: sigma.filter + let add_var sigma x = add_var sigma.pool x let add_term sigma e = add_vars sigma.pool e.vars let add_vars sigma xs = add_vars sigma.pool xs @@ -2117,11 +2125,16 @@ struct let sigma = Subst.create let rec subst sigma alpha e = - let mu = cache () in - incache mu sigma alpha e + if Subst.filter sigma e then + let mu = cache () in + let v = compute mu sigma alpha e in + set mu e v ; v + else e and incache mu sigma alpha e = - get mu (compute mu sigma alpha) e + if Subst.filter sigma e then + get mu (compute mu sigma alpha) e + else e and compute mu sigma alpha e = try Subst.get sigma e with Not_found -> @@ -2168,21 +2181,23 @@ struct subst sigma Intmap.empty e let e_subst_var x v e = - if not (Vars.mem x e.vars) then e else + let filter e = Vars.mem x e.vars in + if not (filter e) then e else if Bvars.is_empty v.bind && Bvars.is_empty e.bind then - let rec walk mu x e = - if Vars.mem x e.vars then - get mu (rebuild (walk mu x)) e + let rec walk mu e = + if filter e then + get mu (rebuild (walk mu)) e else e in let cache = cache () in set cache (e_var x) v ; - walk cache x e + walk cache e else let sigma = Subst.create () in Subst.add sigma (e_var x) v ; Subst.add_term sigma v ; Subst.add_term sigma e ; + Subst.add_filter sigma filter ; subst sigma Intmap.empty e let e_apply e es = @@ -2280,18 +2295,17 @@ struct (* -------------------------------------------------------------------------- *) let e_repr = function + | Bvar _ | Bind _ -> raise (Invalid_argument "Qed.e_repr") | True -> e_true | False -> e_false | Kint z -> e_zint z | Kreal r -> e_real r | Fvar x -> e_var x - | Bvar(k,t) -> c_bvar k t - | Bind(q,t,e) -> c_bind q t e | Apply(a,xs) -> e_apply a xs | Times(k,e) -> e_times k e | Not e -> e_not e - | Add xs -> addition xs - | Mul xs -> multiplication xs + | Add xs -> e_sum xs + | Mul xs -> e_prod xs | And xs -> e_and xs | Or xs -> e_or xs | Mod(x,y) -> e_mod x y -- GitLab