Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Isabelle 在归纳法中使用'defines'_Isabelle - Fatal编程技术网

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