Theory MLSS_Realisation

theory MLSS_Realisation
  imports HereditarilyFinite.Finitary Graph_Theory.Graph_Theory
begin

section ‹The Realisation Function›
text ‹
  This theory contains an abstract formulation of a model
  for membership relations.
›

abbreviation parents :: "('a,'b) pre_digraph  'a  'a set"
  where "parents G s  {u. u Gs}"

abbreviation ancestors :: "('a,'b) pre_digraph  'a  'a set"
  where "ancestors G s  {u. u +Gs}"

lemma (in fin_digraph) parents_subs_verts: "parents G s  verts G"
  using reachable_in_verts by blast

lemma (in fin_digraph) finite_parents[intro]: "finite (parents G s)"
  using finite_subset[OF parents_subs_verts finite_verts] .

lemma (in fin_digraph) finite_ancestors[intro]: "finite (ancestors G s)"
  using reachable_in_verts
  by (auto intro: rev_finite_subset[where ?A="ancestors G s", OF finite_verts])

lemma (in wf_digraph) in_ancestors_if_dominates[simp, intro]:
  assumes "s Gt"
  shows "s  ancestors G t"
  using assms by blast

lemma (in wf_digraph) ancestors_mono:
  assumes "s  ancestors G t"
  shows "ancestors G s  ancestors G t"
  using assms by fastforce

locale dag = digraph G for G +
  assumes acyclic: "c. cycle c"
begin

lemma ancestors_asym:
  assumes "s  ancestors G t"
  shows "t  ancestors G s"
proof
  assume "t  ancestors G s"
  then obtain p1 p2 where "awalk t p1 s" "p1  []" "awalk s p2 t" "p2  []"
    using assms reachable1_awalk by auto
  then have "closed_w (p1 @ p2)"
    unfolding closed_w_def by auto
  with closed_w_imp_cycle acyclic show False
    by blast
qed

lemma ancestors_strict_mono:
  assumes "s  ancestors G t"
  shows "ancestors G s  ancestors G t"
  using assms ancestors_mono ancestors_asym by blast

lemma card_ancestors_strict_mono:
  assumes "s Gt"
  shows "card (ancestors G s) < card (ancestors G t)"
  using assms finite_ancestors ancestors_strict_mono
  by (metis in_ancestors_if_dominates psubset_card_mono)

end

text ‹
  The realisation assumes that the terms can be split into
  a set of base terms B› that are realised with the function I›
  and set terms T› that are realised according to the structure
  of the membership relation (represented as a graph G›).
›
locale realisation = dag G for G +
  fixes B T :: "'a set"
  fixes I :: "'a  hf"
  fixes eq :: "'a rel"
  assumes B_T_partition_verts: "B  T = {}" "verts G = B  T"
  assumes P_urelems: "p t. p  B  ¬ t Gp"
begin

lemma
  shows finite_B: "finite B"
    and finite_T: "finite T"
    and finite_B_un_T: "finite (B  T)"
  using finite_verts B_T_partition_verts by auto

abbreviation "eq_class x  eq `` {x}"

function realise :: "'a  hf" where
  "x  B  realise x = HF (realise ` parents G x)  HF (I ` eq_class x)"
| "t  T  realise t = HF (realise ` parents G t)"
| "x  B  T  realise x = 0"
  using B_T_partition_verts by auto
termination
  by (relation "measure (λt. card (ancestors G t))") (simp_all add: card_ancestors_strict_mono)

lemma finite_realisation_parents[simp, intro!]: "finite (realise ` parents G t)"
  by auto
 
function height :: "'a  nat" where
  "s. ¬ s Gt  height t = 0"
| "s Gt  height t = Max (height ` parents G t) + 1"
  using P_urelems by force+
termination
  by (relation "measure (λt. card (ancestors G t))") (simp_all add: card_ancestors_strict_mono)

lemma height_cases':
  obtains
      (Zero) "height t = 0"
    | (Suc_Max) s where "s Gt" "height t = height s + 1"
  apply(cases t rule: height.cases)
  using Max_in[OF finite_imageI[where ?h=height, OF finite_parents]]
  by auto

