我有以下目标:
∀x ∈ {0,1,2,3,4,5}. P x
我想将此目标分解为六个子目标P 0
,P 1
,P 2
,P 3
,P 4
和P 5
。这可以通过apply auto
轻松完成。但是auto
用来执行此操作的相关规则是什么?我问,因为我的实际目标看起来更像是这样:
∀x ∈ {0..<6}. P x
和apply auto
并没有以同样的方式打破这个目标(它给了我
⋀x. 0 ≤ x ⟹ x < 6 ⟹ P x
代替)。
答案 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}