我试图证明一个存在主义定理
lemma "∃ x. x * (t :: nat) = t"
proof
obtain y where "y * t = t" by (auto)
但我无法完成证明。所以我有必要y
,但我怎样才能将其纳入原定目标?
答案 0 :(得分:4)
自然演绎的健全性要求你在打开存在量词之前掌握证人。这就是为什么不允许在show
语句中使用获得的变量。在您的示例中,proof
步骤隐式应用规则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
答案 1 :(得分:3)
您可以在show
子句中提供见证(即您要为x输入的元素):
lemma "∃ x. x * (t :: nat) = t"
proof
show "1*t = t" by simp
qed
答案 2 :(得分:1)
或者,当您已经知道见证人(此处为 1
或 Suc 0
)时,您可以显式实例化规则 exI
以引入存在项:
lemma "∃ x. x * (t :: nat) = t"
by (rule exI[where x = "Suc 0"], simp)
这里,存在量词引入规则thm exI
是
?P ?x ⟹ ∃x. ?P x
你可以用答案逐步探索和实例化它。
thm exI[where x = "Suc 0"]
是:
?P (Suc 0) ⟹ ∃x. ?P x
和 exI[where P = "λ x. x * t = t" and x = "Suc 0"]
是
Suc 0 * t = t ⟹ ∃x. x * t = t
而 Suc 0 * t = t
只是一种简化形式 (simp
)。但是系统可以通过统一计算出最后一个实例化 P = "λ x. x * t = t"
,所以这不是真的必要。
相关: