Documentation

Std.Do.SPred.DerivedLaws

Derived laws of SPred #

This module contains some laws about SPred that are derived from the laws in Std.Do.Laws.

theorem Std.Do.SPred.entails.rfl {σs : List Type} {P : SPred σs} :
P ⊢ₛ P
theorem Std.Do.SPred.bientails.of_eq {σs : List Type} {P Q : SPred σs} (h : P = Q) :
theorem Std.Do.SPred.bientails.mp {σs : List Type} {P Q : SPred σs} :
(P ⊣⊢ₛ Q) → P ⊢ₛ Q
theorem Std.Do.SPred.bientails.mpr {σs : List Type} {P Q : SPred σs} :
(P ⊣⊢ₛ Q) → Q ⊢ₛ P

Connectives #

theorem Std.Do.SPred.and_elim_l' {σs : List Type} {P Q R : SPred σs} (h : P ⊢ₛ R) :
P Q ⊢ₛ R
theorem Std.Do.SPred.and_elim_r' {σs : List Type} {P Q R : SPred σs} (h : Q ⊢ₛ R) :
P Q ⊢ₛ R
theorem Std.Do.SPred.or_intro_l' {σs : List Type} {P Q R : SPred σs} (h : P ⊢ₛ Q) :
P ⊢ₛ Q R
theorem Std.Do.SPred.or_intro_r' {σs : List Type} {P Q R : SPred σs} (h : P ⊢ₛ R) :
P ⊢ₛ Q R
theorem Std.Do.SPred.and_symm {σs : List Type} {P Q : SPred σs} :
P Q ⊢ₛ Q P
theorem Std.Do.SPred.or_symm {σs : List Type} {P Q : SPred σs} :
P Q ⊢ₛ Q P
theorem Std.Do.SPred.imp_intro' {σs : List Type} {P Q R : SPred σs} (h : Q P ⊢ₛ R) :
theorem Std.Do.SPred.entails.trans' {σs : List Type} {P Q R : SPred σs} (h₁ : P ⊢ₛ Q) (h₂ : P Q ⊢ₛ R) :
P ⊢ₛ R
theorem Std.Do.SPred.mp {σs : List Type} {P Q R : SPred σs} (h₁ : P ⊢ₛ QR) (h₂ : P ⊢ₛ Q) :
P ⊢ₛ R
theorem Std.Do.SPred.imp_elim' {σs : List Type} {P Q R : SPred σs} (h : Q ⊢ₛ PR) :
P Q ⊢ₛ R
theorem Std.Do.SPred.exists_intro' {α : Sort u_1} {σs : List Type} {P : SPred σs} {Ψ : αSPred σs} (a : α) (h : P ⊢ₛ Ψ a) :
P ⊢ₛ «exists» fun (a : α) => Ψ a
theorem Std.Do.SPred.and_or_elim_l {σs : List Type} {P Q R T : SPred σs} (hleft : P R ⊢ₛ T) (hright : Q R ⊢ₛ T) :
(P Q) R ⊢ₛ T
theorem Std.Do.SPred.and_or_elim_r {σs : List Type} {P Q R T : SPred σs} (hleft : P Q ⊢ₛ T) (hright : P R ⊢ₛ T) :
P (Q R) ⊢ₛ T
theorem Std.Do.SPred.exfalso {σs : List Type} {P Q : SPred σs} (h : P ⊢ₛ False) :
P ⊢ₛ Q

Monotonicity and congruence #

