This commit is contained in:
2025-11-17 14:25:48 +01:00
commit 9bdbe830d2
13 changed files with 1390 additions and 0 deletions

124
two.agda Normal file
View File

@ -0,0 +1,124 @@
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)