annotate src/DepList.v @ 114:2f97c8177172

DepList
author Adam Chlipala <adamc@hcoop.net>
date Tue, 14 Oct 2008 14:49:51 -0400
parents
children 9ccd215e5112
rev   line source
adamc@114 1 (* Copyright (c) 2008, Adam Chlipala
adamc@114 2 *
adamc@114 3 * This work is licensed under a
adamc@114 4 * Creative Commons Attribution-Noncommercial-No Derivative Works 3.0
adamc@114 5 * Unported License.
adamc@114 6 * The license text is available at:
adamc@114 7 * http://creativecommons.org/licenses/by-nc-nd/3.0/
adamc@114 8 *)
adamc@114 9
adamc@114 10 (* Dependent list types presented in Chapter 8 *)
adamc@114 11
adamc@114 12 Require Import List.
adamc@114 13
adamc@114 14 Set Implicit Arguments.
adamc@114 15
adamc@114 16
adamc@114 17 Section ilist.
adamc@114 18 Variable A : Set.
adamc@114 19
adamc@114 20 Fixpoint ilist (n : nat) : Set :=
adamc@114 21 match n with
adamc@114 22 | O => unit
adamc@114 23 | S n' => A * ilist n'
adamc@114 24 end%type.
adamc@114 25
adamc@114 26 Fixpoint index (n : nat) : Set :=
adamc@114 27 match n with
adamc@114 28 | O => Empty_set
adamc@114 29 | S n' => option (index n')
adamc@114 30 end.
adamc@114 31
adamc@114 32 Fixpoint get (n : nat) : ilist n -> index n -> A :=
adamc@114 33 match n return ilist n -> index n -> A with
adamc@114 34 | O => fun _ idx => match idx with end
adamc@114 35 | S n' => fun ls idx =>
adamc@114 36 match idx with
adamc@114 37 | None => fst ls
adamc@114 38 | Some idx' => get n' (snd ls) idx'
adamc@114 39 end
adamc@114 40 end.
adamc@114 41 End ilist.
adamc@114 42
adamc@114 43 Implicit Arguments get [A n].
adamc@114 44
adamc@114 45 Section hlist.
adamc@114 46 Variable A : Type.
adamc@114 47 Variable B : A -> Type.
adamc@114 48
adamc@114 49 Fixpoint hlist (ls : list A) : Type :=
adamc@114 50 match ls with
adamc@114 51 | nil => unit
adamc@114 52 | x :: ls' => B x * hlist ls'
adamc@114 53 end%type.
adamc@114 54
adamc@114 55 Variable elm : A.
adamc@114 56
adamc@114 57 Fixpoint member (ls : list A) : Type :=
adamc@114 58 match ls with
adamc@114 59 | nil => Empty_set
adamc@114 60 | x :: ls' => (x = elm) + member ls'
adamc@114 61 end%type.
adamc@114 62
adamc@114 63 Fixpoint hget (ls : list A) : hlist ls -> member ls -> B elm :=
adamc@114 64 match ls return hlist ls -> member ls -> B elm with
adamc@114 65 | nil => fun _ idx => match idx with end
adamc@114 66 | _ :: ls' => fun mls idx =>
adamc@114 67 match idx with
adamc@114 68 | inl pf => match pf with
adamc@114 69 | refl_equal => fst mls
adamc@114 70 end
adamc@114 71 | inr idx' => hget ls' (snd mls) idx'
adamc@114 72 end
adamc@114 73 end.
adamc@114 74 End hlist.
adamc@114 75
adamc@114 76 Implicit Arguments hget [A B elm ls].