# HG changeset patch # User haftmann # Date 1581444237 -3600 # Node ID d45495e897f4c2040a93335c68fc4fad78e85ab6 # Parent 4e66867fd63fc23c4bfd5d247134297b291061e2 more instances diff -r 4e66867fd63f -r d45495e897f4 src/HOL/ex/Bit_Operations.thy --- a/src/HOL/ex/Bit_Operations.thy Tue Feb 11 19:03:56 2020 +0100 +++ b/src/HOL/ex/Bit_Operations.thy Tue Feb 11 19:03:57 2020 +0100 @@ -530,4 +530,84 @@ end + +subsubsection \Instances for \<^typ>\integer\ and \<^typ>\natural\\ + +unbundle integer.lifting natural.lifting + +context + includes lifting_syntax +begin + +lemma transfer_rule_bit_integer [transfer_rule]: + \((pcr_integer :: int \ integer \ bool) ===> (=)) bit bit\ + by (unfold bit_def) transfer_prover + +lemma transfer_rule_bit_natural [transfer_rule]: + \((pcr_natural :: nat \ natural \ bool) ===> (=)) bit bit\ + by (unfold bit_def) transfer_prover + end + +instantiation integer :: ring_bit_operations +begin + +lift_definition not_integer :: \integer \ integer\ + is not . + +lift_definition and_integer :: \integer \ integer \ integer\ + is \and\ . + +lift_definition or_integer :: \integer \ integer \ integer\ + is or . + +lift_definition xor_integer :: \integer \ integer \ integer\ + is xor . + +instance proof + fix k l :: \integer\ and n :: nat + show \- k = NOT (k - 1)\ + by transfer (simp add: minus_eq_not_minus_1) + show \bit (NOT k) n \ (2 :: integer) ^ n \ 0 \ \ bit k n\ + by transfer (fact bit_not_iff) + show \bit (k AND l) n \ bit k n \ bit l n\ + by transfer (fact and_int.bit_eq_iff) + show \bit (k OR l) n \ bit k n \ bit l n\ + by transfer (fact or_int.bit_eq_iff) + show \bit (k XOR l) n \ bit k n \ bit l n\ + by transfer (fact xor_int.bit_eq_iff) +qed + +end + +instantiation natural :: semiring_bit_operations +begin + +lift_definition and_natural :: \natural \ natural \ natural\ + is \and\ . + +lift_definition or_natural :: \natural \ natural \ natural\ + is or . + +lift_definition xor_natural :: \natural \ natural \ natural\ + is xor . + +instance proof + fix m n :: \natural\ and q :: nat + show \bit (m AND n) q \ bit m q \ bit n q\ + by transfer (fact and_nat.bit_eq_iff) + show \bit (m OR n) q \ bit m q \ bit n q\ + by transfer (fact or_nat.bit_eq_iff) + show \bit (m XOR n) q \ bit m q \ bit n q\ + by transfer (fact xor_nat.bit_eq_iff) +qed + +end + +lifting_update integer.lifting +lifting_forget integer.lifting + +lifting_update natural.lifting +lifting_forget natural.lifting + +end