diff --git a/0Trinitarianism/Preambles/P3.agda b/0Trinitarianism/Preambles/P3.agda new file mode 100644 index 0000000..881cba0 --- /dev/null +++ b/0Trinitarianism/Preambles/P3.agda @@ -0,0 +1,6 @@ +module 0Trinitarianism.Preambles.P3 where + +open import Cubical.Core.Everything public +open import Cubical.Data.Nat public hiding (_+_ ; isEven) +open import 0Trinitarianism.Quest1Solutions public +open import Cubical.Data.Empty public using (⊥) diff --git a/0Trinitarianism/Quest3.agda b/0Trinitarianism/Quest3.agda new file mode 100644 index 0000000..151d6be --- /dev/null +++ b/0Trinitarianism/Quest3.agda @@ -0,0 +1,9 @@ +module 0Trinitarianism.Quest3 where + +open import 0Trinitarianism.Preambles.P3 + +_+_ : ℕ → ℕ → ℕ +n + m = {!!} + +SumOfEven : (x : Σ ℕ isEven) → (y : Σ ℕ isEven) → isEven (x .fst + y .fst) +SumOfEven x y = {!!} diff --git a/0Trinitarianism/Quest3.md b/0Trinitarianism/Quest3.md new file mode 100644 index 0000000..9a6a312 --- /dev/null +++ b/0Trinitarianism/Quest3.md @@ -0,0 +1,103 @@ +# Pi Types + +We will try to formulate and prove the statement + +> The sum of two even naturals is even. + +## Defining Addition  + +To do so we must define `+` on the naturals. +Addition takes in two naturals and spits out a natural, +so it should have type `ℕ → ℕ → ℕ`. +```agda +_+_ : ℕ → ℕ → ℕ +n + m = ? +``` +Try coming up with a sensible definition. +It may not look 'the same' as ours. +

+

+Hint + +`n + 0` should be `n` and `n + (m + 1)` should be `(n + m) + 1` +
+

