# mathlibdocumentation

order.boolean_algebra

# (Generalized) Boolean algebras #

A Boolean algebra is a bounded distributive lattice with a complement operator. Boolean algebras generalize the (classical) logic of propositions and the lattice of subsets of a set.

Generalized Boolean algebras may be less familiar, but they are essentially Boolean algebras which do not necessarily have a top element (⊤) (and hence not all elements may have complements). One example in mathlib is finset α, the type of all finite subsets of an arbitrary (not-necessarily-finite) type α.

generalized_boolean_algebra α is defined to be a distributive lattice with bottom (⊥) admitting a relative complement operator, written using "set difference" notation as x \ y (sdiff x y). For convenience, the boolean_algebra type class is defined to extend generalized_boolean_algebra so that it is also bundled with a \ operator.

(A terminological point: x \ y is the complement of y relative to the interval [⊥, x]. We do not yet have relative complements for arbitrary intervals, as we do not even have lattice intervals.)

## Main declarations #

• generalized_boolean_algebra: a type class for generalized Boolean algebras
• boolean_algebra: a type class for Boolean algebras.
• Prop.boolean_algebra: the Boolean algebra instance on Prop

## Implementation notes #

The sup_inf_sdiff and inf_inf_sdiff axioms for the relative complement operator in generalized_boolean_algebra are taken from Wikipedia.

Stone's paper introducing generalized Boolean algebras does not define a relative complement operator a \ b for all a, b. Instead, the postulates there amount to an assumption that for all a, b : α where a ≤ b, the equations x ⊔ a = b and x ⊓ a = ⊥ have a solution x. disjoint.sdiff_unique proves that this x is in fact b \ a.

## Tags #

generalized Boolean algebras, Boolean algebras, lattices, sdiff, compl

### Generalized Boolean algebras #

Some of the lemmas in this section are from:

@[instance]
@[class]
structure generalized_boolean_algebra (α : Type u) :
Type u
• sup : α → α → α
• le : α → α → Prop
• lt : α → α → Prop
• le_refl : ∀ (a : α), a a
• le_trans : ∀ (a b c : α), a bb ca c
• lt_iff_le_not_le : (∀ (a b : α), a < b a b ¬b a) . "order_laws_tac"
• le_antisymm : ∀ (a b : α), a bb aa = b
• le_sup_left : ∀ (a b : α), a a b
• le_sup_right : ∀ (a b : α), b a b
• sup_le : ∀ (a b c : α), a cb ca b c
• inf : α → α → α
• inf_le_left : ∀ (a b : α), a b a
• inf_le_right : ∀ (a b : α), a b b
• le_inf : ∀ (a b c : α), a ba ca b c
• le_sup_inf : ∀ (x y z : α), (x y) (x z) x y z
• sdiff : α → α → α
• bot : α
• sup_inf_sdiff : ∀ (a b : α), a b a \ b = a
• inf_inf_sdiff : ∀ (a b : α), a b a \ b =

A generalized Boolean algebra is a distributive lattice with ⊥ and a relative complement operation \ (called sdiff, after "set difference") satisfying (a ⊓ b) ⊔ (a \ b) = a and (a ⊓ b) ⊓ (a \ b) = ⊥, i.e. a \ b is the complement of b in a.

This is a generalization of Boolean algebras which applies to finset α for arbitrary (not-necessarily-fintype) α.

