lambda 表达式中的递归
Recursion in a lambda expression
是否可以在Isabelle/HOL中编写递归lambda表达式?如果可以,怎么做?
例如(一个傻瓜):
fun thing :: "nat ⇒ nat" where
"thing x = (λx. if x=0 then x else …) x"
所以我想编写应用于 x-1 的 λ 函数,而不是……
我该怎么做?提前致谢。
只有一种情况需要这样的事情:在证明中定义函数时。我已经这样做了,但这远非初学者友好,因为你必须手工推导简单规则。
解决方案是模仿 fun
在内部所做的事情,并根据 rec_nat
:
表达您的定义
fun thing :: "nat ⇒ nat" where
"thing x = rec_nat 0 (λ_ x. if x=0 then x else (x-1)) x"
(*simp rules*)
lemma thing_simps[simp]:
‹thing 0 = 0›
‹thing (Suc n) = thing n - Suc 0›
unfolding thing_def
by simp_all
除非不可避免,否则我不建议这样做...
是否可以在Isabelle/HOL中编写递归lambda表达式?如果可以,怎么做?
例如(一个傻瓜):
fun thing :: "nat ⇒ nat" where
"thing x = (λx. if x=0 then x else …) x"
所以我想编写应用于 x-1 的 λ 函数,而不是……
我该怎么做?提前致谢。
只有一种情况需要这样的事情:在证明中定义函数时。我已经这样做了,但这远非初学者友好,因为你必须手工推导简单规则。
解决方案是模仿 fun
在内部所做的事情,并根据 rec_nat
:
fun thing :: "nat ⇒ nat" where
"thing x = rec_nat 0 (λ_ x. if x=0 then x else (x-1)) x"
(*simp rules*)
lemma thing_simps[simp]:
‹thing 0 = 0›
‹thing (Suc n) = thing n - Suc 0›
unfolding thing_def
by simp_all
除非不可避免,否则我不建议这样做...