X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Focaml%2Fcic_proof_checking%2FcicElim.ml;h=c668d1c9be33420a1b9222a8646c8c3408b7a436;hb=97c2d258a5c524eb5c4b85208899d80751a2c82f;hp=869d5d08b9fccea8021c85a9418c0672ad4d5460;hpb=e5108fbb1b112d713e611f7dbcd8a2ab8002e9a5;p=helm.git diff --git a/helm/ocaml/cic_proof_checking/cicElim.ml b/helm/ocaml/cic_proof_checking/cicElim.ml index 869d5d08b..c668d1c9b 100644 --- a/helm/ocaml/cic_proof_checking/cicElim.ml +++ b/helm/ocaml/cic_proof_checking/cicElim.ml @@ -25,12 +25,11 @@ open Printf -exception Elim_failure of string +exception Elim_failure of string Lazy.t exception Can_t_eliminate -(* -let debug_print = fun _ -> () *) -let debug_print = prerr_endline +let debug_print = fun _ -> () +(*let debug_print s = prerr_endline (Lazy.force s) *) let counter = ref ~-1 ;; @@ -256,7 +255,7 @@ let branch (uri, typeno) insource liftno paramsno t fix head args = let t = strip_left_params liftno paramsno t in branch (uri, typeno) insource paramsno t fix head args -let elim_of ?(sort = Cic.Type (CicUniv.fresh ())) uri typeno = +let elim_of ~sort uri typeno = counter := ~-1; let (obj, univ) = (CicEnvironment.get_obj CicUniv.empty_ugraph uri) in match obj with @@ -269,10 +268,14 @@ let elim_of ?(sort = Cic.Type (CicUniv.fresh ())) uri typeno = let paramsno = count_pi ty in (* number of (left or right) parameters *) let rightno = paramsno - leftno in let dependent = (strip_pi ty <> Cic.Sort Cic.Prop) in +let head = match strip_pi ty with Cic.Sort s -> s in let conslen = List.length constructors in let consno = ref (conslen + 1) in - if (not dependent) && (sort <> Cic.Prop) && (conslen > 1) then - raise Can_t_eliminate; + if + not + (CicTypeChecker.check_allowed_sort_elimination uri typeno head sort) + then + raise Can_t_eliminate; let indty = let indty = Cic.MutInd (uri, typeno, []) in if paramsno = 0 then @@ -367,21 +370,25 @@ let elim_of ?(sort = Cic.Type (CicUniv.fresh ())) uri typeno = in add_params (fun b s t -> Cic.Lambda (b, s, t)) leftno ty cic in -debug_print (CicPp.ppterm eliminator_type); -debug_print (CicPp.ppterm eliminator_body); +(* +debug_print (lazy (CicPp.ppterm eliminator_type)); +debug_print (lazy (CicPp.ppterm eliminator_body)); +*) let eliminator_type = FreshNamesGenerator.mk_fresh_names [] [] [] eliminator_type in let eliminator_body = FreshNamesGenerator.mk_fresh_names [] [] [] eliminator_body in -debug_print (CicPp.ppterm eliminator_type); -debug_print (CicPp.ppterm eliminator_body); +(* +debug_print (lazy (CicPp.ppterm eliminator_type)); +debug_print (lazy (CicPp.ppterm eliminator_body)); +*) let (computed_type, ugraph) = try CicTypeChecker.type_of_aux' [] [] eliminator_body CicUniv.empty_ugraph with CicTypeChecker.TypeCheckerFailure msg -> - raise (Elim_failure (sprintf + raise (Elim_failure (lazy (sprintf "type checker failure while type checking:\n%s\nerror:\n%s" - (CicPp.ppterm eliminator_body) msg)) + (CicPp.ppterm eliminator_body) (Lazy.force msg)))) in if not (fst (CicReduction.are_convertible [] eliminator_type computed_type ugraph))