Update 'agda w-type stuff'
parent
038f34057b
commit
3d5bb7e556
1 changed files with 155 additions and 0 deletions
155
agda-w-type-stuff.md
Normal file
155
agda-w-type-stuff.md
Normal file
|
@ -0,0 +1,155 @@
|
||||||
|
```agda
|
||||||
|
module _ where
|
||||||
|
|
||||||
|
open import Function
|
||||||
|
open import Data.Container hiding (refl)
|
||||||
|
open import Data.Container.Relation.Unary.All
|
||||||
|
open import Data.W
|
||||||
|
open import Data.Empty
|
||||||
|
open import Data.Unit
|
||||||
|
open import Relation.Nullary
|
||||||
|
open import Data.Product renaming (proj₁ to fst; proj₂ to snd)
|
||||||
|
open import Relation.Binary.PropositionalEquality
|
||||||
|
|
||||||
|
variable A B : Set
|
||||||
|
|
||||||
|
postulate ⊥-funext : {f g : ⊥ → B} → f ≡ g
|
||||||
|
```
|
||||||
|
|
||||||
|
# ℕ
|
||||||
|
|
||||||
|
```agda
|
||||||
|
module Nat where
|
||||||
|
data Tag : Set where #zero #suc : Tag
|
||||||
|
|
||||||
|
Child : Tag → Set
|
||||||
|
Child #zero = ⊥
|
||||||
|
Child #suc = ⊤
|
||||||
|
|
||||||
|
Nat : Set
|
||||||
|
Nat = W (Tag ▷ Child)
|
||||||
|
|
||||||
|
zero : Nat
|
||||||
|
zero = sup (#zero , λ ())
|
||||||
|
|
||||||
|
suc : Nat → Nat
|
||||||
|
suc n = sup (#suc , const n)
|
||||||
|
|
||||||
|
elim : (P : Nat → Set) →
|
||||||
|
P zero → (∀ {n} → P n → P (suc n)) →
|
||||||
|
∀ n → P n
|
||||||
|
elim P pz ps = induction P λ where
|
||||||
|
{#zero , _} (all ih) → subst (λ f → P (sup (#zero , f))) ⊥-funext pz
|
||||||
|
{#suc , n} (all ih) → ps (ih tt)
|
||||||
|
```
|
||||||
|
|
||||||
|
# List
|
||||||
|
|
||||||
|
```agda
|
||||||
|
module List where
|
||||||
|
data Tag : Set where #nil #cons : Tag
|
||||||
|
|
||||||
|
Field : Set → Tag → Set
|
||||||
|
Field _ #nil = ⊤
|
||||||
|
Field A #cons = A
|
||||||
|
|
||||||
|
Child : Tag → Set
|
||||||
|
Child #nil = ⊥
|
||||||
|
Child #cons = ⊤
|
||||||
|
|
||||||
|
List : Set → Set
|
||||||
|
List A = W (Σ Tag (Field A) ▷ Child ∘ fst)
|
||||||
|
|
||||||
|
nil : List A
|
||||||
|
nil = sup ((#nil , tt) , λ ())
|
||||||
|
|
||||||
|
infixr 5 _∷_
|
||||||
|
_∷_ : A → List A → List A
|
||||||
|
x ∷ xs = sup ((#cons , x) , const xs)
|
||||||
|
|
||||||
|
elim : (P : List A → Set) →
|
||||||
|
(pn : P nil) →
|
||||||
|
(pc : (x : A) {xs : List A} → P xs → P (x ∷ xs)) →
|
||||||
|
∀ xs → P xs
|
||||||
|
elim P pn pc = induction P $ λ where
|
||||||
|
{(#nil , tt) , rec} _ →
|
||||||
|
subst (λ f → P (sup ((#nil , tt) , f))) ⊥-funext pn
|
||||||
|
{(#cons , x) , xs′} (all ih) → pc x (ih tt)
|
||||||
|
```
|
||||||
|
|
||||||
|
# indexed w
|
||||||
|
|
||||||
|
```agda
|
||||||
|
record Desc : Set₁ where
|
||||||
|
field
|
||||||
|
Index : Set
|
||||||
|
Tag : Set
|
||||||
|
Child : Tag → Set
|
||||||
|
this : Tag → Index
|
||||||
|
child : ∀ {T} → Child T → Index
|
||||||
|
|
||||||
|
module IndexedW (𝒟 : Desc) where
|
||||||
|
open Desc 𝒟
|
||||||
|
|
||||||
|
T′ : Set
|
||||||
|
T′ = W (Tag ▷ Child)
|
||||||
|
|
||||||
|
wf : T′ → Index → Set
|
||||||
|
wf = induction _ λ where
|
||||||
|
{t , _} (all ih) 𝑖 → (this t ≡ 𝑖) × (∀ c → ih c (child c))
|
||||||
|
|
||||||
|
T : Index → Set
|
||||||
|
T 𝑖 = Σ[ x ∈ T′ ] (wf x 𝑖)
|
||||||
|
|
||||||
|
isup : (t : Tag) (f : (c : Child t) → T (child c)) → T (this t)
|
||||||
|
isup t f = sup (t , fst ∘ f) , refl , snd ∘ f
|
||||||
|
|
||||||
|
module _ (P : ∀ {i} → T i → Set)
|
||||||
|
(s : ∀ t f → (∀ c → P (f c)) → P (isup t f)) where
|
||||||
|
iinduction′ : ∀ {𝑖} t (p : wf t 𝑖) → P (t , p)
|
||||||
|
iinduction′ t p =
|
||||||
|
induction (λ t → ∀ {𝑖} (p : wf t 𝑖) → P (t , p))
|
||||||
|
(λ where
|
||||||
|
{t , f} (all ih) (refl , eq-ih) →
|
||||||
|
s t (λ c → f c , eq-ih c)
|
||||||
|
(λ c → ih c (eq-ih c)))
|
||||||
|
t p
|
||||||
|
|
||||||
|
iinduction : ∀ {𝑖} (x : T 𝑖) → P x
|
||||||
|
iinduction (t , p) = iinduction′ t p
|
||||||
|
```
|
||||||
|
|
||||||
|
# fin (indexed)
|
||||||
|
|
||||||
|
```agda
|
||||||
|
module Fin where
|
||||||
|
open Nat public using (Nat; #zero; #suc)
|
||||||
|
renaming (zero to nzero; suc to nsuc)
|
||||||
|
|
||||||
|
desc : Desc
|
||||||
|
desc = let open Desc in λ where
|
||||||
|
.Index → Nat
|
||||||
|
.Tag → Nat.Tag × Nat
|
||||||
|
.Child (t , _) → Nat.Child t
|
||||||
|
.this (_ , n) → Nat.suc n
|
||||||
|
.child {_ , n} c → n
|
||||||
|
|
||||||
|
open module Fin-W = IndexedW desc using (iinduction; isup)
|
||||||
|
open Fin-W public using () renaming (T to Fin)
|
||||||
|
|
||||||
|
private variable n : Nat
|
||||||
|
|
||||||
|
zero : Fin (nsuc n)
|
||||||
|
zero {n} = (sup ((#zero , n) , λ ())) , refl , λ ()
|
||||||
|
|
||||||
|
suc : Fin n → Fin (nsuc n)
|
||||||
|
suc {n} (i , p) = (sup ((#suc , n) , const i)) , refl , const p
|
||||||
|
|
||||||
|
elim : (P : ∀ {n} → Fin n → Set) →
|
||||||
|
(∀ {n} → P (zero {n})) →
|
||||||
|
(∀ {n} (i : Fin n) → P i → P (suc i)) →
|
||||||
|
(i : Fin n) → P i
|
||||||
|
elim P pz ps = iinduction P λ where
|
||||||
|
(#zero , n) f _ → subst (λ f → P (isup (#zero , n) f)) ⊥-funext pz
|
||||||
|
(#suc , n) f ih → ps (f tt) (ih tt)
|
||||||
|
```
|
Loading…
Reference in a new issue