Die Frage ist, wie Sie Begriffe entfernen, die für immer laufen:
Insbesondere dürfen Dinge wie und der Y-Kombinator NICHT in Ihrer Sprache sein, da sie zum Berechnungen verwendet werden können, die nicht anhalten.( λ x . X x ) ( λ x . X x )
Durch statische Typisierung in Dingen wie System F werden diese eliminiert: Sie beginnen mit einem vollständigen Lambda-Kalkül und filtern dann schlecht typisierte Begriffe heraus.
Wenn Sie dies jedoch in einer untypisierten Umgebung tun, müssen Sie diese Begriffe konstruktionsbedingt entfernen . Sie können in Ihrer Sprache nicht ausgedrückt werden.
Ich kann mir einige dumme Wege vorstellen, wie die Sprache von imperativen Programmen ohne Funktionen oder nur mit Schleifen über Listen. Im Allgemeinen sind diese problematischen Konstrukte jedoch konstruierbar, sobald Sie Funktionen höherer Ordnung haben. Obwohl ich nicht sagen werde, dass es unmöglich ist, ist es wahrscheinlich sehr schwierig, dies auf eine Weise zu tun, die viel Sinn macht.
Es ist für Sie möglich, diese Dinge statisch mit etwas herauszufiltern, das kein Typsystem ist, mit Terminierungsprüfern, aber diese werfen immer falsch positive Ergebnisse aus, und obwohl sie keine statische Typisierung sind, sind sie dennoch ein statischer Filter Ihre Programme.
Beachten Sie, dass Sie abhängig davon, was Sie als "dynamisch typisiert" betrachten, solche Programme eliminieren können, indem Sie die Typen mithilfe von Inferenz verfolgen, aber nur zur Laufzeit Fehler auslösen. So etwas wie der Y-Kombinator wird erst später abgelehnt. Dies wird dynamisch eingegeben, aber wahrscheinlich nicht das, wonach Sie suchen.