Isabelle 在存在证明中如何使用获得?

Isabelle 在存在证明中如何使用获得?,isabelle,isar,Isabelle,Isar,我试图证明一个存在定理 lemma "∃ x. x * (t :: nat) = t" proof obtain y where "y * t = t" by (auto) 但我无法完成证明。所以我有必要的y,但我怎样才能把它输入到最初的目标中呢?自然演绎的合理性要求你在打开存在量词之前先抓住证人。这就是为什么不允许在show语句中使用获取的变量。在您的示例中,证明步骤隐式地应用规则exI。这将存在量化变量x转换为原理图变量?x,可以稍后实例化,但实例化可能只引用?x出现时在范围内的变量。

我试图证明一个存在定理

lemma "∃ x. x * (t :: nat) = t"
proof
  obtain y where "y * t = t" by (auto)

但我无法完成证明。所以我有必要的y,但我怎样才能把它输入到最初的目标中呢?

自然演绎的合理性要求你在打开存在量词之前先抓住证人。这就是为什么不允许在show语句中使用获取的变量。在您的示例中,证明步骤隐式地应用规则exI。这将存在量化变量x转换为原理图变量?x,可以稍后实例化,但实例化可能只引用?x出现时在范围内的变量。在低级证明状态下,获得的变量是元量化的!!而?x的实例化只能引用作为?x参数出现的变量

因此,您必须在证明中切换顺序:

lemma "∃ x. x * (t :: nat) = t"
proof - (* method - does not change the goal *)
  obtain y where "y * t = t" by (auto)
  then show ?thesis by(rule exI)
qed

自然推论的正确性要求你在打开存在量词之前先抓住证人。这就是为什么不允许在show语句中使用获取的变量。在您的示例中,证明步骤隐式地应用规则exI。这将存在量化变量x转换为原理图变量?x,可以稍后实例化,但实例化可能只引用?x出现时在范围内的变量。在低级证明状态下,获得的变量是元量化的!!而?x的实例化只能引用作为?x参数出现的变量

因此,您必须在证明中切换顺序:

lemma "∃ x. x * (t :: nat) = t"
proof - (* method - does not change the goal *)
  obtain y where "y * t = t" by (auto)
  then show ?thesis by(rule exI)
qed

您可以在show子句中为x提供见证,即您要输入的元素:


您可以在show子句中为x提供见证,即您要输入的元素:


或者,当您已经知道此处的见证1或Suc 0时,可以显式实例化规则exI以引入存在项:

lemma "∃ x. x * (t :: nat) = t"
  by (rule exI[where x = "Suc 0"], simp)
这里,存在量词引入规则thm exI是

您可以根据答案逐步探索和实例化它

thm exI[其中x=Suc 0]为:

exI[其中p=λx.x*t=t,x=suc0]为

suc0*t=t离简化只有一步之遥。但系统可以计算出最后一个实例化P=λx。通过统一,x*t=t,所以这并不是真的必要

相关的:


或者,当您已经知道此处的见证1或Suc 0时,可以显式实例化规则exI以引入存在项:

lemma "∃ x. x * (t :: nat) = t"
  by (rule exI[where x = "Suc 0"], simp)
这里,存在量词引入规则thm exI是

您可以根据答案逐步探索和实例化它

thm exI[其中x=Suc 0]为:

exI[其中p=λx.x*t=t,x=suc0]为

suc0*t=t离简化只有一步之遥。但系统可以计算出最后一个实例化P=λx。通过统一,x*t=t,所以这并不是真的必要

相关的:


如果你的证人没有提到任何获得的变量,你可以使用无需证明的默认方法。在您的示例中,您可以使用Suc 0作为见证,而不是获取它。但我假设您的实际用例更复杂。如果使用常量中的def而不是使用获取来定义见证y,那么它应该可以工作。或者,您也可以通过使用选择运算符SOME来消除获取的变量,但这对写入和读取来说很麻烦。我没有实际的用例,我想构造一个使用获取的示例。您可以使用不带证明的方法-如果您的证人没有提到任何获取的变量,则使用默认方法。在您的示例中,您可以使用Suc 0作为见证,而不是获取它。但我假设您的实际用例更复杂。如果使用常量中的def而不是使用获取来定义见证y,那么它应该可以工作。或者,您也可以通过使用选择运算符SOME来消除获得的变量,但这对写入和读取来说很麻烦。我没有实际的用例,我想构造一个使用获取的示例。
?P (Suc 0) ⟹ ∃x. ?P x
Suc 0 * t = t ⟹ ∃x. x * t = t