src/HOL/Fun.thy
changeset 15510 9de204d7b699
parent 15439 71c0f98e31f1
child 15531 08c8dad8e399
equal deleted inserted replaced
15509:c54970704285 15510:9de204d7b699
     4     Copyright   1994  University of Cambridge
     4     Copyright   1994  University of Cambridge
     5 
     5 
     6 Notions about functions.
     6 Notions about functions.
     7 *)
     7 *)
     8 
     8 
     9 theory Fun 
     9 theory Fun
    10 imports Typedef
    10 imports Typedef
    11 begin
    11 begin
    12 
    12 
    13 instance set :: (type) order
    13 instance set :: (type) order
    14   by (intro_classes,
    14   by (intro_classes,
    91 
    91 
    92 text{*The Identity Function: @{term id}*}
    92 text{*The Identity Function: @{term id}*}
    93 lemma id_apply [simp]: "id x = x"
    93 lemma id_apply [simp]: "id x = x"
    94 by (simp add: id_def)
    94 by (simp add: id_def)
    95 
    95 
       
    96 lemma inj_on_id: "inj_on id A"
       
    97 by (simp add: inj_on_def) 
       
    98 
       
    99 lemma surj_id: "surj id"
       
   100 by (simp add: surj_def) 
       
   101 
       
   102 lemma bij_id: "bij id"
       
   103 by (simp add: bij_def inj_on_id surj_id) 
       
   104 
       
   105 
    96 
   106 
    97 subsection{*The Composition Operator: @{term "f \<circ> g"}*}
   107 subsection{*The Composition Operator: @{term "f \<circ> g"}*}
    98 
   108 
    99 lemma o_apply [simp]: "(f o g) x = f (g x)"
   109 lemma o_apply [simp]: "(f o g) x = f (g x)"
   100 by (simp add: comp_def)
   110 by (simp add: comp_def)
   376 by (rule ext, auto)
   386 by (rule ext, auto)
   377 
   387 
   378 lemma inj_on_fun_updI: "\<lbrakk> inj_on f A; y \<notin> f`A \<rbrakk> \<Longrightarrow> inj_on (f(x:=y)) A"
   388 lemma inj_on_fun_updI: "\<lbrakk> inj_on f A; y \<notin> f`A \<rbrakk> \<Longrightarrow> inj_on (f(x:=y)) A"
   379 by(fastsimp simp:inj_on_def image_def)
   389 by(fastsimp simp:inj_on_def image_def)
   380 
   390 
       
   391 lemma fun_upd_image:
       
   392      "f(x:=y) ` A = (if x \<in> A then insert y (f ` (A-{x})) else f ` A)"
       
   393 by auto
       
   394 
   381 subsection{* overwrite *}
   395 subsection{* overwrite *}
   382 
   396 
   383 lemma overwrite_emptyset[simp]: "f(g|{}) = f"
   397 lemma overwrite_emptyset[simp]: "f(g|{}) = f"
   384 by(simp add:overwrite_def)
   398 by(simp add:overwrite_def)
   385 
   399 
   386 lemma overwrite_apply_notin[simp]: "a ~: A ==> (f(g|A)) a = f a"
   400 lemma overwrite_apply_notin[simp]: "a ~: A ==> (f(g|A)) a = f a"
   387 by(simp add:overwrite_def)
   401 by(simp add:overwrite_def)
   388 
   402 
   389 lemma overwrite_apply_in[simp]: "a : A ==> (f(g|A)) a = g a"
   403 lemma overwrite_apply_in[simp]: "a : A ==> (f(g|A)) a = g a"
   390 by(simp add:overwrite_def)
   404 by(simp add:overwrite_def)
       
   405 
       
   406 subsection{* swap *}
       
   407 
       
   408 constdefs
       
   409   swap :: "['a, 'a, 'a => 'b] => ('a => 'b)"
       
   410    "swap a b f == f(a := f b, b:= f a)"
       
   411 
       
   412 lemma swap_self: "swap a a f = f"
       
   413 by (simp add: swap_def) 
       
   414 
       
   415 lemma swap_commute: "swap a b f = swap b a f"
       
   416 by (rule ext, simp add: fun_upd_def swap_def)
       
   417 
       
   418 lemma swap_nilpotent [simp]: "swap a b (swap a b f) = f"
       
   419 by (rule ext, simp add: fun_upd_def swap_def)
       
   420 
       
   421 lemma inj_on_imp_inj_on_swap:
       
   422      "[|inj_on f A; a \<in> A; b \<in> A|] ==> inj_on (swap a b f) A"
       
   423 by (simp add: inj_on_def swap_def, blast)
       
   424 
       
   425 lemma inj_on_swap_iff [simp]:
       
   426   assumes A: "a \<in> A" "b \<in> A" shows "inj_on (swap a b f) A = inj_on f A"
       
   427 proof 
       
   428   assume "inj_on (swap a b f) A"
       
   429   with A have "inj_on (swap a b (swap a b f)) A" 
       
   430     by (rules intro: inj_on_imp_inj_on_swap) 
       
   431   thus "inj_on f A" by simp 
       
   432 next
       
   433   assume "inj_on f A"
       
   434   with A show "inj_on (swap a b f) A" by (rules intro: inj_on_imp_inj_on_swap)
       
   435 qed
       
   436 
       
   437 lemma surj_imp_surj_swap: "surj f ==> surj (swap a b f)"
       
   438 apply (simp add: surj_def swap_def, clarify)
       
   439 apply (rule_tac P = "y = f b" in case_split_thm, blast)
       
   440 apply (rule_tac P = "y = f a" in case_split_thm, auto)
       
   441   --{*We don't yet have @{text case_tac}*}
       
   442 done
       
   443 
       
   444 lemma surj_swap_iff [simp]: "surj (swap a b f) = surj f"
       
   445 proof 
       
   446   assume "surj (swap a b f)"
       
   447   hence "surj (swap a b (swap a b f))" by (rule surj_imp_surj_swap) 
       
   448   thus "surj f" by simp 
       
   449 next
       
   450   assume "surj f"
       
   451   thus "surj (swap a b f)" by (rule surj_imp_surj_swap) 
       
   452 qed
       
   453 
       
   454 lemma bij_swap_iff: "bij (swap a b f) = bij f"
       
   455 by (simp add: bij_def)
       
   456  
   391 
   457 
   392 text{*The ML section includes some compatibility bindings and a simproc
   458 text{*The ML section includes some compatibility bindings and a simproc
   393 for function updates, in addition to the usual ML-bindings of theorems.*}
   459 for function updates, in addition to the usual ML-bindings of theorems.*}
   394 ML
   460 ML
   395 {*
   461 {*