aboutsummaryrefslogtreecommitdiff
path: root/toplevel
diff options
context:
space:
mode:
authorfilliatr1999-12-03 09:09:37 +0000
committerfilliatr1999-12-03 09:09:37 +0000
commitf20dbafa3e49c35414640e01c3549ad1c802d331 (patch)
tree761e97154851e214a6d6802c9decb977bfa1b07e /toplevel
parent4318eefacae280fed3a159acfede35c568b2942b (diff)
- global_reference traite des variables
- construct_reference, avec environnement en argument - link de Class - Definition et Check au toplevel git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@193 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'toplevel')
-rw-r--r--toplevel/class.ml334
-rw-r--r--toplevel/record.ml248
-rw-r--r--toplevel/record.mli10
-rw-r--r--toplevel/vernacentries.ml15
4 files changed, 317 insertions, 290 deletions
diff --git a/toplevel/class.ml b/toplevel/class.ml
index 5c762636f1..dbd0885559 100644
--- a/toplevel/class.ml
+++ b/toplevel/class.ml
@@ -1,4 +1,6 @@
+(* $Id$ *)
+
open Util
open Pp
open Names
@@ -18,7 +20,7 @@ open Declare
(* strength * strength -> bool *)
let stre_gt = function
- (NeverDischarge,NeverDischarge) -> false
+ | (NeverDischarge,NeverDischarge) -> false
| (NeverDischarge,x) -> false
| (x,NeverDischarge) -> true
| (DischargeAt sp1,DischargeAt sp2) -> sp_gt (sp1,sp2)
@@ -30,7 +32,7 @@ let stre_max4 stre1 stre2 stre3 stre4 =
stre_max ((stre_max (stre1,stre2)),(stre_max (stre3,stre4)))
let id_of_varid = function
- | (VAR id) -> id
+ | VAR id -> id
| _ -> anomaly "class__id_of_varid"
let stre_of_VAR c = variable_strength (destVar c)
@@ -39,24 +41,25 @@ let stre_of_VAR c = variable_strength (destVar c)
lc liste des variable dont depend la classe source *)
let rec stre_unif_cond = function
- ([],[]) -> NeverDischarge
+ | ([],[]) -> NeverDischarge
| (v::l,[]) -> stre_of_VAR v
| ([],v::l) -> stre_of_VAR v
| (v1::l1,v2::l2) ->
- if v1=v2 then stre_unif_cond (l1,l2)
+ if v1=v2 then
+ stre_unif_cond (l1,l2)
else
let stre1 = (stre_of_VAR v1)
- and stre2 = (stre_of_VAR v2)
- in stre_max (stre1,stre2)
+ and stre2 = (stre_of_VAR v2) in
+ stre_max (stre1,stre2)
let stre_of_coe = function
- NAM_SP sp ->
+ | NAM_SP sp ->
(match global_operator sp (basename sp) with
- Const sp, _ -> constant_strength sp
+ | Const sp, _ -> constant_strength sp
| _ -> NeverDischarge)
| NAM_Var id -> variable_strength id
| _ -> NeverDischarge
-
+
(* try_add_class : Names.identifier ->
Term.constr -> (cl_typ * int) option -> bool -> int * Libobject.strength *)
@@ -64,24 +67,28 @@ let try_add_class id v clpopt streopt check_exist =
let env = Global.env () in
let t = Retyping.get_type_of env Evd.empty v in
let p1 =
- try arity_sort t
- with Not_found -> errorlabstrm "try_add_class"
+ try
+ arity_sort t
+ with Not_found ->
+ errorlabstrm "try_add_class"
[< 'sTR "Type of "; 'sTR (string_of_id id);
- 'sTR " does not end with a sort" >] in
+ 'sTR " does not end with a sort" >]
+ in
let cl,p =
match clpopt with
- None -> let (cl,_)=constructor_at_head v in (cl,p1)
- | Some (cl,p2) -> (fully_applied id p2 p1;cl,p1) in
+ | None -> let (cl,_)=constructor_at_head v in (cl,p1)
+ | Some (cl,p2) -> (fully_applied id p2 p1;cl,p1)
+ in
if check_exist & class_exists cl then
errorlabstrm "try_add_new_class"
[< 'sTR (string_of_id id) ; 'sTR " is already a class" >];
let stre' = stre_of_cl cl in
- let stre = (match streopt with
- (Some stre) -> stre_max (stre,stre')
- | None -> stre') in
- add_new_class (cl,(string_of_id id),stre,p);
- stre
-
+ let stre = match streopt with
+ | Some stre -> stre_max (stre,stre')
+ | None -> stre'
+ in
+ add_new_class (cl,(string_of_id id),stre,p);
+ stre
(* try_add_new_class : Names.identifier -> unit *)
@@ -89,18 +96,19 @@ let try_add_new_class id stre =
let v = global_reference CCI id in
let _ = try_add_class id v None (Some stre) true in ()
-
(* check_class : Names.identifier ->
Term.constr -> cl_typ -> int -> int * Libobject.strength *)
let check_class id v cl p =
- try
- let _,clinfo = class_info cl in
- if p = clinfo.cL_PARAM
- then clinfo.cL_STRE
- else errorlabstrm "fully_applied"
- [< 'sTR"Wrong number of parameters for ";'sTR(string_of_id id) >]
- with Not_found -> try_add_class id v (Some (cl,p)) None false
+ try
+ let _,clinfo = class_info cl in
+ if p = clinfo.cL_PARAM then
+ clinfo.cL_STRE
+ else
+ errorlabstrm "fully_applied"
+ [< 'sTR"Wrong number of parameters for ";'sTR(string_of_id id) >]
+ with Not_found ->
+ try_add_class id v (Some (cl,p)) None false
(* decomposition de constr vers coe_typ *)
@@ -108,48 +116,52 @@ let check_class id v cl p =
let coe_constructor_at_head t =
let rec aux t' =
match kind_of_term t' with
- IsConst (sp,l) -> (Array.to_list l),NAM_SP sp
- | IsMutInd (sp,_,l) -> (Array.to_list l),NAM_SP sp
- | IsVar id -> [],NAM_Var id
- | IsCast (c,_) -> aux c
- | IsMutConstruct (sp,i,j,l) -> (Array.to_list l),NAM_Construct ((sp,i),j)
- | IsAppL(f,args) -> aux f
- | _ -> raise Not_found
- in aux (collapse_appl t)
+ | IsConst (sp,l) -> (Array.to_list l),NAM_SP sp
+ | IsMutInd (sp,_,l) -> (Array.to_list l),NAM_SP sp
+ | IsVar id -> [],NAM_Var id
+ | IsCast (c,_) -> aux c
+ | IsMutConstruct (sp,i,j,l) -> (Array.to_list l),NAM_Construct ((sp,i),j)
+ | IsAppL(f,args) -> aux f
+ | _ -> raise Not_found
+ in
+ aux (collapse_appl t)
let constructor_at_head1 t =
let rec aux t' =
match kind_of_term t' with
- IsConst (sp,l) -> t',[],(Array.to_list l),CL_SP sp,0
- | IsMutInd (sp,i,l) -> t',[],(Array.to_list l),CL_IND (sp,i),0
- | IsVar id -> t',[],[],CL_Var id,0
- | IsCast (c,_) -> aux c
- | IsAppL(f,args) -> let t',_,l,c,_ = aux f in t',args,l,c,List.length args
- | IsProd (_,_,_) -> t',[],[],CL_FUN,0
- | IsSort _ -> t',[],[],CL_SORT,0
- | _ -> raise Not_found
- in aux (collapse_appl t)
+ | IsConst (sp,l) -> t',[],(Array.to_list l),CL_SP sp,0
+ | IsMutInd (sp,i,l) -> t',[],(Array.to_list l),CL_IND (sp,i),0
+ | IsVar id -> t',[],[],CL_Var id,0
+ | IsCast (c,_) -> aux c
+ | IsAppL(f,args) ->
+ let t',_,l,c,_ = aux f in t',args,l,c,List.length args
+ | IsProd (_,_,_) -> t',[],[],CL_FUN,0
+ | IsSort _ -> t',[],[],CL_SORT,0
+ | _ -> raise Not_found
+ in
+ aux (collapse_appl t)
(* condition d'heritage uniforme *)
let uniform_cond nargs lt =
let rec aux = function
- (0,[]) -> true
+ | (0,[]) -> true
| (n,t::l) -> (strip_outer_cast t = Rel n) & (aux ((n-1),l))
| _ -> false
- in aux (nargs,lt)
+ in
+ aux (nargs,lt)
let id_of_cl = function
- CL_FUN -> (id_of_string "FUNCLASS")
+ | CL_FUN -> (id_of_string "FUNCLASS")
| CL_SORT -> (id_of_string "SORTCLASS")
| CL_SP sp -> (basename sp)
| CL_IND (sp,i) ->
(mind_nth_type_packet (Global.lookup_mind sp) i).mind_typename
| CL_Var id -> id
-
+
let string_of_cl = function
- CL_FUN -> "FUNCLASS"
+ | CL_FUN -> "FUNCLASS"
| CL_SORT -> "SORTCLASS"
| CL_SP sp -> string_of_id (basename sp)
| CL_IND (sp,i) ->
@@ -174,95 +186,112 @@ type choice = Ident of identifier | Section_path of section_path
let get_source lp source =
let aux test =
let rec aux1 n = function
- [] -> raise Not_found
+ | [] -> raise Not_found
| t1::lt ->
- try (let v1,lv1,l,cl1,p1 = constructor_at_head1 t1 in
- if test cl1
- then cl1,p1,v1,lv1,n,l
- else aux1 (n+1) lt)
- with _ -> aux1 (n + 1) lt
- in aux1 1 lp
- in match source with
- None ->
+ try
+ let v1,lv1,l,cl1,p1 = constructor_at_head1 t1 in
+ if test cl1 then
+ cl1,p1,v1,lv1,n,l
+ else
+ aux1 (n+1) lt
+ with _ ->
+ aux1 (n + 1) lt
+ in
+ aux1 1 lp
+ in
+ match source with
+ | None ->
let (v1,lv1,l,cl1,p1) as x =
- (match lp with
- [] -> raise Not_found
- | t1::_ ->
- try constructor_at_head1 t1
- with _ -> raise Not_found)
- in (id_of_cl cl1),(cl1,p1,v1,lv1,1,l)
- | Some (Ident id) -> id, aux (function cl -> id_of_cl cl = id)
+ match lp with
+ | [] -> raise Not_found
+ | t1::_ ->
+ try constructor_at_head1 t1
+ with _ -> raise Not_found
+ in
+ (id_of_cl cl1),(cl1,p1,v1,lv1,1,l)
+ | Some (Ident id) ->
+ id, aux (function cl -> id_of_cl cl = id)
| Some (Section_path sp) ->
basename sp,
aux (function
- CL_SP sp1 -> sp=sp1
+ | CL_SP sp1 -> sp=sp1
| CL_IND (sp1,i) -> sp=sp1
| _ -> false)
let get_target t ind =
- if (ind > 1)
- then CL_FUN,0,t
- else let v2,_,_,cl2,p2 = constructor_at_head1 t in
- cl2,p2,v2
-
+ if (ind > 1) then
+ CL_FUN,0,t
+ else
+ let v2,_,_,cl2,p2 = constructor_at_head1 t in cl2,p2,v2
let prods_of t =
let rec aux acc = function
- DOP2(Prod,c1,DLAM(_,c2)) -> aux (c1::acc) c2
+ | DOP2(Prod,c1,DLAM(_,c2)) -> aux (c1::acc) c2
| (DOP2(Cast,c,_)) -> aux acc c
| t -> t::acc
- in aux [] t
+ in
+ aux [] t
(* coercion identite' *)
let lams_of t =
let rec aux acc = function
- DOP2(Lambda,c1,DLAM(x,c2)) -> aux ((x,c1)::acc) c2
- | (DOP2(Cast,c,_)) -> aux acc c
+ | DOP2(Lambda,c1,DLAM(x,c2)) -> aux ((x,c1)::acc) c2
+ | DOP2(Cast,c,_) -> aux acc c
| t -> acc,t
- in aux [] t
+ in
+ aux [] t
let build_id_coercion idf_opt ids =
let env = Global.env () in
- let vs = global env ids in
+ let vs = construct_reference env CCI ids in
let c = match (strip_outer_cast vs) with
- (DOPN(Const sp,l) as c') when Environ.evaluable_constant env c' ->
+ | (DOPN(Const sp,l) as c') when Environ.evaluable_constant env c' ->
(try Instantiate.constant_value env c'
with _ -> errorlabstrm "build_id_coercion"
[< 'sTR(string_of_id ids);
'sTR" must be a transparent constant" >])
- | _ -> errorlabstrm "build_id_coercion"
- [< 'sTR(string_of_id ids); 'sTR" must be a transparent constant" >] in
+ | _ ->
+ errorlabstrm "build_id_coercion"
+ [< 'sTR(string_of_id ids);
+ 'sTR" must be a transparent constant" >]
+ in
let lams,t = lams_of c in
let lams = List.rev lams in
let llams = List.length lams in
let val_f =
List.fold_right
- (fun (x,t) u ->
- DOP2(Lambda,t,DLAM(x,u)))
+ (fun (x,t) u -> DOP2(Lambda,t,DLAM(x,u)))
lams
(DOP2(Lambda,(applistc vs (rel_list 0 llams)),
- DLAM(Name (id_of_string "x"),Rel 1))) in
+ DLAM(Name (id_of_string "x"),Rel 1)))
+ in
let typ_f =
List.fold_right
(fun (x,t) c -> DOP2(Prod,t,DLAM(x,c)))
lams
(DOP2(Prod,(applistc vs (rel_list 0 llams)),
- DLAM(Anonymous,lift 1 t))) in
+ DLAM(Anonymous,lift 1 t)))
+ in
let constr_f = DOP2(Cast,val_f,typ_f) in
(* juste pour verification *)
- let _ = try Typing.type_of env Evd.empty constr_f
- with _ ->
- error "cannot be defined as coercion - may be a bad number of arguments" in
+ let _ =
+ try
+ Typing.type_of env Evd.empty constr_f
+ with _ ->
+ error ("cannot be defined as coercion - "^
+ "may be a bad number of arguments")
+ in
let idf =
- (match idf_opt with
- Some(idf) -> idf
- | None ->
- id_of_string ("Id_"^(string_of_id ids)^"_"^
- (string_of_cl (fst (constructor_at_head t))))) in
+ match idf_opt with
+ | Some(idf) -> idf
+ | None ->
+ id_of_string ("Id_"^(string_of_id ids)^"_"^
+ (string_of_cl (fst (constructor_at_head t))))
+ in
let constr_entry = {const_entry_body = constr_f; const_entry_type = None } in
- let _ = declare_constant idf (constr_entry,NeverDischarge,false)
- in idf
+ declare_constant idf (constr_entry,NeverDischarge,false);
+ idf
let coercion_syntax_entry id n =
let args = (String.concat " " (list_tabulate (fun _ -> "$_") n)) ^ " $c" in
@@ -270,41 +299,41 @@ let coercion_syntax_entry id n =
" [ <<(" ^ (string_of_id id) ^ " " ^ args ^ ")>> ]" ^
" -> [ (APPLIST $c):E ]"
in
- try
- let se = Pcoq.parse_string Pcoq.Prim.syntax_entry_eoi str in
- Metasyntax.add_syntax_obj "constr" [se]
- with Stdpp.Exc_located _ -> anomaly ("ill-formed syntax entry: "^str)
+ try
+ let se = Pcoq.parse_string Pcoq.Prim.syntax_entry_eoi str in
+ Metasyntax.add_syntax_obj "constr" [se]
+ with Stdpp.Exc_located _ ->
+ anomaly ("ill-formed syntax entry: "^str)
let fun_coercion_syntax_entry id n =
let args =
- if n<0 then anomaly "fun_coercion_syntax_entry"
- else
- String.concat " " (list_tabulate (fun _ -> "$_") n) ^ " $c ($LIST $l)" in
+ if n<0 then anomaly "fun_coercion_syntax_entry";
+ String.concat " " (list_tabulate (fun _ -> "$_") n) ^ " $c ($LIST $l)"
+ in
let str = "level 10: " ^ ((string_of_id id)^"1") ^
" [ (APPLIST " ^ (string_of_id id) ^ " " ^ args ^ ") ] " ^
"-> [ (APPLIST $c ($LIST $l)):E ]"
in
- try
- let se = Pcoq.parse_string Pcoq.Prim.syntax_entry_eoi str in
- Metasyntax.add_syntax_obj "constr" [se]
- with Stdpp.Exc_located _ -> anomaly ("ill-formed syntax entry: "^str)
-
-
+ try
+ let se = Pcoq.parse_string Pcoq.Prim.syntax_entry_eoi str in
+ Metasyntax.add_syntax_obj "constr" [se]
+ with Stdpp.Exc_located _ ->
+ anomaly ("ill-formed syntax entry: "^str)
let coercion_syntax idf ps clt =
match clt with
- CL_FUN ->
- (fun_coercion_syntax_entry idf ps;
- coercion_syntax_entry idf ps)
+ | CL_FUN ->
+ fun_coercion_syntax_entry idf ps;
+ coercion_syntax_entry idf ps
| _ -> coercion_syntax_entry idf ps
-
let add_new_coercion_in_graph1 (coef,v,stre,isid,cls,clt) idf ps =
let _ = add_anonymous_leaf
- (inCoercion
- ((coef,
- {cOE_VALUE=v;cOE_STRE=stre;cOE_ISID=isid;cOE_PARAM=ps}),
- cls,clt)) in
+ (inCoercion
+ ((coef,
+ {cOE_VALUE=v;cOE_STRE=stre;cOE_ISID=isid;cOE_PARAM=ps}),
+ cls,clt))
+ in
coercion_syntax idf ps clt
(*
@@ -320,28 +349,29 @@ lorque source est None alors target est None aussi.
let try_add_new_coercion_core idf stre source target isid =
let env = Global.env () in
- let v = global env idf in
+ let v = construct_reference env CCI idf in
let t = Retyping.get_type_of env Evd.empty v in
let k = Retyping.get_type_of env Evd.empty t in
let vj = {uj_val=v; uj_type=t; uj_kind = k} in
let f_vardep,coef = coe_constructor_at_head v in
if coercion_exists coef then
- errorlabstrm "try_add_coercion"
- [< 'sTR(string_of_id idf) ; 'sTR" is already a coercion" >];
+ errorlabstrm "try_add_coercion"
+ [< 'sTR(string_of_id idf) ; 'sTR" is already a coercion" >];
let lp = prods_of t in
let llp = List.length lp in
if llp <= 1 then
errorlabstrm "try_add_coercion"
[< 'sTR"Does not correspond to a coercion" >];
-
let ids,(cls,ps,vs,lvs,ind,s_vardep) =
- try get_source (List.tl lp) source
- with Not_found -> errorlabstrm "try_add_coercion"
- [<'sTR"We do not find the source class " >] in
-
+ try
+ get_source (List.tl lp) source
+ with Not_found ->
+ errorlabstrm "try_add_coercion"
+ [<'sTR"We do not find the source class " >]
+ in
if (cls = CL_FUN) then
errorlabstrm "try_add_coercion"
- [< 'sTR"FUNCLASS cannot be a source class" >];
+ [< 'sTR"FUNCLASS cannot be a source class" >];
if (cls = CL_SORT) then
errorlabstrm "try_add_coercion"
[< 'sTR"SORTCLASS cannot be a source class" >];
@@ -349,19 +379,24 @@ let try_add_new_coercion_core idf stre source target isid =
errorlabstrm "try_add_coercion"
[<'sTR(string_of_id idf);
'sTR" does not respect the inheritance uniform condition" >];
-
let clt,pt,vt =
- try get_target (List.hd lp) ind
- with Not_found -> errorlabstrm "try_add_coercion"
- [<'sTR"We cannot find the target class" >] in
+ try
+ get_target (List.hd lp) ind
+ with Not_found ->
+ errorlabstrm "try_add_coercion"
+ [<'sTR"We cannot find the target class" >]
+ in
let idt =
(match target with
- Some idt ->
- if idt = id_of_cl clt then idt
- else errorlabstrm "try_add_coercion"
- [<'sTR"The target class does not correspond to ";
- 'sTR(string_of_id idt) >]
- | None -> (id_of_cl clt)) in
+ | Some idt ->
+ if idt = id_of_cl clt then
+ idt
+ else
+ errorlabstrm "try_add_coercion"
+ [<'sTR"The target class does not correspond to ";
+ 'sTR(string_of_id idt) >]
+ | None -> (id_of_cl clt))
+ in
let stres = check_class ids vs cls ps in
let stret = check_class idt vt clt pt in
let stref = stre_of_coe coef in
@@ -403,44 +438,46 @@ let defined_in_sec sp sec_sp =
let process_class sec_sp ((cl,{cL_STR=s;cL_STRE=stre;cL_PARAM=p}) as x ) =
let env = Global.env () in
match cl with
- CL_Var id -> x
+ | CL_Var id -> x
| CL_SP sp ->
- if defined_in_sec sp sec_sp
- then
+ if defined_in_sec sp sec_sp then
let ((_,spid,spk)) = repr_path sp in
let newsp = Lib.make_path spid CCI in
let v = global_reference CCI spid in
let t = Retyping.get_type_of env Evd.empty v in
let p = arity_sort t in
(CL_SP newsp,{cL_STR=s;cL_STRE=stre;cL_PARAM=p})
- else x
+ else
+ x
| CL_IND (sp,i) ->
- if defined_in_sec sp sec_sp
- then
+ if defined_in_sec sp sec_sp then
let ((_,spid,spk)) = repr_path sp in
let newsp = Lib.make_path spid CCI in
let v = global_reference CCI spid in
let t = Retyping.get_type_of env Evd.empty v in
let p = arity_sort t in
(CL_IND (newsp,i),{cL_STR=s;cL_STRE=stre;cL_PARAM=p})
- else x
+ else
+ x
| _ -> anomaly "process_class"
let process_cl sec_sp cl =
match cl with
- CL_Var id -> CL_Var id
+ | CL_Var id -> CL_Var id
| CL_SP sp ->
if defined_in_sec sp sec_sp then
let ((_,spid,spk)) = repr_path sp in
let newsp = Lib.make_path spid CCI in
CL_SP newsp
- else cl
+ else
+ cl
| CL_IND (sp,i) ->
if defined_in_sec sp sec_sp then
let ((_,spid,spk)) = repr_path sp in
let newsp = Lib.make_path spid CCI in
CL_IND (newsp,i)
- else cl
+ else
+ cl
| _ -> cl
let process_coercion sec_sp (((coe,coeinfo),s,t) as x) =
@@ -448,14 +485,15 @@ let process_coercion sec_sp (((coe,coeinfo),s,t) as x) =
let t1 = process_cl sec_sp t in
let p = (snd (class_info s1)).cL_PARAM in
match coe with
- NAM_Var id -> ((coe,coeinfo),s1,t1),id,p
+ | NAM_Var id -> ((coe,coeinfo),s1,t1),id,p
| NAM_SP sp ->
if defined_in_sec sp sec_sp then
let ((_,spid,spk)) = repr_path sp in
let newsp = Lib.make_path spid CCI in
let v = global_reference CCI spid in
((NAM_SP newsp,coeinfo),s1,t1),spid,p
- else ((coe,coeinfo),s1,t1),basename sp,p
+ else
+ ((coe,coeinfo),s1,t1),basename sp,p
| NAM_Construct ((sp,i),j) ->
if defined_in_sec sp sec_sp then
let ((_,spid,spk)) = repr_path sp in
@@ -467,5 +505,3 @@ let process_coercion sec_sp (((coe,coeinfo),s,t) as x) =
((coe,coeinfo),s1,t1),
Global.id_of_global (MutConstruct((sp,i),j)),
p
-
-(* Id: class.ml4,v 1.2 1997/06/17 17:44:10 dderaugl Exp $ *)
diff --git a/toplevel/record.ml b/toplevel/record.ml
index cc44bc22bd..99cbac0b8b 100644
--- a/toplevel/record.ml
+++ b/toplevel/record.ml
@@ -1,80 +1,72 @@
(* $:Id$ *)
-open Util;;
-open Names;;
-open Term;;
+open Pp
+open Util
+open Names
+open Term
+open Coqast
+open Ast
(*
-open Generic;;
-open Mach;;
-open Command;;
-open More_util;;
-open Pp;;
-
-open Constrtypes;;
-open Termenv;;
-open Trad;;
-open Ast;;
-open CoqAst;;
-
-open Machops;;
-open Classops;;
-open Recordops;;
+open Generic
+open Command
+open Machops
+open Classops
+open Recordops
*)
(********** definition d'un record (structure) **************)
let make_constructor fields appc =
- let rec aux fields =
- match fields with
- [] -> appc
- | (id,ty)::l -> ope("PROD",[ty; slam(Some (string_of_id id), aux l)])
- in aux fields;;
+ let rec aux fields =
+ match fields with
+ | [] -> appc
+ | (id,ty)::l -> ope("PROD",[ty; slam(Some (string_of_id id), aux l)])
+ in
+ aux fields
(* free_vars existe de'ja` dans ast.ml *)
let rec drop = function
- [] -> []
+ | [] -> []
| (None::t) -> drop t
| ((Some id)::t) -> id::(drop t)
-;;
let fold curriedf l base =
List.fold_right (fun a -> fun b -> curriedf(a,b)) l base
-;;
-
+
let free_vars t =
- let rec aux = function
- (Nvar(_,s),accum) -> add_set (id_of_string s) accum
-| (Node(_,_,tl),accum) -> fold aux tl accum
-| (Slam(_,None,body),accum) ->
- (aux(body,[]))@accum
-| (Slam(_,Some id,body),accum) ->
- (subtract (aux(body,[])) [(id_of_string id)])@accum
-| (_,accum) -> accum
- in aux(t,[])
-;;
+ let rec aux = function
+ | (Nvar(_,s),accum) -> list_add_set (id_of_string s) accum
+ | (Node(_,_,tl),accum) -> fold aux tl accum
+ | (Slam(_,None,body),accum) -> (aux(body,[]))@accum
+ | (Slam(_,Some id,body),accum) ->
+ (list_subtract (aux(body,[])) [(id_of_string id)])@accum
+ | (_,accum) -> accum
+ in
+ aux(t,[])
let free_in_asts id l =
let rec aux =
- function [] -> true
- | a::l -> (not (List.mem id (free_vars a))) & (aux l) in
- aux l;;
+ function
+ | [] -> true
+ | a::l -> (not (List.mem id (free_vars a))) & (aux l)
+ in
+ aux l
let all_vars t =
- let rec aux = function
- (Nvar(_,id),accum) -> add_set (id_of_string id) accum
-| (Node(_,_,tl),accum) -> fold aux tl accum
-| (Slam(_,None,body),accum) -> aux (body,accum)
-| (Slam(_,Some id,body),accum) ->
- aux (body,(union accum [(id_of_string id)]))
-| (_,accum) -> accum
- in aux(t,[])
-;;
+ let rec aux = function
+ | (Nvar(_,id),accum) -> list_add_set (id_of_string id) accum
+ | (Node(_,_,tl),accum) -> fold aux tl accum
+ | (Slam(_,None,body),accum) -> aux (body,accum)
+ | (Slam(_,Some id,body),accum) ->
+ aux (body,(list_union accum [(id_of_string id)]))
+ | (_,accum) -> accum
+ in
+ aux(t,[])
let print_id_list l =
[< 'sTR "[" ; prlist (fun id -> [< 'sTR (string_of_id id) >]) l; 'sTR "]" >]
-;;
let typecheck_params_and_field ps fs =
let sign0 = initial_sign() in
@@ -82,89 +74,89 @@ let typecheck_params_and_field ps fs =
List.fold_left
(fun (sign,newps) (id,t) ->
let tj = type_of_com sign t in
- (add_sign (id,tj) sign,(id,tj.body)::newps))
- (sign0,[]) ps in
+ (add_sign (id,tj) sign,(id,tj.body)::newps))
+ (sign0,[]) ps
+ in
let sign2,newfs =
List.fold_left
(fun (sign,newfs) (id,t) ->
let tj = type_of_com sign t in
- (add_sign (id,tj) sign,(id,tj.body)::newfs)) (sign1,[]) fs
- in List.rev(newps),List.rev(newfs)
-;;
-
-
-let mk_LambdaCit = List.fold_right (fun (x,a) b -> mkNamedLambda x a b);;
+ (add_sign (id,tj) sign,(id,tj.body)::newfs)) (sign1,[]) fs
+ in
+ List.rev(newps),List.rev(newfs)
+let mk_LambdaCit = List.fold_right (fun (x,a) b -> mkNamedLambda x a b)
let definition_structure (coe_constr,struc,ps,cfs,const,s) =
-
- let (sign,fsign) = initial_assumptions() in
- let fs = List.map snd cfs in
- let coers = List.map fst cfs in
- let idps = List.map fst ps in
- let typs = List.map snd ps in
- let idfs = List.map fst fs in
- let tyfs = List.map snd fs in
- let _ = if not (free_in_asts struc tyfs)
- then message "Error: A record cannot be recursive" in
- let newps,newfs = typecheck_params_and_field ps fs in
- let app_constructor = ope("APPLIST",
- (ope("XTRA",[str "!";(nvar (string_of_id struc))]))::
- List.map (fun id -> nvar(string_of_id id)) idps) in
- let type_constructor = make_constructor fs app_constructor in
- let _ = build_mutual ps [(struc,s,[(const,type_constructor)])] true in
-
- let x = next_ident_away (id_of_string "x")
- (List.fold_left (fun l ty -> union (all_vars ty) l)
+ let (sign,fsign) = initial_assumptions() in
+ let fs = List.map snd cfs in
+ let coers = List.map fst cfs in
+ let idps = List.map fst ps in
+ let typs = List.map snd ps in
+ let idfs = List.map fst fs in
+ let tyfs = List.map snd fs in
+ if not (free_in_asts struc tyfs) then
+ message "Error: A record cannot be recursive";
+ let newps,newfs = typecheck_params_and_field ps fs in
+ let app_constructor =
+ ope("APPLIST",
+ (ope("XTRA",[str "!";(nvar (string_of_id struc))]))::
+ List.map (fun id -> nvar(string_of_id id)) idps)
+ in
+ let type_constructor = make_constructor fs app_constructor in
+ let _ = build_mutual ps [(struc,s,[(const,type_constructor)])] true in
+ let x = next_ident_away (id_of_string "x")
+ (List.fold_left (fun l ty -> union (all_vars ty) l)
(union idps (fst sign)) tyfs) in
- let r = Machops.global (gLOB sign) struc in
- let (rsp,_,_) = destMutInd r in
- let rid = basename rsp in
- let lp = length idps in
- let rp1 = applist (r,(rel_list 0 lp)) in
- let rp2 = applist (r,(rel_list 1 lp)) in
- let warning_or_error coe st = if coe then (errorlabstrm "structure" st)
- else pPNL [< 'sTR"Warning: "; st >] in
-
- let (sp_projs,_,_,_,_) =
- List.fold_left
- (fun (sp_projs,ids_ok,ids_not_ok,sigma,coes) (fi,ti) ->
- let fv_ti = global_vars ti in
- let bad_projs = (intersect ids_not_ok fv_ti) in
- if bad_projs <> []
- then begin (warning_or_error (hd coes)
- [< 'sTR(string_of_id fi);
- 'sTR" cannot be defined. The projections ";
- print_id_list bad_projs; 'sTR " were not defined" >]);
- (None::sp_projs,ids_ok,fi::ids_not_ok,sigma,(tl coes))
- end
- else
-
- let p = mkNamedLambda x rp2 (replace_vars sigma ti) in
- let branch = mk_LambdaCit newfs (VAR fi) in
- let proj = mk_LambdaCit newps
- (mkNamedLambda x rp1 (mkMutCaseA (ci_of_mind r) p (Rel 1) [|branch|])) in
- let ok = try (Declare.machine_constant (sign,fsign)
- ((fi,false,NeverDischarge),proj); true)
- with UserError(s,pps) ->
- ((warning_or_error (hd coes)
- [<'sTR (string_of_id fi);
- 'sTR" cannot be defined. "; pps >]);false) in
- if not ok
- then (None::sp_projs,ids_ok,fi::ids_not_ok,sigma,(tl coes))
- else begin
- if List.hd coes then
- Class.try_add_new_coercion_record fi NeverDischarge rsp;
- let constr_fi = Machops.global (gLOB sign) fi in
- let constr_fip =
- applist (constr_fi,(List.map (fun id -> VAR id) idps)@[VAR x])
- in (Some(path_of_const constr_fi)::sp_projs,fi::ids_ok,ids_not_ok,
- (fi,{sinfo=Closed;sit=constr_fip})::sigma,(tl coes))
- end)
- ([],[],[],[],coers) newfs
- in (if coe_constr="COERCION"
- then Class.try_add_new_coercion const NeverDischarge);
- add_new_struc (rsp,const,lp,rev sp_projs)
-;;
-
-(* $Id$ *)
+ let r = Machops.global (gLOB sign) struc in
+ let (rsp,_,_) = destMutInd r in
+ let rid = basename rsp in
+ let lp = length idps in
+ let rp1 = applist (r,(rel_list 0 lp)) in
+ let rp2 = applist (r,(rel_list 1 lp)) in
+ let warning_or_error coe st =
+ if coe then errorlabstrm "structure" st;
+ pPNL [< 'sTR"Warning: "; st >]
+ in
+ let (sp_projs,_,_,_,_) =
+ List.fold_left
+ (fun (sp_projs,ids_ok,ids_not_ok,sigma,coes) (fi,ti) ->
+ let fv_ti = global_vars ti in
+ let bad_projs = (intersect ids_not_ok fv_ti) in
+ if bad_projs <> [] then begin
+ (warning_or_error (hd coes)
+ [< 'sTR(string_of_id fi);
+ 'sTR" cannot be defined. The projections ";
+ print_id_list bad_projs; 'sTR " were not defined" >]);
+ (None::sp_projs,ids_ok,fi::ids_not_ok,sigma,(tl coes))
+ end else
+ let p = mkNamedLambda x rp2 (replace_vars sigma ti) in
+ let branch = mk_LambdaCit newfs (VAR fi) in
+ let proj = mk_LambdaCit newps
+ (mkNamedLambda x rp1
+ (mkMutCaseA (ci_of_mind r) p (Rel 1) [|branch|])) in
+ let ok =
+ try
+ (Declare.machine_constant (sign,fsign)
+ ((fi,false,NeverDischarge),proj); true)
+ with UserError(s,pps) ->
+ ((warning_or_error (hd coes)
+ [<'sTR (string_of_id fi);
+ 'sTR" cannot be defined. "; pps >]);false) in
+ if not ok then
+ (None::sp_projs,ids_ok,fi::ids_not_ok,sigma,(tl coes))
+ else begin
+ if List.hd coes then
+ Class.try_add_new_coercion_record fi NeverDischarge rsp;
+ let constr_fi = Machops.global (gLOB sign) fi in
+ let constr_fip =
+ applist (constr_fi,(List.map (fun id -> VAR id) idps)@[VAR x])
+ in (Some(path_of_const constr_fi)::sp_projs,fi::ids_ok,ids_not_ok,
+ (fi,{sinfo=Closed;sit=constr_fip})::sigma,(tl coes))
+ end)
+ ([],[],[],[],coers) newfs
+ in
+ if coe_constr="COERCION" then
+ Class.try_add_new_coercion const NeverDischarge;
+ add_new_struc (rsp,const,lp,rev sp_projs)
+
diff --git a/toplevel/record.mli b/toplevel/record.mli
index 4e0ba6036d..2020a3b26b 100644
--- a/toplevel/record.mli
+++ b/toplevel/record.mli
@@ -1,12 +1,12 @@
(* $Id$ *)
+(*i*)
open Names
open Term
+(*i*)
val definition_structure :
- string * identifier * (identifier * CoqAst.t) list *
- (bool * (identifier * CoqAst.t)) list * identifier *
- CoqAst.t -> unit;;
-
-(* $Id$ *)
+ string * identifier * (identifier * Coqast.t) list *
+ (bool * (identifier * Coqast.t)) list * identifier *
+ Coqast.t -> unit
diff --git a/toplevel/vernacentries.ml b/toplevel/vernacentries.ml
index 20d0a40c12..b19bcabb5a 100644
--- a/toplevel/vernacentries.ml
+++ b/toplevel/vernacentries.ml
@@ -15,6 +15,7 @@ open Reduction
open Pfedit
open Tacmach
open Proof_trees
+open Tacred
open Library
open Libobject
open Environ
@@ -704,7 +705,6 @@ let _ =
'sTR"failed... aborting" >])
| _ -> bad_vernac_args "TheoremProof")
-(***
let _ =
add "DEFINITION"
(function
@@ -739,8 +739,8 @@ let _ =
message ((string_of_id id) ^ " is now a coercion")
end;
if idcoe then
- Class.try_add_new_coercion_subclass stre id;
- if objdef then Recordobj.objdef_declare id
+ Class.try_add_new_coercion_subclass id stre;
+ (***TODO if objdef then Recordobj.objdef_declare id ***)
| _ -> bad_vernac_args "DEFINITION")
let _ =
@@ -772,7 +772,6 @@ let _ =
sl)
slcl
| _ -> bad_vernac_args "VARIABLE")
- ***)
let _ =
add "PARAMETER"
@@ -791,15 +790,14 @@ let _ =
slcl
| _ -> bad_vernac_args "PARAMETER")
-(***
let _ =
add "Eval"
(function
| VARG_TACTIC_ARG (Redexp (rn,unf)) :: VARG_COMMAND c :: g ->
let (evmap,sign) = get_evmap_sign (goal_of_args g) in
let redexp = redexp_of_ast evmap sign (rn,unf) in
- let redfun = print_eval (reduction_of_redexp redexp evmap) sign in
- fun () -> mSG (redfun (fconstruct_with_univ evmap sign c))
+ let redfun = print_eval (reduction_of_redexp redexp) sign in
+ fun () -> mSG (redfun (judgment_of_com evmap sign c))
| _ -> bad_vernac_args "Eval")
let _ =
@@ -812,9 +810,10 @@ let _ =
| "PRINTTYPE" -> print_type
| _ -> anomaly "Unexpected string"
in
- (fun () -> mSG (prfun sign (fconstruct_with_univ evmap sign c)))
+ (fun () -> mSG (prfun sign (judgment_of_com evmap sign c)))
| _ -> bad_vernac_args "Check")
+(***
let _ =
add "PrintExtractId"
(function