How can I declare an array type variable defined as follows:
Inductive array (n : nat) : Type :=
tab : forall l : list Z, length l = n -> array n.
I want to declare as:
arrayConstant: array
You could write arrayConstant : array 10
instead, for an array of length 10.
In general, yoy want arrayConstant : array m
for some term m
of type nat
; my last example used m = 10
, but that's just an example.
Thank you for your reply.
I tried to do something like this but got the error : The reference n was not found in the current environment.
With code :
Inductive array (n : nat) : Type :=
tab : forall l : list nat, length l = n -> array n.
Definition n : nat.
Inductive Const : Type :=
| arrayConstant : array n -> Const.
Is it that you want Variable
rather than Definition
? A definition has to have a body, i.e, a specific natural number in this case.
Indeed, n
is not available after Definition n : nat.
— that command just _starts_ a definition, but n
is only available when you've _completed_ the definition — say, after Defined.
eg n
is available after
Definition n : nat.
exact 42.
Defined.
but that is best written as
Definition n : nat := 42.
I don't need to specify a value.
I'm looking to define an array type for some semantics.
Can you say a bit more about what you're trying to do, and why neither Definition
nor Variable
is the right thing?
Do you want to say something like “a Const
can be an array
of arbitrary length”? That'd look like:
Inductive Const : Type :=
| arrayConst {n} : array n -> Const.
(with no Definition
or Variable
or whatever). The idea is that the length is another piece of data packed into the constructor arrayConst
(along with the actual array).
I want to define an array type.
Then use this definition as a type.
How can I make this piece of code work:
Inductive array (n : nat) : Type :=
tab : forall l : list nat, length l = n -> array n.
Inductive Const : Type :=
| arrayConstant : array -> Const.
In case it helps, you can also consider the type { n & array n }
(using notation https://coq.inria.fr/distrib/current/stdlib/Coq.Init.Specif.html#e6a434cae860987d1c5f61b342cc9e57), which is what you might be thinking of when you want to use array
as a type (the total space of arrays). By Currying, declaring arrayConstant : { n & array n } -> Const
is equivalent (at the level of isomorphism) to what I gave before.
Thanks a lot.
Last updated: Sep 23 2023 at 13:01 UTC