ROSCOQ.MCmisc.BooleanAlgebra
Require Export MathClasses.theory.rings.
Require Export MathClasses.interfaces.abstract_algebra.
Require Import Ring.
Require Export MathClasses.interfaces.canonical_names.
Require Export MathClasses.interfaces.orders.
Require Export MathClasses.orders.rings.
Class BooleanAlgebra (A:Type) `{Ring A} :=
boolean_mult : ∀ x:A, x×x=x.
Section BooleanAlgebraNotations.
Context `{BooleanAlgebra R}.
Require Export SetNotations.
Global Instance BooleanAlgUnion : SetUnion R :=
λ (a b : R), a + b + a×b .
Global Instance BooleanAlgIntersection : SetIntersection R :=
mult.
Notation "b \ x " := (b + b × x) (at level 100).
Notation "x ᶜ " := (1 \ x) (at level 100).
End BooleanAlgebraNotations.
Section BooleanAlgebraProps.
Context `{BooleanAlgebra R}.
Add Ring stdlib_ring_theoryldsjfsd : (rings.stdlib_ring_theory R).
Lemma BooleanAlgebraXplusX : ∀ (x : R), x + x = 0.
Proof.
intros x.
pose proof (boolean_mult (x + x)) as Hs.
assert ((x + x) × (x + x) = 2 × (x × x + x × x)) as Hr by ring.
rewrite Hr in Hs. clear Hr.
rewrite boolean_mult in Hs.
apply equal_by_zero_sum in Hs.
ring_simplify in Hs.
ring_simplify.
assumption.
Qed.
Lemma BooleanAlgebraMinusX : ∀ (x : R), - x = x.
Proof.
intros x.
apply equal_by_zero_sum.
rewrite <- negate_plus_distr.
rewrite BooleanAlgebraXplusX.
ring.
Qed.
Lemma BooleanAlgebra1Max : ∀ (x : R), x ⊆ 1.
Proof.
intros x.
unfold setSubset.
unfold setIntersection, BooleanAlgIntersection.
ring.
Qed.
Lemma paperEq1 : ∀ (x y u v : R),
(x + y) + (u + v) ⊆ (x + u) ∪ (y + v).
Proof.
intros ? ? ? ?.
unfold setSubset.
unfold setUnion, BooleanAlgUnion.
unfold setIntersection, BooleanAlgIntersection.
ring_simplify.
ring_simplify.
rewrite BooleanAlgebraXplusX.
ring_simplify.
repeat (rewrite boolean_mult).
setoid_rewrite <- (mult_assoc u v v).
setoid_rewrite <- (mult_assoc x v v).
setoid_rewrite <- (mult_assoc y u u).
setoid_rewrite <- (mult_assoc x y y).
repeat (rewrite boolean_mult).
ring_simplify.
rewrite BooleanAlgebraXplusX.
ring.
Qed.
Lemma subsetUnionMeasure : ∀ a b: R,
a ⊆ b → (a ∪ b) = b.
Proof.
intros ? ? Hs.
unfold setSubset in Hs.
unfold setUnion, BooleanAlgUnion.
rewrite <- Hs.
assert (a + b + a= b + (a + a)) as Hr by ring.
rewrite Hr. clear Hr.
rewrite BooleanAlgebraXplusX.
ring.
Qed.
Lemma paperEq2 : ∀ (x y u v : R),
x×y + u×v ⊆ (x + u) ∪ (y + v).
Proof.
intros ? ? ? ?.
unfold setSubset.
unfold setUnion, BooleanAlgUnion.
unfold setIntersection, BooleanAlgIntersection.
ring_simplify.
ring_simplify.
rewrite BooleanAlgebraXplusX.
ring_simplify.
repeat (rewrite boolean_mult).
setoid_rewrite <- (mult_assoc u v v).
setoid_rewrite <- (mult_assoc x y y).
repeat (rewrite boolean_mult).
ring_simplify.
rewrite BooleanAlgebraXplusX.
ring_simplify.
setoid_rewrite <- (mult_assoc (x×u)).
repeat (rewrite boolean_mult).
ring_simplify.
rewrite BooleanAlgebraXplusX.
ring_simplify.
fold (plus).
fold (one).
ring_simplify.
rewrite plus_0_r.
rewrite mult_1_r.
rewrite mult_1_r.
reflexivity.
Qed.
End BooleanAlgebraProps.
Require Export MathClasses.interfaces.abstract_algebra.
Require Import Ring.
Require Export MathClasses.interfaces.canonical_names.
Require Export MathClasses.interfaces.orders.
Require Export MathClasses.orders.rings.
Class BooleanAlgebra (A:Type) `{Ring A} :=
boolean_mult : ∀ x:A, x×x=x.
Section BooleanAlgebraNotations.
Context `{BooleanAlgebra R}.
Require Export SetNotations.
Global Instance BooleanAlgUnion : SetUnion R :=
λ (a b : R), a + b + a×b .
Global Instance BooleanAlgIntersection : SetIntersection R :=
mult.
Notation "b \ x " := (b + b × x) (at level 100).
Notation "x ᶜ " := (1 \ x) (at level 100).
End BooleanAlgebraNotations.
Section BooleanAlgebraProps.
Context `{BooleanAlgebra R}.
Add Ring stdlib_ring_theoryldsjfsd : (rings.stdlib_ring_theory R).
Lemma BooleanAlgebraXplusX : ∀ (x : R), x + x = 0.
Proof.
intros x.
pose proof (boolean_mult (x + x)) as Hs.
assert ((x + x) × (x + x) = 2 × (x × x + x × x)) as Hr by ring.
rewrite Hr in Hs. clear Hr.
rewrite boolean_mult in Hs.
apply equal_by_zero_sum in Hs.
ring_simplify in Hs.
ring_simplify.
assumption.
Qed.
Lemma BooleanAlgebraMinusX : ∀ (x : R), - x = x.
Proof.
intros x.
apply equal_by_zero_sum.
rewrite <- negate_plus_distr.
rewrite BooleanAlgebraXplusX.
ring.
Qed.
Lemma BooleanAlgebra1Max : ∀ (x : R), x ⊆ 1.
Proof.
intros x.
unfold setSubset.
unfold setIntersection, BooleanAlgIntersection.
ring.
Qed.
Lemma paperEq1 : ∀ (x y u v : R),
(x + y) + (u + v) ⊆ (x + u) ∪ (y + v).
Proof.
intros ? ? ? ?.
unfold setSubset.
unfold setUnion, BooleanAlgUnion.
unfold setIntersection, BooleanAlgIntersection.
ring_simplify.
ring_simplify.
rewrite BooleanAlgebraXplusX.
ring_simplify.
repeat (rewrite boolean_mult).
setoid_rewrite <- (mult_assoc u v v).
setoid_rewrite <- (mult_assoc x v v).
setoid_rewrite <- (mult_assoc y u u).
setoid_rewrite <- (mult_assoc x y y).
repeat (rewrite boolean_mult).
ring_simplify.
rewrite BooleanAlgebraXplusX.
ring.
Qed.
Lemma subsetUnionMeasure : ∀ a b: R,
a ⊆ b → (a ∪ b) = b.
Proof.
intros ? ? Hs.
unfold setSubset in Hs.
unfold setUnion, BooleanAlgUnion.
rewrite <- Hs.
assert (a + b + a= b + (a + a)) as Hr by ring.
rewrite Hr. clear Hr.
rewrite BooleanAlgebraXplusX.
ring.
Qed.
Lemma paperEq2 : ∀ (x y u v : R),
x×y + u×v ⊆ (x + u) ∪ (y + v).
Proof.
intros ? ? ? ?.
unfold setSubset.
unfold setUnion, BooleanAlgUnion.
unfold setIntersection, BooleanAlgIntersection.
ring_simplify.
ring_simplify.
rewrite BooleanAlgebraXplusX.
ring_simplify.
repeat (rewrite boolean_mult).
setoid_rewrite <- (mult_assoc u v v).
setoid_rewrite <- (mult_assoc x y y).
repeat (rewrite boolean_mult).
ring_simplify.
rewrite BooleanAlgebraXplusX.
ring_simplify.
setoid_rewrite <- (mult_assoc (x×u)).
repeat (rewrite boolean_mult).
ring_simplify.
rewrite BooleanAlgebraXplusX.
ring_simplify.
fold (plus).
fold (one).
ring_simplify.
rewrite plus_0_r.
rewrite mult_1_r.
rewrite mult_1_r.
reflexivity.
Qed.
End BooleanAlgebraProps.