Theory Superposition

theory Superposition
  imports
    First_Order_Clause.Nonground_Order_With_Equality
    First_Order_Clause.Nonground_Selection_Function
    First_Order_Clause.Nonground_Typing_With_Equality
    First_Order_Clause.Typed_Tiebreakers
                          
    Ground_Superposition
begin

section ‹Nonground Layer›

locale type_system =  
  context_compatible_term_typing_properties where
  welltyped = welltyped and from_ground_context_map = from_ground_context_map +
  witnessed_nonground_typing where welltyped = welltyped  
for
  welltyped :: "('v, 'ty) var_types  't  'ty  bool" and
  from_ground_context_map :: "('tG  't)  'cG  'c"

locale superposition_calculus =
  type_system where
  welltyped = welltyped and
  from_ground_context_map = "from_ground_context_map :: ('tG  't)  'cG  'c" +

  context_compatible_nonground_order where lesst = lesst +

  nonground_selection_function where
  select = select and atom_subst = "(⋅a)" and atom_vars = atom.vars and
  atom_to_ground = atom.to_ground and atom_from_ground = atom.from_ground +

  tiebreakers where tiebreakers = tiebreakers +

  ground_critical_pairs where
  compose_context = compose_ground_context and apply_context = apply_ground_context and
  hole = ground_hole
  for
    select :: "'t atom select" and
    lesst :: "'t  't  bool" and
    tiebreakers :: "('tG atom, 't atom) tiebreakers" and
    welltyped :: "('v :: infinite, 'ty) var_types  't  'ty  bool"
begin

interpretation term_order_notation .

inductive eq_resolution :: "('t, 'v, 'ty) typed_clause  ('t, 'v, 'ty) typed_clause  bool" where
  eq_resolutionI:
  "D = add_mset l D' 
   l = t !≈ t' 
   C = D'  μ 
   eq_resolution (𝒱, D) (𝒱, C)" 
if
  "type_preserving_on (clause.vars D) 𝒱 μ" 
  "term.is_imgu μ {{t, t'}}"
  "select D = {#}  is_maximal (l ⋅l μ) (D  μ)"
  "select D  {#}  is_maximal (l ⋅l μ) (select D  μ)"

inductive eq_factoring :: "('t, 'v, 'ty) typed_clause  ('t, 'v, 'ty) typed_clause  bool" where
  eq_factoringI:
  "D = add_mset l1 (add_mset l2 D') 
   l1 = t1  t1' 
   l2 = t2  t2' 
   C = add_mset (t1  t2') (add_mset (t1' !≈ t2') D')  μ 
   eq_factoring (𝒱, D) (𝒱, C)"
if
  "select D = {#}"
  "is_maximal (l1 ⋅l μ) (D  μ)"
  "¬ (t1 ⋅t μ t t1' ⋅t μ)"
  "type_preserving_on (clause.vars D) 𝒱 μ" 
  "term.is_imgu μ {{t1, t2}}"

