Let式

コンピュータサイエンスでは、「let」式は関数定義を制限されたスコープに関連付けます

「let」式は数学でも定義され、ブール条件を制限された範囲に関連付けます。

"let" 式は、値に適用されたラムダ抽象化と見なすことができます。数学においては、let 式は、変数のスコープを制限する存在量指定子内の式の連言と見なすこともできます。

多くの関数型言語では、let式を用いて式のローカル定義を行い、別の式の定義に利用することができます。let式は、一部の関数型言語ではletまたは「let rec」という2つの形式で存在します。let recは、固定小数点コンビネータを用いて再帰を実装する、単純なlet式の拡張版です

歴史

ダナ・スコットLCF言語[1]は、ラムダ計算が現代の関数型言語へと進化する過程の一段階でした。この言語はlet式を導入し、これはそれ以降のほとんどの関数型言語に見られるようになりました。

Scheme [ 2]、 ML、そして最近ではHaskell [3]などの言語は、LCFからlet式を継承しています。

ALGOLPascalなどの状態を持つ命令型言語は、基本的にlet式を実装して、ブロック構造で関数のスコープを制限します。[引用が必要]

密接に関連する「where」節とその再帰的な変種である「where rec 」は、ピーター・ランディン「式の機械的評価」にすでに登場している[4]

説明

「let」式は、別の式で使用する関数または値を定義します。多くの関数型プログラミング言語で使用される構造であるだけでなく、数学のテキストでもよく使用される自然言語構造でもあります。これは、where句の代替構文構造です。

Let式where句

させて

そして

どこ

そして

どちらの場合も、全体の構造は値が 5 である式です。if -then-elseと同様に、式によって返される型は必ずしもブール値ではありません。

let式には主に4つの形式があります。

形状そして再帰的定義 / 制約説明
単純いいえいいえ意味単純な非再帰関数の定義。
再帰的いいえはい意味再帰関数の定義(Y コンビネータを使用して実装)。
共通のはいはい意味相互再帰関数の定義。
数学はいはい制約一般的なブール let 条件をサポートする数学的な定義。

関数型言語では、let式は式の中で呼び出すことができる関数を定義します。関数名のスコープはlet式の構造に限定されます。

数学において、let式は式に対する制約条件を定義します。この構文は、let式に局所的な存在量化変数の宣言をサポートする場合もあります。

用語、構文、意味論は言語によって異なります。Schemeでは単純形式ではlet 、再帰形式ではlet recが使用されます。MLでは、 letは宣言ブロックの開始のみを示し、funは関数定義の開始を示します。Haskellでは、letは相互再帰になる可能性があり、コンパイラが必要な処理を判断します。

意味

ラムダ抽象は、名前のない関数を表します。これがラムダ抽象の定義における矛盾の原因です。しかし、ラムダ抽象は名前付きの関数を表すように構成することもできます。この形式では矛盾は解消されます。ラムダ項は、

は、式関数 を定義することと同等でありlet式として記述することもできます。

let 式は自然言語式として理解可能です。let 式は変数を値に置き換えることを表します。置換規則は、等号が置換としてどのような意味を持つかを記述します。

数学における定義

数学において、letは式の連言として記述されます。関数型言語では、let式はスコープを制限するためにも用いられます。数学では、スコープは量指定子によって記述されます。let式は存在量指定子内の連言です。

ここで、EFはブール型です。

let式は置換を別の式に適用することを可能にします。この置換は、限定されたスコープ内、つまり部分式に適用できます。let 式の自然な使い方は、限定されたスコープ(ラムダドロップと呼ばれる)への適用です。以下の規則は、スコープの制限方法を定義します。

ここで、Fはブール型ではありません。この定義から、関数型言語で使用されるlet式の標準的な定義を次のように導くことができます。

簡潔にするために、存在変数を指定するマーカーは、文脈から明らかな場合は式から省略されます。

導出

この結果を導くために、まず、

それから

置換のルールを用いると、

したがって、すべてのLについて

ここKは新しい変数です。すると、

それで、

しかし、ベータ減少の数学的解釈から、

ここで、yが変数xの関数である場合、zにおけるxと同じではありません。アルファリネーミングが適用される場合があります。したがって、

