Please forgive any unorthodox notation or obvious errors here... I'm trying to get an intuition for dependently typed languages, so I'm starting out by seeing which analogies I can take from the simply typed world. In an ML-like language we can encode existential types in terms of universal types:
$\exists a.T(a) \equiv \forall x.(\forall a.T(a) \rightarrow x) \rightarrow x$
Similarly, we could also define sum types in terms of universal types and product types:
$ a + b \equiv \forall x.(a \rightarrow x)\times(b \rightarrow x) \rightarrow x $
This correspondence makes sense to me, since existential types are like infinite sums and universal types are like infinite products.
In a dependently typed language, would it also be possible to define dependent sums in terms of dependent products? This seems close:
$\Sigma(b:B).T(b) \equiv \forall x.(\Pi(b:B).T(b) \rightarrow x) \rightarrow x$
$(a,t) : \Sigma(b:B).T(b) \equiv \lambda f. f\ a\ t$
$\text{fst}\ p \equiv p_B\ (\lambda(b:B).\lambda(\_:T(b)).b)$
$\text{snd}\ p \equiv p_{T (\text{fst}\ p)}\ (\lambda(b:B).\lambda(t:T(b)).t)$
However, I can't convince myself that the definition for snd
is well-typed because I can't show that $t : T (\text{fst}\ p)$. Is there some way to make this work?