ls -l lambda.jar
」を入力して下のような表示が出れば大丈夫です。(ca12345$ という部分はログインしている機械によって変わります。また、所有者名・グループ名・サイズ・更新時刻は違うかも知れません。)
ca12345$ ls -l lambda.jar 合計 1 -rw------- 1 masuhara teacher 8073 11 25 18:42 lambda.jar ca12345$ |
java -jar lambda.jar
」を入力すると、「>」が表示されます。この状態でλ項を入力すると簡約した結果を表示します。
ca12345$ java -jar lambda.jar > \x.x (\x.x) > (\x.x)y ((\x.x)y) y > S=\nfx.f(nfx) (\nfx.f(nfx)) > Z0=\fx.x (\fx.x) > Z1=SZ0 ((\nfx.f(nfx))(\fx.x)) (\fx.f((\fx.x)fx)) (\fx.f((\x.x)x)) (\fx.fx) |
λのかわりに \ を使います。この式は(λx.(x))を意味します。 式が表示されます。 この式は((λx.(x))y)を意味します。 入力された式と 簡約した結果が表示されます。 「変数=式」を入力すると、 式を覚させることができます。 変数名はアルファベット1文字に 数字を0個以上続けたものです。 簡約した結果を変数に 覚えることもできます。 |
> Z2=S Z1 ((\nfx.f(nfx))(\fx.fx)) (\fx.f((\fx.fx)fx)) (\fx.f((\x.fx)x)) (\fx.f(fx)) |
この例は Z1 (1) の S (successor) を Z2 と定義しています。 |
> A=\nmfx.mf(nfx) (\nmfx.mf(nfx)) > A Z2 Z1 ((\nmfx.mf(nfx))(\fx.f(fx))(\fx.fx)) ((\mfx.mf((\fx.f(fx))fx))(\fx.fx)) (\fx.(\fx.fx)f((\fx.f(fx))fx)) (\fx.(\x.fx)((\fx.f(fx))fx)) (\fx.f((\fx.f(fx))fx)) (\fx.f((\x.f(fx))x)) |
A(足し算)を定義して 2+1を計算させます |
(\fx.f(f(fx))) > Z2 (A Z2) Z2 ((\fx.f(fx))((\nmfx.mf(nfx))(\fx.f(fx)))... ((\x.(\nmfx.mf(nfx))(\fx.f(fx))((\nmfx.m... ((\nmfx.mf(nfx))(\fx.f(fx))((\nmfx.mf(nf... ((\mfx.mf((\fx.f(fx))fx))((\nmfx.mf(nfx)... (\fx.(\nmfx.mf(nfx))(\fx.f(fx))(\fx.f(fx... (\fx.(\mfx.mf((\fx.f(fx))fx))(\fx.f(fx))... (\fx.(\fx.(\fx.f(fx))f((\fx.f(fx))fx))f(... (\fx.(\x.(\fx.f(fx))f((\fx.f(fx))fx))((\... (\fx.(\fx.f(fx))f((\fx.f(fx))f((\fx.f(fx... (\fx.(\x.f(fx))((\fx.f(fx))f((\fx.f(fx))... (\fx.f(f((\fx.f(fx))f((\fx.f(fx))fx)))) (\fx.f(f((\x.f(fx))((\fx.f(fx))fx)))) |
確かに3になっています もっと複雑な項を簡約すると (本当はもっと長い式が 表示されます) |
Continue? [return] (\fx.f(f(f(f((\fx.f(fx))fx))))) (\fx.f(f(f(f((\x.f(fx))x))))) (\fx.f(f(f(f(f(fx)))))) > # > S (S Z0) ((\nfx.f(nfx))((\nfx.f(nfx))(\fx.x))) 0 1 Redex?1 ((\nfx.f(nfx))(\fx.f((\fx.x)fx))) 0 1 Redex?1 ((\nfx.f(nfx))(\fx.f((\x.x)x))) 0 1 Redex?1 ((\nfx.f(nfx))(\fx.fx)) 0 |
途中で続けるかどうかを 聞かれます。enterを入力すると 簡約を続けます。nと入力すると そこで停止します。 #を入力すると、手で簡約する場所を 指定できるようになります。 λ抽象された変数名の下に 書かれた数が簡約の場所を 表わしますので、 番号で指示します。 |
Redex? (\fx.f((\fx.fx)fx)) 0 Redex? (\fx.f((\x.fx)x)) 0 Redex? (\fx.f(fx))
> # |
単にenterを入力すると 0番を簡約します。 |
> S (S Z0) ((\nfx.f(nfx))((\nfx.f(nfx))(\fx.x))) (\fx.f((\nfx.f(nfx))(\fx.x)fx)) (\fx.f((\fx.f((\fx.x)fx))fx)) (\fx.f((\x.f((\fx.x)fx))x)) (\fx.f(f((\fx.x)fx))) (\fx.f(f((\x.x)x))) (\fx.f(fx)) > |
もう一度#を入力すると 自動的な簡約に戻ります。 |