TheHoTTGame/Trinitarianism/Quest1.md
2021-07-24 13:43:27 +01:00

2.4 KiB
Raw Blame History

Dependent Types

In a 'place to do maths' we would like to be able to express and 'prove' the statement

There exists a natural that is even.

This requires the notion of a predicate. In general a predicate on a type A : Type is a term of type A → Type. For example,

isEven :   Type
isEven n = ? 
  • Do C-c C-l to load the file.

  • Navigate to the hole.

  • Input n in the hole and do C-c C-c. You should now see

    
    isEven :   Type
    isEven zero = {!!}
    isEven (suc n) = {!!}
    
    

    Explanation : 'to define a function on , it suffices to define the function on the _cases, zero and suc n, since these are the only constructors given in the definition of '. This has the following interpretations,

    • propositionally, this is the principle of mathematical induction.
    • categorically, this is the universal property of a natural numbers object.
  • Navigate to the first hole and check the goal. You should see

    Goal: Type
    ———————————
    

    Fill the hole with , since we want zero to be even.

  • Navigate to the second hole.

  • Input n and do C-c C-c again. You should now see

    isEven :   Type
    isEven zero = 
    isEven (suc zero) = {!!}
    isEven (suc (suc n)) = {!!} 
    

    Explanation : we have just used induction again.

  • Navigate to the first hole and check the goal. Agda should be asking for a term of type Type, so fill the hole with , since we don't want suc zero to be even.

  • Navigate to the next hole and check the goal. You should see in the 'agda information' window,

    Goal: Type
    ——————————————
    n : 
    

    Explanation : We are in the 'inductive step', so we have access to the previous natural number.

  • Fill the hole with isEven n, since we want suc (suc n) to be even precisely when n is even.

    The reason we have access to the term isEven n is again because we are in the 'inductive step'.

  • There should now be nothing in the 'agda info' window. Everything is working!

There are three interpretations of isEven : → Type.

  • Already mentioned, isEven is a predicate on .
  • isEven is a dependent construction. Specifically, it is either or depending on n : .
  • isEven is a bundle over , i.e. an object in the over-category Type↓. Pictorially, it looks like (insert picture).