{-# OPTIONS --cubical-compatible #-}
module AFF2024.AgdaTutorial.Session-ALA where

data  : Set where  -- \bN
  zero : 
  succ :      -- \to
-- With this definition, the
-- inhabitants of ℕ are:
-- zero, succ zero, succ (succ zero), ...

-- in blackboard maths: f(x,y)
-- in Agda:             f x y

-- zero : ℕ : Set : Set₁ : Set₂ : ... : Setω : Setω1

one : 
one = succ zero

-- For instance, double 4 should be 8.
double :   
double zero     = zero
double (succ x) = succ (succ (double x))
-- double (succ x) = 2*(1+x) = 2 + 2x = 1 + (1 + 2x)
-- = succ (succ (double x))

-- on a blackboard: add : ℕ × ℕ → ℕ
_+_ :     
zero   + y = y
succ a + y = succ (a + y)
-- add (succ a) y = (succ a) + y = (1+a) + y = 1+(a+y) = 1 + (add a y)
-- = succ (add a y)

data _≡_ :     Set where
  refl : {x : }  x  x

-- For every number x : ℕ, for every number y : ℕ,
-- there is a new type/set called "x ≡ y".
-- This type contains all the witnesses that x equals y.
-- For instance, the type "zero ≡ one" is empty.
-- On the other hand, the type "zero ≡ zero" is inhabited:
thm : (zero  zero)  -- \==
thm = refl

two : 
two = succ (succ zero)

thm' : (one + one)  two
thm' = refl

-- logical reading: ∀y:ℕ. zero + y = y.
-- computational reading: "thm''" is a function which inputs
-- a natural number (henceforth called "y")
-- and outputs a witness that zero + y equals y.
thm'' : (y : )  (zero + y)  y
thm'' y = refl

-- Logical reading: ∀f : ℕ → ℕ. ∀x : ℕ. ∀y : ℕ. (x = y ⇒ f(x) = f(y))
-- Computational reading: "cong" is a function which inputs
-- (1) a function f : ℕ → ℕ
-- (2) a number x : ℕ
-- (3) a number y : ℕ
-- (4) a witness that x equals y
-- and outputs a witness that f x equals f y.
-- cong : (f : ℕ → ℕ) → (x : ℕ) → (y : ℕ) → x ≡ y → f x ≡ f y
cong : (f :   ) {x y : }  x  y  f x  f y
cong f refl = refl

thm''' : (x : )  (x + zero)  x
thm''' zero     = refl
thm''' (succ a) = cong succ (thm''' a)

-- {-# BUILTIN NATURAL ℕ #-}
-- eighthundred : ℕ
-- eighthundred = 800

{-
thm'''' : (axiom-of-choice : ...) → (x : ℕ) → (x + zero) ≡ x
thm'''' = ?
-}

-- Agda is based on "Martin-Löf type theory" (with a couple of additions),
-- which is a constructive system, but we can always postulate axioms
-- missing from this foundation:
postulate
  -- axiom-of-choice : {!!}
  crazy-identity  : zero  one