src/ZF/ex/Limit.ML
changeset 9548 15bee2731e43
parent 9495 af1fd424941e
child 11316 b4e71bd751e4
equal deleted inserted replaced
9547:8dad21f06b24 9548:15bee2731e43
  1343 Goalw [e_less_def]  (* e_less_eq *)
  1343 Goalw [e_less_def]  (* e_less_eq *)
  1344     "m:nat ==> e_less(DD,ee,m,m) = id(set(DD`m))";
  1344     "m:nat ==> e_less(DD,ee,m,m) = id(set(DD`m))";
  1345 by (asm_simp_tac (simpset() addsimps[diff_self_eq_0]) 1);
  1345 by (asm_simp_tac (simpset() addsimps[diff_self_eq_0]) 1);
  1346 qed "e_less_eq";
  1346 qed "e_less_eq";
  1347  
  1347  
  1348 (* ARITH_CONV proves the following in HOL. Would like something similar 
       
  1349    in Isabelle/ZF. *)
       
  1350 
       
  1351 Goal "succ(m#+n)#-m = succ(natify(n))";
  1348 Goal "succ(m#+n)#-m = succ(natify(n))";
  1352 by (asm_simp_tac
  1349 by (Asm_simp_tac 1);
  1353     (simpset() delsimps [add_succ_right]
       
  1354 	       addsimps [add_succ_right RS sym, diff_add_inverse]) 1);
       
  1355 val lemma_succ_sub = result();
  1350 val lemma_succ_sub = result();
  1356 
  1351 
  1357 Goalw [e_less_def]
  1352 Goalw [e_less_def]
  1358      "e_less(DD,ee,m,succ(m#+k)) = (ee`(m#+k))O(e_less(DD,ee,m,m#+k))";
  1353      "e_less(DD,ee,m,succ(m#+k)) = (ee`(m#+k))O(e_less(DD,ee,m,m#+k))";
  1359 by (asm_simp_tac (simpset() addsimps [lemma_succ_sub,diff_add_inverse]) 1);
  1354 by (asm_simp_tac (simpset() addsimps [lemma_succ_sub,diff_add_inverse]) 1);
  1362 Goal "n:nat ==> succ(n) = n #+ 1";
  1357 Goal "n:nat ==> succ(n) = n #+ 1";
  1363 by (Asm_simp_tac 1);
  1358 by (Asm_simp_tac 1);
  1364 qed "add1";
  1359 qed "add1";
  1365 
  1360 
  1366 Goal "[| m le n; n: nat |] ==> EX k: nat. n = m #+ k";
  1361 Goal "[| m le n; n: nat |] ==> EX k: nat. n = m #+ k";
  1367 by (dtac less_imp_Suc_add 1);
  1362 by (dtac less_imp_succ_add 1);
  1368 by Auto_tac;  
  1363 by Auto_tac;  
  1369 val lemma_le_exists = result();
  1364 val lemma_le_exists = result();
  1370 
  1365 
  1371 val prems = Goal
  1366 val prems = Goal
  1372     "[| m le n;  !!x. [|n=m#+x; x:nat|] ==> Q;  n:nat |] ==> Q";
  1367     "[| m le n;  !!x. [|n=m#+x; x:nat|] ==> Q;  n:nat |] ==> Q";
  1723 by (asm_simp_tac(simpset() addsimps 
  1718 by (asm_simp_tac(simpset() addsimps 
  1724     [eps_e_gr_add,eps_e_less,add_le_self,add_le_mono]) 1);
  1719     [eps_e_gr_add,eps_e_less,add_le_self,add_le_mono]) 1);
  1725 by (auto_tac (claset() addIs [e_gr_e_less_split_add], simpset()));
  1720 by (auto_tac (claset() addIs [e_gr_e_less_split_add], simpset()));
  1726 qed "eps_split_add_right_rev";
  1721 qed "eps_split_add_right_rev";
  1727 
  1722 
  1728 (* Arithmetic, little support in Isabelle/ZF. *)
  1723 (* Arithmetic *)
  1729 
  1724 
  1730 val [prem1,prem2,prem3,prem4] = Goal
  1725 val [prem1,prem2,prem3,prem4] = Goal
  1731     "[| n le k; k le m;  \
  1726     "[| n le k; k le m;  \
  1732 \       !!p q. [|p le q; k=n#+p; m=n#+q; p:nat; q:nat|] ==> R; \
  1727 \       !!p q. [|p le q; k=n#+p; m=n#+q; p:nat; q:nat|] ==> R; \
  1733 \       m:nat |]==>R";
  1728 \       m:nat |]==>R";
  1734 by (rtac (prem1 RS le_exists) 1);
  1729 by (rtac (prem1 RS le_exists) 1);
  1735 by (simp_tac (simpset() addsimps [prem2 RS lt_nat_in_nat, prem4]) 2);
  1730 by (simp_tac (simpset() addsimps [prem2 RS lt_nat_in_nat, prem4]) 2);
  1736 by (rtac ([prem1,prem2] MRS le_trans RS le_exists) 1);
  1731 by (rtac ([prem1,prem2] MRS le_trans RS le_exists) 1);
       
  1732 by (rtac prem4 2);
  1737 by (rtac prem3 1);
  1733 by (rtac prem3 1);
  1738 by (assume_tac 2);
  1734 by (assume_tac 2);
  1739 by (assume_tac 2);
  1735 by (assume_tac 2);
  1740 by (cut_facts_tac [prem1,prem2] 1);
  1736 by (cut_facts_tac [prem1,prem2] 1);
  1741 by (Asm_full_simp_tac 1);
  1737 by Auto_tac;
  1742 by (etac add_le_elim1 1);
       
  1743 by (REPEAT (ares_tac prems 1));
       
  1744 qed "le_exists_lemma";
  1738 qed "le_exists_lemma";
  1745 
  1739 
  1746 Goal  (* eps_split_left_le *)
  1740 Goal  (* eps_split_left_le *)
  1747     "[|m le k; k le n; emb_chain(DD,ee); m:nat; n:nat; k:nat|] ==>  \
  1741     "[|m le k; k le n; emb_chain(DD,ee); m:nat; n:nat; k:nat|] ==>  \
  1748 \    eps(DD,ee,m,n) = eps(DD,ee,k,n) O eps(DD,ee,m,k)";
  1742 \    eps(DD,ee,m,n) = eps(DD,ee,k,n) O eps(DD,ee,m,k)";