X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fsoftware%2Fcomponents%2Fng_refiner%2FnCicMetaSubst.ml;h=60abe85c37c08879ea80d01ededa27c158d0192f;hb=8049c166a37789d7a1b1ca1c3a1174712bbf87ba;hp=9cc6ac67c755c16e4208413f1cd7565859c64557;hpb=2b224c0d5e0e7f611d4887fd61fff038c292efd5;p=helm.git diff --git a/helm/software/components/ng_refiner/nCicMetaSubst.ml b/helm/software/components/ng_refiner/nCicMetaSubst.ml index 9cc6ac67c..60abe85c3 100644 --- a/helm/software/components/ng_refiner/nCicMetaSubst.ml +++ b/helm/software/components/ng_refiner/nCicMetaSubst.ml @@ -206,12 +206,29 @@ and restrict metasenv subst i restrictions = | NCicUtils.Meta_not_found _ -> assert false ;; -let rec flexible_arg subst = function +let rec flexible_arg context subst = function | NCic.Meta (i,_) | NCic.Appl (NCic.Meta (i,_) :: _)-> (try let _,_,t,_ = List.assoc i subst in - flexible_arg subst t + flexible_arg context subst t 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 _ -> assert false + | Invalid_argument _ -> assert false) | _ -> false ;; @@ -254,33 +271,26 @@ 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 -> 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 -> @@ -411,10 +421,6 @@ 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 try aux (context,0,0) (metasenv,subst) t with NotInTheList ->