aboutsummaryrefslogtreecommitdiffhomepage
path: root/toplevel/command.ml
diff options
context:
space:
mode:
authorGravatar herbelin <herbelin@85f007b7-540e-0410-9357-904b9bb8a0f7>2003-05-21 13:08:55 +0000
committerGravatar herbelin <herbelin@85f007b7-540e-0410-9357-904b9bb8a0f7>2003-05-21 13:08:55 +0000
commit2e3b255c13bae814715dbdee1fea80f107920cee (patch)
tree7e6aa1803261641b6d881cd13eaea7a5889ae61c /toplevel/command.ml
parent4441d0aa206ea1cb3a2bbaa304f7c6a579a7d91d (diff)
Possibilité de syntaxe conjointement à la définition des inductifs et des points-fixes; prise en compte par le traducteur
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@4042 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'toplevel/command.ml')
-rw-r--r--toplevel/command.ml64
1 files changed, 41 insertions, 23 deletions
diff --git a/toplevel/command.ml b/toplevel/command.ml
index d9418f58f..11b697165 100644
--- a/toplevel/command.ml
+++ b/toplevel/command.ml
@@ -219,7 +219,7 @@ let interp_mutual lparams lnamearconstrs finite =
option_app (fun df ->
let larnames =
List.rev_append lparnames
- (List.map fst (fst (decompose_prod ar))) in
+ (List.rev (List.map fst (fst (decompose_prod ar)))) in
(recname,larnames,df)) ntnopt)
lnamearconstrs arityl in
let fs = States.freeze() in
@@ -227,7 +227,7 @@ let interp_mutual lparams lnamearconstrs finite =
try
List.iter (option_iter (fun (recname,larnames,(df,scope)) ->
Metasyntax.add_notation_interpretation df
- (AVar recname,larnames) scope)) notations;
+ (AVar recname,larnames) (* no scope for tmp ntn *) scope)) notations;
let ind_env_params = push_rel_context params ind_env in
let mispecvec =
List.map2
@@ -332,33 +332,49 @@ let collect_non_rec env =
searchrec []
let build_recursive lnameargsardef =
- let lrecnames = List.map (fun (f,_,_,_) -> f) lnameargsardef
+ let lrecnames = List.map (fun ((f,_,_,_),_) -> f) lnameargsardef
and sigma = Evd.empty
and env0 = Global.env()
- and nv = Array.of_list (List.map (fun (_,n,_,_) -> n) lnameargsardef) in
+ and nv = Array.of_list (List.map (fun ((_,n,_,_),_) -> n) lnameargsardef) in
let fs = States.freeze() in
+ (* Declare the notations for the inductive types pushed in local context*)
let (rec_sign,arityl) =
- try
- List.fold_left
- (fun (env,arl) (recname,_,arityc,_) ->
- let arity = interp_type sigma env0 arityc in
- let _ = declare_variable recname
- (Lib.cwd(),SectionLocalAssum arity, IsAssumption Definitional) in
- (Environ.push_named (recname,None,arity) env, (arity::arl)))
- (env0,[]) lnameargsardef
- with e ->
- States.unfreeze fs; raise e in
+ List.fold_left
+ (fun (env,arl) ((recname,_,arityc,_),_) ->
+ let arity = interp_type sigma env0 arityc in
+ (Environ.push_named (recname,None,arity) env, (arity::arl)))
+ (env0,[]) lnameargsardef in
let arityl = List.rev arityl in
+ let notations =
+ List.map2 (fun ((recname,_,_,_),ntnopt) arityl ->
+ option_app (fun ntn ->
+ let larnames = List.map fst (fst (decompose_prod arityl)) in
+ (recname,List.rev larnames,ntn)) ntnopt)
+ lnameargsardef arityl in
+
let recdef =
- try
- List.map2
- (fun (_,_,_,def) arity ->
- interp_casted_constr sigma rec_sign def arity)
- lnameargsardef arityl
- with e ->
- States.unfreeze fs; raise e
+
+ (* Declare local context and local notations *)
+ let fs = States.freeze() in
+ let def =
+ try
+ List.iter (option_iter (fun (recname,larnames,(df,scope)) ->
+ Metasyntax.add_notation_interpretation df
+ (AVar recname,larnames) (* no scope for tmp ntn *) None)) notations;
+ List.iter2
+ (fun recname arity ->
+ let _ = declare_variable recname
+ (Lib.cwd(),SectionLocalAssum arity, IsAssumption Definitional) in
+ ()) lrecnames arityl;
+ List.map2
+ (fun ((_,_,_,def),_) arity ->
+ interp_casted_constr sigma rec_sign def arity)
+ lnameargsardef arityl
+ with e ->
+ States.unfreeze fs; raise e in
+ States.unfreeze fs; def
in
- States.unfreeze fs;
+
let (lnonrec,(namerec,defrec,arrec,nvrec)) =
collect_non_rec env0 lrecnames recdef arityl (Array.to_list nv) in
let recvec =
@@ -389,7 +405,9 @@ let build_recursive lnameargsardef =
(List.map var_subst (Array.to_list namerec))
lnonrec
in
- ()
+ List.iter (option_iter (fun (recname,names,(df,scope)) ->
+ Metasyntax.add_notation_interpretation df
+ (ARef (ConstRef (Lib.make_kn recname)),names) scope)) notations
let build_corecursive lnameardef =
let lrecnames = List.map (fun (f,_,_) -> f) lnameardef