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
¤ Dauer der Verarbeitung: 0.0 Sekunden
(vorverarbeitet am 2026-11-04)
¤
*© Formatika GbR, Deutschland