+ +## The Statement + +Now we can make the statement: +```agda +SumOfEven : (x : Σ ℕ isEven) → (y : Σ ℕ isEven) → isEven (x .fst + y .fst) +SumOfEven x y = ? +``` +> Tip: `x .fst` is another notation for `fst x`. +> This works for all sigma types. +There are three ways to interpret this: + +- For all even naturals `x` and `y`, + their sum is even. +- `isEven (x .fst + y .fst)` is a construction depending on two recipes + `x` and `y`. + Given two recipes `x` and `y` of `Σ ℕ isEven`, + we break them down into their first components, + apply the conversion `_+_`, + and form a recipe for `isEven` of the result. +- `isEven (_ .fst + _ .fst)` is a bundle over the categorical product + `Σ ℕ isEven × Σ ℕ isEven` and `SumOfEven` is a _section_ of the bundle. + +More generally given `A : Type` and `B : A → Type` +we can form the _pi type_ `(x : A) → B x : Type` +(in other languages `Π (x : ℕ), isEven n`). +The notation suggests that these behave like functions, +and indeed in the special case where the fiber is constant +with respect to the base space +a section is just a term of type `A → B`, i.e. a function. +Hence pi types are also known as _dependent function types_. + +We are now in a position to prove the statement. Have fun! + +## Remarks + +_Important_: Once you have proven the statement, +check out our two ways of defining addition `_+_` and `_+'_` +(in the solutions). + +- Use `C-c C-n` to check that they compute the same values + on different examples. +- Uncomment the code for `Sum'OfEven` in the solutions. + It is just `SumOfEven` but with `+`s changed for `+'`s. +- Load the file. Does the proof still work? + +Our proof `SumOfEven` relied on +the explicit definition of `_+_`, +which means if we wanted to use our proof on +someone else's definition of addition, +it might not work anymore. +> But `_+_` and `_+'_` compute the same values. +> Are `_+_` and `_+'_` 'the same'? What is 'the same'? + +## Another Task : Decidability of `isEven` + +As the final task of the Quest, +try to express and prove in agda the statement +> For any natural number it is even or is is not even. +We will make a summary of what is needed: + +- a definition of the type `A ⊕ B` (input `\oplus`), + which has three interpretations + - the proposition '`A` or `B`' + - the construction with two ways of making recipes + `left : A → A ⊕ B` + and `right : B → A ⊕ B`. + - the coproduct of two objects `A` and `B`. + The type needs to take in parameters `A : Type` and `B : Type` + ```agda + data _⊕_ (A : Type) (B : Type) : Type where + ??? + ``` +- a definition of negation. One can motivate it by the following + - Define `A ↔ B : Type` for two types `A : Type` and `B : Type`. + - Show that for any `A : Type` we have `(A ↔ ⊥) ↔ (A → ⊥)` + - Define `¬ : Type → Type` to be `λ A → (A → ⊥)`. +- a formulation and proof of the statement above + diff --git a/0Trinitarianism/Quest3Solutions.agda b/0Trinitarianism/Quest3Solutions.agda new file mode 100644 index 0000000..8798ce0 --- /dev/null +++ b/0Trinitarianism/Quest3Solutions.agda @@ -0,0 +1,58 @@ +module 0Trinitarianism.Quest3Solutions where + +open import 0Trinitarianism.Preambles.P3 + +_+_ : ℕ → ℕ → ℕ +n + zero = n +n + suc m = suc (n + m) + +_+'_ : ℕ → ℕ → ℕ +zero +' n = n +suc m +' n = suc (m +' n) + +SumOfEven : (x : Σ ℕ isEven) → (y : Σ ℕ isEven) → isEven (x .fst + y .fst) +SumOfEven x (zero , hy) = x .snd +SumOfEven x (suc (suc y) , hy) = SumOfEven x (y , hy) + +{- + +Sum'OfEven : (x : Σ ℕ isEven) → (y : Σ ℕ isEven) → isEven (x .fst +' y .fst) +Sum'OfEven x (zero , hy) = x .snd +Sum'OfEven x (suc (suc y) , hy) = Sum'OfEven x (y , hy) + +-} + +data _⊕_ (A : Type) (B : Type) : Type where + left : A → A ⊕ B + right : B → A ⊕ B + +_↔_ : Type → Type → Type +_↔_ A B = (A → B) × (B → A) + +¬Motivation : (A : Type) → ((A ↔ ⊥) ↔ (A → ⊥)) +¬Motivation A = + -- forward direction + ( + -- suppose we have a proof `hiff : A ↔ ⊥` + λ hiff → + -- give the forward map only + fst hiff + ) , + -- backward direction; assume a proof hto : A → ⊥ + λ hto → + -- we need to show A → ⊥ which we have already + hto + , + -- we need to show ⊥ → A, which is the principle of explosion + λ () + +¬ : Type → Type +¬ A = A → ⊥ + +isEvenDecidable : (n : ℕ) → isEven n ⊕ ¬ (isEven n) +-- zero is even; go left +isEvenDecidable zero = left tt +-- one is not even; go right +isEvenDecidable (suc zero) = right (λ ()) +-- inductive step +isEvenDecidable (suc (suc n)) = isEvenDecidable n diff --git a/_build/2.6.3/agda/0Trinitarianism/Preambles/P1.agdai b/_build/2.6.3/agda/0Trinitarianism/Preambles/P1.agdai new file mode 100644 index 0000000..2cb07d7 Binary files /dev/null and b/_build/2.6.3/agda/0Trinitarianism/Preambles/P1.agdai differ diff --git a/_build/2.6.3/agda/0Trinitarianism/Preambles/P3.agdai b/_build/2.6.3/agda/0Trinitarianism/Preambles/P3.agdai new file mode 100644 index 0000000..71f515e Binary files /dev/null and b/_build/2.6.3/agda/0Trinitarianism/Preambles/P3.agdai differ diff --git a/_build/2.6.3/agda/0Trinitarianism/Quest1Solutions.agdai b/_build/2.6.3/agda/0Trinitarianism/Quest1Solutions.agdai new file mode 100644 index 0000000..1969144 Binary files /dev/null and b/_build/2.6.3/agda/0Trinitarianism/Quest1Solutions.agdai differ diff --git a/_build/2.6.3/agda/0Trinitarianism/Quest3Solutions.agdai b/_build/2.6.3/agda/0Trinitarianism/Quest3Solutions.agdai new file mode 100644 index 0000000..91073bd Binary files /dev/null and b/_build/2.6.3/agda/0Trinitarianism/Quest3Solutions.agdai differ