Есть несколько разных вещей, которые вы могли бы иметь в виду под «доказать, что мой проверщик типов работает». Что, я полагаю, является частью того, что задает ваш вопрос;)
Половина этого вопроса доказывает, что ваша теория типов достаточно хороша, чтобы доказать любые свойства языка. Ответ Андрея очень хорошо справляется с этой задачей. Другая половина вопроса - предположим, что язык и его система типов уже исправлены - как вы можете доказать, что ваша конкретная программа проверки типов действительно правильно реализует систему типов? Есть две основные перспективы, которые я вижу здесь.
Один из них: как мы можем верить, что какая-то конкретная реализация соответствует его спецификации? В зависимости от степени заверений, которые вы хотите, вы можете быть довольны большим набором тестов, или вам может потребоваться какая-то формальная проверка или, скорее, сочетание обоих . Плюсом этой перспективы является то, что она действительно подчеркивает важность установления границ для заявлений, которые вы делаете: что именно означает «исправить»? какая часть кода проверяется, а какая часть является предполагаемой правильной TCB? Недостатком является то, что слишком серьезное размышление об этом ведет к философским кроличьим норам - ну, к сожалению, если вам не нравятся эти кроличьи норы.
Вторая перспектива - это более математический взгляд на правильность. При работе с языками в математике мы часто устанавливаем «модели» для наших «теорий» (или наоборот) и затем пытаемся доказать: (а) все, что мы можем сделать в теории, которую мы можем сделать в модели, и (б) все, что мы можем сделать в модели, мы можем сделать в теории. (Это Корректность и полнотатеоремы. Какой из них зависит от того, «исходили ли вы» из синтаксической теории или из семантической модели.) При таком мышлении мы можем думать о вашей реализации проверки типов как о конкретной модели для рассматриваемой теории типов. Таким образом, вы хотите доказать это двустороннее соответствие между тем, что может сделать ваша реализация, и тем, что, согласно теории, вы должны делать. Преимуществом этой перспективы является то, что она действительно фокусируется на том, охватили ли вы все ключевые случаи, завершена ли ваша реализация в смысле того, чтобы не исключать какие-либо программы, которые она должна принимать как безопасные с точки зрения типов, и является ли ваша реализация надежной в смысл не пускать в какие-либо программы его следует отвергать как плохо напечатанные. Недостатком является то, что ваше доказательство соответствия, вероятно, будет достаточно отделено от самой реализации,