为什么重新命名了元通用量化变量以及如何防止它?

时间:2013-03-12 21:27:27

标签: rename isabelle

考虑以下愚蠢的例子

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替换为AB,它会这样做,但它会重命名现有{ {1}}到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形式,Isabelle的制造者不能让我自己创建自己的strict_subset2所以,我必须做错事。

我想了解为什么重命名strict_subset2?我认为它与打字系统有关,因为我认为我也看到了只要类型完全正确,元通用量化不成问题的例子。

另一个问题是我是否可以阻止以某种方式重命名A

当然,很有可能这两个问题实际上与真正正确的答案无关,因为我对伊莎贝尔来说还是很新鲜。

PS。是否有可能从Isabelle那里得到漂亮的符号?

3 个答案:

答案 0 :(得分:3)

这只是一个狭隘的技术答案,如果这条实验路径没有任何意义,那就不会开始提出问题。

在你的情况下

apply(insert strict_subset [where A="A" and B="A"])

有问题的子目标是:

⋀A. A ⊂ A ⟹ False

但是局部绑定(绿色)A是子目标的所谓“参数”,这意味着它隐藏在目标上下文中。 strict_subset [where A="A" and B="A"]的使用是指证明文本的上下文,而不是证明目标。所以你得到了不同的(免费的,未声明的)A,这也通过证明者输出中的特殊突出显示。

有一套特殊的(非常老式的)战术可以在隐含的目标背景下潜水并进行一些实例化。这是一个例子:

apply(cut_tac A = A and B = A in strict_subset)

现在你在目标状态中拥有绿色A的实例,但由于规则的形式以及奇数cut_tac的工作方式,它也被分成了太多的子目标。 / p>

请注意,基本上有以下Isabelle / Isar证明方法的标记:

  • 结构化的Isar证明步骤:值得注意的是rule

  • 弱结构化步骤,指示推理方向:eruledrulefrule

  • 旧式战术模拟,允许使用其参数输入隐式目标上下文:rule_tacerule_tacdrule_tacfrule_tac

PS:您可以将Isabelle / jEdit的unicode输出复制粘贴到此文本编辑器中。

答案 1 :(得分:1)

我认为您应该将apply (insert strict_subset)更改为apply (drule strict_subset)。然后您的证明可以由apply simp完成。

insert foo方法添加了foo作为额外的假设,并附带了它带来的元量词。你想要的是drule foo方法,它削弱了你的一个根据蕴涵foo的假设。)

答案 2 :(得分:1)

结构化校样可以避免所描述的命名问题,还可以执行单步推理:

lemma  "¬ (∃A :: 'a set. A ⊂ A)"
proof
   assume "∃A :: 'a set. A ⊂ A"
   then obtain A :: "'a set" where "A ⊂ A" ..          (* by (rule exE) *)
   then have "∃a ∈ A. a ∉ A" by (rule strict_subset)
   then obtain a where "a ∉ A" "a ∈ A" ..              (* by (rule bexE) *)
   then show False ..                                  (* by (rule notE) *)
qed

..by rule相同。您可以在校对步骤之前使用using [[rule_trace]](和find_theorems)来确定使用哪个规则rule

这种结构使得证明中发生的事情变得更加明显。当然,apply-style肯定有更多的探索性触摸(这就是为什么我经常喜欢它,当试图找到证明时),但结构化的样张可以让你获得更多的控制。