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 {* |