证明 isabelle 中的简单不等式

proving simple inequality in isabelle

我是 isabelle 的新手,我试图证明以下简单的不等式:

lemma ineq:
  "(a::real) > 0 ⟹ a < 1 ⟹ (b::real) > 0 ⟹ b < 1 ⟹ (a + b - a * b) > 0"
proof
  have "1/a + 1/b > 1" by auto
qed

我正在尝试使用上面的行来展示它,但显然这不是那么容易,因为无论我尝试什么(展示、拥有、来自的几个组合),伊莎贝尔展示 Illegal application of proof command in 'prove' mode。我不知道这是什么意思。有人可以告诉我如何进行吗?

通常:如果 Isabelle 显示多个错误,您应特别注意第一个错误。在这种情况下,“证明”命令已经给你一个错误,它说:

Failed to apply initial proof method:
goal (1 subgoal):
 1. 0 < a ⟹ a < 1 ⟹ 0 < b ⟹ b < 1 ⟹ 0 < a + b - a * b

这是因为proof隐式地试图找到合适的引入规则并应用它。如果它不能做到这一点,它就会失败。在这种情况下你必须写 proof - 来告诉它不要做任何事情。

在一个不相关的注释上:

  • 在引理语句中用 编写的假设不会自动作为 Isar 中的事实提供。您需要自己 assume 他们。或者,您可以在引理语句中使用 assumes,然后它们 在名称 assms 下作为事实可用,或者,您可以选择给它们命名。
  • 类型注释b::real是多余的,可以从a处的那个推断出来。
  • 按照您的方式用类型注释 variables/subterms 很好,但作为提示,您也可以使用 fixes 来做到这一点。对于大类型注释,它通常使事情更清晰。
  • auto 扔在事物上并查看剩下的东西是证明事物时的一个很好的标准策略,但是您需要提供所有您拥有的事实(在您的情况下,a > 0a < 1,等等)。
  • 即便如此,auto在这种情况下也无能为力,因为它主要使用简化规则和经典逻辑推理。你的目标中没有逻辑连接词,默认的简化集中也没有匹配的简化规则,所以 auto 不能做任何事情。
  • algebra_simps 是对群和环有用的简化引理的集合。 field_simps 是相同的加上乘法逆和除法的一些规则。将它们作为简化规则提供给 simp/auto 可以解决或简化简单的代数问题。

因此,您可以将引理写成这种形式:

lemma ineq:
  fixes a b :: real
  assumes "a > 0" "a < 1" "b > 0" "b < 1"
  shows   "a + b - a * b > 0"
proof -
  from assms have "1/a > 1/2" and "1/b > 1/2" by (simp_all add: field_simps)
  hence "1/a + 1/b > 1" by simp
  with assms show ?thesis by (simp add: field_simps)
qed