Theory VeriComp.Inf
section ‹Infinitely Transitive Closure›
theory Inf
  imports Main
begin
coinductive inf :: "('a ⇒ 'a ⇒ bool) ⇒ 'a ⇒ bool" for r where
  inf_step: "r x y ⟹ inf r y ⟹ inf r x"
coinductive inf_wf :: "('a ⇒ 'a ⇒ bool) ⇒ ('b ⇒ 'b ⇒ bool) ⇒ 'b ⇒ 'a ⇒ bool" for r order where
  inf_wf: "order n m ⟹ inf_wf r order n x ⟹ inf_wf r order m x" |
  inf_wf_step: "r⇧+⇧+ x y ⟹ inf_wf r order n y ⟹ inf_wf r order m x"
lemma inf_wf_to_step_inf_wf:
  assumes "wfp order"
  shows "inf_wf r order n x ⟹ ∃y m. r x y ∧ inf_wf r order m y"
proof (induction n arbitrary: x rule: wfp_induct_rule[OF assms(1)])
  case (1 n)
  from "1.prems"(1) show ?case
  proof (induction rule: inf_wf.cases)
    case (inf_wf m n' x')
    then show ?case using "1.IH" by simp
  next
    case (inf_wf_step x' y m n')
    then show ?case
      by (metis converse_tranclpE inf_wf.inf_wf_step)
  qed
qed
lemma inf_wf_to_inf:
  assumes "wfp order"
  shows "inf_wf r order n x ⟹ inf r x"
proof (coinduction arbitrary: x n rule: inf.coinduct)
  case (inf x n)
  then obtain y m where "r x y" and "inf_wf r order m y"
    using inf_wf_to_step_inf_wf[OF assms(1) inf(1)] by metis
  thus ?case by auto
qed
lemma step_inf:
  assumes "right_unique r"
  shows "r x y ⟹ inf r x ⟹ inf r y"
  using right_uniqueD[OF ‹right_unique r›]
  by (metis inf.cases)
lemma star_inf:
  assumes "right_unique r"
  shows "r⇧*⇧* x y ⟹ inf r x ⟹ inf r y"
proof (induction y rule: rtranclp_induct)
  case base
  then show ?case by assumption
next
  case (step y z)
  then show ?case
    using step_inf[OF ‹right_unique r›] by metis
qed
end