Documentation

Mathlib.Order.Heyting.Regular

Heyting regular elements #

This file defines Heyting regular elements, elements of a Heyting algebra that are their own double complement, and proves that they form a boolean algebra.

From a logic standpoint, this means that we can perform classical logic within intuitionistic logic by simply double-negating all propositions. This is practical for synthetic computability theory.

Main declarations #

References #

def Heyting.IsRegular {α : Type u_1} [HasCompl α] (a : α) :

An element of a Heyting algebra is regular if its double complement is itself.

Equations
Instances For
    theorem Heyting.IsRegular.eq {α : Type u_1} [HasCompl α] {a : α} :
    instance Heyting.IsRegular.decidablePred {α : Type u_1} [HasCompl α] [DecidableEq α] :
    DecidablePred Heyting.IsRegular
    Equations
    theorem Heyting.IsRegular.inf {α : Type u_1} [HeytingAlgebra α] {a : α} {b : α} (ha : Heyting.IsRegular a) (hb : Heyting.IsRegular b) :
    theorem Heyting.IsRegular.himp {α : Type u_1} [HeytingAlgebra α] {a : α} {b : α} (ha : Heyting.IsRegular a) (hb : Heyting.IsRegular b) :
    theorem Heyting.IsRegular.disjoint_compl_left_iff {α : Type u_1} [HeytingAlgebra α] {a : α} {b : α} (ha : Heyting.IsRegular a) :
    @[reducible]
    def BooleanAlgebra.ofRegular {α : Type u_1} [HeytingAlgebra α] (h : ∀ (a : α), Heyting.IsRegular (a ⊔ aᶜ)) :

    A Heyting algebra with regular excluded middle is a boolean algebra.

    Equations
    Instances For
      def Heyting.Regular (α : Type u_1) [HeytingAlgebra α] :
      Type u_1

      The boolean algebra of Heyting regular elements.

      Equations
      Instances For

        The coercion Regular α → α

        Equations
        • Heyting.Regular.val = Subtype.val
        Instances For
          Equations
          • Heyting.Regular.instCoeOutRegular = { coe := Heyting.Regular.val }
          theorem Heyting.Regular.coe_injective {α : Type u_1} [HeytingAlgebra α] :
          Function.Injective Heyting.Regular.val
          @[simp]
          theorem Heyting.Regular.coe_inj {α : Type u_1} [HeytingAlgebra α] {a : Heyting.Regular α} {b : Heyting.Regular α} :
          ↑a = ↑b ↔ a = b
          Equations
          • Heyting.Regular.top = { top := { val := ⊤, property := ⋯ } }
          Equations
          • Heyting.Regular.bot = { bot := { val := ⊥, property := ⋯ } }
          Equations
          • Heyting.Regular.inf = { inf := fun (a b : Heyting.Regular α) => { val := ↑a ⊓ ↑b, property := ⋯ } }
          Equations
          • Heyting.Regular.himp = { himp := fun (a b : Heyting.Regular α) => { val := ↑a ⇨ ↑b, property := ⋯ } }
          Equations
          • Heyting.Regular.hasCompl = { compl := fun (a : Heyting.Regular α) => { val := (↑a)ᶜ, property := ⋯ } }
          @[simp]
          theorem Heyting.Regular.coe_top {α : Type u_1} [HeytingAlgebra α] :
          ↑⊤ = ⊤
          @[simp]
          theorem Heyting.Regular.coe_bot {α : Type u_1} [HeytingAlgebra α] :
          ↑⊥ = ⊥
          @[simp]
          theorem Heyting.Regular.coe_inf {α : Type u_1} [HeytingAlgebra α] (a : Heyting.Regular α) (b : Heyting.Regular α) :
          ↑(a ⊓ b) = ↑a ⊓ ↑b
          @[simp]
          theorem Heyting.Regular.coe_himp {α : Type u_1} [HeytingAlgebra α] (a : Heyting.Regular α) (b : Heyting.Regular α) :
          ↑(a ⇨ b) = ↑a ⇨ ↑b
          @[simp]
          theorem Heyting.Regular.coe_compl {α : Type u_1} [HeytingAlgebra α] (a : Heyting.Regular α) :
          ↑aᶜ = (↑a)ᶜ
          Equations
          • Heyting.Regular.instInhabitedRegular = { default := ⊥ }
          Equations
          Equations
          @[simp]
          theorem Heyting.Regular.coe_le_coe {α : Type u_1} [HeytingAlgebra α] {a : Heyting.Regular α} {b : Heyting.Regular α} :
          ↑a ≤ ↑b ↔ a ≤ b
          @[simp]
          theorem Heyting.Regular.coe_lt_coe {α : Type u_1} [HeytingAlgebra α] {a : Heyting.Regular α} {b : Heyting.Regular α} :
          ↑a < ↑b ↔ a < b

          Regularization of a. The smallest regular element greater than a.

          Equations
          • Heyting.Regular.toRegular = { toFun := fun (a : α) => { val := aᶜᶜ, property := ⋯ }, monotone' := ⋯ }
          Instances For
            @[simp]
            theorem Heyting.Regular.coe_toRegular {α : Type u_1} [HeytingAlgebra α] (a : α) :
            ↑(Heyting.Regular.toRegular a) = aᶜᶜ
            @[simp]
            theorem Heyting.Regular.toRegular_coe {α : Type u_1} [HeytingAlgebra α] (a : Heyting.Regular α) :
            Heyting.Regular.toRegular ↑a = a
            def Heyting.Regular.gi {α : Type u_1} [HeytingAlgebra α] :
            GaloisInsertion (⇑Heyting.Regular.toRegular) Heyting.Regular.val

            The Galois insertion between Regular.toRegular and coe.

            Equations
            • Heyting.Regular.gi = { choice := fun (a : α) (ha : ↑(Heyting.Regular.toRegular a) ≤ a) => { val := a, property := ⋯ }, gc := ⋯, le_l_u := ⋯, choice_eq := ⋯ }
            Instances For
              Equations
              @[simp]
              theorem Heyting.Regular.coe_sup {α : Type u_1} [HeytingAlgebra α] (a : Heyting.Regular α) (b : Heyting.Regular α) :
              ↑(a ⊔ b) = (↑a ⊔ ↑b)ᶜᶜ
              Equations
              • One or more equations did not get rendered due to their size.
              @[simp]
              theorem Heyting.Regular.coe_sdiff {α : Type u_1} [HeytingAlgebra α] (a : Heyting.Regular α) (b : Heyting.Regular α) :
              ↑(a \ b) = ↑a ⊓ (↑b)ᶜ

              A decidable proposition is intuitionistically Heyting-regular.