それで、

この結果は関数型言語では省略形で表現され、意味は明確です。

ここで、変数x は、x を定義する方程式の一部であると同時に、存在量指定子の変数としても暗黙的に認識されます。

ブールからの持ち上げはなし

Eが で定義されている場合、矛盾が生じます。この場合、

となり、

そして使用して、

Gが偽の場合、これは偽です。この矛盾を避けるため、Fはブール型であってはなりません。ブール型Fの場合、ドロップルールの正しい記述は等式ではなく含意を用いています。

ブール型に他の型とは異なるルールが適用されるのは奇妙に思えるかもしれません。その理由は、

Fがブール値の場合にのみ適用されます。2つの規則を組み合わせると矛盾が生じ、一方の規則が成立する場合、もう一方の規則は成立しません。

let式の結合

Let式は複数の変数で定義できます。

すると、

それで、

ラムダ計算とlet式に関する法則

イータ還元は、ラムダ抽象化を記述するための規則を与えます。この規則は、上で導出された2つの法則と併せて、ラムダ計算とlet式の関係を定義します。

名前
イータ還元等価性
Let-lambda同値性(ここでは変数名です。)
組み合わせてみましょう

ラムダ計算から定義されたlet定義

数学的定義に伴う潜在的な問題を回避するため、ダナ・スコットはラムダ計算からlet式を独自に定義しました。これは、トップダウン型、つまり公理的な数学的定義とは対照的に、ボトムアップ型、つまり構成的定義であると考えられます。

単純で非再帰的なlet式は、項に適用されるラムダ抽象化の糖衣構文として定義されました。その定義では、

その後、単純なlet式の定義が拡張され、固定小数点コンビネータを使用した再帰が可能になりました

固定小数点コンビネータ

固定小数点コンビネータは次の式で表されます。

この表現はラムダ項に変換できます。ラムダ抽象化では、適用された式内で変数名への参照をサポートしていないため、x はxのパラメータとして渡す必要があります

イータ減少則を用いると、

与える、

let式は、次のようにラムダ抽象化として表現できる。

与える、

これはおそらくラムダ計算における不動点コンビネータの最も単純な実装です。しかし、ベータ還元を1つ行うことで、CurryのYコンビネータのより対称的な形が得られます。

再帰let式

「let rec」と呼ばれる再帰let式は、再帰 let 式の Y コンビネータを使用して定義されます。

相互再帰let式

このアプローチは、相互再帰をサポートするために一般化されます。相互再帰的なlet式は、式を並べ替えてand条件を削除することで構成できます。これは、複数の関数定義を単一の関数定義に置き換えることで実現され、変数のリストが式のリストと等しくなります。次に、Yコンビネータの一種であるY*多変数固定小数点コンビネータ[5]を使用して、すべての関数の固定小数点を同時に計算します。その結果、let式の相互再帰的な実装が得られます。

複数の値

let式は集合の要素である値を表すために使われる。

関数適用では、あるlet式を別のlet式に適用すると、

ただし、let 式をそれ自身に適用する場合は、異なるルールが適用されます。

値の組み合わせに関する単純なルールは見当たりません。必要なのは、値が値の集合のメンバーである変数を表す一般的な表現形式です。表現は、変数と集合に基づいて記述する必要があります。

この形式に関数を適用すると、同じ形式の別の式が生成されます。このように、複数の値を持つ関数の式は、1つの値を持つかのように扱うことができます。

形式が値の集合のみを表すだけでは不十分です。それぞれの値には、式がいつその値を取るかを決定する条件が必要です。結果として得られる構成は、条件と値のペアの集合であり、「値集合」と呼ばれます。代数的値集合の狭まりを参照してください。

ラムダ計算とlet式間の変換規則

lambda式let式間の変換を記述するメタ関数を示します。メタ関数とは、プログラムをパラメータとして受け取る関数です。プログラムはメタプログラムのデータです。プログラムとメタプログラムは異なるメタレベルにあります。

プログラムとメタプログラムを区別するために、以下の規則が使用されます。

  • 角括弧 [] は、メタプログラム内の関数の適用を表すために使用されます。
  • メタプログラム内の変数には大文字が使用されます。プログラム内の変数は小文字で表されます。
  • メタプログラム内のequalsに使用されます。

