# File Lemmas.ML

    (*  Title:      HOLCF/IOA/ABP/Lemmas.ML
        ID:         $Id: Lemmas.ML,v 1.12 2005/09/03 14:50:23 wenzelm Exp $
        Author:     Olaf Müller
    *)

    (* Logic *)

    Goal "(~(A&B)) = ((~A)&B| ~B)";
    by (Fast_tac 1);
    qed "and_de_morgan_and_absorbe";

    Goal "(if C then A else B) --> (A|B)";
    by (stac split_if 1);
    by (Fast_tac 1);
    qed "bool_if_impl_or";

    Goal "(? x. x=P & Q(x)) = Q(P)";
    by (Fast_tac 1);
    qed"exis_elim";

    (* Sets *)

    val set_lemmas =
       map (fn s => prove_goal Main.thy s (fn _ => [Fast_tac 1]))
            ["f(x) : (UN x. {f(x)})",
             "f x y : (UN x y. {f x y})",
             "!!a. (!x. a ~= f(x)) ==> a ~: (UN x. {f(x)})",
             "!!a. (!x y. a ~= f x y) ==> a ~: (UN x y. {f x y})"];

    (* 2 Lemmas to add to set_lemmas ... , used also for action handling,
       namely for Intersections and the empty list (compatibility of IOA!)  *)
    Goal "(UN b.{x. x=f(b)})= (UN b.{f(b)})";
     by (rtac set_ext 1);
     by (Fast_tac 1);
    qed "singleton_set";

    Goal "((A|B)=False) = ((~A)&(~B))";
     by (Fast_tac 1);
    qed "de_morgan";

    (* Lists *)

    Goal "hd(l@m) = (if l~=[] then hd(l) else hd(m))";
    by (induct_tac "l" 1);
    by (Simp_tac 1);
    by (Simp_tac 1);
    qed "hd_append";

    Goal "l ~= [] --> (? x xs. l = (x#xs))";
     by (induct_tac "l" 1);
     by (Simp_tac 1);
     by (Fast_tac 1);
    qed"cons_not_nil";