src/HOL/NatDef.ML
changeset 5591 fbb4e1ac234d
parent 5500 7e0ed3e31590
child 5654 8b872d546b9e
equal deleted inserted replaced
5590:477fc12adceb 5591:fbb4e1ac234d
   381 
   381 
   382 Goal "(Suc m <= n) = (m < n)";
   382 Goal "(Suc m <= n) = (m < n)";
   383 by (blast_tac (claset() addIs [Suc_leI, Suc_le_lessD]) 1);
   383 by (blast_tac (claset() addIs [Suc_leI, Suc_le_lessD]) 1);
   384 qed "Suc_le_eq";
   384 qed "Suc_le_eq";
   385 
   385 
   386 (*For instance, (Suc m < Suc n)  =   (Suc m <= n)  =  (m<n) *)
       
   387 val le_simps = [less_Suc_eq_le, Suc_le_eq];
       
   388 
       
   389 
       
   390 Goalw [le_def] "m <= n ==> m <= Suc n";
   386 Goalw [le_def] "m <= n ==> m <= Suc n";
   391 by (blast_tac (claset() addDs [Suc_lessD]) 1);
   387 by (blast_tac (claset() addDs [Suc_lessD]) 1);
   392 qed "le_SucI";
   388 qed "le_SucI";
   393 Addsimps[le_SucI];
   389 Addsimps[le_SucI];
   394 
   390 
   396 
   392 
   397 Goalw [le_def] "m < n ==> m <= (n::nat)";
   393 Goalw [le_def] "m < n ==> m <= (n::nat)";
   398 by (blast_tac (claset() addEs [less_asym]) 1);
   394 by (blast_tac (claset() addEs [less_asym]) 1);
   399 qed "less_imp_le";
   395 qed "less_imp_le";
   400 
   396 
       
   397 (*For instance, (Suc m < Suc n)  =   (Suc m <= n)  =  (m<n) *)
       
   398 val le_simps = [less_imp_le, less_Suc_eq_le, Suc_le_eq];
       
   399 
   401 
   400 
   402 (** Equivalence of m<=n and  m<n | m=n **)
   401 (** Equivalence of m<=n and  m<n | m=n **)
   403 
   402 
   404 Goalw [le_def] "m <= n ==> m < n | m=(n::nat)";
   403 Goalw [le_def] "m <= n ==> m < n | m=(n::nat)";
   405 by (cut_facts_tac [less_linear] 1);
   404 by (cut_facts_tac [less_linear] 1);
   419 bind_thm ("eq_imp_le", disjI2 RS less_or_eq_imp_le);
   418 bind_thm ("eq_imp_le", disjI2 RS less_or_eq_imp_le);
   420 
   419 
   421 Goal "n <= (n::nat)";
   420 Goal "n <= (n::nat)";
   422 by (simp_tac (simpset() addsimps [le_eq_less_or_eq]) 1);
   421 by (simp_tac (simpset() addsimps [le_eq_less_or_eq]) 1);
   423 qed "le_refl";
   422 qed "le_refl";
   424 AddSIs [le_refl];
   423 
   425 
   424 AddIffs [le_refl];
   426 (*Obvious ways of proving m<=n; 
       
   427   adding these rules to claset might be risky*)
       
   428 Addsimps [le_refl, less_imp_le];
       
   429 
   425 
   430 
   426 
   431 Goal "[| i <= j; j < k |] ==> i < (k::nat)";
   427 Goal "[| i <= j; j < k |] ==> i < (k::nat)";
   432 by (blast_tac (claset() addSDs [le_imp_less_or_eq]
   428 by (blast_tac (claset() addSDs [le_imp_less_or_eq]
   433 	                addIs [less_trans]) 1);
   429 	                addIs [less_trans]) 1);