Instances of this typeclass
Instances of other typeclasses for generalized_boolean_algebra
• generalized_boolean_algebra.has_sizeof_inst
@[instance]
@[simp]
theorem sup_inf_sdiff {α : Type u} (x y : α) :
x y x \ y = x
@[simp]
theorem inf_inf_sdiff {α : Type u} (x y : α) :
x y x \ y =
@[simp]
theorem sup_sdiff_inf {α : Type u} (x y : α) :
x \ y x y = x
@[simp]
theorem inf_sdiff_inf {α : Type u} (x y : α) :
x \ y (x y) =
@[protected, instance]
Equations
theorem disjoint_inf_sdiff {α : Type u} {x y : α}  :
disjoint (x y) (x \ y)
theorem sdiff_unique {α : Type u} {x y z : α} (s : x y z = x) (i : x y z = ) :
x \ y = z
theorem sdiff_le' {α : Type u} {x y : α}  :
x \ y x
theorem inf_sdiff_right {α : Type u} {x y : α}  :
x x \ y = x \ y
theorem inf_sdiff_left {α : Type u} {x y : α}  :
x \ y x = x \ y
@[simp]
theorem sup_sdiff_self_right {α : Type u} {x y : α}  :
x y \ x = x y
@[simp]
theorem sup_sdiff_self_left {α : Type u} {x y : α}  :
y \ x x = y x
theorem sup_sdiff_symm {α : Type u} {x y : α}  :
x y \ x = y x \ y
theorem sup_sdiff_cancel_right {α : Type u} {x y : α} (h : x y) :
x y \ x = y
theorem sdiff_sup_cancel {α : Type u} {x y : α} (h : y x) :
x \ y y = x
theorem sup_le_of_le_sdiff_left {α : Type u} {x y z : α} (h : y z \ x) (hxz : x z) :
x y z
theorem sup_le_of_le_sdiff_right {α : Type u} {x y z : α} (h : x z \ y) (hyz : y z) :
x y z
@[simp]
theorem sup_sdiff_left {α : Type u} {x y : α}  :
x x \ y = x
theorem sup_sdiff_right {α : Type u} {x y : α}  :
x \ y x = x
@[simp]
theorem sdiff_inf_sdiff {α : Type u} {x y : α}  :
x \ y y \ x =
theorem disjoint_sdiff_sdiff {α : Type u} {x y : α}  :
disjoint (x \ y) (y \ x)
@[simp]
theorem inf_sdiff_self_right {α : Type u} {x y : α}  :
x y \ x =
@[simp]
theorem inf_sdiff_self_left {α : Type u} {x y : α}  :
y \ x x =
@[protected, instance]
Equations
theorem disjoint_sdiff_self_left {α : Type u} {x y : α}  :
disjoint (y \ x) x
theorem disjoint_sdiff_self_right {α : Type u} {x y : α}  :
(y \ x)
theorem disjoint.sdiff_eq_of_sup_eq {α : Type u} {x y z : α} (hi : z) (hs : x z = y) :
y \ x = z
theorem disjoint.sup_sdiff_cancel_left {α : Type u} {x y : α} (h : y) :
(x y) \ x = y
theorem disjoint.sup_sdiff_cancel_right {α : Type u} {x y : α} (h : y) :
(x y) \ y = x
@[protected]
theorem disjoint.sdiff_unique {α : Type u} {x y z : α} (hd : z) (hz : z y) (hs : y x z) :
y \ x = z
theorem disjoint_sdiff_iff_le {α : Type u} {x y z : α} (hz : z y) (hx : x y) :
(y \ x) z x
theorem le_iff_disjoint_sdiff {α : Type u} {x y z : α} (hz : z y) (hx : x y) :
z x (y \ x)
theorem inf_sdiff_eq_bot_iff {α : Type u} {x y z : α} (hz : z y) (hx : x y) :
z y \ x = z x
theorem le_iff_eq_sup_sdiff {α : Type u} {x y z : α} (hz : z y) (hx : x y) :
x z y = z y \ x
theorem sup_sdiff_eq_sup {α : Type u} {x y z : α} (h : z x) :
x y \ z = x y
theorem sup_sdiff_cancel' {α : Type u} {x y z : α} (hx : x z) (hz : z y) :
z y \ x = y
theorem sdiff_sup {α : Type u} {x y z : α}  :
y \ (x z) = y \ x y \ z
theorem sdiff_eq_sdiff_iff_inf_eq_inf {α : Type u} {x y z : α}  :
y \ x = y \ z y x = y z
theorem disjoint.sdiff_eq_left {α : Type u} {x y : α} (h : y) :
x \ y = x
theorem disjoint.sdiff_eq_right {α : Type u} {x y : α} (h : y) :
y \ x = y
theorem sdiff_eq_self_iff_disjoint {α : Type u} {x y : α}  :
x \ y = x x
theorem sdiff_eq_self_iff_disjoint' {α : Type u} {x y : α}  :
x \ y = x y
theorem sdiff_lt {α : Type u} {x y : α} (hx : y x) (hy : y ) :
x \ y < x
theorem sdiff_sdiff_le {α : Type u} {x y : α}  :
x \ (x \ y) y
theorem sdiff_triangle {α : Type u} (x y z : α) :
x \ z x \ y y \ z
@[simp]
theorem le_sdiff_iff {α : Type u} {x y : α}  :
x y \ x x =
theorem sdiff_lt_sdiff_right {α : Type u} {x y z : α} (h : x < y) (hz : z x) :
x \ z < y \ z
theorem sup_inf_inf_sdiff {α : Type u} {x y z : α}  :
x y z y \ z = x y y \ z
@[simp]
theorem inf_sdiff_sup_left {α : Type u} {x y z : α}  :
x \ z (x y) = x \ z
@[simp]
theorem inf_sdiff_sup_right {α : Type u} {x y z : α}  :
x \ z (y x) = x \ z
theorem sdiff_sdiff_right {α : Type u} {x y z : α}  :
x \ (y \ z) = x \ y x y z
theorem sdiff_sdiff_right' {α : Type u} {x y z : α}  :
x \ (y \ z) = x \ y x z
theorem sdiff_sdiff_eq_sdiff_sup {α : Type u} {x y z : α} (h : z x) :
x \ (y \ z) = x \ y z
@[simp]
theorem sdiff_sdiff_right_self {α : Type u} {x y : α}  :
x \ (x \ y) = x y
theorem sdiff_sdiff_eq_self {α : Type u} {x y : α} (h : y x) :
x \ (x \ y) = y
theorem sdiff_eq_symm {α : Type u} {x y z : α} (hy : y x) (h : x \ y = z) :
x \ z = y
theorem sdiff_eq_comm {α : Type u} {x y z : α} (hy : y x) (hz : z x) :
x \ y = z x \ z = y
theorem eq_of_sdiff_eq_sdiff {α : Type u} {x y z : α} (hxz : x z) (hyz : y z) (h : z \ x = z \ y) :
x = y
theorem sdiff_sdiff_left {α : Type u} {x y z : α}  :
x \ y \ z = x \ (y z)
theorem sdiff_sdiff_left' {α : Type u} {x y z : α}  :
x \ y \ z = x \ y x \ z
theorem sdiff_sdiff_comm {α : Type u} {x y z : α}  :
x \ y \ z = x \ z \ y
@[simp]
theorem sdiff_idem {α : Type u} {x y : α}  :
x \ y \ y = x \ y
@[simp]
theorem sdiff_sdiff_self {α : Type u} {x y : α}  :
x \ y \ x =
theorem sdiff_sdiff_sup_sdiff {α : Type u} {x y z : α}  :
z \ (x \ y y \ x) = z (z \ x y) (z \ y x)
theorem sdiff_sdiff_sup_sdiff' {α : Type u} {x y z : α}  :
z \ (x \ y y \ x) = z x y z \ x z \ y
theorem sup_sdiff {α : Type u} {x y z : α}  :
(x y) \ z = x \ z y \ z
theorem sup_sdiff_right_self {α : Type u} {x y : α}  :
(x y) \ y = x \ y
theorem sup_sdiff_left_self {α : Type u} {x y : α}  :
(x y) \ x = y \ x
theorem inf_sdiff {α : Type u} {x y z : α}  :
(x y) \ z = x \ z y \ z
theorem inf_sdiff_assoc {α : Type u} {x y z : α}  :
(x y) \ z = x y \ z
theorem inf_sdiff_right_comm {α : Type u} {x y z : α}  :
x \ z y = (x y) \ z
theorem inf_sdiff_distrib_left {α : Type u} (a b c : α) :
a b \ c = (a b) \ (a c)
theorem inf_sdiff_distrib_right {α : Type u} (a b c : α) :
a \ b c = (a c) \ (b c)
theorem sdiff_sup_sdiff_cancel {α : Type u} {x y z : α} (hyx : y x) (hzy : z y) :
x \ y y \ z = x \ z
theorem sup_eq_sdiff_sup_sdiff_sup_inf {α : Type u} {x y : α}  :
x y = x \ y y \ x x y
theorem sdiff_le_sdiff_of_sup_le_sup_left {α : Type u} {x y z : α} (h : z x z y) :
x \ z y \ z
theorem sdiff_le_sdiff_of_sup_le_sup_right {α : Type u} {x y z : α} (h : x z y z) :
x \ z y \ z
theorem sup_lt_of_lt_sdiff_left {α : Type u} {x y z : α} (h : y < z \ x) (hxz : x z) :
x y < z
theorem sup_lt_of_lt_sdiff_right {α : Type u} {x y z : α} (h : x < z \ y) (hyz : y z) :
x y < z
@[protected, instance]
def pi.generalized_boolean_algebra {α : Type u} {β : Type v}  :
Equations

