src/HOL/GCD.thy
changeset 51489 f738e6dbd844
parent 49962 a8cc904a6820
child 51547 604d73671fa7
equal deleted inserted replaced
51488:3c886fe611b8 51489:f738e6dbd844
  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