-
Lean では2つの関数 しかし,関数の入力に「残りの計算資源」を与えてもいいなら,計算量を見積もることができるかもしれません. たとえば,ユークリッドの互除法を表す次の関数を考えます. def gcd : (a : Nat) -> (b : Nat) -> (fuel : Nat) -> Option Nat
| _, _, 0 => none -- 燃料切れ
| a, 0, _ => some a
| a, b, (fuel+1) => gcd b (a % b) fuel これにより,たとえば この方法を Fibonacci 数列にも応用したいのですが, この方法は一般にはうまくいかないのでしょうか? |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 3 replies
-
|
Beta Was this translation helpful? Give feedback.
-
Lean ではありませんが、モナドを用いて計算量を見積もっている例がありました https://openresearch-repository.anu.edu.au/bitstream/1885/177195/1/thesis.pdf |
Beta Was this translation helpful? Give feedback.
ご認識の通りだと思います。
上記内容をフィボナッチ数列に合わせてLeanで書き起こすと以下のような感じになるはずです。
通常のλ計算と異なり、環境や型を考えなくても多分大丈夫なため若干簡素な書き方で実現できています。
https://github.com/s-taiga/lean-test-files/blob/develop/fibonacci/test.lean
本当は評価の過程を
eval
したときに見えるようにしたかったのですが、表示を行えるようにする型クラスの使い方がいまいちわからなかったため最終的な計算だけしています。