### Boolean algebras #

@[instance]
def boolean_algebra.to_has_sdiff (α : Type u) [self : boolean_algebra α] :
@[instance]
def boolean_algebra.to_has_bot (α : Type u) [self : boolean_algebra α] :
@[instance]
def boolean_algebra.to_has_top (α : Type u) [self : boolean_algebra α] :
@[instance]
def boolean_algebra.to_has_compl (α : Type u) [self : boolean_algebra α] :
@[instance]
def boolean_algebra.to_distrib_lattice (α : Type u) [self : boolean_algebra α] :
@[class]
structure boolean_algebra (α : Type u) :
Type u
• sup : α → α → α
• le : α → α → Prop
• lt : α → α → Prop
• le_refl : ∀ (a : α), a a
• le_trans : ∀ (a b c : α), a bb ca c
• lt_iff_le_not_le : (∀ (a b : α), a < b a b ¬b a) . "order_laws_tac"
• le_antisymm : ∀ (a b : α), a bb aa = b
• le_sup_left : ∀ (a b : α), a a b
• le_sup_right : ∀ (a b : α), b a b
• sup_le : ∀ (a b c : α), a cb ca b c
• inf : α → α → α
• inf_le_left : ∀ (a b : α), a b a
• inf_le_right : ∀ (a b : α), a b b
• le_inf : ∀ (a b c : α), a ba ca b c
• le_sup_inf : ∀ (x y z : α), (x y) (x z) x y z
• compl : α → α
• sdiff : α → α → α
• himp : α → α → α
• top : α
• bot : α
• inf_compl_le_bot : ∀ (x : α), x x
• top_le_sup_compl : ∀ (x : α), x x
• le_top : ∀ (a : α), a
• bot_le : ∀ (a : α), a
• sdiff_eq : (∀ (x y : α), x \ y = x y) . "obviously"
• himp_eq : (∀ (x y : α), x y = y x) . "obviously"

