My latest project has been to play with a method of proof reuse suitable for pluralist formalisations in Plastic.
Let's say a theorem α is provable in a classical LTT. Then we know that its double-negation translation α∼∼ is provable in a constructive LTT. Can we take a proof script alpha.lf that proves α, and use it as if it were a proof script that proves α∼∼?
I don't want to write a script that translates alpha.lf into a new script. I don't want to prove a lemma that I'm going to end up applying 100 times. I want to be able to say import alpha.lf while working in a constructive LTT, and get a proof of α∼∼ put into the context.
It's possible, and it's all described in the paper A Pluralist Approach to the Formalisation of Mathematics, co-authored with Zhaohui Luo. A preprint is available here.
Plastic can be downloaded here.
In the paper above, we describe a keyword Topkind. The command Topkind PropI PrfI, for example, introduces the kind PropI and, for every object P : PropI, the kind PrfI P. We are in the process of implementing this command in Plastic.
In the meantime, the proof scripts below use the following hack. Where we want to put Topkind PropI PrfI, we instead write:
[PropI : Type];
[PrfI : PropI -> Type];
classical.lf - a classical LTTconstruct.lf - a constructive LTTconstruct2.lf - a second copy of the constructive LTTsecondorder.lf - a second-order constructive LTTconstruct2classical.lf - simple inclusion of construct.lf in classical.lfdoubleneg.lf - the double negation translation from classical.lf to construct.lfAtrans.lf - the A-translation from construct.lf to construct2.lfRussellPrawitz.lf - the Russell-Prawitz modality from construct.lf to secondorder.lfexample1.lf - an example of construct2classical.lf in actionexample2.lf - an application of doubleneg.lfexample3.lf - an application of Atrans.lf