src/HOL/Set_Interval.thy
changeset 71535 b612edee9b0c
parent 71472 c213d067e60f
child 71699 8e5c20e4e11a
equal deleted inserted replaced
71534:f10bffaa2bae 71535:b612edee9b0c
  2070 
  2070 
  2071 context unique_euclidean_semiring_with_bit_shifts
  2071 context unique_euclidean_semiring_with_bit_shifts
  2072 begin
  2072 begin
  2073 
  2073 
  2074 lemma take_bit_sum:
  2074 lemma take_bit_sum:
  2075   "take_bit n a = (\<Sum>k = 0..<n. push_bit k (of_bool (odd (drop_bit k a))))"
  2075   "take_bit n a = (\<Sum>k = 0..<n. push_bit k (of_bool (bit a k)))"
  2076   for n :: nat
  2076   for n :: nat
  2077 proof (induction n arbitrary: a)
  2077 proof (induction n arbitrary: a)
  2078   case 0
  2078   case 0
  2079   then show ?case
  2079   then show ?case
  2080     by simp
  2080     by simp
  2081 next
  2081 next
  2082   case (Suc n)
  2082   case (Suc n)
  2083   have "(\<Sum>k = 0..<Suc n. push_bit k (of_bool (odd (drop_bit k a)))) = 
  2083   have "(\<Sum>k = 0..<Suc n. push_bit k (of_bool (bit a k))) = 
  2084     of_bool (odd a) + (\<Sum>k = Suc 0..<Suc n. push_bit k (of_bool (odd (drop_bit k a))))"
  2084     of_bool (odd a) + (\<Sum>k = Suc 0..<Suc n. push_bit k (of_bool (bit a k)))"
  2085     by (simp add: sum.atLeast_Suc_lessThan ac_simps)
  2085     by (simp add: sum.atLeast_Suc_lessThan ac_simps)
  2086   also have "(\<Sum>k = Suc 0..<Suc n. push_bit k (of_bool (odd (drop_bit k a))))
  2086   also have "(\<Sum>k = Suc 0..<Suc n. push_bit k (of_bool (bit a k)))
  2087     = (\<Sum>k = 0..<n. push_bit k (of_bool (odd (drop_bit k (a div 2))))) * 2"
  2087     = (\<Sum>k = 0..<n. push_bit k (of_bool (bit (a div 2) k))) * 2"
  2088     by (simp only: sum.atLeast_Suc_lessThan_Suc_shift) (simp add: sum_distrib_right push_bit_double)
  2088     by (simp only: sum.atLeast_Suc_lessThan_Suc_shift) (simp add: sum_distrib_right push_bit_double drop_bit_Suc bit_Suc)
  2089   finally show ?case
  2089   finally show ?case
  2090     using Suc [of "a div 2"] by (simp add: ac_simps)
  2090     using Suc [of "a div 2"] by (simp add: ac_simps take_bit_Suc)
  2091 qed
  2091 qed
  2092 
  2092 
  2093 end
  2093 end
  2094 
  2094 
  2095 
  2095