src/HOL/Nat.ML
changeset 972 e61b058d58d2
parent 962 136308504cd9
child 1024 b86042000035
equal deleted inserted replaced
971:f4815812665b 972:e61b058d58d2
   134 	               addEs [make_elim Suc_inject, Suc_neq_Zero]) 1);
   134 	               addEs [make_elim Suc_inject, Suc_neq_Zero]) 1);
   135 qed "nat_case_Suc";
   135 qed "nat_case_Suc";
   136 
   136 
   137 (** Introduction rules for 'pred_nat' **)
   137 (** Introduction rules for 'pred_nat' **)
   138 
   138 
   139 goalw Nat.thy [pred_nat_def] "<n, Suc(n)> : pred_nat";
   139 goalw Nat.thy [pred_nat_def] "(n, Suc(n)) : pred_nat";
   140 by (fast_tac set_cs 1);
   140 by (fast_tac set_cs 1);
   141 qed "pred_natI";
   141 qed "pred_natI";
   142 
   142 
   143 val major::prems = goalw Nat.thy [pred_nat_def]
   143 val major::prems = goalw Nat.thy [pred_nat_def]
   144     "[| p : pred_nat;  !!x n. [| p = <n, Suc(n)> |] ==> R \
   144     "[| p : pred_nat;  !!x n. [| p = (n, Suc(n)) |] ==> R \
   145 \    |] ==> R";
   145 \    |] ==> R";
   146 by (rtac (major RS CollectE) 1);
   146 by (rtac (major RS CollectE) 1);
   147 by (REPEAT (eresolve_tac ([asm_rl,exE]@prems) 1));
   147 by (REPEAT (eresolve_tac ([asm_rl,exE]@prems) 1));
   148 qed "pred_natE";
   148 qed "pred_natE";
   149 
   149 
   202 
   202 
   203 goalw Nat.thy [less_def] "n < Suc(n)";
   203 goalw Nat.thy [less_def] "n < Suc(n)";
   204 by (rtac (pred_natI RS r_into_trancl) 1);
   204 by (rtac (pred_natI RS r_into_trancl) 1);
   205 qed "lessI";
   205 qed "lessI";
   206 
   206 
   207 (* i<j ==> i<Suc(j) *)
   207 (* i(j ==> i(Suc(j) *)
   208 val less_SucI = lessI RSN (2, less_trans);
   208 val less_SucI = lessI RSN (2, less_trans);
   209 
   209 
   210 goal Nat.thy "0 < Suc(n)";
   210 goal Nat.thy "0 < Suc(n)";
   211 by (nat_ind_tac "n" 1);
   211 by (nat_ind_tac "n" 1);
   212 by (rtac lessI 1);
   212 by (rtac lessI 1);
   218 
   218 
   219 val prems = goalw Nat.thy [less_def] "n<m ==> ~ m<(n::nat)";
   219 val prems = goalw Nat.thy [less_def] "n<m ==> ~ m<(n::nat)";
   220 by(fast_tac (HOL_cs addIs ([wf_pred_nat, wf_trancl RS wf_asym]@prems))1);
   220 by(fast_tac (HOL_cs addIs ([wf_pred_nat, wf_trancl RS wf_asym]@prems))1);
   221 qed "less_not_sym";
   221 qed "less_not_sym";
   222 
   222 
   223 (* [| n<m; m<n |] ==> R *)
   223 (* [| n(m; m(n |] ==> R *)
   224 bind_thm ("less_asym", (less_not_sym RS notE));
   224 bind_thm ("less_asym", (less_not_sym RS notE));
   225 
   225 
   226 goalw Nat.thy [less_def] "~ n<(n::nat)";
   226 goalw Nat.thy [less_def] "~ n<(n::nat)";
   227 by (rtac notI 1);
   227 by (rtac notI 1);
   228 by (etac (wf_pred_nat RS wf_trancl RS wf_anti_refl) 1);
   228 by (etac (wf_pred_nat RS wf_trancl RS wf_anti_refl) 1);
   229 qed "less_not_refl";
   229 qed "less_not_refl";
   230 
   230 
   231 (* n<n ==> R *)
   231 (* n(n ==> R *)
   232 bind_thm ("less_anti_refl", (less_not_refl RS notE));
   232 bind_thm ("less_anti_refl", (less_not_refl RS notE));
   233 
   233 
   234 goal Nat.thy "!!m. n<m ==> m ~= (n::nat)";
   234 goal Nat.thy "!!m. n<m ==> m ~= (n::nat)";
   235 by(fast_tac (HOL_cs addEs [less_anti_refl]) 1);
   235 by(fast_tac (HOL_cs addEs [less_anti_refl]) 1);
   236 qed "less_not_refl2";
   236 qed "less_not_refl2";