使用Thunk实现递归嵌套函数m(a,b)的正确性验证问询
Thunk控制求值的OCaml实现正确性验证
我需要实现一个递归函数,定义规则如下:
- 当参数
a=0时,返回1,即m(a, b) = 1 - 当
a≠0时,m(a, b) = m(a-1, m(a,b))
为了用Thunk控制求值过程,我写了一份贴合自身思考逻辑的OCaml实现,同时有一份更简洁的参考实现,想确认自己的实现是否正确。
我的实现代码
let thunk_ite i t e = match i with | true -> t () | false -> e () ;; let rec m_thunk a b = thunk_ite (a() = 0) (fun () -> 1) (fun () -> m_thunk ((fun () -> a() - 1)) (fun () -> (m_thunk a b)));; let m a b = m_thunk (fun () -> a) (fun () -> b);; m 1 0;;
参考实现代码
let rec mthunk a b = let r = a() in match r with | 0 -> (fun () -> 1) | _-> mthunk (fun () -> r - 1) (fun ()-> (mthunk a b)());; let m_bis a b = mthunk (fun ()-> a) (fun () -> b) ();; m_bis 1 0;;
内容的提问来源于stack exchange,提问作者v_head
相关产品推荐
相关产品推荐