theorem Std.Do.SPred.and_mono {σs : List Type} {P P' Q Q' : SPred σs} (hp : P ⊢ₛ P') (hq : Q ⊢ₛ Q') :
P Q ⊢ₛ P' Q'
theorem Std.Do.SPred.and_mono_l {σs : List Type} {P P' Q : SPred σs} (h : P ⊢ₛ P') :
P Q ⊢ₛ P' Q
theorem Std.Do.SPred.and_mono_r {σs : List Type} {P Q Q' : SPred σs} (h : Q ⊢ₛ Q') :
P Q ⊢ₛ P Q'
theorem Std.Do.SPred.and_congr {σs : List Type} {P P' Q Q' : SPred σs} (hp : P ⊣⊢ₛ P') (hq : Q ⊣⊢ₛ Q') :
P Q ⊣⊢ₛ P' Q'
theorem Std.Do.SPred.and_congr_l {σs : List Type} {P P' Q : SPred σs} (hp : P ⊣⊢ₛ P') :
P Q ⊣⊢ₛ P' Q
theorem Std.Do.SPred.and_congr_r {σs : List Type} {P Q Q' : SPred σs} (hq : Q ⊣⊢ₛ Q') :
P Q ⊣⊢ₛ P Q'
theorem Std.Do.SPred.or_mono {σs : List Type} {P P' Q Q' : SPred σs} (hp : P ⊢ₛ P') (hq : Q ⊢ₛ Q') :
P Q ⊢ₛ P' Q'
theorem Std.Do.SPred.or_mono_l {σs : List Type} {P P' Q : SPred σs} (h : P ⊢ₛ P') :
P Q ⊢ₛ P' Q
theorem Std.Do.SPred.or_mono_r {σs : List Type} {P Q Q' : SPred σs} (h : Q ⊢ₛ Q') :
P Q ⊢ₛ P Q'
theorem Std.Do.SPred.or_congr {σs : List Type} {P P' Q Q' : SPred σs} (hp : P ⊣⊢ₛ P') (hq : Q ⊣⊢ₛ Q') :
P Q ⊣⊢ₛ P' Q'
theorem Std.Do.SPred.or_congr_l {σs : List Type} {P P' Q : SPred σs} (hp : P ⊣⊢ₛ P') :
P Q ⊣⊢ₛ P' Q
theorem Std.Do.SPred.or_congr_r {σs : List Type} {P Q Q' : SPred σs} (hq : Q ⊣⊢ₛ Q') :
P Q ⊣⊢ₛ P Q'
theorem Std.Do.SPred.imp_mono {σs : List Type} {P P' Q Q' : SPred σs} (h1 : Q ⊢ₛ P) (h2 : P' ⊢ₛ Q') :
theorem Std.Do.SPred.imp_mono_l {σs : List Type} {P P' Q : SPred σs} (h : P' ⊢ₛ P) :
theorem Std.Do.SPred.imp_mono_r {σs : List Type} {P Q Q' : SPred σs} (h : Q ⊢ₛ Q') :
theorem Std.Do.SPred.imp_congr {σs : List Type} {P P' Q Q' : SPred σs} (h1 : P ⊣⊢ₛ Q) (h2 : P' ⊣⊢ₛ Q') :
theorem Std.Do.SPred.forall_mono {σs : List Type} {α : Sort u_1} {Φ Ψ : αSPred σs} (h : ∀ (a : α), Φ a ⊢ₛ Ψ a) :
(«forall» fun (a : α) => Φ a) ⊢ₛ «forall» fun (a : α) => Ψ a
theorem Std.Do.SPred.forall_congr {σs : List Type} {α : Sort u_1} {Φ Ψ : αSPred σs} (h : ∀ (a : α), Φ a ⊣⊢ₛ Ψ a) :
(«forall» fun (a : α) => Φ a) ⊣⊢ₛ «forall» fun (a : α) => Ψ a
theorem Std.Do.SPred.exists_mono {σs : List Type} {α : Sort u_1} {Φ Ψ : αSPred σs} (h : ∀ (a : α), Φ a ⊢ₛ Ψ a) :
(«exists» fun (a : α) => Φ a) ⊢ₛ «exists» fun (a : α) => Ψ a
theorem Std.Do.SPred.exists_congr {σs : List Type} {α : Sort u_1} {Φ Ψ : αSPred σs} (h : ∀ (a : α), Φ a ⊣⊢ₛ Ψ a) :
(«exists» fun (a : α) => Φ a) ⊣⊢ₛ «exists» fun (a : α) => Ψ a
theorem Std.Do.SPred.and_imp {σs✝ : List Type} {P₁ P₂ Q₁ Q₂ : SPred σs✝} (hp : P₁ ⊢ₛ P₂) (hq : Q₁ ⊢ₛ Q₂) :
P₁ Q₁ ⊢ₛ P₂ Q₂
theorem Std.Do.SPred.or_imp_left {σs : List Type} {Q P₁ P₂ : SPred σs} (hleft : P₁ ⊢ₛ P₂) :
P₁ Q ⊢ₛ P₂ Q
theorem Std.Do.SPred.or_imp_right {σs : List Type} {P Q₁ Q₂ : SPred σs} (hright : Q₁ ⊢ₛ Q₂) :
P Q₁ ⊢ₛ P Q₂

