α変換(alpha.ml)

 

さて、K正規化が済んだら最適化を行うのですが、その前に「異なる変数には異なる名前をつける」α変換を行います。違う変数に同じ名前がついていると、いろいろと処理が面倒になるためです。たとえばlet x = 123 in let x = 456 in x + xという式だったら、let x1 = 123 in let x2 = 456 in x2 + x2と直してしまいます。

 

これを実装した本体がAlpha.gです。変換前の変数名から変換後の変数名への写像envと、変換前の式eとを受け取り、変換後の式を返します。たとえばlet x = e1 in e2という式があったら、まずe1を変換してから、新しい変数x'を作り、xからx'への対応をenvに追加して、e2を変換するという具合です。let recLetTupleの場合も、一見するとややこしそうですが、やっていることは一緒です。

 

なお、外部変数の名前はenvに登録されないので、α変換の対象になりません(関数Alpha.find参照)。これは意図された動作です。もし外部変数の名前が変わってしまったら正しくリンクできなくなるからです。

 

次へ進む