src/HOL/NatDef.ML
changeset 5354 da63d9b35caf
parent 5316 7a8975451a89
child 5474 a2109bb8ce2b
equal deleted inserted replaced
5353:0526ade4a23b 5354:da63d9b35caf
   173 
   173 
   174 Goal "n<m ==> m ~= (n::nat)";
   174 Goal "n<m ==> m ~= (n::nat)";
   175 by (blast_tac (claset() addSEs [less_irrefl]) 1);
   175 by (blast_tac (claset() addSEs [less_irrefl]) 1);
   176 qed "less_not_refl2";
   176 qed "less_not_refl2";
   177 
   177 
       
   178 (* s < t ==> s ~= t *)
       
   179 bind_thm ("less_not_refl3", less_not_refl2 RS not_sym);
       
   180 
   178 
   181 
   179 val major::prems = Goalw [less_def, pred_nat_def]
   182 val major::prems = Goalw [less_def, pred_nat_def]
   180     "[| i<k;  k=Suc(i) ==> P;  !!j. [| i<j;  k=Suc(j) |] ==> P \
   183     "[| i<k;  k=Suc(i) ==> P;  !!j. [| i<j;  k=Suc(j) |] ==> P \
   181 \    |] ==> P";
   184 \    |] ==> P";
   182 by (rtac (major RS tranclE) 1);
   185 by (rtac (major RS tranclE) 1);
   401 
   404 
   402 Goalw [le_def] "m < n ==> m <= (n::nat)";
   405 Goalw [le_def] "m < n ==> m <= (n::nat)";
   403 by (blast_tac (claset() addEs [less_asym]) 1);
   406 by (blast_tac (claset() addEs [less_asym]) 1);
   404 qed "less_imp_le";
   407 qed "less_imp_le";
   405 
   408 
       
   409 
   406 (** Equivalence of m<=n and  m<n | m=n **)
   410 (** Equivalence of m<=n and  m<n | m=n **)
   407 
   411 
   408 Goalw [le_def] "m <= n ==> m < n | m=(n::nat)";
   412 Goalw [le_def] "m <= n ==> m < n | m=(n::nat)";
   409 by (cut_facts_tac [less_linear] 1);
   413 by (cut_facts_tac [less_linear] 1);
   410 by (blast_tac (claset() addEs [less_irrefl,less_asym]) 1);
   414 by (blast_tac (claset() addEs [less_irrefl,less_asym]) 1);
   423 bind_thm ("eq_imp_le", disjI2 RS less_or_eq_imp_le);
   427 bind_thm ("eq_imp_le", disjI2 RS less_or_eq_imp_le);
   424 
   428 
   425 Goal "n <= (n::nat)";
   429 Goal "n <= (n::nat)";
   426 by (simp_tac (simpset() addsimps [le_eq_less_or_eq]) 1);
   430 by (simp_tac (simpset() addsimps [le_eq_less_or_eq]) 1);
   427 qed "le_refl";
   431 qed "le_refl";
       
   432 
       
   433 (*Obvious ways of proving m<=n; 
       
   434   adding these rules to claset might be risky*)
       
   435 Addsimps [le_refl, less_imp_le];
       
   436 
   428 
   437 
   429 Goal "[| i <= j; j < k |] ==> i < (k::nat)";
   438 Goal "[| i <= j; j < k |] ==> i < (k::nat)";
   430 by (blast_tac (claset() addSDs [le_imp_less_or_eq]
   439 by (blast_tac (claset() addSDs [le_imp_less_or_eq]
   431 	                addIs [less_trans]) 1);
   440 	                addIs [less_trans]) 1);
   432 qed "le_less_trans";
   441 qed "le_less_trans";
   456 (* Axiom 'order_le_less' of class 'order': *)
   465 (* Axiom 'order_le_less' of class 'order': *)
   457 Goal "(m::nat) < n = (m <= n & m ~= n)";
   466 Goal "(m::nat) < n = (m <= n & m ~= n)";
   458 by (simp_tac (simpset() addsimps [le_def, nat_neq_iff]) 1);
   467 by (simp_tac (simpset() addsimps [le_def, nat_neq_iff]) 1);
   459 by (blast_tac (claset() addSEs [less_asym]) 1);
   468 by (blast_tac (claset() addSEs [less_asym]) 1);
   460 qed "nat_less_le";
   469 qed "nat_less_le";
       
   470 
       
   471 (* [| m <= n; m ~= n |] ==> m < n *)
       
   472 bind_thm ("le_neq_implies_less", [nat_less_le, conjI] MRS iffD2);
   461 
   473 
   462 (* Axiom 'linorder_linear' of class 'linorder': *)
   474 (* Axiom 'linorder_linear' of class 'linorder': *)
   463 Goal "(m::nat) <= n | n <= m";
   475 Goal "(m::nat) <= n | n <= m";
   464 by (simp_tac (simpset() addsimps [le_eq_less_or_eq]) 1);
   476 by (simp_tac (simpset() addsimps [le_eq_less_or_eq]) 1);
   465 by (cut_facts_tac [less_linear] 1);
   477 by (cut_facts_tac [less_linear] 1);
   466 by (Blast_tac 1);
   478 by (Blast_tac 1);
   467 qed "nat_le_linear";
   479 qed "nat_le_linear";
   468 
   480 
       
   481 Goal "~ n < m ==> (n < Suc m) = (n = m)";
       
   482 by (blast_tac (claset() addSEs [less_SucE]) 1);
       
   483 qed "not_less_less_Suc_eq";
       
   484 
       
   485 
       
   486 (*Rewrite (n < Suc m) to (n=m) if  ~ n<m or m<=n hold.
       
   487   Not suitable as default simprules because they often lead to looping*)
       
   488 val not_less_simps = [not_less_less_Suc_eq, leD RS not_less_less_Suc_eq];
   469 
   489 
   470 (** max
   490 (** max
   471 
   491 
   472 Goalw [max_def] "!!z::nat. (z <= max x y) = (z <= x | z <= y)";
   492 Goalw [max_def] "!!z::nat. (z <= max x y) = (z <= x | z <= y)";
   473 by (simp_tac (simpset() addsimps [not_le_iff_less]) 1);
   493 by (simp_tac (simpset() addsimps [not_le_iff_less]) 1);