数百の還元ステップが多すぎて、Y fac⌜3⌝の通常の形を得ることができませんか?


9

最近、λ計算の基礎を教えているので、Common Lispに単純なλ計算エバリュエーターを実装しました。の正規形のY fac 3正規次数削減を求めると、619ステップかかります。

もちろん、紙で同様の削減を行うたびに、型なしのλ計算を使用することはありませんでしたが、それらに作用する数と関数を追加しました。この場合、facは次のように定義されます。

fac = λfac.λn.if (= n 0) 1 (* n (fac (- n 1)))

この場合、考慮=*および-関数をカリー化など、それだけで取得するには、およそ50のステップを取るY fac 3その正規形に6

しかし、私の評価者では、以下を使用しました。

true = λx.λy.x
false = λx.λy.y
⌜0⌝ = λf.λx.x
succ = λn.λf.λx.f n f x
⌜n+1⌝ = succ ⌜n⌝
zero? = λn.n (λx.false) true
mult = λm.λn.λf.m (n f)
pred = λn.λf.λx.n (λg.λh.h (g f)) (λu.x) (λu.u)
fac = λfac.λn.(zero? n) ⌜1⌝ (* n (fac (pred n)))
Y = λf.(λf.λx.f (x x)) f ((λf.λx.f (x x)) f)

619ステップで、Y fac ⌜3⌝の通常の形式⌜6⌝、つまりに戻りλf.λx.f (f (f (f (f (f x)))))ます。

多くのステップの簡単な概要から、それはpredそのような長い削減を保証する定義だと思いますが、それでもそれが私の実装の大きな厄介なバグかもしれないのではないかと思っています...

編集:私は最初に1000ステップについて質問しましたが、そのうちのいくつかは実際に通常の順序の誤った実装を引き起こしたため、最初のステップ数の2/3になりました。以下にコメントするように、私の現在の実装では、ChurchからPeano演算に切り替えると、実際にはステップ数が増加します…

回答:


11

あなたが使いたいなら、教会のコーディングは本当に悪いですpred。Peanoスタイルでより効率的なコーディングを使用することをお勧めします。

//算術

:p_zero =λs.λz.z
:p_one =λs.λz.sp_zero
:p_succ =λn.λs.λz.sn
:p_null =λn.n(λx。ff)tt
:p_pred =λn.n(λp.p)p_zero
:p_plus =μ!f.λn.λm.n(λp。p_succ(!fpm))m
:p_subs =μ!f.λn.λm.n(λp。p_pred(!fpm))m
:p_eq =μ!f.λm.λn。m(λp。n(λq。!fpq)ff)(n(λx.ff)tt)
:p_mult =μ!f.λm.λn。m(λp。p_plus n(!fpn))p_zero
:p_exp =μ!f.λm.λn。m(λp。p_mult n(!fpn))p_one
:p_even =μ!f.λm。m(λp。not(!fp))tt

//数値

:p_0 =λs.λz.z
:p_1 =λs.λz.sp_0
:p_2 =λs.λz.sp_1
:p_3 =λs.λz.sp_2
...

これは私の古いライブラリの1つから取得したコードでμ!f. …、の最適化された構成にすぎませんY (λf. …)。(そしてttffnotブール値です。)

facしかし、あなたがより良い結果を得るかどうかは本当にわかりません。


ヒントをありがとう、この代替エンコーディングを使用すると、実装のいくつかのバグを見つけるのに役立ちました。実際には、それはステップ数の助けにはなりません。なぜなら、修正した後、3の通常形を見つけるからです!教会の数字とペアノの数字と687と619個のステップを取る...
どこ人間ません

はい、それは私が考えたものです。なぜなら、いくつかの特別な削減ルールを使用することは、Yここで(特にペアーノ数字に対して)短い削減を取得するために重要に思われるからです。
ステファン・ヒメネス

好奇心旺盛ですが、4!、5!、6!?
ステファン・ヒメネス

1
奇妙なことに、3!の後、PeanoエンコーディングはChurchエンコーディングよりも効率的になります。それぞれ1!、2!、3!、4!の通常の形式を取得します。そして5!Peano / Churchでは、10 / 10、40 / 33、157 / 134、685 / 667、3541 / 3956、および21629/27311のステップが必要です。おおよそ6段のステップ数!以前のデータから補間することは、読者のための演習として残されています。
どこ男なかっ

1
上記はまさに「Peano +λ= Scott」というスコットの数字のようです。他に試してみる価値のあるものは、バイナリバリアントです(Churchと<strike> Peano </ strike> Scottの両方)。
ステファン・ヒメネス

2

たとえば、Pythonで3の階乗を計算するためにCPUが実行する処理の数を考えると、数百の削減はまったく大きな問題ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.