From f1d236b83003eda71e12840732d159fd23b1b771 Mon Sep 17 00:00:00 2001 From: xleroy Date: Tue, 29 Apr 2014 13:58:18 +0000 Subject: 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 --- cparser/validator/Tuples.v | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 cparser/validator/Tuples.v (limited to 'cparser/validator/Tuples.v') 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. -- cgit