Isabelle:转换矩阵与常数因子相等的证明

时间:2013-06-06 21:36:10

标签: matrix transpose isabelle theorem-proving

我遇到以下引理的问题,我认为应该是正确的。我可以通过小步骤得到证据以达到某一点,但是我还没有找到证明整个引理的方法。

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

2 个答案:

答案 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抽象的东西,我肯定想要摆脱那些作为第一步,例如,为了证明两个函数fg是相等的,我会证明所有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)

现在我必须表明,对于任意ij,当替换χ参数时,该语句成立,即

  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适用于所有Aij,这可以通过简化程序轻松证明:

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?”。