context | X,Y … type |
rule | a : Xb : Y⟨a,b⟩ : X×Y(×I) |
rule | p: X×Yπl(p) : Xπr(p) : Y(×E) |
rule | a : Xb : Yπl(⟨a,b⟩) ↭ |
rule | {\large\frac{p\ :\ X\times Y}{\langle\pi_{\mathcal l}(p),\pi_{\mathcal r}(p)\rangle\ \leftrightsquigarrow\ p}}(\times\eta) |
rule | {\large\frac{a\ \leftrightsquigarrow\ a'\ :\ X\hspace{1cm}b\ \leftrightsquigarrow\ b'\ :\ Y}{\langle a,b\rangle\ \leftrightsquigarrow\ \langle a',b'\rangle}} |
rule | {\large\frac{p\ \leftrightsquigarrow\ p'\ :\ X\times Y}{\pi_{\mathcal l}(p)\ \leftrightsquigarrow\ \pi_{\mathcal l}(p')\hspace{1cm}\pi_{\mathcal l}(p)\ \leftrightsquigarrow\ \pi_{\mathcal r}(p')}} |
These are constructors (introduction and elimination), computational rules for \pi (alpha and beta) and defining property of the pair.
Depending on what we want to do with the type system, we might just replace expressions of computational equivalence \rightsquigarrow by equality '='. This symbol denotes a term rewriting, i.e. a computations alla
\left(\lambda x.\,3+x\right)\,4\ \rightsquigarrow_\beta\ 3+4,
or
\lambda x.\,\sin\,x\ \rightsquigarrow_\eta\ \sin
Note how the rules reflect the logical “and”.