linear_algebra.clifford_algebra.equivs
⟷
Mathlib.LinearAlgebra.CliffordAlgebra.Equivs
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,12 +3,12 @@ Copyright (c) 2021 Eric Wieser. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Wieser
-/
-import Mathbin.Algebra.DualNumber
-import Mathbin.Algebra.QuaternionBasis
-import Mathbin.Data.Complex.Module
-import Mathbin.LinearAlgebra.CliffordAlgebra.Conjugation
-import Mathbin.LinearAlgebra.CliffordAlgebra.Star
-import Mathbin.LinearAlgebra.QuadraticForm.Prod
+import Algebra.DualNumber
+import Algebra.QuaternionBasis
+import Data.Complex.Module
+import LinearAlgebra.CliffordAlgebra.Conjugation
+import LinearAlgebra.CliffordAlgebra.Star
+import LinearAlgebra.QuadraticForm.Prod
#align_import linear_algebra.clifford_algebra.equivs from "leanprover-community/mathlib"@"30faa0c3618ce1472bf6305ae0e3fa56affa3f95"
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -322,14 +322,14 @@ def quaternionBasis : QuaternionAlgebra.Basis (CliffordAlgebra (Q c₁ c₂)) c
i := ι (Q c₁ c₂) (1, 0)
j := ι (Q c₁ c₂) (0, 1)
k := ι (Q c₁ c₂) (1, 0) * ι (Q c₁ c₂) (0, 1)
- i_mul_i := by
+ i_hMul_i := by
rw [ι_sq_scalar, Q_apply, ← Algebra.algebraMap_eq_smul_one]
simp
- j_mul_j := by
+ j_hMul_j := by
rw [ι_sq_scalar, Q_apply, ← Algebra.algebraMap_eq_smul_one]
simp
- i_mul_j := rfl
- j_mul_i := by
+ i_hMul_j := rfl
+ j_hMul_i := by
rw [eq_neg_iff_add_eq_zero, ι_mul_ι_add_swap, QuadraticForm.polar]
simp
#align clifford_algebra_quaternion.quaternion_basis CliffordAlgebraQuaternion.quaternionBasis
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,11 +2,6 @@
Copyright (c) 2021 Eric Wieser. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Wieser
-
-! This file was ported from Lean 3 source module linear_algebra.clifford_algebra.equivs
-! leanprover-community/mathlib commit 30faa0c3618ce1472bf6305ae0e3fa56affa3f95
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Algebra.DualNumber
import Mathbin.Algebra.QuaternionBasis
@@ -15,6 +10,8 @@ import Mathbin.LinearAlgebra.CliffordAlgebra.Conjugation
import Mathbin.LinearAlgebra.CliffordAlgebra.Star
import Mathbin.LinearAlgebra.QuadraticForm.Prod
+#align_import linear_algebra.clifford_algebra.equivs from "leanprover-community/mathlib"@"30faa0c3618ce1472bf6305ae0e3fa56affa3f95"
+
/-!
# Other constructions isomorphic to Clifford Algebras
mathlib commit https://github.com/leanprover-community/mathlib/commit/8b981918a93bc45a8600de608cde7944a80d92b9
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Wieser
! This file was ported from Lean 3 source module linear_algebra.clifford_algebra.equivs
-! leanprover-community/mathlib commit cf7a7252c1989efe5800e0b3cdfeb4228ac6b40e
+! leanprover-community/mathlib commit 30faa0c3618ce1472bf6305ae0e3fa56affa3f95
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -18,6 +18,9 @@ import Mathbin.LinearAlgebra.QuadraticForm.Prod
/-!
# Other constructions isomorphic to Clifford Algebras
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
This file contains isomorphisms showing that other types are equivalent to some `clifford_algebra`.
## Rings
mathlib commit https://github.com/leanprover-community/mathlib/commit/93f880918cb51905fd51b76add8273cbc27718ab
@@ -74,10 +74,12 @@ open scoped ComplexConjugate
variable {R : Type _} [CommRing R]
+#print CliffordAlgebraRing.ι_eq_zero /-
@[simp]
theorem ι_eq_zero : ι (0 : QuadraticForm R Unit) = 0 :=
Subsingleton.elim _ _
#align clifford_algebra_ring.ι_eq_zero CliffordAlgebraRing.ι_eq_zero
+-/
/-- Since the vector space is empty the ring is commutative. -/
instance : CommRing (CliffordAlgebra (0 : QuadraticForm R Unit)) :=
@@ -89,6 +91,7 @@ instance : CommRing (CliffordAlgebra (0 : QuadraticForm R Unit)) :=
case h_add x₁ x₂ hx₁ hx₂ => rw [mul_add, add_mul, hx₁, hx₂]
case h_mul x₁ x₂ hx₁ hx₂ => rw [mul_assoc, hx₂, ← mul_assoc, hx₁, ← mul_assoc] }
+#print CliffordAlgebraRing.reverse_apply /-
theorem reverse_apply (x : CliffordAlgebra (0 : QuadraticForm R Unit)) : x.reverse = x :=
by
induction x using CliffordAlgebra.induction
@@ -97,18 +100,24 @@ theorem reverse_apply (x : CliffordAlgebra (0 : QuadraticForm R Unit)) : x.rever
case h_mul x₁ x₂ hx₁ hx₂ => rw [reverse.map_mul, mul_comm, hx₁, hx₂]
case h_add x₁ x₂ hx₁ hx₂ => rw [reverse.map_add, hx₁, hx₂]
#align clifford_algebra_ring.reverse_apply CliffordAlgebraRing.reverse_apply
+-/
+#print CliffordAlgebraRing.reverse_eq_id /-
@[simp]
theorem reverse_eq_id :
(reverse : CliffordAlgebra (0 : QuadraticForm R Unit) →ₗ[R] _) = LinearMap.id :=
LinearMap.ext reverse_apply
#align clifford_algebra_ring.reverse_eq_id CliffordAlgebraRing.reverse_eq_id
+-/
+#print CliffordAlgebraRing.involute_eq_id /-
@[simp]
theorem involute_eq_id :
(involute : CliffordAlgebra (0 : QuadraticForm R Unit) →ₐ[R] _) = AlgHom.id R _ := by ext; simp
#align clifford_algebra_ring.involute_eq_id CliffordAlgebraRing.involute_eq_id
+-/
+#print CliffordAlgebraRing.equiv /-
/-- The clifford algebra over a 0-dimensional vector space is isomorphic to its scalars. -/
protected def equiv : CliffordAlgebra (0 : QuadraticForm R Unit) ≃ₐ[R] R :=
AlgEquiv.ofAlgHom
@@ -117,6 +126,7 @@ protected def equiv : CliffordAlgebra (0 : QuadraticForm R Unit) ≃ₐ[R] R :=
(Algebra.ofId R _) (by ext x; exact AlgHom.commutes _ x)
(by ext : 1; rw [ι_eq_zero, LinearMap.comp_zero, LinearMap.comp_zero])
#align clifford_algebra_ring.equiv CliffordAlgebraRing.equiv
+-/
end CliffordAlgebraRing
@@ -127,35 +137,44 @@ namespace CliffordAlgebraComplex
open scoped ComplexConjugate
+#print CliffordAlgebraComplex.Q /-
/-- The quadratic form sending elements to the negation of their square. -/
-def q : QuadraticForm ℝ ℝ :=
+def Q : QuadraticForm ℝ ℝ :=
-QuadraticForm.sq
-#align clifford_algebra_complex.Q CliffordAlgebraComplex.q
+#align clifford_algebra_complex.Q CliffordAlgebraComplex.Q
+-/
+#print CliffordAlgebraComplex.Q_apply /-
@[simp]
-theorem q_apply (r : ℝ) : q r = -(r * r) :=
+theorem Q_apply (r : ℝ) : Q r = -(r * r) :=
rfl
-#align clifford_algebra_complex.Q_apply CliffordAlgebraComplex.q_apply
+#align clifford_algebra_complex.Q_apply CliffordAlgebraComplex.Q_apply
+-/
+#print CliffordAlgebraComplex.toComplex /-
/-- Intermediate result for `clifford_algebra_complex.equiv`: clifford algebras over
`clifford_algebra_complex.Q` above can be converted to `ℂ`. -/
-def toComplex : CliffordAlgebra q →ₐ[ℝ] ℂ :=
- CliffordAlgebra.lift q
+def toComplex : CliffordAlgebra Q →ₐ[ℝ] ℂ :=
+ CliffordAlgebra.lift Q
⟨LinearMap.toSpanSingleton _ _ Complex.I, fun r =>
by
dsimp [LinearMap.toSpanSingleton, LinearMap.id]
rw [mul_mul_mul_comm]
simp⟩
#align clifford_algebra_complex.to_complex CliffordAlgebraComplex.toComplex
+-/
+#print CliffordAlgebraComplex.toComplex_ι /-
@[simp]
-theorem toComplex_ι (r : ℝ) : toComplex (ι q r) = r • Complex.I :=
+theorem toComplex_ι (r : ℝ) : toComplex (ι Q r) = r • Complex.I :=
CliffordAlgebra.lift_ι_apply _ _ r
#align clifford_algebra_complex.to_complex_ι CliffordAlgebraComplex.toComplex_ι
+-/
+#print CliffordAlgebraComplex.toComplex_involute /-
/-- `clifford_algebra.involute` is analogous to `complex.conj`. -/
@[simp]
-theorem toComplex_involute (c : CliffordAlgebra q) : toComplex c.involute = conj (toComplex c) :=
+theorem toComplex_involute (c : CliffordAlgebra Q) : toComplex c.involute = conj (toComplex c) :=
by
have : to_complex (involute (ι Q 1)) = conj (to_complex (ι Q 1)) := by
simp only [involute_ι, to_complex_ι, AlgHom.map_neg, one_smul, Complex.conj_I]
@@ -164,20 +183,26 @@ theorem toComplex_involute (c : CliffordAlgebra q) : toComplex c.involute = conj
ext : 2
exact this
#align clifford_algebra_complex.to_complex_involute CliffordAlgebraComplex.toComplex_involute
+-/
+#print CliffordAlgebraComplex.ofComplex /-
/-- Intermediate result for `clifford_algebra_complex.equiv`: `ℂ` can be converted to
`clifford_algebra_complex.Q` above can be converted to. -/
-def ofComplex : ℂ →ₐ[ℝ] CliffordAlgebra q :=
+def ofComplex : ℂ →ₐ[ℝ] CliffordAlgebra Q :=
Complex.lift
- ⟨CliffordAlgebra.ι q 1, by
+ ⟨CliffordAlgebra.ι Q 1, by
rw [CliffordAlgebra.ι_sq_scalar, Q_apply, one_mul, RingHom.map_neg, RingHom.map_one]⟩
#align clifford_algebra_complex.of_complex CliffordAlgebraComplex.ofComplex
+-/
+#print CliffordAlgebraComplex.ofComplex_I /-
@[simp]
-theorem ofComplex_i : ofComplex Complex.I = ι q 1 :=
+theorem ofComplex_I : ofComplex Complex.I = ι Q 1 :=
Complex.liftAux_apply_I _ _
-#align clifford_algebra_complex.of_complex_I CliffordAlgebraComplex.ofComplex_i
+#align clifford_algebra_complex.of_complex_I CliffordAlgebraComplex.ofComplex_I
+-/
+#print CliffordAlgebraComplex.toComplex_comp_ofComplex /-
@[simp]
theorem toComplex_comp_ofComplex : toComplex.comp ofComplex = AlgHom.id ℝ ℂ :=
by
@@ -185,44 +210,54 @@ theorem toComplex_comp_ofComplex : toComplex.comp ofComplex = AlgHom.id ℝ ℂ
dsimp only [AlgHom.comp_apply, Subtype.coe_mk, AlgHom.id_apply]
rw [of_complex_I, to_complex_ι, one_smul]
#align clifford_algebra_complex.to_complex_comp_of_complex CliffordAlgebraComplex.toComplex_comp_ofComplex
+-/
+#print CliffordAlgebraComplex.toComplex_ofComplex /-
@[simp]
theorem toComplex_ofComplex (c : ℂ) : toComplex (ofComplex c) = c :=
AlgHom.congr_fun toComplex_comp_ofComplex c
#align clifford_algebra_complex.to_complex_of_complex CliffordAlgebraComplex.toComplex_ofComplex
+-/
+#print CliffordAlgebraComplex.ofComplex_comp_toComplex /-
@[simp]
-theorem ofComplex_comp_toComplex : ofComplex.comp toComplex = AlgHom.id ℝ (CliffordAlgebra q) :=
+theorem ofComplex_comp_toComplex : ofComplex.comp toComplex = AlgHom.id ℝ (CliffordAlgebra Q) :=
by
ext
dsimp only [LinearMap.comp_apply, Subtype.coe_mk, AlgHom.id_apply, AlgHom.toLinearMap_apply,
AlgHom.comp_apply]
rw [to_complex_ι, one_smul, of_complex_I]
#align clifford_algebra_complex.of_complex_comp_to_complex CliffordAlgebraComplex.ofComplex_comp_toComplex
+-/
+#print CliffordAlgebraComplex.ofComplex_toComplex /-
@[simp]
-theorem ofComplex_toComplex (c : CliffordAlgebra q) : ofComplex (toComplex c) = c :=
+theorem ofComplex_toComplex (c : CliffordAlgebra Q) : ofComplex (toComplex c) = c :=
AlgHom.congr_fun ofComplex_comp_toComplex c
#align clifford_algebra_complex.of_complex_to_complex CliffordAlgebraComplex.ofComplex_toComplex
+-/
+#print CliffordAlgebraComplex.equiv /-
/-- The clifford algebras over `clifford_algebra_complex.Q` is isomorphic as an `ℝ`-algebra to
`ℂ`. -/
@[simps]
-protected def equiv : CliffordAlgebra q ≃ₐ[ℝ] ℂ :=
+protected def equiv : CliffordAlgebra Q ≃ₐ[ℝ] ℂ :=
AlgEquiv.ofAlgHom toComplex ofComplex toComplex_comp_ofComplex ofComplex_comp_toComplex
#align clifford_algebra_complex.equiv CliffordAlgebraComplex.equiv
+-/
/-- The clifford algebra is commutative since it is isomorphic to the complex numbers.
TODO: prove this is true for all `clifford_algebra`s over a 1-dimensional vector space. -/
-instance : CommRing (CliffordAlgebra q) :=
+instance : CommRing (CliffordAlgebra Q) :=
{ CliffordAlgebra.instRing _ with
mul_comm := fun x y =>
CliffordAlgebraComplex.equiv.Injective <| by
rw [AlgEquiv.map_mul, mul_comm, AlgEquiv.map_mul] }
+#print CliffordAlgebraComplex.reverse_apply /-
/-- `reverse` is a no-op over `clifford_algebra_complex.Q`. -/
-theorem reverse_apply (x : CliffordAlgebra q) : x.reverse = x :=
+theorem reverse_apply (x : CliffordAlgebra Q) : x.reverse = x :=
by
induction x using CliffordAlgebra.induction
case h_grade0 r => exact reverse.commutes _
@@ -230,18 +265,23 @@ theorem reverse_apply (x : CliffordAlgebra q) : x.reverse = x :=
case h_mul x₁ x₂ hx₁ hx₂ => rw [reverse.map_mul, mul_comm, hx₁, hx₂]
case h_add x₁ x₂ hx₁ hx₂ => rw [reverse.map_add, hx₁, hx₂]
#align clifford_algebra_complex.reverse_apply CliffordAlgebraComplex.reverse_apply
+-/
+#print CliffordAlgebraComplex.reverse_eq_id /-
@[simp]
-theorem reverse_eq_id : (reverse : CliffordAlgebra q →ₗ[ℝ] _) = LinearMap.id :=
+theorem reverse_eq_id : (reverse : CliffordAlgebra Q →ₗ[ℝ] _) = LinearMap.id :=
LinearMap.ext reverse_apply
#align clifford_algebra_complex.reverse_eq_id CliffordAlgebraComplex.reverse_eq_id
+-/
+#print CliffordAlgebraComplex.ofComplex_conj /-
/-- `complex.conj` is analogous to `clifford_algebra.involute`. -/
@[simp]
theorem ofComplex_conj (c : ℂ) : ofComplex (conj c) = (ofComplex c).involute :=
CliffordAlgebraComplex.equiv.Injective <| by
rw [equiv_apply, equiv_apply, to_complex_involute, to_complex_of_complex, to_complex_of_complex]
#align clifford_algebra_complex.of_complex_conj CliffordAlgebraComplex.ofComplex_conj
+-/
-- this name is too short for us to want it visible after `open clifford_algebra_complex`
attribute [protected] Q
@@ -259,24 +299,29 @@ open QuaternionAlgebra
variable {R : Type _} [CommRing R] (c₁ c₂ : R)
+#print CliffordAlgebraQuaternion.Q /-
/-- `Q c₁ c₂` is a quadratic form over `R × R` such that `clifford_algebra (Q c₁ c₂)` is isomorphic
as an `R`-algebra to `ℍ[R,c₁,c₂]`. -/
-def q : QuadraticForm R (R × R) :=
+def Q : QuadraticForm R (R × R) :=
(c₁ • QuadraticForm.sq).Prod (c₂ • QuadraticForm.sq)
-#align clifford_algebra_quaternion.Q CliffordAlgebraQuaternion.q
+#align clifford_algebra_quaternion.Q CliffordAlgebraQuaternion.Q
+-/
+#print CliffordAlgebraQuaternion.Q_apply /-
@[simp]
-theorem q_apply (v : R × R) : q c₁ c₂ v = c₁ * (v.1 * v.1) + c₂ * (v.2 * v.2) :=
+theorem Q_apply (v : R × R) : Q c₁ c₂ v = c₁ * (v.1 * v.1) + c₂ * (v.2 * v.2) :=
rfl
-#align clifford_algebra_quaternion.Q_apply CliffordAlgebraQuaternion.q_apply
+#align clifford_algebra_quaternion.Q_apply CliffordAlgebraQuaternion.Q_apply
+-/
+#print CliffordAlgebraQuaternion.quaternionBasis /-
/-- The quaternion basis vectors within the algebra. -/
@[simps i j k]
-def quaternionBasis : QuaternionAlgebra.Basis (CliffordAlgebra (q c₁ c₂)) c₁ c₂
+def quaternionBasis : QuaternionAlgebra.Basis (CliffordAlgebra (Q c₁ c₂)) c₁ c₂
where
- i := ι (q c₁ c₂) (1, 0)
- j := ι (q c₁ c₂) (0, 1)
- k := ι (q c₁ c₂) (1, 0) * ι (q c₁ c₂) (0, 1)
+ i := ι (Q c₁ c₂) (1, 0)
+ j := ι (Q c₁ c₂) (0, 1)
+ k := ι (Q c₁ c₂) (1, 0) * ι (Q c₁ c₂) (0, 1)
i_mul_i := by
rw [ι_sq_scalar, Q_apply, ← Algebra.algebraMap_eq_smul_one]
simp
@@ -288,13 +333,15 @@ def quaternionBasis : QuaternionAlgebra.Basis (CliffordAlgebra (q c₁ c₂)) c
rw [eq_neg_iff_add_eq_zero, ι_mul_ι_add_swap, QuadraticForm.polar]
simp
#align clifford_algebra_quaternion.quaternion_basis CliffordAlgebraQuaternion.quaternionBasis
+-/
variable {c₁ c₂}
+#print CliffordAlgebraQuaternion.toQuaternion /-
/-- Intermediate result of `clifford_algebra_quaternion.equiv`: clifford algebras over
`clifford_algebra_quaternion.Q` can be converted to `ℍ[R,c₁,c₂]`. -/
-def toQuaternion : CliffordAlgebra (q c₁ c₂) →ₐ[R] ℍ[R,c₁,c₂] :=
- CliffordAlgebra.lift (q c₁ c₂)
+def toQuaternion : CliffordAlgebra (Q c₁ c₂) →ₐ[R] ℍ[R,c₁,c₂] :=
+ CliffordAlgebra.lift (Q c₁ c₂)
⟨{ toFun := fun v => (⟨0, v.1, v.2, 0⟩ : ℍ[R,c₁,c₂])
map_add' := fun v₁ v₂ => by simp
map_smul' := fun r v => by ext <;> simp }, fun v =>
@@ -303,15 +350,19 @@ def toQuaternion : CliffordAlgebra (q c₁ c₂) →ₐ[R] ℍ[R,c₁,c₂] :=
ext
all_goals dsimp; ring⟩
#align clifford_algebra_quaternion.to_quaternion CliffordAlgebraQuaternion.toQuaternion
+-/
+#print CliffordAlgebraQuaternion.toQuaternion_ι /-
@[simp]
theorem toQuaternion_ι (v : R × R) :
- toQuaternion (ι (q c₁ c₂) v) = (⟨0, v.1, v.2, 0⟩ : ℍ[R,c₁,c₂]) :=
+ toQuaternion (ι (Q c₁ c₂) v) = (⟨0, v.1, v.2, 0⟩ : ℍ[R,c₁,c₂]) :=
CliffordAlgebra.lift_ι_apply _ _ v
#align clifford_algebra_quaternion.to_quaternion_ι CliffordAlgebraQuaternion.toQuaternion_ι
+-/
+#print CliffordAlgebraQuaternion.toQuaternion_star /-
/-- The "clifford conjugate" maps to the quaternion conjugate. -/
-theorem toQuaternion_star (c : CliffordAlgebra (q c₁ c₂)) :
+theorem toQuaternion_star (c : CliffordAlgebra (Q c₁ c₂)) :
toQuaternion (star c) = star (toQuaternion c) :=
by
simp only [CliffordAlgebra.star_def']
@@ -325,23 +376,29 @@ theorem toQuaternion_star (c : CliffordAlgebra (q c₁ c₂)) :
case h_mul x₁ x₂ hx₁ hx₂ => simp only [reverse.map_mul, AlgHom.map_mul, hx₁, hx₂, star_mul]
case h_add x₁ x₂ hx₁ hx₂ => simp only [reverse.map_add, AlgHom.map_add, hx₁, hx₂, star_add]
#align clifford_algebra_quaternion.to_quaternion_star CliffordAlgebraQuaternion.toQuaternion_star
+-/
+#print CliffordAlgebraQuaternion.ofQuaternion /-
/-- Map a quaternion into the clifford algebra. -/
-def ofQuaternion : ℍ[R,c₁,c₂] →ₐ[R] CliffordAlgebra (q c₁ c₂) :=
+def ofQuaternion : ℍ[R,c₁,c₂] →ₐ[R] CliffordAlgebra (Q c₁ c₂) :=
(quaternionBasis c₁ c₂).liftHom
#align clifford_algebra_quaternion.of_quaternion CliffordAlgebraQuaternion.ofQuaternion
+-/
+#print CliffordAlgebraQuaternion.ofQuaternion_mk /-
@[simp]
theorem ofQuaternion_mk (a₁ a₂ a₃ a₄ : R) :
ofQuaternion (⟨a₁, a₂, a₃, a₄⟩ : ℍ[R,c₁,c₂]) =
- algebraMap R _ a₁ + a₂ • ι (q c₁ c₂) (1, 0) + a₃ • ι (q c₁ c₂) (0, 1) +
- a₄ • (ι (q c₁ c₂) (1, 0) * ι (q c₁ c₂) (0, 1)) :=
+ algebraMap R _ a₁ + a₂ • ι (Q c₁ c₂) (1, 0) + a₃ • ι (Q c₁ c₂) (0, 1) +
+ a₄ • (ι (Q c₁ c₂) (1, 0) * ι (Q c₁ c₂) (0, 1)) :=
rfl
#align clifford_algebra_quaternion.of_quaternion_mk CliffordAlgebraQuaternion.ofQuaternion_mk
+-/
+#print CliffordAlgebraQuaternion.ofQuaternion_comp_toQuaternion /-
@[simp]
theorem ofQuaternion_comp_toQuaternion :
- ofQuaternion.comp toQuaternion = AlgHom.id R (CliffordAlgebra (q c₁ c₂)) :=
+ ofQuaternion.comp toQuaternion = AlgHom.id R (CliffordAlgebra (Q c₁ c₂)) :=
by
ext : 1
dsimp
@@ -353,33 +410,43 @@ theorem ofQuaternion_comp_toQuaternion :
dsimp
simp only [to_quaternion_ι, zero_smul, one_smul, zero_add, add_zero, RingHom.map_zero]
#align clifford_algebra_quaternion.of_quaternion_comp_to_quaternion CliffordAlgebraQuaternion.ofQuaternion_comp_toQuaternion
+-/
+#print CliffordAlgebraQuaternion.ofQuaternion_toQuaternion /-
@[simp]
-theorem ofQuaternion_toQuaternion (c : CliffordAlgebra (q c₁ c₂)) :
+theorem ofQuaternion_toQuaternion (c : CliffordAlgebra (Q c₁ c₂)) :
ofQuaternion (toQuaternion c) = c :=
- AlgHom.congr_fun (ofQuaternion_comp_toQuaternion : _ = AlgHom.id R (CliffordAlgebra (q c₁ c₂))) c
+ AlgHom.congr_fun (ofQuaternion_comp_toQuaternion : _ = AlgHom.id R (CliffordAlgebra (Q c₁ c₂))) c
#align clifford_algebra_quaternion.of_quaternion_to_quaternion CliffordAlgebraQuaternion.ofQuaternion_toQuaternion
+-/
+#print CliffordAlgebraQuaternion.toQuaternion_comp_ofQuaternion /-
@[simp]
theorem toQuaternion_comp_ofQuaternion : toQuaternion.comp ofQuaternion = AlgHom.id R ℍ[R,c₁,c₂] :=
by
apply quaternion_algebra.lift.symm.injective
ext1 <;> dsimp [QuaternionAlgebra.Basis.lift] <;> simp
#align clifford_algebra_quaternion.to_quaternion_comp_of_quaternion CliffordAlgebraQuaternion.toQuaternion_comp_ofQuaternion
+-/
+#print CliffordAlgebraQuaternion.toQuaternion_ofQuaternion /-
@[simp]
theorem toQuaternion_ofQuaternion (q : ℍ[R,c₁,c₂]) : toQuaternion (ofQuaternion q) = q :=
AlgHom.congr_fun (toQuaternion_comp_ofQuaternion : _ = AlgHom.id R ℍ[R,c₁,c₂]) q
#align clifford_algebra_quaternion.to_quaternion_of_quaternion CliffordAlgebraQuaternion.toQuaternion_ofQuaternion
+-/
+#print CliffordAlgebraQuaternion.equiv /-
/-- The clifford algebra over `clifford_algebra_quaternion.Q c₁ c₂` is isomorphic as an `R`-algebra
to `ℍ[R,c₁,c₂]`. -/
@[simps]
-protected def equiv : CliffordAlgebra (q c₁ c₂) ≃ₐ[R] ℍ[R,c₁,c₂] :=
+protected def equiv : CliffordAlgebra (Q c₁ c₂) ≃ₐ[R] ℍ[R,c₁,c₂] :=
AlgEquiv.ofAlgHom toQuaternion ofQuaternion toQuaternion_comp_ofQuaternion
ofQuaternion_comp_toQuaternion
#align clifford_algebra_quaternion.equiv CliffordAlgebraQuaternion.equiv
+-/
+#print CliffordAlgebraQuaternion.ofQuaternion_star /-
/-- The quaternion conjugate maps to the "clifford conjugate" (aka `star`). -/
@[simp]
theorem ofQuaternion_star (q : ℍ[R,c₁,c₂]) : ofQuaternion (star q) = star (ofQuaternion q) :=
@@ -387,6 +454,7 @@ theorem ofQuaternion_star (q : ℍ[R,c₁,c₂]) : ofQuaternion (star q) = star
rw [equiv_apply, equiv_apply, to_quaternion_star, to_quaternion_of_quaternion,
to_quaternion_of_quaternion]
#align clifford_algebra_quaternion.of_quaternion_star CliffordAlgebraQuaternion.ofQuaternion_star
+-/
-- this name is too short for us to want it visible after `open clifford_algebra_quaternion`
attribute [protected] Q
@@ -404,12 +472,15 @@ open DualNumber TrivSqZeroExt
variable {R M : Type _} [CommRing R] [AddCommGroup M] [Module R M]
+#print CliffordAlgebraDualNumber.ι_mul_ι /-
theorem ι_mul_ι (r₁ r₂) : ι (0 : QuadraticForm R R) r₁ * ι (0 : QuadraticForm R R) r₂ = 0 := by
rw [← mul_one r₁, ← mul_one r₂, ← smul_eq_mul R, ← smul_eq_mul R, LinearMap.map_smul,
LinearMap.map_smul, smul_mul_smul, ι_sq_scalar, QuadraticForm.zero_apply, RingHom.map_zero,
smul_zero]
#align clifford_algebra_dual_number.ι_mul_ι CliffordAlgebraDualNumber.ι_mul_ι
+-/
+#print CliffordAlgebraDualNumber.equiv /-
/-- The clifford algebra over a 1-dimensional vector space with 0 quadratic form is isomorphic to
the dual numbers. -/
protected def equiv : CliffordAlgebra (0 : QuadraticForm R R) ≃ₐ[R] R[ε] :=
@@ -419,17 +490,22 @@ protected def equiv : CliffordAlgebra (0 : QuadraticForm R R) ≃ₐ[R] R[ε] :=
(by ext x : 1; dsimp; rw [lift_apply_eps, Subtype.coe_mk, lift_ι_apply, inr_hom_apply, eps])
(by ext : 2; dsimp; rw [lift_ι_apply, inr_hom_apply, ← eps, lift_apply_eps, Subtype.coe_mk])
#align clifford_algebra_dual_number.equiv CliffordAlgebraDualNumber.equiv
+-/
+#print CliffordAlgebraDualNumber.equiv_ι /-
@[simp]
theorem equiv_ι (r : R) : CliffordAlgebraDualNumber.equiv (ι _ r) = r • ε :=
(lift_ι_apply _ _ r).trans (inr_eq_smul_eps _)
#align clifford_algebra_dual_number.equiv_ι CliffordAlgebraDualNumber.equiv_ι
+-/
+#print CliffordAlgebraDualNumber.equiv_symm_eps /-
@[simp]
theorem equiv_symm_eps :
CliffordAlgebraDualNumber.equiv.symm (eps : R[ε]) = ι (0 : QuadraticForm R R) 1 :=
DualNumber.lift_apply_eps _
#align clifford_algebra_dual_number.equiv_symm_eps CliffordAlgebraDualNumber.equiv_symm_eps
+-/
end CliffordAlgebraDualNumber
mathlib commit https://github.com/leanprover-community/mathlib/commit/6285167a053ad0990fc88e56c48ccd9fae6550eb
@@ -81,7 +81,7 @@ theorem ι_eq_zero : ι (0 : QuadraticForm R Unit) = 0 :=
/-- Since the vector space is empty the ring is commutative. -/
instance : CommRing (CliffordAlgebra (0 : QuadraticForm R Unit)) :=
- { CliffordAlgebra.ring _ with
+ { CliffordAlgebra.instRing _ with
mul_comm := fun x y => by
induction x using CliffordAlgebra.induction
case h_grade0 r => apply Algebra.commutes
@@ -216,7 +216,7 @@ protected def equiv : CliffordAlgebra q ≃ₐ[ℝ] ℂ :=
TODO: prove this is true for all `clifford_algebra`s over a 1-dimensional vector space. -/
instance : CommRing (CliffordAlgebra q) :=
- { CliffordAlgebra.ring _ with
+ { CliffordAlgebra.instRing _ with
mul_comm := fun x y =>
CliffordAlgebraComplex.equiv.Injective <| by
rw [AlgEquiv.map_mul, mul_comm, AlgEquiv.map_mul] }
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -70,7 +70,7 @@ open CliffordAlgebra
namespace CliffordAlgebraRing
-open ComplexConjugate
+open scoped ComplexConjugate
variable {R : Type _} [CommRing R]
@@ -125,7 +125,7 @@ end CliffordAlgebraRing
namespace CliffordAlgebraComplex
-open ComplexConjugate
+open scoped ComplexConjugate
/-- The quadratic form sending elements to the negation of their square. -/
def q : QuadraticForm ℝ ℝ :=
@@ -253,7 +253,7 @@ end CliffordAlgebraComplex
namespace CliffordAlgebraQuaternion
-open Quaternion
+open scoped Quaternion
open QuaternionAlgebra
@@ -398,7 +398,7 @@ end CliffordAlgebraQuaternion
namespace CliffordAlgebraDualNumber
-open DualNumber
+open scoped DualNumber
open DualNumber TrivSqZeroExt
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -106,10 +106,7 @@ theorem reverse_eq_id :
@[simp]
theorem involute_eq_id :
- (involute : CliffordAlgebra (0 : QuadraticForm R Unit) →ₐ[R] _) = AlgHom.id R _ :=
- by
- ext
- simp
+ (involute : CliffordAlgebra (0 : QuadraticForm R Unit) →ₐ[R] _) = AlgHom.id R _ := by ext; simp
#align clifford_algebra_ring.involute_eq_id CliffordAlgebraRing.involute_eq_id
/-- The clifford algebra over a 0-dimensional vector space is isomorphic to its scalars. -/
@@ -117,13 +114,8 @@ protected def equiv : CliffordAlgebra (0 : QuadraticForm R Unit) ≃ₐ[R] R :=
AlgEquiv.ofAlgHom
(CliffordAlgebra.lift (0 : QuadraticForm R Unit) <|
⟨0, fun m : Unit => (MulZeroClass.zero_mul (0 : R)).trans (algebraMap R _).map_zero.symm⟩)
- (Algebra.ofId R _)
- (by
- ext x
- exact AlgHom.commutes _ x)
- (by
- ext : 1
- rw [ι_eq_zero, LinearMap.comp_zero, LinearMap.comp_zero])
+ (Algebra.ofId R _) (by ext x; exact AlgHom.commutes _ x)
+ (by ext : 1; rw [ι_eq_zero, LinearMap.comp_zero, LinearMap.comp_zero])
#align clifford_algebra_ring.equiv CliffordAlgebraRing.equiv
end CliffordAlgebraRing
@@ -424,14 +416,8 @@ protected def equiv : CliffordAlgebra (0 : QuadraticForm R R) ≃ₐ[R] R[ε] :=
AlgEquiv.ofAlgHom
(CliffordAlgebra.lift (0 : QuadraticForm R R) ⟨inrHom R _, fun m => inr_mul_inr _ m m⟩)
(DualNumber.lift ⟨ι _ (1 : R), ι_mul_ι (1 : R) 1⟩)
- (by
- ext x : 1
- dsimp
- rw [lift_apply_eps, Subtype.coe_mk, lift_ι_apply, inr_hom_apply, eps])
- (by
- ext : 2
- dsimp
- rw [lift_ι_apply, inr_hom_apply, ← eps, lift_apply_eps, Subtype.coe_mk])
+ (by ext x : 1; dsimp; rw [lift_apply_eps, Subtype.coe_mk, lift_ι_apply, inr_hom_apply, eps])
+ (by ext : 2; dsimp; rw [lift_ι_apply, inr_hom_apply, ← eps, lift_apply_eps, Subtype.coe_mk])
#align clifford_algebra_dual_number.equiv CliffordAlgebraDualNumber.equiv
@[simp]
mathlib commit https://github.com/leanprover-community/mathlib/commit/39478763114722f0ec7613cb2f3f7701f9b86c8d
@@ -183,7 +183,7 @@ def ofComplex : ℂ →ₐ[ℝ] CliffordAlgebra q :=
@[simp]
theorem ofComplex_i : ofComplex Complex.I = ι q 1 :=
- Complex.liftAux_apply_i _ _
+ Complex.liftAux_apply_I _ _
#align clifford_algebra_complex.of_complex_I CliffordAlgebraComplex.ofComplex_i
@[simp]
mathlib commit https://github.com/leanprover-community/mathlib/commit/86d04064ca33ee3d3405fbfc497d494fd2dd4796
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Wieser
! This file was ported from Lean 3 source module linear_algebra.clifford_algebra.equivs
-! leanprover-community/mathlib commit 4d66277cfec381260ba05c68f9ae6ce2a118031d
+! leanprover-community/mathlib commit cf7a7252c1989efe5800e0b3cdfeb4228ac6b40e
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -53,7 +53,7 @@ We show additionally that this equivalence sends `quaternion_algebra.conj` to th
and vice-versa:
* `clifford_algebra_quaternion.to_quaternion_star`
-* `clifford_algebra_quaternion.of_quaternion_conj`
+* `clifford_algebra_quaternion.of_quaternion_star`
## Dual numbers
@@ -320,20 +320,18 @@ theorem toQuaternion_ι (v : R × R) :
/-- The "clifford conjugate" maps to the quaternion conjugate. -/
theorem toQuaternion_star (c : CliffordAlgebra (q c₁ c₂)) :
- toQuaternion (star c) = QuaternionAlgebra.conj (toQuaternion c) :=
+ toQuaternion (star c) = star (toQuaternion c) :=
by
simp only [CliffordAlgebra.star_def']
induction c using CliffordAlgebra.induction
case h_grade0 r =>
simp only [reverse.commutes, AlgHom.commutes, QuaternionAlgebra.coe_algebraMap,
- QuaternionAlgebra.conj_coe]
+ QuaternionAlgebra.star_coe]
case h_grade1 x =>
rw [reverse_ι, involute_ι, to_quaternion_ι, AlgHom.map_neg, to_quaternion_ι,
- QuaternionAlgebra.neg_mk, conj_mk, neg_zero]
- case h_mul x₁ x₂ hx₁ hx₂ =>
- simp only [reverse.map_mul, AlgHom.map_mul, hx₁, hx₂, QuaternionAlgebra.conj_mul]
- case h_add x₁ x₂ hx₁ hx₂ =>
- simp only [reverse.map_add, AlgHom.map_add, hx₁, hx₂, QuaternionAlgebra.conj_add]
+ QuaternionAlgebra.neg_mk, star_mk, neg_zero]
+ case h_mul x₁ x₂ hx₁ hx₂ => simp only [reverse.map_mul, AlgHom.map_mul, hx₁, hx₂, star_mul]
+ case h_add x₁ x₂ hx₁ hx₂ => simp only [reverse.map_add, AlgHom.map_add, hx₁, hx₂, star_add]
#align clifford_algebra_quaternion.to_quaternion_star CliffordAlgebraQuaternion.toQuaternion_star
/-- Map a quaternion into the clifford algebra. -/
@@ -392,11 +390,11 @@ protected def equiv : CliffordAlgebra (q c₁ c₂) ≃ₐ[R] ℍ[R,c₁,c₂] :
/-- The quaternion conjugate maps to the "clifford conjugate" (aka `star`). -/
@[simp]
-theorem ofQuaternion_conj (q : ℍ[R,c₁,c₂]) : ofQuaternion q.conj = star (ofQuaternion q) :=
+theorem ofQuaternion_star (q : ℍ[R,c₁,c₂]) : ofQuaternion (star q) = star (ofQuaternion q) :=
CliffordAlgebraQuaternion.equiv.Injective <| by
rw [equiv_apply, equiv_apply, to_quaternion_star, to_quaternion_of_quaternion,
to_quaternion_of_quaternion]
-#align clifford_algebra_quaternion.of_quaternion_conj CliffordAlgebraQuaternion.ofQuaternion_conj
+#align clifford_algebra_quaternion.of_quaternion_star CliffordAlgebraQuaternion.ofQuaternion_star
-- this name is too short for us to want it visible after `open clifford_algebra_quaternion`
attribute [protected] Q
mathlib commit https://github.com/leanprover-community/mathlib/commit/3180fab693e2cee3bff62675571264cb8778b212
@@ -116,7 +116,7 @@ theorem involute_eq_id :
protected def equiv : CliffordAlgebra (0 : QuadraticForm R Unit) ≃ₐ[R] R :=
AlgEquiv.ofAlgHom
(CliffordAlgebra.lift (0 : QuadraticForm R Unit) <|
- ⟨0, fun m : Unit => (zero_mul (0 : R)).trans (algebraMap R _).map_zero.symm⟩)
+ ⟨0, fun m : Unit => (MulZeroClass.zero_mul (0 : R)).trans (algebraMap R _).map_zero.symm⟩)
(Algebra.ofId R _)
(by
ext x
mathlib commit https://github.com/leanprover-community/mathlib/commit/ddec54a71a0dd025c05445d467f1a2b7d586a3ba
@@ -149,7 +149,7 @@ theorem q_apply (r : ℝ) : q r = -(r * r) :=
`clifford_algebra_complex.Q` above can be converted to `ℂ`. -/
def toComplex : CliffordAlgebra q →ₐ[ℝ] ℂ :=
CliffordAlgebra.lift q
- ⟨LinearMap.toSpanSingleton _ _ Complex.i, fun r =>
+ ⟨LinearMap.toSpanSingleton _ _ Complex.I, fun r =>
by
dsimp [LinearMap.toSpanSingleton, LinearMap.id]
rw [mul_mul_mul_comm]
@@ -157,7 +157,7 @@ def toComplex : CliffordAlgebra q →ₐ[ℝ] ℂ :=
#align clifford_algebra_complex.to_complex CliffordAlgebraComplex.toComplex
@[simp]
-theorem toComplex_ι (r : ℝ) : toComplex (ι q r) = r • Complex.i :=
+theorem toComplex_ι (r : ℝ) : toComplex (ι q r) = r • Complex.I :=
CliffordAlgebra.lift_ι_apply _ _ r
#align clifford_algebra_complex.to_complex_ι CliffordAlgebraComplex.toComplex_ι
@@ -166,7 +166,7 @@ theorem toComplex_ι (r : ℝ) : toComplex (ι q r) = r • Complex.i :=
theorem toComplex_involute (c : CliffordAlgebra q) : toComplex c.involute = conj (toComplex c) :=
by
have : to_complex (involute (ι Q 1)) = conj (to_complex (ι Q 1)) := by
- simp only [involute_ι, to_complex_ι, AlgHom.map_neg, one_smul, Complex.conj_i]
+ simp only [involute_ι, to_complex_ι, AlgHom.map_neg, one_smul, Complex.conj_I]
suffices to_complex.comp involute = complex.conj_ae.to_alg_hom.comp to_complex by
exact AlgHom.congr_fun this c
ext : 2
@@ -182,7 +182,7 @@ def ofComplex : ℂ →ₐ[ℝ] CliffordAlgebra q :=
#align clifford_algebra_complex.of_complex CliffordAlgebraComplex.ofComplex
@[simp]
-theorem ofComplex_i : ofComplex Complex.i = ι q 1 :=
+theorem ofComplex_i : ofComplex Complex.I = ι q 1 :=
Complex.liftAux_apply_i _ _
#align clifford_algebra_complex.of_complex_I CliffordAlgebraComplex.ofComplex_i
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -415,9 +415,17 @@ protected def equiv : CliffordAlgebra (0 : QuadraticForm R R) ≃ₐ[R] R[ε] :=
(by
ext : 1
-- This used to be a single `simp` before leanprover/lean4#2644
- simp; erw [lift_ι_apply]; simp)
+ simp only [QuadraticForm.zero_apply, AlgHom.coe_comp, Function.comp_apply, lift_apply_eps,
+ AlgHom.coe_id, id_eq]
+ erw [lift_ι_apply]
+ simp)
-- This used to be a single `simp` before leanprover/lean4#2644
- (by ext : 2; simp; erw [lift_ι_apply]; simp)
+ (by
+ ext : 2
+ simp only [QuadraticForm.zero_apply, AlgHom.comp_toLinearMap, LinearMap.coe_comp,
+ Function.comp_apply, AlgHom.toLinearMap_apply, AlgHom.toLinearMap_id, LinearMap.id_comp]
+ erw [lift_ι_apply]
+ simp)
#align clifford_algebra_dual_number.equiv CliffordAlgebraDualNumber.equiv
@[simp]
CliffordAlgebra
(#10908)
In order to improve the ergonomics of the induction
tactic, this renames the arguments of:
ExteriorAlgebra.induction
TensorAlgebra.induction
CliffordAlgebra.induction
CliffordAlgebra.left_induction
CliffordAlgebra.right_induction
CliffordAlgebra.even_induction
CliffordAlgebra.odd_induction
Submodule.iSup_induction'
Submodule.pow_induction_on_left'
Submodule.pow_induction_on_right'
This is slightly awkward for name-resolution within these induction principles, as the argument names end up clashing with the function they are about. Thankfully, this pain is not transferred to the caller using induction _ using _
.
@@ -81,19 +81,19 @@ instance : CommRing (CliffordAlgebra (0 : QuadraticForm R Unit)) :=
{ CliffordAlgebra.instRing _ with
mul_comm := fun x y => by
induction x using CliffordAlgebra.induction with
- | h_grade0 r => apply Algebra.commutes
- | h_grade1 x => simp
- | h_add x₁ x₂ hx₁ hx₂ => rw [mul_add, add_mul, hx₁, hx₂]
- | h_mul x₁ x₂ hx₁ hx₂ => rw [mul_assoc, hx₂, ← mul_assoc, hx₁, ← mul_assoc] }
+ | algebraMap r => apply Algebra.commutes
+ | ι x => simp
+ | add x₁ x₂ hx₁ hx₂ => rw [mul_add, add_mul, hx₁, hx₂]
+ | mul x₁ x₂ hx₁ hx₂ => rw [mul_assoc, hx₂, ← mul_assoc, hx₁, ← mul_assoc] }
-- Porting note: Changed `x.reverse` to `reverse (R := R) x`
theorem reverse_apply (x : CliffordAlgebra (0 : QuadraticForm R Unit)) :
reverse (R := R) x = x := by
induction x using CliffordAlgebra.induction with
- | h_grade0 r => exact reverse.commutes _
- | h_grade1 x => rw [ι_eq_zero, LinearMap.zero_apply, reverse.map_zero]
- | h_mul x₁ x₂ hx₁ hx₂ => rw [reverse.map_mul, mul_comm, hx₁, hx₂]
- | h_add x₁ x₂ hx₁ hx₂ => rw [reverse.map_add, hx₁, hx₂]
+ | algebraMap r => exact reverse.commutes _
+ | ι x => rw [ι_eq_zero, LinearMap.zero_apply, reverse.map_zero]
+ | mul x₁ x₂ hx₁ hx₂ => rw [reverse.map_mul, mul_comm, hx₁, hx₂]
+ | add x₁ x₂ hx₁ hx₂ => rw [reverse.map_add, hx₁, hx₂]
#align clifford_algebra_ring.reverse_apply CliffordAlgebraRing.reverse_apply
@[simp]
@@ -222,10 +222,10 @@ instance : CommRing (CliffordAlgebra Q) :=
/-- `reverse` is a no-op over `CliffordAlgebraComplex.Q`. -/
theorem reverse_apply (x : CliffordAlgebra Q) : reverse (R := ℝ) x = x := by
induction x using CliffordAlgebra.induction with
- | h_grade0 r => exact reverse.commutes _
- | h_grade1 x => rw [reverse_ι]
- | h_mul x₁ x₂ hx₁ hx₂ => rw [reverse.map_mul, mul_comm, hx₁, hx₂]
- | h_add x₁ x₂ hx₁ hx₂ => rw [reverse.map_add, hx₁, hx₂]
+ | algebraMap r => exact reverse.commutes _
+ | ι x => rw [reverse_ι]
+ | mul x₁ x₂ hx₁ hx₂ => rw [reverse.map_mul, mul_comm, hx₁, hx₂]
+ | add x₁ x₂ hx₁ hx₂ => rw [reverse.map_add, hx₁, hx₂]
#align clifford_algebra_complex.reverse_apply CliffordAlgebraComplex.reverse_apply
@[simp]
@@ -312,14 +312,14 @@ theorem toQuaternion_star (c : CliffordAlgebra (Q c₁ c₂)) :
toQuaternion (star c) = star (toQuaternion c) := by
simp only [CliffordAlgebra.star_def']
induction c using CliffordAlgebra.induction with
- | h_grade0 r =>
+ | algebraMap r =>
simp only [reverse.commutes, AlgHom.commutes, QuaternionAlgebra.coe_algebraMap,
QuaternionAlgebra.star_coe]
- | h_grade1 x =>
+ | ι x =>
rw [reverse_ι, involute_ι, toQuaternion_ι, AlgHom.map_neg, toQuaternion_ι,
QuaternionAlgebra.neg_mk, star_mk, neg_zero]
- | h_mul x₁ x₂ hx₁ hx₂ => simp only [reverse.map_mul, AlgHom.map_mul, hx₁, hx₂, star_mul]
- | h_add x₁ x₂ hx₁ hx₂ => simp only [reverse.map_add, AlgHom.map_add, hx₁, hx₂, star_add]
+ | mul x₁ x₂ hx₁ hx₂ => simp only [reverse.map_mul, AlgHom.map_mul, hx₁, hx₂, star_mul]
+ | add x₁ x₂ hx₁ hx₂ => simp only [reverse.map_add, AlgHom.map_add, hx₁, hx₂, star_add]
#align clifford_algebra_quaternion.to_quaternion_star CliffordAlgebraQuaternion.toQuaternion_star
/-- Map a quaternion into the clifford algebra. -/
toFun
and smul
in Algebra.id
(#9949)
The current definition of Algebra.id
is (RingHom.id _).toAlgebra
. The problem with this is that RingHom.id
is a def
and is not reducible. Thus Lean will often refuse to unfold it causing unification to fail unecessarily in typeclass searches. This overrides the data fields from RingHom.id
.
@@ -295,7 +295,7 @@ def toQuaternion : CliffordAlgebra (Q c₁ c₂) →ₐ[R] ℍ[R,c₁,c₂] :=
CliffordAlgebra.lift (Q c₁ c₂)
⟨{ toFun := fun v => (⟨0, v.1, v.2, 0⟩ : ℍ[R,c₁,c₂])
map_add' := fun v₁ v₂ => by simp
- map_smul' := fun r v => by dsimp; rw [mul_zero]; rfl }, fun v => by
+ map_smul' := fun r v => by dsimp; rw [mul_zero] }, fun v => by
dsimp
ext
all_goals dsimp; ring⟩
This result was basically already here, this just registers it with ext
.
@@ -357,8 +357,7 @@ theorem ofQuaternion_toQuaternion (c : CliffordAlgebra (Q c₁ c₂)) :
@[simp]
theorem toQuaternion_comp_ofQuaternion :
toQuaternion.comp ofQuaternion = AlgHom.id R ℍ[R,c₁,c₂] := by
- apply QuaternionAlgebra.lift.symm.injective
- ext1 <;> dsimp [QuaternionAlgebra.Basis.lift] <;> simp
+ ext : 1 <;> simp
#align clifford_algebra_quaternion.to_quaternion_comp_of_quaternion CliffordAlgebraQuaternion.toQuaternion_comp_ofQuaternion
@[simp]
cases x with | ...
instead of cases x; case => ...
(#9321)
This converts usages of the pattern
cases h
case inl h' => ...
case inr h' => ...
which derive from mathported code, to the "structured cases
" syntax:
cases h with
| inl h' => ...
| inr h' => ...
The case where the subgoals are handled with ·
instead of case
is more contentious (and much more numerous) so I left those alone. This pattern also appears with cases'
, induction
, induction'
, and rcases
. Furthermore, there is a similar transformation for by_cases
:
by_cases h : cond
case pos => ...
case neg => ...
is replaced by:
if h : cond then
...
else
...
Co-authored-by: Mario Carneiro <di.gama@gmail.com>
@@ -80,20 +80,20 @@ theorem ι_eq_zero : ι (0 : QuadraticForm R Unit) = 0 :=
instance : CommRing (CliffordAlgebra (0 : QuadraticForm R Unit)) :=
{ CliffordAlgebra.instRing _ with
mul_comm := fun x y => by
- induction x using CliffordAlgebra.induction
- case h_grade0 r => apply Algebra.commutes
- case h_grade1 x => simp
- case h_add x₁ x₂ hx₁ hx₂ => rw [mul_add, add_mul, hx₁, hx₂]
- case h_mul x₁ x₂ hx₁ hx₂ => rw [mul_assoc, hx₂, ← mul_assoc, hx₁, ← mul_assoc] }
+ induction x using CliffordAlgebra.induction with
+ | h_grade0 r => apply Algebra.commutes
+ | h_grade1 x => simp
+ | h_add x₁ x₂ hx₁ hx₂ => rw [mul_add, add_mul, hx₁, hx₂]
+ | h_mul x₁ x₂ hx₁ hx₂ => rw [mul_assoc, hx₂, ← mul_assoc, hx₁, ← mul_assoc] }
-- Porting note: Changed `x.reverse` to `reverse (R := R) x`
theorem reverse_apply (x : CliffordAlgebra (0 : QuadraticForm R Unit)) :
reverse (R := R) x = x := by
- induction x using CliffordAlgebra.induction
- case h_grade0 r => exact reverse.commutes _
- case h_grade1 x => rw [ι_eq_zero, LinearMap.zero_apply, reverse.map_zero]
- case h_mul x₁ x₂ hx₁ hx₂ => rw [reverse.map_mul, mul_comm, hx₁, hx₂]
- case h_add x₁ x₂ hx₁ hx₂ => rw [reverse.map_add, hx₁, hx₂]
+ induction x using CliffordAlgebra.induction with
+ | h_grade0 r => exact reverse.commutes _
+ | h_grade1 x => rw [ι_eq_zero, LinearMap.zero_apply, reverse.map_zero]
+ | h_mul x₁ x₂ hx₁ hx₂ => rw [reverse.map_mul, mul_comm, hx₁, hx₂]
+ | h_add x₁ x₂ hx₁ hx₂ => rw [reverse.map_add, hx₁, hx₂]
#align clifford_algebra_ring.reverse_apply CliffordAlgebraRing.reverse_apply
@[simp]
@@ -221,11 +221,11 @@ instance : CommRing (CliffordAlgebra Q) :=
-- Porting note: Changed `x.reverse` to `reverse (R := ℝ) x`
/-- `reverse` is a no-op over `CliffordAlgebraComplex.Q`. -/
theorem reverse_apply (x : CliffordAlgebra Q) : reverse (R := ℝ) x = x := by
- induction x using CliffordAlgebra.induction
- case h_grade0 r => exact reverse.commutes _
- case h_grade1 x => rw [reverse_ι]
- case h_mul x₁ x₂ hx₁ hx₂ => rw [reverse.map_mul, mul_comm, hx₁, hx₂]
- case h_add x₁ x₂ hx₁ hx₂ => rw [reverse.map_add, hx₁, hx₂]
+ induction x using CliffordAlgebra.induction with
+ | h_grade0 r => exact reverse.commutes _
+ | h_grade1 x => rw [reverse_ι]
+ | h_mul x₁ x₂ hx₁ hx₂ => rw [reverse.map_mul, mul_comm, hx₁, hx₂]
+ | h_add x₁ x₂ hx₁ hx₂ => rw [reverse.map_add, hx₁, hx₂]
#align clifford_algebra_complex.reverse_apply CliffordAlgebraComplex.reverse_apply
@[simp]
@@ -311,15 +311,15 @@ theorem toQuaternion_ι (v : R × R) :
theorem toQuaternion_star (c : CliffordAlgebra (Q c₁ c₂)) :
toQuaternion (star c) = star (toQuaternion c) := by
simp only [CliffordAlgebra.star_def']
- induction c using CliffordAlgebra.induction
- case h_grade0 r =>
+ induction c using CliffordAlgebra.induction with
+ | h_grade0 r =>
simp only [reverse.commutes, AlgHom.commutes, QuaternionAlgebra.coe_algebraMap,
QuaternionAlgebra.star_coe]
- case h_grade1 x =>
+ | h_grade1 x =>
rw [reverse_ι, involute_ι, toQuaternion_ι, AlgHom.map_neg, toQuaternion_ι,
QuaternionAlgebra.neg_mk, star_mk, neg_zero]
- case h_mul x₁ x₂ hx₁ hx₂ => simp only [reverse.map_mul, AlgHom.map_mul, hx₁, hx₂, star_mul]
- case h_add x₁ x₂ hx₁ hx₂ => simp only [reverse.map_add, AlgHom.map_add, hx₁, hx₂, star_add]
+ | h_mul x₁ x₂ hx₁ hx₂ => simp only [reverse.map_mul, AlgHom.map_mul, hx₁, hx₂, star_mul]
+ | h_add x₁ x₂ hx₁ hx₂ => simp only [reverse.map_add, AlgHom.map_add, hx₁, hx₂, star_add]
#align clifford_algebra_quaternion.to_quaternion_star CliffordAlgebraQuaternion.toQuaternion_star
/-- Map a quaternion into the clifford algebra. -/
The current universal properties of TrivSqZeroExt
and DualNumber
work only when the underlying ring is commutative.
This is not the case for things like the dual quaternions.
This generalizes both sets of results to the non-commutative case.
Unfortunately the new TrivSqZeroExt
version is rather involved, so this keeps the old statement as a special case.
The new DualNumber
version is less bad, so I just discarded the commutative special case.
For dual numbers, the generalization is from R[ε] →ₐ[R] B
to A[ε] →ₐ[R] B
, where R
is commutative but A
may not be.
Some variable names had to be shuffled to make the new statement look nice.
@@ -409,9 +409,14 @@ the dual numbers. -/
protected def equiv : CliffordAlgebra (0 : QuadraticForm R R) ≃ₐ[R] R[ε] :=
AlgEquiv.ofAlgHom
(CliffordAlgebra.lift (0 : QuadraticForm R R) ⟨inrHom R _, fun m => inr_mul_inr _ m m⟩)
- (DualNumber.lift ⟨ι (R := R) _ 1, ι_mul_ι (1 : R) 1⟩)
- -- This used to be a single `simp` before leanprover/lean4#2644
- (by ext : 1; simp; erw [lift_ι_apply]; simp)
+ (DualNumber.lift ⟨
+ (Algebra.ofId _ _, ι (R := R) _ 1),
+ ι_mul_ι (1 : R) 1,
+ fun _ => (Algebra.commutes _ _).symm⟩)
+ (by
+ ext : 1
+ -- This used to be a single `simp` before leanprover/lean4#2644
+ simp; erw [lift_ι_apply]; simp)
-- This used to be a single `simp` before leanprover/lean4#2644
(by ext : 2; simp; erw [lift_ι_apply]; simp)
#align clifford_algebra_dual_number.equiv CliffordAlgebraDualNumber.equiv
@@ -425,7 +430,7 @@ theorem equiv_ι (r : R) : CliffordAlgebraDualNumber.equiv (ι (R := R) _ r) = r
theorem equiv_symm_eps :
CliffordAlgebraDualNumber.equiv.symm (eps : R[ε]) = ι (0 : QuadraticForm R R) 1 :=
-- Porting note: Original proof was `DualNumber.lift_apply_eps _`
- DualNumber.lift_apply_eps (R := R) (A := CliffordAlgebra (0 : QuadraticForm R R)) _
+ DualNumber.lift_apply_eps (R := R) (B := CliffordAlgebra (0 : QuadraticForm R R)) _
#align clifford_algebra_dual_number.equiv_symm_eps CliffordAlgebraDualNumber.equiv_symm_eps
end CliffordAlgebraDualNumber
This caused a few downstream proofs to fail with "no goals", forcing them to be golfed!
@@ -112,7 +112,7 @@ protected def equiv : CliffordAlgebra (0 : QuadraticForm R Unit) ≃ₐ[R] R :=
AlgEquiv.ofAlgHom
(CliffordAlgebra.lift (0 : QuadraticForm R Unit) <|
⟨0, fun m : Unit => (zero_mul (0 : R)).trans (algebraMap R _).map_zero.symm⟩)
- (Algebra.ofId R _) (by ext x; exact AlgHom.commutes _ x)
+ (Algebra.ofId R _) (by ext)
(by ext : 1; rw [ι_eq_zero, LinearMap.comp_zero, LinearMap.comp_zero])
#align clifford_algebra_ring.equiv CliffordAlgebraRing.equiv
@@ -410,8 +410,10 @@ protected def equiv : CliffordAlgebra (0 : QuadraticForm R R) ≃ₐ[R] R[ε] :=
AlgEquiv.ofAlgHom
(CliffordAlgebra.lift (0 : QuadraticForm R R) ⟨inrHom R _, fun m => inr_mul_inr _ m m⟩)
(DualNumber.lift ⟨ι (R := R) _ 1, ι_mul_ι (1 : R) 1⟩)
- (by ext : 1; simp)
- (by ext : 2; simp)
+ -- This used to be a single `simp` before leanprover/lean4#2644
+ (by ext : 1; simp; erw [lift_ι_apply]; simp)
+ -- This used to be a single `simp` before leanprover/lean4#2644
+ (by ext : 2; simp; erw [lift_ι_apply]; simp)
#align clifford_algebra_dual_number.equiv CliffordAlgebraDualNumber.equiv
@[simp]
@@ -410,10 +410,8 @@ protected def equiv : CliffordAlgebra (0 : QuadraticForm R R) ≃ₐ[R] R[ε] :=
AlgEquiv.ofAlgHom
(CliffordAlgebra.lift (0 : QuadraticForm R R) ⟨inrHom R _, fun m => inr_mul_inr _ m m⟩)
(DualNumber.lift ⟨ι (R := R) _ 1, ι_mul_ι (1 : R) 1⟩)
- -- This used to be a single `simp` before leanprover/lean4#2644
- (by ext : 1; simp; erw [lift_ι_apply]; simp)
- -- This used to be a single `simp` before leanprover/lean4#2644
- (by ext : 2; simp; erw [lift_ι_apply]; simp)
+ (by ext : 1; simp)
+ (by ext : 2; simp)
#align clifford_algebra_dual_number.equiv CliffordAlgebraDualNumber.equiv
@[simp]
@@ -410,8 +410,10 @@ protected def equiv : CliffordAlgebra (0 : QuadraticForm R R) ≃ₐ[R] R[ε] :=
AlgEquiv.ofAlgHom
(CliffordAlgebra.lift (0 : QuadraticForm R R) ⟨inrHom R _, fun m => inr_mul_inr _ m m⟩)
(DualNumber.lift ⟨ι (R := R) _ 1, ι_mul_ι (1 : R) 1⟩)
- (by ext : 1; simp)
- (by ext : 2; simp)
+ -- This used to be a single `simp` before leanprover/lean4#2644
+ (by ext : 1; simp; erw [lift_ι_apply]; simp)
+ -- This used to be a single `simp` before leanprover/lean4#2644
+ (by ext : 2; simp; erw [lift_ι_apply]; simp)
#align clifford_algebra_dual_number.equiv CliffordAlgebraDualNumber.equiv
@[simp]
MulZeroClass.
in mul_zero
/zero_mul
(#6682)
Search&replace MulZeroClass.mul_zero
-> mul_zero
, MulZeroClass.zero_mul
-> zero_mul
.
These were introduced by Mathport, as the full name of mul_zero
is actually MulZeroClass.mul_zero
(it's exported with the short name).
@@ -111,7 +111,7 @@ theorem involute_eq_id :
protected def equiv : CliffordAlgebra (0 : QuadraticForm R Unit) ≃ₐ[R] R :=
AlgEquiv.ofAlgHom
(CliffordAlgebra.lift (0 : QuadraticForm R Unit) <|
- ⟨0, fun m : Unit => (MulZeroClass.zero_mul (0 : R)).trans (algebraMap R _).map_zero.symm⟩)
+ ⟨0, fun m : Unit => (zero_mul (0 : R)).trans (algebraMap R _).map_zero.symm⟩)
(Algebra.ofId R _) (by ext x; exact AlgHom.commutes _ x)
(by ext : 1; rw [ι_eq_zero, LinearMap.comp_zero, LinearMap.comp_zero])
#align clifford_algebra_ring.equiv CliffordAlgebraRing.equiv
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -69,7 +69,7 @@ namespace CliffordAlgebraRing
open scoped ComplexConjugate
-variable {R : Type _} [CommRing R]
+variable {R : Type*} [CommRing R]
@[simp]
theorem ι_eq_zero : ι (0 : QuadraticForm R Unit) = 0 :=
@@ -254,7 +254,7 @@ open scoped Quaternion
open QuaternionAlgebra
-variable {R : Type _} [CommRing R] (c₁ c₂ : R)
+variable {R : Type*} [CommRing R] (c₁ c₂ : R)
/-- `Q c₁ c₂` is a quadratic form over `R × R` such that `CliffordAlgebra (Q c₁ c₂)` is isomorphic
as an `R`-algebra to `ℍ[R,c₁,c₂]`. -/
@@ -396,7 +396,7 @@ open scoped DualNumber
open DualNumber TrivSqZeroExt
-variable {R M : Type _} [CommRing R] [AddCommGroup M] [Module R M]
+variable {R M : Type*} [CommRing R] [AddCommGroup M] [Module R M]
theorem ι_mul_ι (r₁ r₂) : ι (0 : QuadraticForm R R) r₁ * ι (0 : QuadraticForm R R) r₂ = 0 := by
rw [← mul_one r₁, ← mul_one r₂, ← smul_eq_mul R, ← smul_eq_mul R, LinearMap.map_smul,
@@ -54,7 +54,7 @@ and vice-versa:
## Dual numbers
-* `CliffordAlgebraDualNumber.equiv`: `R[ε]` is is equivalent as an `R`-algebra to a clifford
+* `CliffordAlgebraDualNumber.equiv`: `R[ε]` is equivalent as an `R`-algebra to a clifford
algebra over `R` where `Q = 0`.
-/
@@ -2,11 +2,6 @@
Copyright (c) 2021 Eric Wieser. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Eric Wieser
-
-! This file was ported from Lean 3 source module linear_algebra.clifford_algebra.equivs
-! leanprover-community/mathlib commit cf7a7252c1989efe5800e0b3cdfeb4228ac6b40e
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Algebra.DualNumber
import Mathlib.Algebra.QuaternionBasis
@@ -15,6 +10,8 @@ import Mathlib.LinearAlgebra.CliffordAlgebra.Conjugation
import Mathlib.LinearAlgebra.CliffordAlgebra.Star
import Mathlib.LinearAlgebra.QuadraticForm.Prod
+#align_import linear_algebra.clifford_algebra.equivs from "leanprover-community/mathlib"@"cf7a7252c1989efe5800e0b3cdfeb4228ac6b40e"
+
/-!
# Other constructions isomorphic to Clifford Algebras
The unported dependencies are
algebra.order.module
init.core
linear_algebra.free_module.finite.rank
algebra.order.monoid.cancel.defs
algebra.abs
algebra.group_power.lemmas
init.data.list.basic
linear_algebra.free_module.rank
algebra.order.monoid.cancel.basic
init.data.list.default
topology.subset_properties
init.logic
The following 1 dependencies have changed in mathlib3 since they were ported, which may complicate porting this file