aboutsummaryrefslogtreecommitdiff
path: root/kernel/typing.ml
diff options
context:
space:
mode:
authorfilliatr1999-08-27 16:58:43 +0000
committerfilliatr1999-08-27 16:58:43 +0000
commitb69aafe250ca1fbb21eb2f318873fe65856511c0 (patch)
tree0a44fc61206e9abe1d6863ac7dd8e282808cd6c1 /kernel/typing.ml
parentdd279791aca531cd0f38ce79b675c68e08a4ff63 (diff)
suppression champs inutiles dans constantes et inductifs; verification definitions inductives
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@29 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'kernel/typing.ml')
-rw-r--r--kernel/typing.ml73
1 files changed, 43 insertions, 30 deletions
diff --git a/kernel/typing.ml b/kernel/typing.ml
index ebae3faf93..0b236ce44c 100644
--- a/kernel/typing.ml
+++ b/kernel/typing.ml
@@ -14,6 +14,7 @@ open Inductive
open Environ
open Type_errors
open Typeops
+open Indtypes
(* Fonctions temporaires pour relier la forme castée de la forme jugement *)
@@ -58,10 +59,10 @@ let rec execute mf env cstr =
in
(match kind_of_term metaty with
| IsCast (typ,kind) ->
- ({ uj_val = cstr; uj_type = typ; uj_kind = kind}, u0)
+ ({ uj_val = cstr; uj_type = typ; uj_kind = kind }, u0)
| _ ->
let (jty,u1) = execute mf env metaty in
- let k = hnf_constr env jty.uj_type in
+ let k = whd_betadeltaiotaeta env jty.uj_type in
({ uj_val = cstr; uj_type = metaty; uj_kind = k }, u1))
| IsRel n ->
@@ -248,13 +249,11 @@ let lookup_mind = lookup_mind
let lookup_mind_specif = lookup_mind_specif
let lookup_meta = lookup_meta
-let push_rel_or_var push (id,ty) env =
- let (j,u) = safe_machine env ty.body in
+let push_rel_or_var push (id,c) env =
+ let (j,u) = safe_machine env c in
let env' = set_universes u env in
- let expty = DOP0(Sort ty.typ) in
- match conv env' j.uj_type expty with
- | Convertible u' -> push (id,ty) (set_universes u' env')
- | NotConvertible -> error_actual_type CCI env ty.body j.uj_type expty
+ let var = assumption_of_judgement env' j in
+ push (id,var) env'
let push_var nvar env = push_rel_or_var push_var nvar env
@@ -272,8 +271,7 @@ let add_constant sp ce env =
const_body = Some (ref (Cooked ce.const_entry_body));
const_type = typed_type_of_judgment env'' jt;
const_hyps = get_globals (context env);
- const_opaque = false;
- const_eval = None }
+ const_opaque = false }
in
add_constant sp cb (set_universes u'' env'')
| NotConvertible ->
@@ -292,31 +290,46 @@ let add_parameter sp c env =
const_body = Some (ref (Cooked c));
const_type = type_from_judgment env' j;
const_hyps = get_globals (context env);
- const_opaque = false;
- const_eval = None }
+ const_opaque = false }
in
Environ.add_constant sp cb env'
-let add_mind sp me env =
- let name_params =
- List.map (fun (id,c) -> (Name id, c)) me.mind_entry_params in
- (* just to check the params *)
- let env_params =
- List.fold_left
- (fun env (id,c) ->
- let (j,u) = safe_machine env c in
- let env' = set_universes u env in
- Environ.push_var (id, assumption_of_judgement env' j) env')
- env me.mind_entry_params
+let push_vars vars env =
+ List.fold_left (fun env nvar -> push_var nvar env) env vars
+
+let push_rels vars env =
+ List.fold_left (fun env nvar -> push_rel nvar env) env vars
+
+let check_type_constructs env_params univ nparams lc =
+ let check_one env c =
+ let (_,c) = decompose_prod_n nparams c in
+ let (j,u) = safe_machine env c in
+ match whd_betadeltaiota env j.uj_type with
+ | DOP0 (Sort (Type uc)) -> set_universes (enforce_geq univ uc u) env
+ | _ -> error "Type of Constructor not well-formed"
+ in
+ Array.fold_left check_one env_params lc
+
+let check_prop_constructs env_ar lc =
+ let check_one c =
+ let (j,_) = safe_machine env_ar c in
+ match whd_betadeltaiota env_ar j.uj_type with
+ | DOP0 (Sort _) -> cast_of_judgment j
+ | _ -> error "The type of a constructor must be a type"
in
- let env_arities =
- List.fold_left
- (fun env (id,ar,_) ->
- let (j,u) = safe_machine env (prod_it ar name_params) in
- let env' = set_universes u env in
- Environ.push_var (id, assumption_of_judgement env' j) env')
- env me.mind_entry_inds
+ Array.map check_one lc
+
+let add_mind sp mie env =
+ mind_check_names mie;
+ mind_check_arities env mie;
+ let params = mind_extract_and_check_params mie in
+ mind_check_lc params mie;
+ let env_arities =
+ push_rels
+ (List.map (fun (id,ar,_,_) -> (Name id,ar)) mie.mind_entry_inds) env
in
+ let env_params = push_rels params env_arities in
+ (* ICI *)
env_arities
type judgment = unsafe_judgment