有限有限量词的消除规则

时间:2013-03-12 14:18:54

标签: theorem-proving quantifiers isabelle

我有以下目标:

∀x ∈ {0,1,2,3,4,5}. P x

我想将此目标分解为六个子目标P 0P 1P 2P 3P 4P 5。这可以通过apply auto轻松完成。但是auto用来执行此操作的相关规则是什么?我问,因为我的实际目标看起来更像是这样:

∀x ∈ {0..<6}. P x

apply auto并没有以同样的方式打破这个目标(它给了我

⋀x. 0 ≤ x ⟹ x < 6 ⟹ P x

代替)。

3 个答案:

答案 0 :(得分:2)

auto正在使用的规则是ballI(限制所有介绍)。这会将∀x ∈ S. P x转换为x ∈ S ==> P x

x ∈ {0,1,2,3,4,5}转换为6个单独的子目标的问题是一个单独的问题。基本上,auto将显式枚举转换为析取,然后将其拆分。

答案 1 :(得分:2)

您可以使用以下引理来分割单个目标:

lemma expand_ballI: "⟦ (n :: nat) > 0; ∀x ∈ {0..< (n - 1)}. P x; P (n - 1) ⟧ ⟹ ∀x ∈ {0..< n}. P x"
  by (induct n, auto simp: less_Suc_eq)

然后可以按如下方式重复应用于您的规则:

lemma "∀x ∈ {0..< 6 :: nat}. P x"
  apply (rule expand_ballI, fastforce)+
  apply simp_all

导致目标分裂如下:

goal (6 subgoals):
 1. P 0
 2. P (Suc 0)
 3. P 2
 4. P 3
 5. P 4
 6. P 5

答案 2 :(得分:1)

使用[simp]引理将集合转换为更方便的集合版本非常方便。例如。 {0..<6} = {0,1,2,3,4,5}