lh-l4v/lib/Word_Lib_l4v/More_Bit_Ring.thy

136 lines
3.9 KiB
Plaintext

(*
* Copyright 2023, Proofcraft Pty Ltd
*
* SPDX-License-Identifier: BSD-2-Clause
*)
theory More_Bit_Ring
imports Main
begin
(* Additional equalities on semiring_bit_operations and ring_bit_operations, in particular
relationships between Boolean and arithmetic operations. *)
context semiring_bit_operations
begin
context
includes bit_operations_syntax
begin
lemma disjunctive_add2:
"(x AND y) = 0 \<Longrightarrow> x + y = x OR y"
by (metis disjunctive_add bit_0_eq bit_and_iff bot_apply bot_bool_def)
end
end
context ring_bit_operations
begin
context
includes bit_operations_syntax
begin
lemma not_xor_is_eqv:
"NOT (x XOR y) = (x AND y) OR (NOT x AND NOT y)"
by (simp add: bit.xor_def bit.disj_conj_distrib or.commute)
lemma not_xor_eq_xor_not:
"(NOT x) XOR y = x XOR (NOT y)"
by simp
lemma not_minus:
"NOT (x - y) = y - x - 1"
by (simp add: not_eq_complement)
lemma minus_not_eq_plus_1:
"- NOT x = x + 1"
by (simp add: minus_eq_not_plus_1)
lemma not_minus_eq_minus_1:
"NOT (- x) = x - 1"
by (simp add: not_eq_complement)
lemma and_plus_not_and:
"(x AND y) + (x AND NOT y) = x"
by (metis and.left_commute and.right_neutral bit.conj_cancel_right bit.conj_disj_distrib
bit.conj_zero_right bit.disj_cancel_right disjunctive_add2)
lemma or_eq_and_not_plus:
"x OR y = (x AND NOT y) + y"
by (simp add: and.assoc bit.disj_conj_distrib2 disjunctive_add2)
lemma and_eq_not_or_minus:
"x AND y = (NOT x OR y) - NOT x"
by (metis and.idem and_eq_not_not_or eq_diff_eq or.commute or.idem or_eq_and_not_plus)
lemma and_not_eq_or_minus:
"x AND NOT y = (x OR y) - y"
by (simp add: or_eq_and_not_plus)
lemma and_not_eq_minus_and:
"x AND NOT y = x - (x AND y)"
by (simp add: add.commute eq_diff_eq and_plus_not_and)
lemma or_minus_eq_minus_and:
"(x OR y) - y = x - (x AND y)"
by (metis and_not_eq_minus_and and_not_eq_or_minus)
lemma plus_eq_and_or:
"x + y = (x OR y) + (x AND y)"
using add_commute local.add.semigroup_axioms or_eq_and_not_plus semigroup.assoc
by (fastforce simp: and_plus_not_and)
lemma xor_eq_or_minus_and:
"x XOR y = (x OR y) - (x AND y)"
by (metis (no_types) bit.de_Morgan_conj bit.xor_def2 bit_and_iff bit_or_iff disjunctive_diff)
lemma not_xor_eq_and_plus_not_or:
"NOT (x XOR y) = (x AND y) + NOT (x OR y)"
by (metis (no_types, lifting) not_diff_distrib add.commute bit.de_Morgan_conj bit.xor_def2
bit_and_iff bit_or_iff disjunctive_diff)
lemma not_xor_eq_and_minus_or:
"NOT (x XOR y) = (x AND y) - (x OR y) - 1"
by (metis not_diff_distrib add.commute minus_diff_eq not_minus_eq_minus_1 not_xor_eq_and_plus_not_or)
lemma plus_eq_xor_plus_carry:
"x + y = (x XOR y) + 2 * (x AND y)"
by (metis plus_eq_and_or add.commute add.left_commute diff_add_cancel mult_2 xor_eq_or_minus_and)
lemma plus_eq_or_minus_xor:
"x + y = 2 * (x OR y) - (x XOR y)"
by (metis add_diff_cancel_left' diff_diff_eq2 local.mult_2 plus_eq_and_or xor_eq_or_minus_and)
lemma plus_eq_minus_neg:
"x + y = x - NOT y - 1"
using add_commute local.not_diff_distrib not_minus
by auto
lemma minus_eq_plus_neg:
"x - y = x + NOT y + 1"
by (simp add: add.semigroup_axioms diff_conv_add_uminus minus_eq_not_plus_1 semigroup.assoc)
lemma minus_eq_and_not_minus_not_and:
"x - y = (x AND NOT y) - (NOT x AND y)"
by (metis bit.de_Morgan_conj bit.double_compl not_diff_distrib plus_eq_and_or)
lemma minus_eq_xor_minus_not_and:
"x - y = (x XOR y) - 2 * (NOT x AND y)"
by (metis (no_types) bit.compl_eq_compl_iff bit.xor_compl_left not_diff_distrib
plus_eq_xor_plus_carry)
lemma minus_eq_and_not_minus_xor:
"x - y = 2 * (x AND NOT y) - (x XOR y)"
by (metis and.commute minus_diff_eq minus_eq_xor_minus_not_and xor.commute)
lemma and_one_neq_simps[simp]:
"x AND 1 \<noteq> 0 \<longleftrightarrow> x AND 1 = 1"
"x AND 1 \<noteq> 1 \<longleftrightarrow> x AND 1 = 0"
by (clarsimp simp: and_one_eq)+
end
end
end