簡潔にするために、最初のルールが適用されます。また、これらのルールでは、ラムダ式が前処理され、各ラムダ抽象化に一意の名前が付けられていることを前提としています。

置換演算子も使用されます。式は、L内のGをすべてS置き換え、その結果を返すことを意味します。使用される定義は、ラムダ計算のページに記載されている定義を拡張して、式の置換もカバーするようにしています。式のマッチングでは、式のアルファ同値性(変数名の変更)を比較する必要があります。

ラムダ式からlet式への変換

次の規則は、構造を変更せずにラムダ式からlet式に変換する方法について説明しています。

ルール 6 は、関数の名前として一意の変数 V を作成します。

例えば、Yコンビネータ

に変換されます。

ルールラムダ式
6
4
5
3
8
8
4
2
1

let式からlambda式への変換

これらの規則は、上記の変換を逆にします。let 式を lambda 式に変換しますが構造は変更しません。ただし、すべての let 式がこれらの規則を用いて変換できるわけではありません。これらの規則は、式がde-lambdaによって生成されたかのように既に配置されていることを前提としています。

ラムダ計算には、再帰的に使用される自由変数を持つlet式と全く同じ構造を持つものはありません。この場合、パラメータを追加する必要があります。規則8と10はこれらのパラメータを追加します。

ルール8と10は、 let式内の相互再帰方程式が2つであれば十分です。しかし、相互再帰方程式が3つ以上ある場合は機能しません。一般的なケースではループ処理が1段階追加されるため、メタ関数の実装が少し難しくなります。以下のルールは、一般的なケースを実装する際にルール8と10を置き換えます。ルール8と10は、より単純なケースを先に検討できるように残されています。

  1. lambda-form - 式を、それぞれが変数=という形式の式の連結に変換します
    1. ......ここで、Vは変数です。
  2. lift-vars -式には自由変数としてXがあるため、パラメーターとしてXを必要とする変数のセットを取得します。
  3. サブ変数- セット内の各変数を、式内のXに適用されている変数に置き換えます。これにより、Xは式の右辺の自由変数ではなく、パラメータとして渡される変数になります。
  4. de-let - Eの各条件を解除して、 X が方程式の右側の自由変数にならないようにします。

例えば、Yコンビネータから得られるlet式は、

に変換されます。

ルールラムダ式
6
1
2
3
7
4
4
5
1
2
3
4
5

2つ目の例として、 Yコンビネータのリフトバージョンを取り上げます

に変換されます。

ルールラムダ式
8
7
1、2
7、4、5
1、2

3つ目の例として、

は、

ルールラムダ式
9
1
2
7
1
2

4番目の例として、

は、

これは有名なy コンビネータです。

ルールラムダ式
9
2
7
1
2

主要人物

参照

参考文献

  1. ^ 「PCFは、スコットの計算可能関数の論理であるLCFに基づいた、計算可能関数のためのプログラミング言語です」(Plotkin 1977)。Programming Computable Functionsは、 (Mitchell 1996)で使用されています。これは、Programming with Computable FunctionsまたはProgramming language for Computable Functionsとも呼ばれます
  2. ^ 「Scheme - 変数と Let 式」。
  3. ^ Simon, Marlow (2010). 「Haskell 2010 言語レポート - Let 式」
  4. ^ Landin, Peter J. (1964). 「式の機械的な評価」.コンピュータジャーナル. 6 (4).英国コンピュータ協会: 308–320 . doi : 10.1093/comjnl/6.4.308 .
  5. ^ 「相互再帰のための最も単純な多変数固定小数点コンビネータ」。

引用文献

  • ミッチェル、ジョン・C. (1996). 『プログラミング言語の基礎』MIT出版. ISBN 978-0-262-13321-0
  • Plotkin, GD (1977年12月). 「プログラミング言語としてのLCF」.理論計算機科学. 5 (3): 223– 255. doi : 10.1016/0304-3975(77)90044-5 .
Retrieved from "https://en.wikipedia.org/w/index.php?title=Let_expression&oldid=1311787694"