A Boolean algebra is a bounded distributive lattice with a complement operator ᶜ such that x ⊓ xᶜ = ⊥ and x ⊔ xᶜ = ⊤. For convenience, it must also provide a set difference operation \ and a Heyting implication ⇨ satisfying x \ y = x ⊓ yᶜ and x ⇨ y = y ⊔ xᶜ.

This is a generalization of (classical) logic of propositions, or the powerset lattice.

Since bounded_order, order_bot, and order_top are mixins that require has_le to be present at define-time, the extends mechanism does not work with them. Instead, we extend using the underlying has_bot and has_top data typeclasses, and replicate the order axioms of those classes here. A "forgetful" instance back to bounded_order is provided.

Instances of this typeclass
Instances of other typeclasses for boolean_algebra
• boolean_algebra.has_sizeof_inst
@[instance]
def boolean_algebra.to_has_himp (α : Type u) [self : boolean_algebra α] :
@[protected, instance]
def boolean_algebra.to_bounded_order {α : Type u} [h : boolean_algebra α] :
Equations
@[reducible]

A bounded generalized boolean algebra is a boolean algebra.

Equations
@[simp]
theorem inf_compl_eq_bot' {α : Type u} {x : α}  :
@[simp]
theorem sup_compl_eq_top {α : Type u} {x : α}  :
@[simp]
theorem compl_sup_eq_top {α : Type u} {x : α}  :
theorem is_compl_compl {α : Type u} {x : α}  :
x
theorem sdiff_eq {α : Type u} {x y : α}  :
x \ y = x y
theorem himp_eq {α : Type u} {x y : α}  :
x y = y x
@[simp]
theorem top_sdiff {α : Type u} {x : α}  :
\ x = x
@[protected, instance]
@[protected, instance]
def boolean_algebra.to_biheyting_algebra {α : Type u}  :
Equations
@[simp]
theorem hnot_eq_compl {α : Type u} {x : α}  :
theorem is_compl.eq_compl {α : Type u} {x y : α} (h : y) :
x = y
theorem is_compl.compl_eq {α : Type u} {x y : α} (h : y) :
x = y
theorem eq_compl_iff_is_compl {α : Type u} {x y : α}  :
x = y y
theorem compl_eq_iff_is_compl {α : Type u} {x y : α}  :
x = y y
theorem compl_eq_comm {α : Type u} {x y : α}  :
x = y y = x
theorem eq_compl_comm {α : Type u} {x y : α}  :
x = y y = x
theorem compl_unique {α : Type u} {x y : α} (i : x y = ) (s : x y = ) :
x = y
@[simp]
theorem compl_compl {α : Type u} (x : α) :
theorem compl_comp_compl {α : Type u}  :
@[simp]
theorem compl_involutive {α : Type u}  :
theorem compl_bijective {α : Type u}  :
theorem compl_surjective {α : Type u}  :
theorem compl_injective {α : Type u}  :
@[simp]
theorem compl_inj_iff {α : Type u} {x y : α}  :
x = y x = y
theorem is_compl.compl_eq_iff {α : Type u} {x y z : α} (h : y) :
z = y z = x
@[simp]
theorem compl_eq_top {α : Type u} {x : α}  :
@[simp]
theorem compl_eq_bot {α : Type u} {x : α}  :
@[simp]
theorem compl_inf {α : Type u} {x y : α}  :
(x y) = x y
@[simp]
theorem compl_le_compl_iff_le {α : Type u} {x y : α}  :
y x x y
theorem le_compl_of_le_compl {α : Type u} {x y : α} (h : y x) :
x y
theorem compl_le_of_compl_le {α : Type u} {x y : α} (h : y x) :
x y
theorem le_compl_iff_le_compl {α : Type u} {x y : α}  :
y x x y
theorem compl_le_iff_compl_le {α : Type u} {x y : α}  :
x y y x
@[simp]
theorem sdiff_compl {α : Type u} {x y : α}  :
x \ y = x y
@[protected, instance]
def order_dual.boolean_algebra {α : Type u}  :
Equations
@[simp]
theorem sup_inf_inf_compl {α : Type u} {x y : α}  :
x y x y = x
@[simp]
theorem compl_sdiff {α : Type u} {x y : α}  :
(x \ y) = x y
theorem disjoint_compl_left_iff {α : Type u} {x y : α}  :
y y x
theorem disjoint_compl_right_iff {α : Type u} {x y : α}  :
y x y
theorem has_le.le.disjoint_compl_left {α : Type u} {x y : α}  :
y x y

