Ich lese gerade einen Kommentar zu Milners "Der Einsatz von Maschinen zur Unterstützung strenger Beweise" von Mike Gordon durch. In diesem Artikel erklärt er, wie LCF aus den Ideen der Denotationssemantik von Dana Scott und Strachey geboren wurde.
Es scheint mir, dass die Floyd-Hoare-Logik nicht ausreichte, um LCF zu entwickeln, aber ich bin mir nicht sicher, warum dies der Fall ist. Am Ende beschäftigen wir uns in der Hoare-Logik mit Programmzuständen, die einige Voraussetzungen erfüllen und das durch eine Beziehung einer gewissen Nachbedingung entsprechen und ich kann eine Formel dafür bereitstellen. Wikipedia behauptet, dass die Bezeichnungssemantik:
ist ein Ansatz zur Formalisierung der Bedeutungen von Programmiersprachen durch Konstruktion mathematischer Objekte (Bezeichnungen genannt), die die Bedeutungen von Ausdrücken aus den Sprachen beschreiben.
Ich kenne einige Intuitionen darüber, wie beispielsweise Rekursion in diesem Ansatz als fester Punkt einer Beziehung modelliert wird, während ich mich in der Hoare-Logik nicht wirklich daran erinnerte, mich mit Rekursion befasst zu haben. Dennoch scheinen beide Ansätze zu versuchen, Beziehungen zwischen Ein- und Ausgängen unter Verwendung mathematischer Beziehungen zu beschreiben.
Frage
Was hat also den Unterschied zwischen Hoare-Logik und Denotationssemantik ausgemacht? Verwaltet die Denotationssemantik einige Komplexitäten von Programmen besser? Wenn ja, veranschaulichen Sie dies bitte anhand eines Beispiels.
Vielleicht ist das folgende Zitat von Milner, das sich auf die Denotationssemantik bezieht, interessant, um Ihre Antwort zu leiten:
Ich könnte die Syntax einer Programmiersprache in dieser Logik aufschreiben und die Semantik in die Logik schreiben.
Antworten:
Ich weiß nicht, warum die Leute früher keine Hoare-Logik für Lambda-Kalküle entwickelt haben. Die erste Arbeit, um dies richtig zu machen, war die von Honda et al
Eine Kompositionsprogrammlogik für polymorphe Funktionen höherer Ordnung
Zuvor gab es einige frühere Versuche, aber sie haben das Problem nicht ganz gelöst, zum Beispiel: Wie bezeichnen Sie den Wert eines Funktionsprogramms? Welche Syntax entspricht dem Funktionsraumkonstruktor? Es gibt ein paar kleine Dinge, die richtig gemacht werden müssen.
Lassen Sie mich spekulieren: Vielleicht war das Hauptproblem, dass sich die Hoare-Logik normalerweise mit der Zustandsberechnung befasste. Wenn Sie Statusfunktionen und Funktionen höherer Ordnung kombinieren, müssen Sie sich sofort mit Aliasing befassen, z. B. mit Programmen wie
Diese Arbeit wurde von A. Charguéraud in Coq in seiner Arbeit implementiert und wird jetzt auch in der Javascript-Semantik verwendet.
quelle