coq-club AT inria.fr
Subject: The Coq mailing list
List archive
- From: Arthur Azevedo de Amorim <arthur.aa AT gmail.com>
- To: AUGER Cédric <sedrikov AT gmail.com>
- Cc: coq-club AT inria.fr
- Subject: Re: [Coq-Club] Dependent pattern-matching
- Date: Sun, 4 Nov 2012 13:05:09 -0500
Thanks a lot Cédric. Is there any reason why Coq would infer one annotation for one match and not for the other?
On Wed, Oct 31, 2012 at 4:13 AM, AUGER Cédric <sedrikov AT gmail.com> wrote:
Le Wed, 31 Oct 2012 03:04:06 -0400,
Arthur Azevedo de Amorim <arthur.aa AT gmail.com> a écrit :
You did not tried this term in this context.
> Dear list,
>
> Suppose that we have the following definition of bounded nats:
>
> Inductive fin : nat -> Set :=
> | First : forall n, fin (S n)
> | Next : forall n, fin n -> fin (S n).
>
> Then, I try to define a function fminus : forall n, fin (S n) -> nat
> in the following way (this is *not* supposed to be a nice definition)
>
> Fixpoint fminus' n (fn : fin (S n)) : nat :=
> match n return fin (S n) -> nat with
> | O => fun fn => O
> | S n' => fun fn =>
> match fn in fin n'' return
> match n'' with
> | O => unit
> | S O => unit
> | S _ => nat
> end with
> | First n''' =>
> match n''' return
> match n''' with
> | O => unit
> | S _ => nat
> end with
> | O => tt
> | S _ => n
> end
> | Next n''' fn' =>
> match n''' return fin n''' ->
> match n''' with
> | O => unit
> | S _ => nat
> end with
> | O => fun _ => tt
> | S _ => fun fn' => fminus fn'
> end fn'
> end
> end fn.
>
> Coq complains, saying
>
> Error: In pattern-matching on term "fn0" the branch for constructor
> "Next" has type
> "forall n''' : nat, fin n''' -> match n''' with
> | 0 => unit
> | S _ => nat
> end" which should be
> "forall n : nat, fin n -> match n with
> | 0 => unit
> | S _ => nat
> end".
>
> However, this very similar term (that doesn't do the same thing,
> though) does typecheck:
"fminus" is not defined, and "fminus'" is not used inside your fixpoint.
And you didn't mistyped "fminus" instead of "fminus'" since by
correcting it this way, you get an obvious type checking error (which
is not related to dependent types).
I corrected it as:
» | S k => fun fn' => fminus' k fn'
which seems to give your error back.
Then activating display of all low level contents, I get:
"Next" has type "forall (n''' : nat) (_ : fin n'''),
Error: In pattern-matching on term "fn0" the branch for constructor
match n''' return Set with
| O => unitend" which should be
| S _ => nat
"forall (n : nat) (_ : fin n),
match n return Type (* Top.68 *) with
| O => unitend".
| S _ => nat
» | Next n''' fn' =>
» match n''' return fin n''' ->» end : Type (*yes I know, that seems weird*) with
» match n''' with
» | O => unit
» | S _ => nat
» | O => fun _ => ttworks.
When you have an "<x> has type <y> while it should be <y>" error,
display all. Some important type information may be omitted by implicit
arguments or similar stuff.
>
> Fixpoint fminus' n (fn : fin (S n)) : nat :=
> match n return fin (S n) -> nat with
> | O => fun fn => O
> | S n' => fun fn =>
> match fn in fin n'' return
> match n'' with
> | O => unit
> | S O => unit
> | S _ => nat
> end with
> | First n''' =>
> match n''' return
> match n''' with
> | O => unit
> | S _ => nat
> end with
> | O => tt
> | S _ => n
> end
> | Next n''' fn' =>
> match n''' return
> match n''' with
> | O => unit
> | S _ => nat
> end with
> | O => tt
> | S _ => n
> end
> end
> end fn.
>
> (Notice that in the Next branch we are not abstracting over fin n'''
> anymore).
>
> Any thoughts on why this doesn't work?
>
Arthur Azevedo de Amorim
- Re: [Coq-Club] Dependent pattern-matching, Arthur Azevedo de Amorim, 11/04/2012
- Re: [Coq-Club] Dependent pattern-matching, AUGER Cédric, 11/04/2012
- <Possible follow-up(s)>
- Re: [Coq-Club] Dependent pattern-matching, Arthur Azevedo de Amorim, 11/04/2012
Archive powered by MHonArc 2.6.18.