これは部分的な答えです。SICPが参照しているエラーや人についてはわかりません。「なぜ」変数の名前変更が正確に処理するのが苦痛なのかについて、いくつかのヒントしか提供できません。
まず第一に、定義するのは簡単に思えます。たとえば、インデックス付き合計のバインド変数の名前を変更できます
∑バツe = ∑y(e { y/ x})
ここで、eは任意の式であり、e { y/ x}は各バツをyで構文的に置き換えることを示します。簡単ですね
さて、盲目的に上記のルールを適用すると、
∑バツ(x +y)= ∑y(y+ y)
それは良いことではありません。「yがe出現しない」という要件を追加する必要があります。そうしないと、名前の衝突が発生します。
さて、この正しい名前の変更を検討してください
∑バツ∑y(x + y)= ∑バツ∑z(x + z)
私たちは、名前を変更したい場合はバツへy、上記のルールにより、右側ではできますが、左側ではできません。この2つは名前の変更のみが異なるため、不便です。したがって、同じ方法で処理する必要があります。
ここで典型的なアプローチは、再定義に頼ることであるe { y/ x }「捕獲回避置換」として、及び要件を緩和「y発生しませんe」「代わりに使用y発生しないフリーでe」。
次に、フリーオカレンスを定義します。
fr e e (x)= { x }fr e e (e + t )= fR E E(e )∪ Fr e e (t)fRの電子 e (∑バツe)= fr e e (e )∖ { x }
最後に、置換を回避してキャプチャします。
- x { t / y}であるt場合にx = y、およびバツそうでありません。
- (e + e′){ t / y} = e { t / y} + e′{ t / y}(簡単な場合)
- (Σバツe ){ t / y} = ??
最後のケースは苦痛です。x = y場合、自由変数のみに影響を与え、バツがバインドされているため、置換は何も行われません。結果は∑バツe。
y≠ x場合、(Σバツe ){ t / y} = ∑バツ( e { t / y})と言います。ただし、これは一般に間違っていますバツがtフリーになると、キャプチャが取得されるためです。
zyt∑バツe(Σバツe ){ t / y} = ∑z(e { z/ x}{t / y})
私はそれが正しかったと思います。(ちなみに、私の最初の試みは間違っていました)
zzは正常に機能し、同じ結果になります(再び、名前の変更まで)。
αλ X、多くのPLにラムダ計算では、関数の定義など)。
さて、PL理論で何かを証明するたびに、この複雑な定義に対処しなければならないことを想像してください。できましたが、したくありません。退屈で退屈でエラーが発生しやすく、証拠が乱雑であり、読者に洞察を与えません。このため、多くのPL作成者は、用語は「変数名の変更」までと見なされ、バインドされたすべての変数は区別する必要があるものとは異なるものと見なされると言う(または当然のこととして!) 「Barendregtの慣習」、または同じ効果を持つ何かを想定していること。
ひどく正直に言うと、これは証拠にだまされています。「ウインクウインク、ナッジナッジ、ノーマイン!」を追加することもできます。同じ精神で。私たちは本質的に慈悲を求め、読者に言います:「見て、これは退屈だ、私はそれをしたくない、あなたはそれを読みたくない-私たちは両方とも、多大な努力で、この証明をすべての詳細を含める」。
技術的には、このショートカットを悪用して虚偽の陳述を証明することができます。しかし、経験豊富な証明レビューアは、「道徳的に素晴らしい」ものを知っており、(多大な努力を払って)完璧に仕上げることができ、何が疑わしいのか。後者には、バインドされた名前の実際の選択に依存するものが含まれる可能性があります(つまり、約束どおりに「最大」で動作していません!)。そのような場合、レビューはより詳細な情報を要求するため、納得することができます。