我想使用function
关键字定义来证明函数定义的正确性。以下是关于自然数的通常归纳定义的加法函数的定义:
theory FunctionDefinition
imports Main
begin
datatype natural = Zero | Succ natural
function add :: "natural => natural => natural"
where
"add Zero m = m"
| "add (Succ n) m = Succ (add n m)"
Isabelle / JEdit向我展示了以下子目标:
goal (4 subgoals):
1. ⋀P x. (⋀m. x = (Zero, m) ⟹ P) ⟹ (⋀n m. x = (Succ n, m) ⟹ P) ⟹ P
2. ⋀m ma. (Zero, m) = (Zero, ma) ⟹ m = ma
3. ⋀m n ma. (Zero, m) = (Succ n, ma) ⟹ m = Succ (add_sumC (n, ma))
4. ⋀n m na ma. (Succ n, m) = (Succ na, ma) ⟹ Succ (add_sumC (n, m)) = Succ (add_sumC (na, ma))
Auto solve_direct: ⋀m ma. (Zero, m) = (Zero, ma) ⟹ m = ma can be solved directly with
Product_Type.Pair_inject: (?a, ?b) = (?a', ?b') ⟹ (?a = ?a' ⟹ ?b = ?b' ⟹ ?R) ⟹ ?R
使用
apply (auto simp add: Product_Type.Pair_inject)
我得到了
goal (1 subgoal):
1. ⋀P a b. (⋀m. a = Zero ∧ b = m ⟹ P) ⟹ (⋀n m. a = Succ n ∧ b = m ⟹ P) ⟹ P
目前尚不清楚如何进行。总之,这是解决这个问题的正确方法吗?
我知道如果我使用fun
定义,Isabelle会自动执行此操作 - 我想了解如何手动执行 。
答案 0 :(得分:3)
tutorial on the function
package在第3节中提及fun f where ...
缩写
function (sequential) f where ...
by pat_completeness auto
termination by lexicographic_order
此处pat_completeness
是来自function
包的证明方法,它自动验证数据类型构造函数模式的完整性。这是你必须证明的第一个子目标。建议在pat_completeness
之前应用auto
,因为auto
会更改目标的语法结构,pat_completeness
可能在自动后无效。
如果您想在没有pat_completeness
的情况下证明模式完整性,您应该尝试对所有函数参数进行大小写分析,例如,在您的示例中为case_tac a
。
答案 1 :(得分:3)
Manuel在评论中已经提到过,但我认为更详细的例子可能会有所帮助。您可以手动执行以下操作:
首先你照常指定你的功能
function add :: "natural => natural => natural"
where
"add Zero m = m" |
"add (Succ n) m = Succ (add n m)"
然后你证明给定的模式涵盖所有情况
by (pat_completeness) auto
之后你会负责终止。例如,每个datatype
都附带一个size
函数,您可能会注意到add
的第一个参数在每次递归调用时都会严格减小。默认情况下,function
会将函数的所有参数捆绑到终止证明的元组中,即在终止中将两个参数n
和m
代替证明您使用单对(n, m)
。因此,如果您想告诉系统它应该使用 first 参数的大小,您可以按如下方式执行此操作:
termination add
apply (relation "measure (size o fst)")
这将产生剩余的目标:
goal (2 subgoals):
1. wf (measure (size o fst))
2. !!n m. ((n, m), Succ n, m) : measure (size o fst)
也就是说,你必须表明给定的关系是有根据的(这对于measure
来说是微不足道的,因为它们是通过将参数映射到自然数然后使用来构造的。 和对于每次递归调用,参数实际上都在给定的关系中。这两个目标都可以通过simp
轻松发送。
apply simp
apply simp
done