Martin Escardo.
General terminology and notation.
\begin{code}
{-# OPTIONS --safe --without-K #-}
module Notation.General where
open import MLTT.Pi
open import MLTT.Sigma
open import MLTT.Universes
open import MLTT.Id
open import MLTT.Negation public
\end{code}
The notation `Type ๐ค` should be avoided in favour of `๐ค ฬ`, but some
module do use it.
\begin{code}
Type = Set
Typeโ = Setโ
fiber : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } โ (X โ Y) โ Y โ ๐ค โ ๐ฅ ฬ
fiber f y = ฮฃ x ๊ domain f , f x ๏ผ y
to-fiber : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } (f : X โ Y) (x : X)
โ fiber f (f x)
to-fiber f x = x , refl
fiber-point : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } {f : X โ Y} {y : Y} โ fiber f y โ X
fiber-point = prโ
fiber-identification : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } {f : X โ Y} {y : Y} (w : fiber f y)
โ f (fiber-point w) ๏ผ y
fiber-identification = prโ
each-fiber-of : {X : ๐ค ฬ } {Y : ๐ฅ ฬ }
โ (X โ Y)
โ (๐ค โ ๐ฅ ฬ โ ๐ฆ ฬ )
โ ๐ฅ โ ๐ฆ ฬ
each-fiber-of f P = โ y โ P (fiber f y)
fix : {X : ๐ค ฬ } โ (f : X โ X) โ ๐ค ฬ
fix f = ฮฃ x ๊ domain f , x ๏ผ f x
from-fix : {X : ๐ค ฬ } (f : X โ X) โ fix f โ X
from-fix f = prโ
from-fix-is-fixed : {X : ๐ค ฬ } (f : X โ X) (ฯ : fix f)
โ from-fix f ฯ ๏ผ f (from-fix f ฯ)
from-fix-is-fixed f = prโ
reflexive : {X : ๐ค ฬ } โ (X โ X โ ๐ฅ ฬ ) โ ๐ค โ ๐ฅ ฬ
reflexive R = โ x โ R x x
symmetric : {X : ๐ค ฬ } โ (X โ X โ ๐ฅ ฬ ) โ ๐ค โ ๐ฅ ฬ
symmetric R = โ x y โ R x y โ R y x
antisymmetric : {X : ๐ค ฬ } โ (X โ X โ ๐ฅ ฬ ) โ ๐ค โ ๐ฅ ฬ
antisymmetric R = โ x y โ R x y โ R y x โ x ๏ผ y
transitive : {X : ๐ค ฬ } โ (X โ X โ ๐ฅ ฬ ) โ ๐ค โ ๐ฅ ฬ
transitive R = โ x y z โ R x y โ R y z โ R x z
idempotent-map : {X : ๐ฅ ฬ } โ (f : X โ X) โ ๐ฅ ฬ
idempotent-map f = โ x โ f (f x) ๏ผ f x
involutive : {X : ๐ฅ ฬ } โ (f : X โ X) โ ๐ฅ ฬ
involutive f = โ x โ f (f x) ๏ผ x
left-neutral : {X : ๐ค ฬ } โ X โ (X โ X โ X) โ ๐ค ฬ
left-neutral e _ยท_ = โ x โ e ยท x ๏ผ x
right-neutral : {X : ๐ค ฬ } โ X โ (X โ X โ X) โ ๐ค ฬ
right-neutral e _ยท_ = โ x โ x ยท e ๏ผ x
associative : {X : ๐ค ฬ } โ (X โ X โ X) โ ๐ค ฬ
associative _ยท_ = โ x y z โ (x ยท y) ยท z ๏ผ x ยท (y ยท z)
associative' : {X : ๐ค ฬ } โ (X โ X โ X) โ ๐ค ฬ
associative' _ยท_ = โ x y z โ x ยท (y ยท z) ๏ผ (x ยท y) ยท z
commutative : {X : ๐ค ฬ } โ (X โ X โ X) โ ๐ค ฬ
commutative _ยท_ = โ x y โ (x ยท y) ๏ผ (y ยท x)
left-cancellable : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } โ (X โ Y) โ ๐ค โ ๐ฅ ฬ
left-cancellable f = โ {x x'} โ f x ๏ผ f x' โ x ๏ผ x'
left-cancellable' : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } โ (X โ Y) โ ๐ค โ ๐ฅ ฬ
left-cancellable' f = โ x x' โ f x ๏ผ f x' โ x ๏ผ x'
right-cancellable : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } โ (X โ Y) โ ๐คฯ
right-cancellable f = {๐ฆ : Universe} {Z : ๐ฆ ฬ } (g h : codomain f โ Z)
โ g โ f โผ h โ f
โ g โผ h
_โ_ : ๐ค ฬ โ ๐ฅ ฬ โ ๐ค โ ๐ฅ ฬ
A โ B = (A โ B) ร (B โ A)
lr-implication : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } โ (X โ Y) โ (X โ Y)
lr-implication = prโ
rl-implication : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } โ (X โ Y) โ (Y โ X)
rl-implication = prโ
โ-sym : {X : ๐ค' ฬ } {Y : ๐ฅ' ฬ } โ X โ Y โ Y โ X
โ-sym (f , g) = (g , f)
โ-trans : {X : ๐ค' ฬ } {Y : ๐ฅ' ฬ } {Z : ๐ฆ' ฬ }
โ X โ Y โ Y โ Z โ X โ Z
โ-trans (f , g) (h , k) = (h โ f , g โ k)
โ-refl : {X : ๐ค' ฬ } โ X โ X
โ-refl = (id , id)
\end{code}
This is to avoid naming implicit arguments:
\begin{code}
type-of : {X : ๐ค ฬ } โ X โ ๐ค ฬ
type-of {๐ค} {X} x = X
\end{code}
We use the following to indicate the type of a subterm (where "โถ"
(typed "\:" in emacs) is not the same as ":"):
\begin{code}
-id : (X : ๐ค ฬ ) โ X โ X
-id X x = x
syntax -id X x = x โถ X
\end{code}
This is used for efficiency as a substitute for lazy "let" (or "where"):
\begin{code}
case_of_ : {A : ๐ค ฬ } {B : A โ ๐ฅ ฬ } โ (a : A) โ ((a : A) โ B a) โ B a
case x of f = f x
Case_of_ : {A : ๐ค ฬ } {B : A โ ๐ฅ ฬ } โ (a : A) โ ((x : A) โ a ๏ผ x โ B a) โ B a
Case x of f = f x refl
{-# NOINLINE case_of_ #-}
\end{code}
Notation to try to make proofs readable:
\begin{code}
need_which-is-given-by_ : (A : ๐ค ฬ ) โ A โ A
need A which-is-given-by a = a
have_by_ : (A : ๐ค ฬ ) โ A โ A
have A by a = a
have_so_ : {A : ๐ค ฬ } {B : ๐ฅ ฬ } โ A โ B โ B
have a so b = b
have_so-use_ : {A : ๐ค ฬ } {B : ๐ฅ ฬ } โ A โ B โ B
have a so-use b = b
have_and_ : {A : ๐ค ฬ } {B : ๐ฅ ฬ } โ A โ B โ B
have a and b = b
apply_to_ : {A : ๐ค ฬ } {B : ๐ฅ ฬ } โ (A โ B) โ A โ B
apply f to a = f a
have_so-apply_ : {A : ๐ค ฬ } {B : ๐ฅ ฬ } โ A โ (A โ B) โ B
have a so-apply f = f a
assume-then : (A : ๐ค ฬ ) {B : A โ ๐ฅ ฬ } โ ((a : A) โ B a) โ (a : A) โ B a
assume-then A f x = f x
syntax assume-then A (ฮป x โ b) = assume x โถ A then b
assume-and : (A : ๐ค ฬ ) {B : A โ ๐ฅ ฬ } โ ((a : A) โ B a) โ (a : A) โ B a
assume-and A f x = f x
syntax assume-and A (ฮป x โ b) = assume x โถ A and b
mapsto : {A : ๐ค ฬ } {B : A โ ๐ฅ ฬ } โ ((a : A) โ B a) โ (a : A) โ B a
mapsto f = f
syntax mapsto (ฮป x โ b) = x โฆ b
infixr 10 mapsto
Mapsto : (A : ๐ค ฬ ) {B : A โ ๐ฅ ฬ } โ ((a : A) โ B a) โ (a : A) โ B a
Mapsto A f = f
syntax Mapsto A (ฮป x โ b) = x ๊ A โฆ b
infixr 10 Mapsto
\end{code}
Get rid of this:
\begin{code}
ฮฃ! : {X : ๐ค ฬ } (A : X โ ๐ฅ ฬ ) โ ๐ค โ ๐ฅ ฬ
ฮฃ! {๐ค} {๐ฅ} {X} A = (ฮฃ x ๊ X , A x) ร ((x x' : X) โ A x โ A x' โ x ๏ผ x')
Sigma! : (X : ๐ค ฬ ) (A : X โ ๐ฅ ฬ ) โ ๐ค โ ๐ฅ ฬ
Sigma! X A = ฮฃ! A
syntax Sigma! A (ฮป x โ b) = ฮฃ! x ๊ A , b
infixr -1 Sigma!
\end{code}
Note: ฮฃ! is to be avoided, in favour of the contractibility of ฮฃ,
following univalent mathematics.
Ian Ray, 3rd December 2025.
We add a new syntax where we reason with functions chained in sequence which is
analogous to reasoning by chains of equations or equivalences (see
MLTT/Id.lagda and UF/Equiv.lagda to review these ideas). We will include both
compostional and diagrammatic order.
Notice that reasoning in compositional order with g : B โ C and f : A โ B
C โโจ g โฉ
B โโจ f โฉ
A โข
amounts to a function A โ C (via normal composition), but it appears in the
'bottom up' direction. This may seem strange at first, as one might expect
this feature to only be useful in the forward direction, that is, in
diagrammatic order. In fact, the above actually reflects a common mode of proof
where one proves C by observing it suffices to prove B (and supplying a map
from B to C) and then proving B by observing it suffices to prove A (and
supplying a map from A to B). For this reason we provide notation that allows
us to display proofs of this sort.
\begin{code}
_โโจ_โฉ_ : (X : ๐ค ฬ ) {Y : ๐ฅ ฬ } {Z : ๐ฆ ฬ } โ (X โ Y) โ (Y โ Z) โ (X โ Z)
_ โโจ f โฉ g = g โ f
_โโจ_โฉ_ : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } (Z : ๐ฆ ฬ ) โ (Y โ Z) โ (X โ Y) โ (X โ Z)
_ โโจ g โฉ f = g โ f
_suffices-to-showโจ_โฉ_ : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } (Z : ๐ฆ ฬ )
โ (Y โ Z) โ (X โ Y) โ (X โ Z)
_ suffices-to-showโจ g โฉ f = g โ f
_โข : (X : ๐ค ฬ ) โ X โ X
X โข = id
infix 1 _โข
infixr 0 _โโจ_โฉ_
infixr 0 _โโจ_โฉ_
infixr 0 _suffices-to-showโจ_โฉ_
\end{code}
Fixities:
\begin{code}
infixl -1 -id
infix -1 _โ_
\end{code}