# HG changeset patch # User haftmann # Date 1325168084 -3600 # Node ID bb2f7488a0f110c0daece6339d7100d94f8eab5e # Parent 49a436ada6a24d0b603a7a6ba8a9ccc09008e371 conversions from sets to predicates and vice versa; extensionality on predicates diff -r 49a436ada6a2 -r bb2f7488a0f1 src/HOL/Predicate.thy --- a/src/HOL/Predicate.thy Thu Dec 29 15:14:44 2011 +0100 +++ b/src/HOL/Predicate.thy Thu Dec 29 15:14:44 2011 +0100 @@ -411,6 +411,10 @@ "(\w. eval P w \ eval Q w) \ P = Q" by (cases P, cases Q) (auto simp add: fun_eq_iff) +lemma pred_eq_iff: + "P = Q \ (\w. eval P w \ eval Q w)" + by (simp add: pred_eqI) + instantiation pred :: (type) complete_lattice begin @@ -816,7 +820,7 @@ by (auto simp add: fun_eq_iff elim: supE intro: supI1 supI2) qed -lemma eval_code [code]: "eval (Seq f) = member (f ())" +lemma eval_code [(* FIXME declare simp *)code]: "eval (Seq f) = member (f ())" unfolding Seq_def by (rule sym, rule eval_member) lemma single_code [code]: @@ -1017,6 +1021,42 @@ end; *} +text {* Conversion from and to sets *} + +definition pred_of_set :: "'a set \ 'a pred" where + "pred_of_set = Pred \ (\A x. x \ A)" + +lemma eval_pred_of_set [simp]: + "eval (pred_of_set A) x \ x \A" + by (simp add: pred_of_set_def) + +definition set_of_pred :: "'a pred \ 'a set" where + "set_of_pred = Collect \ eval" + +lemma member_set_of_pred [simp]: + "x \ set_of_pred P \ Predicate.eval P x" + by (simp add: set_of_pred_def) + +definition set_of_seq :: "'a seq \ 'a set" where + "set_of_seq = set_of_pred \ pred_of_seq" + +lemma member_set_of_seq [simp]: + "x \ set_of_seq xq = Predicate.member xq x" + by (simp add: set_of_seq_def eval_member) + +lemma of_pred_code [code]: + "set_of_pred (Predicate.Seq f) = (case f () of + Predicate.Empty \ {} + | Predicate.Insert x P \ insert x (set_of_pred P) + | Predicate.Join P xq \ set_of_pred P \ set_of_seq xq)" + by (auto split: seq.split simp add: eval_code) + +lemma of_seq_code [code]: + "set_of_seq Predicate.Empty = {}" + "set_of_seq (Predicate.Insert x P) = insert x (set_of_pred P)" + "set_of_seq (Predicate.Join P xq) = set_of_pred P \ set_of_seq xq" + by auto + no_notation bot ("\") and top ("\") and