{-# OPTIONS --without-K #-}

-- Agda-MLTT library.
-- Author: Mario Román.

-- Base.  Basic definitions for Martin-Löf type theory, elimination
-- principles, induction principles and some basic lemmas.

module Base where

-- The terminal type with a single constructor.
record  : Set where
  instance constructor tt
{-# BUILTIN UNIT  #-}


-- The initial type, without any constructors.
data  : Set where

-- Definition of negation.
¬ : Set  Set
¬ A = A  


-- Definition of equality inside as an inductive type. Its induction
-- principle is the J-elimination rule described in (4.5.2).
infix 4 _≡_
data _≡_ {a} {A : Set a} (x : A) : A  Set a where
  instance refl : x  x
{-# BUILTIN EQUALITY _≡_ #-}

-- Explicit reflexivity
refl-in : {A : Set} (a : A)  a  a
refl-in a = refl


-- Definition of the sigma type as a record with two constructors.
-- Its elimination principle can be directly derived from the
-- definition.
record Σ (S : Set) (T : S  Set) : Set where
  constructor _,_
  field
    fst : S
    snd : T fst
open Σ public

Σ-elim : {A : Set} {B : A  Set} {P : Set}  Σ A B  (Σ A B  P)  P
Σ-elim (a , b) f = f (a , b)

-- Product type, as a particular case of a Sigma type over a constant
-- family of types.
_×_ : (S : Set) (T : Set)  Set
A × B = Σ A  _  B)

-- Sum type.  It is defined explicitly as an inductive type with two
-- constructors.
data _⊎_ (S : Set) (T : Set) : Set where
  inl : S  S  T
  inr : T  S  T


-- Function extensionality. We postulate that two functions are equal
-- if they take equal inputs into equal outputs.
postulate
  funext : {A : Set} {B : A  Set}  {f g : (a : A)  B a}
     ((x : A)  f x  g x)  f  g


-- From falsehood, anything follows.
exfalso : {A : Set}    A
exfalso ()