IFの削減ルール?


7

私はSimon Peyton Jonesの「関数型プログラミング言語の実装」を通じて作業しており、20ページで次のように表示されます。

IF TRUE((λp.p)3)↔IF TRUE 3(β赤あたり)(1)
                   ↔(λx.IFTRUE 3 x)(η赤あたり)(2)
                   ↔(λx.3)(3)

ステップ1から2は、η変換として説明されます。しかし、2から3までは、「最後のステップはIFの削減ルールである」と述べています。この削減ルールが何であるかわかりません。

回答:


10

あなたが求める縮約規則は、IFステートメントの通常の規則です。これは、2つの計算規則と1つのコンテキスト規則で構成されています。

  • IF TRUE a b a

  • IF FALSE a b b

  • aaIF a b cIF a b c

値による呼び出し(厳密)と呼び出しによる要求(遅延)の両方の設定で、 a そして b任意の式にすることができます。それらは値である必要はありません。

特定の機能(ここではIF)を削減するこの種のルールは、しばしばデルタルールと呼ばれます。

ここで、上記のステップ(2)が必要な理由は、 IF 適用できます。 IF引数は3つ必要ですが、元の用語では2つしかないため、削減できません。(IFHaskellの他の関数と同じように、部分的に適用されています。つまり、引数の一部のみを指定する必要があります。)η-expansionは、セマンティクスを変更せずに追加の引数を提供します。


1
追加します IF a b c -> IF a' b c with a-> a'
ファビオF。

はい、ただしη変換は条件を追加するべきではありませんか?から行くように思わIF TRUE 3λx.IFTRUE 3×(の私の省略言い訳のxその後、IFの減少に準拠したとして、次のステップで使用した場合には- -私たちが追加したので、正確に正直ではないオリジナルのポスト上に)xはちょうど準ELSE半分に。たとえば、問題がIF FALSE 3の場合はどうなりますか?η変換してλx.IFFALSE 3 xできますか?次に、ステップ3はλx.xでしたが、これは正しくないようです...奇妙なことです。IF TRUE((λp.p)3)(λx.3)と同等であることを証明することがポイントでした。これは混乱しています。
銀河系

@galaxybeing:使用する理由に関するコメントを追加しました η-拡張。結局のところ、IFには2つの引数があるため、その簡約規則を適用できます。
Dave Clarke

@galaxybeing IF FALSE 3 \x -> IF FALSE 3 x(の部分的な適用IFが許可されていると仮定して)同等 です。IF FALSE 3値に還元するためにもう1つの引数が必要です。これをx利回りIF FALSE 3 xに適用すると、単純に還元されますx。したがって、型なしラムダ計算を使用している限り、IF FALSE 3実際にと同等\x -> xです。Haskellでこれを試してみると(if' :: Bool -> a -> a部分的に適用できるように関数を定義することにより)、idHaskellがに対して推論する型に特化した関数が得られます3
ベン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.