Theory Transition_Systems_and_Automata.Basic
section ‹Basics›
theory Basic
imports Main
begin
  subsection ‹Miscellaneous›
  abbreviation (input) "const x ≡ λ _. x"
  lemmas [simp] = map_prod.id map_prod.comp[symmetric]
  lemma prod_UNIV[iff]: "A × B = UNIV ⟷ A = UNIV ∧ B = UNIV" by auto
  lemma prod_singleton:
    "fst ` A = {x} ⟹ A = fst ` A × snd ` A"
    "snd ` A = {y} ⟹ A = fst ` A × snd ` A"
    by force+
  lemma infinite_subset[trans]: "infinite A ⟹ A ⊆ B ⟹ infinite B" using infinite_super by this
  lemma finite_subset[trans]: "A ⊆ B ⟹ finite B ⟹ finite A" using finite_subset by this
  declare infinite_coinduct[case_names infinite, coinduct pred: infinite]
  lemma infinite_psubset_coinduct[case_names infinite, consumes 1]:
    assumes "R A"
    assumes "⋀ A. R A ⟹ ∃ B ⊂ A. R B"
    shows "infinite A"
  proof
    show "False" if "finite A" using that assms by (induct rule: finite_psubset_induct) (auto)
  qed
  
  thm inj_on_subset subset_inj_on
  lemma inj_inj_on[dest]: "inj f ⟹ inj_on f S" using inj_on_subset by auto
end