1460 by (auto simp add: abs_mult_self trans [OF lcm_unique_int eq_commute, symmetric] zmult_eq_1_iff) |
1460 by (auto simp add: abs_mult_self trans [OF lcm_unique_int eq_commute, symmetric] zmult_eq_1_iff) |
1461 |
1461 |
1462 |
1462 |
1463 subsection {* The complete divisibility lattice *} |
1463 subsection {* The complete divisibility lattice *} |
1464 |
1464 |
|
1465 lemma semilattice_neutr_set_lcm_one_nat: |
|
1466 "semilattice_neutr_set lcm (1::nat)" |
|
1467 by default simp_all |
|
1468 |
1465 interpretation gcd_semilattice_nat: semilattice_inf gcd "op dvd" "(%m n::nat. m dvd n & ~ n dvd m)" |
1469 interpretation gcd_semilattice_nat: semilattice_inf gcd "op dvd" "(%m n::nat. m dvd n & ~ n dvd m)" |
1466 proof |
1470 proof |
1467 case goal3 thus ?case by(metis gcd_unique_nat) |
1471 case goal3 thus ?case by(metis gcd_unique_nat) |
1468 qed auto |
1472 qed auto |
1469 |
1473 |
1484 |
1488 |
1485 instantiation nat :: Gcd |
1489 instantiation nat :: Gcd |
1486 begin |
1490 begin |
1487 |
1491 |
1488 definition |
1492 definition |
1489 "Lcm (M::nat set) = (if finite M then Finite_Set.fold lcm 1 M else 0)" |
1493 "Lcm (M::nat set) = (if finite M then semilattice_neutr_set.F lcm 1 M else 0)" |
|
1494 |
|
1495 lemma Lcm_nat_infinite: |
|
1496 "\<not> finite M \<Longrightarrow> Lcm M = (0::nat)" |
|
1497 by (simp add: Lcm_nat_def) |
|
1498 |
|
1499 lemma Lcm_nat_empty: |
|
1500 "Lcm {} = (1::nat)" |
|
1501 proof - |
|
1502 interpret semilattice_neutr_set lcm "1::nat" |
|
1503 by (fact semilattice_neutr_set_lcm_one_nat) |
|
1504 show ?thesis by (simp add: Lcm_nat_def) |
|
1505 qed |
|
1506 |
|
1507 lemma Lcm_nat_insert: |
|
1508 "Lcm (insert n M) = lcm (n::nat) (Lcm M)" |
|
1509 proof (cases "finite M") |
|
1510 interpret semilattice_neutr_set lcm "1::nat" |
|
1511 by (fact semilattice_neutr_set_lcm_one_nat) |
|
1512 case True |
|
1513 then show ?thesis by (simp add: Lcm_nat_def) |
|
1514 next |
|
1515 case False then show ?thesis by (simp add: Lcm_nat_infinite) |
|
1516 qed |
1490 |
1517 |
1491 definition |
1518 definition |
1492 "Gcd (M::nat set) = Lcm {d. \<forall>m\<in>M. d dvd m}" |
1519 "Gcd (M::nat set) = Lcm {d. \<forall>m\<in>M. d dvd m}" |
1493 |
1520 |
1494 instance .. |
1521 instance .. |
|
1522 |
1495 end |
1523 end |
1496 |
1524 |
1497 lemma dvd_Lcm_nat [simp]: |
1525 lemma dvd_Lcm_nat [simp]: |
1498 fixes M :: "nat set" assumes "m \<in> M" shows "m dvd Lcm M" |
1526 fixes M :: "nat set" |
1499 using lcm_semilattice_nat.sup_le_fold_sup[OF _ assms, of 1] |
1527 assumes "m \<in> M" |
1500 by (simp add: Lcm_nat_def) |
1528 shows "m dvd Lcm M" |
|
1529 proof (cases "finite M") |
|
1530 case False then show ?thesis by (simp add: Lcm_nat_infinite) |
|
1531 next |
|
1532 case True then show ?thesis using assms by (induct M) (auto simp add: Lcm_nat_insert) |
|
1533 qed |
1501 |
1534 |
1502 lemma Lcm_dvd_nat [simp]: |
1535 lemma Lcm_dvd_nat [simp]: |
1503 fixes M :: "nat set" assumes "\<forall>m\<in>M. m dvd n" shows "Lcm M dvd n" |
1536 fixes M :: "nat set" |
|
1537 assumes "\<forall>m\<in>M. m dvd n" |
|
1538 shows "Lcm M dvd n" |
1504 proof (cases "n = 0") |
1539 proof (cases "n = 0") |
1505 assume "n \<noteq> 0" |
1540 assume "n \<noteq> 0" |
1506 hence "finite {d. d dvd n}" by (rule finite_divisors_nat) |
1541 hence "finite {d. d dvd n}" by (rule finite_divisors_nat) |
1507 moreover have "M \<subseteq> {d. d dvd n}" using assms by fast |
1542 moreover have "M \<subseteq> {d. d dvd n}" using assms by fast |
1508 ultimately have "finite M" by (rule rev_finite_subset) |
1543 ultimately have "finite M" by (rule rev_finite_subset) |
1509 thus ?thesis |
1544 then show ?thesis using assms by (induct M) (simp_all add: Lcm_nat_empty Lcm_nat_insert) |
1510 using lcm_semilattice_nat.fold_sup_le_sup [OF _ assms, of 1] |
|
1511 by (simp add: Lcm_nat_def) |
|
1512 qed simp |
1545 qed simp |
1513 |
1546 |
1514 interpretation gcd_lcm_complete_lattice_nat: |
1547 interpretation gcd_lcm_complete_lattice_nat: |
1515 complete_lattice Gcd Lcm gcd "op dvd" "%m n::nat. m dvd n & ~ n dvd m" lcm 1 0 |
1548 complete_lattice Gcd Lcm gcd "op dvd" "\<lambda>m n::nat. m dvd n \<and> \<not> n dvd m" lcm 1 0 |
1516 proof |
1549 proof |
1517 case goal1 show ?case by simp |
1550 case goal1 show ?case by simp |
1518 next |
1551 next |
1519 case goal2 show ?case by simp |
1552 case goal2 show ?case by simp |
1520 next |
1553 next |