src/HOL/Code_Numeral.thy
changeset 82910 aa3b2d384736
parent 82774 2865a6618cba
child 82912 ad66fb23998a
equal deleted inserted replaced
82909:e4fae2227594 82910:aa3b2d384736
   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