Boolean algebra #

theorem Std.Do.SPred.and_self {σs : List Type} {P : SPred σs} :
theorem Std.Do.SPred.or_self {σs : List Type} {P : SPred σs} :
theorem Std.Do.SPred.and_comm {σs : List Type} {P Q : SPred σs} :
P Q ⊣⊢ₛ Q P
theorem Std.Do.SPred.or_comm {σs : List Type} {P Q : SPred σs} :
P Q ⊣⊢ₛ Q P
theorem Std.Do.SPred.and_assoc {σs : List Type} {P Q R : SPred σs} :
(P Q) R ⊣⊢ₛ P Q R
theorem Std.Do.SPred.or_assoc {σs : List Type} {P Q R : SPred σs} :
(P Q) R ⊣⊢ₛ P Q R
theorem Std.Do.SPred.and_eq_right {σs : List Type} {P Q : SPred σs} :
theorem Std.Do.SPred.and_eq_left {σs : List Type} {P Q : SPred σs} :
theorem Std.Do.SPred.or_eq_left {σs : List Type} {P Q : SPred σs} :
theorem Std.Do.SPred.or_eq_right {σs : List Type} {P Q : SPred σs} :
theorem Std.Do.SPred.and_or_left {σs : List Type} {P Q R : SPred σs} :
P (Q R) ⊣⊢ₛ P Q P R
theorem Std.Do.SPred.or_and_left {σs : List Type} {P Q R : SPred σs} :
P Q R ⊣⊢ₛ (P Q) (P R)
theorem Std.Do.SPred.or_and_right {σs : List Type} {P Q R : SPred σs} :
(P Q) R ⊣⊢ₛ P R Q R
theorem Std.Do.SPred.and_or_right {σs : List Type} {P Q R : SPred σs} :
P Q R ⊣⊢ₛ (P R) (Q R)
theorem Std.Do.SPred.true_imp {σs : List Type} {P : SPred σs} :
theorem Std.Do.SPred.imp_self {σs : List Type} {P Q : SPred σs} :

Pure #

theorem Std.Do.SPred.pure_elim {σs : List Type} {Q R : SPred σs} {φ : Prop} (h1 : Q ⊢ₛ φ) (h2 : φQ ⊢ₛ R) :
Q ⊢ₛ R
theorem Std.Do.SPred.pure_mono {σs : List Type} {φ₁ φ₂ : Prop} (h : φ₁φ₂) :
φ₁ ⊢ₛ φ₂
theorem Std.Do.SPred.pure_congr {σs : List Type} {φ₁ φ₂ : Prop} (h : φ₁ φ₂) :
theorem Std.Do.SPred.pure_elim_l {σs : List Type} {Q R : SPred σs} {φ : Prop} (h : φQ ⊢ₛ R) :
theorem Std.Do.SPred.pure_elim_r {σs : List Type} {Q R : SPred σs} {φ : Prop} (h : φQ ⊢ₛ R) :
theorem Std.Do.SPred.pure_and {σs : List Type} {φ₁ φ₂ : Prop} :
φ₁ φ₂ ⊣⊢ₛ φ₁ φ₂
theorem Std.Do.SPred.pure_or {σs : List Type} {φ₁ φ₂ : Prop} :
φ₁ φ₂ ⊣⊢ₛ φ₁ φ₂
theorem Std.Do.SPred.pure_imp_2 {σs : List Type} {φ₁ φ₂ : Prop} :
φ₁φ₂ ⊢ₛ φ₁φ₂
theorem Std.Do.SPred.pure_imp {σs : List Type} {φ₁ φ₂ : Prop} :
(φ₁φ₂) ⊣⊢ₛ φ₁φ₂
theorem Std.Do.SPred.pure_forall_2 {σs : List Type} {α : Sort u_1} {φ : αProp} :
∀ (x : α), φ x ⊢ₛ «forall» fun (x : α) => φ x
theorem Std.Do.SPred.pure_forall {σs : List Type} {α : Sort u_1} {φ : αProp} :
(«forall» fun (x : α) => φ x) ⊣⊢ₛ ∀ (x : α), φ x
theorem Std.Do.SPred.pure_exists {σs : List Type} {α : Sort u_1} {φ : αProp} :
(«exists» fun (x : α) => φ x) ⊣⊢ₛ (x : α), φ x

