X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_refiner%2FnCicMetaSubst.ml;h=421194abdb02b3a4431149b995e6b7493e104248;hb=c69505678c1746083a9a01ec4367cea67d888aa1;hp=52d2e45941ceb3fab8050431e82f67d655ad627a;hpb=0771f484b17fbe61f17c03288cfdc1124698f161;p=helm.git diff --git a/helm/software/components/ng_refiner/nCicMetaSubst.ml b/helm/software/components/ng_refiner/nCicMetaSubst.ml index 52d2e4594..421194abd 100644 --- a/helm/software/components/ng_refiner/nCicMetaSubst.ml +++ b/helm/software/components/ng_refiner/nCicMetaSubst.ml @@ -207,11 +207,18 @@ and restrict metasenv subst i restrictions = ;; let rec flexible_arg context subst = function - | NCic.Meta (i,_) | NCic.Appl (NCic.Meta (i,_) :: _)-> + | NCic.Meta (i,_) -> (try let _,_,t,_ = List.assoc i subst in flexible_arg context subst t with Not_found -> true) + | NCic.Appl (NCic.Meta (i,_) :: args)-> + (try + let _,_,t,_ = List.assoc i subst in + flexible_arg context subst + (NCicReduction.head_beta_reduce ~delta:max_int + (NCic.Appl (t :: args))) + with Not_found -> true) (* this is a cheap whd, it only performs zeta-reduction. * * it works when the **omissis** disambiguation algorithm @@ -235,17 +242,10 @@ let rec flexible_arg context subst = function | _ -> false ;; -let in_scope_tag = "tag:in_scope" ;; -let out_scope_tag_prefix = "tag:out_scope:" -let out_scope_tag n = out_scope_tag_prefix ^ string_of_int n ;; -let is_out_scope_tag tag = - String.length tag > String.length out_scope_tag_prefix && - String.sub tag 0 (String.length out_scope_tag_prefix) = out_scope_tag_prefix -;; +let is_out_scope = function `OutScope _ -> true | _ -> false;; +let is_out_scope_tag = List.exists is_out_scope;; let int_of_out_scope_tag tag = - int_of_string - (String.sub tag (String.length out_scope_tag_prefix) - (String.length tag - (String.length out_scope_tag_prefix))) + match List.filter is_out_scope tag with [`OutScope n] -> n | _ -> assert false ;; @@ -259,7 +259,7 @@ let delift ~unify metasenv subst context n l t = | NCic.Meta (i,_) -> (try let tag, _, _, _ = NCicUtils.lookup_subst i subst in - tag = Some in_scope_tag + List.mem `InScope tag with NCicUtils.Subst_not_found _ -> false) | _ -> false in @@ -322,16 +322,15 @@ let delift ~unify metasenv subst context n l t = (try let tag,c,t,ty = NCicUtils.lookup_subst i subst in let in_scope, clear = - match tag with - | Some tag when tag = in_scope_tag -> 0, true - | Some tag when is_out_scope_tag tag->int_of_out_scope_tag tag,true - | _ -> in_scope, false + if List.mem `InScope tag then 0, true + else if is_out_scope_tag tag then int_of_out_scope_tag tag,true + else in_scope, false in let ms = if not clear then ms else metasenv, - (i,(None,c,t,ty)) :: List.filter (fun j,_ -> i <> j) subst + (i,([],c,t,ty)) :: List.filter (fun j,_ -> i <> j) subst in aux (context,k,in_scope) ms (NCicSubstitution.subst_meta l1 t) with NCicUtils.Subst_not_found _ -> @@ -462,26 +461,26 @@ let delift ~unify metasenv subst context n l t = raise (MetaSubstFailure msg) ;; -let mk_meta ?name metasenv context ty = - let tyof = function Some s -> Some ("typeof_"^s) | None -> None in - let rec mk_meta name n metasenv context = function +let mk_meta ?(attrs=[]) metasenv context ty = + let tyof = List.map (function `Name s -> `Name ("typeof_"^s) | x -> x) in + let rec mk_meta attrs n metasenv context = function | `WithType ty -> let len = List.length context in - let menv_entry = (n, (name, context, ty)) in + let menv_entry = (n, (attrs, context, ty)) in menv_entry :: metasenv, n, NCic.Meta (n, (0,NCic.Irl len)), ty | `Sort -> let ty = NCic.Implicit (`Typeof n) in - mk_meta (tyof name) n metasenv [] (`WithType ty) + mk_meta (`IsSort::tyof attrs) n metasenv [] (`WithType ty) | `Type -> let metasenv, _, ty, _ = - mk_meta (tyof name) (newmeta ()) metasenv context `Sort in - mk_meta name n metasenv context (`WithType ty) + mk_meta (tyof attrs) (newmeta ()) metasenv context `Sort in + mk_meta attrs n metasenv context (`WithType ty) | `Term -> let metasenv, _, ty, _ = - mk_meta (tyof name) (newmeta ()) metasenv context `Type in - mk_meta name n metasenv context (`WithType ty) + mk_meta (tyof attrs) (newmeta ()) metasenv context `Type in + mk_meta attrs n metasenv context (`WithType ty) in - mk_meta name (newmeta ()) metasenv context ty + mk_meta attrs (newmeta ()) metasenv context ty ;; let saturate ?(delta=0) metasenv subst context ty goal_arity = @@ -489,7 +488,7 @@ let saturate ?(delta=0) metasenv subst context ty goal_arity = let rec aux metasenv = function | NCic.Prod (name,s,t) as ty -> let metasenv1, _, arg,_ = - mk_meta ~name:name metasenv context (`WithType s) in + mk_meta ~attrs:[`Name name] metasenv context (`WithType s) in let t, metasenv1, args, pno = aux metasenv1 (NCicSubstitution.subst arg t) in