"Berühmte Logiker haben hier peinliche Fehler gemacht", schreibt SICP. Worauf bezieht sich das?


13

Hier ist der Kontext ( Struktur und Interpretation von Computerprogrammen , Abschnitt 1.1.8, unter der Überschrift "Lokale Namen"):

Ein Formalparameter einer Prozedur spielt eine ganz besondere Rolle in der Prozedurdefinition, da es nicht darauf ankommt, welchen Namen der Formalparameter hat. Ein solcher Name wird als gebundene Variable bezeichnet , und wir sagen, dass die Prozedurdefinition ihre formalen Parameter bindet . Die Bedeutung einer Prozedurdefinition bleibt unverändert, wenn eine gebundene Variable in der Definition einheitlich umbenannt wird.

Am Ende dieser letzten Zeile steht eine Fußnote (26), die besagt:

Das Konzept der konsequenten Umbenennung ist tatsächlich subtil und formal schwer zu definieren. Berühmte Logiker haben hier peinliche Fehler gemacht.

Auf was oder wen bezieht sich der Text? Warum sollte es schwierig sein, "konsistentes Umbenennen" zu definieren? Welche Logiker haben Fehler gemacht, um dies zu definieren, und was waren diese Fehler?


3
Ich sage meinen Schülern, dass der einzige Weg, um "gebundene Variablen konsistent umzubenennen", darin besteht, das verdammte Ding richtig zu implementieren. Viele Logikbücher vermeiden das Problem, geben unvollständige Umbenennungsverfahren an oder lassen zumindest Beweise für die Richtigkeit der angegebenen Umbenennungsverfahren aus. Aber ich weiß nicht, auf welchen bestimmten Klatsch sich das Buch bezieht.
Andrej Bauer

5
Der genaue Umgang mit variablen Umbenennungen, neuen Namen, der Vermeidung von Ersetzungen durch Captures und dergleichen ist eine der trivialsten Aufgaben, die bei Definitionen und Beweisen schnell sehr umständlich wird. Für solch ein triviales Thema möchte man nicht mehr als eine unbedeutende Menge an mentalen Zyklen ausgeben, aber viel mehr, als nötig wäre, um viele knifflige Erfassungen / Kollisionen / etc. zu vermeiden Definitionen, aber rufen Sie dann die "Barendregt-Konvention" auf und ignorieren Sie das Problem.
Chi

1
Ich würde mich über konkretere Antworten unten im Antwortfeld freuen, wenn dies überhaupt möglich ist. Diese Kommentare lassen die Ausgabe immer noch mysteriös klingen, da Sie sie geschrieben haben, damit sie von jemandem gelesen werden können, der mit der
vorliegenden

Vor allem bei @chi würde ich mich über Empfehlungen freuen, die sich mit diesem Thema befassen, falls Sie welche haben. Vielen Dank im Voraus
ubadub

Antworten:


11

Dies ist eine Teilantwort: Ich habe keine Ahnung, auf welche Fehler oder Personen sich SICP bezieht. Ich kann nur einige Hinweise geben, warum es schmerzhaft sein kann, Variablen umzubenennen, wenn man genau damit umgeht.

Zunächst scheint es trivial zu sein, dies zu definieren. Beispielsweise können wir gebundene Variablen in indizierten Summen umbenennen

xe=y(e{y/x})

wobei e ein beliebiger Ausdruck ist und e{y/x} die syntaktische Ersetzung jedes x durch y . Trivial, richtig?

Nun, wenn wir die obige Regel blind anwenden, bekommen wir

x(x+y)=y(y+y)

Das ist nicht gut. Wir müssen die Anforderung " y kommt in e nicht vor " hinzufügen , oder wir erhalten einen Namenskonflikt.

Betrachten Sie nun diese korrekte Umbenennung

xy(x+y)=xz(x+z)

Wenn wir x in y umbenennen wollen, können wir dies nach der obigen Regel auf der rechten Seite tun, aber nicht auf der linken Seite. Das ist unpraktisch, da sich die beiden nur durch eine Umbenennung unterscheiden, so dass sie gleich behandelt werden sollten.

Ein typischer Ansatz besteht darin, e{y/x} als "einfangvermeidende Substitution" neu zu definieren und die Anforderung " y tritt nicht in e " zu lockern und stattdessen " y tritt nicht frei in e " zu verwenden.

Wir definieren dann freie Vorkommen:

free(x)={x}free(e+t)=free(e)free(t)free(xe)=free(e){x}

Schließlich erfassen Substitutionsvermeidung:

  • x{t/y} istt wennx=y undx sonst.
  • (e+e){t/y}=e{t/y}+e{t/y} (einfacher Fall)
  • (xe){t/y}=??

x=yxxe

yx(xe){t/y}=x(e{t/y})xt

zytxe(xe){t/y}=z(e{z/x}{t/y})

Ich hoffe, ich habe es richtig gemacht. (Mein erster Versuch war übrigens falsch)

zz

αλx

Stellen Sie sich vor, Sie müssten sich jedes Mal mit dieser komplizierten Definition befassen, wenn wir etwas in der PL-Theorie beweisen wollen . Wir könnten, aber wir wollen nicht. Es ist langweilig, mühsam, fehleranfällig, macht den Beweis unübersichtlich und gibt dem Leser keinen Einblick. Aus diesem Grund überspringen viele PL-Autoren einfach die Details, indem sie sagen (oder sogar als gegeben voraussetzen!), Dass Begriffe "bis zur Umbenennung von Variablen" zu verstehen sind, dass alle gebundenen Variablen als verschieden von dem angenommen werden, von dem sie verschieden sein müssen. dass wir von der "Barendregt-Konvention" ausgehen, oder so ähnlich.

Um brutal ehrlich zu sein, ist dies ein Betrug in Beweisen. Wir könnten auch hinzufügen "wink wink, nudge nudge, sag nichts mehr!" im selben Geist. Wir bitten im Wesentlichen um Gnade und sagen dem Leser: "Schau, das ist langweilig, ich will es nicht tun, du willst es nicht lesen - wir wissen beide, dass wir diesen Beweis mit großem Aufwand umschreiben könnten alle Einzelheiten angeben ".

Technisch gesehen , es ist möglich , diese Abkürzung zu nutzen , um eine falsche Aussage zu beweisen. Der erfahrene Proof-Reviewer weiß jedoch, was "moralisch in Ordnung" ist und (mit großem Aufwand) perfektioniert werden kann und was verdächtig ist. Letzteres könnte etwas beinhalten, das von der tatsächlichen Wahl der gebundenen Namen abhängt (also arbeiten wir nicht wirklich "bis zu", wie versprochen!). In diesen Fällen bittet die Überprüfung um weitere Details, damit er überzeugt werden kann.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.