diff options
author | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2014-04-29 13:58:18 +0000 |
---|---|---|
committer | xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e> | 2014-04-29 13:58:18 +0000 |
commit | f1d236b83003eda71e12840732d159fd23b1b771 (patch) | |
tree | 0edad805ea24f7b626d2c6fee9fc50da23acfc47 /cparser/validator/Tuples.v | |
parent | 39df8fb19bacb38f317abf06de432b83296dfdd1 (diff) | |
download | compcert-f1d236b83003eda71e12840732d159fd23b1b771.tar.gz compcert-f1d236b83003eda71e12840732d159fd23b1b771.zip |
Integration of Jacques-Henri Jourdan's verified parser.
(Merge of branch newparser.)
git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@2469 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e
Diffstat (limited to 'cparser/validator/Tuples.v')
-rw-r--r-- | cparser/validator/Tuples.v | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/cparser/validator/Tuples.v b/cparser/validator/Tuples.v new file mode 100644 index 00000000..88dc46e9 --- /dev/null +++ b/cparser/validator/Tuples.v @@ -0,0 +1,46 @@ +(* *********************************************************************) +(* *) +(* The Compcert verified compiler *) +(* *) +(* Jacques-Henri Jourdan, INRIA Paris-Rocquencourt *) +(* *) +(* Copyright Institut National de Recherche en Informatique et en *) +(* Automatique. All rights reserved. This file is distributed *) +(* under the terms of the GNU General Public License as published by *) +(* the Free Software Foundation, either version 2 of the License, or *) +(* (at your option) any later version. This file is also distributed *) +(* under the terms of the INRIA Non-Commercial License Agreement. *) +(* *) +(* *********************************************************************) + +Require Import List. +Require Import Coq.Program.Syntax. +Require Import Equality. + +(** A curryfied function with multiple parameters **) +Definition arrows_left: list Type -> Type -> Type := + fold_left (fun A B => B -> A). + +(** A curryfied function with multiple parameters **) +Definition arrows_right: Type -> list Type -> Type := + fold_right (fun A B => A -> B). + +(** A tuple is a heterogeneous list. For convenience, we use pairs. **) +Definition tuple (types:list Type) : Type := + fold_right prod unit types. + +Fixpoint uncurry {args:list Type} {res:Type}: + arrows_left args res -> tuple args -> res := + match args return forall res, arrows_left args res -> tuple args -> res with + | [] => fun _ f _ => f + | t::q => fun res f p => let (d, t) := p in + (@uncurry q _ f t) d + end res. + +Lemma JMeq_eqrect: + forall (U:Type) (a b:U) (P:U -> Type) (x:P a) (e:a=b), + eq_rect a P x b e ~= x. +Proof. +destruct e. +reflexivity. +Qed. |