证明 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 > 0
, a < 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
我是 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 > 0
,a < 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