Theory Prover

section ‹Prover›

theory Prover imports "Abstract_Completeness.Abstract_Completeness" Encoding Fair_Stream begin

function eff :: ‹rule ⇒ sequent ⇒ (sequent fset) option› where
  ‹eff Idle (A, B) = Some {| (A, B) |}›
| ‹eff (Axiom P ts) (A, B) = (if ‡P ts [∈] A ∧ ‡P ts [∈] B then Some {||} else None)›
| ‹eff FlsL (A, B) = (if ⊥ [∈] A then Some {||} else None)›
| ‹eff FlsR (A, B) = (if ⊥ [∈] B then Some {| (A, B [÷] ⊥) |} else None)›
| ‹eff (ImpL p q) (A, B) = (if (p ⟶ q) [∈] A then
    Some {| (A [÷] (p ⟶ q), p # B), (q # A [÷] (p ⟶ q), B) |} else None)›
| ‹eff (ImpR p q) (A, B) = (if (p ⟶ q) [∈] B then
    Some {| (p # A, q # B [÷] (p ⟶ q)) |} else None)›
| ‹eff (UniL t p) (A, B) = (if ∀p [∈] A then Some {| (⟨t⟩p # A, B) |} else None)›
| ‹eff (UniR p) (A, B) = (if ∀p [∈] B then
    Some {| (A, ⟨#(fresh (A @ B))⟩p # B [÷] ∀p) |} else None)›
  by pat_completeness auto
termination by (relation ‹measure size›) standard

definition rules :: ‹rule stream› where
  ‹rules ≡ fair_stream rule_of_nat›

lemma UNIV_rules: ‹sset rules = UNIV›
  unfolding rules_def using UNIV_stream surj_rule_of_nat .

interpretation RuleSystem ‹λr s ss. eff r s = Some ss› rules UNIV
  by unfold_locales (auto simp: UNIV_rules intro: exI[of _ Idle])

lemma per_rules':
  assumes ‹enabled r (A, B)› ‹¬ enabled r (A', B')› ‹eff r' (A, B) = Some ss'› ‹(A', B') |∈| ss'›
  shows ‹r' = r›
  using assms by (cases r r' rule: rule.exhaust[case_product rule.exhaust])
    (unfold enabled_def, auto split: if_splits)

lemma per_rules: ‹per r›
  unfolding per_def UNIV_rules using per_rules' by fast

interpretation PersistentRuleSystem ‹λr s ss. eff r s = Some ss› rules UNIV
  using per_rules by unfold_locales

definition ‹prover ≡ mkTree rules›

end