Mercurial > cpdt > repo
diff src/DepList.v @ 114:2f97c8177172
DepList
author | Adam Chlipala <adamc@hcoop.net> |
---|---|
date | Tue, 14 Oct 2008 14:49:51 -0400 |
parents | |
children | 9ccd215e5112 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/DepList.v Tue Oct 14 14:49:51 2008 -0400 @@ -0,0 +1,76 @@ +(* Copyright (c) 2008, Adam Chlipala + * + * This work is licensed under a + * Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 + * Unported License. + * The license text is available at: + * http://creativecommons.org/licenses/by-nc-nd/3.0/ + *) + +(* Dependent list types presented in Chapter 8 *) + +Require Import List. + +Set Implicit Arguments. + + +Section ilist. + Variable A : Set. + + Fixpoint ilist (n : nat) : Set := + match n with + | O => unit + | S n' => A * ilist n' + end%type. + + Fixpoint index (n : nat) : Set := + match n with + | O => Empty_set + | S n' => option (index n') + end. + + Fixpoint get (n : nat) : ilist n -> index n -> A := + match n return ilist n -> index n -> A with + | O => fun _ idx => match idx with end + | S n' => fun ls idx => + match idx with + | None => fst ls + | Some idx' => get n' (snd ls) idx' + end + end. +End ilist. + +Implicit Arguments get [A n]. + +Section hlist. + Variable A : Type. + Variable B : A -> Type. + + Fixpoint hlist (ls : list A) : Type := + match ls with + | nil => unit + | x :: ls' => B x * hlist ls' + end%type. + + Variable elm : A. + + Fixpoint member (ls : list A) : Type := + match ls with + | nil => Empty_set + | x :: ls' => (x = elm) + member ls' + end%type. + + Fixpoint hget (ls : list A) : hlist ls -> member ls -> B elm := + match ls return hlist ls -> member ls -> B elm with + | nil => fun _ idx => match idx with end + | _ :: ls' => fun mls idx => + match idx with + | inl pf => match pf with + | refl_equal => fst mls + end + | inr idx' => hget ls' (snd mls) idx' + end + end. +End hlist. + +Implicit Arguments hget [A B elm ls].