diff --git a/0Trinitarianism/Preambles/P2.agda b/0Trinitarianism/Preambles/P2.agda index 3a61436..17e5245 100644 --- a/0Trinitarianism/Preambles/P2.agda +++ b/0Trinitarianism/Preambles/P2.agda @@ -1,6 +1,6 @@ module 0Trinitarianism.Preambles.P2 where open import Cubical.Core.Everything public -open import Cubical.Data.Nat public hiding (_+_ ; isEven) -open import 0Trinitarianism.Quest1Solutions public +open import Cubical.Data.Unit public renaming (Unit to ⊤) open import Cubical.Data.Empty public using (⊥) +open import Cubical.Data.Nat public hiding (isEven) diff --git a/0Trinitarianism/Quest0.md b/0Trinitarianism/Quest0.md index 6b9ddd9..e276949 100644 --- a/0Trinitarianism/Quest0.md +++ b/0Trinitarianism/Quest0.md @@ -90,7 +90,7 @@ TrueToTrue = { } ?2 : ⊤ ``` -There is more than one proof (see solutions). +There is more than one proof (see `Quest0Solutions.agda`). Here is an important one: ```agda @@ -150,7 +150,8 @@ explosion x = { } - Navigate to the hole and do cases on `x`. -Agda knows that there are no cases so there is nothing to do (see solutions)! +Agda knows that there are no cases so there is nothing to do! +(See `Quest0Solutions.agda`) This has three interpretations: - false implies anything (principle of explosion) diff --git a/0Trinitarianism/Quest1.md b/0Trinitarianism/Quest1.md index da3bf23..e533926 100644 --- a/0Trinitarianism/Quest1.md +++ b/0Trinitarianism/Quest1.md @@ -1,4 +1,4 @@ -# Dependent Types and Sigma Types +# Dependent Types In a 'place to do maths' we would like to be able to express and 'prove' @@ -6,6 +6,9 @@ the statement > There exists a natural that is even. +The goal of this quest is to define +"what it means for a natural to be even". + ## Predicates / Dependent Constructions / Bundles This requires the notion of a _predicate_. @@ -79,7 +82,7 @@ isEven n = ? because we are in the 'inductive step'. - There should now be nothing in the 'agda info' window. This means everything is working. - (Compare your `isEven` with our [solutions]().) + (Compare your `isEven` with our solutions in `Quest2Solutions.agda`.) There are three interpretations of `isEven : ℕ → Type`. - Already mentioned, `isEven` is a predicate on `ℕ`. @@ -112,136 +115,6 @@ do `C-c C-n` (`n` for normalize) and type in `isEven 2`. (By the way you can write in numerals since we are now secretly using `ℕ` from the cubical agda library.) -## Sigma Types - -Now that we have expressed `isEven` we need to be able write down "existence". -In maths we might write -``` -∃ x ∈ ℕ, isEven x -``` -which in agda notation is -``` -Σ ℕ isEven -``` -This is called a _sigma type_, which has three interpretations: - -- the proposition 'there exists an even natural' -- the construction - 'keep a recipe `n` of naturals together with a recipe of `isEven n`' -- the total space of the bundle `isEven` over `ℕ`, - which is the space obtained by putting together all the fibers. - Pictorially, it looks like - - SigmaTypeOfIsEven - - which can also be viewed as the subset of even naturals, - since the fibers are either empty or singleton. - (It is a _subsingleton bundle_). - -### Making terms in Sigma Types -Making a term of this type has three interpretations: - -- a natural `n : ℕ` together with a proof `hn : isEven n` that `n` is even. -- a recipe `n : ℕ` together with a recipe `hn : isEven n`. -- a point in the total space is a point `n : ℕ` downstairs - together with a point `hn : isEven n` in its fiber. - -Now you can prove that there exists an even natural: - -- Formulate the statement you need. Make sure you have it of the form - ```agda - Name : Statement - Name = ? - ``` -- Load the file, go to the hole and refine the goal. -- If you formulated the statement right it should split into `{!!} , {!!}` - and you can check the types of terms the holes require. -- Fill the holes. There are many proofs you can do! - -In general when `A : Type` is a type and `B : A → Type` is a -predicate/dependent construction/bundle over `A`, -we can write the sigma type `Σ A B` whose terms are pairs `a , b` -where `a : A` and `b : B a`. -In the special case when `B` is not dependent on `a : A`, -i.e. it looks like `λ a → C` for some `C : Type` then -`Σ A B` is just -- the proposition '`A` and `C`' - since giving a proof of this is the same as giving a proof - of `A` and a proof of `C` -- a recipe `a : A` together with a recipe `c : C` -- `B` is now a _trivial bundle_ since the fibers `B a` are - constant with respect to `a : A`. - In other words it is just a _product_ `Σ A B ≅ A × C`. - For this reason, - some refer to the sigma type as the _dependent product_, - but we will avoid this terminology. -```agda -_×_ : Type → Type → Type -A × C = Σ A (λ a → C) -``` -Agda supports the notation `_×_` (without spaces) -which means from now on you can write `A × C` (with spaces). - -### Using Terms in Sigma Types - -There are two ways of using a term in a sigma type. -We can extract the first part using `fst` or the second part using `snd`. -Given `x : Σ A B` there are three interpretations of `fst` and `snd`: -- Viewing `x` as a proof of existence - `fst x` provides the witness of existence and `snd` provides the proof - that the witness `fst x` has the desired property -- Viewing `x` as a recipe `fst` extracts the first component and - `snd` extracts the second component -- Viewing `x` as a point in the total space of a bundle - `fst x` is the point that `x` is over in the base space and `snd x` - is the point in the fiber that `x` represents. - In particular you can interpret `fst` as projection from the total space - to the base space, collapsing fibers. -For example to define a map that takes an even natural and divides it by two -we can do -```agda -div2 : Σ ℕ isEven → ℕ -div2 x = ? -``` -- Load the file, go to the hole and case on `x`. - You might want to rename `fst₁` and `snd₁`. - ```agda - div2 : Σ ℕ isEven → ℕ - div2 (fst₁ , snd₁) = {!!} - ``` -- Case on `fst₁` and tell agda what to give for `0 , _`, - i.e. what 'zero divided by two' ought to be. - ```agda - div2 : Σ ℕ isEven → ℕ - div2 (zero , snd₁) = {!!} - div2 (suc fst₁ , snd₁) = {!!} - ``` -- Navigate to the second hole and case on `fst₁` again. - Notice that agda knows there is no term looking like `1 , _` - so it has skipped that case for us. - ```agda - div2 : Σ ℕ isEven → ℕ - div2 (zero , snd₁) = 0 - div2 (suc (suc fst₁) , snd₁) = {!!} - ``` -- `(n + 2) / 2` should just be `n/2 + 1` - so try writing in `suc` and refining the goal -- How do you write down `n/2`? Hint: we are in the 'inductive step'. - -Try dividing some terms by `2`: -- Use `C-c C-n` and write `div2 (2 , tt)` for example. -- Try dividing `36` by `2`. - -*Important Observation* : -the two proofs `2 , tt` and `36 , tt` of the statement -'there exists an even natural' are not 'the same' in any sense, -since if they were `div2 (2 , tt)` would be 'the same' `div2 (36/2 , tt)`, -and hence `1` would be 'the same' as `18`. - -> Are they 'the same'? What is 'the same'? - ## Using the Trinitarianism We introduced new ideas through all three perspectives, diff --git a/0Trinitarianism/Quest2.agda b/0Trinitarianism/Quest2.agda index 8134556..42474dd 100644 --- a/0Trinitarianism/Quest2.agda +++ b/0Trinitarianism/Quest2.agda @@ -2,8 +2,27 @@ module 0Trinitarianism.Quest2 where open import 0Trinitarianism.Preambles.P2 -_+_ : ℕ → ℕ → ℕ -n + m = {!!} +isEven : ℕ → Type +isEven n = {!!} -SumOfEven : (x : Σ ℕ isEven) → (y : Σ ℕ isEven) → isEven (x .fst + y .fst) -SumOfEven x y = {!!} +{- +This is a comment block. +Remove this comment block and formulate +'there exists an even natural' here. +-} + +_×_ : Type → Type → Type +A × C = Σ A (λ a → C) + +div2 : Σ ℕ isEven → ℕ +div2 x = {!!} + +private + postulate + A B C : Type + +uncurry : (A → B → C) → (A × B → C) +uncurry f x = {!!} + +curry : (A × B → C) → (A → B → C) +curry f a b = {!!} diff --git a/0Trinitarianism/Quest2.md b/0Trinitarianism/Quest2.md index 08630c5..8698dc1 100644 --- a/0Trinitarianism/Quest2.md +++ b/0Trinitarianism/Quest2.md @@ -1,92 +1,181 @@ -# Pi Types +# Sigma Types -We will try to formulate and prove the statement +We are still trying to express and 'prove' the statement -> The sum of two even naturals is even. +> There exists a natural that is even. -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 = ? +We will achieve this by the end of this quest. + +## Existence / Dependent Pair / Total Space of Bundles + +Recall from [Quest 1]( +https://github.com/thehottgame/TheHoTTGame/blob/main/0Trinitarianism/Quest1.md +) +that we defined `isEven`. +What's left is to be able write down "existence". +In maths we might write ``` -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` -
-

