src/HOL/NatDef.ML
changeset 3023 01364e2f30ad
parent 2935 998cb95fdd43
child 3040 7d48671753da
equal deleted inserted replaced
3022:7ffe67afeb94 3023:01364e2f30ad
   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]