aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.depend1053
-rw-r--r--Makefile11
-rw-r--r--contrib/omega/coq_omega.ml161
-rw-r--r--contrib/ring/quote.ml1
-rw-r--r--dev/changements.txt1
-rw-r--r--dev/top_printers.ml8
-rw-r--r--kernel/abstraction.ml2
-rw-r--r--kernel/closure.ml366
-rw-r--r--kernel/closure.mli78
-rw-r--r--kernel/declarations.ml2
-rw-r--r--kernel/environ.ml51
-rw-r--r--kernel/environ.mli1
-rw-r--r--kernel/indtypes.ml93
-rw-r--r--kernel/inductive.ml2
-rw-r--r--kernel/instantiate.ml2
-rw-r--r--kernel/reduction.ml716
-rw-r--r--kernel/reduction.mli20
-rw-r--r--kernel/safe_typing.ml12
-rw-r--r--kernel/sign.ml51
-rw-r--r--kernel/sign.mli2
-rw-r--r--kernel/sosub.ml34
-rw-r--r--kernel/sosub.mli2
-rw-r--r--kernel/term.ml1193
-rw-r--r--kernel/term.mli192
-rw-r--r--kernel/type_errors.ml24
-rw-r--r--kernel/type_errors.mli25
-rw-r--r--kernel/typeops.ml338
-rw-r--r--library/declare.ml2
-rw-r--r--library/global.ml2
-rw-r--r--library/impargs.ml2
-rw-r--r--library/indrec.ml49
-rw-r--r--parsing/astterm.ml27
-rw-r--r--parsing/g_basevernac.ml428
-rw-r--r--parsing/g_constr.ml411
-rw-r--r--parsing/pattern.ml84
-rw-r--r--parsing/pattern.mli1
-rw-r--r--parsing/pretty.ml22
-rw-r--r--parsing/termast.ml131
-rw-r--r--pretyping/cases.ml59
-rw-r--r--pretyping/class.ml43
-rwxr-xr-xpretyping/classops.ml29
-rw-r--r--pretyping/coercion.ml27
-rw-r--r--pretyping/detyping.ml121
-rw-r--r--pretyping/evarconv.ml135
-rw-r--r--pretyping/evarutil.ml96
-rw-r--r--pretyping/pretyping.ml82
-rwxr-xr-xpretyping/recordops.ml2
-rwxr-xr-xpretyping/recordops.mli2
-rw-r--r--pretyping/retyping.ml27
-rw-r--r--pretyping/tacred.ml195
-rw-r--r--pretyping/typing.ml12
-rw-r--r--proofs/clenv.ml378
-rw-r--r--proofs/evar_refiner.ml34
-rw-r--r--proofs/evar_refiner.mli4
-rw-r--r--proofs/logic.ml197
-rw-r--r--proofs/pfedit.ml2
-rw-r--r--proofs/refiner.ml4
-rw-r--r--proofs/tacinterp.ml2
-rw-r--r--proofs/tacmach.ml4
-rw-r--r--proofs/tacmach.mli4
-rwxr-xr-xsyntax/PPConstr.v1
61 files changed, 3352 insertions, 2908 deletions
diff --git a/.depend b/.depend
index 6de79fd64..b29eba609 100644
--- a/.depend
+++ b/.depend
@@ -1,13 +1,12 @@
kernel/abstraction.cmi: kernel/names.cmi kernel/term.cmi
-kernel/closure.cmi: kernel/environ.cmi kernel/evd.cmi kernel/generic.cmi \
- kernel/names.cmi lib/pp.cmi kernel/term.cmi
+kernel/closure.cmi: kernel/environ.cmi kernel/evd.cmi kernel/names.cmi \
+ lib/pp.cmi kernel/term.cmi
kernel/declarations.cmi: kernel/names.cmi kernel/sign.cmi kernel/term.cmi \
kernel/univ.cmi
kernel/environ.cmi: kernel/abstraction.cmi kernel/declarations.cmi \
kernel/names.cmi kernel/sign.cmi kernel/term.cmi kernel/univ.cmi
kernel/evd.cmi: kernel/environ.cmi kernel/names.cmi kernel/sign.cmi \
kernel/term.cmi
-kernel/generic.cmi: kernel/names.cmi lib/util.cmi
kernel/indtypes.cmi: kernel/declarations.cmi kernel/environ.cmi \
kernel/names.cmi kernel/sign.cmi kernel/term.cmi kernel/univ.cmi
kernel/inductive.cmi: kernel/declarations.cmi kernel/environ.cmi \
@@ -17,15 +16,13 @@ kernel/instantiate.cmi: kernel/environ.cmi kernel/evd.cmi kernel/names.cmi \
kernel/sign.cmi kernel/term.cmi
kernel/names.cmi: lib/pp.cmi
kernel/reduction.cmi: kernel/closure.cmi kernel/environ.cmi kernel/evd.cmi \
- kernel/generic.cmi kernel/names.cmi kernel/sign.cmi kernel/term.cmi \
- kernel/univ.cmi
+ kernel/names.cmi kernel/sign.cmi kernel/term.cmi kernel/univ.cmi
kernel/safe_typing.cmi: kernel/declarations.cmi kernel/environ.cmi \
kernel/inductive.cmi kernel/names.cmi lib/pp.cmi kernel/sign.cmi \
kernel/term.cmi kernel/typeops.cmi kernel/univ.cmi
-kernel/sign.cmi: kernel/generic.cmi kernel/names.cmi kernel/term.cmi
+kernel/sign.cmi: kernel/names.cmi kernel/term.cmi
kernel/sosub.cmi: kernel/term.cmi
-kernel/term.cmi: kernel/generic.cmi kernel/names.cmi lib/pp.cmi \
- kernel/univ.cmi
+kernel/term.cmi: kernel/names.cmi lib/pp.cmi kernel/univ.cmi lib/util.cmi
kernel/type_errors.cmi: kernel/environ.cmi kernel/evd.cmi kernel/names.cmi \
lib/pp.cmi kernel/sign.cmi kernel/term.cmi
kernel/typeops.cmi: kernel/environ.cmi kernel/evd.cmi kernel/inductive.cmi \
@@ -37,7 +34,7 @@ library/declare.cmi: kernel/declarations.cmi kernel/environ.cmi \
library/global.cmi: kernel/declarations.cmi kernel/environ.cmi \
kernel/inductive.cmi kernel/names.cmi kernel/safe_typing.cmi \
kernel/sign.cmi kernel/term.cmi kernel/univ.cmi
-library/goptions.cmi: kernel/names.cmi
+library/goptions.cmi: kernel/names.cmi lib/pp.cmi
library/impargs.cmi: kernel/inductive.cmi kernel/names.cmi kernel/term.cmi
library/indrec.cmi: kernel/declarations.cmi kernel/environ.cmi kernel/evd.cmi \
kernel/inductive.cmi kernel/names.cmi kernel/term.cmi
@@ -100,9 +97,8 @@ pretyping/pretyping.cmi: kernel/environ.cmi pretyping/evarutil.cmi \
kernel/evd.cmi kernel/names.cmi pretyping/rawterm.cmi kernel/sign.cmi \
kernel/term.cmi
pretyping/rawterm.cmi: kernel/names.cmi kernel/sign.cmi kernel/term.cmi
-pretyping/recordops.cmi: pretyping/classops.cmi kernel/generic.cmi \
- library/libobject.cmi library/library.cmi kernel/names.cmi \
- kernel/term.cmi
+pretyping/recordops.cmi: pretyping/classops.cmi library/libobject.cmi \
+ library/library.cmi kernel/names.cmi kernel/term.cmi
pretyping/retyping.cmi: kernel/environ.cmi kernel/evd.cmi kernel/names.cmi \
kernel/term.cmi
pretyping/syntax_def.cmi: kernel/names.cmi pretyping/rawterm.cmi
@@ -141,7 +137,7 @@ tactics/auto.cmi: tactics/btermdn.cmi proofs/clenv.cmi parsing/coqast.cmi \
kernel/names.cmi parsing/pattern.cmi proofs/proof_type.cmi \
pretyping/rawterm.cmi kernel/sign.cmi proofs/tacmach.cmi kernel/term.cmi \
lib/util.cmi
-tactics/btermdn.cmi: kernel/generic.cmi parsing/pattern.cmi kernel/term.cmi
+tactics/btermdn.cmi: parsing/pattern.cmi kernel/term.cmi
tactics/dhyp.cmi: kernel/names.cmi proofs/tacmach.cmi
tactics/elim.cmi: kernel/names.cmi proofs/proof_type.cmi proofs/tacmach.cmi \
tactics/tacticals.cmi kernel/term.cmi
@@ -156,8 +152,7 @@ tactics/hipattern.cmi: kernel/evd.cmi kernel/names.cmi parsing/pattern.cmi \
proofs/proof_trees.cmi kernel/sign.cmi proofs/stock.cmi kernel/term.cmi \
lib/util.cmi
tactics/inv.cmi: parsing/coqast.cmi kernel/names.cmi proofs/tacmach.cmi
-tactics/nbtermdn.cmi: tactics/btermdn.cmi kernel/generic.cmi \
- parsing/pattern.cmi kernel/term.cmi
+tactics/nbtermdn.cmi: tactics/btermdn.cmi parsing/pattern.cmi kernel/term.cmi
tactics/refine.cmi: proofs/tacmach.cmi kernel/term.cmi
tactics/tacentries.cmi: proofs/proof_type.cmi proofs/tacmach.cmi
tactics/tacticals.cmi: proofs/clenv.cmi parsing/coqast.cmi kernel/names.cmi \
@@ -168,7 +163,7 @@ tactics/tactics.cmi: proofs/clenv.cmi kernel/environ.cmi kernel/evd.cmi \
proofs/tacmach.cmi pretyping/tacred.cmi tactics/tacticals.cmi \
kernel/term.cmi
tactics/tauto.cmi: proofs/tacmach.cmi kernel/term.cmi
-tactics/termdn.cmi: kernel/generic.cmi parsing/pattern.cmi kernel/term.cmi
+tactics/termdn.cmi: parsing/pattern.cmi kernel/term.cmi
tactics/wcclausenv.cmi: proofs/clenv.cmi kernel/environ.cmi kernel/evd.cmi \
kernel/names.cmi proofs/proof_type.cmi kernel/sign.cmi proofs/tacmach.cmi \
kernel/term.cmi
@@ -197,101 +192,95 @@ config/coq_config.cmx: config/coq_config.cmi
dev/db_printers.cmo: kernel/names.cmi lib/pp.cmi
dev/db_printers.cmx: kernel/names.cmx lib/pp.cmx
dev/top_printers.cmo: parsing/ast.cmi parsing/astterm.cmi proofs/clenv.cmi \
- toplevel/command.cmi kernel/environ.cmi kernel/evd.cmi kernel/generic.cmi \
- kernel/names.cmi lib/pp.cmi parsing/printer.cmi proofs/proof_trees.cmi \
- proofs/refiner.cmi kernel/sign.cmi lib/system.cmi proofs/tacmach.cmi \
- kernel/term.cmi parsing/termast.cmi kernel/univ.cmi \
- toplevel/vernacentries.cmi toplevel/vernacinterp.cmi
+ toplevel/command.cmi kernel/environ.cmi kernel/evd.cmi kernel/names.cmi \
+ lib/pp.cmi parsing/printer.cmi proofs/proof_trees.cmi proofs/refiner.cmi \
+ kernel/sign.cmi lib/system.cmi proofs/tacmach.cmi kernel/term.cmi \
+ parsing/termast.cmi kernel/univ.cmi toplevel/vernacentries.cmi \
+ toplevel/vernacinterp.cmi
dev/top_printers.cmx: parsing/ast.cmx parsing/astterm.cmx proofs/clenv.cmx \
- toplevel/command.cmx kernel/environ.cmx kernel/evd.cmx kernel/generic.cmx \
- kernel/names.cmx lib/pp.cmx parsing/printer.cmx proofs/proof_trees.cmx \
- proofs/refiner.cmx kernel/sign.cmx lib/system.cmx proofs/tacmach.cmx \
- kernel/term.cmx parsing/termast.cmx kernel/univ.cmx \
- toplevel/vernacentries.cmx toplevel/vernacinterp.cmx
-kernel/abstraction.cmo: kernel/generic.cmi kernel/names.cmi kernel/sosub.cmi \
- kernel/term.cmi lib/util.cmi kernel/abstraction.cmi
-kernel/abstraction.cmx: kernel/generic.cmx kernel/names.cmx kernel/sosub.cmx \
- kernel/term.cmx lib/util.cmx kernel/abstraction.cmi
+ toplevel/command.cmx kernel/environ.cmx kernel/evd.cmx kernel/names.cmx \
+ lib/pp.cmx parsing/printer.cmx proofs/proof_trees.cmx proofs/refiner.cmx \
+ kernel/sign.cmx lib/system.cmx proofs/tacmach.cmx kernel/term.cmx \
+ parsing/termast.cmx kernel/univ.cmx toplevel/vernacentries.cmx \
+ toplevel/vernacinterp.cmx
+kernel/abstraction.cmo: kernel/names.cmi kernel/sosub.cmi kernel/term.cmi \
+ lib/util.cmi kernel/abstraction.cmi
+kernel/abstraction.cmx: kernel/names.cmx kernel/sosub.cmx kernel/term.cmx \
+ lib/util.cmx kernel/abstraction.cmi
kernel/closure.cmo: kernel/declarations.cmi kernel/environ.cmi kernel/evd.cmi \
- kernel/generic.cmi kernel/instantiate.cmi kernel/names.cmi lib/pp.cmi \
- kernel/term.cmi kernel/univ.cmi lib/util.cmi kernel/closure.cmi
+ kernel/instantiate.cmi kernel/names.cmi lib/pp.cmi kernel/term.cmi \
+ kernel/univ.cmi lib/util.cmi kernel/closure.cmi
kernel/closure.cmx: kernel/declarations.cmx kernel/environ.cmx kernel/evd.cmx \
- kernel/generic.cmx kernel/instantiate.cmx kernel/names.cmx lib/pp.cmx \
- kernel/term.cmx kernel/univ.cmx lib/util.cmx kernel/closure.cmi
-kernel/declarations.cmo: kernel/generic.cmi kernel/names.cmi kernel/sign.cmi \
- kernel/term.cmi kernel/univ.cmi kernel/declarations.cmi
-kernel/declarations.cmx: kernel/generic.cmx kernel/names.cmx kernel/sign.cmx \
- kernel/term.cmx kernel/univ.cmx kernel/declarations.cmi
+ kernel/instantiate.cmx kernel/names.cmx lib/pp.cmx kernel/term.cmx \
+ kernel/univ.cmx lib/util.cmx kernel/closure.cmi
+kernel/declarations.cmo: kernel/names.cmi kernel/sign.cmi kernel/term.cmi \
+ kernel/univ.cmi kernel/declarations.cmi
+kernel/declarations.cmx: kernel/names.cmx kernel/sign.cmx kernel/term.cmx \
+ kernel/univ.cmx kernel/declarations.cmi
kernel/environ.cmo: kernel/abstraction.cmi kernel/declarations.cmi \
- kernel/generic.cmi kernel/names.cmi lib/pp.cmi kernel/sign.cmi \
- kernel/term.cmi kernel/univ.cmi lib/util.cmi kernel/environ.cmi
+ kernel/names.cmi lib/pp.cmi kernel/sign.cmi kernel/term.cmi \
+ kernel/univ.cmi lib/util.cmi kernel/environ.cmi
kernel/environ.cmx: kernel/abstraction.cmx kernel/declarations.cmx \
- kernel/generic.cmx kernel/names.cmx lib/pp.cmx kernel/sign.cmx \
- kernel/term.cmx kernel/univ.cmx lib/util.cmx kernel/environ.cmi
+ kernel/names.cmx lib/pp.cmx kernel/sign.cmx kernel/term.cmx \
+ kernel/univ.cmx lib/util.cmx kernel/environ.cmi
kernel/evd.cmo: kernel/environ.cmi kernel/names.cmi kernel/sign.cmi \
kernel/term.cmi lib/util.cmi kernel/evd.cmi
kernel/evd.cmx: kernel/environ.cmx kernel/names.cmx kernel/sign.cmx \
kernel/term.cmx lib/util.cmx kernel/evd.cmi
-kernel/generic.cmo: kernel/names.cmi lib/pp.cmi lib/util.cmi \
- kernel/generic.cmi
-kernel/generic.cmx: kernel/names.cmx lib/pp.cmx lib/util.cmx \
- kernel/generic.cmi
kernel/indtypes.cmo: kernel/declarations.cmi kernel/environ.cmi \
- kernel/evd.cmi kernel/generic.cmi kernel/inductive.cmi \
- kernel/instantiate.cmi kernel/names.cmi kernel/reduction.cmi \
- kernel/sign.cmi kernel/term.cmi kernel/typeops.cmi lib/util.cmi \
- kernel/indtypes.cmi
+ kernel/evd.cmi kernel/inductive.cmi kernel/instantiate.cmi \
+ kernel/names.cmi kernel/reduction.cmi kernel/sign.cmi kernel/term.cmi \
+ kernel/typeops.cmi lib/util.cmi kernel/indtypes.cmi
kernel/indtypes.cmx: kernel/declarations.cmx kernel/environ.cmx \
- kernel/evd.cmx kernel/generic.cmx kernel/inductive.cmx \
- kernel/instantiate.cmx kernel/names.cmx kernel/reduction.cmx \
- kernel/sign.cmx kernel/term.cmx kernel/typeops.cmx lib/util.cmx \
- kernel/indtypes.cmi
+ kernel/evd.cmx kernel/inductive.cmx kernel/instantiate.cmx \
+ kernel/names.cmx kernel/reduction.cmx kernel/sign.cmx kernel/term.cmx \
+ kernel/typeops.cmx lib/util.cmx kernel/indtypes.cmi
kernel/inductive.cmo: kernel/declarations.cmi kernel/environ.cmi \
- kernel/generic.cmi kernel/instantiate.cmi kernel/names.cmi \
- kernel/reduction.cmi kernel/sign.cmi kernel/term.cmi kernel/univ.cmi \
- lib/util.cmi kernel/inductive.cmi
+ kernel/instantiate.cmi kernel/names.cmi kernel/reduction.cmi \
+ kernel/sign.cmi kernel/term.cmi kernel/univ.cmi lib/util.cmi \
+ kernel/inductive.cmi
kernel/inductive.cmx: kernel/declarations.cmx kernel/environ.cmx \
- kernel/generic.cmx kernel/instantiate.cmx kernel/names.cmx \
- kernel/reduction.cmx kernel/sign.cmx kernel/term.cmx kernel/univ.cmx \
- lib/util.cmx kernel/inductive.cmi
+ kernel/instantiate.cmx kernel/names.cmx kernel/reduction.cmx \
+ kernel/sign.cmx kernel/term.cmx kernel/univ.cmx lib/util.cmx \
+ kernel/inductive.cmi
kernel/instantiate.cmo: kernel/declarations.cmi kernel/environ.cmi \
- kernel/evd.cmi kernel/generic.cmi kernel/names.cmi lib/pp.cmi \
- kernel/sign.cmi kernel/term.cmi lib/util.cmi kernel/instantiate.cmi
+ kernel/evd.cmi kernel/names.cmi lib/pp.cmi kernel/sign.cmi \
+ kernel/term.cmi lib/util.cmi kernel/instantiate.cmi
kernel/instantiate.cmx: kernel/declarations.cmx kernel/environ.cmx \
- kernel/evd.cmx kernel/generic.cmx kernel/names.cmx lib/pp.cmx \
- kernel/sign.cmx kernel/term.cmx lib/util.cmx kernel/instantiate.cmi
+ kernel/evd.cmx kernel/names.cmx lib/pp.cmx kernel/sign.cmx \
+ kernel/term.cmx lib/util.cmx kernel/instantiate.cmi
kernel/names.cmo: lib/hashcons.cmi lib/pp.cmi lib/util.cmi kernel/names.cmi
kernel/names.cmx: lib/hashcons.cmx lib/pp.cmx lib/util.cmx kernel/names.cmi
kernel/reduction.cmo: kernel/closure.cmi kernel/declarations.cmi \
- kernel/environ.cmi kernel/evd.cmi kernel/generic.cmi \
- kernel/instantiate.cmi kernel/names.cmi lib/pp.cmi kernel/sign.cmi \
- kernel/term.cmi kernel/univ.cmi lib/util.cmi kernel/reduction.cmi
+ kernel/environ.cmi kernel/evd.cmi kernel/instantiate.cmi kernel/names.cmi \
+ lib/pp.cmi kernel/sign.cmi kernel/term.cmi kernel/univ.cmi lib/util.cmi \
+ kernel/reduction.cmi
kernel/reduction.cmx: kernel/closure.cmx kernel/declarations.cmx \
- kernel/environ.cmx kernel/evd.cmx kernel/generic.cmx \
- kernel/instantiate.cmx kernel/names.cmx lib/pp.cmx kernel/sign.cmx \
- kernel/term.cmx kernel/univ.cmx lib/util.cmx kernel/reduction.cmi
+ kernel/environ.cmx kernel/evd.cmx kernel/instantiate.cmx kernel/names.cmx \
+ lib/pp.cmx kernel/sign.cmx kernel/term.cmx kernel/univ.cmx lib/util.cmx \
+ kernel/reduction.cmi
kernel/safe_typing.cmo: kernel/declarations.cmi kernel/environ.cmi \
- kernel/evd.cmi kernel/generic.cmi kernel/indtypes.cmi \
- kernel/inductive.cmi kernel/names.cmi lib/pp.cmi kernel/reduction.cmi \
- kernel/sign.cmi kernel/term.cmi kernel/type_errors.cmi kernel/typeops.cmi \
- kernel/univ.cmi lib/util.cmi kernel/safe_typing.cmi
+ kernel/evd.cmi kernel/indtypes.cmi kernel/inductive.cmi kernel/names.cmi \
+ lib/pp.cmi kernel/reduction.cmi kernel/sign.cmi kernel/term.cmi \
+ kernel/type_errors.cmi kernel/typeops.cmi kernel/univ.cmi lib/util.cmi \
+ kernel/safe_typing.cmi
kernel/safe_typing.cmx: kernel/declarations.cmx kernel/environ.cmx \
- kernel/evd.cmx kernel/generic.cmx kernel/indtypes.cmx \
- kernel/inductive.cmx kernel/names.cmx lib/pp.cmx kernel/reduction.cmx \
- kernel/sign.cmx kernel/term.cmx kernel/type_errors.cmx kernel/typeops.cmx \
- kernel/univ.cmx lib/util.cmx kernel/safe_typing.cmi
-kernel/sign.cmo: kernel/generic.cmi kernel/names.cmi kernel/term.cmi \
- lib/util.cmi kernel/sign.cmi
-kernel/sign.cmx: kernel/generic.cmx kernel/names.cmx kernel/term.cmx \
- lib/util.cmx kernel/sign.cmi
-kernel/sosub.cmo: kernel/generic.cmi kernel/names.cmi kernel/term.cmi \
- lib/util.cmi kernel/sosub.cmi
-kernel/sosub.cmx: kernel/generic.cmx kernel/names.cmx kernel/term.cmx \
- lib/util.cmx kernel/sosub.cmi
-kernel/term.cmo: kernel/generic.cmi lib/hashcons.cmi kernel/names.cmi \
- lib/pp.cmi kernel/univ.cmi lib/util.cmi kernel/term.cmi
-kernel/term.cmx: kernel/generic.cmx lib/hashcons.cmx kernel/names.cmx \
- lib/pp.cmx kernel/univ.cmx lib/util.cmx kernel/term.cmi
+ kernel/evd.cmx kernel/indtypes.cmx kernel/inductive.cmx kernel/names.cmx \
+ lib/pp.cmx kernel/reduction.cmx kernel/sign.cmx kernel/term.cmx \
+ kernel/type_errors.cmx kernel/typeops.cmx kernel/univ.cmx lib/util.cmx \
+ kernel/safe_typing.cmi
+kernel/sign.cmo: kernel/names.cmi kernel/term.cmi lib/util.cmi \
+ kernel/sign.cmi
+kernel/sign.cmx: kernel/names.cmx kernel/term.cmx lib/util.cmx \
+ kernel/sign.cmi
+kernel/sosub.cmo: kernel/names.cmi kernel/term.cmi lib/util.cmi \
+ kernel/sosub.cmi
+kernel/sosub.cmx: kernel/names.cmx kernel/term.cmx lib/util.cmx \
+ kernel/sosub.cmi
+kernel/term.cmo: lib/hashcons.cmi kernel/names.cmi lib/pp.cmi kernel/univ.cmi \
+ lib/util.cmi kernel/term.cmi
+kernel/term.cmx: lib/hashcons.cmx kernel/names.cmx lib/pp.cmx kernel/univ.cmx \
+ lib/util.cmx kernel/term.cmi
kernel/type_errors.cmo: kernel/environ.cmi kernel/names.cmi lib/pp.cmi \
kernel/reduction.cmi kernel/sign.cmi kernel/term.cmi \
kernel/type_errors.cmi
@@ -299,15 +288,13 @@ kernel/type_errors.cmx: kernel/environ.cmx kernel/names.cmx lib/pp.cmx \
kernel/reduction.cmx kernel/sign.cmx kernel/term.cmx \
kernel/type_errors.cmi
kernel/typeops.cmo: kernel/declarations.cmi kernel/environ.cmi \
- kernel/generic.cmi kernel/inductive.cmi kernel/instantiate.cmi \
- kernel/names.cmi lib/pp.cmi kernel/reduction.cmi kernel/sign.cmi \
- kernel/term.cmi kernel/type_errors.cmi kernel/univ.cmi lib/util.cmi \
- kernel/typeops.cmi
+ kernel/inductive.cmi kernel/instantiate.cmi kernel/names.cmi lib/pp.cmi \
+ kernel/reduction.cmi kernel/sign.cmi kernel/term.cmi \
+ kernel/type_errors.cmi kernel/univ.cmi lib/util.cmi kernel/typeops.cmi
kernel/typeops.cmx: kernel/declarations.cmx kernel/environ.cmx \
- kernel/generic.cmx kernel/inductive.cmx kernel/instantiate.cmx \
- kernel/names.cmx lib/pp.cmx kernel/reduction.cmx kernel/sign.cmx \
- kernel/term.cmx kernel/type_errors.cmx kernel/univ.cmx lib/util.cmx \
- kernel/typeops.cmi
+ kernel/inductive.cmx kernel/instantiate.cmx kernel/names.cmx lib/pp.cmx \
+ kernel/reduction.cmx kernel/sign.cmx kernel/term.cmx \
+ kernel/type_errors.cmx kernel/univ.cmx lib/util.cmx kernel/typeops.cmi
kernel/univ.cmo: kernel/names.cmi lib/pp.cmi lib/util.cmi kernel/univ.cmi
kernel/univ.cmx: kernel/names.cmx lib/pp.cmx lib/util.cmx kernel/univ.cmi
lib/bij.cmo: lib/gmap.cmi lib/bij.cmi
@@ -335,49 +322,45 @@ lib/pp.cmx: lib/pp_control.cmx lib/pp.cmi
lib/profile.cmo: lib/system.cmi lib/profile.cmi
lib/profile.cmx: lib/system.cmx lib/profile.cmi
library/declare.cmo: kernel/declarations.cmi kernel/environ.cmi \
- kernel/evd.cmi kernel/generic.cmi library/global.cmi library/impargs.cmi \
- library/indrec.cmi kernel/inductive.cmi library/lib.cmi \
- library/libobject.cmi kernel/names.cmi library/nametab.cmi \
- lib/options.cmi lib/pp.cmi kernel/reduction.cmi kernel/sign.cmi \
- library/summary.cmi kernel/term.cmi kernel/type_errors.cmi \
- kernel/typeops.cmi lib/util.cmi library/declare.cmi
+ kernel/evd.cmi library/global.cmi library/impargs.cmi library/indrec.cmi \
+ kernel/inductive.cmi library/lib.cmi library/libobject.cmi \
+ kernel/names.cmi library/nametab.cmi lib/options.cmi lib/pp.cmi \
+ kernel/reduction.cmi kernel/sign.cmi library/summary.cmi kernel/term.cmi \
+ kernel/type_errors.cmi kernel/typeops.cmi lib/util.cmi \
+ library/declare.cmi
library/declare.cmx: kernel/declarations.cmx kernel/environ.cmx \
- kernel/evd.cmx kernel/generic.cmx library/global.cmx library/impargs.cmx \
- library/indrec.cmx kernel/inductive.cmx library/lib.cmx \
- library/libobject.cmx kernel/names.cmx library/nametab.cmx \
- lib/options.cmx lib/pp.cmx kernel/reduction.cmx kernel/sign.cmx \
- library/summary.cmx kernel/term.cmx kernel/type_errors.cmx \
- kernel/typeops.cmx lib/util.cmx library/declare.cmi
-library/global.cmo: kernel/environ.cmi kernel/generic.cmi \
- kernel/inductive.cmi kernel/instantiate.cmi kernel/safe_typing.cmi \
- kernel/sign.cmi library/summary.cmi kernel/term.cmi lib/util.cmi \
- library/global.cmi
-library/global.cmx: kernel/environ.cmx kernel/generic.cmx \
- kernel/inductive.cmx kernel/instantiate.cmx kernel/safe_typing.cmx \
- kernel/sign.cmx library/summary.cmx kernel/term.cmx lib/util.cmx \
- library/global.cmi
+ kernel/evd.cmx library/global.cmx library/impargs.cmx library/indrec.cmx \
+ kernel/inductive.cmx library/lib.cmx library/libobject.cmx \
+ kernel/names.cmx library/nametab.cmx lib/options.cmx lib/pp.cmx \
+ kernel/reduction.cmx kernel/sign.cmx library/summary.cmx kernel/term.cmx \
+ kernel/type_errors.cmx kernel/typeops.cmx lib/util.cmx \
+ library/declare.cmi
+library/global.cmo: kernel/environ.cmi kernel/inductive.cmi \
+ kernel/instantiate.cmi kernel/safe_typing.cmi kernel/sign.cmi \
+ library/summary.cmi kernel/term.cmi lib/util.cmi library/global.cmi
+library/global.cmx: kernel/environ.cmx kernel/inductive.cmx \
+ kernel/instantiate.cmx kernel/safe_typing.cmx kernel/sign.cmx \
+ library/summary.cmx kernel/term.cmx lib/util.cmx library/global.cmi
library/goptions.cmo: library/lib.cmi library/libobject.cmi kernel/names.cmi \
lib/pp.cmi library/summary.cmi lib/util.cmi library/goptions.cmi
library/goptions.cmx: library/lib.cmx library/libobject.cmx kernel/names.cmx \
lib/pp.cmx library/summary.cmx lib/util.cmx library/goptions.cmi
library/impargs.cmo: kernel/declarations.cmi kernel/evd.cmi \
- kernel/generic.cmi library/global.cmi kernel/inductive.cmi \
- kernel/names.cmi kernel/reduction.cmi library/summary.cmi kernel/term.cmi \
+ library/global.cmi kernel/inductive.cmi kernel/names.cmi \
+ kernel/reduction.cmi library/summary.cmi kernel/term.cmi \
library/impargs.cmi
library/impargs.cmx: kernel/declarations.cmx kernel/evd.cmx \
- kernel/generic.cmx library/global.cmx kernel/inductive.cmx \
- kernel/names.cmx kernel/reduction.cmx library/summary.cmx kernel/term.cmx \
+ library/global.cmx kernel/inductive.cmx kernel/names.cmx \
+ kernel/reduction.cmx library/summary.cmx kernel/term.cmx \
library/impargs.cmi
library/indrec.cmo: kernel/declarations.cmi kernel/environ.cmi \
- kernel/generic.cmi kernel/indtypes.cmi kernel/inductive.cmi \
- kernel/instantiate.cmi kernel/names.cmi lib/pp.cmi kernel/reduction.cmi \
- kernel/term.cmi kernel/type_errors.cmi kernel/typeops.cmi lib/util.cmi \
- library/indrec.cmi
+ kernel/indtypes.cmi kernel/inductive.cmi kernel/instantiate.cmi \
+ kernel/names.cmi lib/pp.cmi kernel/reduction.cmi kernel/term.cmi \
+ kernel/type_errors.cmi kernel/typeops.cmi lib/util.cmi library/indrec.cmi
library/indrec.cmx: kernel/declarations.cmx kernel/environ.cmx \
- kernel/generic.cmx kernel/indtypes.cmx kernel/inductive.cmx \
- kernel/instantiate.cmx kernel/names.cmx lib/pp.cmx kernel/reduction.cmx \
- kernel/term.cmx kernel/type_errors.cmx kernel/typeops.cmx lib/util.cmx \
- library/indrec.cmi
+ kernel/indtypes.cmx kernel/inductive.cmx kernel/instantiate.cmx \
+ kernel/names.cmx lib/pp.cmx kernel/reduction.cmx kernel/term.cmx \
+ kernel/type_errors.cmx kernel/typeops.cmx lib/util.cmx library/indrec.cmi
library/lib.cmo: library/libobject.cmi kernel/names.cmi library/summary.cmi \
lib/util.cmi library/lib.cmi
library/lib.cmx: library/libobject.cmx kernel/names.cmx library/summary.cmx \
@@ -386,26 +369,26 @@ library/libobject.cmo: lib/dyn.cmi kernel/names.cmi lib/util.cmi \
library/libobject.cmi
library/libobject.cmx: lib/dyn.cmx kernel/names.cmx lib/util.cmx \
library/libobject.cmi
-library/library.cmo: kernel/environ.cmi library/global.cmi library/lib.cmi \
- library/libobject.cmi kernel/names.cmi lib/pp.cmi library/summary.cmi \
- lib/system.cmi lib/util.cmi library/library.cmi
-library/library.cmx: kernel/environ.cmx library/global.cmx library/lib.cmx \
- library/libobject.cmx kernel/names.cmx lib/pp.cmx library/summary.cmx \
- lib/system.cmx lib/util.cmx library/library.cmi
+library/library.cmo: kernel/environ.cmi library/global.cmi \
+ library/goptions.cmi library/lib.cmi library/libobject.cmi \
+ kernel/names.cmi lib/pp.cmi library/summary.cmi lib/system.cmi \
+ lib/util.cmi library/library.cmi
+library/library.cmx: kernel/environ.cmx library/global.cmx \
+ library/goptions.cmx library/lib.cmx library/libobject.cmx \
+ kernel/names.cmx lib/pp.cmx library/summary.cmx lib/system.cmx \
+ lib/util.cmx library/library.cmi
library/nametab.cmo: kernel/names.cmi library/summary.cmi library/nametab.cmi
library/nametab.cmx: kernel/names.cmx library/summary.cmx library/nametab.cmi
library/redinfo.cmo: kernel/declarations.cmi kernel/evd.cmi \
- kernel/generic.cmi library/global.cmi kernel/names.cmi \
- kernel/reduction.cmi library/summary.cmi kernel/term.cmi lib/util.cmi \
- library/redinfo.cmi
+ library/global.cmi kernel/names.cmi kernel/reduction.cmi \
+ library/summary.cmi kernel/term.cmi lib/util.cmi library/redinfo.cmi
library/redinfo.cmx: kernel/declarations.cmx kernel/evd.cmx \
- kernel/generic.cmx library/global.cmx kernel/names.cmx \
- kernel/reduction.cmx library/summary.cmx kernel/term.cmx lib/util.cmx \
- library/redinfo.cmi
-library/states.cmo: library/lib.cmi library/summary.cmi lib/system.cmi \
- library/states.cmi
-library/states.cmx: library/lib.cmx library/summary.cmx lib/system.cmx \
- library/states.cmi
+ library/global.cmx kernel/names.cmx kernel/reduction.cmx \
+ library/summary.cmx kernel/term.cmx lib/util.cmx library/redinfo.cmi
+library/states.cmo: library/lib.cmi library/library.cmi library/summary.cmi \
+ lib/system.cmi library/states.cmi
+library/states.cmx: library/lib.cmx library/library.cmx library/summary.cmx \
+ lib/system.cmx library/states.cmi
library/summary.cmo: lib/dyn.cmi kernel/names.cmi lib/pp.cmi lib/util.cmi \
library/summary.cmi
library/summary.cmx: lib/dyn.cmx kernel/names.cmx lib/pp.cmx lib/util.cmx \
@@ -424,16 +407,16 @@ parsing/ast.cmx: parsing/coqast.cmx lib/dyn.cmx lib/hashcons.cmx \
kernel/names.cmx parsing/pcoq.cmx lib/pp.cmx lib/util.cmx parsing/ast.cmi
parsing/astterm.cmo: parsing/ast.cmi parsing/coqast.cmi library/declare.cmi \
kernel/environ.cmi pretyping/evarutil.cmi kernel/evd.cmi \
- kernel/generic.cmi library/global.cmi library/impargs.cmi \
- kernel/names.cmi parsing/pattern.cmi parsing/pcoq.cmi lib/pp.cmi \
+ library/global.cmi library/impargs.cmi kernel/names.cmi \
+ parsing/pattern.cmi parsing/pcoq.cmi lib/pp.cmi \
pretyping/pretype_errors.cmi pretyping/pretyping.cmi \
pretyping/rawterm.cmi kernel/reduction.cmi pretyping/retyping.cmi \
kernel/sign.cmi pretyping/syntax_def.cmi kernel/term.cmi \
pretyping/typing.cmi kernel/univ.cmi lib/util.cmi parsing/astterm.cmi
parsing/astterm.cmx: parsing/ast.cmx parsing/coqast.cmx library/declare.cmx \
kernel/environ.cmx pretyping/evarutil.cmx kernel/evd.cmx \
- kernel/generic.cmx library/global.cmx library/impargs.cmx \
- kernel/names.cmx parsing/pattern.cmx parsing/pcoq.cmx lib/pp.cmx \
+ library/global.cmx library/impargs.cmx kernel/names.cmx \
+ parsing/pattern.cmx parsing/pcoq.cmx lib/pp.cmx \
pretyping/pretype_errors.cmx pretyping/pretyping.cmx \
pretyping/rawterm.cmx kernel/reduction.cmx pretyping/retyping.cmx \
kernel/sign.cmx pretyping/syntax_def.cmx kernel/term.cmx \
@@ -468,32 +451,28 @@ parsing/g_zsyntax.cmx: parsing/ast.cmx parsing/astterm.cmx parsing/coqast.cmx \
lib/util.cmx parsing/g_zsyntax.cmi
parsing/lexer.cmo: lib/util.cmi parsing/lexer.cmi
parsing/lexer.cmx: lib/util.cmx parsing/lexer.cmi
-parsing/pattern.cmo: kernel/generic.cmi kernel/names.cmi \
- pretyping/rawterm.cmi kernel/reduction.cmi kernel/term.cmi lib/util.cmi \
- parsing/pattern.cmi
-parsing/pattern.cmx: kernel/generic.cmx kernel/names.cmx \
- pretyping/rawterm.cmx kernel/reduction.cmx kernel/term.cmx lib/util.cmx \
- parsing/pattern.cmi
+parsing/pattern.cmo: kernel/names.cmi pretyping/rawterm.cmi \
+ kernel/reduction.cmi kernel/term.cmi lib/util.cmi parsing/pattern.cmi
+parsing/pattern.cmx: kernel/names.cmx pretyping/rawterm.cmx \
+ kernel/reduction.cmx kernel/term.cmx lib/util.cmx parsing/pattern.cmi
parsing/pcoq.cmo: parsing/coqast.cmi parsing/lexer.cmi lib/pp.cmi \
lib/util.cmi parsing/pcoq.cmi
parsing/pcoq.cmx: parsing/coqast.cmx parsing/lexer.cmx lib/pp.cmx \
lib/util.cmx parsing/pcoq.cmi
parsing/pretty.cmo: pretyping/classops.cmi kernel/declarations.cmi \
- library/declare.cmi kernel/environ.cmi kernel/evd.cmi kernel/generic.cmi \
- library/global.cmi library/impargs.cmi kernel/inductive.cmi \
- kernel/instantiate.cmi library/lib.cmi library/libobject.cmi \
- library/library.cmi kernel/names.cmi library/nametab.cmi lib/pp.cmi \
- parsing/printer.cmi kernel/reduction.cmi kernel/sign.cmi \
- pretyping/syntax_def.cmi kernel/term.cmi kernel/typeops.cmi lib/util.cmi \
- parsing/pretty.cmi
+ library/declare.cmi kernel/environ.cmi kernel/evd.cmi library/global.cmi \
+ library/impargs.cmi kernel/inductive.cmi kernel/instantiate.cmi \
+ library/lib.cmi library/libobject.cmi library/library.cmi \
+ kernel/names.cmi library/nametab.cmi lib/pp.cmi parsing/printer.cmi \
+ kernel/reduction.cmi kernel/sign.cmi pretyping/syntax_def.cmi \
+ kernel/term.cmi kernel/typeops.cmi lib/util.cmi parsing/pretty.cmi
parsing/pretty.cmx: pretyping/classops.cmx kernel/declarations.cmx \
- library/declare.cmx kernel/environ.cmx kernel/evd.cmx kernel/generic.cmx \
- library/global.cmx library/impargs.cmx kernel/inductive.cmx \
- kernel/instantiate.cmx library/lib.cmx library/libobject.cmx \
- library/library.cmx kernel/names.cmx library/nametab.cmx lib/pp.cmx \
- parsing/printer.cmx kernel/reduction.cmx kernel/sign.cmx \
- pretyping/syntax_def.cmx kernel/term.cmx kernel/typeops.cmx lib/util.cmx \
- parsing/pretty.cmi
+ library/declare.cmx kernel/environ.cmx kernel/evd.cmx library/global.cmx \
+ library/impargs.cmx kernel/inductive.cmx kernel/instantiate.cmx \
+ library/lib.cmx library/libobject.cmx library/library.cmx \
+ kernel/names.cmx library/nametab.cmx lib/pp.cmx parsing/printer.cmx \
+ kernel/reduction.cmx kernel/sign.cmx pretyping/syntax_def.cmx \
+ kernel/term.cmx kernel/typeops.cmx lib/util.cmx parsing/pretty.cmi
parsing/printer.cmo: parsing/ast.cmi parsing/coqast.cmi library/declare.cmi \
kernel/environ.cmi parsing/esyntax.cmi parsing/extend.cmi \
library/global.cmi kernel/names.cmi library/nametab.cmi lib/options.cmi \
@@ -506,85 +485,83 @@ parsing/printer.cmx: parsing/ast.cmx parsing/coqast.cmx library/declare.cmx \
parsing/termast.cmx lib/util.cmx parsing/printer.cmi
parsing/termast.cmo: parsing/ast.cmi pretyping/classops.cmi \
parsing/coqast.cmi library/declare.cmi pretyping/detyping.cmi \
- kernel/environ.cmi kernel/evd.cmi kernel/generic.cmi library/impargs.cmi \
+ kernel/environ.cmi kernel/evd.cmi library/impargs.cmi \
kernel/inductive.cmi kernel/names.cmi parsing/pattern.cmi lib/pp.cmi \
pretyping/rawterm.cmi kernel/reduction.cmi kernel/sign.cmi \
kernel/term.cmi kernel/univ.cmi lib/util.cmi parsing/termast.cmi
parsing/termast.cmx: parsing/ast.cmx pretyping/classops.cmx \
parsing/coqast.cmx library/declare.cmx pretyping/detyping.cmx \
- kernel/environ.cmx kernel/evd.cmx kernel/generic.cmx library/impargs.cmx \
+ kernel/environ.cmx kernel/evd.cmx library/impargs.cmx \
kernel/inductive.cmx kernel/names.cmx parsing/pattern.cmx lib/pp.cmx \
pretyping/rawterm.cmx kernel/reduction.cmx kernel/sign.cmx \
kernel/term.cmx kernel/univ.cmx lib/util.cmx parsing/termast.cmi
pretyping/cases.cmo: pretyping/coercion.cmi kernel/declarations.cmi \
kernel/environ.cmi pretyping/evarconv.cmi pretyping/evarutil.cmi \
- kernel/evd.cmi kernel/generic.cmi library/global.cmi kernel/inductive.cmi \
- kernel/names.cmi lib/pp.cmi pretyping/pretype_errors.cmi \
- pretyping/rawterm.cmi kernel/reduction.cmi pretyping/retyping.cmi \
- kernel/sign.cmi kernel/term.cmi kernel/type_errors.cmi kernel/typeops.cmi \
- kernel/univ.cmi lib/util.cmi pretyping/cases.cmi
+ kernel/evd.cmi library/global.cmi kernel/inductive.cmi kernel/names.cmi \
+ lib/pp.cmi pretyping/pretype_errors.cmi pretyping/rawterm.cmi \
+ kernel/reduction.cmi pretyping/retyping.cmi kernel/sign.cmi \
+ kernel/term.cmi kernel/type_errors.cmi kernel/typeops.cmi kernel/univ.cmi \
+ lib/util.cmi pretyping/cases.cmi
pretyping/cases.cmx: pretyping/coercion.cmx kernel/declarations.cmx \
kernel/environ.cmx pretyping/evarconv.cmx pretyping/evarutil.cmx \
- kernel/evd.cmx kernel/generic.cmx library/global.cmx kernel/inductive.cmx \
- kernel/names.cmx lib/pp.cmx pretyping/pretype_errors.cmx \
- pretyping/rawterm.cmx kernel/reduction.cmx pretyping/retyping.cmx \
- kernel/sign.cmx kernel/term.cmx kernel/type_errors.cmx kernel/typeops.cmx \
- kernel/univ.cmx lib/util.cmx pretyping/cases.cmi
+ kernel/evd.cmx library/global.cmx kernel/inductive.cmx kernel/names.cmx \
+ lib/pp.cmx pretyping/pretype_errors.cmx pretyping/rawterm.cmx \
+ kernel/reduction.cmx pretyping/retyping.cmx kernel/sign.cmx \
+ kernel/term.cmx kernel/type_errors.cmx kernel/typeops.cmx kernel/univ.cmx \
+ lib/util.cmx pretyping/cases.cmi
pretyping/class.cmo: pretyping/classops.cmi kernel/declarations.cmi \
- library/declare.cmi kernel/environ.cmi kernel/evd.cmi kernel/generic.cmi \
- library/global.cmi kernel/inductive.cmi kernel/instantiate.cmi \
- library/lib.cmi kernel/names.cmi lib/pp.cmi pretyping/retyping.cmi \
+ library/declare.cmi kernel/environ.cmi kernel/evd.cmi library/global.cmi \
+ kernel/inductive.cmi kernel/instantiate.cmi library/lib.cmi \
+ kernel/names.cmi lib/pp.cmi pretyping/retyping.cmi kernel/sign.cmi \
kernel/term.cmi pretyping/typing.cmi lib/util.cmi pretyping/class.cmi
pretyping/class.cmx: pretyping/classops.cmx kernel/declarations.cmx \
- library/declare.cmx kernel/environ.cmx kernel/evd.cmx kernel/generic.cmx \
- library/global.cmx kernel/inductive.cmx kernel/instantiate.cmx \
- library/lib.cmx kernel/names.cmx lib/pp.cmx pretyping/retyping.cmx \
+ library/declare.cmx kernel/environ.cmx kernel/evd.cmx library/global.cmx \
+ kernel/inductive.cmx kernel/instantiate.cmx library/lib.cmx \
+ kernel/names.cmx lib/pp.cmx pretyping/retyping.cmx kernel/sign.cmx \
kernel/term.cmx pretyping/typing.cmx lib/util.cmx pretyping/class.cmi
pretyping/classops.cmo: library/declare.cmi kernel/environ.cmi \
- kernel/generic.cmi library/lib.cmi library/libobject.cmi kernel/names.cmi \
- lib/options.cmi lib/pp.cmi pretyping/rawterm.cmi library/summary.cmi \
- pretyping/tacred.cmi kernel/term.cmi lib/util.cmi pretyping/classops.cmi
+ library/lib.cmi library/libobject.cmi kernel/names.cmi lib/options.cmi \
+ lib/pp.cmi pretyping/rawterm.cmi library/summary.cmi pretyping/tacred.cmi \
+ kernel/term.cmi lib/util.cmi pretyping/classops.cmi
pretyping/classops.cmx: library/declare.cmx kernel/environ.cmx \
- kernel/generic.cmx library/lib.cmx library/libobject.cmx kernel/names.cmx \
- lib/options.cmx lib/pp.cmx pretyping/rawterm.cmx library/summary.cmx \
- pretyping/tacred.cmx kernel/term.cmx lib/util.cmx pretyping/classops.cmi
+ library/lib.cmx library/libobject.cmx kernel/names.cmx lib/options.cmx \
+ lib/pp.cmx pretyping/rawterm.cmx library/summary.cmx pretyping/tacred.cmx \
+ kernel/term.cmx lib/util.cmx pretyping/classops.cmi
pretyping/coercion.cmo: pretyping/classops.cmi kernel/environ.cmi \
- pretyping/evarconv.cmi kernel/evd.cmi kernel/generic.cmi kernel/names.cmi \
+ pretyping/evarconv.cmi kernel/evd.cmi kernel/names.cmi \
pretyping/pretype_errors.cmi pretyping/recordops.cmi kernel/reduction.cmi \
pretyping/retyping.cmi kernel/term.cmi kernel/typeops.cmi lib/util.cmi \
pretyping/coercion.cmi
pretyping/coercion.cmx: pretyping/classops.cmx kernel/environ.cmx \
- pretyping/evarconv.cmx kernel/evd.cmx kernel/generic.cmx kernel/names.cmx \
+ pretyping/evarconv.cmx kernel/evd.cmx kernel/names.cmx \
pretyping/pretype_errors.cmx pretyping/recordops.cmx kernel/reduction.cmx \
pretyping/retyping.cmx kernel/term.cmx kernel/typeops.cmx lib/util.cmx \
pretyping/coercion.cmi
pretyping/detyping.cmo: kernel/declarations.cmi library/declare.cmi \
- kernel/generic.cmi library/global.cmi library/goptions.cmi \
- library/impargs.cmi kernel/inductive.cmi kernel/names.cmi lib/pp.cmi \
- pretyping/rawterm.cmi kernel/sign.cmi kernel/term.cmi kernel/univ.cmi \
- lib/util.cmi pretyping/detyping.cmi
+ library/global.cmi library/goptions.cmi library/impargs.cmi \
+ kernel/inductive.cmi kernel/names.cmi lib/pp.cmi pretyping/rawterm.cmi \
+ kernel/sign.cmi kernel/term.cmi kernel/univ.cmi lib/util.cmi \
+ pretyping/detyping.cmi
pretyping/detyping.cmx: kernel/declarations.cmx library/declare.cmx \
- kernel/generic.cmx library/global.cmx library/goptions.cmx \
- library/impargs.cmx kernel/inductive.cmx kernel/names.cmx lib/pp.cmx \
- pretyping/rawterm.cmx kernel/sign.cmx kernel/term.cmx kernel/univ.cmx \
- lib/util.cmx pretyping/detyping.cmi
+ library/global.cmx library/goptions.cmx library/impargs.cmx \
+ kernel/inductive.cmx kernel/names.cmx lib/pp.cmx pretyping/rawterm.cmx \
+ kernel/sign.cmx kernel/term.cmx kernel/univ.cmx lib/util.cmx \
+ pretyping/detyping.cmi
pretyping/evarconv.cmo: pretyping/classops.cmi kernel/environ.cmi \
- pretyping/evarutil.cmi kernel/generic.cmi kernel/instantiate.cmi \
- kernel/names.cmi pretyping/recordops.cmi kernel/reduction.cmi \
- pretyping/retyping.cmi kernel/term.cmi pretyping/typing.cmi lib/util.cmi \
- pretyping/evarconv.cmi
+ pretyping/evarutil.cmi kernel/instantiate.cmi kernel/names.cmi \
+ pretyping/recordops.cmi kernel/reduction.cmi pretyping/retyping.cmi \
+ kernel/term.cmi pretyping/typing.cmi lib/util.cmi pretyping/evarconv.cmi
pretyping/evarconv.cmx: pretyping/classops.cmx kernel/environ.cmx \
- pretyping/evarutil.cmx kernel/generic.cmx kernel/instantiate.cmx \
- kernel/names.cmx pretyping/recordops.cmx kernel/reduction.cmx \
- pretyping/retyping.cmx kernel/term.cmx pretyping/typing.cmx lib/util.cmx \
- pretyping/evarconv.cmi
-pretyping/evarutil.cmo: kernel/environ.cmi kernel/evd.cmi kernel/generic.cmi \
- library/indrec.cmi kernel/instantiate.cmi kernel/names.cmi lib/pp.cmi \
+ pretyping/evarutil.cmx kernel/instantiate.cmx kernel/names.cmx \
+ pretyping/recordops.cmx kernel/reduction.cmx pretyping/retyping.cmx \
+ kernel/term.cmx pretyping/typing.cmx lib/util.cmx pretyping/evarconv.cmi
+pretyping/evarutil.cmo: kernel/environ.cmi kernel/evd.cmi library/indrec.cmi \
+ kernel/instantiate.cmi kernel/names.cmi lib/pp.cmi \
pretyping/pretype_errors.cmi kernel/reduction.cmi kernel/sign.cmi \
kernel/term.cmi kernel/type_errors.cmi kernel/univ.cmi lib/util.cmi \
pretyping/evarutil.cmi
-pretyping/evarutil.cmx: kernel/environ.cmx kernel/evd.cmx kernel/generic.cmx \
- library/indrec.cmx kernel/instantiate.cmx kernel/names.cmx lib/pp.cmx \
+pretyping/evarutil.cmx: kernel/environ.cmx kernel/evd.cmx library/indrec.cmx \
+ kernel/instantiate.cmx kernel/names.cmx lib/pp.cmx \
pretyping/pretype_errors.cmx kernel/reduction.cmx kernel/sign.cmx \
kernel/term.cmx kernel/type_errors.cmx kernel/univ.cmx lib/util.cmx \
pretyping/evarutil.cmi
@@ -596,22 +573,20 @@ pretyping/pretype_errors.cmx: kernel/environ.cmx library/global.cmx \
kernel/type_errors.cmx pretyping/pretype_errors.cmi
pretyping/pretyping.cmo: pretyping/cases.cmi pretyping/classops.cmi \
pretyping/coercion.cmi kernel/environ.cmi pretyping/evarconv.cmi \
- pretyping/evarutil.cmi kernel/evd.cmi kernel/generic.cmi \
- library/indrec.cmi kernel/inductive.cmi kernel/instantiate.cmi \
- kernel/names.cmi lib/pp.cmi pretyping/pretype_errors.cmi \
- pretyping/rawterm.cmi pretyping/recordops.cmi kernel/reduction.cmi \
- pretyping/retyping.cmi kernel/sign.cmi kernel/term.cmi \
- kernel/type_errors.cmi kernel/typeops.cmi kernel/univ.cmi lib/util.cmi \
- pretyping/pretyping.cmi
+ pretyping/evarutil.cmi kernel/evd.cmi library/indrec.cmi \
+ kernel/inductive.cmi kernel/instantiate.cmi kernel/names.cmi lib/pp.cmi \
+ pretyping/pretype_errors.cmi pretyping/rawterm.cmi \
+ pretyping/recordops.cmi kernel/reduction.cmi pretyping/retyping.cmi \
+ kernel/sign.cmi kernel/term.cmi kernel/type_errors.cmi kernel/typeops.cmi \
+ kernel/univ.cmi lib/util.cmi pretyping/pretyping.cmi
pretyping/pretyping.cmx: pretyping/cases.cmx pretyping/classops.cmx \
pretyping/coercion.cmx kernel/environ.cmx pretyping/evarconv.cmx \
- pretyping/evarutil.cmx kernel/evd.cmx kernel/generic.cmx \
- library/indrec.cmx kernel/inductive.cmx kernel/instantiate.cmx \
- kernel/names.cmx lib/pp.cmx pretyping/pretype_errors.cmx \
- pretyping/rawterm.cmx pretyping/recordops.cmx kernel/reduction.cmx \
- pretyping/retyping.cmx kernel/sign.cmx kernel/term.cmx \
- kernel/type_errors.cmx kernel/typeops.cmx kernel/univ.cmx lib/util.cmx \
- pretyping/pretyping.cmi
+ pretyping/evarutil.cmx kernel/evd.cmx library/indrec.cmx \
+ kernel/inductive.cmx kernel/instantiate.cmx kernel/names.cmx lib/pp.cmx \
+ pretyping/pretype_errors.cmx pretyping/rawterm.cmx \
+ pretyping/recordops.cmx kernel/reduction.cmx pretyping/retyping.cmx \
+ kernel/sign.cmx kernel/term.cmx kernel/type_errors.cmx kernel/typeops.cmx \
+ kernel/univ.cmx lib/util.cmx pretyping/pretyping.cmi
pretyping/rawterm.cmo: kernel/names.cmi kernel/sign.cmi kernel/term.cmi \
lib/util.cmi pretyping/rawterm.cmi
pretyping/rawterm.cmx: kernel/names.cmx kernel/sign.cmx kernel/term.cmx \
@@ -624,14 +599,12 @@ pretyping/recordops.cmx: pretyping/classops.cmx library/lib.cmx \
library/libobject.cmx library/library.cmx kernel/names.cmx lib/pp.cmx \
library/summary.cmx kernel/term.cmx kernel/typeops.cmx lib/util.cmx \
pretyping/recordops.cmi
-pretyping/retyping.cmo: kernel/environ.cmi kernel/generic.cmi \
- kernel/inductive.cmi kernel/names.cmi kernel/reduction.cmi \
- kernel/term.cmi kernel/typeops.cmi kernel/univ.cmi lib/util.cmi \
- pretyping/retyping.cmi
-pretyping/retyping.cmx: kernel/environ.cmx kernel/generic.cmx \
- kernel/inductive.cmx kernel/names.cmx kernel/reduction.cmx \
- kernel/term.cmx kernel/typeops.cmx kernel/univ.cmx lib/util.cmx \
- pretyping/retyping.cmi
+pretyping/retyping.cmo: kernel/environ.cmi kernel/inductive.cmi \
+ kernel/names.cmi kernel/reduction.cmi kernel/term.cmi kernel/typeops.cmi \
+ kernel/univ.cmi lib/util.cmi pretyping/retyping.cmi
+pretyping/retyping.cmx: kernel/environ.cmx kernel/inductive.cmx \
+ kernel/names.cmx kernel/reduction.cmx kernel/term.cmx kernel/typeops.cmx \
+ kernel/univ.cmx lib/util.cmx pretyping/retyping.cmi
pretyping/syntax_def.cmo: library/lib.cmi library/libobject.cmi \
kernel/names.cmi library/nametab.cmi pretyping/rawterm.cmi \
library/summary.cmi pretyping/syntax_def.cmi
@@ -639,50 +612,52 @@ pretyping/syntax_def.cmx: library/lib.cmx library/libobject.cmx \
kernel/names.cmx library/nametab.cmx pretyping/rawterm.cmx \
library/summary.cmx pretyping/syntax_def.cmi
pretyping/tacred.cmo: kernel/closure.cmi library/declare.cmi \
- kernel/environ.cmi kernel/generic.cmi kernel/inductive.cmi \
+ kernel/environ.cmi kernel/evd.cmi library/global.cmi kernel/inductive.cmi \
kernel/instantiate.cmi kernel/names.cmi lib/pp.cmi library/redinfo.cmi \
- kernel/reduction.cmi kernel/term.cmi lib/util.cmi pretyping/tacred.cmi
+ kernel/reduction.cmi pretyping/retyping.cmi kernel/term.cmi lib/util.cmi \
+ pretyping/tacred.cmi
pretyping/tacred.cmx: kernel/closure.cmx library/declare.cmx \
- kernel/environ.cmx kernel/generic.cmx kernel/inductive.cmx \
+ kernel/environ.cmx kernel/evd.cmx library/global.cmx kernel/inductive.cmx \
kernel/instantiate.cmx kernel/names.cmx lib/pp.cmx library/redinfo.cmx \
- kernel/reduction.cmx kernel/term.cmx lib/util.cmx pretyping/tacred.cmi
-pretyping/typing.cmo: kernel/environ.cmi kernel/generic.cmi kernel/names.cmi \
+ kernel/reduction.cmx pretyping/retyping.cmx kernel/term.cmx lib/util.cmx \
+ pretyping/tacred.cmi
+pretyping/typing.cmo: kernel/environ.cmi kernel/names.cmi \
kernel/reduction.cmi kernel/term.cmi kernel/type_errors.cmi \
kernel/typeops.cmi lib/util.cmi pretyping/typing.cmi
-pretyping/typing.cmx: kernel/environ.cmx kernel/generic.cmx kernel/names.cmx \
+pretyping/typing.cmx: kernel/environ.cmx kernel/names.cmx \
kernel/reduction.cmx kernel/term.cmx kernel/type_errors.cmx \
kernel/typeops.cmx lib/util.cmx pretyping/typing.cmi
-proofs/clenv.cmo: kernel/environ.cmi kernel/evd.cmi kernel/generic.cmi \
- kernel/instantiate.cmi proofs/logic.cmi kernel/names.cmi lib/pp.cmi \
- parsing/printer.cmi proofs/proof_type.cmi kernel/reduction.cmi \
- pretyping/retyping.cmi kernel/sign.cmi proofs/tacmach.cmi kernel/term.cmi \
- pretyping/typing.cmi lib/util.cmi proofs/clenv.cmi
-proofs/clenv.cmx: kernel/environ.cmx kernel/evd.cmx kernel/generic.cmx \
- kernel/instantiate.cmx proofs/logic.cmx kernel/names.cmx lib/pp.cmx \
- parsing/printer.cmx proofs/proof_type.cmx kernel/reduction.cmx \
- pretyping/retyping.cmx kernel/sign.cmx proofs/tacmach.cmx kernel/term.cmx \
- pretyping/typing.cmx lib/util.cmx proofs/clenv.cmi
+proofs/clenv.cmo: kernel/environ.cmi kernel/evd.cmi kernel/instantiate.cmi \
+ proofs/logic.cmi kernel/names.cmi lib/pp.cmi parsing/printer.cmi \
+ proofs/proof_type.cmi kernel/reduction.cmi pretyping/retyping.cmi \
+ kernel/sign.cmi proofs/tacmach.cmi kernel/term.cmi pretyping/typing.cmi \
+ lib/util.cmi proofs/clenv.cmi
+proofs/clenv.cmx: kernel/environ.cmx kernel/evd.cmx kernel/instantiate.cmx \
+ proofs/logic.cmx kernel/names.cmx lib/pp.cmx parsing/printer.cmx \
+ proofs/proof_type.cmx kernel/reduction.cmx pretyping/retyping.cmx \
+ kernel/sign.cmx proofs/tacmach.cmx kernel/term.cmx pretyping/typing.cmx \
+ lib/util.cmx proofs/clenv.cmi
proofs/evar_refiner.cmo: parsing/astterm.cmi kernel/environ.cmi \
- kernel/evd.cmi kernel/generic.cmi proofs/logic.cmi kernel/names.cmi \
- lib/pp.cmi proofs/proof_trees.cmi proofs/proof_type.cmi \
- kernel/reduction.cmi proofs/refiner.cmi lib/stamps.cmi kernel/term.cmi \
- pretyping/typing.cmi lib/util.cmi proofs/evar_refiner.cmi
+ kernel/evd.cmi proofs/logic.cmi kernel/names.cmi lib/pp.cmi \
+ proofs/proof_trees.cmi proofs/proof_type.cmi kernel/reduction.cmi \
+ proofs/refiner.cmi lib/stamps.cmi kernel/term.cmi pretyping/typing.cmi \
+ lib/util.cmi proofs/evar_refiner.cmi
proofs/evar_refiner.cmx: parsing/astterm.cmx kernel/environ.cmx \
- kernel/evd.cmx kernel/generic.cmx proofs/logic.cmx kernel/names.cmx \
- lib/pp.cmx proofs/proof_trees.cmx proofs/proof_type.cmx \
- kernel/reduction.cmx proofs/refiner.cmx lib/stamps.cmx kernel/term.cmx \
- pretyping/typing.cmx lib/util.cmx proofs/evar_refiner.cmi
+ kernel/evd.cmx proofs/logic.cmx kernel/names.cmx lib/pp.cmx \
+ proofs/proof_trees.cmx proofs/proof_type.cmx kernel/reduction.cmx \
+ proofs/refiner.cmx lib/stamps.cmx kernel/term.cmx pretyping/typing.cmx \
+ lib/util.cmx proofs/evar_refiner.cmi
proofs/logic.cmo: parsing/coqast.cmi library/declare.cmi kernel/environ.cmi \
- kernel/evd.cmi kernel/generic.cmi kernel/inductive.cmi kernel/names.cmi \
- lib/pp.cmi parsing/printer.cmi proofs/proof_trees.cmi \
- proofs/proof_type.cmi kernel/reduction.cmi pretyping/retyping.cmi \
- kernel/sign.cmi kernel/term.cmi kernel/type_errors.cmi kernel/typeops.cmi \
+ kernel/evd.cmi kernel/inductive.cmi kernel/names.cmi lib/pp.cmi \
+ parsing/printer.cmi proofs/proof_trees.cmi proofs/proof_type.cmi \
+ kernel/reduction.cmi pretyping/retyping.cmi kernel/sign.cmi \
+ kernel/term.cmi kernel/type_errors.cmi kernel/typeops.cmi \
pretyping/typing.cmi lib/util.cmi proofs/logic.cmi
proofs/logic.cmx: parsing/coqast.cmx library/declare.cmx kernel/environ.cmx \
- kernel/evd.cmx kernel/generic.cmx kernel/inductive.cmx kernel/names.cmx \
- lib/pp.cmx parsing/printer.cmx proofs/proof_trees.cmx \
- proofs/proof_type.cmx kernel/reduction.cmx pretyping/retyping.cmx \
- kernel/sign.cmx kernel/term.cmx kernel/type_errors.cmx kernel/typeops.cmx \
+ kernel/evd.cmx kernel/inductive.cmx kernel/names.cmx lib/pp.cmx \
+ parsing/printer.cmx proofs/proof_trees.cmx proofs/proof_type.cmx \
+ kernel/reduction.cmx pretyping/retyping.cmx kernel/sign.cmx \
+ kernel/term.cmx kernel/type_errors.cmx kernel/typeops.cmx \
pretyping/typing.cmx lib/util.cmx proofs/logic.cmi
proofs/macros.cmo: parsing/ast.cmi parsing/coqast.cmi library/lib.cmi \
library/libobject.cmi library/library.cmi kernel/names.cmi \
@@ -694,16 +669,14 @@ proofs/macros.cmx: parsing/ast.cmx parsing/coqast.cmx library/lib.cmx \
kernel/term.cmx lib/util.cmx proofs/macros.cmi
proofs/pfedit.cmo: parsing/astterm.cmi kernel/declarations.cmi \
library/declare.cmi lib/edit.cmi kernel/environ.cmi kernel/evd.cmi \
- kernel/generic.cmi library/lib.cmi kernel/names.cmi lib/pp.cmi \
- proofs/proof_trees.cmi proofs/proof_type.cmi kernel/sign.cmi \
- proofs/tacmach.cmi kernel/term.cmi pretyping/typing.cmi lib/util.cmi \
- proofs/pfedit.cmi
+ library/lib.cmi kernel/names.cmi lib/pp.cmi proofs/proof_trees.cmi \
+ proofs/proof_type.cmi kernel/sign.cmi proofs/tacmach.cmi kernel/term.cmi \
+ pretyping/typing.cmi lib/util.cmi proofs/pfedit.cmi
proofs/pfedit.cmx: parsing/astterm.cmx kernel/declarations.cmx \
library/declare.cmx lib/edit.cmx kernel/environ.cmx kernel/evd.cmx \
- kernel/generic.cmx library/lib.cmx kernel/names.cmx lib/pp.cmx \
- proofs/proof_trees.cmx proofs/proof_type.cmx kernel/sign.cmx \
- proofs/tacmach.cmx kernel/term.cmx pretyping/typing.cmx lib/util.cmx \
- proofs/pfedit.cmi
+ library/lib.cmx kernel/names.cmx lib/pp.cmx proofs/proof_trees.cmx \
+ proofs/proof_type.cmx kernel/sign.cmx proofs/tacmach.cmx kernel/term.cmx \
+ pretyping/typing.cmx lib/util.cmx proofs/pfedit.cmi
proofs/proof_trees.cmo: parsing/ast.cmi pretyping/detyping.cmi \
kernel/environ.cmi kernel/evd.cmi library/global.cmi kernel/names.cmi \
lib/pp.cmi parsing/pretty.cmi parsing/printer.cmi proofs/proof_type.cmi \
@@ -721,307 +694,283 @@ proofs/proof_type.cmx: parsing/coqast.cmx kernel/environ.cmx kernel/evd.cmx \
kernel/names.cmx lib/stamps.cmx pretyping/tacred.cmx kernel/term.cmx \
lib/util.cmx proofs/proof_type.cmi
proofs/refiner.cmo: parsing/ast.cmi kernel/environ.cmi kernel/evd.cmi \
- kernel/generic.cmi kernel/instantiate.cmi proofs/logic.cmi lib/pp.cmi \
- parsing/printer.cmi proofs/proof_trees.cmi proofs/proof_type.cmi \
- kernel/reduction.cmi pretyping/retyping.cmi kernel/sign.cmi \
- lib/stamps.cmi kernel/term.cmi kernel/type_errors.cmi lib/util.cmi \
- proofs/refiner.cmi
+ kernel/instantiate.cmi proofs/logic.cmi lib/pp.cmi parsing/printer.cmi \
+ proofs/proof_trees.cmi proofs/proof_type.cmi kernel/reduction.cmi \
+ pretyping/retyping.cmi kernel/sign.cmi lib/stamps.cmi kernel/term.cmi \
+ kernel/type_errors.cmi lib/util.cmi proofs/refiner.cmi
proofs/refiner.cmx: parsing/ast.cmx kernel/environ.cmx kernel/evd.cmx \
- kernel/generic.cmx kernel/instantiate.cmx proofs/logic.cmx lib/pp.cmx \
- parsing/printer.cmx proofs/proof_trees.cmx proofs/proof_type.cmx \
- kernel/reduction.cmx pretyping/retyping.cmx kernel/sign.cmx \
- lib/stamps.cmx kernel/term.cmx kernel/type_errors.cmx lib/util.cmx \
- proofs/refiner.cmi
+ kernel/instantiate.cmx proofs/logic.cmx lib/pp.cmx parsing/printer.cmx \
+ proofs/proof_trees.cmx proofs/proof_type.cmx kernel/reduction.cmx \
+ pretyping/retyping.cmx kernel/sign.cmx lib/stamps.cmx kernel/term.cmx \
+ kernel/type_errors.cmx lib/util.cmx proofs/refiner.cmi
proofs/stock.cmo: lib/bij.cmi lib/gmap.cmi lib/gmapl.cmi library/library.cmi \
kernel/names.cmi lib/pp.cmi lib/util.cmi proofs/stock.cmi
proofs/stock.cmx: lib/bij.cmx lib/gmap.cmx lib/gmapl.cmx library/library.cmx \
kernel/names.cmx lib/pp.cmx lib/util.cmx proofs/stock.cmi
proofs/tacinterp.cmo: parsing/ast.cmi parsing/astterm.cmi kernel/closure.cmi \
- parsing/coqast.cmi library/declare.cmi kernel/environ.cmi \
- kernel/generic.cmi lib/gmap.cmi library/lib.cmi library/libobject.cmi \
- proofs/logic.cmi proofs/macros.cmi kernel/names.cmi library/nametab.cmi \
- lib/options.cmi parsing/pattern.cmi lib/pp.cmi proofs/proof_type.cmi \
- pretyping/rawterm.cmi kernel/sign.cmi library/summary.cmi \
- proofs/tacmach.cmi pretyping/tacred.cmi kernel/term.cmi \
- pretyping/typing.cmi lib/util.cmi proofs/tacinterp.cmi
+ parsing/coqast.cmi library/declare.cmi kernel/environ.cmi lib/gmap.cmi \
+ library/lib.cmi library/libobject.cmi proofs/logic.cmi proofs/macros.cmi \
+ kernel/names.cmi library/nametab.cmi lib/options.cmi parsing/pattern.cmi \
+ lib/pp.cmi proofs/proof_type.cmi pretyping/rawterm.cmi kernel/sign.cmi \
+ library/summary.cmi proofs/tacmach.cmi pretyping/tacred.cmi \
+ kernel/term.cmi pretyping/typing.cmi lib/util.cmi proofs/tacinterp.cmi
proofs/tacinterp.cmx: parsing/ast.cmx parsing/astterm.cmx kernel/closure.cmx \
- parsing/coqast.cmx library/declare.cmx kernel/environ.cmx \
- kernel/generic.cmx lib/gmap.cmx library/lib.cmx library/libobject.cmx \
- proofs/logic.cmx proofs/macros.cmx kernel/names.cmx library/nametab.cmx \
- lib/options.cmx parsing/pattern.cmx lib/pp.cmx proofs/proof_type.cmx \
- pretyping/rawterm.cmx kernel/sign.cmx library/summary.cmx \
- proofs/tacmach.cmx pretyping/tacred.cmx kernel/term.cmx \
- pretyping/typing.cmx lib/util.cmx proofs/tacinterp.cmi
+ parsing/coqast.cmx library/declare.cmx kernel/environ.cmx lib/gmap.cmx \
+ library/lib.cmx library/libobject.cmx proofs/logic.cmx proofs/macros.cmx \
+ kernel/names.cmx library/nametab.cmx lib/options.cmx parsing/pattern.cmx \
+ lib/pp.cmx proofs/proof_type.cmx pretyping/rawterm.cmx kernel/sign.cmx \
+ library/summary.cmx proofs/tacmach.cmx pretyping/tacred.cmx \
+ kernel/term.cmx pretyping/typing.cmx lib/util.cmx proofs/tacinterp.cmi
proofs/tacmach.cmo: parsing/ast.cmi parsing/astterm.cmi library/declare.cmi \
kernel/environ.cmi proofs/evar_refiner.cmi kernel/evd.cmi \
- kernel/generic.cmi kernel/instantiate.cmi proofs/logic.cmi \
- kernel/names.cmi lib/pp.cmi parsing/printer.cmi proofs/proof_trees.cmi \
- proofs/proof_type.cmi kernel/reduction.cmi proofs/refiner.cmi \
- kernel/sign.cmi lib/stamps.cmi pretyping/tacred.cmi kernel/term.cmi \
- pretyping/typing.cmi lib/util.cmi proofs/tacmach.cmi
+ kernel/instantiate.cmi proofs/logic.cmi kernel/names.cmi lib/pp.cmi \
+ parsing/printer.cmi proofs/proof_trees.cmi proofs/proof_type.cmi \
+ kernel/reduction.cmi proofs/refiner.cmi kernel/sign.cmi lib/stamps.cmi \
+ pretyping/tacred.cmi kernel/term.cmi pretyping/typing.cmi lib/util.cmi \
+ proofs/tacmach.cmi
proofs/tacmach.cmx: parsing/ast.cmx parsing/astterm.cmx library/declare.cmx \
kernel/environ.cmx proofs/evar_refiner.cmx kernel/evd.cmx \
- kernel/generic.cmx kernel/instantiate.cmx proofs/logic.cmx \
- kernel/names.cmx lib/pp.cmx parsing/printer.cmx proofs/proof_trees.cmx \
- proofs/proof_type.cmx kernel/reduction.cmx proofs/refiner.cmx \
- kernel/sign.cmx lib/stamps.cmx pretyping/tacred.cmx kernel/term.cmx \
- pretyping/typing.cmx lib/util.cmx proofs/tacmach.cmi
-scripts/coqc.cmo: config/coq_config.cmi toplevel/usage.cmi
-scripts/coqc.cmx: config/coq_config.cmx toplevel/usage.cmx
+ kernel/instantiate.cmx proofs/logic.cmx kernel/names.cmx lib/pp.cmx \
+ parsing/printer.cmx proofs/proof_trees.cmx proofs/proof_type.cmx \
+ kernel/reduction.cmx proofs/refiner.cmx kernel/sign.cmx lib/stamps.cmx \
+ pretyping/tacred.cmx kernel/term.cmx pretyping/typing.cmx lib/util.cmx \
+ proofs/tacmach.cmi
scripts/coqmktop.cmo: config/coq_config.cmi scripts/tolink.cmo
scripts/coqmktop.cmx: config/coq_config.cmx scripts/tolink.cmx
tactics/auto.cmo: parsing/astterm.cmi tactics/btermdn.cmi proofs/clenv.cmi \
parsing/coqast.cmi library/declare.cmi tactics/dhyp.cmi kernel/evd.cmi \
- kernel/generic.cmi library/global.cmi tactics/hiddentac.cmi \
- tactics/hipattern.cmi kernel/inductive.cmi library/lib.cmi \
- library/libobject.cmi library/library.cmi proofs/logic.cmi \
- kernel/names.cmi lib/options.cmi parsing/pattern.cmi proofs/pfedit.cmi \
- lib/pp.cmi parsing/printer.cmi proofs/proof_type.cmi \
- pretyping/rawterm.cmi kernel/reduction.cmi pretyping/retyping.cmi \
- kernel/sign.cmi library/summary.cmi proofs/tacmach.cmi \
- pretyping/tacred.cmi tactics/tacticals.cmi tactics/tactics.cmi \
- kernel/term.cmi pretyping/typing.cmi lib/util.cmi \
+ library/global.cmi tactics/hiddentac.cmi tactics/hipattern.cmi \
+ kernel/inductive.cmi library/lib.cmi library/libobject.cmi \
+ library/library.cmi proofs/logic.cmi kernel/names.cmi lib/options.cmi \
+ parsing/pattern.cmi proofs/pfedit.cmi lib/pp.cmi parsing/printer.cmi \
+ proofs/proof_type.cmi pretyping/rawterm.cmi kernel/reduction.cmi \
+ pretyping/retyping.cmi kernel/sign.cmi library/summary.cmi \
+ proofs/tacmach.cmi pretyping/tacred.cmi tactics/tacticals.cmi \
+ tactics/tactics.cmi kernel/term.cmi pretyping/typing.cmi lib/util.cmi \
toplevel/vernacinterp.cmi tactics/auto.cmi
tactics/auto.cmx: parsing/astterm.cmx tactics/btermdn.cmx proofs/clenv.cmx \
parsing/coqast.cmx library/declare.cmx tactics/dhyp.cmx kernel/evd.cmx \
- kernel/generic.cmx library/global.cmx tactics/hiddentac.cmx \
- tactics/hipattern.cmx kernel/inductive.cmx library/lib.cmx \
- library/libobject.cmx library/library.cmx proofs/logic.cmx \
- kernel/names.cmx lib/options.cmx parsing/pattern.cmx proofs/pfedit.cmx \
- lib/pp.cmx parsing/printer.cmx proofs/proof_type.cmx \
- pretyping/rawterm.cmx kernel/reduction.cmx pretyping/retyping.cmx \
- kernel/sign.cmx library/summary.cmx proofs/tacmach.cmx \
- pretyping/tacred.cmx tactics/tacticals.cmx tactics/tactics.cmx \
- kernel/term.cmx pretyping/typing.cmx lib/util.cmx \
+ library/global.cmx tactics/hiddentac.cmx tactics/hipattern.cmx \
+ kernel/inductive.cmx library/lib.cmx library/libobject.cmx \
+ library/library.cmx proofs/logic.cmx kernel/names.cmx lib/options.cmx \
+ parsing/pattern.cmx proofs/pfedit.cmx lib/pp.cmx parsing/printer.cmx \
+ proofs/proof_type.cmx pretyping/rawterm.cmx kernel/reduction.cmx \
+ pretyping/retyping.cmx kernel/sign.cmx library/summary.cmx \
+ proofs/tacmach.cmx pretyping/tacred.cmx tactics/tacticals.cmx \
+ tactics/tactics.cmx kernel/term.cmx pretyping/typing.cmx lib/util.cmx \
toplevel/vernacinterp.cmx tactics/auto.cmi
tactics/btermdn.cmo: tactics/dn.cmi parsing/pattern.cmi kernel/term.cmi \
tactics/termdn.cmi tactics/btermdn.cmi
tactics/btermdn.cmx: tactics/dn.cmx parsing/pattern.cmx kernel/term.cmx \
tactics/termdn.cmx tactics/btermdn.cmi
tactics/dhyp.cmo: parsing/ast.cmi parsing/astterm.cmi proofs/clenv.cmi \
- parsing/coqast.cmi kernel/environ.cmi kernel/evd.cmi kernel/generic.cmi \
- library/global.cmi library/lib.cmi library/libobject.cmi \
- library/library.cmi kernel/names.cmi tactics/nbtermdn.cmi \
- parsing/pattern.cmi parsing/pcoq.cmi lib/pp.cmi proofs/proof_type.cmi \
- pretyping/rawterm.cmi kernel/reduction.cmi library/summary.cmi \
- proofs/tacinterp.cmi proofs/tacmach.cmi tactics/tacticals.cmi \
- tactics/tactics.cmi kernel/term.cmi lib/util.cmi \
- toplevel/vernacinterp.cmi tactics/dhyp.cmi
+ parsing/coqast.cmi kernel/environ.cmi kernel/evd.cmi library/global.cmi \
+ library/lib.cmi library/libobject.cmi library/library.cmi \
+ kernel/names.cmi tactics/nbtermdn.cmi parsing/pattern.cmi \
+ parsing/pcoq.cmi lib/pp.cmi proofs/proof_type.cmi pretyping/rawterm.cmi \
+ kernel/reduction.cmi library/summary.cmi proofs/tacinterp.cmi \
+ proofs/tacmach.cmi tactics/tacticals.cmi tactics/tactics.cmi \
+ kernel/term.cmi lib/util.cmi toplevel/vernacinterp.cmi tactics/dhyp.cmi
tactics/dhyp.cmx: parsing/ast.cmx parsing/astterm.cmx proofs/clenv.cmx \
- parsing/coqast.cmx kernel/environ.cmx kernel/evd.cmx kernel/generic.cmx \
- library/global.cmx library/lib.cmx library/libobject.cmx \
- library/library.cmx kernel/names.cmx tactics/nbtermdn.cmx \
- parsing/pattern.cmx parsing/pcoq.cmx lib/pp.cmx proofs/proof_type.cmx \
- pretyping/rawterm.cmx kernel/reduction.cmx library/summary.cmx \
- proofs/tacinterp.cmx proofs/tacmach.cmx tactics/tacticals.cmx \
- tactics/tactics.cmx kernel/term.cmx lib/util.cmx \
- toplevel/vernacinterp.cmx tactics/dhyp.cmi
+ parsing/coqast.cmx kernel/environ.cmx kernel/evd.cmx library/global.cmx \
+ library/lib.cmx library/libobject.cmx library/library.cmx \
+ kernel/names.cmx tactics/nbtermdn.cmx parsing/pattern.cmx \
+ parsing/pcoq.cmx lib/pp.cmx proofs/proof_type.cmx pretyping/rawterm.cmx \
+ kernel/reduction.cmx library/summary.cmx proofs/tacinterp.cmx \
+ proofs/tacmach.cmx tactics/tacticals.cmx tactics/tactics.cmx \
+ kernel/term.cmx lib/util.cmx toplevel/vernacinterp.cmx tactics/dhyp.cmi
tactics/dn.cmo: lib/tlm.cmi tactics/dn.cmi
tactics/dn.cmx: lib/tlm.cmx tactics/dn.cmi
tactics/eauto.cmo: tactics/auto.cmi proofs/clenv.cmi kernel/evd.cmi \
- kernel/generic.cmi kernel/instantiate.cmi kernel/names.cmi \
- parsing/pattern.cmi lib/pp.cmi proofs/proof_trees.cmi \
- proofs/proof_type.cmi kernel/reduction.cmi kernel/sign.cmi \
- proofs/tacmach.cmi tactics/tacticals.cmi tactics/tactics.cmi \
- kernel/term.cmi lib/util.cmi
+ kernel/instantiate.cmi kernel/names.cmi parsing/pattern.cmi lib/pp.cmi \
+ proofs/proof_trees.cmi proofs/proof_type.cmi kernel/reduction.cmi \
+ kernel/sign.cmi proofs/tacmach.cmi tactics/tacticals.cmi \
+ tactics/tactics.cmi kernel/term.cmi lib/util.cmi
tactics/eauto.cmx: tactics/auto.cmx proofs/clenv.cmx kernel/evd.cmx \
- kernel/generic.cmx kernel/instantiate.cmx kernel/names.cmx \
- parsing/pattern.cmx lib/pp.cmx proofs/proof_trees.cmx \
- proofs/proof_type.cmx kernel/reduction.cmx kernel/sign.cmx \
- proofs/tacmach.cmx tactics/tacticals.cmx tactics/tactics.cmx \
- kernel/term.cmx lib/util.cmx
-tactics/elim.cmo: proofs/clenv.cmi kernel/generic.cmi tactics/hiddentac.cmi \
+ kernel/instantiate.cmx kernel/names.cmx parsing/pattern.cmx lib/pp.cmx \
+ proofs/proof_trees.cmx proofs/proof_type.cmx kernel/reduction.cmx \
+ kernel/sign.cmx proofs/tacmach.cmx tactics/tacticals.cmx \
+ tactics/tactics.cmx kernel/term.cmx lib/util.cmx
+tactics/elim.cmo: proofs/clenv.cmi tactics/hiddentac.cmi \
tactics/hipattern.cmi kernel/inductive.cmi kernel/names.cmi lib/pp.cmi \
proofs/proof_type.cmi kernel/reduction.cmi proofs/tacmach.cmi \
tactics/tacticals.cmi tactics/tactics.cmi kernel/term.cmi lib/util.cmi \
tactics/elim.cmi
-tactics/elim.cmx: proofs/clenv.cmx kernel/generic.cmx tactics/hiddentac.cmx \
+tactics/elim.cmx: proofs/clenv.cmx tactics/hiddentac.cmx \
tactics/hipattern.cmx kernel/inductive.cmx kernel/names.cmx lib/pp.cmx \
proofs/proof_type.cmx kernel/reduction.cmx proofs/tacmach.cmx \
tactics/tacticals.cmx tactics/tactics.cmx kernel/term.cmx lib/util.cmx \
tactics/elim.cmi
tactics/equality.cmo: parsing/astterm.cmi parsing/coqast.cmi \
- library/declare.cmi kernel/environ.cmi kernel/evd.cmi kernel/generic.cmi \
- library/global.cmi lib/gmapl.cmi tactics/hipattern.cmi \
- kernel/inductive.cmi kernel/instantiate.cmi library/lib.cmi \
- library/libobject.cmi proofs/logic.cmi kernel/names.cmi \
- parsing/pattern.cmi lib/pp.cmi proofs/proof_type.cmi kernel/reduction.cmi \
- pretyping/retyping.cmi library/summary.cmi proofs/tacinterp.cmi \
- proofs/tacmach.cmi pretyping/tacred.cmi tactics/tacticals.cmi \
- tactics/tactics.cmi kernel/term.cmi kernel/typeops.cmi \
- pretyping/typing.cmi kernel/univ.cmi lib/util.cmi \
- toplevel/vernacinterp.cmi tactics/wcclausenv.cmi tactics/equality.cmi
+ library/declare.cmi kernel/environ.cmi kernel/evd.cmi library/global.cmi \
+ lib/gmapl.cmi tactics/hipattern.cmi kernel/inductive.cmi \
+ kernel/instantiate.cmi library/lib.cmi library/libobject.cmi \
+ proofs/logic.cmi kernel/names.cmi parsing/pattern.cmi lib/pp.cmi \
+ proofs/proof_type.cmi kernel/reduction.cmi pretyping/retyping.cmi \
+ library/summary.cmi proofs/tacinterp.cmi proofs/tacmach.cmi \
+ pretyping/tacred.cmi tactics/tacticals.cmi tactics/tactics.cmi \
+ kernel/term.cmi kernel/typeops.cmi pretyping/typing.cmi kernel/univ.cmi \
+ lib/util.cmi toplevel/vernacinterp.cmi tactics/wcclausenv.cmi \
+ tactics/equality.cmi
tactics/equality.cmx: parsing/astterm.cmx parsing/coqast.cmx \
- library/declare.cmx kernel/environ.cmx kernel/evd.cmx kernel/generic.cmx \
- library/global.cmx lib/gmapl.cmx tactics/hipattern.cmx \
- kernel/inductive.cmx kernel/instantiate.cmx library/lib.cmx \
- library/libobject.cmx proofs/logic.cmx kernel/names.cmx \
- parsing/pattern.cmx lib/pp.cmx proofs/proof_type.cmx kernel/reduction.cmx \
- pretyping/retyping.cmx library/summary.cmx proofs/tacinterp.cmx \
- proofs/tacmach.cmx pretyping/tacred.cmx tactics/tacticals.cmx \
- tactics/tactics.cmx kernel/term.cmx kernel/typeops.cmx \
- pretyping/typing.cmx kernel/univ.cmx lib/util.cmx \
- toplevel/vernacinterp.cmx tactics/wcclausenv.cmx tactics/equality.cmi
+ library/declare.cmx kernel/environ.cmx kernel/evd.cmx library/global.cmx \
+ lib/gmapl.cmx tactics/hipattern.cmx kernel/inductive.cmx \
+ kernel/instantiate.cmx library/lib.cmx library/libobject.cmx \
+ proofs/logic.cmx kernel/names.cmx parsing/pattern.cmx lib/pp.cmx \
+ proofs/proof_type.cmx kernel/reduction.cmx pretyping/retyping.cmx \
+ library/summary.cmx proofs/tacinterp.cmx proofs/tacmach.cmx \
+ pretyping/tacred.cmx tactics/tacticals.cmx tactics/tactics.cmx \
+ kernel/term.cmx kernel/typeops.cmx pretyping/typing.cmx kernel/univ.cmx \
+ lib/util.cmx toplevel/vernacinterp.cmx tactics/wcclausenv.cmx \
+ tactics/equality.cmi
tactics/hiddentac.cmo: proofs/proof_type.cmi tactics/tacentries.cmi \
proofs/tacmach.cmi kernel/term.cmi tactics/hiddentac.cmi
tactics/hiddentac.cmx: proofs/proof_type.cmx tactics/tacentries.cmx \
proofs/tacmach.cmx kernel/term.cmx tactics/hiddentac.cmi
tactics/hipattern.cmo: parsing/astterm.cmi proofs/clenv.cmi \
- library/declare.cmi kernel/environ.cmi kernel/evd.cmi kernel/generic.cmi \
- library/global.cmi kernel/inductive.cmi library/library.cmi \
- kernel/names.cmi parsing/pattern.cmi parsing/pcoq.cmi lib/pp.cmi \
- parsing/printer.cmi proofs/proof_trees.cmi kernel/reduction.cmi \
- kernel/sosub.cmi proofs/stock.cmi kernel/term.cmi lib/util.cmi \
- tactics/hipattern.cmi
+ library/declare.cmi kernel/environ.cmi kernel/evd.cmi library/global.cmi \
+ kernel/inductive.cmi library/library.cmi kernel/names.cmi \
+ parsing/pattern.cmi parsing/pcoq.cmi lib/pp.cmi parsing/printer.cmi \
+ proofs/proof_trees.cmi kernel/reduction.cmi kernel/sosub.cmi \
+ proofs/stock.cmi kernel/term.cmi lib/util.cmi tactics/hipattern.cmi
tactics/hipattern.cmx: parsing/astterm.cmx proofs/clenv.cmx \
- library/declare.cmx kernel/environ.cmx kernel/evd.cmx kernel/generic.cmx \
- library/global.cmx kernel/inductive.cmx library/library.cmx \
- kernel/names.cmx parsing/pattern.cmx parsing/pcoq.cmx lib/pp.cmx \
- parsing/printer.cmx proofs/proof_trees.cmx kernel/reduction.cmx \
- kernel/sosub.cmx proofs/stock.cmx kernel/term.cmx lib/util.cmx \
- tactics/hipattern.cmi
+ library/declare.cmx kernel/environ.cmx kernel/evd.cmx library/global.cmx \
+ kernel/inductive.cmx library/library.cmx kernel/names.cmx \
+ parsing/pattern.cmx parsing/pcoq.cmx lib/pp.cmx parsing/printer.cmx \
+ proofs/proof_trees.cmx kernel/reduction.cmx kernel/sosub.cmx \
+ proofs/stock.cmx kernel/term.cmx lib/util.cmx tactics/hipattern.cmi
tactics/inv.cmo: tactics/auto.cmi proofs/clenv.cmi tactics/elim.cmi \
- kernel/environ.cmi tactics/equality.cmi kernel/evd.cmi kernel/generic.cmi \
- library/global.cmi kernel/inductive.cmi kernel/names.cmi \
- parsing/pattern.cmi lib/pp.cmi parsing/printer.cmi proofs/proof_type.cmi \
- kernel/reduction.cmi pretyping/retyping.cmi kernel/sign.cmi \
- proofs/tacmach.cmi tactics/tacticals.cmi tactics/tactics.cmi \
- kernel/term.cmi pretyping/typing.cmi lib/util.cmi tactics/wcclausenv.cmi \
- tactics/inv.cmi
+ kernel/environ.cmi tactics/equality.cmi kernel/evd.cmi library/global.cmi \
+ kernel/inductive.cmi kernel/names.cmi parsing/pattern.cmi lib/pp.cmi \
+ parsing/printer.cmi proofs/proof_type.cmi kernel/reduction.cmi \
+ pretyping/retyping.cmi kernel/sign.cmi proofs/tacmach.cmi \
+ tactics/tacticals.cmi tactics/tactics.cmi kernel/term.cmi \
+ pretyping/typing.cmi lib/util.cmi tactics/wcclausenv.cmi tactics/inv.cmi
tactics/inv.cmx: tactics/auto.cmx proofs/clenv.cmx tactics/elim.cmx \
- kernel/environ.cmx tactics/equality.cmx kernel/evd.cmx kernel/generic.cmx \
- library/global.cmx kernel/inductive.cmx kernel/names.cmx \
- parsing/pattern.cmx lib/pp.cmx parsing/printer.cmx proofs/proof_type.cmx \
- kernel/reduction.cmx pretyping/retyping.cmx kernel/sign.cmx \
- proofs/tacmach.cmx tactics/tacticals.cmx tactics/tactics.cmx \
- kernel/term.cmx pretyping/typing.cmx lib/util.cmx tactics/wcclausenv.cmx \
- tactics/inv.cmi
+ kernel/environ.cmx tactics/equality.cmx kernel/evd.cmx library/global.cmx \
+ kernel/inductive.cmx kernel/names.cmx parsing/pattern.cmx lib/pp.cmx \
+ parsing/printer.cmx proofs/proof_type.cmx kernel/reduction.cmx \
+ pretyping/retyping.cmx kernel/sign.cmx proofs/tacmach.cmx \
+ tactics/tacticals.cmx tactics/tactics.cmx kernel/term.cmx \
+ pretyping/typing.cmx lib/util.cmx tactics/wcclausenv.cmx tactics/inv.cmi
tactics/leminv.cmo: parsing/astterm.cmi proofs/clenv.cmi \
kernel/declarations.cmi library/declare.cmi kernel/environ.cmi \
- kernel/evd.cmi kernel/generic.cmi library/global.cmi kernel/inductive.cmi \
- tactics/inv.cmi kernel/names.cmi proofs/pfedit.cmi lib/pp.cmi \
- parsing/printer.cmi proofs/proof_trees.cmi proofs/proof_type.cmi \
- kernel/reduction.cmi pretyping/retyping.cmi kernel/sign.cmi \
- proofs/tacmach.cmi tactics/tacticals.cmi tactics/tactics.cmi \
- kernel/term.cmi lib/util.cmi toplevel/vernacinterp.cmi \
- tactics/wcclausenv.cmi
+ kernel/evd.cmi library/global.cmi kernel/inductive.cmi tactics/inv.cmi \
+ kernel/names.cmi proofs/pfedit.cmi lib/pp.cmi parsing/printer.cmi \
+ proofs/proof_trees.cmi proofs/proof_type.cmi kernel/reduction.cmi \
+ pretyping/retyping.cmi kernel/sign.cmi proofs/tacmach.cmi \
+ tactics/tacticals.cmi tactics/tactics.cmi kernel/term.cmi lib/util.cmi \
+ toplevel/vernacinterp.cmi tactics/wcclausenv.cmi
tactics/leminv.cmx: parsing/astterm.cmx proofs/clenv.cmx \
kernel/declarations.cmx library/declare.cmx kernel/environ.cmx \
- kernel/evd.cmx kernel/generic.cmx library/global.cmx kernel/inductive.cmx \
- tactics/inv.cmx kernel/names.cmx proofs/pfedit.cmx lib/pp.cmx \
- parsing/printer.cmx proofs/proof_trees.cmx proofs/proof_type.cmx \
- kernel/reduction.cmx pretyping/retyping.cmx kernel/sign.cmx \
- proofs/tacmach.cmx tactics/tacticals.cmx tactics/tactics.cmx \
- kernel/term.cmx lib/util.cmx toplevel/vernacinterp.cmx \
- tactics/wcclausenv.cmx
-tactics/nbtermdn.cmo: tactics/btermdn.cmi kernel/generic.cmi lib/gmap.cmi \
- library/libobject.cmi library/library.cmi kernel/names.cmi \
- parsing/pattern.cmi kernel/term.cmi tactics/termdn.cmi lib/util.cmi \
- tactics/nbtermdn.cmi
-tactics/nbtermdn.cmx: tactics/btermdn.cmx kernel/generic.cmx lib/gmap.cmx \
- library/libobject.cmx library/library.cmx kernel/names.cmx \
- parsing/pattern.cmx kernel/term.cmx tactics/termdn.cmx lib/util.cmx \
- tactics/nbtermdn.cmi
+ kernel/evd.cmx library/global.cmx kernel/inductive.cmx tactics/inv.cmx \
+ kernel/names.cmx proofs/pfedit.cmx lib/pp.cmx parsing/printer.cmx \
+ proofs/proof_trees.cmx proofs/proof_type.cmx kernel/reduction.cmx \
+ pretyping/retyping.cmx kernel/sign.cmx proofs/tacmach.cmx \
+ tactics/tacticals.cmx tactics/tactics.cmx kernel/term.cmx lib/util.cmx \
+ toplevel/vernacinterp.cmx tactics/wcclausenv.cmx
+tactics/nbtermdn.cmo: tactics/btermdn.cmi lib/gmap.cmi library/libobject.cmi \
+ library/library.cmi kernel/names.cmi parsing/pattern.cmi kernel/term.cmi \
+ tactics/termdn.cmi lib/util.cmi tactics/nbtermdn.cmi
+tactics/nbtermdn.cmx: tactics/btermdn.cmx lib/gmap.cmx library/libobject.cmx \
+ library/library.cmx kernel/names.cmx parsing/pattern.cmx kernel/term.cmx \
+ tactics/termdn.cmx lib/util.cmx tactics/nbtermdn.cmi
tactics/refine.cmo: parsing/astterm.cmi kernel/environ.cmi kernel/evd.cmi \
- kernel/generic.cmi kernel/names.cmi lib/pp.cmi pretyping/pretyping.cmi \
- parsing/printer.cmi proofs/proof_type.cmi kernel/reduction.cmi \
- pretyping/retyping.cmi kernel/sign.cmi proofs/tacmach.cmi \
- tactics/tacticals.cmi tactics/tactics.cmi kernel/term.cmi \
- pretyping/typing.cmi lib/util.cmi tactics/refine.cmi
+ kernel/names.cmi lib/pp.cmi pretyping/pretyping.cmi parsing/printer.cmi \
+ proofs/proof_type.cmi kernel/reduction.cmi pretyping/retyping.cmi \
+ kernel/sign.cmi proofs/tacmach.cmi tactics/tacticals.cmi \
+ tactics/tactics.cmi kernel/term.cmi pretyping/typing.cmi lib/util.cmi \
+ tactics/refine.cmi
tactics/refine.cmx: parsing/astterm.cmx kernel/environ.cmx kernel/evd.cmx \
- kernel/generic.cmx kernel/names.cmx lib/pp.cmx pretyping/pretyping.cmx \
- parsing/printer.cmx proofs/proof_type.cmx kernel/reduction.cmx \
- pretyping/retyping.cmx kernel/sign.cmx proofs/tacmach.cmx \
- tactics/tacticals.cmx tactics/tactics.cmx kernel/term.cmx \
- pretyping/typing.cmx lib/util.cmx tactics/refine.cmi
+ kernel/names.cmx lib/pp.cmx pretyping/pretyping.cmx parsing/printer.cmx \
+ proofs/proof_type.cmx kernel/reduction.cmx pretyping/retyping.cmx \
+ kernel/sign.cmx proofs/tacmach.cmx tactics/tacticals.cmx \
+ tactics/tactics.cmx kernel/term.cmx pretyping/typing.cmx lib/util.cmx \
+ tactics/refine.cmi
tactics/tacentries.cmo: proofs/proof_trees.cmi proofs/tacmach.cmi \
tactics/tacticals.cmi tactics/tactics.cmi tactics/tacentries.cmi
tactics/tacentries.cmx: proofs/proof_trees.cmx proofs/tacmach.cmx \
tactics/tacticals.cmx tactics/tactics.cmx tactics/tacentries.cmi
tactics/tacticals.cmo: proofs/clenv.cmi parsing/coqast.cmi \
kernel/declarations.cmi library/declare.cmi kernel/environ.cmi \
- kernel/evd.cmi kernel/generic.cmi library/global.cmi library/indrec.cmi \
- kernel/inductive.cmi kernel/names.cmi parsing/pattern.cmi lib/pp.cmi \
- parsing/pretty.cmi kernel/reduction.cmi kernel/sign.cmi lib/stamps.cmi \
- proofs/tacinterp.cmi proofs/tacmach.cmi kernel/term.cmi \
- parsing/termast.cmi lib/util.cmi tactics/wcclausenv.cmi \
- tactics/tacticals.cmi
+ kernel/evd.cmi library/global.cmi library/indrec.cmi kernel/inductive.cmi \
+ kernel/names.cmi parsing/pattern.cmi lib/pp.cmi parsing/pretty.cmi \
+ kernel/reduction.cmi kernel/sign.cmi lib/stamps.cmi proofs/tacinterp.cmi \
+ proofs/tacmach.cmi kernel/term.cmi parsing/termast.cmi lib/util.cmi \
+ tactics/wcclausenv.cmi tactics/tacticals.cmi
tactics/tacticals.cmx: proofs/clenv.cmx parsing/coqast.cmx \
kernel/declarations.cmx library/declare.cmx kernel/environ.cmx \
- kernel/evd.cmx kernel/generic.cmx library/global.cmx library/indrec.cmx \
- kernel/inductive.cmx kernel/names.cmx parsing/pattern.cmx lib/pp.cmx \
- parsing/pretty.cmx kernel/reduction.cmx kernel/sign.cmx lib/stamps.cmx \
- proofs/tacinterp.cmx proofs/tacmach.cmx kernel/term.cmx \
- parsing/termast.cmx lib/util.cmx tactics/wcclausenv.cmx \
- tactics/tacticals.cmi
+ kernel/evd.cmx library/global.cmx library/indrec.cmx kernel/inductive.cmx \
+ kernel/names.cmx parsing/pattern.cmx lib/pp.cmx parsing/pretty.cmx \
+ kernel/reduction.cmx kernel/sign.cmx lib/stamps.cmx proofs/tacinterp.cmx \
+ proofs/tacmach.cmx kernel/term.cmx parsing/termast.cmx lib/util.cmx \
+ tactics/wcclausenv.cmx tactics/tacticals.cmi
tactics/tactics.cmo: parsing/ast.cmi parsing/astterm.cmi proofs/clenv.cmi \
- library/declare.cmi kernel/environ.cmi kernel/evd.cmi kernel/generic.cmi \
- library/global.cmi tactics/hipattern.cmi library/indrec.cmi \
- kernel/inductive.cmi proofs/logic.cmi kernel/names.cmi proofs/pfedit.cmi \
- lib/pp.cmi proofs/proof_trees.cmi proofs/proof_type.cmi \
- kernel/reduction.cmi kernel/sign.cmi lib/stamps.cmi proofs/tacinterp.cmi \
- proofs/tacmach.cmi pretyping/tacred.cmi tactics/tacticals.cmi \
- kernel/term.cmi lib/util.cmi tactics/tactics.cmi
+ library/declare.cmi kernel/environ.cmi kernel/evd.cmi library/global.cmi \
+ tactics/hipattern.cmi library/indrec.cmi kernel/inductive.cmi \
+ proofs/logic.cmi kernel/names.cmi proofs/pfedit.cmi lib/pp.cmi \
+ proofs/proof_trees.cmi proofs/proof_type.cmi kernel/reduction.cmi \
+ kernel/sign.cmi lib/stamps.cmi proofs/tacinterp.cmi proofs/tacmach.cmi \
+ pretyping/tacred.cmi tactics/tacticals.cmi kernel/term.cmi lib/util.cmi \
+ tactics/tactics.cmi
tactics/tactics.cmx: parsing/ast.cmx parsing/astterm.cmx proofs/clenv.cmx \
- library/declare.cmx kernel/environ.cmx kernel/evd.cmx kernel/generic.cmx \
- library/global.cmx tactics/hipattern.cmx library/indrec.cmx \
- kernel/inductive.cmx proofs/logic.cmx kernel/names.cmx proofs/pfedit.cmx \
- lib/pp.cmx proofs/proof_trees.cmx proofs/proof_type.cmx \
- kernel/reduction.cmx kernel/sign.cmx lib/stamps.cmx proofs/tacinterp.cmx \
- proofs/tacmach.cmx pretyping/tacred.cmx tactics/tacticals.cmx \
- kernel/term.cmx lib/util.cmx tactics/tactics.cmi
+ library/declare.cmx kernel/environ.cmx kernel/evd.cmx library/global.cmx \
+ tactics/hipattern.cmx library/indrec.cmx kernel/inductive.cmx \
+ proofs/logic.cmx kernel/names.cmx proofs/pfedit.cmx lib/pp.cmx \
+ proofs/proof_trees.cmx proofs/proof_type.cmx kernel/reduction.cmx \
+ kernel/sign.cmx lib/stamps.cmx proofs/tacinterp.cmx proofs/tacmach.cmx \
+ pretyping/tacred.cmx tactics/tacticals.cmx kernel/term.cmx lib/util.cmx \
+ tactics/tactics.cmi
tactics/tauto.cmo: tactics/auto.cmi proofs/clenv.cmi library/declare.cmi \
- kernel/environ.cmi kernel/generic.cmi tactics/hipattern.cmi \
- kernel/names.cmi library/nametab.cmi parsing/pattern.cmi lib/pp.cmi \
- proofs/proof_trees.cmi kernel/reduction.cmi pretyping/retyping.cmi \
- kernel/sign.cmi proofs/tacmach.cmi tactics/tacticals.cmi \
- tactics/tactics.cmi kernel/term.cmi lib/util.cmi tactics/tauto.cmi
+ kernel/environ.cmi tactics/hipattern.cmi kernel/names.cmi \
+ library/nametab.cmi parsing/pattern.cmi lib/pp.cmi proofs/proof_trees.cmi \
+ kernel/reduction.cmi pretyping/retyping.cmi kernel/sign.cmi \
+ proofs/tacmach.cmi tactics/tacticals.cmi tactics/tactics.cmi \
+ kernel/term.cmi lib/util.cmi tactics/tauto.cmi
tactics/tauto.cmx: tactics/auto.cmx proofs/clenv.cmx library/declare.cmx \
- kernel/environ.cmx kernel/generic.cmx tactics/hipattern.cmx \
- kernel/names.cmx library/nametab.cmx parsing/pattern.cmx lib/pp.cmx \
- proofs/proof_trees.cmx kernel/reduction.cmx pretyping/retyping.cmx \
- kernel/sign.cmx proofs/tacmach.cmx tactics/tacticals.cmx \
- tactics/tactics.cmx kernel/term.cmx lib/util.cmx tactics/tauto.cmi
-tactics/termdn.cmo: tactics/dn.cmi kernel/generic.cmi kernel/names.cmi \
- parsing/pattern.cmi kernel/term.cmi lib/util.cmi tactics/termdn.cmi
-tactics/termdn.cmx: tactics/dn.cmx kernel/generic.cmx kernel/names.cmx \
- parsing/pattern.cmx kernel/term.cmx lib/util.cmx tactics/termdn.cmi
+ kernel/environ.cmx tactics/hipattern.cmx kernel/names.cmx \
+ library/nametab.cmx parsing/pattern.cmx lib/pp.cmx proofs/proof_trees.cmx \
+ kernel/reduction.cmx pretyping/retyping.cmx kernel/sign.cmx \
+ proofs/tacmach.cmx tactics/tacticals.cmx tactics/tactics.cmx \
+ kernel/term.cmx lib/util.cmx tactics/tauto.cmi
+tactics/termdn.cmo: tactics/dn.cmi kernel/names.cmi parsing/pattern.cmi \
+ kernel/term.cmi lib/util.cmi tactics/termdn.cmi
+tactics/termdn.cmx: tactics/dn.cmx kernel/names.cmx parsing/pattern.cmx \
+ kernel/term.cmx lib/util.cmx tactics/termdn.cmi
tactics/wcclausenv.cmo: proofs/clenv.cmi kernel/environ.cmi kernel/evd.cmi \
- kernel/generic.cmi library/global.cmi proofs/logic.cmi kernel/names.cmi \
- lib/pp.cmi proofs/proof_trees.cmi kernel/reduction.cmi \
- pretyping/retyping.cmi kernel/sign.cmi proofs/tacmach.cmi kernel/term.cmi \
- lib/util.cmi tactics/wcclausenv.cmi
+ library/global.cmi proofs/logic.cmi kernel/names.cmi lib/pp.cmi \
+ proofs/proof_trees.cmi kernel/reduction.cmi pretyping/retyping.cmi \
+ kernel/sign.cmi proofs/tacmach.cmi kernel/term.cmi lib/util.cmi \
+ tactics/wcclausenv.cmi
tactics/wcclausenv.cmx: proofs/clenv.cmx kernel/environ.cmx kernel/evd.cmx \
- kernel/generic.cmx library/global.cmx proofs/logic.cmx kernel/names.cmx \
- lib/pp.cmx proofs/proof_trees.cmx kernel/reduction.cmx \
- pretyping/retyping.cmx kernel/sign.cmx proofs/tacmach.cmx kernel/term.cmx \
- lib/util.cmx tactics/wcclausenv.cmi
-tools/coqdep_lexer.cmo: config/coq_config.cmi
-tools/coqdep_lexer.cmx: config/coq_config.cmx
-tools/coqdep.cmo: config/coq_config.cmi tools/coqdep_lexer.cmo
-tools/coqdep.cmx: config/coq_config.cmx tools/coqdep_lexer.cmx
+ library/global.cmx proofs/logic.cmx kernel/names.cmx lib/pp.cmx \
+ proofs/proof_trees.cmx kernel/reduction.cmx pretyping/retyping.cmx \
+ kernel/sign.cmx proofs/tacmach.cmx kernel/term.cmx lib/util.cmx \
+ tactics/wcclausenv.cmi
+tools/coqdep.cmo: config/coq_config.cmi
+tools/coqdep.cmx: config/coq_config.cmx
toplevel/command.cmo: parsing/ast.cmi parsing/astterm.cmi parsing/coqast.cmi \
kernel/declarations.cmi library/declare.cmi kernel/environ.cmi \
- kernel/evd.cmi kernel/generic.cmi library/global.cmi library/indrec.cmi \
- kernel/inductive.cmi library/lib.cmi library/libobject.cmi \
- library/library.cmi proofs/logic.cmi kernel/names.cmi lib/options.cmi \
- proofs/pfedit.cmi lib/pp.cmi kernel/reduction.cmi library/states.cmi \
+ kernel/evd.cmi library/global.cmi library/indrec.cmi kernel/inductive.cmi \
+ library/lib.cmi library/libobject.cmi library/library.cmi \
+ proofs/logic.cmi kernel/names.cmi lib/options.cmi proofs/pfedit.cmi \
+ lib/pp.cmi kernel/reduction.cmi library/states.cmi \
pretyping/syntax_def.cmi pretyping/tacred.cmi kernel/term.cmi \
- lib/util.cmi toplevel/command.cmi
+ kernel/typeops.cmi lib/util.cmi toplevel/command.cmi
toplevel/command.cmx: parsing/ast.cmx parsing/astterm.cmx parsing/coqast.cmx \
kernel/declarations.cmx library/declare.cmx kernel/environ.cmx \
- kernel/evd.cmx kernel/generic.cmx library/global.cmx library/indrec.cmx \
- kernel/inductive.cmx library/lib.cmx library/libobject.cmx \
- library/library.cmx proofs/logic.cmx kernel/names.cmx lib/options.cmx \
- proofs/pfedit.cmx lib/pp.cmx kernel/reduction.cmx library/states.cmx \
+ kernel/evd.cmx library/global.cmx library/indrec.cmx kernel/inductive.cmx \
+ library/lib.cmx library/libobject.cmx library/library.cmx \
+ proofs/logic.cmx kernel/names.cmx lib/options.cmx proofs/pfedit.cmx \
+ lib/pp.cmx kernel/reduction.cmx library/states.cmx \
pretyping/syntax_def.cmx pretyping/tacred.cmx kernel/term.cmx \
- lib/util.cmx toplevel/command.cmi
-toplevel/coqinit.cmo: config/coq_config.cmi toplevel/mltop.cmi \
- lib/options.cmi lib/pp.cmi lib/system.cmi toplevel/toplevel.cmi \
- toplevel/vernac.cmi toplevel/coqinit.cmi
-toplevel/coqinit.cmx: config/coq_config.cmx toplevel/mltop.cmi \
- lib/options.cmx lib/pp.cmx lib/system.cmx toplevel/toplevel.cmx \
- toplevel/vernac.cmx toplevel/coqinit.cmi
+ kernel/typeops.cmx lib/util.cmx toplevel/command.cmi
+toplevel/coqinit.cmo: config/coq_config.cmi library/library.cmi \
+ toplevel/mltop.cmi lib/options.cmi lib/pp.cmi lib/system.cmi \
+ toplevel/toplevel.cmi toplevel/vernac.cmi toplevel/coqinit.cmi
+toplevel/coqinit.cmx: config/coq_config.cmx library/library.cmx \
+ toplevel/mltop.cmi lib/options.cmx lib/pp.cmx lib/system.cmx \
+ toplevel/toplevel.cmx toplevel/vernac.cmx toplevel/coqinit.cmi
toplevel/coqtop.cmo: config/coq_config.cmi toplevel/coqinit.cmi \
toplevel/errors.cmi library/lib.cmi library/library.cmi \
toplevel/mltop.cmi lib/options.cmi lib/pp.cmi lib/profile.cmi \
@@ -1034,14 +983,14 @@ toplevel/coqtop.cmx: config/coq_config.cmx toplevel/coqinit.cmx \
toplevel/usage.cmx lib/util.cmx toplevel/vernac.cmx toplevel/coqtop.cmi
toplevel/discharge.cmo: pretyping/class.cmi pretyping/classops.cmi \
kernel/declarations.cmi library/declare.cmi kernel/environ.cmi \
- kernel/evd.cmi kernel/generic.cmi library/global.cmi kernel/inductive.cmi \
+ kernel/evd.cmi library/global.cmi kernel/inductive.cmi \
kernel/instantiate.cmi library/lib.cmi library/libobject.cmi \
kernel/names.cmi lib/options.cmi lib/pp.cmi pretyping/recordops.cmi \
kernel/reduction.cmi kernel/sign.cmi kernel/term.cmi kernel/typeops.cmi \
lib/util.cmi toplevel/discharge.cmi
toplevel/discharge.cmx: pretyping/class.cmx pretyping/classops.cmx \
kernel/declarations.cmx library/declare.cmx kernel/environ.cmx \
- kernel/evd.cmx kernel/generic.cmx library/global.cmx kernel/inductive.cmx \
+ kernel/evd.cmx library/global.cmx kernel/inductive.cmx \
kernel/instantiate.cmx library/lib.cmx library/libobject.cmx \
kernel/names.cmx lib/options.cmx lib/pp.cmx pretyping/recordops.cmx \
kernel/reduction.cmx kernel/sign.cmx kernel/term.cmx kernel/typeops.cmx \
@@ -1055,25 +1004,23 @@ toplevel/errors.cmx: parsing/ast.cmx toplevel/himsg.cmx kernel/indtypes.cmx \
proofs/tacmach.cmx kernel/type_errors.cmx lib/util.cmx \
toplevel/errors.cmi
toplevel/fhimsg.cmo: kernel/environ.cmi parsing/g_minicoq.cmi \
- kernel/generic.cmi kernel/names.cmi lib/pp.cmi kernel/reduction.cmi \
- kernel/sign.cmi kernel/term.cmi kernel/type_errors.cmi lib/util.cmi \
- toplevel/fhimsg.cmi
+ kernel/names.cmi lib/pp.cmi kernel/reduction.cmi kernel/sign.cmi \
+ kernel/term.cmi kernel/type_errors.cmi lib/util.cmi toplevel/fhimsg.cmi
toplevel/fhimsg.cmx: kernel/environ.cmx parsing/g_minicoq.cmi \
- kernel/generic.cmx kernel/names.cmx lib/pp.cmx kernel/reduction.cmx \
- kernel/sign.cmx kernel/term.cmx kernel/type_errors.cmx lib/util.cmx \
- toplevel/fhimsg.cmi
-toplevel/himsg.cmo: parsing/ast.cmi kernel/environ.cmi kernel/generic.cmi \
- library/global.cmi kernel/indtypes.cmi kernel/inductive.cmi \
- proofs/logic.cmi kernel/names.cmi lib/options.cmi lib/pp.cmi \
- parsing/pretty.cmi parsing/printer.cmi kernel/reduction.cmi \
- kernel/sign.cmi proofs/tacmach.cmi kernel/term.cmi kernel/type_errors.cmi \
- lib/util.cmi toplevel/himsg.cmi
-toplevel/himsg.cmx: parsing/ast.cmx kernel/environ.cmx kernel/generic.cmx \
- library/global.cmx kernel/indtypes.cmx kernel/inductive.cmx \
- proofs/logic.cmx kernel/names.cmx lib/options.cmx lib/pp.cmx \
- parsing/pretty.cmx parsing/printer.cmx kernel/reduction.cmx \
- kernel/sign.cmx proofs/tacmach.cmx kernel/term.cmx kernel/type_errors.cmx \
- lib/util.cmx toplevel/himsg.cmi
+ kernel/names.cmx lib/pp.cmx kernel/reduction.cmx kernel/sign.cmx \
+ kernel/term.cmx kernel/type_errors.cmx lib/util.cmx toplevel/fhimsg.cmi
+toplevel/himsg.cmo: parsing/ast.cmi kernel/environ.cmi library/global.cmi \
+ kernel/indtypes.cmi kernel/inductive.cmi proofs/logic.cmi \
+ kernel/names.cmi lib/options.cmi lib/pp.cmi parsing/pretty.cmi \
+ parsing/printer.cmi kernel/reduction.cmi kernel/sign.cmi \
+ proofs/tacmach.cmi kernel/term.cmi kernel/type_errors.cmi lib/util.cmi \
+ toplevel/himsg.cmi
+toplevel/himsg.cmx: parsing/ast.cmx kernel/environ.cmx library/global.cmx \
+ kernel/indtypes.cmx kernel/inductive.cmx proofs/logic.cmx \
+ kernel/names.cmx lib/options.cmx lib/pp.cmx parsing/pretty.cmx \
+ parsing/printer.cmx kernel/reduction.cmx kernel/sign.cmx \
+ proofs/tacmach.cmx kernel/term.cmx kernel/type_errors.cmx lib/util.cmx \
+ toplevel/himsg.cmi
toplevel/metasyntax.cmo: parsing/ast.cmi parsing/coqast.cmi \
parsing/egrammar.cmi parsing/esyntax.cmi parsing/extend.cmi \
library/lib.cmi library/libobject.cmi library/library.cmi \
@@ -1085,13 +1032,13 @@ toplevel/metasyntax.cmx: parsing/ast.cmx parsing/coqast.cmx \
parsing/pcoq.cmx lib/pp.cmx library/summary.cmx lib/util.cmx \
toplevel/metasyntax.cmi
toplevel/minicoq.cmo: kernel/declarations.cmi toplevel/fhimsg.cmi \
- parsing/g_minicoq.cmi kernel/generic.cmi kernel/inductive.cmi \
- kernel/names.cmi lib/pp.cmi kernel/safe_typing.cmi kernel/sign.cmi \
- kernel/term.cmi kernel/type_errors.cmi lib/util.cmi
+ parsing/g_minicoq.cmi kernel/inductive.cmi kernel/names.cmi lib/pp.cmi \
+ kernel/safe_typing.cmi kernel/sign.cmi kernel/term.cmi \
+ kernel/type_errors.cmi lib/util.cmi
toplevel/minicoq.cmx: kernel/declarations.cmx toplevel/fhimsg.cmx \
- parsing/g_minicoq.cmi kernel/generic.cmx kernel/inductive.cmx \
- kernel/names.cmx lib/pp.cmx kernel/safe_typing.cmx kernel/sign.cmx \
- kernel/term.cmx kernel/type_errors.cmx lib/util.cmx
+ parsing/g_minicoq.cmi kernel/inductive.cmx kernel/names.cmx lib/pp.cmx \
+ kernel/safe_typing.cmx kernel/sign.cmx kernel/term.cmx \
+ kernel/type_errors.cmx lib/util.cmx
toplevel/protectedtoplevel.cmo: toplevel/errors.cmi parsing/pcoq.cmi \
lib/pp.cmi toplevel/vernac.cmi toplevel/vernacinterp.cmi \
toplevel/protectedtoplevel.cmi
@@ -1100,14 +1047,14 @@ toplevel/protectedtoplevel.cmx: toplevel/errors.cmx parsing/pcoq.cmx \
toplevel/protectedtoplevel.cmi
toplevel/record.cmo: parsing/ast.cmi parsing/astterm.cmi pretyping/class.cmi \
toplevel/command.cmi parsing/coqast.cmi kernel/declarations.cmi \
- library/declare.cmi kernel/environ.cmi kernel/evd.cmi kernel/generic.cmi \
- library/global.cmi kernel/inductive.cmi kernel/names.cmi lib/pp.cmi \
- pretyping/recordops.cmi kernel/term.cmi lib/util.cmi toplevel/record.cmi
+ library/declare.cmi kernel/environ.cmi kernel/evd.cmi library/global.cmi \
+ kernel/inductive.cmi kernel/names.cmi lib/pp.cmi pretyping/recordops.cmi \
+ kernel/term.cmi kernel/typeops.cmi lib/util.cmi toplevel/record.cmi
toplevel/record.cmx: parsing/ast.cmx parsing/astterm.cmx pretyping/class.cmx \
toplevel/command.cmx parsing/coqast.cmx kernel/declarations.cmx \
- library/declare.cmx kernel/environ.cmx kernel/evd.cmx kernel/generic.cmx \
- library/global.cmx kernel/inductive.cmx kernel/names.cmx lib/pp.cmx \
- pretyping/recordops.cmx kernel/term.cmx lib/util.cmx toplevel/record.cmi
+ library/declare.cmx kernel/environ.cmx kernel/evd.cmx library/global.cmx \
+ kernel/inductive.cmx kernel/names.cmx lib/pp.cmx pretyping/recordops.cmx \
+ kernel/term.cmx kernel/typeops.cmx lib/util.cmx toplevel/record.cmi
toplevel/toplevel.cmo: parsing/ast.cmi toplevel/errors.cmi toplevel/mltop.cmi \
kernel/names.cmi lib/options.cmi parsing/pcoq.cmi proofs/pfedit.cmi \
lib/pp.cmi toplevel/protectedtoplevel.cmi lib/util.cmi \
@@ -1164,30 +1111,28 @@ toplevel/vernac.cmx: parsing/ast.cmx parsing/coqast.cmx library/library.cmx \
toplevel/vernac.cmi
contrib/omega/coq_omega.cmo: parsing/ast.cmi proofs/clenv.cmi \
library/declare.cmi kernel/environ.cmi tactics/equality.cmi \
- kernel/generic.cmi library/global.cmi kernel/inductive.cmi \
- proofs/logic.cmi kernel/names.cmi contrib/omega/omega.cmo lib/pp.cmi \
- parsing/printer.cmi proofs/proof_type.cmi kernel/reduction.cmi \
+ kernel/evd.cmi library/global.cmi kernel/inductive.cmi proofs/logic.cmi \
+ kernel/names.cmi contrib/omega/omega.cmo lib/pp.cmi parsing/printer.cmi \
+ proofs/proof_type.cmi kernel/reduction.cmi pretyping/retyping.cmi \
kernel/sign.cmi proofs/tacmach.cmi tactics/tactics.cmi kernel/term.cmi \
lib/util.cmi
contrib/omega/coq_omega.cmx: parsing/ast.cmx proofs/clenv.cmx \
library/declare.cmx kernel/environ.cmx tactics/equality.cmx \
- kernel/generic.cmx library/global.cmx kernel/inductive.cmx \
- proofs/logic.cmx kernel/names.cmx contrib/omega/omega.cmx lib/pp.cmx \
- parsing/printer.cmx proofs/proof_type.cmx kernel/reduction.cmx \
+ kernel/evd.cmx library/global.cmx kernel/inductive.cmx proofs/logic.cmx \
+ kernel/names.cmx contrib/omega/omega.cmx lib/pp.cmx parsing/printer.cmx \
+ proofs/proof_type.cmx kernel/reduction.cmx pretyping/retyping.cmx \
kernel/sign.cmx proofs/tacmach.cmx tactics/tactics.cmx kernel/term.cmx \
lib/util.cmx
contrib/omega/omega.cmo: lib/util.cmi
contrib/omega/omega.cmx: lib/util.cmx
-contrib/ring/quote.cmo: library/declare.cmi kernel/generic.cmi \
- library/global.cmi kernel/instantiate.cmi kernel/names.cmi \
- parsing/pattern.cmi lib/pp.cmi proofs/proof_trees.cmi \
- proofs/proof_type.cmi proofs/tacmach.cmi tactics/tactics.cmi \
- kernel/term.cmi lib/util.cmi
-contrib/ring/quote.cmx: library/declare.cmx kernel/generic.cmx \
- library/global.cmx kernel/instantiate.cmx kernel/names.cmx \
- parsing/pattern.cmx lib/pp.cmx proofs/proof_trees.cmx \
- proofs/proof_type.cmx proofs/tacmach.cmx tactics/tactics.cmx \
- kernel/term.cmx lib/util.cmx
+contrib/ring/quote.cmo: library/declare.cmi library/global.cmi \
+ kernel/instantiate.cmi kernel/names.cmi parsing/pattern.cmi lib/pp.cmi \
+ proofs/proof_trees.cmi proofs/proof_type.cmi proofs/tacmach.cmi \
+ tactics/tactics.cmi kernel/term.cmi lib/util.cmi
+contrib/ring/quote.cmx: library/declare.cmx library/global.cmx \
+ kernel/instantiate.cmx kernel/names.cmx parsing/pattern.cmx lib/pp.cmx \
+ proofs/proof_trees.cmx proofs/proof_type.cmx proofs/tacmach.cmx \
+ tactics/tactics.cmx kernel/term.cmx lib/util.cmx
contrib/ring/ring.cmo: parsing/astterm.cmi kernel/closure.cmi \
library/declare.cmi tactics/equality.cmi kernel/evd.cmi \
library/global.cmi tactics/hiddentac.cmi tactics/hipattern.cmi \
diff --git a/Makefile b/Makefile
index bdbbd33c9..088fc62a4 100644
--- a/Makefile
+++ b/Makefile
@@ -66,7 +66,7 @@ LIB=lib/pp_control.cmo lib/pp.cmo lib/util.cmo \
lib/bstack.cmo lib/edit.cmo lib/stamps.cmo lib/gset.cmo lib/gmap.cmo \
lib/tlm.cmo lib/bij.cmo lib/gmapl.cmo lib/profile.cmo
-KERNEL=kernel/names.cmo kernel/generic.cmo kernel/univ.cmo kernel/term.cmo \
+KERNEL=kernel/names.cmo kernel/univ.cmo kernel/term.cmo \
kernel/sign.cmo kernel/declarations.cmo \
kernel/sosub.cmo kernel/abstraction.cmo \
kernel/environ.cmo kernel/evd.cmo kernel/instantiate.cmo \
@@ -75,13 +75,14 @@ KERNEL=kernel/names.cmo kernel/generic.cmo kernel/univ.cmo kernel/term.cmo \
kernel/safe_typing.cmo
LIBRARY=library/libobject.cmo library/summary.cmo library/lib.cmo \
- library/global.cmo library/states.cmo library/library.cmo \
+ library/goptions.cmo \
+ library/global.cmo library/library.cmo library/states.cmo \
library/nametab.cmo library/impargs.cmo library/redinfo.cmo \
- library/indrec.cmo library/declare.cmo library/goptions.cmo
+ library/indrec.cmo library/declare.cmo
PRETYPING=pretyping/rawterm.cmo pretyping/detyping.cmo \
- pretyping/tacred.cmo pretyping/pretype_errors.cmo \
- pretyping/retyping.cmo pretyping/typing.cmo \
+ pretyping/retyping.cmo pretyping/tacred.cmo \
+ pretyping/pretype_errors.cmo pretyping/typing.cmo \
pretyping/classops.cmo pretyping/class.cmo pretyping/recordops.cmo \
pretyping/evarutil.cmo pretyping/evarconv.cmo \
pretyping/coercion.cmo pretyping/cases.cmo pretyping/pretyping.cmo \
diff --git a/contrib/omega/coq_omega.ml b/contrib/omega/coq_omega.ml
index 4375ef2a4..a8ecf4cd1 100644
--- a/contrib/omega/coq_omega.ml
+++ b/contrib/omega/coq_omega.ml
@@ -14,7 +14,6 @@ open Reduction
open Proof_type
open Ast
open Names
-open Generic
open Term
open Sign
open Inductive
@@ -83,22 +82,29 @@ let resolve_with_bindings_tac (c,lbind) gl =
res_pf kONT clause gl
let reduce_to_mind gl t =
- let rec elimrec t l = match whd_castapp_stack t [] with
- | (DOPN(MutInd (x0,x1),_) as mind,_) -> (mind,prod_it t l)
- | (DOPN(Const _,_),_) ->
+ let rec elimrec t l =
+ let c, args = whd_castapp_stack t [] in
+ match kind_of_term c, args with
+ | (IsMutInd _,_) -> (c,Environ.it_mkProd_or_LetIn t l)
+ | (IsConst _,_) ->
(try
let t' = pf_nf_betaiota gl (pf_one_step_reduce gl t) in elimrec t' l
with e when catchable_exception e ->
errorlabstrm "tactics__reduce_to_mind"
[< 'sTR"Not an inductive product" >])
- | (DOPN(MutCase _,_),_) ->
+ | (IsMutCase _,_) ->
(try
let t' = pf_nf_betaiota gl (pf_one_step_reduce gl t) in elimrec t' l
with e when catchable_exception e ->
errorlabstrm "tactics__reduce_to_mind"
[< 'sTR"Not an inductive product" >])
- | (DOP2(Cast,c,_),[]) -> elimrec c l
- | (DOP2(Prod,ty,DLAM(n,t')),[]) -> elimrec t' ((n,ty)::l)
+ | (IsCast (c,_),[]) -> elimrec c l
+ | (IsProd (n,ty,t'),[]) ->
+ let ty' = Retyping.get_assumption_of (Global.env()) Evd.empty ty in
+ elimrec t' ((n,None,ty')::l)
+ | (IsLetIn (n,b,ty,t'),[]) ->
+ let ty' = Retyping.get_assumption_of (Global.env()) Evd.empty ty in
+ elimrec t' ((n,Some b,ty')::l)
| _ -> error "Not an inductive product"
in
elimrec t []
@@ -115,7 +121,7 @@ let constructor_tac nconstropt i lbind gl =
error "Not the expected number of constructors"
| _ -> ());
if i > nconstr then error "Not enough Constructors";
- let c = DOPN(MutConstruct((x0,x1),i),args) in
+ let c = mkMutConstruct (((x0,x1),i),args) in
let resolve_tac = resolve_with_bindings_tac (c,lbind) in
(tclTHEN (tclTHEN (change_in_concl redcl) intros) resolve_tac) gl
@@ -149,16 +155,7 @@ let hide_constr,find_constr,clear_tables,dump_tables =
(fun () -> l := []),
(fun () -> !l)
-let get_applist =
- let rec loop accu = function
- | DOPN(AppL,cl) ->
- begin match Array.to_list cl with
- | h :: l -> loop (l @ accu) h
- | [] -> failwith "get_applist" end
- | DOP2(Cast,c,t) -> loop accu c
- | t -> t,accu
- in
- loop []
+let get_applist c = whd_stack c []
exception Destruct
@@ -175,14 +172,18 @@ type result =
| Kimp of constr * constr
| Kufo
-let destructurate t =
- match get_applist t with
- | DOPN ((Const _ | MutConstruct _ | MutInd _) as c,_),args ->
- Kapp (string_of_id (Global.id_of_global c),args)
- | VAR id,[] -> Kvar(string_of_id id)
- | DOP2(Prod,typ,DLAM(Anonymous,body)),[] -> Kimp(typ,body)
- | DOP2(Prod,_,DLAM(Name _,_)),[] ->
- error "Omega: Not a quantifier-free goal"
+let destructurate t =
+ let c, args = get_applist t in
+ match kind_of_term c, args with
+ | IsConst (sp,_), args ->
+ Kapp (string_of_id (Global.id_of_global (Const sp)),args)
+ | IsMutConstruct (csp,_) , args ->
+ Kapp (string_of_id (Global.id_of_global (MutConstruct csp)),args)
+ | IsMutInd (isp,_), args ->
+ Kapp (string_of_id (Global.id_of_global (MutInd isp)),args)
+ | IsVar id,[] -> Kvar(string_of_id id)
+ | IsProd (Anonymous,typ,body), [] -> Kimp(typ,body)
+ | IsProd (Name _,_,_),[] -> error "Omega: Not a quantifier-free goal"
| _ -> Kufo
let recognize_number t =
@@ -425,58 +426,58 @@ type constr_path =
| P_ARG
let context operation path (t : constr) =
- let rec loop i p0 p1 =
- match (p0,p1) with
- | (p, (DOP2(Cast,c,t))) -> DOP2(Cast,loop i p c,t)
- | ([], t) -> operation i t
- | (p, (DLAM(n,t))) -> DLAM(n,loop (i+1) p t)
- | ((P_APP n :: p), (DOPN(AppL,v) as t)) ->
+ let rec loop i p0 t =
+ match (p0,kind_of_term t) with
+ | (p, IsCast (c,t)) -> mkCast (loop i p c,t)
+ | ([], _) -> operation i t
+ | ((P_APP n :: p), IsAppL _) ->
let f,l = get_applist t in
let v' = Array.of_list (f::l) in
- v'.(n) <- loop i p v'.(n); (DOPN(AppL,v'))
- | ((P_BRANCH n :: p), (DOPN(MutCase _,_) as t)) ->
- let (_,_,_,v) = destCase t in
- v.(n) <- loop i p v.(n); (DOPN(AppL,v))
- | ((P_ARITY :: p), (DOPN(AppL,v))) ->
- let v' = Array.copy v in
- v'.(0) <- loop i p v.(0); (DOPN(AppL,v'))
- | ((P_ARG :: p), (DOPN(AppL,v))) ->
- let v' = Array.copy v in
- v'.(1) <- loop i p v.(1); (DOPN(AppL,v'))
- | (p, (DOPN(Fix(_,n) as f,v))) ->
- let v' = Array.copy v in
- let l = Array.length v - 1 in
- v'.(l) <- loop i (P_BRANCH n :: p) v.(l); (DOPN(f,v'))
- | ((P_BRANCH n :: p), (DLAMV(name,v))) ->
+ v'.(n) <- loop i p v'.(n); (mkAppL v')
+ | ((P_BRANCH n :: p), IsMutCase (_,_,_,v)) ->
+ v.(n) <- loop i p v.(n); (mkAppL v) (* Not Mutcase ?? *)
+ | ((P_ARITY :: p), IsAppL (f,l)) ->
+ applist (loop i p f,l)
+ | ((P_ARG :: p), IsAppL (f,a::l)) ->
+ applist (f,(loop i p a)::l)
+ | (p, IsFix ((_,n as ln),(tys,lna,v))) ->
+ let l = Array.length v in
let v' = Array.copy v in
- v'.(n) <- loop (i+1) p v.(n); DLAMV(name,v')
- | ((P_BODY :: p), (DOP2((Prod | Lambda) as k, t,c))) ->
- (DOP2(k,t,loop i p c))
- | ((P_TYPE :: p), (DOP2((Prod | Lambda) as k, term,c))) ->
- (DOP2(k,loop i p term, c))
- | (p, t) ->
+ v'.(n) <- loop (i+l) p v.(n); (mkFix (ln,(tys,lna,v')))
+ | ((P_BODY :: p), IsProd (n,t,c)) ->
+ (mkProd (n,t,loop (i+1) p c))
+ | ((P_BODY :: p), IsLambda (n,t,c)) ->
+ (mkLambda (n,t,loop (i+1) p c))
+ | ((P_BODY :: p), IsLetIn (n,b,t,c)) ->
+ (mkLetIn (n,b,t,loop (i+1) p c))
+ | ((P_TYPE :: p), IsProd (n,t,c)) ->
+ (mkProd (n,loop i p t,c))
+ | ((P_TYPE :: p), IsLambda (n,t,c)) ->
+ (mkLambda (n,loop i p t,c))
+ | ((P_TYPE :: p), IsLetIn (n,b,t,c)) ->
+ (mkLetIn (n,b,loop i p t,c))
+ | (p, _) ->
pPNL [<Printer.prterm t>];
failwith ("abstract_path " ^ string_of_int(List.length p))
in
loop 1 path t
let occurence path (t : constr) =
- let rec loop p0 p1 = match (p0,p1) with
- | (p, (DOP2(Cast,c,t))) -> loop p c
- | ([], t) -> t
- | (p, (DLAM(n,t))) -> loop p t
- | ((P_APP n :: p), (DOPN(AppL,v) as t)) ->
- let f,l = get_applist t in loop p v.(n)
- | ((P_BRANCH n :: p), (DOPN(MutCase _,_) as t)) ->
- let (_,_,_,v) = destCase t in loop p v.(n)
- | ((P_ARITY :: p), (DOPN(AppL,v))) -> loop p v.(0)
- | ((P_ARG :: p), (DOPN(AppL,v))) -> loop p v.(1)
- | (p, (DOPN(Fix(_,n) as f,v))) ->
- let l = Array.length v - 1 in loop (P_BRANCH n :: p) v.(l)
- | ((P_BRANCH n :: p), (DLAMV(name,v))) -> loop p v.(n)
- | ((P_BODY :: p), (DOP2((Prod | Lambda) as k, t,c))) -> loop p c
- | ((P_TYPE :: p), (DOP2((Prod | Lambda) as k, term,c))) -> loop p term
- | (p, t) ->
+ let rec loop p0 t = match (p0,kind_of_term t) with
+ | (p, IsCast (c,t)) -> loop p c
+ | ([], _) -> t
+ | ((P_APP n :: p), IsAppL (f,l)) -> loop p (List.nth l (n-1))
+ | ((P_BRANCH n :: p), IsMutCase (_,_,_,v)) -> loop p v.(n)
+ | ((P_ARITY :: p), IsAppL (f,_)) -> loop p f
+ | ((P_ARG :: p), IsAppL (f,a::l)) -> loop p a
+ | (p, IsFix((_,n) ,(_,_,v))) -> loop p v.(n)
+ | ((P_BODY :: p), IsProd (n,t,c)) -> loop p c
+ | ((P_BODY :: p), IsLambda (n,t,c)) -> loop p c
+ | ((P_BODY :: p), IsLetIn (n,b,t,c)) -> loop p c
+ | ((P_TYPE :: p), IsProd (n,term,c)) -> loop p term
+ | ((P_TYPE :: p), IsLambda (n,term,c)) -> loop p term
+ | ((P_TYPE :: p), IsLetIn (n,b,term,c)) -> loop p term
+ | (p, _) ->
pPNL [<Printer.prterm t>];
failwith ("occurence " ^ string_of_int(List.length p))
in
@@ -485,7 +486,7 @@ let occurence path (t : constr) =
let abstract_path typ path t =
let term_occur = ref (Rel 0) in
let abstract = context (fun i t -> term_occur:= t; Rel i) path t in
- mkLambda (Name (id_of_string "x")) typ abstract, !term_occur
+ mkLambda (Name (id_of_string "x"), typ, abstract), !term_occur
let focused_simpl path gl =
let newc = context (fun i t -> pf_nf gl t) (List.rev path) (pf_concl gl) in
@@ -554,12 +555,14 @@ let clever_rewrite_base_poly typ p result theorem gl =
let (abstracted,occ) = abstract_path typ (List.rev p) full in
let t =
applist
- ((mkLambda (Name (id_of_string "P"))
- (mkArrow typ mkProp)
- (mkLambda (Name (id_of_string "H"))
- (applist (Rel 1,[result]))
- (mkAppL [| Lazy.force coq_eq_ind_r;
- typ; result; Rel 2; Rel 1; occ; theorem |]))),
+ (mkLambda
+ (Name (id_of_string "P"),
+ mkArrow typ mkProp,
+ mkLambda
+ (Name (id_of_string "H"),
+ applist (Rel 1,[result]),
+ mkAppL [| Lazy.force coq_eq_ind_r;
+ typ; result; Rel 2; Rel 1; occ; theorem |])),
[abstracted])
in
exact (applist(t,[mkNewMeta()])) gl
@@ -1206,8 +1209,10 @@ let replay_history tactic_normalisation =
let theorem =
mkAppL [| Lazy.force coq_ex;
Lazy.force coq_Z;
- mkLambda (Name(id_of_string v)) (Lazy.force coq_Z)
- (mk_eq (Rel 1) eq1) |]
+ mkLambda
+ (Name(id_of_string v),
+ Lazy.force coq_Z,
+ mk_eq (Rel 1) eq1) |]
in
let mm = mk_integer m in
let p_initial = [P_APP 2;P_TYPE] in
diff --git a/contrib/ring/quote.ml b/contrib/ring/quote.ml
index fc1ee306f..8351357e6 100644
--- a/contrib/ring/quote.ml
+++ b/contrib/ring/quote.ml
@@ -99,7 +99,6 @@
open Pp
open Util
open Names
-open Generic
open Term
open Instantiate
open Pattern
diff --git a/dev/changements.txt b/dev/changements.txt
index dc9b01b17..e6d44eb45 100644
--- a/dev/changements.txt
+++ b/dev/changements.txt
@@ -10,6 +10,7 @@ Changements d'organisation / modules :
Avm,Mavm,Fmavm,Mhm -> utiliser plutôt Map (et freeze alors gratuit)
Mhb -> Bij
+ Generic est intégré ŕ Term (et un petit peu ŕ Closure)
Changements dans les types de données :
---------------------------------------
diff --git a/dev/top_printers.ml b/dev/top_printers.ml
index 11e621acf..ff592ed94 100644
--- a/dev/top_printers.ml
+++ b/dev/top_printers.ml
@@ -9,7 +9,7 @@ open Sign
open Univ
open Proof_trees
open Environ
-open Generic
+(*i open Generic i*)
open Printer
open Refiner
open Tacmach
@@ -84,13 +84,13 @@ let constr_display csr =
| DOPN(a,b) ->
"DOPN("^(oper_display a)^",[|"^(Array.fold_right (fun x i ->
(term_display x)^(if not(i="") then (";"^i) else "")) b "")^"|])"
- | DOPL(a,b) ->
- "DOPL("^(oper_display a)^",[|"^(List.fold_right (fun x i ->
- (term_display x)^(if not(i="") then (";"^i) else "")) b "")^"|]"
| DLAM(a,b) -> "DLAM("^(name_display a)^","^(term_display b)^")"
| DLAMV(a,b) ->
"DLAMV("^(name_display a)^",[|"^(Array.fold_right (fun x i ->
(term_display x)^(if not(i="") then (";"^i) else "")) b "")^"|]"
+ | CLam(a,b,c) -> "CLam("^(name_display a)^","^(term_display (body_of_type b))^","^(term_display c)^")"
+ | CPrd(a,b,c) -> "CPrd("^(name_display a)^","^(term_display (body_of_type b))^","^(term_display c)^")"
+ | CLet(a,b,c,d) -> "CLet("^(name_display a)^","^(term_display b)^","^(term_display (body_of_type c))^","^(term_display d)^")"
| VAR a -> "VAR "^(string_of_id a)
| Rel a -> "Rel "^(string_of_int a)
and oper_display = function
diff --git a/kernel/abstraction.ml b/kernel/abstraction.ml
index 9df751b46..a6e5937a4 100644
--- a/kernel/abstraction.ml
+++ b/kernel/abstraction.ml
@@ -3,7 +3,7 @@
open Util
open Names
-open Generic
+(*i open Generic i*)
open Term
type abstraction_body = {
diff --git a/kernel/closure.ml b/kernel/closure.ml
index f452a6dfc..948361690 100644
--- a/kernel/closure.ml
+++ b/kernel/closure.ml
@@ -4,7 +4,6 @@
open Util
open Pp
open Term
-open Generic
open Names
open Environ
open Instantiate
@@ -31,6 +30,9 @@ let stop() =
(* sets of reduction kinds *)
type red_kind = BETA | DELTA of sorts oper | IOTA
+(* Hack: we use oper (Const "$LOCAL VAR$") for local variables *)
+let local_const_oper = Const (make_path [] (id_of_string "$LOCAL VAR$") CCI)
+
type reds = {
r_beta : bool;
r_delta : sorts oper -> bool; (* this is unsafe: exceptions may pop out *)
@@ -157,6 +159,58 @@ let infos_under infos =
i_tab = infos.i_tab }
+(* explicit substitutions of type 'a *)
+type 'a subs =
+ | ESID (* ESID = identity *)
+ | CONS of 'a * 'a subs (* CONS(t,S) = (S.t) parallel substitution *)
+ | SHIFT of int * 'a subs (* SHIFT(n,S) = (^n o S) terms in S are relocated *)
+ (* with n vars *)
+ | LIFT of int * 'a subs (* LIFT(n,S) = (%n S) stands for ((^n o S).n...1) *)
+
+(* operations of subs: collapses constructors when possible.
+ * Needn't be recursive if we always use these functions
+ *)
+
+let subs_cons(x,s) = CONS(x,s)
+
+let subs_liftn n = function
+ | ESID -> ESID (* the identity lifted is still the identity *)
+ (* (because (^1.1) --> id) *)
+ | LIFT (p,lenv) -> LIFT (p+n, lenv)
+ | lenv -> LIFT (n,lenv)
+
+let subs_lift a = subs_liftn 1 a
+
+let subs_shft = function
+ | (0, s) -> s
+ | (n, SHIFT (k,s1)) -> SHIFT (k+n, s1)
+ | (n, s) -> SHIFT (n,s)
+
+(* Expands de Bruijn k in the explicit substitution subs
+ * lams accumulates de shifts to perform when retrieving the i-th value
+ * the rules used are the following:
+ *
+ * [id]k --> k
+ * [S.t]1 --> t
+ * [S.t]k --> [S](k-1) if k > 1
+ * [^n o S] k --> [^n]([S]k)
+ * [(%n S)] k --> k if k <= n
+ * [(%n S)] k --> [^n]([S](k-n))
+ *
+ * the result is (Inr k) when the variable is just relocated
+ *)
+let rec exp_rel lams k subs =
+ match (k,subs) with
+ | (1, CONS (def,_)) -> Inl(lams,def)
+ | (_, CONS (_,l)) -> exp_rel lams (pred k) l
+ | (_, LIFT (n,_)) when k<=n -> Inr(lams+k)
+ | (_, LIFT (n,l)) -> exp_rel (n+lams) (k-n) l
+ | (_, SHIFT (n,s)) -> exp_rel (n+lams) k s
+ | (_, ESID) -> Inr(lams+k)
+
+let expand_rel k subs = exp_rel 0 k subs
+
+
(**** Call by value reduction ****)
(* The type of terms with closure. The meaning of the constructors and
@@ -185,7 +239,8 @@ let infos_under infos =
type cbv_value =
| VAL of int * constr
| LAM of name * constr * constr * cbv_value subs
- | FIXP of sorts oper * constr array * cbv_value subs * cbv_value list
+ | FIXP of fixpoint * cbv_value subs * cbv_value list
+ | COFIXP of cofixpoint * cbv_value subs * cbv_value list
| CONSTR of int * (section_path * int) * cbv_value array * cbv_value list
(* les vars pourraient etre des constr,
@@ -197,8 +252,10 @@ type cbv_value =
let rec shift_value n = function
| VAL (k,v) -> VAL ((k+n),v)
| LAM (x,a,b,s) -> LAM (x,a,b,subs_shft (n,s))
- | FIXP (op,bv,s,args) ->
- FIXP (op,bv,subs_shft (n,s), List.map (shift_value n) args)
+ | FIXP (fix,s,args) ->
+ FIXP (fix,subs_shft (n,s), List.map (shift_value n) args)
+ | COFIXP (cofix,s,args) ->
+ COFIXP (cofix,subs_shft (n,s), List.map (shift_value n) args)
| CONSTR (i,spi,vars,args) ->
CONSTR (i, spi, Array.map (shift_value n) vars,
List.map (shift_value n) args)
@@ -210,20 +267,23 @@ let rec shift_value n = function
* (S, (fix Fi {F0 := T0 .. Fn-1 := Tn-1}))
* -> (S. [S]F0 . [S]F1 ... . [S]Fn-1, Ti)
*)
-let contract_fixp env fix =
- let (bnum, bodies, make_body) = match fix with
- | DOPN(Fix(reci,i),bvect) ->
- (i, array_last bvect, (fun j -> FIXP(Fix(reci,j), bvect, env, [])))
- | DOPN(CoFix i,bvect) ->
- (i, array_last bvect, (fun j -> FIXP(CoFix j, bvect, env, [])))
- | _ -> anomaly "Closure.contract_fixp: not a (co)fixpoint"
- in
- let rec subst_bodies_from_i i subs = function
- | DLAM(_,t) -> subst_bodies_from_i (i+1) (subs_cons (make_body i, subs)) t
- | DLAMV(_,bds) -> (subs_cons (make_body i, subs), bds.(bnum))
- | _ -> anomaly "Closure.contract_fixp: malformed (co)fixpoint"
+let contract_fixp env ((reci,i),(_,_,bds as bodies)) =
+ let make_body j = FIXP(((reci,j),bodies), env, []) in
+ let n = Array.length bds in
+ let rec subst_bodies_from_i i subs =
+ if i=n then subs
+ else subst_bodies_from_i (i+1) (subs_cons (make_body i, subs))
+ in
+ subst_bodies_from_i 0 env, bds.(i)
+
+let contract_cofixp env (i,(_,_,bds as bodies)) =
+ let make_body j = COFIXP((j,bodies), env, []) in
+ let n = Array.length bds in
+ let rec subst_bodies_from_i i subs =
+ if i=n then subs
+ else subst_bodies_from_i (i+1) (subs_cons (make_body i, subs))
in
- subst_bodies_from_i 0 env bodies
+ subst_bodies_from_i 0 env, bds.(i)
(* type of terms with a hole. This hole can appear only under AppL or Case.
@@ -274,12 +334,13 @@ let red_allowed flags stack rk =
*)
let strip_appl head stack =
match head with
- | FIXP (op,bv,env,app) -> (FIXP(op,bv,env,[]), stack_app app stack)
+ | FIXP (fix,env,app) -> (FIXP(fix,env,[]), stack_app app stack)
+ | COFIXP (cofix,env,app) -> (COFIXP(cofix,env,[]), stack_app app stack)
| CONSTR (i,spi,vars,app) -> (CONSTR(i,spi,vars,[]), stack_app app stack)
| _ -> (head, stack)
-(* Invariant: if the result of norm_head is CONSTR or FIXP, it last
+(* Invariant: if the result of norm_head is CONSTR or (CO)FIXP, it last
* argument is [].
* Because we must put all the applied terms in the stack.
*)
@@ -298,12 +359,18 @@ let rec check_app_constr redfun = function
| _ -> false)
| (_::l, n) -> check_app_constr redfun (l,(pred n))
-let fixp_reducible redfun flgs op stk =
+let fixp_reducible redfun flgs ((reci,i),_) stk =
+ if red_allowed flgs stk IOTA then
+ match stk with (* !!! for Acc_rec: reci.(i) = -2 *)
+ | APP(appl,_) -> reci.(i) >=0 & check_app_constr redfun (appl, reci.(i))
+ | _ -> false
+ else
+ false
+
+let cofixp_reducible redfun flgs _ stk =
if red_allowed flgs stk IOTA then
- match (op,stk) with (* !!! for Acc_rec: reci.(i) = -2 *)
- | (Fix (reci,i), APP(appl,_)) ->
- (reci.(i) >= 0 & check_app_constr redfun (appl, reci.(i)))
- | (CoFix i, (CASE _ | APP(_,CASE _))) -> true
+ match stk with
+ | (CASE _ | APP(_,CASE _)) -> true
| _ -> false
else
false
@@ -318,65 +385,72 @@ let mindsp_nparams env sp =
* constructor, a lambda or a fixp in the head. If not, it is a value
* and is completely computed here. The head redexes are NOT reduced:
* the function returns the pair of a cbv_value and its stack. *
- * Invariant: if the result of norm_head is CONSTR or FIXP, it last
+ * Invariant: if the result of norm_head is CONSTR or (CO)FIXP, it last
* argument is []. Because we must put all the applied terms in the
* stack. *)
let rec norm_head info env t stack =
(* no reduction under binders *)
- match t with
+ match kind_of_term t with
(* stack grows (remove casts) *)
- | DOPN (AppL,appl) -> (* Applied terms are normalized immediately;
+ | IsAppL (head,args) -> (* Applied terms are normalized immediately;
they could be computed when getting out of the stack *)
- (match Array.to_list appl with
- | head::args ->
- let nargs = List.map (cbv_stack_term info TOP env) args in
- norm_head info env head (stack_app nargs stack)
- | [] -> anomaly "norm_head : malformed constr AppL [||]")
- | DOPN (MutCase _,_) ->
- let (ci,p,c,v) = destCase t in
- norm_head info env c (CASE(p,v,ci,env,stack))
- | DOP2 (Cast,ct,c) -> norm_head info env ct stack
+ let nargs = List.map (cbv_stack_term info TOP env) args in
+ norm_head info env head (stack_app nargs stack)
+ | IsMutCase (ci,p,c,v) -> norm_head info env c (CASE(p,v,ci,env,stack))
+ | IsCast (ct,_) -> norm_head info env ct stack
(* constants, axioms
* the first pattern is CRUCIAL, n=0 happens very often:
* when reducing closed terms, n is always 0 *)
- | Rel i -> (match expand_rel i env with
+ | IsRel i -> (match expand_rel i env with
| Inl (0,v) ->
reduce_const_body (cbv_norm_more info) v stack
| Inl (n,v) ->
reduce_const_body
(cbv_norm_more info) (shift_value n v) stack
| Inr n -> (VAL(0, Rel n), stack))
- | DOPN ((Const _ | Evar _ | Abst _) as op, vars)
- when red_allowed info.i_flags stack (DELTA op) ->
- let normt = DOPN(op, Array.map (cbv_norm_term info env) vars) in
- (match const_value_cache info normt with
- | Some body -> reduce_const_body (cbv_norm_more info) body stack
- | None -> (VAL(0,normt), stack))
+ | IsConst (sp,vars) ->
+ let normt = mkConst (sp,Array.map (cbv_norm_term info env) vars) in
+ if red_allowed info.i_flags stack (DELTA (Const sp)) then
+ match const_value_cache info normt with
+ | Some body -> reduce_const_body (cbv_norm_more info) body stack
+ | None -> (VAL(0,normt), stack)
+ else (VAL(0,normt), stack)
+ | IsLetIn (x, b, t, c) ->
+ if red_allowed info.i_flags stack (DELTA local_const_oper) then
+ let b = cbv_stack_term info TOP env b in
+ norm_head info (subs_cons (b,env)) c stack
+ else
+ let normt =
+ mkLetIn (x, cbv_norm_term info env b,
+ cbv_norm_term info env t,
+ cbv_norm_term info (subs_lift env) c) in
+ (VAL(0,normt), stack) (* Considérer une coupure commutative ? *)
+ | IsEvar (n,vars) ->
+ let normt = mkEvar (n,Array.map (cbv_norm_term info env) vars) in
+ if red_allowed info.i_flags stack (DELTA (Evar n)) then
+ match const_value_cache info normt with
+ | Some body -> reduce_const_body (cbv_norm_more info) body stack
+ | None -> (VAL(0,normt), stack)
+ else (VAL(0,normt), stack)
(* non-neutral cases *)
- | DOP2 (Lambda,a,DLAM(x,b)) -> (LAM(x,a,b,env), stack)
- | DOPN ((Fix _ | CoFix _) as op, v) -> (FIXP(op,v,env,[]), stack)
- | DOPN (MutConstruct(spi,i),vars) ->
+ | IsLambda (x,a,b) -> (LAM(x,a,b,env), stack)
+ | IsFix fix -> (FIXP(fix,env,[]), stack)
+ | IsCoFix cofix -> (COFIXP(cofix,env,[]), stack)
+ | IsMutConstruct ((spi,i),vars) ->
(CONSTR(i,spi, Array.map (cbv_stack_term info TOP env) vars,[]), stack)
(* neutral cases *)
- | (VAR _ | DOP0 _) -> (VAL(0, t), stack)
- | DOP1 (op, nt) -> (VAL(0, DOP1(op, cbv_norm_term info env nt)), stack)
- | DOP2 (op,a,b) ->
- (VAL(0, DOP2(op, cbv_norm_term info env a, cbv_norm_term info env b)),
- stack)
- | DOPN (op,vars) ->
- (VAL(0, DOPN(op, Array.map (cbv_norm_term info env) vars)), stack)
- | DOPL (op,l) ->
- (VAL(0, DOPL(op, List.map (cbv_norm_term info env) l)), stack)
- | DLAM (x,t) ->
- (VAL(0, DLAM(x, cbv_norm_term info (subs_lift env) t)), stack)
- | DLAMV (x,ve) ->
- (VAL(0, DLAMV(x, Array.map(cbv_norm_term info (subs_lift env)) ve)),
- stack)
-
+ | (IsVar _ | IsSort _ | IsMeta _ | IsXtra _ ) -> (VAL(0, t), stack)
+ | IsMutInd (sp,vars) ->
+ (VAL(0, mkMutInd (sp, Array.map (cbv_norm_term info env) vars)), stack)
+ | IsProd (x,t,c) ->
+ (VAL(0, mkProd (x, cbv_norm_term info env t,
+ cbv_norm_term info (subs_lift env) c)),
+ stack)
+ | IsAbst (_,_) -> failwith "No longer implemented"
(* cbv_stack_term performs weak reduction on constr t under the subs
* env, with context stack, i.e. ([env]t stack). First computes weak
@@ -392,12 +466,17 @@ and cbv_stack_term info stack env t =
let subs = subs_cons (arg,env) in
cbv_stack_term info (stack_app args stk) subs b
- (* a Fix applied enough,
- constructor guard satisfied or Cofix in a Case -> IOTA *)
- | (FIXP(op,bv,env,_), stk)
- when fixp_reducible (cbv_norm_more info) info.i_flags op stk ->
- let (envf,redfix) = contract_fixp env (DOPN(op,bv)) in
- cbv_stack_term info stk envf redfix
+ (* a Fix applied enough -> IOTA *)
+ | (FIXP(fix,env,_), stk)
+ when fixp_reducible (cbv_norm_more info) info.i_flags fix stk ->
+ let (envf,redfix) = contract_fixp env fix in
+ cbv_stack_term info stk envf redfix
+
+ (* constructor guard satisfied or Cofix in a Case -> IOTA *)
+ | (COFIXP(cofix,env,_), stk)
+ when cofixp_reducible (cbv_norm_more info) info.i_flags cofix stk ->
+ let (envf,redfix) = contract_cofixp env cofix in
+ cbv_stack_term info stk envf redfix
(* constructor in a Case -> IOTA
(use red_under because we know there is a Case) *)
@@ -414,7 +493,8 @@ and cbv_stack_term info stack env t =
(* may be reduced later by application *)
| (head, TOP) -> head
- | (FIXP(op,bv,env,_), APP(appl,TOP)) -> FIXP(op,bv,env,appl)
+ | (FIXP(fix,env,_), APP(appl,TOP)) -> FIXP(fix,env,appl)
+ | (COFIXP(cofix,env,_), APP(appl,TOP)) -> COFIXP(cofix,env,appl)
| (CONSTR(n,spi,vars,_), APP(appl,TOP)) -> CONSTR(n,spi,vars,appl)
(* definitely a value *)
@@ -452,19 +532,28 @@ and cbv_norm_term info env t =
(* reduction of a cbv_value to a constr *)
and cbv_norm_value info = function (* reduction under binders *)
| VAL (n,v) -> lift n v
- | LAM (x,a,b,env) -> DOP2(Lambda, cbv_norm_term info env a,
- DLAM(x,cbv_norm_term info (subs_lift env) b))
- | FIXP (op,cl,env,args) ->
+ | LAM (x,a,b,env) ->
+ mkLambda (x, cbv_norm_term info env a,
+ cbv_norm_term info (subs_lift env) b)
+ | FIXP ((lij,(lty,lna,bds)),env,args) ->
+ applistc
+ (mkFix (lij,
+ (Array.map (cbv_norm_term info env) lty, lna,
+ Array.map (cbv_norm_term info
+ (subs_liftn (Array.length lty) env)) bds)))
+ (List.map (cbv_norm_value info) args)
+ | COFIXP ((j,(lty,lna,bds)),env,args) ->
applistc
- (DOPN(op, Array.map (cbv_norm_term info env) cl))
+ (mkCoFix (j,
+ (Array.map (cbv_norm_term info env) lty, lna,
+ Array.map (cbv_norm_term info
+ (subs_liftn (Array.length lty) env)) bds)))
(List.map (cbv_norm_value info) args)
| CONSTR (n,spi,vars,args) ->
applistc
- (DOPN (MutConstruct(spi,n), Array.map (cbv_norm_value info) vars))
+ (mkMutConstruct ((spi,n), Array.map (cbv_norm_value info) vars))
(List.map (cbv_norm_value info) args)
-
-
type 'a cbv_infos = (cbv_value, 'a) infos
(* constant bodies are normalized at the first expansion *)
@@ -499,22 +588,40 @@ let cbv_norm infos constr =
* substitution applied to a constr
*)
-type 'oper freeze = {
+type freeze = {
mutable norm: bool;
- mutable term: 'oper frterm }
+ mutable term: frterm }
-and 'oper frterm =
+and frterm =
| FRel of int
| FVAR of identifier
- | FOP0 of 'oper
- | FOP1 of 'oper * 'oper freeze
- | FOP2 of 'oper * 'oper freeze * 'oper freeze
- | FOPN of 'oper * 'oper freeze array
- | FOPL of 'oper * 'oper freeze list
- | FLAM of name * 'oper freeze * 'oper term * 'oper freeze subs
- | FLAMV of name * 'oper freeze array * 'oper term array * 'oper freeze subs
- | FLIFT of int * 'oper freeze
- | FFROZEN of 'oper term * 'oper freeze subs
+ | FOP0 of sorts oper
+ | FOP1 of sorts oper * freeze
+ | FOP2 of sorts oper * freeze * freeze
+ | FOPN of sorts oper * freeze array
+ | FLAM of name * freeze * constr * freeze subs
+ | FLAMV of name * freeze array * constr array * freeze subs
+ | FLam of name * type_freeze * freeze * constr * freeze subs
+ | FPrd of name * type_freeze * freeze * constr * freeze subs
+ | FLet of name * freeze * type_freeze * freeze * constr * freeze subs
+ | FLIFT of int * freeze
+ | FFROZEN of constr * freeze subs
+
+(* Cas oů typed_type est casté en interne
+and type_freeze = freeze * sorts
+ *)
+(* Cas oů typed_type n'est pas casté *)
+and type_freeze = freeze
+(**)
+
+(*
+let typed_map f t = f (body_of_type t), level_of_type t
+let typed_unmap f (t,s) = make_typed (f t) s
+*)
+(**)
+let typed_map f t = f (body_of_type t)
+let typed_unmap f t = make_typed_lazy (f t) (fun _ -> assert false)
+(**)
let frterm_of v = v.term
let is_val v = v.norm
@@ -579,8 +686,6 @@ let rec traverse_term env t =
term = FOP2 (op, traverse_term env a, traverse_term env b)}
| DOPN (op,v) ->
{ norm = false; term = FOPN (op, Array.map (traverse_term env) v) }
- | DOPL (op,l) ->
- { norm = false; term = FOPL (op, List.map (traverse_term env) l) }
| DLAM (x,a) ->
{ norm = false;
term = FLAM (x, traverse_term (subs_lift env) a, a, env) }
@@ -588,9 +693,24 @@ let rec traverse_term env t =
{ norm = (ve=[||]);
term = FLAMV (x, Array.map (traverse_term (subs_lift env)) ve,
ve, env) }
+ | CLam (n,t,c) ->
+ { norm = false;
+ term = FLam (n, traverse_type env t, traverse_term (subs_lift env) c,
+ c, env) }
+ | CPrd (n,t,c) ->
+ { norm = false;
+ term = FPrd (n, traverse_type env t, traverse_term (subs_lift env) c,
+ c, env) }
+ | CLet (n,b,t,c) ->
+ { norm = false;
+ term = FLet (n, traverse_term env b, traverse_type env t,
+ traverse_term (subs_lift env) c,
+ c, env) }
+
+and traverse_type env = typed_map (traverse_term env)
(* Back to regular terms: remove all FFROZEN, keep casts (since this
- * fun is not dedicated to the Calulus of Constructions).
+ * fun is not dedicated to the Calculus of Constructions).
*)
let rec lift_term_of_freeze lfts v =
match v.term with
@@ -601,10 +721,19 @@ let rec lift_term_of_freeze lfts v =
| FOP2 (op,a,b) ->
DOP2 (op, lift_term_of_freeze lfts a, lift_term_of_freeze lfts b)
| FOPN (op,ve) -> DOPN (op, Array.map (lift_term_of_freeze lfts) ve)
- | FOPL (op,l) -> DOPL (op, List.map (lift_term_of_freeze lfts) l)
| FLAM (x,a,_,_) -> DLAM (x, lift_term_of_freeze (el_lift lfts) a)
| FLAMV (x,ve,_,_) ->
DLAMV (x, Array.map (lift_term_of_freeze (el_lift lfts)) ve)
+ | FLam (n,t,c,_,_) ->
+ CLam (n, typed_unmap (lift_term_of_freeze lfts) t,
+ lift_term_of_freeze (el_lift lfts) c)
+ | FPrd (n,t,c,_,_) ->
+ CPrd (n, typed_unmap (lift_term_of_freeze lfts) t,
+ lift_term_of_freeze (el_lift lfts) c)
+ | FLet (n,b,t,c,_,_) ->
+ CLet (n, lift_term_of_freeze lfts b,
+ typed_unmap (lift_term_of_freeze lfts) t,
+ lift_term_of_freeze (el_lift lfts) c)
| FLIFT (k,a) -> lift_term_of_freeze (el_shft k lfts) a
| FFROZEN (t,env) ->
let unfv = freeze_assign v (traverse_term env t) in
@@ -629,30 +758,34 @@ let rec fstrong unfreeze_fun lfts v =
| FOP2 (op,a,b) ->
DOP2 (op, fstrong unfreeze_fun lfts a, fstrong unfreeze_fun lfts b)
| FOPN (op,ve) -> DOPN (op, Array.map (fstrong unfreeze_fun lfts) ve)
- | FOPL (op,l) -> DOPL (op, List.map (fstrong unfreeze_fun lfts) l)
| FLAM (x,a,_,_) -> DLAM (x, fstrong unfreeze_fun (el_lift lfts) a)
| FLAMV (x,ve,_,_) ->
DLAMV (x, Array.map (fstrong unfreeze_fun (el_lift lfts)) ve)
+ | FLam (n,t,c,_,_) ->
+ CLam (n, typed_unmap (fstrong unfreeze_fun lfts) t,
+ fstrong unfreeze_fun (el_lift lfts) c)
+ | FPrd (n,t,c,_,_) ->
+ CPrd (n, typed_unmap (fstrong unfreeze_fun lfts) t,
+ fstrong unfreeze_fun (el_lift lfts) c)
+ | FLet (n,b,t,c,_,_) ->
+ CLet (n, fstrong unfreeze_fun lfts b,
+ typed_unmap (fstrong unfreeze_fun lfts) t,
+ fstrong unfreeze_fun (el_lift lfts) c)
| FLIFT (k,a) -> fstrong unfreeze_fun (el_shft k lfts) a
| FFROZEN _ -> anomaly "Closure.fstrong"
-(* Build a freeze, which represents the substitution of arg in fun_body.
+(* Build a freeze, which represents the substitution of arg in t
* Used to constract a beta-redex:
- * [^depth](FLAM(S,t)) arg -> [(^depth o S).arg]t
- * We also deal with FLIFT that would have been inserted between the
- * Lambda and FLAM operators. This never happens in practice.
+ * [^depth](FLam(S,t)) arg -> [(^depth o S).arg]t
*)
-let rec contract_subst depth fun_body arg =
- match fun_body.term with
- FLAM(_,_,t,subs) -> freeze (subs_cons (arg, subs_shft (depth,subs))) t
- | FLIFT(k,fb) -> contract_subst (depth+k) fb arg
- | _ -> anomaly "Closure.contract_subst: malformed function"
+let rec contract_subst depth t subs arg =
+ freeze (subs_cons (arg, subs_shft (depth,subs))) t
(* Calculus of Constructions *)
-type fconstr = sorts oper freeze
+type fconstr = freeze
let inject constr = freeze ESID constr
@@ -760,6 +893,7 @@ and whnf_frterm info ft =
| None -> { norm = array_for_all is_val vars; term = ft.term })
else
ft
+
| FOPN (MutCase ci,cl) ->
if red_under info.i_flags IOTA then
let c = unfreeze (infos_under info) cl.(1) in
@@ -777,8 +911,11 @@ and whnf_frterm info ft =
else
ft
- | FRel _ | FVAR _ | FOP0 _ -> { norm = true; term = ft.term }
- | _ -> ft
+ | FLet (na,b,_,_,t,subs) -> warning "Should be catch in whnf_term";
+ contract_subst 0 t subs b
+
+ | FRel _ | FVAR _ | FOP0 _ -> { norm = true; term = ft.term }
+ | FOPN _ | FOP2 _ | FOP1 _ | FLam _ | FPrd _ | FLAM _ | FLAMV _ -> ft
(* Weak head reduction: case of the application (head appl) *)
and whnf_apply info head appl =
@@ -788,8 +925,8 @@ and whnf_apply info head appl =
else
let (lft_hd,whd,args) = strip_frterm 0 head [appl] in
match whd.term with
- | FOP2(Lambda,_,b) when red_under info.i_flags BETA ->
- let vbody = contract_subst lft_hd (unfreeze info b) args.(0) in
+ | FLam (_,_,_,t,subs) when red_under info.i_flags BETA ->
+ let vbody = contract_subst lft_hd t subs args.(0) in
whnf_apply info vbody (array_tl args)
| (FOPN(Fix(reci,bnum), tb) as fx)
when red_under info.i_flags IOTA
@@ -815,21 +952,30 @@ and whnf_term info env t =
| DOP0 op -> {norm = true; term = FOP0 op }
| DOP1 (op, nt) -> { norm = false; term = FOP1 (op, freeze env nt) }
| DOP2 (Cast,ct,c) -> whnf_term info env ct (* remove outer casts *)
- | DOP2 (op,a,b) -> (* Lambda Prod *)
- { norm = false; term = FOP2 (op, freeze env a, freeze env b) }
+ | DOP2 (_,_,_) -> assert false (* Lambda|Prod made explicit *)
| DOPN ((AppL | Const _ | Evar _ | Abst _ | MutCase _) as op, ve) ->
whnf_frterm info { norm = false; term = FOPN (op, freeze_vect env ve) }
| DOPN ((MutInd _ | MutConstruct _) as op,v) ->
{ norm = (v=[||]); term = FOPN (op, freeze_vect env v) }
| DOPN (op,v) ->
{ norm = false; term = FOPN (op, freeze_vect env v) } (* Fix CoFix *)
- | DOPL (op,l) -> { norm = false; term = FOPL (op, freeze_list env l) }
| DLAM (x,a) ->
{ norm = false; term = FLAM (x, freeze (subs_lift env) a, a, env) }
| DLAMV (x,ve) ->
{ norm = (ve=[||]);
term = FLAMV (x, freeze_vect (subs_lift env) ve, ve, env) }
-
+ | CLam (n,t,c) ->
+ { norm = false;
+ term = FLam (n, typed_map (freeze env) t, freeze (subs_lift env) c,
+ c, env) }
+ | CPrd (n,t,c) ->
+ { norm = false;
+ term = FPrd (n, typed_map (freeze env) t, freeze (subs_lift env) c,
+ c, env) }
+
+ (* WHNF removes LetIn (see Paula Severi) *)
+ | CLet (n,b,t,c) -> whnf_term info (subs_cons (freeze env b,env)) c
+
(* parameterized norm *)
let norm_val info v =
if !stats then begin
diff --git a/kernel/closure.mli b/kernel/closure.mli
index 0cba4cb87..940cd2664 100644
--- a/kernel/closure.mli
+++ b/kernel/closure.mli
@@ -4,7 +4,7 @@
(*i*)
open Pp
open Names
-open Generic
+(*i open Generic i*)
open Term
open Evd
open Environ
@@ -54,17 +54,29 @@ val betadeltaiota : flags
val hnf_flags : flags
+(*s Explicit substitutions of type ['a]. [ESID] = identity.
+ [CONS(t,S)] = $S.t$ i.e. parallel substitution. [SHIFT(n,S)] =
+ $(\uparrow n~o~S)$ i.e. terms in S are relocated with n vars.
+ [LIFT(n,S)] = $(\%n~S)$ stands for $((\uparrow n~o~S).n...1)$. *)
+type 'a subs =
+ | ESID
+ | CONS of 'a * 'a subs
+ | SHIFT of int * 'a subs
+ | LIFT of int * 'a subs
(*s Call by value functions *)
type cbv_value =
| VAL of int * constr
| LAM of name * constr * constr * cbv_value subs
- | FIXP of sorts oper * constr array * cbv_value subs * cbv_value list
+ | FIXP of fixpoint * cbv_value subs * cbv_value list
+ | COFIXP of cofixpoint * cbv_value subs * cbv_value list
| CONSTR of int * (section_path * int) * cbv_value array * cbv_value list
val shift_value : int -> cbv_value -> cbv_value
-val contract_fixp : cbv_value subs -> constr -> cbv_value subs * constr
+(*i Private ??
+val contract_fixp : cbv_value subs -> fixpoint -> cbv_value subs * constr
+i*)
type stack =
| TOP
@@ -78,8 +90,10 @@ val strip_appl : cbv_value -> stack -> cbv_value * stack
val red_allowed : flags -> stack -> red_kind -> bool
val reduce_const_body :
(cbv_value -> cbv_value) -> cbv_value -> stack -> cbv_value * stack
+(*i Private ??
val fixp_reducible :
- (cbv_value -> cbv_value) -> flags -> sorts oper -> stack -> bool
+ (cbv_value -> cbv_value) -> flags -> fixpoint -> stack -> bool
+i*)
(* normalization of a constr: the two functions to know... *)
type 'a cbv_infos
@@ -99,45 +113,49 @@ val cbv_norm_value : 'a cbv_infos -> cbv_value -> constr
(*s Lazy reduction. *)
-type 'a freeze
+type freeze
-type 'a frterm =
+type frterm =
| FRel of int
| FVAR of identifier
- | FOP0 of 'a
- | FOP1 of 'a * 'a freeze
- | FOP2 of 'a * 'a freeze * 'a freeze
- | FOPN of 'a * 'a freeze array
- | FOPL of 'a * 'a freeze list
- | FLAM of name * 'a freeze * 'a term * 'a freeze subs
- | FLAMV of name * 'a freeze array * 'a term array * 'a freeze subs
- | FLIFT of int * 'a freeze
- | FFROZEN of 'a term * 'a freeze subs
+ | FOP0 of sorts oper
+ | FOP1 of sorts oper * freeze
+ | FOP2 of sorts oper * freeze * freeze
+ | FOPN of sorts oper * freeze array
+ | FLAM of name * freeze * constr * freeze subs
+ | FLAMV of name * freeze array * constr array * freeze subs
+ | FLam of name * type_freeze * freeze * constr * freeze subs
+ | FPrd of name * type_freeze * freeze * constr * freeze subs
+ | FLet of name * freeze * type_freeze * freeze * constr * freeze subs
+ | FLIFT of int * freeze
+ | FFROZEN of constr * freeze subs
-val frterm_of : 'a freeze -> 'a frterm
-val is_val : 'a freeze -> bool
+and type_freeze = freeze
-val lift_frterm : int -> 'a freeze -> 'a freeze
-val lift_freeze : int -> 'a freeze -> 'a freeze
+val frterm_of : freeze -> frterm
+val is_val : freeze -> bool
-val freeze : 'a freeze subs -> 'a term -> 'a freeze
-val freeze_vect : 'a freeze subs -> 'a term array -> 'a freeze array
-val freeze_list : 'a freeze subs -> 'a term list -> 'a freeze list
+val lift_frterm : int -> freeze -> freeze
+val lift_freeze : int -> freeze -> freeze
-val traverse_term : 'a freeze subs -> 'a term -> 'a freeze
-val lift_term_of_freeze : lift_spec -> 'a freeze -> 'a term
+val freeze : freeze subs -> constr -> freeze
+val freeze_vect : freeze subs -> constr array -> freeze array
+val freeze_list : freeze subs -> constr list -> freeze list
+
+val traverse_term : freeze subs -> constr -> freeze
+val lift_term_of_freeze : lift_spec -> freeze -> constr
(* Back to constr *)
-val fstrong : ('a freeze -> 'a freeze) -> lift_spec -> 'a freeze -> 'a term
-val term_of_freeze : 'a freeze -> 'a term
-val applist_of_freeze : 'a freeze array -> 'a term list
+val fstrong : (freeze -> freeze) -> lift_spec -> freeze -> constr
+val term_of_freeze : freeze -> constr
+val applist_of_freeze : freeze array -> constr list
(* contract a substitution *)
-val contract_subst : int -> 'a freeze -> 'a freeze -> 'a freeze
+val contract_subst : int -> constr -> freeze subs -> freeze -> freeze
(* Calculus of Constructions *)
-type fconstr = sorts oper freeze
+type fconstr = freeze
val inject : constr -> fconstr
val strip_frterm :
@@ -146,7 +164,7 @@ val strip_freeze : fconstr -> int * fconstr * fconstr array
(* Auxiliary functions for (co)fixpoint reduction *)
-val contract_fix_vect : (fconstr -> fconstr) -> sorts oper frterm -> fconstr
+val contract_fix_vect : (fconstr -> fconstr) -> frterm -> fconstr
val copy_case : case_info -> fconstr array -> fconstr -> fconstr
diff --git a/kernel/declarations.ml b/kernel/declarations.ml
index e83e1e509..a5cb164d0 100644
--- a/kernel/declarations.ml
+++ b/kernel/declarations.ml
@@ -3,7 +3,7 @@
open Names
open Univ
-open Generic
+(*i open Generic i*)
open Term
open Sign
diff --git a/kernel/environ.ml b/kernel/environ.ml
index 217a7f989..4909e4444 100644
--- a/kernel/environ.ml
+++ b/kernel/environ.ml
@@ -6,7 +6,7 @@ open Util
open Names
open Sign
open Univ
-open Generic
+(*i open Generic i*)
open Term
open Declarations
open Abstraction
@@ -229,32 +229,40 @@ let id_of_global env = function
assert false
let hdchar env c =
- let rec hdrec k = function
- | DOP2((Prod|Lambda),_,DLAM(_,c)) -> hdrec (k+1) c
- | DOP2(Cast,c,_) -> hdrec k c
- | DOPN(AppL,cl) -> hdrec k (array_hd cl)
- | DOPN(Const _,_) as x ->
- let c = lowercase_first_char (basename (path_of_const x)) in
+ let rec hdrec k c =
+ match kind_of_term c with
+ | IsProd (_,_,c) -> hdrec (k+1) c
+ | IsLambda (_,_,c) -> hdrec (k+1) c
+ | IsLetIn (_,_,_,c) -> hdrec (k+1) c
+ | IsCast (c,_) -> hdrec k c
+ | IsAppL (f,l) -> hdrec k f
+ | IsConst (sp,_) ->
+ let c = lowercase_first_char (basename sp) in
if c = "?" then "y" else c
- | DOPN(Abst _,_) as x ->
- lowercase_first_char (basename (path_of_abst x))
- | DOPN(MutInd (sp,i) as x,_) ->
+ | IsMutInd ((sp,i) as x,_) ->
if i=0 then
lowercase_first_char (basename sp)
else
- let na = id_of_global env x in lowercase_first_char na
- | DOPN(MutConstruct(sp,i) as x,_) ->
- let na = id_of_global env x in String.lowercase(List.hd(explode_id na))
- | VAR id -> lowercase_first_char id
- | DOP0(Sort s) -> sort_hdchar s
- | Rel n ->
+ let na = id_of_global env (MutInd x) in lowercase_first_char na
+ | IsMutConstruct ((sp,i) as x,_) ->
+ let na = id_of_global env (MutConstruct x) in
+ String.lowercase(List.hd(explode_id na))
+ | IsVar id -> lowercase_first_char id
+ | IsSort s -> sort_hdchar s
+ | IsRel n ->
(if n<=k then "p" (* the initial term is flexible product/function *)
else
try match lookup_rel_type (n-k) env with
| Name id,_ -> lowercase_first_char id
| Anonymous,t -> hdrec 0 (lift (n-k) (body_of_type t))
with Not_found -> "y")
- | _ -> "y"
+ | IsFix ((_,i),(_,ln,_)) ->
+ let id = match List.nth ln i with Name id -> id | _ -> assert false in
+ lowercase_first_char id
+ | IsCoFix (i,(_,ln,_)) ->
+ let id = match List.nth ln i with Name id -> id | _ -> assert false in
+ lowercase_first_char id
+ | IsMeta _|IsXtra _|IsAbst (_, _)|IsEvar _|IsMutCase (_, _, _, _) -> "y"
in
hdrec 0 c
@@ -266,14 +274,14 @@ let named_hd env a = function
| Anonymous -> Name (id_of_string (hdchar env a))
| x -> x
-let prod_name env (n,a,b) = mkProd (named_hd env a n) a b
-let lambda_name env (n,a,b) = mkLambda (named_hd env a n) a b
+let prod_name env (n,a,b) = mkProd (named_hd env a n, a, b)
+let lambda_name env (n,a,b) = mkLambda (named_hd env a n, a, b)
let it_prod_name env = List.fold_left (fun c (n,t) ->prod_name env (n,t,c))
let it_lambda_name env = List.fold_left (fun c (n,t) ->lambda_name env (n,t,c))
-let prod_create env (a,b) = mkProd (named_hd env a Anonymous) a b
-let lambda_create env (a,b) = mkLambda (named_hd env a Anonymous) a b
+let prod_create env (a,b) = mkProd (named_hd env a Anonymous, a, b)
+let lambda_create env (a,b) = mkLambda (named_hd env a Anonymous, a, b)
let name_assumption env (na,c,t) =
match c with
@@ -286,6 +294,7 @@ let lambda_assum_name env b d = mkLambda_or_LetIn (name_assumption env d) b
let it_mkProd_or_LetIn_name env = List.fold_left (prod_assum_name env)
let it_mkLambda_or_LetIn_name env = List.fold_left (lambda_assum_name env)
+let it_mkProd_wo_LetIn = List.fold_left (fun c d -> mkProd_wo_LetIn d c)
let it_mkProd_or_LetIn = List.fold_left (fun c d -> mkProd_or_LetIn d c)
let it_mkLambda_or_LetIn = List.fold_left (fun c d -> mkLambda_or_LetIn d c)
diff --git a/kernel/environ.mli b/kernel/environ.mli
index 981be607f..b99410bd3 100644
--- a/kernel/environ.mli
+++ b/kernel/environ.mli
@@ -130,6 +130,7 @@ val it_prod_name : env -> constr -> (name * constr) list -> constr
val it_mkLambda_or_LetIn_name : env -> constr -> rel_context -> constr
val it_mkProd_or_LetIn_name : env -> constr -> rel_context -> constr
+val it_mkProd_wo_LetIn : constr -> rel_context -> constr
val it_mkLambda_or_LetIn : constr -> rel_context -> constr
val it_mkProd_or_LetIn : constr -> rel_context -> constr
diff --git a/kernel/indtypes.ml b/kernel/indtypes.ml
index 0536b1f2f..a37e469bd 100644
--- a/kernel/indtypes.ml
+++ b/kernel/indtypes.ml
@@ -3,7 +3,7 @@
open Util
open Names
-open Generic
+(*i open Generic i*)
open Term
open Declarations
open Inductive
@@ -92,14 +92,6 @@ let mind_extract_and_check_params mie =
List.iter (fun (_,c,_,_) -> check_params params (extract nparams c)) l;
params
-let decomp_all_DLAMV_name constr =
- let rec decomprec lna = function
- | DLAM(na,lc) -> decomprec (na::lna) lc
- | DLAMV(na,lc) -> (na::lna,lc)
- | _ -> assert false
- in
- decomprec [] constr
-
let mind_check_lc params mie =
let nparams = List.length params in
let check_lc (_,_,_,lc) =
@@ -156,6 +148,7 @@ let failwith_non_pos_vect n ntypes v =
anomaly "failwith_non_pos_vect: some k in [n;n+ntypes-1] should occur in v"
let check_correct_par env nparams ntypes n l largs =
+ let largs = Array.of_list largs in
if Array.length largs < nparams then
raise (IllFormedInd (LocalNotEnoughArgs l));
let (lpar,largs') = array_chop nparams largs in
@@ -182,40 +175,40 @@ let decomp_par n c = snd (mind_extract_params n c)
let listrec_mconstr env ntypes nparams i indlc =
(* check the inductive types occur positively in [c] *)
let rec check_pos n c =
- match whd_betadeltaiota env Evd.empty c with
- | DOP2(Prod,b,DLAM(na,d)) ->
- if not (noccur_between n ntypes b) then raise (IllFormedInd (LocalNonPos n));
+ let x,largs = whd_betadeltaiota_stack env Evd.empty c [] in
+ match kind_of_term x with
+ | IsProd (na,b,d) ->
+ assert (largs = []);
+ if not (noccur_between n ntypes b) then
+ raise (IllFormedInd (LocalNonPos n));
check_pos (n+1) d
- | x ->
- let hd,largs = destApplication (ensure_appl x) in
- match hd with
- | Rel k ->
- if k >= n && k<n+ntypes then begin
- check_correct_par env nparams ntypes n (k-n+1) largs;
- Mrec(n+ntypes-k-1)
- end else if noccur_between n ntypes x then
- if (n-nparams) <= k & k <= (n-1)
- then Param(n-1-k)
- else Norec
- else
- raise (IllFormedInd (LocalNonPos n))
- | DOPN(MutInd ind_sp,a) ->
- if (noccur_between n ntypes x) then Norec
- else Imbr(ind_sp,imbr_positive n (ind_sp,a) largs)
- | err ->
- if noccur_between n ntypes x then Norec
- else raise (IllFormedInd (LocalNonPos n))
+ | IsRel k ->
+ if k >= n && k<n+ntypes then begin
+ check_correct_par env nparams ntypes n (k-n+1) largs;
+ Mrec(n+ntypes-k-1)
+ end else if noccur_between n ntypes x then
+ if (n-nparams) <= k & k <= (n-1)
+ then Param(n-1-k)
+ else Norec
+ else
+ raise (IllFormedInd (LocalNonPos n))
+ | IsMutInd (ind_sp,a) ->
+ if (noccur_between n ntypes x) then Norec
+ else Imbr(ind_sp,imbr_positive n (ind_sp,a) largs)
+ | err ->
+ if noccur_between n ntypes x then Norec
+ else raise (IllFormedInd (LocalNonPos n))
and imbr_positive n mi largs =
let mispeci = lookup_mind_specif mi env in
let auxnpar = mis_nparams mispeci in
- let (lpar,auxlargs) = array_chop auxnpar largs in
- if not (array_for_all (noccur_between n ntypes) auxlargs) then
+ let (lpar,auxlargs) = list_chop auxnpar largs in
+ if not (List.for_all (noccur_between n ntypes) auxlargs) then
raise (IllFormedInd (LocalNonPos n));
let auxlc = mis_lc mispeci
and auxntyp = mis_ntypes mispeci in
if auxntyp <> 1 then raise (IllFormedInd (LocalNonPos n));
- let lrecargs = array_map_to_list (check_weak_pos n) lpar in
+ let lrecargs = List.map (check_weak_pos n) lpar in
(* The abstract imbricated inductive type with parameters substituted *)
let auxlcvect = abstract_mind_lc env auxntyp auxnpar auxlc in
let newidx = n + auxntyp in
@@ -224,8 +217,8 @@ let listrec_mconstr env ntypes nparams i indlc =
(* when substituted *)
Array.map
(function c ->
- let c' = hnf_prod_appvect env Evd.empty c
- (Array.map (lift auxntyp) lpar) in
+ let c' = hnf_prod_applist env Evd.empty c
+ (List.map (lift auxntyp) lpar) in
check_construct false newidx c')
auxlcvect
in
@@ -248,15 +241,16 @@ let listrec_mconstr env ntypes nparams i indlc =
(* Since Lambda can no longer occur after a product or a MutInd,
I have branched the remaining cases on check_pos. HH 28/1/00 *)
- and check_weak_pos n c =
- match whd_betadeltaiota env Evd.empty c with
+ and check_weak_pos n c =
+ let x = whd_betadeltaiota env Evd.empty c in
+ match kind_of_term x with
(* The extra case *)
- | DOP2(Lambda,b,DLAM(na,d)) ->
+ | IsLambda (na,b,d) ->
if noccur_between n ntypes b
then check_weak_pos (n+1) d
else raise (IllFormedInd (LocalNonPos n))
(******************)
- | x -> check_pos n x
+ | _ -> check_pos n x
(* check the inductive types occur positively in the products of C, if
check_head=true, also check the head corresponds to a constructor of
@@ -264,19 +258,20 @@ let listrec_mconstr env ntypes nparams i indlc =
and check_construct check_head =
let rec check_constr_rec lrec n c =
- match whd_betadeltaiota env Evd.empty c with
- | DOP2(Prod,b,DLAM(na,d)) ->
+ let x,largs = whd_betadeltaiota_stack env Evd.empty c [] in
+ match kind_of_term x with
+ | IsProd (na,b,d) ->
+ assert (largs = []);
let recarg = check_pos n b in
check_constr_rec (recarg::lrec) (n+1) d
- | x ->
- let hd,largs = destApplication (ensure_appl x) in
+ | hd ->
if check_head then
- match hd with
- | Rel k when k = n+ntypes-i ->
- check_correct_par env nparams ntypes n (k-n+1) largs
- | _ -> raise (IllFormedInd LocalNotConstructor)
+ if hd = IsRel (n+ntypes-i) then
+ check_correct_par env nparams ntypes n (ntypes-i+1) largs
+ else
+ raise (IllFormedInd LocalNotConstructor)
else
- if not (array_for_all (noccur_between n ntypes) largs)
+ if not (List.for_all (noccur_between n ntypes) largs)
then raise (IllFormedInd (LocalNonPos n));
List.rev lrec
in check_constr_rec []
diff --git a/kernel/inductive.ml b/kernel/inductive.ml
index 43b756651..db3329a1a 100644
--- a/kernel/inductive.ml
+++ b/kernel/inductive.ml
@@ -4,7 +4,7 @@
open Util
open Names
open Univ
-open Generic
+(*i open Generic i*)
open Term
open Sign
open Declarations
diff --git a/kernel/instantiate.ml b/kernel/instantiate.ml
index 9fb85961f..627f0d45c 100644
--- a/kernel/instantiate.ml
+++ b/kernel/instantiate.ml
@@ -4,7 +4,7 @@
open Pp
open Util
open Names
-open Generic
+(*i open Generic i*)
open Term
open Sign
open Evd
diff --git a/kernel/reduction.ml b/kernel/reduction.ml
index c4642b933..f0f7945d6 100644
--- a/kernel/reduction.ml
+++ b/kernel/reduction.ml
@@ -4,7 +4,7 @@
open Pp
open Util
open Names
-open Generic
+(*i open Generic i*)
open Term
open Univ
open Evd
@@ -26,6 +26,17 @@ type 'a stack_reduction_function = 'a contextual_stack_reduction_function
type local_stack_reduction_function =
constr -> constr list -> constr * constr list
+type stack =
+ | EmptyStack
+ | ConsStack of constr array * int * stack
+
+let decomp_stack = function
+ | EmptyStack -> None
+ | ConsStack (v, n, s) ->
+ Some (v.(n), (if n+1 = Array.length v then s else ConsStack (v, n+1, s)))
+
+let append_stack v s = if Array.length v = 0 then s else ConsStack (v,0,s)
+
(*************************************)
(*** Reduction Functions Operators ***)
(*************************************)
@@ -49,44 +60,66 @@ let stack_reduction_of_reduction red_fun env sigma x stack =
whd_stack t []
let strong whdfun env sigma =
- let rec strongrec t = match whdfun env sigma t with
+ let rec strongrec env t = match whdfun env sigma t with
| DOP0 _ as t -> t
+ | DOP1(oper,c) -> DOP1(oper,strongrec env c)
+ | DOP2(oper,c1,c2) -> DOP2(oper,strongrec env c1,strongrec env c2)
(* Cas ad hoc *)
- | DOP1(oper,c) -> DOP1(oper,strongrec c)
- (* Faut differencier sinon fait planter kind_of_term *)
- | DOP2(Prod|Lambda as oper,c1,DLAM(na,c2)) ->
- DOP2(oper,strongrec c1,DLAM(na,strongrec c2))
- | DOP2(oper,c1,c2) -> DOP2(oper,strongrec c1,strongrec c2)
- | DOPN(oper,cl) -> DOPN(oper,Array.map strongrec cl)
- | DOPL(oper,cl) -> DOPL(oper,List.map strongrec cl)
- | DLAM(na,c) -> DLAM(na,strongrec c)
- | DLAMV(na,c) -> DLAMV(na,Array.map strongrec c)
+ | DOPN(Fix _ as oper,cl) ->
+ let cl' = Array.copy cl in
+ let l = Array.length cl -1 in
+ for i=0 to l-1 do cl'.(i) <- strongrec env cl.(i) done;
+ cl'.(l) <- strongrec_lam env cl.(l);
+ DOPN(oper, cl')
+ | DOPN(oper,cl) -> DOPN(oper,Array.map (strongrec env) cl)
+ | CLam (n,t,c) ->
+ CLam (n, typed_app (strongrec env) t, strongrec (push_rel_decl (n,t) env) c)
+ | CPrd (n,t,c) ->
+ CPrd (n, typed_app (strongrec env) t, strongrec (push_rel_decl (n,t) env) c)
+ | CLet (n,b,t,c) ->
+ CLet (n, strongrec env b, typed_app (strongrec env) t,
+ strongrec (push_rel_def (n,b,t) env) c)
| VAR _ as t -> t
| Rel _ as t -> t
+ | DLAM _ | DLAMV _ -> assert false
+ and strongrec_lam env = function (* Gestion incorrecte de l'env des Fix *)
+ | DLAM(na,c) -> DLAM(na,strongrec_lam env c)
+ | DLAMV(na,c) -> DLAMV(na,Array.map (strongrec env) c)
+ | _ -> assert false
in
- strongrec
+ strongrec env
let local_strong whdfun =
let rec strongrec t = match whdfun t with
| DOP0 _ as t -> t
- (* Cas ad hoc *)
| DOP1(oper,c) -> DOP1(oper,strongrec c)
| DOP2(oper,c1,c2) -> DOP2(oper,strongrec c1,strongrec c2)
+ (* Cas ad hoc *)
+ | DOPN(Fix _ as oper,cl) ->
+ let cl' = Array.copy cl in
+ let l = Array.length cl -1 in
+ for i=0 to l-1 do cl'.(i) <- strongrec cl.(i) done;
+ cl'.(l) <- strongrec_lam cl.(l);
+ DOPN(oper, cl')
| DOPN(oper,cl) -> DOPN(oper,Array.map strongrec cl)
- | DOPL(oper,cl) -> DOPL(oper,List.map strongrec cl)
- | DLAM(na,c) -> DLAM(na,strongrec c)
- | DLAMV(na,c) -> DLAMV(na,Array.map strongrec c)
+ | CLam(n,t,c) -> CLam (n, typed_app strongrec t, strongrec c)
+ | CPrd(n,t,c) -> CPrd (n, typed_app strongrec t, strongrec c)
+ | CLet(n,b,t,c) -> CLet (n, strongrec b,typed_app strongrec t, strongrec c)
| VAR _ as t -> t
| Rel _ as t -> t
+ | DLAM _ | DLAMV _ -> assert false
+ and strongrec_lam = function
+ | DLAM(na,c) -> DLAM(na,strongrec_lam c)
+ | DLAMV(na,c) -> DLAMV(na,Array.map strongrec c)
+ | _ -> assert false
in
strongrec
-let rec strong_prodspine redfun env sigma c =
- match redfun env sigma c with
- | DOP2(Prod,a,DLAM(na,b)) ->
- DOP2(Prod,a,DLAM(na,strong_prodspine redfun env sigma b))
- | x -> x
-
+let rec strong_prodspine redfun c =
+ let x = redfun c in
+ match kind_of_term x with
+ | IsProd (na,a,b) -> mkProd (na,a,strong_prodspine redfun b)
+ | _ -> x
(****************************************************************************)
(* Reduction Functions *)
@@ -122,17 +155,14 @@ let whd_flags flgs env sigma t =
(* Red reduction tactic: reduction to a product *)
let red_product env sigma c =
let rec redrec x =
- match x with
- | DOPN(AppL,cl) ->
- DOPN(AppL,Array.append [|redrec (array_hd cl)|] (array_tl cl))
- | DOPN(Const _,_) when evaluable_constant env x ->
- constant_value env x
- | DOPN(Evar ev,args) when Evd.is_defined sigma ev ->
+ match kind_of_term x with
+ | IsAppL (f,l) -> applist (redrec f, l)
+ | IsConst (_,_) when evaluable_constant env x -> constant_value env x
+ | IsEvar (ev,args) when Evd.is_defined sigma ev ->
existential_value sigma (ev,args)
- | DOPN(Abst _,_) when evaluable_abst env x ->
- abst_value env x
- | DOP2(Cast,c,_) -> redrec c
- | DOP2(Prod,a,DLAM(x,b)) -> DOP2(Prod, a, DLAM(x, redrec b))
+ | IsAbst (_,_) when evaluable_abst env x -> abst_value env x
+ | IsCast (c,_) -> redrec c
+ | IsProd (x,a,b) -> mkProd (x, a, redrec b)
| _ -> error "Term not reducible"
in
nf_betaiota env sigma (redrec c)
@@ -141,33 +171,26 @@ let red_product env sigma c =
* n is the number of the next occurence of name.
* ol is the occurence list to find. *)
let rec substlin env name n ol c =
- match c with
- | DOPN(Const sp,_) ->
- if sp = name then
- if List.hd ol = n then
- if evaluable_constant env c then
- (n+1, List.tl ol, constant_value env c)
- else
- errorlabstrm "substlin"
- [< print_sp sp; 'sTR " is not a defined constant" >]
- else
- ((n+1),ol,c)
+ match kind_of_term c with
+ | IsConst (sp,_) when sp = name ->
+ if List.hd ol = n then
+ if evaluable_constant env c then
+ (n+1, List.tl ol, constant_value env c)
+ else
+ errorlabstrm "substlin"
+ [< print_sp sp; 'sTR " is not a defined constant" >]
else
- (n,ol,c)
+ ((n+1),ol,c)
- | DOPN(Abst _,_) ->
- if path_of_abst c = name then
- if List.hd ol = n then
- (n+1, List.tl ol, abst_value env c)
- else
- (n+1,ol,c)
+ | IsAbst (_,_) when path_of_abst c = name ->
+ if List.hd ol = n then
+ (n+1, List.tl ol, abst_value env c)
else
- (n,ol,c)
+ (n+1,ol,c)
(* INEFFICIENT: OPTIMIZE *)
- | DOPN(AppL,tl) ->
- let c1 = array_hd tl and cl = array_tl tl in
- Array.fold_left
+ | IsAppL (c1,cl) ->
+ List.fold_left
(fun (n1,ol1,c1') c2 ->
(match ol1 with
| [] -> (n1,[],applist(c1',[c2]))
@@ -176,24 +199,31 @@ let rec substlin env name n ol c =
(n2,ol2,applist(c1',[c2']))))
(substlin env name n ol c1) cl
- | DOP2(Lambda,c1,DLAM(na,c2)) ->
+ | IsLambda (na,c1,c2) ->
let (n1,ol1,c1') = substlin env name n ol c1 in
(match ol1 with
- | [] -> (n1,[],DOP2(Lambda,c1',DLAM(na,c2)))
+ | [] -> (n1,[],mkLambda (na,c1',c2))
| _ ->
let (n2,ol2,c2') = substlin env name n1 ol1 c2 in
- (n2,ol2,DOP2(Lambda,c1',DLAM(na,c2'))))
+ (n2,ol2,mkLambda (na,c1',c2')))
- | DOP2(Prod,c1,DLAM(na,c2)) ->
+ | IsLetIn (na,c1,t,c2) ->
let (n1,ol1,c1') = substlin env name n ol c1 in
(match ol1 with
- | [] -> (n1,[],DOP2(Prod,c1',DLAM(na,c2)))
+ | [] -> (n1,[],mkLambda (na,c1',c2))
| _ ->
let (n2,ol2,c2') = substlin env name n1 ol1 c2 in
- (n2,ol2,DOP2(Prod,c1',DLAM(na,c2'))))
+ (n2,ol2,mkLambda (na,c1',c2')))
+
+ | IsProd (na,c1,c2) ->
+ let (n1,ol1,c1') = substlin env name n ol c1 in
+ (match ol1 with
+ | [] -> (n1,[],mkProd (na,c1',c2))
+ | _ ->
+ let (n2,ol2,c2') = substlin env name n1 ol1 c2 in
+ (n2,ol2,mkProd (na,c1',c2')))
- | DOPN(MutCase _,_) ->
- let (ci,p,d,llf) = destCase c in
+ | IsMutCase (ci,p,d,llf) ->
let rec substlist nn oll = function
| [] -> (nn,oll,[])
| f::lfe ->
@@ -213,23 +243,26 @@ let rec substlin env name n ol c =
| [] -> (n2,[],mkMutCaseA ci p' d' llf)
| _ ->
let (n3,ol3,lf') = substlist n2 ol2 (Array.to_list llf)
- in (n3,ol3,mkMutCase ci p' d' lf')))
+ in (n3,ol3,mkMutCase (ci, p', d', lf'))))
- | DOP2(Cast,c1,c2) ->
+ | IsCast (c1,c2) ->
let (n1,ol1,c1') = substlin env name n ol c1 in
(match ol1 with
- | [] -> (n1,[],DOP2(Cast,c1',c2))
+ | [] -> (n1,[],mkCast (c1',c2))
| _ ->
let (n2,ol2,c2') = substlin env name n1 ol1 c2 in
- (n2,ol2,DOP2(Cast,c1',c2')))
+ (n2,ol2,mkCast (c1',c2')))
- | DOPN(Fix _,_) ->
+ | IsFix _ ->
(warning "do not consider occurrences inside fixpoints"; (n,ol,c))
- | DOPN(CoFix _,_) ->
+ | IsCoFix _ ->
(warning "do not consider occurrences inside cofixpoints"; (n,ol,c))
+
+ | (IsRel _|IsMeta _|IsVar _|IsXtra _|IsSort _
+ |IsAbst (_, _)|IsEvar _|IsConst _
+ |IsMutInd _|IsMutConstruct _) -> (n,ol,c)
- | _ -> (n,ol,c)
let unfold env sigma name =
let flag =
@@ -275,9 +308,9 @@ let abstract_scheme env (locc,a,ta) t =
let na = named_hd env ta Anonymous in
if occur_meta ta then error "cannot find a type for the generalisation";
if occur_meta a then
- DOP2(Lambda,ta,DLAM(na,t))
+ mkLambda (na,ta,t)
else
- DOP2(Lambda, ta, DLAM(na,subst_term_occ locc a t))
+ mkLambda (na, ta,subst_term_occ locc a t)
let pattern_occs loccs_trm_typ env sigma c =
@@ -293,26 +326,25 @@ let pattern_occs loccs_trm_typ env sigma c =
let rec stacklam recfun env t stack =
match (stack,t) with
- | (h::stacktl, DOP2(Lambda,_,DLAM(_,c))) ->
- stacklam recfun (h::env) c stacktl
- | _ -> recfun (substl env t) stack
+ | h::stacktl, CLam (_,_,c) -> stacklam recfun (h::env) c stacktl
+ | _ -> recfun (substl env t, stack)
-let beta_applist (c,l) = stacklam (fun c l -> applist(c,l)) [] c l
+let beta_applist (c,l) = stacklam applist [] c l
-let whd_beta_stack =
- let rec whrec x stack = match x with
- | DOP2(Lambda,c1,DLAM(name,c2)) ->
+let whd_beta_stack x stack =
+ let rec whrec (x, stack as s) = match x with
+ | CLam (name,c1,c2) ->
(match stack with
| [] -> (x,[])
| a1::rest -> stacklam whrec [a1] c2 rest)
- | DOPN(AppL,cl) -> whrec (array_hd cl) (array_app_tl cl stack)
- | DOP2(Cast,c,_) -> whrec c stack
- | x -> (x,stack)
+ | DOPN(AppL,cl) -> whrec (array_hd cl, array_app_tl cl stack)
+ | DOP2(Cast,c,_) -> whrec (c, stack)
+ | x -> s
in
- whrec
+ whrec (x, stack)
let whd_beta x = applist (whd_beta_stack x [])
@@ -375,103 +407,105 @@ let whd_delta_stack env sigma =
let whd_delta env sigma c = applist(whd_delta_stack env sigma c [])
-let whd_betadelta_stack env sigma =
- let rec whrec x l =
- match x with
- | DOPN(Const _,_) ->
+let whd_betadelta_stack env sigma x l =
+ let rec whrec (x, l as s) =
+ match kind_of_term x with
+ | IsConst _ ->
if evaluable_constant env x then
- whrec (constant_value env x) l
+ whrec (constant_value env x, l)
else
- (x,l)
- | DOPN(Evar ev,args) ->
+ s
+ | IsEvar (ev,args) ->
if Evd.is_defined sigma ev then
- whrec (existential_value sigma (ev,args)) l
+ whrec (existential_value sigma (ev,args), l)
else
- (x,l)
+ s
+(*
| DOPN(Abst _,_) ->
if evaluable_abst env x then
whrec (abst_value env x) l
else
(x,l)
- | DOP2(Cast,c,_) -> whrec c l
- | DOPN(AppL,cl) -> whrec (array_hd cl) (array_app_tl cl l)
- | DOP2(Lambda,_,DLAM(_,c)) ->
+*)
+ | IsCast (c,_) -> whrec (c, l)
+ | IsAppL (f,cl) -> whrec (f, cl@l)
+ | IsLambda (_,_,c) ->
(match l with
- | [] -> (x,l)
+ | [] -> s
| (a::m) -> stacklam whrec [a] c m)
- | x -> (x,l)
+ | x -> s
in
- whrec
+ whrec (x, l)
let whd_betadelta env sigma c = applist(whd_betadelta_stack env sigma c [])
-let whd_betaevar_stack env sigma =
- let rec whrec x l =
- match x with
- | DOPN(Evar ev,args) ->
+let whd_betaevar_stack env sigma x l =
+ let rec whrec (x, l as s) =
+ match kind_of_term x with
+ | IsEvar (ev,args) ->
if Evd.is_defined sigma ev then
- whrec (existential_value sigma (ev,args)) l
+ whrec (existential_value sigma (ev,args), l)
else
- (x,l)
+ s
+(*
| DOPN(Abst _,_) ->
if translucent_abst env x then
whrec (abst_value env x) l
else
(x,l)
- | DOP2(Cast,c,_) -> whrec c l
- | DOPN(AppL,cl) -> whrec (array_hd cl) (array_app_tl cl l)
- | DOP2(Lambda,_,DLAM(_,c)) ->
+*)
+ | IsCast (c,_) -> whrec (c, l)
+ | IsAppL (f,cl) -> whrec (f, cl@l)
+ | IsLambda (_,_,c) ->
(match l with
| [] -> (x,l)
| (a::m) -> stacklam whrec [a] c m)
- | DOPN(Const _,_) -> (x,l)
- | x -> (x,l)
+ | x -> s
in
- whrec
+ whrec (x, l)
let whd_betaevar env sigma c = applist(whd_betaevar_stack env sigma c [])
-let whd_betadeltaeta_stack env sigma =
- let rec whrec x stack =
- match x with
- | DOPN(Const _,_) ->
- if evaluable_constant env x then
- whrec (constant_value env x) stack
+let whd_betadeltaeta_stack env sigma x l =
+ let rec whrec (x, l as s) =
+ match kind_of_term x with
+ | IsConst _ ->
+ if evaluable_constant env x then
+ whrec (constant_value env x, l)
else
- (x,stack)
- | DOPN(Evar ev,args) ->
+ s
+ | IsEvar (ev,args) ->
if Evd.is_defined sigma ev then
- whrec (existential_value sigma (ev,args)) stack
+ whrec (existential_value sigma (ev,args), l)
else
- (x,stack)
+ s
+(*
| DOPN(Abst _,_) ->
- if evaluable_abst env x then
- whrec (abst_value env x) stack
+ if evaluable_abst env x then
+ whrec (abst_value env x) l
else
- (x,stack)
- | DOP2(Cast,c,_) -> whrec c stack
- | DOPN(AppL,cl) -> whrec (array_hd cl) (array_app_tl cl stack)
- | DOP2(Lambda,_,DLAM(_,c)) ->
- (match stack with
- | [] ->
- (match applist (whrec c []) with
- | DOPN(AppL,cl) ->
- (match whrec (array_last cl) [] with
- | (Rel 1,[]) ->
- let napp = (Array.length cl) -1 in
- if napp = 0 then (x,stack) else
- let lc = Array.sub cl 0 napp in
- let u =
- if napp = 1 then lc.(0) else DOPN(AppL,lc)
- in
- if noccurn 1 u then (pop u,[]) else (x,stack)
- | _ -> (x,stack))
- | _ -> (x,stack))
+ (x,l)
+*)
+ | IsCast (c,_) -> whrec (c, l)
+ | IsAppL (f,cl) -> whrec (f, cl@l)
+ | IsLambda (_,_,c) ->
+ (match l with
+ | [] ->
+ (match applist (whrec (c, [])) with
+ | DOPN(AppL,cl) ->
+ let napp = (Array.length cl) -1 in
+ (match whrec (array_last cl, []) with
+ | (Rel 1,[]) when napp > 0 ->
+ let lc = Array.sub cl 0 napp in
+ let u = if napp=1 then lc.(0) else DOPN(AppL,lc)
+ in if noccurn 1 u then (pop u,[]) else s
+ | _ -> s)
+ | _ -> s)
| (a::m) -> stacklam whrec [a] c m)
- | x -> (x,stack)
+ | x -> s
in
- whrec
+ whrec (x, l)
let whd_betadeltaeta env sigma x =
applist(whd_betadeltaeta_stack env sigma x [])
@@ -540,185 +574,185 @@ let fix_recarg ((recindices,bodynum),_) stack =
else
None
+type fix_reduction_result = NotReducible | Reduced of (constr * constr list)
+
let reduce_fix whfun fix stack =
- let dfix = destFix fix in
- match fix_recarg dfix stack with
- | None -> (false,(fix,stack))
+ match fix_recarg fix stack with
+ | None -> NotReducible
| Some (recargnum,recarg) ->
- let (recarg'hd,_ as recarg') = whfun recarg [] in
+ let (recarg'hd,_ as recarg') = whfun (recarg, []) in
let stack' = list_assign stack recargnum (applist recarg') in
(match recarg'hd with
- | DOPN(MutConstruct _,_) ->
- (true,(contract_fix dfix,stack'))
- | _ -> (false,(fix,stack')))
+ | DOPN(MutConstruct _,_) -> Reduced (contract_fix fix, stack')
+ | _ -> NotReducible)
(* NB : Cette fonction alloue peu c'est l'appel
``let (recarg'hd,_ as recarg') = whfun recarg [] in''
--------------------
qui coute cher dans whd_betadeltaiota *)
-let whd_betaiota_stack =
- let rec whrec x stack =
- match x with
- | DOP2(Cast,c,_) -> whrec c stack
- | DOPN(AppL,cl) -> whrec (array_hd cl) (array_app_tl cl stack)
- | DOP2(Lambda,_,DLAM(_,c)) ->
+let whd_betaiota_stack x l =
+ let rec whrec (x,stack as s) =
+ match kind_of_term x with
+ | IsCast (c,_) -> whrec (c, stack)
+ | IsAppL (f,cl) -> whrec (f, cl@stack)
+ | IsLambda (_,_,c) ->
(match stack with
- | [] -> (x,stack)
- | (a::m) -> stacklam whrec [a] c m)
- | DOPN(MutCase _,_) ->
- let (ci,p,d,lf) = destCase x in
- let (c,cargs) = whrec d [] in
+ | [] -> s
+ | a::m -> stacklam whrec [a] c m)
+ | IsMutCase (ci,p,d,lf) ->
+ let (c,cargs) = whrec (d, []) in
if reducible_mind_case c then
whrec (reduce_mind_case
- {mP=p; mconstr=c; mcargs=cargs; mci=ci; mlf=lf}) stack
+ {mP=p; mconstr=c; mcargs=cargs; mci=ci; mlf=lf}, stack)
else
(mkMutCaseA ci p (applist(c,cargs)) lf, stack)
- | DOPN(Fix _,_) ->
- let (reduced,(fix,stack)) = reduce_fix whrec x stack in
- if reduced then whrec fix stack else (fix,stack)
- | x -> (x,stack)
+ | IsFix fix ->
+ (match reduce_fix whrec fix stack with
+ | Reduced s' -> whrec s'
+ | NotReducible -> s)
+ | _ -> s
in
- whrec
+ whrec (x, l)
let whd_betaiota x = applist (whd_betaiota_stack x [])
-let whd_betaiotaevar_stack env sigma =
- let rec whrec x stack =
- match x with
- | DOPN(Evar ev,args) ->
+let whd_betaiotaevar_stack env sigma x l =
+ let rec whrec (x, stack as s) =
+ match kind_of_term x with
+ | IsEvar (ev,args) ->
if Evd.is_defined sigma ev then
- whrec (existential_value sigma (ev,args)) stack
+ whrec (existential_value sigma (ev,args), stack)
else
- (x,stack)
+ s
+(*
| DOPN(Abst _,_) ->
if translucent_abst env x then
whrec (abst_value env x) stack
else
(x,stack)
- | DOP2(Cast,c,_) -> whrec c stack
- | DOPN(AppL,cl) -> whrec (array_hd cl) (array_app_tl cl stack)
- | DOP2(Lambda,_,DLAM(_,c)) ->
+*)
+ | IsCast (c,_) -> whrec (c, stack)
+ | IsAppL (f,cl) -> whrec (f, cl@stack)
+ | IsLambda (_,_,c) ->
(match stack with
- | [] -> (x,stack)
+ | [] -> s
| (a::m) -> stacklam whrec [a] c m)
- | DOPN(MutCase _,_) ->
- let (ci,p,d,lf) = destCase x in
- let (c,cargs) = whrec d [] in
+ | IsMutCase (ci,p,d,lf) ->
+ let (c,cargs) = whrec (d, []) in
if reducible_mind_case c then
whrec (reduce_mind_case
- {mP=p; mconstr=c; mcargs=cargs; mci=ci; mlf=lf}) stack
+ {mP=p; mconstr=c; mcargs=cargs; mci=ci; mlf=lf}, stack)
else
- (mkMutCaseA ci p (applist(c,cargs)) lf,stack)
- | DOPN(Fix _,_) ->
- let (reduced,(fix,stack)) = reduce_fix whrec x stack in
- if reduced then whrec fix stack else (fix,stack)
- | DOPN(Const _,_) -> (x,stack)
- | x -> (x,stack)
+ (mkMutCaseA ci p (applist(c,cargs)) lf, stack)
+ | IsFix fix ->
+ (match reduce_fix whrec fix stack with
+ | Reduced s' -> whrec s'
+ | NotReducible -> s)
+ | _ -> s
in
- whrec
+ whrec (x, l)
let whd_betaiotaevar env sigma x =
applist(whd_betaiotaevar_stack env sigma x [])
-let whd_betadeltaiota_stack env sigma =
- let rec bdi_rec x stack =
- match x with
- | DOPN(Const _,_) ->
+let whd_betadeltaiota_stack env sigma x l =
+ let rec whrec (x, stack as s) =
+ match kind_of_term x with
+ | IsConst _ ->
if evaluable_constant env x then
- bdi_rec (constant_value env x) stack
+ whrec (constant_value env x, stack)
else
- (x,stack)
- | DOPN(Evar ev,args) ->
+ s
+ | IsEvar (ev,args) ->
if Evd.is_defined sigma ev then
- bdi_rec (existential_value sigma (ev,args)) stack
+ whrec (existential_value sigma (ev,args), stack)
else
- (x,stack)
+ s
+(*
| DOPN(Abst _,_) ->
if evaluable_abst env x then
- bdi_rec (abst_value env x) stack
+ whrec (abst_value env x) stack
else
(x,stack)
- | DOP2(Cast,c,_) -> bdi_rec c stack
- | DOPN(AppL,cl) -> bdi_rec (array_hd cl) (array_app_tl cl stack)
- | DOP2(Lambda,_,DLAM(_,c)) ->
+*)
+ | IsCast (c,_) -> whrec (c, stack)
+ | IsAppL (f,cl) -> whrec (f, cl@stack)
+ | IsLambda (_,_,c) ->
(match stack with
- | [] -> (x,[])
- | (a::m) -> stacklam bdi_rec [a] c m)
- | DOPN(MutCase _,_) ->
- let (ci,p,d,lf) = destCase x in
- let (c,cargs) = bdi_rec d [] in
+ | [] -> s
+ | (a::m) -> stacklam whrec [a] c m)
+ | IsMutCase (ci,p,d,lf) ->
+ let (c,cargs) = whrec (d, []) in
if reducible_mind_case c then
- bdi_rec (reduce_mind_case
- {mP=p; mconstr=c; mcargs=cargs; mci=ci; mlf=lf}) stack
+ whrec (reduce_mind_case
+ {mP=p; mconstr=c; mcargs=cargs; mci=ci; mlf=lf}, stack)
else
- (mkMutCaseA ci p (applist(c,cargs)) lf,stack)
- | DOPN(Fix _,_) ->
- let (reduced,(fix,stack)) = reduce_fix bdi_rec x stack in
- if reduced then bdi_rec fix stack else (fix,stack)
- | x -> (x,stack)
+ (mkMutCaseA ci p (applist(c,cargs)) lf, stack)
+ | IsFix fix ->
+ (match reduce_fix whrec fix stack with
+ | Reduced s' -> whrec s'
+ | NotReducible -> s)
+ | _ -> s
in
- bdi_rec
+ whrec (x, l)
let whd_betadeltaiota env sigma x =
applist(whd_betadeltaiota_stack env sigma x [])
-let whd_betadeltaiotaeta_stack env sigma =
- let rec whrec x stack =
- match x with
- | DOPN(Const _,_) ->
- if evaluable_constant env x then
- whrec (constant_value env x) stack
+let whd_betadeltaiotaeta_stack env sigma x l =
+ let rec whrec (x, stack as s) =
+ match kind_of_term x with
+ | IsConst _ ->
+ if evaluable_constant env x then
+ whrec (constant_value env x, stack)
else
- (x,stack)
- | DOPN(Evar ev,args) ->
+ s
+ | IsEvar (ev,args) ->
if Evd.is_defined sigma ev then
- whrec (existential_value sigma (ev,args)) stack
+ whrec (existential_value sigma (ev,args), stack)
else
- (x,stack)
+ s
+(*
| DOPN(Abst _,_) ->
- if evaluable_abst env x then
- whrec (abst_value env x) stack
- else
+ if evaluable_abst env x then
+ whrec (abst_value env x) stack
+ else
(x,stack)
- | DOP2(Cast,c,_) -> whrec c stack
- | DOPN(AppL,cl) -> whrec (array_hd cl) (array_app_tl cl stack)
- | DOP2(Lambda,_,DLAM(_,c)) ->
+*)
+ | IsCast (c,_) -> whrec (c, stack)
+ | IsAppL (f,cl) -> whrec (f, cl@stack)
+ | IsLambda (_,_,c) ->
(match stack with
| [] ->
- (match applist (whrec c []) with
- | DOPN(AppL,cl) ->
- (match whrec (array_last cl) [] with
- | (Rel 1,[]) ->
- let napp = (Array.length cl) -1 in
- if napp = 0 then
- (x,stack)
- else
- let lc = Array.sub cl 0 napp in
- let u =
- if napp = 1 then lc.(0) else DOPN(AppL,lc)
- in
- if noccurn 1 u then (pop u,[]) else (x,stack)
- | _ -> (x,stack))
- | _ -> (x,stack))
+ (match applist (whrec (c, [])) with
+ | DOPN(AppL,cl) ->
+ let napp = (Array.length cl) -1 in
+ (match whrec (array_last cl, []) with
+ | (Rel 1,[]) when napp > 0 ->
+ let lc = Array.sub cl 0 napp in
+ let u = if napp=1 then lc.(0) else DOPN(AppL,lc)
+ in if noccurn 1 u then (pop u,[]) else s
+ | _ -> s)
+ | _ -> s)
| (a::m) -> stacklam whrec [a] c m)
- | DOPN(MutCase _,_) ->
- let (ci,p,d,lf) = destCase x in
- let (c,cargs) = whrec d [] in
+ | IsMutCase (ci,p,d,lf) ->
+ let (c,cargs) = whrec (d, []) in
if reducible_mind_case c then
whrec (reduce_mind_case
- {mP=p; mconstr=c; mcargs=cargs; mci=ci; mlf=lf}) stack
+ {mP=p; mconstr=c; mcargs=cargs; mci=ci; mlf=lf}, stack)
else
- (mkMutCaseA ci p (applist(c,cargs)) lf,stack)
- | DOPN(Fix _,_) ->
- let (reduced,(fix,stack)) = reduce_fix whrec x stack in
- if reduced then whrec fix stack else (fix,stack)
- | x -> (x,stack)
+ (mkMutCaseA ci p (applist(c,cargs)) lf, stack)
+ | IsFix fix ->
+ (match reduce_fix whrec fix stack with
+ | Reduced s' -> whrec s'
+ | NotReducible -> s)
+ | _ -> s
in
- whrec
+ whrec (x, l)
let whd_betadeltaiotaeta env sigma x =
applist(whd_betadeltaiotaeta_stack env sigma x [])
@@ -879,19 +913,21 @@ and eqappr cv_pb infos appr1 appr2 =
| None -> fun _ -> raise NotConvertible)
(* other constructors *)
- | (FOP2(Lambda,c1,c2), FOP2(Lambda,c'1,c'2)) ->
+ | (FLam (_,c1,c2,_,_), FLam (_,c'1,c'2,_,_)) ->
bool_and_convert
(Array.length v1 = 0 && Array.length v2 = 0)
(convert_and
(ccnv (pb_equal cv_pb) infos el1 el2 c1 c'1)
- (ccnv (pb_equal cv_pb) infos el1 el2 c2 c'2))
+ (ccnv (pb_equal cv_pb) infos (el_lift el1) (el_lift el2) c2 c'2))
+
+ | (FLet _, _) | (_, FLet _) -> anomaly "Normally removed by fhnf"
- | (FOP2(Prod,c1,c2), FOP2(Prod,c'1,c'2)) ->
+ | (FPrd (_,c1,c2,_,_), FPrd (_,c'1,c'2,_,_)) ->
bool_and_convert
(Array.length v1 = 0 && Array.length v2 = 0)
(convert_and
(ccnv (pb_equal cv_pb) infos el1 el2 c1 c'1) (* Luo's system *)
- (ccnv cv_pb infos el1 el2 c2 c'2))
+ (ccnv cv_pb infos (el_lift el1) (el_lift el2) c2 c'2))
(* Inductive types: MutInd MutConstruct MutCase Fix Cofix *)
@@ -926,8 +962,8 @@ and eqappr cv_pb infos appr1 appr2 =
let fconv cv_pb env sigma t1 t2 =
- let t1 = strong (fun _ _ -> strip_outer_cast) env sigma t1
- and t2 = strong (fun _ _ -> strip_outer_cast) env sigma t2 in
+ let t1 = local_strong strip_outer_cast t1
+ and t2 = local_strong strip_outer_cast t2 in
if eq_constr t1 t2 then
Constraint.empty
else
@@ -972,9 +1008,11 @@ let plain_instance s c =
| DOP1(oper,c) -> DOP1(oper, irec c)
| DOP2(oper,c1,c2) -> DOP2(oper, irec c1, irec c2)
| DOPN(oper,cl) -> DOPN(oper, Array.map irec cl)
- | DOPL(oper,cl) -> DOPL(oper, List.map irec cl)
| DLAM(x,c) -> DLAM(x, irec c)
| DLAMV(x,v) -> DLAMV(x, Array.map irec v)
+ | CLam (n,t,c) -> CLam (n, typed_app irec t, irec c)
+ | CPrd (n,t,c) -> CPrd (n, typed_app irec t, irec c)
+ | CLet (n,b,t,c) -> CLet (n, irec b, typed_app irec t, irec c)
| u -> u
in
if s = [] then c else irec c
@@ -992,7 +1030,7 @@ let instance s c =
let hnf_prod_app env sigma t n =
match whd_betadeltaiota env sigma t with
- | DOP2(Prod,_,DLAM(_,b)) -> subst1 n b
+ | CPrd (_,_,b) -> subst1 n b
| _ -> anomaly "hnf_prod_app: Need a product"
let hnf_prod_appvect env sigma t nl =
@@ -1003,7 +1041,7 @@ let hnf_prod_applist env sigma t nl =
let hnf_lam_app env sigma t n =
match whd_betadeltaiota env sigma t with
- | DOP2(Lambda,_,DLAM(_,b)) -> subst1 n b
+ | CLam (_,_,b) -> subst1 n b
| _ -> anomaly "hnf_lam_app: Need an abstraction"
let hnf_lam_appvect env sigma t nl =
@@ -1015,7 +1053,7 @@ let hnf_lam_applist env sigma t nl =
let splay_prod env sigma =
let rec decrec m c =
match whd_betadeltaiota env sigma c with
- | DOP2(Prod,a,DLAM(n,c_0)) -> decrec ((n,a)::m) c_0
+ | CPrd (n,a,c0) -> decrec ((n,body_of_type a)::m) c0
| t -> m,t
in
decrec []
@@ -1030,8 +1068,8 @@ let sort_of_arity env c = snd (splay_arity env Evd.empty c)
let decomp_n_prod env sigma n =
let rec decrec m ln c = if m = 0 then (ln,c) else
match whd_betadeltaiota env sigma c with
- | DOP2(Prod,a,DLAM(n,c0)) ->
- decrec (m-1) (Sign.add_rel_decl (n,outcast_type a) ln) c0
+ | CPrd (n,a,c0) ->
+ decrec (m-1) (Sign.add_rel_decl (n,a) ln) c0
| _ -> error "decomp_n_prod: Not enough products"
in
decrec n Sign.empty_rel_context
@@ -1053,7 +1091,7 @@ with bj=aj if j<>ik and bj=(Rel c) and Bic=Aic[xn..xic-1 <- an..aic-1]
let compute_consteval env sigma c =
let rec srec n labs c =
match whd_betadeltaeta_stack env sigma c [] with
- | (DOP2(Lambda,t,DLAM(_,g)),[]) -> srec (n+1) (t::labs) g
+ | CLam (_,t,g), [] -> srec (n+1) (t::labs) g
| (DOPN(Fix((nv,i)),bodies),l) ->
if List.length l > n then
raise Elimconst
@@ -1083,22 +1121,23 @@ let compute_consteval env sigma c =
(* One step of approximation *)
let rec apprec env sigma c stack =
- let (t,stack) = whd_betaiota_stack c stack in
- match t with
- | DOPN(MutCase _,_) ->
- let (ci,p,d,lf) = destCase t in
+ let (t, stack as s) = whd_betaiota_stack c stack in
+ match kind_of_term t with
+ | IsMutCase (ci,p,d,lf) ->
let (cr,crargs) = whd_betadeltaiota_stack env sigma d [] in
let rslt = mkMutCaseA ci p (applist(cr,crargs)) lf in
if reducible_mind_case cr then
apprec env sigma rslt stack
else
- (t,stack)
- | DOPN(Fix _,_) ->
- let (reduced,(fix,stack)) =
- reduce_fix (whd_betadeltaiota_stack env sigma) t stack
- in
- if reduced then apprec env sigma fix stack else (fix,stack)
- | _ -> (t,stack)
+ s
+ | IsFix fix ->
+ (match reduce_fix
+ (fun (c,l) -> whd_betadeltaiota_stack env sigma c l)
+ fix stack
+ with
+ | Reduced (c,stack) -> apprec env sigma c stack
+ | NotReducible -> s)
+ | _ -> s
let hnf env sigma c = apprec env sigma c []
@@ -1108,36 +1147,31 @@ let hnf env sigma c = apprec env sigma c []
* Used in Programs.
* Added by JCF, 29/1/98. *)
-let whd_programs_stack env sigma =
- let rec whrec x stack =
- match x with
- | DOPN(AppL,cl) ->
- if occur_meta cl.(1) then
- (x,stack)
- else
- whrec (array_hd cl) (array_app_tl cl stack)
- | DOP2(Lambda,_,DLAM(_,c)) ->
+let whd_programs_stack env sigma x l =
+ let rec whrec (x, stack as s) =
+ match kind_of_term x with
+ | IsAppL (f,[c]) -> if occur_meta c then s else whrec (f, c::stack)
+ | IsLambda (_,_,c) ->
(match stack with
- | [] -> (x,stack)
+ | [] -> s
| (a::m) -> stacklam whrec [a] c m)
- | DOPN(MutCase _,_) ->
- let (ci,p,d,lf) = destCase x in
+ | IsMutCase (ci,p,d,lf) ->
if occur_meta d then
- (x,stack)
+ s
else
- let (c,cargs) = whrec d [] in
+ let (c,cargs) = whrec (d, []) in
if reducible_mind_case c then
whrec (reduce_mind_case
- {mP=p; mconstr=c; mcargs=cargs; mci=ci; mlf=lf})
- stack
+ {mP=p; mconstr=c; mcargs=cargs; mci=ci; mlf=lf}, stack)
else
(mkMutCaseA ci p (applist(c,cargs)) lf, stack)
- | DOPN(Fix _,_) ->
- let (reduced,(fix,stack)) = reduce_fix whrec x stack in
- if reduced then whrec fix stack else (fix,stack)
- | x -> (x,stack)
+ | IsFix fix ->
+ (match reduce_fix whrec fix stack with
+ | Reduced s' -> whrec s'
+ | NotReducible -> s)
+ | _ -> s
in
- whrec
+ whrec (x, l)
let whd_programs env sigma x = applist (whd_programs_stack env sigma x [])
@@ -1145,37 +1179,34 @@ exception IsType
let is_arity env sigma =
let rec srec c =
- match whd_betadeltaiota env sigma c with
- | DOP0(Sort _) -> true
- | DOP2(Prod,_,DLAM(_,c')) -> srec c'
- | DOP2(Lambda,_,DLAM(_,c')) -> srec c'
+ match kind_of_term (whd_betadeltaiota env sigma c) with
+ | IsSort _ -> true
+ | IsProd (_,_,c') -> srec c'
+ | IsLambda (_,_,c') -> srec c'
| _ -> false
in
srec
let info_arity env sigma =
let rec srec c =
- match whd_betadeltaiota env sigma c with
- | DOP0(Sort(Prop Null)) -> false
- | DOP0(Sort(Prop Pos)) -> true
- | DOP2(Prod,_,DLAM(_,c')) -> srec c'
- | DOP2(Lambda,_,DLAM(_,c')) -> srec c'
+ match kind_of_term (whd_betadeltaiota env sigma c) with
+ | IsSort (Prop Null) -> false
+ | IsSort (Prop Pos) -> true
+ | IsProd (_,_,c') -> srec c'
+ | IsLambda (_,_,c') -> srec c'
| _ -> raise IsType
in
srec
-let is_logic_arity env sigma c =
- try (not (info_arity env sigma c)) with IsType -> false
-
-let is_info_arity env sigma c =
+let is_info_arity env sigma c =
try (info_arity env sigma c) with IsType -> true
-
+
let is_type_arity env sigma =
let rec srec c =
- match whd_betadeltaiota env sigma c with
- | DOP0(Sort(Type _)) -> true
- | DOP2(Prod,_,DLAM(_,c')) -> srec c'
- | DOP2(Lambda,_,DLAM(_,c')) -> srec c'
+ match kind_of_term (whd_betadeltaiota env sigma c) with
+ | IsSort (Type _) -> true
+ | IsProd (_,_,c') -> srec c'
+ | IsLambda (_,_,c') -> srec c'
| _ -> false
in
srec
@@ -1186,20 +1217,6 @@ let is_info_type env sigma t =
(s <> Prop Null &&
try info_arity env sigma t.utj_val with IsType -> true)
-(* Pour l'extraction
-let is_info_cast_type env sigma c =
- match c with
- | DOP2(Cast,c,t) ->
- (try info_arity env sigma t
- with IsType -> try info_arity env sigma c with IsType -> true)
- | _ -> try info_arity env sigma c with IsType -> true
-
-let contents_of_cast_type env sigma c =
- if is_info_cast_type env sigma c then Pos else Null
-*)
-
-let is_info_sort = is_info_arity
-
(* calcul des arguments implicites *)
(* la seconde liste est ordonne'e *)
@@ -1211,31 +1228,36 @@ let ord_add x l =
in
aux l
-let add_free_rels_until depth m acc =
- let rec frec depth loc acc = function
+let add_free_rels_until bound m acc =
+ let rec frec depth acc = function
| Rel n ->
- if (n <= depth) & (n > loc) then (ord_add (depth-n+1) acc) else acc
- | DOPN(_,cl) -> Array.fold_left (frec depth loc) acc cl
- | DOPL(_,cl) -> List.fold_left (frec depth loc) acc cl
- | DOP2(_,c1,c2) -> frec depth loc (frec depth loc acc c1) c2
- | DOP1(_,c) -> frec depth loc acc c
- | DLAM(_,c) -> frec (depth+1) (loc+1) acc c
- | DLAMV(_,cl) -> Array.fold_left (frec (depth+1) (loc+1)) acc cl
+ if (n < bound+depth) & (n >= depth) then
+ Intset.add (bound+depth-n) acc
+ else
+ acc
+ | DOPN(_,cl) -> Array.fold_left (frec depth) acc cl
+ | DOP2(_,c1,c2) -> frec depth (frec depth acc c1) c2
+ | DOP1(_,c) -> frec depth acc c
+ | DLAM(_,c) -> frec (depth+1) acc c
+ | DLAMV(_,cl) -> Array.fold_left (frec (depth+1)) acc cl
+ | CLam (_,t,c) -> frec (depth+1) (frec depth acc (body_of_type t)) c
+ | CPrd (_,t,c) -> frec (depth+1) (frec depth acc (body_of_type t)) c
+ | CLet (_,b,t,c) -> frec (depth+1) (frec depth (frec depth acc b) (body_of_type t)) c
| VAR _ -> acc
| DOP0 _ -> acc
in
- frec depth 0 acc m
+ frec 1 acc m
(* calcule la liste des arguments implicites *)
let poly_args env sigma t =
- let rec aux n t = match (whd_betadeltaiota env sigma t) with
- | DOP2(Prod,a,DLAM(_,b)) -> add_free_rels_until n a (aux (n+1) b)
- | DOP2(Cast,t',_) -> aux n t'
- | _ -> []
+ let rec aux n t = match kind_of_term (whd_betadeltaiota env sigma t) with
+ | IsProd (_,a,b) -> add_free_rels_until n a (aux (n+1) b)
+ | IsCast (t',_) -> aux n t'
+ | _ -> Intset.empty
in
- match (strip_outer_cast (whd_betadeltaiota env sigma t)) with
- | DOP2(Prod,a,DLAM(_,b)) -> aux 1 b
+ match kind_of_term (strip_outer_cast (whd_betadeltaiota env sigma t)) with
+ | IsProd (_,a,b) -> Intset.elements (aux 1 b)
| _ -> []
diff --git a/kernel/reduction.mli b/kernel/reduction.mli
index bab5f446f..01d42fc07 100644
--- a/kernel/reduction.mli
+++ b/kernel/reduction.mli
@@ -3,7 +3,7 @@
(*i*)
open Names
-open Generic
+(*i open Generic i*)
open Term
open Univ
open Evd
@@ -35,10 +35,10 @@ val under_casts :
'a contextual_reduction_function -> 'a contextual_reduction_function
val strong : 'a reduction_function -> 'a reduction_function
val local_strong : local_reduction_function -> local_reduction_function
-val strong_prodspine : 'a reduction_function -> 'a reduction_function
+val strong_prodspine : local_reduction_function -> local_reduction_function
val stack_reduction_of_reduction :
'a reduction_function -> 'a stack_reduction_function
-val stacklam : (constr -> constr list -> 'a) -> constr list -> constr
+val stacklam : (constr * constr list -> 'a) -> constr list -> constr
-> constr list -> 'a
(*s Generic Optimized Reduction Functions using Closures *)
@@ -110,15 +110,14 @@ val reducible_mind_case : constr -> bool
val reduce_mind_case : constr miota_args -> constr
val is_arity : env -> 'a evar_map -> constr -> bool
-val is_info_arity : env -> 'a evar_map -> constr -> bool
-val is_info_sort : env -> 'a evar_map -> constr -> bool
-val is_logic_arity : env -> 'a evar_map -> constr -> bool
-val is_type_arity : env -> 'a evar_map -> constr -> bool
val is_info_type : env -> 'a evar_map -> unsafe_type_judgment -> bool
+val is_info_arity : env -> 'a evar_map -> constr -> bool
(*i Pour l'extraction
+val is_type_arity : env -> 'a evar_map -> constr -> bool
val is_info_cast_type : env -> 'a evar_map -> constr -> bool
val contents_of_cast_type : env -> 'a evar_map -> constr -> contents
i*)
+
val poly_args : env -> 'a evar_map -> constr -> int list
val whd_programs : 'a reduction_function
@@ -130,9 +129,12 @@ val fold_commands : constr list -> 'a reduction_function
val pattern_occs : (int list * constr * constr) list -> 'a reduction_function
val compute : 'a reduction_function
+(* [reduce_fix] contracts a fix redex if it is actually reducible *)
+type fix_reduction_result = NotReducible | Reduced of (constr * constr list)
+
val fix_recarg : fixpoint -> 'a list -> (int * 'a) option
-val reduce_fix : (constr -> 'a list -> constr * constr list) -> constr ->
- constr list -> bool * (constr * constr list)
+val reduce_fix : (constr * constr list -> constr * constr list) -> fixpoint ->
+ constr list -> fix_reduction_result
(*s Conversion Functions (uses closures, lazy strategy) *)
diff --git a/kernel/safe_typing.ml b/kernel/safe_typing.ml
index ca5d4a2ec..6b97c63ac 100644
--- a/kernel/safe_typing.ml
+++ b/kernel/safe_typing.ml
@@ -5,7 +5,7 @@ open Pp
open Util
open Names
open Univ
-open Generic
+(*i open Generic i*)
open Term
open Reduction
open Sign
@@ -122,6 +122,16 @@ let rec execute mf env cstr =
let (j,cst3) = gen_rel env1 Evd.empty name varj j' in
let cst = Constraint.union cst1 (Constraint.union cst2 cst3) in
(j, cst)
+
+ | IsLetIn (name,c1,c2,c3) ->
+ let (j1,cst1) = execute mf env c1 in
+ let (j2,cst2) = execute mf env c2 in
+ let { uj_val = b; uj_type = t } = cast_rel env Evd.empty j1 j2 in
+ let (j3,cst3) = execute mf (push_rel_def (name,b,t) env) c3 in
+ let cst = Constraint.union cst1 (Constraint.union cst2 cst3) in
+ ({ uj_val = mkLetIn (name, j1.uj_val, j2.uj_val, j3.uj_val) ;
+ uj_type = typed_app (subst1 j1.uj_val) j3.uj_type },
+ cst)
| IsCast (c,t) ->
let (cj,cst1) = execute mf env c in
diff --git a/kernel/sign.ml b/kernel/sign.ml
index edee43885..eac5c8cc9 100644
--- a/kernel/sign.ml
+++ b/kernel/sign.ml
@@ -3,7 +3,7 @@
open Names
open Util
-open Generic
+(*i open Generic i*)
open Term
(* Signatures *)
@@ -98,7 +98,7 @@ let map_rel_context = map
let instantiate_sign sign args =
let rec instrec = function
| ((id,None,_) :: sign, c::args) -> (id,c) :: (instrec (sign,args))
- | ((id,Some c,_) :: _, args) -> (id,c) :: (instrec (sign,args))
+ | ((id,Some c,_) :: sign, args) -> (id,c) :: (instrec (sign,args))
| ([],[]) -> []
| ([],_) | (_,[]) ->
anomaly "Signature and its instance do not match"
@@ -146,26 +146,24 @@ let empty_names_context = []
(* Transforms a product term (x1:T1)..(xn:Tn)T into the pair
([(xn,Tn);...;(x1,T1)],T), where T is not a product *)
let decompose_prod_assum =
- let rec prodec_rec l = function
- | DOP2(Prod,t,DLAM(x,c)) ->
- prodec_rec (add_rel_decl (x,outcast_type t) l) c
-(* | Letin,t,DLAM(x,c)) ->
- prodec_rec (add_rel_def (x,c,outcast_type t) l) c*)
- | DOP2(Cast,c,_) -> prodec_rec l c
- | c -> l,c
+ let rec prodec_rec l c =
+ match kind_of_term c with
+ | IsProd (x,t,c) -> prodec_rec (add_rel_decl (x,outcast_type t) l) c
+ | IsLetIn (x,b,t,c) -> prodec_rec (add_rel_def (x,b,outcast_type t) l) c
+ | IsCast (c,_) -> prodec_rec l c
+ | _ -> l,c
in
prodec_rec empty_rel_context
(* Transforms a lambda term [x1:T1]..[xn:Tn]T into the pair
([(xn,Tn);...;(x1,T1)],T), where T is not a lambda *)
let decompose_lam_assum =
- let rec lamdec_rec l = function
- | DOP2(Lambda,t,DLAM(x,c)) ->
- lamdec_rec (add_rel_decl (x,outcast_type t) l) c
-(* | Letin,t,DLAM(x,c)) ->
- lamdec_rec (add_rel_def (x,c,outcast_type t) l) c*)
- | DOP2(Cast,c,_) -> lamdec_rec l c
- | c -> l,c
+ let rec lamdec_rec l c =
+ match kind_of_term c with
+ | IsLambda (x,t,c) -> lamdec_rec (add_rel_decl (x,outcast_type t) l) c
+ | IsLetIn (x,b,t,c) -> lamdec_rec (add_rel_def (x,b,outcast_type t) l) c
+ | IsCast (c,_) -> lamdec_rec l c
+ | _ -> l,c
in
lamdec_rec empty_rel_context
@@ -175,10 +173,12 @@ let decompose_prod_n_assum n =
if n < 0 then error "decompose_prod_n: integer parameter must be positive";
let rec prodec_rec l n c =
if n=0 then l,c
- else match c with
- | DOP2(Prod,t,DLAM(x,c)) -> prodec_rec (add_rel_decl (x,outcast_type t) l) (n-1) c
- | DOP2(Cast,c,_) -> prodec_rec l n c
- | c -> error "decompose_prod_n: not enough products"
+ else match kind_of_term c with
+ | IsProd (x,t,c) -> prodec_rec (add_rel_decl(x,outcast_type t) l) (n-1) c
+ | IsLetIn (x,b,t,c) ->
+ prodec_rec (add_rel_def (x,b,outcast_type t) l) (n-1) c
+ | IsCast (c,_) -> prodec_rec l n c
+ | c -> error "decompose_prod_n: not enough products"
in
prodec_rec empty_rel_context n
@@ -188,10 +188,11 @@ let decompose_lam_n_assum n =
if n < 0 then error "decompose_lam_n: integer parameter must be positive";
let rec lamdec_rec l n c =
if n=0 then l,c
- else match c with
- | DOP2(Lambda,t,DLAM(x,c)) -> lamdec_rec (add_rel_decl (x,outcast_type t) l) (n-1) c
- | DOP2(Cast,c,_) -> lamdec_rec l n c
- | c -> error "decompose_lam_n: not enough abstractions"
+ else match kind_of_term c with
+ | IsLambda (x,t,c) -> lamdec_rec (add_rel_decl (x,outcast_type t) l) (n-1) c
+ | IsLetIn (x,b,t,c) ->
+ lamdec_rec (add_rel_def (x,b,outcast_type t) l) (n-1) c
+ | IsCast (c,_) -> lamdec_rec l n c
+ | c -> error "decompose_lam_n: not enough abstractions"
in
lamdec_rec empty_rel_context n
-
diff --git a/kernel/sign.mli b/kernel/sign.mli
index 17d9267d9..889c79b4e 100644
--- a/kernel/sign.mli
+++ b/kernel/sign.mli
@@ -3,7 +3,7 @@
(*i*)
open Names
-open Generic
+(*i open Generic i*)
open Term
(*i*)
diff --git a/kernel/sosub.ml b/kernel/sosub.ml
index 904d089d3..7212216ee 100644
--- a/kernel/sosub.ml
+++ b/kernel/sosub.ml
@@ -3,9 +3,9 @@
open Util
open Names
-open Generic
+(*i open Generic i*)
open Term
-
+(*
(* Given a term with variables in it, and second-order substitution,
this function will apply the substitution. The special
operator "XTRA[$SOAPP]" is used to represent the second-order
@@ -100,15 +100,6 @@ let propagate_names =
cllist (smap,[])
in
(smap',DOPN(op,Array.of_list cl'list))
- | DOPL(op,cl) ->
- let cllist = cl in
- let (smap',cl'list) =
- List.fold_right
- (fun c (smap,acc) ->
- let (smap',c') = proprec smap c in (smap',c'::acc))
- cllist (smap,[])
- in
- (smap',DOPL(op,cl'list))
| DLAM(na,c) ->
let (lna', c') = proprec (na::smap) c in
(List.tl lna', DLAM(List.hd lna', c'))
@@ -163,14 +154,6 @@ let rec soeval t=
socontract args lam
else
DOPN(op,cl')
- | DOPL(op,cl) ->
- let cl' = List.map soeval cl in
- if is_soapp_operator t then
- let lam = List.hd cl'
- and args = List.tl cl' in
- socontract args lam
- else
- DOPL(op,cl')
let rec try_soeval t =
match t with
@@ -197,15 +180,6 @@ let rec try_soeval t =
with (Failure _ | UserError _) -> DOPN(op,cl'))
else
DOPN(op,cl')
- | DOPL(op,cl) ->
- let cl' = List.map try_soeval cl in
- if is_soapp_operator t then
- let lam = List.hd cl'
- and args = List.tl cl' in
- (try socontract args lam
- with (Failure _ | UserError _) -> DOPL(op,cl'))
- else
- DOPL(op,cl')
let soexecute t =
let (_,t) = propagate_names [] t in
@@ -217,3 +191,7 @@ let try_soexecute t =
with (Failure _ | UserError _) -> ([],t)
in
try_soeval t
+*)
+
+let soexecute a = failwith "No longer implemented"
+
diff --git a/kernel/sosub.mli b/kernel/sosub.mli
index 531b7ee7e..123362527 100644
--- a/kernel/sosub.mli
+++ b/kernel/sosub.mli
@@ -8,5 +8,7 @@ open Term
(* Second-order substitutions. *)
val soexecute : constr -> constr
+(*
val try_soexecute : constr -> constr
+*)
diff --git a/kernel/term.ml b/kernel/term.ml
index f4c074471..40feeaab1 100644
--- a/kernel/term.ml
+++ b/kernel/term.ml
@@ -6,7 +6,6 @@
open Util
open Pp
open Names
-open Generic
open Univ
(* Coq abstract syntax with deBruijn variables; 'a is the type of sorts *)
@@ -64,14 +63,34 @@ let print_sort = function
| Prop Null -> [< 'sTR "Prop" >]
| Type _ -> [< 'sTR "Type" >]
-type constr = sorts oper term
+(********************************************************************)
+(* Generic syntax of terms with de Bruijn indexes *)
+(********************************************************************)
+
+type constr =
+ | DOP0 of sorts oper (* atomic terms *)
+ | DOP1 of sorts oper * constr (* operator of arity 1 *)
+ | DOP2 of sorts oper * constr * constr (* operator of arity 2 *)
+ | DOPN of sorts oper * constr array (* operator of variadic arity *)
+ | DLAM of name * constr (* deBruijn binder on one term *)
+ | DLAMV of name * constr array (* deBruijn binder on many terms *)
+ | CLam of name * constr * constr
+ | CPrd of name * constr * constr
+ | CLet of name * constr * constr * constr
+ | VAR of identifier (* named variable *)
+ | Rel of int (* variable as deBruijn index *)
+
+and
+ (*
+ typed_type = sorts judge
+ *)
+ typed_type = constr
type flat_arity = (name * constr) list * sorts
type 'a judge = { body : constr; typ : 'a }
(*
-type typed_type = sorts judge
type typed_term = typed_type judge
let make_typed t s = { body = t; typ = s }
@@ -91,7 +110,6 @@ let outcast_type = function
let typed_combine f g t u = { f t.body u.body ; g t.typ u.typ}
*)
-type typed_type = constr
type typed_term = typed_type judge
let make_typed t s = t
@@ -115,15 +133,281 @@ type rel_declaration = name * constr option * typed_type
(****************************************************************************)
(*********************)
+(* Occurring *)
+(*********************)
+
+exception FreeVar
+exception Occur
+
+(* (closedn n M) raises FreeVar if a variable of height greater than n
+ occurs in M, returns () otherwise *)
+
+let closedn =
+ let rec closed_rec n = function
+ | Rel(m) -> if m>n then raise FreeVar
+ | VAR _ -> ()
+ | DOPN(_,cl) -> Array.iter (closed_rec n) cl
+ | DOP2(_,c1,c2) -> closed_rec n c1; closed_rec n c2
+ | DOP1(_,c) -> closed_rec n c
+ | DLAM(_,c) -> closed_rec (n+1) c
+ | DLAMV(_,v) -> Array.iter (closed_rec (n+1)) v
+ | CLam (_,t,c) -> closed_rec n t; closed_rec (n+1) c
+ | CPrd (_,t,c) -> closed_rec n t; closed_rec (n+1) c
+ | CLet (_,b,t,c) -> closed_rec n b; closed_rec n t; closed_rec (n+1) c
+ | _ -> ()
+ in
+ closed_rec
+
+(* [closed0 M] is true iff [M] is a (deBruijn) closed term *)
+
+let closed0 term =
+ try closedn 0 term; true with FreeVar -> false
+
+(* returns the list of free debruijn indices in a term *)
+
+let free_rels m =
+ let rec frec depth acc = function
+ | Rel n -> if n >= depth then Intset.add (n-depth+1) acc else acc
+ | DOPN(_,cl) -> Array.fold_left (frec depth) acc cl
+ | DOP2(_,c1,c2) -> frec depth (frec depth acc c1) c2
+ | DOP1(_,c) -> frec depth acc c
+ | DLAM(_,c) -> frec (depth+1) acc c
+ | DLAMV(_,cl) -> Array.fold_left (frec (depth+1)) acc cl
+ | CLam (_,t,c) -> frec (depth+1) (frec depth acc t) c
+ | CPrd (_,t,c) -> frec (depth+1) (frec depth acc t) c
+ | CLet (_,b,t,c) -> frec (depth+1) (frec depth (frec depth acc b) t) c
+ | VAR _ -> acc
+ | DOP0 _ -> acc
+ in
+ frec 1 Intset.empty m
+
+(* (noccurn n M) returns true iff (Rel n) does NOT occur in term M *)
+
+let noccurn n term =
+ let rec occur_rec n = function
+ | Rel(m) -> if m = n then raise Occur
+ | VAR _ -> ()
+ | DOPN(_,cl) -> Array.iter (occur_rec n) cl
+ | DOP1(_,c) -> occur_rec n c
+ | DOP2(_,c1,c2) -> occur_rec n c1; occur_rec n c2
+ | DLAM(_,c) -> occur_rec (n+1) c
+ | DLAMV(_,v) -> Array.iter (occur_rec (n+1)) v
+ | CLam (_,t,c) -> occur_rec n t; occur_rec (n+1) c
+ | CPrd (_,t,c) -> occur_rec n t; occur_rec (n+1) c
+ | CLet (_,b,t,c) -> occur_rec n b; occur_rec n t; occur_rec (n+1) c
+ | _ -> ()
+ in
+ try occur_rec n term; true with Occur -> false
+
+(* (noccur_between n m M) returns true iff (Rel p) does NOT occur in term M
+ for n <= p < n+m *)
+
+let noccur_between n m term =
+ let rec occur_rec n = function
+ | Rel(p) -> if n<=p && p<n+m then raise Occur
+ | VAR _ -> ()
+ | DOPN(_,cl) -> Array.iter (occur_rec n) cl
+ | DOP1(_,c) -> occur_rec n c
+ | DOP2(_,c1,c2) -> occur_rec n c1; occur_rec n c2
+ | DLAM(_,c) -> occur_rec (n+1) c
+ | DLAMV(_,v) -> Array.iter (occur_rec (n+1)) v
+ | CLam (_,t,c) -> occur_rec n t; occur_rec (n+1) c
+ | CPrd (_,t,c) -> occur_rec n t; occur_rec (n+1) c
+ | CLet (_,b,t,c) -> occur_rec n b; occur_rec n t; occur_rec (n+1) c
+ | _ -> ()
+ in
+ try occur_rec n term; true with Occur -> false
+
+(* Checking function for terms containing existential variables.
+ The function [noccur_with_meta] considers the fact that
+ each existential variable (as well as each isevar)
+ in the term appears applied to its local context,
+ which may contain the CoFix variables. These occurrences of CoFix variables
+ are not considered *)
+
+let noccur_with_meta n m term =
+ let rec occur_rec n = function
+ | Rel p -> if n<=p & p<n+m then raise Occur
+ | VAR _ -> ()
+ | DOPN(AppL,cl) ->
+ (match cl.(0) with
+ | DOP2 (Cast,DOP0 (Meta _),_) -> ()
+ | DOP0 (Meta _) -> ()
+ | _ -> Array.iter (occur_rec n) cl)
+ | DOPN(Evar _, _) -> ()
+ | DOPN(op,cl) -> Array.iter (occur_rec n) cl
+ | DOP0(_) -> ()
+ | DOP1(_,c) -> occur_rec n c
+ | DOP2(_,c1,c2) -> occur_rec n c1; occur_rec n c2
+ | DLAM(_,c) -> occur_rec (n+1) c
+ | DLAMV(_,v) -> Array.iter (occur_rec (n+1)) v
+ | CLam (_,t,c) -> occur_rec n t; occur_rec (n+1) c
+ | CPrd (_,t,c) -> occur_rec n t; occur_rec (n+1) c
+ | CLet (_,b,t,c) -> occur_rec n b; occur_rec n t; occur_rec (n+1) c
+ in
+ try (occur_rec n term; true) with Occur -> false
+
+
+(*********************)
+(* Lifting *)
+(*********************)
+
+(* Explicit lifts and basic operations *)
+type lift_spec =
+ | ELID
+ | ELSHFT of lift_spec * int (* ELSHFT(l,n) == lift of n, then apply lift l *)
+ | ELLFT of int * lift_spec (* ELLFT(n,l) == apply l to de Bruijn > n *)
+ (* i.e under n binders *)
+
+(* compose a relocation of magnitude n *)
+let rec el_shft n = function
+ | ELSHFT(el,k) -> el_shft (k+n) el
+ | el -> if n = 0 then el else ELSHFT(el,n)
+
+
+(* cross n binders *)
+let rec el_liftn n = function
+ | ELID -> ELID
+ | ELLFT(k,el) -> el_liftn (n+k) el
+ | el -> if n=0 then el else ELLFT(n, el)
+
+let el_lift el = el_liftn 1 el
+
+(* relocation of de Bruijn n in an explicit lift *)
+let rec reloc_rel n = function
+ | ELID -> n
+ | ELLFT(k,el) ->
+ if n <= k then n else (reloc_rel (n-k) el) + k
+ | ELSHFT(el,k) -> (reloc_rel (n+k) el)
+
+
+(* The generic lifting function *)
+let rec exliftn el = function
+ | Rel i -> Rel(reloc_rel i el)
+ | DOPN(oper,cl) -> DOPN(oper, Array.map (exliftn el) cl)
+ | DOP1(oper,c) -> DOP1(oper, exliftn el c)
+ | DOP2(oper,c1,c2) -> DOP2(oper, exliftn el c1, exliftn el c2)
+ | DLAM(na,c) -> DLAM(na, exliftn (el_lift el) c)
+ | DLAMV(na,v) -> DLAMV(na, Array.map (exliftn (el_lift el)) v)
+ | CLam (n,t,c) -> CLam (n, exliftn el t, exliftn (el_lift el) c)
+ | CPrd (n,t,c) -> CPrd (n, exliftn el t, exliftn (el_lift el) c)
+ | CLet (n,b,t,c) -> CLet (n,exliftn el b,exliftn el t,exliftn (el_lift el) c)
+ | x -> x
+
+(* Lifting the binding depth across k bindings *)
+
+let liftn k n =
+ match el_liftn (pred n) (el_shft k ELID) with
+ | ELID -> (fun c -> c)
+ | el -> exliftn el
+
+let lift k = liftn k 1
+
+let pop t = lift (-1) t
+
+let lift_context n l =
+ let k = List.length l in
+ list_map_i (fun i (name,c) -> (name,liftn n (k-i) c)) 0 l
+
+(*********************)
+(* Substituting *)
+(*********************)
+
+(* (subst1 M c) substitutes M for Rel(1) in c
+ we generalise it to (substl [M1,...,Mn] c) which substitutes in parallel
+ M1,...,Mn for respectively Rel(1),...,Rel(n) in c *)
+
+(* 1st : general case *)
+
+type info = Closed | Open | Unknown
+type 'a substituend = { mutable sinfo: info; sit: 'a }
+
+let rec lift_substituend depth s =
+ match s.sinfo with
+ | Closed -> s.sit
+ | Open -> lift depth s.sit
+ | Unknown ->
+ s.sinfo <- if closed0 s.sit then Closed else Open;
+ lift_substituend depth s
+
+let make_substituend c = { sinfo=Unknown; sit=c }
+
+let substn_many lamv n =
+ let lv = Array.length lamv in
+ let rec substrec depth = function
+ | Rel k as x ->
+ if k<=depth then
+ x
+ else if k-depth <= lv then
+ lift_substituend depth lamv.(k-depth-1)
+ else
+ Rel (k-lv)
+ | VAR id -> VAR id
+ | DOPN(oper,cl) -> DOPN(oper,Array.map (substrec depth) cl)
+ | DOP1(oper,c) -> DOP1(oper,substrec depth c)
+ | DOP2(oper,c1,c2) -> DOP2(oper,substrec depth c1,substrec depth c2)
+ | DLAM(na,c) -> DLAM(na,substrec (depth+1) c)
+ | DLAMV(na,v) -> DLAMV(na,Array.map (substrec (depth+1)) v)
+ | CLam (n,t,c) -> CLam (n, substrec depth t, substrec (depth+1) c)
+ | CPrd (n,t,c) -> CPrd (n, substrec depth t, substrec (depth+1) c)
+ | CLet (n,b,t,c) -> CLet (n, substrec depth b, substrec depth t,
+ substrec (depth+1) c)
+ | x -> x
+ in
+ substrec n
+
+let substnl laml k =
+ substn_many (Array.map make_substituend (Array.of_list laml)) k
+let substl laml =
+ substn_many (Array.map make_substituend (Array.of_list laml)) 0
+let subst1 lam = substl [lam]
+
+(* (thin_val sigma) removes identity substitutions from sigma *)
+
+let rec thin_val = function
+ | [] -> []
+ | (((id,{sit=VAR id'}) as s)::tl) ->
+ if id = id' then thin_val tl else s::(thin_val tl)
+ | h::tl -> h::(thin_val tl)
+
+(* (replace_vars sigma M) applies substitution sigma to term M *)
+let replace_vars var_alist =
+ let var_alist =
+ List.map (fun (str,c) -> (str,make_substituend c)) var_alist in
+ let var_alist = thin_val var_alist in
+ let rec substrec n = function
+ | (VAR(x) as c) ->
+ (try lift_substituend n (List.assoc x var_alist)
+ with Not_found -> c)
+
+ | DOPN(oper,cl) -> DOPN(oper,Array.map (substrec n) cl)
+ | DOP1(oper,c) -> DOP1(oper,substrec n c)
+ | DOP2(oper,c1,c2) -> DOP2(oper,substrec n c1,substrec n c2)
+ | DLAM(na,c) -> DLAM(na,substrec (n+1) c)
+ | DLAMV(na,v) -> DLAMV(na,Array.map (substrec (n+1)) v)
+ | CLam (na,t,c) -> CLam (na, substrec n t, substrec (n+1) c)
+ | CPrd (na,t,c) -> CPrd (na, substrec n t, substrec (n+1) c)
+ | CLet (na,b,t,c) -> CLet (na,substrec n b,substrec n t,substrec (n+1) c)
+ | x -> x
+ in
+ if var_alist = [] then (function x -> x) else substrec 0
+
+(* (subst_var str t) substitute (VAR str) by (Rel 1) in t *)
+let subst_var str = replace_vars [(str, Rel 1)]
+
+(* (subst_vars [id1;...;idn] t) substitute (VAR idj) by (Rel j) in t *)
+let subst_vars vars =
+ let _,subst =
+ List.fold_left (fun (n,l) var -> ((n+1),(var,Rel n)::l)) (1,[]) vars
+ in replace_vars (List.rev subst)
+
+(*********************)
(* Term constructors *)
(*********************)
(* Constructs a DeBrujin index with number n *)
let mkRel n = (Rel n)
-(* Constructs an existential variable named "?" *)
-let mkExistential = (DOP0 (XTRA "ISEVAR"))
-
(* Constructs an existential variable named "?n" *)
let mkMeta n = DOP0 (Meta n)
@@ -155,30 +439,30 @@ let mkImplicit = DOP0 (Sort implicit_sort)
(* Constructs the term t1::t2, i.e. the term t1 casted with the type t2 *)
(* (that means t2 is declared as the type of t1) *)
-let mkCast t1 t2 =
+let mkCast (t1,t2) =
match t1 with
| DOP2(Cast,t,_) -> DOP2(Cast,t,t2)
| _ -> (DOP2 (Cast,t1,t2))
(* Constructs the product (x:t1)t2 *)
-let mkProd x t1 t2 = (DOP2 (Prod,t1,(DLAM (x,t2))))
-let mkNamedProd id typ c = mkProd (Name id) typ (subst_var id c)
-let mkProd_string s t c = mkProd (Name (id_of_string s)) t c
+let mkProd (x,t1,t2) = CPrd (x,t1,t2)
+let mkNamedProd id typ c = mkProd (Name id, typ, subst_var id c)
+let mkProd_string s t c = mkProd (Name (id_of_string s), t, c)
(* Constructs the abstraction [x:t1]t2 *)
-let mkLambda x t1 t2 = (DOP2 (Lambda,t1,(DLAM (x,t2))))
-let mkNamedLambda id typ c = mkLambda (Name id) typ (subst_var id c)
-let mkLambda_string s t c = mkLambda (Name (id_of_string s)) t c
+let mkLambda (x,t1,t2) = CLam (x,t1,t2)
+let mkNamedLambda id typ c = mkLambda (Name id, typ, subst_var id c)
+let mkLambda_string s t c = mkLambda (Name (id_of_string s), t, c)
(* Constructs [x=c_1:t]c_2 *)
-let mkLetIn x c1 t c2 = failwith "TODO"
-let mkNamedLetIn id c1 t c2 = mkLetIn (Name id) c1 t (subst_var id c2)
+let mkLetIn (x,c1,t,c2) = CLet (x,c1,t,c2)
+let mkNamedLetIn id c1 t c2 = mkLetIn (Name id, c1, t, subst_var id c2)
(* Constructs either [(x:t)c] or [[x=b:t]c] *)
let mkProd_or_LetIn (na,body,t) c =
match body with
- | None -> mkProd na t c
- | Some b -> mkLetIn na b t c
+ | None -> mkProd (na, t, c)
+ | Some b -> mkLetIn (na, b, t, c)
let mkNamedProd_or_LetIn (id,body,t) c =
match body with
@@ -188,8 +472,8 @@ let mkNamedProd_or_LetIn (id,body,t) c =
(* Constructs either [[x:t]c] or [[x=b:t]c] *)
let mkLambda_or_LetIn (na,body,t) c =
match body with
- | None -> mkLambda na t c
- | Some b -> mkLetIn na b t c
+ | None -> mkLambda (na, t, c)
+ | Some b -> mkLetIn (na, b, t, c)
let mkNamedLambda_or_LetIn (id,body,t) c =
match body with
@@ -199,7 +483,7 @@ let mkNamedLambda_or_LetIn (id,body,t) c =
(* Constructs either [(x:t)c] or [c] where [x] is replaced by [b] *)
let mkProd_wo_LetIn (na,body,t) c =
match body with
- | None -> mkProd na (body_of_type t) c
+ | None -> mkProd (na, body_of_type t, c)
| Some b -> subst1 b c
let mkNamedProd_wo_LetIn (id,body,t) c =
@@ -208,7 +492,7 @@ let mkNamedProd_wo_LetIn (id,body,t) c =
| Some b -> subst1 b (subst_var id c)
(* non-dependent product t1 -> t2 *)
-let mkArrow t1 t2 = mkProd Anonymous t1 t2
+let mkArrow t1 t2 = mkProd (Anonymous, t1, t2)
(* If lt = [t1; ...; tn], constructs the application (t1 ... tn) *)
let mkAppL a = DOPN (AppL, a)
@@ -234,7 +518,7 @@ let mkMutInd (ind_sp,l) = DOPN (MutInd ind_sp, l)
let mkMutConstruct (cstr_sp,l) = DOPN (MutConstruct cstr_sp,l)
(* Constructs the term <p>Case c of c1 | c2 .. | cn end *)
-let mkMutCase ci p c ac =
+let mkMutCase (ci, p, c, ac) =
DOPN (MutCase ci, Array.append [|p;c|] (Array.of_list ac))
let mkMutCaseA ci p c ac =
DOPN (MutCase ci, Array.append [|p;c|] ac)
@@ -316,7 +600,6 @@ let destMeta = function
| (DOP0 (Meta n)) -> n
| _ -> invalid_arg "destMeta"
-let isMETA = function DOP0(Meta _) -> true | _ -> false
(* Destructs a variable *)
let destVar = function
@@ -416,9 +699,12 @@ let rec strip_all_casts t =
| DOP1(oper,c) -> DOP1(oper,strip_all_casts c)
| DOP2(oper,c1,c2) -> DOP2(oper,strip_all_casts c1,strip_all_casts c2)
| DOPN(oper,cl) -> DOPN(oper,Array.map strip_all_casts cl)
- | DOPL(oper,cl) -> DOPL(oper,List.map strip_all_casts cl)
| DLAM(na,c) -> DLAM(na,strip_all_casts c)
| DLAMV(na,c) -> DLAMV(na,Array.map (under_outer_cast strip_all_casts) c)
+ | CLam (n,t,c) -> CLam (n, strip_all_casts t, strip_all_casts c)
+ | CPrd (n,t,c) -> CPrd (n, strip_all_casts t, strip_all_casts c)
+ | CLet (n,b,t,c) -> CLet (n, strip_all_casts b, strip_all_casts t,
+ strip_all_casts c)
| VAR _ as t -> t
| Rel _ as t -> t
@@ -430,13 +716,13 @@ let isVar = function VAR _ -> true | _ -> false
(* Destructs the product (x:t1)t2 *)
let destProd = function
- | DOP2 (Prod, t1, (DLAM (x,t2))) -> (x,t1,t2)
+ | CPrd (x,t1,t2) -> (x,t1,t2)
| _ -> invalid_arg "destProd"
let rec hd_of_prod prod =
match strip_outer_cast prod with
- | DOP2(Prod,c,DLAM(n,t')) -> hd_of_prod t'
- | t -> t
+ | CPrd (n,c,t') -> hd_of_prod t'
+ | t -> t
let hd_is_constructor t =
let is_constructor = function
@@ -449,9 +735,14 @@ let hd_is_constructor t =
(* Destructs the abstraction [x:t1]t2 *)
let destLambda = function
- | DOP2 (Lambda, t1, (DLAM (x,t2))) -> (x,t1,t2)
+ | CLam (x,t1,t2) -> (x,t1,t2)
| _ -> invalid_arg "destLambda"
+(* Destructs the let [x:=b:t1]t2 *)
+let destLetIn = function
+ | CLet (x,b,t1,t2) -> (x,b,t1,t2)
+ | _ -> invalid_arg "destProd"
+
(* Destructs an application *)
let destAppL = function
| (DOPN (AppL,a)) -> a
@@ -461,8 +752,6 @@ let destApplication = function
| (DOPN (AppL,a)) when Array.length a <> 0 -> (a.(0), array_tl a)
| _ -> invalid_arg "destApplication"
-let isAppL = function DOPN(AppL,_) -> true | _ -> false
-
let args_app = function
| DOPN(AppL,cl) -> if Array.length cl >1 then array_tl cl else [||]
| c -> [||]
@@ -573,9 +862,9 @@ let destCoFix = function
(**********************************************************************)
-type binder_kind = BProd | BLambda
+type binder_kind = BProd | BLambda | BLetIn
-type fix_kind = RFix of (int array * int) | RCofix of int
+type fix_kind = RFix of (int array * int) | RCoFix of int
type 'ctxt reference =
| RConst of section_path * 'ctxt
@@ -596,6 +885,12 @@ type cofixpoint = int * (constr array * name list * constr array)
(* Term analysis *)
(******************)
+type hnftype =
+ | HnfSort of sorts
+ | HnfProd of name * constr * constr
+ | HnfAtom of constr
+ | HnfMutInd of inductive * constr array
+
type kindOfTerm =
| IsRel of int
| IsMeta of int
@@ -605,6 +900,7 @@ type kindOfTerm =
| IsCast of constr * constr
| IsProd of name * constr * constr
| IsLambda of name * constr * constr
+ | IsLetIn of name * constr * constr * constr
| IsAppL of constr * constr list
| IsAbst of section_path * constr array
| IsEvar of existential
@@ -629,8 +925,9 @@ let kind_of_term c =
| DOP0 (Sort s) -> IsSort s
| DOP0 (XTRA s) -> IsXtra s
| DOP2 (Cast, t1, t2) -> IsCast (t1,t2)
- | DOP2 (Prod, t1, (DLAM (x,t2))) -> IsProd (x,t1,t2)
- | DOP2 (Lambda, t1, (DLAM (x,t2))) -> IsLambda (x,t1,t2)
+ | CPrd (x,t1,t2) -> IsProd (x,t1,t2)
+ | CLam (x,t1,t2) -> IsLambda (x,t1,t2)
+ | CLet (x,b,t1,t2) -> IsLetIn (x,b,t1,t2)
| DOPN (AppL,a) when Array.length a <> 0 ->
IsAppL (a.(0), List.tl (Array.to_list a))
| DOPN (Const sp, a) -> IsConst (sp,a)
@@ -648,26 +945,31 @@ let kind_of_term c =
IsCoFix (i,typedbodies)
| _ -> errorlabstrm "Term.kind_of_term" [< 'sTR "ill-formed constr" >]
+let isMeta = function DOP0(Meta _) -> true | _ -> false
+let isConst = function DOPN(Const _,_) -> true | _ -> false
+let isMutConstruct = function DOPN(MutCase _,_) -> true | _ -> false
+let isAppL = function DOPN(AppL,_) -> true | _ -> false
+
(***************************)
(* Other term constructors *)
(***************************)
-let abs_implicit c = mkLambda Anonymous mkImplicit c
-let lambda_implicit a = mkLambda (Name(id_of_string"y")) mkImplicit a
+let abs_implicit c = mkLambda (Anonymous, mkImplicit, c)
+let lambda_implicit a = mkLambda (Name(id_of_string"y"), mkImplicit, a)
let lambda_implicit_lift n a = iterate lambda_implicit n (lift n a)
(* prod_it b [xn:Tn;..;x1:T1] = (x1:T1)..(xn:Tn)b *)
-let prod_it = List.fold_left (fun c (n,t) -> mkProd n t c)
+let prod_it = List.fold_left (fun c (n,t) -> mkProd (n, t, c))
(* lam_it b [xn:Tn;..;x1:T1] = [x1:T1]..[xn:Tn]b *)
-let lam_it = List.fold_left (fun c (n,t) -> mkLambda n t c)
+let lam_it = List.fold_left (fun c (n,t) -> mkLambda (n, t, c))
(* prodn n [xn:Tn;..;x1:T1;Gamma] b = (x1:T1)..(xn:Tn)b *)
let prodn n env b =
let rec prodrec = function
| (0, env, b) -> b
- | (n, ((v,t)::l), b) -> prodrec (n-1, l, DOP2(Prod,t,DLAM(v,b)))
+ | (n, ((v,t)::l), b) -> prodrec (n-1, l, CPrd (v,t,b))
| _ -> assert false
in
prodrec (n,env,b)
@@ -676,7 +978,7 @@ let prodn n env b =
let lamn n env b =
let rec lamrec = function
| (0, env, b) -> b
- | (n, ((v,t)::l), b) -> lamrec (n-1, l, DOP2(Lambda,t,DLAM(v,b)))
+ | (n, ((v,t)::l), b) -> lamrec (n-1, l, CLam (v,t,b))
| _ -> assert false
in
lamrec (n,env,b)
@@ -712,8 +1014,7 @@ let rec to_lambda n prod =
prod
else
match prod with
- | DOP2(Prod,ty,DLAM(na,bd)) ->
- DOP2(Lambda,ty,DLAM(na, to_lambda (n-1) bd))
+ | CPrd(na,ty,bd) -> CLam(na,ty,to_lambda (n-1) bd)
| DOP2(Cast,c,_) -> to_lambda n c
| _ -> errorlabstrm "to_lambda" [<>]
@@ -722,8 +1023,7 @@ let rec to_prod n lam =
lam
else
match lam with
- | DOP2(Lambda,ty,DLAM(na,bd)) ->
- DOP2(Prod,ty,DLAM(na, to_prod (n-1) bd))
+ | CLam(na,ty,bd) -> CPrd(na,ty,to_prod (n-1) bd)
| DOP2(Cast,c,_) -> to_prod n c
| _ -> errorlabstrm "to_prod" [<>]
@@ -733,7 +1033,7 @@ let rec to_prod n lam =
let prod_app t n =
match strip_outer_cast t with
- | DOP2(Prod,_,DLAM(na,b)) -> subst1 n b
+ | CPrd (_,_,b) -> subst1 n b
| _ ->
errorlabstrm "prod_app"
[< 'sTR"Needed a product, but didn't find one" ; 'fNL >]
@@ -753,27 +1053,29 @@ let prod_applist t nL = List.fold_left prod_app t nL
(* Transforms a product term (x1:T1)..(xn:Tn)T into the pair
([(xn,Tn);...;(x1,T1)],T), where T is not a product *)
let destArity =
- let rec prodec_rec l = function
- | DOP2(Prod,t,DLAM(x,c)) -> prodec_rec ((x,t)::l) c
- | DOP2(Cast,c,_) -> prodec_rec l c
- | DOP0(Sort s) -> l,s
- | _ -> anomaly "decompose_arity: not an arity"
+ let rec prodec_rec l c =
+ match kind_of_term c with
+ | IsProd (x,t,c) -> prodec_rec ((x,t)::l) c
+ | IsCast (c,_) -> prodec_rec l c
+ | IsSort s -> l,s
+ | _ -> anomaly "decompose_arity: not an arity"
in
prodec_rec []
-let rec isArity = function
- | DOP2(Prod,_,DLAM(_,c)) -> isArity c
- | DOP2(Cast,c,_) -> isArity c
- | DOP0(Sort _) -> true
+let rec isArity c =
+ match kind_of_term c with
+ | IsProd (_,_,c) -> isArity c
+ | IsCast (c,_) -> isArity c
+ | IsSort _ -> true
| _ -> false
(* Transforms a product term (x1:T1)..(xn:Tn)T into the pair
([(xn,Tn);...;(x1,T1)],T), where T is not a product *)
let decompose_prod =
let rec prodec_rec l = function
- | DOP2(Prod,t,DLAM(x,c)) -> prodec_rec ((x,t)::l) c
- | DOP2(Cast,c,_) -> prodec_rec l c
- | c -> l,c
+ | CPrd(x,t,c) -> prodec_rec ((x,t)::l) c
+ | DOP2(Cast,c,_) -> prodec_rec l c
+ | c -> l,c
in
prodec_rec []
@@ -781,9 +1083,9 @@ let decompose_prod =
([(xn,Tn);...;(x1,T1)],T), where T is not a lambda *)
let decompose_lam =
let rec lamdec_rec l = function
- | DOP2(Lambda,t,DLAM(x,c)) -> lamdec_rec ((x,t)::l) c
- | DOP2(Cast,c,_) -> lamdec_rec l c
- | c -> l,c
+ | CLam (x,t,c) -> lamdec_rec ((x,t)::l) c
+ | DOP2 (Cast,c,_) -> lamdec_rec l c
+ | c -> l,c
in
lamdec_rec []
@@ -794,8 +1096,8 @@ let decompose_prod_n n =
let rec prodec_rec l n c =
if n=0 then l,c
else match c with
- | DOP2(Prod,t,DLAM(x,c)) -> prodec_rec ((x,t)::l) (n-1) c
- | DOP2(Cast,c,_) -> prodec_rec l n c
+ | CPrd (x,t,c) -> prodec_rec ((x,t)::l) (n-1) c
+ | DOP2 (Cast,c,_) -> prodec_rec l n c
| c -> error "decompose_prod_n: not enough products"
in
prodec_rec [] n
@@ -807,8 +1109,8 @@ let decompose_lam_n n =
let rec lamdec_rec l n c =
if n=0 then l,c
else match c with
- | DOP2(Lambda,t,DLAM(x,c)) -> lamdec_rec ((x,t)::l) (n-1) c
- | DOP2(Cast,c,_) -> lamdec_rec l n c
+ | CLam (x,t,c) -> lamdec_rec ((x,t)::l) (n-1) c
+ | DOP2 (Cast,c,_) -> lamdec_rec l n c
| c -> error "decompose_lam_n: not enough abstractions"
in
lamdec_rec [] n
@@ -817,7 +1119,7 @@ let decompose_lam_n n =
* gives n (casts are ignored) *)
let nb_lam =
let rec nbrec n = function
- | DOP2(Lambda,_,DLAM(_,c)) -> nbrec (n+1) c
+ | CLam (_,_,c) -> nbrec (n+1) c
| DOP2(Cast,c,_) -> nbrec n c
| _ -> n
in
@@ -826,145 +1128,13 @@ let nb_lam =
(* similar to nb_lam, but gives the number of products instead *)
let nb_prod =
let rec nbrec n = function
- | DOP2(Prod,_,DLAM(_,c)) -> nbrec (n+1) c
+ | CPrd (_,_,c) -> nbrec (n+1) c
| DOP2(Cast,c,_) -> nbrec n c
| _ -> n
in
nbrec 0
-(* Trop compliqué...
-(********************************************************************)
-(* various utility functions for implementing terms with bindings *)
-(********************************************************************)
-
-let extract_lifted (n,x) = lift n x
-let insert_lifted x = (0,x)
-
-(* l is a list of pairs (n:nat,x:constr), env is a stack of (na:name,T:constr)
- push_and_lift adds a component to env and lifts l one step *)
-let push_and_lift (na,t) env l =
- ((na,t)::env, List.map (fun (n,x) -> (n+1,x)) l)
-
-
-(* if T is not (x1:A1)(x2:A2)....(xn:An)T' then (push_and_liftl n env T l)
- raises an error else it gives ([x1,A1 ; x2,A2 ; ... ; xn,An]@env,T',l')
- where l' is l lifted n steps *)
-let push_and_liftl n env t l =
- let rec pushrec n t (env,l) =
- match (n,t) with
- | (0, _) -> (env,t,l)
- | (_, DOP2(Prod,t,DLAM(na,b))) ->
- pushrec (n-1) b (push_and_lift (na,t) env l)
- | (_, DOP2(Cast,t,_)) -> pushrec n t (env,l)
- | _ -> error "push_and_liftl"
- in
- pushrec n t (env,l)
-
-(* if T is not (x1:A1)(x2:A2)....(xn:An)T' then (push_and_liftl n env T l)
- raises an error else it gives ([x1,A1 ; x2,A2 ; ... ; xn,An]@env,T',l')
- where l' is l lifted n steps *)
-let push_lam_and_liftl n env t l =
- let rec pushrec n t (env,l) =
- match (n,t) with
- | (0, _) -> (env,t,l)
- | (_, DOP2(Lambda,t,DLAM(na,b))) ->
- pushrec (n-1) b (push_and_lift (na,t) env l)
- | (_, DOP2(Cast,t,_)) -> pushrec n t (env,l)
- | _ -> error "push_lam_and_liftl"
- in
- pushrec n t (env,l)
-
-(* l is a list of pairs (n:nat,x:constr), tlenv is a stack of
-(na:name,T:constr), B : constr, na : name
-(prod_and_pop ((na,T)::tlenv) B l) gives (tlenv, (na:T)B, l')
-where l' is l lifted down one step *)
-let prod_and_pop env b l =
- match env with
- | [] -> error "prod_and_pop"
- | (na,t)::tlenv ->
- (tlenv,DOP2(Prod,t,DLAM(na,b)),
- List.map (function
- (0,x) -> (0,lift (-1) x)
- | (n,x) -> (n-1,x)) l)
-
-(* recusively applies prod_and_pop :
-if env = [na1:T1 ; na2:T2 ; ... ; nan:Tn]@tlenv
-then
-(prod_and_popl n env T l) gives (tlenv,(nan:Tn)...(na1:Ta1)T,l') where
-l' is l lifted down n steps *)
-let prod_and_popl n env t l =
- let rec poprec = function
- | (0, (env,b,l)) -> (env,b,l)
- | (n, ([],_,_)) -> error "prod_and_popl"
- | (n, (env,b,l)) -> poprec (n-1, prod_and_pop env b l)
- in
- poprec (n,(env,t,l))
-
-(* similar to prod_and_pop, but gives [na:T]B intead of (na:T)B *)
-let lam_and_pop env b l =
- match env with
- | [] -> error "lam_and_pop"
- | (na,t)::tlenv ->
- (tlenv,DOP2(Lambda,t,DLAM(na,b)),
- List.map (function
- (0,x) -> (0,lift (-1) x)
- | (n,x) -> (n-1,x)) l)
-
-(* similar to lamn_and_pop but generates new names whenever the name is
- * Anonymous *)
-let lam_and_pop_named env body l acc_ids =
- match env with
- | [] -> error "lam_and_pop"
- | (na,t)::tlenv ->
- let id = match na with
- | Anonymous -> next_ident_away (id_of_string "a") acc_ids
- | Name id -> id
- in
- (tlenv,DOP2(Lambda,t,DLAM((Name id),body)),
- List.map (function
- | (0,x) -> (0,lift (-1) x)
- | (n,x) -> (n-1,x)) l,
- (id::acc_ids))
-
-(* similar to prod_and_popl but gives [nan:Tan]...[na1:Ta1]B instead of
- * (nan:Tan)...(na1:Ta1)B *)
-let lam_and_popl n env t l =
- let rec poprec = function
- | (0, (env,b,l)) -> (env,b,l)
- | (n, ([],_,_)) -> error "lam_and_popl"
- | (n, (env,b,l)) -> poprec (n-1, lam_and_pop env b l)
- in
- poprec (n,(env,t,l))
-
-(* similar to prod_and_popl but gives [nan:Tan]...[na1:Ta1]B instead of
- * but it generates names whenever nai=Anonymous *)
-
-let lam_and_popl_named n env t l =
- let rec poprec = function
- | (0, (env,b,l,_)) -> (env,b,l)
- | (n, ([],_,_,_)) -> error "lam_and_popl"
- | (n, (env,b,l,acc_ids)) -> poprec (n-1, lam_and_pop_named env b l acc_ids)
- in
- poprec (n,(env,t,l,[]))
-
-(* [lambda_ize n T endpt]
- * will pop off the first [n] products in [T], then stick in [endpt],
- * properly lifted, and then push back the products, but as lambda-
- * abstractions *)
-let lambda_ize n t endpt =
- let env = []
- and carry = [insert_lifted endpt] in
- let env, endpt =
- match push_and_liftl n env t carry with
- | (env,_,[endpt]) -> env, endpt
- | _ -> anomaly "bud in Term.lamda_ize"
- in
- let t = extract_lifted endpt in
- match lam_and_popl n env t [] with
- | (_,t,[]) -> t
- | _ -> anomaly "bud in Term.lamda_ize"
-*)
-
+(* Misc *)
let sort_hdchar = function
| Prop(_) -> "P"
| Type(_) -> "T"
@@ -1021,17 +1191,65 @@ let rec strip_head_cast = function
| DOP2(Cast,c,t) -> strip_head_cast c
| c -> c
+(* Returns the list of global variables in a term *)
+
+let global_varsl l constr =
+ let rec filtrec acc = function
+ | VAR id -> id::acc
+ | DOP1(oper,c) -> filtrec acc c
+ | DOP2(oper,c1,c2) -> filtrec (filtrec acc c1) c2
+ | DOPN(oper,cl) -> Array.fold_left filtrec acc cl
+ | DLAM(_,c) -> filtrec acc c
+ | DLAMV(_,v) -> Array.fold_left filtrec acc v
+ | CLam (_,t,c) -> filtrec (filtrec acc t) c
+ | CPrd (_,t,c) -> filtrec (filtrec acc t) c
+ | CLet (_,b,t,c) -> filtrec (filtrec (filtrec acc b) t) c
+ | _ -> acc
+ in
+ filtrec l constr
+
+let global_vars constr = global_varsl [] constr
+
+let global_vars_set constr =
+ let rec filtrec acc = function
+ | VAR id -> Idset.add id acc
+ | DOP1(oper,c) -> filtrec acc c
+ | DOP2(oper,c1,c2) -> filtrec (filtrec acc c1) c2
+ | DOPN(oper,cl) -> Array.fold_left filtrec acc cl
+ | DLAM(_,c) -> filtrec acc c
+ | DLAMV(_,v) -> Array.fold_left filtrec acc v
+ | CLam (_,t,c) -> filtrec (filtrec acc t) c
+ | CPrd (_,t,c) -> filtrec (filtrec acc t) c
+ | CLet (_,b,t,c) -> filtrec (filtrec (filtrec acc b) t) c
+ | _ -> acc
+ in
+ filtrec Idset.empty constr
+
+(* [Rel (n+m);...;Rel(n+1)] *)
+
+let rel_vect n m = Array.init m (fun i -> Rel(n+m-i))
+
+let rel_list n m =
+ let rec reln l p =
+ if p>m then l else reln (Rel(n+p)::l) (p+1)
+ in
+ reln [] 1
+
+(* Rem: end of import from old module Generic *)
+
(* Various occurs checks *)
let occur_opern s =
let rec occur_rec = function
| DOPN(oper,cl) -> s=oper or (array_exists occur_rec cl)
- | DOPL(oper,cl) -> s=oper or (List.exists occur_rec cl)
| VAR _ -> false
| DOP1(_,c) -> occur_rec c
| DOP2(_,c1,c2) -> (occur_rec c1) or (occur_rec c2)
| DLAM(_,c) -> occur_rec c
| DLAMV(_,v) -> array_exists occur_rec v
+ | CLam (_,t,c) -> occur_rec t or occur_rec c
+ | CPrd (_,t,c) -> occur_rec t or occur_rec c
+ | CLet (_,b,t,c) -> occur_rec b or occur_rec t or occur_rec c
| _ -> false
in
occur_rec
@@ -1044,12 +1262,14 @@ let occur_evar ev = occur_opern (Evar ev)
let occur_var s =
let rec occur_rec = function
| DOPN(_,cl) -> array_exists occur_rec cl
- | DOPL(_,cl) -> List.exists occur_rec cl
| VAR id -> s=id
| DOP1(_,c) -> occur_rec c
| DOP2(_,c1,c2) -> (occur_rec c1) or (occur_rec c2)
| DLAM(_,c) -> occur_rec c
| DLAMV(_,v) -> array_exists occur_rec v
+ | CLam (_,t,c) -> occur_rec t or occur_rec c
+ | CPrd (_,t,c) -> occur_rec t or occur_rec c
+ | CLet (_,b,t,c) -> occur_rec b or occur_rec t or occur_rec c
| _ -> false
in
occur_rec
@@ -1068,7 +1288,6 @@ let occur_var s =
- if no (sp,_) appears in sigma, then sp is not unfolded.
- NOTE : the case of DOPL is not handled...
*)
let replace_consts const_alist =
let rec substrec = function
@@ -1090,11 +1309,13 @@ let replace_consts const_alist =
| DOP2(oper,c1,c2) -> DOP2(oper,substrec c1,substrec c2)
| DLAM(na,c) -> DLAM(na,substrec c)
| DLAMV(na,v) -> DLAMV(na,Array.map substrec v)
+ | CLam (na,t,c) -> CLam (na, substrec t, substrec c)
+ | CPrd (na,t,c) -> CPrd (na, substrec t, substrec c)
+ | CLet (na,b,t,c) -> CLet (na, substrec b, substrec t, substrec c)
| x -> x
in
if const_alist = [] then function x -> x else substrec
-(* NOTE : the case of DOPL is not handled by whd_castapp_stack *)
let whd_castapp_stack =
let rec whrec x stack = match x with
| DOPN(AppL,cl) -> whrec (array_hd cl) (array_app_tl cl stack)
@@ -1129,41 +1350,31 @@ let rec eq_constr_rec m n =
| (DLAM(_,c1),DLAM(_,c2)) -> eq_constr_rec c1 c2
| (DLAMV(_,cl1),DLAMV(_,cl2)) ->
array_for_all2 eq_constr_rec cl1 cl2
+ | CLam(_,t1,c1), CLam(_,t2,c2) -> eq_constr_rec t1 t2 & eq_constr_rec c1 c2
+ | CPrd(_,t1,c1), CPrd(_,t2,c2) -> eq_constr_rec t1 t2 & eq_constr_rec c1 c2
+ | CLet(_,b1,t1,c1), CLet (_,b2,t2,c2) ->
+ eq_constr_rec b1 b2 & eq_constr_rec t1 t2 & eq_constr_rec c1 c2
| _ -> false
let eq_constr = eq_constr_rec
-let rec eq_constr_with_meta_rec m n=
- (m == n) or
- (m=n) or
- (match (strip_head_cast m,strip_head_cast n) with
- | (Rel p1,Rel p2) -> p1=p2
- | (DOPN(oper1,cl1),DOPN(oper2,cl2)) ->
- oper1=oper2 & array_for_all2 eq_constr_rec cl1 cl2
- | (DOP0 oper1,DOP0 oper2) -> oper1=oper2
- | (DOP1(i,c1),DOP1(j,c2)) -> (i=j) & eq_constr_rec c1 c2
- | (DOP2(i,c1,c1'),DOP2(j,c2,c2')) ->
- (i=j) & eq_constr_rec c1 c2 & eq_constr_rec c1' c2'
- | (DLAM(_,c1),DLAM(_,c2)) -> eq_constr_rec c1 c2
- | (DLAMV(_,cl1),DLAMV(_,cl2)) ->
- array_for_all2 eq_constr_rec cl1 cl2
- | _ -> false)
-
(* (dependent M N) is true iff M is eq_term with a subterm of N
M is appropriately lifted through abstractions of N *)
let dependent =
let rec deprec m t =
- (eq_constr m t)
- or (match t with
- | VAR _ -> false
- | DOP1(_,c) -> deprec m c
- | DOP2(_,c,t) -> deprec m c or deprec m t
- | DOPN(_,cl) -> array_exists (deprec m) cl
- | DOPL(_,cl) -> List.exists (deprec m) cl
- | DLAM(_,c) -> deprec (lift 1 m) c
- | DLAMV(_,v) -> array_exists (deprec (lift 1 m)) v
- | _ -> false)
+ (eq_constr m t) or
+ (match t with
+ | VAR _ -> false
+ | DOP1(_,c) -> deprec m c
+ | DOP2(_,c,t) -> deprec m c or deprec m t
+ | DOPN(_,cl) -> array_exists (deprec m) cl
+ | DLAM(_,c) -> deprec (lift 1 m) c
+ | DLAMV(_,v) -> array_exists (deprec (lift 1 m)) v
+ | CLam (_,t,c) -> deprec m t or deprec (lift 1 m) c
+ | CPrd (_,t,c) -> deprec m t or deprec (lift 1 m) c
+ | CLet (_,b,t,c) -> deprec m b or deprec m t or deprec (lift 1 m) c
+ | _ -> false)
in
deprec
@@ -1173,7 +1384,7 @@ let dependent =
let rec eta_reduce_head c =
match c with
- | DOP2(Lambda,c1,DLAM(_,c')) ->
+ | CLam (_,c1,c') ->
(match eta_reduce_head c' with
| DOPN(AppL,cl) ->
let lastn = (Array.length cl) - 1 in
@@ -1185,7 +1396,7 @@ let rec eta_reduce_head c =
if lastn = 1 then cl.(0)
else DOPN(AppL,Array.sub cl 0 lastn)
in
- if (not ((dependent (Rel 1) c')))
+ if (not ((dependent (mkRel 1) c')))
then lift (-1) c'
else c
| _ -> c)
@@ -1194,40 +1405,43 @@ let rec eta_reduce_head c =
(* alpha-eta conversion : ignore print names and casts *)
-let rec eta_eq_constr t1 t2 =
- let t1 = eta_reduce_head (strip_head_cast t1)
- and t2 = eta_reduce_head (strip_head_cast t2) in
- t1=t2 or match (t1,t2) with
- | (DOP2(Cast,c1,_),c2) -> eta_eq_constr c1 c2
- | (c1,DOP2(Cast,c2,_)) -> eta_eq_constr c1 c2
+let eta_eq_constr =
+ let rec aux t1 t2 =
+ let t1 = eta_reduce_head (strip_head_cast t1)
+ and t2 = eta_reduce_head (strip_head_cast t2) in
+ t1=t2 or match (t1,t2) with
+ | (DOP2(Cast,c1,_),c2) -> aux c1 c2
+ | (c1,DOP2(Cast,c2,_)) -> aux c1 c2
| (Rel p1,Rel p2) -> p1=p2
- | (DOPN(oper1,cl1),DOPN(oper2,cl2)) ->
- oper1=oper2 & array_for_all2 eta_eq_constr cl1 cl2
- | (DOP0 oper1,DOP0 oper2) -> oper1=oper2
- | (DOP1(i,c1),DOP1(j,c2)) -> (i=j) & eta_eq_constr c1 c2
- | (DOP2(i,c1,c1'),DOP2(j,c2,c2')) ->
- (i=j) & eta_eq_constr c1 c2 & eta_eq_constr c1' c2'
- | (DLAM(_,c1),DLAM(_,c2)) -> eta_eq_constr c1 c2
- | (DLAMV(_,cl1),DLAMV(_,cl2)) -> array_for_all2 eta_eq_constr cl1 cl2
+ | (DOPN(op1,cl1),DOPN(op2,cl2)) -> op1=op2 & array_for_all2 aux cl1 cl2
+ | (DOP0 oper1,DOP0 oper2) -> oper1=oper2
+ | (DOP1(i,c1),DOP1(j,c2)) -> (i=j) & aux c1 c2
+ | (DOP2(i,c1,c1'),DOP2(j,c2,c2')) -> (i=j) & aux c1 c2 & aux c1' c2'
+ | (DLAM(_,c1),DLAM(_,c2)) -> aux c1 c2
+ | (DLAMV(_,cl1),DLAMV(_,cl2)) -> array_for_all2 aux cl1 cl2
+ | CLam(_,t1,c1), CLam(_,t2,c2) -> aux t1 t2 & aux c1 c2
+ | CPrd(_,t1,c1), CPrd(_,t2,c2) -> aux t1 t2 & aux c1 c2
+ | CLet(_,b1,t1,c1), CLet (_,b2,t2,c2) -> aux b1 b2 & aux t1 t2 & aux c1 c2
| _ -> false
+ in aux
-(* This renames bound variablew with fresh and distinct names *)
+(* This renames bound variables with fresh and distinct names *)
(* in such a way that the printer doe not generate new names *)
(* and therefore that printed names are the intern names *)
(* In this way, tactics such as Induction works well *)
-let rec rename_bound_var l = function
- | DOP2(Prod,c1,DLAM(Name(s),c2)) ->
- if dependent (Rel 1) c2 then
+let rec rename_bound_var l c =
+ match kind_of_term c with
+ | IsProd (Name s,c1,c2) ->
+ if dependent (mkRel 1) c2 then
let s' = next_ident_away s (global_vars c2@l) in
- DOP2(Prod,c1,DLAM(Name(s'),rename_bound_var (s'::l) c2))
+ mkProd (Name s', c1, rename_bound_var (s'::l) c2)
else
- DOP2(Prod,c1,DLAM(Name(s),rename_bound_var l c2))
- | DOP2(Prod,c1,DLAM(Anonymous,c2)) ->
- DOP2(Prod,c1,DLAM(Anonymous,rename_bound_var l c2))
- | DOP2(Cast,c,t) -> DOP2(Cast,rename_bound_var l c,t)
- | x -> x
+ mkProd (Name s, c1, rename_bound_var l c2)
+ | IsProd (Anonymous,c1,c2) -> mkProd (Anonymous, c1, rename_bound_var l c2)
+ | IsCast (c,t) -> mkCast (rename_bound_var l c, t)
+ | x -> c
(***************************)
(* substitution functions *)
@@ -1269,47 +1483,38 @@ let sort_increasing_snd =
[subst_term c t] substitutes [(Rel 1)] for all occurrences of (closed)
term [c] in a term [t] *)
-let subst_term c t =
+let subst_term_gen eq_fun c t =
let rec substrec k c t =
match prefix_application k c t with
| Some x -> x
| None ->
- (if eq_constr t c then Rel(k) else match t with
- | DOPN(Const sp,cl) -> t
- | DOPN(MutInd (x_0,x_1),cl) -> t
- | DOPN(MutConstruct (x_0,x_1),cl) -> t
- | DOPN(oper,tl) -> DOPN(oper,Array.map (substrec k c) tl)
- | DOP1(i,t) -> DOP1(i,substrec k c t)
- | DOP2(oper,c1,c2) -> DOP2(oper,substrec k c c1,substrec k c c2)
- | DLAM(na,t) -> DLAM(na,substrec (k+1) (lift 1 c) t)
- | DLAMV(na,v) -> DLAMV(na,Array.map (substrec (k+1) (lift 1 c)) v)
- | _ -> t)
+ (if eq_fun t c then Rel(k) else match t with
+ | DOPN(Const sp,cl) -> t
+ | DOPN(MutInd (x_0,x_1),cl) -> t
+ | DOPN(MutConstruct (x_0,x_1),cl) -> t
+ | DOPN(oper,tl) -> DOPN(oper,Array.map (substrec k c) tl)
+ | DOP1(i,t) -> DOP1(i,substrec k c t)
+ | DOP2(oper,c1,c2) -> DOP2(oper,substrec k c c1,substrec k c c2)
+ | DLAM(na,t) -> DLAM(na,substrec (k+1) (lift 1 c) t)
+ | DLAMV(na,v) -> DLAMV(na,Array.map (substrec (k+1) (lift 1 c)) v)
+ | CLam(na,t,c2) -> CLam(na,substrec k c t,substrec (k+1) (lift 1 c) c2)
+ | CPrd(na,t,c2) -> CPrd(na,substrec k c t,substrec (k+1) (lift 1 c) c2)
+ | CLet(na,b,t,c2) -> CLet(na,substrec k c b,substrec k c t,
+ substrec (k+1) (lift 1 c) c2)
+ | _ -> t)
in
substrec 1 c t
-(* same as subst_term, but modulo eta *)
-
-let subst_term_eta_eq c t =
- let rec substrec k c t =
- match prefix_application_eta k c t with
- | Some x -> x
- | None ->
- (if eta_eq_constr t c then Rel(k) else match t with
- | DOPN(Const sp,cl) -> t
- | DOPN(oper,tl) -> DOPN(oper,Array.map (substrec k c) tl)
- | DOP1(i,t) -> DOP1(i,substrec k c t)
- | DOP2(oper,c1,c2) -> DOP2(oper,substrec k c c1,substrec k c c2)
- | DLAM(na,t) -> DLAM(na,substrec (k+1) (lift 1 c) t)
- | DLAMV(na,v)-> DLAMV(na,Array.map (substrec (k+1) (lift 1 c)) v)
- | _ -> t)
- in
- substrec 1 c t
+let subst_term = subst_term_gen eq_constr
+let subst_term_eta = subst_term_gen eta_eq_constr
(* bl : (int,constr) Listmap.t = (int * constr) list *)
(* c : constr *)
(* for each binding (i,c_i) in bl, substitutes the metavar i by c_i in c *)
(* Raises Not_found if c contains a meta that is not in the association list *)
+(* Bogué ? Pourquoi pas de lift en passant sous un lieur ?? *)
+(* Et puis meta doit fusionner avec Evar *)
let rec subst_meta bl c =
match c with
| DOP0(Meta(i)) -> List.assoc i bl
@@ -1317,6 +1522,10 @@ let rec subst_meta bl c =
| DOP2(op,c'1, c'2) -> DOP2(op, subst_meta bl c'1, subst_meta bl c'2)
| DOPN(op, c') -> DOPN(op, Array.map (subst_meta bl) c')
| DLAM(x,c') -> DLAM(x, subst_meta bl c')
+ | CLam(na,t,c) -> CLam(na,subst_meta bl t,subst_meta bl c)
+ | CPrd(na,t,c) -> CPrd(na,subst_meta bl t,subst_meta bl c)
+ | CLet(na,b,t,c) -> CLet(na,subst_meta bl b,subst_meta bl t,
+ subst_meta bl c)
| _ -> c
(* Substitute only a list of locations locs, the empty list is
@@ -1325,55 +1534,61 @@ let rec subst_meta bl c =
that will not be substituted. *)
let subst_term_occ_gen locs occ c t =
+ let pos = ref occ in
let except = List.for_all (fun n -> n<0) locs in
- let rec substcheck k occ c t =
- if except or List.exists (function u -> u>=occ) locs then
- substrec k occ c t
+ let rec substcheck k c t =
+ if except or List.exists (function u -> u >= !pos) locs then
+ substrec k c t
else
- (occ,t)
- and substrec k occ c t =
+ t
+ and substrec k c t =
if eq_constr t c then
- if except then
- if List.mem (-occ) locs then (occ+1,t) else (occ+1,Rel(k))
- else
- if List.mem occ locs then (occ+1,Rel(k)) else (occ+1,t)
- else
+ let r =
+ if except then
+ if List.mem (- !pos) locs then t else (Rel k)
+ else
+ if List.mem !pos locs then (Rel k) else t
+ in incr pos; r
+ else
match t with
- | DOPN(Const sp,tl) -> occ,t
- | DOPN(MutConstruct _,tl) -> occ,t
- | DOPN(MutInd _,tl) -> occ,t
- | DOPN(i,cl) ->
- let (occ',cl') =
- Array.fold_left
- (fun (nocc',lfd) f ->
- let (nocc'',f') = substcheck k nocc' c f in
- (nocc'',f'::lfd))
- (occ,[]) cl
- in
- (occ',DOPN(i,Array.of_list (List.rev cl')))
- | DOP2(i,t1,t2) ->
- let (nocc1,t1')=substrec k occ c t1 in
- let (nocc2,t2')=substcheck k nocc1 c t2 in
- nocc2,DOP2(i,t1',t2')
- | DOP1(i,t) ->
- let (nocc,t')= substrec k occ c t in
- nocc,DOP1(i,t')
- | DLAM(n,t) ->
- let (occ',t') = substcheck (k+1) occ (lift 1 c) t in
- (occ',DLAM(n,t'))
- | DLAMV(n,cl) ->
- let (occ',cl') =
+ | DOPN((Const _ | MutConstruct _ | MutInd _), _) -> t
+ | DOPN(i,cl) ->
+ let cl' =
+ Array.fold_left (fun lfd f -> substcheck k c f :: lfd) [] cl
+ in
+ DOPN(i,Array.of_list (List.rev cl'))
+ | DOP2(i,t1,t2) ->
+ let t1' = substrec k c t1 in
+ let t2' = substcheck k c t2 in
+ DOP2(i,t1',t2')
+ | DOP1(i,t) ->
+ DOP1(i,substrec k c t)
+ | DLAM(n,t) ->
+ DLAM(n,substcheck (k+1) (lift 1 c) t)
+ | DLAMV(n,cl) ->
+ let cl' =
Array.fold_left
- (fun (nocc',lfd) f ->
- let (nocc'',f') =
- substcheck (k+1) nocc' (lift 1 c) f
- in (nocc'',f'::lfd))
- (occ,[]) cl
+ (fun lfd f -> substcheck (k+1) (lift 1 c) f ::lfd)
+ [] cl
in
- (occ',DLAMV(n,Array.of_list (List.rev cl') ))
- | _ -> occ,t
+ DLAMV(n,Array.of_list (List.rev cl'))
+ | CLam(na,t,c2) ->
+ let t' = substrec k c t in
+ let c2' = substcheck (k+1) (lift 1 c) c2 in
+ CLam(na,t',c2')
+ | CPrd(na,t,c2) ->
+ let t' = substrec k c t in
+ let c2' = substcheck (k+1) (lift 1 c) c2 in
+ CPrd(na,t',c2')
+ | CLet(na,b,t,c2) ->
+ let b' = substrec k c b in
+ let t' = substrec k c t in
+ let c2' = substcheck (k+1) (lift 1 c) c2 in
+ CLet(na,b',t',c2')
+ | DOP0 _ | VAR _ | Rel _ -> t
in
- substcheck 1 occ c t
+ let t' = substcheck 1 c t in
+ (!pos, t')
let subst_term_occ locs c t =
if locs = [] then
@@ -1406,24 +1621,25 @@ let subst_term_occ_decl locs c (id,bodyopt,typ as d) =
(***************************)
let rec occur_meta = function
- | DOP2(Prod,t,DLAM(_,c)) -> (occur_meta t) or (occur_meta c)
- | DOP2(Lambda,t,DLAM(_,c)) -> (occur_meta t) or (occur_meta c)
+ | CPrd(_,t,c) -> (occur_meta t) or (occur_meta c)
+ | CLam(_,t,c) -> (occur_meta t) or (occur_meta c)
+ | CLet(_,b,t,c) -> (occur_meta b) or (occur_meta t) or (occur_meta c)
| DOPN(_,cl) -> (array_exists occur_meta cl)
| DOP2(Cast,c,t) -> occur_meta c or occur_meta t
| DOP0(Meta(_)) -> true
| _ -> false
-let rel_vect = (Generic.rel_vect : int -> int -> constr array)
-
let occur_existential =
let rec occrec = function
| DOPN(Evar _,_) -> true
| DOPN(_,cl) -> array_exists occrec cl
- | DOPL(_,cl) -> List.exists occrec cl
| DOP2(_,c1,c2) -> occrec c1 or occrec c2
| DOP1(_,c) -> occrec c
| DLAM(_,c) -> occrec c
| DLAMV(_,cl) -> array_exists occrec cl
+ | CPrd(_,t,c) -> (occrec t) or (occrec c)
+ | CLam(_,t,c) -> (occrec t) or (occrec c)
+ | CLet(_,b,t,c) -> (occrec b) or (occrec t) or (occrec c)
| _ -> false
in
occrec
@@ -1440,13 +1656,14 @@ let comp_term t1 t2 =
| (DOPN(o1,v1), DOPN(o2,v2)) ->
(o1==o2) & (Array.length v1 = Array.length v2)
& array_for_all2 (==) v1 v2
- | (DOPL(o1,l1), DOPL(o2,l2)) ->
- (o1==o2) & (List.length l1 = List.length l2)
- & List.for_all2 (==) l1 l2
| (DLAM(x1,t1), DLAM(x2,t2)) -> x1==x2 & t1==t2
| (DLAMV(x1,v1), DLAMV(x2,v2)) ->
(x1==x2) & (Array.length v1 = Array.length v2)
& array_for_all2 (==) v1 v2
+ | CLam(x1,t1,c1), CLam(x2,t2,c2) -> (x1==x2) & (t1==t2) & (c1==c2)
+ | CPrd(x1,t1,c1), CPrd(x2,t2,c2) -> (x1==x2) & (t1==t2) & (c1==c2)
+ | CLet(x1,b1,t1,c1), CLet (x2,b2,t2,c2) ->
+ (x1==x2) & (b1==b2) & (t1==t2) & (c1==c2)
| (Rel i, Rel j) -> i=j
| (VAR x, VAR y) -> x==y
| _ -> false
@@ -1457,9 +1674,11 @@ let hash_term (sh_rec,(sh_op,sh_na,sh_id)) t =
| DOP1(o,t) -> DOP1(sh_op o, sh_rec t)
| DOP2(o,t1,t2) -> DOP2(sh_op o, sh_rec t1, sh_rec t2)
| DOPN(o,v) -> DOPN(sh_op o, Array.map sh_rec v)
- | DOPL(o,l) -> DOPL(sh_op o, List.map sh_rec l)
| DLAM(n,t) -> DLAM(sh_na n, sh_rec t)
| DLAMV(n,v) -> DLAMV(sh_na n, Array.map sh_rec v)
+ | CLam (n,t,c) -> CLam (sh_na n, sh_rec t, sh_rec c)
+ | CPrd (n,t,c) -> CPrd (sh_na n, sh_rec t, sh_rec c)
+ | CLet (n,b,t,c) -> CLet (sh_na n, sh_rec b, sh_rec t, sh_rec c)
| Rel i -> t
| VAR x -> VAR (sh_id x)
@@ -1568,204 +1787,138 @@ let is_hd_const=function
Some (Const c,Array.of_list (List.tl (Array.to_list t)))
|_ -> None)
|_ -> None
-
-(*Gives the occurences number of t in u*)
-let rec nb_occ_term t u=
- let one_step t=function
- | DOP1(_,c) -> nb_occ_term t c
- | DOP2(_,c0,c1) -> (nb_occ_term t c0)+(nb_occ_term t c1)
- | DOPN(_,a) -> Array.fold_left (fun a x -> a+(nb_occ_term t x)) 0 a
- | DOPL(_,l) -> List.fold_left (fun a x -> a+(nb_occ_term t x)) 0 l
- | DLAM(_,c) -> nb_occ_term t c
- | DLAMV(_,a) -> Array.fold_left (fun a x -> a+(nb_occ_term t x)) 0 a
- | _ -> 0
- in
- if t=u then
- 1
- else
- one_step t u
-
-(*Alpha-conversion*)
-let bind_eq=function
- | (Anonymous,Anonymous) -> true
- | (Name _,Name _) -> true
- | _ -> false
-
- (*Tells if two constrs are equal modulo unification*)
-let rec eq_mod_rel l_meta=function
- | (t,DOP0(Meta n)) ->
- if not(List.mem n (fst (List.split l_meta))) then
- Some ([(n,t)]@l_meta)
- else if (List.assoc n l_meta)=t then
- Some l_meta
- else
- None
- | DOP1(op0,c0), DOP1(op1,c1) ->
- if op0=op1 then
- eq_mod_rel l_meta (c0,c1)
- else
- None
- | DOP2(op0,t0,c0), DOP2(op1,t1,c1) ->
- if op0=op1 then
- match (eq_mod_rel l_meta (t0,t1)) with
- | None -> None
- | Some l -> eq_mod_rel l (c0,c1)
- else
- None
- | DOPN(op0,t0), DOPN(op1,t1) ->
- if (op0=op1) & ((Array.length t0)=(Array.length t1)) then
- List.fold_left2
- (fun a c1 c2 ->
- match a with
- | None -> None
- | Some l -> eq_mod_rel l (c1,c2)) (Some l_meta)
- (Array.to_list t0) (Array.to_list t1)
- else
- None
- | DLAM(n0,t0),DLAM(n1,t1) ->
- if (bind_eq (n0,n1)) then
- eq_mod_rel l_meta (t0,t1)
- else
- None
- | (t,u) ->
- if t=u then Some l_meta else None
-
-(*Substitutes a list of meta l in t*)
-let rec subst_with_lmeta l=function
- | DOP0(Meta n) -> List.assoc n l
- | DOP1(op,t) -> DOP1(op,subst_with_lmeta l t)
- | DOP2(op,t0,t1) -> DOP2(op,subst_with_lmeta l t0,subst_with_lmeta l t1)
- | DOPN(op,t) -> DOPN(op,Array.map (subst_with_lmeta l) t)
- | DOPL(op,ld) -> DOPL(op,List.map (subst_with_lmeta l) ld)
- | DLAM(n,t) -> DLAM(n,subst_with_lmeta l t)
- | DLAMV(n,t) -> DLAMV(n,Array.map (subst_with_lmeta l) t)
- | t -> t
-
-(*Carries out the following translation: DOPN(AppL,[|t|]) -> t and
- DOPN(AppL,[|DOPN(AppL,t);...;t'|]) -> DOPN(AppL;[|t;...;t'|])*)
-let rec appl_elim=function
- | DOPN(AppL,t) ->
- if (Array.length t)=1 then
- appl_elim t.(0)
- else
- (match t.(0) with
- | DOPN(AppL,t') ->
- appl_elim (DOPN(AppL,Array.append t'
- (Array.of_list
- (List.tl (Array.to_list t)))))
- |_ -> DOPN(AppL,Array.map appl_elim t))
- | DOP1(op,t) -> DOP1(op,appl_elim t)
- | DOP2(op,t0,t1) -> DOP2(op,appl_elim t0,appl_elim t1)
- | DOPN(op,t) -> DOPN(op,Array.map appl_elim t)
- | DOPL(op,ld) -> DOPL(op,List.map appl_elim ld)
- | DLAM(n,t) -> DLAM(n,appl_elim t)
- | DLAMV(n,t) -> DLAMV(n,Array.map appl_elim t)
- | t -> t
-
-(*Gives Some(first instance of ceq in cref,occurence number for this
- instance) or None if no instance of ceq can be found in cref*)
-let sub_term_with_unif cref ceq=
- let rec find_match l_meta nb_occ op_ceq t_eq=function
- | DOPN(AppL,t) as u ->
- (match (t.(0)) with
- | DOPN(op,t_op) ->
- let t_args=Array.of_list (List.tl (Array.to_list t)) in
- if op=op_ceq then
- match
- (List.fold_left2
- (fun a c0 c1 ->
- match a with
- | None -> None
- | Some l -> eq_mod_rel l (c0,c1)) (Some l_meta)
- (Array.to_list t_args) (Array.to_list t_eq))
- with
- | None ->
- List.fold_left
- (fun (l_meta,nb_occ) x -> find_match l_meta nb_occ
- op_ceq t_eq x) (l_meta,nb_occ) (Array.to_list
- t_args)
- | Some l -> (l,nb_occ+1)
- else
- List.fold_left
- (fun (l_meta,nb_occ) x -> find_match l_meta
- nb_occ op_ceq t_eq x)
- (l_meta,nb_occ) (Array.to_list t)
- | VAR _ ->
- List.fold_left
- (fun (l_meta,nb_occ) x -> find_match l_meta
- nb_occ op_ceq t_eq x)
- (l_meta,nb_occ) (Array.to_list t)
- |_ -> (l_meta,nb_occ))
- | DOP2(_,t,DLAM(_,c)) ->
- let (lt,nbt)=find_match l_meta nb_occ op_ceq t_eq t in
- find_match lt nbt op_ceq t_eq c
- | DOPN(_,t) ->
- List.fold_left
- (fun (l_meta,nb_occ) x -> find_match l_meta nb_occ op_ceq t_eq x)
- (l_meta,nb_occ) (Array.to_list t)
- |_ -> (l_meta,nb_occ)
- in
- match (is_hd_const ceq) with
- | None ->
- if (occur_meta ceq) then
- None
- else
- let nb_occ=nb_occ_term ceq cref in
- if nb_occ=0 then
- None
- else
- Some (ceq,nb_occ)
- | Some (head,t_args) ->
- let (l,nb)=find_match [] 0 head t_args cref in
- if nb=0 then
- None
- else
- Some ((subst_with_lmeta l ceq),nb)
+
+(* Abstract decomposition of constr to deal with generic functions *)
type constr_operator =
| OpMeta of int
| OpSort of sorts
| OpRel of int | OpVar of identifier
- | OpCast | OpProd of name | OpLambda of name
+ | OpCast | OpProd of name | OpLambda of name | OpLetIn of name
| OpAppL | OpConst of section_path | OpAbst of section_path
| OpEvar of existential_key
| OpMutInd of inductive_path
| OpMutConstruct of constructor_path
| OpMutCase of case_info
- | OpRec of fix_kind
+ | OpRec of fix_kind * name list
let splay_constr = function
- | Rel n -> OpRel n, []
- | VAR id -> OpVar id, []
- | DOP0 (Meta n) -> OpMeta n, []
- | DOP0 (Sort s) -> OpSort s, []
- | DOP2 (Cast, t1, t2) -> OpCast, [t1;t2]
- | DOP2 (Prod, t1, (DLAM (x,t2))) -> OpProd x, [t1;t2]
- | DOP2 (Lambda, t1, (DLAM (x,t2))) -> OpLambda x, [t1;t2]
- | DOPN (AppL,a) -> OpAppL, Array.to_list a
- | DOPN (Const sp, a) -> OpConst sp, Array.to_list a
- | DOPN (Evar sp, a) -> OpEvar sp, Array.to_list a
- | DOPN (MutInd ind_sp, l) -> OpMutInd ind_sp, Array.to_list l
- | DOPN (MutConstruct cstr_sp,l) -> OpMutConstruct cstr_sp, Array.to_list l
- | DOPN (MutCase ci,v) -> OpMutCase ci, Array.to_list v
- | DOPN ((Fix (f,i),a)) -> OpRec (RFix (f,i)), Array.to_list a
- | DOPN ((CoFix i),a) -> OpRec (RCofix i), Array.to_list a
+ | Rel n -> OpRel n, [||]
+ | VAR id -> OpVar id, [||]
+ | DOP0 (Meta n) -> OpMeta n, [||]
+ | DOP0 (Sort s) -> OpSort s, [||]
+ | DOP2 (Cast, t1, t2) -> OpCast, [|t1;t2|]
+ | CPrd (x, t1, t2) -> OpProd x, [|t1;t2|]
+ | CLam (x, t1, t2) -> OpLambda x, [|t1;t2|]
+ | CLet (x, b, t1, t2) -> OpLetIn x, [|b;t1;t2|]
+ | DOPN (AppL,a) -> OpAppL, a
+ | DOPN (Const sp, a) -> OpConst sp, a
+ | DOPN (Evar sp, a) -> OpEvar sp, a
+ | DOPN (MutInd ind_sp, l) -> OpMutInd ind_sp, l
+ | DOPN (MutConstruct cstr_sp,l) -> OpMutConstruct cstr_sp, l
+ | DOPN (MutCase ci,v) -> OpMutCase ci, v
+ | DOPN ((Fix (f,i),a)) as c ->
+ let (fi,(tl,lna,bl)) = destFix c in
+ OpRec (RFix fi,lna), Array.append tl bl
+ | DOPN ((CoFix i),a) as c ->
+ let (fi,(tl,lna,bl)) = destCoFix c in
+ OpRec (RCoFix fi,lna), Array.append tl bl
| _ -> errorlabstrm "Term.splay_term" [< 'sTR "ill-formed constr" >]
let gather_constr = function
- | OpRel n, [] -> Rel n
- | OpVar id, [] -> VAR id
- | OpMeta n, [] -> DOP0 (Meta n)
- | OpSort s, [] -> DOP0 (Sort s)
- | OpCast, [t1;t2] -> DOP2 (Cast, t1, t2)
- | OpProd x, [t1;t2] -> DOP2 (Prod, t1, (DLAM (x,t2)))
- | OpLambda x, [t1;t2] -> DOP2 (Lambda, t1, (DLAM (x,t2)))
- | OpAppL, a -> DOPN (AppL,Array.of_list a)
- | OpConst sp, a -> DOPN (Const sp,Array.of_list a)
- | OpEvar sp, a -> DOPN (Evar sp, Array.of_list a)
- | OpMutInd ind_sp, l -> DOPN (MutInd ind_sp, Array.of_list l)
- | OpMutConstruct cstr_sp, l -> DOPN (MutConstruct cstr_sp,Array.of_list l)
- | OpMutCase ci, v -> DOPN (MutCase ci,Array.of_list v)
- | OpRec (RFix (f,i)), a -> DOPN ((Fix (f,i),Array.of_list a))
- | OpRec (RCofix i), a -> DOPN ((CoFix i),Array.of_list a)
+ | OpRel n, [||] -> Rel n
+ | OpVar id, [||] -> VAR id
+ | OpMeta n, [||] -> DOP0 (Meta n)
+ | OpSort s, [||] -> DOP0 (Sort s)
+ | OpCast, [|t1;t2|] -> DOP2 (Cast, t1, t2)
+ | OpProd x, [|t1;t2|] -> mkProd (x, t1, t2)
+ | OpLambda x, [|t1;t2|] -> mkLambda (x, t1, t2)
+ | OpLetIn x, [|b;t1;t2|] -> mkLetIn (x, b, t1, t2)
+ | OpAppL, a -> DOPN (AppL, a)
+ | OpConst sp, a -> DOPN (Const sp, a)
+ | OpEvar sp, a -> DOPN (Evar sp, a)
+ | OpMutInd ind_sp, l -> DOPN (MutInd ind_sp, l)
+ | OpMutConstruct cstr_sp, l -> DOPN (MutConstruct cstr_sp, l)
+ | OpMutCase ci, v -> DOPN (MutCase ci, v)
+ | OpRec (RFix fi,lna), a ->
+ let n = Array.length a / 2 in
+ mkFix (fi,(Array.sub a 0 n, lna, Array.sub a n n))
+ | OpRec (RCoFix i,lna), a ->
+ let n = Array.length a / 2 in
+ mkCoFix (i,(Array.sub a 0 n, lna, Array.sub a n n))
| _ -> errorlabstrm "Term.gather_term" [< 'sTR "ill-formed constr" >]
+
+let rec mycombine l1 l3 =
+ match (l1, l3) with
+ ([], []) -> []
+ | (a1::l1, a3::l3) -> (a1, None, a3) :: mycombine l1 l3
+ | (_, _) -> invalid_arg "mycombine"
+
+let rec mysplit = function
+ [] -> ([], [])
+ | (x, _, z)::l -> let (rx, rz) = mysplit l in (x::rx, z::rz)
+
+let splay_constr_with_binders = function
+ | Rel n -> OpRel n, [], [||]
+ | VAR id -> OpVar id, [], [||]
+ | DOP0 (Meta n) -> OpMeta n, [], [||]
+ | DOP0 (Sort s) -> OpSort s, [], [||]
+ | DOP2 (Cast, t1, t2) -> OpCast, [], [|t1;t2|]
+ | CPrd (x, t1, t2) -> OpProd x, [x,None,t1], [|t2|]
+ | CLam (x, t1, t2) -> OpLambda x, [x,None,t1], [|t2|]
+ | CLet (x, b, t1, t2) -> OpLetIn x, [x,Some b,t1], [|t2|]
+ | DOPN (AppL,a) -> OpAppL, [], a
+ | DOPN (Const sp, a) -> OpConst sp, [], a
+ | DOPN (Evar sp, a) -> OpEvar sp, [], a
+ | DOPN (MutInd ind_sp, l) -> OpMutInd ind_sp, [], l
+ | DOPN (MutConstruct cstr_sp,l) -> OpMutConstruct cstr_sp, [], l
+ | DOPN (MutCase ci,v) -> OpMutCase ci, [], v
+ | DOPN ((Fix (f,i),a)) as c ->
+ let (fi,(tl,lna,bl)) = destFix c in
+ let n = Array.length bl in
+ let ctxt = mycombine
+ (List.rev lna)
+ (Array.to_list (Array.mapi lift tl)) in
+ OpRec (RFix fi,lna), ctxt, bl
+ | DOPN ((CoFix i),a) as c ->
+ let (fi,(tl,lna,bl)) = destCoFix c in
+ let n = Array.length bl in
+ let ctxt = mycombine
+ (List.rev lna)
+ (Array.to_list (Array.mapi lift tl)) in
+ OpRec (RCoFix fi,lna), ctxt, bl
+ | _ -> errorlabstrm "Term.splay_term" [< 'sTR "ill-formed constr" >]
+
+let gather_constr_with_binders = function
+ | OpRel n, [], [||] -> Rel n
+ | OpVar id, [], [||] -> VAR id
+ | OpMeta n, [], [||] -> DOP0 (Meta n)
+ | OpSort s, [], [||] -> DOP0 (Sort s)
+ | OpCast, [], [|t1;t2|] -> DOP2 (Cast, t1, t2)
+ | OpProd _, [x,None,t1], [|t2|] -> mkProd (x, t1, t2)
+ | OpLambda _, [x,None,t1], [|t2|] -> mkLambda (x, t1, t2)
+ | OpLetIn _, [x,Some b,t1], [|t2|] -> mkLetIn (x, b, t1, t2)
+ | OpAppL, [], a -> DOPN (AppL, a)
+ | OpConst sp, [], a -> DOPN (Const sp, a)
+ | OpEvar sp, [], a -> DOPN (Evar sp, a)
+ | OpMutInd ind_sp, [], l -> DOPN (MutInd ind_sp, l)
+ | OpMutConstruct cstr_sp, [], l -> DOPN (MutConstruct cstr_sp, l)
+ | OpMutCase ci, [], v -> DOPN (MutCase ci, v)
+ | OpRec (RFix fi,lna), ctxt, bl ->
+ let (lna, tl) = mysplit ctxt in
+ let tl = Array.mapi (fun i -> lift (-i)) (Array.of_list tl) in
+ mkFix (fi,(tl, List.rev lna, bl))
+ | OpRec (RCoFix i,lna), ctxt, bl ->
+ let (lna, tl) = mysplit ctxt in
+ let tl = Array.mapi (fun i -> lift (-i)) (Array.of_list tl) in
+ mkCoFix (i,(tl, List.rev lna, bl))
+ | _ -> errorlabstrm "Term.gather_term" [< 'sTR "ill-formed constr" >]
+
+let generic_fold_left f acc bl tl =
+ let acc =
+ List.fold_left
+ (fun acc (_,bo,t) ->
+ match bo with
+ | None -> f acc t
+ | Some b -> f (f acc b) t) acc bl in
+ Array.fold_left f acc tl
diff --git a/kernel/term.mli b/kernel/term.mli
index cd86af675..0eb1d645d 100644
--- a/kernel/term.mli
+++ b/kernel/term.mli
@@ -2,11 +2,28 @@
(* $Id$ *)
(*i*)
+open Util
open Pp
open Names
-open Generic
+(*i open Generic i*)
(*i*)
+(*s The sorts of CCI. *)
+
+type contents = Pos | Null
+
+type sorts =
+ | Prop of contents (* Prop and Set *)
+ | Type of Univ.universe (* Type *)
+
+val str_of_contents : contents -> string
+val contents_of_str : string -> contents
+
+val mk_Set : sorts
+val mk_Prop : sorts
+
+val print_sort : sorts -> std_ppcmds
+
(*s The operators of the Calculus of Inductive Constructions.
['a] is the type of sorts. ([XTRA] is an extra slot, for putting in
whatever sort of operator we need for whatever sort of application.) *)
@@ -34,34 +51,32 @@ type 'a oper =
| CoFix of int
| XTRA of string
-(*s The sorts of CCI. *)
-
-type contents = Pos | Null
-
-val str_of_contents : contents -> string
-val contents_of_str : string -> contents
-
-type sorts =
- | Prop of contents (* Prop and Set *)
- | Type of Univ.universe (* Type *)
-
-val mk_Set : sorts
-val mk_Prop : sorts
-
-val print_sort : sorts -> std_ppcmds
-
(*s The type [constr] of the terms of CCI
- is obtained by instanciating the generic terms (type [term],
- see \refsec{generic_terms}) on the above operators, themselves instanciated
+ is obtained by instanciating a generic notion of terms
+ on the above operators, themselves instanciated
on the above sorts. *)
-type constr = sorts oper term
+(* [VAR] is used for named variables and [Rel] for variables as
+ de Bruijn indices. *)
-type flat_arity = (name * constr) list * sorts
+type constr =
+ | DOP0 of sorts oper
+ | DOP1 of sorts oper * constr
+ | DOP2 of sorts oper * constr * constr
+ | DOPN of sorts oper * constr array
+ | DLAM of name * constr
+ | DLAMV of name * constr array
+ | CLam of name * typed_type * constr
+ | CPrd of name * typed_type * constr
+ | CLet of name * constr * typed_type * constr
+ | VAR of identifier
+ | Rel of int
+
+and typed_type
-(*type 'a judge = { body : constr; typ : 'a }*)
+type flat_arity = (name * constr) list * sorts
-type typed_type
+(*s Functions about typed_type *)
val make_typed : constr -> sorts -> typed_type
val make_typed_lazy : constr -> (constr -> sorts) -> typed_type
@@ -81,9 +96,9 @@ type var_declaration = identifier * constr option * typed_type
type rel_declaration = name * constr option * typed_type
(**********************************************************************)
-type binder_kind = BProd | BLambda
+type binder_kind = BProd | BLambda | BLetIn
-type fix_kind = RFix of (int array * int) | RCofix of int
+type fix_kind = RFix of (int array * int) | RCoFix of int
type 'ctxt reference =
| RConst of section_path * 'ctxt
@@ -119,6 +134,7 @@ type kindOfTerm =
| IsCast of constr * constr
| IsProd of name * constr * constr
| IsLambda of name * constr * constr
+ | IsLetIn of name * constr * constr * constr
| IsAppL of constr * constr list
| IsAbst of section_path * constr array
| IsEvar of existential
@@ -142,9 +158,6 @@ val kind_of_term : constr -> kindOfTerm
(* Constructs a DeBrujin index *)
val mkRel : int -> constr
-(* Constructs an existential variable named "?" *)
-val mkExistential : constr
-
(* Constructs an existential variable named "?n" *)
val mkMeta : int -> constr
@@ -172,15 +185,15 @@ val implicit_sort : sorts
(* Constructs the term $t_1::t2$, i.e. the term $t_1$ casted with the
type $t_2$ (that means t2 is declared as the type of t1). *)
-val mkCast : constr -> constr -> constr
+val mkCast : constr * constr -> constr
(* Constructs the product $(x:t_1)t_2$ *)
-val mkProd : name -> constr -> constr -> constr
+val mkProd : name * constr * constr -> constr
val mkNamedProd : identifier -> constr -> constr -> constr
val mkProd_string : string -> constr -> constr -> constr
(* Constructs the product $(x:t_1)t_2$ *)
-val mkLetIn : name -> constr -> constr -> constr -> constr
+val mkLetIn : name * constr * constr * constr -> constr
val mkNamedLetIn : identifier -> constr -> constr -> constr -> constr
(* Constructs either [(x:t)c] or [[x=b:t]c] *)
@@ -199,7 +212,7 @@ val mkNamedProd_wo_LetIn : var_declaration -> constr -> constr
val mkArrow : constr -> constr -> constr
(* Constructs the abstraction $[x:t_1]t_2$ *)
-val mkLambda : name -> constr -> constr -> constr
+val mkLambda : name * constr * constr -> constr
val mkNamedLambda : identifier -> constr -> constr -> constr
(* [mkLambda_string s t c] constructs $[s:t]c$ *)
@@ -230,7 +243,7 @@ val mkMutInd : inductive -> constr
val mkMutConstruct : constructor -> constr
(* Constructs the term <p>Case c of c1 | c2 .. | cn end *)
-val mkMutCase : case_info -> constr -> constr -> constr list -> constr
+val mkMutCase : case_info * constr * constr * constr list -> constr
val mkMutCaseA : case_info -> constr -> constr -> constr array -> constr
(* If [recindxs = [|i1,...in|]]
@@ -238,7 +251,7 @@ val mkMutCaseA : case_info -> constr -> constr -> constr array -> constr
[funnames = [f1,.....fn]]
[bodies = [b1,.....bn]]
then [ mkFix ((recindxs,i),typarray, funnames, bodies) ]
- constructs the $i$th function of the block
+ constructs the $i$th function of the block (counting from 0)
[Fixpoint f1 [ctx1] = b1
with f2 [ctx2] = b2
@@ -282,7 +295,7 @@ val destRel : constr -> int
(* Destructs an existential variable *)
val destMeta : constr -> int
-val isMETA : constr -> bool
+val isMeta : constr -> bool
(* Destructs a variable *)
val destVar : constr -> identifier
@@ -330,6 +343,9 @@ val hd_is_constructor : constr -> bool
(* Destructs the abstraction $[x:t_1]t_2$ *)
val destLambda : constr -> name * constr * constr
+(* Destructs the let $[x:=b:t_1]t_2$ *)
+val destLetIn : constr -> name * constr * constr * constr
+
(* Destructs an application *)
val destAppL : constr -> constr array
val isAppL : constr -> bool
@@ -339,6 +355,7 @@ val destApplication : constr -> constr * constr array
(* Destructs a constant *)
val destConst : constr -> section_path * constr array
+val isConst : constr -> bool
val path_of_const : constr -> section_path
val args_of_const : constr -> constr array
@@ -358,6 +375,7 @@ val args_of_mind : constr -> constr array
(* Destructs a constructor *)
val destMutConstruct : constr -> constructor
+val isMutConstruct : constr -> bool
val op_of_mconstr : constr -> constructor_path
val args_of_mconstr : constr -> constr array
@@ -541,6 +559,88 @@ val le_kind_implicit : constr -> constr -> bool
val sort_hdchar : sorts -> string
+(* Generic functions *)
+val free_rels : constr -> Intset.t
+
+(* [closed0 M] is true iff [M] is a (deBruijn) closed term *)
+val closed0 : constr -> bool
+
+(* [noccurn n M] returns true iff [Rel n] does NOT occur in term [M] *)
+val noccurn : int -> constr -> bool
+
+(* [noccur_between n m M] returns true iff [Rel p] does NOT occur in term [M]
+ for n <= p < n+m *)
+val noccur_between : int -> int -> constr -> bool
+
+(* Checking function for terms containing existential- or
+ meta-variables. The function [noccur_with_meta] considers only
+ meta-variable applied to some terms (intented to be its local
+ context) (for existential variables, it is necessarily the case) *)
+val noccur_with_meta : int -> int -> constr -> bool
+
+(* [liftn n k c] lifts by [n] indexes above [k] in [c] *)
+val liftn : int -> int -> constr -> constr
+
+(* [lift n c] lifts by [n] the positive indexes in [c] *)
+val lift : int -> constr -> constr
+
+(* [pop c] lifts by -1 the positive indexes in [c] *)
+val pop : constr -> constr
+
+(* [lift_context n ctxt] lifts terms in [ctxt] by [n] preserving
+ (i.e. not lifting) the internal references between terms of [ctxt];
+ more recent terms come first in [ctxt] *)
+val lift_context : int -> (name * constr) list -> (name * constr) list
+
+(* [substnl [a1;...;an] k c] substitutes in parallele [a1],...,[an]
+ for respectively [Rel(k+1)],...,[Rel(k+n)] in [c]; it relocates
+ accordingly indexes in [a1],...,[an] *)
+val substnl : constr list -> int -> constr -> constr
+val substl : constr list -> constr -> constr
+val subst1 : constr -> constr -> constr
+
+(* [global_vars c] returns the list of [id]'s occurring as [VAR id] in [c] *)
+val global_vars : constr -> identifier list
+
+val global_vars_set : constr -> Idset.t
+val replace_vars : (identifier * constr) list -> constr -> constr
+val subst_var : identifier -> constr -> constr
+
+(* [subst_vars [id1;...;idn] t] substitute [VAR idj] by [Rel j] in [t]
+ if two names are identical, the one of least indice is keeped *)
+val subst_vars : identifier list -> constr -> constr
+
+(* [rel_list n m] and [rel_vect n m] compute [[Rel (n+m);...;Rel(n+1)]] *)
+val rel_vect : int -> int -> constr array
+val rel_list : int -> int -> constr list
+
+(*i************************************************************************i*)
+(*i Pour Closure
+(* Explicit substitutions of type ['a]. [ESID] = identity.
+ [CONS(t,S)] = $S.t$ i.e. parallel substitution. [SHIFT(n,S)] =
+ $(\uparrow n~o~S)$ i.e. terms in S are relocated with n vars.
+ [LIFT(n,S)] = $(\%n~S)$ stands for $((\uparrow n~o~S).n...1)$. *)
+type 'a subs =
+ | ESID
+ | CONS of 'a * 'a subs
+ | SHIFT of int * 'a subs
+ | LIFT of int * 'a subs
+val subs_cons : 'a * 'a subs -> 'a subs
+val subs_liftn : int -> 'a subs -> 'a subs
+val subs_lift : 'a subs -> 'a subs
+val subs_shft : int * 'a subs -> 'a subs
+val expand_rel : int -> 'a subs -> (int * 'a, int) union
+i*)
+(*s Lifts. [ELSHFT(l,n)] == lift of [n], then apply [lift l].
+ [ELLFT(n,l)] == apply [l] to de Bruijn > [n] i.e under n binders. *)
+type lift_spec =
+ | ELID
+ | ELSHFT of lift_spec * int
+ | ELLFT of int * lift_spec
+val el_shft : int -> lift_spec -> lift_spec
+val el_lift : lift_spec -> lift_spec
+val reloc_rel: int -> lift_spec -> int
+(*i*)
(*s Occur check functions. *)
@@ -550,7 +650,6 @@ val occur_meta : constr -> bool
(*i val max_occur_meta : constr -> int i*)
val occur_existential : constr -> bool
-val rel_vect : int -> int -> constr array
(* [(occur_const (s:section_path) c)] returns [true] if constant [s] occurs
in c, [false] otherwise *)
@@ -562,7 +661,7 @@ val occur_evar : existential_key -> constr -> bool
(* [(occur_var id c)] returns [true] if variable [id] occurs free
in c, [false] otherwise *)
-val occur_var : identifier -> 'a term -> bool
+val occur_var : identifier -> constr -> bool
(* [dependent M N] is true iff M is eq\_constr with a subterm of N
M is appropriately lifted through abstractions of N *)
@@ -579,7 +678,6 @@ val eta_eq_constr : constr -> constr -> bool
(*s The following functions substitutes [what] by [Rel 1] in [where] *)
val subst_term : what:constr -> where:constr -> constr
-val subst_term_eta_eq : what:constr -> where:constr -> constr
val subst_term_occ : occs:int list -> what:constr -> where:constr -> constr
val subst_term_occ_decl : occs:int list -> what:constr ->
where:var_declaration -> var_declaration
@@ -598,16 +696,26 @@ type constr_operator =
| OpMeta of int
| OpSort of sorts
| OpRel of int | OpVar of identifier
- | OpCast | OpProd of name | OpLambda of name
+ | OpCast | OpProd of name | OpLambda of name | OpLetIn of name
| OpAppL | OpConst of section_path | OpAbst of section_path
| OpEvar of existential_key
| OpMutInd of inductive_path
| OpMutConstruct of constructor_path
| OpMutCase of case_info
- | OpRec of fix_kind
+ | OpRec of fix_kind * Names.name list
+
+val splay_constr : constr -> constr_operator * constr array
+val gather_constr : constr_operator * constr array -> constr
+
+val splay_constr_with_binders : constr ->
+ constr_operator * (name * constr option * constr) list * constr array
+val gather_constr_with_binders :
+ constr_operator * (name * constr option * constr) list * constr array
+ -> constr
-val splay_constr : constr -> constr_operator * constr list
-val gather_constr : constr_operator * constr list -> constr
+val generic_fold_left :
+ ('a -> constr -> 'a) -> 'a -> (name * constr option * constr) list
+ -> constr array -> 'a
(*s Hash-consing functions for constr. *)
diff --git a/kernel/type_errors.ml b/kernel/type_errors.ml
index 518809392..34dee81c8 100644
--- a/kernel/type_errors.ml
+++ b/kernel/type_errors.ml
@@ -9,6 +9,24 @@ open Environ
(* Type errors. *)
+type guard_error =
+ (* Fixpoints *)
+ | NotEnoughAbstractionInFixBody
+ | RecursionNotOnInductiveType
+ | RecursionOnIllegalTerm
+ | NotEnoughArgumentsForFixCall
+ (* CoFixpoints *)
+ | CodomainNotInductiveType of constr
+ | NestedRecursiveOccurrences
+ | UnguardedRecursiveCall of constr
+ | RecCallInTypeOfAbstraction of constr
+ | RecCallInNonRecArgOfConstructor of constr
+ | RecCallInTypeOfDef of constr
+ | RecCallInCaseFun of constr
+ | RecCallInCaseArg of constr
+ | RecCallInCasePred of constr
+ | NotGuardedForm
+
type type_error =
| UnboundRel of int
| NotAType of unsafe_judgment
@@ -24,7 +42,7 @@ type type_error =
| CantApplyBadType of (int * constr * constr)
* unsafe_judgment * unsafe_judgment list
| CantApplyNonFunctional of unsafe_judgment * unsafe_judgment list
- | IllFormedRecBody of std_ppcmds * name list * int * constr array
+ | IllFormedRecBody of guard_error * name list * int * constr array
| IllTypedRecBody of int * name list * unsafe_judgment array
* typed_type array
| NotInductive of constr
@@ -82,8 +100,8 @@ let error_cant_apply_not_functional k env rator randl =
let error_cant_apply_bad_type k env sigma t rator randl =
raise(TypeError (k, env_ise sigma env, CantApplyBadType (t,rator,randl)))
-let error_ill_formed_rec_body k env str lna i vdefs =
- raise (TypeError (k, env, IllFormedRecBody (str,lna,i,vdefs)))
+let error_ill_formed_rec_body k env why lna i vdefs =
+ raise (TypeError (k, env, IllFormedRecBody (why,lna,i,vdefs)))
let error_ill_typed_rec_body k env i lna vdefj vargs =
raise (TypeError (k, env, IllTypedRecBody (i,lna,vdefj,vargs)))
diff --git a/kernel/type_errors.mli b/kernel/type_errors.mli
index 20fa410e4..f5e16f3c4 100644
--- a/kernel/type_errors.mli
+++ b/kernel/type_errors.mli
@@ -11,6 +11,26 @@ open Environ
(* Type errors. \label{typeerrors} *)
+(*i Rem: NotEnoughAbstractionInFixBody should only occur with "/i" Fix
+ notation i*)
+type guard_error =
+ (* Fixpoints *)
+ | NotEnoughAbstractionInFixBody
+ | RecursionNotOnInductiveType
+ | RecursionOnIllegalTerm
+ | NotEnoughArgumentsForFixCall
+ (* CoFixpoints *)
+ | CodomainNotInductiveType of constr
+ | NestedRecursiveOccurrences
+ | UnguardedRecursiveCall of constr
+ | RecCallInTypeOfAbstraction of constr
+ | RecCallInNonRecArgOfConstructor of constr
+ | RecCallInTypeOfDef of constr
+ | RecCallInCaseFun of constr
+ | RecCallInCaseArg of constr
+ | RecCallInCasePred of constr
+ | NotGuardedForm
+
type type_error =
| UnboundRel of int
| NotAType of unsafe_judgment
@@ -26,7 +46,7 @@ type type_error =
| CantApplyBadType of (int * constr * constr)
* unsafe_judgment * unsafe_judgment list
| CantApplyNonFunctional of unsafe_judgment * unsafe_judgment list
- | IllFormedRecBody of std_ppcmds * name list * int * constr array
+ | IllFormedRecBody of guard_error * name list * int * constr array
| IllTypedRecBody of int * name list * unsafe_judgment array
* typed_type array
| NotInductive of constr
@@ -80,8 +100,7 @@ val error_cant_apply_bad_type :
unsafe_judgment -> unsafe_judgment list -> 'b
val error_ill_formed_rec_body :
- path_kind -> env -> std_ppcmds
- -> name list -> int -> constr array -> 'b
+ path_kind -> env -> guard_error -> name list -> int -> constr array -> 'b
val error_ill_typed_rec_body :
path_kind -> env -> int -> name list -> unsafe_judgment array
diff --git a/kernel/typeops.ml b/kernel/typeops.ml
index 4077d852f..4b22b0b6a 100644
--- a/kernel/typeops.ml
+++ b/kernel/typeops.ml
@@ -5,7 +5,7 @@ open Pp
open Util
open Names
open Univ
-open Generic
+(*i open Generic i*)
open Term
open Declarations
open Sign
@@ -113,17 +113,17 @@ let type_of_existential env sigma c =
(* Case. *)
let rec mysort_of_arity env sigma c =
- match whd_betadeltaiota env sigma c with
- | DOP0(Sort(s)) -> s
- | DOP2(Prod,_,DLAM(_,c2)) -> mysort_of_arity env sigma c2
+ match kind_of_term (whd_betadeltaiota env sigma c) with
+ | IsSort s -> s
+ | IsProd(_,_,c2) -> mysort_of_arity env sigma c2
| _ -> invalid_arg "mysort_of_arity"
let error_elim_expln env sigma kp ki =
- if is_info_sort env sigma kp && not (is_info_sort env sigma ki) then
+ if is_info_arity env sigma kp && not (is_info_arity env sigma ki) then
"non-informative objects may not construct informative ones."
else
- match (kp,ki) with
- | (DOP0(Sort (Type _)), DOP0(Sort (Prop _))) ->
+ match (kind_of_term kp,kind_of_term ki) with
+ | IsSort (Type _), IsSort (Prop _) ->
"strong elimination on non-small inductive types leads to paradoxes."
| _ -> "wrong arity"
@@ -131,13 +131,15 @@ exception Arity of (constr * constr * string) option
let is_correct_arity env sigma kelim (c,p) indf (pt,t) =
let rec srec (pt,t) =
- match whd_betadeltaiota env sigma pt, whd_betadeltaiota env sigma t with
- | DOP2(Prod,a1,DLAM(_,a2)), DOP2(Prod,a1',DLAM(_,a2')) ->
+ let pt' = whd_betadeltaiota env sigma pt in
+ let t' = whd_betadeltaiota env sigma t in
+ match kind_of_term pt', kind_of_term t' with
+ | IsProd (_,a1,a2), IsProd (_,a1',a2') ->
if is_conv env sigma a1 a1' then
srec (a2,a2')
else
raise (Arity None)
- | DOP2(Prod,a1,DLAM(_,a2)), ki ->
+ | IsProd (_,a1,a2), _ ->
let k = whd_betadeltaiota env sigma a2 in
let ksort = (match k with DOP0(Sort s) -> s
| _ -> raise (Arity None)) in
@@ -146,18 +148,18 @@ let is_correct_arity env sigma kelim (c,p) indf (pt,t) =
if List.exists (base_sort_cmp CONV ksort) kelim then
(true,k)
else
- raise (Arity (Some(k,ki,error_elim_expln env sigma k ki)))
+ raise (Arity (Some(k,t',error_elim_expln env sigma k t')))
else
raise (Arity None)
- | k, DOP2(Prod,_,_) ->
+ | k, IsProd (_,_,_) ->
raise (Arity None)
| k, ki ->
- let ksort = (match k with DOP0(Sort s) -> s
+ let ksort = (match k with IsSort s -> s
| _ -> raise (Arity None)) in
if List.exists (base_sort_cmp CONV ksort) kelim then
- false,k
+ false, pt'
else
- raise (Arity (Some(k,ki,error_elim_expln env sigma k ki)))
+ raise (Arity (Some(pt',t',error_elim_expln env sigma pt' t')))
in
try srec (pt,t)
with Arity kinds ->
@@ -274,12 +276,13 @@ let typed_product env name var c =
let rcst = ref Constraint.empty in
let hacked_sort_of_product s1 s2 =
let (s,cst) = sort_of_product s1 s2 (universes env) in (rcst:=cst; s) in
- typed_combine (mkProd name) hacked_sort_of_product var c, !rcst
+ typed_combine (fun c t -> mkProd (name,c,t)) hacked_sort_of_product var c,
+ !rcst
let abs_rel env sigma name var j =
let cvar = incast_type var in
let typ,cst = typed_product env name var j.uj_type in
- { uj_val = mkLambda name cvar j.uj_val;
+ { uj_val = mkLambda (name, cvar, j.uj_val);
uj_type = typ },
cst
@@ -292,7 +295,7 @@ let gen_rel env sigma name varj j =
let (s',g) = sort_of_product varj.utj_type s (universes env) in
let res_type = mkSort s' in
let (res_kind,g') = type_of_sort res_type in
- { uj_val = mkProd name (incast_type var) j.uj_val;
+ { uj_val = mkProd (name, incast_type var, j.uj_val);
uj_type = make_typed res_type res_kind },
g'
| _ ->
@@ -321,8 +324,8 @@ let apply_rel_list env sigma nocheck argjl funj =
uj_type = typed_app (fun _ -> typ) funj.uj_type },
cst
| hj::restjl ->
- match whd_betadeltaiota env sigma typ with
- | DOP2(Prod,c1,DLAM(_,c2)) ->
+ match kind_of_term (whd_betadeltaiota env sigma typ) with
+ | IsProd (_,c1,c2) ->
if nocheck then
apply_rec (n+1) (subst1 hj.uj_val c2) cst restjl
else
@@ -342,33 +345,6 @@ let apply_rel_list env sigma nocheck argjl funj =
(* Fixpoints. *)
-(* Checking function for terms containing existential variables.
- The function [noccur_with_meta] considers the fact that
- each existential variable (as well as each isevar)
- in the term appears applied to its local context,
- which may contain the CoFix variables. These occurrences of CoFix variables
- are not considered *)
-
-exception Occur
-let noccur_with_meta n m term =
- let rec occur_rec n = function
- | Rel p -> if n<=p & p<n+m then raise Occur
- | VAR _ -> ()
- | DOPN(AppL,cl) ->
- (match strip_outer_cast cl.(0) with
- | DOP0 (Meta _) -> ()
- | _ -> Array.iter (occur_rec n) cl)
- | DOPN(Evar _, _) -> ()
- | DOPN(op,cl) -> Array.iter (occur_rec n) cl
- | DOPL(_,cl) -> List.iter (occur_rec n) cl
- | DOP0(_) -> ()
- | DOP1(_,c) -> occur_rec n c
- | DOP2(_,c1,c2) -> occur_rec n c1; occur_rec n c2
- | DLAM(_,c) -> occur_rec (n+1) c
- | DLAMV(_,v) -> Array.iter (occur_rec (n+1)) v
- in
- try (occur_rec n term; true) with Occur -> false
-
(* Check if t is a subterm of Rel n, and gives its specification,
assuming lst already gives index of
subterms with corresponding specifications of recursive arguments *)
@@ -396,17 +372,17 @@ let rec instantiate_recarg sp lrc ra =
(* propagate checking for F,incorporating recursive arguments *)
let check_term env mind_recvec f =
let rec crec n l (lrec,c) =
- match (lrec,strip_outer_cast c) with
- | (Param(_)::lr,DOP2(Lambda,_,DLAM(_,b))) ->
+ match lrec, kind_of_term (strip_outer_cast c) with
+ | (Param(_)::lr, IsLambda (_,_,b)) ->
let l' = map_lift_fst l in
crec (n+1) l' (lr,b)
- | (Norec::lr,DOP2(Lambda,_,DLAM(_,b))) ->
+ | (Norec::lr, IsLambda (_,_,b)) ->
let l' = map_lift_fst l in
crec (n+1) l' (lr,b)
- | (Mrec(i)::lr,DOP2(Lambda,_,DLAM(_,b))) ->
+ | (Mrec(i)::lr, IsLambda (_,_,b)) ->
let l' = map_lift_fst l in
crec (n+1) ((1,mind_recvec.(i))::l') (lr,b)
- | (Imbr((sp,i) as ind_sp,lrc)::lr,DOP2(Lambda,_,DLAM(_,b))) ->
+ | (Imbr((sp,i) as ind_sp,lrc)::lr, IsLambda (_,_,b)) ->
let l' = map_lift_fst l in
let sprecargs =
mis_recargs (lookup_mind_specif (ind_sp,[||]) env) in
@@ -414,7 +390,7 @@ let check_term env mind_recvec f =
Array.map (List.map (instantiate_recarg sp lrc)) sprecargs.(i)
in
crec (n+1) ((1,lc)::l') (lr,b)
- | _,f_0 -> f n l f_0
+ | _,_ -> f n l (strip_outer_cast c)
in
crec
@@ -425,28 +401,28 @@ let is_inst_var env sigma k c =
let is_subterm_specif env sigma lcx mind_recvec =
let rec crec n lst c =
- match whd_betadeltaiota_stack env sigma c [] with
- | ((Rel k),_) -> find_sorted_assoc k lst
- | (DOPN(MutCase _,_) as x,_) ->
- let ( _,_,c,br) = destCase x in
- if Array.length br = 0 then
- [||]
- else
- let lcv =
- (try
- if is_inst_var env sigma n c then lcx else (crec n lst c)
- with Not_found -> (Array.create (Array.length br) []))
- in
- assert (Array.length br = Array.length lcv);
- let stl =
- array_map2
- (fun lc a ->
- check_term env mind_recvec crec n lst (lc,a)) lcv br
- in
- stl.(0)
+ let f,l = whd_betadeltaiota_stack env sigma c [] in
+ match kind_of_term f with
+ | IsRel k -> find_sorted_assoc k lst
+
+ | IsMutCase ( _,_,c,br) ->
+ if Array.length br = 0 then
+ [||]
+ else
+ let lcv =
+ (try
+ if is_inst_var env sigma n c then lcx else (crec n lst c)
+ with Not_found -> (Array.create (Array.length br) []))
+ in
+ assert (Array.length br = Array.length lcv);
+ let stl =
+ array_map2
+ (fun lc a ->
+ check_term env mind_recvec crec n lst (lc,a)) lcv br
+ in
+ stl.(0)
- | (DOPN(Fix(_),la) as mc,l) ->
- let ((recindxs,i),(typarray,funnames,bodies)) = destFix mc in
+ | IsFix ((recindxs,i),(typarray,funnames,bodies)) ->
let nbfix = List.length funnames in
let decrArg = recindxs.(i) in
let theBody = bodies.(i) in
@@ -470,12 +446,12 @@ let is_subterm_specif env sigma lcx mind_recvec =
in
crec (n+nbOfAbst) newlst strippedBody
- | (DOP2(Lambda,_,DLAM(_,b)),[]) ->
- let lst' = map_lift_fst lst in
- crec (n+1) lst' b
+ | IsLambda (_,_,b) when l=[] ->
+ let lst' = map_lift_fst lst in
+ crec (n+1) lst' b
(*** Experimental change *************************)
- | (DOP0(Meta _),_) -> [||]
+ | IsMeta _ -> [||]
| _ -> raise Not_found
in
crec
@@ -486,26 +462,29 @@ let is_subterm env sigma lcx mind_recvec n lst c =
with Not_found ->
false
+exception FixGuardError of guard_error
+
(* Auxiliary function: it checks a condition f depending on a deBrujin
index for a certain number of abstractions *)
-let rec check_subterm_rec_meta env sigma vectn k def =
+let rec check_subterm_rec_meta env sigma vectn k def =
+ (* If k<0, it is a general fixpoint *)
(k < 0) or
(let nfi = Array.length vectn in
(* check fi does not appear in the k+1 first abstractions,
gives the type of the k+1-eme abstraction *)
let rec check_occur n def =
- (match strip_outer_cast def with
- | DOP2(Lambda,a,DLAM(_,b)) ->
- if noccur_with_meta n nfi a then
- if n = k+1 then (a,b) else check_occur (n+1) b
- else
- error "Bad occurrence of recursive call"
- | _ -> error "Not enough abstractions in the definition") in
+ match kind_of_term (strip_outer_cast def) with
+ | IsLambda (_,a,b) ->
+ if noccur_with_meta n nfi a then
+ if n = k+1 then (a,b) else check_occur (n+1) b
+ else
+ anomaly "check_subterm_rec_meta: Bad occurrence of recursive call"
+ | _ -> raise (FixGuardError NotEnoughAbstractionInFixBody) in
let (c,d) = check_occur 1 def in
let ((sp,tyi),_ as mind, largs) =
- (try find_minductype env sigma c
- with Induc -> error "Recursive definition on a non inductive type") in
+ try find_minductype env sigma c
+ with Induc -> raise (FixGuardError RecursionNotOnInductiveType) in
let mind_recvec = mis_recargs (lookup_mind_specif mind env) in
let lcx = mind_recvec.(tyi) in
(* n = decreasing argument in the definition;
@@ -516,8 +495,9 @@ let rec check_subterm_rec_meta env sigma vectn k def =
(* n gives the index of the recursive variable *)
(noccur_with_meta (n+k+1) nfi t) or
(* no recursive call in the term *)
- (match whd_betadeltaiota_stack env sigma t [] with
- | (Rel p,l) ->
+ (let f,l = whd_betadeltaiota_stack env sigma t [] in
+ match kind_of_term f with
+ | IsRel p ->
if n+k+1 <= p & p < n+k+nfi+1 then
(* recursive call *)
let glob = nfi+n+k-p in (* the index of the recursive call *)
@@ -527,12 +507,12 @@ let rec check_subterm_rec_meta env sigma vectn k def =
(la,(z::lrest)) ->
if (is_subterm env sigma lcx mind_recvec n lst z)
then List.for_all (check_rec_call n lst) (la@lrest)
- else error "Recursive call applied to an illegal term"
+ else raise (FixGuardError RecursionOnIllegalTerm)
| _ -> assert false)
- else error "Not enough arguments for the recursive call"
+ else raise (FixGuardError NotEnoughArgumentsForFixCall)
else List.for_all (check_rec_call n lst) l
- | (DOPN(MutCase _,_) as mc,l) ->
- let (ci,p,c_0,lrest) = destCase mc in
+
+ | IsMutCase (ci,p,c_0,lrest) ->
let lc =
(try
if is_inst_var env sigma n c_0 then
@@ -563,13 +543,16 @@ let rec check_subterm_rec_meta env sigma vectn k def =
Eduardo 7/9/98 *)
- | (DOPN(Fix(_),la) as mc,l) ->
+ | IsFix ((recindxs,i),(typarray,funnames,bodies)) ->
(List.for_all (check_rec_call n lst) l) &&
- let ((recindxs,i),(typarray,funnames,bodies)) = destFix mc in
let nbfix = List.length funnames in
let decrArg = recindxs.(i) in
if (List.length l < (decrArg+1)) then
- (array_for_all (check_rec_call n lst) la)
+ (array_for_all (check_rec_call n lst) typarray)
+ &&
+ (array_for_all
+ (check_rec_call (n+nbfix) (map_lift_fst_n nbfix lst))
+ bodies)
else
let theDecrArg = List.nth l decrArg in
let recArgsDecrArg =
@@ -579,7 +562,11 @@ let rec check_subterm_rec_meta env sigma vectn k def =
Array.create 0 []
in
if (Array.length recArgsDecrArg)=0 then
- array_for_all (check_rec_call n lst) la
+ (array_for_all (check_rec_call n lst) typarray)
+ &&
+ (array_for_all
+ (check_rec_call (n+nbfix) (map_lift_fst_n nbfix lst))
+ bodies)
else
let theBody = bodies.(i) in
let (gamma,strippedBody) =
@@ -594,29 +581,63 @@ let rec check_subterm_rec_meta env sigma vectn k def =
typarray) &&
(list_for_all_i (fun n -> check_rec_call n lst) n absTypes) &
(check_rec_call (n+nbOfAbst) newlst strippedBody))
-
-
- | (DOP2(_,a,b),l) ->
+
+ | IsCast (a,b) ->
(check_rec_call n lst a) &&
(check_rec_call n lst b) &&
(List.for_all (check_rec_call n lst) l)
- | (DOPN(_,la),l) ->
- (array_for_all (check_rec_call n lst) la) &&
- (List.for_all (check_rec_call n lst) l)
+ | IsLambda (_,a,b) ->
+ (check_rec_call n lst a) &&
+ (check_rec_call (n+1) (map_lift_fst lst) b) &&
+ (List.for_all (check_rec_call n lst) l)
+
+ | IsProd (_,a,b) ->
+ (check_rec_call n lst a) &&
+ (check_rec_call (n+1) (map_lift_fst lst) b) &&
+ (List.for_all (check_rec_call n lst) l)
- | (DOP0 (Meta _),l) -> true
+ | IsLetIn (_,a,b,c) ->
+ (check_rec_call n lst a) &&
+ (check_rec_call n lst b) &&
+ (check_rec_call (n+1) (map_lift_fst lst) c) &&
+ (List.for_all (check_rec_call n lst) l)
- | (DLAM(_,t),l) ->
- (check_rec_call (n+1) (map_lift_fst lst) t) &&
+ | IsMutInd (_,la) ->
+ (array_for_all (check_rec_call n lst) la) &&
(List.for_all (check_rec_call n lst) l)
- | (DLAMV(_,vt),l) ->
- (array_for_all (check_rec_call (n+1) (map_lift_fst lst)) vt) &&
+ | IsMutConstruct (_,la) ->
+ (array_for_all (check_rec_call n lst) la) &&
(List.for_all (check_rec_call n lst) l)
- | (_,l) -> List.for_all (check_rec_call n lst) l
- )
+ | IsConst (_,la) ->
+ (array_for_all (check_rec_call n lst) la) &&
+ (List.for_all (check_rec_call n lst) l)
+
+ | IsAppL (f,la) ->
+ (check_rec_call n lst f) &&
+ (List.for_all (check_rec_call n lst) la) &&
+ (List.for_all (check_rec_call n lst) l)
+
+ | IsCoFix (i,(typarray,funnames,bodies)) ->
+ let nbfix = Array.length bodies in
+ (array_for_all (check_rec_call n lst) typarray) &&
+ (List.for_all (check_rec_call n lst) l) &&
+ (array_for_all
+ (check_rec_call (n+nbfix) (map_lift_fst_n nbfix lst))
+ bodies)
+
+ | IsEvar (_,la) ->
+ (array_for_all (check_rec_call n lst) la) &&
+ (List.for_all (check_rec_call n lst) l)
+
+ | IsMeta _ -> true
+
+ | IsVar _ | IsSort _ -> List.for_all (check_rec_call n lst) l
+
+ | IsXtra _ | IsAbst _ -> List.for_all (check_rec_call n lst) l
+ )
in
check_rec_call 1 [] d)
@@ -633,25 +654,30 @@ let check_fix env sigma ((nvect,bodynum),(types,names,bodies)) =
or Array.length nvect <> nbfix
or Array.length types <> nbfix
or List.length names <> nbfix
- then error "Ill-formed fix term";
+ or bodynum < 0
+ or bodynum >= nbfix
+ then anomaly "Ill-formed fix term";
for i = 0 to nbfix - 1 do
try
let _ = check_subterm_rec_meta env sigma nvect nvect.(i) bodies.(i) in ()
- with UserError (s,str) ->
- error_ill_formed_rec_body CCI env str (List.rev names) i bodies
+ with FixGuardError err ->
+ error_ill_formed_rec_body CCI env err (List.rev names) i bodies
done
(* Co-fixpoints. *)
+exception CoFixGuardError of guard_error
+
let check_guard_rec_meta env sigma nbfix def deftype =
let rec codomain_is_coind c =
- match whd_betadeltaiota env sigma (strip_outer_cast c) with
- | DOP2(Prod,a,DLAM(_,b)) -> codomain_is_coind b
- | b ->
- (try find_mcoinductype env sigma b
- with
- | Induc -> error "The codomain is not a coinductive type"
-(* | _ -> error "Type of Cofix function not as expected") ??? *) )
+ let b = whd_betadeltaiota env sigma (strip_outer_cast c) in
+ match kind_of_term b with
+ | IsProd (_,a,b) -> codomain_is_coind b
+ | _ ->
+ try
+ find_mcoinductype env sigma b
+ with Induc ->
+ raise (CoFixGuardError (CodomainNotInductiveType b))
in
let (mind, _) = codomain_is_coind deftype in
let ((sp,tyi),_) = mind in
@@ -671,11 +697,11 @@ let check_guard_rec_meta env sigma nbfix def deftype =
if List.for_all (noccur_with_meta n nbfix) l then
true
else
- error "Nested recursive occurrences"
+ raise (CoFixGuardError NestedRecursiveOccurrences)
else
- error "Unguarded recursive call"
+ raise (CoFixGuardError (UnguardedRecursiveCall t))
else
- error "check_guard_rec_meta: ???"
+ error "check_guard_rec_meta: ???" (* ??? *)
| (DOPN (MutConstruct(_,i as cstr_sp),l), args) ->
let lra =vlra.(i-1) in
@@ -710,7 +736,8 @@ let check_guard_rec_meta env sigma nbfix def deftype =
| _::lrar ->
if (noccur_with_meta n nbfix t)
then (process_args_of_constr lr lrar)
- else error "Recursive call inside a non-recursive argument of constructor")
+ else raise (CoFixGuardError
+ (RecCallInNonRecArgOfConstructor t)))
in (process_args_of_constr realargs lra)
@@ -718,7 +745,7 @@ let check_guard_rec_meta env sigma nbfix def deftype =
if (noccur_with_meta n nbfix a) then
check_rec_call alreadygrd (n+1) vlra b
else
- error "Recursive call in the type of an abstraction"
+ raise (CoFixGuardError (RecCallInTypeOfAbstraction t))
| (DOPN(CoFix(j),vargs) as cofix,l) ->
if (List.for_all (noccur_with_meta n nbfix) l)
@@ -730,8 +757,9 @@ let check_guard_rec_meta env sigma nbfix def deftype =
&&
(List.for_all (check_rec_call alreadygrd (n+1) vlra) l)
else
- error "Recursive call in the type of a declaration"
- else error "Unguarded recursive call"
+ raise (CoFixGuardError (RecCallInTypeOfDef cofix))
+ else
+ raise (CoFixGuardError (UnguardedRecursiveCall cofix))
| (DOPN(MutCase _,_) as mc,l) ->
let (_,p,c,vrest) = destCase mc in
@@ -740,13 +768,13 @@ let check_guard_rec_meta env sigma nbfix def deftype =
if (List.for_all (noccur_with_meta n nbfix) l) then
(array_for_all (check_rec_call alreadygrd n vlra) vrest)
else
- error "Recursive call in the argument of a function defined by cases"
+ raise (CoFixGuardError (RecCallInCaseFun mc))
else
- error "Recursive call in the argument of a case expression"
+ raise (CoFixGuardError (RecCallInCaseArg mc))
else
- error "Recursive call in the type of a Case expression"
+ raise (CoFixGuardError (RecCallInCasePred mc))
- | _ -> error "Definition not in guarded form"
+ | _ -> raise (CoFixGuardError NotGuardedForm)
in
check_rec_call false 1 vlra def
@@ -758,11 +786,9 @@ let check_cofix env sigma (bodynum,(types,names,bodies)) =
let nbfix = Array.length bodies in
for i = 0 to nbfix-1 do
try
- let _ =
- check_guard_rec_meta env sigma nbfix bodies.(i) types.(i) in
- ()
- with UserError (s,str) ->
- error_ill_formed_rec_body CCI env str (List.rev names) i bodies
+ let _ = check_guard_rec_meta env sigma nbfix bodies.(i) types.(i) in ()
+ with CoFixGuardError err ->
+ error_ill_formed_rec_body CCI env err (List.rev names) i bodies
done
(*
let check_cofix env sigma f =
@@ -814,22 +840,28 @@ let type_fixpoint env sigma lna lar vdefj =
syntaxic conditions *)
let control_only_guard env sigma =
- let rec control_rec = function
- | Rel(p) -> ()
- | VAR _ -> ()
- | DOP0(_) -> ()
- | DOPN(CoFix(_),cl) as cofix ->
- check_cofix env sigma (destCoFix cofix);
- Array.iter control_rec cl
- | DOPN(Fix(_),cl) as fix ->
- check_fix env sigma (destFix fix);
- Array.iter control_rec cl
- | DOPN(_,cl) -> Array.iter control_rec cl
- | DOPL(_,cl) -> List.iter control_rec cl
- | DOP1(_,c) -> control_rec c
- | DOP2(_,c1,c2) -> control_rec c1; control_rec c2
- | DLAM(_,c) -> control_rec c
- | DLAMV(_,v) -> Array.iter control_rec v
+ let rec control_rec c = match kind_of_term c with
+ | IsRel _ | IsVar _ -> ()
+ | IsSort _ | IsMeta _ | IsXtra _ -> ()
+ | IsCoFix (_,(tys,_,bds) as cofix) ->
+ check_cofix env sigma cofix;
+ Array.iter control_rec tys;
+ Array.iter control_rec bds;
+ | IsFix (_,(tys,_,bds) as fix) ->
+ check_fix env sigma fix;
+ Array.iter control_rec tys;
+ Array.iter control_rec bds;
+ | IsMutCase(_,p,c,b) ->control_rec p;control_rec c;Array.iter control_rec b
+ | IsMutInd (_,cl) -> Array.iter control_rec cl
+ | IsMutConstruct (_,cl) -> Array.iter control_rec cl
+ | IsConst (_,cl) -> Array.iter control_rec cl
+ | IsEvar (_,cl) -> Array.iter control_rec cl
+ | IsAbst (_,cl) -> Array.iter control_rec cl
+ | IsAppL (_,cl) -> List.iter control_rec cl
+ | IsCast (c1,c2) -> control_rec c1; control_rec c2
+ | IsProd (_,c1,c2) -> control_rec c1; control_rec c2
+ | IsLambda (_,c1,c2) -> control_rec c1; control_rec c2
+ | IsLetIn (_,c1,c2,c3) -> control_rec c1; control_rec c2; control_rec c3
in
control_rec
diff --git a/library/declare.ml b/library/declare.ml
index 404ecda31..9f98f3cb5 100644
--- a/library/declare.ml
+++ b/library/declare.ml
@@ -4,7 +4,7 @@
open Pp
open Util
open Names
-open Generic
+(*i open Generic i*)
open Term
open Sign
open Declarations
diff --git a/library/global.ml b/library/global.ml
index a37863a78..741d11e75 100644
--- a/library/global.ml
+++ b/library/global.ml
@@ -2,7 +2,7 @@
(* $Id$ *)
open Util
-open Generic
+(*i open Generic i*)
open Term
open Instantiate
open Sign
diff --git a/library/impargs.ml b/library/impargs.ml
index bae96bc14..3af4ecbec 100644
--- a/library/impargs.ml
+++ b/library/impargs.ml
@@ -2,7 +2,7 @@
(* $Id$ *)
open Names
-open Generic
+(*i open Generic i*)
open Term
open Reduction
open Declarations
diff --git a/library/indrec.ml b/library/indrec.ml
index 42d067d49..c89578735 100644
--- a/library/indrec.ml
+++ b/library/indrec.ml
@@ -4,7 +4,7 @@
open Pp
open Util
open Names
-open Generic
+(*i open Generic i*)
open Term
open Declarations
open Inductive
@@ -15,8 +15,7 @@ open Typeops
open Type_errors
open Indtypes (* pour les erreurs *)
-let simple_prod (n,t,c) = mkProd n t c
-let make_prod_dep dep env = if dep then prod_name env else simple_prod
+let make_prod_dep dep env = if dep then prod_name env else mkProd
(*******************************************)
(* Building curryfied elimination *)
@@ -94,9 +93,10 @@ let type_rec_branch dep env sigma (vargs,depPvect,decP) co t recargs =
let st = hnf_prod_appvect env sigma t vargs in
let process_pos depK pk =
let rec prec i p =
- match whd_betadeltaiota_stack env sigma p [] with
- | (DOP2(Prod,t,DLAM(n,c))),[] -> make_prod env (n,t,prec (i+1) c)
- | (DOPN(MutInd _,_),largs) ->
+ let p',largs = whd_betadeltaiota_stack env sigma p [] in
+ match kind_of_term p' with
+ | IsProd (n,t,c) -> assert (largs=[]); make_prod env (n,t,prec (i+1) c)
+ | IsMutInd (_,_) ->
let (_,realargs) = list_chop nparams largs in
let base = applist (lift i pk,realargs) in
if depK then
@@ -108,8 +108,10 @@ let type_rec_branch dep env sigma (vargs,depPvect,decP) co t recargs =
prec 0
in
let rec process_constr i c recargs co =
- match whd_betadeltaiota_stack env sigma c [] with
- | (DOP2(Prod,t,DLAM(n,c_0)),[]) ->
+ let c', largs = whd_betadeltaiota_stack env sigma c [] in
+ match kind_of_term c' with
+ | IsProd (n,t,c_0) ->
+ assert (largs = []);
let (optionpos,rest) =
match recargs with
| [] -> None,[]
@@ -129,7 +131,7 @@ let type_rec_branch dep env sigma (vargs,depPvect,decP) co t recargs =
make_prod_dep (dep or dep') env
(n,t,mkArrow t_0 (process_constr (i+2) (lift 1 c_0) rest
(mkAppList (lift 2 co) [Rel 2]))))
- | (DOPN(MutInd(_,tyi),_),largs) ->
+ | IsMutInd ((_,tyi),_) ->
let nP = match depPvect.(tyi) with
| Some(_,p) -> lift (i+decP) p
| _ -> assert false in
@@ -142,14 +144,15 @@ let type_rec_branch dep env sigma (vargs,depPvect,decP) co t recargs =
let make_rec_branch_arg env sigma (nparams,fvect,decF) f cstr recargs =
let process_pos fk =
- let rec prec i p =
- (match whd_betadeltaiota_stack env sigma p [] with
- | (DOP2(Prod,t,DLAM(n,c))),[] -> lambda_name env (n,t,prec (i+1) c)
- | (DOPN(MutInd _,_),largs) ->
- let (_,realargs) = list_chop nparams largs
- and arg = appvect (Rel (i+1),rel_vect 0 i) in
- applist(lift i fk,realargs@[arg])
- | _ -> assert false)
+ let rec prec i p =
+ let p',largs = whd_betadeltaiota_stack env sigma p [] in
+ match kind_of_term p' with
+ | IsProd (n,t,c) -> lambda_name env (n,t,prec (i+1) c)
+ | IsMutInd _ ->
+ let (_,realargs) = list_chop nparams largs
+ and arg = appvect (Rel (i+1),rel_vect 0 i) in
+ applist(lift i fk,realargs@[arg])
+ | _ -> assert false
in
prec 0
in
@@ -315,10 +318,10 @@ let make_case_gen env = make_case_com None env
[rec] by [s] *)
let change_sort_arity sort =
- let rec drec = function
- | (DOP2(Cast,c,t)) -> drec c
- | (DOP2(Prod,t,DLAM(n,c))) -> DOP2(Prod,t,DLAM(n,drec c))
- | (DOP0(Sort(_))) -> DOP0(Sort(sort))
+ let rec drec a = match kind_of_term a with
+ | IsCast (c,t) -> drec c
+ | IsProd (n,t,c) -> mkProd (n, t, drec c)
+ | IsSort _ -> mkSort sort
| _ -> assert false
in
drec
@@ -327,9 +330,9 @@ let instanciate_indrec_scheme sort =
let rec drec npar elim =
let (n,t,c) = destLambda (strip_outer_cast elim) in
if npar = 0 then
- mkLambda n (change_sort_arity sort t) c
+ mkLambda (n, change_sort_arity sort t, c)
else
- mkLambda n t (drec (npar-1) c)
+ mkLambda (n, t, drec (npar-1) c)
in
drec
diff --git a/parsing/astterm.ml b/parsing/astterm.ml
index 853798dab..5415d819c 100644
--- a/parsing/astterm.ml
+++ b/parsing/astterm.ml
@@ -5,7 +5,7 @@ open Pp
open Util
open Names
open Sign
-open Generic
+(*i open Generic i*)
open Term
open Environ
open Evd
@@ -278,17 +278,6 @@ let dbize k sigma env allow_soapp lvar =
let rec dbrec env = function
| Nvar(loc,s) -> fst (dbize_ref k sigma env loc s lvar)
- (*
- | Slam(_,ona,Node(_,"V$",l)) ->
- let na =
- (match ona with Some s -> Name (id_of_string s) | _ -> Anonymous)
- in DLAMV(na,Array.of_list (List.map (dbrec (Idset.add na env)) l))
-
- | Slam(_,ona,t) ->
- let na =
- (match ona with Some s -> Name (id_of_string s) | _ -> Anonymous)
- in DLAM(na, dbrec (Idset.add na env) t)
- *)
| Node(loc,"FIX", (Nvar (locid,iddef))::ldecl) ->
let (lf,ln,lA,lt) = dbize_fix ldecl in
let n =
@@ -313,13 +302,17 @@ let dbize k sigma env allow_soapp lvar =
List.fold_left (fun env fid -> Idset.add fid env) env lf in
let defl = Array.of_list (List.map (dbrec ext_env) lt) in
let arityl = Array.of_list (List.map (dbrec env) lA) in
- RRec (loc,RCofix n, Array.of_list lf, arityl, defl)
+ RRec (loc,RCoFix n, Array.of_list lf, arityl, defl)
- | Node(loc,("PROD"|"LAMBDA" as k), [c1;Slam(_,ona,c2)]) ->
+ | Node(loc,("PROD"|"LAMBDA"|"LETIN" as k), [c1;Slam(_,ona,c2)]) ->
let na,env' = match ona with
| Some s -> let id = id_of_string s in Name id, Idset.add id env
| _ -> Anonymous, env in
- let kind = if k="PROD" then BProd else BLambda in
+ let kind = match k with
+ | "PROD" -> BProd
+ | "LAMBDA" -> BLambda
+ | "LETIN" -> BLetIn
+ | _ -> assert false in
RBinder(loc, kind, na, dbrec env c1, dbrec env' c2)
| Node(_,"PRODLIST", [c1;(Slam _ as c2)]) ->
@@ -401,12 +394,12 @@ let dbize k sigma env allow_soapp lvar =
| Slam(loc,ona,body) ->
let na,env' = match ona with
| Some s ->
- check_capture s ty body;
+ if n>0 then check_capture s ty body;
let id = id_of_string s in Name id, Idset.add id env
| _ -> Anonymous, env
in
RBinder(loc, oper, na, dbrec env ty,
- (iterated_binder oper n ty env' body))
+ (iterated_binder oper (n+1) ty env' body))
| body -> dbrec env body
and dbize_args env l args =
diff --git a/parsing/g_basevernac.ml4 b/parsing/g_basevernac.ml4
index b8534a873..03af08edc 100644
--- a/parsing/g_basevernac.ml4
+++ b/parsing/g_basevernac.ml4
@@ -77,16 +77,19 @@ GEXTEND Gram
<:ast< (LocateLibrary $id) >>
| IDENT "Locate"; id = identarg; "." ->
<:ast< (Locate $id) >>
- | IDENT "Print"; IDENT "LoadPath"; "." -> <:ast< (PrintPath) >>
+
+ (* For compatibility (now turned into a table) *)
| IDENT "AddPath"; dir = stringarg; "." -> <:ast< (ADDPATH $dir) >>
| IDENT "DelPath"; dir = stringarg; "." -> <:ast< (DELPATH $dir) >>
+ | IDENT "Print"; IDENT "LoadPath"; "." -> <:ast< (PrintPath) >>
| IDENT "AddRecPath"; dir = stringarg; "." ->
<:ast< (RECADDPATH $dir) >>
+
| IDENT "Print"; IDENT "Modules"; "." -> <:ast< (PrintModules) >>
| IDENT "Print"; "Proof"; id = identarg; "." ->
<:ast< (PrintOpaqueId $id) >>
-(* Pris en compte dans PrintOption ci-dessous
- | IDENT "Print"; id = identarg; "." -> <:ast< (PrintId $id) >> *)
+(* Pris en compte dans PrintOption ci-dessous (CADUC) *)
+ | IDENT "Print"; id = identarg; "." -> <:ast< (PrintId $id) >>
| IDENT "Search"; id = identarg; "." -> <:ast< (SEARCH $id) >>
| IDENT "Inspect"; n = numarg; "." -> <:ast< (INSPECT $n) >>
(* TODO: rapprocher Eval et Check *)
@@ -110,7 +113,7 @@ GEXTEND Gram
| IDENT "Print"; IDENT "Graph"; "." -> <:ast< (PrintGRAPH) >>
| IDENT "Print"; IDENT "Classes"; "." -> <:ast< (PrintCLASSES) >>
| IDENT "Print"; IDENT "Coercions"; "." -> <:ast< (PrintCOERCIONS) >>
- | IDENT "Print"; IDENT "Path"; c = identarg; d = identarg; "." ->
+ | IDENT "Print"; IDENT "Coercion"; IDENT "Paths"; c = identarg; d = identarg; "." ->
<:ast< (PrintPATH $c $d) >>
| IDENT "Time"; v = vernac -> <:ast< (Time $v)>>
@@ -138,22 +141,35 @@ GEXTEND Gram
<:ast< (SetTableField $table) >>
| IDENT "Unset"; table = identarg; "." ->
<:ast< (UnsetTableField $table) >>
- | IDENT "Print"; table = identarg; field = identarg; "." ->
+ | IDENT "Print"; IDENT "Table";
+ table = identarg; field = identarg; "." ->
<:ast< (PrintOption $table $field) >>
(* Le cas suivant inclut aussi le "Print id" standard *)
- | IDENT "Print"; table = identarg; "." ->
+ | IDENT "Print"; IDENT "Table"; table = identarg; "." ->
<:ast< (PrintOption $table) >>
| IDENT "Add"; table = identarg; field = identarg; id = identarg; "."
-> <:ast< (AddTableField $table $field $id) >>
+ | IDENT "Add"; table = identarg; field = identarg; id = stringarg; "."
+ -> <:ast< (AddTableField $table $field $id) >>
| IDENT "Add"; table = identarg; id = identarg; "."
-> <:ast< (AddTableField $table $id) >>
+ | IDENT "Add"; table = identarg; id = stringarg; "."
+ -> <:ast< (AddTableField $table $id) >>
| IDENT "Test"; table = identarg; field = identarg; id = identarg; "."
-> <:ast< (MemTableField $table $field $id) >>
+ | IDENT "Test"; table = identarg; field = identarg; id = stringarg; "."
+ -> <:ast< (MemTableField $table $field $id) >>
| IDENT "Test"; table = identarg; id = identarg; "."
-> <:ast< (MemTableField $table $id) >>
+ | IDENT "Test"; table = identarg; id = stringarg; "."
+ -> <:ast< (MemTableField $table $id) >>
| IDENT "Remove"; table = identarg; field = identarg; id = identarg; "." ->
<:ast< (RemoveTableField $table $field $id) >>
+ | IDENT "Remove"; table = identarg; field = identarg; id = stringarg; "." ->
+ <:ast< (RemoveTableField $table $field $id) >>
| IDENT "Remove"; table = identarg; id = identarg; "." ->
+ <:ast< (RemoveTableField $table $id) >>
+ | IDENT "Remove"; table = identarg; id = stringarg; "." ->
<:ast< (RemoveTableField $table $id) >> ] ]
;
option_value:
diff --git a/parsing/g_constr.ml4 b/parsing/g_constr.ml4
index d685b292a..2a7f5ac8e 100644
--- a/parsing/g_constr.ml4
+++ b/parsing/g_constr.ml4
@@ -84,8 +84,9 @@ GEXTEND Gram
c = constr; "in"; c1 = constr ->
<:ast< (CASE "NOREC" "SYNTH" $c (LAMBDALIST (ISEVAR)
($SLAM $b $c1))) >>
- | IDENT "let"; id1 = IDENT ; "="; c = constr; "in";
- c1 = constr -> <:ast< (ABST #Core#let.cci $c [$id1]$c1) >>
+ | IDENT "let"; id1 = IDENT ; "="; c = constr; "in"; c1 = constr ->
+ <:ast< (LETIN $c [$id1]$c1) >>
+(* <:ast< (ABST #Core#let.cci $c [$id1]$c1) >>*)
| IDENT "if"; c1 = constr; IDENT "then"; c2 = constr;
IDENT "else"; c3 = constr ->
<:ast< ( CASE "NOREC" "SYNTH" $c1 $c2 $c3) >>
@@ -141,11 +142,13 @@ GEXTEND Gram
[ [ ","; idl = ne_ident_comma_list -> idl
| -> [] ] ]
;
- vardecls:
+ vardecls: (* This is interpreted by Pcoq.abstract_binder *)
[ [ id = ident; idl = ident_comma_list_tail; c = type_option ->
<:ast< (BINDER $c $id ($LIST $idl)) >>
+ | id = ident; ":="; c = constr ->
+ <:ast< (LETIN $c $id) >>
| id = ident; "="; c = constr ->
- <:ast< (ABST #Core#let.cci $c $id) >> ] ]
+ <:ast< (LETIN $c $id) >> ] ]
;
ne_vardecls_list:
[ [ id = vardecls; ";"; idl = ne_vardecls_list -> id :: idl
diff --git a/parsing/pattern.ml b/parsing/pattern.ml
index e3fa611ed..ff747d4e3 100644
--- a/parsing/pattern.ml
+++ b/parsing/pattern.ml
@@ -2,7 +2,7 @@
(* $Id$ *)
open Util
-open Generic
+(*i open Generic i*)
open Names
open Term
open Reduction
@@ -14,7 +14,6 @@ type constr_pattern =
| PApp of constr_pattern * constr_pattern array
| PSoApp of int * constr_pattern list
| PBinder of binder_kind * name * constr_pattern * constr_pattern
- | PLet of identifier * constr_pattern * constr_pattern * constr_pattern
| PSort of rawsort
| PMeta of int option
| PCase of constr_pattern option * constr_pattern * constr_pattern array
@@ -32,9 +31,6 @@ let rec occur_meta_pattern = function
| PCase(Some p,c,br) ->
(occur_meta_pattern p) or
(occur_meta_pattern c) or (array_exists occur_meta_pattern br)
- | PLet(id,a,t,c) ->
- (occur_meta_pattern a) or (occur_meta_pattern t)
- or (occur_meta_pattern c)
| PMeta _ | PSoApp _ -> true
| PRel _ | PSort _ -> false
@@ -62,10 +58,9 @@ let label_of_ref = function
let rec head_pattern_bound t =
match t with
- | PBinder (BProd,_,_,b) -> head_pattern_bound b
+ | PBinder ((BProd|BLetIn),_,_,b) -> head_pattern_bound b
| PApp (c,args) -> head_pattern_bound c
| PCase (p,c,br) -> head_pattern_bound c
- | PLet (id,a,t,c) -> head_pattern_bound c
| PRef r -> label_of_ref r
| PRel _ | PMeta _ | PSoApp _ | PSort _ -> raise BoundPattern
| PBinder(BLambda,_,_,_) -> anomaly "head_pattern_bound: not a type"
@@ -96,7 +91,7 @@ let head_of_constr_reference = function
When we reach a second-order application, we ask that the
intersection of the free-rels of the term and the current stack be
contained in the arguments of the application, and in that case, we
- construct a DLAM with the names on the stack.
+ construct a LAMBDA with the names on the stack.
*)
@@ -109,12 +104,12 @@ let constrain ((n : int),(m : constr)) sigma =
else
(n,m)::sigma
-let build_dlam toabstract stk (m : constr) =
+let build_lambda toabstract stk (m : constr) =
let rec buildrec m p_0 p_1 = match p_0,p_1 with
| (_, []) -> m
- | (n, (na::tl)) ->
+ | (n, (na,t)::tl) ->
if List.mem n toabstract then
- buildrec (DLAM(na,m)) (n+1) tl
+ buildrec (mkLambda (na,t,m)) (n+1) tl
else
buildrec (pop m) (n+1) tl
in
@@ -140,7 +135,7 @@ let matches_core convert pat c =
args in
let frels = Intset.elements (free_rels cT) in
if list_subset frels relargs then
- constrain (n,build_dlam relargs stk cT) sigma
+ constrain (n,build_lambda relargs stk cT) sigma
else
raise PatternMatchingFailure
@@ -176,10 +171,13 @@ let matches_core convert pat c =
arg1 (Array.of_list arg2)
| PBinder(BProd,na1,c1,d1), IsProd(na2,c2,d2) ->
- sorec (na2::stk) (sorec stk sigma c1 c2) d1 d2
+ sorec ((na2,c2)::stk) (sorec stk sigma c1 c2) d1 d2
| PBinder(BLambda,na1,c1,d1), IsLambda(na2,c2,d2) ->
- sorec (na2::stk) (sorec stk sigma c1 c2) d1 d2
+ sorec ((na2,c2)::stk) (sorec stk sigma c1 c2) d1 d2
+
+ | PBinder(BLetIn,na1,c1,d1), IsLetIn(na2,c2,t2,d2) ->
+ sorec ((na2,t2)::stk) (sorec stk sigma c1 c2) d1 d2
| PRef (RConst (sp1,ctxt1)), IsConst (sp2,ctxt2)
when sp1 = sp2 && eq_context ctxt1 ctxt2 -> sigma
@@ -194,7 +192,7 @@ let matches_core convert pat c =
array_fold_left2 (sorec stk) (sorec stk sigma a1 a2)
br1 br2
- | (PLet _,_) | _,(IsFix _ | IsCoFix _) ->
+ | _,(IsFix _ | IsCoFix _) ->
error "somatch: not implemented"
| _ -> raise PatternMatchingFailure
@@ -222,45 +220,57 @@ let rec try_matches nocc pat = function
(* Tries to match a subterm of [c] with [pat] *)
let rec sub_match nocc pat c =
- match c with
- | DOP2 (Cast,c1,c2) ->
+ match kind_of_term c with
+ | IsCast (c1,c2) ->
(try authorized_occ nocc ((matches pat c),DOP0 (Meta (-1))) with
| PatternMatchingFailure ->
let (lm,lc) = try_sub_match nocc pat [c1] in
- (lm,DOP2 (Cast,List.hd lc,c2))
+ (lm,mkCast (List.hd lc, c2))
| NextOccurrence nocc ->
let (lm,lc) = try_sub_match (nocc - 1) pat [c1] in
- (lm,DOP2 (Cast,List.hd lc,c2)))
- | DOP2 (ne,c1,DLAM (x,c2)) ->
+ (lm,mkCast (List.hd lc, c2)))
+ | IsLambda (x,c1,c2) ->
(try authorized_occ nocc ((matches pat c),DOP0 (Meta (-1))) with
| PatternMatchingFailure ->
let (lm,lc) = try_sub_match nocc pat [c1;c2] in
- (lm,DOP2 (ne,List.hd lc,DLAM (x,List.nth lc 1)))
+ (lm,mkLambda (x,List.hd lc,List.nth lc 1))
| NextOccurrence nocc ->
let (lm,lc) = try_sub_match (nocc - 1) pat [c1;c2] in
- (lm,DOP2 (ne,List.hd lc,DLAM (x,List.nth lc 1))))
- | DOPN (AppL,a) when Array.length a <> 0 ->
- let c1 = a.(0)
- and lc = List.tl (Array.to_list a) in
+ (lm,mkLambda (x,List.hd lc,List.nth lc 1)))
+ | IsProd (x,c1,c2) ->
(try authorized_occ nocc ((matches pat c),DOP0 (Meta (-1))) with
| PatternMatchingFailure ->
- let (lm,le) = try_sub_match nocc pat (c1::lc) in
- (lm,DOPN (AppL,Array.of_list le))
+ let (lm,lc) = try_sub_match nocc pat [c1;c2] in
+ (lm,mkProd (x,List.hd lc,List.nth lc 1))
| NextOccurrence nocc ->
- let (lm,le) = try_sub_match (nocc - 1) pat (c1::lc) in
- (lm,DOPN (AppL,Array.of_list le)))
- | DOPN (MutCase ci,v) ->
- let hd = v.(0)
- and c1 = v.(1)
- and lc = Array.to_list (Array.sub v 2 (Array.length v - 2)) in
+ let (lm,lc) = try_sub_match (nocc - 1) pat [c1;c2] in
+ (lm,mkProd (x,List.hd lc,List.nth lc 1)))
+ | IsLetIn (x,c1,t2,c2) ->
+ (try authorized_occ nocc ((matches pat c),DOP0 (Meta (-1))) with
+ | PatternMatchingFailure ->
+ let (lm,lc) = try_sub_match nocc pat [c1;t2;c2] in
+ (lm,mkLetIn (x,List.hd lc,List.nth lc 1,List.nth lc 2))
+ | NextOccurrence nocc ->
+ let (lm,lc) = try_sub_match (nocc - 1) pat [c1;t2;c2] in
+ (lm,mkLetIn (x,List.hd lc,List.nth lc 1,List.nth lc 2)))
+ | IsAppL (c1,lc) ->
(try authorized_occ nocc ((matches pat c),DOP0 (Meta (-1))) with
| PatternMatchingFailure ->
let (lm,le) = try_sub_match nocc pat (c1::lc) in
- (lm,DOPN (MutCase ci,Array.of_list (hd::le)))
+ (lm,mkAppL (Array.of_list le))
| NextOccurrence nocc ->
let (lm,le) = try_sub_match (nocc - 1) pat (c1::lc) in
- (lm,DOPN (MutCase ci,Array.of_list (hd::le))))
- | c ->
+ (lm,mkAppL (Array.of_list le)))
+ | IsMutCase (ci,hd,c1,lc) ->
+ (try authorized_occ nocc ((matches pat c),DOP0 (Meta (-1))) with
+ | PatternMatchingFailure ->
+ let (lm,le) = try_sub_match nocc pat (c1::Array.to_list lc) in
+ (lm,mkMutCase (ci,hd,List.hd le,List.tl le))
+ | NextOccurrence nocc ->
+ let (lm,le) = try_sub_match (nocc - 1) pat (c1::Array.to_list lc) in
+ (lm,mkMutCase (ci,hd,List.hd le,List.tl le)))
+ | IsMutConstruct _ | IsFix _ | IsMutInd _|IsCoFix _ |IsEvar _|IsConst _
+ | IsRel _|IsMeta _|IsVar _|IsXtra _|IsSort _|IsAbst (_, _) ->
(try authorized_occ nocc ((matches pat c),DOP0 (Meta (-1))) with
| PatternMatchingFailure -> raise (NextOccurrence nocc)
| NextOccurrence nocc -> raise (NextOccurrence (nocc - 1)))
@@ -295,6 +305,8 @@ let rec pattern_of_constr t =
| IsSort (Prop c) -> PSort (RProp c)
| IsSort (Type _) -> PSort RType
| IsCast (c,_) -> pattern_of_constr c
+ | IsLetIn (na,c,_,b) ->
+ PBinder (BLetIn,na,pattern_of_constr c,pattern_of_constr b)
| IsProd (na,c,b) ->
PBinder (BProd,na,pattern_of_constr c,pattern_of_constr b)
| IsLambda (na,c,b) ->
diff --git a/parsing/pattern.mli b/parsing/pattern.mli
index 803e4fffe..5506e070d 100644
--- a/parsing/pattern.mli
+++ b/parsing/pattern.mli
@@ -14,7 +14,6 @@ type constr_pattern =
| PApp of constr_pattern * constr_pattern array
| PSoApp of int * constr_pattern list
| PBinder of binder_kind * name * constr_pattern * constr_pattern
- | PLet of identifier * constr_pattern * constr_pattern * constr_pattern
| PSort of Rawterm.rawsort
| PMeta of int option
| PCase of constr_pattern option * constr_pattern * constr_pattern array
diff --git a/parsing/pretty.ml b/parsing/pretty.ml
index 28c4cb3a9..123f690a8 100644
--- a/parsing/pretty.ml
+++ b/parsing/pretty.ml
@@ -4,7 +4,7 @@
open Pp
open Util
open Names
-open Generic
+(*i open Generic i*)
open Term
open Declarations
open Inductive
@@ -298,10 +298,12 @@ let print_full_context_typ () = print_context false (Lib.contents_after None)
assume that the declaration of constructors and eliminations
follows the definition of the inductive type *)
-let rec head_const c = match strip_outer_cast c with
- | DOP2(Prod,_,DLAM(_,c)) -> head_const c
- | DOPN(AppL,cl) -> head_const (array_hd cl)
- | def -> def
+let rec head_const c = match kind_of_term c with
+ | IsProd (_,_,d) -> head_const d
+ | IsLetIn (_,_,_,d) -> head_const d
+ | IsAppL (f,_) -> head_const f
+ | IsCast (d,_) -> head_const d
+ | _ -> c
let list_filter_vec f vec =
let rec frec n lf =
@@ -488,11 +490,11 @@ let fprint_judge {uj_val=trm;uj_type=typ} =
[< fprterm trm; 'sTR" : " ; fprterm (body_of_type typ) >]
let unfold_head_fconst =
- let rec unfrec = function
- | DOPN(Const _,_) as k -> constant_value (Global.env ()) k
- | DOP2(Lambda,t,DLAM(na,b)) -> DOP2(Lambda,t,DLAM(na,unfrec b))
- | DOPN(AppL,v) -> DOPN(AppL,array_cons (unfrec (array_hd v)) (array_tl v))
- | x -> x
+ let rec unfrec k = match kind_of_term k with
+ | IsConst _ -> constant_value (Global.env ()) k
+ | IsLambda (na,t,b) -> mkLambda (na,t,unfrec b)
+ | IsAppL (f,v) -> applist (unfrec f,v)
+ | _ -> k
in
unfrec
diff --git a/parsing/termast.ml b/parsing/termast.ml
index ff8222e4e..98aed4f56 100644
--- a/parsing/termast.ml
+++ b/parsing/termast.ml
@@ -5,7 +5,7 @@ open Pp
open Util
open Univ
open Names
-open Generic
+(*i open Generic i*)
open Term
open Inductive
open Sign
@@ -217,6 +217,8 @@ let rec ast_of_raw = function
| RBinder (_,BProd,Anonymous,t,c) ->
(* Anonymous product are never factorized *)
ope("PROD",[ast_of_raw t; slam(None,ast_of_raw c)])
+ | RBinder (_,BLetIn,na,t,c) ->
+ ope("LETIN",[ast_of_raw t; slam(stringopt_of_name na,ast_of_raw c)])
| RBinder (_,bk,na,t,c) ->
let (n,a) = factorize_binder 1 bk na (ast_of_raw t) c in
let tag = match bk with
@@ -226,6 +228,7 @@ let rec ast_of_raw = function
(* non dépendant, pour isoler l'implication; peut-ętre un *)
(* constructeur ARROW serait-il plus justifié ? *)
| BProd -> if n=1 then "PROD" else "PRODLIST"
+ | BLetIn -> if n=1 then "LETIN" else "LETINLIST"
in
ope(tag,[ast_of_raw t;a])
@@ -270,7 +273,7 @@ let rec ast_of_raw = function
alfi
in
ope("FIX", alfi.(n)::(Array.to_list listdecl))
- | RCofix n ->
+ | RCoFix n ->
let listdecl =
Array.mapi
(fun i fi ->
@@ -345,9 +348,11 @@ let occur_id env id0 c =
| DOPN(_,cl) -> array_exists (occur n) cl
| DOP1(_,c) -> occur n c
| DOP2(_,c1,c2) -> (occur n c1) or (occur n c2)
- | DOPL(_,cl) -> List.exists (occur n) cl
| DLAM(_,c) -> occur (n+1) c
| DLAMV(_,v) -> array_exists (occur (n+1)) v
+ | CLam (_,t,c) -> occur n (body_of_type t) or occur (n+1) c
+ | CPrd (_,t,c) -> occur n (body_of_type t) or occur (n+1) c
+ | CLet (_,b,t,c) -> occur n b or occur n (body_of_type t) or occur (n+1) c
| Rel p ->
p>n &
(try lookup_name_of_rel (p-n) env = Name id0
@@ -366,33 +371,26 @@ let next_name_not_occuring name l env t =
(* Remark: Anonymous var may be dependent in Evar's contexts *)
let concrete_name islam l env n c =
- if n = Anonymous & not (dependent (Rel 1) c) then
+ if n = Anonymous & not (dependent (mkRel 1) c) then
(None,l)
else
let fresh_id = next_name_not_occuring n l env c in
let idopt =
- if islam or dependent (Rel 1) c then (Some fresh_id) else None in
+ if islam or dependent (mkRel 1) c then (Some fresh_id) else None in
(idopt, fresh_id::l)
(* Returns the list of global variables and constants in a term *)
let global_vars_and_consts t =
- let rec collect acc = function
- | VAR id -> id::acc
- | DOPN (Const sp,cl) -> (basename sp)::(Array.fold_left collect acc cl)
- | DOPN (Abst sp,cl) -> (basename sp)::(Array.fold_left collect acc cl)
- | DOPN (MutInd ind_sp, cl) as t ->
- (basename (path_of_inductive_path ind_sp))
- ::(Array.fold_left collect acc cl)
- | DOPN (MutConstruct cstr_sp, cl) as t ->
- (basename (path_of_constructor_path cstr_sp))
- ::(Array.fold_left collect acc cl)
- | DOPN(_,cl) -> Array.fold_left collect acc cl
- | DOP1(_,c) -> collect acc c
- | DOP2(_,c1,c2) -> collect (collect acc c1) c2
- | DOPL(_,cl) -> List.fold_left collect acc cl
- | DLAM(_,c) -> collect acc c
- | DLAMV(_,v) -> Array.fold_left collect acc v
- | _ -> acc
+ let rec collect acc c =
+ let op, cl = splay_constr c in
+ let acc' = Array.fold_left collect acc cl in
+ match op with
+ | OpVar id -> id::acc'
+ | OpConst sp -> (basename sp)::acc'
+ | OpAbst sp -> (basename sp)::acc'
+ | OpMutInd ind_sp -> (basename (path_of_inductive_path ind_sp))::acc'
+ | OpMutConstruct csp -> (basename (path_of_constructor_path csp))::acc'
+ | _ -> acc'
in
list_uniquize (collect [] t)
@@ -403,40 +401,6 @@ let used_of = global_vars_and_consts
(* These functions implement a light form of Termenv.mind_specif_of_mind *)
(* specially for handle Cases printing; they respect arities but not typing *)
-(*
-let mind_specif_of_mind_light (sp,tyi) =
- let mib = Global.lookup_mind sp in
- (mib,mind_nth_type_packet mib tyi)
-
-let rec remove_indtypes = function
- | (1, DLAMV(_,cl)) -> cl
- | (n, DLAM (_,c)) -> remove_indtypes (n-1, c)
- | _ -> anomaly "remove_indtypes: bad list of constructors"
-
-let rec remove_params n t =
- if n = 0 then
- t
- else
- match t with
- | DOP2(Prod,_,DLAM(_,c)) -> remove_params (n-1) c
- | DOP2(Cast,c,_) -> remove_params n c
- | _ -> anomaly "remove_params : insufficiently quantified"
-
-let rec get_params = function
- | DOP2(Prod,_,DLAM(x,c)) -> x::(get_params c)
- | DOP2(Cast,c,_) -> get_params c
- | _ -> []
-
-let lc_of_lmis (mib,mip) =
- let lc = remove_indtypes (mib.mind_ntypes,mip.mind_lc) in
- Array.map (remove_params mib.mind_nparams) lc
-
-let sp_of_spi ((sp,_) as spi) =
- let (_,mip) = mind_specif_of_mind_light spi in
- let (pa,_,k) = repr_path sp in
- make_path pa (mip.mind_typename) k
-*)
-
let bdize_app c al =
let impl =
match c with
@@ -471,13 +435,13 @@ let computable p k =
sinon on perd la réciprocité de la synthčse (qui, lui,
engendrera un prédicat non dépendant) *)
- let rec striprec = function
- | (0,DOP2(Lambda,_,DLAM(_,d))) -> false
- | (0,d ) -> noccur_between 1 k d
- | (n,DOP2(Lambda,_,DLAM(_,d))) -> striprec (n-1,d)
- | _ -> false
+ let rec striprec n c = match n,kind_of_term c with
+ | (0,IsLambda (_,_,d)) -> false
+ | (0,_) -> noccur_between 1 k c
+ | (n,IsLambda (_,_,d)) -> striprec (n-1) d
+ | _ -> false
in
- striprec (k,p)
+ striprec k p
let ids_of_var cl =
List.map
@@ -500,7 +464,7 @@ let old_bdize at_top env t =
| (None,avoid') ->
slam(None,bdrec avoid' env (pop c)))
| DLAMV(na,cl) ->
- if not(array_exists (dependent (Rel 1)) cl) then
+ if not(array_exists (dependent (mkRel 1)) cl) then
slam(None,ope("V$",array_map_to_list
(fun c -> bdrec avoid env (pop c)) cl))
else
@@ -535,6 +499,9 @@ let old_bdize at_top env t =
bdrec avoid env c1
else
ope("CAST",[bdrec avoid env c1;bdrec avoid env c2])
+ | IsLetIn (na,b,_,c) ->
+ ope("LETIN",[bdrec [] env b;
+ slam(stringopt_of_name na,bdrec avoid env (pop c))])
| IsProd (Anonymous,ty,c) ->
(* Anonymous product are never factorized *)
ope("PROD",[bdrec [] env ty;
@@ -612,36 +579,38 @@ let old_bdize at_top env t =
(fun env id -> add_name (Name id) env) env lfi in
let def_avoid = lfi@avoid in
let f = List.nth lfi n in
- let rec split_lambda binds env avoid = function
- | (0, t) -> (binds,bdrec avoid env t)
- | (n, DOP2(Cast,t,_)) -> split_lambda binds env avoid (n,t)
- | (n, DOP2(Lambda,t,DLAM(na,b))) ->
+ let rec split_lambda binds env avoid n t =
+ match (n,kind_of_term t) with
+ | (0, _) -> (binds,bdrec avoid env t)
+ | (n, IsCast (t,_)) -> split_lambda binds env avoid n t
+ | (n, IsLambda (na,t,b)) ->
let ast = bdrec avoid env t in
let id = next_name_away na avoid in
let ast_of_bind =
ope("BINDER",[ast;nvar (string_of_id id)]) in
let new_env = add_name (Name id) env in
split_lambda (ast_of_bind::binds)
- new_env (id::avoid) (n-1,b)
+ new_env (id::avoid) (n-1) b
| _ -> error "split_lambda"
in
- let rec split_product env avoid = function
- | (0, t) -> bdrec avoid env t
- | (n, DOP2(Cast,t,_)) -> split_product env avoid (n,t)
- | (n, DOP2(Prod,t,DLAM(na,b))) ->
+ let rec split_product env avoid n t =
+ match (n,kind_of_term t) with
+ | (0, _) -> bdrec avoid env t
+ | (n, IsCast (t,_)) -> split_product env avoid n t
+ | (n, IsProd (na,t,b)) ->
let ast = bdrec avoid env t in
let id = next_name_away na avoid in
let new_env = add_name (Name id) env in
- split_product new_env (id::avoid) (n-1,b)
+ split_product new_env (id::avoid) (n-1) b
| _ -> error "split_product"
in
let listdecl =
list_map_i
(fun i fi ->
let (lparams,ast_of_def) =
- split_lambda [] def_env def_avoid (nv.(i)+1,vt.(i)) in
+ split_lambda [] def_env def_avoid (nv.(i)+1) vt.(i) in
let ast_of_typ =
- split_product env avoid (nv.(i)+1,cl.(i)) in
+ split_product env avoid (nv.(i)+1) cl.(i) in
ope("FDECL",
[nvar (string_of_id fi);
ope ("BINDERS",List.rev lparams);
@@ -680,7 +649,7 @@ let old_bdize at_top env t =
| n, DOP2(Lambda,_,DLAM(x,b))
-> let x'=
- if not print_underscore or (dependent (Rel 1) b) then x
+ if not print_underscore or (dependent (mkRel 1) b) then x
else Anonymous in
let id = next_name_away x' avoid in
let new_env = (add_name (Name id) env) in
@@ -769,6 +738,10 @@ let rec ast_of_pattern env = function
ope("SOAPP",(ope ("META",[num n]))::
(List.map (ast_of_pattern env) args))
+ | PBinder (BLetIn,na,b,c) ->
+ let c' = ast_of_pattern (add_name na env) c in
+ ope("LETIN",[ast_of_pattern env b;slam(stringopt_of_name na,c')])
+
| PBinder (BProd,Anonymous,t,c) ->
ope("PROD",[ast_of_pattern env t; slam(None,ast_of_pattern env c)])
| PBinder (bk,na,t,c) ->
@@ -782,14 +755,10 @@ let rec ast_of_pattern env = function
(* non dépendant, pour isoler l'implication; peut-ętre un *)
(* constructeur ARROW serait-il plus justifié ? *)
| BProd -> if n=1 then "PROD" else "PRODLIST"
+ | BLetIn -> anomaly "Should be captured before"
in
ope(tag,[ast_of_pattern env t;a])
- | PLet (id,a,t,c) ->
- let c' = ast_of_pattern (add_name (Name id) env) c in
- ope("LET",[ast_of_pattern env a; slam(Some (string_of_id id),c')])
-
-
| PCase (typopt,tm,bv) ->
warning "Old Case syntax";
ope("MUTCASE",(ast_of_patopt env typopt)
diff --git a/pretyping/cases.ml b/pretyping/cases.ml
index 1d25ba84d..b01b3e283 100644
--- a/pretyping/cases.ml
+++ b/pretyping/cases.ml
@@ -1,7 +1,7 @@
open Util
open Names
-open Generic
+(*i open Generic i*)
open Term
open Declarations
open Inductive
@@ -22,7 +22,7 @@ open Evarconv
(* This was previously in Indrec but creates existential holes *)
let mkExistential isevars env =
- new_isevar isevars env (mkCast dummy_sort dummy_sort) CCI
+ new_isevar isevars env (mkCast (dummy_sort, dummy_sort)) CCI
let norec_branch_scheme env isevars cstr =
it_mkProd_or_LetIn (mkExistential isevars env) cstr.cs_args
@@ -31,14 +31,16 @@ let rec_branch_scheme env isevars ((sp,j),_) recargs cstr =
let rec crec (args,recargs) =
match args, recargs with
| (name,None,c)::rea,(ra::reca) ->
- DOP2(Prod,body_of_type c,DLAM(name,
- match ra with
- | Mrec k when k=j ->
- mkArrow (mkExistential isevars env)
- (crec (List.rev (lift_rel_context 1 (List.rev rea)),reca))
- | _ -> crec (rea,reca)))
- | (name,Some d,c)::rea, reca -> failwith "TODO"
-(* mkLetIn (name,d,body_of_type c,crec (rea,reca))) *)
+ let d =
+ match ra with
+ | Mrec k when k=j ->
+ mkArrow (mkExistential isevars env)
+ (crec (List.rev (lift_rel_context 1 (List.rev rea)),reca))
+ | _ -> crec (rea,reca) in
+ mkProd (name, body_of_type c, d)
+
+ | (name,Some d,c)::rea, reca ->
+ mkLetIn (name, d, body_of_type c, crec (rea,reca))
| [],[] -> mkExistential isevars env
| _ -> anomaly "rec_branch_scheme"
in
@@ -58,9 +60,9 @@ let branch_scheme env isevars isrec (IndFamily (mis,params) as indf) =
let concl_n env sigma =
let rec decrec m c = if m = 0 then c else
- match whd_betadeltaiota env sigma c with
- | DOP2(Prod,_,DLAM(n,c_0)) -> decrec (m-1) c_0
- | _ -> failwith "Typing.concl_n"
+ match kind_of_term (whd_betadeltaiota env sigma c) with
+ | IsProd (n,_,c_0) -> decrec (m-1) c_0
+ | _ -> failwith "Typing.concl_n"
in
decrec
@@ -378,9 +380,9 @@ let dependencies_in_rhs nargs eqns =
already dependent *)
let rec is_dep_on_previous n t = function
- | ((_,IsInd _),_)::_ when dependent (Rel n) t -> DepOnPrevious
+ | ((_,IsInd _),_)::_ when dependent (mkRel n) t -> DepOnPrevious
| ((_,NotInd _),(DepOnPrevious,DepInRhs))::_
- when dependent (Rel n) t -> DepOnPrevious
+ when dependent (mkRel n) t -> DepOnPrevious
| _::rest -> is_dep_on_previous (n+1) t rest
| [] -> NotDepOnPrevious
@@ -513,11 +515,13 @@ let noccur_between_without_evar n m term =
| VAR _ -> ()
| DOPN(Evar _,cl) -> ()
| DOPN(_,cl) -> Array.iter (occur_rec n) cl
- | DOPL(_,cl) -> List.iter (occur_rec n) cl
| DOP1(_,c) -> occur_rec n c
| DOP2(_,c1,c2) -> occur_rec n c1; occur_rec n c2
| DLAM(_,c) -> occur_rec (n+1) c
| DLAMV(_,v) -> Array.iter (occur_rec (n+1)) v
+ | CLam (_,t,c) -> occur_rec n (body_of_type t); occur_rec (n+1) c
+ | CPrd (_,t,c) -> occur_rec n (body_of_type t); occur_rec (n+1) c
+ | CLet (_,b,t,c) -> occur_rec n b; occur_rec n (body_of_type t); occur_rec (n+1) c
| _ -> ()
in
try occur_rec n term; true with Occur -> false
@@ -645,7 +649,7 @@ let rec weaken_predicate n pred =
let rec extract_predicate = function
| PrProd ((_,na,t),pred) ->
- mkProd na (type_of_tomatch_type t) (extract_predicate pred)
+ mkProd (na, type_of_tomatch_type t, extract_predicate pred)
| PrLetIn ((args,Some c),pred) -> substl (c::(List.rev args)) (extract_predicate pred)
| PrLetIn ((args,None),pred) -> substl (List.rev args) (extract_predicate pred)
| PrCcl ccl -> ccl
@@ -962,9 +966,9 @@ let build_expected_arity env isevars isdep tomatchl =
| tm::ltm ->
let (ty1,aritysign) = cook n tm in
let rec follow n = function
- | (na,ty2)::sign -> DOP2(Prod,ty2,DLAM(na,follow (n+1) sign))
+ | (na,ty2)::sign -> mkProd (na, ty2, follow (n+1) sign)
| _ ->
- if isdep then DOP2(Prod,ty1,DLAM(Anonymous,buildrec (n+1) ltm))
+ if isdep then mkProd (Anonymous, ty1, buildrec (n+1) ltm)
else buildrec n ltm
in follow n (List.rev aritysign)
in buildrec 0 tomatchl
@@ -988,17 +992,18 @@ let build_initial_predicate isdep pred tomatchl =
in buildrec 0 pred tomatchl
let rec eta_expand0 env sigma n c t =
- match whd_betadeltaiota env sigma t with
- DOP2(Prod,a,DLAM(na,b)) ->
- DOP2(Lambda,a,DLAM(na,eta_expand0 env sigma (n+1) c b))
- | _ -> applist (lift n c, rel_list 0 n)
+ match kind_of_term (whd_betadeltaiota env sigma t) with
+ | IsProd (na,a,b) -> mkLambda (na,a,eta_expand0 env sigma (n+1) c b)
+ | _ -> applist (lift n c, rel_list 0 n)
let rec eta_expand env sigma c t =
- match whd_betadeltaiota env sigma c, whd_betadeltaiota env sigma t with
- | (DOP2(Lambda,ta,DLAM(na,cb)), DOP2(Prod,_,DLAM(_,tb))) ->
- DOP2(Lambda,ta,DLAM(na,eta_expand env sigma cb tb))
- | (c, t) -> eta_expand0 env sigma 0 c t
+ let c' = whd_betadeltaiota env sigma c in
+ let t' = whd_betadeltaiota env sigma t in
+ match kind_of_term c', kind_of_term t' with
+ | IsLambda (na,ta,cb), IsProd (_,_,tb) ->
+ mkLambda (na,ta,eta_expand env sigma cb tb)
+ | _, _ -> eta_expand0 env sigma 0 c' t'
(* determines wether the multiple case is dependent or not. For that
* the predicate given by the user is eta-expanded. If the result
diff --git a/pretyping/class.ml b/pretyping/class.ml
index 419bd1bf3..5c56ce9b6 100644
--- a/pretyping/class.ml
+++ b/pretyping/class.ml
@@ -4,7 +4,7 @@
open Util
open Pp
open Names
-open Generic
+(*i open Generic i*)
open Term
open Inductive
open Declarations
@@ -129,6 +129,7 @@ let constructor_at_head1 t =
| IsAppL(f,args) ->
let t',_,l,c,_ = aux f in t',args,l,c,List.length args
| IsProd (_,_,_) -> t',[],[],CL_FUN,0
+ | IsLetIn (_,_,_,c) -> aux c
| IsSort _ -> t',[],[],CL_SORT,0
| _ -> raise Not_found
in
@@ -203,23 +204,15 @@ let get_target t ind =
let v2,_,_,cl2,p2 = constructor_at_head1 t in cl2,p2,v2
let prods_of t =
- let rec aux acc = function
- | DOP2(Prod,c1,DLAM(_,c2)) -> aux (c1::acc) c2
- | (DOP2(Cast,c,_)) -> aux acc c
- | t -> t::acc
+ let rec aux acc d = match kind_of_term d with
+ | IsProd (_,c1,c2) -> aux (c1::acc) c2
+ | IsCast (c,_) -> aux acc c
+ | _ -> d::acc
in
aux [] t
(* coercion identite' *)
-let lams_of t =
- let rec aux acc = function
- | DOP2(Lambda,c1,DLAM(x,c2)) -> aux ((x,c1)::acc) c2
- | DOP2(Cast,c,_) -> aux acc c
- | t -> acc,t
- in
- aux [] t
-
let build_id_coercion idf_opt ids =
let env = Global.env () in
let vs = construct_reference env CCI ids in
@@ -234,24 +227,22 @@ let build_id_coercion idf_opt ids =
[< 'sTR(string_of_id ids);
'sTR" must be a transparent constant" >]
in
- let lams,t = lams_of c in
- let lams = List.rev lams in
+ let lams,t = Sign.decompose_lam_assum c in
let llams = List.length lams in
+ let lams = List.rev lams in
let val_f =
- List.fold_right
- (fun (x,t) u -> DOP2(Lambda,t,DLAM(x,u)))
- lams
- (DOP2(Lambda,(applistc vs (rel_list 0 llams)),
- DLAM(Name (id_of_string "x"),Rel 1)))
+ it_mkLambda_or_LetIn
+ (mkLambda (Name (id_of_string "x"),
+ applistc vs (rel_list 0 llams),
+ Rel 1))
+ lams
in
let typ_f =
- List.fold_right
- (fun (x,t) c -> DOP2(Prod,t,DLAM(x,c)))
+ it_mkProd_wo_LetIn
+ (mkProd (Anonymous, applistc vs (rel_list 0 llams), lift 1 t))
lams
- (DOP2(Prod,(applistc vs (rel_list 0 llams)),
- DLAM(Anonymous,lift 1 t)))
- in
- let constr_f = DOP2(Cast,val_f,typ_f) in
+ in
+ let constr_f = mkCast (val_f, typ_f) in
(* juste pour verification *)
let _ =
try
diff --git a/pretyping/classops.ml b/pretyping/classops.ml
index 230c2cb84..4e991a5fd 100755
--- a/pretyping/classops.ml
+++ b/pretyping/classops.ml
@@ -9,7 +9,7 @@ open Environ
open Libobject
open Declare
open Term
-open Generic
+(*i open Generic i*)
open Rawterm
(* usage qque peu general: utilise aussi dans record *)
@@ -188,14 +188,15 @@ let _ =
(* constructor_at_head : constr -> cl_typ * int *)
let constructor_at_head t =
- let rec aux t' = match t' with
- | VAR id -> CL_Var id,0
- | DOPN(Const sp,_) -> CL_SP sp,0
- | DOPN(MutInd ind_sp,_) -> CL_IND ind_sp,0
- | DOP2(Prod,_,DLAM(_,c)) -> CL_FUN,0
- | DOP0(Sort(_)) -> CL_SORT,0
- | DOP2(Cast,c,_) -> aux (collapse_appl c)
- | DOPN(AppL,cl) -> let c,_ = aux (array_hd cl) in c,Array.length(cl)-1
+ let rec aux t' = match kind_of_term t' with
+ | IsVar id -> CL_Var id,0
+ | IsConst (sp,_) -> CL_SP sp,0
+ | IsMutInd (ind_sp,_) -> CL_IND ind_sp,0
+ | IsProd (_,_,c) -> CL_FUN,0
+ | IsLetIn (_,_,_,c) -> aux c
+ | IsSort _ -> CL_SORT,0
+ | IsCast (c,_) -> aux (collapse_appl c)
+ | IsAppL (f,args) -> let c,_ = aux f in c, List.length args
| _ -> raise Not_found
in
aux (collapse_appl t)
@@ -230,11 +231,11 @@ let fully_applied id p p1 =
if p <> p1 then errorlabstrm "fully_applied"
[< 'sTR"Wrong number of parameters for ";'sTR(string_of_id id) >]
-let rec arity_sort = function
- | DOP0(Sort(Prop(_))) -> 0
- | DOP0(Sort(Type(_))) -> 0
- | DOP2(Prod,_,DLAM(_,c)) -> (arity_sort c) +1
- | DOP2(Cast,c,_) -> arity_sort c
+let rec arity_sort a = match kind_of_term a with
+ | IsSort (Prop _ | Type _) -> 0
+ | IsProd (_,_,c) -> (arity_sort c) +1
+ | IsLetIn (_,_,_,c) -> arity_sort c (* Utile ?? *)
+ | IsCast (c,_) -> arity_sort c
| _ -> raise Not_found
let stre_of_cl = function
diff --git a/pretyping/coercion.ml b/pretyping/coercion.ml
index 8269a4741..d4a7ef4a6 100644
--- a/pretyping/coercion.ml
+++ b/pretyping/coercion.ml
@@ -1,7 +1,7 @@
(* $Id$ *)
open Util
-open Generic
+(*i open Generic i*)
open Names
open Term
open Reduction
@@ -30,8 +30,8 @@ let apply_coercion_args env argl funj =
uj_type= typed_app (fun _ -> typ) funj.uj_type }
| h::restl ->
(* On devrait pouvoir s'arranger pour qu'on ait pas ŕ faire hnf_constr *)
- match whd_betadeltaiota env Evd.empty typ with
- | DOP2(Prod,c1,DLAM(_,c2)) ->
+ match kind_of_term (whd_betadeltaiota env Evd.empty typ) with
+ | IsProd (_,c1,c2) ->
(* Typage garanti par l'appel a app_coercion*)
apply_rec (h::acc) (subst1 h c2) restl
| _ -> anomaly "apply_coercion_args"
@@ -60,8 +60,9 @@ let apply_pcoercion env p hj typ_cl =
with _ -> anomaly "apply_pcoercion"
let inh_app_fun env isevars j =
- match whd_betadeltaiota env !isevars (body_of_type j.uj_type) with
- | DOP2(Prod,_,DLAM(_,_)) -> j
+ let t = whd_betadeltaiota env !isevars (body_of_type j.uj_type) in
+ match kind_of_term t with
+ | IsProd (_,_,_) -> j
| _ ->
(try
let t,i1 = class_of1 env !isevars (body_of_type j.uj_type) in
@@ -116,13 +117,13 @@ let rec inh_conv_coerce_to_fail env isevars c1 hj =
inh_coerce_to_fail env isevars c1 hj
with NoCoercion -> (* try ... with _ -> ... is BAD *)
(* (match (hnf_constr !isevars t,hnf_constr !isevars c1) with*)
- (match (whd_betadeltaiota env !isevars t,
- whd_betadeltaiota env !isevars c1) with
- | (DOP2(Prod,t1,DLAM(_,t2)),DOP2(Prod,u1,DLAM(name,u2))) ->
+ (match kind_of_term (whd_betadeltaiota env !isevars t),
+ kind_of_term (whd_betadeltaiota env !isevars c1) with
+ | IsProd (_,t1,t2), IsProd (name,u1,u2) ->
(* let v' = hnf_constr !isevars v in *)
let v' = whd_betadeltaiota env !isevars v in
- if (match v' with
- | DOP2(Lambda,v1,DLAM(_,v2)) ->
+ if (match kind_of_term v' with
+ | IsLambda (_,v1,v2) ->
the_conv_x env isevars v1 u1 (* leq v1 u1? *)
| _ -> false)
then
@@ -162,7 +163,7 @@ let inh_conv_coerce_to loc env isevars cj tj =
let at = nf_ise1 !isevars (body_of_type tj) in
error_actual_type_loc loc env rcj.uj_val (body_of_type rcj.uj_type) at
in
- { uj_val = (* mkCast *) cj'.uj_val (* (body_of_type tj) *);
+ { uj_val = cj'.uj_val;
uj_type = tj }
let inh_apply_rel_list nocheck apploc env isevars argjl funj tycon =
@@ -179,8 +180,8 @@ let inh_apply_rel_list nocheck apploc env isevars argjl funj tycon =
| None -> resj)
| hj::restjl ->
- match whd_betadeltaiota env !isevars typ with
- | DOP2(Prod,c1,DLAM(_,c2)) ->
+ match kind_of_term (whd_betadeltaiota env !isevars typ) with
+ | IsProd (_,c1,c2) ->
let hj' =
if nocheck then
hj
diff --git a/pretyping/detyping.ml b/pretyping/detyping.ml
index 90697191a..596310512 100644
--- a/pretyping/detyping.ml
+++ b/pretyping/detyping.ml
@@ -5,7 +5,7 @@ open Pp
open Util
open Univ
open Names
-open Generic
+(*i open Generic i*)
open Term
open Inductive
open Sign
@@ -44,9 +44,11 @@ let occur_id env_names id0 c =
| DOPN(_,cl) -> array_exists (occur n) cl
| DOP1(_,c) -> occur n c
| DOP2(_,c1,c2) -> (occur n c1) or (occur n c2)
- | DOPL(_,cl) -> List.exists (occur n) cl
| DLAM(_,c) -> occur (n+1) c
| DLAMV(_,v) -> array_exists (occur (n+1)) v
+ | CLam (_,t,c) -> occur n (body_of_type t) or occur (n+1) c
+ | CPrd (_,t,c) -> occur n (body_of_type t) or occur (n+1) c
+ | CLet (_,b,t,c) -> occur n b or occur n (body_of_type t) or occur (n+1) c
| Rel p ->
p>n &
(try lookup_name_of_rel (p-n) env_names = Name id0
@@ -66,32 +68,25 @@ let next_name_not_occuring name l env_names t =
(* Remark: Anonymous var may be dependent in Evar's contexts *)
let concrete_name l env_names n c =
- if n = Anonymous & not (dependent (Rel 1) c) then
+ if n = Anonymous & not (dependent (mkRel 1) c) then
(None,l)
else
let fresh_id = next_name_not_occuring n l env_names c in
- let idopt = if dependent (Rel 1) c then (Some fresh_id) else None in
+ let idopt = if dependent (mkRel 1) c then (Some fresh_id) else None in
(idopt, fresh_id::l)
(* Returns the list of global variables and constants in a term *)
let global_vars_and_consts t =
- let rec collect acc = function
- | VAR id -> id::acc
- | DOPN (Const sp,cl) -> (basename sp)::(Array.fold_left collect acc cl)
- | DOPN (Abst sp,cl) -> (basename sp)::(Array.fold_left collect acc cl)
- | DOPN (MutInd ind_sp, cl) as t ->
- (basename (path_of_inductive_path ind_sp))
- ::(Array.fold_left collect acc cl)
- | DOPN (MutConstruct cstr_sp, cl) as t ->
- (basename (path_of_constructor_path cstr_sp))
- ::(Array.fold_left collect acc cl)
- | DOPN(_,cl) -> Array.fold_left collect acc cl
- | DOP1(_,c) -> collect acc c
- | DOP2(_,c1,c2) -> collect (collect acc c1) c2
- | DOPL(_,cl) -> List.fold_left collect acc cl
- | DLAM(_,c) -> collect acc c
- | DLAMV(_,v) -> Array.fold_left collect acc v
- | _ -> acc
+ let rec collect acc c =
+ let op, cl = splay_constr c in
+ let acc' = Array.fold_left collect acc cl in
+ match op with
+ | OpVar id -> id::acc'
+ | OpConst sp -> (basename sp)::acc'
+ | OpAbst sp -> (basename sp)::acc'
+ | OpMutInd ind_sp -> (basename (path_of_inductive_path ind_sp))::acc'
+ | OpMutConstruct csp -> (basename (path_of_constructor_path csp))::acc'
+ | _ -> acc'
in
list_uniquize (collect [] t)
@@ -156,7 +151,7 @@ module PrintingCasesMake =
let check (_,lc) =
if not (Test.test lc) then
errorlabstrm "check_encode" [< 'sTR Test.error_message >]
- let decode (spi,_) = sp_of_spi spi
+ let printer (spi,_) = [< 'sTR(string_of_path (sp_of_spi spi)) >]
let key = Goptions.SecondaryTable ("Printing",Test.field)
let title = Test.title
let member_message = Test.member_message
@@ -194,8 +189,8 @@ module PrintingCasesLet =
^ " are not printed using a `let' form"
end)
-module PrintingIf = Goptions.MakeTable(PrintingCasesIf)
-module PrintingLet = Goptions.MakeTable(PrintingCasesLet)
+module PrintingIf = Goptions.MakeIdentTable(PrintingCasesIf)
+module PrintingLet = Goptions.MakeIdentTable(PrintingCasesLet)
let force_let (lc,(indsp,_,_,_,_)) = PrintingLet.active (indsp,lc)
let force_if (lc,(indsp,_,_,_,_)) = PrintingIf.active (indsp,lc)
@@ -244,10 +239,10 @@ let computable p k =
sinon on perd la réciprocité de la synthčse (qui, lui,
engendrera un prédicat non dépendant) *)
- let rec striprec = function
- | (0,DOP2(Lambda,_,DLAM(_,d))) -> false
- | (0,d ) -> noccur_between 1 k d
- | (n,DOP2(Lambda,_,DLAM(_,d))) -> striprec (n-1,d)
+ let rec striprec (n,c) = match n, kind_of_term c with
+ | (0,IsLambda (_,_,d)) -> false
+ | (0,_) -> noccur_between 1 k c
+ | (n,IsLambda (_,_,d)) -> striprec (n-1,d)
| _ -> false
in
striprec (k,p)
@@ -262,24 +257,24 @@ let ids_of_var cl =
*)
let lookup_name_as_renamed ctxt t s =
- let rec lookup avoid env_names n = function
- DOP2(Prod,t,DLAM(name,c')) ->
- (match concrete_name avoid env_names name c' with
- (Some id,avoid') ->
- if id=s then (Some n)
- else lookup avoid' (add_name (Name id) env_names) (n+1) c'
- | (None,avoid') -> lookup avoid' env_names (n+1) (pop c'))
- | DOP2(Cast,c,_) -> lookup avoid env_names n c
- | _ -> None
+ let rec lookup avoid env_names n c = match kind_of_term c with
+ | IsProd (name,t,c') ->
+ (match concrete_name avoid env_names name c' with
+ (Some id,avoid') ->
+ if id=s then (Some n)
+ else lookup avoid' (add_name (Name id) env_names) (n+1) c'
+ | (None,avoid') -> lookup avoid' env_names (n+1) (pop c'))
+ | IsCast (c,_) -> lookup avoid env_names n c
+ | _ -> None
in lookup (ids_of_var_context ctxt) empty_names_context 1 t
let lookup_index_as_renamed t n =
- let rec lookup n d = function
- DOP2(Prod,_,DLAM(name,c')) ->
+ let rec lookup n d c = match kind_of_term c with
+ | IsProd (name,_,c') ->
(match concrete_name [] empty_names_context name c' with
(Some _,_) -> lookup n (d+1) c'
| (None ,_) -> if n=1 then Some d else lookup (n-1) (d+1) c')
- | DOP2(Cast,c,_) -> lookup n d c
+ | IsCast (c,_) -> lookup n d c
| _ -> None
in lookup n 1 t
@@ -310,6 +305,7 @@ let rec detype avoid env t =
RCast(dummy_loc,detype avoid env c1,detype avoid env c2)
| IsProd (na,ty,c) -> detype_binder BProd avoid env na ty c
| IsLambda (na,ty,c) -> detype_binder BLambda avoid env na ty c
+ | IsLetIn (na,b,_,c) -> detype_binder BLetIn avoid env na b c
| IsAppL (f,args) ->
RApp (dummy_loc,detype avoid env f,List.map (detype avoid env) args)
| IsConst (sp,cl) ->
@@ -356,7 +352,7 @@ let rec detype avoid env t =
end
| IsFix (nvn,(cl,lfn,vt)) -> detype_fix (RFix nvn) avoid env cl lfn vt
- | IsCoFix (n,(cl,lfn,vt)) -> detype_fix (RCofix n) avoid env cl lfn vt)
+ | IsCoFix (n,(cl,lfn,vt)) -> detype_fix (RCoFix n) avoid env cl lfn vt)
and detype_fix fk avoid env cl lfn vt =
let lfi = List.map (fun id -> next_name_away id avoid) lfn in
@@ -369,34 +365,35 @@ and detype_fix fk avoid env cl lfn vt =
and detype_eqn avoid env constr_id construct_nargs branch =
let make_pat x avoid env b ids =
- if not (force_wildcard ()) or (dependent (Rel 1) b) then
+ if not (force_wildcard ()) or (dependent (mkRel 1) b) then
let id = next_name_away_with_default "x" x avoid in
PatVar (dummy_loc,Name id),id::avoid,(add_name (Name id) env),id::ids
else
PatVar (dummy_loc,Anonymous),avoid,(add_name Anonymous env),ids
in
- let rec buildrec ids patlist avoid env = function
- | 0 , rhs ->
- (ids, [PatCstr(dummy_loc, constr_id, List.rev patlist,Anonymous)],
- detype avoid env rhs)
-
- | n, DOP2(Lambda,_,DLAM(x,b)) ->
- let pat,new_avoid,new_env,new_ids = make_pat x avoid env b ids in
- buildrec new_ids (pat::patlist) new_avoid new_env (n-1,b)
-
- | n, DOP2(Cast,b,_) -> (* Oui, il y a parfois des cast *)
- buildrec ids patlist avoid env (n,b)
-
- | n, b -> (* eta-expansion : n'arrivera plus lorsque tous les
- termes seront construits ŕ partir de la syntaxe Cases *)
- (* nommage de la nouvelle variable *)
- let new_b = DOPN(AppL,[|lift 1 b; Rel 1|]) in
- let pat,new_avoid,new_env,new_ids =
- make_pat Anonymous avoid env new_b ids in
- buildrec new_ids (pat::patlist) new_avoid new_env (n-1,new_b)
+ let rec buildrec ids patlist avoid env n b =
+ if n=0 then
+ (ids, [PatCstr(dummy_loc, constr_id, List.rev patlist,Anonymous)],
+ detype avoid env b)
+ else
+ match kind_of_term b with
+ | IsLambda (x,_,b) ->
+ let pat,new_avoid,new_env,new_ids = make_pat x avoid env b ids in
+ buildrec new_ids (pat::patlist) new_avoid new_env (n-1) b
+
+ | IsCast (c,_) -> (* Oui, il y a parfois des cast *)
+ buildrec ids patlist avoid env n c
+
+ | _ -> (* eta-expansion : n'arrivera plus lorsque tous les
+ termes seront construits ŕ partir de la syntaxe Cases *)
+ (* nommage de la nouvelle variable *)
+ let new_b = applist (lift 1 b, [Rel 1]) in
+ let pat,new_avoid,new_env,new_ids =
+ make_pat Anonymous avoid env new_b ids in
+ buildrec new_ids (pat::patlist) new_avoid new_env (n-1) new_b
in
- buildrec [] [] avoid env (construct_nargs,branch)
+ buildrec [] [] avoid env construct_nargs branch
and detype_binder bk avoid env na ty c =
let na',avoid' = match concrete_name avoid env na c with
diff --git a/pretyping/evarconv.ml b/pretyping/evarconv.ml
index 3afc73469..e4e2e48c5 100644
--- a/pretyping/evarconv.ml
+++ b/pretyping/evarconv.ml
@@ -3,7 +3,7 @@
open Util
open Names
-open Generic
+(*i open Generic i*)
open Term
open Reduction
open Instantiate
@@ -105,10 +105,10 @@ and evar_conv_x env isevars pbty term1 term2 =
else
evar_eqappr_x env isevars pbty (t1,l1) (t2,l2)
-and evar_eqappr_x env isevars pbty appr1 appr2 =
+and evar_eqappr_x env isevars pbty (term1,l1 as appr1) (term2,l2 as appr2) =
(* Evar must be undefined since we have whd_ised *)
- match (appr1,appr2) with
- | ((DOPN(Evar sp1,al1) as term1,l1), (DOPN(Evar sp2,al2) as term2,l2)) ->
+ match (kind_of_term term1, kind_of_term term2) with
+ | IsEvar (sp1,al1), IsEvar (sp2,al2) ->
let f1 () =
if List.length l1 > List.length l2 then
let (deb1,rest1) = list_chop (List.length l1-List.length l2) l1 in
@@ -125,7 +125,7 @@ and evar_eqappr_x env isevars pbty appr1 appr2 =
in
ise_try isevars [f1; f2]
- | ((DOPN(Evar sp1,al1) as term1,l1), (DOPN(Const sp2,al2) as term2,l2)) ->
+ | IsEvar (sp1,al1), IsConst (sp2,al2) ->
let f1 () =
(List.length l1 <= List.length l2) &
let (deb2,rest2) = list_chop (List.length l2-List.length l1) l2 in
@@ -139,7 +139,7 @@ and evar_eqappr_x env isevars pbty appr1 appr2 =
in
ise_try isevars [f1; f4]
- | ((DOPN(Const sp1,al1) as term1,l1), (DOPN(Evar sp2,al2) as term2,l2)) ->
+ | IsConst (sp1,al1), IsEvar (sp2,al2) ->
let f1 () =
(List.length l2 <= List.length l1) &
let (deb1,rest1) = list_chop (List.length l1-List.length l2) l1 in
@@ -154,7 +154,7 @@ and evar_eqappr_x env isevars pbty appr1 appr2 =
in
ise_try isevars [f1; f4]
- | ((DOPN(Const sp1,al1) as term1,l1), (DOPN(Const sp2,al2) as term2,l2)) ->
+ | IsConst (sp1,al1), IsConst (sp2,al2) ->
let f2 () =
(sp1 = sp2)
& (array_for_all2 (evar_conv_x env isevars CONV) al1 al2)
@@ -176,19 +176,19 @@ and evar_eqappr_x env isevars pbty appr1 appr2 =
in
ise_try isevars [f2; f3; f4]
- | ((DOPN(Evar _,_) as term1,l1),(t2,l2)) ->
+ | IsEvar (_,_), _ ->
(List.length l1 <= List.length l2) &
let (deb2,rest2) = list_chop (List.length l2-List.length l1) l2 in
- solve_pb env isevars(pbty,term1,applist(t2,deb2))
+ solve_pb env isevars(pbty,term1,applist(term2,deb2))
& list_for_all2eq (evar_conv_x env isevars CONV) l1 rest2
- | ((t1,l1),(DOPN(Evar _,_) as t2,l2)) ->
+ | _, IsEvar (_,_) ->
(List.length l2 <= List.length l1) &
let (deb1,rest1) = list_chop (List.length l1-List.length l2) l1 in
- solve_pb env isevars(pbty,applist(t1,deb1),t2)
+ solve_pb env isevars(pbty,applist(term1,deb1),term2)
& list_for_all2eq (evar_conv_x env isevars CONV) rest1 l2
- | ((DOPN(Const _,_) as term1,l1),(t2,l2)) ->
+ | IsConst (_,_), _ ->
let f3 () =
(try conv_record env isevars (check_conv_record appr1 appr2)
with _ -> false)
@@ -199,18 +199,18 @@ and evar_eqappr_x env isevars pbty appr1 appr2 =
in
ise_try isevars [f3; f4]
- | ((t1,l1),(DOPN(Const _,_) as t2,l2)) ->
+ | _ , IsConst (_,_) ->
let f3 () =
(try (conv_record env isevars (check_conv_record appr2 appr1))
with _ -> false)
and f4 () =
- evaluable_constant env t2 &
+ evaluable_constant env term2 &
evar_eqappr_x env isevars pbty
- appr1 (evar_apprec env isevars l2 (constant_value env t2))
+ appr1 (evar_apprec env isevars l2 (constant_value env term2))
in
ise_try isevars [f3; f4]
- | ((DOPN(Abst _,_) as term1,l1),(DOPN(Abst _,_) as term2,l2)) ->
+ | IsAbst (_,_), IsAbst (_,_) ->
let f1 () =
(term1=term2) &
(List.length(l1) = List.length(l2)) &
@@ -226,75 +226,89 @@ and evar_eqappr_x env isevars pbty appr1 appr2 =
in
ise_try isevars [f1; f2]
- | ((DOPN(Abst _,_) as term1,l1),_) ->
+ | IsAbst (_,_), _ ->
(evaluable_abst env term1)
& evar_eqappr_x env isevars pbty
(evar_apprec env isevars l1 (abst_value env term1)) appr2
- | (_,(DOPN(Abst _,_) as term2,l2)) ->
+ | _, IsAbst (_,_) ->
(evaluable_abst env term2)
& evar_eqappr_x env isevars pbty
appr1 (evar_apprec env isevars l2 (abst_value env term2))
- | ((Rel(n),l1),(Rel(m),l2)) ->
+ | IsRel n, IsRel m ->
n=m
& (List.length(l1) = List.length(l2))
& (List.for_all2 (evar_conv_x env isevars CONV) l1 l2)
- | ((DOP2(Cast,c,_),l),_) -> evar_eqappr_x env isevars pbty (c,l) appr2
+ | IsCast (c1,_), _ -> evar_eqappr_x env isevars pbty (c1,l1) appr2
- | (_,(DOP2(Cast,c,_),l)) -> evar_eqappr_x env isevars pbty appr1 (c,l)
+ | _, IsCast (c2,_) -> evar_eqappr_x env isevars pbty appr1 (c2,l2)
- | ((VAR id1,l1),(VAR id2,l2)) ->
+ | IsVar id1, IsVar id2 ->
(id1=id2 & (List.length l1 = List.length l2)
& (List.for_all2 (evar_conv_x env isevars CONV) l1 l2))
- | ((DOP0(Meta(n)),l1),(DOP0(Meta(m)),l2)) ->
+ | IsMeta n, IsMeta m ->
(n=m & (List.length(l1) = List.length(l2))
& (List.for_all2 (evar_conv_x env isevars CONV) l1 l2))
- | ((DOP0(Sort s1),[]),(DOP0(Sort s2),[])) -> base_sort_cmp pbty s1 s2
+ | IsSort s1, IsSort s2 when l1=[] & l2=[] -> base_sort_cmp pbty s1 s2
- | ((DOP2(Lambda,c1,DLAM(_,c2)),[]), (DOP2(Lambda,c'1,DLAM(_,c'2)),[])) ->
- evar_conv_x env isevars CONV c1 c'1
- & evar_conv_x env isevars CONV c2 c'2
+ | IsLambda (_,c1,c'1), IsLambda (_,c2,c'2) when l1=[] & l2=[] ->
+ evar_conv_x env isevars CONV c1 c2
+ & evar_conv_x env isevars CONV c'1 c'2
- | ((DOP2(Prod,c1,DLAM(n,c2)),[]), (DOP2(Prod,c'1,DLAM(_,c'2)),[])) ->
- evar_conv_x env isevars CONV c1 c'1
+ | IsLetIn (_,b1,_,c'1), IsLetIn (_,b2,_,c'2) ->
+ let f1 () =
+ evar_conv_x env isevars CONV b1 b2
+ & evar_conv_x env isevars pbty c'1 c'2
+ & (List.length l1 = List.length l2)
+ & (List.for_all2 (evar_conv_x env isevars CONV) l1 l2)
+ and f2 () =
+ evar_eqappr_x env isevars pbty (subst1 b1 c'1,l1) (subst1 b2 c'2,l2)
+ in
+ ise_try isevars [f1; f2]
+
+ | IsLetIn (_,b1,_,c'1), _ -> (* On fait commuter les args avec le Let *)
+ evar_eqappr_x env isevars pbty (subst1 b1 c'1,l1) appr2
+
+ | _, IsLetIn (_,b2,_,c'2) ->
+ evar_eqappr_x env isevars pbty appr1 (subst1 b2 c'2,l2)
+
+ | IsProd (n,c1,c'1), IsProd (_,c2,c'2) when l1=[] & l2=[] ->
+ evar_conv_x env isevars CONV c1 c2
&
(let d = Retyping.get_assumption_of env !isevars (nf_ise1 !isevars c1)
- in evar_conv_x (push_rel_decl (n,d) env) isevars pbty c2 c'2)
+ in evar_conv_x (push_rel_decl (n,d) env) isevars pbty c'1 c'2)
- | ((DOPN(MutInd _ as o1,cl1) as ind1,l'1),
- (DOPN(MutInd _ as o2,cl2) as ind2,l'2)) ->
- o1=o2
- & array_for_all2 (evar_conv_x env isevars CONV) cl1 cl2
- & list_for_all2eq (evar_conv_x env isevars CONV) l'1 l'2
+ | IsMutInd (sp1,cl1), IsMutInd (sp2,cl2) ->
+ sp1=sp2
+ & array_for_all2 (evar_conv_x env isevars CONV) cl1 cl2
+ & list_for_all2eq (evar_conv_x env isevars CONV) l1 l2
- | ((DOPN(MutConstruct _ as o1,cl1) as constr1,l1),
- (DOPN(MutConstruct _ as o2,cl2) as constr2,l2)) ->
- o1=o2
- & array_for_all2 (evar_conv_x env isevars CONV) cl1 cl2
- & list_for_all2eq (evar_conv_x env isevars CONV) l1 l2
-
- | ((DOPN(MutCase _,_) as constr1,l'1),
- (DOPN(MutCase _,_) as constr2,l'2)) ->
- let (_,p1,c1,cl1) = destCase constr1 in
- let (_,p2,c2,cl2) = destCase constr2 in
+ | IsMutConstruct (sp1,cl1), IsMutConstruct (sp2,cl2) ->
+ sp1=sp2
+ & array_for_all2 (evar_conv_x env isevars CONV) cl1 cl2
+ & list_for_all2eq (evar_conv_x env isevars CONV) l1 l2
+
+ | IsMutCase (_,p1,c1,cl1), IsMutCase (_,p2,c2,cl2) ->
evar_conv_x env isevars CONV p1 p2
& evar_conv_x env isevars CONV c1 c2
& (array_for_all2 (evar_conv_x env isevars CONV) cl1 cl2)
- & (list_for_all2eq (evar_conv_x env isevars CONV) l'1 l'2)
+ & (list_for_all2eq (evar_conv_x env isevars CONV) l1 l2)
- | ((DOPN(Fix _ as o1,cl1),l1),(DOPN(Fix _ as o2,cl2),l2)) ->
- o1=o2 &
- (array_for_all2 (evar_conv_x env isevars CONV) cl1 cl2) &
- (list_for_all2eq (evar_conv_x env isevars CONV) l1 l2)
+ | IsFix (li1,(tys1,_,bds1)), IsFix (li2,(tys2,_,bds2)) ->
+ li1=li2
+ & (array_for_all2 (evar_conv_x env isevars CONV) tys1 tys2)
+ & (array_for_all2 (evar_conv_x env isevars CONV) bds1 bds2)
+ & (list_for_all2eq (evar_conv_x env isevars CONV) l1 l2)
- | ((DOPN(CoFix(i1),cl1),l1),(DOPN(CoFix(i2),cl2),l2)) ->
- i1=i2 &
- (array_for_all2 (evar_conv_x env isevars CONV) cl1 cl2) &
- (list_for_all2eq (evar_conv_x env isevars CONV) l1 l2)
+ | IsCoFix (i1,(tys1,_,bds1)), IsCoFix (i2,(tys2,_,bds2)) ->
+ i1=i2
+ & (array_for_all2 (evar_conv_x env isevars CONV) tys1 tys2)
+ & (array_for_all2 (evar_conv_x env isevars CONV) bds1 bds2)
+ & (list_for_all2eq (evar_conv_x env isevars CONV) l1 l2)
(***
| (DOP0(Implicit),[]),(DOP0(Implicit),[]) -> true
@@ -302,13 +316,16 @@ and evar_eqappr_x env isevars pbty appr1 appr2 =
* But b (optional env) is not updated! *)
***)
- | (DLAM(_,c1),[]),(DLAM(_,c2),[]) ->
- evar_conv_x env isevars pbty c1 c2
+ | (IsRel _ | IsVar _ | IsMeta _ | IsXtra _ | IsLambda _), _ -> false
+ | _, (IsRel _ | IsVar _ | IsMeta _ | IsXtra _ | IsLambda _) -> false
+
+ | (IsMutInd _ | IsMutConstruct _ | IsSort _ | IsProd _), _ -> false
+ | _, (IsMutInd _ | IsMutConstruct _ | IsSort _ | IsProd _) -> false
+
+ | (IsAppL _ | IsMutCase _ | IsFix _ | IsCoFix _),
+ (IsAppL _ | IsMutCase _ | IsFix _ | IsCoFix _) -> false
- | (DLAMV(_,vc1),[]),(DLAMV(_,vc2),[]) ->
- array_for_all2 (evar_conv_x env isevars pbty) vc1 vc2
- | _ -> false
and conv_record env isevars (c,bs,(xs,xs1),(us,us1),(ts,ts1),t) =
let ks =
diff --git a/pretyping/evarutil.ml b/pretyping/evarutil.ml
index 804d635db..2d35fb753 100644
--- a/pretyping/evarutil.ml
+++ b/pretyping/evarutil.ml
@@ -5,7 +5,7 @@ open Util
open Pp
open Names
open Univ
-open Generic
+(*i open Generic i*)
open Term
open Sign
open Environ
@@ -57,11 +57,15 @@ let new_isevar_sign env sigma typ instance =
any type has type Type. May cause some trouble, but not so far... *)
let dummy_sort = mkType dummy_univ
+let make_instance env =
+ fold_var_context
+ (fun env (id, b, _) l -> if b=None then mkVar id :: l else l)
+ env []
+
(* Declaring any type to be in the sort Type shouldn't be harmful since
cumulativity now includes Prop and Set in Type. *)
let new_type_var env sigma =
- let sign = var_context env in
- let instance = List.map mkVar (ids_of_var_context sign) in
+ let instance = make_instance env in
let (sigma',c) = new_isevar_sign env sigma dummy_sort instance in
(sigma', c)
@@ -74,7 +78,7 @@ let split_evar_to_arrow sigma c =
let nvar = next_ident_away (id_of_string "x") (ids_of_var_context hyps) in
let newenv = push_var_decl (nvar,make_typed dom (Type dummy_univ)) evenv in
let (sigma2,rng) = new_type_var newenv sigma1 in
- let prod = mkProd (named_hd newenv dom Anonymous) dom (subst_var nvar rng) in
+ let prod = mkProd (named_hd newenv dom Anonymous, dom, subst_var nvar rng) in
let sigma3 = Evd.define sigma2 ev prod in
let dsp = num_of_evar dom in
let rsp = num_of_evar rng in
@@ -109,7 +113,7 @@ let do_restrict_hyps sigma c =
in
let sign' = List.rev rsign in
let env' = change_hyps (fun _ -> sign') env in
- let instance = List.map mkVar (ids_of_var_context sign') in
+ let instance = make_instance env' in
let (sigma',nc) = new_isevar_sign env' sigma evd.evar_concl instance in
let sigma'' = Evd.define sigma' ev nc in
(sigma'', nc)
@@ -188,14 +192,34 @@ let real_clean isevars sp args rhs =
| DOP1(o,a) -> DOP1(o, subs k a)
| DOP2(o,a,b) -> DOP2(o, subs k a, subs k b)
| DOPN(o,v) -> restrict_hyps isevars (DOPN(o, Array.map (subs k) v))
- | DOPL(o,l) -> DOPL(o, List.map (subs k) l)
| DLAM(n,a) -> DLAM(n, subs (k+1) a)
- | DLAMV(n,v) -> DLAMV(n, Array.map (subs (k+1)) v) in
+ | DLAMV(n,v) -> DLAMV(n, Array.map (subs (k+1)) v)
+ | CLam (n,t,c) -> CLam (n, typed_app (subs k) t, subs (k+1) c)
+ | CPrd (n,t,c) -> CPrd (n, typed_app (subs k) t, subs (k+1) c)
+ | CLet (n,b,t,c) -> CLet (n, subs k b, typed_app (subs k) t, subs (k+1) c)
+ in
let body = subs 0 rhs in
(* if not (closed0 body) then error_not_clean CCI empty_env sp body; *)
body
-
+let make_instance_with_rel env =
+ let n = rel_context_length (rel_context env) in
+ let vars =
+ fold_var_context
+ (fun env (id,b,_) l -> if b=None then mkVar id :: l else l)
+ env [] in
+ snd (fold_rel_context
+ (fun env (_,b,_) (i,l) -> (i-1, if b=None then mkRel i :: l else l))
+ env (n+1,vars))
+
+let make_subst env args =
+ snd (fold_var_context
+ (fun env (id,b,c) (args,l as g) ->
+ match b, args with
+ | None, a::rest -> (rest, (id,a)::l)
+ | Some _, _ -> g
+ | _ -> anomaly "Instance does not match its signature")
+ env (List.rev args,[]))
(* [new_isevar] declares a new existential in an env env with type typ *)
(* Converting the env into the sign of the evar to define *)
@@ -203,9 +227,7 @@ let real_clean isevars sp args rhs =
let new_isevar isevars env typ k =
let subst,env' = push_rels_to_vars env in
let typ' = substl subst typ in
- let instance =
- (List.rev (rel_list 0 (rel_context_length (rel_context env))))
- @(List.map mkVar (ids_of_var_context (var_context env))) in
+ let instance = make_instance_with_rel env in
let (sigma',evar) = new_isevar_sign env' !isevars typ' instance in
isevars := sigma';
evar
@@ -233,9 +255,8 @@ let evar_define isevars lhs rhs =
let args = List.map (function (VAR _ | Rel _) as t -> t | _ -> mkImplicit)
(Array.to_list argsv) in
let evd = ise_map isevars ev in
- let hyps = var_context evd.evar_env in
(* the substitution to invert *)
- let worklist = List.combine (ids_of_var_context hyps) args in
+ let worklist = make_subst evd.evar_env args in
let body = real_clean isevars ev worklist rhs in
ise_define isevars ev body;
[ev]
@@ -306,30 +327,21 @@ let rec solve_simple_eqn conv_algo isevars ((pbty,t1,t2) as pb) =
let has_undefined_isevars isevars c =
- let rec hasrec = function
- | DOPN(Evar ev,cl) as k ->
- if ise_in_dom isevars ev then
- if ise_defined isevars k then
- hasrec (existential_value !isevars (ev,cl))
- else
- failwith "caught"
- else
- Array.iter hasrec cl
- | DOP1(_,c) -> hasrec c
- | DOP2(_,c1,c2) -> (hasrec c1; hasrec c2)
- | DOPL(_,l) -> List.iter hasrec l
- | DOPN(_,cl) -> Array.iter hasrec cl
- | DLAM(_,c) -> hasrec c
- | DLAMV(_,cl) -> Array.iter hasrec cl
- | (VAR _|Rel _|DOP0 _) -> ()
+ let rec hasrec k = match splay_constr k with
+ | OpEvar ev, cl when ise_in_dom isevars ev ->
+ if ise_defined isevars k then
+ hasrec (existential_value !isevars (ev,cl))
+ else
+ failwith "caught"
+ | _, cl -> Array.iter hasrec cl
in
(try (hasrec c ; false) with Failure "caught" -> true)
let head_is_exist isevars =
- let rec hrec = function
- | DOPN(Evar _,_) as k -> ise_undefined isevars k
- | DOPN(AppL,cl) -> hrec (array_hd cl)
- | DOP2(Cast,c,_) -> hrec c
+ let rec hrec k = match kind_of_term k with
+ | IsEvar _ -> ise_undefined isevars k
+ | IsAppL (f,l) -> hrec f
+ | IsCast (c,_) -> hrec c
| _ -> false
in
hrec
@@ -399,15 +411,17 @@ let mk_valcon c = Some c
let split_tycon loc env isevars = function
| None -> None,None
| Some c ->
- (match whd_betadeltaiota env !isevars c with
- | DOP2(Prod,dom,DLAM(na,rng)) ->
- Some dom, Some rng
- | t when ise_undefined isevars t ->
- let (sigma,dom,rng) = split_evar_to_arrow !isevars t in
- isevars := sigma;
- Some dom, Some rng
+ let t = whd_betadeltaiota env !isevars c in
+ match kind_of_term t with
+ | IsProd (na,dom,rng) -> Some dom, Some rng
| _ ->
- Stdpp.raise_with_loc loc (Type_errors.TypeError (CCI,env,Type_errors.NotProduct c)))
+ if ise_undefined isevars t then
+ let (sigma,dom,rng) = split_evar_to_arrow !isevars t in
+ isevars := sigma;
+ Some dom, Some rng
+ else
+ Stdpp.raise_with_loc loc
+ (Type_errors.TypeError (CCI,env,Type_errors.NotProduct c))
let valcon_of_tycon x = x
diff --git a/pretyping/pretyping.ml b/pretyping/pretyping.ml
index c2770f196..09dd23065 100644
--- a/pretyping/pretyping.ml
+++ b/pretyping/pretyping.ml
@@ -4,7 +4,7 @@
open Pp
open Util
open Names
-open Generic
+(*i open Generic i*)
open Sign
open Evd
open Term
@@ -27,34 +27,37 @@ open Coercion
open Inductive
open Instantiate
+(*
(* Pour le vieux "match" que Program utilise encore, vieille histoire ... *)
(* Awful special reduction function which skips abstraction on Xtra in
order to be safe for Program ... *)
let stacklamxtra recfun =
- let rec lamrec sigma p_0 p_1 = match p_0,p_1 with
- | (stack, (DOP2(Lambda,DOP1(XTRA "COMMENT",_),DLAM(_,c)) as t)) ->
+ let rec lamrec sigma s t = match s,kind_of_term t with
+ | (stack, IsLambda (_,DOP1(XTRA "COMMENT",_),_)) ->
recfun stack (substl sigma t)
- | ((h::t), (DOP2(Lambda,_,DLAM(_,c)))) -> lamrec (h::sigma) t c
- | (stack, t) -> recfun stack (substl sigma t)
+ | ((h::t), IsLambda (_,_,c)) -> lamrec (h::sigma) t c
+ | (stack, _) -> recfun stack (substl sigma t)
in
lamrec
let rec whrec x stack =
- match x with
- | DOP2(Lambda,DOP1(XTRA "COMMENT",c),DLAM(name,t)) ->
+ match kind_of_term x with
+ | IsLambda (name, DOP1(XTRA "COMMENT",c),t) ->
let t' = applist (whrec t (List.map (lift 1) stack)) in
- DOP2(Lambda,DOP1(XTRA "COMMENT",c),DLAM(name,t')),[]
- | DOP2(Lambda,c1,DLAM(name,c2)) ->
+ mkLambda (name,DOP1(XTRA "COMMENT",c),t'),[]
+ | IsLambda (name,c1,c2) ->
(match stack with
- | [] -> (DOP2(Lambda,c1,DLAM(name,whd_betaxtra c2)),[])
+ | [] -> mkLambda (name,c1,whd_betaxtra c2),[]
| a1::rest -> stacklamxtra (fun l x -> whrec x l) [a1] rest c2)
- | DOPN(AppL,cl) -> whrec (array_hd cl) (array_app_tl cl stack)
- | DOP2(Cast,c,_) -> whrec c stack
- | x -> x,stack
+ | IsAppL (f,args) -> whrec f (args@stack)
+ | IsCast (c,_) -> whrec c stack
+ | _ -> x,stack
and whd_betaxtra x = applist(whrec x [])
+*)
+let whd_betaxtra = whd_beta
let lift_context n l =
let k = List.length l in
@@ -111,10 +114,8 @@ let transform_rec loc env sigma (p,c,lf) (indt,pt) =
applist (whd_beta_stack (lift (nar+1) p) (rel_list 1 nar)))))
lnames
in
- let fix = DOPN(Fix([|nar|],0),
- [|typPfix;
- DLAMV(Name(id_of_string "F"),[|deffix|])|])
- in
+ let fix = mkFix (([|nar|],0),
+ ([|typPfix|],[Name(id_of_string "F")],[|deffix|])) in
applist (fix,realargs@[c])
else
let ci = make_default_case_info mispec in
@@ -217,31 +218,9 @@ let pretype_ref pretype loc isevars env lvar = function
make_judge (mkConst cst) (type_of_constant env !isevars cst)
| RAbst sp -> failwith "Pretype: abst doit disparaître"
-(*
- if sp = let_path then
- (match Array.to_list cl with
- [m;DLAM(na,b)] ->
- let mj = pretype empty_tycon isevars env m in
- (try
- let mj = inh_ass_of_j isevars env mj in
- let mb = body_of_type mj in
- let bj =
- pretype empty_tycon (push_rel (na,mj) env) isevars b in
- {uj_val = DOPN(Abst sp,[|mb;DLAM(na,bj.uj_val)|]);
- uj_type = sAPP (DLAM(na,bj.uj_type)) mb;
- uj_kind = pop bj.uj_kind }
- with UserError _ ->
- pretype vtcon isevars env (abst_value cstr))
- | _ -> errorlabstrm "Trad.constr_of_com" [< 'sTR"Malformed ``let''" >])
- else if evaluable_abst cstr then
- pretype vtcon isevars env (abst_value cstr)
- else error "Cannot typecheck an unevaluable abstraction"
-*)
+
| REVar (sp,ctxt) -> error " Not able to type terms with dependent subgoals"
-(* Not able to type goal existential yet
- let cstr = mkConst (sp,ctxt_of_ids ids) in
- make_judge cstr (type_of_existential env !isevars cstr)
-*)
+
| RInd (ind_sp,ctxt) ->
let ind = (ind_sp,Array.map pretype ctxt) in
make_judge (mkMutInd ind) (type_of_inductive env !isevars ind)
@@ -285,16 +264,6 @@ match cstr with (* Oů teste-t-on que le résultat doit satisfaire tycon ? *)
| RHole loc ->
if !compter then nbimpl:=!nbimpl+1;
-(* OLD
- (match vtcon with
- (true,(Some v, _)) ->
- {uj_val=v.utj_val; uj_type=make_typed (mkSort v.utj_type) (Type Univ.dummy_univ)}
- | (false,(None,Some ty)) ->
- let c = new_isevar isevars env ty CCI in
- {uj_val=c;uj_type=make_typed ty (Type Univ.dummy_univ)}
- | (true,(None,None)) ->
- let ty = mkCast dummy_sort dummy_sort in
-*)
(match tycon with
| Some ty ->
let c = new_isevar isevars env ty CCI in
@@ -328,7 +297,7 @@ match cstr with (* Oů teste-t-on que le résultat doit satisfaire tycon ? *)
let fix = (vni,(larav,List.rev lfi,Array.map j_val_only vdefj)) in
check_fix env !isevars fix;
make_judge (mkFix fix) lara.(i)
- | RCofix i ->
+ | RCoFix i ->
let cofix = (i,(larav,List.rev lfi,Array.map j_val_only vdefj)) in
check_cofix env !isevars cofix;
make_judge (mkCoFix cofix) lara.(i))
@@ -365,6 +334,13 @@ match cstr with (* Oů teste-t-on que le résultat doit satisfaire tycon ? *)
(try fst (gen_rel env !isevars name assum j')
with TypeError _ as e -> Stdpp.raise_with_loc loc e)
+| RBinder(loc,BLetIn,name,c1,c2) ->
+ let j = pretype empty_tycon env isevars lvar lmeta c1 in
+ let var = (name,j.uj_val,j.uj_type) in
+ let j' = pretype tycon (push_rel_def var env) isevars lvar lmeta c2 in
+ { uj_val = mkLetIn (name, j.uj_val, body_of_type j.uj_type, j'.uj_val) ;
+ uj_type = typed_app (subst1 j.uj_val) j'.uj_type }
+
| ROldCase (loc,isrec,po,c,lf) ->
let cj = pretype empty_tycon env isevars lvar lmeta c in
let (IndType (indf,realargs) as indt) =
@@ -427,7 +403,7 @@ match cstr with (* Oů teste-t-on que le résultat doit satisfaire tycon ? *)
let ci = make_default_case_info mis in
mkMutCaseA ci pj.uj_val cj.uj_val (Array.map (fun j-> j.uj_val) lfj)
in
- let s = destSort (snd (splay_prod env !isevars evalPt)) in
+ let s = snd (splay_arity env !isevars evalPt) in
{uj_val = v;
uj_type = make_typed rsty s }
diff --git a/pretyping/recordops.ml b/pretyping/recordops.ml
index fe7830620..10c7cee07 100755
--- a/pretyping/recordops.ml
+++ b/pretyping/recordops.ml
@@ -11,7 +11,7 @@ open Library
open Classops
(*
open Pp_control
-open Generic
+(*i open Generic i*)
open Initial
*)
diff --git a/pretyping/recordops.mli b/pretyping/recordops.mli
index 5872bd922..0f90afeb5 100755
--- a/pretyping/recordops.mli
+++ b/pretyping/recordops.mli
@@ -4,7 +4,7 @@
(*i*)
open Names
open Term
-open Generic
+(*i open Generic i*)
open Classops
open Libobject
open Library
diff --git a/pretyping/retyping.ml b/pretyping/retyping.ml
index 72a3d3d51..aa499fb63 100644
--- a/pretyping/retyping.ml
+++ b/pretyping/retyping.ml
@@ -5,7 +5,7 @@ open Util
open Term
open Inductive
open Names
-open Generic
+(*i open Generic i*)
open Reduction
open Environ
open Typeops
@@ -13,15 +13,15 @@ open Typeops
type metamap = (int * constr) list
let outsort env sigma t =
- match whd_betadeltaiota env sigma t with
- DOP0(Sort s) -> s
+ match kind_of_term (whd_betadeltaiota env sigma t) with
+ | IsSort s -> s
| _ -> anomaly "Retyping: found a type of type which is not a sort"
let rec subst_type env sigma typ = function
- [] -> typ
+ | [] -> typ
| h::rest ->
- match whd_betadeltaiota env sigma typ with
- DOP2(Prod,c1,DLAM(_,c2)) -> subst_type env sigma (subst1 h c2) rest
+ match kind_of_term (whd_betadeltaiota env sigma typ) with
+ IsProd (_,c1,c2) -> subst_type env sigma (subst1 h c2) rest
| _ -> anomaly "Non-functional construction"
(* Si ft est le type d'un terme f, lequel est appliqué ŕ args, *)
@@ -31,16 +31,16 @@ let rec subst_type env sigma typ = function
let sort_of_atomic_type env sigma ft args =
let rec concl_of_arity ar =
- match whd_betadeltaiota env sigma ar with
- | DOP2 (Prod, _, DLAM (_, b)) -> concl_of_arity b
- | DOP0 (Sort s) -> s
+ match kind_of_term (whd_betadeltaiota env sigma ar) with
+ | IsProd (_, _, b) -> concl_of_arity b
+ | IsSort s -> s
| _ -> outsort env sigma (subst_type env sigma ft args)
in concl_of_arity ft
let typeur sigma metamap =
let rec type_of env cstr=
match kind_of_term cstr with
- IsMeta n ->
+ | IsMeta n ->
(try strip_outer_cast (List.assoc n metamap)
with Not_found -> anomaly "type_of: this is not a well-typed term")
| IsRel n -> lift n (body_of_type (snd (lookup_rel_type n env)))
@@ -65,14 +65,17 @@ let rec type_of env cstr=
whd_betadeltaiota env sigma (applist (p,al))
| IsLambda (name,c1,c2) ->
let var = make_typed c1 (sort_of env c1) in
- mkProd name c1 (type_of (push_rel_decl (name,var) env) c2)
+ mkProd (name, c1, type_of (push_rel_decl (name,var) env) c2)
+ | IsLetIn (name,b,c1,c2) ->
+ let var = make_typed c1 (sort_of env c1) in
+ subst1 b (type_of (push_rel_def (name,b,var) env) c2)
| IsFix ((vn,i),(lar,lfi,vdef)) -> lar.(i)
| IsCoFix (i,(lar,lfi,vdef)) -> lar.(i)
| IsAppL(f,args)->
strip_outer_cast (subst_type env sigma (type_of env f) args)
| IsCast (c,t) -> t
| IsSort _ | IsProd (_,_,_) | IsMutInd _ -> mkSort (sort_of env cstr)
- | _ -> error "type_of: Unexpected constr"
+ | IsXtra _ -> error "type_of: Unexpected constr"
and sort_of env t =
match kind_of_term t with
diff --git a/pretyping/tacred.ml b/pretyping/tacred.ml
index a0fe84ee6..16eebbefb 100644
--- a/pretyping/tacred.ml
+++ b/pretyping/tacred.ml
@@ -4,7 +4,7 @@
open Pp
open Util
open Names
-open Generic
+(*i open Generic i*)
open Term
open Inductive
open Environ
@@ -48,8 +48,10 @@ let make_elim_fun f lv n largs =
let fi = DOPN(Const(make_path (dirpath sp) id (kind_of_path sp)),args) in
list_fold_left_i
(fun i c (k,a) ->
- DOP2(Lambda,(substl (rev_firstn_liftn (n-k) (-i) la') a),
- DLAM(Name(id_of_string"x"),c))) 0 (applistc fi la') lv
+ mkLambda (Name(id_of_string"x"),
+ substl (rev_firstn_liftn (n-k) (-i) la') a,
+ c))
+ 0 (applistc fi la') lv
(* [f] is convertible to [DOPN(Fix(recindices,bodynum),bodyvect)] make
the reduction using this extra information *)
@@ -145,120 +147,124 @@ let rec red_elim_const env sigma k largs =
| _ -> raise Redelimination
and construct_const env sigma c stack =
- let rec hnfstack x stack =
- match x with
- | (DOPN(Const _,_)) as k ->
+ let rec hnfstack (x, stack as s) =
+ match kind_of_term x with
+ | IsConst _ ->
(try
- let (c',lrest) = red_elim_const env sigma k stack in
- hnfstack c' lrest
+ hnfstack (red_elim_const env sigma x stack)
with Redelimination ->
- if evaluable_constant env k then
- let cval = constant_value env k in
+ if evaluable_constant env x then
+ let cval = constant_value env x in
(match cval with
- | DOPN (CoFix _,_) -> (k,stack)
- | _ -> hnfstack cval stack)
+ | DOPN (CoFix _,_) -> s
+ | _ -> hnfstack (cval, stack))
else
raise Redelimination)
+(*
| (DOPN(Abst _,_) as a) ->
if evaluable_abst env a then
hnfstack (abst_value env a) stack
else
raise Redelimination
- | DOP2(Cast,c,_) -> hnfstack c stack
- | DOPN(AppL,cl) -> hnfstack (array_hd cl) (array_app_tl cl stack)
- | DOP2(Lambda,_,DLAM(_,c)) ->
+*)
+ | IsCast (c,_) -> hnfstack (c, stack)
+ | IsAppL (f,cl) -> hnfstack (f, cl@stack)
+ | IsLambda (_,_,c) ->
(match stack with
| [] -> assert false
| c'::rest -> stacklam hnfstack [c'] c rest)
- | DOPN(MutCase _,_) as c_0 ->
- let (ci,p,c,lf) = destCase c_0 in
+ | IsMutCase (ci,p,c,lf) ->
hnfstack
- (special_red_case env (construct_const env sigma) p c ci lf)
- stack
- | DOPN(MutConstruct _,_) as c_0 -> c_0,stack
- | DOPN(CoFix _,_) as c_0 -> c_0,stack
- | DOPN(Fix (_) ,_) as fix ->
- let (reduced,(fix,stack')) = reduce_fix hnfstack fix stack in
- if reduced then hnfstack fix stack' else raise Redelimination
+ (special_red_case env (construct_const env sigma) p c ci lf, stack)
+ | IsMutConstruct _ -> s
+ | IsCoFix _ -> s
+ | IsFix fix ->
+ (match reduce_fix hnfstack fix stack with
+ | Reduced s' -> hnfstack s'
+ | NotReducible -> raise Redelimination)
| _ -> raise Redelimination
in
- hnfstack c stack
+ hnfstack (c, stack)
(* Hnf reduction tactic: *)
let hnf_constr env sigma c =
- let rec redrec x largs =
- match x with
- | DOP2(Lambda,t,DLAM(n,c)) ->
+ let rec redrec (x, largs as s) =
+ match kind_of_term x with
+ | IsLambda (n,t,c) ->
(match largs with
- | [] -> applist(x,largs)
+ | [] -> applist s
| a::rest -> stacklam redrec [a] c rest)
- | DOPN(AppL,cl) -> redrec (array_hd cl) (array_app_tl cl largs)
- | DOPN(Const _,_) ->
+ | IsAppL (f,cl) -> redrec (f, cl@largs)
+ | IsConst _ ->
(try
let (c',lrest) = red_elim_const env sigma x largs in
- redrec c' lrest
+ redrec (c', lrest)
with Redelimination ->
if evaluable_constant env x then
let c = constant_value env x in
(match c with
| DOPN(CoFix _,_) -> applist(x,largs)
- | _ -> redrec c largs)
+ | _ -> redrec (c, largs))
else
- applist(x,largs))
+ applist s)
+(*
| DOPN(Abst _,_) ->
if evaluable_abst env x then
redrec (abst_value env x) largs
else
- applist(x,largs)
- | DOP2(Cast,c,_) -> redrec c largs
- | DOPN(MutCase _,_) ->
- let (ci,p,c,lf) = destCase x in
+ applist s
+*)
+ | IsCast (c,_) -> redrec (c, largs)
+ | IsMutCase (ci,p,c,lf) ->
(try
redrec
(special_red_case env (whd_betadeltaiota_stack env sigma)
- p c ci lf) largs
+ p c ci lf, largs)
with Redelimination ->
- applist(x,largs))
- | (DOPN(Fix _,_)) ->
- let (reduced,(fix,stack)) =
- reduce_fix (whd_betadeltaiota_stack env sigma) x largs
- in
- if reduced then redrec fix stack else applist(x,largs)
- | _ -> applist(x,largs)
+ applist s)
+ | IsFix fix ->
+ (match reduce_fix
+ (fun (c,l) -> whd_betadeltaiota_stack env sigma c l)
+ fix largs
+ with
+ | Reduced s' -> redrec s'
+ | NotReducible -> applist s)
+ | _ -> applist s
in
- redrec c []
+ redrec (c, [])
(* Simpl reduction tactic: same as simplify, but also reduces
elimination constants *)
let whd_nf env sigma c =
- let rec nf_app c stack =
- match c with
- | DOP2(Lambda,c1,DLAM(name,c2)) ->
+ let rec nf_app (c, stack as s) =
+ match kind_of_term c with
+ | IsLambda (name,c1,c2) ->
(match stack with
| [] -> (c,[])
| a1::rest -> stacklam nf_app [a1] c2 rest)
- | DOPN(AppL,cl) -> nf_app (array_hd cl) (array_app_tl cl stack)
- | DOP2(Cast,c,_) -> nf_app c stack
- | DOPN(Const _,_) ->
+ | IsAppL (f,cl) -> nf_app (f, cl@stack)
+ | IsCast (c,_) -> nf_app (c, stack)
+ | IsConst _ ->
(try
- let (c',lrest) = red_elim_const env sigma c stack in
- nf_app c' lrest
+ nf_app (red_elim_const env sigma c stack)
with Redelimination ->
- (c,stack))
- | DOPN(MutCase _,_) ->
- let (ci,p,d,lf) = destCase c in
+ s)
+ | IsMutCase (ci,p,d,lf) ->
(try
- nf_app (special_red_case env nf_app p d ci lf) stack
+ nf_app
+ (special_red_case env (fun c l -> nf_app (c,l)) p d ci lf,
+ stack)
with Redelimination ->
- (c,stack))
- | DOPN(Fix _,_) ->
- let (reduced,(fix,rest)) = reduce_fix nf_app c stack in
- if reduced then nf_app fix rest else (fix,stack)
- | _ -> (c,stack)
+ s)
+ | IsFix fix ->
+ (match reduce_fix nf_app fix stack with
+ | Reduced s' -> nf_app s'
+ | NotReducible -> s)
+ | _ -> s
in
- applist (nf_app c [])
+ applist (nf_app (c, []))
let nf env sigma c = strong whd_nf env sigma c
@@ -286,65 +292,66 @@ let reduction_of_redexp = function
(* Used in several tactics. *)
-let one_step_reduce env sigma =
- let rec redrec largs x =
- match x with
- | DOP2(Lambda,t,DLAM(n,c)) ->
+let one_step_reduce env sigma c =
+ let rec redrec (x, largs as s) =
+ match kind_of_term x with
+ | IsLambda (n,t,c) ->
(match largs with
| [] -> error "Not reducible 1"
| a::rest -> applistc (subst1 a c) rest)
- | DOPN(AppL,cl) -> redrec (array_app_tl cl largs) (array_hd cl)
- | DOPN(Const _,_) ->
+ | IsAppL (f,cl) -> redrec (f, cl@largs)
+ | IsConst _ ->
(try
let (c',l) = red_elim_const env sigma x largs in applistc c' l
with Redelimination ->
if evaluable_constant env x then
applistc (constant_value env x) largs
else error "Not reductible 1")
+(*
| DOPN(Abst _,_) ->
if evaluable_abst env x then applistc (abst_value env x) largs
else error "Not reducible 0"
- | DOPN(MutCase _,_) ->
- let (ci,p,c,lf) = destCase x in
+*)
+ | IsMutCase (ci,p,c,lf) ->
(try
applistc
(special_red_case env (whd_betadeltaiota_stack env sigma)
p c ci lf) largs
with Redelimination -> error "Not reducible 2")
- | DOPN(Fix _,_) ->
- let (reduced,(fix,stack)) =
- reduce_fix (whd_betadeltaiota_stack env sigma) x largs
- in
- if reduced then applistc fix stack else error "Not reducible 3"
- | DOP2(Cast,c,_) -> redrec largs c
+ | IsFix fix ->
+ (match reduce_fix
+ (fun (x,l) -> whd_betadeltaiota_stack env sigma x l)
+ fix largs
+ with
+ | Reduced s' -> applist s'
+ | NotReducible -> error "Not reducible 3")
+ | IsCast (c,_) -> redrec (c,largs)
| _ -> error "Not reducible 3"
in
- redrec []
+ redrec (c, [])
(* put t as t'=(x1:A1)..(xn:An)B with B an inductive definition of name name
return name, B and t' *)
let reduce_to_mind env sigma t =
let rec elimrec t l =
- match whd_castapp_stack t [] with
- | (DOPN(MutInd mind,args),_) -> ((mind,args),t,prod_it t l)
- | (DOPN(Const _,_),_) ->
- (try
- let t' = nf_betaiota env sigma (one_step_reduce env sigma t) in
- elimrec t' l
- with UserError _ -> errorlabstrm "tactics__reduce_to_mind"
- [< 'sTR"Not an inductive product : it is a constant." >])
- | (DOPN(MutCase _,_),_) ->
+ let c, _ = whd_castapp_stack t [] in
+ match kind_of_term c with
+ | IsMutInd (mind,args) -> ((mind,args),t,it_mkProd_or_LetIn t l)
+ | IsConst _ | IsMutCase _ ->
(try
let t' = nf_betaiota env sigma (one_step_reduce env sigma t) in
elimrec t' l
with UserError _ -> errorlabstrm "tactics__reduce_to_mind"
- [< 'sTR"Not an inductive product:"; 'sPC;
- 'sTR"it is a case analysis term" >])
- | (DOP2(Cast,c,_),[]) -> elimrec c l
- | (DOP2(Prod,ty,DLAM(n,t')),[]) -> elimrec t' ((n,ty)::l)
+ [< 'sTR"Not an inductive product." >])
+ | IsProd (n,ty,t') ->
+ let ty' = Retyping.get_assumption_of (Global.env()) Evd.empty ty in
+ elimrec t' ((n,None,ty')::l)
+ | IsLetIn (n,b,ty,t') ->
+ let ty' = Retyping.get_assumption_of (Global.env()) Evd.empty ty in
+ elimrec t' ((n,Some b,ty')::l)
| _ -> error "Not an inductive product"
- in
+ in
elimrec t []
let reduce_to_ind env sigma t =
diff --git a/pretyping/typing.ml b/pretyping/typing.ml
index 0dc0d0a5b..5dfcfdce3 100644
--- a/pretyping/typing.ml
+++ b/pretyping/typing.ml
@@ -3,7 +3,7 @@
open Util
open Names
-open Generic
+(*i open Generic i*)
open Term
open Environ
open Reduction
@@ -105,7 +105,15 @@ let rec execute mf env sigma cstr =
let j' = execute mf env1 sigma c2 in
let (j,_) = gen_rel env1 sigma name varj j' in
j
-
+
+ | IsLetIn (name,c1,c2,c3) ->
+ let j1 = execute mf env sigma c1 in
+ let j2 = execute mf env sigma c2 in
+ let { uj_val = b; uj_type = t } = cast_rel env sigma j1 j2 in
+ let j3 = execute mf (push_rel_def (name,b,t) env) sigma c3 in
+ { uj_val = mkLetIn (name, j1.uj_val, j2.uj_val, j3.uj_val) ;
+ uj_type = typed_app (subst1 j1.uj_val) j3.uj_type }
+
| IsCast (c,t) ->
let cj = execute mf env sigma c in
let tj = execute mf env sigma t in
diff --git a/proofs/clenv.ml b/proofs/clenv.ml
index 4c2cbf987..ab301c450 100644
--- a/proofs/clenv.ml
+++ b/proofs/clenv.ml
@@ -4,7 +4,7 @@
open Pp
open Util
open Names
-open Generic
+(*i open Generic i*)
open Term
open Sign
open Instantiate
@@ -35,30 +35,26 @@ type wc = walking_constraints
let new_evar_in_sign env =
let ids = ids_of_var_context (Environ.var_context env) in
let ev = new_evar () in
- DOPN(Evar ev, Array.of_list (List.map (fun id -> VAR id) ids))
+ mkEvar (ev, Array.of_list (List.map (fun id -> VAR id) ids))
-let rec whd_evar env sigma = function
- | DOPN(Evar ev,_) as k ->
- if is_defined sigma ev then
- whd_evar env sigma (constant_value env k)
- else
- collapse_appl k
- | t ->
- collapse_appl t
+let rec whd_evar sigma t = match kind_of_term t with
+ | IsEvar (ev,_ as evc) when is_defined sigma ev ->
+ whd_evar sigma (existential_value sigma evc)
+ | _ -> collapse_appl t
let applyHead n c wc =
let rec apprec n c cty wc =
if n = 0 then
(wc,c)
else
- match w_whd_betadeltaiota wc cty with
- | DOP2(Prod,c1,DLAM(_,c2)) ->
+ match kind_of_term (w_whd_betadeltaiota wc cty) with
+ | IsProd (_,c1,c2) ->
let c1ty = w_type_of wc c1 in
let evar = new_evar_in_sign (w_env wc) in
let (evar_n, _) = destEvar evar in
(compose
(apprec (n-1) (applist(c,[evar])) (subst1 evar c2))
- (w_Declare evar_n (DOP2(Cast,c1,c1ty))))
+ (w_Declare evar_n (c1,c1ty)))
wc
| _ -> error "Apply_Head_Then"
in
@@ -82,77 +78,63 @@ let unify_0 mc wc m n =
let env = w_env wc
and sigma = w_Underlying wc in
let rec unirec_rec ((metasubst,evarsubst) as substn) m n =
- let cM = whd_evar env sigma m
- and cN = whd_evar env sigma n in
+ let cM = whd_evar sigma m
+ and cN = whd_evar sigma n in
try
- match (cM,cN) with
- | DOP2(Cast,c,_),t2 -> unirec_rec substn c t2
- | t1,DOP2(Cast,c,_) -> unirec_rec substn t1 c
- | DOP0(Meta k),_ -> (k,cN)::metasubst,evarsubst
- | cM,DOP0(Meta(k)) -> (k,cM)::metasubst,evarsubst
- | DOP2(Lambda,t1,DLAM(_,c1)),DOP2(Lambda,t2,DLAM(_,c2)) ->
+ match (kind_of_term cM,kind_of_term cN) with
+ | IsCast (c,_), _ -> unirec_rec substn c cN
+ | _, IsCast (c,_) -> unirec_rec substn cM c
+ | IsMeta k, _ -> (k,cN)::metasubst,evarsubst
+ | _, IsMeta k -> (k,cM)::metasubst,evarsubst
+ | IsLambda (_,t1,c1), IsLambda (_,t2,c2) ->
unirec_rec (unirec_rec substn t1 t2) c1 c2
- | DOP2(Prod,t1,DLAM(_,c1)),DOP2(Prod,t2,DLAM(_,c2)) ->
+ | IsProd (_,t1,c1), IsProd (_,t2,c2) ->
unirec_rec (unirec_rec substn t1 t2) c1 c2
- | DOPN(AppL,cl1),DOPN(AppL,cl2) ->
- let len1 = Array.length cl1
- and len2 = Array.length cl2 in
+ | IsAppL (f1,l1), IsAppL (f2,l2) ->
+ let len1 = List.length l1
+ and len2 = List.length l2 in
if len1 = len2 then
- array_fold_left2 unirec_rec substn cl1 cl2
+ List.fold_left2 unirec_rec (unirec_rec substn f1 f2) l1 l2
else if len1 < len2 then
- let extras,restcl2 = array_chop ((len2-len1)+1) cl2 in
- array_fold_left2 unirec_rec
- (unirec_rec substn (array_hd cl1) (DOPN(AppL,extras)))
- (array_tl cl1) restcl2
+ let extras,restl2 = list_chop (len2-len1) l2 in
+ List.fold_left2 unirec_rec
+ (unirec_rec substn f1 (applist (f2,extras)))
+ l1 restl2
else
- let extras,restcl1 = array_chop ((len1-len2)+1) cl1 in
- array_fold_left2 unirec_rec
- (unirec_rec substn (DOPN(AppL,extras)) (array_hd cl2))
- restcl1 (array_tl cl2)
+ let extras,restl1 = list_chop (len1-len2) l1 in
+ List.fold_left2 unirec_rec
+ (unirec_rec substn (applist (f1,extras)) f2)
+ restl1 l2
- | DOPN(MutCase _,_),DOPN(MutCase _,_) ->
- let (_,p1,c1,cl1) = destCase cM
- and (_,p2,c2,cl2) = destCase cN in
- if Array.length cl1 = Array.length cl2 then
- array_fold_left2 unirec_rec
- (unirec_rec (unirec_rec substn p1 p2) c1 c2) cl1 cl2
- else
- error_cannot_unify CCI (m,n)
+ | IsMutCase (_,p1,c1,cl1), IsMutCase (_,p2,c2,cl2) ->
+ array_fold_left2 unirec_rec
+ (unirec_rec (unirec_rec substn p1 p2) c1 c2) cl1 cl2
- | DOPN(MutConstruct _,_),DOPN(MutConstruct _,_) ->
+ | IsMutConstruct _, IsMutConstruct _ ->
if is_conv env sigma cM cN then
substn
else
error_cannot_unify CCI (m,n)
- | DOPN(MutInd _,_),DOPN(MutInd _,_) ->
+ | IsMutInd _, IsMutInd _ ->
if is_conv env sigma cM cN then
substn
else
error_cannot_unify CCI (m,n)
- | (DOPN(Evar _,_)),(DOPN((Const _ | Evar _),_)) ->
+ | IsEvar _, _ ->
metasubst,((cM,cN)::evarsubst)
- | (DOPN((Const _ | Evar _),_)),(DOPN(Evar _,_)) ->
+ | _, IsEvar _ ->
metasubst,((cN,cM)::evarsubst)
- | (DOPN(Const _,_)),(DOPN(Const _,_)) ->
- if is_conv env sigma cM cN then
- substn
- else
- error_cannot_unify CCI (m,n)
-
- | (DOPN(Evar _,_)),_ ->
- metasubst,((cM,cN)::evarsubst)
- | (DOPN(Const _,_)),_ ->
+
+ | IsConst _, _ ->
if is_conv env sigma cM cN then
substn
else
error_cannot_unify CCI (m,n)
- | _,(DOPN(Evar _,_)) ->
- metasubst,((cN,cM)::evarsubst)
- | _,(DOPN(Const _,_)) ->
+ | _, IsConst _ ->
if (not (occur_meta cM)) & is_conv env sigma cM cN then
substn
else
@@ -173,19 +155,16 @@ let unify_0 mc wc m n =
unirec_rec (mc,[]) m n
-let whd_castappevar_stack sigma =
- let rec whrec x l =
- match x with
- | DOPN(Evar ev,args) as c ->
- if is_defined sigma ev then
- whrec (existential_value sigma (ev,args)) l
- else
- x,l
- | DOP2(Cast,c,_) -> whrec c l
- | DOPN(AppL,cl) -> whrec (array_hd cl) (array_app_tl cl l)
- | x -> x,l
+let whd_castappevar_stack sigma c l =
+ let rec whrec (c, l as s) =
+ match kind_of_term c with
+ | IsEvar (ev,args) when is_defined sigma ev ->
+ whrec (existential_value sigma (ev,args), l)
+ | IsCast (c,_) -> whrec (c, l)
+ | IsAppL (f,args) -> whrec (f, args@l)
+ | _ -> s
in
- whrec
+ whrec (c,l)
let whd_castappevar sigma c = applist(whd_castappevar_stack sigma c [])
@@ -247,27 +226,29 @@ let rec w_Unify m n mc wc =
and w_resrec metas evars wc =
match evars with
| [] -> (wc,metas)
-
- | (lhs,(DOP0(Meta k) as rhs))::t -> w_resrec ((k,lhs)::metas) t wc
-
- | (DOPN(Evar evn,_) as evar,rhs)::t ->
- if w_defined_evar wc evn then
- let (wc',metas') = w_Unify rhs evar metas wc in
- w_resrec metas' t wc'
- else
- (try
- w_resrec metas t (w_Define evn rhs wc)
- with ex when catchable_exception ex ->
- (match rhs with
- | DOPN(AppL,cl) ->
- (match cl.(0) with
- | DOPN(Const sp,_) ->
- let wc' = mimick_evar cl.(0)
- ((Array.length cl) - 1) evn wc in
- w_resrec metas evars wc'
- | _ -> error "w_Unify")
- | _ -> error "w_Unify"))
- | _ -> anomaly "w_resrec"
+
+ | (lhs,rhs) :: t ->
+ match kind_of_term rhs with
+
+ | IsMeta k -> w_resrec ((k,lhs)::metas) t wc
+
+ | krhs ->
+ match kind_of_term lhs with
+
+ | IsEvar (evn,_) ->
+ if w_defined_evar wc evn then
+ let (wc',metas') = w_Unify rhs lhs metas wc in
+ w_resrec metas' t wc'
+ else
+ (try
+ w_resrec metas t (w_Define evn rhs wc)
+ with ex when catchable_exception ex ->
+ (match krhs with
+ | IsAppL (f,cl) when isConst f ->
+ let wc' = mimick_evar f (List.length cl) evn wc in
+ w_resrec metas evars wc'
+ | _ -> error "w_Unify"))
+ | _ -> anomaly "w_resrec"
(* [unifyTerms] et [unify] ne semble pas gérer les Meta, en
@@ -284,30 +265,20 @@ let unify m gls =
* repetitions and all. *)
let collect_metas c =
- let rec collrec c acc =
- match c with
- | DOP0(Meta mv) -> mv::acc
- | DOP1(oper,c) -> collrec c acc
- | DOP2(oper,c1,c2) -> collrec c1 (collrec c2 acc)
- | DOPN(oper,cl) -> Array.fold_right collrec cl acc
- | DLAM(_,c) -> collrec c acc
- | DLAMV(_,v) -> Array.fold_right collrec v acc
- | _ -> acc
- in
- collrec c []
+ let rec collrec acc c =
+ match splay_constr c with
+ | OpMeta mv, _ -> mv::acc
+ | _, cl -> Array.fold_left collrec acc cl
+ in
+ List.rev (collrec [] c)
let metavars_of c =
- let rec collrec c acc =
- match c with
- | DOP0(Meta mv) -> Intset.add mv acc
- | DOP1(oper,c) -> collrec c acc
- | DOP2(oper,c1,c2) -> collrec c1 (collrec c2 acc)
- | DOPN(oper,cl) -> Array.fold_right collrec cl acc
- | DLAM(_,c) -> collrec c acc
- | DLAMV(_,v) -> Array.fold_right collrec v acc
- | _ -> acc
+ let rec collrec acc c =
+ match splay_constr c with
+ | OpMeta mv, _ -> Intset.add mv acc
+ | _, cl -> Array.fold_left collrec acc cl
in
- collrec c Intset.empty
+ collrec Intset.empty c
let mk_freelisted c =
{ rebus = c; freemetas = metavars_of c }
@@ -336,7 +307,7 @@ let mentions clenv mv0 =
let mk_clenv wc cty =
let mv = new_meta () in
let cty_fls = mk_freelisted cty in
- { templval = mk_freelisted(DOP0(Meta mv));
+ { templval = mk_freelisted (mkMeta mv);
templtyp = cty_fls;
namenv = Intmap.empty;
env = Intmap.add mv (Cltyp cty_fls) Intmap.empty ;
@@ -344,12 +315,12 @@ let mk_clenv wc cty =
let clenv_environments bound c =
let rec clrec (ne,e,metas) n c =
- match n,c with
- | (0, hd) -> (ne,e,List.rev metas,hd)
- | (n, (DOP2(Cast,c,_))) -> clrec (ne,e,metas) n c
- | (n, (DOP2(Prod,c1,DLAM(na,c2)))) ->
+ match n, kind_of_term c with
+ | (0, _) -> (ne, e, List.rev metas, c)
+ | (n, IsCast (c,_)) -> clrec (ne,e,metas) n c
+ | (n, IsProd (na,c1,c2)) ->
let mv = new_meta () in
- let dep = dependent (Rel 1) c2 in
+ let dep = dependent (mkRel 1) c2 in
let ne' =
if dep then
match na with
@@ -365,18 +336,15 @@ let clenv_environments bound c =
ne
in
let e' = Intmap.add mv (Cltyp (mk_freelisted c1)) e in
- clrec (ne',e',DOP0(Meta mv)::metas) (n-1)
- (if dep then (subst1 (DOP0(Meta mv)) c2) else c2)
- | (n, hd) -> (ne,e,List.rev metas,hd)
+ clrec (ne',e', (mkMeta mv)::metas) (n-1)
+ (if dep then (subst1 (mkMeta mv) c2) else c2)
+ | (n, _) -> (ne, e, List.rev metas, c)
in
clrec (Intmap.empty,Intmap.empty,[]) bound c
let mk_clenv_from wc (c,cty) =
let (namenv,env,args,concl) = clenv_environments (-1) cty in
- { templval =
- mk_freelisted (match args with
- | [] -> c
- | _ -> DOPN(AppL,Array.of_list (c::args)));
+ { templval = mk_freelisted (match args with [] -> c | _ -> applist (c,args));
templtyp = mk_freelisted concl;
namenv = namenv;
env = env;
@@ -433,12 +401,12 @@ let clenv_val_of clenv mv =
let rec valrec mv =
try
(match Intmap.find mv clenv.env with
- | Cltyp _ -> DOP0(Meta mv)
+ | Cltyp _ -> mkMeta mv
| Clval(b,_) ->
instance (List.map (fun mv' -> (mv',valrec mv'))
(Intset.elements b.freemetas)) b.rebus)
with Not_found ->
- DOP0(Meta mv)
+ mkMeta mv
in
valrec mv
@@ -461,16 +429,10 @@ let clenv_instance_term clenv c =
let clenv_cast_meta clenv =
let rec crec u =
- match u with
- | DOPN((AppL|MutCase _),_) -> crec_hd u
- | DOP2(Cast,DOP0(Meta _),_) -> u
- | DOPN(c,cl) -> DOPN(c,Array.map crec cl)
- | DOPL(c,cl) -> DOPL(c,List.map crec cl)
- | DOP1(c,t) -> DOP1(c,crec t)
- | DOP2(c,t1,t2) -> DOP2(c,crec t1,crec t2)
- | DLAM(n,c) -> DLAM(n,crec c)
- | DLAMV(n,cl) -> DLAMV(n,Array.map crec cl)
- | x -> x
+ match splay_constr u with
+ | (OpAppL | OpMutCase _), _ -> crec_hd u
+ | OpCast , [|c;_|] when isMeta c -> u
+ | op, cl -> gather_constr (op, Array.map crec cl)
and crec_hd u =
match kind_of_term (strip_outer_cast u) with
@@ -479,7 +441,7 @@ let clenv_cast_meta clenv =
match Intmap.find mv clenv.env with
| Cltyp b ->
let b' = clenv_instance clenv b in
- if occur_meta b' then u else mkCast u b'
+ if occur_meta b' then u else mkCast (u, b')
| Clval(_) -> u
with Not_found ->
u)
@@ -569,30 +531,35 @@ let clenv_instance_type_of ce c =
let clenv_merge with_types =
let rec clenv_resrec metas evars clenv =
match (evars,metas) with
- | ([],[]) -> clenv
-
- | ((lhs,(DOP0(Meta k) as rhs))::t,metas) ->
- clenv_resrec ((k,lhs)::metas) t clenv
-
- | ((DOPN(Evar evn,_) as evar,rhs)::t,metas) ->
- if w_defined_const clenv.hook evar then
- let (metas',evars') = unify_0 [] clenv.hook rhs evar in
- clenv_resrec (metas'@metas) (evars'@t) clenv
- else
- (try
- clenv_resrec metas t (clenv_wtactic (w_Define evn rhs) clenv)
- with ex when catchable_exception ex ->
- (match rhs with
- | DOPN(AppL,cl) ->
- (match cl.(0) with
- | (DOPN(Const _,_) | DOPN(MutConstruct _,_)) ->
- clenv_resrec metas evars
- (clenv_wtactic (mimick_evar cl.(0)
- ((Array.length cl) - 1) evn)
- clenv)
- | _ -> error "w_Unify")
- | _ -> error "w_Unify"))
- | ([],(mv,n)::t) ->
+ | ([], []) -> clenv
+
+ | ((lhs,rhs)::t, metas) ->
+ (match kind_of_term rhs with
+
+ | IsMeta k -> clenv_resrec ((k,lhs)::metas) t clenv
+
+ | krhs ->
+ (match kind_of_term lhs with
+
+ | IsEvar (evn,_) ->
+ if w_defined_evar clenv.hook evn then
+ let (metas',evars') = unify_0 [] clenv.hook rhs lhs in
+ clenv_resrec (metas'@metas) (evars'@t) clenv
+ else
+ (try
+ clenv_resrec metas t
+ (clenv_wtactic (w_Define evn rhs) clenv)
+ with ex when catchable_exception ex ->
+ (match krhs with
+ | IsAppL (f,cl) when isConst f or isMutConstruct f ->
+ clenv_resrec metas evars
+ (clenv_wtactic (mimick_evar f (List.length cl) evn)
+ clenv)
+ | _ -> error "w_Unify"))
+
+ | _ -> anomaly "clenv_resrec"))
+
+ | ([], (mv,n)::t) ->
if clenv_defined clenv mv then
let (metas',evars') =
unify_0 [] clenv.hook (clenv_value clenv mv).rebus n in
@@ -606,8 +573,6 @@ let clenv_merge with_types =
else ([],[]) in
clenv_resrec (mc@t) ec (clenv_assign mv n clenv)
- | _ -> anomaly "clenv_resrec"
-
in clenv_resrec
(* [clenv_unify M N clenv]
@@ -707,39 +672,34 @@ let clenv_refine_cast kONT clenv gls =
try to find a subterm of cl which matches op, if op is just a Meta
FAIL because we cannot find a binding *)
-let constrain_clenv_to_subterm clause = function
- | (DOP0(Meta(_)) as op),_ -> error "Match_subterm"
- | op,cl ->
- let rec matchrec cl =
- let cl = strip_outer_cast cl in
- (try
- if closed0 cl
- then clenv_unify op cl clause,cl
- else error "Bound 1"
- with ex when catchable_exception ex ->
- (match telescope_appl cl with
- | DOPN(AppL,tl) ->
- if Array.length tl = 2 then
- let c1 = tl.(0) and c2 = tl.(1) in
- (try
- matchrec c1
- with ex when catchable_exception ex ->
- matchrec c2)
- else
- error "Match_subterm"
- | DOP2(Prod,t,DLAM(_,c)) ->
- (try
- matchrec t
- with ex when catchable_exception ex ->
- matchrec c)
- | DOP2(Lambda,t,DLAM(_,c)) ->
- (try
- matchrec t
- with ex when catchable_exception ex ->
- matchrec c)
- | _ -> error "Match_subterm"))
- in
- matchrec cl
+let constrain_clenv_to_subterm clause (op,cl) =
+ let rec matchrec cl =
+ let cl = strip_outer_cast cl in
+ (try
+ if closed0 cl
+ then clenv_unify op cl clause,cl
+ else error "Bound 1"
+ with ex when catchable_exception ex ->
+ (match kind_of_term (telescope_appl cl) with
+ | IsAppL (c1,[c2]) ->
+ (try
+ matchrec c1
+ with ex when catchable_exception ex ->
+ matchrec c2)
+ | IsProd (_,t,c) ->
+ (try
+ matchrec t
+ with ex when catchable_exception ex ->
+ matchrec c)
+ | IsLambda (_,t,c) ->
+ (try
+ matchrec t
+ with ex when catchable_exception ex ->
+ matchrec c)
+ | _ -> error "Match_subterm"))
+ in
+ if isMeta op then error "Match_subterm";
+ matchrec cl
(* Possibly gives K-terms in case the operator does not contain
a meta : BUG ?? *)
@@ -822,7 +782,7 @@ let clenv_constrain_missing_args mlist clause =
let occlist = clenv_missing clause (clenv_template clause,
(clenv_template_type clause)) in
if List.length occlist = List.length mlist then
- List.fold_left2 (fun clenv occ m -> clenv_unify (DOP0(Meta occ)) m clenv)
+ List.fold_left2 (fun clenv occ m -> clenv_unify (mkMeta occ) m clenv)
clause occlist mlist
else
error ("Not the right number of missing arguments (expected "
@@ -835,7 +795,7 @@ let clenv_constrain_dep_args mlist clause =
let occlist = clenv_dependent clause (clenv_template clause,
(clenv_template_type clause)) in
if List.length occlist = List.length mlist then
- List.fold_left2 (fun clenv occ m -> clenv_unify (DOP0(Meta occ)) m clenv)
+ List.fold_left2 (fun clenv occ m -> clenv_unify (mkMeta occ) m clenv)
clause occlist mlist
else
error ("Not the right number of missing arguments (expected "
@@ -848,7 +808,7 @@ let clenv_constrain_dep_args_of mv mlist clause =
let occlist = clenv_dependent clause (clenv_value clause mv,
clenv_type clause mv) in
if List.length occlist = List.length mlist then
- List.fold_left2 (fun clenv occ m -> clenv_unify (DOP0(Meta occ)) m clenv)
+ List.fold_left2 (fun clenv occ m -> clenv_unify (mkMeta occ) m clenv)
clause occlist mlist
else
error ("clenv_constrain_dep_args_of: Not the right number " ^
@@ -913,7 +873,7 @@ let clenv_pose_dependent_evars clenv =
let (evar_n,_) = destEvar evar in
let tY = clenv_instance_type clenv mv in
let tYty = w_type_of clenv.hook tY in
- let clenv' = clenv_wtactic (w_Declare evar_n (DOP2(Cast,tY,tYty)))
+ let clenv' = clenv_wtactic (w_Declare evar_n (tY,tYty))
clenv in
clenv_assign mv evar clenv')
clenv
@@ -968,13 +928,14 @@ let secondOrderAbstraction allow_K gl p oplist clause =
let (clause',cllist) =
constrain_clenv_using_subterm_list allow_K clause oplist (pf_concl gl) in
let typp = clenv_instance_type clause' p in
- clenv_unify (DOP0(Meta p))
+ clenv_unify (mkMeta p)
(abstract_list_all (pf_env gl) (project gl) typp (pf_concl gl) cllist)
clause'
let clenv_so_resolver allow_K clause gl =
- match whd_castapp_stack (clenv_instance_template_type clause) [] with
- | (DOP0(Meta(p)),oplist) ->
+ let c, oplist = whd_castapp_stack (clenv_instance_template_type clause) [] in
+ match kind_of_term c with
+ | IsMeta p ->
let clause' = secondOrderAbstraction allow_K gl p oplist clause in
clenv_fo_resolver clause' gl
| _ -> error "clenv_so_resolver"
@@ -991,9 +952,10 @@ let clenv_so_resolver allow_K clause gl =
Meta(1) had meta-variables in it. *)
let clenv_unique_resolver allow_K clenv gls =
- match (whd_castapp_stack (clenv_instance_template_type clenv) [],
- whd_castapp_stack (pf_concl gls) []) with
- | ((DOP0(Meta _) as pathd,_),(DOP2(Lambda,_,_) as glhd,_)) ->
+ let pathd,_ = whd_castapp_stack (clenv_instance_template_type clenv) [] in
+ let glhd,_ = whd_castapp_stack (pf_concl gls) [] in
+ match kind_of_term pathd, kind_of_term glhd with
+ | IsMeta _, IsLambda _ ->
(try
clenv_typed_fo_resolver clenv gls
with ex when catchable_exception ex ->
@@ -1002,7 +964,7 @@ let clenv_unique_resolver allow_K clenv gls =
with ex when catchable_exception ex ->
error "Cannot solve a second-order unification problem")
- | ((DOP0(Meta _),_),_) ->
+ | IsMeta _, _ ->
(try
clenv_so_resolver allow_K clenv gls
with ex when catchable_exception ex ->
diff --git a/proofs/evar_refiner.ml b/proofs/evar_refiner.ml
index abfe2305d..5cb4689ae 100644
--- a/proofs/evar_refiner.ml
+++ b/proofs/evar_refiner.ml
@@ -5,7 +5,7 @@ open Pp
open Util
open Stamps
open Names
-open Generic
+(*i open Generic i*)
open Term
open Environ
open Evd
@@ -120,11 +120,8 @@ let w_hyps wc = var_context (get_env (ids_it wc))
let w_ORELSE wt1 wt2 wc =
try wt1 wc with e when catchable_exception e -> wt2 wc
-let w_Declare sp c (wc : walking_constraints) =
- begin match c with
- | DOP2(Cast,_,_) -> ()
- | _ -> error "Cannot declare an un-casted evar"
- end;
+let w_Declare sp (ty,s) (wc : walking_constraints) =
+ let c = mkCast (ty,s) in
let _ = w_type_of wc c in
let access = get_focus (ids_it wc)
and env = get_env (ids_it wc)in
@@ -134,20 +131,15 @@ let w_Declare sp c (wc : walking_constraints) =
let w_Declare_At sp sp' c = w_Focusing sp (w_Declare sp' c)
let evars_of sigma constr =
- let rec filtrec acc = function
- | DOP0 oper -> acc
- | VAR _ -> acc
- | DOP1(oper,c) -> filtrec acc c
- | DOP2(oper,c1,c2) -> filtrec (filtrec acc c1) c2
- | DOPN(Evar ev,cl) ->
- let newacc = (Array.fold_left filtrec acc cl) in
- if Evd.in_dom (ts_it sigma).decls ev
- then Intset.add ev newacc else newacc
- | DOPN(oper,cl) -> Array.fold_left filtrec acc cl
- | DOPL(oper,cl) -> List.fold_left filtrec acc cl
- | DLAM(_,c) -> filtrec acc c
- | DLAMV(_,v) -> Array.fold_left filtrec acc v
- | _ -> acc
+ let rec filtrec acc c =
+ match splay_constr c with
+ | OpEvar ev, cl ->
+ if Evd.in_dom (ts_it sigma).decls ev then
+ Intset.add ev (Array.fold_left filtrec acc cl)
+ else
+ Array.fold_left filtrec acc cl
+ | _, cl ->
+ Array.fold_left filtrec acc cl
in
filtrec Intset.empty constr
@@ -155,7 +147,7 @@ let w_Define sp c wc =
let spdecl = Evd.map (w_Underlying wc) sp in
let cty =
try
- ctxt_type_of (ids_it (w_Focus sp wc)) (DOP2(Cast,c,spdecl.evar_concl))
+ ctxt_type_of (ids_it (w_Focus sp wc)) (mkCast (c,spdecl.evar_concl))
with Not_found ->
error "Instantiation contains unlegal variables"
in
diff --git a/proofs/evar_refiner.mli b/proofs/evar_refiner.mli
index ef72c9d35..70416a363 100644
--- a/proofs/evar_refiner.mli
+++ b/proofs/evar_refiner.mli
@@ -33,8 +33,8 @@ val walking : w_tactic -> tactic
val w_Focusing_THEN :
evar -> 'a result_w_tactic -> ('a -> w_tactic) -> w_tactic
-val w_Declare : evar -> constr -> w_tactic
-val w_Declare_At : evar -> evar -> constr -> w_tactic
+val w_Declare : evar -> constr * constr -> w_tactic
+val w_Declare_At : evar -> evar -> constr * constr -> w_tactic
val w_Define : evar -> constr -> w_tactic
val w_Underlying : walking_constraints -> evar_declarations
diff --git a/proofs/logic.ml b/proofs/logic.ml
index 8c577f9bc..a92276cc8 100644
--- a/proofs/logic.ml
+++ b/proofs/logic.ml
@@ -5,7 +5,7 @@ open Pp
open Util
open Names
open Evd
-open Generic
+(*i open Generic i*)
open Term
open Sign
open Environ
@@ -56,27 +56,25 @@ let conv_leq_goal env sigma arg ty conclty =
let rec mk_refgoals sigma goal goalacc conclty trm =
let env = goal.evar_env in
- match trm with
- | DOP0(Meta mv) ->
+ match kind_of_term trm with
+ | IsMeta mv ->
if occur_meta conclty then
error "Cannot refine to conclusions with meta-variables";
let ctxt = out_some goal.evar_info in
(mk_goal ctxt env (nf_betaiota env sigma conclty))::goalacc, conclty
- | DOP2(Cast,t,ty) ->
+ | IsCast (t,ty) ->
let _ = type_of env sigma ty in
conv_leq_goal env sigma trm ty conclty;
mk_refgoals sigma goal goalacc ty t
- | DOPN(AppL,cl) ->
- let (acc',hdty) = mk_hdgoals sigma goal goalacc (array_hd cl) in
- let (acc'',conclty') =
- mk_arggoals sigma goal acc' hdty (array_list_of_tl cl) in
+ | IsAppL (f,l) ->
+ let (acc',hdty) = mk_hdgoals sigma goal goalacc f in
+ let (acc'',conclty') = mk_arggoals sigma goal acc' hdty l in
let _ = conv_leq_goal env sigma trm conclty' conclty in
(acc'',conclty')
- | DOPN(MutCase _,_) as mc ->
- let (_,p,c,lf) = destCase mc in
+ | IsMutCase (_,p,c,lf) ->
let (acc',lbrty,conclty') = mk_casegoals sigma goal goalacc p c in
let acc'' =
array_fold_left2
@@ -86,10 +84,10 @@ let rec mk_refgoals sigma goal goalacc conclty trm =
let _ = conv_leq_goal env sigma trm conclty' conclty in
(acc'',conclty')
- | t ->
- if occur_meta t then raise (RefinerError (OccurMeta t));
- let t'ty = type_of env sigma t in
- conv_leq_goal env sigma t t'ty conclty;
+ | _ ->
+ if occur_meta trm then raise (RefinerError (OccurMeta trm));
+ let t'ty = type_of env sigma trm in
+ conv_leq_goal env sigma trm t'ty conclty;
(goalacc,t'ty)
(* Same as mkREFGOALS but without knowing te type of the term. Therefore,
@@ -97,18 +95,17 @@ let rec mk_refgoals sigma goal goalacc conclty trm =
and mk_hdgoals sigma goal goalacc trm =
let env = goal.evar_env in
- match trm with
- | DOP2(Cast,DOP0(Meta mv),ty) ->
+ match kind_of_term trm with
+ | IsCast (c,ty) when isMeta c ->
let _ = type_of env sigma ty in
let ctxt = out_some goal.evar_info in
(mk_goal ctxt env (nf_betaiota env sigma ty))::goalacc,ty
-
- | DOPN(AppL,cl) ->
- let (acc',hdty) = mk_hdgoals sigma goal goalacc (array_hd cl) in
- mk_arggoals sigma goal acc' hdty (array_list_of_tl cl)
-
- | DOPN(MutCase _,_) as mc ->
- let (_,p,c,lf) = destCase mc in
+
+ | IsAppL (f,l) ->
+ let (acc',hdty) = mk_hdgoals sigma goal goalacc f in
+ mk_arggoals sigma goal acc' hdty l
+
+ | IsMutCase (_,p,c,lf) ->
let (acc',lbrty,conclty') = mk_casegoals sigma goal goalacc p c in
let acc'' =
array_fold_left2
@@ -117,17 +114,19 @@ and mk_hdgoals sigma goal goalacc trm =
in
(acc'',conclty')
- | t -> goalacc, type_of env sigma t
+ | _ -> goalacc, type_of env sigma trm
and mk_arggoals sigma goal goalacc funty = function
| [] -> goalacc,funty
- | harg::tlargs ->
- let env = goal.evar_env in
- (match whd_betadeltaiota env sigma funty with
- | DOP2(Prod,c1,DLAM(_,b)) ->
- let (acc',hargty) = mk_refgoals sigma goal goalacc c1 harg in
- mk_arggoals sigma goal acc' (subst1 harg b) tlargs
- | t -> raise (RefinerError (CannotApply (t,harg))))
+ | harg::tlargs as allargs ->
+ let t = whd_betadeltaiota goal.evar_env sigma funty in
+ match kind_of_term t with
+ | IsProd (_,c1,b) ->
+ let (acc',hargty) = mk_refgoals sigma goal goalacc c1 harg in
+ mk_arggoals sigma goal acc' (subst1 harg b) tlargs
+ | IsLetIn (_,c1,_,b) ->
+ mk_arggoals sigma goal goalacc (subst1 c1 b) allargs
+ | _ -> raise (RefinerError (CannotApply (t,harg)))
and mk_casegoals sigma goal goalacc p c =
let env = goal.evar_env in
@@ -144,28 +143,24 @@ and mk_casegoals sigma goal goalacc p c =
varaibles only in Application and Case *)
let collect_meta_variables c =
- let rec collrec acc = function
- | DOP0(Meta mv) -> mv::acc
- | DOP2(Cast,c,_) -> collrec acc c
- | DOPN(AppL,cl) -> Array.fold_left collrec acc cl
- | DOPN(MutCase _,_) as mc ->
- let (_,p,c,lf) = destCase mc in
- Array.fold_left collrec (collrec (collrec acc p) c) lf
+ let rec collrec acc c = match splay_constr c with
+ | OpMeta mv, _ -> mv::acc
+ | OpCast, [|c;_|] -> collrec acc c
+ | (OpAppL | OpMutCase _), cl -> Array.fold_left collrec acc cl
| _ -> acc
in
List.rev(collrec [] c)
let new_meta_variables =
- let rec newrec = function
- | DOP0(Meta _) -> DOP0(Meta (new_meta()))
- | DOP2(Cast,c,t) -> DOP2(Cast, newrec c, t)
- | DOPN(AppL,cl) -> DOPN(AppL, Array.map newrec cl)
- | DOPN(MutCase _,_) as mc ->
- let (ci,p,c,lf) = destCase mc in
- mkMutCaseA ci (newrec p) (newrec c) (Array.map newrec lf)
- | x -> x
+ let rec newrec x = match kind_of_term x with
+ | IsMeta _ -> mkMeta (new_meta())
+ | IsCast (c,t) -> mkCast (newrec c, t)
+ | IsAppL (f,cl) -> applist (newrec f, List.map newrec cl)
+ | IsMutCase (ci,p,c,lf) ->
+ mkMutCaseA ci (newrec p) (newrec c) (Array.map newrec lf)
+ | _ -> x
in
- newrec
+ newrec
let error_use_instantiate () =
errorlabstrm "Logic.prim_refiner"
@@ -299,13 +294,20 @@ let prim_refiner r sigma goal =
| { name = Intro; newids = [id] } ->
if !check && mem_var_context id sign then
error "New variable is already declared";
- (match strip_outer_cast cl with
- | DOP2(Prod,c1,DLAM(_,b)) ->
+ (match kind_of_term (strip_outer_cast cl) with
+ | IsProd (_,c1,b) ->
if occur_meta c1 then error_use_instantiate();
let a = get_assumption_of env sigma c1
and v = VAR id in
let sg = mk_goal info (push_var_decl (id,a) env) (subst1 v b) in
[sg]
+ | IsLetIn (_,c1,t1,b) ->
+ if occur_meta c1 or occur_meta t1 then error_use_instantiate();
+ let a = get_assumption_of env sigma t1
+ and v = VAR id in
+ let sg =
+ mk_goal info (push_var_def (id,c1,a) env) (subst1 v b) in
+ [sg]
| _ ->
if !check then error "Introduction needs a product"
else anomaly "Intro: expects a product")
@@ -313,27 +315,41 @@ let prim_refiner r sigma goal =
| { name = Intro_after; newids = [id]; hypspecs = [whereid] } ->
if !check && mem_var_context id sign then
error "New variable is already declared";
- (match strip_outer_cast cl with
- | DOP2(Prod,c1,DLAM(_,b)) ->
+ (match kind_of_term (strip_outer_cast cl) with
+ | IsProd (_,c1,b) ->
if occur_meta c1 then error_use_instantiate();
let a = get_assumption_of env sigma c1
and v = VAR id in
let env' = insert_after_hyp env whereid (id,None,a) in
let sg = mk_goal info env' (subst1 v b) in
[sg]
+ | IsLetIn (_,c1,t1,b) ->
+ if occur_meta c1 or occur_meta t1 then error_use_instantiate();
+ let a = get_assumption_of env sigma t1
+ and v = VAR id in
+ let env' = insert_after_hyp env whereid (id,Some c1,a) in
+ let sg = mk_goal info env' (subst1 v b) in
+ [sg]
| _ ->
if !check then error "Introduction needs a product"
else anomaly "Intro_after: expects a product")
| { name = Intro_replacing; newids = []; hypspecs = [id] } ->
- (match strip_outer_cast cl with
- | DOP2(Prod,c1,DLAM(_,b)) ->
+ (match kind_of_term (strip_outer_cast cl) with
+ | IsProd (_,c1,b) ->
if occur_meta c1 then error_use_instantiate();
let a = get_assumption_of env sigma c1
and v = VAR id in
let env' = replace_hyp env id (id,None,a) in
let sg = mk_goal info env' (subst1 v b) in
[sg]
+ | IsLetIn (_,c1,t1,b) ->
+ if occur_meta c1 then error_use_instantiate();
+ let a = get_assumption_of env sigma t1
+ and v = VAR id in
+ let env' = replace_hyp env id (id,Some c1,a) in
+ let sg = mk_goal info env' (subst1 v b) in
+ [sg]
| _ ->
if !check then error "Introduction needs a product"
else anomaly "Intro_replacing: expects a product")
@@ -341,13 +357,13 @@ let prim_refiner r sigma goal =
| { name = Fix; hypspecs = []; terms = [];
newids = [f]; params = [Num(_,n)] } ->
let rec check_ind k cl =
- match whd_castapp cl with
- | DOP2(Prod,c1,DLAM(_,b)) ->
+ match kind_of_term (whd_castapp cl) with
+ | IsProd (_,c1,b) ->
if k = 1 then
- (try
- let _ = find_minductype env sigma c1 in ()
- with Induc ->
- error "cannot do a fixpoint on a non inductive type")
+ try
+ let _ = find_minductype env sigma c1 in ()
+ with Induc ->
+ error "cannot do a fixpoint on a non inductive type"
else
check_ind (k-1) b
| _ -> error "not enough products"
@@ -361,13 +377,13 @@ let prim_refiner r sigma goal =
| { name = Fix; hypspecs = []; terms = lar; newids = lf; params = ln } ->
let rec check_ind k cl =
- match whd_castapp cl with
- | DOP2(Prod,c1,DLAM(_,b)) ->
+ match kind_of_term (whd_castapp cl) with
+ | IsProd (_,c1,b) ->
if k = 1 then
- (try
- fst (find_minductype env sigma c1)
- with Induc ->
- error "cannot do a fixpoint on a non inductive type")
+ try
+ fst (find_minductype env sigma c1)
+ with Induc ->
+ error "cannot do a fixpoint on a non inductive type"
else
check_ind (k-1) b
| _ -> error "not enough products"
@@ -392,14 +408,15 @@ let prim_refiner r sigma goal =
| { name = Cofix; hypspecs = []; terms = lar; newids = lf; params = [] } ->
let rec check_is_coind cl =
- match (whd_betadeltaiota env sigma (whd_castapp cl)) with
- | DOP2(Prod,c1,DLAM(_,b)) -> check_is_coind b
- | b ->
- (try
- let _ = find_mcoinductype env sigma b in ()
- with Induc ->
- error ("All methods must construct elements " ^
- "in coinductive types"))
+ let b = whd_betadeltaiota env sigma (whd_castapp cl) in
+ match kind_of_term b with
+ | IsProd (_,c1,b) -> check_is_coind b
+ | _ ->
+ try
+ let _ = find_mcoinductype env sigma b in ()
+ with Induc ->
+ error ("All methods must construct elements " ^
+ "in coinductive types")
in
List.iter check_is_coind (cl::lar);
let rec mk_env env = function
@@ -416,17 +433,6 @@ let prim_refiner r sigma goal =
in
mk_env env (cl::lar,lf)
-(* let rec mk_sign sign = function
- | (ar::lar'),(f::lf') ->
- if (mem_sign sign f) then
- error "name already used in the environment";
- let a = get_assumption_of env sigma ar in
- mk_sign (add_var_decl (f,a) sign) (lar',lf')
- | ([],[]) -> List.map (mk_goal info env) (cl::lar)
- | _ -> error "not the right number of arguments"
- in
- mk_sign sign (cl::lar,lf)*)
-
| { name = Refine; terms = [c] } ->
let c = new_meta_variables c in
let (sgl,cl') = mk_refgoals sigma goal [] cl c in
@@ -436,7 +442,7 @@ let prim_refiner r sigma goal =
| { name = Convert_concl; terms = [cl'] } ->
let cl'ty = type_of env sigma cl' in
if is_conv_leq env sigma cl' cl then
- let sg = mk_goal info env (DOP2(Cast,cl',cl'ty)) in
+ let sg = mk_goal info env (mkCast (cl',cl'ty)) in
[sg]
else
error "convert-concl rule passed non-converting term"
@@ -468,30 +474,31 @@ let prim_extractor subfun vl pft =
let cl = pft.goal.evar_concl in
match pft with
| { ref = Some (Prim { name = Intro; newids = [id] }, [spf]) } ->
- (match strip_outer_cast cl with
- | DOP2(Prod,ty,b) ->
+ (match kind_of_term (strip_outer_cast cl) with
+ | IsProd (_,ty,_) ->
let cty = subst_vars vl ty in
- DOP2(Lambda,cty, DLAM(Name id,subfun (id::vl) spf))
+ mkLambda (Name id, cty, subfun (id::vl) spf)
| _ -> error "incomplete proof!")
| { ref = Some (Prim { name = Intro_after; newids = [id]}, [spf]) } ->
- (match strip_outer_cast cl with
- | DOP2(Prod,ty,b) ->
+ (match kind_of_term (strip_outer_cast cl) with
+ | IsProd (_,ty,_) ->
let cty = subst_vars vl ty in
- DOP2(Lambda,cty, DLAM(Name id,subfun (id::vl) spf))
+ mkLambda (Name id, cty, subfun (id::vl) spf)
| _ -> error "incomplete proof!")
| {ref=Some(Prim{name=Intro_replacing;hypspecs=[id]},[spf]) } ->
- (match strip_outer_cast cl with
- | DOP2(Prod,ty,b) ->
+ (match kind_of_term (strip_outer_cast cl) with
+ | IsProd (_,ty,_) ->
let cty = subst_vars vl ty in
- DOP2(Lambda,cty,DLAM(Name id,subfun (id::vl) spf))
+ mkLambda (Name id, cty, subfun (id::vl) spf)
| _ -> error "incomplete proof!")
| {ref=Some(Prim{name=Fix;newids=[f];params=[Num(_,n)]},[spf]) } ->
let cty = subst_vars vl cl in
let na = Name f in
- DOPN(Term.Fix([|n-1|],0),[| cty ; DLAMV(na,[|subfun (f::vl) spf|])|])
+ mkFix (([|n-1|],0),([|cty|], [na], [|subfun (f::vl) spf|]))
+
| {ref=Some(Prim{name=Fix;newids=lf;terms=lar;params=ln},spfl) } ->
let lcty = List.map (subst_vars vl) (cl::lar) in
let vn =
diff --git a/proofs/pfedit.ml b/proofs/pfedit.ml
index 6bea1e819..c660b35ef 100644
--- a/proofs/pfedit.ml
+++ b/proofs/pfedit.ml
@@ -5,7 +5,7 @@ open Pp
open Util
open Names
open Sign
-open Generic
+(*i open Generic i*)
open Term
open Declarations
open Environ
diff --git a/proofs/refiner.ml b/proofs/refiner.ml
index 333287b3e..badf6bc7a 100644
--- a/proofs/refiner.ml
+++ b/proofs/refiner.ml
@@ -4,7 +4,7 @@
open Pp
open Util
open Stamps
-open Generic
+(*i open Generic i*)
open Term
open Sign
open Evd
@@ -271,7 +271,7 @@ let extract_open_proof sigma pf =
let ass = Retyping.get_assumption_of goal.evar_env sigma abs_concl in
let mv = new_meta() in
open_obligations := (mv,ass):: !open_obligations;
- applist(DOP0(Meta mv),List.map (fun (n,_) -> Rel n) sorted_rels)
+ applist (mkMeta mv, List.map (fun (n,_) -> mkRel n) sorted_rels)
| _ -> anomaly "Bug : a case has been forgotten in proof_extractor"
in
diff --git a/proofs/tacinterp.ml b/proofs/tacinterp.ml
index 1feb14508..28eaa7ad4 100644
--- a/proofs/tacinterp.ml
+++ b/proofs/tacinterp.ml
@@ -3,7 +3,7 @@
open Astterm
open Closure
-open Generic
+(*i open Generic i*)
open Libobject
open Pattern
open Pp
diff --git a/proofs/tacmach.ml b/proofs/tacmach.ml
index 1488b06de..e8d4be64e 100644
--- a/proofs/tacmach.ml
+++ b/proofs/tacmach.ml
@@ -4,7 +4,7 @@
open Util
open Stamps
open Names
-open Generic
+(*i open Generic i*)
open Sign
open Term
open Instantiate
@@ -104,7 +104,7 @@ let pf_reduce_to_ind = pf_reduce reduce_to_ind
let hnf_type_of gls = compose (pf_whd_betadeltaiota gls) (pf_type_of gls)
let pf_check_type gls c1 c2 =
- let casted = mkCast c1 c2 in pf_type_of gls casted
+ let casted = mkCast (c1, c2) in pf_type_of gls casted
(************************************)
(* Tactics handling a list of goals *)
diff --git a/proofs/tacmach.mli b/proofs/tacmach.mli
index bf2b0a3ba..e6130c3f6 100644
--- a/proofs/tacmach.mli
+++ b/proofs/tacmach.mli
@@ -191,8 +191,8 @@ val walking_THEN : 'a result_w_tactic -> ('a -> tactic) -> tactic
val walking : w_tactic -> tactic
val w_Focusing_THEN : int -> 'a result_w_tactic
-> ('a -> w_tactic) -> w_tactic
-val w_Declare : int -> constr -> w_tactic
-val w_Declare_At : int -> int -> constr -> w_tactic
+val w_Declare : int -> constr * constr -> w_tactic
+val w_Declare_At : int -> int -> constr * constr -> w_tactic
val w_Define : int -> constr -> w_tactic
val w_Underlying : walking_constraints -> evar_declarations
val w_env : walking_constraints -> env
diff --git a/syntax/PPConstr.v b/syntax/PPConstr.v
index ad74cd462..25f8a2c7f 100755
--- a/syntax/PPConstr.v
+++ b/syntax/PPConstr.v
@@ -129,6 +129,7 @@ Syntax constr
| lambdal_cons [(LAMLBOX $pbi $c (IDS ($LIST $ids)) [$id]$body)]
-> [(LAMLBOX $pbi $c (IDS ($LIST $ids) $id) $body)]
+ | letin [<<[$x = $A] $B>>] -> [ [ <hov 0> "[" $x ":=" $A "]" [0 1] $B:E ] ]
| pi [<<($x : $A)$B>>] -> [(PRODBOX (BINDERS) <<($x : $A)$B>>)]
| prodlist [(PRODLIST $c $b)]