blob: 6e568e9122932a79e336023f9fe97ee29866e6da (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
(* $Id$ *)
(*i*)
open Names
open Univ
open Term
open Sign
(*i*)
(* Inductive types (internal representation). *)
type recarg =
| Param of int
| Norec
| Mrec of int
| Imbr of inductive_path * (recarg list)
type mutual_inductive_packet = {
mind_consnames : identifier array;
mind_typename : identifier;
mind_lc : constr;
mind_arity : typed_type;
mind_kelim : sorts list;
mind_listrec : (recarg list) array;
mind_finite : bool }
type mutual_inductive_body = {
mind_kind : path_kind;
mind_ntypes : int;
mind_hyps : typed_type signature;
mind_packets : mutual_inductive_packet array;
mind_constraints : constraints;
mind_singl : constr option;
mind_nparams : int }
val mind_type_finite : mutual_inductive_body -> int -> bool
(*s To give a more efficient access to the informations related to a given
inductive type, we introduce the following type [mind_specif], which
contains all the informations about the inductive type, including its
instanciation arguments. *)
type mind_specif = {
mis_sp : section_path;
mis_mib : mutual_inductive_body;
mis_tyi : int;
mis_args : constr array;
mis_mip : mutual_inductive_packet }
val mis_ntypes : mind_specif -> int
val mis_nconstr : mind_specif -> int
val mis_nparams : mind_specif -> int
val mis_kelim : mind_specif -> sorts list
val mis_recargs : mind_specif -> (recarg list) array array
val mis_recarg : mind_specif -> (recarg list) array
val mis_typename : mind_specif -> identifier
val is_recursive : int list -> recarg list array -> bool
val mis_is_recursive : mind_specif -> bool
val mis_consnames : mind_specif -> identifier array
val mind_nth_type_packet :
mutual_inductive_body -> int -> mutual_inductive_packet
(*s This type gathers useful informations about some instance of a constructor
relatively to some implicit context (the current one)
If [cs_cstr] is a constructor in [(I p1...pm a1...an)] then
[cs_params] is [p1...pm] and the type of [MutConstruct(cs_cstr)
p1...pn] is [(cs_args)(I p1...pm cs_concl_realargs)] where [cs_args]
and [cs_params] are relative to the current env and [cs_concl_realargs]
is relative to the current env enriched by [cs_args]
*)
type constructor_summary = {
cs_cstr : constructor;
cs_params : constr list;
cs_nargs : int;
cs_args : (name * constr) list;
cs_concl_realargs : constr array
}
(*s A variant of [mind_specif_of_mind] with pre-splitted args
Invariant: We have \par
[Hnf (fullmind)] = [DOPN(AppL,[|MutInd mind;..params..;..realargs..|])] \par
with [mind] = [((sp,i),localvars)] for some [sp, i, localvars].
[make_constrs] is a receipt to build constructor instantiated by
local vars and params; it is a closure which does not need to be
lifted; it must be applied to [mind] and [params] to get the constructors
correctly lifted and instantiated
[make_arity] is a receipt to build the arity instantiated by local
vars and by params; it is a closure which does not need to be
lifted. Arity is pre-decomposed into its real parameters and its
sort; it must be applied to [mind] and [params] to get the arity
correctly lifted and instantiated
*)
type inductive_summary = {
fullmind : constr;
mind : inductive;
params : constr list;
realargs : constr list;
nparams : int;
nrealargs : int;
nconstr : int;
make_arity : inductive -> constr list -> (name * constr) list * sorts;
make_constrs : inductive -> constr list -> constructor_summary array
}
(*s Declaration of inductive types. *)
type mutual_inductive_entry = {
mind_entry_nparams : int;
mind_entry_finite : bool;
mind_entry_inds : (identifier * constr * identifier list * constr) list }
(*s The different kinds of errors that may result of a malformed inductive
definition. *)
type inductive_error =
| NonPos of name list * constr * constr
| NotEnoughArgs of name list * constr * constr
| NotConstructor of name list * constr * constr
| NonPar of name list * constr * int * constr * constr
| SameNamesTypes of identifier
| SameNamesConstructors of identifier * identifier
| NotAnArity of identifier
| BadEntry
exception InductiveError of inductive_error
(*s The following functions are utility functions to check and to
decompose a declaration. *)
(* [mind_check_names] checks the names of an inductive types declaration
i.e. that all the types and constructors names are distinct.
It raises an exception [InductiveError _] if it is not the case. *)
val mind_check_names : mutual_inductive_entry -> unit
(* [mind_extract_and_check_params] extracts the parameters of an inductive
types declaration. It raises an exception [InductiveError _] if there is
not enough abstractions in any of the terms of the field
[mind_entry_inds]. *)
val mind_extract_and_check_params :
mutual_inductive_entry -> (name * constr) list
val mind_extract_params : int -> constr -> (name * constr) list * constr
val mind_check_lc : (name * constr) list -> mutual_inductive_entry -> unit
val inductive_of_constructor : constructor -> inductive
val ith_constructor_of_inductive : inductive -> int -> constructor
val inductive_path_of_constructor_path : constructor_path -> inductive_path
val ith_constructor_path_of_inductive_path :
inductive_path -> int -> constructor_path
(* This builds [(ci params (Rel 1)...(Rel ci_nargs))] which is the argument
of predicate in a cases branch *)
val build_dependent_constructor : constructor_summary -> constr
(* This builds [(I params (Rel 1)...(Rel nrealargs))] which is the argument
of predicate in a cases branch *)
val build_dependent_inductive : inductive_summary -> constr
|