565 declare divmod_algorithm_code [where ?'a = integer, |
565 declare divmod_algorithm_code [where ?'a = integer, |
566 folded integer_of_num_def, unfolded integer_of_num_triv, |
566 folded integer_of_num_def, unfolded integer_of_num_triv, |
567 code] |
567 code] |
568 |
568 |
569 lemma divmod_abs_code [code]: |
569 lemma divmod_abs_code [code]: |
|
570 "divmod_abs 0 j = (0, 0)" |
|
571 "divmod_abs j 0 = (0, \<bar>j\<bar>)" |
570 "divmod_abs (Pos k) (Pos l) = divmod k l" |
572 "divmod_abs (Pos k) (Pos l) = divmod k l" |
|
573 "divmod_abs (Pos k) (Neg l) = divmod k l" |
|
574 "divmod_abs (Neg k) (Pos l) = divmod k l" |
571 "divmod_abs (Neg k) (Neg l) = divmod k l" |
575 "divmod_abs (Neg k) (Neg l) = divmod k l" |
572 "divmod_abs (Neg k) (Pos l) = divmod k l" |
|
573 "divmod_abs (Pos k) (Neg l) = divmod k l" |
|
574 "divmod_abs j 0 = (0, \<bar>j\<bar>)" |
|
575 "divmod_abs 0 j = (0, 0)" |
|
576 by (simp_all add: prod_eq_iff) |
576 by (simp_all add: prod_eq_iff) |
577 |
577 |
578 lemma divmod_integer_eq_cases: |
578 lemma divmod_integer_eq_cases: |
579 "divmod_integer k l = |
579 "divmod_integer k l = |
580 (if k = 0 then (0, 0) else if l = 0 then (0, k) else |
580 (if k = 0 then (0, 0) else if l = 0 then (0, k) else |
618 context |
618 context |
619 includes bit_operations_syntax |
619 includes bit_operations_syntax |
620 begin |
620 begin |
621 |
621 |
622 lemma and_integer_code [code]: |
622 lemma and_integer_code [code]: |
|
623 \<open>0 AND k = 0\<close> |
|
624 \<open>k AND 0 = 0\<close> |
|
625 \<open>Neg Num.One AND k = k\<close> |
|
626 \<open>k AND Neg Num.One = k\<close> |
623 \<open>Pos Num.One AND Pos Num.One = Pos Num.One\<close> |
627 \<open>Pos Num.One AND Pos Num.One = Pos Num.One\<close> |
624 \<open>Pos Num.One AND Pos (Num.Bit0 n) = 0\<close> |
628 \<open>Pos Num.One AND Pos (Num.Bit0 n) = 0\<close> |
625 \<open>Pos (Num.Bit0 m) AND Pos Num.One = 0\<close> |
629 \<open>Pos (Num.Bit0 m) AND Pos Num.One = 0\<close> |
626 \<open>Pos Num.One AND Pos (Num.Bit1 n) = Pos Num.One\<close> |
630 \<open>Pos Num.One AND Pos (Num.Bit1 n) = Pos Num.One\<close> |
627 \<open>Pos (Num.Bit1 m) AND Pos Num.One = Pos Num.One\<close> |
631 \<open>Pos (Num.Bit1 m) AND Pos Num.One = Pos Num.One\<close> |
632 \<open>Pos m AND Neg (num.Bit0 n) = (case and_not_num m (Num.BitM n) of None \<Rightarrow> 0 | Some n' \<Rightarrow> Pos n')\<close> |
636 \<open>Pos m AND Neg (num.Bit0 n) = (case and_not_num m (Num.BitM n) of None \<Rightarrow> 0 | Some n' \<Rightarrow> Pos n')\<close> |
633 \<open>Neg (num.Bit0 m) AND Pos n = (case and_not_num n (Num.BitM m) of None \<Rightarrow> 0 | Some n' \<Rightarrow> Pos n')\<close> |
637 \<open>Neg (num.Bit0 m) AND Pos n = (case and_not_num n (Num.BitM m) of None \<Rightarrow> 0 | Some n' \<Rightarrow> Pos n')\<close> |
634 \<open>Pos m AND Neg (num.Bit1 n) = (case and_not_num m (Num.Bit0 n) of None \<Rightarrow> 0 | Some n' \<Rightarrow> Pos n')\<close> |
638 \<open>Pos m AND Neg (num.Bit1 n) = (case and_not_num m (Num.Bit0 n) of None \<Rightarrow> 0 | Some n' \<Rightarrow> Pos n')\<close> |
635 \<open>Neg (num.Bit1 m) AND Pos n = (case and_not_num n (Num.Bit0 m) of None \<Rightarrow> 0 | Some n' \<Rightarrow> Pos n')\<close> |
639 \<open>Neg (num.Bit1 m) AND Pos n = (case and_not_num n (Num.Bit0 m) of None \<Rightarrow> 0 | Some n' \<Rightarrow> Pos n')\<close> |
636 \<open>Neg m AND Neg n = NOT (sub m Num.One OR sub n Num.One)\<close> |
640 \<open>Neg m AND Neg n = NOT (sub m Num.One OR sub n Num.One)\<close> |
637 \<open>Neg Num.One AND k = k\<close> |
|
638 \<open>k AND Neg Num.One = k\<close> |
|
639 \<open>0 AND k = 0\<close> |
|
640 \<open>k AND 0 = 0\<close> |
|
641 for k :: integer |
641 for k :: integer |
642 by (transfer; simp)+ |
642 by (transfer; simp)+ |
643 |
643 |
644 lemma or_integer_code [code]: |
644 lemma or_integer_code [code]: |
|
645 \<open>0 OR k = k\<close> |
|
646 \<open>k OR 0 = k\<close> |
|
647 \<open>Neg Num.One OR k = Neg Num.One\<close> |
|
648 \<open>k OR Neg Num.One = Neg Num.One\<close> |
645 \<open>Pos Num.One OR Pos Num.One = Pos Num.One\<close> |
649 \<open>Pos Num.One OR Pos Num.One = Pos Num.One\<close> |
646 \<open>Pos Num.One OR Pos (Num.Bit0 n) = Pos (Num.Bit1 n)\<close> |
650 \<open>Pos Num.One OR Pos (Num.Bit0 n) = Pos (Num.Bit1 n)\<close> |
647 \<open>Pos (Num.Bit0 m) OR Pos Num.One = Pos (Num.Bit1 m)\<close> |
651 \<open>Pos (Num.Bit0 m) OR Pos Num.One = Pos (Num.Bit1 m)\<close> |
648 \<open>Pos Num.One OR Pos (Num.Bit1 n) = Pos (Num.Bit1 n)\<close> |
652 \<open>Pos Num.One OR Pos (Num.Bit1 n) = Pos (Num.Bit1 n)\<close> |
649 \<open>Pos (Num.Bit1 m) OR Pos Num.One = Pos (Num.Bit1 m)\<close> |
653 \<open>Pos (Num.Bit1 m) OR Pos Num.One = Pos (Num.Bit1 m)\<close> |
654 \<open>Pos m OR Neg (num.Bit0 n) = Neg (or_not_num_neg m (Num.BitM n))\<close> |
658 \<open>Pos m OR Neg (num.Bit0 n) = Neg (or_not_num_neg m (Num.BitM n))\<close> |
655 \<open>Neg (num.Bit0 m) OR Pos n = Neg (or_not_num_neg n (Num.BitM m))\<close> |
659 \<open>Neg (num.Bit0 m) OR Pos n = Neg (or_not_num_neg n (Num.BitM m))\<close> |
656 \<open>Pos m OR Neg (num.Bit1 n) = Neg (or_not_num_neg m (Num.Bit0 n))\<close> |
660 \<open>Pos m OR Neg (num.Bit1 n) = Neg (or_not_num_neg m (Num.Bit0 n))\<close> |
657 \<open>Neg (num.Bit1 m) OR Pos n = Neg (or_not_num_neg n (Num.Bit0 m))\<close> |
661 \<open>Neg (num.Bit1 m) OR Pos n = Neg (or_not_num_neg n (Num.Bit0 m))\<close> |
658 \<open>Neg m OR Neg n = NOT (sub m Num.One AND sub n Num.One)\<close> |
662 \<open>Neg m OR Neg n = NOT (sub m Num.One AND sub n Num.One)\<close> |
659 \<open>Neg Num.One OR k = Neg Num.One\<close> |
|
660 \<open>k OR Neg Num.One = Neg Num.One\<close> |
|
661 \<open>0 OR k = k\<close> |
|
662 \<open>k OR 0 = k\<close> |
|
663 for k :: integer |
663 for k :: integer |
664 by (transfer; simp)+ |
664 by (transfer; simp)+ |
665 |
665 |
666 lemma xor_integer_code [code]: |
666 lemma xor_integer_code [code]: |
|
667 \<open>0 XOR k = k\<close> |
|
668 \<open>k XOR 0 = k\<close> |
|
669 \<open>Neg Num.One XOR k = NOT k\<close> |
|
670 \<open>k XOR Neg Num.One = NOT k\<close> |
|
671 \<open>Neg m XOR k = NOT (sub m num.One XOR k)\<close> |
|
672 \<open>k XOR Neg n = NOT (k XOR (sub n num.One))\<close> |
667 \<open>Pos Num.One XOR Pos Num.One = 0\<close> |
673 \<open>Pos Num.One XOR Pos Num.One = 0\<close> |
668 \<open>Pos Num.One XOR numeral (Num.Bit0 n) = Pos (Num.Bit1 n)\<close> |
674 \<open>Pos Num.One XOR Pos (Num.Bit0 n) = Pos (Num.Bit1 n)\<close> |
669 \<open>Pos (Num.Bit0 m) XOR Pos Num.One = Pos (Num.Bit1 m)\<close> |
675 \<open>Pos (Num.Bit0 m) XOR Pos Num.One = Pos (Num.Bit1 m)\<close> |
670 \<open>Pos Num.One XOR numeral (Num.Bit1 n) = Pos (Num.Bit0 n)\<close> |
676 \<open>Pos Num.One XOR Pos (Num.Bit1 n) = Pos (Num.Bit0 n)\<close> |
671 \<open>Pos (Num.Bit1 m) XOR Pos Num.One = Pos (Num.Bit0 m)\<close> |
677 \<open>Pos (Num.Bit1 m) XOR Pos Num.One = Pos (Num.Bit0 m)\<close> |
672 \<open>Pos (Num.Bit0 m) XOR Pos (Num.Bit0 n) = dup (Pos m XOR Pos n)\<close> |
678 \<open>Pos (Num.Bit0 m) XOR Pos (Num.Bit0 n) = dup (Pos m XOR Pos n)\<close> |
673 \<open>Pos (Num.Bit0 m) XOR Pos (Num.Bit1 n) = Pos Num.One + dup (Pos m XOR Pos n)\<close> |
679 \<open>Pos (Num.Bit0 m) XOR Pos (Num.Bit1 n) = Pos Num.One + dup (Pos m XOR Pos n)\<close> |
674 \<open>Pos (Num.Bit1 m) XOR Pos (Num.Bit0 n) = Pos Num.One + dup (Pos m XOR Pos n)\<close> |
680 \<open>Pos (Num.Bit1 m) XOR Pos (Num.Bit0 n) = Pos Num.One + dup (Pos m XOR Pos n)\<close> |
675 \<open>Pos (Num.Bit1 m) XOR Pos (Num.Bit1 n) = dup (Pos m XOR Pos n)\<close> |
681 \<open>Pos (Num.Bit1 m) XOR Pos (Num.Bit1 n) = dup (Pos m XOR Pos n)\<close> |
676 \<open>Neg Num.One XOR k = NOT k\<close> |
|
677 \<open>k XOR Neg Num.One = NOT k\<close> |
|
678 \<open>Neg m XOR k = NOT (sub m num.One XOR k)\<close> |
|
679 \<open>k XOR Neg n = NOT (k XOR (sub n num.One))\<close> |
|
680 \<open>0 XOR k = k\<close> |
|
681 \<open>k XOR 0 = k\<close> |
|
682 for k :: integer |
682 for k :: integer |
683 by (transfer; simp)+ |
683 by (transfer; simp)+ |
684 |
684 |
685 lemma [code]: |
685 lemma [code]: |
686 \<open>NOT k = - k - 1\<close> for k :: integer |
686 \<open>NOT k = - k - 1\<close> for k :: integer |