Isabelle 在归纳法中使用'defines'
考虑以下容易证明的引理:Isabelle 在归纳法中使用'defines',isabelle,Isabelle,考虑以下容易证明的引理: lemma fixes n m::nat defines "m ≡ n - 1" shows "m ≤ n" proof(induction n) case 0 then show ?case unfolding m_def (* Why does «n» appear here? *) next case (Suc n) then show ?case sorry qed 然而,在展开
lemma
fixes n m::nat
defines "m ≡ n - 1"
shows "m ≤ n"
proof(induction n)
case 0
then show ?case unfolding m_def
(* Why does «n» appear here? *)
next
case (Suc n)
then show ?case sorry
qed
然而,在展开m
之后,目标变成n-1≤ 0
而不是0-1≤ 0
使目标无法实现,因为n=2
是一个反例
这是伊莎贝尔身上的虫子吗?如何正确地展开定义?我认为一个有用的解释可能是:回想一下
nat.induct
的定义,即
?P 0 ⟹ (⋀n. ?P n ⟹ ?P (Suc n)) ⟹ ?P ?n
请注意,?n
意味着n
是隐式通用量化的,也就是说,前面的定义相当于
⋀n. ?P 0 ⟹ (⋀n. ?P n ⟹ ?P (Suc n)) ⟹ ?P n
现在,当将
nat.induct
应用于您的示例时,显然要证明的第一个子目标是?p0
,即m≤ 0
。然而,在这种情况下,n
仍然是一个任意但固定的nat
,特别是它不支持n=0
,这就是为什么在展开m
的定义后,您得到n-1的原因≤ 0
作为新的子目标。关于你的具体问题,问题是你不能通过对n
的归纳来证明你的结果(但你可以通过simp轻松地用展开m_def来证明它)。正如哈维尔指出的,引理头中定义的n
不同于归纳所创建的n
。换句话说,引用n
的任何“外部”事实在证明(归纳法n)
环境中不能直接使用
然而,Isabelle确实提供了一种“注入”这些事实的方法,通过管道将它们导入归纳法:
lemma
fixes n m::nat
defines "m ≡ n - 1"
shows "m ≤ n"
using m_def (* this allows induction to use this fact *)
proof(induction n)
case 0
then show ?case by simp
next
case (Suc n)
then show ?case by simp
qed
在这种情况下,使用assms
也同样有效
请注意,不再需要直接引用m_def
,因为每个case
(在0.hyps
和Suc.hyps
中)都包含一个版本的m_def
;有关详细信息,请在校样中使用print_cases
)