在Isabelle中有什么像subst_tac规则吗?

时间:2017-07-18 13:43:57

标签: substitution 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".

由于by (rule ex1_variable),我无法直接使用∀a。但是,我觉得应该可以使用类似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在当前目标中被替换,但仅在实例化之后。这个特殊的例子不起作用,但有类似的东西吗?

1 个答案:

答案 0 :(得分:1)

没有必要明确地实例化引理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])