Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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 在求和或乘积中简化if-then-else_Isabelle_Isar - Fatal编程技术网

Isabelle 在求和或乘积中简化if-then-else

Isabelle 在求和或乘积中简化if-then-else,isabelle,isar,Isabelle,Isar,在做一些基本代数的时候,我经常会得到以下类型的子目标,有时是有限和,有时是有限积 lemma foo: fixes N :: nat fixes a :: "nat ⇒ nat" shows "(a 0) = (∑x = 0..N. (if x = 0 then 1 else 0) * (a x))" 这对我来说似乎很明显,但是auto和auto-cong:sum.cong-split:if\u splits都不能处理这个问题。更重要的是,当

在做一些基本代数的时候,我经常会得到以下类型的子目标,有时是有限和,有时是有限积

lemma foo:
  fixes N :: nat
  fixes a :: "nat ⇒ nat"
  shows "(a 0) = (∑x = 0..N. (if x = 0 then 1 else 0) * (a x))"

这对我来说似乎很明显,但是auto和auto-cong:sum.cong-split:if\u splits都不能处理这个问题。更重要的是,当这个引理被调用时,sledgehammer也会投降。一般来说,如何有效地处理包含if-then-else的有限和和和积,特别是如何处理这种情况?

假设左侧可以使用0到N之间的任意值,那么添加一个更一般的引理怎么样

lemma bar:
  fixes N :: nat
  fixes a :: "nat ⇒ nat"
  assumes
    "M ≤ N"
  shows "a M = (∑x = 0..N. (if x = M then 1 else 0) * (a x))"
  using assms by (induction N) force+

用bar by blast来求解原始问题?

假设左侧可以使用0到N之间的任意值,那么添加一个更一般的引理怎么样

lemma bar:
  fixes N :: nat
  fixes a :: "nat ⇒ nat"
  assumes
    "M ≤ N"
  shows "a M = (∑x = 0..N. (if x = M then 1 else 0) * (a x))"
  using assms by (induction N) force+

使用bar by blast解决原始问题?

我最喜欢的方法是使用规则sum.mono_neutral_left和sum.mono_neutral_cong_left以及相应的右版本,对于产品也是如此。规则sum.mono_neutral_right允许您删除任意多个summand,如果它们都为零:

finite T ⟹ S ⊆ T ⟹ ∀i∈T - S. g i = 0
⟹ sum g T = sum g S
cong规则还允许您修改较小集合上的求和函数:

finite T ⟹ S ⊆ T ⟹ ∀i∈T - S. g i = 0 ⟹ (⋀x. x ∈ S ⟹ g x = h x)
⟹ sum g T = sum h S
有了这些,看起来是这样的:

lemma foo:
  fixes N :: nat and a :: "nat ⇒ nat"
  shows "a 0 = (∑x = 0..N. (if x = 0 then 1 else 0) * a x)"
proof -
  have "(∑x = 0..N. (if x = 0 then 1 else 0) * a x) = (∑x ∈ {0}. a x)"
    by (intro sum.mono_neutral_cong_right) auto
  also have "… = a 0"
    by simp
  finally show ?thesis ..
qed

我最喜欢做这些事情的方法是使用sum.mono_neutral_left和sum.mono_neutral_cong_left以及相应的右版本,类似地用于产品。规则sum.mono_neutral_right允许您删除任意多个summand,如果它们都为零:

finite T ⟹ S ⊆ T ⟹ ∀i∈T - S. g i = 0
⟹ sum g T = sum g S
cong规则还允许您修改较小集合上的求和函数:

finite T ⟹ S ⊆ T ⟹ ∀i∈T - S. g i = 0 ⟹ (⋀x. x ∈ S ⟹ g x = h x)
⟹ sum g T = sum h S
有了这些,看起来是这样的:

lemma foo:
  fixes N :: nat and a :: "nat ⇒ nat"
  shows "a 0 = (∑x = 0..N. (if x = 0 then 1 else 0) * a x)"
proof -
  have "(∑x = 0..N. (if x = 0 then 1 else 0) * a x) = (∑x ∈ {0}. a x)"
    by (intro sum.mono_neutral_cong_right) auto
  also have "… = a 0"
    by simp
  finally show ?thesis ..
qed

在这种情况下,由auto-cong:if_-cong-simp:if_distrib[ofèλx.x*a››è=0›]。通过查找,我知道我想使用sum.delta。在那之后,我尝试使用自动和Isar证明以正确的形式得到总和。最后,我可以压缩证明在一个步骤。。。但我相信@Manuel Eberl可以给出更好的答案。。。。在压缩过程中,我发现sum.delta是自动应用的。因此,它不会出现在自动调用中。在这种情况下,由auto-cong:if_-cong-simp:if_-distrib[ofèλx.x*a›››=0›。通过查找,我知道我想使用sum.delta。在那之后,我尝试使用自动和Isar证明以正确的形式得到总和。最后,我可以压缩证明在一个步骤。。。但我相信@Manuel Eberl可以给出更好的答案。。。。在压缩过程中,我发现sum.delta是自动应用的。因此,它不会出现在自动调用中。这只是意味着力可以解引理foo,因为foo是通过归纳证明bar所需的基本情况?@1Darco1不完全:归纳是根据集合的大小而不是元素来完成的。原始引理foo可以用归纳法N simp_èall来证明,但我认为你在寻找一个更一般的解决方案,其中可以使用集合中的任意元素。这就意味着力可以解决引理foo,因为foo是通过归纳证明bar所需的基本情况?@1Darco1不完全是:归纳是根据集合的大小而不是元素来完成的。原始引理foo可以用归纳法N simp_èall证明,但我认为您正在寻找一个更一般的解决方案,其中可以使用集合的任意元素。