Theory iProver_Loop
section ‹iProver Loop›
text ‹The iProver loop is a variant of the Otter loop that supports the
elimination of clauses that are made redundant by their own children.›
theory iProver_Loop
imports Otter_Loop
begin
context otter_loop
begin
subsection ‹Definition›
inductive IL :: "('f × OL_label) set ⇒ ('f × OL_label) set ⇒ bool" (infix ‹↝IL› 50)
where
ol: "St ↝OL St' ⟹ St ↝IL St'"
| red_by_children: "C ∈ no_labels.Red_F (A ∪ M) ∨ (M = {C'} ∧ C' ≺⋅ C) ⟹
state ({}, {}, P, {C}, A) ↝IL state (M, {}, P, {}, A)"
subsection ‹Refinement›
lemma red_by_children_in_GC:
assumes "C ∈ no_labels.Red_F (A ∪ M) ∨ (M = {C'} ∧ C' ≺⋅ C)"
shows "state ({}, {}, P, {C}, A) ↝GC state (M, {}, P, {}, A)"
proof -
let ?𝒩 = "state ({}, {}, P, {}, A)"
and ?St = "{(C, YY)}"
and ?St' = "{(x, New) |x. x ∈ M}"
have "(C, YY) ∈ Red_F (?𝒩 ∪ ?St')"
using assms
proof
assume c_in: "C ∈ no_labels.Red_F (A ∪ M)"
have "A ∪ M ⊆ A ∪ M ∪ P" by auto
also have "fst ` (?𝒩 ∪ ?St') = A ∪ M ∪ P"
by auto
then have "C ∈ no_labels.Red_F (fst ` (?𝒩 ∪ ?St'))"
by (metis (no_types, lifting) c_in calculation in_mono no_labels.Red_F_of_subset)
then show "(C, YY) ∈ Red_F (?𝒩 ∪ ?St')"
using no_labels_Red_F_imp_Red_F by blast
next
assume assm: "M = {C'} ∧ C' ≺⋅ C"
then have "C' ∈ fst ` (?𝒩 ∪ ?St')"
by simp
then show "(C, YY) ∈ Red_F (?𝒩 ∪ ?St')"
by (metis (mono_tags) assm succ_F_imp_Red_F)
qed
then have St_included_in: "?St ⊆ Red_F (?𝒩 ∪ ?St')"
by auto
have prj_of_active_subset_of_St': "fst ` (active_subset ?St') = {}"
by (simp add: active_subset_def)
have "?𝒩 ∪ ?St ↝GC ?𝒩 ∪ ?St'"
using process[of _ "?𝒩" "?St" _ "?St'"] St_included_in prj_of_active_subset_of_St' by auto
moreover have "?𝒩 ∪ ?St = state ({}, {}, P, {C}, A)"
by simp
moreover have "?𝒩 ∪ ?St' = state (M, {}, P, {}, A)"
by auto
ultimately show "state ({}, {}, P, {C}, A) ↝GC state (M, {}, P, {}, A)"
by simp
qed
theorem IL_step_imp_GC_step: "M ↝IL M' ⟹ M ↝GC M'"
proof (induction rule: IL.induct)
case (ol St St')
then show ?case
by (simp add: OL_step_imp_GC_step)
next
case (red_by_children C A M C' P)
then show ?case using red_by_children_in_GC
by auto
qed
subsection ‹Completeness›
theorem
assumes
il_chain: "chain (↝IL) Sts" and
act: "active_subset (lhd Sts) = {}" and
pas: "passive_subset (Liminf_llist Sts) = {}"
shows
IL_Liminf_saturated: "saturated (Liminf_llist Sts)" and
IL_complete_Liminf: "B ∈ Bot_F ⟹ fst ` lhd Sts ⊨∩𝒢 {B} ⟹
∃BL ∈ Bot_FL. BL ∈ Liminf_llist Sts" and
IL_complete: "B ∈ Bot_F ⟹ fst ` lhd Sts ⊨∩𝒢 {B} ⟹
∃i. enat i < llength Sts ∧ (∃BL ∈ Bot_FL. BL ∈ lnth Sts i)"
proof -
have gc_chain: "chain (↝GC) Sts"
using il_chain IL_step_imp_GC_step chain_mono by blast
show "saturated (Liminf_llist Sts)"
using gc.fair_implies_Liminf_saturated gc_chain gc_fair gc_to_red act pas by blast
{
assume
bot: "B ∈ Bot_F" and
unsat: "fst ` lhd Sts ⊨∩𝒢 {B}"
show "∃BL ∈ Bot_FL. BL ∈ Liminf_llist Sts"
by (rule gc_complete_Liminf[OF gc_chain act pas bot unsat])
then show "∃i. enat i < llength Sts ∧ (∃BL ∈ Bot_FL. BL ∈ lnth Sts i)"
unfolding Liminf_llist_def by auto
}
qed
end
end