- -Now we can make the statement: -```agda -SumOfEven : (x : Σ ℕ isEven) → (y : Σ ℕ isEven) → isEven (x .fst + y .fst) -SumOfEven x y = ? +∃ x ∈ ℕ, isEven x ``` -> 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. +which in agda notation is +``` +Σ ℕ isEven +``` +This is called a _sigma type_, which has three interpretations: + +- the proposition 'there exists an even natural' +- the construction + 'keep a recipe `n` of naturals together with a recipe of `isEven n`' +- the total space of the bundle `isEven` over `ℕ`, + which is the space obtained by putting together all the fibers. + Pictorially, it looks like -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_. + SigmaTypeOfIsEven + + which can also be viewed as the subset of even naturals, + since the fibers are either empty or singleton. + (It is a _subsingleton bundle_). -We are now in a position to prove the statement. Have fun! +## Making terms in Sigma Types +Making a term of this type has three interpretations: -_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? +- a natural `n : ℕ` together with a proof `hn : isEven n` that `n` is even. +- a recipe `n : ℕ` together with a recipe `hn : isEven n`. +- a point in the total space is a point `n : ℕ` downstairs + together with a point `hn : isEven n` in its fiber. -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'? +Now you can prove that there exists an even natural: -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` +- Formulate the statement you need. Make sure you have it of the form ```agda - data _⊕_ (A : Type) (B : Type) : Type where - ??? + Name : Statement + Name = ? ``` -- 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 +- Load the file, go to the hole and refine the goal. +- If you formulated the statement right it should split into `{!!} , {!!}` + and you can check the types of terms the holes require. +- Fill the holes. There are many proofs you can do! +In general when `A : Type` is a type and `B : A → Type` is a +predicate/dependent construction/bundle over `A`, +we can write the sigma type `Σ A B` whose terms are pairs `a , b` +where `a : A` and `b : B a`. +In the special case when `B` is not dependent on `a : A`, +i.e. it looks like `λ a → C` for some `C : Type` then +`Σ A B` is just +- the proposition '`A` and `C`' + since giving a proof of this is the same as giving a proof + of `A` and a proof of `C` +- a recipe `a : A` together with a recipe `c : C` +- `B` is now a _trivial bundle_ since the fibers `B a` are + constant with respect to `a : A`. + In other words it is just a _product_ `Σ A B ≅ A × C`. + For this reason, + some refer to the sigma type as the _dependent product_, + but we will avoid this terminology. +```agda +_×_ : Type → Type → Type +A × C = Σ A (λ a → C) +``` +Agda supports the notation `_×_` (without spaces) +which means from now on you can write `A × C` (with spaces). + +## Using Terms in Sigma Types + +There are two ways of using a term in a sigma type. +We can extract the first part using `fst` or the second part using `snd`. +Given `x : Σ A B` there are three interpretations of `fst` and `snd`: +- Viewing `x` as a proof of existence + `fst x` provides the witness of existence and `snd` provides the proof + that the witness `fst x` has the desired property +- Viewing `x` as a recipe `fst` extracts the first component and + `snd` extracts the second component +- Viewing `x` as a point in the total space of a bundle + `fst x` is the point that `x` is over in the base space and `snd x` + is the point in the fiber that `x` represents. + In particular you can interpret `fst` as projection from the total space + to the base space, collapsing fibers. +For example to define a map that takes an even natural and divides it by two +we can do +```agda +div2 : Σ ℕ isEven → ℕ +div2 x = ? +``` +- Load the file, go to the hole and case on `x`. + You might want to rename `fst₁` and `snd₁`. + ```agda + div2 : Σ ℕ isEven → ℕ + div2 (fst₁ , snd₁) = {!!} + ``` +- Case on `fst₁` and tell agda what to give for `0 , _`, + i.e. what 'zero divided by two' ought to be. + ```agda + div2 : Σ ℕ isEven → ℕ + div2 (zero , snd₁) = {!!} + div2 (suc fst₁ , snd₁) = {!!} + ``` +- Navigate to the second hole and case on `fst₁` again. + Notice that agda knows there is no term looking like `1 , _` + so it has skipped that case for us. + ```agda + div2 : Σ ℕ isEven → ℕ + div2 (zero , snd₁) = 0 + div2 (suc (suc fst₁) , snd₁) = {!!} + ``` +- `(n + 2) / 2` should just be `n/2 + 1` + so try writing in `suc` and refining the goal +- How do you write down `n/2`? Hint: we are in the 'inductive step'. + +Try dividing some terms by `2`: +- Use `C-c C-n` and write `div2 (2 , tt)` for example. +- Try dividing `36` by `2`. + +*Important Observation* : +the two proofs `2 , tt` and `36 , tt` of the statement +'there exists an even natural' are not 'the same' in any sense, +since if they were `div2 (2 , tt)` would be 'the same' `div2 (36/2 , tt)`, +and hence `1` would be 'the same' as `18`. + +> Are they 'the same'? What is 'the same'? + +## Side Quest : a Tautology / Currying / Cartesian Closed + +In this side quest, +you will construct the following functions. + +```agda +uncurry : (A → B → C) → (A × B → C) +uncurry f x = ? + +curry : (A × B → C) → (A → B → C) +curry f a b = ? +``` +These have three interpretations : + +- `uncurry` is a proof that + "if `A` implies '`B` implies `C`', + then '`A` and `B`' implies `C`". + A proof of the converse is `curry`. +- [currying]( +https://en.wikipedia.org/wiki/Currying#:~:text=In%20mathematics%20and%20computer%20science,each%20takes%20a%20single%20argument.) +- this is a commonly occuring example of an _adjunction_. + See + [here](https://kl-i.github.io/posts/2021-07-12/#product-and-maps) + for a more detailed explanation. + +Note that we have _postulated_ the types `A, B, C` for you. +```agda +private + postulate + A B C : Type +``` +In general, you can use this to +introduce new constants to your agda file. +The `private` ensures `A, B, C` can only be used +within this agda file. + +> Tip : Agda is space-and-indentation sensitive, +> i.e. the `private` applies to anything beneath it +> that is indented two spaces. diff --git a/0Trinitarianism/Quest2Solutions.agda b/0Trinitarianism/Quest2Solutions.agda index 2d9f39b..a16b238 100644 --- a/0Trinitarianism/Quest2Solutions.agda +++ b/0Trinitarianism/Quest2Solutions.agda @@ -2,57 +2,27 @@ module 0Trinitarianism.Quest2Solutions where open import 0Trinitarianism.Preambles.P2 -_+_ : ℕ → ℕ → ℕ -n + zero = n -n + suc m = suc (n + m) +isEven : ℕ → Type +isEven zero = ⊤ +isEven (suc zero) = ⊥ +isEven (suc (suc n)) = isEven n -_+'_ : ℕ → ℕ → ℕ -zero +' n = n -suc m +' n = suc (m +' n) +existsEven : Σ ℕ isEven +existsEven = 4 , tt -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) +_×_ : Type → Type → Type +A × C = Σ A (λ a → C) -{- +div2 : Σ ℕ isEven → ℕ +div2 (0 , tt) = 0 +div2 (suc (suc n) , hn) = suc (div2 (n , hn)) -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) +private + postulate + A B C : Type --} +uncurry : (A → B → C) → (A × B → C) +uncurry f (fst₁ , snd₁) = f fst₁ snd₁ -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 +curry : (A × B → C) → (A → B → C) +curry f a b = f (a , b) diff --git a/0Trinitarianism/Quest3.md b/0Trinitarianism/Quest3.md index 9a6a312..6c12117 100644 --- a/0Trinitarianism/Quest3.md +++ b/0Trinitarianism/Quest3.md @@ -44,15 +44,32 @@ There are three ways to interpret this: 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. + This means for every point `(x , y)` in `Σ ℕ isEven × Σ ℕ isEven`, + it gives a point in the fiber `isEven (x .fst + y .fst)`. + + (picture) 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_. +(in other languages `Π (x : ℕ), isEven n`), +with three interpretations : + +- it is the proposition "for all `x : A`, we have `B x`", + and each term is a collection of proofs `bx : B x`, + one for each `x : A`. +- recipes of `(x : A) → B x` are made by + converting each `x : A` to some recipe of `B x`. + Indeed the function type `A → B` is + the special case where + the type `B x` is not dependent on `x`. + Hence pi types are also known as _dependent function types_. + Note that terms in the sigma type are pairs `(a , b)` + whilst terms in the dependent function type are + a collection of pairs `(a , b)` indexed by `a : A` +- Given the bundle `B : A → Type`, + we have the total space `Σ A B` which is equipped with a projection + `fst : Σ A B → A`. + A term of `(x : A) → B x` is a section of this projection. We are now in a position to prove the statement. Have fun! diff --git a/Plan.org b/Plan.org index 53360dc..c819cdf 100644 --- a/Plan.org +++ b/Plan.org @@ -77,6 +77,9 @@ + difficulty is that PathP not in one fiber, but PathOver is, AND PathOver <-> PathP NON-obvious + Easy to generalize situation to n-types being closed under Sigma (7.1.8 in HoTT book), we showed this assuming PathPIsoPath +** Mixolydian Bosses + ++ universe classifies bundles ** SuperUltraMegaHyperLydianBosses + natural number object unique and `_+_` unique on any nat num obj @@ -90,7 +93,6 @@ - propositions closed under sigma types + univalence - ** Top 100 (set theoretic) misconceptions about type theory + Propositions + Proof relevance diff --git a/_build/2.6.3/agda/0Trinitarianism/Preambles/P2.agdai b/_build/2.6.3/agda/0Trinitarianism/Preambles/P2.agdai new file mode 100644 index 0000000..d22d6a5 Binary files /dev/null and b/_build/2.6.3/agda/0Trinitarianism/Preambles/P2.agdai differ diff --git a/_build/2.6.3/agda/0Trinitarianism/Quest2Solutions.agdai b/_build/2.6.3/agda/0Trinitarianism/Quest2Solutions.agdai new file mode 100644 index 0000000..c0efbe6 Binary files /dev/null and b/_build/2.6.3/agda/0Trinitarianism/Quest2Solutions.agdai differ