---
title: an imperfect algorithmic presentation of xtt
date: 2023-06-12
tags: [computer, types]
bibliography: quox.bib
link-citations: true
show-toc: true
...
hello everyone. as part of my language [quox] i made a typechecking algorithm
for xtt [@xtt]. plus other stuff. but here's just the xtt part, in case anyone
is interested.
[quox]: https://git.rhiannon.website/rhi/quox
- the syntax is slightly different because it uses bidirectional typing [@bidi].
i've tried to roll back my other arbitrary syntactic changes for this document
to avoid confusion though. other than subtyping instead of explicit lifting,
because that seemed significantly easier. to me at least.
- this algorithm [isn't very efficient](#compute-elim-ty). it is what currently
exists in quox, and when i improve that stuff in future, hopefully i'll
remember to come back and update this post.
- i also **haven't proven anything**, so if it's wrong, then i apologise for my
hubris.
anyway. let's get started.
# syntax
mostly follows @xtt, but with a few annotations added or removed for
bidirectional reasons.
- a "term" is a type or an introduction form. it can be checked against a given
type.
- an "elimination" is a string of elimination forms applied to either a variable
or an annotated term. its type can be synthesised.
- substitutions take variables to _eliminations_, to preserve typeability,
and in this presentation, syntactic well-formedness.
- $x, y$ denote term variables, and $๐, ๐$ denote dimension variables.
:::texdefs
$$
\newcommand\Ceq{\Coloneqq}
\newcommand\Or{\mathrel|}
\newcommand\E\underline
\newcommand\Bar{\mathrel|}
\newcommand\Rule[3]{
\begin{array}{l}
\text{\small [#3]} \\
\displaystyle
\frac{ \begin{gather}#1\end{gather} }{ \begin{gather}#2\end{gather} }
\end{array}
}
$$
:::
$$
\begin{aligned}
ฮต &\Ceq 0 \Or 1 & \text{dimension constants} \\
p, q &\Ceq ๐ \Or ฮต & \text{dimensions} \\
ฮพ &\Ceq p = q & \text{dimension constraints} \\
๐ &โ โ & \text{concrete universe levels} \\
โ &\Ceq ๐ \Or \top & \text{judgement levels} \\
s, t, u, A, B, C &\Ceq
๐ฐ_โ \Or
(x : A) โ B \Or ฮปx. s \Or
(x : A) ร B \Or (s, t) \Or
& \text{terms (incl. types)} \\
& \mathrel{\hphantom{\Ceq}}
๐๐พ_{๐. A} \; s \; t \Or ฮป๐. s \Or
๐ฏ๐ผ๐ผ๐น \Or ๐๐ฟ๐๐ฒ \Or ๐ณ๐ฎ๐น๐๐ฒ \Or \E{e} \\
e, f, g &\Ceq
x \Or
f \; s \Or
๐ณ๐๐ \; e \Or ๐๐ป๐ฑ \; e \Or
f \; p \Or
๐ถ๐ณ_{x. A} \; e \; ๐๐ต๐ฒ๐ป \; s \; ๐ฒ๐น๐๐ฒ \; t \Or s : A \Or
& \text{eliminations} \\
& \mathrel{\hphantom{\Ceq}}
[๐. A] โ^p_{p'} s \Or
A โ^p_{p'} s \; [q \; ๐๐ถ๐๐ต \; 0 โช ๐. tโ \Bar 1 โช ๐. tโ] \Or \\
& \mathrel{\hphantom{\Ceq}}
๐๐๐ฐ๐ฎ๐๐ฒ_A \; e \; \left[
\begin{array}{lcl}
๐ฐ & โช & t_๐ฐ \\
ฮ \; x \; y & โช & t_ฮ \\
ฮฃ \; x \; y & โช & t_ฮฃ \\
๐๐พ \; xโ \; xโ \; x \; yโ \; yโ & โช & t_{๐๐พ} \\
๐ฏ๐ผ๐ผ๐น & โช & t_{๐ฏ๐ผ๐ผ๐น}
\end{array}
\right] \\
ฮจ, ฮฆ &\Ceq ยท \Or ฮจ, ๐ \Or ฮจ, ฮพ & \text{cubes} \\
ฮ, ฮ &\Ceq ยท \Or ฮ, x: A & \text{contexts}
\end{aligned}
$$
only real levels $๐ โ โ$ can occur in expressions. the special level $\top$ is
for checking a type in a context where any level is accepted, for example the
type in an annotation $s : A$.
in a $๐๐๐ฐ๐ฎ๐๐ฒ$, the pattern variables are assigned this way:
- for a function type $(z : A) โ B : ๐ฐ_๐$, the $ฮ $ case is taken with
$x โ (A : ๐ฐ_๐)$ and $y โ ((ฮปz. B) : ๐ฐ_๐ โ ๐ฐ_๐)$.
- same for a pair type $(z : A) ร B$ and the $ฮฃ$ case.
- for an equality type $๐๐พ_{i. A} \; s \; t : ๐ฐ_๐$:
- $xโ$ and $xโ$ are set to the endpoints of the type line $A$; \
$xโ โ (A[0/๐] : ๐ฐ_๐)$ and $xโ โ (A[1/๐] : ๐ฐ_๐)$.
- $x$ is an equality between them; \
$x โ ((ฮป๐. A) : ๐๐พ_{๐. ๐ฐ_๐} \; A[0/๐] \; A[1/๐]$.
- $yโ$ and $yโ$ are the terms being equated; \
$yโ โ (s : A[0/๐])$ and $yโ โ (t : A[1/๐])$.
----
:::texdefs
$$
\newcommand\IN{\textcolor{#60c}}
\newcommand\OUT{\textcolor{#082}}
$$
:::
when introducing new judgements, the [inputs]{.input} and [outputs]{.output} are
colour coded. all judgements assume that the cube and context are well formed
(omitted).
:::rulebox
$$
\begin{gathered}
\IN{ฮจ} โข \IN{p} \; ๐๐ข๐ฆ \qquad
\IN{ฮจ} โข \IN{p} = \IN{p'} \; ๐๐ข๐ฆ
\end{gathered}
$$
:::
# dimension checking {#dim}
the well-formedness rules are the same as in the paper. since quox uses well
scoped de bruijn indices, every value of type `Dim d` is well formed, so they
don't exist at all really.
the equality rules are just baby's first equational theory solver.
:::rulebox
$$ \IN{ฮจ} \Bar \IN{ฮ} โข \IN{A} โ ๐ญ๐ฒ๐ฉ๐_{\IN{โ}} $$
:::
# type checking {#ty}
$$ \Rule{}{ฮจ, 0=1 \Bar ฮ โข A โ ๐ญ๐ฒ๐ฉ๐_โ}{ty-01} $$
$$ \Rule{}{ฮจ \Bar ฮ โข ๐ฏ๐ผ๐ผ๐น โ ๐ญ๐ฒ๐ฉ๐_โ}{ty-bool} $$
$$
\Rule{
ฮจ \Bar ฮ โข A โ ๐ญ๐ฒ๐ฉ๐_โ \qquad
ฮจ \Bar ฮ, x : A โข B โ ๐ญ๐ฒ๐ฉ๐_โ
}{
ฮจ \Bar ฮ โข (x : A) โ B โ ๐ญ๐ฒ๐ฉ๐_โ \\
ฮจ \Bar ฮ โข (x : A) ร B โ ๐ญ๐ฒ๐ฉ๐_โ
}{ty-pi; ty-sig}
$$
$$
\Rule{
ฮจ, ๐ \Bar ฮ โข A โ ๐ญ๐ฒ๐ฉ๐_โ \qquad
ฮจ, ๐, ๐ = ฮต \Bar ฮ โข s_ฮต โ A
}{
ฮจ \Bar ฮ โข ๐๐พ_{๐. A} \; sโ \; sโ โ ๐ญ๐ฒ๐ฉ๐_โ
}{ty-eq}
$$
$$ \Rule{ฮจ \Bar ฮ โข e โ ๐ฐ_โ}{ฮจ \Bar ฮ โข \E e โ ๐ญ๐ฒ๐ฉ๐_โ}{ty-el} $$
:::rulebox
$$ \IN{โ} < \IN{โ'} $$
:::
for comparing levels:
$$
\Rule{๐ <_โ ๐'}{๐ < ๐'}{lvl-nat} \qquad
\Rule{๐ โ โ}{๐ < \top}{lvl-top}
$$
:::rulebox
$$ \IN{ฮจ} \Bar \IN{ฮ} โข \IN{s} โ \IN{A} $$
:::
# term checking {#chk}
assumes that $ฮจ \Bar ฮ โข A โ ๐ญ๐ฒ๐ฉ๐_\top$.
$$ \Rule{}{ฮจ, 0=1 \Bar ฮ โข s โ A}{tm-01} $$
[reduce the expected type to whnf](#tm-red) before trying to match against it, of
course.
$$
\Rule{
ฮ โข ๐ฐ๐ก๐ง๐ \; A โฆ A' \qquad
ฮจ \Bar ฮ โข_w s โ A'
}{ฮจ \Bar ฮ โข s โ A}{tm-whnf}
$$
if $s$ is syntactically a type, then defer to $๐ญ๐ฒ๐ฉ๐$ [above](#ty).
$$ \Rule{ฮจ \Bar ฮ โข A โ ๐ญ๐ฒ๐ฉ๐_โ}{ฮจ \Bar ฮ โข_w A โ ๐ฐ_โ}{tm-ty} $$
otherwise:
$$
\Rule{ฮจ \Bar ฮ, x : A โข s โ B}{ฮจ \Bar ฮ โข_w ฮปx. s โ (x : A) โ B}{tm-lam}
$$
$$
\Rule{
ฮจ \Bar ฮ โข s โ A \qquad
ฮจ \Bar ฮ โข t โ B[(t:A)/x]
}{ฮจ \Bar ฮ โข_w (s, t) โ (x : A) ร B}{tm-pair}
$$
$$
\Rule{
ฮจ, i \Bar ฮ โข s โ A \qquad
ฮจ, i, i = ฮต \Bar ฮ โข s = s_ฮต โ A
}{ฮจ \Bar ฮ โข_w ฮป๐. s โ ๐๐พ_{๐. A} \; sโ \; sโ}{tm-dlam}
$$
$$
\Rule{}{
ฮจ \Bar ฮ โข_w ๐๐ฟ๐๐ฒ โ ๐ฏ๐ผ๐ผ๐น \qquad ฮจ \Bar ฮ โข_w ๐ณ๐ฎ๐น๐๐ฒ โ ๐ฏ๐ผ๐ผ๐น
}{tm-true; tm-false}
$$
:::aside
maybe you want to make $๐๐ฟ๐๐ฒ$ and $๐ณ๐ฎ๐น๐๐ฒ$ inferrable. _in my opinion_, there are
not that many cases where you end up having to write $๐๐ฟ๐๐ฒ : ๐ฏ๐ผ๐ผ๐น$, and, if you
have separate term/elim syntactic classes like i do, it's not worth muddying the
nice clean separation in e.g. $๐ฐ๐ก๐ง๐$ for this. in my onion. :onion:
:::
$$
\Rule{
ฮจ \Bar ฮ โข e โ A' \qquad
ฮจ \Bar ฮ โข A <:_\top A'
}{ฮจ \Bar ฮ โข \E e โ A}{tm-el}
$$
:::rulebox
$$ \IN{ฮจ} \Bar \IN{ฮ} โข \IN{e} โ \OUT{A} $$
:::
# elimination synthesis {#syn}
$$ \Rule{}{ฮจ, 0=1 \Bar ฮ โข e โ ๐ฏ๐ผ๐ผ๐น}{el-01} $$
in an inconsistent cube, the type being returned is just a placeholder.
in quox, the typechecker returns what is essentially a more
fancily-typed `Maybe`, with `Nothing` iff $ฮจ โข 0=1 \; ๐๐ข๐ฆ$.
$$ \Rule{x : A โ ฮ}{ฮจ \Bar ฮ โข x โ A}{el-var} $$
$$
\Rule{
ฮจ \Bar ฮ โข f โ (x : A) โ B \qquad
ฮจ \Bar ฮ โข s โ A
}{ฮจ \Bar ฮ โข f \; s โ B[(s:A)/x]}{el-app}
$$
$$
\Rule{
ฮจ \Bar ฮ โข e โ (x : A) ร B
}{
ฮจ \Bar ฮ โข ๐ณ๐๐ \; e โ A \qquad
ฮจ \Bar ฮ โข ๐๐ป๐ฑ \; e โ B[(๐ณ๐๐ \; e)/x]
}{el-fst; el-snd}
$$
$$
\Rule{
ฮจ \Bar ฮ โข e โ ๐ฏ๐ผ๐ผ๐น \qquad
ฮจ \Bar ฮ, x : ๐ฏ๐ผ๐ผ๐น โข A โ ๐ญ๐ฒ๐ฉ๐_\top \\
ฮจ \Bar ฮ โข s โ A[(๐๐ฟ๐๐ฒ : ๐ฏ๐ผ๐ผ๐น)/x] \qquad
ฮจ \Bar ฮ โข t โ A[(๐ณ๐ฎ๐น๐๐ฒ : ๐ฏ๐ผ๐ผ๐น)/x]
}{
ฮจ \Bar ฮ โข ๐ถ๐ณ_{x. A} \; e \; ๐๐ต๐ฒ๐ป \; s \; ๐ฒ๐น๐๐ฒ \; t โ A[e/x]
}{el-if}
$$
:::aside
maybe you want to make the head of $๐ถ๐ณ$ be checkable. same caveat as making
$๐๐ฟ๐๐ฒ$/$๐ณ๐ฎ๐น๐๐ฒ$ inferrable. i just don't think $๐ถ๐ณ \; ๐๐ฟ๐๐ฒ : ๐ฏ๐ผ๐ผ๐น \; ๐๐ต๐ฒ๐ป โฏ$
comes up often enough to worry about it.
:::
$$
\Rule{
ฮจ \Bar ฮ โข A โ ๐ญ๐ฒ๐ฉ๐_\top \qquad
ฮจ \Bar ฮ โข s โ A
}{
ฮจ \Bar ฮ โข s : A โ A
}{el-ann}
$$
$$
\Rule{
ฮจ, ๐ \Bar ฮ โข A โ ๐ญ๐ฒ๐ฉ๐_\top \qquad
ฮจ โข p \qquad ฮจ โข p' \qquad
ฮจ \Bar ฮ โข s โ A[p/๐]
}{
ฮจ \Bar ฮ โข [๐. A] โ^p_{p'} s โ A[p'/๐]
}{el-coe}
$$
$$
\Rule{
ฮจ \Bar ฮ โข A โ ๐ญ๐ฒ๐ฉ๐_\top \qquad
ฮจ \Bar ฮ โข s โ A \\
ฮจ, q=ฮต, ๐ \Bar ฮ โข t_ฮต โ A \qquad
ฮจ, q=ฮต, ๐, ๐=p \Bar ฮ โข t_ฮต = s โ A \\
}{
ฮจ \Bar ฮ โข
A โ^p_{p'} s \; [q \; ๐๐ถ๐๐ต \; 0 โช ๐. tโ \Bar 1 โช ๐. tโ]
โ A
}{el-comp}
$$
$$
\Rule{
ฮจ \Bar ฮ โข A โ ๐ญ๐ฒ๐ฉ๐_\top \qquad
ฮจ \Bar ฮ โข e โ ๐ฐ_๐ \\
ฮจ \Bar ฮ โข t_๐ฐ โ A \qquad
ฮจ \Bar ฮ โข t_{๐ฏ๐ผ๐ผ๐น} โ A \\
ฮจ \Bar ฮ, x : ๐ฐ_๐, y : ๐ฐ_๐ โข t_ฮ โ A \qquad
ฮจ \Bar ฮ, x : ๐ฐ_๐, y : ๐ฐ_๐ โข t_ฮฃ โ A \\
ฮจ \Bar ฮ, xโ : ๐ฐ_๐, xโ : ๐ฐ_๐, x : ๐๐พ_{\_. ๐ฐ_๐} \; xโ \; xโ,
yโ : xโ, yโ : xโ โข t_{๐๐พ} โ A
}{
ฮจ \Bar ฮ โข
๐๐๐ฐ๐ฎ๐๐ฒ_A \; e \; \left[
\begin{array}{lcl}
๐ฐ & โช & t_๐ฐ \\
ฮ \; x \; y & โช & t_ฮ \\
ฮฃ \; x \; y & โช & t_ฮฃ \\
๐๐พ \; xโ \; xโ \; x \; yโ \; yโ & โช & t_{๐๐พ} \\
๐ฏ๐ผ๐ผ๐น & โช & t_{๐ฏ๐ผ๐ผ๐น}
\end{array}\right] โ A
}{el-tycase}
$$
:::rulebox
$$ \IN ฮจ \Bar \IN ฮ โข \IN A <:_{\IN โ} \IN B $$
:::
# subtyping {#sub}
$$
\Rule{ฮจ \Bar ฮ โข A = A' โ ๐ญ๐ฒ๐ฉ๐_โ}{ฮจ \Bar ฮ โข A <:_{โ} A'}{sub-eq}
\qquad
\Rule{๐โ โค ๐โ < โ}{ฮจ \Bar ฮ โข ๐ฐ_{๐โ} <:_{โ} ๐ฐ_{๐โ}}{sub-univ}
$$
$$
\Rule{
ฮจ \Bar ฮ โข A' <:_{โ} A \qquad
ฮจ \Bar ฮ โข B <:_{โ} B'
}{
ฮจ \Bar ฮ โข (x : A) โ B <:_{โ} (x : A') โ B'
}{sub-ฮ }
\qquad
\Rule{
ฮจ \Bar ฮ โข A <:_{โ} A' \qquad
ฮจ \Bar ฮ โข B <:_{โ} B'
}{
ฮจ \Bar ฮ โข (x : A) ร B <:_{โ} (x : A') ร B'
}{sub-ฮฃ}
$$
$$
\Rule{
ฮจ \Bar ฮ โข A <:_{โ} A' \qquad
ฮจ \Bar ฮ โข s = s' โ A'[0/๐] \qquad
ฮจ \Bar ฮ โข t = t' โ A'[1/๐]
}{
ฮจ \Bar ฮ โข ๐๐พ_{i.A} \; s \; t <:_{โ} ๐๐พ_{i. A'} \; s' \; t'
}{sub-eq}
$$
# equality {#eq}
due to boundary separation, equality is tested separately in every consistent
corner of the cube, by generating all dimension substitutions and applying each
one in turn. the judgements with $โข_s$ are used in each corner individually.
$$
ฯ, ฯ \Ceq ยท \Or ฯ, ฮต/๐ \qquad \text{dimension substitutions}
$$
:::rulebox
$$ \OUT ฯ โ ๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐ข๐ฆ} \; \IN ฮจ $$
:::
## cube splitting
in general $ฯ$ has multiple solutions, returned as a set.
$$
\Rule{}{ยท โ ๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐ข๐ฆ} \; ยท}{sd-nil}
$$
$$
\Rule{
ฯ โ ๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐ข๐ฆ} \; ฮจ
}{
ฯ, 0/๐ โ ๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐ข๐ฆ} (ฮจ, ๐) \\
ฯ, 0/๐ โ
๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐ข๐ฆ} (ฮจ, ๐, ๐=0)
}{sd-0}
\qquad
\Rule{
ฯ โ ๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐ข๐ฆ} \; ฮจ
}{
ฯ, 1/๐ โ ๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐ข๐ฆ} (ฮจ, ๐) \\
ฯ, 1/๐ โ ๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐ข๐ฆ} (ฮจ, ๐, ๐=1)
}{sd-1}
$$
:::rulebox
$$ \IN{ฮจ} \Bar \IN{ฮ} โข \IN{A} = \IN{A'} โ ๐ญ๐ฒ๐ฉ๐_{\IN{โ}} $$
:::
## types {#ty-eq}
assumes that $ฮจ \Bar ฮ โข A โ ๐ญ๐ฒ๐ฉ๐_โ$ and $ฮจ \Bar ฮ โข A' โ ๐ญ๐ฒ๐ฉ๐_โ$.
$$
\Rule{
โ ฯ โ ๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐ข๐ฆ} \; ฮจ. ฮ โข_๐ฌ A[ฯ] = B[ฯ] โ ๐ญ๐ฒ๐ฉ๐_โ
}{
ฮจ \Bar ฮ โข A = B โ ๐ญ๐ฒ๐ฉ๐_โ
}{eq-ty-split}
$$
$$ \Rule{๐ < โ}{ฮ โข_๐ฌ ๐ฐ_๐ = ๐ฐ_๐ โ ๐ญ๐ฒ๐ฉ๐_โ}{eq-ty-univ} $$
$$
\Rule{
ฮ โข_๐ฌ A = A' โ ๐ญ๐ฒ๐ฉ๐_โ \qquad
ฮ, x : A โข_๐ฌ B = B' โ ๐ญ๐ฒ๐ฉ๐_โ \qquad
}{
ฮ โข_๐ฌ ((x : A) โ B) = ((x : A') โ B) โ ๐ญ๐ฒ๐ฉ๐_โ \\
ฮ โข_๐ฌ ((x : A) ร B) = ((x : A') ร B) โ ๐ญ๐ฒ๐ฉ๐_โ
}{eq-ty-\{ฮ ,ฮฃ\}}
$$
$$
\Rule{
ฮ โข_๐ฌ A[0/๐] = A'[0/๐] โ ๐ญ๐ฒ๐ฉ๐_โ \qquad
ฮ โข_๐ฌ A[1/๐] = A'[1/๐] โ ๐ญ๐ฒ๐ฉ๐_โ \\
ฮ โข_๐ฌ s = s' โ A[0/๐] \qquad
ฮ โข_๐ฌ t = t' โ A[1/๐]
}{
ฮ โข_๐ฌ ๐๐พ_{i. A} \; s \; t = ๐๐พ_{i. A'} \; s' \; t' โ ๐ญ๐ฒ๐ฉ๐_โ
}{eq-ty-eq}
$$
$$ \Rule{}{ฮ โข_๐ฌ ๐ฏ๐ผ๐ผ๐น = ๐ฏ๐ผ๐ผ๐น โ ๐ญ๐ฒ๐ฉ๐_โ}{eq-ty-bool} $$
$$ \Rule{ฮ โข_๐ฌ e = e' โ ๐ฐ_๐}{ฮ โข_๐ฌ \E{e} = \E{e'} โ ๐ญ๐ฒ๐ฉ๐_๐}{eq-ty-el} $$
:::rulebox
$$
\begin{gathered}
\IN{ฮจ} \Bar \IN{ฮ} โข \IN{s} = \IN{s'} โ \IN{A} \\
\IN{ฮ} โข_๐ฌ \IN{s} = \IN{s'} โ \IN{A}
\end{gathered}
$$
:::
## terms {#tm-eq}
assumes that $ฮจ \Bar ฮ โข s โ A$ and $ฮจ \Bar ฮ โข s' โ A$.
$$
\Rule{
โ ฯ โ ๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐ข๐ฆ} \; ฮจ. ฮ โข_๐ฌ s[ฯ] = s'[ฯ] โ A[ฯ]
}{
ฮจ \Bar ฮ โข s = s' โ A
}{eq-tm-split}
$$
$$
\Rule{
ฮ โข A \; ๐ฌ๐ฎ๐๐ฌ๐ข๐ง๐
}{
ฮ โข_๐ฌ s = t โ A
}{eq-tm-subsing}
$$
### types
$$ \Rule{ฮ โข_๐ฌ s = t โ ๐ญ๐ฒ๐ฉ๐_๐}{ฮ โข_๐ฌ s = t โ ๐ฐ_๐}{eq-tm-ty} $$
### functions
$$
\Rule{
ฮ, x : A โข_๐ฌ s = t โ B
}{
ฮ โข_๐ฌ (ฮปx. s) = (ฮปx. t) โ (x : A) โ B
}{eq-tm-ฮป}
$$
$$
\Rule{
ฮ, x : A โข_๐ฌ s = \E{e \; x} โ B
}{
ฮ โข_๐ฌ (ฮปx. s) = \E e โ (x : A) โ B
}{eq-tm-ฮป-ฮท1}
\qquad
\Rule{
ฮ, x : A โข_๐ฌ \E{e \; x} = s โ B
}{
ฮ โข_๐ฌ \E e = (ฮปx. s) โ (x : A) โ B
}{eq-tm-ฮป-ฮท2}
$$
### pairs
$$
\Rule{
ฮ โข_๐ฌ sโ = tโ โ A \qquad
ฮ, x : A โข_๐ฌ sโ = tโ โ B[sโ/x]
}{
ฮ โข (sโ, sโ) = (tโ, tโ) โ (x : A) ร B
}{eq-tm-pair}
$$
$$
\Rule{
ฮ โข_๐ฌ sโ = \E{๐ณ๐๐ \; e} โ A \qquad
ฮ โข_๐ฌ sโ = \E{๐๐ป๐ฑ \; e} โ B[sโ/x]
}{
ฮ โข (sโ, sโ) = \E e โ (x : A) ร B
}{eq-tm-pair-ฮท1}
$$
$$
\Rule{
ฮ โข_๐ฌ \E{๐ณ๐๐ \; e} = tโ โ A \qquad
ฮ โข_๐ฌ \E{๐๐ป๐ฑ \; e} = tโ โ B[tโ/x]
}{
ฮ โข \E e = (tโ, tโ) โ (x : A) ร B
}{eq-tm-pair-ฮท2}
$$
### equalities
look! uip!
$$ \Rule{}{ฮ โข_๐ฌ sโ = sโ โ ๐๐พ_{i. A} \; tโ \; tโ}{eq-tm-dฮป} $$
### bool
$$
\Rule{}{ฮ โข_๐ฌ ๐๐ฟ๐๐ฒ = ๐๐ฟ๐๐ฒ โ ๐ฏ๐ผ๐ผ๐น}{eq-tm-true} \qquad
\Rule{}{ฮ โข_๐ฌ ๐ณ๐ฎ๐น๐๐ฒ = ๐ณ๐ฎ๐น๐๐ฒ โ ๐ฏ๐ผ๐ผ๐น}{eq-tm-false}
$$
### eliminations
$$ \Rule{ฮ โข_๐ฌ e = e' โ A}{ฮ โข_๐ฌ \E e = \E{e'} โ A}{eq-tm-el} $$
:::rulebox
$$
\begin{gathered}
\IN{ฮจ} \Bar \IN{ฮ} โข \IN{e} = \IN{e'} \\
\IN{ฮ} โข_๐ฌ \IN{e} = \IN{e'} โ \OUT{A}
\end{gathered}
$$
:::
## eliminations {#el-eq}
assumes that $ฮจ \Bar ฮ โข e โ A$ and $ฮจ \Bar ฮ โข e' โ A$ for some $A$.
$$
\Rule{
โ ฯ โ ๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐ข๐ฆ} \; ฮจ. โA. ฮ โข_๐ฌ e[ฯ] = e'[ฯ] โ A
}{
ฮจ \Bar ฮ โข e = e'
}{eq-el-split}
$$
$$
\Rule{
ฮ โข ๐ญ๐ฒ \; e โฆ A \qquad ฮ โข A \; ๐ฌ๐ฎ๐๐ฌ๐ข๐ง๐
}{
ฮ โข_๐ฌ e = e' โ A
}{eq-el-subsing}
$$
:::aside
the type computed for this rule can't be shared with the rest of the rules,
because they only return a type when they succeed. very unsatisfying
:::
$$ \Rule{(x : A) โ ฮ}{ฮ โข_๐ฌ x = x โ A}{eq-el-var} $$
$$
\Rule{
ฮ โข_๐ฌ f = f' โ (x : A) โ B \qquad
ฮ โข_๐ฌ s = s' โ A
}{
ฮ โข_๐ฌ f \; s = f' \; s' โ B[s/x]
}{eq-el-app}
$$
$$
\Rule{
ฮ โข_๐ฌ e = e' โ (x : A) ร B
}{
ฮ โข_๐ฌ ๐ณ๐๐ \; e = ๐ณ๐๐ \; e' โ A \\
ฮ โข_๐ฌ ๐๐ป๐ฑ \; e = ๐๐ป๐ฑ \; e' โ B[๐ณ๐๐ \; e/x]
}{eq-el-\{fst,snd\}}
$$
$$
\Rule{
ฮ, x : ๐ฏ๐ผ๐ผ๐น โข_๐ฌ A = A' โ ๐ญ๐ฒ๐ฉ๐_\top \qquad
ฮ โข_๐ฌ e = e' โ ๐ฏ๐ผ๐ผ๐น \\
ฮ โข_๐ฌ s = s' โ A[(๐๐ฟ๐๐ฒ : ๐ฏ๐ผ๐ผ๐น)/x] \qquad
ฮ โข_๐ฌ t = t' โ A[(๐ณ๐ฎ๐น๐๐ฒ : ๐ฏ๐ผ๐ผ๐น)/x]
}{
ฮ โข_๐ฌ ๐ถ๐ณ_{x.A} \; e \; ๐๐ต๐ฒ๐ป \; s \; ๐ฒ๐น๐๐ฒ \; t =
๐ถ๐ณ_{x.A'} \; e' \; ๐๐ต๐ฒ๐ป \; s' \; ๐ฒ๐น๐๐ฒ \; t' โ A[e/x]
}{eq-el-if}
$$
TODO coe
in an empty cube, there are no dimension applications or compositions.
:::rulebox
$$ \IN ฮ โข \IN A \; ๐ฌ๐ฎ๐๐ฌ๐ข๐ง๐ $$
:::
# subsingleton types
if a type is a subsingleton (only ever has zero or one possible
values), then skip the equality check for its elements. this is used for neutral
terms e.g. two bound variables of the same equality type.
$$
\Rule{
ฮ โข ๐ฐ๐ก๐ง๐ \; A โฆ A' \qquad
ฮ โข A' \; ๐ฌ๐ฎ๐๐ฌ๐ข๐ง๐ _๐ฐ
}{ฮ โข A \; ๐ฌ๐ฎ๐๐ฌ๐ข๐ง๐ }{subsing}
$$
$$
\Rule{}{
ฮ โข ๐๐พ_{i. A} \; s \; t \; ๐ฌ๐ฎ๐๐ฌ๐ข๐ง๐ _๐ฐ
}{subsing-eq}
$$
$$
\Rule{
ฮ, x : A โข B \; ๐ฌ๐ฎ๐๐ฌ๐ข๐ง๐
}{
ฮ โข (x : A) โ B \; ๐ฌ๐ฎ๐๐ฌ๐ข๐ง๐ _๐ฐ
}{subsing-ฮ }
\qquad
\Rule{
ฮ โข A \; ๐ฌ๐ฎ๐๐ฌ๐ข๐ง๐ \qquad
ฮ, x : A โข B \; ๐ฌ๐ฎ๐๐ฌ๐ข๐ง๐
}{
ฮ โข (x : A) ร B \; ๐ฌ๐ฎ๐๐ฌ๐ข๐ง๐ _๐ฐ
}{subsing-ฮฃ}
$$
# reduction {#red}
:::rulebox
$$ \IN{ฮ} โข ๐ฐ๐ก๐ง๐ \; \IN{s} โฆ \OUT{s'} $$
:::
## terms {#tm-red}
assumes that $s$ is well-typed (in some consistent cube).
types and introduction forms are already in whnf. so the only case non-trivial
case is for embedded eliminations.
$$
\Rule{ฮ โข ๐ฐ๐ก๐ง๐ \; e โฆ e'}{ฮ โข ๐ฐ๐ก๐ง๐ \; \E e โฆ \E{e'}}{whnf-embed}
\qquad
\Rule{\text{$t$ is not an elimination}}{ฮ โข ๐ฐ๐ก๐ง๐ \; t โฆ t}{whnf-none}
$$
:::rulebox
$$
\begin{gathered}
\IN{ฮ} โข ๐ฐ๐ก๐ง๐ \; \IN{e} โฆ \OUT{e'} \\
\IN{ฮ} โข \IN{e} โ \OUT{e'}
\end{gathered}
$$
:::
## eliminations {#el-red}
assumes that $e$ is well-typed (in some consistent cube).
keep stepping the outermost expression until no more rules apply.
$$ \Rule{ฮ โข e โ^! e'}{ฮ โข ๐ฐ๐ก๐ง๐ \; e โฆ e'}{whnf-el} $$
### function application
$$ \Rule{ฮ โข e โ e'}{ฮ โข e \; t โ e' \; t}{step-app-head} $$
$$
\Rule{}{
ฮ โข ((ฮปx. t) : (x : A) โ B) \; s โ (t[(s:A)/x] : B[(s:A)/x])
}{step-app-ฮฒ}
$$
$$
\Rule{
ฮ โข ๐ฌ๐ฉ๐ฅ๐ข๐ญ_ฮ \; x \; C โฆ (A, B) \qquad
๐ฅ๐๐ญ \; \hat{s}[๐] โ [๐. A] โ^q_๐ s
}{
ฮ โข (([๐. C] โ^p_q s) \; t) โ
[๐. B[\hat{s}[i]/x]] โ^p_q ((t : C[p/๐]) \; \hat{s}[p])
}{step-app-coe}
$$
where $\IN ฮ โข ๐ฌ๐ฉ๐ฅ๐ข๐ญ_ฮ \; \IN{x} \; \IN{C} โฆ (\OUT A, \OUT B)$ is:
$$ \Rule{}{ฮ โข ๐ฌ๐ฉ๐ฅ๐ข๐ญ_ฮ \; x \; ((y : A) โ B) โฆ (A, B[x/y])}{split-ฮ -con} $$
$$
\Rule{
ฮ โข ๐ญ๐ฒ \; e โฆ ๐ฐ_๐ \\
๐ฅ๐๐ญ \; A โ ๐๐๐ฐ๐ฎ๐๐ฒ_{๐ฐ_๐} \; e \; [ฮ \; x \; \_ โช x \Bar \_ โช ๐ฏ๐ผ๐ผ๐น] \\
๐ฅ๐๐ญ \; B โ ๐๐๐ฐ๐ฎ๐๐ฒ_{๐ฐ_๐} \; e \; [ฮ \; \_ \; y โช y \Bar \_ โช ๐ฏ๐ผ๐ผ๐น]
}{
ฮ โข ๐ฌ๐ฉ๐ฅ๐ข๐ญ_ฮ \; x \; \E e โฆ (A, B \; x)
}{split-ฮ -neut}
$$
$A$ lives in $ฮ$ and $B$ lives in $(ฮ, x:A)$.
### pair projections
$$
\Rule{ฮ โข e โ e'}{
ฮ โข ๐ณ๐๐ \; e โ ๐ณ๐๐ \; e' \qquad
ฮ โข ๐๐ป๐ฑ \; e โ ๐๐ป๐ฑ \; e'
}{step-\{fst,snd\}-head}
$$
$$
\Rule{}{
ฮ โข ๐ณ๐๐ ((s, t) : (x : A) ร B) โ (s : A) \\
ฮ โข ๐๐ป๐ฑ ((s, t) : (x : A) ร B) โ (t : B[s/x])
}{step-\{fst,snd\}-ฮฒ}
$$
$$
\Rule{
ฮ โข ๐ฌ๐ฉ๐ฅ๐ข๐ญ_ฮฃ \; x\ ; C โฆ (A, B)
}{
ฮ โข ๐ณ๐๐ ([๐. C] โ^p_q s) โ [๐. A] โ^p_q ๐ณ๐๐ \; (s : A[p/๐])
}{step-fst-coe}
$$
$\IN ฮ โข ๐ฌ๐ฉ๐ฅ๐ข๐ญ_ฮฃ \; \IN{x} \; \IN{C} โฆ (\OUT A, \OUT B)$ is:
$$
\Rule{}{
ฮ โข ๐ฌ๐ฉ๐ฅ๐ข๐ญ_ฮฃ \; x \; ((y : A) ร B) โฆ (A, B[x/y])
}{split-ฮฃ-con}
\qquad
\Rule{
ฮ โข ๐ญ๐ฒ \; e โฆ ๐ฐ_๐ \\
๐ฅ๐๐ญ \; A โ ๐๐๐ฐ๐ฎ๐๐ฒ_{๐ฐ_๐} \; e \; [ฮฃ \; x \; y โช x \Bar \_ โช ๐ฏ๐ผ๐ผ๐น] \\
๐ฅ๐๐ญ \; B โ ๐๐๐ฐ๐ฎ๐๐ฒ_{๐ฐ_๐} \; e \; [ฮฃ \; x \; y โช y \Bar \_ โช ๐ฏ๐ผ๐ผ๐น]
}{
ฮ โข ๐ฌ๐ฉ๐ฅ๐ข๐ญ_ฮฃ \; x \; \E e โฆ (A, B \; x)
}{split-ฮฃ-neut}
$$
$A$ lives in $ฮ$ and $B$ lives in $(ฮ, x:A)$.
### dimension application
$$ \Rule{ฮ โข e โ e'}{ฮ โข e \; p โ e' \; p}{step-dapp-head} $$
$$
\Rule{}{
ฮ โข ((ฮป๐. t) : ๐๐พ_{๐. A} \; sโ \; sโ) \; ฮต โ (s_ฮต : A[ฮต/๐])
}{step-dapp-ฮฒ-end}
$$
$$
\Rule{}{
ฮ โข ((ฮป๐. t) : ๐๐พ_{๐. A} \; sโ \; sโ) \; ๐ โ (t[๐/๐] : A[๐/๐])
}{step-dapp-ฮฒ-var}
$$
$$
\Rule{
ฮ โข ๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐พ} \; ๐ \; C โฆ (Aโ, Aโ, A, sโ, sโ)
}{
ฮ โข ([๐. C] โ^p_{p'} t) \; q โ
[๐. A[q/๐]] โ^p_{p'} (t : (๐๐พ_{๐.A} \; sโ \; sโ)[p/๐]) \;
[q \; ๐๐ถ๐๐ต \; 0 โช ๐. sโ \Bar 1 โช ๐. sโ]
}{step-dapp-coe}
$$
this heterogeneous composition is defined in @xtt in terms of composition and
coercion.
$\IN ฮ โข ๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐พ} \; \IN ๐ \; \IN C โฆ
(\OUT{Aโ}, \OUT{Aโ}, \OUT A, \OUT{sโ}, \OUT{sโ})$
is:
$$
\Rule{}{
ฮ โข ๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐พ} \; ๐ \; (๐๐พ_{j. A} \; sโ \; sโ) โฆ
(A[0/๐], A[1/๐], A[๐/๐], sโ, sโ)
}{split-Eq-con}
$$
$$
\Rule{
ฮ โข ๐ญ๐ฒ \; e โฆ ๐ฐ_๐ \\
๐ฅ๐๐ญ \; Aโ โ ๐๐๐ฐ๐ฎ๐๐ฒ_{๐ฐ_๐} \; e \;
[๐๐พ \; aโ \; aโ \; a \; xโ \; xโ โช aโ \Bar \_ โช ๐ฏ๐ผ๐ผ๐น] \\
๐ฅ๐๐ญ \; Aโ โ ๐๐๐ฐ๐ฎ๐๐ฒ_{๐ฐ_๐} \; e \;
[๐๐พ \; aโ \; aโ \; a \; xโ \; xโ โช aโ \Bar \_ โช ๐ฏ๐ผ๐ผ๐น] \\
๐ฅ๐๐ญ \; A โ ๐๐๐ฐ๐ฎ๐๐ฒ_{๐ฐ_๐} \; e \;
[๐๐พ \; aโ \; aโ \; a \; xโ \; xโ โช a \Bar \_ โช ๐ฏ๐ผ๐ผ๐น] \\
๐ฅ๐๐ญ \; sโ โ ๐๐๐ฐ๐ฎ๐๐ฒ_{๐ฐ_๐} \; e \;
[๐๐พ \; aโ \; aโ \; a \; xโ \; xโ โช xโ \Bar \_ โช ๐ฏ๐ผ๐ผ๐น] \\
๐ฅ๐๐ญ \; sโ โ ๐๐๐ฐ๐ฎ๐๐ฒ_{๐ฐ_๐} \; e \;
[๐๐พ \; aโ \; aโ \; a \; xโ \; xโ โช xโ \Bar \_ โช ๐ฏ๐ผ๐ผ๐น]
}{
ฮ โข ๐ฌ๐ฉ๐ฅ๐ข๐ญ_{๐๐พ} \; ๐ \; \E e โฆ (Aโ, Aโ, A \; ๐, sโ, sโ)
}{split-Eq-neut}
$$
if $C$ lives in some cube $ฮจ$, then $A$ lives in $(ฮจ, i)$, and the others
live in $ฮจ$.
### conditional
$$
\Rule{ฮ โข e โ e'}{
ฮ โข ๐ถ๐ณ_{x. A} \; e \; ๐๐ต๐ฒ๐ป \; sโ \; ๐ฒ๐น๐๐ฒ \; sโ โ
๐ถ๐ณ_{x. A} \; e' \; ๐๐ต๐ฒ๐ป \; sโ \; ๐ฒ๐น๐๐ฒ \; sโ}{step-if-head}
$$
$$
\Rule{}{
ฮ โข ๐ถ๐ณ_{x. A} \; ๐๐ฟ๐๐ฒ:๐ฏ๐ผ๐ผ๐น \; ๐๐ต๐ฒ๐ป \; sโ \; ๐ฒ๐น๐๐ฒ \; sโ โ
(sโ : A[(๐๐ฟ๐๐ฒ:๐ฏ๐ผ๐ผ๐น)/x]) \\
ฮ โข ๐ถ๐ณ_{x. A} \; ๐ณ๐ฎ๐น๐๐ฒ:๐ฏ๐ผ๐ผ๐น \; ๐๐ต๐ฒ๐ป \; sโ \; ๐ฒ๐น๐๐ฒ \; sโ โ
(sโ : A[(๐ณ๐ฎ๐น๐๐ฒ:๐ฏ๐ผ๐ผ๐น)/x])
}{step-if-true; step-if-false}
$$
$$
\Rule{}{
ฮ โข ๐ถ๐ณ_{x.A} \; [๐.C] โ^p_q t \; ๐๐ต๐ฒ๐ป \; sโ \; ๐ฒ๐น๐๐ฒ \; sโ โ
๐ถ๐ณ_{x.A} \; t : ๐ฏ๐ผ๐ผ๐น \; ๐๐ต๐ฒ๐ป \; sโ \; ๐ฒ๐น๐๐ฒ \; sโ
}{step-if-coe}
$$
if the expression is well-typed, as we are assuming, then $C$ can only be
something that reduces to $๐ฏ๐ผ๐ผ๐น$.
### coercion
$$
\Rule{ฮ โข e โ e'}{ฮ โข [๐. \E e] โ^p_q s โ [๐. \E{e'}] โ^p_q s}{step-coe-ty}
\qquad
\Rule{๐ โ ๐๐๐ฏ \; C}{ฮ โข [๐. C] โ^p_q s โ s : C}{step-coe-non}
$$
### composition
$$
\Rule{}{ฮ โข C โ^p_p s \; [q \; ๐๐ถ๐๐ต โฏ] โ s : C}{step-comp-id}
$$
$$
\Rule{}{
ฮ โข A โ^p_{p'} s \; [ฮต \; ๐๐ถ๐๐ต \; 0 โช ๐.sโ \Bar 1 โช ๐.sโ] โ
s_ฮต[p'/๐] : A
}{step-comp-end}
$$
### type case
$$
\Rule{ฮ โข e โ e'}{
ฮ โข ๐๐๐ฐ๐ฎ๐๐ฒ_C \; e \; [โฏ] โ ๐๐๐ฐ๐ฎ๐๐ฒ_C \; e' \; [โฏ]
}{step-tycase-head}
$$
$$
\Rule{}{
ฮ โข ๐๐๐ฐ๐ฎ๐๐ฒ_C \; ๐ฏ๐ผ๐ผ๐น:๐ฐ_๐ \; [๐ฏ๐ผ๐ผ๐น โช s \Bar โฏ] โ s : C \\
\begin{split}
ฮ โข ๐๐๐ฐ๐ฎ๐๐ฒ_C \; ((x : A) โ B) : ๐ฐ_๐ \; [ฮ \; x \; y โช s \Bar โฏ] \\
{} โ s[(A:๐ฐ_๐)/x, ((ฮปx. B) : ๐ฐ_๐ โ ๐ฐ_๐)/y] : C
\end{split} \\
\text{etc}
}{step-tycase-bool; etc}
$$
### annotation
$$
\Rule{}{ฮ โข \E e : A โ e}{step-ann-nest}
\qquad
\Rule{ฮ โข e โ e'}{ฮ โข s : \E e โ s : \E{e'}}{step-ann-ty}
$$
:::rulebox
$$ \IN ฮ โข ๐ญ๐ฒ \; \IN e โฆ \OUT A $$
:::
## compute elim type {#compute-ty}
assumes $ฮจ \Bar ฮ โข e โ A$ for some $ฮจ$, and just recovers the $A$ without
doing any other checking.
:::aside
yeah. im trying to remove it
- __why not just pass the type in?__ \
that gets you e.g. the type of $f \; s$, but that isn't enough information to
know the type of $f$
:::
$$ \Rule{(x : A) โ ฮ}{ฮ โข ๐ญ๐ฒ \; x โฆ A}{rety-var} $$
$$
\Rule{
ฮ โข ๐ญ๐ฒ \; f โฆ (x : A) โ B
}{
ฮ โข ๐ญ๐ฒ (f \; s) โฆ B[(s:A)/x]
}{rety-app}
\qquad
\Rule{
ฮ โข ๐ญ๐ฒ \; e โฆ (x : A) ร B
}{
ฮ โข ๐ญ๐ฒ (๐ณ๐๐ \; e) โฆ A \\
ฮ โข ๐ญ๐ฒ (๐๐ป๐ฑ \; e) โฆ B[(๐ณ๐๐ \; e)/x]
}{rety-\{fst,snd\}}
$$
$$
\Rule{
ฮ โข ๐ญ๐ฒ \; f โฆ ๐๐พ_{๐.A} \; s \; t
}{
ฮ โข ๐ญ๐ฒ (f \; p) โฆ A[p/๐]
}{rety-dapp}
\qquad
\Rule{}{
ฮ โข ๐ญ๐ฒ (๐ถ๐ณ_{x.A} \; e \; ๐๐ต๐ฒ๐ป \; s \; ๐ฒ๐น๐๐ฒ \; t) โฆ A[e/x]
}{rety-if}
$$
$$
\Rule{}{
ฮ โข ๐ญ๐ฒ ([๐.C] โ^p_q s) โฆ C[q/๐]
}{rety-coe}
\qquad
\Rule{}{
ฮ โข ๐ญ๐ฒ (A โ^p_{p'} s \; [q \; ๐๐ถ๐๐ต โฏ]) โฆ A
}{rety-comp}
$$
$$
\Rule{}{
ฮ โข ๐ญ๐ฒ (๐๐๐ฐ๐ฎ๐๐ฒ_A \; e \; [โฏ]) โฆ A
}{rety-tycase}
$$
# references {#refs}