Theory Folds

theory Folds
imports Regular_Exp
(* Author: Xingyuan Zhang, Chunhan Wu, Christian Urban *)
theory Folds
imports "Regular-Sets.Regular_Exp"
begin

section ‹``Summation'' for regular expressions›

text ‹
  To obtain equational system out of finite set of equivalence classes, a fold operation
  on finite sets ‹folds› is defined. The use of ‹SOME› makes ‹folds›
  more robust than the ‹fold› in the Isabelle library. The expression ‹folds f›
  makes sense when ‹f› is not ‹associative› and ‹commutitive›,
  while ‹fold f› does not.  
›


definition 
  folds :: "('a ⇒ 'b ⇒ 'b) ⇒ 'b ⇒ 'a set ⇒ 'b"
where
  "folds f z S ≡ SOME x. fold_graph f z S x"

text ‹Plus-combination for a set of regular expressions›

abbreviation
  Setalt :: "'a rexp set ⇒ 'a rexp" ("⨄_" [1000] 999) 
where
  "⨄A ≡ folds Plus Zero A"

text ‹
  For finite sets, @{term Setalt} is preserved under @{term lang}.
›

lemma folds_plus_simp [simp]:
  fixes rs::"('a rexp) set"
  assumes a: "finite rs"
  shows "lang (⨄rs) = ⋃ (lang ` rs)"
unfolding folds_def
apply(rule set_eqI)
apply(rule someI2_ex)
apply(rule_tac finite_imp_fold_graph[OF a])
apply(erule fold_graph.induct)
apply(auto)
done

end