Skip to Content.
Sympa Menu

coq-club - [Coq-Club] Dependent match on two vectors

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

[Coq-Club] Dependent match on two vectors


Chronological Thread 
  • From: Vincent Siles <vincent.siles AT ens-lyon.org>
  • To: Coq-Club Club <coq-club AT inria.fr>
  • Subject: [Coq-Club] Dependent match on two vectors
  • Date: Wed, 10 Oct 2018 15:37:29 +0200
  • Authentication-results: mail3-smtp-sop.national.inria.fr; spf=None smtp.pra=vincent.siles AT ens-lyon.org; spf=None smtp.mailfrom=SRS0=IJ69=MW=ens-lyon.org=vincent.siles AT bounce.ens-lyon.org; spf=Pass smtp.helo=postmaster AT sonata.ens-lyon.org
  • Ironport-phdr: 9a23:4++ilR2TrReg5SYqsmDT+DRfVm0co7zxezQtwd8ZseIRK/ad9pjvdHbS+e9qxAeQG9mDtLQc06L/iOPJYSQ4+5GPsXQPItRndiQuroEopTEmG9OPEkbhLfTnPGQQFcVGU0J5rTngaRAGUMnxaEfPrXKs8DUcBgvwNRZvJuTyB4Xek9m72/q99pHPYQhEniaxba9vJxiqsAvdsdUbj5F/Iagr0BvJpXVIe+VSxWx2IF+Yggjx6MSt8pN96ipco/0u+dJOXqX8ZKQ4UKdXDC86PGAv5c3krgfMQA2S7XYBSGoWkx5IAw/Y7BHmW5r6ryX3uvZh1CScIMb7Vq4/Vyi84Kh3SR/okCYHOCA/8GHLkcx7kaZXrAu8qxBj34LYZYeYP+d8cKzAZ9MXXWVOUMZfWSJCH42ycZcAAvEbMupEtYTwvUcCoQe8CASqGejhyiVIhnjz3aAi3OshEAfG0xA+ENIIrHTfscj7NKYWUe+r16nD0DLOb+1X2Tf79IfHbBYhoe2WUbJrcMrRzVcgFxjeg1qOr4zlJCqZ1uANsmic6epsT+Wvi3QoqwxopDWk28QiipHRi44IxV3I6T91zYQ3KNGiVUJ2YN+pHIFNuyyUNIZ6Wt0uT31stSogybALuYS3cDULxZkm3RLTdv6KfouO7xn+TuieOy14i2hgeL+nhxa970ygyurkW8mv11ZKqDBKksXWuXwXyRPT7NOHRuJ5/kah3jaP0Rrf6uZeIUA7jabbKpghzaAslpcLrEjOETP6lF/0gaKUbEko5+ml5uX9brn7qJKRNJd4igTkPaQvnsy/D/44Mg8LX2WD5OqyyKDt8VHhTbtJivM7k63UvYjdK8sbvqO2HQlV0p065xa7Dzam19IYkWMALFJfdxKKl5bpO1DIIP/kE/i/hUisnC1wx/DHOr3uHI7NI2PYn7fmYLZ97VJTxxQpwd9B4ZJUEagNIPbzW0/2stzUFBg5Mxa7w+r/EtVyypseWX6TAq+eKK7drViI5vs2L+aQYI8VpS3yJuM+5//uiH85gUUScbOo3ZsRcnC4H+5pL1+XYXr20Z89FjIhuRN7Z+j3ghWpVSNZLyK5WLt57TUmAqqnC53CT8ajmurS8j28G8hoZ2ZNB1aQWUzpc4ifE6MSaSSZL8l91CcFUbW6Y4InzlSqpQj8jb19IbyHqWUjqZv/2Y0ttKXonhYo+GkxVpzFijDffyRPhmoNAgQO8uV6qE15xE2E1PIh0fZfCNpY6rVEVBx/MY/byap9Ed+gAludLOfMc06vR5CdOR90Vsg4moNcbkBmXtGziRaF2DClUedMyu67Qacs+6eZ5EDfYsZwz3Gcjfs6iF8vXsIJOGu9w6pu8A6VAJTGwRyU

Dear Coq-Clubbers, 
I'm trying to define the product of two vectors of the same size, with something like

Inductive vec (A: Type) : nat -> Type :=
  | vnil  : vec A 0
  | vcons : forall n, A -> vec A n -> vec A (1 + n)
.

Arguments vnil [A].
Arguments vcons [A] n hd tl.

Fixpoint vprod (n: nat) (v1 v2: vec nat n) : nat :=
  match v1 in vec _ n0, v2 in vec _ n0 return nat with
    | vnil, vnil => 0
    | vnil, vcons _ _ _ => False_rect nat _  (* 1 *)
    | vcons _ _ _, vnil => False_rect nat _  (* 1 *)
    | vcons _ hd1 tl1, vcons _ hd2 tl2 => (hd1 * hd2) + vprod _ tl1 tl2 (* 2 *)
  end
.

But I have two issues:
- Impossible branches (* 1 *) fail with 'False_rec nat has type False -> nat instead of nat' if I don't add the _. I usually don't have to do that on impossible branches
- (* 2 *) fails with 

In environment
vprod : forall n : nat, vec nat n -> vec nat n -> nat
n : nat
v1 : vec nat n
v2 : vec nat n
n0 : nat
hd1 : nat
tl1 : vec nat n0
v0 : vec nat (1 + n0)
n1 : nat
hd2 : nat
tl2 : vec nat n1
The term "tl2" has type "vec nat n1"
while it is expected to have type
 "vec nat n0".
 

How can I unify ""n0"" and ""n1"" here so that it types check ? I presume my match statement is buggy

Best,
V.



Archive powered by MHonArc 2.6.18.

Top of Page