import Std universe u v namespace BehavioralSemantics abbrev Tuple (X : Type u) (n : Nat) := Fin n → X abbrev Bundle (X : Type u) (n : Nat) (V : Type v) := Tuple X n → V structure Coalgebra (F : Type u → Type u) (X : Type u) where transition : X → F X structure BundleLifting (F : Type u → Type u) (n : Nat) (V : Type v) where lift : {X : Type u} → Bundle X n V → Bundle (F X) n V def pullTuple {X Y : Type u} {n : Nat} (f : X → Y) (xs : Tuple X n) : Tuple Y n := fun i => f (xs i) def pullBundle {X Y : Type u} {n : Nat} {V : Type v} (f : X → Y) (h : Bundle Y n V) : Bundle X n V := fun xs => h (pullTuple f xs) def closure {F : Type u → Type u} {X : Type u} {n : Nat} {V : Type v} (system : Coalgebra F X) (lifting : BundleLifting F n V) (h : Bundle X n V) : Bundle X n V := fun xs => lifting.lift h (fun i => system.transition (xs i)) def BundleLE {X : Type u} {n : Nat} {V : Type v} [LE V] (h k : Bundle X n V) : Prop := ∀ xs, h xs ≤ k xs def PostFixed {X : Type u} {n : Nat} {V : Type v} [LE V] (operator : Bundle X n V → Bundle X n V) (h : Bundle X n V) : Prop := BundleLE h (operator h) def Fixed {X : Type u} {n : Nat} {V : Type v} (operator : Bundle X n V → Bundle X n V) (h : Bundle X n V) : Prop := h = operator h def BehavioralStructure {X : Type u} {n : Nat} {V : Type v} [LE V] (operator : Bundle X n V → Bundle X n V) (h : Bundle X n V) : Prop := PostFixed operator h ∨ Fixed operator h theorem claim1_bundle_total {X : Type u} {n : Nat} {V : Type v} (h : Bundle X n V) (xs : Tuple X n) : ∃ value, h xs = value ∧ ∀ other, h xs = other → other = value := by refine ⟨h xs, rfl, ?_⟩ intro other equality exact equality.symm theorem claim1_coalgebra_transition_total {F : Type u → Type u} {X : Type u} (system : Coalgebra F X) (x : X) : ∃ next, system.transition x = next ∧ ∀ other, system.transition x = other → other = next := by refine ⟨system.transition x, rfl, ?_⟩ intro other equality exact equality.symm theorem claim2_closure_pointwise {F : Type u → Type u} {X : Type u} {n : Nat} {V : Type v} (system : Coalgebra F X) (lifting : BundleLifting F n V) (h : Bundle X n V) (xs : Tuple X n) : closure system lifting h xs = lifting.lift h (fun i => system.transition (xs i)) := rfl theorem claim2_fixed_is_postfixed {X : Type u} {n : Nat} {V : Type v} [LE V] (operator : Bundle X n V → Bundle X n V) (h : Bundle X n V) (le_refl : ∀ value : V, value ≤ value) (fixed : Fixed operator h) : PostFixed operator h := by intro xs rw [congrFun fixed xs] exact le_refl (operator h xs) end BehavioralSemantics