Ich habe kürzlich versucht, Aarons Cedille-Core zu implementieren , eine minimalistische Programmiersprache, die mathematische Theoreme zu ihren eigenen Begriffen beweisen kann. Ich habe auch eine Induktion für λ-codierte Datentypen darauf nachgewiesen, was klarer machte, warum seine Erweiterungen notwendig wären.
Trotzdem frage ich mich immer noch, woher diese Erweiterungen stammen. Warum sind sie was sie sind? Was rechtfertigt sie? Ich weiß zum Beispiel, dass einige Erweiterungen wie die Rekursion die Sprache als Beweissystem ruinieren. Wenn ich mich entschließen würde, CoC auch mit anderen Primitiven zu erweitern, wie würde ich das rechtfertigen? Ich verstehe, dass ein Beweis der Normalisierung notwendig ist, aber das beweist nicht, dass diese Primitive "Sinn machen".
Kurz gesagt, was genau qualifiziert eine Sprache (und ihr Typensystem) als ein System, das Theoreme über ihre eigenen Begriffe beweisen kann?
Antworten:
[Selbstwerbung folgt, aber ich denke, dass dies relevant ist.]
Natürlich können Sie auch Äquivalenzen annehmen, und es gibt verschiedene Arten von Quantifizierern (typisiert / untypisiert, universell / existentiell). Dieser Mechanismus kann verwendet werden, um über ein Programm nachzudenken (es muss nicht bewiesen werden, dass es beendet oder sogar getippt wurde). Die einzige Einschränkung besteht darin, dass Programme, die als Beweise verwendet werden, vom System als terminierend nachgewiesen werden müssen (willkürliche allgemeine Rekursion führt zu Inkonsistenz).
Hier sind ein paar Referenzen, wenn Sie dies überprüfen möchten:
quelle