aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.build6
-rw-r--r--Makefile.common6
-rw-r--r--checker/checkInductive.ml29
-rw-r--r--checker/values.ml2
-rwxr-xr-xdev/ci/ci-basic-overlay.sh7
-rw-r--r--doc/changelog/03-notations/11240-rew-dependent.rst5
-rw-r--r--doc/changelog/05-tactic-language/10343-issue-10342-ltac2-standard-library.rst4
-rw-r--r--doc/changelog/08-tools/11523-coqdep+refactor2.rst7
-rw-r--r--doc/changelog/09-coqide/11414-remove-ide-tactic-menu.rst4
-rw-r--r--doc/changelog/10-standard-library/11404-removeRList.rst15
-rw-r--r--doc/stdlib/index-list.html.template1
-rw-r--r--dune6
-rw-r--r--ide/coq_commands.ml195
-rw-r--r--ide/coq_commands.mli1
-rw-r--r--ide/coqide.ml9
-rw-r--r--ide/coqide_ui.ml4
-rw-r--r--ide/preferences.ml10
-rw-r--r--ide/preferences.mli1
-rw-r--r--kernel/context.ml8
-rw-r--r--kernel/context.mli2
-rw-r--r--kernel/cooking.ml4
-rw-r--r--kernel/declarations.ml1
-rw-r--r--kernel/declareops.ml3
-rw-r--r--kernel/indTyping.ml16
-rw-r--r--kernel/safe_typing.ml10
-rw-r--r--kernel/safe_typing.mli4
-rw-r--r--kernel/type_errors.ml7
-rw-r--r--kernel/type_errors.mli12
-rw-r--r--library/global.mli4
-rw-r--r--man/coqdep.131
-rw-r--r--plugins/cc/ccalgo.ml36
-rw-r--r--plugins/cc/cctac.ml28
-rw-r--r--plugins/firstorder/g_ground.mlg2
-rw-r--r--plugins/firstorder/instances.ml33
-rw-r--r--plugins/firstorder/sequent.ml36
-rw-r--r--plugins/funind/functional_principles_proofs.ml58
-rw-r--r--plugins/funind/gen_principle.ml10
-rw-r--r--plugins/funind/glob_term_to_relation.ml19
-rw-r--r--plugins/funind/indfun.ml21
-rw-r--r--plugins/funind/indfun_common.ml4
-rw-r--r--plugins/funind/indfun_common.mli2
-rw-r--r--plugins/funind/invfun.ml6
-rw-r--r--plugins/funind/recdef.ml32
-rw-r--r--plugins/ltac/extratactics.mlg4
-rw-r--r--plugins/ltac/rewrite.ml15
-rw-r--r--plugins/omega/coq_omega.ml3
-rw-r--r--pretyping/cases.ml2
-rw-r--r--pretyping/evarsolve.ml66
-rw-r--r--pretyping/pretyping.ml2
-rw-r--r--pretyping/reductionops.ml37
-rw-r--r--pretyping/tacred.ml2
-rw-r--r--pretyping/typing.ml3
-rw-r--r--pretyping/typing.mli3
-rw-r--r--pretyping/unification.ml10
-rw-r--r--proofs/clenv.ml2
-rw-r--r--proofs/clenv.mli1
-rw-r--r--proofs/logic.ml8
-rw-r--r--tactics/autorewrite.ml4
-rw-r--r--tactics/class_tactics.ml5
-rw-r--r--tactics/contradiction.ml3
-rw-r--r--tactics/declare.ml74
-rw-r--r--tactics/eauto.ml8
-rw-r--r--tactics/elim.ml9
-rw-r--r--tactics/eqdecide.ml15
-rw-r--r--tactics/equality.ml66
-rw-r--r--tactics/hints.ml18
-rw-r--r--tactics/hints.mli2
-rw-r--r--tactics/hipattern.ml19
-rw-r--r--tactics/hipattern.mli4
-rw-r--r--tactics/inv.ml2
-rw-r--r--tactics/leminv.ml2
-rw-r--r--tactics/tacticals.ml6
-rw-r--r--tactics/tacticals.mli2
-rw-r--r--tactics/tactics.ml304
-rw-r--r--test-suite/bugs/closed/bug_11515.v7
-rw-r--r--test-suite/bugs/closed/bug_11553.v34
-rw-r--r--test-suite/ltac2/array_lib.v181
-rw-r--r--test-suite/output/Notations.out68
-rw-r--r--test-suite/output/Notations.v62
-rw-r--r--test-suite/output/Notations4.out8
-rw-r--r--test-suite/output/Notations4.v26
-rw-r--r--test-suite/success/CompatOldOldFlag.v6
-rwxr-xr-xtest-suite/tools/update-compat/run.sh2
-rw-r--r--theories/Compat/Coq89.v19
-rw-r--r--theories/Init/Logic.v59
-rw-r--r--theories/Reals/RList.v496
-rw-r--r--theories/Reals/RiemannInt.v38
-rw-r--r--theories/Reals/RiemannInt_SF.v342
-rw-r--r--theories/Reals/Rtopology.v20
-rw-r--r--tools/coqdep.ml412
-rw-r--r--tools/coqdep_boot.ml17
-rw-r--r--tools/coqdep_common.ml27
-rw-r--r--tools/coqdep_common.mli1
-rw-r--r--toplevel/coqargs.ml3
-rw-r--r--user-contrib/Ltac2/Array.v211
-rw-r--r--user-contrib/Ltac2/tac2core.ml26
-rw-r--r--user-contrib/Ltac2/tac2tactics.ml1
-rw-r--r--vernac/auto_ind_decl.ml4
-rw-r--r--vernac/comCoercion.ml7
-rw-r--r--vernac/comProgramFixpoint.ml2
-rw-r--r--vernac/himsg.ml10
-rw-r--r--vernac/metasyntax.ml61
102 files changed, 1812 insertions, 1740 deletions
diff --git a/Makefile.build b/Makefile.build
index a8ae040f8e..3c32e5bcc2 100644
--- a/Makefile.build
+++ b/Makefile.build
@@ -417,7 +417,7 @@ $(COQTOPBYTE): $(COQTOP_BYTE) $(LINKCMO) $(LIBCOQRUN)
###########################################################################
.PHONY: tools
-tools: $(TOOLS) $(OCAMLLIBDEP) $(COQDEPBOOT)
+tools: $(TOOLS) $(OCAMLLIBDEP) $(COQDEPBOOT) $(DOC_GRAM)
# coqdep_boot : a basic version of coqdep, with almost no dependencies.
# We state these dependencies here explicitly, since some .ml.d files
@@ -865,9 +865,11 @@ endif
# Dependencies of .v files
+PLUGININCLUDES=$(addprefix -I plugins/, $(PLUGINDIRS))
+
$(VDFILE).d: $(D_DEPEND_BEFORE_SRC) $(VFILES) $(D_DEPEND_AFTER_SRC) $(COQDEPBOOT)
$(SHOW)'COQDEP VFILES'
- $(HIDE)$(COQDEPBOOT) -vos -boot $(DYNDEP) -Q user-contrib "" $(USERCONTRIBINCLUDES) $(VFILES) $(TOTARGET)
+ $(HIDE)$(COQDEPBOOT) -vos -boot $(DYNDEP) -R theories Coq -R plugins Coq -Q user-contrib "" $(PLUGININCLUDES) $(USERCONTRIBINCLUDES) $(VFILES) $(TOTARGET)
###########################################################################
diff --git a/Makefile.common b/Makefile.common
index e392e51153..32bf19e99c 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -43,8 +43,9 @@ COQMAKE_BOTH_TIME_FILES:=tools/make-both-time-files.py
COQMAKE_BOTH_SINGLE_TIMING_FILES:=tools/make-both-single-timing-files.py
VOTOUR:=bin/votour
+# these get installed!
TOOLS:=$(COQDEP) $(COQMAKEFILE) $(COQTEX) $(COQWC) $(COQDOC) $(COQC)\
- $(COQWORKMGR) $(COQPP) $(DOC_GRAM) $(VOTOUR)
+ $(COQWORKMGR) $(COQPP) $(VOTOUR)
TOOLS_HELPERS:=tools/CoqMakefile.in $(COQMAKE_ONE_TIME_FILE) $(COQTIME_FILE_MAKER)\
$(COQMAKE_BOTH_TIME_FILES) $(COQMAKE_BOTH_SINGLE_TIMING_FILES)
@@ -55,7 +56,8 @@ OCAMLLIBDEPBYTE:=bin/ocamllibdep.byte$(EXE)
FAKEIDE:=bin/fake_ide$(EXE)
FAKEIDEBYTE:=bin/fake_ide.byte$(EXE)
-PRIVATEBINARIES:=$(FAKEIDE) $(OCAMLLIBDEP) $(COQDEPBOOT)
+# These don't get signed on OSX, and don't need to be separately listed for cleaning
+PRIVATEBINARIES:=$(FAKEIDE) $(OCAMLLIBDEP) $(COQDEPBOOT) $(DOC_GRAM)
CSDPCERT:=plugins/micromega/csdpcert$(EXE)
CSDPCERTBYTE:=plugins/micromega/csdpcert.byte$(EXE)
diff --git a/checker/checkInductive.ml b/checker/checkInductive.ml
index a2cf44389e..051f51bbb3 100644
--- a/checker/checkInductive.ml
+++ b/checker/checkInductive.ml
@@ -20,7 +20,7 @@ exception InductiveMismatch of MutInd.t * string
let check mind field b = if not b then raise (InductiveMismatch (mind,field))
-let to_entry (mb:mutual_inductive_body) : Entries.mutual_inductive_entry =
+let to_entry mind (mb:mutual_inductive_body) : Entries.mutual_inductive_entry =
let open Entries in
let nparams = List.length mb.mind_params_ctxt in (* include letins *)
let mind_entry_record = match mb.mind_record with
@@ -28,7 +28,27 @@ let to_entry (mb:mutual_inductive_body) : Entries.mutual_inductive_entry =
| PrimRecord data -> Some (Some (Array.map (fun (x,_,_,_) -> x) data))
in
let mind_entry_universes = match mb.mind_universes with
- | Monomorphic univs -> Monomorphic_entry univs
+ | Monomorphic _ ->
+ (* We only need to rebuild the set of constraints for template polymorphic
+ inductive types. The set of monomorphic constraints is already part of
+ the graph at that point, but we need to emulate a broken bound variable
+ mechanism for template inductive types. *)
+ let fold accu ind = match ind.mind_arity with
+ | RegularArity _ -> accu
+ | TemplateArity ar ->
+ match accu with
+ | None -> Some ar.template_context
+ | Some ctx ->
+ (* Ensure that all template contexts agree. This is enforced by the
+ kernel. *)
+ let () = check mind "mind_arity" (ContextSet.equal ctx ar.template_context) in
+ Some ctx
+ in
+ let univs = match Array.fold_left fold None mb.mind_packets with
+ | None -> ContextSet.empty
+ | Some ctx -> ctx
+ in
+ Monomorphic_entry univs
| Polymorphic auctx -> Polymorphic_entry (AUContext.names auctx, AUContext.repr auctx)
in
let mind_entry_inds = Array.map_to_list (fun ind ->
@@ -69,8 +89,9 @@ let check_arity env ar1 ar2 = match ar1, ar2 with
| RegularArity ar, RegularArity {mind_user_arity;mind_sort} ->
Constr.equal ar.mind_user_arity mind_user_arity &&
Sorts.equal ar.mind_sort mind_sort
- | TemplateArity ar, TemplateArity {template_param_levels;template_level} ->
+ | TemplateArity ar, TemplateArity {template_param_levels;template_level;template_context} ->
List.equal (Option.equal Univ.Level.equal) ar.template_param_levels template_param_levels &&
+ ContextSet.equal template_context ar.template_context &&
UGraph.check_leq (universes env) template_level ar.template_level
(* template_level is inferred by indtypes, so functor application can produce a smaller one *)
| (RegularArity _ | TemplateArity _), _ -> assert false
@@ -136,7 +157,7 @@ let check_same_record r1 r2 = match r1, r2 with
| (NotRecord | FakeRecord | PrimRecord _), _ -> false
let check_inductive env mind mb =
- let entry = to_entry mb in
+ let entry = to_entry mind mb in
let { mind_packets; mind_record; mind_finite; mind_ntypes; mind_hyps;
mind_nparams; mind_nparams_rec; mind_params_ctxt;
mind_universes; mind_variance; mind_sec_variance;
diff --git a/checker/values.ml b/checker/values.ml
index fff166f27b..c8bbc092b4 100644
--- a/checker/values.ml
+++ b/checker/values.ml
@@ -228,7 +228,7 @@ let v_oracle =
|]
let v_pol_arity =
- v_tuple "polymorphic_arity" [|List(Opt v_level);v_univ|]
+ v_tuple "polymorphic_arity" [|List(Opt v_level);v_univ;v_context_set|]
let v_primitive =
v_enum "primitive" 44 (* Number of "Primitive" in Int63.v and PrimFloat.v *)
diff --git a/dev/ci/ci-basic-overlay.sh b/dev/ci/ci-basic-overlay.sh
index 7342bc72e7..608cc127a0 100755
--- a/dev/ci/ci-basic-overlay.sh
+++ b/dev/ci/ci-basic-overlay.sh
@@ -97,11 +97,8 @@
########################################################################
# Coquelicot
########################################################################
-# Modified until https://gitlab.inria.fr/coquelicot/coquelicot/merge_requests/2 is merged
-: "${coquelicot_CI_REF:=fix-rlist-import}"
-: "${coquelicot_CI_GITURL:=https://gitlab.inria.fr/pedrot/coquelicot}"
-# : "${coquelicot_CI_REF:=master}"
-# : "${coquelicot_CI_GITURL:=https://gitlab.inria.fr/coquelicot/coquelicot}"
+: "${coquelicot_CI_REF:=master}"
+: "${coquelicot_CI_GITURL:=https://gitlab.inria.fr/coquelicot/coquelicot}"
: "${coquelicot_CI_ARCHIVEURL:=${coquelicot_CI_GITURL}/-/archive}"
########################################################################
diff --git a/doc/changelog/03-notations/11240-rew-dependent.rst b/doc/changelog/03-notations/11240-rew-dependent.rst
new file mode 100644
index 0000000000..e9daab0c2c
--- /dev/null
+++ b/doc/changelog/03-notations/11240-rew-dependent.rst
@@ -0,0 +1,5 @@
+- **Added**
+ Added :g:`rew dependent` notations for the dependent version of
+ :g:`rew` in :g:`Coq.Init.Logic.EqNotations` to improve the display
+ and parsing of :g:`match` statements on :g:`Logic.eq` (`#11240
+ <https://github.com/coq/coq/pull/11240>`_, by Jason Gross).
diff --git a/doc/changelog/05-tactic-language/10343-issue-10342-ltac2-standard-library.rst b/doc/changelog/05-tactic-language/10343-issue-10342-ltac2-standard-library.rst
new file mode 100644
index 0000000000..4acc423d10
--- /dev/null
+++ b/doc/changelog/05-tactic-language/10343-issue-10342-ltac2-standard-library.rst
@@ -0,0 +1,4 @@
+- **Added:**
+ An array library for ltac2 (OCaml standard library compatible where possible).
+ (`#10343 <https://github.com/coq/coq/pull/10343>`_,
+ by Michael Soegtrop).
diff --git a/doc/changelog/08-tools/11523-coqdep+refactor2.rst b/doc/changelog/08-tools/11523-coqdep+refactor2.rst
new file mode 100644
index 0000000000..90c23d8b76
--- /dev/null
+++ b/doc/changelog/08-tools/11523-coqdep+refactor2.rst
@@ -0,0 +1,7 @@
+- **Changed:**
+ Internal options and behavior of ``coqdep`` have changed, in particular
+ options ``-w``, ``-D``, ``-mldep``, and ``-dumpbox`` have been removed,
+ and ``-boot`` will not load any path by default, ``-R/-Q`` should be
+ used instead
+ (`#11523 <https://github.com/coq/coq/pull/11523>`_,
+ by Emilio Jesus Gallego Arias).
diff --git a/doc/changelog/09-coqide/11414-remove-ide-tactic-menu.rst b/doc/changelog/09-coqide/11414-remove-ide-tactic-menu.rst
new file mode 100644
index 0000000000..6294cdb24a
--- /dev/null
+++ b/doc/changelog/09-coqide/11414-remove-ide-tactic-menu.rst
@@ -0,0 +1,4 @@
+- **Removed:**
+ Removed the "Tactic" menu from CoqIDE which had been unmaintained for a number of years
+ (`#11414 <https://github.com/coq/coq/pull/11414>`_,
+ by Pierre-Marie Pédrot).
diff --git a/doc/changelog/10-standard-library/11404-removeRList.rst b/doc/changelog/10-standard-library/11404-removeRList.rst
new file mode 100644
index 0000000000..88e22d128c
--- /dev/null
+++ b/doc/changelog/10-standard-library/11404-removeRList.rst
@@ -0,0 +1,15 @@
+- **Removed:**
+ Type `RList` has been removed. All uses have been replaced by `list R`.
+ Functions from `RList` named `In`, `Rlength`, `cons_Rlist`, `app_Rlist`
+ have also been removed as they are essentially the same as `In`, `length`,
+ `app`, and `map` from `List`, modulo the following changes:
+
+ - `RList.In x (RList.cons a l)` used to be convertible to
+ `(x = a) \\/ RList.In x l`,
+ but `List.In x (a :: l)` is convertible to
+ `(a = x) \\/ List.In l`.
+ The equality is reversed.
+ - `app_Rlist` and `List.map` take arguments in different order.
+
+ (`#11404 <https://github.com/coq/coq/pull/11404>`_,
+ by Yves Bertot).
diff --git a/doc/stdlib/index-list.html.template b/doc/stdlib/index-list.html.template
index 5e13214a1a..b2ddf36b65 100644
--- a/doc/stdlib/index-list.html.template
+++ b/doc/stdlib/index-list.html.template
@@ -664,7 +664,6 @@ through the <tt>Require Import</tt> command.</p>
</dt>
<dd>
theories/Compat/AdmitAxiom.v
- theories/Compat/Coq89.v
theories/Compat/Coq810.v
theories/Compat/Coq811.v
theories/Compat/Coq812.v
diff --git a/dune b/dune
index 832c864fc3..c91f824f3b 100644
--- a/dune
+++ b/dune
@@ -25,7 +25,11 @@
(source_tree theories)
(source_tree plugins)
(source_tree user-contrib))
- (action (with-stdout-to .vfiles.d (bash "%{bin:coqdep} -dyndep both -noglob -boot `find theories plugins user-contrib -type f -name *.v`"))))
+ (action
+ (with-stdout-to .vfiles.d
+ (bash "%{bin:coqdep} -dyndep both -noglob -boot -R theories Coq -R plugins Coq -Q user-contrib/Ltac2 Ltac2 -I user-contrib/Ltac2 \
+ `find plugins/ -maxdepth 1 -mindepth 1 -type d -printf '-I %p '` \
+ `find theories plugins user-contrib -type f -name *.v`"))))
(alias
(name vodeps)
diff --git a/ide/coq_commands.ml b/ide/coq_commands.ml
index bfd99e7ce3..5b9ea17ba7 100644
--- a/ide/coq_commands.ml
+++ b/ide/coq_commands.ml
@@ -228,198 +228,3 @@ let state_preserving = [
"Test Printing Wildcard";
]
-
-
-let tactics =
- [
- [
- "abstract";
- "absurd";
- "apply";
- "apply __ with";
- "assert";
- "assert (__:__)";
- "assert (__:=__)";
- "assumption";
- "auto";
- "auto with";
- "autorewrite";
- ];
-
- [
- "case";
- "case __ with";
- "casetype";
- "cbv";
- "cbv in";
- "change";
- "change __ in";
- "clear";
- "clearbody";
- "cofix";
- "compare";
- "compute";
- "compute in";
- "congruence";
- "constructor";
- "constructor __ with";
- "contradiction";
- "cut";
- "cutrewrite";
- ];
-
- [
- "decide equality";
- "decompose";
- "decompose record";
- "decompose sum";
- "dependent inversion";
- "dependent inversion __ with";
- "dependent inversion__clear";
- "dependent inversion__clear __ with";
- "dependent rewrite ->";
- "dependent rewrite <-";
- "destruct";
- "discriminate";
- "do";
- "double induction";
- ];
-
- [
- "eapply";
- "eauto";
- "eauto with";
- "eexact";
- "elim";
- "elim __ using";
- "elim __ with";
- "elimtype";
- "exact";
- "exists";
- ];
-
- [
- "fail";
- "field";
- "first";
- "firstorder";
- "firstorder using";
- "firstorder with";
- "fix";
- "fix __ with";
- "fold";
- "fold __ in";
- "functional induction";
- ];
-
- [
- "generalize";
- "generalize dependent";
- ];
-
- [
- "hnf";
- ];
-
- [
- "idtac";
- "induction";
- "info";
- "injection";
- "instantiate (__:=__)";
- "intro";
- "intro after";
- "intro __ after";
- "intros";
- "intros until";
- "intuition";
- "inversion";
- "inversion __ in";
- "inversion __ using";
- "inversion __ using __ in";
- "inversion__clear";
- "inversion__clear __ in";
- ];
-
- [
- "jp <n>";
- "jp";
- ];
-
- [
- "lapply";
- "lazy";
- "lazy in";
- "left";
- ];
-
- [
- "move __ after";
- ];
-
- [
- "omega";
- ];
-
- [
- "pattern";
- "pose";
- "pose __:=__)";
- "progress";
- ];
-
- [
- "quote";
- ];
-
- [
- "red";
- "red in";
- "refine";
- "reflexivity";
- "rename __ into";
- "repeat";
- "replace __ with";
- "rewrite";
- "rewrite __ in";
- "rewrite <-";
- "rewrite <- __ in";
- "right";
- "ring";
- ];
-
- [
- "set";
- "set (__:=__)";
- "setoid__replace";
- "setoid__rewrite";
- "simpl";
- "simpl __ in";
- "simple destruct";
- "simple induction";
- "simple inversion";
- "simplify__eq";
- "solve";
- "split";
-(* "split__Rabs";
- "split__Rmult";
-*)
- "subst";
- "symmetry";
- "symmetry in";
- ];
-
- [
- "tauto";
- "transitivity";
- "trivial";
- "try";
- ];
-
- [
- "unfold";
- "unfold __ in";
- ];
-]
-
-
diff --git a/ide/coq_commands.mli b/ide/coq_commands.mli
index 5f8ce30901..c8c11f77af 100644
--- a/ide/coq_commands.mli
+++ b/ide/coq_commands.mli
@@ -8,6 +8,5 @@
(* * (see LICENSE file for the text of the license) *)
(************************************************************************)
-val tactics : string list list
val commands : string list list
val state_preserving : string list
diff --git a/ide/coqide.ml b/ide/coqide.ml
index e0347d3c5f..ccf6d40b2b 100644
--- a/ide/coqide.ml
+++ b/ide/coqide.ml
@@ -977,7 +977,6 @@ let build_ui () =
let view_menu = GAction.action_group ~name:"View" () in
let export_menu = GAction.action_group ~name:"Export" () in
let navigation_menu = GAction.action_group ~name:"Navigation" () in
- let tactics_menu = GAction.action_group ~name:"Tactics" () in
let templates_menu = GAction.action_group ~name:"Templates" () in
let tools_menu = GAction.action_group ~name:"Tools" () in
let queries_menu = GAction.action_group ~name:"Queries" () in
@@ -985,7 +984,7 @@ let build_ui () =
let windows_menu = GAction.action_group ~name:"Windows" () in
let help_menu = GAction.action_group ~name:"Help" () in
let all_menus = [
- file_menu; edit_menu; view_menu; export_menu; navigation_menu; tactics_menu;
+ file_menu; edit_menu; view_menu; export_menu; navigation_menu;
templates_menu; tools_menu; queries_menu; compile_menu; windows_menu;
help_menu; ] in
@@ -1119,11 +1118,6 @@ let build_ui () =
("Force", "_Force", `EXECUTE, Nav.join_document, "Fully check the document", "f");
] end;
- menu tactics_menu [
- item "Tactics" ~label:"_Tactics";
- ];
- alpha_items tactics_menu "Tactic" Coq_commands.tactics;
-
menu templates_menu [
item "Templates" ~label:"Te_mplates";
template_item ("Lemma new_lemma : .\nProof.\n\nQed.\n", 6,9, "J");
@@ -1207,7 +1201,6 @@ let build_ui () =
Coqide_ui.ui_m#insert_action_group edit_menu 0;
Coqide_ui.ui_m#insert_action_group view_menu 0;
Coqide_ui.ui_m#insert_action_group navigation_menu 0;
- Coqide_ui.ui_m#insert_action_group tactics_menu 0;
Coqide_ui.ui_m#insert_action_group templates_menu 0;
Coqide_ui.ui_m#insert_action_group tools_menu 0;
Coqide_ui.ui_m#insert_action_group queries_menu 0;
diff --git a/ide/coqide_ui.ml b/ide/coqide_ui.ml
index 59dd9c0e4c..f22821c6ea 100644
--- a/ide/coqide_ui.ml
+++ b/ide/coqide_ui.ml
@@ -99,9 +99,6 @@ let init () =
\n <menuitem action='Previous' />\
\n <menuitem action='Next' />\
\n </menu>\
-\n <menu action='Tactics'>\
-\n %s\
-\n </menu>\
\n <menu action='Templates'>\
\n <menuitem action='Lemma' />\
\n <menuitem action='Theorem' />\
@@ -164,7 +161,6 @@ let init () =
\n</toolbar>\
\n</ui>"
(if Coq_config.gtk_platform <> `QUARTZ then "<menuitem action='Quit' />" else "")
- (Buffer.contents (list_items "Tactic" Coq_commands.tactics))
(Buffer.contents (list_items "Template" Coq_commands.commands))
(Buffer.contents (list_queries "User-Query" Preferences.user_queries#get))
in
diff --git a/ide/preferences.ml b/ide/preferences.ml
index d3cf08e90e..af1759b0bb 100644
--- a/ide/preferences.ml
+++ b/ide/preferences.ml
@@ -331,10 +331,6 @@ let modifier_for_navigation =
let modifier_for_templates =
new preference ~name:["modifier_for_templates"] ~init:"<Control><Shift>" ~repr:Repr.(string)
-let modifier_for_tactics =
- new preference ~name:["modifier_for_tactics"]
- ~init:(select_arch "<Control><Alt>" "<Control><Primary>") ~repr:Repr.(string)
-
let modifier_for_display =
new preference ~name:["modifier_for_display"]
~init:(select_arch "<Alt><Shift>" "<Primary><Shift>")~repr:Repr.(string)
@@ -347,7 +343,6 @@ let attach_modifiers_callback () =
(* To be done after the preferences are loaded *)
let _ = attach_modifiers modifier_for_navigation "<Actions>/Navigation/" in
let _ = attach_modifiers modifier_for_templates "<Actions>/Templates/" in
- let _ = attach_modifiers modifier_for_tactics "<Actions>/Tactics/" in
let _ = attach_modifiers modifier_for_display "<Actions>/View/" in
let _ = attach_modifiers modifier_for_queries "<Actions>/Queries/" in
()
@@ -951,9 +946,6 @@ let configure ?(apply=(fun () -> ())) parent =
(string_of_project_behavior read_project#get)
in
let project_file_name = pstring "Default name for project file" project_file_name in
- let modifier_for_tactics =
- pmodifiers "Global change of modifiers for Tactics Menu" modifier_for_tactics
- in
let modifier_for_templates =
pmodifiers "Global change of modifiers for Templates Menu" modifier_for_templates
in
@@ -1056,7 +1048,7 @@ let configure ?(apply=(fun () -> ())) parent =
[cmd_coqtop;cmd_coqc;cmd_make;cmd_coqmakefile; cmd_coqdoc;
cmd_print;cmd_editor;cmd_browse]);
Section("Shortcuts", Some `PREFERENCES,
- [modifiers_valid; modifier_for_tactics;
+ [modifiers_valid;
modifier_for_templates; modifier_for_display; modifier_for_navigation;
modifier_for_queries (*; user_queries *)]);
Section("Misc", Some `ADD,
diff --git a/ide/preferences.mli b/ide/preferences.mli
index 7b43079b4f..754f15c575 100644
--- a/ide/preferences.mli
+++ b/ide/preferences.mli
@@ -71,7 +71,6 @@ val automatic_tactics : string list preference
val cmd_print : string preference
val modifier_for_navigation : string preference
val modifier_for_templates : string preference
-val modifier_for_tactics : string preference
val modifier_for_display : string preference
val modifier_for_queries : string preference
val modifiers_valid : string preference
diff --git a/kernel/context.ml b/kernel/context.ml
index 7e394da2ed..500ed20343 100644
--- a/kernel/context.ml
+++ b/kernel/context.ml
@@ -196,12 +196,10 @@ struct
(** Return a new rel-context enriched by with a given inner-most declaration. *)
let add d ctx = d :: ctx
- (** Return the number of {e local declarations} in a given context. *)
+ (** Return the number of {e local declarations} in a given rel-context. *)
let length = List.length
- (** [extended_rel_list n Γ] builds an instance [args] such that [Γ,Δ ⊢ args:Γ]
- with n = |Δ| and with the local definitions of [Γ] skipped in
- [args]. Example: for [x:T,y:=c,z:U] and [n]=2, it gives [Rel 5, Rel 3]. *)
+ (** Return the number of {e local assumptions} in a given rel-context. *)
let nhyps ctx =
let open Declaration in
let rec nhyps acc = function
@@ -413,7 +411,7 @@ struct
(** empty named-context *)
let empty = []
- (** empty named-context *)
+ (** Return a new named-context enriched by with a given inner-most declaration. *)
let add d ctx = d :: ctx
(** Return the number of {e local declarations} in a given named-context. *)
diff --git a/kernel/context.mli b/kernel/context.mli
index 8f233613da..04aa039a01 100644
--- a/kernel/context.mli
+++ b/kernel/context.mli
@@ -129,7 +129,7 @@ sig
(** Return a new rel-context enriched by with a given inner-most declaration. *)
val add : ('c, 't) Declaration.pt -> ('c, 't) pt -> ('c, 't) pt
- (** Return the number of {e local declarations} in a given context. *)
+ (** Return the number of {e local declarations} in a given rel-context. *)
val length : ('c, 't) pt -> int
(** Check whether given two rel-contexts are equal. *)
diff --git a/kernel/cooking.ml b/kernel/cooking.ml
index cebbfe4986..f1eb000c88 100644
--- a/kernel/cooking.ml
+++ b/kernel/cooking.ml
@@ -312,14 +312,14 @@ let cook_one_ind ~template_check ~ntypes
let arity = abstract_as_type (expmod arity) hyps in
let sort = destSort (expmod (mkSort sort)) in
RegularArity {mind_user_arity=arity; mind_sort=sort}
- | TemplateArity {template_param_levels=levels;template_level} ->
+ | TemplateArity {template_param_levels=levels;template_level;template_context} ->
let sec_levels = CList.map_filter (fun d ->
if RelDecl.is_local_assum d then Some (template_level_of_var ~template_check d)
else None)
section_decls
in
let levels = List.rev_append sec_levels levels in
- TemplateArity {template_param_levels=levels;template_level}
+ TemplateArity {template_param_levels=levels;template_level;template_context}
in
let mind_arity_ctxt =
let ctx = Context.Rel.map expmod mip.mind_arity_ctxt in
diff --git a/kernel/declarations.ml b/kernel/declarations.ml
index 0b6e59bd5e..c550b0d432 100644
--- a/kernel/declarations.ml
+++ b/kernel/declarations.ml
@@ -32,6 +32,7 @@ type engagement = set_predicativity
type template_arity = {
template_param_levels : Univ.Level.t option list;
template_level : Univ.Universe.t;
+ template_context : Univ.ContextSet.t;
}
type ('a, 'b) declaration_arity =
diff --git a/kernel/declareops.ml b/kernel/declareops.ml
index 27e3f84464..047027984d 100644
--- a/kernel/declareops.ml
+++ b/kernel/declareops.ml
@@ -49,7 +49,8 @@ let map_decl_arity f g = function
let hcons_template_arity ar =
{ template_param_levels = ar.template_param_levels;
(* List.Smart.map (Option.Smart.map Univ.hcons_univ_level) ar.template_param_levels; *)
- template_level = Univ.hcons_univ ar.template_level }
+ template_level = Univ.hcons_univ ar.template_level;
+ template_context = Univ.hcons_universe_context_set ar.template_context }
let universes_context = function
| Monomorphic _ -> Univ.AUContext.empty
diff --git a/kernel/indTyping.ml b/kernel/indTyping.ml
index 591cd050a5..113ee787f2 100644
--- a/kernel/indTyping.ml
+++ b/kernel/indTyping.ml
@@ -66,7 +66,9 @@ let mind_check_names mie =
type univ_info = { ind_squashed : bool; ind_has_relevant_arg : bool;
ind_min_univ : Universe.t option; (* Some for template *)
- ind_univ : Universe.t }
+ ind_univ : Universe.t;
+ missing : Universe.Set.t; (* missing u <= ind_univ constraints *)
+ }
let check_univ_leq ?(is_real_arg=false) env u info =
let ind_univ = info.ind_univ in
@@ -78,9 +80,8 @@ let check_univ_leq ?(is_real_arg=false) env u info =
if type_in_type env || Univ.Universe.is_sprop u || UGraph.check_leq (universes env) u ind_univ
then { info with ind_min_univ = Option.map (Universe.sup u) info.ind_min_univ }
else if is_impredicative_univ env ind_univ
- then if Option.is_empty info.ind_min_univ then { info with ind_squashed = true }
- else raise (InductiveError BadUnivs)
- else raise (InductiveError BadUnivs)
+ && Option.is_empty info.ind_min_univ then { info with ind_squashed = true }
+ else {info with missing = Universe.Set.add u info.missing}
let check_context_univs ~ctor env info ctx =
let check_one d (info,env) =
@@ -109,6 +110,7 @@ let check_arity env_params env_ar ind =
ind_has_relevant_arg=false;
ind_min_univ;
ind_univ=Sorts.univ_of_sort ind_sort;
+ missing=Universe.Set.empty;
}
in
let univ_info = check_indices_matter env_params univ_info indices in
@@ -174,7 +176,7 @@ let check_record data =
(* - all_sorts in case of small, unitary Prop (not smashed) *)
(* - logical_sorts in case of large, unitary Prop (smashed) *)
-let allowed_sorts {ind_squashed;ind_univ;ind_min_univ=_;ind_has_relevant_arg=_} =
+let allowed_sorts {ind_squashed;ind_univ;ind_min_univ=_;ind_has_relevant_arg=_;missing=_} =
if not ind_squashed then InType
else Sorts.family (Sorts.sort_of_univ ind_univ)
@@ -224,6 +226,8 @@ let template_polymorphic_univs ~template_check ~ctor_levels uctx paramsctxt conc
params, univs
let abstract_packets ~template_check univs usubst params ((arity,lc),(indices,splayed_lc),univ_info) =
+ if not (Universe.Set.is_empty univ_info.missing)
+ then raise (InductiveError (MissingConstraints (univ_info.missing,univ_info.ind_univ)));
let arity = Vars.subst_univs_level_constr usubst arity in
let lc = Array.map (Vars.subst_univs_level_constr usubst) lc in
let indices = Vars.subst_univs_level_context usubst indices in
@@ -270,7 +274,7 @@ let abstract_packets ~template_check univs usubst params ((arity,lc),(indices,sp
CErrors.user_err
Pp.(strbrk "Ill-formed template inductive declaration: not polymorphic on any universe.")
else
- TemplateArity {template_param_levels = param_levels; template_level = min_univ}
+ TemplateArity {template_param_levels = param_levels; template_level = min_univ; template_context = ctx }
in
let kelim = allowed_sorts univ_info in
diff --git a/kernel/safe_typing.ml b/kernel/safe_typing.ml
index e8adde2605..8db8a044a8 100644
--- a/kernel/safe_typing.ml
+++ b/kernel/safe_typing.ml
@@ -759,7 +759,7 @@ let translate_direct_opaque env kn ce =
let () = assert (is_empty_private u) in
{ cb with const_body = OpaqueDef c }
-let export_side_effects mb env (b_ctx, eff) =
+let export_side_effects mb env eff =
let not_exists e = not (Environ.mem_constant e.seff_constant env) in
let aux (acc,sl) e =
if not (not_exists e) then acc, sl
@@ -776,7 +776,7 @@ let export_side_effects mb env (b_ctx, eff) =
in
let rec translate_seff sl seff acc env =
match seff with
- | [] -> List.rev acc, b_ctx
+ | [] -> List.rev acc
| eff :: rest ->
if Int.equal sl 0 then
let env, cb =
@@ -805,8 +805,8 @@ let push_opaque_proof pf senv =
let senv = { senv with env = Environ.set_opaque_tables senv.env otab } in
senv, o
-let export_private_constants ce senv =
- let exported, ce = export_side_effects senv.revstruct senv.env ce in
+let export_private_constants eff senv =
+ let exported = export_side_effects senv.revstruct senv.env eff in
let map senv (kn, c) = match c.const_body with
| OpaqueDef p ->
let local = empty_private c.const_universes in
@@ -819,7 +819,7 @@ let export_private_constants ce senv =
let exported = List.map (fun (kn, _) -> kn) exported in
(* No delayed constants to declare *)
let senv = List.fold_left add_constant_aux senv bodies in
- (ce, exported), senv
+ exported, senv
let add_constant l decl senv =
let kn = Constant.make2 senv.modpath l in
diff --git a/kernel/safe_typing.mli b/kernel/safe_typing.mli
index e6f2fc4a5d..e472dfd5e5 100644
--- a/kernel/safe_typing.mli
+++ b/kernel/safe_typing.mli
@@ -86,8 +86,8 @@ type side_effect_declaration =
type exported_private_constant = Constant.t
val export_private_constants :
- private_constants Entries.proof_output ->
- (Constr.constr Univ.in_universe_context_set * exported_private_constant list) safe_transformer
+ private_constants ->
+ exported_private_constant list safe_transformer
(** returns the main constant *)
val add_constant :
diff --git a/kernel/type_errors.ml b/kernel/type_errors.ml
index f221ac7a4f..c2cdf98ee8 100644
--- a/kernel/type_errors.ml
+++ b/kernel/type_errors.ml
@@ -12,6 +12,7 @@ open Names
open Constr
open Environ
open Reduction
+open Univ
(* Type errors. *)
@@ -63,8 +64,8 @@ type ('constr, 'types) ptype_error =
| IllFormedRecBody of 'constr pguard_error * Name.t Context.binder_annot array * int * env * ('constr, 'types) punsafe_judgment array
| IllTypedRecBody of
int * Name.t Context.binder_annot array * ('constr, 'types) punsafe_judgment array * 'types array
- | UnsatisfiedConstraints of Univ.Constraint.t
- | UndeclaredUniverse of Univ.Level.t
+ | UnsatisfiedConstraints of Constraint.t
+ | UndeclaredUniverse of Level.t
| DisallowedSProp
| BadRelevance
@@ -83,7 +84,7 @@ type inductive_error =
| NotAnArity of env * constr
| BadEntry
| LargeNonPropInductiveNotInType
- | BadUnivs
+ | MissingConstraints of (Universe.Set.t * Universe.t)
exception InductiveError of inductive_error
diff --git a/kernel/type_errors.mli b/kernel/type_errors.mli
index ae6fd31762..0f29717f12 100644
--- a/kernel/type_errors.mli
+++ b/kernel/type_errors.mli
@@ -11,6 +11,7 @@
open Names
open Constr
open Environ
+open Univ
(** Type errors. {% \label{typeerrors} %} *)
@@ -64,8 +65,8 @@ type ('constr, 'types) ptype_error =
| IllFormedRecBody of 'constr pguard_error * Name.t Context.binder_annot array * int * env * ('constr, 'types) punsafe_judgment array
| IllTypedRecBody of
int * Name.t Context.binder_annot array * ('constr, 'types) punsafe_judgment array * 'types array
- | UnsatisfiedConstraints of Univ.Constraint.t
- | UndeclaredUniverse of Univ.Level.t
+ | UnsatisfiedConstraints of Constraint.t
+ | UndeclaredUniverse of Level.t
| DisallowedSProp
| BadRelevance
@@ -86,7 +87,8 @@ type inductive_error =
| NotAnArity of env * constr
| BadEntry
| LargeNonPropInductiveNotInType
- | BadUnivs
+ | MissingConstraints of (Universe.Set.t * Universe.t)
+ (* each universe in the set should have been <= the other one *)
exception InductiveError of inductive_error
@@ -133,9 +135,9 @@ val error_ill_typed_rec_body :
val error_elim_explain : Sorts.family -> Sorts.family -> arity_error
-val error_unsatisfied_constraints : env -> Univ.Constraint.t -> 'a
+val error_unsatisfied_constraints : env -> Constraint.t -> 'a
-val error_undeclared_universe : env -> Univ.Level.t -> 'a
+val error_undeclared_universe : env -> Level.t -> 'a
val error_disallowed_sprop : env -> 'a
diff --git a/library/global.mli b/library/global.mli
index a38fde41a5..b6bd69c17c 100644
--- a/library/global.mli
+++ b/library/global.mli
@@ -47,8 +47,8 @@ val push_named_def : (Id.t * Entries.section_def_entry) -> unit
val push_section_context : (Name.t array * Univ.UContext.t) -> unit
val export_private_constants :
- Safe_typing.private_constants Entries.proof_output ->
- Constr.constr Univ.in_universe_context_set * Safe_typing.exported_private_constant list
+ Safe_typing.private_constants ->
+ Safe_typing.exported_private_constant list
val add_constant :
Id.t -> Safe_typing.global_declaration -> Constant.t
diff --git a/man/coqdep.1 b/man/coqdep.1
index 02c9d4390c..4223482c99 100644
--- a/man/coqdep.1
+++ b/man/coqdep.1
@@ -6,9 +6,6 @@ coqdep \- Compute inter-module dependencies for Coq and Caml programs
.SH SYNOPSIS
.B coqdep
[
-.BI \-w
-]
-[
.BI \-I \ directory
]
[
@@ -21,9 +18,6 @@ coqdep \- Compute inter-module dependencies for Coq and Caml programs
.BI \-i
]
[
-.BI \-D
-]
-[
.BI \-slash
]
.I filename ...
@@ -61,25 +55,6 @@ directives and the dot notation
.BI \-c
Prints the dependencies of Caml modules.
(On Caml modules, the behaviour is exactly the same as ocamldep).
-\" THESE OPTIONS ARE BROKEN CURRENTLY
-\" .TP
-\" .BI \-w
-\" Prints a warning if a Coq command
-\" .IR Declare \&
-\" .IR ML \&
-\" .IR Module \&
-\" is incorrect. (For instance, you wrote `Declare ML Module "A".',
-\" but the module A contains #open "B"). The correct command is printed
-\" (see option \-D). The warning is printed on standard error.
-\" .TP
-\" .BI \-D
-\" This commands looks for every command
-\" .IR Declare \&
-\" .IR ML \&
-\" .IR Module \&
-\" of each Coq file given as argument and complete (if needed)
-\" the list of Caml modules. The new command is printed on
-\" the standard output. No dependency is computed with this option.
.TP
.BI \-f \ file
Read filenames and options -I, -R and -Q from a _CoqProject FILE.
@@ -93,10 +68,6 @@ Indicates where is the Coq library. The default value has been
determined at installation time, and therefore this option should not
be used under normal circumstances.
.TP
-.BI \-dumpgraph[box] \ file
-Dumps a dot dependency graph in file
-.IR file \&.
-.TP
.BI \-exclude-dir \ dir
Skips subdirectory
.IR dir \ during
@@ -169,7 +140,7 @@ example% coqdep \-I . *.v
With a warning:
.IP
.B
-example% coqdep \-w \-I . *.v
+example% coqdep \-I . *.v
.RS
.sp .5
.nf
diff --git a/plugins/cc/ccalgo.ml b/plugins/cc/ccalgo.ml
index 500f464ea7..fdc70ccaa8 100644
--- a/plugins/cc/ccalgo.ml
+++ b/plugins/cc/ccalgo.ml
@@ -492,7 +492,7 @@ let rec add_term state t=
Not_found ->
let b=next uf in
let trm = constr_of_term t in
- let typ = Typing.unsafe_type_of state.env state.sigma (EConstr.of_constr trm) in
+ let typ = Retyping.get_type_of state.env state.sigma (EConstr.of_constr trm) in
let typ = canonize_name state.sigma typ in
let new_node=
match t with
@@ -809,23 +809,23 @@ let new_state_var typ state =
let complete_one_class state i=
match (get_representative state.uf i).inductive_status with
- Partial pac ->
- let rec app t typ n =
- if n<=0 then t else
- let _,etyp,rest= destProd typ in
- let id = new_state_var (EConstr.of_constr etyp) state in
- app (Appli(t,Eps id)) (substl [mkVar id] rest) (n-1) in
- let _c = Typing.unsafe_type_of state.env state.sigma
- (EConstr.of_constr (constr_of_term (term state.uf pac.cnode))) in
- let _c = EConstr.Unsafe.to_constr _c in
- let _args =
- List.map (fun i -> constr_of_term (term state.uf i))
- pac.args in
- let typ = Term.prod_applist _c (List.rev _args) in
- let ct = app (term state.uf i) typ pac.arity in
- state.uf.epsilons <- pac :: state.uf.epsilons;
- ignore (add_term state ct)
- | _ -> anomaly (Pp.str "wrong incomplete class.")
+ | Partial pac ->
+ let rec app t typ n =
+ if n<=0 then t else
+ let _,etyp,rest= destProd typ in
+ let id = new_state_var (EConstr.of_constr etyp) state in
+ app (Appli(t,Eps id)) (substl [mkVar id] rest) (n-1) in
+ let c = Retyping.get_type_of state.env state.sigma
+ (EConstr.of_constr (constr_of_term (term state.uf pac.cnode))) in
+ let c = EConstr.Unsafe.to_constr c in
+ let args =
+ List.map (fun i -> constr_of_term (term state.uf i))
+ pac.args in
+ let typ = Term.prod_applist c (List.rev args) in
+ let ct = app (term state.uf i) typ pac.arity in
+ state.uf.epsilons <- pac :: state.uf.epsilons;
+ ignore (add_term state ct)
+ | _ -> anomaly (Pp.str "wrong incomplete class.")
let complete state =
Int.Set.iter (complete_one_class state) state.pa_classes
diff --git a/plugins/cc/cctac.ml b/plugins/cc/cctac.ml
index 556e6b48e6..8a650d9e7a 100644
--- a/plugins/cc/cctac.ml
+++ b/plugins/cc/cctac.ml
@@ -277,10 +277,12 @@ let refresh_type env evm ty =
Evarsolve.refresh_universes ~status:Evd.univ_flexible ~refreshset:true
(Some false) env evm ty
-let refresh_universes ty k =
+let type_and_refresh c k =
Proofview.Goal.enter begin fun gl ->
let env = Proofview.Goal.env gl in
let evm = Tacmach.New.project gl in
+ (* XXX is get_type_of enough? *)
+ let evm, ty = Typing.type_of env evm c in
let evm, ty = refresh_type env evm ty in
Proofview.tclTHEN (Proofview.Unsafe.tclEVARS evm) (k ty)
end
@@ -289,7 +291,6 @@ let constr_of_term c = EConstr.of_constr (constr_of_term c)
let rec proof_tac p : unit Proofview.tactic =
Proofview.Goal.enter begin fun gl ->
- let type_of t = Tacmach.New.pf_unsafe_type_of gl t in
try (* type_of can raise exceptions *)
match p.p_rule with
Ax c -> exact_check (EConstr.of_constr c)
@@ -297,17 +298,17 @@ let rec proof_tac p : unit Proofview.tactic =
let c = EConstr.of_constr c in
let l=constr_of_term p.p_lhs and
r=constr_of_term p.p_rhs in
- refresh_universes (type_of l) (fun typ ->
+ type_and_refresh l (fun typ ->
app_global _sym_eq [|typ;r;l;c|] exact_check)
| Refl t ->
let lr = constr_of_term t in
- refresh_universes (type_of lr) (fun typ ->
+ type_and_refresh lr (fun typ ->
app_global _refl_equal [|typ;constr_of_term t|] exact_check)
| Trans (p1,p2)->
let t1 = constr_of_term p1.p_lhs and
t2 = constr_of_term p1.p_rhs and
t3 = constr_of_term p2.p_rhs in
- refresh_universes (type_of t2) (fun typ ->
+ type_and_refresh t2 (fun typ ->
let prf = app_global_with_holes _trans_eq [|typ;t1;t2;t3;|] 2 in
Tacticals.New.tclTHENS prf [(proof_tac p1);(proof_tac p2)])
| Congr (p1,p2)->
@@ -315,9 +316,9 @@ let rec proof_tac p : unit Proofview.tactic =
and tx1=constr_of_term p2.p_lhs
and tf2=constr_of_term p1.p_rhs
and tx2=constr_of_term p2.p_rhs in
- refresh_universes (type_of tf1) (fun typf ->
- refresh_universes (type_of tx1) (fun typx ->
- refresh_universes (type_of (mkApp (tf1,[|tx1|]))) (fun typfx ->
+ type_and_refresh tf1 (fun typf ->
+ type_and_refresh tx1 (fun typx ->
+ type_and_refresh (mkApp (tf1,[|tx1|])) (fun typfx ->
let id = Tacmach.New.pf_get_new_id (Id.of_string "f") gl in
let appx1 = mkLambda(make_annot (Name id) Sorts.Relevant,typf,mkApp(mkRel 1,[|tx1|])) in
let lemma1 = app_global_with_holes _f_equal [|typf;typfx;appx1;tf1;tf2|] 1 in
@@ -341,8 +342,8 @@ let rec proof_tac p : unit Proofview.tactic =
let tj=constr_of_term prf.p_rhs in
let default=constr_of_term p.p_lhs in
let special=mkRel (1+nargs-argind) in
- refresh_universes (type_of ti) (fun intype ->
- refresh_universes (type_of default) (fun outtype ->
+ type_and_refresh ti (fun intype ->
+ type_and_refresh default (fun outtype ->
let sigma, proj =
build_projection intype cstr special default gl
in
@@ -362,7 +363,7 @@ let refute_tac c t1 t2 p =
let neweq= app_global _eq [|intype;tt1;tt2|] in
Tacticals.New.tclTHENS (neweq (assert_before (Name hid)))
[proof_tac p; simplest_elim false_t]
- in refresh_universes (Tacmach.New.pf_unsafe_type_of gl tt1) k
+ in type_and_refresh tt1 k
end
let refine_exact_check c =
@@ -382,7 +383,7 @@ let convert_to_goal_tac c t1 t2 p =
let endt = app_global _eq_rect [|sort;tt1;identity;c;tt2;mkVar e|] in
Tacticals.New.tclTHENS (neweq (assert_before (Name e)))
[proof_tac p; endt refine_exact_check]
- in refresh_universes (Tacmach.New.pf_unsafe_type_of gl tt2) k
+ in type_and_refresh tt2 k
end
let convert_to_hyp_tac c1 t1 c2 t2 p =
@@ -401,7 +402,8 @@ let discriminate_tac cstru p =
let lhs=constr_of_term p.p_lhs and rhs=constr_of_term p.p_rhs in
let env = Proofview.Goal.env gl in
let evm = Tacmach.New.project gl in
- let evm, intype = refresh_type env evm (Tacmach.New.pf_unsafe_type_of gl lhs) in
+ let evm, intype = Typing.type_of env evm lhs in
+ let evm, intype = refresh_type env evm intype in
let hid = Tacmach.New.pf_get_new_id (Id.of_string "Heq") gl in
let neweq=app_global _eq [|intype;lhs;rhs|] in
Tacticals.New.tclTHEN (Proofview.Unsafe.tclEVARS evm)
diff --git a/plugins/firstorder/g_ground.mlg b/plugins/firstorder/g_ground.mlg
index 8946587a02..9d208e1c86 100644
--- a/plugins/firstorder/g_ground.mlg
+++ b/plugins/firstorder/g_ground.mlg
@@ -88,7 +88,7 @@ let gen_ground_tac flag taco ids bases =
Proofview.Goal.enter begin fun gl ->
let seq=empty_seq !ground_depth in
let seq, sigma = extend_with_ref_list (pf_env gl) (project gl) ids seq in
- let seq, sigma = extend_with_auto_hints (pf_env gl) (project gl) bases seq in
+ let seq, sigma = extend_with_auto_hints (pf_env gl) sigma bases seq in
tclTHEN (Proofview.Unsafe.tclEVARS sigma) (k seq)
end
in
diff --git a/plugins/firstorder/instances.ml b/plugins/firstorder/instances.ml
index e131cad7da..866b45e4df 100644
--- a/plugins/firstorder/instances.ml
+++ b/plugins/firstorder/instances.ml
@@ -100,25 +100,28 @@ let rec collect_quantified sigma seq=
let dummy_bvid=Id.of_string "x"
-let mk_open_instance env evmap id idc m t =
- let var_id=
- if id==dummy_id then dummy_bvid else
- let typ=Typing.unsafe_type_of env evmap idc in
+let mk_open_instance env sigma id idc m t =
+ let var_id =
+ (* XXX why physical equality? *)
+ if id == dummy_id then dummy_bvid else
+ let typ = Retyping.get_type_of env sigma idc in
(* since we know we will get a product,
reduction is not too expensive *)
- let (nam,_,_)=destProd evmap (whd_all env evmap typ) in
+ let (nam,_,_) = destProd sigma (whd_all env sigma typ) in
match nam.Context.binder_name with
- Name id -> id
- | Anonymous -> dummy_bvid in
- let revt=substl (List.init m (fun i->mkRel (m-i))) t in
- let rec aux n avoid env evmap decls =
- if Int.equal n 0 then evmap, decls else
- let nid=(fresh_id_in_env avoid var_id env) in
- let (evmap, (c, _)) = Evarutil.new_type_evar env evmap Evd.univ_flexible in
+ | Name id -> id
+ | Anonymous -> dummy_bvid
+ in
+ let revt = substl (List.init m (fun i->mkRel (m-i))) t in
+ let rec aux n avoid env sigma decls =
+ if Int.equal n 0 then sigma, decls else
+ let nid = fresh_id_in_env avoid var_id env in
+ let (sigma, (c, _)) = Evarutil.new_type_evar env sigma Evd.univ_flexible in
let decl = LocalAssum (Context.make_annot (Name nid) Sorts.Relevant, c) in
- aux (n-1) (Id.Set.add nid avoid) (EConstr.push_rel decl env) evmap (decl::decls) in
- let evmap, decls = aux m Id.Set.empty env evmap [] in
- (evmap, decls, revt)
+ aux (n-1) (Id.Set.add nid avoid) (EConstr.push_rel decl env) sigma (decl::decls)
+ in
+ let sigma, decls = aux m Id.Set.empty env sigma [] in
+ (sigma, decls, revt)
(* tactics *)
diff --git a/plugins/firstorder/sequent.ml b/plugins/firstorder/sequent.ml
index 7d84ee6851..65af123d9c 100644
--- a/plugins/firstorder/sequent.ml
+++ b/plugins/firstorder/sequent.ml
@@ -204,28 +204,28 @@ let extend_with_ref_list env sigma l seq =
open Hints
let extend_with_auto_hints env sigma l seq =
- let seqref=ref seq in
- let f p_a_t =
+ let f (seq,sigma) p_a_t =
match repr_hint p_a_t.code with
- Res_pf (c,_) | Give_exact (c,_)
- | Res_pf_THEN_trivial_fail (c,_) ->
- let (c, _, _) = c in
- (try
- let (gr, _) = Termops.global_of_constr sigma c in
- let typ=(Typing.unsafe_type_of env sigma c) in
- seqref:=add_formula env sigma Hint gr typ !seqref
- with Not_found->())
- | _-> () in
- let g _ _ l = List.iter f l in
- let h dbname=
- let hdb=
+ | Res_pf (c,_) | Give_exact (c,_)
+ | Res_pf_THEN_trivial_fail (c,_) ->
+ let (c, _, _) = c in
+ (try
+ let (gr, _) = Termops.global_of_constr sigma c in
+ let sigma, typ = Typing.type_of env sigma c in
+ add_formula env sigma Hint gr typ seq, sigma
+ with Not_found -> seq, sigma)
+ | _ -> seq, sigma
+ in
+ let h acc dbname =
+ let hdb =
try
searchtable_map dbname
with Not_found->
- user_err Pp.(str ("Firstorder: "^dbname^" : No such Hint database")) in
- Hint_db.iter g hdb in
- List.iter h l;
- !seqref, sigma (*FIXME: forgetting about universes*)
+ user_err Pp.(str ("Firstorder: "^dbname^" : No such Hint database"))
+ in
+ Hint_db.fold (fun _ _ l acc -> List.fold_left f acc l) hdb acc
+ in
+ List.fold_left h (seq,sigma) l
let print_cmap map=
let print_entry c l s=
diff --git a/plugins/funind/functional_principles_proofs.ml b/plugins/funind/functional_principles_proofs.ml
index 6db0a1119b..9749af1e66 100644
--- a/plugins/funind/functional_principles_proofs.ml
+++ b/plugins/funind/functional_principles_proofs.ml
@@ -475,7 +475,7 @@ let clean_hyp_with_heq ptes_infos eq_hyps hyp_id env sigma =
tclIDTAC
in
try
- scan_type [] (Typing.unsafe_type_of env sigma (mkVar hyp_id)), [hyp_id]
+ scan_type [] (Typing.type_of_variable env hyp_id), [hyp_id]
with TOREMOVE ->
thin [hyp_id],[]
@@ -525,7 +525,7 @@ let treat_new_case ptes_infos nb_prod continue_tac term dyn_infos =
tclMAP (fun id -> Proofview.V82.of_tactic (introduction id)) dyn_infos.rec_hyps;
observe_tac "after_introduction" (fun g' ->
(* We get infos on the equations introduced*)
- let new_term_value_eq = pf_unsafe_type_of g' (mkVar heq_id) in
+ let new_term_value_eq = pf_get_hyp_typ g' heq_id in
(* compute the new value of the body *)
let new_term_value =
match EConstr.kind (project g') new_term_value_eq with
@@ -536,22 +536,23 @@ let treat_new_case ptes_infos nb_prod continue_tac term dyn_infos =
);
anomaly (Pp.str "cannot compute new term value.")
in
- let fun_body =
- mkLambda(make_annot Anonymous Sorts.Relevant,
- pf_unsafe_type_of g' term,
- Termops.replace_term (project g') term (mkRel 1) dyn_infos.info
- )
- in
- let new_body = pf_nf_betaiota g' (mkApp(fun_body,[| new_term_value |])) in
- let new_infos =
- {dyn_infos with
+ let g', termtyp = tac_type_of g' term in
+ let fun_body =
+ mkLambda(make_annot Anonymous Sorts.Relevant,
+ termtyp,
+ Termops.replace_term (project g') term (mkRel 1) dyn_infos.info
+ )
+ in
+ let new_body = pf_nf_betaiota g' (mkApp(fun_body,[| new_term_value |])) in
+ let new_infos =
+ {dyn_infos with
info = new_body;
eq_hyps = heq_id::dyn_infos.eq_hyps
- }
- in
- clean_goal_with_heq ptes_infos continue_tac new_infos g'
- )])
- ]
+ }
+ in
+ clean_goal_with_heq ptes_infos continue_tac new_infos g'
+ )])
+ ]
g
@@ -633,7 +634,7 @@ let build_proof
let dyn_infos = {dyn_info' with info =
mkCase(ci,ct,t,cb)} in
let g_nb_prod = nb_prod (project g) (pf_concl g) in
- let type_of_term = pf_unsafe_type_of g t in
+ let g, type_of_term = tac_type_of g t in
let term_eq =
make_refl_eq (Lazy.force refl_equal) type_of_term t
in
@@ -849,7 +850,7 @@ let generalize_non_dep hyp g =
(* observe (str "rec id := " ++ Ppconstr.pr_id hyp); *)
let hyps = [hyp] in
let env = Global.env () in
- let hyp_typ = pf_unsafe_type_of g (mkVar hyp) in
+ let hyp_typ = pf_get_hyp_typ g hyp in
let to_revert,_ =
let open Context.Named.Declaration in
Environ.fold_named_context_reverse (fun (clear,keep) decl ->
@@ -1351,7 +1352,7 @@ let backtrack_eqs_until_hrec hrec eqs : tactic =
let rewrite =
tclFIRST (List.map (fun x -> Proofview.V82.of_tactic (Equality.rewriteRL x)) eqs )
in
- let _,hrec_concl = decompose_prod (project gls) (pf_unsafe_type_of gls (mkVar hrec)) in
+ let _,hrec_concl = decompose_prod (project gls) (pf_get_hyp_typ gls hrec) in
let f_app = Array.last (snd (destApp (project gls) hrec_concl)) in
let f = (fst (destApp (project gls) f_app)) in
let rec backtrack : tactic =
@@ -1573,19 +1574,16 @@ let prove_principle_for_gen
(List.rev_map (get_name %> Nameops.Name.get_id)
(princ_info.args@princ_info.branches@princ_info.predicates@princ_info.params)
);
- (* observe_tac "" *) Proofview.V82.of_tactic (assert_by
- (Name acc_rec_arg_id)
- (mkApp (delayed_force acc_rel,[|input_type;relation;mkVar rec_arg_id|]))
- (Proofview.V82.tactic prove_rec_arg_acc)
- );
-(* observe_tac "reverting" *) (revert (List.rev (acc_rec_arg_id::args_ids)));
-(* (fun g -> observe (Printer.pr_goal (sig_it g) ++ fnl () ++ *)
-(* str "fix arg num" ++ int (List.length args_ids + 1) ); tclIDTAC g); *)
- (* observe_tac "h_fix " *) (Proofview.V82.of_tactic (fix fix_id (List.length args_ids + 1)));
-(* (fun g -> observe (Printer.pr_goal (sig_it g) ++ fnl() ++ pr_lconstr_env (pf_env g ) (pf_unsafe_type_of g (mkVar fix_id) )); tclIDTAC g); *)
+ Proofview.V82.of_tactic
+ (assert_by
+ (Name acc_rec_arg_id)
+ (mkApp (delayed_force acc_rel,[|input_type;relation;mkVar rec_arg_id|]))
+ (Proofview.V82.tactic prove_rec_arg_acc));
+ (revert (List.rev (acc_rec_arg_id::args_ids)));
+ (Proofview.V82.of_tactic (fix fix_id (List.length args_ids + 1)));
h_intros (List.rev (acc_rec_arg_id::args_ids));
Proofview.V82.of_tactic (Equality.rewriteLR (mkConst eq_ref));
- (* observe_tac "finish" *) (fun gl' ->
+ (fun gl' ->
let body =
let _,args = destApp (project gl') (pf_concl gl') in
Array.last args
diff --git a/plugins/funind/gen_principle.ml b/plugins/funind/gen_principle.ml
index 58efee1518..68661174ac 100644
--- a/plugins/funind/gen_principle.ml
+++ b/plugins/funind/gen_principle.ml
@@ -617,7 +617,7 @@ let prove_fun_correct evd funs_constr graphs_constr schemes lemmas_types_infos i
let constructor_args g =
List.fold_right
(fun hid acc ->
- let type_of_hid = pf_unsafe_type_of g (mkVar hid) in
+ let type_of_hid = pf_get_hyp_typ g hid in
let sigma = project g in
match EConstr.kind sigma type_of_hid with
| Prod(_,_,t') ->
@@ -953,7 +953,7 @@ let rec reflexivity_with_destruct_cases g =
match sc with
None -> tclIDTAC g
| Some id ->
- match EConstr.kind (project g) (pf_unsafe_type_of g (mkVar id)) with
+ match EConstr.kind (project g) (pf_get_hyp_typ g id) with
| App(eq,[|_;t1;t2|]) when EConstr.eq_constr (project g) eq eq_ind ->
if Equality.discriminable (pf_env g) (project g) t1 t2
then Proofview.V82.of_tactic (Equality.discrHyp id) g
@@ -993,7 +993,7 @@ let prove_fun_complete funcs graphs schemes lemmas_types_infos i : Tacmach.tacti
(* We get the constant and the principle corresponding to this lemma *)
let f = funcs.(i) in
let graph_principle = Reductionops.nf_zeta (pf_env g) (project g) (EConstr.of_constr schemes.(i)) in
- let princ_type = pf_unsafe_type_of g graph_principle in
+ let g, princ_type = tac_type_of g graph_principle in
let princ_infos = Tactics.compute_elim_sig (project g) princ_type in
(* Then we get the number of argument of the function
and compute a fresh name for each of them
@@ -1210,7 +1210,7 @@ let make_scheme evd (fas : (Constr.pconstant * Sorts.family) list) : Evd.side_ef
in
let _ = evd := sigma in
let l_schemes =
- List.map (EConstr.of_constr %> Typing.unsafe_type_of env sigma %> EConstr.Unsafe.to_constr) schemes
+ List.map (EConstr.of_constr %> Retyping.get_type_of env sigma %> EConstr.Unsafe.to_constr) schemes
in
let i = ref (-1) in
let sorts =
@@ -2051,7 +2051,7 @@ let build_case_scheme fa =
let (sigma, scheme) =
Indrec.build_case_analysis_scheme_default env sigma ind sf
in
- let scheme_type = EConstr.Unsafe.to_constr ((Typing.unsafe_type_of env sigma) (EConstr.of_constr scheme)) in
+ let scheme_type = EConstr.Unsafe.to_constr ((Retyping.get_type_of env sigma) (EConstr.of_constr scheme)) in
let sorts =
(fun (_,_,x) ->
fst @@ UnivGen.fresh_sort_in_family x
diff --git a/plugins/funind/glob_term_to_relation.ml b/plugins/funind/glob_term_to_relation.ml
index e41b92d4dc..84f09c385f 100644
--- a/plugins/funind/glob_term_to_relation.ml
+++ b/plugins/funind/glob_term_to_relation.ml
@@ -514,8 +514,9 @@ let rec build_entry_lc env sigma funnames avoid rt : glob_constr build_entry_ret
a pseudo value "v1 ... vn".
The "value" of this branch is then simply [res]
*)
+ (* XXX here and other [understand] calls drop the ctx *)
let rt_as_constr,ctx = Pretyping.understand env (Evd.from_env env) rt in
- let rt_typ = Typing.unsafe_type_of env (Evd.from_env env) rt_as_constr in
+ let rt_typ = Retyping.get_type_of env (Evd.from_env env) rt_as_constr in
let res_raw_type = Detyping.detype Detyping.Now false Id.Set.empty env (Evd.from_env env) rt_typ in
let res = fresh_id args_res.to_avoid "_res" in
let new_avoid = res::args_res.to_avoid in
@@ -629,7 +630,7 @@ let rec build_entry_lc env sigma funnames avoid rt : glob_constr build_entry_ret
let v = match typ with None -> v | Some t -> DAst.make ?loc:rt.loc @@ GCast (v,CastConv t) in
let v_res = build_entry_lc env sigma funnames avoid v in
let v_as_constr,ctx = Pretyping.understand env (Evd.from_env env) v in
- let v_type = Typing.unsafe_type_of env (Evd.from_env env) v_as_constr in
+ let v_type = Retyping.get_type_of env (Evd.from_env env) v_as_constr in
let v_r = Sorts.Relevant in (* TODO relevance *)
let new_env =
match n with
@@ -646,7 +647,7 @@ let rec build_entry_lc env sigma funnames avoid rt : glob_constr build_entry_ret
build_entry_lc_from_case env sigma funnames make_discr el brl avoid
| GIf(b,(na,e_option),lhs,rhs) ->
let b_as_constr,ctx = Pretyping.understand env (Evd.from_env env) b in
- let b_typ = Typing.unsafe_type_of env (Evd.from_env env) b_as_constr in
+ let b_typ = Retyping.get_type_of env (Evd.from_env env) b_as_constr in
let (ind,_) =
try Inductiveops.find_inductive env (Evd.from_env env) b_typ
with Not_found ->
@@ -678,7 +679,7 @@ let rec build_entry_lc env sigma funnames avoid rt : glob_constr build_entry_ret
nal
in
let b_as_constr,ctx = Pretyping.understand env (Evd.from_env env) b in
- let b_typ = Typing.unsafe_type_of env (Evd.from_env env) b_as_constr in
+ let b_typ = Retyping.get_type_of env (Evd.from_env env) b_as_constr in
let (ind,_) =
try Inductiveops.find_inductive env (Evd.from_env env) b_typ
with Not_found ->
@@ -723,7 +724,7 @@ and build_entry_lc_from_case env sigma funname make_discr
let types =
List.map (fun (case_arg,_) ->
let case_arg_as_constr,ctx = Pretyping.understand env (Evd.from_env env) case_arg in
- EConstr.Unsafe.to_constr (Typing.unsafe_type_of env (Evd.from_env env) case_arg_as_constr)
+ EConstr.Unsafe.to_constr (Retyping.get_type_of env (Evd.from_env env) case_arg_as_constr)
) el
in
(****** The next works only if the match is not dependent ****)
@@ -769,9 +770,7 @@ and build_entry_lc_from_case_term env sigma types funname make_discr patterns_to
let env_with_pat_ids = add_pat_variables sigma pat typ new_env in
List.fold_right
(fun id acc ->
- let typ_of_id =
- Typing.unsafe_type_of env_with_pat_ids (Evd.from_env env) (EConstr.mkVar id)
- in
+ let typ_of_id = Typing.type_of_variable env_with_pat_ids id in
let raw_typ_of_id =
Detyping.detype Detyping.Now false Id.Set.empty
env_with_pat_ids (Evd.from_env env) typ_of_id
@@ -832,7 +831,7 @@ and build_entry_lc_from_case_term env sigma types funname make_discr patterns_to
(fun id acc ->
if Id.Set.mem id this_pat_ids
then (Prod (Name id),
- let typ_of_id = Typing.unsafe_type_of new_env (Evd.from_env env) (EConstr.mkVar id) in
+ let typ_of_id = Typing.type_of_variable new_env id in
let raw_typ_of_id =
Detyping.detype Detyping.Now false Id.Set.empty new_env (Evd.from_env env) typ_of_id
in
@@ -1166,7 +1165,7 @@ let rec rebuild_cons env nb_args relname args crossed_types depth rt =
let evd = (Evd.from_env env) in
let t',ctx = Pretyping.understand env evd t in
let evd = Evd.from_ctx ctx in
- let type_t' = Typing.unsafe_type_of env evd t' in
+ let type_t' = Retyping.get_type_of env evd t' in
let t' = EConstr.Unsafe.to_constr t' in
let type_t' = EConstr.Unsafe.to_constr type_t' in
let new_env = Environ.push_rel (LocalDef (make_annot n Sorts.Relevant,t',type_t')) env in
diff --git a/plugins/funind/indfun.ml b/plugins/funind/indfun.ml
index a205c0744a..f28e98dcc2 100644
--- a/plugins/funind/indfun.ml
+++ b/plugins/funind/indfun.ml
@@ -64,12 +64,10 @@ let functional_induction with_clean c princl pat =
| InSet -> finfo.rec_lemma
| InType -> finfo.rect_lemma
in
- let princ = (* then we get the principle *)
+ let sigma, princ = (* then we get the principle *)
match princ_option with
| Some princ ->
- let sigma, princ = Evd.fresh_global (pf_env gl) (project gl) (GlobRef.ConstRef princ) in
- Proofview.Unsafe.tclEVARS sigma >>= fun () ->
- Proofview.tclUNIT princ
+ Evd.fresh_global (pf_env gl) (project gl) (GlobRef.ConstRef princ)
| None ->
(*i If there is not default lemma defined then,
we cross our finger and try to find a lemma named f_ind
@@ -87,19 +85,18 @@ let functional_induction with_clean c princl pat =
user_err (str "Cannot find induction principle for "
++ Printer.pr_leconstr_env (pf_env gl) sigma (mkConst c') )
in
- let sigma, princ = Evd.fresh_global (pf_env gl) (project gl) princ_ref in
- Proofview.Unsafe.tclEVARS sigma >>= fun () ->
- Proofview.tclUNIT princ
+ Evd.fresh_global (pf_env gl) (project gl) princ_ref
in
- princ >>= fun princ ->
- (* We need to refresh gl due to the updated evar_map in princ *)
- Proofview.Goal.enter_one (fun gl ->
- Proofview.tclUNIT (princ, Tactypes.NoBindings, pf_unsafe_type_of gl princ, args))
+ let princt = Retyping.get_type_of (pf_env gl) sigma princ in
+ Proofview.Unsafe.tclEVARS sigma <*>
+ Proofview.tclUNIT (princ, Tactypes.NoBindings, princt, args)
| _ ->
CErrors.user_err (str "functional induction must be used with a function" )
end
| Some ((princ,binding)) ->
- Proofview.tclUNIT (princ, binding, pf_unsafe_type_of gl princ, args)
+ let sigma, princt = pf_type_of gl princ in
+ Proofview.Unsafe.tclEVARS sigma <*>
+ Proofview.tclUNIT (princ, binding, princt, args)
) >>= fun (princ, bindings, princ_type, args) ->
Proofview.Goal.enter (fun gl ->
let sigma = project gl in
diff --git a/plugins/funind/indfun_common.ml b/plugins/funind/indfun_common.ml
index b55d8537d6..bce09d8fbd 100644
--- a/plugins/funind/indfun_common.ml
+++ b/plugins/funind/indfun_common.ml
@@ -526,3 +526,7 @@ let funind_purify f x =
let e = CErrors.push e in
Vernacstate.unfreeze_interp_state st;
Exninfo.iraise e
+
+let tac_type_of g c =
+ let sigma, t = Tacmach.pf_type_of g c in
+ {g with Evd.sigma}, t
diff --git a/plugins/funind/indfun_common.mli b/plugins/funind/indfun_common.mli
index 550f727951..bd8b34088b 100644
--- a/plugins/funind/indfun_common.mli
+++ b/plugins/funind/indfun_common.mli
@@ -119,3 +119,5 @@ type tcc_lemma_value =
| Not_needed
val funind_purify : ('a -> 'b) -> ('a -> 'b)
+
+val tac_type_of : Goal.goal Evd.sigma -> EConstr.constr -> Goal.goal Evd.sigma * EConstr.types
diff --git a/plugins/funind/invfun.ml b/plugins/funind/invfun.ml
index d72319d078..332d058ce7 100644
--- a/plugins/funind/invfun.ml
+++ b/plugins/funind/invfun.ml
@@ -28,7 +28,7 @@ open Indfun_common
*)
let revert_graph kn post_tac hid = Proofview.Goal.enter (fun gl ->
let sigma = project gl in
- let typ = pf_unsafe_type_of gl (mkVar hid) in
+ let typ = pf_get_hyp_typ hid gl in
match EConstr.kind sigma typ with
| App(i,args) when isInd sigma i ->
let ((kn',num) as ind'),u = destInd sigma i in
@@ -77,7 +77,7 @@ let revert_graph kn post_tac hid = Proofview.Goal.enter (fun gl ->
let functional_inversion kn hid fconst f_correct = Proofview.Goal.enter (fun gl ->
let old_ids = List.fold_right Id.Set.add (pf_ids_of_hyps gl) Id.Set.empty in
let sigma = project gl in
- let type_of_h = pf_unsafe_type_of gl (mkVar hid) in
+ let type_of_h = pf_get_hyp_typ hid gl in
match EConstr.kind sigma type_of_h with
| App(eq,args) when EConstr.eq_constr sigma eq (make_eq ()) ->
let pre_tac,f_args,res =
@@ -128,7 +128,7 @@ let invfun qhyp f =
| None ->
let tac_action hid gl =
let sigma = project gl in
- let hyp_typ = pf_unsafe_type_of gl (mkVar hid) in
+ let hyp_typ = pf_get_hyp_typ hid gl in
match EConstr.kind sigma hyp_typ with
| App(eq,args) when EConstr.eq_constr sigma eq (make_eq ()) ->
begin
diff --git a/plugins/funind/recdef.ml b/plugins/funind/recdef.ml
index 66ed1961ba..f7f8004998 100644
--- a/plugins/funind/recdef.ml
+++ b/plugins/funind/recdef.ml
@@ -31,7 +31,6 @@ open Tactics
open Nametab
open Declare
open Tacred
-open Goal
open Glob_term
open Pretyping
open Termops
@@ -110,9 +109,10 @@ let pf_get_new_ids idl g =
let next_ident_away_in_goal ids avoid =
next_ident_away_in_goal ids (Id.Set.of_list avoid)
-let compute_renamed_type gls c =
+let compute_renamed_type gls id =
rename_bound_vars_as_displayed (project gls) (*no avoid*) Id.Set.empty (*no rels*) []
- (pf_unsafe_type_of gls c)
+ (pf_get_hyp_typ gls id)
+
let h'_id = Id.of_string "h'"
let teq_id = Id.of_string "teq"
let ano_id = Id.of_string "anonymous"
@@ -370,7 +370,7 @@ let treat_case forbid_new_ids to_intros finalize_tac nb_lam e infos : tactic =
Proofview.V82.of_tactic (clear to_intros);
h_intros to_intros;
(fun g' ->
- let ty_teq = pf_unsafe_type_of g' (mkVar heq) in
+ let ty_teq = pf_get_hyp_typ g' heq in
let teq_lhs,teq_rhs =
let _,args = try destApp (project g') ty_teq with DestKO -> assert false in
args.(1),args.(2)
@@ -487,13 +487,13 @@ let rec prove_lt hyple g =
in
let h =
List.find (fun id ->
- match decompose_app sigma (pf_unsafe_type_of g (mkVar id)) with
+ match decompose_app sigma (pf_get_hyp_typ g id) with
| _, t::_ -> EConstr.eq_constr sigma t varx
| _ -> false
) hyple
in
let y =
- List.hd (List.tl (snd (decompose_app sigma (pf_unsafe_type_of g (mkVar h))))) in
+ List.hd (List.tl (snd (decompose_app sigma (pf_get_hyp_typ g h)))) in
observe_tclTHENLIST (fun _ _ -> str "prove_lt1")[
Proofview.V82.of_tactic (apply (mkApp(le_lt_trans (),[|varx;y;varz;mkVar h|])));
observe_tac (fun _ _ -> str "prove_lt") (prove_lt hyple)
@@ -645,9 +645,7 @@ let pf_typel l tac =
modified hypotheses are generalized in the process and should be
introduced back later; the result is the pair of the tactic and the
list of hypotheses that have been generalized and cleared. *)
-let mkDestructEq :
- Id.t list -> constr -> goal Evd.sigma -> tactic * Id.t list =
- fun not_on_hyp expr g ->
+let mkDestructEq not_on_hyp expr g =
let hyps = pf_hyps g in
let to_revert =
Util.List.map_filter
@@ -657,9 +655,9 @@ let mkDestructEq :
if Id.List.mem id not_on_hyp || not (Termops.dependent (project g) expr (get_type decl))
then None else Some id) hyps in
let to_revert_constr = List.rev_map mkVar to_revert in
- let type_of_expr = pf_unsafe_type_of g expr in
- let new_hyps = mkApp(Lazy.force refl_equal, [|type_of_expr; expr|])::
- to_revert_constr in
+ let g, type_of_expr = tac_type_of g expr in
+ let new_hyps = mkApp(Lazy.force refl_equal, [|type_of_expr; expr|])::to_revert_constr in
+ let tac =
pf_typel new_hyps (fun _ ->
observe_tclTHENLIST (fun _ _ -> str "mkDestructEq")
[Proofview.V82.of_tactic (generalize new_hyps);
@@ -668,7 +666,9 @@ let mkDestructEq :
pattern_occs [Locus.AllOccurrencesBut [1], expr] (pf_env g2) sigma (pf_concl g2)
in
Proofview.V82.of_tactic (change_in_concl ~check:true None changefun) g2);
- Proofview.V82.of_tactic (simplest_case expr)]), to_revert
+ Proofview.V82.of_tactic (simplest_case expr)])
+ in
+ g, tac, to_revert
let terminate_case next_step (ci,a,t,l) expr_info continuation_tac infos g =
let sigma = project g in
@@ -686,7 +686,7 @@ let terminate_case next_step (ci,a,t,l) expr_info continuation_tac infos g =
info = mkCase(ci,t,a',l);
is_main_branch = expr_info.is_main_branch;
is_final = expr_info.is_final} in
- let destruct_tac,rev_to_thin_intro =
+ let g,destruct_tac,rev_to_thin_intro =
mkDestructEq [expr_info.rec_arg_id] a' g in
let to_thin_intro = List.rev rev_to_thin_intro in
observe_tac (fun _ _ -> str "treating cases (" ++ int (Array.length l) ++ str")" ++ spc () ++ Printer.pr_leconstr_env (pf_env g) sigma a')
@@ -842,7 +842,7 @@ let rec make_rewrite_list expr_info max = function
(observe_tac (fun _ _ -> str "rewrite heq on " ++ Id.print p ) (
(fun g ->
let sigma = project g in
- let t_eq = compute_renamed_type g (mkVar hp) in
+ let t_eq = compute_renamed_type g hp in
let k,def =
let k_na,_,t = destProd sigma t_eq in
let _,_,t = destProd sigma t in
@@ -868,7 +868,7 @@ let make_rewrite expr_info l hp max =
(observe_tac (fun _ _ -> str "make_rewrite") (tclTHENS
(fun g ->
let sigma = project g in
- let t_eq = compute_renamed_type g (mkVar hp) in
+ let t_eq = compute_renamed_type g hp in
let k,def =
let k_na,_,t = destProd sigma t_eq in
let _,_,t = destProd sigma t in
diff --git a/plugins/ltac/extratactics.mlg b/plugins/ltac/extratactics.mlg
index 6c63a891e8..513f5ca77b 100644
--- a/plugins/ltac/extratactics.mlg
+++ b/plugins/ltac/extratactics.mlg
@@ -736,7 +736,7 @@ let refl_equal () = Coqlib.lib_ref "core.eq.type"
call it before it is defined. *)
let mkCaseEq a : unit Proofview.tactic =
Proofview.Goal.enter begin fun gl ->
- let type_of_a = Tacmach.New.pf_unsafe_type_of gl a in
+ let type_of_a = Tacmach.New.pf_get_type_of gl a in
Tacticals.New.pf_constr_of_global (delayed_force refl_equal) >>= fun req ->
Tacticals.New.tclTHENLIST
[Tactics.generalize [(mkApp(req, [| type_of_a; a|]))];
@@ -794,7 +794,7 @@ let destauto t =
let destauto_in id =
Proofview.Goal.enter begin fun gl ->
- let ctype = Tacmach.New.pf_unsafe_type_of gl (mkVar id) in
+ let ctype = Tacmach.New.pf_get_type_of gl (mkVar id) in
(* Pp.msgnl (Printer.pr_lconstr (mkVar id)); *)
(* Pp.msgnl (Printer.pr_lconstr (ctype)); *)
destauto ctype
diff --git a/plugins/ltac/rewrite.ml b/plugins/ltac/rewrite.ml
index 98d14f3d33..a0eefd1a39 100644
--- a/plugins/ltac/rewrite.ml
+++ b/plugins/ltac/rewrite.ml
@@ -483,7 +483,7 @@ let rec decompose_app_rel env evd t =
| App (f, [||]) -> assert false
| App (f, [|arg|]) ->
let (f', argl, argr) = decompose_app_rel env evd arg in
- let ty = Typing.unsafe_type_of env evd argl in
+ let ty = Retyping.get_type_of env evd argl in
let r = Retyping.relevance_of_type env evd ty in
let f'' = mkLambda (make_annot (Name default_dependent_ident) r, ty,
mkLambda (make_annot (Name (Id.of_string "y")) r, lift 1 ty,
@@ -789,7 +789,8 @@ let resolve_morphism env avoid oldt m ?(fnewt=fun x -> x) args args' (b,cstr) ev
let morphargs, morphobjs = Array.chop first args in
let morphargs', morphobjs' = Array.chop first args' in
let appm = mkApp(m, morphargs) in
- let appmtype = Typing.unsafe_type_of env (goalevars evars) appm in
+ let evd, appmtype = Typing.type_of env (goalevars evars) appm in
+ let evars = evd, snd evars in
let cstrs = List.map
(Option.map (fun r -> r.rew_car, get_opt_rew_rel r.rew_prf))
(Array.to_list morphobjs')
@@ -1906,7 +1907,7 @@ let declare_projection n instance_id r =
let build_morphism_signature env sigma m =
let m,ctx = Constrintern.interp_constr env sigma m in
let sigma = Evd.from_ctx ctx in
- let t = Typing.unsafe_type_of env sigma m in
+ let t = Retyping.get_type_of env sigma m in
let cstrs =
let rec aux t =
match EConstr.kind sigma t with
@@ -1936,7 +1937,7 @@ let build_morphism_signature env sigma m =
let default_morphism sign m =
let env = Global.env () in
let sigma = Evd.from_env env in
- let t = Typing.unsafe_type_of env sigma m in
+ let t = Retyping.get_type_of env sigma m in
let evars, _, sign, cstrs =
PropGlobal.build_signature (sigma, Evar.Set.empty) env t (fst sign) (snd sign)
in
@@ -2195,10 +2196,10 @@ let setoid_transitivity c =
(transitivity_red true c)
let setoid_symmetry_in id =
- let open Tacmach.New in
Proofview.Goal.enter begin fun gl ->
- let sigma = project gl in
- let ctype = pf_unsafe_type_of gl (mkVar id) in
+ let env = Proofview.Goal.env gl in
+ let sigma = Proofview.Goal.sigma gl in
+ let ctype = Retyping.get_type_of env sigma (mkVar id) in
let binders,concl = decompose_prod_assum sigma ctype in
let (equiv, args) = decompose_app sigma concl in
let rec split_last_two = function
diff --git a/plugins/omega/coq_omega.ml b/plugins/omega/coq_omega.ml
index dcd85401d6..979e5bb8d8 100644
--- a/plugins/omega/coq_omega.ml
+++ b/plugins/omega/coq_omega.ml
@@ -1713,7 +1713,6 @@ let onClearedName2 id tac =
let destructure_hyps =
Proofview.Goal.enter begin fun gl ->
- let type_of = Tacmach.New.pf_unsafe_type_of gl in
let env = Proofview.Goal.env gl in
let sigma = Proofview.Goal.sigma gl in
let decidability = decidability env sigma in
@@ -1759,7 +1758,7 @@ let destructure_hyps =
| Kimp(t1,t2) ->
(* t1 and t2 might be in Type rather than Prop.
For t1, the decidability check will ensure being Prop. *)
- if Termops.is_Prop sigma (type_of t2)
+ if Termops.is_Prop sigma (Retyping.get_type_of env sigma t2)
then
let d1 = decidability t1 in
tclTHENLIST [
diff --git a/pretyping/cases.ml b/pretyping/cases.ml
index cbd04a76ad..29d6726262 100644
--- a/pretyping/cases.ml
+++ b/pretyping/cases.ml
@@ -2164,7 +2164,7 @@ let constr_of_pat env sigma arsign pat avoid =
let IndType (indf, _) =
try find_rectype env sigma (lift (-(List.length realargs)) ty)
with Not_found -> error_case_not_inductive env sigma
- {uj_val = ty; uj_type = Typing.unsafe_type_of env sigma ty}
+ {uj_val = ty; uj_type = Retyping.get_type_of env sigma ty}
in
let (ind,u), params = dest_ind_family indf in
let params = List.map EConstr.of_constr params in
diff --git a/pretyping/evarsolve.ml b/pretyping/evarsolve.ml
index b54a713a16..aafd662f7d 100644
--- a/pretyping/evarsolve.ml
+++ b/pretyping/evarsolve.ml
@@ -311,21 +311,47 @@ let eq_alias a b = match a, b with
| VarAlias id1, VarAlias id2 -> Id.equal id1 id2
| _ -> false
-type aliasing = EConstr.t option * alias list
+type 'a aliasing = 'a option * alias list
let empty_aliasing = None, []
let make_aliasing c = Some c, []
let push_alias (alias, l) a = (alias, a :: l)
+
+module Alias =
+struct
+type t = { mutable lift : int; mutable data : EConstr.t }
+
+let make c = { lift = 0; data = c }
+
+let lift n { lift; data } = { lift = lift + n; data }
+
+let eval alias =
+ let c = EConstr.Vars.lift alias.lift alias.data in
+ let () = alias.lift <- 0 in
+ let () = alias.data <- c in
+ c
+
+let repr sigma alias = match EConstr.kind sigma alias.data with
+| Rel n -> Some (RelAlias (n + alias.lift))
+| Var id -> Some (VarAlias id)
+| _ -> None
+
+end
+
let lift_aliasing n (alias, l) =
let map a = match a with
| VarAlias _ -> a
| RelAlias m -> RelAlias (m + n)
in
- (Option.map (fun c -> lift n c) alias, List.map map l)
+ (Option.map (fun c -> Alias.lift n c) alias, List.map map l)
+
+let cast_aliasing (alias, l) = match alias with
+| None -> (None, l)
+| Some c -> (Some (Alias.make c), l)
type aliases = {
- rel_aliases : aliasing Int.Map.t;
- var_aliases : aliasing Id.Map.t;
+ rel_aliases : Alias.t aliasing Int.Map.t;
+ var_aliases : EConstr.t aliasing Id.Map.t;
(** Only contains [VarAlias] *)
}
@@ -359,13 +385,14 @@ let compute_rel_aliases var_aliases rels sigma =
| Var id' ->
let aliases_of_n =
try Id.Map.find id' var_aliases with Not_found -> empty_aliasing in
- Int.Map.add n (push_alias aliases_of_n (VarAlias id')) aliases
+ Int.Map.add n (push_alias (cast_aliasing aliases_of_n) (VarAlias id')) aliases
| Rel p ->
let aliases_of_n =
try Int.Map.find (p+n) aliases with Not_found -> empty_aliasing in
Int.Map.add n (push_alias aliases_of_n (RelAlias (p+n))) aliases
| _ ->
- Int.Map.add n (make_aliasing (lift n (mkCast(t,DEFAULTcast,u)))) aliases)
+ let alias = Alias.lift n (Alias.make @@ mkCast(t,DEFAULTcast, u)) in
+ Int.Map.add n (make_aliasing alias) aliases)
| LocalAssum _ -> aliases)
)
rels
@@ -387,7 +414,7 @@ let lift_aliases n aliases =
let get_alias_chain_of sigma aliases x = match x with
| RelAlias n -> (try Int.Map.find n aliases.rel_aliases with Not_found -> empty_aliasing)
- | VarAlias id -> (try Id.Map.find id aliases.var_aliases with Not_found -> empty_aliasing)
+ | VarAlias id -> (try cast_aliasing (Id.Map.find id aliases.var_aliases) with Not_found -> empty_aliasing)
let normalize_alias_opt_alias sigma aliases x =
match get_alias_chain_of sigma aliases x with
@@ -420,13 +447,14 @@ let extend_alias sigma decl { var_aliases; rel_aliases } =
| Var id' ->
let aliases_of_binder =
try Id.Map.find id' var_aliases with Not_found -> empty_aliasing in
- Int.Map.add 1 (push_alias aliases_of_binder (VarAlias id')) rel_aliases
+ Int.Map.add 1 (push_alias (cast_aliasing aliases_of_binder) (VarAlias id')) rel_aliases
| Rel p ->
let aliases_of_binder =
try Int.Map.find (p+1) rel_aliases with Not_found -> empty_aliasing in
Int.Map.add 1 (push_alias aliases_of_binder (RelAlias (p+1))) rel_aliases
| _ ->
- Int.Map.add 1 (make_aliasing (lift 1 t)) rel_aliases)
+ let alias = Alias.lift 1 (Alias.make t) in
+ Int.Map.add 1 (make_aliasing alias) rel_aliases)
| LocalAssum _ -> rel_aliases in
{ var_aliases; rel_aliases }
@@ -434,7 +462,7 @@ let expand_alias_once sigma aliases x =
match get_alias_chain_of sigma aliases x with
| None, [] -> None
| Some a, [] -> Some a
- | _, l -> Some (of_alias (List.last l))
+ | _, l -> Some (Alias.make (of_alias (List.last l)))
let expansions_of_var sigma aliases x =
let (_, l) = get_alias_chain_of sigma aliases x in
@@ -442,9 +470,9 @@ let expansions_of_var sigma aliases x =
let expansion_of_var sigma aliases x =
match get_alias_chain_of sigma aliases x with
- | None, [] -> (false, of_alias x)
- | Some a, _ -> (true, a)
- | None, a :: _ -> (true, of_alias a)
+ | None, [] -> (false, Some x)
+ | Some a, _ -> (true, Alias.repr sigma a)
+ | None, a :: _ -> (true, Some a)
let rec expand_vars_in_term_using sigma aliases t = match EConstr.kind sigma t with
| Rel n -> of_alias (normalize_alias sigma aliases (RelAlias n))
@@ -482,10 +510,10 @@ let free_vars_and_rels_up_alias_expansion env sigma aliases c =
match ck with
| VarAlias id -> acc4 := Id.Set.add id !acc4
| RelAlias n -> if n >= depth+1 then acc3 := Int.Set.add (n-depth) !acc3);
- match EConstr.kind sigma c' with
- | Var id -> acc2 := Id.Set.add id !acc2
- | Rel n -> if n >= depth+1 then acc1 := Int.Set.add (n-depth) !acc1
- | _ -> frec (aliases,depth) c end
+ match c' with
+ | Some (VarAlias id) -> acc2 := Id.Set.add id !acc2
+ | Some (RelAlias n) -> if n >= depth+1 then acc1 := Int.Set.add (n-depth) !acc1
+ | None -> frec (aliases,depth) c end
| Const _ | Ind _ | Construct _ ->
acc2 := Id.Set.union (vars_of_global env (fst @@ EConstr.destRef sigma c)) !acc2
| _ ->
@@ -971,7 +999,7 @@ let invert_arg_from_subst evd aliases k0 subst_in_env_extended_with_k_binders c_
with Not_found ->
match expand_alias_once evd aliases t with
| None -> raise Not_found
- | Some c -> aux k (lift k c) in
+ | Some c -> aux k (Alias.eval (Alias.lift k c)) in
try
let c = aux 0 c_in_env_extended_with_k_binders in
Invertible (UniqueProjection (c,!effects))
@@ -1223,7 +1251,7 @@ let rec is_constrainable_in top env evd k (ev,(fv_rels,fv_ids) as g) t =
let has_constrainable_free_vars env evd aliases force k ev (fv_rels,fv_ids,let_rels,let_ids) t =
match to_alias evd t with
| Some t ->
- let expanded, t' = expansion_of_var evd aliases t in
+ let expanded, _ = expansion_of_var evd aliases t in
if expanded then
(* t is a local definition, we keep it only if appears in the list *)
(* of let-in variables effectively occurring on the right-hand side, *)
diff --git a/pretyping/pretyping.ml b/pretyping/pretyping.ml
index bf61d44a10..cb0c4868b5 100644
--- a/pretyping/pretyping.ml
+++ b/pretyping/pretyping.ml
@@ -446,7 +446,7 @@ let pretype_ref ?loc sigma env ref us =
Pretype_errors.error_var_not_found ?loc !!env sigma id)
| ref ->
let sigma, c = pretype_global ?loc univ_flexible env sigma ref us in
- let ty = unsafe_type_of !!env sigma c in
+ let sigma, ty = type_of !!env sigma c in
sigma, make_judge c ty
let interp_sort ?loc evd : glob_sort -> _ = function
diff --git a/pretyping/reductionops.ml b/pretyping/reductionops.ml
index 4d4fe13983..d5beebe690 100644
--- a/pretyping/reductionops.ml
+++ b/pretyping/reductionops.ml
@@ -722,32 +722,31 @@ let magicaly_constant_of_fixbody env sigma reference bd = function
| Name.Anonymous -> bd
| Name.Name id ->
let open UnivProblem in
- try
- let (cst_mod,_) = Constant.repr2 reference in
- let cst = Constant.make2 cst_mod (Label.of_id id) in
+ let (cst_mod,_) = Constant.repr2 reference in
+ let cst = Constant.make2 cst_mod (Label.of_id id) in
+ if not (Environ.mem_constant cst env) then bd
+ else
let (cst, u), ctx = UnivGen.fresh_constant_instance env cst in
match constant_opt_value_in env (cst,u) with
| None -> bd
| Some t ->
let csts = EConstr.eq_constr_universes env sigma (EConstr.of_constr t) bd in
begin match csts with
- | Some csts ->
- let subst = Set.fold (fun cst acc ->
- let l, r = match cst with
- | ULub (u, v) | UWeak (u, v) -> u, v
- | UEq (u, v) | ULe (u, v) ->
- let get u = Option.get (Universe.level u) in
- get u, get v
- in
- Univ.LMap.add l r acc)
- csts Univ.LMap.empty
- in
- let inst = Instance.subst_fn (fun u -> Univ.LMap.find u subst) u in
- mkConstU (cst, EInstance.make inst)
- | None -> bd
+ | Some csts ->
+ let subst = Set.fold (fun cst acc ->
+ let l, r = match cst with
+ | ULub (u, v) | UWeak (u, v) -> u, v
+ | UEq (u, v) | ULe (u, v) ->
+ let get u = Option.get (Universe.level u) in
+ get u, get v
+ in
+ Univ.LMap.add l r acc)
+ csts Univ.LMap.empty
+ in
+ let inst = Instance.subst_fn (fun u -> Univ.LMap.find u subst) u in
+ mkConstU (cst, EInstance.make inst)
+ | None -> bd
end
- with
- | Not_found -> bd
let contract_cofix ?env sigma ?reference (bodynum,(names,types,bodies as typedbodies)) =
let nbodies = Array.length bodies in
diff --git a/pretyping/tacred.ml b/pretyping/tacred.ml
index 10e8cf7e0f..f87c50b5e4 100644
--- a/pretyping/tacred.ml
+++ b/pretyping/tacred.ml
@@ -1197,7 +1197,7 @@ let abstract_scheme env sigma (locc,a) (c, sigma) =
let pattern_occs loccs_trm = begin fun env sigma c ->
let abstr_trm, sigma = List.fold_right (abstract_scheme env sigma) loccs_trm (c,sigma) in
try
- let _ = Typing.unsafe_type_of env sigma abstr_trm in
+ let sigma, _ = Typing.type_of env sigma abstr_trm in
(sigma, applist(abstr_trm, List.map snd loccs_trm))
with Type_errors.TypeError (env',t) ->
raise (ReductionTacticError (InvalidAbstraction (env,sigma,abstr_trm,(env',t))))
diff --git a/pretyping/typing.ml b/pretyping/typing.ml
index a15134f58d..4582844b71 100644
--- a/pretyping/typing.ml
+++ b/pretyping/typing.ml
@@ -253,6 +253,9 @@ let judge_of_type u =
let judge_of_relative env v =
Environ.on_judgment EConstr.of_constr (judge_of_relative env v)
+let type_of_variable env id =
+ EConstr.of_constr (type_of_variable env id)
+
let judge_of_variable env id =
Environ.on_judgment EConstr.of_constr (judge_of_variable env id)
diff --git a/pretyping/typing.mli b/pretyping/typing.mli
index 1b07b2bb78..fd2dc7c2fc 100644
--- a/pretyping/typing.mli
+++ b/pretyping/typing.mli
@@ -30,6 +30,9 @@ val sort_of : env -> evar_map -> types -> evar_map * Sorts.t
(** Typecheck a term has a given type (assuming the type is OK) *)
val check : env -> evar_map -> constr -> types -> evar_map
+(** Type of a variable. *)
+val type_of_variable : env -> variable -> types
+
(** Returns the instantiated type of a metavariable *)
val meta_type : evar_map -> metavariable -> types
diff --git a/pretyping/unification.ml b/pretyping/unification.ml
index 6486435ca2..2157c4ef6a 100644
--- a/pretyping/unification.ml
+++ b/pretyping/unification.ml
@@ -1274,12 +1274,14 @@ let applyHead env evd n c =
else
match EConstr.kind evd (whd_all env evd cty) with
| Prod (_,c1,c2) ->
- let (evd',evar) =
- Evarutil.new_evar env evd ~src:(Loc.tag Evar_kinds.GoalEvar) c1 in
- apprec (n-1) (mkApp(c,[|evar|])) (subst1 evar c2) evd'
+ let (evd,evar) =
+ Evarutil.new_evar env evd ~src:(Loc.tag Evar_kinds.GoalEvar) c1
+ in
+ apprec (n-1) (mkApp(c,[|evar|])) (subst1 evar c2) evd
| _ -> user_err Pp.(str "Apply_Head_Then")
in
- apprec n c (Typing.unsafe_type_of env evd c) evd
+ let evd, t = Typing.type_of env evd c in
+ apprec n c t evd
let is_mimick_head sigma ts f =
match EConstr.kind sigma f with
diff --git a/proofs/clenv.ml b/proofs/clenv.ml
index e466992721..b0eb8dc646 100644
--- a/proofs/clenv.ml
+++ b/proofs/clenv.ml
@@ -128,8 +128,6 @@ let mk_clenv_from_n gls n (c,cty) =
let mk_clenv_from gls = mk_clenv_from_n gls None
-let mk_clenv_type_of gls t = mk_clenv_from gls (t,Tacmach.New.pf_unsafe_type_of gls t)
-
(******************************************************************)
(* [mentions clenv mv0 mv1] is true if mv1 is defined and mentions
diff --git a/proofs/clenv.mli b/proofs/clenv.mli
index 3fca967395..7213c9318c 100644
--- a/proofs/clenv.mli
+++ b/proofs/clenv.mli
@@ -46,7 +46,6 @@ val clenv_meta_type : clausenv -> metavariable -> types
val mk_clenv_from : Proofview.Goal.t -> EConstr.constr * EConstr.types -> clausenv
val mk_clenv_from_n :
Proofview.Goal.t -> int option -> EConstr.constr * EConstr.types -> clausenv
-val mk_clenv_type_of : Proofview.Goal.t -> EConstr.constr -> clausenv
val mk_clenv_from_env : env -> evar_map -> int option -> EConstr.constr * EConstr.types -> clausenv
(** Refresh the universes in a clenv *)
diff --git a/proofs/logic.ml b/proofs/logic.ml
index a361c4208e..bac13fcfc3 100644
--- a/proofs/logic.ml
+++ b/proofs/logic.ml
@@ -79,7 +79,7 @@ let check = ref false
let with_check = Flags.with_option check
let check_typability env sigma c =
- if !check then let _ = unsafe_type_of env sigma (EConstr.of_constr c) in ()
+ if !check then fst (type_of env sigma (EConstr.of_constr c)) else sigma
(************************************************************************)
(************************************************************************)
@@ -363,7 +363,7 @@ let rec mk_refgoals sigma goal goalacc conclty trm =
gl::goalacc, conclty, sigma, ev
| Cast (t,k, ty) ->
- check_typability env sigma ty;
+ let sigma = check_typability env sigma ty in
let sigma = check_conv_leq_goal env sigma trm ty conclty in
let res = mk_refgoals sigma goal goalacc ty t in
(* we keep the casts (in particular VMcast and NATIVEcast) except
@@ -430,13 +430,13 @@ and mk_hdgoals sigma goal goalacc trm =
Goal.V82.mk_goal sigma hyps concl in
match kind trm with
| Cast (c,_, ty) when isMeta c ->
- check_typability env sigma ty;
+ let sigma = check_typability env sigma ty in
let (gl,ev,sigma) = mk_goal hyps (nf_betaiota env sigma (EConstr.of_constr ty)) in
let ev = EConstr.Unsafe.to_constr ev in
gl::goalacc,ty,sigma,ev
| Cast (t,_, ty) ->
- check_typability env sigma ty;
+ let sigma = check_typability env sigma ty in
mk_refgoals sigma goal goalacc ty t
| App (f,l) ->
diff --git a/tactics/autorewrite.ml b/tactics/autorewrite.ml
index cd6f445503..1bbcca8827 100644
--- a/tactics/autorewrite.ml
+++ b/tactics/autorewrite.ml
@@ -238,7 +238,7 @@ let decompose_applied_relation metas env sigma c ctype left2right =
in
try
let others,(c1,c2) = split_last_two args in
- let ty1, ty2 = Typing.unsafe_type_of env eqclause.evd c1, Typing.unsafe_type_of env eqclause.evd c2 in
+ let ty1, ty2 = Retyping.get_type_of env eqclause.evd c1, Retyping.get_type_of env eqclause.evd c2 in
(* XXX: It looks like mk_clenv_from_env should be fixed instead? *)
let open EConstr in
let hyp_ty = Unsafe.to_constr ty in
@@ -261,7 +261,7 @@ let decompose_applied_relation metas env sigma c ctype left2right =
| None -> None
let find_applied_relation ?loc metas env sigma c left2right =
- let ctype = Typing.unsafe_type_of env sigma (EConstr.of_constr c) in
+ let ctype = Retyping.get_type_of env sigma (EConstr.of_constr c) in
match decompose_applied_relation metas env sigma c ctype left2right with
| Some c -> c
| None ->
diff --git a/tactics/class_tactics.ml b/tactics/class_tactics.ml
index f8cb8870ea..ccd88d2c35 100644
--- a/tactics/class_tactics.ml
+++ b/tactics/class_tactics.ml
@@ -1202,10 +1202,9 @@ let autoapply c i =
in
let flags = auto_unif_flags
(Hints.Hint_db.transparent_state hintdb) in
- let cty = Tacmach.New.pf_unsafe_type_of gl c in
+ let cty = Tacmach.New.pf_get_type_of gl c in
let ce = mk_clenv_from gl (c,cty) in
- unify_e_resolve false flags gl
- ((c,cty,Univ.ContextSet.empty),0,ce) <*>
+ unify_e_resolve false flags gl ((c,cty,Univ.ContextSet.empty),0,ce) <*>
Proofview.tclEVARMAP >>= (fun sigma ->
let sigma = Typeclasses.make_unresolvables
(fun ev -> Typeclasses.all_goals ev (Lazy.from_val (snd (Evd.find sigma ev).evar_source))) sigma in
diff --git a/tactics/contradiction.ml b/tactics/contradiction.ml
index 1f5a6380fd..c7b6998c8c 100644
--- a/tactics/contradiction.ml
+++ b/tactics/contradiction.ml
@@ -110,8 +110,7 @@ let contradiction_term (c,lbind as cl) =
Proofview.Goal.enter begin fun gl ->
let sigma = Tacmach.New.project gl in
let env = Proofview.Goal.env gl in
- let type_of = Tacmach.New.pf_unsafe_type_of gl in
- let typ = type_of c in
+ let typ = Tacmach.New.pf_get_type_of gl c in
let _, ccl = splay_prod env sigma typ in
if is_empty_type env sigma ccl then
Tacticals.New.tclTHEN
diff --git a/tactics/declare.ml b/tactics/declare.ml
index c7581fb0e0..ce2f3ec2c5 100644
--- a/tactics/declare.ml
+++ b/tactics/declare.ml
@@ -160,6 +160,18 @@ let register_side_effect (c, role) =
| None -> ()
| Some (Evd.Schema (ind, kind)) -> DeclareScheme.declare_scheme kind [|ind,c|]
+let get_roles export eff =
+ let map c =
+ let role = try Some (Cmap.find c eff.Evd.seff_roles) with Not_found -> None in
+ (c, role)
+ in
+ List.map map export
+
+let export_side_effects eff =
+ let export = Global.export_private_constants eff.Evd.seff_private in
+ let export = get_roles export eff in
+ List.iter register_side_effect export
+
let record_aux env s_ty s_bo =
let open Environ in
let in_ty = keep_hyps env s_ty in
@@ -278,13 +290,6 @@ let cast_opaque_proof_entry (type a b) (entry : (a, b) effect_entry) (e : a proo
opaque_entry_universes = univs;
}
-let get_roles export eff =
- let map c =
- let role = try Some (Cmap.find c eff.Evd.seff_roles) with Not_found -> None in
- (c, role)
- in
- List.map map export
-
let feedback_axiom () = Feedback.(feedback AddedAxiom)
let is_unsafe_typing_flags () =
@@ -293,37 +298,36 @@ let is_unsafe_typing_flags () =
let define_constant ~name cd =
(* Logically define the constant and its subproofs, no libobject tampering *)
- let export, decl, unsafe = match cd with
- | DefinitionEntry de ->
- (* We deal with side effects *)
- if not de.proof_entry_opaque then
- (* This globally defines the side-effects in the environment. *)
- let body, eff = Future.force de.proof_entry_body in
- let body, export = Global.export_private_constants (body, eff.Evd.seff_private) in
- let export = get_roles export eff in
- let de = { de with proof_entry_body = Future.from_val (body, ()) } in
- let cd = Entries.DefinitionEntry (cast_proof_entry de) in
- export, ConstantEntry cd, false
- else
- let map (body, eff) = body, eff.Evd.seff_private in
- let body = Future.chain de.proof_entry_body map in
- let de = { de with proof_entry_body = body } in
- let de = cast_opaque_proof_entry EffectEntry de in
- [], OpaqueEntry de, false
- | ParameterEntry e ->
- [], ConstantEntry (Entries.ParameterEntry e), not (Lib.is_modtype_strict())
- | PrimitiveEntry e ->
- [], ConstantEntry (Entries.PrimitiveEntry e), false
+ let decl, unsafe = match cd with
+ | DefinitionEntry de ->
+ (* We deal with side effects *)
+ if not de.proof_entry_opaque then
+ let body, eff = Future.force de.proof_entry_body in
+ (* This globally defines the side-effects in the environment
+ and registers their libobjects. *)
+ let () = export_side_effects eff in
+ let de = { de with proof_entry_body = Future.from_val (body, ()) } in
+ let cd = Entries.DefinitionEntry (cast_proof_entry de) in
+ ConstantEntry cd, false
+ else
+ let map (body, eff) = body, eff.Evd.seff_private in
+ let body = Future.chain de.proof_entry_body map in
+ let de = { de with proof_entry_body = body } in
+ let de = cast_opaque_proof_entry EffectEntry de in
+ OpaqueEntry de, false
+ | ParameterEntry e ->
+ ConstantEntry (Entries.ParameterEntry e), not (Lib.is_modtype_strict())
+ | PrimitiveEntry e ->
+ ConstantEntry (Entries.PrimitiveEntry e), false
in
let kn = Global.add_constant name decl in
if unsafe || is_unsafe_typing_flags() then feedback_axiom();
- kn, export
+ kn
let declare_constant ?(local = ImportDefaultBehavior) ~name ~kind cd =
let () = check_exists name in
- let kn, export = define_constant ~name cd in
- (* Register the libobjects attached to the constants and its subproofs *)
- let () = List.iter register_side_effect export in
+ let kn = define_constant ~name cd in
+ (* Register the libobjects attached to the constants *)
let () = register_constant kn kind local in
kn
@@ -377,10 +381,8 @@ let declare_variable ~name ~kind d =
| SectionLocalDef (de) ->
(* The body should already have been forced upstream because it is a
section-local definition, but it's not enforced by typing *)
- let (body, eff) = Future.force de.proof_entry_body in
- let ((body, uctx), export) = Global.export_private_constants (body, eff.Evd.seff_private) in
- let eff = get_roles export eff in
- let () = List.iter register_side_effect eff in
+ let ((body, uctx), eff) = Future.force de.proof_entry_body in
+ let () = export_side_effects eff in
let poly, univs = match de.proof_entry_universes with
| Monomorphic_entry uctx -> false, uctx
| Polymorphic_entry (_, uctx) -> true, Univ.ContextSet.of_context uctx
diff --git a/tactics/eauto.ml b/tactics/eauto.ml
index 361215bf38..80ca124912 100644
--- a/tactics/eauto.ml
+++ b/tactics/eauto.ml
@@ -32,11 +32,13 @@ let eauto_unif_flags = auto_flags_of_state TransparentState.full
let e_give_exact ?(flags=eauto_unif_flags) c =
Proofview.Goal.enter begin fun gl ->
- let t1 = Tacmach.New.pf_unsafe_type_of gl c in
+ let sigma, t1 = Tacmach.New.pf_type_of gl c in
let t2 = Tacmach.New.pf_concl gl in
- let sigma = Tacmach.New.project gl in
if occur_existential sigma t1 || occur_existential sigma t2 then
- Tacticals.New.tclTHEN (Clenvtac.unify ~flags t1) (exact_no_check c)
+ Tacticals.New.tclTHENLIST
+ [Proofview.Unsafe.tclEVARS sigma;
+ Clenvtac.unify ~flags t1;
+ exact_no_check c]
else exact_check c
end
diff --git a/tactics/elim.ml b/tactics/elim.ml
index ea61b8e4df..379a8d5401 100644
--- a/tactics/elim.ml
+++ b/tactics/elim.ml
@@ -80,14 +80,11 @@ let up_to_delta = ref false (* true *)
let general_decompose recognizer c =
Proofview.Goal.enter begin fun gl ->
- let type_of = pf_unsafe_type_of gl in
- let env = pf_env gl in
- let sigma = project gl in
- let typc = type_of c in
+ let typc = pf_get_type_of gl c in
tclTHENS (cut typc)
[ tclTHEN (intro_using tmphyp_name)
(onLastHypId
- (ifOnHyp (recognizer env sigma) (general_decompose_aux (recognizer env sigma))
+ (ifOnHyp recognizer (general_decompose_aux recognizer)
(fun id -> clear [id])));
exact_no_check c ]
end
@@ -136,7 +133,7 @@ let induction_trailer abs_i abs_j bargs =
(onLastHypId
(fun id ->
Proofview.Goal.enter begin fun gl ->
- let idty = pf_unsafe_type_of gl (mkVar id) in
+ let idty = pf_get_type_of gl (mkVar id) in
let fvty = global_vars (pf_env gl) (project gl) idty in
let possible_bring_hyps =
(List.tl (nLastDecls gl (abs_j - abs_i))) @ bargs.Tacticals.assums
diff --git a/tactics/eqdecide.ml b/tactics/eqdecide.ml
index bdfd200988..a82b26f428 100644
--- a/tactics/eqdecide.ml
+++ b/tactics/eqdecide.ml
@@ -195,13 +195,13 @@ let rec solveArg hyps eqonleft mk largs rargs = match largs, rargs with
]
| a1 :: largs, a2 :: rargs ->
Proofview.Goal.enter begin fun gl ->
- let rectype = pf_unsafe_type_of gl a1 in
+ let sigma, rectype = pf_type_of gl a1 in
let decide = mk rectype a1 a2 in
let tac hyp = solveArg (hyp :: hyps) eqonleft mk largs rargs in
let subtacs =
if eqonleft then [eqCase tac;diseqCase hyps eqonleft;default_auto]
else [diseqCase hyps eqonleft;eqCase tac;default_auto] in
- (tclTHENS (elim_type decide) subtacs)
+ tclTHEN (Proofview.Unsafe.tclEVARS sigma) (tclTHENS (elim_type decide) subtacs)
end
| _ -> invalid_arg "List.fold_right2"
@@ -274,11 +274,12 @@ let compare c1 c2 =
pf_constr_of_global (lib_ref "core.eq.type") >>= fun eqc ->
pf_constr_of_global (lib_ref "core.not.type") >>= fun notc ->
Proofview.Goal.enter begin fun gl ->
- let rectype = pf_unsafe_type_of gl c1 in
+ let sigma, rectype = pf_type_of gl c1 in
let ops = (opc,eqc,notc) in
let decide = mkDecideEqGoal true ops rectype c1 c2 in
- (tclTHENS (cut decide)
- [(tclTHEN intro
- (tclTHEN (onLastHyp simplest_case) clear_last));
- decideEquality rectype ops])
+ tclTHEN (Proofview.Unsafe.tclEVARS sigma)
+ (tclTHENS (cut decide)
+ [(tclTHEN intro
+ (tclTHEN (onLastHyp simplest_case) clear_last));
+ decideEquality rectype ops])
end
diff --git a/tactics/equality.ml b/tactics/equality.ml
index 96b61b6994..9195746dc6 100644
--- a/tactics/equality.ml
+++ b/tactics/equality.ml
@@ -1062,14 +1062,14 @@ let discrEq (lbeq,_,(t,t1,t2) as u) eq_clause =
let onEquality with_evars tac (c,lbindc) =
Proofview.Goal.enter begin fun gl ->
- let type_of = pf_unsafe_type_of gl in
let reduce_to_quantified_ind = pf_apply Tacred.reduce_to_quantified_ind gl in
- let t = type_of c in
+ let t = pf_get_type_of gl c in
let t' = try snd (reduce_to_quantified_ind t) with UserError _ -> t in
let eq_clause = pf_apply make_clenv_binding gl (c,t') lbindc in
let eq_clause' = Clenvtac.clenv_pose_dependent_evars ~with_evars eq_clause in
let eqn = clenv_type eq_clause' in
- let (eq,u,eq_args) = find_this_eq_data_decompose gl eqn in
+ (* FIXME evar leak *)
+ let (eq,u,eq_args) = pf_apply find_this_eq_data_decompose gl eqn in
tclTHEN
(Proofview.Unsafe.tclEVARS eq_clause'.evd)
(tac (eq,eqn,eq_args) eq_clause')
@@ -1165,7 +1165,7 @@ let minimal_free_rels_rec env sigma =
let rec minimalrec_free_rels_rec prev_rels (c,cty) =
let (cty,direct_rels) = minimal_free_rels env sigma (c,cty) in
let combined_rels = Int.Set.union prev_rels direct_rels in
- let folder rels i = snd (minimalrec_free_rels_rec rels (c, unsafe_type_of env sigma (mkRel i)))
+ let folder rels i = snd (minimalrec_free_rels_rec rels (c, get_type_of env sigma (mkRel i)))
in (cty, List.fold_left folder combined_rels (Int.Set.elements (Int.Set.diff direct_rels prev_rels)))
in minimalrec_free_rels_rec Int.Set.empty
@@ -1210,7 +1210,7 @@ let sig_clausal_form env sigma sort_of_ty siglen ty dflt =
let rec sigrec_clausal_form sigma siglen p_i =
if Int.equal siglen 0 then
(* is the default value typable with the expected type *)
- let dflt_typ = unsafe_type_of env sigma dflt in
+ let sigma, dflt_typ = type_of env sigma dflt in
try
let sigma = Evarconv.unify_leq_delay env sigma dflt_typ p_i in
let sigma = Evarconv.solve_unif_constraints_with_heuristics env sigma in
@@ -1224,29 +1224,21 @@ let sig_clausal_form env sigma sort_of_ty siglen ty dflt =
let sigma, ev = Evarutil.new_evar env sigma a in
let rty = beta_applist sigma (p_i_minus_1,[ev]) in
let sigma, tuple_tail = sigrec_clausal_form sigma (siglen-1) rty in
- let evopt = match EConstr.kind sigma ev with Evar _ -> None | _ -> Some ev in
- match evopt with
- | Some w ->
- let w_type = unsafe_type_of env sigma w in
- begin match Evarconv.unify_leq_delay env sigma w_type a with
- | sigma ->
- let sigma, exist_term = Evd.fresh_global env sigma sigdata.intro in
- sigma, applist(exist_term,[a;p_i_minus_1;w;tuple_tail])
- | exception Evarconv.UnableToUnify _ ->
- user_err Pp.(str "Cannot solve a unification problem.")
- end
- | None ->
- (* This at least happens if what has been detected as a
- dependency is not one; use an evasive error message;
- even if the problem is upwards: unification should be
- tried in the first place in make_iterated_tuple instead
- of approximatively computing the free rels; then
- unsolved evars would mean not binding rel *)
- user_err Pp.(str "Cannot solve a unification problem.")
+ if EConstr.isEvar sigma ev then
+ (* This at least happens if what has been detected as a
+ dependency is not one; use an evasive error message;
+ even if the problem is upwards: unification should be
+ tried in the first place in make_iterated_tuple instead
+ of approximatively computing the free rels; then
+ unsolved evars would mean not binding rel *)
+ user_err Pp.(str "Cannot solve a unification problem.")
+ else
+ let sigma, exist_term = Evd.fresh_global env sigma sigdata.intro in
+ sigma, applist(exist_term,[a;p_i_minus_1;ev;tuple_tail])
in
let sigma = Evd.clear_metas sigma in
let sigma, scf = sigrec_clausal_form sigma siglen ty in
- sigma, Evarutil.nf_evar sigma scf
+ sigma, Evarutil.nf_evar sigma scf
(* The problem is to build a destructor (a generalization of the
predecessor) which, when applied to a term made of constructors
@@ -1319,7 +1311,7 @@ let make_iterated_tuple env sigma dflt (z,zty) =
sigma, (tuple,tuplety,dfltval)
let rec build_injrec env sigma dflt c = function
- | [] -> make_iterated_tuple env sigma dflt (c,unsafe_type_of env sigma c)
+ | [] -> make_iterated_tuple env sigma dflt (c,get_type_of env sigma c)
| ((sp,cnum),argnum)::l ->
try
let (cnum_nlams,cnum_env,kont) = descend_then env sigma c cnum in
@@ -1341,7 +1333,7 @@ let inject_if_homogenous_dependent_pair ty =
Proofview.Goal.enter begin fun gl ->
try
let sigma = Tacmach.New.project gl in
- let eq,u,(t,t1,t2) = find_this_eq_data_decompose gl ty in
+ let eq,u,(t,t1,t2) = pf_apply find_this_eq_data_decompose gl ty in
(* fetch the informations of the pair *)
let sigTconstr = Coqlib.(lib_ref "core.sigT.type") in
let existTconstr = Coqlib.lib_ref "core.sigT.intro" in
@@ -1360,7 +1352,7 @@ let inject_if_homogenous_dependent_pair ty =
if not (Ind_tables.check_scheme (!eq_dec_scheme_kind_name()) ind &&
pf_apply is_conv gl ar1.(2) ar2.(2)) then raise Exit;
check_required_library ["Coq";"Logic";"Eqdep_dec"];
- let new_eq_args = [|pf_unsafe_type_of gl ar1.(3);ar1.(3);ar2.(3)|] in
+ let new_eq_args = [|pf_get_type_of gl ar1.(3);ar1.(3);ar2.(3)|] in
let inj2 = lib_ref "core.eqdep_dec.inj_pair2" in
let c, eff = find_scheme (!eq_dec_scheme_kind_name()) ind in
(* cut with the good equality and prove the requested goal *)
@@ -1603,7 +1595,7 @@ let cutSubstInConcl l2r eqn =
Proofview.Goal.enter begin fun gl ->
let env = Proofview.Goal.env gl in
let sigma = Proofview.Goal.sigma gl in
- let (lbeq,u,(t,e1,e2)) = find_eq_data_decompose gl eqn in
+ let (lbeq,u,(t,e1,e2)) = pf_apply find_eq_data_decompose gl eqn in
let typ = pf_concl gl in
let (e1,e2) = if l2r then (e1,e2) else (e2,e1) in
let (sigma, (typ, expected)) = subst_tuple_term env sigma e1 e2 typ in
@@ -1620,7 +1612,7 @@ let cutSubstInHyp l2r eqn id =
Proofview.Goal.enter begin fun gl ->
let env = Proofview.Goal.env gl in
let sigma = Proofview.Goal.sigma gl in
- let (lbeq,u,(t,e1,e2)) = find_eq_data_decompose gl eqn in
+ let (lbeq,u,(t,e1,e2)) = pf_apply find_eq_data_decompose gl eqn in
let typ = pf_get_hyp_typ id gl in
let (e1,e2) = if l2r then (e1,e2) else (e2,e1) in
let (sigma, (typ, expected)) = subst_tuple_term env sigma e1 e2 typ in
@@ -1715,7 +1707,7 @@ let is_eq_x gl x d =
| _ -> false
in
let c = pf_nf_evar gl (NamedDecl.get_type d) in
- let (_,lhs,rhs) = pi3 (find_eq_data_decompose gl c) in
+ let (_,lhs,rhs) = pi3 (pf_apply find_eq_data_decompose gl c) in
if (is_var x lhs) && not (local_occur_var (project gl) x rhs) then raise (FoundHyp (id,rhs,true));
if (is_var x rhs) && not (local_occur_var (project gl) x lhs) then raise (FoundHyp (id,lhs,false))
with Constr_matching.PatternMatchingFailure ->
@@ -1812,7 +1804,7 @@ let subst_all ?(flags=default_subst_tactic_flags) () =
let find_equations gl =
let env = Proofview.Goal.env gl in
let sigma = project gl in
- let find_eq_data_decompose = find_eq_data_decompose gl in
+ let find_eq_data_decompose = pf_apply find_eq_data_decompose gl in
let select_equation_name decl =
try
let lbeq,u,(_,x,y) = find_eq_data_decompose (NamedDecl.get_type decl) in
@@ -1837,7 +1829,7 @@ let subst_all ?(flags=default_subst_tactic_flags) () =
Proofview.Goal.enter begin fun gl ->
let sigma = project gl in
let env = Proofview.Goal.env gl in
- let find_eq_data_decompose = find_eq_data_decompose gl in
+ let find_eq_data_decompose = pf_apply find_eq_data_decompose gl in
let c = pf_get_hyp hyp gl |> NamedDecl.get_type in
let _,_,(_,x,y) = find_eq_data_decompose c in
(* J.F.: added to prevent failure on goal containing x=x as an hyp *)
@@ -1863,7 +1855,7 @@ let subst_all ?(flags=default_subst_tactic_flags) () =
let-ins *)
Proofview.Goal.enter begin fun gl ->
let sigma = project gl in
- let find_eq_data_decompose = find_eq_data_decompose gl in
+ let find_eq_data_decompose = pf_apply find_eq_data_decompose gl in
let test (_,c) =
try
let lbeq,u,(_,x,y) = find_eq_data_decompose c in
@@ -1887,19 +1879,19 @@ let subst_all ?(flags=default_subst_tactic_flags) () =
let cond_eq_term_left c t gl =
try
- let (_,x,_) = pi3 (find_eq_data_decompose gl t) in
+ let (_,x,_) = pi3 (pf_apply find_eq_data_decompose gl t) in
if pf_conv_x gl c x then true else failwith "not convertible"
with Constr_matching.PatternMatchingFailure -> failwith "not an equality"
let cond_eq_term_right c t gl =
try
- let (_,_,x) = pi3 (find_eq_data_decompose gl t) in
+ let (_,_,x) = pi3 (pf_apply find_eq_data_decompose gl t) in
if pf_conv_x gl c x then false else failwith "not convertible"
with Constr_matching.PatternMatchingFailure -> failwith "not an equality"
let cond_eq_term c t gl =
try
- let (_,x,y) = pi3 (find_eq_data_decompose gl t) in
+ let (_,x,y) = pi3 (pf_apply find_eq_data_decompose gl t) in
if pf_conv_x gl c x then true
else if pf_conv_x gl c y then false
else failwith "not convertible"
diff --git a/tactics/hints.ml b/tactics/hints.ml
index 7b3797119a..73e8331bcb 100644
--- a/tactics/hints.ml
+++ b/tactics/hints.ml
@@ -26,7 +26,6 @@ open Libnames
open Smartlocate
open Termops
open Inductiveops
-open Typing
open Typeclasses
open Pattern
open Patternops
@@ -966,16 +965,17 @@ let make_mode ref m =
let make_trivial env sigma poly ?(name=PathAny) r =
let c,ctx = fresh_global_or_constr env sigma poly r in
let sigma = Evd.merge_context_set univ_flexible sigma ctx in
- let t = hnf_constr env sigma (unsafe_type_of env sigma c) in
+ let t = hnf_constr env sigma (Retyping.get_type_of env sigma c) in
let hd = head_constr sigma t in
let ce = mk_clenv_from_env env sigma None (c,t) in
- (Some hd, { pri=1;
- poly = poly;
- pat = Some (Patternops.pattern_of_constr env ce.evd (EConstr.to_constr sigma (clenv_type ce)));
- name = name;
- db = None;
- secvars = secvars_of_constr env sigma c;
- code= with_uid (Res_pf_THEN_trivial_fail(c,t,ctx)) })
+ (Some hd,
+ { pri=1;
+ poly = poly;
+ pat = Some (Patternops.pattern_of_constr env ce.evd (EConstr.to_constr sigma (clenv_type ce)));
+ name = name;
+ db = None;
+ secvars = secvars_of_constr env sigma c;
+ code= with_uid (Res_pf_THEN_trivial_fail(c,t,ctx)) })
diff --git a/tactics/hints.mli b/tactics/hints.mli
index 2a9b71387e..9c9f0b7708 100644
--- a/tactics/hints.mli
+++ b/tactics/hints.mli
@@ -160,6 +160,8 @@ module Hint_db :
val iter : (GlobRef.t option ->
hint_mode array list -> full_hint list -> unit) -> t -> unit
+ val fold : (GlobRef.t option -> hint_mode array list -> full_hint list -> 'a -> 'a) -> t -> 'a -> 'a
+
val use_dn : t -> bool
val transparent_state : t -> TransparentState.t
val set_transparent_state : t -> TransparentState.t -> t
diff --git a/tactics/hipattern.ml b/tactics/hipattern.ml
index 90a9a7acd9..c5ed02e043 100644
--- a/tactics/hipattern.ml
+++ b/tactics/hipattern.ml
@@ -19,7 +19,6 @@ open Inductiveops
open Constr_matching
open Coqlib
open Declarations
-open Tacmach.New
open Context.Rel.Declaration
module RelDecl = Context.Rel.Declaration
@@ -452,26 +451,26 @@ let find_eq_data sigma eqn = (* fails with PatternMatchingFailure *)
let hd,u = destInd sigma (fst (destApp sigma eqn)) in
d,u,k
-let extract_eq_args gl = function
+let extract_eq_args env sigma = function
| MonomorphicLeibnizEq (e1,e2) ->
- let t = pf_unsafe_type_of gl e1 in (t,e1,e2)
+ let t = Retyping.get_type_of env sigma e1 in (t,e1,e2)
| PolymorphicLeibnizEq (t,e1,e2) -> (t,e1,e2)
| HeterogenousEq (t1,e1,t2,e2) ->
- if pf_conv_x gl t1 t2 then (t1,e1,e2)
+ if Reductionops.is_conv env sigma t1 t2 then (t1,e1,e2)
else raise PatternMatchingFailure
-let find_eq_data_decompose gl eqn =
- let (lbeq,u,eq_args) = find_eq_data (project gl) eqn in
- (lbeq,u,extract_eq_args gl eq_args)
+let find_eq_data_decompose env sigma eqn =
+ let (lbeq,u,eq_args) = find_eq_data sigma eqn in
+ (lbeq,u,extract_eq_args env sigma eq_args)
-let find_this_eq_data_decompose gl eqn =
+let find_this_eq_data_decompose env sigma eqn =
let (lbeq,u,eq_args) =
try (*first_match (match_eq eqn) inversible_equalities*)
- find_eq_data (project gl) eqn
+ find_eq_data sigma eqn
with PatternMatchingFailure ->
user_err (str "No primitive equality found.") in
let eq_args =
- try extract_eq_args gl eq_args
+ try extract_eq_args env sigma eq_args
with PatternMatchingFailure ->
user_err Pp.(str "Don't know what to do with JMeq on arguments not of same type.") in
(lbeq,u,eq_args)
diff --git a/tactics/hipattern.mli b/tactics/hipattern.mli
index 803305a1ca..0000f81d3f 100644
--- a/tactics/hipattern.mli
+++ b/tactics/hipattern.mli
@@ -122,11 +122,11 @@ val match_with_equation:
(** Match terms [eq A t u], [identity A t u] or [JMeq A t A u]
Returns associated lemmas and [A,t,u] or fails PatternMatchingFailure *)
-val find_eq_data_decompose : Proofview.Goal.t -> constr ->
+val find_eq_data_decompose : Environ.env -> evar_map -> constr ->
coq_eq_data * EInstance.t * (types * constr * constr)
(** Idem but fails with an error message instead of PatternMatchingFailure *)
-val find_this_eq_data_decompose : Proofview.Goal.t -> constr ->
+val find_this_eq_data_decompose : Environ.env -> evar_map -> constr ->
coq_eq_data * EInstance.t * (types * constr * constr)
(** A variant that returns more informative structure on the equality found *)
diff --git a/tactics/inv.ml b/tactics/inv.ml
index be0421d42d..2181eb25af 100644
--- a/tactics/inv.ml
+++ b/tactics/inv.ml
@@ -464,7 +464,7 @@ let raw_inversion inv_kind id status names =
let concl = Proofview.Goal.concl gl in
let c = mkVar id in
let (ind, t) =
- try pf_apply Tacred.reduce_to_atomic_ind gl (pf_unsafe_type_of gl c)
+ try pf_apply Tacred.reduce_to_atomic_ind gl (pf_get_type_of gl c)
with UserError _ ->
let msg = str "The type of " ++ Id.print id ++ str " is not inductive." in
CErrors.user_err msg
diff --git a/tactics/leminv.ml b/tactics/leminv.ml
index cf58c9306c..def4af1ae8 100644
--- a/tactics/leminv.ml
+++ b/tactics/leminv.ml
@@ -259,7 +259,7 @@ let add_inversion_lemma_exn ~poly na com comsort bool tac =
let lemInv id c =
Proofview.Goal.enter begin fun gls ->
try
- let clause = mk_clenv_from_env (pf_env gls) (project gls) None (c, pf_unsafe_type_of gls c) in
+ let clause = mk_clenv_from_env (pf_env gls) (project gls) None (c, pf_get_type_of gls c) in
let clause = clenv_constrain_last_binding (EConstr.mkVar id) clause in
Clenvtac.res_pf clause ~flags:(Unification.elim_flags ()) ~with_evars:false
with
diff --git a/tactics/tacticals.ml b/tactics/tacticals.ml
index ed7ab9164a..58d2097dea 100644
--- a/tactics/tacticals.ml
+++ b/tactics/tacticals.ml
@@ -587,7 +587,7 @@ module New = struct
let ifOnHyp pred tac1 tac2 id =
Proofview.Goal.enter begin fun gl ->
let typ = Tacmach.New.pf_get_hyp_typ id gl in
- if pred (id,typ) then
+ if pf_apply pred gl (id,typ) then
tac1 id
else
tac2 id
@@ -633,7 +633,7 @@ module New = struct
(Proofview.Goal.enter begin fun gl ->
let indclause = mk_clenv_from gl (c, t) in
(* applying elimination_scheme just a little modified *)
- let elimclause = mk_clenv_from gl (elim,Tacmach.New.pf_unsafe_type_of gl elim) in
+ let elimclause = mk_clenv_from gl (elim,Tacmach.New.pf_get_type_of gl elim) in
let indmv =
match EConstr.kind elimclause.evd (last_arg elimclause.evd elimclause.templval.Evd.rebus) with
| Meta mv -> mv
@@ -741,7 +741,7 @@ module New = struct
let elimination_then tac c =
Proofview.Goal.enter begin fun gl ->
- let (ind,t) = pf_reduce_to_quantified_ind gl (pf_unsafe_type_of gl c) in
+ let (ind,t) = pf_reduce_to_quantified_ind gl (pf_get_type_of gl c) in
let isrec,mkelim =
match (Global.lookup_mind (fst (fst ind))).mind_record with
| NotRecord -> true,gl_make_elim
diff --git a/tactics/tacticals.mli b/tactics/tacticals.mli
index 31d26834d6..4b93b81d1c 100644
--- a/tactics/tacticals.mli
+++ b/tactics/tacticals.mli
@@ -222,7 +222,7 @@ module New : sig
val nLastDecls : Proofview.Goal.t -> int -> named_context
- val ifOnHyp : (Id.t * types -> bool) ->
+ val ifOnHyp : (Environ.env -> evar_map -> Id.t * types -> bool) ->
(Id.t -> unit Proofview.tactic) -> (Id.t -> unit Proofview.tactic) ->
Id.t -> unit Proofview.tactic
diff --git a/tactics/tactics.ml b/tactics/tactics.ml
index f6f7c71dfd..609b752716 100644
--- a/tactics/tactics.ml
+++ b/tactics/tactics.ml
@@ -47,6 +47,9 @@ open Context.Named.Declaration
module RelDecl = Context.Rel.Declaration
module NamedDecl = Context.Named.Declaration
+let tclEVARS = Proofview.Unsafe.tclEVARS
+let tclEVARSTHEN sigma t = Proofview.tclTHEN (tclEVARS sigma) t
+
let inj_with_occurrences e = (AllOccurrences,e)
let typ_of env sigma c =
@@ -151,11 +154,12 @@ let convert_concl ~check ty k =
Refine.refine ~typecheck:false begin fun sigma ->
let sigma =
if check then begin
- ignore (Typing.unsafe_type_of env sigma ty);
+ let sigma, _ = Typing.type_of env sigma ty in
match Reductionops.infer_conv env sigma ty conclty with
| None -> error "Not convertible."
| Some sigma -> sigma
- end else sigma in
+ end else sigma
+ in
let (sigma, x) = Evarutil.new_evar env sigma ~principal:true ty in
let ans = if k == DEFAULTcast then x else mkCast(x,k,conclty) in
(sigma, ans)
@@ -849,12 +853,13 @@ let change_on_subterm ~check cv_pb deep t where env sigma c =
change_and_check Reduction.CONV mayneedglobalcheck true (t subst)
else
fun env sigma _c -> t subst env sigma) env sigma c in
- if !mayneedglobalcheck then
+ let sigma = if !mayneedglobalcheck then
begin
- try ignore (Typing.unsafe_type_of env sigma c)
+ try fst (Typing.type_of env sigma c)
with e when catchable_exception e ->
error "Replacement would lead to an ill-typed term."
- end;
+ end else sigma
+ in
(sigma, c)
let change_in_concl ~check occl t =
@@ -1308,30 +1313,23 @@ let cut c =
let env = Proofview.Goal.env gl in
let sigma = Tacmach.New.project gl in
let concl = Proofview.Goal.concl gl in
- let relevance =
- try
- (* Backward compat: ensure that [c] is well-typed. Plus we
- need to know the relevance *)
- let typ = Typing.unsafe_type_of env sigma c in
- let typ = whd_all env sigma typ in
- match EConstr.kind sigma typ with
- | Sort s -> Some (Sorts.relevance_of_sort (ESorts.kind sigma s))
- | _ -> None
- with e when Pretype_errors.precatchable_exception e -> None
- in
- match relevance with
- | Some r ->
+ (* Backward compat: ensure that [c] is well-typed. Plus we need to
+ know the relevance *)
+ match Typing.sort_of env sigma c with
+ | exception e when Pretype_errors.precatchable_exception e ->
+ Tacticals.New.tclZEROMSG (str "Not a proposition or a type.")
+ | sigma, s ->
+ let r = Sorts.relevance_of_sort s in
let id = next_name_away_with_default "H" Anonymous (Tacmach.New.pf_ids_set_of_hyps gl) in
(* Backward compat: normalize [c]. *)
let c = if normalize_cut then local_strong whd_betaiota sigma c else c in
- Refine.refine ~typecheck:false begin fun h ->
- let (h, f) = Evarutil.new_evar ~principal:true env h (mkArrow c r (Vars.lift 1 concl)) in
- let (h, x) = Evarutil.new_evar env h c in
- let f = mkLetIn (make_annot (Name id) r, x, c, mkApp (Vars.lift 1 f, [|mkRel 1|])) in
- (h, f)
- end
- | None ->
- Tacticals.New.tclZEROMSG (str "Not a proposition or a type.")
+ Proofview.tclTHEN (Proofview.Unsafe.tclEVARS sigma)
+ (Refine.refine ~typecheck:false begin fun h ->
+ let (h, f) = Evarutil.new_evar ~principal:true env h (mkArrow c r (Vars.lift 1 concl)) in
+ let (h, x) = Evarutil.new_evar env h c in
+ let f = mkLetIn (make_annot (Name id) r, x, c, mkApp (Vars.lift 1 f, [|mkRel 1|])) in
+ (h, f)
+ end)
end
let error_uninstantiated_metas t clenv =
@@ -1533,16 +1531,19 @@ exception IsNonrec
let is_nonrec mind = (Global.lookup_mind (fst mind)).mind_finite == Declarations.BiFinite
-let find_ind_eliminator ind s gl =
- let env = Proofview.Goal.env gl in
+let find_ind_eliminator env sigma ind s =
let gr = lookup_eliminator env ind s in
- Tacmach.New.pf_apply Evd.fresh_global gl gr
+ Evd.fresh_global env sigma gr
let find_eliminator c gl =
- let ((ind,u),t) = Tacmach.New.pf_reduce_to_quantified_ind gl (Tacmach.New.pf_unsafe_type_of gl c) in
+ let env = Proofview.Goal.env gl in
+ let sigma = Proofview.Goal.sigma gl in
+ let concl = Proofview.Goal.concl gl in
+ let sigma, t = Typing.type_of env sigma c in
+ let ((ind,u),t) = reduce_to_quantified_ind env sigma t in
if is_nonrec ind then raise IsNonrec;
- let evd, c = find_ind_eliminator ind (Tacticals.New.elimination_sort_of_goal gl) gl in
- evd, { elimindex = None; elimbody = (c,NoBindings) }
+ let sigma, c = find_ind_eliminator env sigma ind (Retyping.get_sort_family_of env sigma concl) in
+ sigma, { elimindex = None; elimbody = (c,NoBindings) }
let default_elim with_evars clear_flag (c,_ as cx) =
Proofview.tclORELSE
@@ -1928,18 +1929,20 @@ let apply_in_delayed_once ?(respect_opaque = false) with_delta
let cut_and_apply c =
Proofview.Goal.enter begin fun gl ->
- let sigma = Tacmach.New.project gl in
- match EConstr.kind sigma (Tacmach.New.pf_hnf_constr gl (Tacmach.New.pf_unsafe_type_of gl c)) with
- | Prod (_,c1,c2) when Vars.noccurn sigma 1 c2 ->
- let concl = Proofview.Goal.concl gl in
- let env = Tacmach.New.pf_env gl in
- Refine.refine ~typecheck:false begin fun sigma ->
- let typ = mkProd (make_annot Anonymous Sorts.Relevant, c2, concl) in
- let (sigma, f) = Evarutil.new_evar env sigma typ in
- let (sigma, x) = Evarutil.new_evar env sigma c1 in
- (sigma, mkApp (f, [|mkApp (c, [|x|])|]))
- end
- | _ -> error "lapply needs a non-dependent product."
+ let env = Proofview.Goal.env gl in
+ let sigma = Proofview.Goal.sigma gl in
+ let concl = Proofview.Goal.concl gl in
+ let sigma, t = Typing.type_of env sigma c in
+ match EConstr.kind sigma (hnf_constr env sigma t) with
+ | Prod (_,c1,c2) when Vars.noccurn sigma 1 c2 ->
+ Proofview.tclTHEN (Proofview.Unsafe.tclEVARS sigma)
+ (Refine.refine ~typecheck:false begin fun sigma ->
+ let typ = mkProd (make_annot Anonymous Sorts.Relevant, c2, concl) in
+ let (sigma, f) = Evarutil.new_evar env sigma typ in
+ let (sigma, x) = Evarutil.new_evar env sigma c1 in
+ (sigma, mkApp (f, [|mkApp (c, [|x|])|]))
+ end)
+ | _ -> error "lapply needs a non-dependent product."
end
(********************************************************************)
@@ -2285,8 +2288,8 @@ let intro_decomp_eq_function = ref (fun _ -> failwith "Not implemented")
let declare_intro_decomp_eq f = intro_decomp_eq_function := f
-let my_find_eq_data_decompose gl t =
- try Some (find_eq_data_decompose gl t)
+let my_find_eq_data_decompose env sigma t =
+ try Some (find_eq_data_decompose env sigma t)
with e when is_anomaly e
(* Hack in case equality is not yet defined... one day, maybe,
known equalities will be dynamically registered *)
@@ -2296,13 +2299,15 @@ let my_find_eq_data_decompose gl t =
let intro_decomp_eq ?loc l thin tac id =
Proofview.Goal.enter begin fun gl ->
let c = mkVar id in
- let t = Tacmach.New.pf_unsafe_type_of gl c in
- let _,t = Tacmach.New.pf_reduce_to_quantified_ind gl t in
- match my_find_eq_data_decompose gl t with
+ let env = Proofview.Goal.env gl in
+ let sigma = Proofview.Goal.sigma gl in
+ let sigma, t = Typing.type_of env sigma c in
+ let _,t = reduce_to_quantified_ind env sigma t in
+ match my_find_eq_data_decompose env sigma t with
| Some (eq,u,eq_args) ->
!intro_decomp_eq_function
- (fun n -> tac ((CAst.make id)::thin) (Some (true,n)) l)
- (eq,t,eq_args) (c, t)
+ (fun n -> tac ((CAst.make id)::thin) (Some (true,n)) l)
+ (eq,t,eq_args) (c, t)
| None ->
Tacticals.New.tclZEROMSG (str "Not a primitive equality here.")
end
@@ -2310,16 +2315,19 @@ let intro_decomp_eq ?loc l thin tac id =
let intro_or_and_pattern ?loc with_evars bracketed ll thin tac id =
Proofview.Goal.enter begin fun gl ->
let c = mkVar id in
- let t = Tacmach.New.pf_unsafe_type_of gl c in
- let (ind,t) = Tacmach.New.pf_reduce_to_quantified_ind gl t in
+ let env = Proofview.Goal.env gl in
+ let sigma = Proofview.Goal.sigma gl in
+ let sigma, t = Typing.type_of env sigma c in
+ let (ind,t) = reduce_to_quantified_ind env sigma t in
let branchsigns = compute_constructor_signatures ~rec_flag:false ind in
let nv_with_let = Array.map List.length branchsigns in
let ll = fix_empty_or_and_pattern (Array.length branchsigns) ll in
let ll = get_and_check_or_and_pattern ?loc ll branchsigns in
- Tacticals.New.tclTHENLASTn
- (Tacticals.New.tclTHEN (simplest_ecase c) (clear [id]))
- (Array.map2 (fun n l -> tac thin (Some (bracketed,n)) l)
- nv_with_let ll)
+ Proofview.tclTHEN (Proofview.Unsafe.tclEVARS sigma)
+ (Tacticals.New.tclTHENLASTn
+ (Tacticals.New.tclTHEN (simplest_ecase c) (clear [id]))
+ (Array.map2 (fun n l -> tac thin (Some (bracketed,n)) l)
+ nv_with_let ll))
end
let rewrite_hyp_then assert_style with_evars thin l2r id tac =
@@ -2333,9 +2341,8 @@ let rewrite_hyp_then assert_style with_evars thin l2r id tac =
Proofview.Goal.enter begin fun gl ->
let env = Proofview.Goal.env gl in
let sigma = Tacmach.New.project gl in
- let type_of = Tacmach.New.pf_unsafe_type_of gl in
- let whd_all = Tacmach.New.pf_apply whd_all gl in
- let t = whd_all (type_of (mkVar id)) in
+ let sigma, t = Typing.type_of env sigma (mkVar id) in
+ let t = whd_all env sigma t in
let eqtac, thin = match match_with_equality_type env sigma t with
| Some (hdcncl,[_;lhs;rhs]) ->
if l2r && isVar sigma lhs && not (occur_var env sigma (destVar sigma lhs) rhs) then
@@ -2361,7 +2368,7 @@ let rewrite_hyp_then assert_style with_evars thin l2r id tac =
Tacticals.New.tclTHEN (rew_on l2r onConcl) (clear [id]),
thin in
(* Skip the side conditions of the rewriting step *)
- Tacticals.New.tclTHENFIRST eqtac (tac thin)
+ tclEVARSTHEN sigma (Tacticals.New.tclTHENFIRST eqtac (tac thin))
end
let prepare_naming ?loc = function
@@ -3392,8 +3399,9 @@ let atomize_param_of_ind_then (indref,nparams,_) hyp0 tac =
let id = match EConstr.kind sigma c with
| Var id -> id
| _ ->
- let type_of = Tacmach.New.pf_unsafe_type_of gl in
- id_of_name_using_hdchar env sigma (type_of c) Anonymous in
+ let type_of = Tacmach.New.pf_get_type_of gl in
+ id_of_name_using_hdchar env sigma (type_of c) Anonymous
+ in
let x = fresh_id_in_env avoid id env in
Tacticals.New.tclTHEN
(letin_tac None (Name x) c None allHypsAndConcl)
@@ -3794,15 +3802,15 @@ let is_defined_variable env id =
env |> lookup_named id |> is_local_def
let abstract_args gl generalize_vars dep id defined f args =
- let open Tacmach.New in
let open Context.Rel.Declaration in
let sigma = ref (Tacmach.New.project gl) in
let env = Tacmach.New.pf_env gl in
let concl = Tacmach.New.pf_concl gl in
+ let hyps = Proofview.Goal.hyps gl in
let dep = dep || local_occur_var !sigma id concl in
let avoid = ref Id.Set.empty in
let get_id name =
- let id = new_fresh_id !avoid (match name with Name n -> n | Anonymous -> Id.of_string "gen_x") gl in
+ let id = fresh_id_in_env !avoid (match name with Name n -> n | Anonymous -> Id.of_string "gen_x") env in
avoid := Id.Set.add id !avoid; id
in
(* Build application generalized w.r.t. the argument plus the necessary eqs.
@@ -3811,14 +3819,14 @@ let abstract_args gl generalize_vars dep id defined f args =
eqs are not lifted w.r.t. each other yet. (* will be needed when going to dependent indexes *)
*)
- let aux (prod, ctx, ctxenv, c, args, eqs, refls, nongenvars, vars, env) arg =
+ let aux (prod, ctx, ctxenv, c, args, eqs, refls, nongenvars, vars) arg =
let name, ty_relevance, ty, arity =
let rel, c = Reductionops.splay_prod_n env !sigma 1 prod in
let decl = List.hd rel in
RelDecl.get_name decl, RelDecl.get_relevance decl, RelDecl.get_type decl, c
in
- let argty = Tacmach.New.pf_unsafe_type_of gl arg in
- let sigma', ty = Evarsolve.refresh_universes (Some true) env !sigma ty in
+ let sigma', argty = Typing.type_of env !sigma arg in
+ let sigma', ty = Evarsolve.refresh_universes (Some true) env sigma' ty in
let () = sigma := sigma' in
let lenctx = List.length ctx in
let liftargty = lift lenctx argty in
@@ -3826,7 +3834,7 @@ let abstract_args gl generalize_vars dep id defined f args =
match EConstr.kind !sigma arg with
| Var id when not (is_defined_variable env id) && leq && not (Id.Set.mem id nongenvars) ->
(subst1 arg arity, ctx, ctxenv, mkApp (c, [|arg|]), args, eqs, refls,
- Id.Set.add id nongenvars, Id.Set.remove id vars, env)
+ Id.Set.add id nongenvars, Id.Set.remove id vars)
| _ ->
let name = get_id name in
let decl = LocalAssum (make_annot (Name name) ty_relevance, ty) in
@@ -3848,7 +3856,7 @@ let abstract_args gl generalize_vars dep id defined f args =
let refls = refl :: refls in
let argvars = ids_of_constr !sigma vars arg in
(arity, ctx, push_rel decl ctxenv, c', args, eqs, refls,
- nongenvars, Id.Set.union argvars vars, env)
+ nongenvars, Id.Set.union argvars vars)
in
let f', args' = decompose_indapp !sigma f args in
let dogen, f', args' =
@@ -3862,15 +3870,16 @@ let abstract_args gl generalize_vars dep id defined f args =
true, mkApp (f', before), after
in
if dogen then
- let tyf' = Tacmach.New.pf_unsafe_type_of gl f' in
- let arity, ctx, ctxenv, c', args, eqs, refls, nogen, vars, env =
- Array.fold_left aux (tyf',[],env,f',[],[],[],Id.Set.empty,Id.Set.empty,env) args'
+ let sigma', tyf' = Typing.type_of env !sigma f' in
+ sigma := sigma';
+ let arity, ctx, ctxenv, c', args, eqs, refls, nogen, vars =
+ Array.fold_left aux (tyf',[],env,f',[],[],[],Id.Set.empty,Id.Set.empty) args'
in
let args, refls = List.rev args, List.rev refls in
let vars =
if generalize_vars then
let nogen = Id.Set.add id nogen in
- hyps_of_vars (pf_env gl) (project gl) (Proofview.Goal.hyps gl) nogen vars
+ hyps_of_vars env !sigma hyps nogen vars
else []
in
let body, c' =
@@ -3878,7 +3887,7 @@ let abstract_args gl generalize_vars dep id defined f args =
else None, c'
in
let typ = Tacmach.New.pf_get_hyp_typ id gl in
- let tac = make_abstract_generalize (pf_env gl) id typ concl dep ctx body c' eqs args refls in
+ let tac = make_abstract_generalize env id typ concl dep ctx body c' eqs args refls in
let tac = Proofview.Unsafe.tclEVARS !sigma <*> tac in
Some (tac, dep, succ (List.length ctx), vars)
else None
@@ -4222,15 +4231,15 @@ let guess_elim isrec dep s hyp0 gl =
let ind = EConstr.of_constr ind in
(sigma, ind)
in
- let elimt = Typing.unsafe_type_of env sigma elimc in
- sigma, ((elimc, NoBindings), elimt), mkIndU (mind, u)
+ let sigma, elimt = Typing.type_of env sigma elimc in
+ sigma, ((elimc, NoBindings), elimt), mkIndU (mind, u)
let given_elim hyp0 (elimc,lbind as e) gl =
let sigma = Tacmach.New.project gl in
let tmptyp0 = Tacmach.New.pf_get_hyp_typ hyp0 gl in
let ind_type_guess,_ = decompose_app sigma (snd (decompose_prod sigma tmptyp0)) in
- let elimt = Tacmach.New.pf_unsafe_type_of gl elimc in
- Tacmach.New.project gl, (e, elimt), ind_type_guess
+ let sigma, elimt = Tacmach.New.pf_type_of gl elimc in
+ sigma, (e, elimt), ind_type_guess
type scheme_signature =
(Id.Set.t * (elim_arg_kind * bool * bool * Id.t) list) array
@@ -4240,33 +4249,32 @@ type eliminator_source =
| ElimOver of bool * Id.t
let find_induction_type isrec elim hyp0 gl =
- let sigma = Tacmach.New.project gl in
- let scheme,elim =
+ let sigma, scheme,elim =
match elim with
| None ->
let sort = Tacticals.New.elimination_sort_of_goal gl in
- let _, (elimc,elimt),_ = guess_elim isrec false sort hyp0 gl in
+ let sigma, (elimc,elimt),_ = guess_elim isrec false sort hyp0 gl in
let scheme = compute_elim_sig sigma ~elimc elimt in
(* We drop the scheme waiting to know if it is dependent *)
- scheme, ElimOver (isrec,hyp0)
+ sigma, scheme, ElimOver (isrec,hyp0)
| Some e ->
- let evd, (elimc,elimt),ind_guess = given_elim hyp0 e gl in
+ let sigma, (elimc,elimt),ind_guess = given_elim hyp0 e gl in
let scheme = compute_elim_sig sigma ~elimc elimt in
if Option.is_empty scheme.indarg then error "Cannot find induction type";
- let indsign = compute_scheme_signature evd scheme hyp0 ind_guess in
+ let indsign = compute_scheme_signature sigma scheme hyp0 ind_guess in
let elim = ({ elimindex = Some(-1); elimbody = elimc },elimt) in
- scheme, ElimUsing (elim,indsign)
+ sigma, scheme, ElimUsing (elim,indsign)
in
match scheme.indref with
| None -> error_ind_scheme ""
- | Some ref -> ref, scheme.nparams, elim
+ | Some ref -> sigma, (ref, scheme.nparams, elim)
let get_elim_signature elim hyp0 gl =
compute_elim_signature (given_elim hyp0 elim gl) hyp0
let is_functional_induction elimc gl =
let sigma = Tacmach.New.project gl in
- let scheme = compute_elim_sig sigma ~elimc (Tacmach.New.pf_unsafe_type_of gl (fst elimc)) in
+ let scheme = compute_elim_sig sigma ~elimc (Tacmach.New.pf_get_type_of gl (fst elimc)) in
(* The test is not safe: with non-functional induction on non-standard
induction scheme, this may fail *)
Option.is_empty scheme.indarg
@@ -4380,10 +4388,11 @@ let apply_induction_in_context with_evars hyp0 inhyps elim indvars names induct_
let induction_with_atomization_of_ind_arg isrec with_evars elim names hyp0 inhyps =
Proofview.Goal.enter begin fun gl ->
- let elim_info = find_induction_type isrec elim hyp0 gl in
- atomize_param_of_ind_then elim_info hyp0 (fun indvars ->
- apply_induction_in_context with_evars (Some hyp0) inhyps (pi3 elim_info) indvars names
- (fun elim -> induction_tac with_evars [] [hyp0] elim))
+ let sigma, elim_info = find_induction_type isrec elim hyp0 gl in
+ tclEVARSTHEN sigma
+ (atomize_param_of_ind_then elim_info hyp0 (fun indvars ->
+ apply_induction_in_context with_evars (Some hyp0) inhyps (pi3 elim_info) indvars names
+ (fun elim -> induction_tac with_evars [] [hyp0] elim)))
end
let msg_not_right_number_induction_arguments scheme =
@@ -4658,18 +4667,16 @@ let induction_gen_l isrec with_evars elim names lc =
| _ ->
Proofview.Goal.enter begin fun gl ->
- let type_of = Tacmach.New.pf_unsafe_type_of gl in
- let sigma = Tacmach.New.project gl in
- Proofview.tclENV >>= fun env ->
- let x =
- id_of_name_using_hdchar env sigma (type_of c) Anonymous in
-
+ let sigma, t = pf_apply Typing.type_of gl c in
+ let x = id_of_name_using_hdchar (Proofview.Goal.env gl) sigma t Anonymous in
let id = new_fresh_id Id.Set.empty x gl in
let newl' = List.map (fun r -> replace_term sigma c (mkVar id) r) l' in
let () = newlc:=id::!newlc in
- Tacticals.New.tclTHEN
- (letin_tac None (Name id) c None allHypsAndConcl)
- (atomize_list newl')
+ Tacticals.New.tclTHENLIST [
+ tclEVARS sigma;
+ letin_tac None (Name id) c None allHypsAndConcl;
+ atomize_list newl';
+ ]
end in
Tacticals.New.tclTHENLIST
[
@@ -4765,7 +4772,10 @@ let destruct ev clr c l e =
let elim_scheme_type elim t =
Proofview.Goal.enter begin fun gl ->
- let clause = mk_clenv_type_of gl elim in
+ let env = Proofview.Goal.env gl in
+ let sigma = Proofview.Goal.sigma gl in
+ let sigma, elimt = Typing.type_of env sigma elim in
+ let clause = mk_clenv_from_env env sigma None (elim,elimt) in
match EConstr.kind clause.evd (last_arg clause.evd clause.templval.rebus) with
| Meta mv ->
let clause' =
@@ -4779,7 +4789,9 @@ let elim_scheme_type elim t =
let elim_type t =
Proofview.Goal.enter begin fun gl ->
let (ind,t) = Tacmach.New.pf_apply reduce_to_atomic_ind gl t in
- let evd, elimc = find_ind_eliminator (fst ind) (Tacticals.New.elimination_sort_of_goal gl) gl in
+ let evd, elimc = Tacmach.New.pf_apply find_ind_eliminator gl (fst ind)
+ (Tacticals.New.elimination_sort_of_goal gl)
+ in
Proofview.tclTHEN (Proofview.Unsafe.tclEVARS evd) (elim_scheme_type elimc t)
end
@@ -4857,7 +4869,8 @@ let prove_symmetry hdcncl eq_kind =
Tacticals.New.onLastHyp simplest_case;
one_constructor 1 NoBindings ])
-let match_with_equation sigma c =
+let match_with_equation c =
+ Proofview.tclEVARMAP >>= fun sigma ->
Proofview.tclENV >>= fun env ->
try
let res = match_with_equation env sigma c in
@@ -4870,9 +4883,8 @@ let symmetry_red allowred =
(* PL: usual symmetry don't perform any reduction when searching
for an equality, but we may need to do some when called back from
inside setoid_reflexivity (see Optimize cases in setoid_replace.ml). *)
- let sigma = Tacmach.New.project gl in
let concl = maybe_betadeltaiota_concl allowred gl in
- match_with_equation sigma concl >>= fun with_eqn ->
+ match_with_equation concl >>= fun with_eqn ->
match with_eqn with
| Some eq_data,_,_ ->
Tacticals.New.tclTHEN
@@ -4894,25 +4906,25 @@ let (forward_setoid_symmetry_in, setoid_symmetry_in) = Hook.make ()
let symmetry_in id =
Proofview.Goal.enter begin fun gl ->
- let sigma = Tacmach.New.project gl in
- let ctype = Tacmach.New.pf_unsafe_type_of gl (mkVar id) in
- let sign,t = decompose_prod_assum sigma ctype in
- Proofview.tclORELSE
- begin
- match_with_equation sigma t >>= fun (_,hdcncl,eq) ->
- let symccl =
- match eq with
- | MonomorphicLeibnizEq (c1,c2) -> mkApp (hdcncl, [| c2; c1 |])
- | PolymorphicLeibnizEq (typ,c1,c2) -> mkApp (hdcncl, [| typ; c2; c1 |])
- | HeterogenousEq (t1,c1,t2,c2) -> mkApp (hdcncl, [| t2; c2; t1; c1 |]) in
- Tacticals.New.tclTHENS (cut (EConstr.it_mkProd_or_LetIn symccl sign))
- [ intro_replacing id;
- Tacticals.New.tclTHENLIST [ intros; symmetry; apply (mkVar id); assumption ] ]
- end
- begin function (e, info) -> match e with
- | NoEquationFound -> Hook.get forward_setoid_symmetry_in id
- | e -> Proofview.tclZERO ~info e
- end
+ let sigma, ctype = Tacmach.New.pf_type_of gl (mkVar id) in
+ let sign,t = decompose_prod_assum sigma ctype in
+ tclEVARSTHEN sigma
+ (Proofview.tclORELSE
+ begin
+ match_with_equation t >>= fun (_,hdcncl,eq) ->
+ let symccl =
+ match eq with
+ | MonomorphicLeibnizEq (c1,c2) -> mkApp (hdcncl, [| c2; c1 |])
+ | PolymorphicLeibnizEq (typ,c1,c2) -> mkApp (hdcncl, [| typ; c2; c1 |])
+ | HeterogenousEq (t1,c1,t2,c2) -> mkApp (hdcncl, [| t2; c2; t1; c1 |]) in
+ Tacticals.New.tclTHENS (cut (EConstr.it_mkProd_or_LetIn symccl sign))
+ [ intro_replacing id;
+ Tacticals.New.tclTHENLIST [ intros; symmetry; apply (mkVar id); assumption ] ]
+ end
+ begin function (e, info) -> match e with
+ | NoEquationFound -> Hook.get forward_setoid_symmetry_in id
+ | e -> Proofview.tclZERO ~info e
+ end)
end
let intros_symmetry =
@@ -4939,25 +4951,26 @@ let (forward_setoid_transitivity, setoid_transitivity) = Hook.make ()
(* This is probably not very useful any longer *)
let prove_transitivity hdcncl eq_kind t =
Proofview.Goal.enter begin fun gl ->
- let (eq1,eq2) = match eq_kind with
- | MonomorphicLeibnizEq (c1,c2) ->
- mkApp (hdcncl, [| c1; t|]), mkApp (hdcncl, [| t; c2 |])
- | PolymorphicLeibnizEq (typ,c1,c2) ->
- mkApp (hdcncl, [| typ; c1; t |]), mkApp (hdcncl, [| typ; t; c2 |])
- | HeterogenousEq (typ1,c1,typ2,c2) ->
- let env = Proofview.Goal.env gl in
- let sigma = Tacmach.New.project gl in
- let type_of = Typing.unsafe_type_of env sigma in
- let typt = type_of t in
- (mkApp(hdcncl, [| typ1; c1; typt ;t |]),
- mkApp(hdcncl, [| typt; t; typ2; c2 |]))
- in
- Tacticals.New.tclTHENFIRST (cut eq2)
- (Tacticals.New.tclTHENFIRST (cut eq1)
- (Tacticals.New.tclTHENLIST
- [ Tacticals.New.tclDO 2 intro;
- Tacticals.New.onLastHyp simplest_case;
- assumption ]))
+ let sigma = Tacmach.New.project gl in
+ let sigma, eq1, eq2 = match eq_kind with
+ | MonomorphicLeibnizEq (c1,c2) ->
+ sigma, mkApp (hdcncl, [| c1; t|]), mkApp (hdcncl, [| t; c2 |])
+ | PolymorphicLeibnizEq (typ,c1,c2) ->
+ sigma, mkApp (hdcncl, [| typ; c1; t |]), mkApp (hdcncl, [| typ; t; c2 |])
+ | HeterogenousEq (typ1,c1,typ2,c2) ->
+ let env = Proofview.Goal.env gl in
+ let sigma, typt = Typing.type_of env sigma t in
+ sigma,
+ mkApp(hdcncl, [| typ1; c1; typt ;t |]),
+ mkApp(hdcncl, [| typt; t; typ2; c2 |])
+ in
+ tclEVARSTHEN sigma
+ (Tacticals.New.tclTHENFIRST (cut eq2)
+ (Tacticals.New.tclTHENFIRST (cut eq1)
+ (Tacticals.New.tclTHENLIST
+ [ Tacticals.New.tclDO 2 intro;
+ Tacticals.New.onLastHyp simplest_case;
+ assumption ])))
end
let transitivity_red allowred t =
@@ -4965,9 +4978,8 @@ let transitivity_red allowred t =
(* PL: usual transitivity don't perform any reduction when searching
for an equality, but we may need to do some when called back from
inside setoid_reflexivity (see Optimize cases in setoid_replace.ml). *)
- let sigma = Tacmach.New.project gl in
let concl = maybe_betadeltaiota_concl allowred gl in
- match_with_equation sigma concl >>= fun with_eqn ->
+ match_with_equation concl >>= fun with_eqn ->
match with_eqn with
| Some eq_data,_,_ ->
Tacticals.New.tclTHEN
diff --git a/test-suite/bugs/closed/bug_11515.v b/test-suite/bugs/closed/bug_11515.v
new file mode 100644
index 0000000000..fe4ba87447
--- /dev/null
+++ b/test-suite/bugs/closed/bug_11515.v
@@ -0,0 +1,7 @@
+Require Import Ltac2.Ltac2.
+
+Lemma foo :
+ True.
+Proof.
+ Fail rewrite _.
+Abort.
diff --git a/test-suite/bugs/closed/bug_11553.v b/test-suite/bugs/closed/bug_11553.v
new file mode 100644
index 0000000000..a4a4353cd6
--- /dev/null
+++ b/test-suite/bugs/closed/bug_11553.v
@@ -0,0 +1,34 @@
+Definition var := nat.
+Module Import A.
+Class Rename (term : Type) := rename : (var -> var) -> term -> term.
+End A.
+
+Inductive tm : Type :=
+ (* | tv : vl_ -> tm *)
+ with vl_ : Type :=
+ | var_vl : var -> vl_.
+
+Definition vl := vl_.
+
+Fixpoint tm_rename (sb : var -> var) (t : tm) : tm :=
+ let b := vl_rename : Rename vl in
+ match t with
+ end
+with
+vl_rename (sb : var -> var) v : vl :=
+ let a := tm_rename : Rename tm in
+ let b := vl_rename : Rename vl in
+ match v with
+ | var_vl x => var_vl (sb x)
+ end.
+
+Instance rename_vl : Rename vl := vl_rename.
+
+Lemma foo ξ x: rename_vl ξ (var_vl x) = var_vl x.
+(* Succeeds *)
+cbn. Abort.
+
+Lemma foo ξ x: rename ξ (var_vl x) = var_vl x.
+(* Fails *)
+cbn.
+Abort.
diff --git a/test-suite/ltac2/array_lib.v b/test-suite/ltac2/array_lib.v
new file mode 100644
index 0000000000..31227eaddb
--- /dev/null
+++ b/test-suite/ltac2/array_lib.v
@@ -0,0 +1,181 @@
+Require Import Ltac2.Ltac2.
+Import Ltac2.Message.
+Import Ltac2.Array.
+Require Ltac2.List.
+Require Ltac2.Int.
+
+(* Array/List comparison functions which throw an exception on unequal *)
+
+Ltac2 Type exn ::= [ Regression_Test_Failure ].
+
+Ltac2 check_eq_int a l :=
+ List.iter2
+ (fun a b => match Int.equal a b with true => () | false => Control.throw Regression_Test_Failure end)
+ (to_list a) l.
+
+Ltac2 check_eq_bool a l :=
+ List.iter2
+ (fun a b => match Bool.eq a b with true => () | false => Control.throw Regression_Test_Failure end)
+ (to_list a) l.
+
+Ltac2 check_eq_int_matrix m ll :=
+ List.iter2 (fun a b => check_eq_int a b) (to_list m) ll.
+
+Ltac2 check_eq_bool_matrix m ll :=
+ List.iter2 (fun a b => check_eq_bool a b) (to_list m) ll.
+
+(* The below printing functions are mostly for debugging below test cases *)
+
+Ltac2 print2 m1 m2 := print (Message.concat m1 m2).
+Ltac2 print3 m1 m2 m3 := print2 m1 (Message.concat m2 m3).
+
+Ltac2 print_int_array a :=
+ iteri (fun i x => print3 (of_int i) (of_string "=") (of_int x)) a.
+
+Ltac2 of_bool b := match b with true=>of_string "true" | false=>of_string "false" end.
+
+Ltac2 print_bool_array a :=
+ iteri (fun i x => print3 (of_int i) (of_string "=") (of_bool x)) a.
+
+Ltac2 print_int_list a :=
+ List.iteri (fun i x => print3 (of_int i) (of_string "=") (of_int x)) a.
+
+Goal True.
+ (* Test failure *)
+ Fail check_eq_int ((init 3 (fun i => (Int.add i 10)))) [10;11;13].
+
+ (* test empty with int *)
+ check_eq_int (empty ()) [].
+ check_eq_int (append (empty ()) (init 3 (fun i => (Int.add i 10)))) [10;11;12].
+ check_eq_int (append (init 3 (fun i => (Int.add i 10))) (empty ())) [10;11;12].
+
+ (* test empty with bool *)
+ check_eq_bool (empty ()) [].
+ check_eq_bool (append (empty ()) (init 3 (fun i => (Int.ge i 2)))) [false;false;true].
+ check_eq_bool (append (init 3 (fun i => (Int.ge i 2))) (empty ())) [false;false;true].
+
+ (* test init with int *)
+ check_eq_int (init 0 (fun i => (Int.add i 10))) [].
+ check_eq_int (init 4 (fun i => (Int.add i 10))) [10;11;12;13].
+
+ (* test init with bool *)
+ check_eq_bool (init 0 (fun i => (Int.ge i 2))) [].
+ check_eq_bool (init 4 (fun i => (Int.ge i 2))) [false;false;true;true].
+
+ (* test make_matrix, set, get *)
+ let a := make_matrix 4 3 1 in
+ Array.set (Array.get a 1) 2 0;
+ check_eq_int_matrix a [[1;1;1];[1;1;0];[1;1;1];[1;1;1]].
+
+ let a := make_matrix 3 4 false in
+ Array.set (Array.get a 2) 1 true;
+ check_eq_bool_matrix a [[false;false;false;false];[false;false;false;false];[false;true;false;false]].
+
+ (* test copy *)
+ let a := init 4 (fun i => (Int.add i 10)) in
+ let b := copy a in
+ check_eq_int b [10;11;12;13].
+
+ (* test append *)
+ let a := init 3 (fun i => (Int.add i 10)) in
+ let b := init 4 (fun i => (Int.add i 20)) in
+ check_eq_int (append a b) [10;11;12;20;21;22;23].
+
+ (* test concat *)
+ let a := init 3 (fun i => (Int.add i 10)) in
+ let b := init 4 (fun i => (Int.add i 20)) in
+ let c := init 5 (fun i => (Int.add i 30)) in
+ check_eq_int (concat (a::b::c::[])) [10;11;12;20;21;22;23;30;31;32;33;34].
+
+ (* test sub *)
+ let a := init 10 (fun i => (Int.add i 10)) in
+ let b := (sub a 3 0) in
+ let c := (append b (init 3 (fun i => (Int.add i 10)))) in
+ check_eq_int b [];
+ check_eq_int c [10;11;12].
+
+ let a := init 10 (fun i => (Int.add i 10)) in
+ let b := (sub a 3 4) in
+ check_eq_int b [13;14;15;16].
+
+ (* test fill *)
+ let a := init 10 (fun i => (Int.add i 10)) in
+ fill a 3 4 0;
+ check_eq_int a [10;11;12;0;0;0;0;17;18;19].
+
+ (* test blit *)
+ let a := init 10 (fun i => (Int.add i 10)) in
+ let b := init 10 (fun i => (Int.add i 20)) in
+ blit a 5 b 3 4;
+ check_eq_int b [20;21;22;15;16;17;18;27;28;29].
+
+ (* test iter *)
+ let a := init 4 (fun i => (Int.add i 3)) in
+ let b := init 10 (fun i => 10) in
+ iter (fun x => Array.set b x x) a;
+ check_eq_int b [10;10;10;3;4;5;6;10;10;10].
+
+ (* test iter2 *)
+ let a := init 4 (fun i => (Int.add i 2)) in
+ let b := init 4 (fun i => (Int.add i 4)) in
+ let c := init 8 (fun i => 10) in
+ iter2 (fun x y => Array.set c x y) a b;
+ check_eq_int c [10;10;4;5;6;7;10;10].
+
+ (* test map *)
+ let a := init 4 (fun i => (Int.add i 10)) in
+ check_eq_bool (map (fun i => (Int.ge i 12)) a) [false;false;true;true].
+
+ (* test map2 *)
+ let a := init 4 (fun i => (Int.add 10 i)) in
+ let b := init 4 (fun i => (Int.sub 13 i)) in
+ check_eq_bool (map2 (fun x y => (Int.ge x y)) a b) [false;false;true;true].
+
+ (* test iteri *)
+ let a := init 4 (fun i => (Int.add i 10)) in
+ let m := make_matrix 4 2 100 in
+ iteri (fun i x => Array.set (Array.get m i) 0 i; Array.set (Array.get m i) 1 x) a;
+ check_eq_int_matrix m [[0;10];[1;11];[2;12];[3;13]].
+
+ (* test mapi *)
+ let a := init 4 (fun i => (Int.sub 3 i)) in
+ check_eq_bool (mapi (fun i x => (Int.ge i x)) a) [false;false;true;true].
+
+ (* to_list is already tested in check_eq_... *)
+
+ (* test of_list *)
+ check_eq_int (of_list ([0;1;2;3])) [0;1;2;3].
+
+ (* test fold_left *)
+ let a := init 4 (fun i => (Int.add 10 i)) in
+ check_eq_int (of_list (fold_left (fun a b => b::a) [] a)) [13;12;11;10].
+
+ (* test fold_right *)
+ let a := init 4 (fun i => (Int.add 10 i)) in
+ check_eq_int (of_list (fold_right (fun a b => b::a) [] a)) [10;11;12;13].
+
+ (* test exist *)
+ let a := init 4 (fun i => (Int.add 10 i)) in
+ let l := [
+ exist (fun x => Int.equal x 10) a;
+ exist (fun x => Int.equal x 13) a;
+ exist (fun x => Int.equal x 14) a] in
+ check_eq_bool (of_list l) [true;true;false].
+
+ (* test for_all *)
+ let a := init 4 (fun i => (Int.add 10 i)) in
+ let l := [
+ for_all (fun x => Int.lt x 14) a;
+ for_all (fun x => Int.lt x 13) a] in
+ check_eq_bool (of_list l) [true;false].
+
+ (* test mem *)
+ let a := init 4 (fun i => (Int.add 10 i)) in
+ let l := [
+ mem Int.equal 10 a;
+ mem Int.equal 13 a;
+ mem Int.equal 14 a] in
+ check_eq_bool (of_list l) [true;true;false].
+
+exact I.
+Qed.
diff --git a/test-suite/output/Notations.out b/test-suite/output/Notations.out
index 94b86fc222..b870fa6f6f 100644
--- a/test-suite/output/Notations.out
+++ b/test-suite/output/Notations.out
@@ -137,3 +137,71 @@ end = p
: forall x : nat, x = x -> Prop
bar 0
: nat
+let k := rew [P] p in v in k
+ : P y
+let k := rew [P] p in v in k
+ : P y
+let k := rew <- [P] p in v' in k
+ : P x
+let k := rew [P] p in v in k
+ : P y
+let k := rew [P] p in v in k
+ : P y
+let k := rew <- [P] p in v' in k
+ : P x
+let k := rew [fun y : A => P y] p in v in k
+ : P y
+let k := rew [fun y : A => P y] p in v in k
+ : P y
+let k := rew <- [fun y : A => P y] p in v' in k
+ : P x
+let k := rew [fun y : A => P y] p in v in k
+ : P y
+let k := rew [fun y : A => P y] p in v in k
+ : P y
+let k := rew <- [fun y : A => P y] p in v' in k
+ : P x
+let k := rew dependent [P] p in v in k
+ : P y p
+let k := rew dependent [P] p in v in k
+ : P y p
+let k := rew dependent <- [P'] p in v' in k
+ : P' x (eq_sym p)
+let k := rew dependent [P] p in v in k
+ : P y p
+let k := rew dependent [P] p in v in k
+ : P y p
+let k := rew dependent <- [P'] p in v' in k
+ : P' x (eq_sym p)
+let k := rew dependent [P] p in v in k
+ : P y p
+let k := rew dependent [P] p in v in k
+ : P y p
+let k := rew dependent <- [P'] p in v' in k
+ : P' x (eq_sym p)
+let k := rew dependent [fun y p => id (P y p)] p in v in k
+ : P y p
+let k := rew dependent [fun y p => id (P y p)] p in v in k
+ : P y p
+let k := rew dependent <- [fun y0 p => id (P' y0 p)] p in v' in k
+ : P' x (eq_sym p)
+let k := rew dependent [P] p in v in k
+ : P y p
+let k := rew dependent [P] p in v in k
+ : P y p
+let k := rew dependent <- [P'] p in v' in k
+ : P' x (eq_sym p)
+let k := rew dependent [fun y p0 => id (P y p0)] p in v in k
+ : P y p
+let k := rew dependent [fun y p0 => id (P y p0)] p in v in k
+ : P y p
+let k := rew dependent <- [fun y0 p0 => id (P' y0 p0)] p in v' in k
+ : P' x (eq_sym p)
+rew dependent [P] p in v
+ : P y p
+rew dependent <- [P'] p in v'
+ : P' x (eq_sym p)
+rew dependent [fun a x => id (P a x)] p in v
+ : id (P y p)
+rew dependent <- [fun a p' => id (P' a p')] p in v'
+ : id (P' x (eq_sym p))
diff --git a/test-suite/output/Notations.v b/test-suite/output/Notations.v
index adab324cf0..7d2f1e9ba8 100644
--- a/test-suite/output/Notations.v
+++ b/test-suite/output/Notations.v
@@ -251,11 +251,11 @@ Notation NONE := None.
Check (fun x => match x with SOME x => x | NONE => 0 end).
Notation NONE2 := (@None _).
-Notation SOME2 := (@Some _).
+Notation SOME2 := (@Some _).
Check (fun x => match x with SOME2 x => x | NONE2 => 0 end).
Notation NONE3 := @None.
-Notation SOME3 := @Some.
+Notation SOME3 := @Some.
Check (fun x => match x with SOME3 _ x => x | NONE3 _ => 0 end).
Notation "a :'" := (cons a) (at level 12).
@@ -300,3 +300,61 @@ Definition bar (a b : nat) := plus a b.
Notation "" := A (format "", only printing).
Check (bar A 0).
End M.
+
+(* Check eq notations *)
+Module EqNotationsCheck.
+ Import EqNotations.
+ Section nd.
+ Context (A : Type) (x : A) (P : A -> Type)
+ (y : A) (p : x = y) (v : P x) (v' : P y).
+
+ Check let k : P y := rew p in v in k.
+ Check let k : P y := rew -> p in v in k.
+ Check let k : P x := rew <- p in v' in k.
+ Check let k : P y := rew [P] p in v in k.
+ Check let k : P y := rew -> [P] p in v in k.
+ Check let k : P x := rew <- [P] p in v' in k.
+ Check let k : P y := rew [fun y => P y] p in v in k.
+ Check let k : P y := rew -> [fun y => P y] p in v in k.
+ Check let k : P x := rew <- [fun y => P y] p in v' in k.
+ Check let k : P y := rew [fun (y : A) => P y] p in v in k.
+ Check let k : P y := rew -> [fun (y : A) => P y] p in v in k.
+ Check let k : P x := rew <- [fun (y : A) => P y] p in v' in k.
+ End nd.
+ Section dep.
+ Context (A : Type) (x : A) (P : forall y, x = y -> Type)
+ (y : A) (p : x = y) (P' : forall x, y = x -> Type)
+ (v : P x eq_refl) (v' : P' y eq_refl).
+
+ Check let k : P y p := rew dependent p in v in k.
+ Check let k : P y p := rew dependent -> p in v in k.
+ Check let k : P' x (eq_sym p) := rew dependent <- p in v' in k.
+ Check let k : P y p := rew dependent [P] p in v in k.
+ Check let k : P y p := rew dependent -> [P] p in v in k.
+ Check let k : P' x (eq_sym p) := rew dependent <- [P'] p in v' in k.
+ Check let k : P y p := rew dependent [fun y p => P y p] p in v in k.
+ Check let k : P y p := rew dependent -> [fun y p => P y p] p in v in k.
+ Check let k : P' x (eq_sym p) := rew dependent <- [fun y p => P' y p] p in v' in k.
+ Check let k : P y p := rew dependent [fun y p => id (P y p)] p in v in k.
+ Check let k : P y p := rew dependent -> [fun y p => id (P y p)] p in v in k.
+ Check let k : P' x (eq_sym p) := rew dependent <- [fun y p => id (P' y p)] p in v' in k.
+ Check let k : P y p := rew dependent [(fun (y : A) (p : x = y) => P y p)] p in v in k.
+ Check let k : P y p := rew dependent -> [(fun (y : A) (p : x = y) => P y p)] p in v in k.
+ Check let k : P' x (eq_sym p) := rew dependent <- [(fun (x : A) (p : y = x) => P' x p)] p in v' in k.
+ Check let k : P y p := rew dependent [(fun (y : A) (p : x = y) => id (P y p))] p in v in k.
+ Check let k : P y p := rew dependent -> [(fun (y : A) (p : x = y) => id (P y p))] p in v in k.
+ Check let k : P' x (eq_sym p) := rew dependent <- [(fun (x : A) (p : y = x) => id (P' x p))] p in v' in k.
+ Check match p as x in _ = a return P a x with
+ | eq_refl => v
+ end.
+ Check match eq_sym p as p' in _ = a return P' a p' with
+ | eq_refl => v'
+ end.
+ Check match p as x in _ = a return id (P a x) with
+ | eq_refl => v
+ end.
+ Check match eq_sym p as p' in _ = a return id (P' a p') with
+ | eq_refl => v'
+ end.
+ End dep.
+End EqNotationsCheck.
diff --git a/test-suite/output/Notations4.out b/test-suite/output/Notations4.out
index 799d310fa7..43f88f42a5 100644
--- a/test-suite/output/Notations4.out
+++ b/test-suite/output/Notations4.out
@@ -63,3 +63,11 @@ fun '{| |} => true
: R -> bool
b = a
: Prop
+The command has indeed failed with message:
+The format is not the same on the right- and left-hand sides of the special token "..".
+The command has indeed failed with message:
+The format is not the same on the right- and left-hand sides of the special token "..".
+The command has indeed failed with message:
+The format is not the same on the right- and left-hand sides of the special token "..".
+The command has indeed failed with message:
+The format is not the same on the right- and left-hand sides of the special token "..".
diff --git a/test-suite/output/Notations4.v b/test-suite/output/Notations4.v
index 26c7840a16..4de6ce19b4 100644
--- a/test-suite/output/Notations4.v
+++ b/test-suite/output/Notations4.v
@@ -158,3 +158,29 @@ Check b = a.
End Test.
End L.
+
+Module M.
+
+(* Accept boxes around the end variables of a recursive notation (if equal boxes) *)
+
+Notation " {@ T1 ; T2 ; .. ; Tn } " :=
+ (and T1 (and T2 .. (and Tn True)..))
+ (format "'[v' {@ '[' T1 ']' ; '//' '[' T2 ']' ; '//' .. ; '//' '[' Tn ']' } ']'").
+
+Fail Notation " {@ T1 ; T2 ; .. ; Tn } " :=
+ (and T1 (and T2 .. (and Tn True)..))
+ (format "'[v' {@ '[' T1 ']' ; '//' '[' T2 ']' ; '//' .. ; '//' '[' Tn ']' } ']'").
+
+Fail Notation " {@ T1 ; T2 ; .. ; Tn } " :=
+ (and T1 (and T2 .. (and Tn True)..))
+ (format "'[v' {@ '[' T1 ']' ; '//' '[' T2 ']' ; '//' .. ; '//' '[v' Tn ']' } ']'").
+
+Fail Notation " {@ T1 ; T2 ; .. ; Tn } " :=
+ (and T1 (and T2 .. (and Tn True)..))
+ (format "'[v' {@ '[' T1 ']' ; '//' '[' T2 ']' ; '//' .. ; '//' '[' Tn ']' } ']'").
+
+Fail Notation " {@ T1 ; T2 ; .. ; Tn } " :=
+ (and T1 (and T2 .. (and Tn True)..))
+ (format "'[v' {@ '[' T1 ']' ; '//' '[' T2 ']' ; '//' .. ; '//' '[' Tn ']' } ']'").
+
+End M.
diff --git a/test-suite/success/CompatOldOldFlag.v b/test-suite/success/CompatOldOldFlag.v
deleted file mode 100644
index dd259988ac..0000000000
--- a/test-suite/success/CompatOldOldFlag.v
+++ /dev/null
@@ -1,6 +0,0 @@
-(* -*- coq-prog-args: ("-compat" "8.9") -*- *)
-(** Check that the current-minus-three compatibility flag actually requires the relevant modules. *)
-Import Coq.Compat.Coq812.
-Import Coq.Compat.Coq811.
-Import Coq.Compat.Coq810.
-Import Coq.Compat.Coq89.
diff --git a/test-suite/tools/update-compat/run.sh b/test-suite/tools/update-compat/run.sh
index 61273c4f37..7ff5571ffb 100755
--- a/test-suite/tools/update-compat/run.sh
+++ b/test-suite/tools/update-compat/run.sh
@@ -6,4 +6,4 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
# we assume that the script lives in test-suite/tools/update-compat/,
# and that update-compat.py lives in dev/tools/
cd "${SCRIPT_DIR}/../../.."
-dev/tools/update-compat.py --assert-unchanged --master || exit $?
+dev/tools/update-compat.py --assert-unchanged --release || exit $?
diff --git a/theories/Compat/Coq89.v b/theories/Compat/Coq89.v
deleted file mode 100644
index 274cb4afd3..0000000000
--- a/theories/Compat/Coq89.v
+++ /dev/null
@@ -1,19 +0,0 @@
-(************************************************************************)
-(* * The Coq Proof Assistant / The Coq Development Team *)
-(* v * INRIA, CNRS and contributors - Copyright 1999-2019 *)
-(* <O___,, * (see CREDITS file for the list of authors) *)
-(* \VV/ **************************************************************)
-(* // * This file is distributed under the terms of the *)
-(* * GNU Lesser General Public License Version 2.1 *)
-(* * (see LICENSE file for the text of the license) *)
-(************************************************************************)
-
-(** Compatibility file for making Coq act similar to Coq v8.9 *)
-Local Set Warnings "-deprecated".
-
-Require Export Coq.Compat.Coq810.
-
-Unset Private Polymorphic Universes.
-
-(** Unsafe flag, can hide inconsistencies. *)
-Global Unset Template Check.
diff --git a/theories/Init/Logic.v b/theories/Init/Logic.v
index 4d84d61f9f..8ba17e38c8 100644
--- a/theories/Init/Logic.v
+++ b/theories/Init/Logic.v
@@ -460,6 +460,58 @@ Module EqNotations.
Notation "'rew' -> [ P ] H 'in' H'" := (eq_rect _ P H' _ H)
(at level 10, H' at level 10, only parsing).
+ Notation "'rew' 'dependent' H 'in' H'"
+ := (match H with
+ | eq_refl => H'
+ end)
+ (at level 10, H' at level 10,
+ format "'[' 'rew' 'dependent' H in '/' H' ']'").
+ Notation "'rew' 'dependent' -> H 'in' H'"
+ := (match H with
+ | eq_refl => H'
+ end)
+ (at level 10, H' at level 10, only parsing).
+ Notation "'rew' 'dependent' <- H 'in' H'"
+ := (match eq_sym H with
+ | eq_refl => H'
+ end)
+ (at level 10, H' at level 10,
+ format "'[' 'rew' 'dependent' <- H in '/' H' ']'").
+ Notation "'rew' 'dependent' [ 'fun' y p => P ] H 'in' H'"
+ := (match H as p in (_ = y) return P with
+ | eq_refl => H'
+ end)
+ (at level 10, H' at level 10, y ident, p ident,
+ format "'[' 'rew' 'dependent' [ 'fun' y p => P ] '/ ' H in '/' H' ']'").
+ Notation "'rew' 'dependent' -> [ 'fun' y p => P ] H 'in' H'"
+ := (match H as p in (_ = y) return P with
+ | eq_refl => H'
+ end)
+ (at level 10, H' at level 10, y ident, p ident, only parsing).
+ Notation "'rew' 'dependent' <- [ 'fun' y p => P ] H 'in' H'"
+ := (match eq_sym H as p in (_ = y) return P with
+ | eq_refl => H'
+ end)
+ (at level 10, H' at level 10, y ident, p ident,
+ format "'[' 'rew' 'dependent' <- [ 'fun' y p => P ] '/ ' H in '/' H' ']'").
+ Notation "'rew' 'dependent' [ P ] H 'in' H'"
+ := (match H as p in (_ = y) return P y p with
+ | eq_refl => H'
+ end)
+ (at level 10, H' at level 10,
+ format "'[' 'rew' 'dependent' [ P ] '/ ' H in '/' H' ']'").
+ Notation "'rew' 'dependent' -> [ P ] H 'in' H'"
+ := (match H as p in (_ = y) return P y p with
+ | eq_refl => H'
+ end)
+ (at level 10, H' at level 10,
+ only parsing).
+ Notation "'rew' 'dependent' <- [ P ] H 'in' H'"
+ := (match eq_sym H as p in (_ = y) return P y p with
+ | eq_refl => H'
+ end)
+ (at level 10, H' at level 10,
+ format "'[' 'rew' 'dependent' <- [ P ] '/ ' H in '/' H' ']'").
End EqNotations.
Import EqNotations.
@@ -793,13 +845,6 @@ Qed.
Declare Left Step iff_stepl.
Declare Right Step iff_trans.
-Local Notation "'rew' 'dependent' H 'in' H'"
- := (match H with
- | eq_refl => H'
- end)
- (at level 10, H' at level 10,
- format "'[' 'rew' 'dependent' '/ ' H in '/' H' ']'").
-
(** Equality for [ex] *)
Section ex.
Local Unset Implicit Arguments.
diff --git a/theories/Reals/RList.v b/theories/Reals/RList.v
index 128543d8ab..18cc3aa034 100644
--- a/theories/Reals/RList.v
+++ b/theories/Reals/RList.v
@@ -8,98 +8,90 @@
(* * (see LICENSE file for the text of the license) *)
(************************************************************************)
+Require Import List.
Require Import Rbase.
Require Import Rfunctions.
Local Open Scope R_scope.
-Inductive Rlist : Type :=
-| nil : Rlist
-| cons : R -> Rlist -> Rlist.
-Fixpoint In (x:R) (l:Rlist) : Prop :=
- match l with
- | nil => False
- | cons a l' => x = a \/ In x l'
- end.
+#[deprecated(since="8.12",note="use (list R) instead")]
+Notation Rlist := (list R).
-Fixpoint Rlength (l:Rlist) : nat :=
- match l with
- | nil => 0%nat
- | cons a l' => S (Rlength l')
- end.
+#[deprecated(since="8.12",note="use List.length instead")]
+Notation Rlength := List.length.
-Fixpoint MaxRlist (l:Rlist) : R :=
+Fixpoint MaxRlist (l:list R) : R :=
match l with
| nil => 0
- | cons a l1 =>
+ | a :: l1 =>
match l1 with
| nil => a
- | cons a' l2 => Rmax a (MaxRlist l1)
+ | a' :: l2 => Rmax a (MaxRlist l1)
end
end.
-Fixpoint MinRlist (l:Rlist) : R :=
+Fixpoint MinRlist (l:list R) : R :=
match l with
| nil => 1
- | cons a l1 =>
+ | a :: l1 =>
match l1 with
| nil => a
- | cons a' l2 => Rmin a (MinRlist l1)
+ | a' :: l2 => Rmin a (MinRlist l1)
end
end.
-Lemma MaxRlist_P1 : forall (l:Rlist) (x:R), In x l -> x <= MaxRlist l.
+Lemma MaxRlist_P1 : forall (l:list R) (x:R), In x l -> x <= MaxRlist l.
Proof.
intros; induction l as [| r l Hrecl].
simpl in H; elim H.
induction l as [| r0 l Hrecl0].
simpl in H; elim H; intro.
- simpl; right; assumption.
+ simpl; right; symmetry; assumption.
elim H0.
- replace (MaxRlist (cons r (cons r0 l))) with (Rmax r (MaxRlist (cons r0 l))).
+ replace (MaxRlist (r :: r0 :: l)) with (Rmax r (MaxRlist (r0 :: l))).
simpl in H; decompose [or] H.
rewrite H0; apply RmaxLess1.
- unfold Rmax; case (Rle_dec r (MaxRlist (cons r0 l))); intro.
+ unfold Rmax; case (Rle_dec r (MaxRlist (r0 :: l))); intro.
apply Hrecl; simpl; tauto.
- apply Rle_trans with (MaxRlist (cons r0 l));
+ apply Rle_trans with (MaxRlist (r0 :: l));
[ apply Hrecl; simpl; tauto | left; auto with real ].
- unfold Rmax; case (Rle_dec r (MaxRlist (cons r0 l))); intro.
+ unfold Rmax; case (Rle_dec r (MaxRlist (r0 :: l))); intro.
apply Hrecl; simpl; tauto.
- apply Rle_trans with (MaxRlist (cons r0 l));
+ apply Rle_trans with (MaxRlist (r0 :: l));
[ apply Hrecl; simpl; tauto | left; auto with real ].
reflexivity.
Qed.
-Fixpoint AbsList (l:Rlist) (x:R) : Rlist :=
+Fixpoint AbsList (l:list R) (x:R) : list R :=
match l with
| nil => nil
- | cons a l' => cons (Rabs (a - x) / 2) (AbsList l' x)
+ | a :: l' => (Rabs (a - x) / 2) :: (AbsList l' x)
end.
-Lemma MinRlist_P1 : forall (l:Rlist) (x:R), In x l -> MinRlist l <= x.
+Lemma MinRlist_P1 : forall (l:list R) (x:R), In x l -> MinRlist l <= x.
Proof.
intros; induction l as [| r l Hrecl].
simpl in H; elim H.
induction l as [| r0 l Hrecl0].
simpl in H; elim H; intro.
- simpl; right; symmetry ; assumption.
+ simpl; right; assumption.
elim H0.
- replace (MinRlist (cons r (cons r0 l))) with (Rmin r (MinRlist (cons r0 l))).
+ replace (MinRlist (r :: r0 :: l)) with (Rmin r (MinRlist (r0 :: l))).
simpl in H; decompose [or] H.
rewrite H0; apply Rmin_l.
- unfold Rmin; case (Rle_dec r (MinRlist (cons r0 l))); intro.
- apply Rle_trans with (MinRlist (cons r0 l)).
+ unfold Rmin; case (Rle_dec r (MinRlist (r0 :: l))); intro.
+ apply Rle_trans with (MinRlist (r0 :: l)).
assumption.
apply Hrecl; simpl; tauto.
apply Hrecl; simpl; tauto.
- apply Rle_trans with (MinRlist (cons r0 l)).
+ apply Rle_trans with (MinRlist (r0 :: l)).
apply Rmin_r.
apply Hrecl; simpl; tauto.
reflexivity.
Qed.
Lemma AbsList_P1 :
- forall (l:Rlist) (x y:R), In y l -> In (Rabs (y - x) / 2) (AbsList l x).
+ forall (l:list R) (x y:R), In y l -> In (Rabs (y - x) / 2) (AbsList l x).
Proof.
intros; induction l as [| r l Hrecl].
elim H.
@@ -109,21 +101,21 @@ Proof.
Qed.
Lemma MinRlist_P2 :
- forall l:Rlist, (forall y:R, In y l -> 0 < y) -> 0 < MinRlist l.
+ forall l:list R, (forall y:R, In y l -> 0 < y) -> 0 < MinRlist l.
Proof.
intros; induction l as [| r l Hrecl].
apply Rlt_0_1.
induction l as [| r0 l Hrecl0].
simpl; apply H; simpl; tauto.
- replace (MinRlist (cons r (cons r0 l))) with (Rmin r (MinRlist (cons r0 l))).
- unfold Rmin; case (Rle_dec r (MinRlist (cons r0 l))); intro.
+ replace (MinRlist (r :: r0 :: l)) with (Rmin r (MinRlist (r0 :: l))).
+ unfold Rmin; case (Rle_dec r (MinRlist (r0 :: l))); intro.
apply H; simpl; tauto.
apply Hrecl; intros; apply H; simpl; simpl in H0; tauto.
reflexivity.
Qed.
Lemma AbsList_P2 :
- forall (l:Rlist) (x y:R),
+ forall (l:list R) (x y:R),
In y (AbsList l x) -> exists z : R, In z l /\ y = Rabs (z - x) / 2.
Proof.
intros; induction l as [| r l Hrecl].
@@ -131,47 +123,48 @@ Proof.
elim H; intro.
exists r; split.
simpl; tauto.
+ symmetry.
assumption.
assert (H1 := Hrecl H0); elim H1; intros; elim H2; clear H2; intros;
exists x0; simpl; simpl in H2; tauto.
Qed.
Lemma MaxRlist_P2 :
- forall l:Rlist, (exists y : R, In y l) -> In (MaxRlist l) l.
+ forall l:list R, (exists y : R, In y l) -> In (MaxRlist l) l.
Proof.
intros; induction l as [| r l Hrecl].
simpl in H; elim H; trivial.
induction l as [| r0 l Hrecl0].
simpl; left; reflexivity.
- change (In (Rmax r (MaxRlist (cons r0 l))) (cons r (cons r0 l)));
- unfold Rmax; case (Rle_dec r (MaxRlist (cons r0 l)));
+ change (In (Rmax r (MaxRlist (r0 :: l))) (r :: r0 :: l));
+ unfold Rmax; case (Rle_dec r (MaxRlist (r0 :: l)));
intro.
right; apply Hrecl; exists r0; left; reflexivity.
left; reflexivity.
Qed.
-Fixpoint pos_Rl (l:Rlist) (i:nat) : R :=
+Fixpoint pos_Rl (l:list R) (i:nat) : R :=
match l with
| nil => 0
- | cons a l' => match i with
+ | a :: l' => match i with
| O => a
| S i' => pos_Rl l' i'
end
end.
Lemma pos_Rl_P1 :
- forall (l:Rlist) (a:R),
- (0 < Rlength l)%nat ->
- pos_Rl (cons a l) (Rlength l) = pos_Rl l (pred (Rlength l)).
+ forall (l:list R) (a:R),
+ (0 < length l)%nat ->
+ pos_Rl (a :: l) (length l) = pos_Rl l (pred (length l)).
Proof.
intros; induction l as [| r l Hrecl];
[ elim (lt_n_O _ H)
- | simpl; case (Rlength l); [ reflexivity | intro; reflexivity ] ].
+ | simpl; case (length l); [ reflexivity | intro; reflexivity ] ].
Qed.
Lemma pos_Rl_P2 :
- forall (l:Rlist) (x:R),
- In x l <-> (exists i : nat, (i < Rlength l)%nat /\ x = pos_Rl l i).
+ forall (l:list R) (x:R),
+ In x l <-> (exists i : nat, (i < length l)%nat /\ x = pos_Rl l i).
Proof.
intros; induction l as [| r l Hrecl].
split; intro;
@@ -179,12 +172,12 @@ Proof.
split; intro.
elim H; intro.
exists 0%nat; split;
- [ simpl; apply lt_O_Sn | simpl; apply H0 ].
+ [ simpl; apply lt_O_Sn | simpl; symmetry; apply H0 ].
elim Hrecl; intros; assert (H3 := H1 H0); elim H3; intros; elim H4; intros;
exists (S x0); split;
[ simpl; apply lt_n_S; assumption | simpl; assumption ].
elim H; intros; elim H0; intros; destruct (zerop x0) as [->|].
- simpl in H2; left; assumption.
+ simpl in H2; left; symmetry; assumption.
right; elim Hrecl; intros H4 H5; apply H5; assert (H6 : S (pred x0) = x0).
symmetry ; apply S_pred with 0%nat; assumption.
exists (pred x0); split;
@@ -193,21 +186,21 @@ Proof.
Qed.
Lemma Rlist_P1 :
- forall (l:Rlist) (P:R -> R -> Prop),
+ forall (l:list R) (P:R -> R -> Prop),
(forall x:R, In x l -> exists y : R, P x y) ->
- exists l' : Rlist,
- Rlength l = Rlength l' /\
- (forall i:nat, (i < Rlength l)%nat -> P (pos_Rl l i) (pos_Rl l' i)).
+ exists l' : list R,
+ length l = length l' /\
+ (forall i:nat, (i < length l)%nat -> P (pos_Rl l i) (pos_Rl l' i)).
Proof.
intros; induction l as [| r l Hrecl].
exists nil; intros; split;
[ reflexivity | intros; simpl in H0; elim (lt_n_O _ H0) ].
- assert (H0 : In r (cons r l)).
+ assert (H0 : In r (r :: l)).
simpl; left; reflexivity.
assert (H1 := H _ H0);
assert (H2 : forall x:R, In x l -> exists y : R, P x y).
intros; apply H; simpl; right; assumption.
- assert (H3 := Hrecl H2); elim H1; intros; elim H3; intros; exists (cons x x0);
+ assert (H3 := Hrecl H2); elim H1; intros; elim H3; intros; exists (x :: x0);
intros; elim H5; clear H5; intros; split.
simpl; rewrite H5; reflexivity.
intros; destruct (zerop i) as [->|].
@@ -218,57 +211,45 @@ Proof.
assumption.
Qed.
-Definition ordered_Rlist (l:Rlist) : Prop :=
- forall i:nat, (i < pred (Rlength l))%nat -> pos_Rl l i <= pos_Rl l (S i).
+Definition ordered_Rlist (l:list R) : Prop :=
+ forall i:nat, (i < pred (length l))%nat -> pos_Rl l i <= pos_Rl l (S i).
-Fixpoint insert (l:Rlist) (x:R) : Rlist :=
+Fixpoint insert (l:list R) (x:R) : list R :=
match l with
- | nil => cons x nil
- | cons a l' =>
+ | nil => x :: nil
+ | a :: l' =>
match Rle_dec a x with
- | left _ => cons a (insert l' x)
- | right _ => cons x l
+ | left _ => a :: (insert l' x)
+ | right _ => x :: l
end
end.
-Fixpoint cons_Rlist (l k:Rlist) : Rlist :=
- match l with
- | nil => k
- | cons a l' => cons a (cons_Rlist l' k)
- end.
-
-Fixpoint cons_ORlist (k l:Rlist) : Rlist :=
+Fixpoint cons_ORlist (k l:list R) : list R :=
match k with
| nil => l
- | cons a k' => cons_ORlist k' (insert l a)
+ | a :: k' => cons_ORlist k' (insert l a)
end.
-Fixpoint app_Rlist (l:Rlist) (f:R -> R) : Rlist :=
+Fixpoint mid_Rlist (l:list R) (x:R) : list R :=
match l with
| nil => nil
- | cons a l' => cons (f a) (app_Rlist l' f)
+ | a :: l' => ((x + a) / 2) :: (mid_Rlist l' a)
end.
-Fixpoint mid_Rlist (l:Rlist) (x:R) : Rlist :=
+Definition Rtail (l:list R) : list R :=
match l with
| nil => nil
- | cons a l' => cons ((x + a) / 2) (mid_Rlist l' a)
+ | a :: l' => l'
end.
-Definition Rtail (l:Rlist) : Rlist :=
+Definition FF (l:list R) (f:R -> R) : list R :=
match l with
| nil => nil
- | cons a l' => l'
- end.
-
-Definition FF (l:Rlist) (f:R -> R) : Rlist :=
- match l with
- | nil => nil
- | cons a l' => app_Rlist (mid_Rlist l' a) f
+ | a :: l' => map f (mid_Rlist l' a)
end.
Lemma RList_P0 :
- forall (l:Rlist) (a:R),
+ forall (l:list R) (a:R),
pos_Rl (insert l a) 0 = a \/ pos_Rl (insert l a) 0 = pos_Rl l 0.
Proof.
intros; induction l as [| r l Hrecl];
@@ -278,7 +259,7 @@ Proof.
Qed.
Lemma RList_P1 :
- forall (l:Rlist) (a:R), ordered_Rlist l -> ordered_Rlist (insert l a).
+ forall (l:list R) (a:R), ordered_Rlist l -> ordered_Rlist (insert l a).
Proof.
intros; induction l as [| r l Hrecl].
simpl; unfold ordered_Rlist; intros; simpl in H0;
@@ -286,8 +267,8 @@ Proof.
simpl; case (Rle_dec r a); intro.
assert (H1 : ordered_Rlist l).
unfold ordered_Rlist; unfold ordered_Rlist in H; intros;
- assert (H1 : (S i < pred (Rlength (cons r l)))%nat);
- [ simpl; replace (Rlength l) with (S (pred (Rlength l)));
+ assert (H1 : (S i < pred (length (r :: l)))%nat);
+ [ simpl; replace (length l) with (S (pred (length l)));
[ apply lt_n_S; assumption
| symmetry ; apply S_pred with 0%nat; apply neq_O_lt; red;
intro; rewrite <- H1 in H0; simpl in H0; elim (lt_n_O _ H0) ]
@@ -300,18 +281,18 @@ Proof.
[ simpl; assumption
| rewrite H4; apply (H 0%nat); simpl; apply lt_O_Sn ].
simpl; apply H2; simpl in H0; apply lt_S_n;
- replace (S (pred (Rlength (insert l a)))) with (Rlength (insert l a));
+ replace (S (pred (length (insert l a)))) with (length (insert l a));
[ assumption
| apply S_pred with 0%nat; apply neq_O_lt; red; intro;
rewrite <- H3 in H0; elim (lt_n_O _ H0) ].
unfold ordered_Rlist; intros; induction i as [| i Hreci];
[ simpl; auto with real
- | change (pos_Rl (cons r l) i <= pos_Rl (cons r l) (S i)); apply H;
+ | change (pos_Rl (r :: l) i <= pos_Rl (r :: l) (S i)); apply H;
simpl in H0; simpl; apply (lt_S_n _ _ H0) ].
Qed.
Lemma RList_P2 :
- forall l1 l2:Rlist, ordered_Rlist l2 -> ordered_Rlist (cons_ORlist l1 l2).
+ forall l1 l2:list R, ordered_Rlist l2 -> ordered_Rlist (cons_ORlist l1 l2).
Proof.
simple induction l1;
[ intros; simpl; apply H
@@ -319,36 +300,36 @@ Proof.
Qed.
Lemma RList_P3 :
- forall (l:Rlist) (x:R),
- In x l <-> (exists i : nat, x = pos_Rl l i /\ (i < Rlength l)%nat).
+ forall (l:list R) (x:R),
+ In x l <-> (exists i : nat, x = pos_Rl l i /\ (i < length l)%nat).
Proof.
intros; split; intro;
[ induction l as [| r l Hrecl] | induction l as [| r l Hrecl] ].
elim H.
elim H; intro;
- [ exists 0%nat; split; [ apply H0 | simpl; apply lt_O_Sn ]
+ [ exists 0%nat; split; [ symmetry; apply H0 | simpl; apply lt_O_Sn ]
| elim (Hrecl H0); intros; elim H1; clear H1; intros; exists (S x0); split;
[ apply H1 | simpl; apply lt_n_S; assumption ] ].
elim H; intros; elim H0; intros; elim (lt_n_O _ H2).
simpl; elim H; intros; elim H0; clear H0; intros;
induction x0 as [| x0 Hrecx0];
- [ left; apply H0
+ [ left; symmetry; apply H0
| right; apply Hrecl; exists x0; split;
[ apply H0 | simpl in H1; apply lt_S_n; assumption ] ].
Qed.
Lemma RList_P4 :
- forall (l1:Rlist) (a:R), ordered_Rlist (cons a l1) -> ordered_Rlist l1.
+ forall (l1:list R) (a:R), ordered_Rlist (a :: l1) -> ordered_Rlist l1.
Proof.
intros; unfold ordered_Rlist; intros; apply (H (S i)); simpl;
- replace (Rlength l1) with (S (pred (Rlength l1)));
+ replace (length l1) with (S (pred (length l1)));
[ apply lt_n_S; assumption
| symmetry ; apply S_pred with 0%nat; apply neq_O_lt; red;
intro; rewrite <- H1 in H0; elim (lt_n_O _ H0) ].
Qed.
Lemma RList_P5 :
- forall (l:Rlist) (x:R), ordered_Rlist l -> In x l -> pos_Rl l 0 <= x.
+ forall (l:list R) (x:R), ordered_Rlist l -> In x l -> pos_Rl l 0 <= x.
Proof.
intros; induction l as [| r l Hrecl];
[ elim H0
@@ -361,14 +342,14 @@ Proof.
Qed.
Lemma RList_P6 :
- forall l:Rlist,
+ forall l:list R,
ordered_Rlist l <->
(forall i j:nat,
- (i <= j)%nat -> (j < Rlength l)%nat -> pos_Rl l i <= pos_Rl l j).
+ (i <= j)%nat -> (j < length l)%nat -> pos_Rl l i <= pos_Rl l j).
Proof.
- simple induction l; split; intro.
+ induction l as [ | r r0 H]; split; intro.
intros; right; reflexivity.
- unfold ordered_Rlist; intros; simpl in H0; elim (lt_n_O _ H0).
+ unfold ordered_Rlist;intros; simpl in H0; elim (lt_n_O _ H0).
intros; induction i as [| i Hreci];
[ induction j as [| j Hrecj];
[ right; reflexivity
@@ -391,14 +372,14 @@ Proof.
Qed.
Lemma RList_P7 :
- forall (l:Rlist) (x:R),
- ordered_Rlist l -> In x l -> x <= pos_Rl l (pred (Rlength l)).
+ forall (l:list R) (x:R),
+ ordered_Rlist l -> In x l -> x <= pos_Rl l (pred (length l)).
Proof.
intros; assert (H1 := RList_P6 l); elim H1; intros H2 _; assert (H3 := H2 H);
clear H1 H2; assert (H1 := RList_P3 l x); elim H1;
clear H1; intros; assert (H4 := H1 H0); elim H4; clear H4;
intros; elim H4; clear H4; intros; rewrite H4;
- assert (H6 : Rlength l = S (pred (Rlength l))).
+ assert (H6 : length l = S (pred (length l))).
apply S_pred with 0%nat; apply neq_O_lt; red; intro;
rewrite <- H6 in H5; elim (lt_n_O _ H5).
apply H3;
@@ -408,52 +389,55 @@ Proof.
Qed.
Lemma RList_P8 :
- forall (l:Rlist) (a x:R), In x (insert l a) <-> x = a \/ In x l.
-Proof.
- simple induction l.
- intros; split; intro; simpl in H; apply H.
- intros; split; intro;
- [ simpl in H0; generalize H0; case (Rle_dec r a); intros;
- [ simpl in H1; elim H1; intro;
- [ right; left; assumption
- | elim (H a x); intros; elim (H3 H2); intro;
- [ left; assumption | right; right; assumption ] ]
- | simpl in H1; decompose [or] H1;
- [ left; assumption
- | right; left; assumption
- | right; right; assumption ] ]
- | simpl; case (Rle_dec r a); intro;
- [ simpl in H0; decompose [or] H0;
- [ right; elim (H a x); intros; apply H3; left
- | left
- | right; elim (H a x); intros; apply H3; right ]
- | simpl in H0; decompose [or] H0; [ left | right; left | right; right ] ];
- assumption ].
+ forall (l:list R) (a x:R), In x (insert l a) <-> x = a \/ In x l.
+Proof.
+ induction l as [ | r r0 H].
+ intros; split; intro; destruct H as [ax | []]; left; symmetry; exact ax.
+ intros; split; intro.
+ simpl in H0; generalize H0; case (Rle_dec r a); intros.
+ simpl in H1; elim H1; intro.
+ right; left; assumption.
+ elim (H a x); intros; elim (H3 H2); intro.
+ left; assumption.
+ right; right; assumption.
+ simpl in H1; decompose [or] H1.
+ left; symmetry; assumption.
+ right; left; assumption.
+ right; right; assumption.
+ simpl; case (Rle_dec r a); intro.
+ simpl in H0; decompose [or] H0.
+ right; elim (H a x); intros; apply H3; left. assumption.
+ left. assumption.
+ right; elim (H a x); intros; apply H3; right; assumption.
+ simpl in H0; decompose [or] H0; [ left | right; left | right; right];
+ trivial; symmetry; assumption.
Qed.
Lemma RList_P9 :
- forall (l1 l2:Rlist) (x:R), In x (cons_ORlist l1 l2) <-> In x l1 \/ In x l2.
+ forall (l1 l2:list R) (x:R), In x (cons_ORlist l1 l2) <-> In x l1 \/ In x l2.
Proof.
- simple induction l1.
+ induction l1 as [ | r r0 H].
intros; split; intro;
[ simpl in H; right; assumption
| simpl; elim H; intro; [ elim H0 | assumption ] ].
intros; split.
simpl; intros; elim (H (insert l2 r) x); intros; assert (H3 := H1 H0);
- elim H3; intro;
- [ left; right; assumption
- | elim (RList_P8 l2 r x); intros H5 _; assert (H6 := H5 H4); elim H6; intro;
- [ left; left; assumption | right; assumption ] ].
+ elim H3; intro.
+ left; right; assumption.
+ elim (RList_P8 l2 r x); intros H5 _; assert (H6 := H5 H4); elim H6; intro.
+ left; left; symmetry; assumption.
+ right; assumption.
intro; simpl; elim (H (insert l2 r) x); intros _ H1; apply H1;
- elim H0; intro;
- [ elim H2; intro;
- [ right; elim (RList_P8 l2 r x); intros _ H4; apply H4; left; assumption
- | left; assumption ]
- | right; elim (RList_P8 l2 r x); intros _ H3; apply H3; right; assumption ].
+ elim H0; intro.
+ elim H2; intro.
+ right; elim (RList_P8 l2 r x); intros _ H4; apply H4; left.
+ symmetry; assumption.
+ left; assumption.
+ right; elim (RList_P8 l2 r x); intros _ H3; apply H3; right; assumption.
Qed.
Lemma RList_P10 :
- forall (l:Rlist) (a:R), Rlength (insert l a) = S (Rlength l).
+ forall (l:list R) (a:R), length (insert l a) = S (length l).
Proof.
intros; induction l as [| r l Hrecl];
[ reflexivity
@@ -462,10 +446,10 @@ Proof.
Qed.
Lemma RList_P11 :
- forall l1 l2:Rlist,
- Rlength (cons_ORlist l1 l2) = (Rlength l1 + Rlength l2)%nat.
+ forall l1 l2:list R,
+ length (cons_ORlist l1 l2) = (length l1 + length l2)%nat.
Proof.
- simple induction l1;
+ induction l1 as [ | r r0 H];
[ intro; reflexivity
| intros; simpl; rewrite (H (insert l2 r)); rewrite RList_P10;
apply INR_eq; rewrite S_INR; do 2 rewrite plus_INR;
@@ -473,8 +457,8 @@ Proof.
Qed.
Lemma RList_P12 :
- forall (l:Rlist) (i:nat) (f:R -> R),
- (i < Rlength l)%nat -> pos_Rl (app_Rlist l f) i = f (pos_Rl l i).
+ forall (l:list R) (i:nat) (f:R -> R),
+ (i < length l)%nat -> pos_Rl (map f l) i = f (pos_Rl l i).
Proof.
simple induction l;
[ intros; elim (lt_n_O _ H)
@@ -483,30 +467,30 @@ Proof.
Qed.
Lemma RList_P13 :
- forall (l:Rlist) (i:nat) (a:R),
- (i < pred (Rlength l))%nat ->
+ forall (l:list R) (i:nat) (a:R),
+ (i < pred (length l))%nat ->
pos_Rl (mid_Rlist l a) (S i) = (pos_Rl l i + pos_Rl l (S i)) / 2.
Proof.
- simple induction l.
+ induction l as [ | r r0 H].
intros; simpl in H; elim (lt_n_O _ H).
- simple induction r0.
+ induction r0 as [ | r1 r2 H0].
intros; simpl in H0; elim (lt_n_O _ H0).
intros; simpl in H1; induction i as [| i Hreci].
reflexivity.
change
- (pos_Rl (mid_Rlist (cons r1 r2) r) (S i) =
- (pos_Rl (cons r1 r2) i + pos_Rl (cons r1 r2) (S i)) / 2)
- ; apply H0; simpl; apply lt_S_n; assumption.
+ (pos_Rl (mid_Rlist (r1 :: r2) r) (S i) =
+ (pos_Rl (r1 :: r2) i + pos_Rl (r1 :: r2) (S i)) / 2).
+ apply H; simpl; apply lt_S_n; assumption.
Qed.
-Lemma RList_P14 : forall (l:Rlist) (a:R), Rlength (mid_Rlist l a) = Rlength l.
+Lemma RList_P14 : forall (l:list R) (a:R), length (mid_Rlist l a) = length l.
Proof.
- simple induction l; intros;
+ induction l as [ | r r0 H]; intros;
[ reflexivity | simpl; rewrite (H r); reflexivity ].
Qed.
Lemma RList_P15 :
- forall l1 l2:Rlist,
+ forall l1 l2:list R,
ordered_Rlist l1 ->
ordered_Rlist l2 ->
pos_Rl l1 0 = pos_Rl l2 0 -> pos_Rl (cons_ORlist l1 l2) 0 = pos_Rl l1 0.
@@ -514,10 +498,10 @@ Proof.
intros; apply Rle_antisym.
induction l1 as [| r l1 Hrecl1];
[ simpl; simpl in H1; right; symmetry ; assumption
- | elim (RList_P9 (cons r l1) l2 (pos_Rl (cons r l1) 0)); intros;
+ | elim (RList_P9 (r :: l1) l2 (pos_Rl (r :: l1) 0)); intros;
assert
(H4 :
- In (pos_Rl (cons r l1) 0) (cons r l1) \/ In (pos_Rl (cons r l1) 0) l2);
+ In (pos_Rl (r :: l1) 0) (r :: l1) \/ In (pos_Rl (r :: l1) 0) l2);
[ left; left; reflexivity
| assert (H5 := H3 H4); apply RList_P5;
[ apply RList_P2; assumption | assumption ] ] ].
@@ -525,25 +509,25 @@ Proof.
[ simpl; simpl in H1; right; assumption
| assert
(H2 :
- In (pos_Rl (cons_ORlist (cons r l1) l2) 0) (cons_ORlist (cons r l1) l2));
+ In (pos_Rl (cons_ORlist (r :: l1) l2) 0) (cons_ORlist (r :: l1) l2));
[ elim
- (RList_P3 (cons_ORlist (cons r l1) l2)
- (pos_Rl (cons_ORlist (cons r l1) l2) 0));
+ (RList_P3 (cons_ORlist (r :: l1) l2)
+ (pos_Rl (cons_ORlist (r :: l1) l2) 0));
intros; apply H3; exists 0%nat; split;
[ reflexivity | rewrite RList_P11; simpl; apply lt_O_Sn ]
- | elim (RList_P9 (cons r l1) l2 (pos_Rl (cons_ORlist (cons r l1) l2) 0));
+ | elim (RList_P9 (r :: l1) l2 (pos_Rl (cons_ORlist (r :: l1) l2) 0));
intros; assert (H5 := H3 H2); elim H5; intro;
[ apply RList_P5; assumption
| rewrite H1; apply RList_P5; assumption ] ] ].
Qed.
Lemma RList_P16 :
- forall l1 l2:Rlist,
+ forall l1 l2:list R,
ordered_Rlist l1 ->
ordered_Rlist l2 ->
- pos_Rl l1 (pred (Rlength l1)) = pos_Rl l2 (pred (Rlength l2)) ->
- pos_Rl (cons_ORlist l1 l2) (pred (Rlength (cons_ORlist l1 l2))) =
- pos_Rl l1 (pred (Rlength l1)).
+ pos_Rl l1 (pred (length l1)) = pos_Rl l2 (pred (length l2)) ->
+ pos_Rl (cons_ORlist l1 l2) (pred (length (cons_ORlist l1 l2))) =
+ pos_Rl l1 (pred (length l1)).
Proof.
intros; apply Rle_antisym.
induction l1 as [| r l1 Hrecl1].
@@ -551,99 +535,99 @@ Proof.
assert
(H2 :
In
- (pos_Rl (cons_ORlist (cons r l1) l2)
- (pred (Rlength (cons_ORlist (cons r l1) l2))))
- (cons_ORlist (cons r l1) l2));
+ (pos_Rl (cons_ORlist (r :: l1) l2)
+ (pred (length (cons_ORlist (r :: l1) l2))))
+ (cons_ORlist (r :: l1) l2));
[ elim
- (RList_P3 (cons_ORlist (cons r l1) l2)
- (pos_Rl (cons_ORlist (cons r l1) l2)
- (pred (Rlength (cons_ORlist (cons r l1) l2)))));
- intros; apply H3; exists (pred (Rlength (cons_ORlist (cons r l1) l2)));
+ (RList_P3 (cons_ORlist (r :: l1) l2)
+ (pos_Rl (cons_ORlist (r :: l1) l2)
+ (pred (length (cons_ORlist (r :: l1) l2)))));
+ intros; apply H3; exists (pred (length (cons_ORlist (r :: l1) l2)));
split; [ reflexivity | rewrite RList_P11; simpl; apply lt_n_Sn ]
| elim
- (RList_P9 (cons r l1) l2
- (pos_Rl (cons_ORlist (cons r l1) l2)
- (pred (Rlength (cons_ORlist (cons r l1) l2)))));
+ (RList_P9 (r :: l1) l2
+ (pos_Rl (cons_ORlist (r :: l1) l2)
+ (pred (length (cons_ORlist (r :: l1) l2)))));
intros; assert (H5 := H3 H2); elim H5; intro;
[ apply RList_P7; assumption | rewrite H1; apply RList_P7; assumption ] ].
induction l1 as [| r l1 Hrecl1].
simpl; simpl in H1; right; assumption.
elim
- (RList_P9 (cons r l1) l2 (pos_Rl (cons r l1) (pred (Rlength (cons r l1)))));
+ (RList_P9 (r :: l1) l2 (pos_Rl (r :: l1) (pred (length (r :: l1))))).
intros;
assert
(H4 :
- In (pos_Rl (cons r l1) (pred (Rlength (cons r l1)))) (cons r l1) \/
- In (pos_Rl (cons r l1) (pred (Rlength (cons r l1)))) l2);
- [ left; change (In (pos_Rl (cons r l1) (Rlength l1)) (cons r l1));
- elim (RList_P3 (cons r l1) (pos_Rl (cons r l1) (Rlength l1)));
- intros; apply H5; exists (Rlength l1); split;
+ In (pos_Rl (r :: l1) (pred (length (r :: l1)))) (r :: l1) \/
+ In (pos_Rl (r :: l1) (pred (length (r :: l1)))) l2);
+ [ left; change (In (pos_Rl (r :: l1) (length l1)) (r :: l1));
+ elim (RList_P3 (r :: l1) (pos_Rl (r :: l1) (length l1)));
+ intros; apply H5; exists (length l1); split;
[ reflexivity | simpl; apply lt_n_Sn ]
| assert (H5 := H3 H4); apply RList_P7;
[ apply RList_P2; assumption
| elim
- (RList_P9 (cons r l1) l2
- (pos_Rl (cons r l1) (pred (Rlength (cons r l1)))));
+ (RList_P9 (r :: l1) l2
+ (pos_Rl (r :: l1) (pred (length (r :: l1)))));
intros; apply H7; left;
elim
- (RList_P3 (cons r l1)
- (pos_Rl (cons r l1) (pred (Rlength (cons r l1)))));
- intros; apply H9; exists (pred (Rlength (cons r l1)));
+ (RList_P3 (r :: l1)
+ (pos_Rl (r :: l1) (pred (length (r :: l1)))));
+ intros; apply H9; exists (pred (length (r :: l1)));
split; [ reflexivity | simpl; apply lt_n_Sn ] ] ].
Qed.
Lemma RList_P17 :
- forall (l1:Rlist) (x:R) (i:nat),
+ forall (l1:list R) (x:R) (i:nat),
ordered_Rlist l1 ->
In x l1 ->
- pos_Rl l1 i < x -> (i < pred (Rlength l1))%nat -> pos_Rl l1 (S i) <= x.
+ pos_Rl l1 i < x -> (i < pred (length l1))%nat -> pos_Rl l1 (S i) <= x.
Proof.
- simple induction l1.
+ induction l1 as [ | r r0 H].
intros; elim H0.
intros; induction i as [| i Hreci].
simpl; elim H1; intro;
[ simpl in H2; rewrite H4 in H2; elim (Rlt_irrefl _ H2)
| apply RList_P5; [ apply RList_P4 with r; assumption | assumption ] ].
simpl; simpl in H2; elim H1; intro.
- rewrite H4 in H2; assert (H5 : r <= pos_Rl r0 i);
+ rewrite <- H4 in H2; assert (H5 : r <= pos_Rl r0 i);
[ apply Rle_trans with (pos_Rl r0 0);
[ apply (H0 0%nat); simpl; simpl in H3; apply neq_O_lt;
red; intro; rewrite <- H5 in H3; elim (lt_n_O _ H3)
| elim (RList_P6 r0); intros; apply H5;
[ apply RList_P4 with r; assumption
| apply le_O_n
- | simpl in H3; apply lt_S_n; apply lt_trans with (Rlength r0);
+ | simpl in H3; apply lt_S_n; apply lt_trans with (length r0);
[ apply H3 | apply lt_n_Sn ] ] ]
| elim (Rlt_irrefl _ (Rle_lt_trans _ _ _ H5 H2)) ].
apply H; try assumption;
[ apply RList_P4 with r; assumption
| simpl in H3; apply lt_S_n;
- replace (S (pred (Rlength r0))) with (Rlength r0);
+ replace (S (pred (length r0))) with (length r0);
[ apply H3
| apply S_pred with 0%nat; apply neq_O_lt; red; intro;
rewrite <- H5 in H3; elim (lt_n_O _ H3) ] ].
Qed.
Lemma RList_P18 :
- forall (l:Rlist) (f:R -> R), Rlength (app_Rlist l f) = Rlength l.
+ forall (l:list R) (f:R -> R), length (map f l) = length l.
Proof.
simple induction l; intros;
[ reflexivity | simpl; rewrite H; reflexivity ].
Qed.
Lemma RList_P19 :
- forall l:Rlist,
- l <> nil -> exists r : R, (exists r0 : Rlist, l = cons r r0).
+ forall l:list R,
+ l <> nil -> exists r : R, (exists r0 : list R, l = r :: r0).
Proof.
intros; induction l as [| r l Hrecl];
[ elim H; reflexivity | exists r; exists l; reflexivity ].
Qed.
Lemma RList_P20 :
- forall l:Rlist,
- (2 <= Rlength l)%nat ->
+ forall l:list R,
+ (2 <= length l)%nat ->
exists r : R,
- (exists r1 : R, (exists l' : Rlist, l = cons r (cons r1 l'))).
+ (exists r1 : R, (exists l' : list R, l = r :: r1 :: l')).
Proof.
intros; induction l as [| r l Hrecl];
[ simpl in H; elim (le_Sn_O _ H)
@@ -652,40 +636,32 @@ Proof.
| exists r; exists r0; exists l; reflexivity ] ].
Qed.
-Lemma RList_P21 : forall l l':Rlist, l = l' -> Rtail l = Rtail l'.
+Lemma RList_P21 : forall l l':list R, l = l' -> Rtail l = Rtail l'.
Proof.
intros; rewrite H; reflexivity.
Qed.
Lemma RList_P22 :
- forall l1 l2:Rlist, l1 <> nil -> pos_Rl (cons_Rlist l1 l2) 0 = pos_Rl l1 0.
+ forall l1 l2:list R, l1 <> nil -> pos_Rl (app l1 l2) 0 = pos_Rl l1 0.
Proof.
simple induction l1; [ intros; elim H; reflexivity | intros; reflexivity ].
Qed.
-Lemma RList_P23 :
- forall l1 l2:Rlist,
- Rlength (cons_Rlist l1 l2) = (Rlength l1 + Rlength l2)%nat.
-Proof.
- simple induction l1;
- [ intro; reflexivity | intros; simpl; rewrite H; reflexivity ].
-Qed.
-
Lemma RList_P24 :
- forall l1 l2:Rlist,
+ forall l1 l2:list R,
l2 <> nil ->
- pos_Rl (cons_Rlist l1 l2) (pred (Rlength (cons_Rlist l1 l2))) =
- pos_Rl l2 (pred (Rlength l2)).
+ pos_Rl (app l1 l2) (pred (length (app l1 l2))) =
+ pos_Rl l2 (pred (length l2)).
Proof.
- simple induction l1.
+ induction l1 as [ | r r0 H].
intros; reflexivity.
intros; rewrite <- (H l2 H0); induction l2 as [| r1 l2 Hrecl2].
elim H0; reflexivity.
- do 2 rewrite RList_P23;
- replace (Rlength (cons r r0) + Rlength (cons r1 l2))%nat with
- (S (S (Rlength r0 + Rlength l2)));
- [ replace (Rlength r0 + Rlength (cons r1 l2))%nat with
- (S (Rlength r0 + Rlength l2));
+ do 2 rewrite app_length;
+ replace (length (r :: r0) + length (r1 :: l2))%nat with
+ (S (S (length r0 + length l2)));
+ [ replace (length r0 + length (r1 :: l2))%nat with
+ (S (length r0 + length l2));
[ reflexivity
| simpl; apply INR_eq; rewrite S_INR; do 2 rewrite plus_INR;
rewrite S_INR; ring ]
@@ -694,39 +670,39 @@ Proof.
Qed.
Lemma RList_P25 :
- forall l1 l2:Rlist,
+ forall l1 l2:list R,
ordered_Rlist l1 ->
ordered_Rlist l2 ->
- pos_Rl l1 (pred (Rlength l1)) <= pos_Rl l2 0 ->
- ordered_Rlist (cons_Rlist l1 l2).
+ pos_Rl l1 (pred (length l1)) <= pos_Rl l2 0 ->
+ ordered_Rlist (app l1 l2).
Proof.
- simple induction l1.
+ induction l1 as [ | r r0 H].
intros; simpl; assumption.
- simple induction r0.
+ induction r0 as [ | r1 r2 H0].
intros; simpl; simpl in H2; unfold ordered_Rlist; intros;
simpl in H3.
induction i as [| i Hreci].
simpl; assumption.
change (pos_Rl l2 i <= pos_Rl l2 (S i)); apply (H1 i); apply lt_S_n;
- replace (S (pred (Rlength l2))) with (Rlength l2);
+ replace (S (pred (length l2))) with (length l2);
[ assumption
| apply S_pred with 0%nat; apply neq_O_lt; red; intro;
rewrite <- H4 in H3; elim (lt_n_O _ H3) ].
- intros; clear H; assert (H : ordered_Rlist (cons_Rlist (cons r1 r2) l2)).
- apply H0; try assumption.
+ intros; assert (H4 : ordered_Rlist (app (r1 :: r2) l2)).
+ apply H; try assumption.
apply RList_P4 with r; assumption.
- unfold ordered_Rlist; intros; simpl in H4;
+ unfold ordered_Rlist; intros i H5; simpl in H5.
induction i as [| i Hreci].
simpl; apply (H1 0%nat); simpl; apply lt_O_Sn.
change
- (pos_Rl (cons_Rlist (cons r1 r2) l2) i <=
- pos_Rl (cons_Rlist (cons r1 r2) l2) (S i));
- apply (H i); simpl; apply lt_S_n; assumption.
+ (pos_Rl (app (r1 :: r2) l2) i <=
+ pos_Rl (app (r1 :: r2) l2) (S i));
+ apply (H4 i); simpl; apply lt_S_n; assumption.
Qed.
Lemma RList_P26 :
- forall (l1 l2:Rlist) (i:nat),
- (i < Rlength l1)%nat -> pos_Rl (cons_Rlist l1 l2) i = pos_Rl l1 i.
+ forall (l1 l2:list R) (i:nat),
+ (i < length l1)%nat -> pos_Rl (app l1 l2) i = pos_Rl l1 i.
Proof.
simple induction l1.
intros; elim (lt_n_O _ H).
@@ -735,49 +711,41 @@ Proof.
apply (H l2 i); simpl in H0; apply lt_S_n; assumption.
Qed.
-Lemma RList_P27 :
- forall l1 l2 l3:Rlist,
- cons_Rlist l1 (cons_Rlist l2 l3) = cons_Rlist (cons_Rlist l1 l2) l3.
-Proof.
- simple induction l1; intros;
- [ reflexivity | simpl; rewrite (H l2 l3); reflexivity ].
-Qed.
-
-Lemma RList_P28 : forall l:Rlist, cons_Rlist l nil = l.
-Proof.
- simple induction l;
- [ reflexivity | intros; simpl; rewrite H; reflexivity ].
-Qed.
-
Lemma RList_P29 :
- forall (l2 l1:Rlist) (i:nat),
- (Rlength l1 <= i)%nat ->
- (i < Rlength (cons_Rlist l1 l2))%nat ->
- pos_Rl (cons_Rlist l1 l2) i = pos_Rl l2 (i - Rlength l1).
+ forall (l2 l1:list R) (i:nat),
+ (length l1 <= i)%nat ->
+ (i < length (app l1 l2))%nat ->
+ pos_Rl (app l1 l2) i = pos_Rl l2 (i - length l1).
Proof.
- simple induction l2.
- intros; rewrite RList_P28 in H0; elim (lt_irrefl _ (le_lt_trans _ _ _ H H0)).
+ induction l2 as [ | r r0 H].
+ intros; rewrite app_nil_r in H0; elim (lt_irrefl _ (le_lt_trans _ _ _ H H0)).
intros;
- replace (cons_Rlist l1 (cons r r0)) with
- (cons_Rlist (cons_Rlist l1 (cons r nil)) r0).
+ replace (app l1 (r :: r0)) with
+ (app (app l1 (r :: nil)) r0).
inversion H0.
rewrite <- minus_n_n; simpl; rewrite RList_P26.
- clear l2 r0 H i H0 H1 H2; induction l1 as [| r0 l1 Hrecl1].
+ clear r0 H i H0 H1 H2; induction l1 as [| r0 l1 Hrecl1].
reflexivity.
simpl; assumption.
- rewrite RList_P23; rewrite plus_comm; simpl; apply lt_n_Sn.
- replace (S m - Rlength l1)%nat with (S (S m - S (Rlength l1))).
+ rewrite app_length; rewrite plus_comm; simpl; apply lt_n_Sn.
+ replace (S m - length l1)%nat with (S (S m - S (length l1))).
rewrite H3; simpl;
- replace (S (Rlength l1)) with (Rlength (cons_Rlist l1 (cons r nil))).
- apply (H (cons_Rlist l1 (cons r nil)) i).
- rewrite RList_P23; rewrite plus_comm; simpl; rewrite <- H3;
+ replace (S (length l1)) with (length (app l1 (r :: nil))).
+ apply (H (app l1 (r :: nil)) i).
+ rewrite app_length; rewrite plus_comm; simpl; rewrite <- H3;
apply le_n_S; assumption.
- repeat rewrite RList_P23; simpl; rewrite RList_P23 in H1;
- rewrite plus_comm in H1; simpl in H1; rewrite (plus_comm (Rlength l1));
+ repeat rewrite app_length; simpl; rewrite app_length in H1;
+ rewrite plus_comm in H1; simpl in H1; rewrite (plus_comm (length l1));
simpl; rewrite plus_comm; apply H1.
- rewrite RList_P23; rewrite plus_comm; reflexivity.
- change (S (m - Rlength l1) = (S m - Rlength l1)%nat);
+ rewrite app_length; rewrite plus_comm; reflexivity.
+ change (S (m - length l1) = (S m - length l1)%nat);
apply minus_Sn_m; assumption.
- replace (cons r r0) with (cons_Rlist (cons r nil) r0);
- [ symmetry ; apply RList_P27 | reflexivity ].
+ replace (r :: r0) with (app (r :: nil) r0);
+ [ symmetry ; apply app_assoc | reflexivity ].
Qed.
+
+#[deprecated(since="8.12",note="use List.cons instead")]
+Notation cons := List.cons.
+
+#[deprecated(since="8.12",note="use List.nil instead")]
+Notation nil := List.nil.
diff --git a/theories/Reals/RiemannInt.v b/theories/Reals/RiemannInt.v
index 0337b12cad..23094c6b93 100644
--- a/theories/Reals/RiemannInt.v
+++ b/theories/Reals/RiemannInt.v
@@ -464,7 +464,7 @@ Proof.
elim (Rlt_irrefl _ H7) ] ].
Qed.
-Fixpoint SubEquiN (N:nat) (x y:R) (del:posreal) : Rlist :=
+Fixpoint SubEquiN (N:nat) (x y:R) (del:posreal) : list R :=
match N with
| O => cons y nil
| S p => cons x (SubEquiN p (x + del) y del)
@@ -473,7 +473,7 @@ Fixpoint SubEquiN (N:nat) (x y:R) (del:posreal) : Rlist :=
Definition max_N (a b:R) (del:posreal) (h:a < b) : nat :=
let (N,_) := maxN del h in N.
-Definition SubEqui (a b:R) (del:posreal) (h:a < b) : Rlist :=
+Definition SubEqui (a b:R) (del:posreal) (h:a < b) : list R :=
SubEquiN (S (max_N del h)) a b del.
Lemma Heine_cor1 :
@@ -566,25 +566,25 @@ Qed.
Lemma SubEqui_P2 :
forall (a b:R) (del:posreal) (h:a < b),
- pos_Rl (SubEqui del h) (pred (Rlength (SubEqui del h))) = b.
+ pos_Rl (SubEqui del h) (pred (length (SubEqui del h))) = b.
Proof.
intros; unfold SubEqui; destruct (maxN del h)as (x,_).
cut
(forall (x:nat) (a:R) (del:posreal),
pos_Rl (SubEquiN (S x) a b del)
- (pred (Rlength (SubEquiN (S x) a b del))) = b);
+ (pred (length (SubEquiN (S x) a b del))) = b);
[ intro; apply H
| simple induction x0;
[ intros; reflexivity
| intros;
change
(pos_Rl (SubEquiN (S n) (a0 + del0) b del0)
- (pred (Rlength (SubEquiN (S n) (a0 + del0) b del0))) = b)
+ (pred (length (SubEquiN (S n) (a0 + del0) b del0))) = b)
; apply H ] ].
Qed.
Lemma SubEqui_P3 :
- forall (N:nat) (a b:R) (del:posreal), Rlength (SubEquiN N a b del) = S N.
+ forall (N:nat) (a b:R) (del:posreal), length (SubEquiN N a b del) = S N.
Proof.
simple induction N; intros;
[ reflexivity | simpl; rewrite H; reflexivity ].
@@ -605,7 +605,7 @@ Qed.
Lemma SubEqui_P5 :
forall (a b:R) (del:posreal) (h:a < b),
- Rlength (SubEqui del h) = S (S (max_N del h)).
+ length (SubEqui del h) = S (S (max_N del h)).
Proof.
intros; unfold SubEqui; apply SubEqui_P3.
Qed.
@@ -623,7 +623,7 @@ Proof.
intros; unfold ordered_Rlist; intros; rewrite SubEqui_P5 in H;
simpl in H; inversion H.
rewrite (SubEqui_P6 del h (i:=(max_N del h))).
- replace (S (max_N del h)) with (pred (Rlength (SubEqui del h))).
+ replace (S (max_N del h)) with (pred (length (SubEqui del h))).
rewrite SubEqui_P2; unfold max_N; case (maxN del h) as (?&?&?); left;
assumption.
rewrite SubEqui_P5; reflexivity.
@@ -639,7 +639,7 @@ Qed.
Lemma SubEqui_P8 :
forall (a b:R) (del:posreal) (h:a < b) (i:nat),
- (i < Rlength (SubEqui del h))%nat -> a <= pos_Rl (SubEqui del h) i <= b.
+ (i < length (SubEqui del h))%nat -> a <= pos_Rl (SubEqui del h) i <= b.
Proof.
intros; split.
pattern a at 1; rewrite <- (SubEqui_P1 del h); apply RList_P5.
@@ -657,7 +657,7 @@ Lemma SubEqui_P9 :
{ g:StepFun a b |
g b = f b /\
(forall i:nat,
- (i < pred (Rlength (SubEqui del h)))%nat ->
+ (i < pred (length (SubEqui del h)))%nat ->
constant_D_eq g
(co_interval (pos_Rl (SubEqui del h) i)
(pos_Rl (SubEqui del h) (S i)))
@@ -713,7 +713,7 @@ Proof.
a <= t <= b ->
t = b \/
(exists i : nat,
- (i < pred (Rlength (SubEqui del H)))%nat /\
+ (i < pred (length (SubEqui del H)))%nat /\
co_interval (pos_Rl (SubEqui del H) i) (pos_Rl (SubEqui del H) (S i))
t)).
intro; elim (H8 _ H7); intro.
@@ -722,7 +722,7 @@ Proof.
elim H9; clear H9; intros I [H9 H10]; assert (H11 := H6 I H9 t H10);
rewrite H11; left; apply H4.
assumption.
- apply SubEqui_P8; apply lt_trans with (pred (Rlength (SubEqui del H))).
+ apply SubEqui_P8; apply lt_trans with (pred (length (SubEqui del H))).
assumption.
apply lt_pred_n_n; apply neq_O_lt; red; intro; rewrite <- H12 in H9;
elim (lt_n_O _ H9).
@@ -734,7 +734,7 @@ Proof.
(t - pos_Rl (SubEqui del H) (max_N del H))) with t;
[ idtac | ring ]; apply Rlt_le_trans with b.
rewrite H14 in H12;
- assert (H13 : S (max_N del H) = pred (Rlength (SubEqui del H))).
+ assert (H13 : S (max_N del H) = pred (length (SubEqui del H))).
rewrite SubEqui_P5; reflexivity.
rewrite H13 in H12; rewrite SubEqui_P2 in H12; apply H12.
rewrite SubEqui_P6.
@@ -785,7 +785,7 @@ Proof.
apply H5.
assumption.
inversion H7.
- replace (S (max_N del H)) with (pred (Rlength (SubEqui del H))).
+ replace (S (max_N del H)) with (pred (length (SubEqui del H))).
rewrite (SubEqui_P2 del H); elim H8; intros.
elim H11; intro.
assumption.
@@ -1753,7 +1753,7 @@ Proof.
rewrite <- H5; elim (RList_P6 l); intros; apply H10.
assumption.
apply le_O_n.
- apply lt_trans with (pred (Rlength l)); [ assumption | apply lt_pred_n_n ].
+ apply lt_trans with (pred (length l)); [ assumption | apply lt_pred_n_n ].
apply neq_O_lt; intro; rewrite <- H12 in H6; discriminate.
unfold Rmin; decide (Rle_dec a b) with H; reflexivity.
assert (H11 : pos_Rl l (S i) <= b).
@@ -1960,7 +1960,7 @@ Proof.
replace b with (Rmin b c).
rewrite <- H5; elim (RList_P6 l1); intros; apply H10; try assumption.
apply le_O_n.
- apply lt_trans with (pred (Rlength l1)); try assumption; apply lt_pred_n_n;
+ apply lt_trans with (pred (length l1)); try assumption; apply lt_pred_n_n;
apply neq_O_lt; red; intro; rewrite <- H12 in H6;
discriminate.
unfold Rmin; decide (Rle_dec b c) with Hyp2;
@@ -1991,7 +1991,7 @@ Proof.
replace a with (Rmin a b).
rewrite <- H5; elim (RList_P6 l1); intros; apply H11; try assumption.
apply le_O_n.
- apply lt_trans with (pred (Rlength l1)); try assumption; apply lt_pred_n_n;
+ apply lt_trans with (pred (length l1)); try assumption; apply lt_pred_n_n;
apply neq_O_lt; red; intro; rewrite <- H13 in H6;
discriminate.
unfold Rmin; decide (Rle_dec a b) with Hyp1; reflexivity.
@@ -2018,7 +2018,7 @@ Proof.
replace a with (Rmin a b).
rewrite <- H5; elim (RList_P6 l1); intros; apply H11; try assumption.
apply le_O_n.
- apply lt_trans with (pred (Rlength l1)); try assumption; apply lt_pred_n_n;
+ apply lt_trans with (pred (length l1)); try assumption; apply lt_pred_n_n;
apply neq_O_lt; red; intro; rewrite <- H13 in H6;
discriminate.
unfold Rmin; decide (Rle_dec a b) with Hyp1; reflexivity.
@@ -2037,7 +2037,7 @@ Proof.
replace b with (Rmin b c).
rewrite <- H5; elim (RList_P6 l1); intros; apply H10; try assumption.
apply le_O_n.
- apply lt_trans with (pred (Rlength l1)); try assumption; apply lt_pred_n_n;
+ apply lt_trans with (pred (length l1)); try assumption; apply lt_pred_n_n;
apply neq_O_lt; red; intro; rewrite <- H12 in H6;
discriminate.
unfold Rmin; decide (Rle_dec b c) with Hyp2; reflexivity.
diff --git a/theories/Reals/RiemannInt_SF.v b/theories/Reals/RiemannInt_SF.v
index c8ec4782d9..65221c67d2 100644
--- a/theories/Reals/RiemannInt_SF.v
+++ b/theories/Reals/RiemannInt_SF.v
@@ -12,6 +12,7 @@ Require Import Rbase.
Require Import Rfunctions.
Require Import Ranalysis_reg.
Require Import Classical_Prop.
+Require Import List.
Require Import RList.
Local Open Scope R_scope.
@@ -114,41 +115,41 @@ Qed.
Definition open_interval (a b x:R) : Prop := a < x < b.
Definition co_interval (a b x:R) : Prop := a <= x < b.
-Definition adapted_couple (f:R -> R) (a b:R) (l lf:Rlist) : Prop :=
+Definition adapted_couple (f:R -> R) (a b:R) (l lf:list R) : Prop :=
ordered_Rlist l /\
pos_Rl l 0 = Rmin a b /\
- pos_Rl l (pred (Rlength l)) = Rmax a b /\
- Rlength l = S (Rlength lf) /\
+ pos_Rl l (pred (length l)) = Rmax a b /\
+ length l = S (length lf) /\
(forall i:nat,
- (i < pred (Rlength l))%nat ->
+ (i < pred (length l))%nat ->
constant_D_eq f (open_interval (pos_Rl l i) (pos_Rl l (S i)))
(pos_Rl lf i)).
-Definition adapted_couple_opt (f:R -> R) (a b:R) (l lf:Rlist) :=
+Definition adapted_couple_opt (f:R -> R) (a b:R) (l lf:list R) :=
adapted_couple f a b l lf /\
(forall i:nat,
- (i < pred (Rlength lf))%nat ->
+ (i < pred (length lf))%nat ->
pos_Rl lf i <> pos_Rl lf (S i) \/ f (pos_Rl l (S i)) <> pos_Rl lf i) /\
- (forall i:nat, (i < pred (Rlength l))%nat -> pos_Rl l i <> pos_Rl l (S i)).
+ (forall i:nat, (i < pred (length l))%nat -> pos_Rl l i <> pos_Rl l (S i)).
-Definition is_subdivision (f:R -> R) (a b:R) (l:Rlist) : Type :=
- { l0:Rlist & adapted_couple f a b l l0 }.
+Definition is_subdivision (f:R -> R) (a b:R) (l:list R) : Type :=
+ { l0:list R & adapted_couple f a b l l0 }.
Definition IsStepFun (f:R -> R) (a b:R) : Type :=
- { l:Rlist & is_subdivision f a b l }.
+ { l:list R & is_subdivision f a b l }.
(** ** Class of step functions *)
Record StepFun (a b:R) : Type := mkStepFun
{fe :> R -> R; pre : IsStepFun fe a b}.
-Definition subdivision (a b:R) (f:StepFun a b) : Rlist := projT1 (pre f).
+Definition subdivision (a b:R) (f:StepFun a b) : list R := projT1 (pre f).
-Definition subdivision_val (a b:R) (f:StepFun a b) : Rlist :=
+Definition subdivision_val (a b:R) (f:StepFun a b) : list R :=
match projT2 (pre f) with
| existT _ a b => a
end.
-Fixpoint Int_SF (l k:Rlist) : R :=
+Fixpoint Int_SF (l k:list R) : R :=
match l with
| nil => 0
| cons a l' =>
@@ -179,7 +180,7 @@ Proof.
Qed.
Lemma StepFun_P2 :
- forall (a b:R) (f:R -> R) (l lf:Rlist),
+ forall (a b:R) (f:R -> R) (l lf:list R),
adapted_couple f a b l lf -> adapted_couple f b a l lf.
Proof.
unfold adapted_couple; intros; decompose [and] H; clear H;
@@ -219,7 +220,7 @@ Proof.
Qed.
Lemma StepFun_P5 :
- forall (a b:R) (f:R -> R) (l:Rlist),
+ forall (a b:R) (f:R -> R) (l:list R),
is_subdivision f a b l -> is_subdivision f b a l.
Proof.
destruct 1 as (x,(H0,(H1,(H2,(H3,H4))))); exists x;
@@ -236,7 +237,7 @@ Proof.
Qed.
Lemma StepFun_P7 :
- forall (a b r1 r2 r3:R) (f:R -> R) (l lf:Rlist),
+ forall (a b r1 r2 r3:R) (f:R -> R) (l lf:list R),
a <= b ->
adapted_couple f a b (cons r1 (cons r2 l)) (cons r3 lf) ->
adapted_couple f r2 b (cons r2 l) lf.
@@ -257,31 +258,36 @@ Proof.
rewrite H4; reflexivity.
intros; unfold constant_D_eq, open_interval; intros;
unfold constant_D_eq, open_interval in H6;
- assert (H9 : (S i < pred (Rlength (cons r1 (cons r2 l))))%nat).
+ assert (H9 : (S i < pred (length (cons r1 (cons r2 l))))%nat).
simpl; simpl in H0; apply lt_n_S; assumption.
assert (H10 := H6 _ H9); apply H10; assumption.
Qed.
Lemma StepFun_P8 :
- forall (f:R -> R) (l1 lf1:Rlist) (a b:R),
+ forall (f:R -> R) (l1 lf1:list R) (a b:R),
adapted_couple f a b l1 lf1 -> a = b -> Int_SF lf1 l1 = 0.
Proof.
simple induction l1.
intros; induction lf1 as [| r lf1 Hreclf1]; reflexivity.
- simple induction r0.
+ intros r r0.
+ induction r0 as [ | r1 r2 H0].
intros; induction lf1 as [| r1 lf1 Hreclf1].
reflexivity.
unfold adapted_couple in H0; decompose [and] H0; clear H0; simpl in H5;
discriminate.
- intros; induction lf1 as [| r3 lf1 Hreclf1].
+ intros H.
+ induction lf1 as [| r3 lf1 Hreclf1]; intros a b H1 H2.
reflexivity.
simpl; cut (r = r1).
- intro; rewrite H3; rewrite (H0 lf1 r b).
+ intros H3.
+ rewrite H3; rewrite (H lf1 r b).
ring.
rewrite H3; apply StepFun_P7 with a r r3; [ right; assumption | assumption ].
- clear H H0 Hreclf1 r0; unfold adapted_couple in H1; decompose [and] H1;
+ clear H H0 Hreclf1; unfold adapted_couple in H1.
+ decompose [and] H1.
intros; simpl in H4; rewrite H4; unfold Rmin;
case (Rle_dec a b); intro; [ assumption | reflexivity ].
+
unfold adapted_couple in H1; decompose [and] H1; intros; apply Rle_antisym.
apply (H3 0%nat); simpl; apply lt_O_Sn.
simpl in H5; rewrite H2 in H5; rewrite H5; replace (Rmin b b) with (Rmax a b);
@@ -292,8 +298,8 @@ Proof.
Qed.
Lemma StepFun_P9 :
- forall (a b:R) (f:R -> R) (l lf:Rlist),
- adapted_couple f a b l lf -> a <> b -> (2 <= Rlength l)%nat.
+ forall (a b:R) (f:R -> R) (l lf:list R),
+ adapted_couple f a b l lf -> a <> b -> (2 <= length l)%nat.
Proof.
intros; unfold adapted_couple in H; decompose [and] H; clear H;
induction l as [| r l Hrecl];
@@ -307,13 +313,13 @@ Proof.
Qed.
Lemma StepFun_P10 :
- forall (f:R -> R) (l lf:Rlist) (a b:R),
+ forall (f:R -> R) (l lf:list R) (a b:R),
a <= b ->
adapted_couple f a b l lf ->
- exists l' : Rlist,
- (exists lf' : Rlist, adapted_couple_opt f a b l' lf').
+ exists l' : list R,
+ (exists lf' : list R, adapted_couple_opt f a b l' lf').
Proof.
- simple induction l.
+ induction l as [ | r r0 H].
intros; unfold adapted_couple in H0; decompose [and] H0; simpl in H4;
discriminate.
intros; case (Req_dec a b); intro.
@@ -503,7 +509,7 @@ Proof.
Qed.
Lemma StepFun_P11 :
- forall (a b r r1 r3 s1 s2 r4:R) (r2 lf1 s3 lf2:Rlist)
+ forall (a b r r1 r3 s1 s2 r4:R) (r2 lf1 s3 lf2:list R)
(f:R -> R),
a < b ->
adapted_couple f a b (cons r (cons r1 r2)) (cons r3 lf1) ->
@@ -627,7 +633,7 @@ Proof.
Qed.
Lemma StepFun_P12 :
- forall (a b:R) (f:R -> R) (l lf:Rlist),
+ forall (a b:R) (f:R -> R) (l lf:list R),
adapted_couple_opt f a b l lf -> adapted_couple_opt f b a l lf.
Proof.
unfold adapted_couple_opt; unfold adapted_couple; intros;
@@ -643,7 +649,7 @@ Proof.
Qed.
Lemma StepFun_P13 :
- forall (a b r r1 r3 s1 s2 r4:R) (r2 lf1 s3 lf2:Rlist)
+ forall (a b r r1 r3 s1 s2 r4:R) (r2 lf1 s3 lf2:list R)
(f:R -> R),
a <> b ->
adapted_couple f a b (cons r (cons r1 r2)) (cons r3 lf1) ->
@@ -657,15 +663,15 @@ Proof.
Qed.
Lemma StepFun_P14 :
- forall (f:R -> R) (l1 l2 lf1 lf2:Rlist) (a b:R),
+ forall (f:R -> R) (l1 l2 lf1 lf2:list R) (a b:R),
a <= b ->
adapted_couple f a b l1 lf1 ->
adapted_couple_opt f a b l2 lf2 -> Int_SF lf1 l1 = Int_SF lf2 l2.
Proof.
- simple induction l1.
+ induction l1 as [ | r r0 H0].
intros l2 lf1 lf2 a b Hyp H H0; unfold adapted_couple in H; decompose [and] H;
clear H H0 H2 H3 H1 H6; simpl in H4; discriminate.
- simple induction r0.
+ induction r0 as [|r1 r2 H].
intros; case (Req_dec a b); intro.
unfold adapted_couple_opt in H2; elim H2; intros; rewrite (StepFun_P8 H4 H3);
rewrite (StepFun_P8 H1 H3); reflexivity.
@@ -798,7 +804,7 @@ Proof.
rewrite H9;
change
(forall i:nat,
- (i < pred (Rlength (cons r4 lf2)))%nat ->
+ (i < pred (length (cons r4 lf2)))%nat ->
pos_Rl (cons r4 lf2) i <> pos_Rl (cons r4 lf2) (S i) \/
f (pos_Rl (cons s1 (cons s2 s3)) (S i)) <> pos_Rl (cons r4 lf2) i)
; rewrite <- H5; apply H3.
@@ -840,7 +846,7 @@ Proof.
rewrite <- H10; unfold open_interval; apply H2.
elim H3; clear H3; intros; split.
rewrite H5 in H3; intros; apply (H3 (S i)).
- simpl; replace (Rlength lf2) with (S (pred (Rlength lf2))).
+ simpl; replace (length lf2) with (S (pred (length lf2))).
apply lt_n_S; apply H12.
symmetry ; apply S_pred with 0%nat; apply neq_O_lt; red;
intro; rewrite <- H13 in H12; elim (lt_n_O _ H12).
@@ -863,7 +869,7 @@ Proof.
Qed.
Lemma StepFun_P15 :
- forall (f:R -> R) (l1 l2 lf1 lf2:Rlist) (a b:R),
+ forall (f:R -> R) (l1 l2 lf1 lf2:list R) (a b:R),
adapted_couple f a b l1 lf1 ->
adapted_couple_opt f a b l2 lf2 -> Int_SF lf1 l1 = Int_SF lf2 l2.
Proof.
@@ -876,10 +882,10 @@ Proof.
Qed.
Lemma StepFun_P16 :
- forall (f:R -> R) (l lf:Rlist) (a b:R),
+ forall (f:R -> R) (l lf:list R) (a b:R),
adapted_couple f a b l lf ->
- exists l' : Rlist,
- (exists lf' : Rlist, adapted_couple_opt f a b l' lf').
+ exists l' : list R,
+ (exists lf' : list R, adapted_couple_opt f a b l' lf').
Proof.
intros; destruct (Rle_dec a b) as [Hle|Hnle];
[ apply (StepFun_P10 Hle H)
@@ -891,7 +897,7 @@ Proof.
Qed.
Lemma StepFun_P17 :
- forall (f:R -> R) (l1 l2 lf1 lf2:Rlist) (a b:R),
+ forall (f:R -> R) (l1 l2 lf1 lf2:list R) (a b:R),
adapted_couple f a b l1 lf1 ->
adapted_couple f a b l2 lf2 -> Int_SF lf1 l1 = Int_SF lf2 l2.
Proof.
@@ -922,7 +928,7 @@ Proof.
Qed.
Lemma StepFun_P19 :
- forall (l1:Rlist) (f g:R -> R) (l:R),
+ forall (l1:list R) (f g:R -> R) (l:R),
Int_SF (FF l1 (fun x:R => f x + l * g x)) l1 =
Int_SF (FF l1 f) l1 + l * Int_SF (FF l1 g) l1.
Proof.
@@ -933,8 +939,8 @@ Proof.
Qed.
Lemma StepFun_P20 :
- forall (l:Rlist) (f:R -> R),
- (0 < Rlength l)%nat -> Rlength l = S (Rlength (FF l f)).
+ forall (l:list R) (f:R -> R),
+ (0 < length l)%nat -> length l = S (length (FF l f)).
Proof.
intros l f H; induction l;
[ elim (lt_irrefl _ H)
@@ -942,7 +948,7 @@ Proof.
Qed.
Lemma StepFun_P21 :
- forall (a b:R) (f:R -> R) (l:Rlist),
+ forall (a b:R) (f:R -> R) (l:list R),
is_subdivision f a b l -> adapted_couple f a b l (FF l f).
Proof.
intros * (x & H & H1 & H0 & H2 & H4).
@@ -979,7 +985,7 @@ Proof.
Qed.
Lemma StepFun_P22 :
- forall (a b:R) (f g:R -> R) (lf lg:Rlist),
+ forall (a b:R) (f g:R -> R) (lf lg:list R),
a <= b ->
is_subdivision f a b lf ->
is_subdivision g a b lg -> is_subdivision f a b (cons_ORlist lf lg).
@@ -1032,25 +1038,25 @@ Proof.
(H8 :
In
(pos_Rl (cons_ORlist (cons r lf) lg)
- (pred (Rlength (cons_ORlist (cons r lf) lg))))
+ (pred (length (cons_ORlist (cons r lf) lg))))
(cons_ORlist (cons r lf) lg)).
elim
(RList_P3 (cons_ORlist (cons r lf) lg)
(pos_Rl (cons_ORlist (cons r lf) lg)
- (pred (Rlength (cons_ORlist (cons r lf) lg)))));
+ (pred (length (cons_ORlist (cons r lf) lg)))));
intros _ H10; apply H10;
- exists (pred (Rlength (cons_ORlist (cons r lf) lg)));
+ exists (pred (length (cons_ORlist (cons r lf) lg)));
split; [ reflexivity | rewrite RList_P11; simpl; apply lt_n_Sn ].
elim
(RList_P9 (cons r lf) lg
(pos_Rl (cons_ORlist (cons r lf) lg)
- (pred (Rlength (cons_ORlist (cons r lf) lg)))));
+ (pred (length (cons_ORlist (cons r lf) lg)))));
intros H10 _.
assert (H11 := H10 H8); elim H11; intro.
elim
(RList_P3 (cons r lf)
(pos_Rl (cons_ORlist (cons r lf) lg)
- (pred (Rlength (cons_ORlist (cons r lf) lg)))));
+ (pred (length (cons_ORlist (cons r lf) lg)))));
intros H13 _; assert (H14 := H13 H12); elim H14; intros;
elim H15; clear H15; intros; rewrite H15; rewrite <- H5;
elim (RList_P6 (cons r lf)); intros; apply H17;
@@ -1060,10 +1066,10 @@ Proof.
elim
(RList_P3 lg
(pos_Rl (cons_ORlist (cons r lf) lg)
- (pred (Rlength (cons_ORlist (cons r lf) lg)))));
+ (pred (length (cons_ORlist (cons r lf) lg)))));
intros H13 _; assert (H14 := H13 H12); elim H14; intros;
elim H15; clear H15; intros.
- rewrite H15; assert (H17 : Rlength lg = S (pred (Rlength lg))).
+ rewrite H15; assert (H17 : length lg = S (pred (length lg))).
apply S_pred with 0%nat; apply neq_O_lt; red; intro;
rewrite <- H17 in H16; elim (lt_n_O _ H16).
rewrite <- H0; elim (RList_P6 lg); intros; apply H18;
@@ -1075,7 +1081,7 @@ Proof.
assert (H8 : In b (cons_ORlist (cons r lf) lg)).
elim (RList_P9 (cons r lf) lg b); intros; apply H10; left;
elim (RList_P3 (cons r lf) b); intros; apply H12;
- exists (pred (Rlength (cons r lf))); split;
+ exists (pred (length (cons r lf))); split;
[ symmetry ; assumption | simpl; apply lt_n_Sn ].
apply RList_P7; [ apply RList_P2; assumption | assumption ].
apply StepFun_P20; rewrite RList_P11; rewrite H2; rewrite H7; simpl;
@@ -1089,7 +1095,7 @@ Proof.
intros; elim H11; clear H11; intros; assert (H12 := H11);
assert
(Hyp_cons :
- exists r : R, (exists r0 : Rlist, cons_ORlist lf lg = cons r r0)).
+ exists r : R, (exists r0 : list R, cons_ORlist lf lg = cons r r0)).
apply RList_P19; red; intro; rewrite H13 in H8; elim (lt_n_O _ H8).
elim Hyp_cons; clear Hyp_cons; intros r [r0 Hyp_cons]; rewrite Hyp_cons;
unfold FF; rewrite RList_P12.
@@ -1128,7 +1134,7 @@ Proof.
elim (RList_P6 (cons_ORlist lf lg)); intros; apply H11.
apply RList_P2; assumption.
apply le_O_n.
- apply lt_trans with (pred (Rlength (cons_ORlist lf lg)));
+ apply lt_trans with (pred (length (cons_ORlist lf lg)));
[ assumption
| apply lt_pred_n_n; apply neq_O_lt; red; intro;
rewrite <- H13 in H8; elim (lt_n_O _ H8) ].
@@ -1147,9 +1153,9 @@ Proof.
set
(I :=
fun j:nat =>
- pos_Rl lf j <= pos_Rl (cons_ORlist lf lg) i /\ (j < Rlength lf)%nat);
+ pos_Rl lf j <= pos_Rl (cons_ORlist lf lg) i /\ (j < length lf)%nat);
assert (H12 : Nbound I).
- unfold Nbound; exists (Rlength lf); intros; unfold I in H12; elim H12;
+ unfold Nbound; exists (length lf); intros; unfold I in H12; elim H12;
intros; apply lt_le_weak; assumption.
assert (H13 : exists n : nat, I n).
exists 0%nat; unfold I; split.
@@ -1159,7 +1165,7 @@ Proof.
elim (RList_P6 (cons_ORlist lf lg)); intros; apply H13.
apply RList_P2; assumption.
apply le_O_n.
- apply lt_trans with (pred (Rlength (cons_ORlist lf lg))).
+ apply lt_trans with (pred (length (cons_ORlist lf lg))).
assumption.
apply lt_pred_n_n; apply neq_O_lt; red; intro; rewrite <- H15 in H8;
elim (lt_n_O _ H8).
@@ -1167,12 +1173,12 @@ Proof.
rewrite <- H6 in H11; rewrite <- H5 in H11; elim (Rlt_irrefl _ H11).
assert (H14 := Nzorn H13 H12); elim H14; clear H14; intros x0 H14;
exists (pos_Rl lf0 x0); unfold constant_D_eq, open_interval;
- intros; assert (H16 := H9 x0); assert (H17 : (x0 < pred (Rlength lf))%nat).
+ intros; assert (H16 := H9 x0); assert (H17 : (x0 < pred (length lf))%nat).
elim H14; clear H14; intros; unfold I in H14; elim H14; clear H14; intros;
- apply lt_S_n; replace (S (pred (Rlength lf))) with (Rlength lf).
+ apply lt_S_n; replace (S (pred (length lf))) with (length lf).
inversion H18.
2: apply lt_n_S; assumption.
- cut (x0 = pred (Rlength lf)).
+ cut (x0 = pred (length lf)).
intro; rewrite H19 in H14; rewrite H5 in H14;
cut (pos_Rl (cons_ORlist lf lg) i < b).
intro; elim (Rlt_irrefl _ (Rle_lt_trans _ _ _ H14 H21)).
@@ -1180,7 +1186,7 @@ Proof.
elim H10; intros; apply Rlt_trans with x; assumption.
rewrite <- H5;
apply Rle_trans with
- (pos_Rl (cons_ORlist lf lg) (pred (Rlength (cons_ORlist lf lg)))).
+ (pos_Rl (cons_ORlist lf lg) (pred (length (cons_ORlist lf lg)))).
elim (RList_P6 (cons_ORlist lf lg)); intros; apply H21.
apply RList_P2; assumption.
apply lt_n_Sm_le; apply lt_n_S; assumption.
@@ -1197,8 +1203,8 @@ Proof.
elim H14; clear H14; intros; split.
apply Rle_lt_trans with (pos_Rl (cons_ORlist lf lg) i); assumption.
apply Rlt_le_trans with (pos_Rl (cons_ORlist lf lg) (S i)); try assumption.
- assert (H22 : (S x0 < Rlength lf)%nat).
- replace (Rlength lf) with (S (pred (Rlength lf)));
+ assert (H22 : (S x0 < length lf)%nat).
+ replace (length lf) with (S (pred (length lf)));
[ apply lt_n_S; assumption
| symmetry ; apply S_pred with 0%nat; apply neq_O_lt; red;
intro; rewrite <- H22 in H21; elim (lt_n_O _ H21) ].
@@ -1216,7 +1222,7 @@ Proof.
Qed.
Lemma StepFun_P23 :
- forall (a b:R) (f g:R -> R) (lf lg:Rlist),
+ forall (a b:R) (f g:R -> R) (lf lg:list R),
is_subdivision f a b lf ->
is_subdivision g a b lg -> is_subdivision f a b (cons_ORlist lf lg).
Proof.
@@ -1229,7 +1235,7 @@ Proof.
Qed.
Lemma StepFun_P24 :
- forall (a b:R) (f g:R -> R) (lf lg:Rlist),
+ forall (a b:R) (f g:R -> R) (lf lg:list R),
a <= b ->
is_subdivision f a b lf ->
is_subdivision g a b lg -> is_subdivision g a b (cons_ORlist lf lg).
@@ -1282,24 +1288,24 @@ Proof.
(H8 :
In
(pos_Rl (cons_ORlist (cons r lf) lg)
- (pred (Rlength (cons_ORlist (cons r lf) lg))))
+ (pred (length (cons_ORlist (cons r lf) lg))))
(cons_ORlist (cons r lf) lg)).
elim
(RList_P3 (cons_ORlist (cons r lf) lg)
(pos_Rl (cons_ORlist (cons r lf) lg)
- (pred (Rlength (cons_ORlist (cons r lf) lg)))));
+ (pred (length (cons_ORlist (cons r lf) lg)))));
intros _ H10; apply H10;
- exists (pred (Rlength (cons_ORlist (cons r lf) lg)));
+ exists (pred (length (cons_ORlist (cons r lf) lg)));
split; [ reflexivity | rewrite RList_P11; simpl; apply lt_n_Sn ].
elim
(RList_P9 (cons r lf) lg
(pos_Rl (cons_ORlist (cons r lf) lg)
- (pred (Rlength (cons_ORlist (cons r lf) lg)))));
+ (pred (length (cons_ORlist (cons r lf) lg)))));
intros H10 _; assert (H11 := H10 H8); elim H11; intro.
elim
(RList_P3 (cons r lf)
(pos_Rl (cons_ORlist (cons r lf) lg)
- (pred (Rlength (cons_ORlist (cons r lf) lg)))));
+ (pred (length (cons_ORlist (cons r lf) lg)))));
intros H13 _; assert (H14 := H13 H12); elim H14; intros;
elim H15; clear H15; intros; rewrite H15; rewrite <- H5;
elim (RList_P6 (cons r lf)); intros; apply H17;
@@ -1309,10 +1315,10 @@ Proof.
elim
(RList_P3 lg
(pos_Rl (cons_ORlist (cons r lf) lg)
- (pred (Rlength (cons_ORlist (cons r lf) lg)))));
+ (pred (length (cons_ORlist (cons r lf) lg)))));
intros H13 _; assert (H14 := H13 H12); elim H14; intros;
elim H15; clear H15; intros; rewrite H15;
- assert (H17 : Rlength lg = S (pred (Rlength lg))).
+ assert (H17 : length lg = S (pred (length lg))).
apply S_pred with 0%nat; apply neq_O_lt; red; intro;
rewrite <- H17 in H16; elim (lt_n_O _ H16).
rewrite <- H0; elim (RList_P6 lg); intros; apply H18;
@@ -1324,7 +1330,7 @@ Proof.
assert (H8 : In b (cons_ORlist (cons r lf) lg)).
elim (RList_P9 (cons r lf) lg b); intros; apply H10; left;
elim (RList_P3 (cons r lf) b); intros; apply H12;
- exists (pred (Rlength (cons r lf))); split;
+ exists (pred (length (cons r lf))); split;
[ symmetry ; assumption | simpl; apply lt_n_Sn ].
apply RList_P7; [ apply RList_P2; assumption | assumption ].
apply StepFun_P20; rewrite RList_P11; rewrite H7; rewrite H2; simpl;
@@ -1338,7 +1344,7 @@ Proof.
intros; elim H11; clear H11; intros; assert (H12 := H11);
assert
(Hyp_cons :
- exists r : R, (exists r0 : Rlist, cons_ORlist lf lg = cons r r0)).
+ exists r : R, (exists r0 : list R, cons_ORlist lf lg = cons r r0)).
apply RList_P19; red; intro; rewrite H13 in H8; elim (lt_n_O _ H8).
elim Hyp_cons; clear Hyp_cons; intros r [r0 Hyp_cons]; rewrite Hyp_cons;
unfold FF; rewrite RList_P12.
@@ -1377,7 +1383,7 @@ Proof.
elim (RList_P6 (cons_ORlist lf lg)); intros; apply H11.
apply RList_P2; assumption.
apply le_O_n.
- apply lt_trans with (pred (Rlength (cons_ORlist lf lg)));
+ apply lt_trans with (pred (length (cons_ORlist lf lg)));
[ assumption
| apply lt_pred_n_n; apply neq_O_lt; red; intro;
rewrite <- H13 in H8; elim (lt_n_O _ H8) ].
@@ -1394,9 +1400,9 @@ Proof.
set
(I :=
fun j:nat =>
- pos_Rl lg j <= pos_Rl (cons_ORlist lf lg) i /\ (j < Rlength lg)%nat);
+ pos_Rl lg j <= pos_Rl (cons_ORlist lf lg) i /\ (j < length lg)%nat);
assert (H12 : Nbound I).
- unfold Nbound; exists (Rlength lg); intros; unfold I in H12; elim H12;
+ unfold Nbound; exists (length lg); intros; unfold I in H12; elim H12;
intros; apply lt_le_weak; assumption.
assert (H13 : exists n : nat, I n).
exists 0%nat; unfold I; split.
@@ -1406,7 +1412,7 @@ Proof.
elim (RList_P6 (cons_ORlist lf lg)); intros; apply H13;
[ apply RList_P2; assumption
| apply le_O_n
- | apply lt_trans with (pred (Rlength (cons_ORlist lf lg)));
+ | apply lt_trans with (pred (length (cons_ORlist lf lg)));
[ assumption
| apply lt_pred_n_n; apply neq_O_lt; red; intro;
rewrite <- H15 in H8; elim (lt_n_O _ H8) ] ].
@@ -1414,12 +1420,12 @@ Proof.
rewrite <- H1 in H11; rewrite <- H0 in H11; elim (Rlt_irrefl _ H11).
assert (H14 := Nzorn H13 H12); elim H14; clear H14; intros x0 H14;
exists (pos_Rl lg0 x0); unfold constant_D_eq, open_interval;
- intros; assert (H16 := H4 x0); assert (H17 : (x0 < pred (Rlength lg))%nat).
+ intros; assert (H16 := H4 x0); assert (H17 : (x0 < pred (length lg))%nat).
elim H14; clear H14; intros; unfold I in H14; elim H14; clear H14; intros;
- apply lt_S_n; replace (S (pred (Rlength lg))) with (Rlength lg).
+ apply lt_S_n; replace (S (pred (length lg))) with (length lg).
inversion H18.
2: apply lt_n_S; assumption.
- cut (x0 = pred (Rlength lg)).
+ cut (x0 = pred (length lg)).
intro; rewrite H19 in H14; rewrite H0 in H14;
cut (pos_Rl (cons_ORlist lf lg) i < b).
intro; elim (Rlt_irrefl _ (Rle_lt_trans _ _ _ H14 H21)).
@@ -1427,7 +1433,7 @@ Proof.
elim H10; intros; apply Rlt_trans with x; assumption.
rewrite <- H0;
apply Rle_trans with
- (pos_Rl (cons_ORlist lf lg) (pred (Rlength (cons_ORlist lf lg)))).
+ (pos_Rl (cons_ORlist lf lg) (pred (length (cons_ORlist lf lg)))).
elim (RList_P6 (cons_ORlist lf lg)); intros; apply H21.
apply RList_P2; assumption.
apply lt_n_Sm_le; apply lt_n_S; assumption.
@@ -1445,8 +1451,8 @@ Proof.
elim H14; clear H14; intros; split.
apply Rle_lt_trans with (pos_Rl (cons_ORlist lf lg) i); assumption.
apply Rlt_le_trans with (pos_Rl (cons_ORlist lf lg) (S i)); try assumption.
- assert (H22 : (S x0 < Rlength lg)%nat).
- replace (Rlength lg) with (S (pred (Rlength lg))).
+ assert (H22 : (S x0 < length lg)%nat).
+ replace (length lg) with (S (pred (length lg))).
apply lt_n_S; assumption.
symmetry ; apply S_pred with 0%nat; apply neq_O_lt; red;
intro; rewrite <- H22 in H21; elim (lt_n_O _ H21).
@@ -1463,7 +1469,7 @@ Proof.
Qed.
Lemma StepFun_P25 :
- forall (a b:R) (f g:R -> R) (lf lg:Rlist),
+ forall (a b:R) (f g:R -> R) (lf lg:list R),
is_subdivision f a b lf ->
is_subdivision g a b lg -> is_subdivision g a b (cons_ORlist lf lg).
Proof.
@@ -1476,7 +1482,7 @@ Proof.
Qed.
Lemma StepFun_P26 :
- forall (a b l:R) (f g:R -> R) (l1:Rlist),
+ forall (a b l:R) (f g:R -> R) (l1:list R),
is_subdivision f a b l1 ->
is_subdivision g a b l1 ->
is_subdivision (fun x:R => f x + l * g x) a b l1.
@@ -1494,7 +1500,7 @@ Proof.
change
(pos_Rl x0 i + l * pos_Rl x i =
pos_Rl
- (app_Rlist (mid_Rlist (cons r r0) r) (fun x2:R => f x2 + l * g x2))
+ (map (fun x2:R => f x2 + l * g x2) (mid_Rlist (cons r r0) r))
(S i)); rewrite RList_P12.
rewrite RList_P13.
rewrite <- H12; rewrite (H9 _ H8); try rewrite (H4 _ H8);
@@ -1521,7 +1527,7 @@ Proof.
Qed.
Lemma StepFun_P27 :
- forall (a b l:R) (f g:R -> R) (lf lg:Rlist),
+ forall (a b l:R) (f g:R -> R) (lf lg:list R),
is_subdivision f a b lf ->
is_subdivision g a b lg ->
is_subdivision (fun x:R => f x + l * g x) a b (cons_ORlist lf lg).
@@ -1586,9 +1592,9 @@ Proof.
Qed.
Lemma StepFun_P31 :
- forall (a b:R) (f:R -> R) (l lf:Rlist),
+ forall (a b:R) (f:R -> R) (l lf:list R),
adapted_couple f a b l lf ->
- adapted_couple (fun x:R => Rabs (f x)) a b l (app_Rlist lf Rabs).
+ adapted_couple (fun x:R => Rabs (f x)) a b l (map Rabs lf).
Proof.
unfold adapted_couple; intros; decompose [and] H; clear H;
repeat split; try assumption.
@@ -1604,15 +1610,15 @@ Lemma StepFun_P32 :
Proof.
intros a b f; unfold IsStepFun; apply existT with (subdivision f);
unfold is_subdivision;
- apply existT with (app_Rlist (subdivision_val f) Rabs);
+ apply existT with (map Rabs (subdivision_val f));
apply StepFun_P31; apply StepFun_P1.
Qed.
Lemma StepFun_P33 :
- forall l2 l1:Rlist,
- ordered_Rlist l1 -> Rabs (Int_SF l2 l1) <= Int_SF (app_Rlist l2 Rabs) l1.
+ forall l2 l1:list R,
+ ordered_Rlist l1 -> Rabs (Int_SF l2 l1) <= Int_SF (map Rabs l2) l1.
Proof.
- simple induction l2; intros.
+ induction l2 as [ | r r0 H]; intros.
simpl; rewrite Rabs_R0; right; reflexivity.
simpl; induction l1 as [| r1 l1 Hrecl1].
rewrite Rabs_R0; right; reflexivity.
@@ -1635,7 +1641,7 @@ Proof.
replace
(Int_SF (subdivision_val (mkStepFun (StepFun_P32 f)))
(subdivision (mkStepFun (StepFun_P32 f)))) with
- (Int_SF (app_Rlist (subdivision_val f) Rabs) (subdivision f)).
+ (Int_SF (map Rabs (subdivision_val f)) (subdivision f)).
apply StepFun_P33; assert (H0 := StepFun_P29 f); unfold is_subdivision in H0;
elim H0; intros; unfold adapted_couple in p; decompose [and] p;
assumption.
@@ -1645,14 +1651,14 @@ Proof.
Qed.
Lemma StepFun_P35 :
- forall (l:Rlist) (a b:R) (f g:R -> R),
+ forall (l:list R) (a b:R) (f g:R -> R),
ordered_Rlist l ->
pos_Rl l 0 = a ->
- pos_Rl l (pred (Rlength l)) = b ->
+ pos_Rl l (pred (length l)) = b ->
(forall x:R, a < x < b -> f x <= g x) ->
Int_SF (FF l f) l <= Int_SF (FF l g) l.
Proof.
- simple induction l; intros.
+ induction l as [ | r r0 H]; intros.
right; reflexivity.
simpl; induction r0 as [| r0 r1 Hrecr0].
right; reflexivity.
@@ -1682,7 +1688,7 @@ Proof.
rewrite <- Rinv_r_sym.
rewrite Rmult_1_l; rewrite double; assert (H5 : r0 <= b).
replace b with
- (pos_Rl (cons r (cons r0 r1)) (pred (Rlength (cons r (cons r0 r1))))).
+ (pos_Rl (cons r (cons r0 r1)) (pred (length (cons r (cons r0 r1))))).
replace r0 with (pos_Rl (cons r (cons r0 r1)) 1).
elim (RList_P6 (cons r (cons r0 r1))); intros; apply H5.
assumption.
@@ -1712,7 +1718,7 @@ Proof.
Qed.
Lemma StepFun_P36 :
- forall (a b:R) (f g:StepFun a b) (l:Rlist),
+ forall (a b:R) (f g:StepFun a b) (l:list R),
a <= b ->
is_subdivision f a b l ->
is_subdivision g a b l ->
@@ -1748,18 +1754,18 @@ Proof.
Qed.
Lemma StepFun_P38 :
- forall (l:Rlist) (a b:R) (f:R -> R),
+ forall (l:list R) (a b:R) (f:R -> R),
ordered_Rlist l ->
pos_Rl l 0 = a ->
- pos_Rl l (pred (Rlength l)) = b ->
+ pos_Rl l (pred (length l)) = b ->
{ g:StepFun a b |
g b = f b /\
(forall i:nat,
- (i < pred (Rlength l))%nat ->
+ (i < pred (length l))%nat ->
constant_D_eq g (co_interval (pos_Rl l i) (pos_Rl l (S i)))
(f (pos_Rl l i))) }.
Proof.
- intros l a b f; generalize a; clear a; induction l.
+ intros l a b f; generalize a; clear a; induction l as [|r l IHl].
intros a H H0 H1; simpl in H0; simpl in H1;
exists (mkStepFun (StepFun_P4 a b (f b))); split.
reflexivity.
@@ -1772,7 +1778,7 @@ Proof.
apply RList_P4 with r; assumption.
assert (H3 : pos_Rl (cons r1 l) 0 = r1).
reflexivity.
- assert (H4 : pos_Rl (cons r1 l) (pred (Rlength (cons r1 l))) = b).
+ assert (H4 : pos_Rl (cons r1 l) (pred (length (cons r1 l))) = b).
rewrite <- H1; reflexivity.
elim (IHl r1 H2 H3 H4); intros g [H5 H6].
set
@@ -1796,7 +1802,7 @@ Proof.
simpl in H0; rewrite <- H0; apply (H 0%nat); simpl; apply lt_O_Sn.
unfold Rmin; decide (Rle_dec r1 b) with H7; reflexivity.
apply (H10 i); apply lt_S_n.
- replace (S (pred (Rlength lg))) with (Rlength lg).
+ replace (S (pred (length lg))) with (length lg).
apply H9.
apply S_pred with 0%nat; apply neq_O_lt; intro; rewrite <- H14 in H9;
elim (lt_n_O _ H9).
@@ -1825,9 +1831,9 @@ Proof.
change
(constant_D_eq g' (open_interval (pos_Rl lg i) (pos_Rl lg (S i)))
(pos_Rl lg2 i)); clear Hreci; assert (H16 := H15 i);
- assert (H17 : (i < pred (Rlength lg))%nat).
+ assert (H17 : (i < pred (length lg))%nat).
apply lt_S_n.
- replace (S (pred (Rlength lg))) with (Rlength lg).
+ replace (S (pred (length lg))) with (length lg).
assumption.
apply S_pred with 0%nat; apply neq_O_lt; red; intro;
rewrite <- H14 in H9; elim (lt_n_O _ H9).
@@ -1843,7 +1849,7 @@ Proof.
assumption.
elim (RList_P3 lg (pos_Rl lg i)); intros; apply H21; exists i; split.
reflexivity.
- apply lt_trans with (pred (Rlength lg)); try assumption.
+ apply lt_trans with (pred (length lg)); try assumption.
apply lt_pred_n_n; apply neq_O_lt; red; intro; rewrite <- H22 in H17;
elim (lt_n_O _ H17).
unfold Rmin; decide (Rle_dec r1 b) with H7; reflexivity.
@@ -1860,7 +1866,7 @@ Proof.
(constant_D_eq (mkStepFun H8)
(co_interval (pos_Rl (cons r1 l) i) (pos_Rl (cons r1 l) (S i)))
(f (pos_Rl (cons r1 l) i))); assert (H10 := H6 i);
- assert (H11 : (i < pred (Rlength (cons r1 l)))%nat).
+ assert (H11 : (i < pred (length (cons r1 l)))%nat).
simpl; apply lt_S_n; assumption.
assert (H12 := H10 H11); unfold constant_D_eq, co_interval in H12;
unfold constant_D_eq, co_interval; intros;
@@ -1873,7 +1879,7 @@ Proof.
elim (RList_P6 (cons r1 l)); intros; apply H15;
[ assumption
| apply le_O_n
- | simpl; apply lt_trans with (Rlength l);
+ | simpl; apply lt_trans with (length l);
[ apply lt_S_n; assumption | apply lt_n_Sn ] ].
Qed.
@@ -1912,12 +1918,12 @@ Proof.
Qed.
Lemma StepFun_P40 :
- forall (f:R -> R) (a b c:R) (l1 l2 lf1 lf2:Rlist),
+ forall (f:R -> R) (a b c:R) (l1 l2 lf1 lf2:list R),
a < b ->
b < c ->
adapted_couple f a b l1 lf1 ->
adapted_couple f b c l2 lf2 ->
- adapted_couple f a c (cons_Rlist l1 l2) (FF (cons_Rlist l1 l2) f).
+ adapted_couple f a c (app l1 l2) (FF (app l1 l2) f).
Proof.
intros f a b c l1 l2 lf1 lf2 H H0 H1 H2; unfold adapted_couple in H1, H2;
unfold adapted_couple; decompose [and] H1;
@@ -1941,28 +1947,28 @@ Proof.
| left; assumption ].
red; intro; rewrite H1 in H11; discriminate.
apply StepFun_P20.
- rewrite RList_P23; apply neq_O_lt; red; intro.
- assert (H2 : (Rlength l1 + Rlength l2)%nat = 0%nat).
+ rewrite app_length; apply neq_O_lt; red; intro.
+ assert (H2 : (length l1 + length l2)%nat = 0%nat).
symmetry ; apply H1.
elim (plus_is_O _ _ H2); intros; rewrite H12 in H6; discriminate.
unfold constant_D_eq, open_interval; intros;
- elim (le_or_lt (S (S i)) (Rlength l1)); intro.
- assert (H14 : pos_Rl (cons_Rlist l1 l2) i = pos_Rl l1 i).
+ elim (le_or_lt (S (S i)) (length l1)); intro.
+ assert (H14 : pos_Rl (app l1 l2) i = pos_Rl l1 i).
apply RList_P26; apply lt_S_n; apply le_lt_n_Sm; apply le_S_n;
- apply le_trans with (Rlength l1); [ assumption | apply le_n_Sn ].
- assert (H15 : pos_Rl (cons_Rlist l1 l2) (S i) = pos_Rl l1 (S i)).
+ apply le_trans with (length l1); [ assumption | apply le_n_Sn ].
+ assert (H15 : pos_Rl (app l1 l2) (S i) = pos_Rl l1 (S i)).
apply RList_P26; apply lt_S_n; apply le_lt_n_Sm; assumption.
- rewrite H14 in H2; rewrite H15 in H2; assert (H16 : (2 <= Rlength l1)%nat).
+ rewrite H14 in H2; rewrite H15 in H2; assert (H16 : (2 <= length l1)%nat).
apply le_trans with (S (S i));
[ repeat apply le_n_S; apply le_O_n | assumption ].
elim (RList_P20 _ H16); intros r1 [r2 [r3 H17]]; rewrite H17;
change
- (f x = pos_Rl (app_Rlist (mid_Rlist (cons_Rlist (cons r2 r3) l2) r1) f) i)
+ (f x = pos_Rl (map f (mid_Rlist (app (cons r2 r3) l2) r1)) i)
; rewrite RList_P12.
induction i as [| i Hreci].
simpl; assert (H18 := H8 0%nat);
unfold constant_D_eq, open_interval in H18;
- assert (H19 : (0 < pred (Rlength l1))%nat).
+ assert (H19 : (0 < pred (length l1))%nat).
rewrite H17; simpl; apply lt_O_Sn.
assert (H20 := H18 H19); repeat rewrite H20.
reflexivity.
@@ -1991,14 +1997,14 @@ Proof.
clear Hreci; rewrite RList_P13.
rewrite H17 in H14; rewrite H17 in H15;
change
- (pos_Rl (cons_Rlist (cons r2 r3) l2) i =
+ (pos_Rl (app (cons r2 r3) l2) i =
pos_Rl (cons r1 (cons r2 r3)) (S i)) in H14; rewrite H14;
change
- (pos_Rl (cons_Rlist (cons r2 r3) l2) (S i) =
+ (pos_Rl (app (cons r2 r3) l2) (S i) =
pos_Rl (cons r1 (cons r2 r3)) (S (S i))) in H15;
rewrite H15; assert (H18 := H8 (S i));
unfold constant_D_eq, open_interval in H18;
- assert (H19 : (S i < pred (Rlength l1))%nat).
+ assert (H19 : (S i < pred (length l1))%nat).
apply lt_pred; apply lt_S_n; apply le_lt_n_Sm; assumption.
assert (H20 := H18 H19); repeat rewrite H20.
reflexivity.
@@ -2025,7 +2031,7 @@ Proof.
simpl; rewrite H17 in H1; simpl in H1; apply lt_S_n; assumption.
rewrite RList_P14; rewrite H17 in H1; simpl in H1; apply H1.
inversion H12.
- assert (H16 : pos_Rl (cons_Rlist l1 l2) (S i) = b).
+ assert (H16 : pos_Rl (app l1 l2) (S i) = b).
rewrite RList_P29.
rewrite H15; rewrite <- minus_n_n; rewrite H10; unfold Rmin;
case (Rle_dec b c) as [|[]]; [ reflexivity | left; assumption ].
@@ -2033,30 +2039,30 @@ Proof.
induction l1 as [| r l1 Hrecl1].
simpl in H15; discriminate.
clear Hrecl1; simpl in H1; simpl; apply lt_n_S; assumption.
- assert (H17 : pos_Rl (cons_Rlist l1 l2) i = b).
+ assert (H17 : pos_Rl (app l1 l2) i = b).
rewrite RList_P26.
- replace i with (pred (Rlength l1));
+ replace i with (pred (length l1));
[ rewrite H4; unfold Rmax; case (Rle_dec a b) as [|[]];
[ reflexivity | left; assumption ]
| rewrite H15; reflexivity ].
rewrite H15; apply lt_n_Sn.
rewrite H16 in H2; rewrite H17 in H2; elim H2; intros;
elim (Rlt_irrefl _ (Rlt_trans _ _ _ H14 H18)).
- assert (H16 : pos_Rl (cons_Rlist l1 l2) i = pos_Rl l2 (i - Rlength l1)).
+ assert (H16 : pos_Rl (app l1 l2) i = pos_Rl l2 (i - length l1)).
apply RList_P29.
apply le_S_n; assumption.
- apply lt_le_trans with (pred (Rlength (cons_Rlist l1 l2)));
+ apply lt_le_trans with (pred (length (app l1 l2)));
[ assumption | apply le_pred_n ].
assert
- (H17 : pos_Rl (cons_Rlist l1 l2) (S i) = pos_Rl l2 (S (i - Rlength l1))).
- replace (S (i - Rlength l1)) with (S i - Rlength l1)%nat.
+ (H17 : pos_Rl (app l1 l2) (S i) = pos_Rl l2 (S (i - length l1))).
+ replace (S (i - length l1)) with (S i - length l1)%nat.
apply RList_P29.
apply le_S_n; apply le_trans with (S i); [ assumption | apply le_n_Sn ].
induction l1 as [| r l1 Hrecl1].
simpl in H6; discriminate.
clear Hrecl1; simpl in H1; simpl; apply lt_n_S; assumption.
symmetry ; apply minus_Sn_m; apply le_S_n; assumption.
- assert (H18 : (2 <= Rlength l1)%nat).
+ assert (H18 : (2 <= length l1)%nat).
clear f c l2 lf2 H0 H3 H8 H7 H10 H9 H11 H13 i H1 x H2 H12 m H14 H15 H16 H17;
induction l1 as [| r l1 Hrecl1].
discriminate.
@@ -2068,7 +2074,7 @@ Proof.
clear Hrecl1; simpl; repeat apply le_n_S; apply le_O_n.
elim (RList_P20 _ H18); intros r1 [r2 [r3 H19]]; rewrite H19;
change
- (f x = pos_Rl (app_Rlist (mid_Rlist (cons_Rlist (cons r2 r3) l2) r1) f) i)
+ (f x = pos_Rl (map f (mid_Rlist (app (cons r2 r3) l2) r1)) i)
; rewrite RList_P12.
induction i as [| i Hreci].
assert (H20 := le_S_n _ _ H15); assert (H21 := le_trans _ _ _ H18 H20);
@@ -2076,31 +2082,31 @@ Proof.
clear Hreci; rewrite RList_P13.
rewrite H19 in H16; rewrite H19 in H17;
change
- (pos_Rl (cons_Rlist (cons r2 r3) l2) i =
- pos_Rl l2 (S i - Rlength (cons r1 (cons r2 r3))))
+ (pos_Rl (app (cons r2 r3) l2) i =
+ pos_Rl l2 (S i - length (cons r1 (cons r2 r3))))
in H16; rewrite H16;
change
- (pos_Rl (cons_Rlist (cons r2 r3) l2) (S i) =
- pos_Rl l2 (S (S i - Rlength (cons r1 (cons r2 r3)))))
- in H17; rewrite H17; assert (H20 := H13 (S i - Rlength l1)%nat);
+ (pos_Rl (app (cons r2 r3) l2) (S i) =
+ pos_Rl l2 (S (S i - length (cons r1 (cons r2 r3)))))
+ in H17; rewrite H17; assert (H20 := H13 (S i - length l1)%nat);
unfold constant_D_eq, open_interval in H20;
- assert (H21 : (S i - Rlength l1 < pred (Rlength l2))%nat).
+ assert (H21 : (S i - length l1 < pred (length l2))%nat).
apply lt_pred; rewrite minus_Sn_m.
- apply plus_lt_reg_l with (Rlength l1); rewrite <- le_plus_minus.
+ apply plus_lt_reg_l with (length l1); rewrite <- le_plus_minus.
rewrite H19 in H1; simpl in H1; rewrite H19; simpl;
- rewrite RList_P23 in H1; apply lt_n_S; assumption.
+ rewrite app_length in H1; apply lt_n_S; assumption.
apply le_trans with (S i); [ apply le_S_n; assumption | apply le_n_Sn ].
apply le_S_n; assumption.
assert (H22 := H20 H21); repeat rewrite H22.
reflexivity.
rewrite <- H19;
assert
- (H23 : pos_Rl l2 (S i - Rlength l1) <= pos_Rl l2 (S (S i - Rlength l1))).
+ (H23 : pos_Rl l2 (S i - length l1) <= pos_Rl l2 (S (S i - length l1))).
apply H7; apply lt_pred.
rewrite minus_Sn_m.
- apply plus_lt_reg_l with (Rlength l1); rewrite <- le_plus_minus.
+ apply plus_lt_reg_l with (length l1); rewrite <- le_plus_minus.
rewrite H19 in H1; simpl in H1; rewrite H19; simpl;
- rewrite RList_P23 in H1; apply lt_n_S; assumption.
+ rewrite app_length in H1; apply lt_n_S; assumption.
apply le_trans with (S i); [ apply le_S_n; assumption | apply le_n_Sn ].
apply le_S_n; assumption.
elim H23; intro.
@@ -2115,7 +2121,7 @@ Proof.
[ prove_sup0
| unfold Rdiv; rewrite <- (Rmult_comm (/ 2)); rewrite <- Rmult_assoc;
rewrite <- Rinv_r_sym;
- [ rewrite Rmult_1_l; rewrite (Rplus_comm (pos_Rl l2 (S i - Rlength l1)));
+ [ rewrite Rmult_1_l; rewrite (Rplus_comm (pos_Rl l2 (S i - length l1)));
rewrite double; apply Rplus_lt_compat_l; assumption
| discrR ] ].
rewrite <- H19 in H16; rewrite <- H19 in H17; elim H2; intros;
@@ -2123,11 +2129,11 @@ Proof.
simpl in H16; rewrite H16 in H25; simpl in H26; simpl in H17;
rewrite H17 in H26; simpl in H24; rewrite H24 in H25;
elim (Rlt_irrefl _ (Rlt_trans _ _ _ H25 H26)).
- assert (H23 : pos_Rl (cons_Rlist l1 l2) (S i) = pos_Rl l2 (S i - Rlength l1)).
+ assert (H23 : pos_Rl (app l1 l2) (S i) = pos_Rl l2 (S i - length l1)).
rewrite H19; simpl; simpl in H16; apply H16.
assert
(H24 :
- pos_Rl (cons_Rlist l1 l2) (S (S i)) = pos_Rl l2 (S (S i - Rlength l1))).
+ pos_Rl (app l1 l2) (S (S i)) = pos_Rl l2 (S (S i - length l1))).
rewrite H19; simpl; simpl in H17; apply H17.
rewrite <- H23; rewrite <- H24; assumption.
simpl; rewrite H19 in H1; simpl in H1; apply lt_S_n; assumption.
@@ -2141,7 +2147,7 @@ Proof.
intros f a b c H H0 (l1,(lf1,H1)) (l2,(lf2,H2));
destruct (total_order_T a b) as [[Hltab|Hab]|Hgtab].
destruct (total_order_T b c) as [[Hltbc|Hbc]|Hgtbc].
- exists (cons_Rlist l1 l2); exists (FF (cons_Rlist l1 l2) f);
+ exists (app l1 l2); exists (FF (app l1 l2) f);
apply StepFun_P40 with b lf1 lf2; assumption.
exists l1; exists lf1; rewrite Hbc in H1; assumption.
elim (Rlt_irrefl _ (Rle_lt_trans _ _ _ H0 Hgtbc)).
@@ -2150,9 +2156,9 @@ Proof.
Qed.
Lemma StepFun_P42 :
- forall (l1 l2:Rlist) (f:R -> R),
- pos_Rl l1 (pred (Rlength l1)) = pos_Rl l2 0 ->
- Int_SF (FF (cons_Rlist l1 l2) f) (cons_Rlist l1 l2) =
+ forall (l1 l2:list R) (f:R -> R),
+ pos_Rl l1 (pred (length l1)) = pos_Rl l2 0 ->
+ Int_SF (FF (app l1 l2) f) (app l1 l2) =
Int_SF (FF l1 f) l1 + Int_SF (FF l2 f) l2.
Proof.
intros l1 l2 f; induction l1 as [| r l1 IHl1]; intros H;
@@ -2193,7 +2199,7 @@ Proof.
elim Hle; intro.
elim Hle'; intro.
replace (Int_SF lf3 l3) with
- (Int_SF (FF (cons_Rlist l1 l2) f) (cons_Rlist l1 l2)).
+ (Int_SF (FF (app l1 l2) f) (app l1 l2)).
replace (Int_SF lf1 l1) with (Int_SF (FF l1 f) l1).
replace (Int_SF lf2 l2) with (Int_SF (FF l2 f) l2).
symmetry ; apply StepFun_P42.
@@ -2225,7 +2231,7 @@ Proof.
elim Hle''; intro.
rewrite Rplus_comm;
replace (Int_SF lf1 l1) with
- (Int_SF (FF (cons_Rlist l3 l2) f) (cons_Rlist l3 l2)).
+ (Int_SF (FF (app l3 l2) f) (app l3 l2)).
replace (Int_SF lf3 l3) with (Int_SF (FF l3 f) l3).
replace (Int_SF lf2 l2) with (Int_SF (FF l2 f) l2).
apply StepFun_P42.
@@ -2249,7 +2255,7 @@ Proof.
ring.
elim Hle; intro.
replace (Int_SF lf2 l2) with
- (Int_SF (FF (cons_Rlist l3 l1) f) (cons_Rlist l3 l1)).
+ (Int_SF (FF (app l3 l1) f) (app l3 l1)).
replace (Int_SF lf3 l3) with (Int_SF (FF l3 f) l3).
replace (Int_SF lf1 l1) with (Int_SF (FF l1 f) l1).
symmetry ; apply StepFun_P42.
@@ -2277,7 +2283,7 @@ Proof.
ring.
rewrite Rplus_comm; elim Hle''; intro.
replace (Int_SF lf2 l2) with
- (Int_SF (FF (cons_Rlist l1 l3) f) (cons_Rlist l1 l3)).
+ (Int_SF (FF (app l1 l3) f) (app l1 l3)).
replace (Int_SF lf3 l3) with (Int_SF (FF l3 f) l3).
replace (Int_SF lf1 l1) with (Int_SF (FF l1 f) l1).
symmetry ; apply StepFun_P42.
@@ -2304,7 +2310,7 @@ Proof.
ring.
elim Hle'; intro.
replace (Int_SF lf1 l1) with
- (Int_SF (FF (cons_Rlist l2 l3) f) (cons_Rlist l2 l3)).
+ (Int_SF (FF (app l2 l3) f) (app l2 l3)).
replace (Int_SF lf3 l3) with (Int_SF (FF l3 f) l3).
replace (Int_SF lf2 l2) with (Int_SF (FF l2 f) l2).
symmetry ; apply StepFun_P42.
@@ -2334,7 +2340,7 @@ Proof.
replace (Int_SF lf3 l3) with (Int_SF lf2 l2 + Int_SF lf1 l1).
ring.
replace (Int_SF lf3 l3) with
- (Int_SF (FF (cons_Rlist l2 l1) f) (cons_Rlist l2 l1)).
+ (Int_SF (FF (app l2 l1) f) (app l2 l1)).
replace (Int_SF lf1 l1) with (Int_SF (FF l1 f) l1).
replace (Int_SF lf2 l2) with (Int_SF (FF l2 f) l2).
symmetry ; apply StepFun_P42.
@@ -2395,17 +2401,17 @@ Proof.
elim H; clear H; intros; unfold IsStepFun in X; unfold is_subdivision in X;
elim X; clear X; intros l1 [lf1 H2];
cut
- (forall (l1 lf1:Rlist) (a b c:R) (f:R -> R),
+ (forall (l1 lf1:list R) (a b c:R) (f:R -> R),
adapted_couple f a b l1 lf1 ->
a <= c <= b ->
- { l:Rlist & { l0:Rlist & adapted_couple f a c l l0 } }).
+ { l:list R & { l0:list R & adapted_couple f a c l l0 } }).
intro X; unfold IsStepFun; unfold is_subdivision; eapply X.
apply H2.
split; assumption.
clear f a b c H0 H H1 H2 l1 lf1; simple induction l1.
intros; unfold adapted_couple in H; decompose [and] H; clear H; simpl in H4;
discriminate.
- simple induction r0.
+ intros r r0; elim r0.
intros X lf1 a b c f H H0; assert (H1 : a = b).
unfold adapted_couple in H; decompose [and] H; clear H; simpl in H3;
simpl in H2; assert (H7 : a <= b).
@@ -2438,7 +2444,7 @@ Proof.
unfold constant_D_eq, open_interval; intros; simpl in H8;
inversion H8.
simpl; assert (H10 := H7 0%nat);
- assert (H12 : (0 < pred (Rlength (cons r (cons r1 r2))))%nat).
+ assert (H12 : (0 < pred (length (cons r (cons r1 r2))))%nat).
simpl; apply lt_O_Sn.
apply (H10 H12); unfold open_interval; simpl;
rewrite H11 in H9; simpl in H9; elim H9; clear H9;
@@ -2479,7 +2485,7 @@ Proof.
intros; simpl in H; unfold constant_D_eq, open_interval; intros;
induction i as [| i Hreci].
simpl; assert (H17 := H10 0%nat);
- assert (H18 : (0 < pred (Rlength (cons r (cons r1 r2))))%nat).
+ assert (H18 : (0 < pred (length (cons r (cons r1 r2))))%nat).
simpl; apply lt_O_Sn.
apply (H17 H18); unfold open_interval; simpl; simpl in H4;
elim H4; clear H4; intros; split; try assumption;
@@ -2507,16 +2513,16 @@ Proof.
elim H; clear H; intros; unfold IsStepFun in X; unfold is_subdivision in X;
elim X; clear X; intros l1 [lf1 H2];
cut
- (forall (l1 lf1:Rlist) (a b c:R) (f:R -> R),
+ (forall (l1 lf1:list R) (a b c:R) (f:R -> R),
adapted_couple f a b l1 lf1 ->
a <= c <= b ->
- { l:Rlist & { l0:Rlist & adapted_couple f c b l l0 } }).
+ { l:list R & { l0:list R & adapted_couple f c b l l0 } }).
intro X; unfold IsStepFun; unfold is_subdivision; eapply X;
[ apply H2 | split; assumption ].
clear f a b c H0 H H1 H2 l1 lf1; simple induction l1.
intros; unfold adapted_couple in H; decompose [and] H; clear H; simpl in H4;
discriminate.
- simple induction r0.
+ intros r r0; elim r0.
intros X lf1 a b c f H H0; assert (H1 : a = b).
unfold adapted_couple in H; decompose [and] H; clear H; simpl in H3;
simpl in H2; assert (H7 : a <= b).
diff --git a/theories/Reals/Rtopology.v b/theories/Reals/Rtopology.v
index d21042884e..fa5442e86f 100644
--- a/theories/Reals/Rtopology.v
+++ b/theories/Reals/Rtopology.v
@@ -12,6 +12,7 @@ Require Import Rbase.
Require Import Rfunctions.
Require Import Ranalysis1.
Require Import RList.
+Require Import List.
Require Import Classical_Prop.
Require Import Classical_Pred_Type.
Local Open Scope R_scope.
@@ -388,7 +389,7 @@ Record family : Type := mkfamily
Definition family_open_set (f:family) : Prop := forall x:R, open_set (f x).
Definition domain_finite (D:R -> Prop) : Prop :=
- exists l : Rlist, (forall x:R, D x <-> In x l).
+ exists l : list R, (forall x:R, D x <-> In x l).
Definition family_finite (f:family) : Prop := domain_finite (ind f).
@@ -669,7 +670,7 @@ Proof.
intro H14; simpl in H14; unfold intersection_domain in H14;
specialize H13 with x0; destruct H13 as (H13,H15);
destruct (Req_dec x0 y0) as [H16|H16].
- simpl; left; apply H16.
+ simpl; left. symmetry; apply H16.
simpl; right; apply H13.
simpl; unfold intersection_domain; unfold Db in H14;
decompose [and or] H14.
@@ -678,8 +679,8 @@ Proof.
intro H14; simpl in H14; destruct H14 as [H15|H15]; simpl;
unfold intersection_domain.
split.
- apply (cond_fam f0); rewrite H15; exists b; apply H6.
- unfold Db; right; assumption.
+ apply (cond_fam f0); rewrite <- H15; exists b; apply H6.
+ unfold Db; right; symmetry; assumption.
simpl; unfold intersection_domain; elim (H13 x0).
intros _ H16; assert (H17 := H16 H15); simpl in H17;
unfold intersection_domain in H17; split.
@@ -750,15 +751,15 @@ Proof.
intro H14; simpl in H14; unfold intersection_domain in H14;
specialize (H13 x0); destruct H13 as (H13,H15);
destruct (Req_dec x0 y0) as [Heq|Hneq].
- simpl; left; apply Heq.
+ simpl; left; symmetry; apply Heq.
simpl; right; apply H13; simpl;
unfold intersection_domain; unfold Db in H14;
decompose [and or] H14.
split; assumption.
elim Hneq; assumption.
intros [H15|H15]. split.
- apply (cond_fam f0); rewrite H15; exists m; apply H6.
- unfold Db; right; assumption.
+ apply (cond_fam f0); rewrite <- H15; exists m; apply H6.
+ unfold Db; right; symmetry; assumption.
elim (H13 x0); intros _ H16.
assert (H17 := H16 H15).
simpl in H17.
@@ -810,9 +811,10 @@ Proof.
unfold family_finite; unfold domain_finite;
exists (cons y0 nil); intro; split.
simpl; unfold intersection_domain; intros (H3,H4).
- unfold D' in H4; left; apply H4.
+ unfold D' in H4; left; symmetry; apply H4.
simpl; unfold intersection_domain; intros [H4|[]].
- split; [ rewrite H4; apply (cond_fam f0); exists a; apply H2 | apply H4 ].
+ split; [ rewrite <- H4; apply (cond_fam f0); exists a; apply H2 |
+ symmetry; apply H4 ].
split; [ right; reflexivity | apply Hle ].
apply compact_eqDom with (fun c:R => False).
apply compact_EMP.
diff --git a/tools/coqdep.ml b/tools/coqdep.ml
index 2140014c58..745cf950b5 100644
--- a/tools/coqdep.ml
+++ b/tools/coqdep.ml
@@ -20,7 +20,6 @@ open Minisys
As of today, this module depends on the following Coq modules:
- - Flags
- Envars
- CoqProject_file
@@ -28,10 +27,7 @@ open Minisys
coqlib handling up so this can be bootstrapped earlier.
*)
-let option_D = ref false
-let option_w = ref false
let option_sort = ref false
-let option_dump = ref None
let warning_mult suf iter =
let tab = Hashtbl.create 151 in
@@ -74,378 +70,10 @@ let sort () =
in
List.iter (fun (name,_) -> loop name) !vAccu
-let (dep_tab : (string,string list) Hashtbl.t) = Hashtbl.create 151
-
-let mL_dep_list b f =
- try
- Hashtbl.find dep_tab f
- with Not_found ->
- let deja_vu = ref ([] : string list) in
- try
- let chan = open_in f in
- let buf = Lexing.from_channel chan in
- try
- while true do
- let (Use_module str) = caml_action buf in
- if str = b then begin
- coqdep_warning "in file %s the notation %s. is useless !\n" f b
- end else
- if not (List.mem str !deja_vu) then addQueue deja_vu str
- done; []
- with Fin_fichier -> begin
- close_in chan;
- let rl = List.rev !deja_vu in
- Hashtbl.add dep_tab f rl;
- rl
- end
- with Sys_error _ -> []
-
-let affiche_Declare f dcl =
- printf "\n*** In file %s: \n" f;
- printf "Declare ML Module";
- List.iter (fun str -> printf " \"%s\"" str) dcl;
- printf ".\n%!"
-
-let warning_Declare f dcl =
- eprintf "*** Warning : in file %s, the ML modules declaration should be\n" f;
- eprintf "*** Declare ML Module";
- List.iter (fun str -> eprintf " \"%s\"" str) dcl;
- eprintf ".\n%!"
-
-let traite_Declare f =
- let decl_list = ref ([] : string list) in
- let rec treat = function
- | s :: ll ->
- let s' = basename_noext s in
- (match search_ml_known s with
- | Some mldir when not (List.mem s' !decl_list) ->
- let fullname = file_name s' mldir in
- let depl = mL_dep_list s (fullname ^ ".ml") in
- treat depl;
- decl_list := s :: !decl_list
- | _ -> ());
- treat ll
- | [] -> ()
- in
- try
- let chan = open_in f in
- let buf = Lexing.from_channel chan in
- begin try
- while true do
- let tok = coq_action buf in
- (match tok with
- | Declare sl ->
- decl_list := [];
- treat sl;
- decl_list := List.rev !decl_list;
- if !option_D then
- affiche_Declare f !decl_list
- else if !decl_list <> sl then
- warning_Declare f !decl_list
- | _ -> ())
- done
- with Fin_fichier -> () end;
- close_in chan
- with Sys_error _ -> ()
-
-let declare_dependencies () =
- List.iter
- (fun (name,_) ->
- traite_Declare (name^".v");
- pp_print_flush std_formatter ())
- (List.rev !vAccu)
-
-(** DAGs guaranteed to be transitive reductions *)
-module DAG (Node : Set.OrderedType) :
-sig
- type node = Node.t
- type t
- val empty : t
- val add_transitive_edge : node -> node -> t -> t
- val iter : (node -> node -> unit) -> t -> unit
-end =
-struct
- type node = Node.t
- module NSet = Set.Make(Node)
- module NMap = Map.Make(Node)
-
- (** Associate to a node the set of its neighbours *)
- type _t = NSet.t NMap.t
-
- (** Optimisation: construct the reverse graph at the same time *)
- type t = { dir : _t; rev : _t; }
-
-
- let node_equal x y = Node.compare x y = 0
-
- let add_edge x y graph =
- let set = try NMap.find x graph with Not_found -> NSet.empty in
- NMap.add x (NSet.add y set) graph
-
- let remove_edge x y graph =
- let set = try NMap.find x graph with Not_found -> NSet.empty in
- let set = NSet.remove y set in
- if NSet.is_empty set then NMap.remove x graph
- else NMap.add x set graph
-
- let has_edge x y graph =
- let set = try NMap.find x graph with Not_found -> NSet.empty in
- NSet.mem y set
-
- let connected x y graph =
- let rec aux rem seen =
- if NSet.is_empty rem then false
- else
- let x = NSet.choose rem in
- if node_equal x y then true
- else
- let rem = NSet.remove x rem in
- if NSet.mem x seen then
- aux rem seen
- else
- let seen = NSet.add x seen in
- let next = try NMap.find x graph with Not_found -> NSet.empty in
- let rem = NSet.union next rem in
- aux rem seen
- in
- aux (NSet.singleton x) NSet.empty
-
- (** Check whether there is a path from a to b going through the edge
- x -> y. *)
- let connected_through a b x y graph =
- let rec aux rem seen =
- if NMap.is_empty rem then false
- else
- let (n, through) = NMap.choose rem in
- if node_equal n b && through then true
- else
- let rem = NMap.remove n rem in
- let is_seen = try Some (NMap.find n seen) with Not_found -> None in
- match is_seen with
- | None ->
- let seen = NMap.add n through seen in
- let next = try NMap.find n graph with Not_found -> NSet.empty in
- let is_x = node_equal n x in
- let push m accu =
- let through = through || (is_x && node_equal m y) in
- NMap.add m through accu
- in
- let rem = NSet.fold push next rem in
- aux rem seen
- | Some false ->
- (* The path we took encountered x -> y but not the one in seen *)
- if through then aux (NMap.add n true rem) (NMap.add n true seen)
- else aux rem seen
- | Some true -> aux rem seen
- in
- aux (NMap.singleton a false) NMap.empty
-
- let closure x graph =
- let rec aux rem seen =
- if NSet.is_empty rem then seen
- else
- let x = NSet.choose rem in
- let rem = NSet.remove x rem in
- if NSet.mem x seen then
- aux rem seen
- else
- let seen = NSet.add x seen in
- let next = try NMap.find x graph with Not_found -> NSet.empty in
- let rem = NSet.union next rem in
- aux rem seen
- in
- aux (NSet.singleton x) NSet.empty
-
- let empty = { dir = NMap.empty; rev = NMap.empty; }
-
- (** Online transitive reduction algorithm *)
- let add_transitive_edge x y graph =
- if connected x y graph.dir then graph
- else
- let dir = add_edge x y graph.dir in
- let rev = add_edge y x graph.rev in
- let graph = { dir; rev; } in
- let ancestors = closure x rev in
- let descendents = closure y dir in
- let fold_ancestor a graph =
- let fold_descendent b graph =
- let to_remove = has_edge a b graph.dir in
- let to_remove = to_remove && not (node_equal x a && node_equal y b) in
- let to_remove = to_remove && connected_through a b x y graph.dir in
- if to_remove then
- let dir = remove_edge a b graph.dir in
- let rev = remove_edge b a graph.rev in
- { dir; rev; }
- else graph
- in
- NSet.fold fold_descendent descendents graph
- in
- NSet.fold fold_ancestor ancestors graph
-
- let iter f graph =
- let iter x set = NSet.iter (fun y -> f x y) set in
- NMap.iter iter graph.dir
-
-end
-
-module Graph =
-struct
-(** Dumping a dependency graph **)
-
-module DAG = DAG(struct type t = string let compare = compare end)
-
-(** TODO: we should share this code with Coqdep_common *)
-module VData = struct
- type t = string list option * string list
- let compare = Util.pervasives_compare
-end
-
-module VCache = Set.Make(VData)
-
-let treat_coq_file chan =
- let buf = Lexing.from_channel chan in
- let deja_vu_v = ref VCache.empty in
- let deja_vu_ml = ref StrSet.empty in
- let mark_v_done from acc str =
- let seen = VCache.mem (from, str) !deja_vu_v in
- if not seen then
- let () = deja_vu_v := VCache.add (from, str) !deja_vu_v in
- match search_v_known ?from str with
- | None -> acc
- | Some file_str -> (canonize file_str, !suffixe) :: acc
- else acc
- in
- let rec loop acc =
- let token = try Some (coq_action buf) with Fin_fichier -> None in
- match token with
- | None -> acc
- | Some action ->
- let acc = match action with
- | Require (from, strl) ->
- List.fold_left (fun accu v -> mark_v_done from accu v) acc strl
- | Declare sl ->
- let declare suff dir s =
- let base = escape (file_name s dir) in
- match !option_dynlink with
- | No -> []
- | Byte -> [base,suff]
- | Opt -> [base,".cmxs"]
- | Both -> [base,suff; base,".cmxs"]
- | Variable ->
- if suff=".cmo" then [base,"$(DYNOBJ)"]
- else [base,"$(DYNLIB)"]
- in
- let decl acc str =
- let s = basename_noext str in
- if not (StrSet.mem s !deja_vu_ml) then
- let () = deja_vu_ml := StrSet.add s !deja_vu_ml in
- match search_mllib_known s with
- | Some mldir -> (declare ".cma" mldir s) @ acc
- | None ->
- match search_ml_known s with
- | Some mldir -> (declare ".cmo" mldir s) @ acc
- | None -> acc
- else acc
- in
- List.fold_left decl acc sl
- | Load str ->
- let str = Filename.basename str in
- let seen = VCache.mem (None, [str]) !deja_vu_v in
- if not seen then
- let () = deja_vu_v := VCache.add (None, [str]) !deja_vu_v in
- match search_v_known [str] with
- | None -> acc
- | Some file_str -> (canonize file_str, ".v") :: acc
- else acc
- | AddLoadPath _ | AddRecLoadPath _ -> acc (* TODO *)
- in
- loop acc
- in
- loop []
-
-let treat_coq_file f =
- let chan = try Some (open_in f) with Sys_error _ -> None in
- match chan with
- | None -> []
- | Some chan ->
- try
- let ans = treat_coq_file chan in
- let () = close_in chan in
- ans
- with Syntax_error (i, j) -> close_in chan; error_cannot_parse f (i, j)
-
-type graph =
- | Element of string
- | Subgraph of string * graph list
-
-let rec insert_graph name path graphs = match path, graphs with
- | [] , graphs -> (Element name) :: graphs
- | (box :: boxes), (Subgraph (hd, names)) :: tl when hd = box ->
- Subgraph (hd, insert_graph name boxes names) :: tl
- | _, hd :: tl -> hd :: (insert_graph name path tl)
- | (box :: boxes), [] -> [ Subgraph (box, insert_graph name boxes []) ]
-
-let print_graphs chan graph =
- let rec print_aux name = function
- | [] -> name
- | (Element str) :: tl -> fprintf chan "\"%s\";\n" str; print_aux name tl
- | Subgraph (box, names) :: tl ->
- fprintf chan "subgraph cluster%n {\nlabel=\"%s\";\n" name box;
- let name = print_aux (name + 1) names in
- fprintf chan "}\n"; print_aux name tl
- in
- ignore (print_aux 0 graph)
-
-let rec pop_common_prefix = function
- | [Subgraph (_, graphs)] -> pop_common_prefix graphs
- | graphs -> graphs
-
-let split_path = Str.split (Str.regexp "/")
-
-let rec pop_last = function
- | [] -> []
- | [ x ] -> []
- | x :: xs -> x :: pop_last xs
-
-let get_boxes path = pop_last (split_path path)
-
-let insert_raw_graph file =
- insert_graph file (get_boxes file)
-
-let rec get_dependencies name args =
- let vdep = treat_coq_file (name ^ ".v") in
- let fold (deps, graphs, alseen) (dep, _) =
- let dag = DAG.add_transitive_edge name dep deps in
- if not (List.mem dep alseen) then
- get_dependencies dep (dag, insert_raw_graph dep graphs, dep :: alseen)
- else
- (dag, graphs, alseen)
- in
- List.fold_left fold args vdep
-
-let coq_dependencies_dump chan dumpboxes =
- let (deps, graphs, _) =
- List.fold_left (fun ih (name, _) -> get_dependencies name ih)
- (DAG.empty, List.fold_left (fun ih (file, _) -> insert_raw_graph file ih) [] !vAccu,
- List.map fst !vAccu) !vAccu
- in
- fprintf chan "digraph dependencies {\n";
- if dumpboxes then print_graphs chan (pop_common_prefix graphs)
- else List.iter (fun (name, _) -> fprintf chan "\"%s\"[label=\"%s\"]\n" name (basename_noext name)) !vAccu;
- DAG.iter (fun name dep -> fprintf chan "\"%s\" -> \"%s\"\n" dep name) deps;
- fprintf chan "}\n%!"
-
-end
-
let usage () =
eprintf " usage: coqdep [options] <filename>+\n";
eprintf " options:\n";
eprintf " -c : Also print the dependencies of caml modules (=ocamldep).\n";
- (* Does not work anymore *)
- (* eprintf " -w : Print informations on missing or wrong \"Declare
- ML Module\" commands in coq files.\n"; *)
- (* Does not work anymore: *)
- (* eprintf " -D : Prints the missing ocmal module names. No dependency computed.\n"; *)
eprintf " -boot : For coq developers, prints dependencies over coq library files (omitted by default).\n";
eprintf " -sort : output the given file name ordered by dependencies\n";
eprintf " -noglob | -no-glob : \n";
@@ -456,8 +84,6 @@ let usage () =
eprintf " -R dir logname : add and import dir recursively to coq load path under logical name logname\n";
eprintf " -Q dir logname : add (recursively) and open (non recursively) dir to coq load path under logical name logname\n";
eprintf " -vos : also output dependencies about .vos files\n";
- eprintf " -dumpgraph f : print a dot dependency graph in file 'f'\n";
- eprintf " -dumpgraphbox f : print a dot dependency graph box in file 'f'\n";
eprintf " -exclude-dir dir : skip subdirectories named 'dir' during -R/-Q search\n";
eprintf " -coqlib dir : set the coq standard library directory\n";
eprintf " -suffix s : \n";
@@ -468,7 +94,6 @@ let usage () =
let split_period = Str.split (Str.regexp (Str.quote "."))
let add_q_include path l = add_rec_dir_no_import add_known path (split_period l)
-
let add_r_include path l = add_rec_dir_import add_known path (split_period l)
let treat_coqproject f =
@@ -482,9 +107,8 @@ let treat_coqproject f =
iter_sourced (fun f -> treat_file None f) (all_files project)
let rec parse = function
+ (* TODO, deprecate option -c *)
| "-c" :: ll -> option_c := true; parse ll
- | "-D" :: ll -> option_D := true; parse ll
- | "-w" :: ll -> option_w := true; parse ll
| "-boot" :: ll -> option_boot := true; parse ll
| "-sort" :: ll -> option_sort := true; parse ll
| "-vos" :: ll -> write_vos := true; parse ll
@@ -495,17 +119,12 @@ let rec parse = function
| "-R" :: r :: ln :: ll -> add_r_include r ln; parse ll
| "-Q" :: r :: ln :: ll -> add_q_include r ln; parse ll
| "-R" :: ([] | [_]) -> usage ()
- | "-dumpgraph" :: f :: ll -> option_dump := Some (false, f); parse ll
- | "-dumpgraphbox" :: f :: ll -> option_dump := Some (true, f); parse ll
| "-exclude-dir" :: r :: ll -> System.exclude_directory r; parse ll
| "-exclude-dir" :: [] -> usage ()
| "-coqlib" :: r :: ll -> Envars.set_user_coqlib r; parse ll
| "-coqlib" :: [] -> usage ()
| "-suffix" :: s :: ll -> suffixe := s ; parse ll
| "-suffix" :: [] -> usage ()
- | "-slash" :: ll ->
- coqdep_warning "warning: option -slash has no effect and is deprecated.";
- parse ll
| "-dyndep" :: "no" :: ll -> option_dynlink := No; parse ll
| "-dyndep" :: "opt" :: ll -> option_dynlink := Opt; parse ll
| "-dyndep" :: "byte" :: ll -> option_dynlink := Byte; parse ll
@@ -525,19 +144,8 @@ let coqdep () =
(* Add current dir with empty logical path if not set by options above. *)
(try ignore (Coqdep_common.find_dir_logpath (Sys.getcwd()))
with Not_found -> add_norec_dir_import add_known "." []);
- (* NOTE: These directories are searched from last to first *)
- if !option_boot then begin
- add_rec_dir_import add_known "theories" ["Coq"];
- add_rec_dir_import add_known "plugins" ["Coq"];
- add_rec_dir_import (fun _ -> add_caml_known) "theories" ["Coq"];
- add_rec_dir_import (fun _ -> add_caml_known) "plugins" ["Coq"];
- let user = "user-contrib" in
- if Sys.file_exists user then begin
- add_rec_dir_no_import add_known user [];
- add_rec_dir_no_import (fun _ -> add_caml_known) user [];
- end;
- end else begin
- (* option_boot is actually always false in this branch *)
+ (* We don't setup any loadpath if the -boot is passed *)
+ if not !option_boot then begin
Envars.set_coqlib ~fail:(fun msg -> raise (CoqlibError msg));
let coqlib = Envars.coqlib () in
add_rec_dir_import add_coqlib_known (coqlib//"theories") ["Coq"];
@@ -554,17 +162,9 @@ let coqdep () =
warning_mult ".mli" iter_mli_known;
warning_mult ".ml" iter_ml_known;
if !option_sort then begin sort (); exit 0 end;
- if !option_c && not !option_D then mL_dependencies ();
- if not !option_D then coq_dependencies ();
- if !option_w || !option_D then declare_dependencies ();
- begin match !option_dump with
- | None -> ()
- | Some (box, file) ->
- let chan = open_out file in
- let chan_fmt = formatter_of_out_channel chan in
- try Graph.coq_dependencies_dump chan_fmt box; close_out chan
- with e -> close_out chan; raise e
- end
+ if !option_c then mL_dependencies ();
+ coq_dependencies ();
+ ()
let _ =
try
diff --git a/tools/coqdep_boot.ml b/tools/coqdep_boot.ml
index 1730dd3d68..1cebb3638e 100644
--- a/tools/coqdep_boot.ml
+++ b/tools/coqdep_boot.ml
@@ -19,6 +19,7 @@ open Coqdep_common
let split_period = Str.split (Str.regexp (Str.quote "."))
let add_q_include path l = add_rec_dir_no_import add_known path (split_period l)
+let add_r_include path l = add_rec_dir_import add_known path (split_period l)
let rec parse = function
| "-dyndep" :: "no" :: ll -> option_dynlink := No; parse ll
@@ -26,16 +27,14 @@ let rec parse = function
| "-dyndep" :: "byte" :: ll -> option_dynlink := Byte; parse ll
| "-dyndep" :: "both" :: ll -> option_dynlink := Both; parse ll
| "-dyndep" :: "var" :: ll -> option_dynlink := Variable; parse ll
- | "-c" :: ll -> option_c := true; parse ll
| "-boot" :: ll -> parse ll (* We're already in boot mode by default *)
- | "-mldep" :: ocamldep :: ll ->
- option_mldep := Some ocamldep; option_c := true; parse ll
| "-I" :: r :: ll ->
(* To solve conflict (e.g. same filename in kernel and checker)
we allow to state an explicit order *)
add_caml_dir r;
norec_dirs := StrSet.add r !norec_dirs;
parse ll
+ | "-R" :: r :: ln :: ll -> add_r_include r ln; parse ll
| "-Q" :: r :: ln :: ll -> add_q_include r ln; parse ll
| f :: ll -> treat_file None f; parse ll
| [] -> ()
@@ -44,16 +43,4 @@ let _ =
let () = option_boot := true in
if Array.length Sys.argv < 2 then exit 1;
parse (List.tl (Array.to_list Sys.argv));
- if !option_c then begin
- add_rec_dir_import add_known "." [];
- add_rec_dir_import (fun _ -> add_caml_known) "." ["Coq"];
- end
- else begin
- add_rec_dir_import add_known "theories" ["Coq"];
- add_rec_dir_import add_known "plugins" ["Coq"];
- add_caml_dir "tactics";
- add_rec_dir_import (fun _ -> add_caml_known) "theories" ["Coq"];
- add_rec_dir_import (fun _ -> add_caml_known) "plugins" ["Coq"];
- end;
- if !option_c then mL_dependencies ();
coq_dependencies ()
diff --git a/tools/coqdep_common.ml b/tools/coqdep_common.ml
index 775c528176..bd72a52adf 100644
--- a/tools/coqdep_common.ml
+++ b/tools/coqdep_common.ml
@@ -35,7 +35,6 @@ let option_c = ref false
let option_noglob = ref false
let option_dynlink = ref Both
let option_boot = ref false
-let option_mldep = ref None
let norec_dirs = ref StrSet.empty
@@ -246,26 +245,7 @@ let depend_ML str =
(" "^mlifile^".cmi"," "^mlifile^".cmi")
| None, None -> "", ""
-let soustraite_fichier_ML dep md ext =
- try
- let chan = open_process_in (dep^" -modules "^md^ext) in
- let list = ocamldep_parse (Lexing.from_channel chan) in
- let a_faire = ref "" in
- let a_faire_opt = ref "" in
- List.iter
- (fun str ->
- let byte,opt = depend_ML str in
- a_faire := !a_faire ^ byte;
- a_faire_opt := !a_faire_opt ^ opt)
- (List.rev list);
- (!a_faire, !a_faire_opt)
- with
- | Sys_error _ -> ("","")
- | _ ->
- Printf.eprintf "Coqdep: subprocess %s failed on file %s%s\n" dep md ext;
- exit 1
-
-let autotraite_fichier_ML md ext =
+let traite_fichier_ML md ext =
try
let chan = open_in (md ^ ext) in
let buf = Lexing.from_channel chan in
@@ -290,11 +270,6 @@ let autotraite_fichier_ML md ext =
(!a_faire, !a_faire_opt)
with Sys_error _ -> ("","")
-let traite_fichier_ML md ext =
- match !option_mldep with
- | Some dep -> soustraite_fichier_ML dep md ext
- | None -> autotraite_fichier_ML md ext
-
let traite_fichier_modules md ext =
try
let chan = open_in (md ^ ext) in
diff --git a/tools/coqdep_common.mli b/tools/coqdep_common.mli
index 6d49f7e06c..96266b8e36 100644
--- a/tools/coqdep_common.mli
+++ b/tools/coqdep_common.mli
@@ -30,7 +30,6 @@ val write_vos : bool ref
type dynlink = Opt | Byte | Both | No | Variable
val option_dynlink : dynlink ref
-val option_mldep : string option ref
val norec_dirs : StrSet.t ref
val suffixe : string ref
type dir = string option
diff --git a/toplevel/coqargs.ml b/toplevel/coqargs.ml
index 74d9c113d6..7d919956e8 100644
--- a/toplevel/coqargs.ml
+++ b/toplevel/coqargs.ml
@@ -271,8 +271,7 @@ let get_compat_file = function
| "8.12" -> "Coq.Compat.Coq812"
| "8.11" -> "Coq.Compat.Coq811"
| "8.10" -> "Coq.Compat.Coq810"
- | "8.9" -> "Coq.Compat.Coq89"
- | ("8.8" | "8.7" | "8.6" | "8.5" | "8.4" | "8.3" | "8.2" | "8.1" | "8.0") as s ->
+ | ("8.9" | "8.8" | "8.7" | "8.6" | "8.5" | "8.4" | "8.3" | "8.2" | "8.1" | "8.0") as s ->
CErrors.user_err ~hdr:"get_compat_file"
Pp.(str "Compatibility with version " ++ str s ++ str " not supported.")
| s ->
diff --git a/user-contrib/Ltac2/Array.v b/user-contrib/Ltac2/Array.v
index c55e20bc88..ee3bf88647 100644
--- a/user-contrib/Ltac2/Array.v
+++ b/user-contrib/Ltac2/Array.v
@@ -8,9 +8,220 @@
(* * (see LICENSE file for the text of the license) *)
(************************************************************************)
+(* This is mostly a translation of OCaml stdlib/array.ml *)
+
+(**************************************************************************)
+(* *)
+(* OCaml *)
+(* *)
+(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
+(* *)
+(* Copyright 1996 Institut National de Recherche en Informatique et *)
+(* en Automatique. *)
+(* *)
+(* All rights reserved. This file is distributed under the terms of *)
+(* the GNU Lesser General Public License version 2.1, with the *)
+(* special exception on linking described in the file LICENSE. *)
+(* *)
+(**************************************************************************)
+
Require Import Ltac2.Init.
+Require Ltac2.Int.
+Require Ltac2.Control.
+Require Ltac2.Bool.
+Require Ltac2.Message.
+
+(* Question: what is returned in case of an out of range value?
+ Answer: Ltac2 throws a panic *)
+Ltac2 @external empty : unit -> 'a array := "ltac2" "array_empty".
Ltac2 @external make : int -> 'a -> 'a array := "ltac2" "array_make".
Ltac2 @external length : 'a array -> int := "ltac2" "array_length".
Ltac2 @external get : 'a array -> int -> 'a := "ltac2" "array_get".
Ltac2 @external set : 'a array -> int -> 'a -> unit := "ltac2" "array_set".
+Ltac2 @external lowlevel_blit : 'a array -> int -> 'a array -> int -> int -> unit := "ltac2" "array_blit".
+Ltac2 @external lowlevel_fill : 'a array -> int -> int -> 'a -> unit := "ltac2" "array_fill".
+Ltac2 @external concat : ('a array) list -> 'a array := "ltac2" "array_concat".
+
+(* Low level array operations *)
+
+Ltac2 lowlevel_sub (arr : 'a array) (start : int) (len : int) :=
+ let l := length arr in
+ match Int.equal l 0 with
+ | true => empty ()
+ | false =>
+ let newarr:=make len (get arr 0) in
+ lowlevel_blit arr start newarr 0 len;
+ newarr
+ end.
+
+(* Array functions as defined in the OCaml library *)
+
+Ltac2 init (l : int) (f : int->'a) :=
+ let rec init_aux (dst : 'a array) (pos : int) (len : int) (f : int->'a) :=
+ match Int.equal len 0 with
+ | true => ()
+ | false =>
+ set dst pos (f pos);
+ init_aux dst (Int.add pos 1) (Int.sub len 1) f
+ end
+ in
+ match Int.le l 0 with
+ | true => empty ()
+ | false =>
+ let arr:=make l (f 0) in
+ init_aux arr 0 (length arr) f;
+ arr
+ end.
+
+Ltac2 make_matrix (sx : int) (sy : int) (v : 'a) :=
+ let init1 i := v in
+ let initr i := init sy init1 in
+ init sx initr.
+
+Ltac2 copy a := lowlevel_sub a 0 (length a).
+
+Ltac2 append (a1 : 'a array) (a2 : 'a array) :=
+ match Int.equal (length a1) 0 with
+ | true => copy a2
+ | false => match Int.equal (length a2) 0 with
+ | true => copy a1
+ | false =>
+ let newarr:=make (Int.add (length a1) (length a2)) (get a1 0) in
+ lowlevel_blit a1 0 newarr 0 (length a1);
+ lowlevel_blit a2 0 newarr (length a1) (length a2);
+ newarr
+ end
+ end.
+
+Ltac2 sub (a : 'a array) (ofs : int) (len : int) :=
+ Control.assert_valid_argument "Array.sub ofs<0" (Int.ge ofs 0);
+ Control.assert_valid_argument "Array.sub len<0" (Int.ge len 0);
+ Control.assert_bounds "Array.sub" (Int.le ofs (Int.sub (length a) len));
+ lowlevel_sub a ofs len.
+
+Ltac2 fill (a : 'a array) (ofs : int) (len : int) (v : 'a) :=
+ Control.assert_valid_argument "Array.fill ofs<0" (Int.ge ofs 0);
+ Control.assert_valid_argument "Array.fill len<0" (Int.ge len 0);
+ Control.assert_bounds "Array.fill" (Int.le ofs (Int.sub (length a) len));
+ lowlevel_fill a ofs len v.
+
+Ltac2 blit (a1 : 'a array) (ofs1 : int) (a2 : 'a array) (ofs2 : int) (len : int) :=
+ Control.assert_valid_argument "Array.blit ofs1<0" (Int.ge ofs1 0);
+ Control.assert_valid_argument "Array.blit ofs2<0" (Int.ge ofs2 0);
+ Control.assert_valid_argument "Array.blit len<0" (Int.ge len 0);
+ Control.assert_bounds "Array.blit ofs1+len>len a1" (Int.le ofs1 (Int.sub (length a1) len));
+ Control.assert_bounds "Array.blit ofs2+len>len a2" (Int.le ofs2 (Int.sub (length a2) len));
+ lowlevel_blit a1 ofs1 a2 ofs2 len.
+
+Ltac2 rec iter_aux (f : 'a -> unit) (a : 'a array) (pos : int) (len : int) :=
+ match Int.equal len 0 with
+ | true => ()
+ | false => f (get a pos); iter_aux f a (Int.add pos 1) (Int.sub len 1)
+ end.
+
+Ltac2 iter (f : 'a -> unit) (a : 'a array) := iter_aux f a 0 (length a).
+
+Ltac2 rec iter2_aux (f : 'a -> 'b -> unit) (a : 'a array) (b : 'b array) (pos : int) (len : int) :=
+ match Int.equal len 0 with
+ | true => ()
+ | false => f (get a pos) (get b pos); iter2_aux f a b (Int.add pos 1) (Int.sub len 1)
+ end.
+
+Ltac2 rec iter2 (f : 'a -> 'b -> unit) (a : 'a array) (b : 'b array) :=
+ Control.assert_valid_argument "Array.iter2" (Int.equal (length a) (length b));
+ iter2_aux f a b 0 (length a).
+
+Ltac2 map (f : 'a -> 'b) (a : 'a array) :=
+ init (length a) (fun i => f (get a i)).
+
+Ltac2 map2 (f : 'a -> 'b -> 'c) (a : 'a array) (b : 'b array) :=
+ Control.assert_valid_argument "Array.map2" (Int.equal (length a) (length b));
+ init (length a) (fun i => f (get a i) (get b i)).
+
+Ltac2 rec iteri_aux (f : int -> 'a -> unit) (a : 'a array) (pos : int) (len : int) :=
+ match Int.equal len 0 with
+ | true => ()
+ | false => f pos (get a pos); iteri_aux f a (Int.add pos 1) (Int.sub len 1)
+ end.
+
+Ltac2 iteri (f : int -> 'a -> unit) (a : 'a array) := iteri_aux f a 0 (length a).
+
+Ltac2 mapi (f : int -> 'a -> 'b) (a : 'a array) :=
+ init (length a) (fun i => f i (get a i)).
+
+Ltac2 rec to_list_aux (a : 'a array) (pos : int) (len : int) :=
+ match Int.equal len 0 with
+ | true => []
+ | false => get a pos :: to_list_aux a (Int.add pos 1) (Int.sub len 1)
+ end.
+
+Ltac2 to_list (a : 'a array) := to_list_aux a 0 (length a).
+
+Ltac2 rec of_list_aux (ls : 'a list) (dst : 'a array) (pos : int) :=
+ match ls with
+ | [] => ()
+ | hd::tl =>
+ set dst pos hd;
+ of_list_aux tl dst (Int.add pos 1)
+ end.
+
+Ltac2 of_list (ls : 'a list) :=
+ (* Don't use List.length here because the List module might depend on Array some day *)
+ let rec list_length (ls : 'a list) :=
+ match ls with
+ | [] => 0
+ | _ :: tl => Int.add 1 (list_length tl)
+ end in
+ match ls with
+ | [] => empty ()
+ | hd::tl =>
+ let anew := make (list_length ls) hd in
+ of_list_aux ls anew 0;
+ anew
+ end.
+
+Ltac2 rec fold_left_aux (f : 'a -> 'b -> 'a) (x : 'a) (a : 'b array) (pos : int) (len : int) :=
+ match Int.equal len 0 with
+ | true => x
+ | false => fold_left_aux f (f x (get a pos)) a (Int.add pos 1) (Int.sub len 1)
+ end.
+
+Ltac2 fold_left (f : 'a -> 'b -> 'a) (x : 'a) (a : 'b array) := fold_left_aux f x a 0 (length a).
+
+Ltac2 rec fold_right_aux (f : 'a -> 'b -> 'a) (x : 'a) (a : 'b array) (pos : int) (len : int) :=
+ (* Note: one could compare pos<0.
+ We keep an extra len parameter so that the function can be used for any sub array *)
+ match Int.equal len 0 with
+ | true => x
+ | false => fold_right_aux f (f x (get a pos)) a (Int.sub pos 1) (Int.sub len 1)
+ end.
+
+Ltac2 fold_right (f : 'a -> 'b -> 'a) (x : 'a) (a : 'b array) := fold_right_aux f x a (Int.sub (length a) 1) (length a).
+
+Ltac2 rec exist_aux (p : 'a -> bool) (a : 'a array) (pos : int) (len : int) :=
+ match Int.equal len 0 with
+ | true => false
+ | false => match p (get a pos) with
+ | true => true
+ | false => exist_aux p a (Int.add pos 1) (Int.sub len 1)
+ end
+ end.
+
+(* Note: named exist (as in Coq library) rather than exists cause exists is a notation *)
+Ltac2 exist (p : 'a -> bool) (a : 'a array) := exist_aux p a 0 (length a).
+
+Ltac2 rec for_all_aux (p : 'a -> bool) (a : 'a array) (pos : int) (len : int) :=
+ match Int.equal len 0 with
+ | true => true
+ | false => match p (get a pos) with
+ | true => for_all_aux p a (Int.add pos 1) (Int.sub len 1)
+ | false => false
+ end
+ end.
+
+Ltac2 for_all (p : 'a -> bool) (a : 'a array) := for_all_aux p a 0 (length a).
+
+(* Note: we don't have (yet) a generic equality function in Ltac2 *)
+Ltac2 mem (eq : 'a -> 'a -> bool) (x : 'a) (a : 'a array) :=
+ exist (eq x) a.
diff --git a/user-contrib/Ltac2/tac2core.ml b/user-contrib/Ltac2/tac2core.ml
index 55cd7f7692..431589aa30 100644
--- a/user-contrib/Ltac2/tac2core.ml
+++ b/user-contrib/Ltac2/tac2core.ml
@@ -213,6 +213,14 @@ let define3 name r0 r1 r2 f = define_primitive name (arity_suc (arity_suc arity_
f (Value.repr_to r0 x) (Value.repr_to r1 y) (Value.repr_to r2 z)
end
+let define4 name r0 r1 r2 r3 f = define_primitive name (arity_suc (arity_suc (arity_suc arity_one))) begin fun x0 x1 x2 x3 ->
+ f (Value.repr_to r0 x0) (Value.repr_to r1 x1) (Value.repr_to r2 x2) (Value.repr_to r3 x3)
+end
+
+let define5 name r0 r1 r2 r3 r4 f = define_primitive name (arity_suc (arity_suc (arity_suc (arity_suc arity_one)))) begin fun x0 x1 x2 x3 x4 ->
+ f (Value.repr_to r0 x0) (Value.repr_to r1 x1) (Value.repr_to r2 x2) (Value.repr_to r3 x3) (Value.repr_to r4 x4)
+end
+
(** Printing *)
let () = define1 "print" pp begin fun pp ->
@@ -253,6 +261,10 @@ end
(** Array *)
+let () = define0 "array_empty" begin
+ return (v_blk 0 (Array.of_list []))
+end
+
let () = define2 "array_make" int valexpr begin fun n x ->
if n < 0 || n > Sys.max_array_length then throw err_outofbounds
else wrap (fun () -> v_blk 0 (Array.make n x))
@@ -272,6 +284,20 @@ let () = define2 "array_get" block int begin fun (_, v) n ->
else wrap (fun () -> v.(n))
end
+let () = define5 "array_blit" block int block int int begin fun (_, v0) s0 (_, v1) s1 l ->
+ if s0 < 0 || s0+l > Array.length v0 || s1 < 0 || s1+l > Array.length v1 || l<0 then throw err_outofbounds
+ else wrap_unit (fun () -> Array.blit v0 s0 v1 s1 l)
+end
+
+let () = define4 "array_fill" block int int valexpr begin fun (_, d) s l v ->
+ if s < 0 || s+l > Array.length d || l<0 then throw err_outofbounds
+ else wrap_unit (fun () -> Array.fill d s l v)
+end
+
+let () = define1 "array_concat" (list block) begin fun l ->
+ wrap (fun () -> v_blk 0 (Array.concat (List.map snd l)))
+end
+
(** Ident *)
let () = define2 "ident_equal" ident ident begin fun id1 id2 ->
diff --git a/user-contrib/Ltac2/tac2tactics.ml b/user-contrib/Ltac2/tac2tactics.ml
index 561bd9c0c5..8a14be9ca7 100644
--- a/user-contrib/Ltac2/tac2tactics.ml
+++ b/user-contrib/Ltac2/tac2tactics.ml
@@ -33,6 +33,7 @@ let delayed_of_tactic tac env sigma =
let _, pv = Proofview.init sigma [] in
let name, poly = Id.of_string "ltac2_delayed", false in
let c, pv, _, _ = Proofview.apply ~name ~poly env tac pv in
+ let _, sigma = Proofview.proofview pv in
(sigma, c)
let delayed_of_thunk r tac env sigma =
diff --git a/vernac/auto_ind_decl.ml b/vernac/auto_ind_decl.ml
index f954915cf8..6bdb3159cf 100644
--- a/vernac/auto_ind_decl.ml
+++ b/vernac/auto_ind_decl.ml
@@ -395,7 +395,7 @@ let do_replace_lb mode lb_scheme_key aavoid narg p q =
in
Proofview.Goal.enter begin fun gl ->
- let type_of_pq = Tacmach.New.pf_unsafe_type_of gl p in
+ let type_of_pq = Tacmach.New.pf_get_type_of gl p in
let sigma = Tacmach.New.project gl in
let env = Tacmach.New.pf_env gl in
let u,v = destruct_ind env sigma type_of_pq
@@ -458,11 +458,11 @@ let do_replace_bl bl_scheme_key (ind,u as indu) aavoid narg lft rgt =
match (l1,l2) with
| (t1::q1,t2::q2) ->
Proofview.Goal.enter begin fun gl ->
- let tt1 = Tacmach.New.pf_unsafe_type_of gl t1 in
let sigma = Tacmach.New.project gl in
let env = Tacmach.New.pf_env gl in
if EConstr.eq_constr sigma t1 t2 then aux q1 q2
else (
+ let tt1 = Tacmach.New.pf_get_type_of gl t1 in
let u,v = try destruct_ind env sigma tt1
(* trick so that the good sequence is returned*)
with e when CErrors.noncritical e -> indu,[||]
diff --git a/vernac/comCoercion.ml b/vernac/comCoercion.ml
index 56ab6f289d..2c582da495 100644
--- a/vernac/comCoercion.ml
+++ b/vernac/comCoercion.ml
@@ -198,10 +198,9 @@ let build_id_coercion idf_opt source poly =
lams
in
(* juste pour verification *)
- let _ =
- if not
- (Reductionops.is_conv_leq env sigma
- (Typing.unsafe_type_of env sigma (EConstr.of_constr val_f)) (EConstr.of_constr typ_f))
+ let sigma, val_t = Typing.type_of env sigma (EConstr.of_constr val_f) in
+ let () =
+ if not (Reductionops.is_conv_leq env sigma val_t (EConstr.of_constr typ_f))
then
user_err (strbrk
"Cannot be defined as coercion (maybe a bad number of arguments).")
diff --git a/vernac/comProgramFixpoint.ml b/vernac/comProgramFixpoint.ml
index d48e2139d1..84f8578ad4 100644
--- a/vernac/comProgramFixpoint.ml
+++ b/vernac/comProgramFixpoint.ml
@@ -127,7 +127,7 @@ let build_wellfounded (recname,pl,bl,arityc,body) poly r measure notation =
let binders = letbinders @ [arg] in
let binders_env = push_rel_context binders_rel env in
let sigma, (rel, _) = interp_constr_evars_impls ~program_mode:true env sigma r in
- let relty = Typing.unsafe_type_of env sigma rel in
+ let relty = Retyping.get_type_of env sigma rel in
let relargty =
let error () =
user_err ?loc:(constr_loc r)
diff --git a/vernac/himsg.ml b/vernac/himsg.ml
index eb39564fed..17c3e0395a 100644
--- a/vernac/himsg.ml
+++ b/vernac/himsg.ml
@@ -1216,8 +1216,12 @@ let error_bad_entry () =
let error_large_non_prop_inductive_not_in_type () =
str "Large non-propositional inductive types must be in Type."
-let error_inductive_bad_univs () =
- str "Incorrect universe constraints declared for inductive type."
+let error_inductive_missing_constraints (us,ind_univ) =
+ let pr_u = Univ.Universe.pr_with UnivNames.pr_with_global_universes in
+ str "Missing universe constraint declared for inductive type:" ++ spc()
+ ++ v 0 (prlist_with_sep spc (fun u ->
+ hov 0 (pr_u u ++ str " <= " ++ pr_u ind_univ))
+ (Univ.Universe.Set.elements us))
(* Recursion schemes errors *)
@@ -1256,7 +1260,7 @@ let explain_inductive_error = function
| BadEntry -> error_bad_entry ()
| LargeNonPropInductiveNotInType ->
error_large_non_prop_inductive_not_in_type ()
- | BadUnivs -> error_inductive_bad_univs ()
+ | MissingConstraints csts -> error_inductive_missing_constraints csts
(* Recursion schemes errors *)
diff --git a/vernac/metasyntax.ml b/vernac/metasyntax.ml
index 05e23164b1..0c39aba70a 100644
--- a/vernac/metasyntax.ml
+++ b/vernac/metasyntax.ml
@@ -126,7 +126,7 @@ let parse_format ({CAst.loc;v=str} : lstring) =
let rec parse_non_format i =
let n = nonspaces false 0 i in
push_token (make_loc i (i+n-1)) (UnpTerminal (String.sub str i n)) (parse_token 1 (i+n))
- and parse_quoted n i =
+ and parse_quoted n k i =
if i < len then match str.[i] with
(* Parse " // " *)
| '/' when i+1 < len && str.[i+1] == '/' ->
@@ -140,7 +140,7 @@ let parse_format ({CAst.loc;v=str} : lstring) =
(parse_token 1 (close_quotation i (i+p+1)))
| c ->
(* The spaces are real spaces *)
- push_white i n (match c with
+ push_white (i-n-1-k) n (match c with
| '[' ->
if i+1 < len then match str.[i+1] with
(* Parse " [h .. ", *)
@@ -177,7 +177,7 @@ let parse_format ({CAst.loc;v=str} : lstring) =
push_white (i-n) (n-k) (push_token (make_loc i (i+1)) (UnpTerminal "'") (parse_token 1 (i+1)))
(* Parse the beginning of a quoted expression *)
| '\'' ->
- parse_quoted (n-k) (i+1)
+ parse_quoted (n-k) k (i+1)
(* Otherwise *)
| _ ->
push_white (i-n) (n-k) (parse_non_format i)
@@ -477,6 +477,9 @@ let warn_format_break =
(fun () ->
strbrk "Discarding format implicitly indicated by multiple spaces in notation because an explicit format modifier is given.")
+let has_ldots l =
+ List.exists (function (_,UnpTerminal s) -> String.equal s (Id.to_string Notation_ops.ldots_var) | _ -> false) l
+
let rec split_format_at_ldots hd = function
| (loc,UnpTerminal s) :: fmt when String.equal s (Id.to_string Notation_ops.ldots_var) -> loc, List.rev hd, fmt
| u :: fmt ->
@@ -504,11 +507,32 @@ let find_prod_list_loc sfmt fmt =
(* A separator; we highlight the separating sequence *)
Loc.merge_opt (fst (List.hd sfmt)) (fst (List.last sfmt))
+let is_blank s =
+ let n = String.length s in
+ let rec aux i s = i >= n || s.[i] = ' ' && aux (i+1) s in
+ aux 0 s
+
+let is_formatting = function
+ | (_,UnpCut _) -> true
+ | (_,UnpTerminal s) -> is_blank s
+ | _ -> false
+
+let rec is_var_in_recursive_format = function
+ | (_,UnpTerminal s) when not (is_blank s) -> true
+ | (loc,UnpBox (b,l)) ->
+ (match List.filter (fun a -> not (is_formatting a)) l with
+ | [a] -> is_var_in_recursive_format a
+ | _ -> error_not_same ?loc ())
+ | _ -> false
+
+let rec check_eq_var_upto_name = function
+ | (_,UnpTerminal s1), (_,UnpTerminal s2) when not (is_blank s1 && is_blank s2) || s1 = s2 -> ()
+ | (_,UnpBox (b1,l1)), (_,UnpBox (b2,l2)) when b1 = b2 -> List.iter check_eq_var_upto_name (List.combine l1 l2)
+ | (_,UnpCut b1), (_,UnpCut b2) when b1 = b2 -> ()
+ | _, (loc,_) -> error_not_same ?loc ()
+
let skip_var_in_recursive_format = function
- | (_,UnpTerminal s) :: sl (* skip first var *) when not (List.for_all (fun c -> c = " ") (String.explode s)) ->
- (* To do, though not so important: check that the names match
- the names in the notation *)
- sl
+ | a :: sl when is_var_in_recursive_format a -> a, sl
| (loc,_) :: _ -> error_not_same ?loc ()
| [] -> assert false
@@ -516,15 +540,20 @@ let read_recursive_format sl fmt =
(* Turn [[UnpTerminal s :: some-list @ UnpTerminal ".." :: same-some-list @ UnpTerminal s' :: rest] *)
(* into [(some-list,rest)] *)
let get_head fmt =
- let sl = skip_var_in_recursive_format fmt in
- try split_format_at_ldots [] sl with Exit -> error_not_same ?loc:(fst (List.last (if sl = [] then fmt else sl))) () in
+ let var,sl = skip_var_in_recursive_format fmt in
+ try var, split_format_at_ldots [] sl
+ with Exit -> error_not_same ?loc:(fst (List.last (if sl = [] then fmt else sl))) () in
let rec get_tail = function
| (loc,a) :: sepfmt, (_,b) :: fmt when (=) a b -> get_tail (sepfmt, fmt) (* FIXME *)
| [], tail -> skip_var_in_recursive_format tail
| (loc,_) :: _, ([] | (_,UnpTerminal _) :: _)-> error_not_same ?loc ()
| _, (loc,_)::_ -> error_not_same ?loc () in
- let loc, slfmt, fmt = get_head fmt in
- slfmt, get_tail (slfmt, fmt)
+ let var1, (loc, slfmt, fmt) = get_head fmt in
+ let var2, res = get_tail (slfmt, fmt) in
+ check_eq_var_upto_name (var1,var2);
+ (* To do, though not so important: check that the names match
+ the names in the notation *)
+ slfmt, res
let hunks_of_format (from,(vars,typs)) symfmt =
let rec aux = function
@@ -537,13 +566,9 @@ let hunks_of_format (from,(vars,typs)) symfmt =
| NonTerminal s :: symbs, (_,UnpTerminal s') :: fmt when Id.equal s (Id.of_string s') ->
let i = index_id s vars in
let symbs, l = aux (symbs,fmt) in symbs, unparsing_metavar i from typs :: l
- | symbs, (_,UnpBox (a,b)) :: fmt ->
- let symbs', b' = aux (symbs,b) in
- let symbs', l = aux (symbs',fmt) in
- symbs', UnpBox (a,List.map (fun x -> (None,x)) b') :: l
| symbs, (_,(UnpCut _ as u)) :: fmt ->
let symbs, l = aux (symbs,fmt) in symbs, u :: l
- | SProdList (m,sl) :: symbs, fmt ->
+ | SProdList (m,sl) :: symbs, fmt when has_ldots fmt ->
let i = index_id m vars in
let typ = List.nth typs (i-1) in
let _,prec = precedence_of_entry_type from typ in
@@ -558,6 +583,10 @@ let hunks_of_format (from,(vars,typs)) symfmt =
UnpBinderListMetaVar (i,isopen,slfmt)
| _ -> assert false in
symbs, hunk :: l
+ | symbs, (_,UnpBox (a,b)) :: fmt ->
+ let symbs', b' = aux (symbs,b) in
+ let symbs', l = aux (symbs',fmt) in
+ symbs', UnpBox (a,List.map (fun x -> (None,x)) b') :: l
| symbs, [] -> symbs, []
| Break _ :: symbs, fmt -> warn_format_break (); aux (symbs,fmt)
| _, fmt -> error_format ?loc:(fst (List.hd fmt)) ()