が((x y)(x P)(P z))
というようなラムダ微積分関数Pを作成したいと思います。私はYコンビネータ/チューリングコンビネータの変種、すなわち形λg.(g g)
の関数を使用しようとしました。なぜなら、関数自体を再現する必要があるからですが、私は前方を見ることができません。どんな助けでも大歓迎です。再帰ラムダ計算関数
1
A
答えて
1
を使用してのように見えるかもしれないものです"β-方程式" 01を解く。 式M = ... M ...
の方程式を解く一般的な方法があります。 あなただけM
のすべての出現がm
によって置き換えられている用語L
、形成、ラムダに右辺をラップ:固定小数点を使用して次に
L = λm. ... m ...
をあなたの解決策を得るコンビネータ。あなたの例でそれを説明しましょう。
L = λp. (λxyz. (x y) (x p) (p z)),
where λxyz. is a shorthand for λx. λy. λz.
その後、Y
とL
を展開P = Y L
は、我々が得る:
P x y z
= // unfolding definition of P
(λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) x y z
->β
((λp. (λxyz. (x y) (x p) (p z))) ((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)))) x y z
->β
(λxyz. (x y) (x ((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)))) (((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))) z)) x y z
->β
(x y) (x ((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)))) (((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))) z)
= // folding 1st occurrence of P
(x y) (x P) (((λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))) z)
= // folding 2nd occurrence of P
(x y) (x P) (P z)
Q.E.D.を:
P = (λf. (λg. f (g g)) (λg. f (g g))) (λp. (λxyz. (x y) (x p) (p z)))
->β
(λg. (λp. (λxyz. (x y) (x p) (p z))) (g g)) (λg. (λp. (λxyz. (x y) (x p) (p z))) (g g))
// the previous line is our "unfolded" P
だがP
は、私たちが何をしたいんかどうかをチェックしてみましょう
1
U-combinatorは、自己参照ラムダ抽象化を作成するのに役立ちます。
ここで、Ωは、Uコンビネータをうまく表現する最小の非終端プログラムです。
((λf. (f f))
(λf. (f f)))
あなたはそれに名前を付けることができればここで
Ω := λf.(f f)
が、それは基本的にあなたが望むあなたの抽象化
((λP. (P P x y z))
(λP. λx. λy. λz. ((x y) (x P) (P z))))
それともΩ
λx. λy. λz. Ω (λP. λx. λy. λz. ((x y) (x P) (P z))) x y z
関連する問題
- 1. 再帰は、ラムダ関数
- 2. Prolog - 再帰計算
- 3. 再帰関数の合計
- 4. 正弦関数の再帰計算は役に立たない
- 5. アセンブリ言語で再帰関数を計算する
- 6. 再帰ファクター計算ツールRecursionError
- 7. キューの再帰的計算
- 8. テール再帰(@tailrec)再帰関数対非再帰関数スカラースタックオーバーフローエラー?
- 9. 再帰加算数
- 10. 再帰的なラムダ
- 11. 再帰ラムダのオーバーヘッド
- 12. "*"を除いた指数を計算するための再帰関数
- 13. 再帰関数を使用して文字の数を計算する
- 14. F#計算式と末尾再帰の再帰的バインド
- 15. ラムダ計算ヘルプ
- 16. ラムダ計算
- 17. 再帰関数
- 18. 再帰関数
- 19. 再帰関数
- 20. 再帰関数
- 21. 再帰関数。 、
- 22. 再帰関数?
- 23. Javaで再帰ラムダ関数を実装する
- 24. Kotlin - 再帰的にラムダ関数を呼び出す方法
- 25. 再帰DRYコード、月の計算、Java
- 26. ログベース2の再帰を計算する
- 27. powを計算する再帰バッチスクリプト
- 28. SAP Hana - SQL - 再帰関数なしで同じテーブルの列を計算する
- 29. 再帰関数の時間複雑度を計算するには?
- 30. 再帰関数データ