[Agda] dependent extensionality

James Chapman james at cs.ioc.ee
Wed Sep 29 18:54:08 CEST 2010


Here's a homogeneous version:

{-# OPTIONS --type-in-type #-}

module ext where

data _≡_ {A : Set}(a : A) : A → Set where
  refl : a ≡ a

subst : {A : Set}(P : A → Set){a a' : A} → a ≡ a' → P a → P a'
subst P refl p = p

trans : {A : Set}{a a' a'' : A} → a ≡ a' → a' ≡ a'' → a ≡ a''
trans refl p = p

_•_ : {A : Set}{B : A → Set}{C : (a : A) → B a → Set} →
      (∀{a} b → C a b) → (g : (∀ a → B a)) → ∀ a → C a (g a)
f • g = λ a → f (g a)

record Σ (A : Set)(B : A -> Set) : Set where
  constructor _,_
  field fst : A
        snd : B fst
open Σ

_* : {A : Set}{B : A → Set}(f : (a : A) → B a) → A → (Σ A λ a → B a)
f *  = λ x → x , f x

lem : {A : Set}{B : A → Set}{a : A}{p q : B a} → p ≡ q → _≡_ {Σ A B}
(a , p) (a , q)
lem refl = refl

lem'' : {A : Set}{B : A → Set}{f g : A → Σ A B}(p : f ≡ g) → subst (λ
f → (a : A) → B (fst (f a))) p (snd • f) ≡ (snd • g)
lem'' refl = refl

substlem : {A : Set}(P : A → Set){a a' : A}(p : a ≡ a')(x : P a)(q : P
a ≡ P a') → subst (λ x → x) q x ≡ subst P p x
substlem P refl x refl = refl

lem' : {A : Set}{B : A → Set}{f g : (x : A) → B x} → f * ≡ g * → f ≡ g
lem' {A}{B}{f}{g} p = trans (substlem (λ f' → (a : A) → B (fst (f'
a))) p f refl) (lem'' p)

simext : Set
simext  = (A B : Set)(f g : A → B) → (∀ x → f x ≡ g x) → f ≡ g

depext : Set
depext = (A : Set)(B : A → Set)(f g : (x : A) → B x) → (∀ x → f x ≡ g x) → f ≡ g

right : depext → simext
right p A B = p A (λ _ → B)

Regards,

James


More information about the Agda mailing list