X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Fcic_omdoc%2Feta_fixing.ml;h=c224bcf65ad1fb25b7c36d6739ccd996ff94e644;hb=fc35fbb35a01c110f221c52661f1193ea5664aa6;hp=8407f8357e04d3f7f8603759cbeb7432060d58b3;hpb=6248703e9f479d4c3edfcf227908ffd9d2dd7adc;p=helm.git diff --git a/helm/ocaml/cic_omdoc/eta_fixing.ml b/helm/ocaml/cic_omdoc/eta_fixing.ml index 8407f8357..c224bcf65 100644 --- a/helm/ocaml/cic_omdoc/eta_fixing.ml +++ b/helm/ocaml/cic_omdoc/eta_fixing.ml @@ -27,6 +27,8 @@ exception ReferenceToVariable;; exception RferenceToCurrentProof;; exception ReferenceToInductiveDefinition;; +let prerr_endline _ = ();; + (* let rec fix_lambdas_wrt_type ty te = let module C = Cic in @@ -162,16 +164,17 @@ let fix_according_to_type ty hd tl = ;; let eta_fix metasenv t = - let rec eta_fix' t = -(* prerr_endline ("entering aux with: term=" ^ CicPp.ppterm t); + let rec eta_fix' context t = + (* prerr_endline ("entering aux with: term=" ^ CicPp.ppterm t); flush stderr ; *) let module C = Cic in + let module S = CicSubstitution in match t with C.Rel n -> C.Rel n | C.Var (uri,exp_named_subst) -> let exp_named_subst' = List.map - (function i,t -> i, (eta_fix' t)) exp_named_subst + (function i,t -> i, (eta_fix' context t)) exp_named_subst in C.Var (uri,exp_named_subst') | C.Meta (n,l) -> @@ -183,19 +186,25 @@ let eta_fix metasenv t = (fun ct t -> match (ct, t) with None, _ -> None - | _, Some t -> Some (eta_fix' t) + | _, Some t -> Some (eta_fix' context t) | Some _, None -> assert false (* due to typing rules *)) canonical_context l in C.Meta (n,l') | C.Sort s -> C.Sort s | C.Implicit -> C.Implicit - | C.Cast (v,t) -> C.Cast (eta_fix' v, eta_fix' t) - | C.Prod (n,s,t) -> C.Prod (n, eta_fix' s, eta_fix' t) - | C.Lambda (n,s,t) -> C.Lambda (n, eta_fix' s, eta_fix' t) - | C.LetIn (n,s,t) -> C.LetIn (n, eta_fix' s, eta_fix' t) + | C.Cast (v,t) -> C.Cast (eta_fix' context v, eta_fix' context t) + | C.Prod (n,s,t) -> + C.Prod + (n, eta_fix' context s, eta_fix' ((Some (n,(C.Decl s)))::context) t) + | C.Lambda (n,s,t) -> + C.Lambda + (n, eta_fix' context s, eta_fix' ((Some (n,(C.Decl s)))::context) t) + | C.LetIn (n,s,t) -> + C.LetIn + (n,eta_fix' context s,eta_fix' ((Some (n,(C.Def (s,None))))::context) t) | C.Appl l as appl -> - let l' = List.map eta_fix' l + let l' = List.map (eta_fix' context) l in (match l' with C.Const(uri,exp_named_subst)::l'' -> @@ -207,46 +216,81 @@ let eta_fix metasenv t = | C.InductiveDefinition _ -> raise ReferenceToInductiveDefinition ) in - let result = fix_according_to_type constant_type (C.Const(uri,exp_named_subst)) l'' in - if not (CicReduction.are_convertible [] appl result) then - (prerr_endline ("prima :" ^(CicPp.ppterm appl)); - prerr_endline ("dopo :" ^(CicPp.ppterm result))); - result + fix_according_to_type constant_type (C.Const(uri,exp_named_subst)) l'' | _ -> C.Appl l' ) | C.Const (uri,exp_named_subst) -> let exp_named_subst' = List.map - (function i,t -> i, (eta_fix' t)) exp_named_subst + (function i,t -> i, (eta_fix' context t)) exp_named_subst in C.Const (uri,exp_named_subst') | C.MutInd (uri,tyno,exp_named_subst) -> let exp_named_subst' = List.map - (function i,t -> i, (eta_fix' t)) exp_named_subst + (function i,t -> i, (eta_fix' context t)) exp_named_subst in C.MutInd (uri, tyno, exp_named_subst') | C.MutConstruct (uri,tyno,consno,exp_named_subst) -> let exp_named_subst' = List.map - (function i,t -> i, (eta_fix' t)) exp_named_subst + (function i,t -> i, (eta_fix' context t)) exp_named_subst in C.MutConstruct (uri, tyno, consno, exp_named_subst') - | C.MutCase (uri, tyno, outty, term, patterns) -> - C.MutCase (uri, tyno, eta_fix' outty, - eta_fix' term, List.map eta_fix' patterns) + | C.MutCase (uri, tyno, outty, term, patterns) as prima -> + let outty' = eta_fix' context outty in + let term' = eta_fix' context term in + let patterns' = List.map (eta_fix' context) patterns in + let inductive_types,noparams = + (match CicEnvironment.get_obj uri with + Cic.Constant _ -> assert false + | Cic.Variable _ -> assert false + | Cic.CurrentProof _ -> assert false + | Cic.InductiveDefinition (l,_,n) -> l,n + ) in + let (_,_,_,constructors) = List.nth inductive_types tyno in + prerr_endline ("QUI"); + let constructor_types = + let rec clean_up t = + function + [] -> t + | a::tl -> + (match t with + Cic.Prod (_,_,t') -> clean_up (S.subst a t') tl + | _ -> assert false) in + if noparams = 0 then + List.map (fun (_,t) -> t) constructors + else + let term_type = + CicTypeChecker.type_of_aux' metasenv context term + in + (match term_type with + C.Appl (hd::params) -> + List.map (fun (_,t) -> clean_up t params) constructors + | _ -> prerr_endline ("QUA"); assert false) in + let patterns2 = + List.map2 fix_lambdas_wrt_type + constructor_types patterns in + C.MutCase (uri, tyno, outty',term',patterns2) | C.Fix (funno, funs) -> + let fun_types = + List.map (fun (n,_,ty,_) -> Some (C.Name n,(Cic.Decl ty))) funs in C.Fix (funno, List.map (fun (name, no, ty, bo) -> - (name, no, eta_fix' ty, eta_fix' bo)) funs) + (name, no, eta_fix' context ty, eta_fix' (fun_types@context) bo)) + funs) | C.CoFix (funno, funs) -> + let fun_types = + List.map (fun (n,ty,_) -> Some (C.Name n,(Cic.Decl ty))) funs in C.CoFix (funno, List.map (fun (name, ty, bo) -> - (name, eta_fix' ty, eta_fix' bo)) funs) + (name, eta_fix' context ty, eta_fix' (fun_types@context) bo)) funs) in - eta_fix' t + eta_fix' [] t ;; + +