X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_refiner%2FnCicMetaSubst.ml;h=421194abdb02b3a4431149b995e6b7493e104248;hb=dfee894b6cc036014bbbf1f508621840f44144d7;hp=a445d16be4cf6a99a8937c6026c322672454854c;hpb=b873fcd647e7b30e486eac5c5470762c9bc79e93;p=helm.git diff --git a/helm/software/components/ng_refiner/nCicMetaSubst.ml b/helm/software/components/ng_refiner/nCicMetaSubst.ml index a445d16be..421194abd 100644 --- a/helm/software/components/ng_refiner/nCicMetaSubst.ml +++ b/helm/software/components/ng_refiner/nCicMetaSubst.ml @@ -206,28 +206,46 @@ and restrict metasenv subst i restrictions = | NCicUtils.Meta_not_found _ -> assert false ;; -let rec flexible_arg subst = function - | NCic.Meta (i,_) | NCic.Appl (NCic.Meta (i,_) :: _)-> +let rec flexible_arg context subst = function + | NCic.Meta (i,_) -> (try let _,_,t,_ = List.assoc i subst in - flexible_arg subst t + 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 + * is run on `let x := K a b in t`, K is substituted for a + * ? and thus in t metavariables have a flexible Rel + *) + | NCic.Rel i -> + (try + match List.nth context (i-1) + with + | _,NCic.Def (bo,_) -> + flexible_arg context subst + (NCicSubstitution.lift i bo) + | _ -> false + with + | Failure _ -> + prerr_endline (Printf.sprintf "Rel %d inside context:\n%s" i + (NCicPp.ppcontext ~subst ~metasenv:[] context)); + assert false + | Invalid_argument _ -> assert false) | _ -> false ;; -let flexible subst l = List.exists (flexible_arg subst) l;; - -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 ;; @@ -241,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 @@ -256,38 +274,35 @@ let delift ~unify metasenv subst context n l t = in try aux () () t; false with Found -> true in - let unify_list ~alpha in_scope = + let unify_list in_scope = match l with | _, NCic.Irl _ -> fun _ _ _ _ _ -> None | shift, NCic.Ctx l -> fun metasenv subst context k t -> - if flexible_arg subst t || contains_in_scope subst t then None else - let lb = List.map (fun t -> t, flexible_arg subst t) l in + if flexible_arg context subst t || contains_in_scope subst t then None else + let lb = + List.map (fun t -> + let t = NCicSubstitution.lift (k+shift) t in + t, flexible_arg context subst t) + l + in HExtlib.list_findopt (fun (li,flexible) i -> if flexible || i < in_scope then None else - let li = NCicSubstitution.lift (k+shift) li in - if alpha then - if NCicReduction.alpha_eq metasenv subst context li t then - Some ((metasenv,subst), NCic.Rel (i+1+k)) - else - None - else - match unify metasenv subst context li t with - | Some (metasenv,subst) -> - Some ((metasenv, subst), NCic.Rel (i+1+k)) - | None -> None) + match unify metasenv subst context li t with + | Some (metasenv,subst) -> + Some ((metasenv, subst), NCic.Rel (i+1+k)) + | None -> None) lb in let rec aux (context,k,in_scope) (metasenv, subst as ms) t = - match unify_list ~alpha:true in_scope metasenv subst context k t with + match unify_list in_scope metasenv subst context k t with | Some x -> x | None -> - try match t with | NCic.Rel n as t when n <= k -> ms, t | NCic.Rel n -> (try - match List.nth context (n-k-1) with + match List.nth context (n-1) with | _,NCic.Def (bo,_) -> (try ms, NCic.Rel ((position in_scope (n-k) l) + k) with NotInTheList -> @@ -307,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 _ -> @@ -413,11 +427,16 @@ let delift ~unify metasenv subst context n l t = | t -> NCicUntrusted.map_term_fold_a (fun e (c,k,s) -> (e::c,k+1,s)) (context,k,in_scope) aux ms t - with NotInTheList -> - match unify_list ~alpha:false in_scope metasenv subst context k t with - | Some x -> x - | None -> raise NotInTheList in +(* + prerr_endline ( + "DELIFTO " ^ NCicPp.ppterm ~metasenv ~subst ~context t ^ " w.r.t. " ^ + String.concat ", " (List.map (NCicPp.ppterm ~metasenv ~subst ~context) ( + let shift, lc = l in + (List.map (NCicSubstitution.lift shift) + (NCicUtils.expand_local_context lc)) + ))); +*) try aux (context,0,0) (metasenv,subst) t with NotInTheList -> (* This is the case where we fail even first order unification. *) @@ -435,33 +454,33 @@ let delift ~unify metasenv subst context n l t = let lc = NCicUtils.expand_local_context lc in let l = List.map (NCicSubstitution.lift shift) lc in if - List.exists (fun t-> NCicUntrusted.metas_of_term subst context t = []) l + List.exists (fun t-> NCicUntrusted.metas_of_term subst context t <> [])l then raise (Uncertain msg) else 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 = @@ -469,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