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)"; |