Isabelle 中有类似 subst_tac 的规则吗?
Is there anything like a subst_tac rule in Isabelle?
我有引理
lemma ex1_variable: "(∃x. ∀z. x = y z) = (∃!x. ∀z. x = y z)"
我在证明中有一个中间陈述
"∀a. ∃P. ∀z. P = Q z a"
我想展示
"∀a. ∃!P. ∀z. P = Q z a".
由于∀a
,我无法直接使用by (rule ex1_variable)
。但是,我觉得应该可以使用 subst
方法,例如
from `∀a. ∃P. ∀z. P = Q z a` have "∀a. ∃!P. ∀z. P = Q z a"
by (subst_tac ?x="P" and ?y="λx. Q x a" and ?z="z" in ex1_variable)
以便 ex1_variable
在当前目标中被替换,但仅在实例化之后。这个特定的例子不起作用,但有没有类似的东西?
无需显式实例化引理 ex1_variable
,高阶统一将为您完成。由于 ex1_variable
是一个等式语句,您实际上可以使用普通的 subst
来证明用实例化的右侧替换左侧的实例。但是你必须告诉 subst
查看假设,因为这是你的子目标中左侧实例出现的地方。所以以下应该有效:
lemma ex1_variable: "(∃x. ∀z. x = y z) = (∃!x. ∀z. x = y z)" sorry
notepad begin
fix Q
have "∀a. ∃P. ∀z. P = Q z a" sorry
then have "∀a. ∃!P. ∀z. P = Q z a"
by(subst (asm) ex1_variable)
end
或者,您可以翻转定理的边并将 subst
应用于结论:
by(subst ex1_variable[symmetric])
我有引理
lemma ex1_variable: "(∃x. ∀z. x = y z) = (∃!x. ∀z. x = y z)"
我在证明中有一个中间陈述
"∀a. ∃P. ∀z. P = Q z a"
我想展示
"∀a. ∃!P. ∀z. P = Q z a".
由于∀a
,我无法直接使用by (rule ex1_variable)
。但是,我觉得应该可以使用 subst
方法,例如
from `∀a. ∃P. ∀z. P = Q z a` have "∀a. ∃!P. ∀z. P = Q z a"
by (subst_tac ?x="P" and ?y="λx. Q x a" and ?z="z" in ex1_variable)
以便 ex1_variable
在当前目标中被替换,但仅在实例化之后。这个特定的例子不起作用,但有没有类似的东西?
无需显式实例化引理 ex1_variable
,高阶统一将为您完成。由于 ex1_variable
是一个等式语句,您实际上可以使用普通的 subst
来证明用实例化的右侧替换左侧的实例。但是你必须告诉 subst
查看假设,因为这是你的子目标中左侧实例出现的地方。所以以下应该有效:
lemma ex1_variable: "(∃x. ∀z. x = y z) = (∃!x. ∀z. x = y z)" sorry
notepad begin
fix Q
have "∀a. ∃P. ∀z. P = Q z a" sorry
then have "∀a. ∃!P. ∀z. P = Q z a"
by(subst (asm) ex1_variable)
end
或者,您可以翻转定理的边并将 subst
应用于结论:
by(subst ex1_variable[symmetric])