lemma lemma1_1:
  assumes "s Gt"
  shows "height s < height t"
proof(cases t rule: height_cases')
  case Zero
  with assms show ?thesis by simp
next
  case (Suc_Max s')
  note finite_imageI[where ?h=height, OF finite_parents]
  note Max_ge[OF this, of "height s" t]
  with assms Suc_Max show ?thesis
    by simp
qed

lemma dominates_if_mem_realisation:
  assumes "x y. I x  realise y"
  assumes "realise s  realise t"
  obtains s' where "s' Gt" "realise s = realise s'"
  using assms(2-)
proof(induction t rule: realise.induct)
  case (1 x)
  with assms(1) show ?case
    by simp (metis (no_types, lifting) image_iff mem_Collect_eq)
qed auto

lemma (in -) Max_le_if_All_Ex_le:
  assumes "finite A" "finite B"
      and "A  {}"
      and "a  A. b  B. a  b"
    shows "Max A  Max B"
  using assms
proof(induction rule: finite_induct)
  case (insert a A)
  then obtain b B' where "B = insert b B'"
    by (metis equals0I insert_absorb)
  with insert show ?case
    by (meson Max_ge_iff Max_in finite.insertI insert_not_empty)
qed blast

lemma lemma1_2':
  assumes "x y. I x  realise y"
  assumes "t1  B  T" "t2  B  T" "realise t1 = realise t2"
  shows "height t1  height t2"
  using assms(2-)
proof(induction "height t1" arbitrary: t1 t2 rule: less_induct)
  case less
  then show ?case
  proof(cases "height t1")
    case (Suc h)
    then obtain s1 where "s1 Gt1"
      by (cases t1 rule: height.cases) auto
    have Ex_approx: "v. v Gt2  realise w = realise v" if "w Gt1" for w
    proof -
      from that less(2) have "realise w  realise t1"
        by (induction t1 rule: realise.induct) auto
      with "less.prems" have "realise w  realise t2"
        by metis
      with dominates_if_mem_realisation assms(1) obtain v
        where "v Gt2" "realise w = realise v"
        by blast
      with less.prems show ?thesis
        by auto
    qed
    moreover
    have "height w  height v"
      if "w Gt1" "v  B  T" "realise w = realise v" for w v
    proof -
      have "w  B  T"
        using adj_in_verts[OF that(1)] B_T_partition_verts(2) by blast
      from "less.hyps"[OF lemma1_1, OF that(1) this that(2,3)] show ?thesis .
    qed
    ultimately have IH': "v  parents G t2. height w  height v"
      if "w  parents G t1" for w
      by (metis that adj_in_verts(1) mem_Collect_eq B_T_partition_verts(2))
    then have Max_le: "Max (height ` parents G t1)  Max (height ` parents G t2)"
    proof -
      have "finite (height ` parents G t1)"
           "finite (height ` parents G t2)"
           "height ` parents G t1  {}"
        using finite_parents s1 Gt1 by blast+
      with Max_le_if_All_Ex_le[OF this] IH' show ?thesis by blast
    qed
    show ?thesis 
    proof -
      note s1 = s1 Gt1
      with Ex_approx obtain s2 where "s2 Gt2"
        by blast
      with s1 Max_le show ?thesis by simp
    qed
  qed simp
qed

lemma lemma1_2:
  assumes "x y. I x  realise y"
  assumes "t1  B  T" "t2  B  T" "realise t1 = realise t2"
  shows "height t1 = height t2"
  using assms lemma1_2' le_antisym by metis

lemma lemma1_3:
  assumes "x y. I x  realise y"
  assumes "s  B  T" "t  B  T" "realise s  realise t"
  shows "height s < height t"
proof -
  from dominates_if_mem_realisation[OF assms(1,4)] obtain s'
    where "s' Gt" "realise s' = realise s"
    by metis
  then have "height s = height s'"
    using lemma1_2[OF assms(1,2)]
    by (metis adj_in_verts(1) B_T_partition_verts(2))
  also have " < height t"
    using s' Gt lemma1_1 by blast
  finally show ?thesis .
qed

end

end