我遇到以下引理的问题,我认为应该是正确的。我可以通过小步骤得到证据以达到某一点,但是我还没有找到证明整个引理的方法。
lemma abc:
fixes A :: "'a::comm_ring_1^'n^'n" and l :: 'n and c :: 'a
shows "(χ i j. if i = l then c * (transpose A $ i $ j) else (transpose A $ i $ j)) =
(χ i j. if i = l then c * (A $ j $ i) else (A $ j $ i))"
proof -
(* here is my draft *)
have th1: "(χ i j. transpose A $ i $ j) = (χ i j. A $ j $ i)"
by (simp add: det_transpose transpose_def)
have "(χ i j. if i = l then (transpose A $ i $ j) else (transpose A $ i $ j)) =
(χ i j. A $ j $ i)" by (metis column_def row_def row_transpose)
show ?thesis sorry
qed
答案 0 :(得分:2)
在开始在Isabelle中证明某些事情之前,你应该知道如何在纸上证明它(也是经验丰富的Isabelle用户并不总是听从他们自己的建议;))。如果你知道如何在纸上证明它,那么如何将纸张证明翻译成Isabelle / Isar可能仍然不明显。但是,它会更容易帮助(并表明你理解手头的数学问题,这与Isabelle本身无关。)
在下文中,我将解释如何处理这种证据:
lemma abc:
fixes A :: "'a::comm_ring_1^'n^'n" and l :: 'n and c :: 'a
shows "(χ i j. if i = l then c * (transpose A $ i $ j) else (transpose A $ i $ j)) =
(χ i j. if i = l then c * (A $ j $ i) else (A $ j $ i))"
我注意到的第一件事是抽象χ i j. ...
。如果我要证明关于普通lambda抽象的东西,我肯定想要摆脱那些作为第一步,例如,为了证明两个函数f
和g
是相等的,我会证明所有f x = g x
x
。这是由伊莎贝尔在规则中表达的
ext: (⋀x. ?f x = ?g x) ⟹ ?f = ?g
由于我对Multivariate_Analysis
了解不多,我试图通过
χ
的类似规则
find_theorems "(χ i. ?f i) = (χ i. ?g i)"
第一次点击是我正在搜索的内容,即
Determinants.Cart_lambda_cong: (⋀x. ?f x = ?g x) ⟹ vec_lambda ?f = vec_lambda ?g
所以我通过两次应用此规则来启动证明(使用intro rule-name
,尽可能多地应用引入规则rule-name
):
proof (intro Cart_lambda_cong)
现在我必须表明,对于任意i
和j
,当替换χ参数时,该语句成立,即
fix i j
show "(if i = l then c * (transpose A $ i $ j) else (transpose A $ i $ j)) =
(if i = l then c * (A $ j $ i) else (A $ j $ i))"
然后通过应用transpose
:
by (simp add: transpose_def)
qed
或者代替我们可以做的上述步骤证明
by (auto intro!: Cart_lambda_cong simp: transpose_def)
!
之后的intro
告诉系统应该积极应用此规则(如果没有!
则不行,但不要问我原因;),我们必须检查应用规则的痕迹才能找到。)
答案 1 :(得分:2)
查看引理表明transpose A $ i $ j = A $ j $ i
适用于所有A
,i
,j
,这可以通过简化程序轻松证明:
lemma transpose_eq: "⋀i j. transpose A $ i $ j = A $ j $ i" by (simp add: transpose_def)
如果我们使用subst
方法手动应用此等式,则可以轻松解决引理
只是重写if
表达式的分支:
lemma abc:
fixes A :: "'a::comm_ring_1^'n^'n" and l :: 'n and c :: 'a
shows "(χ i j. if i = l then c * (transpose A $ i $ j) else (transpose A $ i $ j)) =
(χ i j. if i = l then c * (A $ j $ i) else (A $ j $ i))"
apply (subst transpose_eq)
apply (subst transpose_eq)
apply (rule refl)
done
因此,我们应该能够将简化器与subst
一起使用,而不是apply (simp add: transpose_eq)
,对吗?它不起作用的原因是由于同余规则。基本上,简化器知道一个规则(if_weak_cong
),它明确禁止它简化if
表达式的分支(这通常是将目标保持在可管理大小上的好主意)。所以我们需要删除这条规则:
apply (simp add: transpose_def cong del: if_weak_cong)
解决你的原始引理。
要获得更深入的答案,请参阅“Why won't Isabelle simplify the body of my "if _ then _ else" construct?”。