Alias of the reverse direction of disjoint_compl_left_iff.

theorem has_le.le.disjoint_compl_right {α : Type u} {x y : α}  :
x y y

Alias of the reverse direction of disjoint_compl_right_iff.

@[protected, instance]
Equations
@[protected, instance]
def pi.boolean_algebra {ι : Type u} {α : ι → Type v} [Π (i : ι), boolean_algebra (α i)] :
boolean_algebra (Π (i : ι), α i)
Equations
@[protected, instance]
Equations
@[simp]
theorem bool.sup_eq_bor  :
@[simp]
theorem bool.inf_eq_band  :
@[simp]
theorem bool.compl_eq_bnot  :
@[protected, reducible]
def function.injective.generalized_boolean_algebra {α : Type u} {β : Type u_1} [has_sup α] [has_inf α] [has_bot α] [has_sdiff α] (f : α → β) (hf : function.injective f) (map_sup : ∀ (a b : α), f (a b) = f a f b) (map_inf : ∀ (a b : α), f (a b) = f a f b) (map_bot : f = ) (map_sdiff : ∀ (a b : α), f (a \ b) = f a \ f b) :

Pullback a generalized_boolean_algebra along an injection.

Equations
@[protected, reducible]
def function.injective.boolean_algebra {α : Type u} {β : Type u_1} [has_sup α] [has_inf α] [has_top α] [has_bot α] [has_compl α] [has_sdiff α] (f : α → β) (hf : function.injective f) (map_sup : ∀ (a b : α), f (a b) = f a f b) (map_inf : ∀ (a b : α), f (a b) = f a f b) (map_top : f = ) (map_bot : f = ) (map_compl : ∀ (a : α), f a = (f a)) (map_sdiff : ∀ (a b : α), f (a \ b) = f a \ f b) :

Pullback a boolean_algebra along an injection.

Equations
@[protected, instance]
Equations