-微積分、forまたはwhileのエンコーディングはありますか?


7

に λ-calculus、ここに示すように、算術、数値、ブール値をエンコードし、数値の階乗を計算することもできます。

「for」または「while」のエンコーディングはありますか?


6
λ-calculusが完成するので、はい、forまたはwhileループと同じことができます。それらはλ-calculusのすべてのように単なる関数であるため、それらをencodingsとは呼びません
— Euge

回答:


11

承知しました!例を使用してFORをエンコードする方法を示します。

単純な階乗FORプログラムを翻訳したいとします

x := 1
for i := 1 to N do
   x := x * i

次のように書き直します

x := 1
i := 1
repeat N times
   x := x*i
   i := i+1

次に、使用するすべての変数をタプルに入れます(ここではペアで十分です)。

(x,i) := (1,1)
repeat N times
   (x,i) := (x*i, i+1)

これは効果的に機能を適用します λ⟨x,i⟩.⟨x∗i,i+1⟩ 最初のペアに ⟨1,1⟩ ために N 回。

以来 N 教会の数字で表すことができます。

N(λ⟨バツ、私⟩。⟨バツ∗私、私+1⟩)⟨1、1⟩

上記の構文は、単純なラムダ計算を超えていくつかのことを使用しています。数字と算術は、教会の数字を使用して正確にすることができます。ペアにも独自の教会エンコーディングがあります:

⟨バツ、y⟩≡λk。kバツyλ⟨バツ、y⟩。M≡λz。M{zT/バツ、zF/y}
どこ z 新鮮な変数です T=λab。a そして F=λab。b。

3つ以上の変数がある場合は、上記のエンコーディングをタプルに一般化するか、単にタプルをネストされたペアとして表すことができます。


WHILEは再帰を使用することで最もよく処理されます:の代わりに

while p(x,i) do
   (x,i) := f(x,i)

どこp述語で、fいくつかの(部分)関数であり、我々のようなものを使用することができます

def recFun(x,i):
   if p(x,i):
      return recFun(f(x,i))
   else:
      return (x,i)

ラムダ計算では、再帰は、固定小数点コンビネータ、たとえばChurch'sY またはチューリングの Θ。私たちは次のようなものを得ます

Y(λr。λ⟨バツ、私⟩。私f pバツ私 theん r(f⟨バツ、私⟩) else ⟨バツ、私⟩)

どこ 私f b theん t else e≡bte ブール値が教会でエンコードされていると仮定します。

また、WHILEは(厳密に)FORより強力です。すべてのFORはWHILEとしてエンコードできるため、このエンコード手法はFORにも使用できます。


9

ループのエンコーディングはありますが、ラムダ計算は命令型言語ではないため、慣れ親しんだループとまったく同じようには機能しません。ラムダ計算には副作用がないので(純粋に関数型の言語です)、ループとまったく同じものは役に立たないでしょう。

明示的な状態

命令型プログラムは、すべての状態をプログラム内の変数として明示的に渡すことにより、純粋に関数型の言語に変換できます。命令型疑似コードにはPython構文を使用します。それという指示と、ほとんど透明でなければならない(a, b) = f(…)関数の呼び出しがあることを意味fペアを返し、aそしてbそれぞれの対の第一及び第二成分が割り当てられています。ループを考える

while test_condition():
    do_stuff()

状態を明示的にしましょう。

state = initial_state
(state, cond) = test_condition(state)
while cond:
    (state, cond) = test_condition(do_stuff(state))

これを再帰呼び出しに変換できます。def loop(state):と呼ばれる関数を定義しますloop。

def loop(state):
    (state, cond) = test_condition(state)
    if cond: return loop(do_stuff(state))
    else: return state
state = loop(initial_state)

これは、次の概念のみを使用します。これらの概念はすべて、ラムダ計算で簡単に表現できます。

したがってwhile、条件の関数を定義できますC(test_condition)とボディB(do_stuff):

wh私le:=λC。λB。f私バツ(λf。λs。(λp。体(f私rstp)(secoんdp))(Cs))どこBODY=λs』。λc。私fc(f(Bs』))s』

forループはプログラミング言語によって異なりますが、常にwhileループの特殊なケースであるため、同じ方法でエンコードできます。ソース言語がforループの表現力を制限している場合は、より単純なエンコーディングが考えられます。たとえば、「繰り返しん 回」は単に関数構成です ん 回、関数はループの本体を構成する状態変換であり、 ん 教会の数字なので、それは単に適用されます ん ループ本体関数にそれ自体。

言語に状態を追加する

状態に対する別のアプローチは、状態操作プリミティブを使用してラムダ計算を拡張することです。その場合、評価の順番が重要になります。その場合、whileループは再帰で直接表現できます。

wh私le命令的:=λC。λB。f私バツ(λf。私fC(B;f)())
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.