適用順序:関数自体を評価する前に、常に関数の引数を完全に評価します-
通常の順序:式はのように外側から縮小されます-
レッツ
なぜそれは適用可能な順序では 無限ループです
が、通常の順序ではですか?
Let M = (λx.y) ((λx.(x x)) λx.(x x))
適用順序:関数自体を評価する前に、常に関数の引数を完全に評価します-
通常の順序:式はのように外側から縮小されます-
レッツ
なぜそれは適用可能な順序では 無限ループです
が、通常の順序ではですか?
Let M = (λx.y) ((λx.(x x)) λx.(x x))
回答:
は、は引数を2回だけ書き込むことに 注意してください。
あなたが還元さ用語であるK yは定数関数であるλ X 。Y(それは常に返すyとその引数を無視し、)及びΩ = (λ X 。(Xは終了しない用語です。ある意味では Ωは、究極の非終了用語です:それはすなわち、それ自体にベータ削減します Ω → Ω。(あなたの人生で少なくとも一度は紙の上でそれを解決するようにしてください。)
適用可能な次数削減では、最上位のredexを評価する前に、関数の引数を通常の形式に減らす必要があります。引数は正規形がないため、適用可能な次数低減は無限ループします。より一般的には、任意の期間のためのM、M Ω → M Ω、これは応用的順序戦略によって選ばれた減少です。
このケースは、より一般的な現象を示しています。適用次数低減は、項が強く正規化されている場合にのみ正規形を見つけますが、通常次数低減は、ある場合は常に正規形を見つけます。これは、適用順序が常に完全に引数を最初に評価するため、引数が未使用になる機会を逃すために発生します。一方、通常の順序では引数が可能な限り遅く評価されるため、引数が未使用であることが判明した場合は常に優先されます。
(反対に、引数が未使用になることは比較的まれであるため、適用順序は実際には高速になる傾向があります。一方、引数が複数回使用されることは一般的であり、適用順序では引数は一度しか評価されません。順序は、使用されるたびに、0回、1回、または何度も引数を評価します。)