考虑以下愚蠢的例子
theory meta_all
imports Main
begin
lemma strict_subset: "⟦ A ⊂ B ⟧ ⟹ ∃a ∈ B. a ∉ A"
apply(blast)
done
lemma strict_subset2: "∀A B. A ⊂ B ⟶ (∃a ∈ B. a ∉ A)"
apply(blast)
done
lemma "¬ (∃A. A ⊂ A)"
apply(rule notI)
apply(erule exE)
接下来我想使用strict_subset
引理并替换A
两者A
,B
它会这样做,但是它将现有的重命名A
为Aa
,完全违背了引入引理的目的。
apply(insert strict_subset [where A="A" and B="A"])
如果我使用派生引理strict_subset2
,一切都会很好,所以我相信我的推理是合理的。
apply(insert strict_subset2)
apply(erule_tac x="A" in allE, erule_tac x="A" in allE)
apply(drule mp, assumption)
apply(erule bexE, erule notE, assumption)
done
end
关键是大多数标准引理都是形式strict_subset
而不是形式strict_subset2
,伊莎贝尔的制造者不可能让我strict_subset2
先自己制作,所以,我一定做错了什么。
我想明白为什么A
要改名?我认为这与打字系统有关,因为我认为我还看到了只要类型完全正确,元通用量化就不是问题的例子。
另一个问题是我是否可以以A
某种方式阻止重命名?
当然,很可能这两个问题实际上都与真正正确的答案无关,因为我对伊莎贝尔还是很陌生。
PS。是否也可以从 Isabelle 那里获得漂亮的符号?