Generic Programming in a Dependently Typed Language
Generic proofs for generic programs
Peter Morris
pwm@cs.nott.ac.uk
University of Nottingham
Generic Programming in a Dependently Typed Language – p. 1/12
Generic Programming in a Dependently Typed Language Generic proofs - - PowerPoint PPT Presentation
Generic Programming in a Dependently Typed Language Generic proofs for generic programs Peter Morris pwm@cs.nott.ac.uk University of Nottingham Generic Programming in a Dependently Typed Language p. 1/12 This talk We introduce a
pwm@cs.nott.ac.uk
Generic Programming in a Dependently Typed Language – p. 1/12
Generic Programming in a Dependently Typed Language – p. 2/12
Generic Programming in a Dependently Typed Language – p. 2/12
Generic Programming in a Dependently Typed Language – p. 2/12
let m, n : Nat eqN m n : Bool eqN m n ⇐ rec n, case m, case n { eqN zero zero ⇒ true eqN zero (suc n) ⇒ false eqN (suc m) zero ⇒ false eqN (suc m) (suc n) ⇒ eqN m n }
Generic Programming in a Dependently Typed Language – p. 3/12
let m, n : Nat eqN m n : Bool eqN m n ⇐ rec n, case m, case n { eqN zero zero ⇒ true eqN zero (suc n) ⇒ false eqN (suc m) zero ⇒ false eqN (suc m) (suc n) ⇒ eqN m n }
Generic Programming in a Dependently Typed Language – p. 3/12
let m, n : Nat eqN m n : (m = n) + ((m = n) → ∅) eqN m n ⇐ rec n, case m, case n { eqN zero zero ⇒??? eqN zero (suc n) ⇒??? eqN (suc m) zero ⇒??? eqN (suc m) (suc n) ⇒ eqN m n??? } data a : A ; b : B a = b : ⋆ where T refl : a = a
Generic Programming in a Dependently Typed Language – p. 3/12
let m, n : Nat eqN m n : (m = n) + ((m = n) → ∅) eqN m n ⇐ rec n, case m, case n { eqN zero zero ⇒ left refl eqN zero (suc n) ⇒ right ??? eqN (suc m) zero ⇒ right ??? eqN (suc m) (suc n) ⇒ eqN m n??? }
Generic Programming in a Dependently Typed Language – p. 3/12
let m, n : Nat eqN m n : (m = n) + ((m = n) → ∅) eqN m n ⇐ rec n, case m, case n { eqN zero zero ⇒ left refl eqN zero (suc n) ⇒ right (λp ⇐ case p) eqN (suc m) zero ⇒ right (λq ⇐ case q) eqN (suc m) (suc n) ⇒ eqN m n??? } p : (zero = suc n) There are no elements
have to define this func- tion!
Generic Programming in a Dependently Typed Language – p. 3/12
let m, n : Nat eqN m n : (m = n) + ((m = n) → ∅) eqN m n ⇐ rec n, case m, case n { eqN zero zero ⇒ left refl eqN zero (suc n) ⇒ right (λp ⇐ case p) eqN (suc m) zero ⇒ right (λq ⇐ case q) eqN (suc m) (suc n) ⇒ eqN m n??? } No! this has the type: (m = n) + ((m = n) → ∅) we need: (suc m = suc n)+ ((suc m = suc n) → ∅) so we have to do a bit more work
Generic Programming in a Dependently Typed Language – p. 3/12
let m, n : Nat eqN m n : (m = n) + ((m = n) → ∅) eqN m n ⇐ rec n, case m, case n { eqN zero zero ⇒ left refl eqN zero (suc n) ⇒ right (λp ⇐ case p) eqN (suc m) zero ⇒ right (λq ⇐ case q) eqN (suc m) (suc n) || eqN m n { eqN (suc m) (suc m) | left refl ⇒??? eqN (suc m) (suc n) | right p ⇒??? } }
Generic Programming in a Dependently Typed Language – p. 3/12
let m, n : Nat eqN m n : (m = n) + ((m = n) → ∅) eqN m n ⇐ rec n, case m, case n { eqN zero zero ⇒ left refl eqN zero (suc n) ⇒ right (λp ⇐ case p) eqN (suc m) zero ⇒ right (λq ⇐ case q) eqN (suc m) (suc n) || eqN m n { eqN (suc m) (suc m) | left refl ⇒ left refl eqN (suc m) (suc n) | right p ⇒ right ??? } }
Generic Programming in a Dependently Typed Language – p. 3/12
let m, n : Nat eqN m n : (m = n) + ((m = n) → ∅) eqN m n ⇐ rec n, case m, case n { eqN zero zero ⇒ left refl eqN zero (suc n) ⇒ right (λp ⇐ case p) eqN (suc m) zero ⇒ right (λq ⇐ case q) eqN (suc m) (suc n) || eqN m n { eqN (suc m) (suc m) | left refl ⇒ left refl eqN (suc m) (suc n) | right p ⇒ (λrefl ⇒ p refl) } } The argument to this function has type: suc m = suc n if there is such a proof m and n MUST be the same
Generic Programming in a Dependently Typed Language – p. 3/12
Generic Programming in a Dependently Typed Language – p. 4/12
Generic Programming in a Dependently Typed Language – p. 4/12
let x : Matrix l m ; y : Matrix m n matmult x y : Matrix l n
Generic Programming in a Dependently Typed Language – p. 4/12
let x : Matrix l m ; y : Matrix m n matmult x y : Matrix l n
m ‘div‘ n by structural recursion
Generic Programming in a Dependently Typed Language – p. 4/12
let x : Matrix l m ; y : Matrix m n matmult x y : Matrix l n
m ‘div‘ n by structural recursion
Generic Programming in a Dependently Typed Language – p. 4/12
Generic Programming in a Dependently Typed Language – p. 5/12
Generic Programming in a Dependently Typed Language – p. 5/12
Generic Programming in a Dependently Typed Language – p. 5/12
Generic Programming in a Dependently Typed Language – p. 6/12
n : Nat RegType n : ⋆ where T Zero : RegType n ; T One : RegType n l, r : RegType n Union l r : RegType n ; x, y : RegType n Product x y : RegType n t : RegType (suc n) rts t : RegType n ; T rtz : RegType (suc n) ; t : RegType (suc n) Mu t : RegType n
Generic Programming in a Dependently Typed Language – p. 6/12
Generic Programming in a Dependently Typed Language – p. 7/12
rt : RegType zero Elem rt : ⋆ where T unit : Elem One ; ea : Elem rta ; eb : Elem rtb pair ea eb : Elem (Product rta rtb) ea : Elem rta inl ea : Elem (Union rta rtb) ; eb : Elem rtb inr eb : Elem (Union rta rtb) e : Elem′ (ε, (Mu f)) f in e : Elem (Mu f)
Generic Programming in a Dependently Typed Language – p. 7/12
rt : RegType zero Elem rt : ⋆ where T unit : Elem One ; ea : Elem rta ; eb : Elem rtb pair ea eb : Elem (Product rta rtb) ea : Elem rta inl ea : Elem (Union rta rtb) ; eb : Elem rtb inr eb : Elem (Union rta rtb) e : Elem′ (ε, (Mu f)) f in e : Elem (Mu f)
Generic Programming in a Dependently Typed Language – p. 7/12
Generic Programming in a Dependently Typed Language – p. 8/12
Generic Programming in a Dependently Typed Language – p. 8/12
Generic Programming in a Dependently Typed Language – p. 8/12
eqG Γ x y ⇐ rec x, case x, case y { eqG Γ unit unit ⇒ true { eqG Γ (pair xa xb) (pair ya yb) ⇒ eqG Γ xa ya ∧ eqG Γ xb yb eqG Γ (inl xa) (inl ya) ⇒ eqG Γ xa ya eqG Γ (inl xa) (inr yb) ⇒ false eqG Γ (inr xb) (inl ya) ⇒ false eqG Γ (inr xb) (inr yb) ⇒ eqG Γ xb yb eqG(Mu f) Γ (in x) (in y) ⇒ eqG (Γ, (Mu f)) x y eqG (Γ, rt′) (wk x) (wk y) ⇒ eqG Γ x y eqG (Γ, rt) (last x) (last y) ⇒ eqG Γ x y } }
Generic Programming in a Dependently Typed Language – p. 9/12
eqG Γ x y ⇐ rec x, case x, case y { eqG Γ unit unit ⇒ true { eqG Γ (pair xa xb) (pair ya yb) ⇒ eqG Γ xa ya ∧ eqG Γ xb yb eqG Γ (inl xa) (inl ya) ⇒ eqG Γ xa ya eqG Γ (inl xa) (inr yb) ⇒ false eqG Γ (inr xb) (inl ya) ⇒ false eqG Γ (inr xb) (inr yb) ⇒ eqG Γ xb yb eqG(Mu f) Γ (in x) (in y) ⇒ eqG (Γ, (Mu f)) x y eqG (Γ, rt′) (wk x) (wk y) ⇒ eqG Γ x y eqG (Γ, rt) (last x) (last y) ⇒ eqG Γ x y } }
Generic Programming in a Dependently Typed Language – p. 9/12
Generic Programming in a Dependently Typed Language – p. 10/12
Generic Programming in a Dependently Typed Language – p. 10/12
Generic Programming in a Dependently Typed Language – p. 10/12
Generic Programming in a Dependently Typed Language – p. 10/12
Generic Programming in a Dependently Typed Language – p. 10/12
Generic Programming in a Dependently Typed Language – p. 10/12
Generic Programming in a Dependently Typed Language – p. 11/12
Generic Programming in a Dependently Typed Language – p. 11/12
Generic Programming in a Dependently Typed Language – p. 11/12
Generic Programming in a Dependently Typed Language – p. 11/12
Generic Programming in a Dependently Typed Language – p. 12/12
Generic Programming in a Dependently Typed Language – p. 12/12
Generic Programming in a Dependently Typed Language – p. 12/12
Generic Programming in a Dependently Typed Language – p. 12/12