I found it much more approachable than the HoTT book.
https://math.uchicago.edu/~may/REU2015/REUPapers/Macor.pdfThere is a 2001 paper aptly titled, Induction is not derivable in second order type theory.
Where Coq and theorem provers derived from it generally use the calculus of inductive constructions,
Cedille is different in that it adds the minimal types necessary to the calculus of constructions needed to derive induction.
I.e. in lean when you define a datatype like nat, inductive recursor is generated e.g. nat.rec_on, is generated from the structure of the inductive type.
with cedille, you have to derive it using built in types.
they built 2 variations of the type system, one using dependent intersection types, and a form of equality.
and an earlier version using a recursive type, Victor Maia recently posted an article about his preference for that due to it's simplicity,
and this week posted this (40 line!) javascript theorem prover:
As you mentioned about explicit proofs, one of the interesting things about these languages is well, there aren't any tactics at all,
so it really is lambdas all the way down.
With the caveat that this is just a prototype which hasn't been proven sound,
but he makes a really interesting conjecture that by requiring terms normalized to weak head normal form,
to which the known inconsistent terms should not normalize.
And if that doesn't work out it there is always implementing it on top of the calculus of constructions.
I believe that would be same type system as the original type which was shown consistent by erasure to System-F
Anyhow, I managed play a bit with the latter, and prove I guess a cast, from a natural to predecessor,
then show that (pred (succ n)) = n (using the Eq.cong and Nat from main.escoc)
(Note that this is using a Scott encoded nat, so it's a bit different than one most are familiar with).
It really is a neat time in type theory to see so many new and fascinating ideas emerging.
```
Nat.pred
: {a : (Nat a)} (Nat (Nat.pred a))
= [a]
(a [a] (Nat (Nat.pred a))
[prev : (Nat prev)] prev
Nat.zero)
eq_n_pred_succ_n
: {n : (Nat n)}
(Eq Nat (Nat.pred (Nat.succ n)) n (eq_n_pred_succ_n n))
= [n]
(n [self](Eq Nat (Nat.pred (Nat.succ self)) self (eq_n_pred_succ_n self))
[pred : (Nat pred)] ((Eq.cong Nat Nat (Nat.pred (Nat.succ pred)) pred (eq_n_pred_succ_n pred)) Nat.succ)
(Eq.refl Nat Nat.zero))
main = (eq_n_pred_succ_n Nat.0)
```