Rats, floor

theory prob10 imports Complex_Main "~~/src/HOL/Number_Theory/Primes" begin

lemma for_a:
  fixes a b :: real and c m n :: int
  assumes "0 < a" and "0 < b" and "1 / a + 1 / b = 1"
  assumes "c <= m * a" and "m * a < c + 1"
  assumes "c <= n * b" and "n * b < c + 1"
  shows "c = m * a"
proof (rule ccontr)
  assume "c ≠ m * a"
  hence "c * (1 / a) < m ∧ m < (c + 1) * (1 / a) ∧ 
c * (1 / b) <= n ∧ n < (c + 1) * (1 / b)" 
    using assms by (simp add: field_simps)
  hence "c * (1 / a + 1 / b) < m + n ∧ m + n < (c + 1) * (1 / a + 1 / b)" 
    by (simp add: algebra_simps)
  hence "c < m + n ∧ m + n < c + 1"
    using assms by simp
  thus "False"
    by auto
qed

theorem prob10:
  fixes a b :: real and m n :: int
  assumes "0 < a" and "0 < b" and "1 / a + 1 / b = 1"
  assumes "¬(a ∈ Rats)" and "¬(b ∈ Rats)"
  assumes "m ≠ 0 ∨ n ≠ 0"  
  shows "floor (m * a) ≠ floor (n * b)" (is "¬ ?P")
proof
  assume ?P
  then obtain c where "(c::int) <= m * a ∧ m * a < c + 1 ∧ c <= n * b ∧ n * b < c + 1"
    using real_of_int_floor_add_one_gt real_of_int_floor_le by metis
  with for_a assms have "c = m * a ∧ c = n * b"
    by auto
  with assms have "a = c / m ∨ b = c / n"
    by auto
  hence "a ∈ Rats ∨ b ∈ Rats"
    using real_eq_of_int by auto
  thus False
    using assms by auto
qed

end