Miscellaneous #

theorem Std.Do.SPred.and_left_comm {σs : List Type} {P Q R : SPred σs} :
P Q R ⊣⊢ₛ Q P R
theorem Std.Do.SPred.and_right_comm {σs : List Type} {P Q R : SPred σs} :
(P Q) R ⊣⊢ₛ (P R) Q

Working with entailment #

theorem Std.Do.SPred.entails_pure_intro {σs : List Type} (P Q : Prop) (h : PQ) :
@[simp]
theorem Std.Do.SPred.entails_elim_nil (P Q : SPred []) :
P ⊢ₛ Q PQ
theorem Std.Do.SPred.entails_elim_cons {σ : Type} {σs : List Type} (P Q : SPred (σ :: σs)) :
P ⊢ₛ Q ∀ (s : σ), P s ⊢ₛ Q s
@[simp]

Tactic support #

@[reducible, inline]

Tautology in SPred as a quotable definition.

Equations
Instances For
    Instances
      class Std.Do.SPred.Tactic.IsPure {σs : List Type} (P : SPred σs) (φ : outParam Prop) :
      Instances
        instance Std.Do.SPred.Tactic.instIsPureExistsCurryExists {α : Sort u_1} (σs : List Type) (P : αProp) :
        IsPure («exists» fun (x : α) => P x) ( (x : α), P x)
        instance Std.Do.SPred.Tactic.instIsPureForallCurryForall {α : Sort u_1} (σs : List Type) (P : αProp) :
        IsPure («forall» fun (x : α) => P x) (∀ (x : α), P x)
        instance Std.Do.SPred.Tactic.instIsPure {φ : Prop} {σ : Type} {s : σ} (σs : List Type) (P : SPred (σ :: σs)) [inst : IsPure P φ] :
        IsPure (P s) φ
        class Std.Do.SPred.Tactic.IsAnd {σs : List Type} (P : SPred σs) (Q₁ Q₂ : outParam (SPred σs)) :
        Instances
          instance Std.Do.SPred.Tactic.instIsAndAnd (σs : List Type) (Q₁ Q₂ : SPred σs) :
          IsAnd spred(Q₁ Q₂) Q₁ Q₂
          instance Std.Do.SPred.Tactic.instIsAnd {σ : Type} (σs : List Type) (P Q₁ Q₂ : σSPred σs) [base : ∀ (s : σ), IsAnd (P s) (Q₁ s) (Q₂ s)] :
          IsAnd P Q₁ Q₂
          theorem Std.Do.SPred.Tactic.Assumption.left {σs : List Type} {P Q R : SPred σs} (h : P ⊢ₛ R) :
          P Q ⊢ₛ R
          theorem Std.Do.SPred.Tactic.Assumption.right {σs : List Type} {P Q R : SPred σs} (h : Q ⊢ₛ R) :
          P Q ⊢ₛ R
          theorem Std.Do.SPred.Tactic.SCases.add_goal {σs : List Type} {P Q H T : SPred σs} (hand : Q H ⊣⊢ₛ P) (hgoal : P ⊢ₛ T) :
          Q H ⊢ₛ T
          theorem Std.Do.SPred.Tactic.SCases.clear {σs : List Type} {Q H T : SPred σs} (hgoal : Q True ⊢ₛ T) :
          Q H ⊢ₛ T
          theorem Std.Do.SPred.Tactic.SCases.pure {σs : List Type} {Q T : SPred σs} (hgoal : Q True ⊢ₛ T) :
          Q ⊢ₛ T
          theorem Std.Do.SPred.Tactic.SCases.and_1 {σs : List Type} {Q H₁' H₂' H₁₂' T : SPred σs} (hand : H₁' H₂' ⊣⊢ₛ H₁₂') (hgoal : Q H₁₂' ⊢ₛ T) :
          (Q H₁') H₂' ⊢ₛ T
          theorem Std.Do.SPred.Tactic.SCases.and_2 {σs : List Type} {Q H₁' H₂ T : SPred σs} (hgoal : (Q H₁') H₂ ⊢ₛ T) :
          (Q H₂) H₁' ⊢ₛ T
          theorem Std.Do.SPred.Tactic.SCases.and_3 {σs : List Type} {Q H₁ H₂ H T : SPred σs} (hand : H ⊣⊢ₛ H₁ H₂) (hgoal : (Q H₂) H₁ ⊢ₛ T) :
          Q H ⊢ₛ T
          theorem Std.Do.SPred.Tactic.SCases.exists {α : Sort u_1} {σs : List Type} {Q : SPred σs} {ψ : αSPred σs} {T : SPred σs} (h : ∀ (a : α), Q ψ a ⊢ₛ T) :
          (Q SPred.exists fun (a : α) => ψ a) ⊢ₛ T
          theorem Std.Do.SPred.Tactic.Clear.clear {σs : List Type} {P P' A Q : SPred σs} (hfocus : P ⊣⊢ₛ P' A) (h : P' ⊢ₛ Q) :
          P ⊢ₛ Q
          theorem Std.Do.SPred.Tactic.Exact.assumption {σs : List Type} {P P' A : SPred σs} (h : P ⊣⊢ₛ P' A) :
          P ⊢ₛ A
          theorem Std.Do.SPred.Tactic.Exact.from_tautology {φ : Prop} {σs : List Type} {P T : SPred σs} [PropAsSPredTautology φ T] (h : φ) :
          P ⊢ₛ T
          theorem Std.Do.SPred.Tactic.Focus.left {σs : List Type} {P P' Q C R : SPred σs} (h₁ : P ⊣⊢ₛ P' R) (h₂ : P' Q ⊣⊢ₛ C) :
          P Q ⊣⊢ₛ C R
          theorem Std.Do.SPred.Tactic.Focus.right {σs : List Type} {P Q Q' C R : SPred σs} (h₁ : Q ⊣⊢ₛ Q' R) (h₂ : P Q' ⊣⊢ₛ C) :
          P Q ⊣⊢ₛ C R
          theorem Std.Do.SPred.Tactic.Focus.rewrite_hyps {σs : List Type} {P Q R : SPred σs} (hrw : P ⊣⊢ₛ Q) (hgoal : Q ⊢ₛ R) :
          P ⊢ₛ R
          theorem Std.Do.SPred.Tactic.Have.dup {σs : List Type} {P Q H T : SPred σs} (hfoc : P ⊣⊢ₛ Q H) (hgoal : P H ⊢ₛ T) :
          P ⊢ₛ T
          theorem Std.Do.SPred.Tactic.Have.have {σs : List Type} {P H PH T : SPred σs} (hand : P H ⊣⊢ₛ PH) (hhave : P ⊢ₛ H) (hgoal : PH ⊢ₛ T) :
          P ⊢ₛ T
          theorem Std.Do.SPred.Tactic.Have.replace {σs : List Type} {P H H' PH PH' T : SPred σs} (hfoc : PH ⊣⊢ₛ P H) (hand : P H' ⊣⊢ₛ PH') (hhave : PH ⊢ₛ H') (hgoal : PH' ⊢ₛ T) :
          PH ⊢ₛ T
          theorem Std.Do.SPred.Tactic.Intro.intro {σs : List Type} {P Q H T : SPred σs} (hand : Q H ⊣⊢ₛ P) (h : P ⊢ₛ T) :
          theorem Std.Do.SPred.Tactic.Pure.thm {σs : List Type} {P Q T : SPred σs} {φ : Prop} [IsPure Q φ] (h : φP ⊢ₛ T) :
          P Q ⊢ₛ T
          theorem Std.Do.SPred.Tactic.Pure.intro {σs : List Type} {P Q : SPred σs} {φ : Prop} [IsPure Q φ] (hp : φ) :
          P ⊢ₛ Q

          A generalization of pure_intro exploiting IsPure.

          theorem Std.Do.SPred.Tactic.Revert.revert {σs : List Type} {P Q H T : SPred σs} (hfoc : P ⊣⊢ₛ Q H) (h : Q ⊢ₛ HT) :
          P ⊢ₛ T
          theorem Std.Do.SPred.Tactic.Specialize.imp_pure {σs : List Type} {φ : Prop} {P Q R : SPred σs} [PropAsSPredTautology φ Q] (h : φ) :
          theorem Std.Do.SPred.Tactic.Specialize.forall {σs : List Type} {α : Sort u_1} {P : SPred σs} {ψ : αSPred σs} (a : α) :
          (P SPred.forall fun (x : α) => ψ x) ⊢ₛ P ψ a
          theorem Std.Do.SPred.Tactic.Specialize.pure_start {σs : List Type} {φ : Prop} {H P T : SPred σs} [PropAsSPredTautology φ H] (hpure : φ) (hgoal : P H ⊢ₛ T) :
          P ⊢ₛ T
          theorem Std.Do.SPred.Tactic.Specialize.pure_taut {σs : List Type} {φ : Prop} {P : SPred σs} [IsPure P φ] (h : φ) :
          theorem Std.Do.SPred.Tactic.Specialize.focus {σs : List Type} {P P' Q R : SPred σs} (hfocus : P ⊣⊢ₛ P' Q) (hnew : P' Q ⊢ₛ R) :
          P ⊢ₛ R
          class Std.Do.SPred.Tactic.SimpAnd {σs : List Type} (P Q : SPred σs) (PQ : outParam (SPred σs)) :
          Instances
            class Std.Do.SPred.Tactic.HasFrame {σs : List Type} (P : SPred σs) (P' : outParam (SPred σs)) (φ : outParam Prop) :
            Instances
              instance Std.Do.SPred.Tactic.instHasFrameAndOfSimpAnd {φ : Prop} (σs : List Type) (P P' Q QP : SPred σs) [HasFrame P Q φ] [SimpAnd Q P' QP] :
              HasFrame spred(P P') QP φ
              instance Std.Do.SPred.Tactic.instHasFrameAndOfSimpAnd_1 {φ : Prop} (σs : List Type) (P P' Q' PQ : SPred σs) [HasFrame P' Q' φ] [SimpAnd P Q' PQ] :
              HasFrame spred(P P') PQ φ
              instance Std.Do.SPred.Tactic.instHasFrameAndAndOfSimpAnd {φ ψ : Prop} (σs : List Type) (P P' Q Q' QQ : SPred σs) [HasFrame P Q φ] [HasFrame P' Q' ψ] [SimpAnd Q Q' QQ] :
              HasFrame spred(P P') QQ (φ ψ)
              instance Std.Do.SPred.Tactic.instHasFrameAndCurryAnd {φ ψ : Prop} (σs : List Type) (P Q : SPred σs) [HasFrame P Q ψ] :
              instance Std.Do.SPred.Tactic.instHasFrameAndCurryAnd_1 {φ ψ : Prop} (σs : List Type) (P Q : SPred σs) [HasFrame P Q ψ] :
              theorem Std.Do.SPred.Tactic.Frame.frame {σs : List Type} {P Q T : SPred σs} {φ : Prop} [HasFrame P Q φ] (h : φQ ⊢ₛ T) :
              P ⊢ₛ T