Files
Computeability/two.agda
2025-11-17 14:26:14 +01:00

125 lines
3.5 KiB
Agda
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

data _≡_ {A : Set} : A A Set where
refl : {a : A} a a
context : {A B : Set} {a b : A} (f : A B) a b f a f b
context f refl = refl
trans : {A : Set} {a b c : A} a b b c a c
trans refl refl = refl
data : Set where
¬ : Set Set
¬ A = A
_≢_ : {A : Set} A -> A -> Set
_≢_ a b = ¬ (a b)
data _∧_ (A B : Set) : Set where
_∧ᵢ_ : A B A B
infixr 19 _∧_
infixr 19 _∧ᵢ_
data : Set where
zero :
succ :
{-# BUILTIN NATURAL #-}
_+_ :
n + 0 = n
n + succ m = succ (n + m)
data _<_ : Set where
z<sn : (n : ) 0 < succ n
s<s : (n m : ) n < m succ n < succ m
data _≤_ : Set where
z≤n : (n : ) -> 0 n
s≤s : (n m : ) -> n m -> succ n succ m
-- Task 2
data : Set where
pos :
negsucc : -- -n - 1 alternatively - (n + 1)
recN : {A : Set} A ( A A) A
recN 0 d e = d
recN (succ x) d e = e x (recN x d e)
add :
add n m = recN m n (λ _ x succ x)
prfadd : (n m : ) (n + m) (add n m)
prfadd n 0 = refl
prfadd n (succ m) = context succ (prfadd n m)
-- Task 3
zrec : {A : Set} ( A) ( A) A
zrec (pos n) f _ = f n
zrec (negsucc n) _ g = g n
addOne :
addOne a = zrec a (λ x pos (succ x)) (λ x recN x (pos x) (λ n _ negsucc n))
subOne :
subOne a = zrec a (λ x recN x (negsucc x) (λ n _ pos n)) (λ x negsucc (succ x))
prf : (z : ) subOne (addOne z) z
prf (pos x) = refl
prf (negsucc 0) = refl
prf (negsucc (succ x)) = refl
prf : (z : ) addOne (subOne z) z
prf (pos 0) = refl
prf (pos (succ x)) = refl
prf (negsucc x) = refl
-- Task 4
data Vec (A : Set) : Set where
nil : Vec A 0
_,_ : {n : } Vec A n (a : A) Vec A (succ n)
infixl 20 _,_
index : {A : Set} {n : } Vec A n (i : ) (0 i i < n) A
index (xs , a) 0 (z≤n n ∧ᵢ z<sn n₁) = a
index (xs , a) (succ i) (z≤n n ∧ᵢ s<s i m i<m) = index xs i (z≤n i ∧ᵢ i<m)
data PRF : Set where
zero : PRF 0
succ : PRF 1
proj : {n : } (i : ) 0 i i < n PRF n
comp : {n m : } (f : PRF m) (gs : Vec (PRF n) m) PRF n
rec : {n : } (f : PRF n) (g : PRF (succ (succ n))) PRF (succ n)
⟦_⟧ : {n : } PRF n (Vec n)
zero nil = 0
succ (nil , n) = succ n
proj i prf ρ = index ρ i prf
rec f g (ρ , 0) = f ρ
rec f g (ρ , succ n) = g ((ρ , n , rec f g (ρ , n)))
comp f gs ρ = f ( gs ⟧* ρ)
where
⟦_⟧* : {n m : } Vec (PRF m) n (Vec m) Vec n
nil ⟧* ρ = nil
fs , f ⟧* ρ = ( fs ⟧* ρ , f ρ)
addProg : PRF 2
addProg =
rec
(proj 0 (z≤n 0 ∧ᵢ z<sn 0))
(comp succ (nil , proj 0 (z≤n 0 ∧ᵢ z<sn 2)))
add :
add n m = addProg (nil , n , m)
prfProg : (n m : ) (add n m) (n + m)
prfProg n 0 = refl
prfProg n (succ m) = context succ (prfProg n m)
prfProg2 : (n m : ) (add n m) (add n m)
prfProg2 n m = trans (prfProg n m) (prfadd n m)