inductive superposition ::
  "('t, 'v, 'ty) typed_clause 
   ('t, 'v, 'ty) typed_clause 
   ('t, 'v, 'ty) typed_clause  bool" where
  superpositionI:
  "E = add_mset l1 E' 
   D = add_mset l2 D' 
   l1 = 𝒫 (Upair c1t1 t1') 
   l2 = t2  t2' 
   C = add_mset (𝒫 (Upair (c1 ⋅tc ρ1)t2' ⋅t ρ2 (t1' ⋅t ρ1))) (E'  ρ1 + D'  ρ2)  μ 
   superposition (𝒱2, D) (𝒱1, E) (𝒱3, C)"
if 
  "𝒫  {Pos, Neg}"
  "infinite_variables_per_type 𝒱1"
  "infinite_variables_per_type 𝒱2"
  "term.is_renaming ρ1"
  "term.is_renaming ρ2"
  "clause.vars (E  ρ1)  clause.vars (D  ρ2) = {}"
  "¬ term.is_Var t1"
  "type_preserving_on (clause.vars (E  ρ1)  clause.vars (D  ρ2)) 𝒱3 μ" 
  "term.is_imgu μ {{t1 ⋅t ρ1, t2 ⋅t ρ2}}"
  "¬ (E  ρ1  μ c D  ρ2  μ)"
  "¬ (c1t1 ⋅t ρ1  μ t t1' ⋅t ρ1  μ)"
  "¬ (t2 ⋅t ρ2  μ t t2' ⋅t ρ2  μ)"
  "𝒫 = Pos  select E = {#}"
  "𝒫 = Pos  is_strictly_maximal (l1 ⋅l ρ1  μ) (E  ρ1  μ)"
  "𝒫 = Neg  select E = {#}  is_maximal (l1 ⋅l ρ1  μ) (E  ρ1  μ)"
  "𝒫 = Neg  select E  {#}  is_maximal (l1 ⋅l ρ1  μ) ((select E)  ρ1  μ)"
  "select D = {#}"
  "is_strictly_maximal (l2 ⋅l ρ2  μ) (D  ρ2  μ)"
  "x  clause.vars E. 𝒱1 x = 𝒱3 (term.rename ρ1 x)"
  "x  clause.vars D. 𝒱2 x = 𝒱3 (term.rename ρ2 x)"
  "type_preserving_on (clause.vars E) 𝒱1 ρ1"
  "type_preserving_on (clause.vars D) 𝒱2 ρ2"
  "τ. 𝒱2  t2 : τ  𝒱2  t2' : τ"

abbreviation eq_factoring_inferences where
  "eq_factoring_inferences  { Infer [D] C | D C. eq_factoring D C }"

abbreviation eq_resolution_inferences where
  "eq_resolution_inferences  { Infer [D] C | D C. eq_resolution D C }"

abbreviation superposition_inferences where
  "superposition_inferences  { Infer [D, E] C | D E C. superposition D E C }"

definition inferences :: "('t, 'v, 'ty) typed_clause inference set" where
  "inferences  superposition_inferences  eq_resolution_inferences  eq_factoring_inferences"

abbreviation bottomF :: "('t, 'v, 'ty) typed_clause set" ("F") where
  "bottomF  {(𝒱, {#}) | 𝒱. infinite_variables_per_type 𝒱 }"

subsubsection ‹Alternative Specification of the Superposition Rule›

inductive superposition' ::
  "('t, 'v, 'ty) typed_clause  
   ('t, 'v, 'ty) typed_clause  
   ('t, 'v, 'ty) typed_clause  bool" where
  superposition'I:
   "infinite_variables_per_type 𝒱1 
    infinite_variables_per_type 𝒱2 
    term.is_renaming ρ1 
    term.is_renaming ρ2 
    clause.vars (E  ρ1)  clause.vars (D  ρ2) = {} 
    E = add_mset l1 E' 
    D = add_mset l2 D' 
    𝒫  {Pos, Neg} 
    l1 = 𝒫 (Upair c1t1 t1') 
    l2 = t2  t2' 
    ¬ term.is_Var t1 
    type_preserving_on (clause.vars (E  ρ1)  clause.vars (D  ρ2)) 𝒱3 μ 
    term.is_imgu μ {{t1 ⋅t ρ1, t2 ⋅t ρ2}} 
    x  clause.vars E. 𝒱1 x = 𝒱3 (term.rename ρ1 x) 
    x  clause.vars D. 𝒱2 x = 𝒱3 (term.rename ρ2 x) 
    type_preserving_on (clause.vars E) 𝒱1 ρ1 
    type_preserving_on (clause.vars D) 𝒱2 ρ2 
    (τ. 𝒱2  t2 : τ  𝒱2  t2' : τ) 
    ¬ (E  ρ1  μ c D  ρ2  μ) 
    (𝒫 = Pos  select E = {#}  is_strictly_maximal (l1 ⋅l ρ1  μ) (E  ρ1  μ) 
     𝒫 = Neg  (select E = {#}  is_maximal (l1 ⋅l ρ1  μ) (E  ρ1  μ) 
                  is_maximal (l1 ⋅l ρ1  μ) ((select E)  ρ1  μ))) 
    select D = {#} 
    is_strictly_maximal (l2 ⋅l ρ2  μ) (D  ρ2  μ) 
    ¬ (c1t1 ⋅t ρ1  μ t t1' ⋅t ρ1  μ) 
    ¬ (t2 ⋅t ρ2  μ t t2' ⋅t ρ2  μ) 
    C = add_mset (𝒫 (Upair (c1 ⋅tc ρ1)t2' ⋅t ρ2 (t1' ⋅t ρ1))) (E'  ρ1 + D'  ρ2)  μ 
    superposition' (𝒱2, D) (𝒱1, E) (𝒱3, C)"

lemma superposition_eq_superposition': "superposition = superposition'"
proof (intro ext iffI)
  fix D E C
  assume "superposition D E C"
  then show "superposition' D E C"

  proof (cases D E C rule: superposition.cases)
    case (superpositionI 𝒫 𝒱1 𝒱2 ρ1 ρ2 E D t1 𝒱3 μ t2 c1 t1' t2' l1 l2 E' D' C)

    show ?thesis
    proof (unfold superpositionI(1-3), rule superposition'I; (rule superpositionI)?)

      show "𝒫 = Pos  select E = {#}  is_strictly_maximal (l1 ⋅l ρ1  μ) (E  ρ1  μ) 
       𝒫 = Neg  (select E = {#}  is_maximal (l1 ⋅l ρ1  μ) (E  ρ1  μ) 
                   is_maximal (l1 ⋅l ρ1  μ) (select E  ρ1  μ))"
        using superpositionI
        by fastforce
    qed
  qed
next
  fix D E C
  assume "superposition' D E C"
  then show "superposition D E C"
  proof (cases D E C rule: superposition'.cases)
    case (superposition'I 𝒱1 𝒱2 ρ1 ρ2 E D l1 E' l2 D' 𝒫 c1 t1 t1' t2 t2' 𝒱3 μ C)

    show ?thesis
    proof (unfold superposition'I(1-3), rule superpositionI; (rule superposition'I)?)

      show
        "𝒫 = Pos  select E = {#}"
        "𝒫 = Pos  is_strictly_maximal (l1 ⋅l ρ1  μ) (E  ρ1  μ)"
        "𝒫 = Neg  select E = {#}  is_maximal (l1 ⋅l ρ1  μ) (E  ρ1  μ)"
        "𝒫 = Neg  select E  {#}  is_maximal (l1 ⋅l ρ1  μ) (select E  ρ1  μ)"
        using superposition'I(23) is_maximal_not_empty
        by auto
    qed
  qed
qed

inductive pos_superposition ::
  "('t, 'v, 'ty) typed_clause  ('t, 'v, 'ty) typed_clause  ('t, 'v, 'ty) typed_clause  bool"
where
  pos_superpositionI:
   "infinite_variables_per_type 𝒱1 
    infinite_variables_per_type 𝒱2 
    term.is_renaming ρ1 
    term.is_renaming ρ2 
    clause.vars (E  ρ1)  clause.vars (D  ρ2) = {} 
    E = add_mset l1 E' 
    D = add_mset l2 D' 
    l1 = c1t1  t1' 
    l2 = t2  t2' 
    ¬ term.is_Var t1 
    type_preserving_on (clause.vars (E  ρ1)  clause.vars (D  ρ2)) 𝒱3 μ 
    term.is_imgu μ {{t1 ⋅t ρ1, t2 ⋅t ρ2}} 
    x  clause.vars E. 𝒱1 x = 𝒱3 (term.rename ρ1 x) 
    x  clause.vars D. 𝒱2 x = 𝒱3 (term.rename ρ2 x) 
    type_preserving_on (clause.vars E) 𝒱1 ρ1 
    type_preserving_on (clause.vars D) 𝒱2 ρ2 
    (τ. 𝒱2  t2 : τ  𝒱2  t2' : τ) 
    ¬ (E  ρ1  μ c D  ρ2  μ) 
    select E = {#} 
    is_strictly_maximal (l1 ⋅l ρ1  μ) (E  ρ1  μ) 
    select D = {#} 
    is_strictly_maximal (l2 ⋅l ρ2  μ) (D  ρ2  μ) 
    ¬ (c1t1 ⋅t ρ1  μ t t1' ⋅t ρ1  μ) 
    ¬ (t2 ⋅t ρ2  μ t t2' ⋅t ρ2  μ) 
    C = add_mset ((c1 ⋅tc ρ1)t2' ⋅t ρ2  (t1' ⋅t ρ1)) (E'  ρ1 + D'  ρ2)  μ 
    pos_superposition (𝒱2, D) (𝒱1, E) (𝒱3, C)"

lemma superposition_if_pos_superposition:
  assumes "pos_superposition D E C"
  shows "superposition D E C"
  using assms
proof (cases rule: pos_superposition.cases)
  case (pos_superpositionI 𝒱1 𝒱2 ρ1 ρ2 E D l1 E' l2 D' c1 t1 t1' t2 t2' 𝒱3 μ C)
  then show ?thesis
    using superpositionI[of Pos 𝒱1 𝒱2 ρ1 ρ2 E D t1 𝒱3 μ t2 c1 t1' t2' l1 l2  E' D' C]
    by blast
qed

inductive neg_superposition ::
  "('t, 'v, 'ty) typed_clause  ('t, 'v, 'ty) typed_clause  ('t, 'v, 'ty) typed_clause  bool"
where
  neg_superpositionI:
   "infinite_variables_per_type 𝒱1 
    infinite_variables_per_type 𝒱2 
    term.is_renaming ρ1 
    term.is_renaming ρ2 
    clause.vars (E  ρ1)  clause.vars (D  ρ2) = {} 
    E = add_mset l1 E' 
    D = add_mset l2 D' 
    l1 = c1t1 !≈ t1' 
    l2 = t2  t2' 
    ¬ term.is_Var t1 
    type_preserving_on (clause.vars (E  ρ1)  clause.vars (D  ρ2)) 𝒱3 μ 
    term.is_imgu μ {{t1 ⋅t ρ1, t2 ⋅t ρ2}} 
    x  clause.vars E. 𝒱1 x = 𝒱3 (term.rename ρ1 x) 
    x  clause.vars D. 𝒱2 x = 𝒱3 (term.rename ρ2 x) 
    type_preserving_on (clause.vars E) 𝒱1 ρ1 
    type_preserving_on (clause.vars D) 𝒱2 ρ2 
    (τ. 𝒱2  t2 : τ  𝒱2  t2' : τ) 
    ¬ (E  ρ1  μ c D  ρ2  μ) 
    (select E = {#}  is_maximal (l1 ⋅l ρ1  μ) (E  ρ1  μ)) 
    (select E  {#}  is_maximal (l1 ⋅l ρ1  μ) ((select E)  ρ1  μ)) 
    select D = {#} 
    is_strictly_maximal (l2 ⋅l ρ2  μ) (D  ρ2  μ) 
    ¬ (c1t1 ⋅t ρ1  μ t t1' ⋅t ρ1  μ) 
    ¬ (t2 ⋅t ρ2  μ t t2' ⋅t ρ2  μ) 
    C = add_mset ((c1 ⋅tc ρ1)t2' ⋅t ρ2 !≈ (t1' ⋅t ρ1)) (E'  ρ1 + D'  ρ2)  μ 
    neg_superposition (𝒱2, D) (𝒱1, E) (𝒱3, C)"

lemma superposition_if_neg_superposition:
  assumes "neg_superposition E D C"
  shows "superposition E D C"
  using assms
proof (cases E D C rule: neg_superposition.cases)
  case (neg_superpositionI 𝒱1 𝒱2 ρ1 ρ2 E D l1 E' l2 D' c1 t1 t1' t2 t2' 𝒱3 μ C)
  then show ?thesis
    using
      superpositionI[of Neg 𝒱1 𝒱2 ρ1 ρ2 E D t1]
      literals_distinct(2)
    by blast
qed

lemma superposition_iff_pos_or_neg:
  "superposition D E C  pos_superposition D E C  neg_superposition D E C"
proof (rule iffI)
  assume "superposition D E C"
  thus "pos_superposition D E C  neg_superposition D E C"
  proof (cases D E C rule: superposition.cases)
    case (superpositionI 𝒫 𝒱1 𝒱2 ρ1 ρ2 E D t1 𝒱3 μ t2 c1 t1' t2' l1 l2 E' D' C)

    show ?thesis
    proof(cases "𝒫 = Pos")
      case True
      then have "pos_superposition (𝒱2, D) (𝒱1, E) (𝒱3, C)"
        using
          superpositionI
          pos_superpositionI[of 𝒱1 𝒱2 ρ1 ρ2 E D l1 E' l2 D' c1 t1 t1' t2 t2' 𝒱3 μ C]
        by argo

      then show ?thesis
        unfolding superpositionI(1-3)
        by simp

    next
      case False

      then have "𝒫 = Neg"
        using superpositionI(4)
        by auto

      then have "neg_superposition (𝒱2, D) (𝒱1, E) (𝒱3, C)"
        using
          superpositionI
          neg_superpositionI[of 𝒱1 𝒱2 ρ1 ρ2 E D l1 E' l2 D' c1 t1 t1' t2 t2' 𝒱3 μ C]
        by argo

      then show ?thesis
        unfolding superpositionI(1-3)
        by simp
    qed
  qed
next
  assume "pos_superposition D E C  neg_superposition D E C"
  thus "superposition D E C"
    using superposition_if_neg_superposition superposition_if_pos_superposition
    by metis
qed

end

end