533 next |
533 next |
534 case (Suc m) |
534 case (Suc m) |
535 have nSuc: "n = Suc m" by fact |
535 have nSuc: "n = Suc m" by fact |
536 have mlessn: "m<n" by (simp add: nSuc) |
536 have mlessn: "m<n" by (simp add: nSuc) |
537 from aA obtain k where hkeq: "h k = a" and klessn: "k<n" by (blast elim!: equalityE) |
537 from aA obtain k where hkeq: "h k = a" and klessn: "k<n" by (blast elim!: equalityE) |
538 let ?hm = "swap k m h" |
538 let ?hm = "Fun.swap k m h" |
539 have inj_hm: "inj_on ?hm {i. i < n}" using klessn mlessn |
539 have inj_hm: "inj_on ?hm {i. i < n}" using klessn mlessn |
540 by (simp add: inj_on_swap_iff inj_on) |
540 by (simp add: inj_on_swap_iff inj_on) |
541 show ?thesis |
541 show ?thesis |
542 proof (intro exI conjI) |
542 proof (intro exI conjI) |
543 show "inj_on ?hm {i. i < m}" using inj_hm |
543 show "inj_on ?hm {i. i < m}" using inj_hm |
544 by (auto simp add: nSuc less_Suc_eq intro: subset_inj_on) |
544 by (auto simp add: nSuc less_Suc_eq intro: subset_inj_on) |
545 show "m<n" by (rule mlessn) |
545 show "m<n" by (rule mlessn) |
546 show "A = ?hm ` {i. i < m}" |
546 show "A = ?hm ` {i. i < m}" |
547 proof (rule insert_image_inj_on_eq) |
547 proof (rule insert_image_inj_on_eq) |
548 show "inj_on (swap k m h) {i. i < Suc m}" using inj_hm nSuc by simp |
548 show "inj_on (Fun.swap k m h) {i. i < Suc m}" using inj_hm nSuc by simp |
549 show "?hm m \<notin> A" by (simp add: swap_def hkeq anot) |
549 show "?hm m \<notin> A" by (simp add: swap_def hkeq anot) |
550 show "insert (?hm m) A = ?hm ` {i. i < Suc m}" |
550 show "insert (?hm m) A = ?hm ` {i. i < Suc m}" |
551 using aA hkeq nSuc klessn |
551 using aA hkeq nSuc klessn |
552 by (auto simp add: swap_def image_less_Suc fun_upd_image |
552 by (auto simp add: swap_def image_less_Suc fun_upd_image |
553 less_Suc_eq inj_on_image_set_diff [OF inj_on]) |
553 less_Suc_eq inj_on_image_set_diff [OF inj_on]) |