375 by (eresolve_tac prems 1); |
375 by (eresolve_tac prems 1); |
376 qed "less_induct"; |
376 qed "less_induct"; |
377 |
377 |
378 qed_goal "nat_induct2" thy |
378 qed_goal "nat_induct2" thy |
379 "[| P 0; P 1; !!k. P k ==> P (Suc (Suc k)) |] ==> P n" (fn prems => [ |
379 "[| P 0; P 1; !!k. P k ==> P (Suc (Suc k)) |] ==> P n" (fn prems => [ |
380 cut_facts_tac prems 1, |
380 cut_facts_tac prems 1, |
381 rtac less_induct 1, |
381 rtac less_induct 1, |
382 res_inst_tac [("n","n")] natE 1, |
382 res_inst_tac [("n","n")] natE 1, |
383 hyp_subst_tac 1, |
383 hyp_subst_tac 1, |
384 atac 1, |
384 atac 1, |
385 hyp_subst_tac 1, |
385 hyp_subst_tac 1, |
386 res_inst_tac [("n","x")] natE 1, |
386 res_inst_tac [("n","x")] natE 1, |
387 hyp_subst_tac 1, |
387 hyp_subst_tac 1, |
388 atac 1, |
388 atac 1, |
389 hyp_subst_tac 1, |
389 hyp_subst_tac 1, |
390 resolve_tac prems 1, |
390 resolve_tac prems 1, |
391 dtac spec 1, |
391 dtac spec 1, |
392 etac mp 1, |
392 etac mp 1, |
393 rtac (lessI RS less_trans) 1, |
393 rtac (lessI RS less_trans) 1, |
394 rtac (lessI RS Suc_mono) 1]); |
394 rtac (lessI RS Suc_mono) 1]); |
395 |
395 |
396 (*** Properties of <= ***) |
396 (*** Properties of <= ***) |
397 |
397 |
398 goalw thy [le_def] "(m <= n) = (m < Suc n)"; |
398 goalw thy [le_def] "(m <= n) = (m < Suc n)"; |
399 by (rtac not_less_eq 1); |
399 by (rtac not_less_eq 1); |
519 by (blast_tac (!claset addIs [less_trans]) 1); |
519 by (blast_tac (!claset addIs [less_trans]) 1); |
520 qed "less_le_trans"; |
520 qed "less_le_trans"; |
521 |
521 |
522 goal thy "!!i. [| i <= j; j <= k |] ==> i <= (k::nat)"; |
522 goal thy "!!i. [| i <= j; j <= k |] ==> i <= (k::nat)"; |
523 by (EVERY1[dtac le_imp_less_or_eq, |
523 by (EVERY1[dtac le_imp_less_or_eq, |
524 dtac le_imp_less_or_eq, |
524 dtac le_imp_less_or_eq, |
525 rtac less_or_eq_imp_le, |
525 rtac less_or_eq_imp_le, |
526 blast_tac (!claset addIs [less_trans])]); |
526 blast_tac (!claset addIs [less_trans])]); |
527 qed "le_trans"; |
527 qed "le_trans"; |
528 |
528 |
529 goal thy "!!m. [| m <= n; n <= m |] ==> m = (n::nat)"; |
529 goal thy "!!m. [| m <= n; n <= m |] ==> m = (n::nat)"; |
530 by (EVERY1[dtac le_imp_less_or_eq, |
530 by (EVERY1[dtac le_imp_less_or_eq, |
531 dtac le_imp_less_or_eq, |
531 dtac le_imp_less_or_eq, |
532 blast_tac (!claset addEs [less_irrefl,less_asym])]); |
532 blast_tac (!claset addEs [less_irrefl,less_asym])]); |
533 qed "le_anti_sym"; |
533 qed "le_anti_sym"; |
534 |
534 |
535 goal thy "(Suc(n) <= Suc(m)) = (n <= m)"; |
535 goal thy "(Suc(n) <= Suc(m)) = (n <= m)"; |
536 by (simp_tac (!simpset addsimps [le_eq_less_or_eq]) 1); |
536 by (simp_tac (!simpset addsimps [le_eq_less_or_eq]) 1); |
537 qed "Suc_le_mono"; |
537 qed "Suc_le_mono"; |
538 |
538 |
539 AddIffs [Suc_le_mono]; |
539 AddIffs [Suc_le_mono]; |
540 |
540 |
541 (* Axiom 'order_le_less' of class 'order': *) |
541 (* Axiom 'order_le_less' of class 'order': *) |
542 goal thy "(m::nat) < n = (m <= n & m ~= n)"; |
542 goal thy "(m::nat) < n = (m <= n & m ~= n)"; |
543 br iffI 1; |
543 by (rtac iffI 1); |
544 br conjI 1; |
544 by (rtac conjI 1); |
545 be less_imp_le 1; |
545 by (etac less_imp_le 1); |
546 be (less_not_refl2 RS not_sym) 1; |
546 by (etac (less_not_refl2 RS not_sym) 1); |
547 by(blast_tac (!claset addSDs [le_imp_less_or_eq]) 1); |
547 by (blast_tac (!claset addSDs [le_imp_less_or_eq]) 1); |
548 qed "nat_less_le"; |
548 qed "nat_less_le"; |
549 |
549 |
550 (** LEAST -- the least number operator **) |
550 (** LEAST -- the least number operator **) |
551 |
551 |
552 val [prem1,prem2] = goalw thy [Least_def] |
552 val [prem1,prem2] = goalw thy [Least_def] |