考虑以下愚蠢的例子
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
,它会这样做,但它会重命名现有{ {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那里得到漂亮的符号?
答案 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
弱结构化步骤,指示推理方向:erule
,drule
,frule
旧式战术模拟,允许使用其参数输入隐式目标上下文:rule_tac
,erule_tac
,drule_tac
,frule_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肯定有更多的探索性触摸(这就是为什么我经常喜欢它,当试图找到证明时),但结构化的样张可以让你获得更多的控制。