[{"name": "T2Space", "doc": "A T₂ space, also known as a Hausdorff space, is one in which for every\n`x ≠ y` there exists disjoint open sets around `x` and `y`. This is\nthe most widely used of the separation axioms. ", "type": "(X : Type u) → [TopologicalSpace X] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "Every two points in a Hausdorff space admit disjoint open neighbourhoods. ", "kind": "field", "name": "t2", "owner": "T2Space", "proj": "T2Space.t2", "type": "∀ {X : Type u} {inst : TopologicalSpace X} [self : T2Space X],\n  Pairwise fun x y => ∃ u v, IsOpen u ∧ IsOpen v ∧ x ∈ u ∧ y ∈ v ∧ Disjoint u v"}], "addedOverParents": [{"doc": "Every two points in a Hausdorff space admit disjoint open neighbourhoods. ", "kind": "field", "name": "t2", "owner": "T2Space", "proj": "T2Space.t2", "type": "∀ {X : Type u} {inst : TopologicalSpace X} [self : T2Space X],\n  Pairwise fun x y => ∃ u v, IsOpen u ∧ IsOpen v ∧ x ∈ u ∧ y ∈ v ∧ Disjoint u v"}], "fieldCount": 1}, {"name": "T1Space", "doc": "A T₁ space, also known as a Fréchet space, is a topological space\nwhere every singleton set is closed. Equivalently, for every pair\n`x ≠ y`, there is an open set containing `x` and not `y`. ", "type": "(X : Type u) → [TopologicalSpace X] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "A singleton in a T₁ space is a closed set. ", "kind": "field", "name": "t1", "owner": "T1Space", "proj": "T1Space.t1", "type": "∀ {X : Type u} {inst : TopologicalSpace X} [self : T1Space X] (x : X), IsClosed {x}"}], "addedOverParents": [{"doc": "A singleton in a T₁ space is a closed set. ", "kind": "field", "name": "t1", "owner": "T1Space", "proj": "T1Space.t1", "type": "∀ {X : Type u} {inst : TopologicalSpace X} [self : T1Space X] (x : X), IsClosed {x}"}], "fieldCount": 1}, {"name": "CompletelyRegularSpace", "doc": "A space is completely regular if points can be separated from closed sets via\ncontinuous functions to the unit interval. ", "type": "(X : Type u) → [TopologicalSpace X] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "", "kind": "field", "name": "completely_regular", "owner": "CompletelyRegularSpace", "proj": "CompletelyRegularSpace.completely_regular", "type": "∀ {X : Type u} {inst : TopologicalSpace X} [self : CompletelyRegularSpace X] (x : X) (K : Set X),\n  IsClosed K → x ∉ K → ∃ f, Continuous f ∧ f x = 0 ∧ Set.EqOn f 1 K"}], "addedOverParents": [{"doc": "", "kind": "field", "name": "completely_regular", "owner": "CompletelyRegularSpace", "proj": "CompletelyRegularSpace.completely_regular", "type": "∀ {X : Type u} {inst : TopologicalSpace X} [self : CompletelyRegularSpace X] (x : X) (K : Set X),\n  IsClosed K → x ∉ K → ∃ f, Continuous f ∧ f x = 0 ∧ Set.EqOn f 1 K"}], "fieldCount": 1}, {"name": "RegularSpace", "doc": "A topological space is called a *regular space* if for any closed set `s` and `a ∉ s`, there\nexist disjoint open sets `U ⊇ s` and `V ∋ a`. We formulate this condition in terms of `Disjoint`ness\nof filters `𝓝ˢ s` and `𝓝 a`. ", "type": "(X : Type u) → [TopologicalSpace X] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "If `a` is a point that does not belong to a closed set `s`, then `a` and `s` admit disjoint\nneighborhoods. ", "kind": "field", "name": "regular", "owner": "RegularSpace", "proj": "RegularSpace.regular", "type": "∀ {X : Type u} {inst : TopologicalSpace X} [self : RegularSpace X] {s : Set X} {a : X},\n  IsClosed s → a ∉ s → Disjoint (nhdsSet s) (nhds a)"}], "addedOverParents": [{"doc": "If `a` is a point that does not belong to a closed set `s`, then `a` and `s` admit disjoint\nneighborhoods. ", "kind": "field", "name": "regular", "owner": "RegularSpace", "proj": "RegularSpace.regular", "type": "∀ {X : Type u} {inst : TopologicalSpace X} [self : RegularSpace X] {s : Set X} {a : X},\n  IsClosed s → a ∉ s → Disjoint (nhdsSet s) (nhds a)"}], "fieldCount": 1}, {"name": "PseudoEMetricSpace", "doc": "A pseudo extended metric space is a type endowed with a `ℝ≥0∞`-valued distance `edist`\nsatisfying reflexivity `edist x x = 0`, commutativity `edist x y = edist y x`, and the triangle\ninequality `edist x z ≤ edist x y + edist y z`.\n\nNote that we do not require `edist x y = 0 → x = y`. See extended metric spaces (`EMetricSpace`) for\nthe similar class with that stronger assumption.\n\nAny pseudo extended metric space is a topological space and a uniform space (see `TopologicalSpace`,\n`UniformSpace`), where the topology and uniformity come from the metric.\nNote that a T1 pseudo extended metric space is just an extended metric space.\n\nWe make the uniformity/topology part of the data instead of deriving it from the metric. This e.g.\nensures that we do not get a diamond when doing\n`[PseudoEMetricSpace α] [PseudoEMetricSpace β] : TopologicalSpace (α × β)`:\nThe product metric and product topology agree, but not definitionally so.\nSee Note [forgetful inheritance]. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "`EDist α` means that `α` is equipped with an extended distance. ", "name": "EDist", "projection": "PseudoEMetricSpace.toEDist", "subobject": true, "type": "Type u_2 → Type u_2"}], "ownFields": [{"doc": "", "kind": "field", "name": "edist_self", "owner": "PseudoEMetricSpace", "proj": "PseudoEMetricSpace.edist_self", "type": "∀ {α : Type u} [self : PseudoEMetricSpace α] (x : α), edist x x = 0"}, {"doc": "", "kind": "field", "name": "edist_comm", "owner": "PseudoEMetricSpace", "proj": "PseudoEMetricSpace.edist_comm", "type": "∀ {α : Type u} [self : PseudoEMetricSpace α] (x y : α), edist x y = edist y x"}, {"doc": "", "kind": "field", "name": "edist_triangle", "owner": "PseudoEMetricSpace", "proj": "PseudoEMetricSpace.edist_triangle", "type": "∀ {α : Type u} [self : PseudoEMetricSpace α] (x y z : α), edist x z ≤ edist x y + edist y z"}, {"doc": "", "kind": "field", "name": "toUniformSpace", "owner": "PseudoEMetricSpace", "proj": "PseudoEMetricSpace.toUniformSpace", "type": "{α : Type u} → [self : PseudoEMetricSpace α] → UniformSpace α"}, {"doc": "", "kind": "field", "name": "uniformity_edist", "owner": "PseudoEMetricSpace", "proj": "PseudoEMetricSpace.uniformity_edist", "type": "∀ {α : Type u} [self : PseudoEMetricSpace α],\n  uniformity α = ⨅ ε, ⨅ (_ : ε > 0), Filter.principal {p | edist p.1 p.2 < ε}"}], "addedOverParents": [{"doc": "", "kind": "field", "name": "edist_self", "owner": "PseudoEMetricSpace", "proj": "PseudoEMetricSpace.edist_self", "type": "∀ {α : Type u} [self : PseudoEMetricSpace α] (x : α), edist x x = 0"}, {"doc": "", "kind": "field", "name": "edist_comm", "owner": "PseudoEMetricSpace", "proj": "PseudoEMetricSpace.edist_comm", "type": "∀ {α : Type u} [self : PseudoEMetricSpace α] (x y : α), edist x y = edist y x"}, {"doc": "", "kind": "field", "name": "edist_triangle", "owner": "PseudoEMetricSpace", "proj": "PseudoEMetricSpace.edist_triangle", "type": "∀ {α : Type u} [self : PseudoEMetricSpace α] (x y z : α), edist x z ≤ edist x y + edist y z"}, {"doc": "", "kind": "field", "name": "toUniformSpace", "owner": "PseudoEMetricSpace", "proj": "PseudoEMetricSpace.toUniformSpace", "type": "{α : Type u} → [self : PseudoEMetricSpace α] → UniformSpace α"}, {"doc": "", "kind": "field", "name": "uniformity_edist", "owner": "PseudoEMetricSpace", "proj": "PseudoEMetricSpace.uniformity_edist", "type": "∀ {α : Type u} [self : PseudoEMetricSpace α],\n  uniformity α = ⨅ ε, ⨅ (_ : ε > 0), Filter.principal {p | edist p.1 p.2 < ε}"}], "fieldCount": 6}, {"name": "FirstCountableTopology", "doc": "A first-countable space is one in which every point has a\ncountable neighborhood basis. ", "type": "(α : Type u) → [t : TopologicalSpace α] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "The filter `𝓝 a` is countably generated for all points `a`. ", "kind": "field", "name": "nhds_generated_countable", "owner": "FirstCountableTopology", "proj": "FirstCountableTopology.nhds_generated_countable", "type": "∀ {α : Type u} {t : TopologicalSpace α} [self : FirstCountableTopology α] (a : α),\n  (nhds a).IsCountablyGenerated"}], "addedOverParents": [{"doc": "The filter `𝓝 a` is countably generated for all points `a`. ", "kind": "field", "name": "nhds_generated_countable", "owner": "FirstCountableTopology", "proj": "FirstCountableTopology.nhds_generated_countable", "type": "∀ {α : Type u} {t : TopologicalSpace α} [self : FirstCountableTopology α] (a : α),\n  (nhds a).IsCountablyGenerated"}], "fieldCount": 1}, {"name": "EDist", "doc": "`EDist α` means that `α` is equipped with an extended distance. ", "type": "Type u_2 → Type u_2", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "Extended distance between two points ", "kind": "field", "name": "edist", "owner": "EDist", "proj": "EDist.edist", "type": "{α : Type u_2} → [self : EDist α] → α → α → ENNReal"}], "addedOverParents": [{"doc": "Extended distance between two points ", "kind": "field", "name": "edist", "owner": "EDist", "proj": "EDist.edist", "type": "{α : Type u_2} → [self : EDist α] → α → α → ENNReal"}], "fieldCount": 1}, {"name": "UniformSpace", "doc": "A uniform space is a generalization of the \"uniform\" topological aspects of a\nmetric space. It consists of a filter on `α × α` called the \"uniformity\", which\nsatisfies properties analogous to the reflexivity, symmetry, and triangle properties\nof a metric.\n\nA metric space has a natural uniformity, and a uniform space has a natural topology.\nA topological group also has a natural uniformity, even when it is not metrizable. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A topology on `X`. ", "name": "TopologicalSpace", "projection": "UniformSpace.toTopologicalSpace", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "The uniformity filter. ", "kind": "field", "name": "uniformity", "owner": "UniformSpace", "proj": "UniformSpace.uniformity", "type": "{α : Type u} → [self : UniformSpace α] → Filter (α × α)"}, {"doc": "If `s ∈ uniformity`, then `Prod.swap ⁻¹' s ∈ uniformity`. ", "kind": "field", "name": "symm", "owner": "UniformSpace", "proj": "UniformSpace.symm", "type": "∀ {α : Type u} [self : UniformSpace α],\n  Filter.Tendsto Prod.swap UniformSpace.uniformity UniformSpace.uniformity"}, {"doc": "For every set `u ∈ uniformity`, there exists `v ∈ uniformity` such that `v ○ v ⊆ u`. ", "kind": "field", "name": "comp", "owner": "UniformSpace", "proj": "UniformSpace.comp", "type": "∀ {α : Type u} [self : UniformSpace α],\n  (UniformSpace.uniformity.lift' fun s => SetRel.comp s s) ≤ UniformSpace.uniformity"}, {"doc": "The uniformity agrees with the topology: the neighborhoods filter of each point `x`\nis equal to `Filter.comap (Prod.mk x) (𝓤 α)`. ", "kind": "field", "name": "nhds_eq_comap_uniformity", "owner": "UniformSpace", "proj": "UniformSpace.nhds_eq_comap_uniformity", "type": "∀ {α : Type u} [self : UniformSpace α] (x : α),\n  nhds x = Filter.comap (Prod.mk x) UniformSpace.uniformity"}], "addedOverParents": [{"doc": "The uniformity filter. ", "kind": "field", "name": "uniformity", "owner": "UniformSpace", "proj": "UniformSpace.uniformity", "type": "{α : Type u} → [self : UniformSpace α] → Filter (α × α)"}, {"doc": "If `s ∈ uniformity`, then `Prod.swap ⁻¹' s ∈ uniformity`. ", "kind": "field", "name": "symm", "owner": "UniformSpace", "proj": "UniformSpace.symm", "type": "∀ {α : Type u} [self : UniformSpace α],\n  Filter.Tendsto Prod.swap UniformSpace.uniformity UniformSpace.uniformity"}, {"doc": "For every set `u ∈ uniformity`, there exists `v ∈ uniformity` such that `v ○ v ⊆ u`. ", "kind": "field", "name": "comp", "owner": "UniformSpace", "proj": "UniformSpace.comp", "type": "∀ {α : Type u} [self : UniformSpace α],\n  (UniformSpace.uniformity.lift' fun s => SetRel.comp s s) ≤ UniformSpace.uniformity"}, {"doc": "The uniformity agrees with the topology: the neighborhoods filter of each point `x`\nis equal to `Filter.comap (Prod.mk x) (𝓤 α)`. ", "kind": "field", "name": "nhds_eq_comap_uniformity", "owner": "UniformSpace", "proj": "UniformSpace.nhds_eq_comap_uniformity", "type": "∀ {α : Type u} [self : UniformSpace α] (x : α),\n  nhds x = Filter.comap (Prod.mk x) UniformSpace.uniformity"}], "fieldCount": 8}, {"name": "Dist", "doc": "The distance function (given an ambient metric space on `α`), which returns\na nonnegative real number `dist x y` given `x y : α`. ", "type": "Type u_3 → Type u_3", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "Distance between two points ", "kind": "field", "name": "dist", "owner": "Dist", "proj": "Dist.dist", "type": "{α : Type u_3} → [self : Dist α] → α → α → ℝ"}], "addedOverParents": [{"doc": "Distance between two points ", "kind": "field", "name": "dist", "owner": "Dist", "proj": "Dist.dist", "type": "{α : Type u_3} → [self : Dist α] → α → α → ℝ"}], "fieldCount": 1}, {"name": "TopologicalSpace", "doc": "A topology on `X`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "A predicate saying that a set is an open set. Use `IsOpen` in the root namespace instead. ", "kind": "field", "name": "IsOpen", "owner": "TopologicalSpace", "proj": "TopologicalSpace.IsOpen", "type": "{X : Type u} → [self : TopologicalSpace X] → Set X → Prop"}, {"doc": "The set representing the whole space is an open set.\nUse `isOpen_univ` in the root namespace instead. ", "kind": "field", "name": "isOpen_univ", "owner": "TopologicalSpace", "proj": "TopologicalSpace.isOpen_univ", "type": "∀ {X : Type u} [self : TopologicalSpace X], TopologicalSpace.IsOpen Set.univ"}, {"doc": "The intersection of two open sets is an open set. Use `IsOpen.inter` instead. ", "kind": "field", "name": "isOpen_inter", "owner": "TopologicalSpace", "proj": "TopologicalSpace.isOpen_inter", "type": "∀ {X : Type u} [self : TopologicalSpace X] (s t : Set X),\n  TopologicalSpace.IsOpen s → TopologicalSpace.IsOpen t → TopologicalSpace.IsOpen (s ∩ t)"}, {"doc": "The union of a family of open sets is an open set.\nUse `isOpen_sUnion` in the root namespace instead. ", "kind": "field", "name": "isOpen_sUnion", "owner": "TopologicalSpace", "proj": "TopologicalSpace.isOpen_sUnion", "type": "∀ {X : Type u} [self : TopologicalSpace X] (s : Set (Set X)),\n  (∀ t ∈ s, TopologicalSpace.IsOpen t) → TopologicalSpace.IsOpen (⋃₀ s)"}], "addedOverParents": [{"doc": "A predicate saying that a set is an open set. Use `IsOpen` in the root namespace instead. ", "kind": "field", "name": "IsOpen", "owner": "TopologicalSpace", "proj": "TopologicalSpace.IsOpen", "type": "{X : Type u} → [self : TopologicalSpace X] → Set X → Prop"}, {"doc": "The set representing the whole space is an open set.\nUse `isOpen_univ` in the root namespace instead. ", "kind": "field", "name": "isOpen_univ", "owner": "TopologicalSpace", "proj": "TopologicalSpace.isOpen_univ", "type": "∀ {X : Type u} [self : TopologicalSpace X], TopologicalSpace.IsOpen Set.univ"}, {"doc": "The intersection of two open sets is an open set. Use `IsOpen.inter` instead. ", "kind": "field", "name": "isOpen_inter", "owner": "TopologicalSpace", "proj": "TopologicalSpace.isOpen_inter", "type": "∀ {X : Type u} [self : TopologicalSpace X] (s t : Set X),\n  TopologicalSpace.IsOpen s → TopologicalSpace.IsOpen t → TopologicalSpace.IsOpen (s ∩ t)"}, {"doc": "The union of a family of open sets is an open set.\nUse `isOpen_sUnion` in the root namespace instead. ", "kind": "field", "name": "isOpen_sUnion", "owner": "TopologicalSpace", "proj": "TopologicalSpace.isOpen_sUnion", "type": "∀ {X : Type u} [self : TopologicalSpace X] (s : Set (Set X)),\n  (∀ t ∈ s, TopologicalSpace.IsOpen t) → TopologicalSpace.IsOpen (⋃₀ s)"}], "fieldCount": 4}, {"name": "FrechetUrysohnSpace", "doc": "A topological space is called a *Fréchet-Urysohn space*, if the sequential closure of any set\nis equal to its closure. Since one of the inclusions is trivial, we require only the non-trivial one\nin the definition. ", "type": "(X : Type u_1) → [TopologicalSpace X] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "", "kind": "field", "name": "closure_subset_seqClosure", "owner": "FrechetUrysohnSpace", "proj": "FrechetUrysohnSpace.closure_subset_seqClosure", "type": "∀ {X : Type u_1} {inst : TopologicalSpace X} [self : FrechetUrysohnSpace X] (s : Set X),\n  closure s ⊆ seqClosure s"}], "addedOverParents": [{"doc": "", "kind": "field", "name": "closure_subset_seqClosure", "owner": "FrechetUrysohnSpace", "proj": "FrechetUrysohnSpace.closure_subset_seqClosure", "type": "∀ {X : Type u_1} {inst : TopologicalSpace X} [self : FrechetUrysohnSpace X] (s : Set X),\n  closure s ⊆ seqClosure s"}], "fieldCount": 1}, {"name": "SequentialSpace", "doc": "A topological space is said to be a *sequential space* if any sequentially closed set in this\nspace is closed. This condition is weaker than being a Fréchet-Urysohn space. ", "type": "(X : Type u_1) → [TopologicalSpace X] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "", "kind": "field", "name": "isClosed_of_seq", "owner": "SequentialSpace", "proj": "SequentialSpace.isClosed_of_seq", "type": "∀ {X : Type u_1} {inst : TopologicalSpace X} [self : SequentialSpace X] (s : Set X),\n  IsSeqClosed s → IsClosed s"}], "addedOverParents": [{"doc": "", "kind": "field", "name": "isClosed_of_seq", "owner": "SequentialSpace", "proj": "SequentialSpace.isClosed_of_seq", "type": "∀ {X : Type u_1} {inst : TopologicalSpace X} [self : SequentialSpace X] (s : Set X),\n  IsSeqClosed s → IsClosed s"}], "fieldCount": 1}, {"name": "Bornology", "doc": "A **bornology** on a type `α` is a filter of cobounded sets which contains the cofinite filter.\nSuch spaces are equivalently specified by their bounded sets, see `Bornology.ofBounded`\nand `Bornology.ext_iff_isBounded` ", "type": "Type u_4 → Type u_4", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "The filter of cobounded sets in a bornology. ", "kind": "field", "name": "cobounded", "owner": "Bornology", "proj": "Bornology.cobounded", "type": "(α : Type u_4) → [self : Bornology α] → Filter α"}, {"doc": "The cobounded filter in a bornology is smaller than the cofinite filter. ", "kind": "field", "name": "le_cofinite", "owner": "Bornology", "proj": "Bornology.le_cofinite", "type": "∀ (α : Type u_4) [self : Bornology α], Bornology.cobounded α ≤ Filter.cofinite"}], "addedOverParents": [{"doc": "The filter of cobounded sets in a bornology. ", "kind": "field", "name": "cobounded", "owner": "Bornology", "proj": "Bornology.cobounded", "type": "(α : Type u_4) → [self : Bornology α] → Filter α"}, {"doc": "The cobounded filter in a bornology is smaller than the cofinite filter. ", "kind": "field", "name": "le_cofinite", "owner": "Bornology", "proj": "Bornology.le_cofinite", "type": "∀ (α : Type u_4) [self : Bornology α], Bornology.cobounded α ≤ Filter.cofinite"}], "fieldCount": 2}, {"name": "EMetricSpace", "doc": "An extended metric space is a type endowed with a `ℝ≥0∞`-valued distance `edist` satisfying\n`edist x y = 0 ↔ x = y`, commutativity `edist x y = edist y x`, and the triangle inequality\n`edist x z ≤ edist x y + edist y z`.\n\nSee pseudo extended metric spaces (`PseudoEMetricSpace`) for the similar class with the\n`edist x y = 0 ↔ x = y` assumption weakened to `edist x x = 0`.\n\nAny extended metric space is a T1 topological space and a uniform space (see `TopologicalSpace`,\n`T1Space`, `UniformSpace`), where the topology and uniformity come from the metric.\n\nWe make the uniformity/topology part of the data instead of deriving it from the metric.\nThis e.g. ensures that we do not get a diamond when doing\n`[EMetricSpace α] [EMetricSpace β] : TopologicalSpace (α × β)`:\nThe product metric and product topology agree, but not definitionally so.\nSee Note [forgetful inheritance]. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A pseudo extended metric space is a type endowed with a `ℝ≥0∞`-valued distance `edist`\nsatisfying reflexivity `edist x x = 0`, commutativity `edist x y = edist y x`, and the triangle\ninequality `edist x z ≤ edist x y + edist y z`.\n\nNote that we do not require `edist x y = 0 → x = y`. See extended metric spaces (`EMetricSpace`) for\nthe similar class with that stronger assumption.\n\nAny pseudo extended metric space is a topological space and a uniform space (see `TopologicalSpace`,\n`UniformSpace`), where the topology and uniformity come from the metric.\nNote that a T1 pseudo extended metric space is just an extended metric space.\n\nWe make the uniformity/topology part of the data instead of deriving it from the metric. This e.g.\nensures that we do not get a diamond when doing\n`[PseudoEMetricSpace α] [PseudoEMetricSpace β] : TopologicalSpace (α × β)`:\nThe product metric and product topology agree, but not definitionally so.\nSee Note [forgetful inheritance]. ", "name": "PseudoEMetricSpace", "projection": "EMetricSpace.toPseudoEMetricSpace", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "", "kind": "field", "name": "eq_of_edist_eq_zero", "owner": "EMetricSpace", "proj": "EMetricSpace.eq_of_edist_eq_zero", "type": "∀ {α : Type u} [self : EMetricSpace α] {x y : α}, edist x y = 0 → x = y"}], "addedOverParents": [{"doc": "", "kind": "field", "name": "eq_of_edist_eq_zero", "owner": "EMetricSpace", "proj": "EMetricSpace.eq_of_edist_eq_zero", "type": "∀ {α : Type u} [self : EMetricSpace α] {x y : α}, edist x y = 0 → x = y"}], "fieldCount": 7}, {"name": "T0Space", "doc": "A T₀ space, also known as a Kolmogorov space, is a topological space such that for every pair\n`x ≠ y`, there is an open set containing one but not the other. We formulate the definition in terms\nof the `Inseparable` relation. ", "type": "(X : Type u) → [TopologicalSpace X] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "Two inseparable points in a T₀ space are equal. ", "kind": "field", "name": "t0", "owner": "T0Space", "proj": "T0Space.t0", "type": "∀ {X : Type u} {inst : TopologicalSpace X} [self : T0Space X] ⦃x y : X⦄, Inseparable x y → x = y"}], "addedOverParents": [{"doc": "Two inseparable points in a T₀ space are equal. ", "kind": "field", "name": "t0", "owner": "T0Space", "proj": "T0Space.t0", "type": "∀ {X : Type u} {inst : TopologicalSpace X} [self : T0Space X] ⦃x y : X⦄, Inseparable x y → x = y"}], "fieldCount": 1}, {"name": "MetricSpace", "doc": "A metric space is a type endowed with a `ℝ`-valued distance `dist` satisfying\n`dist x y = 0 ↔ x = y`, commutativity `dist x y = dist y x`, and the triangle inequality\n`dist x z ≤ dist x y + dist y z`.\n\nSee pseudometric spaces (`PseudoMetricSpace`) for the similar class with the `dist x y = 0 ↔ x = y`\nassumption weakened to `dist x x = 0`.\n\nAny metric space is a T1 topological space and a uniform space (see `TopologicalSpace`, `T1Space`,\n`UniformSpace`), where the topology and uniformity come from the metric.\n\nWe make the uniformity/topology part of the data instead of deriving it from the metric.\nThis e.g. ensures that we do not get a diamond when doing\n`[MetricSpace α] [MetricSpace β] : TopologicalSpace (α × β)`:\nThe product metric and product topology agree, but not definitionally so.\nSee Note [forgetful inheritance]. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A pseudometric space is a type endowed with a `ℝ`-valued distance `dist` satisfying\nreflexivity `dist x x = 0`, commutativity `dist x y = dist y x`, and the triangle inequality\n`dist x z ≤ dist x y + dist y z`.\n\nNote that we do not require `dist x y = 0 → x = y`. See metric spaces (`MetricSpace`) for the\nsimilar class with that stronger assumption.\n\nAny pseudometric space is a topological space and a uniform space (see `TopologicalSpace`,\n`UniformSpace`), where the topology and uniformity come from the metric.\nNote that a T1 pseudometric space is just a metric space.\n\nWe make the uniformity/topology part of the data instead of deriving it from the metric. This e.g.\nensures that we do not get a diamond when doing\n`[PseudoMetricSpace α] [PseudoMetricSpace β] : TopologicalSpace (α × β)`:\nThe product metric and product topology agree, but not definitionally so.\nSee Note [forgetful inheritance]. ", "name": "PseudoMetricSpace", "projection": "MetricSpace.toPseudoMetricSpace", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "", "kind": "field", "name": "eq_of_dist_eq_zero", "owner": "MetricSpace", "proj": "MetricSpace.eq_of_dist_eq_zero", "type": "∀ {α : Type u} [self : MetricSpace α] {x y : α}, dist x y = 0 → x = y"}], "addedOverParents": [{"doc": "", "kind": "field", "name": "eq_of_dist_eq_zero", "owner": "MetricSpace", "proj": "MetricSpace.eq_of_dist_eq_zero", "type": "∀ {α : Type u} [self : MetricSpace α] {x y : α}, dist x y = 0 → x = y"}], "fieldCount": 11}, {"name": "PseudoMetricSpace", "doc": "A pseudometric space is a type endowed with a `ℝ`-valued distance `dist` satisfying\nreflexivity `dist x x = 0`, commutativity `dist x y = dist y x`, and the triangle inequality\n`dist x z ≤ dist x y + dist y z`.\n\nNote that we do not require `dist x y = 0 → x = y`. See metric spaces (`MetricSpace`) for the\nsimilar class with that stronger assumption.\n\nAny pseudometric space is a topological space and a uniform space (see `TopologicalSpace`,\n`UniformSpace`), where the topology and uniformity come from the metric.\nNote that a T1 pseudometric space is just a metric space.\n\nWe make the uniformity/topology part of the data instead of deriving it from the metric. This e.g.\nensures that we do not get a diamond when doing\n`[PseudoMetricSpace α] [PseudoMetricSpace β] : TopologicalSpace (α × β)`:\nThe product metric and product topology agree, but not definitionally so.\nSee Note [forgetful inheritance]. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "The distance function (given an ambient metric space on `α`), which returns\na nonnegative real number `dist x y` given `x y : α`. ", "name": "Dist", "projection": "PseudoMetricSpace.toDist", "subobject": true, "type": "Type u_3 → Type u_3"}], "ownFields": [{"doc": "", "kind": "field", "name": "dist_self", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.dist_self", "type": "∀ {α : Type u} [self : PseudoMetricSpace α] (x : α), dist x x = 0"}, {"doc": "", "kind": "field", "name": "dist_comm", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.dist_comm", "type": "∀ {α : Type u} [self : PseudoMetricSpace α] (x y : α), dist x y = dist y x"}, {"doc": "", "kind": "field", "name": "dist_triangle", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.dist_triangle", "type": "∀ {α : Type u} [self : PseudoMetricSpace α] (x y z : α), dist x z ≤ dist x y + dist y z"}, {"doc": "Extended distance between two points ", "kind": "field", "name": "edist", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.edist", "type": "{α : Type u} → [self : PseudoMetricSpace α] → α → α → ENNReal"}, {"doc": "", "kind": "field", "name": "edist_dist", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.edist_dist", "type": "∀ {α : Type u} [self : PseudoMetricSpace α] (x y : α),\n  PseudoMetricSpace.edist x y = ENNReal.ofReal (dist x y)"}, {"doc": "", "kind": "field", "name": "toUniformSpace", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.toUniformSpace", "type": "{α : Type u} → [self : PseudoMetricSpace α] → UniformSpace α"}, {"doc": "", "kind": "field", "name": "uniformity_dist", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.uniformity_dist", "type": "∀ {α : Type u} [self : PseudoMetricSpace α],\n  uniformity α = ⨅ ε, ⨅ (_ : ε > 0), Filter.principal {p | dist p.1 p.2 < ε}"}, {"doc": "", "kind": "field", "name": "toBornology", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.toBornology", "type": "{α : Type u} → [self : PseudoMetricSpace α] → Bornology α"}, {"doc": "", "kind": "field", "name": "cobounded_sets", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.cobounded_sets", "type": "∀ {α : Type u} [self : PseudoMetricSpace α],\n  (Bornology.cobounded α).sets = {s | ∃ C, ∀ x ∈ sᶜ, ∀ y ∈ sᶜ, dist x y ≤ C}"}], "addedOverParents": [{"doc": "", "kind": "field", "name": "dist_self", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.dist_self", "type": "∀ {α : Type u} [self : PseudoMetricSpace α] (x : α), dist x x = 0"}, {"doc": "", "kind": "field", "name": "dist_comm", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.dist_comm", "type": "∀ {α : Type u} [self : PseudoMetricSpace α] (x y : α), dist x y = dist y x"}, {"doc": "", "kind": "field", "name": "dist_triangle", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.dist_triangle", "type": "∀ {α : Type u} [self : PseudoMetricSpace α] (x y z : α), dist x z ≤ dist x y + dist y z"}, {"doc": "Extended distance between two points ", "kind": "field", "name": "edist", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.edist", "type": "{α : Type u} → [self : PseudoMetricSpace α] → α → α → ENNReal"}, {"doc": "", "kind": "field", "name": "edist_dist", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.edist_dist", "type": "∀ {α : Type u} [self : PseudoMetricSpace α] (x y : α),\n  PseudoMetricSpace.edist x y = ENNReal.ofReal (dist x y)"}, {"doc": "", "kind": "field", "name": "toUniformSpace", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.toUniformSpace", "type": "{α : Type u} → [self : PseudoMetricSpace α] → UniformSpace α"}, {"doc": "", "kind": "field", "name": "uniformity_dist", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.uniformity_dist", "type": "∀ {α : Type u} [self : PseudoMetricSpace α],\n  uniformity α = ⨅ ε, ⨅ (_ : ε > 0), Filter.principal {p | dist p.1 p.2 < ε}"}, {"doc": "", "kind": "field", "name": "toBornology", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.toBornology", "type": "{α : Type u} → [self : PseudoMetricSpace α] → Bornology α"}, {"doc": "", "kind": "field", "name": "cobounded_sets", "owner": "PseudoMetricSpace", "proj": "PseudoMetricSpace.cobounded_sets", "type": "∀ {α : Type u} [self : PseudoMetricSpace α],\n  (Bornology.cobounded α).sets = {s | ∃ C, ∀ x ∈ sᶜ, ∀ y ∈ sᶜ, dist x y ≤ C}"}], "fieldCount": 10}, {"name": "ContinuousMul", "doc": "Basic hypothesis to talk about a topological monoid or a topological semigroup.\nA topological monoid over `M`, for example, is obtained by requiring both the instances `Monoid M`\nand `ContinuousMul M`.\n\nContinuity in each argument separately can be stated using `SeparatelyContinuousMul α`. If one wants\nonly continuity in either the left or right argument, but not both one can use\n`ContinuousConstSMul α α`/`ContinuousConstSMul αᵐᵒᵖ α`. ", "type": "(M : Type u_1) → [TopologicalSpace M] → [Mul M] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "", "kind": "field", "name": "continuous_mul", "owner": "ContinuousMul", "proj": "ContinuousMul.continuous_mul", "type": "∀ {M : Type u_1} {inst : TopologicalSpace M} {inst_1 : Mul M} [self : ContinuousMul M],\n  Continuous fun p => p.1 * p.2"}], "addedOverParents": [{"doc": "", "kind": "field", "name": "continuous_mul", "owner": "ContinuousMul", "proj": "ContinuousMul.continuous_mul", "type": "∀ {M : Type u_1} {inst : TopologicalSpace M} {inst_1 : Mul M} [self : ContinuousMul M],\n  Continuous fun p => p.1 * p.2"}], "fieldCount": 1}, {"name": "IsTopologicalAddGroup", "doc": "A topological (additive) group is a group in which the addition and negation operations are\ncontinuous.\n\nWhen you declare an instance that does not already have a `UniformSpace` instance,\nyou should also provide an instance of `UniformSpace` and `IsUniformAddGroup` using\n`IsTopologicalAddGroup.rightUniformSpace` and `isUniformAddGroup_of_addCommGroup`. ", "type": "(G : Type u) → [TopologicalSpace G] → [AddGroup G] → Prop", "isAbbrev": false, "parents": [{"doc": "Basic hypothesis to talk about a topological additive monoid or a topological additive\nsemigroup. A topological additive monoid over `M`, for example, is obtained by requiring both the\ninstances `AddMonoid M` and `ContinuousAdd M`.\n\nContinuity in each argument separately can be stated using `SeparatelyContinuousAdd α`. If one wants\nonly continuity in either the left or right argument, but not both one can use\n`ContinuousConstVAdd α α`/`ContinuousConstVAdd αᵐᵒᵖ α`. ", "name": "ContinuousAdd", "projection": "IsTopologicalAddGroup.toContinuousAdd", "subobject": true, "type": "(M : Type u_1) → [TopologicalSpace M] → [Add M] → Prop"}, {"doc": "Basic hypothesis to talk about a topological additive group. A topological additive group\nover `M`, for example, is obtained by requiring the instances `AddGroup M` and\n`ContinuousAdd M` and `ContinuousNeg M`. ", "name": "ContinuousNeg", "projection": "IsTopologicalAddGroup.toContinuousNeg", "subobject": true, "type": "(G : Type u) → [TopologicalSpace G] → [Neg G] → Prop"}], "ownFields": [], "addedOverParents": [], "fieldCount": 2}, {"name": "ContinuousAdd", "doc": "Basic hypothesis to talk about a topological additive monoid or a topological additive\nsemigroup. A topological additive monoid over `M`, for example, is obtained by requiring both the\ninstances `AddMonoid M` and `ContinuousAdd M`.\n\nContinuity in each argument separately can be stated using `SeparatelyContinuousAdd α`. If one wants\nonly continuity in either the left or right argument, but not both one can use\n`ContinuousConstVAdd α α`/`ContinuousConstVAdd αᵐᵒᵖ α`. ", "type": "(M : Type u_1) → [TopologicalSpace M] → [Add M] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "", "kind": "field", "name": "continuous_add", "owner": "ContinuousAdd", "proj": "ContinuousAdd.continuous_add", "type": "∀ {M : Type u_1} {inst : TopologicalSpace M} {inst_1 : Add M} [self : ContinuousAdd M],\n  Continuous fun p => p.1 + p.2"}], "addedOverParents": [{"doc": "", "kind": "field", "name": "continuous_add", "owner": "ContinuousAdd", "proj": "ContinuousAdd.continuous_add", "type": "∀ {M : Type u_1} {inst : TopologicalSpace M} {inst_1 : Add M} [self : ContinuousAdd M],\n  Continuous fun p => p.1 + p.2"}], "fieldCount": 1}, {"name": "ContinuousNeg", "doc": "Basic hypothesis to talk about a topological additive group. A topological additive group\nover `M`, for example, is obtained by requiring the instances `AddGroup M` and\n`ContinuousAdd M` and `ContinuousNeg M`. ", "type": "(G : Type u) → [TopologicalSpace G] → [Neg G] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "", "kind": "field", "name": "continuous_neg", "owner": "ContinuousNeg", "proj": "ContinuousNeg.continuous_neg", "type": "∀ {G : Type u} {inst : TopologicalSpace G} {inst_1 : Neg G} [self : ContinuousNeg G],\n  Continuous fun a => -a"}], "addedOverParents": [{"doc": "", "kind": "field", "name": "continuous_neg", "owner": "ContinuousNeg", "proj": "ContinuousNeg.continuous_neg", "type": "∀ {G : Type u} {inst : TopologicalSpace G} {inst_1 : Neg G} [self : ContinuousNeg G],\n  Continuous fun a => -a"}], "fieldCount": 1}, {"name": "IsTopologicalRing", "doc": "A topological ring is a ring `R` where addition, multiplication and negation are continuous.\n\nIf `R` is a (unital) ring, then continuity of negation can be derived from continuity of\nmultiplication as it is multiplication with `-1`. (See `IsTopologicalSemiring.continuousNeg_of_mul`\nand `IsTopologicalSemiring.toIsTopologicalRing`) ", "type": "(R : Type u_1) → [TopologicalSpace R] → [NonUnitalNonAssocRing R] → Prop", "isAbbrev": false, "parents": [{"doc": "A topological semiring is a semiring `R` where addition and multiplication are continuous.\nWe allow for non-unital and non-associative semirings as well.\n\nThe `IsTopologicalSemiring` class should *only* be instantiated in the presence of a\n`NonUnitalNonAssocSemiring` instance; if there is an instance of `NonUnitalNonAssocRing`,\nthen `IsTopologicalRing` should be used. Note: in the presence of `NonAssocRing`, these classes are\nmathematically equivalent (see `IsTopologicalSemiring.continuousNeg_of_mul` or\n`IsTopologicalSemiring.toIsTopologicalRing`). ", "name": "IsTopologicalSemiring", "projection": "IsTopologicalRing.toIsTopologicalSemiring", "subobject": true, "type": "(R : Type u_1) → [TopologicalSpace R] → [NonUnitalNonAssocSemiring R] → Prop"}, {"doc": "Basic hypothesis to talk about a topological additive group. A topological additive group\nover `M`, for example, is obtained by requiring the instances `AddGroup M` and\n`ContinuousAdd M` and `ContinuousNeg M`. ", "name": "ContinuousNeg", "projection": "IsTopologicalRing.toContinuousNeg", "subobject": true, "type": "(G : Type u) → [TopologicalSpace G] → [Neg G] → Prop"}], "ownFields": [], "addedOverParents": [], "fieldCount": 3}, {"name": "IsTopologicalSemiring", "doc": "A topological semiring is a semiring `R` where addition and multiplication are continuous.\nWe allow for non-unital and non-associative semirings as well.\n\nThe `IsTopologicalSemiring` class should *only* be instantiated in the presence of a\n`NonUnitalNonAssocSemiring` instance; if there is an instance of `NonUnitalNonAssocRing`,\nthen `IsTopologicalRing` should be used. Note: in the presence of `NonAssocRing`, these classes are\nmathematically equivalent (see `IsTopologicalSemiring.continuousNeg_of_mul` or\n`IsTopologicalSemiring.toIsTopologicalRing`). ", "type": "(R : Type u_1) → [TopologicalSpace R] → [NonUnitalNonAssocSemiring R] → Prop", "isAbbrev": false, "parents": [{"doc": "Basic hypothesis to talk about a topological additive monoid or a topological additive\nsemigroup. A topological additive monoid over `M`, for example, is obtained by requiring both the\ninstances `AddMonoid M` and `ContinuousAdd M`.\n\nContinuity in each argument separately can be stated using `SeparatelyContinuousAdd α`. If one wants\nonly continuity in either the left or right argument, but not both one can use\n`ContinuousConstVAdd α α`/`ContinuousConstVAdd αᵐᵒᵖ α`. ", "name": "ContinuousAdd", "projection": "IsTopologicalSemiring.toContinuousAdd", "subobject": true, "type": "(M : Type u_1) → [TopologicalSpace M] → [Add M] → Prop"}, {"doc": "Basic hypothesis to talk about a topological monoid or a topological semigroup.\nA topological monoid over `M`, for example, is obtained by requiring both the instances `Monoid M`\nand `ContinuousMul M`.\n\nContinuity in each argument separately can be stated using `SeparatelyContinuousMul α`. If one wants\nonly continuity in either the left or right argument, but not both one can use\n`ContinuousConstSMul α α`/`ContinuousConstSMul αᵐᵒᵖ α`. ", "name": "ContinuousMul", "projection": "IsTopologicalSemiring.toContinuousMul", "subobject": true, "type": "(M : Type u_1) → [TopologicalSpace M] → [Mul M] → Prop"}], "ownFields": [], "addedOverParents": [], "fieldCount": 2}, {"name": "IsUniformAddGroup", "doc": "A uniform additive group is an additive group in which addition and negation are\nuniformly continuous.\n\n`IsUniformAddGroup G` is equivalent to the fact that `G` is a topological additive group, and the\nuniformity coincides with **both** the associated left and right uniformities\n(see `IsUniformAddGroup.isRightUniformAddGroup`, `IsUniformAddGroup.isLeftUniformAddGroup` and\n`IsUniformAddGroup.of_left_right`).\n\nSince there are topological groups where these two uniformities do **not** coincide,\nnot all topological groups admit a uniform group structure in this sense. This is however the\ncase for commutative groups, which are the main motivation for the existence of this\ntypeclass. ", "type": "(α : Type u_3) → [UniformSpace α] → [AddGroup α] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "", "kind": "field", "name": "uniformContinuous_sub", "owner": "IsUniformAddGroup", "proj": "IsUniformAddGroup.uniformContinuous_sub", "type": "∀ {α : Type u_3} {inst : UniformSpace α} {inst_1 : AddGroup α} [self : IsUniformAddGroup α],\n  UniformContinuous fun p => p.1 - p.2"}], "addedOverParents": [{"doc": "", "kind": "field", "name": "uniformContinuous_sub", "owner": "IsUniformAddGroup", "proj": "IsUniformAddGroup.uniformContinuous_sub", "type": "∀ {α : Type u_3} {inst : UniformSpace α} {inst_1 : AddGroup α} [self : IsUniformAddGroup α],\n  UniformContinuous fun p => p.1 - p.2"}], "fieldCount": 1}, {"name": "NormedRing", "doc": "A normed ring is a ring endowed with a norm which satisfies the inequality `‖x y‖ ≤ ‖x‖ ‖y‖`. ", "type": "Type u_5 → Type u_5", "isAbbrev": false, "parents": [{"doc": "Auxiliary class, endowing a type `E` with a function `norm : E → ℝ` with notation `‖x‖`. This\nclass is designed to be extended in more interesting classes specifying the properties of the norm.\n", "name": "Norm", "projection": "NormedRing.toNorm", "subobject": true, "type": "Type u_8 → Type u_8"}, {"doc": "A `Ring` is a `Semiring` with negation making it an additive group. ", "name": "Ring", "projection": "NormedRing.toRing", "subobject": true, "type": "Type u → Type u"}, {"doc": "A metric space is a type endowed with a `ℝ`-valued distance `dist` satisfying\n`dist x y = 0 ↔ x = y`, commutativity `dist x y = dist y x`, and the triangle inequality\n`dist x z ≤ dist x y + dist y z`.\n\nSee pseudometric spaces (`PseudoMetricSpace`) for the similar class with the `dist x y = 0 ↔ x = y`\nassumption weakened to `dist x x = 0`.\n\nAny metric space is a T1 topological space and a uniform space (see `TopologicalSpace`, `T1Space`,\n`UniformSpace`), where the topology and uniformity come from the metric.\n\nWe make the uniformity/topology part of the data instead of deriving it from the metric.\nThis e.g. ensures that we do not get a diamond when doing\n`[MetricSpace α] [MetricSpace β] : TopologicalSpace (α × β)`:\nThe product metric and product topology agree, but not definitionally so.\nSee Note [forgetful inheritance]. ", "name": "MetricSpace", "projection": "NormedRing.toMetricSpace", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "The distance is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "NormedRing", "proj": "NormedRing.dist_eq", "type": "∀ {α : Type u_5} [self : NormedRing α] (x y : α), dist x y = ‖-x + y‖"}, {"doc": "The norm is submultiplicative. ", "kind": "field", "name": "norm_mul_le", "owner": "NormedRing", "proj": "NormedRing.norm_mul_le", "type": "∀ {α : Type u_5} [self : NormedRing α] (a b : α), ‖a * b‖ ≤ ‖a‖ * ‖b‖"}], "addedOverParents": [{"doc": "The distance is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "NormedRing", "proj": "NormedRing.dist_eq", "type": "∀ {α : Type u_5} [self : NormedRing α] (x y : α), dist x y = ‖-x + y‖"}, {"doc": "The norm is submultiplicative. ", "kind": "field", "name": "norm_mul_le", "owner": "NormedRing", "proj": "NormedRing.norm_mul_le", "type": "∀ {α : Type u_5} [self : NormedRing α] (a b : α), ‖a * b‖ ≤ ‖a‖ * ‖b‖"}], "fieldCount": 49}, {"name": "SeminormedRing", "doc": "A seminormed ring is a ring endowed with a seminorm which satisfies the inequality\n`‖x y‖ ≤ ‖x‖ ‖y‖`. ", "type": "Type u_5 → Type u_5", "isAbbrev": false, "parents": [{"doc": "Auxiliary class, endowing a type `E` with a function `norm : E → ℝ` with notation `‖x‖`. This\nclass is designed to be extended in more interesting classes specifying the properties of the norm.\n", "name": "Norm", "projection": "SeminormedRing.toNorm", "subobject": true, "type": "Type u_8 → Type u_8"}, {"doc": "A `Ring` is a `Semiring` with negation making it an additive group. ", "name": "Ring", "projection": "SeminormedRing.toRing", "subobject": true, "type": "Type u → Type u"}, {"doc": "A pseudometric space is a type endowed with a `ℝ`-valued distance `dist` satisfying\nreflexivity `dist x x = 0`, commutativity `dist x y = dist y x`, and the triangle inequality\n`dist x z ≤ dist x y + dist y z`.\n\nNote that we do not require `dist x y = 0 → x = y`. See metric spaces (`MetricSpace`) for the\nsimilar class with that stronger assumption.\n\nAny pseudometric space is a topological space and a uniform space (see `TopologicalSpace`,\n`UniformSpace`), where the topology and uniformity come from the metric.\nNote that a T1 pseudometric space is just a metric space.\n\nWe make the uniformity/topology part of the data instead of deriving it from the metric. This e.g.\nensures that we do not get a diamond when doing\n`[PseudoMetricSpace α] [PseudoMetricSpace β] : TopologicalSpace (α × β)`:\nThe product metric and product topology agree, but not definitionally so.\nSee Note [forgetful inheritance]. ", "name": "PseudoMetricSpace", "projection": "SeminormedRing.toPseudoMetricSpace", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "The distance is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "SeminormedRing", "proj": "SeminormedRing.dist_eq", "type": "∀ {α : Type u_5} [self : SeminormedRing α] (x y : α), dist x y = ‖-x + y‖"}, {"doc": "The norm is submultiplicative. ", "kind": "field", "name": "norm_mul_le", "owner": "SeminormedRing", "proj": "SeminormedRing.norm_mul_le", "type": "∀ {α : Type u_5} [self : SeminormedRing α] (a b : α), ‖a * b‖ ≤ ‖a‖ * ‖b‖"}], "addedOverParents": [{"doc": "The distance is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "SeminormedRing", "proj": "SeminormedRing.dist_eq", "type": "∀ {α : Type u_5} [self : SeminormedRing α] (x y : α), dist x y = ‖-x + y‖"}, {"doc": "The norm is submultiplicative. ", "kind": "field", "name": "norm_mul_le", "owner": "SeminormedRing", "proj": "SeminormedRing.norm_mul_le", "type": "∀ {α : Type u_5} [self : SeminormedRing α] (a b : α), ‖a * b‖ ≤ ‖a‖ * ‖b‖"}], "fieldCount": 48}, {"name": "NonUnitalNormedRing", "doc": "A non-unital normed ring is a not-necessarily-unital ring\nendowed with a norm which satisfies the inequality `‖x y‖ ≤ ‖x‖ ‖y‖`. ", "type": "Type u_5 → Type u_5", "isAbbrev": false, "parents": [{"doc": "Auxiliary class, endowing a type `E` with a function `norm : E → ℝ` with notation `‖x‖`. This\nclass is designed to be extended in more interesting classes specifying the properties of the norm.\n", "name": "Norm", "projection": "NonUnitalNormedRing.toNorm", "subobject": true, "type": "Type u_8 → Type u_8"}, {"doc": "An associative but not-necessarily unital ring. ", "name": "NonUnitalRing", "projection": "NonUnitalNormedRing.toNonUnitalRing", "subobject": true, "type": "Type u_1 → Type u_1"}, {"doc": "A metric space is a type endowed with a `ℝ`-valued distance `dist` satisfying\n`dist x y = 0 ↔ x = y`, commutativity `dist x y = dist y x`, and the triangle inequality\n`dist x z ≤ dist x y + dist y z`.\n\nSee pseudometric spaces (`PseudoMetricSpace`) for the similar class with the `dist x y = 0 ↔ x = y`\nassumption weakened to `dist x x = 0`.\n\nAny metric space is a T1 topological space and a uniform space (see `TopologicalSpace`, `T1Space`,\n`UniformSpace`), where the topology and uniformity come from the metric.\n\nWe make the uniformity/topology part of the data instead of deriving it from the metric.\nThis e.g. ensures that we do not get a diamond when doing\n`[MetricSpace α] [MetricSpace β] : TopologicalSpace (α × β)`:\nThe product metric and product topology agree, but not definitionally so.\nSee Note [forgetful inheritance]. ", "name": "MetricSpace", "projection": "NonUnitalNormedRing.toMetricSpace", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "The distance is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "NonUnitalNormedRing", "proj": "NonUnitalNormedRing.dist_eq", "type": "∀ {α : Type u_5} [self : NonUnitalNormedRing α] (x y : α), dist x y = ‖-x + y‖"}, {"doc": "The norm is submultiplicative. ", "kind": "field", "name": "norm_mul_le", "owner": "NonUnitalNormedRing", "proj": "NonUnitalNormedRing.norm_mul_le", "type": "∀ {α : Type u_5} [self : NonUnitalNormedRing α] (a b : α), ‖a * b‖ ≤ ‖a‖ * ‖b‖"}], "addedOverParents": [{"doc": "The distance is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "NonUnitalNormedRing", "proj": "NonUnitalNormedRing.dist_eq", "type": "∀ {α : Type u_5} [self : NonUnitalNormedRing α] (x y : α), dist x y = ‖-x + y‖"}, {"doc": "The norm is submultiplicative. ", "kind": "field", "name": "norm_mul_le", "owner": "NonUnitalNormedRing", "proj": "NonUnitalNormedRing.norm_mul_le", "type": "∀ {α : Type u_5} [self : NonUnitalNormedRing α] (a b : α), ‖a * b‖ ≤ ‖a‖ * ‖b‖"}], "fieldCount": 37}, {"name": "NonUnitalSeminormedRing", "doc": "A non-unital seminormed ring is a not-necessarily-unital ring\nendowed with a seminorm which satisfies the inequality `‖x y‖ ≤ ‖x‖ ‖y‖`. ", "type": "Type u_5 → Type u_5", "isAbbrev": false, "parents": [{"doc": "Auxiliary class, endowing a type `E` with a function `norm : E → ℝ` with notation `‖x‖`. This\nclass is designed to be extended in more interesting classes specifying the properties of the norm.\n", "name": "Norm", "projection": "NonUnitalSeminormedRing.toNorm", "subobject": true, "type": "Type u_8 → Type u_8"}, {"doc": "An associative but not-necessarily unital ring. ", "name": "NonUnitalRing", "projection": "NonUnitalSeminormedRing.toNonUnitalRing", "subobject": true, "type": "Type u_1 → Type u_1"}, {"doc": "A pseudometric space is a type endowed with a `ℝ`-valued distance `dist` satisfying\nreflexivity `dist x x = 0`, commutativity `dist x y = dist y x`, and the triangle inequality\n`dist x z ≤ dist x y + dist y z`.\n\nNote that we do not require `dist x y = 0 → x = y`. See metric spaces (`MetricSpace`) for the\nsimilar class with that stronger assumption.\n\nAny pseudometric space is a topological space and a uniform space (see `TopologicalSpace`,\n`UniformSpace`), where the topology and uniformity come from the metric.\nNote that a T1 pseudometric space is just a metric space.\n\nWe make the uniformity/topology part of the data instead of deriving it from the metric. This e.g.\nensures that we do not get a diamond when doing\n`[PseudoMetricSpace α] [PseudoMetricSpace β] : TopologicalSpace (α × β)`:\nThe product metric and product topology agree, but not definitionally so.\nSee Note [forgetful inheritance]. ", "name": "PseudoMetricSpace", "projection": "NonUnitalSeminormedRing.toPseudoMetricSpace", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "The distance is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "NonUnitalSeminormedRing", "proj": "NonUnitalSeminormedRing.dist_eq", "type": "∀ {α : Type u_5} [self : NonUnitalSeminormedRing α] (x y : α), dist x y = ‖-x + y‖"}, {"doc": "The norm is submultiplicative. ", "kind": "field", "name": "norm_mul_le", "owner": "NonUnitalSeminormedRing", "proj": "NonUnitalSeminormedRing.norm_mul_le", "type": "∀ {α : Type u_5} [self : NonUnitalSeminormedRing α] (a b : α), ‖a * b‖ ≤ ‖a‖ * ‖b‖"}], "addedOverParents": [{"doc": "The distance is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "NonUnitalSeminormedRing", "proj": "NonUnitalSeminormedRing.dist_eq", "type": "∀ {α : Type u_5} [self : NonUnitalSeminormedRing α] (x y : α), dist x y = ‖-x + y‖"}, {"doc": "The norm is submultiplicative. ", "kind": "field", "name": "norm_mul_le", "owner": "NonUnitalSeminormedRing", "proj": "NonUnitalSeminormedRing.norm_mul_le", "type": "∀ {α : Type u_5} [self : NonUnitalSeminormedRing α] (a b : α), ‖a * b‖ ≤ ‖a‖ * ‖b‖"}], "fieldCount": 36}, {"name": "Ring", "doc": "A `Ring` is a `Semiring` with negation making it an additive group. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A `Semiring` is a type with addition, multiplication, a `0` and a `1` where addition is\ncommutative and associative, multiplication is associative and left and right distributive over\naddition, and `0` and `1` are additive and multiplicative identities. ", "name": "Semiring", "projection": "Ring.toSemiring", "subobject": true, "type": "Type u → Type u"}, {"doc": "An additive commutative group is an additive group with commutative `(+)`. \n\n[Wikidata Q181296](https://www.wikidata.org/wiki/Q181296)", "name": "AddCommGroup", "projection": "Ring.toAddCommGroup", "subobject": false, "type": "Type u → Type u"}, {"doc": "An `AddGroupWithOne` is an `AddGroup` with a 1. It also contains data for the unique\nhomomorphisms `ℕ → R` and `ℤ → R`. ", "name": "AddGroupWithOne", "projection": "Ring.toAddGroupWithOne", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "", "kind": "field", "name": "sub_eq_add_neg", "owner": "Ring", "proj": "Ring.sub_eq_add_neg", "type": "∀ {R : Type u} [self : Ring R] (a b : R), a - b = a + -b"}, {"doc": "", "kind": "field", "name": "zsmul_zero'", "owner": "Ring", "proj": "Ring.zsmul_zero'", "type": "∀ {R : Type u} [self : Ring R] (a : R), 0 • a = 0"}, {"doc": "", "kind": "field", "name": "zsmul_succ'", "owner": "Ring", "proj": "Ring.zsmul_succ'", "type": "∀ {R : Type u} [self : Ring R] (n : ℕ) (a : R), ↑n.succ • a = ↑n • a + a"}, {"doc": "", "kind": "field", "name": "zsmul_neg'", "owner": "Ring", "proj": "Ring.zsmul_neg'", "type": "∀ {R : Type u} [self : Ring R] (n : ℕ) (a : R), Int.negSucc n • a = -(↑n.succ • a)"}, {"doc": "", "kind": "field", "name": "neg_add_cancel", "owner": "Ring", "proj": "Ring.neg_add_cancel", "type": "∀ {R : Type u} [self : Ring R] (a : R), -a + a = 0"}, {"doc": "The canonical homomorphism `ℤ → R` agrees with the one from `ℕ → R` on `ℕ`. ", "kind": "field", "name": "intCast_ofNat", "owner": "Ring", "proj": "Ring.intCast_ofNat", "type": "∀ {R : Type u} [self : Ring R] (n : ℕ), IntCast.intCast ↑n = ↑n"}, {"doc": "The canonical homomorphism `ℤ → R` for negative values is just the negation of the values\nof the canonical homomorphism `ℕ → R`. ", "kind": "field", "name": "intCast_negSucc", "owner": "Ring", "proj": "Ring.intCast_negSucc", "type": "∀ {R : Type u} [self : Ring R] (n : ℕ), IntCast.intCast (Int.negSucc n) = -↑(n + 1)"}], "addedOverParents": [], "fieldCount": 35, "copiedFromParents": ["sub_eq_add_neg", "zsmul_zero'", "zsmul_succ'", "zsmul_neg'", "neg_add_cancel", "intCast_ofNat", "intCast_negSucc"]}, {"name": "NormedDivisionRing", "doc": "A normed division ring is a division ring endowed with a seminorm which satisfies the equality\n`‖x y‖ = ‖x‖ ‖y‖`. ", "type": "Type u_5 → Type u_5", "isAbbrev": false, "parents": [{"doc": "Auxiliary class, endowing a type `E` with a function `norm : E → ℝ` with notation `‖x‖`. This\nclass is designed to be extended in more interesting classes specifying the properties of the norm.\n", "name": "Norm", "projection": "NormedDivisionRing.toNorm", "subobject": true, "type": "Type u_8 → Type u_8"}, {"doc": "A `DivisionRing` is a `Ring` with multiplicative inverses for nonzero elements.\n\nAn instance of `DivisionRing K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.\nThose two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need\nto control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).\nSee also note [forgetful inheritance]. Similarly, there are maps `nnratCast ℚ≥0 → K` and\n`nnqsmul : ℚ≥0 → K → K` to implement the `DivisionSemiring K → Algebra ℚ≥0 K` instance.\n\nIf the division ring has positive characteristic `p`, our division by zero convention forces\n`ratCast (1 / p) = 1 / 0 = 0`. ", "name": "DivisionRing", "projection": "NormedDivisionRing.toDivisionRing", "subobject": true, "type": "Type u_2 → Type u_2"}, {"doc": "A metric space is a type endowed with a `ℝ`-valued distance `dist` satisfying\n`dist x y = 0 ↔ x = y`, commutativity `dist x y = dist y x`, and the triangle inequality\n`dist x z ≤ dist x y + dist y z`.\n\nSee pseudometric spaces (`PseudoMetricSpace`) for the similar class with the `dist x y = 0 ↔ x = y`\nassumption weakened to `dist x x = 0`.\n\nAny metric space is a T1 topological space and a uniform space (see `TopologicalSpace`, `T1Space`,\n`UniformSpace`), where the topology and uniformity come from the metric.\n\nWe make the uniformity/topology part of the data instead of deriving it from the metric.\nThis e.g. ensures that we do not get a diamond when doing\n`[MetricSpace α] [MetricSpace β] : TopologicalSpace (α × β)`:\nThe product metric and product topology agree, but not definitionally so.\nSee Note [forgetful inheritance]. ", "name": "MetricSpace", "projection": "NormedDivisionRing.toMetricSpace", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "The distance is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "NormedDivisionRing", "proj": "NormedDivisionRing.dist_eq", "type": "∀ {α : Type u_5} [self : NormedDivisionRing α] (x y : α), dist x y = ‖-x + y‖"}, {"doc": "The norm is multiplicative. ", "kind": "field", "name": "norm_mul", "owner": "NormedDivisionRing", "proj": "NormedDivisionRing.norm_mul", "type": "∀ {α : Type u_5} [self : NormedDivisionRing α] (a b : α), ‖a * b‖ = ‖a‖ * ‖b‖"}], "addedOverParents": [{"doc": "The distance is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "NormedDivisionRing", "proj": "NormedDivisionRing.dist_eq", "type": "∀ {α : Type u_5} [self : NormedDivisionRing α] (x y : α), dist x y = ‖-x + y‖"}, {"doc": "The norm is multiplicative. ", "kind": "field", "name": "norm_mul", "owner": "NormedDivisionRing", "proj": "NormedDivisionRing.norm_mul", "type": "∀ {α : Type u_5} [self : NormedDivisionRing α] (a b : α), ‖a * b‖ = ‖a‖ * ‖b‖"}], "fieldCount": 67}, {"name": "NormOneClass", "doc": "A mixin class with the axiom `‖1‖ = 1`. Many `NormedRing`s and all `NormedField`s satisfy this\naxiom. ", "type": "(α : Type u_5) → [Norm α] → [One α] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "The norm of the multiplicative identity is 1. ", "kind": "field", "name": "norm_one", "owner": "NormOneClass", "proj": "NormOneClass.norm_one", "type": "∀ {α : Type u_5} {inst : Norm α} {inst_1 : One α} [self : NormOneClass α], ‖1‖ = 1"}], "addedOverParents": [{"doc": "The norm of the multiplicative identity is 1. ", "kind": "field", "name": "norm_one", "owner": "NormOneClass", "proj": "NormOneClass.norm_one", "type": "∀ {α : Type u_5} {inst : Norm α} {inst_1 : One α} [self : NormOneClass α], ‖1‖ = 1"}], "fieldCount": 1}, {"name": "NormMulClass", "doc": "A mixin class for strict multiplicativity of the norm, `‖a * b‖ = ‖a‖ * ‖b‖` (rather than\n`≤` as in the definition of `NormedRing`). Many `NormedRing`s satisfy this stronger property,\nincluding all `NormedDivisionRing`s and `NormedField`s. ", "type": "(α : Type u_5) → [Norm α] → [Mul α] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "The norm is multiplicative. ", "kind": "field", "name": "norm_mul", "owner": "NormMulClass", "proj": "NormMulClass.norm_mul", "type": "∀ {α : Type u_5} {inst : Norm α} {inst_1 : Mul α} [self : NormMulClass α] (a b : α),\n  ‖a * b‖ = ‖a‖ * ‖b‖"}], "addedOverParents": [{"doc": "The norm is multiplicative. ", "kind": "field", "name": "norm_mul", "owner": "NormMulClass", "proj": "NormMulClass.norm_mul", "type": "∀ {α : Type u_5} {inst : Norm α} {inst_1 : Mul α} [self : NormMulClass α] (a b : α),\n  ‖a * b‖ = ‖a‖ * ‖b‖"}], "fieldCount": 1}, {"name": "DivisionRing", "doc": "A `DivisionRing` is a `Ring` with multiplicative inverses for nonzero elements.\n\nAn instance of `DivisionRing K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.\nThose two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need\nto control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).\nSee also note [forgetful inheritance]. Similarly, there are maps `nnratCast ℚ≥0 → K` and\n`nnqsmul : ℚ≥0 → K → K` to implement the `DivisionSemiring K → Algebra ℚ≥0 K` instance.\n\nIf the division ring has positive characteristic `p`, our division by zero convention forces\n`ratCast (1 / p) = 1 / 0 = 0`. ", "type": "Type u_2 → Type u_2", "isAbbrev": false, "parents": [{"doc": "A `Ring` is a `Semiring` with negation making it an additive group. ", "name": "Ring", "projection": "DivisionRing.toRing", "subobject": true, "type": "Type u → Type u"}, {"doc": "A `DivInvMonoid` is a `Monoid` with operations `/` and `⁻¹` satisfying\n`div_eq_mul_inv : ∀ a b, a / b = a * b⁻¹`.\n\nThis deduplicates the name `div_eq_mul_inv`.\nThe default for `div` is such that `a / b = a * b⁻¹` holds by definition.\n\nAdding `div` as a field rather than defining `a / b := a * b⁻¹` allows us to\navoid certain classes of unification failures, for example:\nLet `Foo X` be a type with a `∀ X, Div (Foo X)` instance but no\n`∀ X, Inv (Foo X)`, e.g. when `Foo X` is a `EuclideanDomain`. Suppose we\nalso have an instance `∀ X [Cromulent X], GroupWithZero (Foo X)`. Then the\n`(/)` coming from `GroupWithZero.div` cannot be definitionally equal to\nthe `(/)` coming from `Foo.Div`.\n\nIn the same way, adding a `zpow` field makes it possible to avoid definitional failures\nin diamonds. See the definition of `Monoid` and Note [forgetful inheritance] for more\nexplanations on this.\n", "name": "DivInvMonoid", "projection": "DivisionRing.toDivInvMonoid", "subobject": false, "type": "Type u → Type u"}, {"doc": "Predicate typeclass for expressing that a type is not reduced to a single element. In rings,\nthis is equivalent to `0 ≠ 1`. In vector spaces, this is equivalent to positive dimension. ", "name": "Nontrivial", "projection": "DivisionRing.toNontrivial", "subobject": true, "type": "Type u_3 → Prop"}, {"doc": "Typeclass for the canonical homomorphism `ℚ≥0 → K`.\n\nThis should be considered as a notation typeclass. The sole purpose of this typeclass is to be\nextended by `DivisionSemiring`. ", "name": "NNRatCast", "projection": "DivisionRing.toNNRatCast", "subobject": true, "type": "Type u_1 → Type u_1"}, {"doc": "Type class for the canonical homomorphism `Rat → K`. ", "name": "RatCast", "projection": "DivisionRing.toRatCast", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "`a / b := a * b⁻¹` ", "kind": "field", "name": "div_eq_mul_inv", "owner": "DivisionRing", "proj": "DivisionRing.div_eq_mul_inv", "type": "∀ {K : Type u_2} [self : DivisionRing K] (a b : K), a / b = a * b⁻¹"}, {"doc": "`a ^ 0 = 1` ", "kind": "field", "name": "zpow_zero'", "owner": "DivisionRing", "proj": "DivisionRing.zpow_zero'", "type": "∀ {K : Type u_2} [self : DivisionRing K] (a : K), a ^ 0 = 1"}, {"doc": "`a ^ (n + 1) = a ^ n * a` ", "kind": "field", "name": "zpow_succ'", "owner": "DivisionRing", "proj": "DivisionRing.zpow_succ'", "type": "∀ {K : Type u_2} [self : DivisionRing K] (n : ℕ) (a : K), a ^ ↑n.succ = a ^ ↑n * a"}, {"doc": "`a ^ -(n + 1) = (a ^ (n + 1))⁻¹` ", "kind": "field", "name": "zpow_neg'", "owner": "DivisionRing", "proj": "DivisionRing.zpow_neg'", "type": "∀ {K : Type u_2} [self : DivisionRing K] (n : ℕ) (a : K), a ^ Int.negSucc n = (a ^ ↑n.succ)⁻¹"}, {"doc": "For a nonzero `a`, `a⁻¹` is a right multiplicative inverse. ", "kind": "field", "name": "mul_inv_cancel", "owner": "DivisionRing", "proj": "DivisionRing.mul_inv_cancel", "type": "∀ {K : Type u_2} [self : DivisionRing K] (a : K), a ≠ 0 → a * a⁻¹ = 1"}, {"doc": "The inverse of `0` is `0` by convention. ", "kind": "field", "name": "inv_zero", "owner": "DivisionRing", "proj": "DivisionRing.inv_zero", "type": "∀ {K : Type u_2} [self : DivisionRing K], 0⁻¹ = 0"}, {"doc": "However `NNRat.cast` is defined, it must be equal to `a / b`.\n\nDo not use this lemma directly. Use `NNRat.cast_def` instead. ", "kind": "field", "name": "nnratCast_def", "owner": "DivisionRing", "proj": "DivisionRing.nnratCast_def", "type": "∀ {K : Type u_2} [self : DivisionRing K] (q : ℚ≥0), ↑q = ↑q.num / ↑q.den"}, {"doc": "Scalar multiplication by a nonnegative rational number.\n\nUnless there is a risk of a `Module ℚ≥0 _` instance diamond, write `nnqsmul := _`. This will set\n`nnqsmul` to `(NNRat.cast · * ·)` thanks to unification in the default proof of `nnqsmul_def`.\n\nDo not use directly. Instead use the `•` notation. ", "kind": "field", "name": "nnqsmul", "owner": "DivisionRing", "proj": "DivisionRing.nnqsmul", "type": "{K : Type u_2} → [self : DivisionRing K] → ℚ≥0 → K → K"}, {"doc": "However `qsmul` is defined, it must be propositionally equal to multiplication by `Rat.cast`.\n\nDo not use this lemma directly. Use `NNRat.smul_def` instead. ", "kind": "field", "name": "nnqsmul_def", "owner": "DivisionRing", "proj": "DivisionRing.nnqsmul_def", "type": "∀ {K : Type u_2} [self : DivisionRing K] (q : ℚ≥0) (a : K), DivisionRing.nnqsmul q a = ↑q * a"}, {"doc": "However `Rat.cast q` is defined, it must be propositionally equal to `q.num / q.den`.\n\nDo not use this lemma directly. Use `Rat.cast_def` instead. ", "kind": "field", "name": "ratCast_def", "owner": "DivisionRing", "proj": "DivisionRing.ratCast_def", "type": "∀ {K : Type u_2} [self : DivisionRing K] (q : ℚ), ↑q = ↑q.num / ↑q.den"}, {"doc": "Scalar multiplication by a rational number.\n\nUnless there is a risk of a `Module ℚ _` instance diamond, write `qsmul := _`. This will set\n`qsmul` to `(Rat.cast · * ·)` thanks to unification in the default proof of `qsmul_def`.\n\nDo not use directly. Instead use the `•` notation. ", "kind": "field", "name": "qsmul", "owner": "DivisionRing", "proj": "DivisionRing.qsmul", "type": "{K : Type u_2} → [self : DivisionRing K] → ℚ → K → K"}, {"doc": "However `qsmul` is defined, it must be propositionally equal to multiplication by `Rat.cast`.\n\nDo not use this lemma directly. Use `Rat.cast_def` instead. ", "kind": "field", "name": "qsmul_def", "owner": "DivisionRing", "proj": "DivisionRing.qsmul_def", "type": "∀ {K : Type u_2} [self : DivisionRing K] (a : ℚ) (x : K), DivisionRing.qsmul a x = ↑a * x"}], "addedOverParents": [{"doc": "For a nonzero `a`, `a⁻¹` is a right multiplicative inverse. ", "kind": "field", "name": "mul_inv_cancel", "owner": "DivisionRing", "proj": "DivisionRing.mul_inv_cancel", "type": "∀ {K : Type u_2} [self : DivisionRing K] (a : K), a ≠ 0 → a * a⁻¹ = 1"}, {"doc": "The inverse of `0` is `0` by convention. ", "kind": "field", "name": "inv_zero", "owner": "DivisionRing", "proj": "DivisionRing.inv_zero", "type": "∀ {K : Type u_2} [self : DivisionRing K], 0⁻¹ = 0"}, {"doc": "However `NNRat.cast` is defined, it must be equal to `a / b`.\n\nDo not use this lemma directly. Use `NNRat.cast_def` instead. ", "kind": "field", "name": "nnratCast_def", "owner": "DivisionRing", "proj": "DivisionRing.nnratCast_def", "type": "∀ {K : Type u_2} [self : DivisionRing K] (q : ℚ≥0), ↑q = ↑q.num / ↑q.den"}, {"doc": "Scalar multiplication by a nonnegative rational number.\n\nUnless there is a risk of a `Module ℚ≥0 _` instance diamond, write `nnqsmul := _`. This will set\n`nnqsmul` to `(NNRat.cast · * ·)` thanks to unification in the default proof of `nnqsmul_def`.\n\nDo not use directly. Instead use the `•` notation. ", "kind": "field", "name": "nnqsmul", "owner": "DivisionRing", "proj": "DivisionRing.nnqsmul", "type": "{K : Type u_2} → [self : DivisionRing K] → ℚ≥0 → K → K"}, {"doc": "However `qsmul` is defined, it must be propositionally equal to multiplication by `Rat.cast`.\n\nDo not use this lemma directly. Use `NNRat.smul_def` instead. ", "kind": "field", "name": "nnqsmul_def", "owner": "DivisionRing", "proj": "DivisionRing.nnqsmul_def", "type": "∀ {K : Type u_2} [self : DivisionRing K] (q : ℚ≥0) (a : K), DivisionRing.nnqsmul q a = ↑q * a"}, {"doc": "However `Rat.cast q` is defined, it must be propositionally equal to `q.num / q.den`.\n\nDo not use this lemma directly. Use `Rat.cast_def` instead. ", "kind": "field", "name": "ratCast_def", "owner": "DivisionRing", "proj": "DivisionRing.ratCast_def", "type": "∀ {K : Type u_2} [self : DivisionRing K] (q : ℚ), ↑q = ↑q.num / ↑q.den"}, {"doc": "Scalar multiplication by a rational number.\n\nUnless there is a risk of a `Module ℚ _` instance diamond, write `qsmul := _`. This will set\n`qsmul` to `(Rat.cast · * ·)` thanks to unification in the default proof of `qsmul_def`.\n\nDo not use directly. Instead use the `•` notation. ", "kind": "field", "name": "qsmul", "owner": "DivisionRing", "proj": "DivisionRing.qsmul", "type": "{K : Type u_2} → [self : DivisionRing K] → ℚ → K → K"}, {"doc": "However `qsmul` is defined, it must be propositionally equal to multiplication by `Rat.cast`.\n\nDo not use this lemma directly. Use `Rat.cast_def` instead. ", "kind": "field", "name": "qsmul_def", "owner": "DivisionRing", "proj": "DivisionRing.qsmul_def", "type": "∀ {K : Type u_2} [self : DivisionRing K] (a : ℚ) (x : K), DivisionRing.qsmul a x = ↑a * x"}], "fieldCount": 53, "copiedFromParents": ["div_eq_mul_inv", "zpow_zero'", "zpow_succ'", "zpow_neg'"]}, {"name": "NormedCommRing", "doc": "A normed commutative ring is a commutative ring endowed with a norm which satisfies\nthe inequality `‖x y‖ ≤ ‖x‖ ‖y‖`. ", "type": "Type u_5 → Type u_5", "isAbbrev": false, "parents": [{"doc": "A normed ring is a ring endowed with a norm which satisfies the inequality `‖x y‖ ≤ ‖x‖ ‖y‖`. ", "name": "NormedRing", "projection": "NormedCommRing.toNormedRing", "subobject": true, "type": "Type u_5 → Type u_5"}, {"doc": "A commutative ring is a ring with commutative multiplication. ", "name": "CommRing", "projection": "NormedCommRing.toCommRing", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Multiplication is commutative in a commutative multiplicative magma. ", "kind": "field", "name": "mul_comm", "owner": "NormedCommRing", "proj": "NormedCommRing.mul_comm", "type": "∀ {α : Type u_5} [self : NormedCommRing α] (a b : α), a * b = b * a"}], "addedOverParents": [], "fieldCount": 50, "copiedFromParents": ["mul_comm"]}, {"name": "CommRing", "doc": "A commutative ring is a ring with commutative multiplication. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A `Ring` is a `Semiring` with negation making it an additive group. ", "name": "Ring", "projection": "CommRing.toRing", "subobject": true, "type": "Type u → Type u"}, {"doc": "A commutative monoid is a monoid with commutative `(*)`. ", "name": "CommMonoid", "projection": "CommRing.toCommMonoid", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Multiplication is commutative in a commutative multiplicative magma. ", "kind": "field", "name": "mul_comm", "owner": "CommRing", "proj": "CommRing.mul_comm", "type": "∀ {α : Type u} [self : CommRing α] (a b : α), a * b = b * a"}], "addedOverParents": [], "fieldCount": 36, "copiedFromParents": ["mul_comm"]}, {"name": "NormedField", "doc": "A normed field is a field with a norm satisfying ‖x y‖ = ‖x‖ ‖y‖. ", "type": "Type u_5 → Type u_5", "isAbbrev": false, "parents": [{"doc": "Auxiliary class, endowing a type `E` with a function `norm : E → ℝ` with notation `‖x‖`. This\nclass is designed to be extended in more interesting classes specifying the properties of the norm.\n", "name": "Norm", "projection": "NormedField.toNorm", "subobject": true, "type": "Type u_8 → Type u_8"}, {"doc": "A `Field` is a `CommRing` with multiplicative inverses for nonzero elements.\n\nAn instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.\nThose two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need\nto control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).\nSee also note [forgetful inheritance].\n\nIf the field has positive characteristic `p`, our division by zero convention forces\n`ratCast (1 / p) = 1 / 0 = 0`. ", "name": "Field", "projection": "NormedField.toField", "subobject": true, "type": "Type u → Type u"}, {"doc": "A metric space is a type endowed with a `ℝ`-valued distance `dist` satisfying\n`dist x y = 0 ↔ x = y`, commutativity `dist x y = dist y x`, and the triangle inequality\n`dist x z ≤ dist x y + dist y z`.\n\nSee pseudometric spaces (`PseudoMetricSpace`) for the similar class with the `dist x y = 0 ↔ x = y`\nassumption weakened to `dist x x = 0`.\n\nAny metric space is a T1 topological space and a uniform space (see `TopologicalSpace`, `T1Space`,\n`UniformSpace`), where the topology and uniformity come from the metric.\n\nWe make the uniformity/topology part of the data instead of deriving it from the metric.\nThis e.g. ensures that we do not get a diamond when doing\n`[MetricSpace α] [MetricSpace β] : TopologicalSpace (α × β)`:\nThe product metric and product topology agree, but not definitionally so.\nSee Note [forgetful inheritance]. ", "name": "MetricSpace", "projection": "NormedField.toMetricSpace", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "The distance is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "NormedField", "proj": "NormedField.dist_eq", "type": "∀ {α : Type u_5} [self : NormedField α] (x y : α), dist x y = ‖-x + y‖"}, {"doc": "The norm is multiplicative. ", "kind": "field", "name": "norm_mul", "owner": "NormedField", "proj": "NormedField.norm_mul", "type": "∀ {α : Type u_5} [self : NormedField α] (a b : α), ‖a * b‖ = ‖a‖ * ‖b‖"}], "addedOverParents": [{"doc": "The distance is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "NormedField", "proj": "NormedField.dist_eq", "type": "∀ {α : Type u_5} [self : NormedField α] (x y : α), dist x y = ‖-x + y‖"}, {"doc": "The norm is multiplicative. ", "kind": "field", "name": "norm_mul", "owner": "NormedField", "proj": "NormedField.norm_mul", "type": "∀ {α : Type u_5} [self : NormedField α] (a b : α), ‖a * b‖ = ‖a‖ * ‖b‖"}], "fieldCount": 68}, {"name": "Field", "doc": "A `Field` is a `CommRing` with multiplicative inverses for nonzero elements.\n\nAn instance of `Field K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.\nThose two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need\nto control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).\nSee also note [forgetful inheritance].\n\nIf the field has positive characteristic `p`, our division by zero convention forces\n`ratCast (1 / p) = 1 / 0 = 0`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A commutative ring is a ring with commutative multiplication. ", "name": "CommRing", "projection": "Field.toCommRing", "subobject": true, "type": "Type u → Type u"}, {"doc": "A `DivisionRing` is a `Ring` with multiplicative inverses for nonzero elements.\n\nAn instance of `DivisionRing K` includes maps `ratCast : ℚ → K` and `qsmul : ℚ → K → K`.\nThose two fields are needed to implement the `DivisionRing K → Algebra ℚ K` instance since we need\nto control the specific definitions for some special cases of `K` (in particular `K = ℚ` itself).\nSee also note [forgetful inheritance]. Similarly, there are maps `nnratCast ℚ≥0 → K` and\n`nnqsmul : ℚ≥0 → K → K` to implement the `DivisionSemiring K → Algebra ℚ≥0 K` instance.\n\nIf the division ring has positive characteristic `p`, our division by zero convention forces\n`ratCast (1 / p) = 1 / 0 = 0`. ", "name": "DivisionRing", "projection": "Field.toDivisionRing", "subobject": false, "type": "Type u_2 → Type u_2"}], "ownFields": [{"doc": "`a / b := a * b⁻¹` ", "kind": "field", "name": "div_eq_mul_inv", "owner": "Field", "proj": "Field.div_eq_mul_inv", "type": "∀ {K : Type u} [self : Field K] (a b : K), a / b = a * b⁻¹"}, {"doc": "`a ^ 0 = 1` ", "kind": "field", "name": "zpow_zero'", "owner": "Field", "proj": "Field.zpow_zero'", "type": "∀ {K : Type u} [self : Field K] (a : K), a ^ 0 = 1"}, {"doc": "`a ^ (n + 1) = a ^ n * a` ", "kind": "field", "name": "zpow_succ'", "owner": "Field", "proj": "Field.zpow_succ'", "type": "∀ {K : Type u} [self : Field K] (n : ℕ) (a : K), a ^ ↑n.succ = a ^ ↑n * a"}, {"doc": "`a ^ -(n + 1) = (a ^ (n + 1))⁻¹` ", "kind": "field", "name": "zpow_neg'", "owner": "Field", "proj": "Field.zpow_neg'", "type": "∀ {K : Type u} [self : Field K] (n : ℕ) (a : K), a ^ Int.negSucc n = (a ^ ↑n.succ)⁻¹"}, {"doc": "For a nonzero `a`, `a⁻¹` is a right multiplicative inverse. ", "kind": "field", "name": "mul_inv_cancel", "owner": "Field", "proj": "Field.mul_inv_cancel", "type": "∀ {K : Type u} [self : Field K] (a : K), a ≠ 0 → a * a⁻¹ = 1"}, {"doc": "The inverse of `0` is `0` by convention. ", "kind": "field", "name": "inv_zero", "owner": "Field", "proj": "Field.inv_zero", "type": "∀ {K : Type u} [self : Field K], 0⁻¹ = 0"}, {"doc": "However `NNRat.cast` is defined, it must be equal to `a / b`.\n\nDo not use this lemma directly. Use `NNRat.cast_def` instead. ", "kind": "field", "name": "nnratCast_def", "owner": "Field", "proj": "Field.nnratCast_def", "type": "∀ {K : Type u} [self : Field K] (q : ℚ≥0), ↑q = ↑q.num / ↑q.den"}, {"doc": "Scalar multiplication by a nonnegative rational number.\n\nUnless there is a risk of a `Module ℚ≥0 _` instance diamond, write `nnqsmul := _`. This will set\n`nnqsmul` to `(NNRat.cast · * ·)` thanks to unification in the default proof of `nnqsmul_def`.\n\nDo not use directly. Instead use the `•` notation. ", "kind": "field", "name": "nnqsmul", "owner": "Field", "proj": "Field.nnqsmul", "type": "{K : Type u} → [self : Field K] → ℚ≥0 → K → K"}, {"doc": "However `qsmul` is defined, it must be propositionally equal to multiplication by `Rat.cast`.\n\nDo not use this lemma directly. Use `NNRat.smul_def` instead. ", "kind": "field", "name": "nnqsmul_def", "owner": "Field", "proj": "Field.nnqsmul_def", "type": "∀ {K : Type u} [self : Field K] (q : ℚ≥0) (a : K), Field.nnqsmul q a = ↑q * a"}, {"doc": "However `Rat.cast q` is defined, it must be propositionally equal to `q.num / q.den`.\n\nDo not use this lemma directly. Use `Rat.cast_def` instead. ", "kind": "field", "name": "ratCast_def", "owner": "Field", "proj": "Field.ratCast_def", "type": "∀ {K : Type u} [self : Field K] (q : ℚ), ↑q = ↑q.num / ↑q.den"}, {"doc": "Scalar multiplication by a rational number.\n\nUnless there is a risk of a `Module ℚ _` instance diamond, write `qsmul := _`. This will set\n`qsmul` to `(Rat.cast · * ·)` thanks to unification in the default proof of `qsmul_def`.\n\nDo not use directly. Instead use the `•` notation. ", "kind": "field", "name": "qsmul", "owner": "Field", "proj": "Field.qsmul", "type": "{K : Type u} → [self : Field K] → ℚ → K → K"}, {"doc": "However `qsmul` is defined, it must be propositionally equal to multiplication by `Rat.cast`.\n\nDo not use this lemma directly. Use `Rat.cast_def` instead. ", "kind": "field", "name": "qsmul_def", "owner": "Field", "proj": "Field.qsmul_def", "type": "∀ {K : Type u} [self : Field K] (a : ℚ) (x : K), Field.qsmul a x = ↑a * x"}], "addedOverParents": [], "fieldCount": 54, "copiedFromParents": ["div_eq_mul_inv", "zpow_zero'", "zpow_succ'", "zpow_neg'", "mul_inv_cancel", "inv_zero", "nnratCast_def", "nnqsmul", "nnqsmul_def", "ratCast_def", "qsmul", "qsmul_def"]}, {"name": "NormedAddCommGroup", "doc": "A normed group is an additive group endowed with a norm for which `dist x y = ‖-x + y‖` defines\na metric space structure. ", "type": "Type u_8 → Type u_8", "isAbbrev": false, "parents": [{"doc": "Auxiliary class, endowing a type `E` with a function `norm : E → ℝ` with notation `‖x‖`. This\nclass is designed to be extended in more interesting classes specifying the properties of the norm.\n", "name": "Norm", "projection": "NormedAddCommGroup.toNorm", "subobject": true, "type": "Type u_8 → Type u_8"}, {"doc": "An additive commutative group is an additive group with commutative `(+)`. \n\n[Wikidata Q181296](https://www.wikidata.org/wiki/Q181296)", "name": "AddCommGroup", "projection": "NormedAddCommGroup.toAddCommGroup", "subobject": true, "type": "Type u → Type u"}, {"doc": "A metric space is a type endowed with a `ℝ`-valued distance `dist` satisfying\n`dist x y = 0 ↔ x = y`, commutativity `dist x y = dist y x`, and the triangle inequality\n`dist x z ≤ dist x y + dist y z`.\n\nSee pseudometric spaces (`PseudoMetricSpace`) for the similar class with the `dist x y = 0 ↔ x = y`\nassumption weakened to `dist x x = 0`.\n\nAny metric space is a T1 topological space and a uniform space (see `TopologicalSpace`, `T1Space`,\n`UniformSpace`), where the topology and uniformity come from the metric.\n\nWe make the uniformity/topology part of the data instead of deriving it from the metric.\nThis e.g. ensures that we do not get a diamond when doing\n`[MetricSpace α] [MetricSpace β] : TopologicalSpace (α × β)`:\nThe product metric and product topology agree, but not definitionally so.\nSee Note [forgetful inheritance]. ", "name": "MetricSpace", "projection": "NormedAddCommGroup.toMetricSpace", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "The distance function is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "NormedAddCommGroup", "proj": "NormedAddCommGroup.dist_eq", "type": "∀ {E : Type u_8} [self : NormedAddCommGroup E] (x y : E), dist x y = ‖-x + y‖"}], "addedOverParents": [{"doc": "The distance function is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "NormedAddCommGroup", "proj": "NormedAddCommGroup.dist_eq", "type": "∀ {E : Type u_8} [self : NormedAddCommGroup E] (x y : E), dist x y = ‖-x + y‖"}], "fieldCount": 30}, {"name": "SeminormedAddCommGroup", "doc": "A seminormed group is an additive group endowed with a norm for which `dist x y = ‖-x + y‖`\ndefines a pseudometric space structure. ", "type": "Type u_8 → Type u_8", "isAbbrev": false, "parents": [{"doc": "Auxiliary class, endowing a type `E` with a function `norm : E → ℝ` with notation `‖x‖`. This\nclass is designed to be extended in more interesting classes specifying the properties of the norm.\n", "name": "Norm", "projection": "SeminormedAddCommGroup.toNorm", "subobject": true, "type": "Type u_8 → Type u_8"}, {"doc": "An additive commutative group is an additive group with commutative `(+)`. \n\n[Wikidata Q181296](https://www.wikidata.org/wiki/Q181296)", "name": "AddCommGroup", "projection": "SeminormedAddCommGroup.toAddCommGroup", "subobject": true, "type": "Type u → Type u"}, {"doc": "A pseudometric space is a type endowed with a `ℝ`-valued distance `dist` satisfying\nreflexivity `dist x x = 0`, commutativity `dist x y = dist y x`, and the triangle inequality\n`dist x z ≤ dist x y + dist y z`.\n\nNote that we do not require `dist x y = 0 → x = y`. See metric spaces (`MetricSpace`) for the\nsimilar class with that stronger assumption.\n\nAny pseudometric space is a topological space and a uniform space (see `TopologicalSpace`,\n`UniformSpace`), where the topology and uniformity come from the metric.\nNote that a T1 pseudometric space is just a metric space.\n\nWe make the uniformity/topology part of the data instead of deriving it from the metric. This e.g.\nensures that we do not get a diamond when doing\n`[PseudoMetricSpace α] [PseudoMetricSpace β] : TopologicalSpace (α × β)`:\nThe product metric and product topology agree, but not definitionally so.\nSee Note [forgetful inheritance]. ", "name": "PseudoMetricSpace", "projection": "SeminormedAddCommGroup.toPseudoMetricSpace", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "The distance function is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "SeminormedAddCommGroup", "proj": "SeminormedAddCommGroup.dist_eq", "type": "∀ {E : Type u_8} [self : SeminormedAddCommGroup E] (x y : E), dist x y = ‖-x + y‖"}], "addedOverParents": [{"doc": "The distance function is induced by the norm. ", "kind": "field", "name": "dist_eq", "owner": "SeminormedAddCommGroup", "proj": "SeminormedAddCommGroup.dist_eq", "type": "∀ {E : Type u_8} [self : SeminormedAddCommGroup E] (x y : E), dist x y = ‖-x + y‖"}], "fieldCount": 29}, {"name": "NonUnitalRing", "doc": "An associative but not-necessarily unital ring. ", "type": "Type u_1 → Type u_1", "isAbbrev": false, "parents": [{"doc": "A not-necessarily-unital, not-necessarily-associative ring. ", "name": "NonUnitalNonAssocRing", "projection": "NonUnitalRing.toNonUnitalNonAssocRing", "subobject": true, "type": "Type u → Type u"}, {"doc": "An associative but not-necessarily unital semiring. ", "name": "NonUnitalSemiring", "projection": "NonUnitalRing.toNonUnitalSemiring", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Multiplication is associative ", "kind": "field", "name": "mul_assoc", "owner": "NonUnitalRing", "proj": "NonUnitalRing.mul_assoc", "type": "∀ {α : Type u_1} [self : NonUnitalRing α] (a b c : α), a * b * c = a * (b * c)"}], "addedOverParents": [], "fieldCount": 23, "copiedFromParents": ["mul_assoc"]}, {"name": "Norm", "doc": "Auxiliary class, endowing a type `E` with a function `norm : E → ℝ` with notation `‖x‖`. This\nclass is designed to be extended in more interesting classes specifying the properties of the norm.\n", "type": "Type u_8 → Type u_8", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "the `ℝ`-valued norm function. ", "kind": "field", "name": "norm", "owner": "Norm", "proj": "Norm.norm", "type": "{E : Type u_8} → [self : Norm E] → E → ℝ"}], "addedOverParents": [{"doc": "the `ℝ`-valued norm function. ", "kind": "field", "name": "norm", "owner": "Norm", "proj": "Norm.norm", "type": "{E : Type u_8} → [self : Norm E] → E → ℝ"}], "fieldCount": 1}, {"name": "AddCommGroup", "doc": "An additive commutative group is an additive group with commutative `(+)`. \n\n[Wikidata Q181296](https://www.wikidata.org/wiki/Q181296)", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "An `AddGroup` is an `AddMonoid` with a unary `-` satisfying `-a + a = 0`.\n\nThere is also a binary operation `-` such that `a - b = a + -b`,\nwith a default so that `a - b = a + -b` holds by definition.\n\nUse `AddGroup.ofLeftAxioms` or `AddGroup.ofRightAxioms` to define an\nadditive group structure on a type with the minimum proof obligations.\n\n\n[Wikidata Q83478](https://www.wikidata.org/wiki/Q83478)", "name": "AddGroup", "projection": "AddCommGroup.toAddGroup", "subobject": true, "type": "Type u → Type u"}, {"doc": "An additive commutative monoid is an additive monoid with commutative `(+)`. ", "name": "AddCommMonoid", "projection": "AddCommGroup.toAddCommMonoid", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Addition is commutative in a commutative additive magma. ", "kind": "field", "name": "add_comm", "owner": "AddCommGroup", "proj": "AddCommGroup.add_comm", "type": "∀ {G : Type u} [self : AddCommGroup G] (a b : G), a + b = b + a"}], "addedOverParents": [], "fieldCount": 17, "copiedFromParents": ["add_comm"]}, {"name": "EuclideanDomain", "doc": "A `EuclideanDomain` is a non-trivial commutative ring with a division and a remainder,\nsatisfying `b * (a / b) + a % b = a`.\nThe definition of a Euclidean domain usually includes a valuation function `R → ℕ`.\nThis definition is slightly generalised to include a well-founded relation\n`r` with the property that `r (a % b) b`, instead of a valuation. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A commutative ring is a ring with commutative multiplication. ", "name": "CommRing", "projection": "EuclideanDomain.toCommRing", "subobject": true, "type": "Type u → Type u"}, {"doc": "Predicate typeclass for expressing that a type is not reduced to a single element. In rings,\nthis is equivalent to `0 ≠ 1`. In vector spaces, this is equivalent to positive dimension. ", "name": "Nontrivial", "projection": "EuclideanDomain.toNontrivial", "subobject": true, "type": "Type u_3 → Prop"}], "ownFields": [{"doc": "A division function (denoted `/`) on `R`.\nThis satisfies the property `b * (a / b) + a % b = a`, where `%` denotes `remainder`. ", "kind": "field", "name": "quotient", "owner": "EuclideanDomain", "proj": "EuclideanDomain.quotient", "type": "{R : Type u} → [self : EuclideanDomain R] → R → R → R"}, {"doc": "Division by zero should always give zero by convention. ", "kind": "field", "name": "quotient_zero", "owner": "EuclideanDomain", "proj": "EuclideanDomain.quotient_zero", "type": "∀ {R : Type u} [self : EuclideanDomain R] (a : R), EuclideanDomain.quotient a 0 = 0"}, {"doc": "A remainder function (denoted `%`) on `R`.\nThis satisfies the property `b * (a / b) + a % b = a`, where `/` denotes `quotient`. ", "kind": "field", "name": "remainder", "owner": "EuclideanDomain", "proj": "EuclideanDomain.remainder", "type": "{R : Type u} → [self : EuclideanDomain R] → R → R → R"}, {"doc": "The property that links the quotient and remainder functions.\nThis allows us to compute GCDs and LCMs. ", "kind": "field", "name": "quotient_mul_add_remainder_eq", "owner": "EuclideanDomain", "proj": "EuclideanDomain.quotient_mul_add_remainder_eq", "type": "∀ {R : Type u} [self : EuclideanDomain R] (a b : R),\n  b * EuclideanDomain.quotient a b + EuclideanDomain.remainder a b = a"}, {"doc": "A well-founded relation on `R`, satisfying `r (a % b) b`.\nThis ensures that the GCD algorithm always terminates. ", "kind": "field", "name": "r", "owner": "EuclideanDomain", "proj": "EuclideanDomain.r", "type": "{R : Type u} → [self : EuclideanDomain R] → R → R → Prop"}, {"doc": "The relation `r` must be well-founded.\nThis ensures that the GCD algorithm always terminates. ", "kind": "field", "name": "r_wellFounded", "owner": "EuclideanDomain", "proj": "EuclideanDomain.r_wellFounded", "type": "∀ {R : Type u} [self : EuclideanDomain R], WellFounded EuclideanDomain.r"}, {"doc": "The relation `r` satisfies `r (a % b) b`. ", "kind": "field", "name": "remainder_lt", "owner": "EuclideanDomain", "proj": "EuclideanDomain.remainder_lt", "type": "∀ {R : Type u} [self : EuclideanDomain R] (a : R) {b : R},\n  b ≠ 0 → EuclideanDomain.r (EuclideanDomain.remainder a b) b"}, {"doc": "An additional constraint on `r`. ", "kind": "field", "name": "mul_left_not_lt", "owner": "EuclideanDomain", "proj": "EuclideanDomain.mul_left_not_lt", "type": "∀ {R : Type u} [self : EuclideanDomain R] (a : R) {b : R}, b ≠ 0 → ¬EuclideanDomain.r (a * b) a"}], "addedOverParents": [{"doc": "A division function (denoted `/`) on `R`.\nThis satisfies the property `b * (a / b) + a % b = a`, where `%` denotes `remainder`. ", "kind": "field", "name": "quotient", "owner": "EuclideanDomain", "proj": "EuclideanDomain.quotient", "type": "{R : Type u} → [self : EuclideanDomain R] → R → R → R"}, {"doc": "Division by zero should always give zero by convention. ", "kind": "field", "name": "quotient_zero", "owner": "EuclideanDomain", "proj": "EuclideanDomain.quotient_zero", "type": "∀ {R : Type u} [self : EuclideanDomain R] (a : R), EuclideanDomain.quotient a 0 = 0"}, {"doc": "A remainder function (denoted `%`) on `R`.\nThis satisfies the property `b * (a / b) + a % b = a`, where `/` denotes `quotient`. ", "kind": "field", "name": "remainder", "owner": "EuclideanDomain", "proj": "EuclideanDomain.remainder", "type": "{R : Type u} → [self : EuclideanDomain R] → R → R → R"}, {"doc": "The property that links the quotient and remainder functions.\nThis allows us to compute GCDs and LCMs. ", "kind": "field", "name": "quotient_mul_add_remainder_eq", "owner": "EuclideanDomain", "proj": "EuclideanDomain.quotient_mul_add_remainder_eq", "type": "∀ {R : Type u} [self : EuclideanDomain R] (a b : R),\n  b * EuclideanDomain.quotient a b + EuclideanDomain.remainder a b = a"}, {"doc": "A well-founded relation on `R`, satisfying `r (a % b) b`.\nThis ensures that the GCD algorithm always terminates. ", "kind": "field", "name": "r", "owner": "EuclideanDomain", "proj": "EuclideanDomain.r", "type": "{R : Type u} → [self : EuclideanDomain R] → R → R → Prop"}, {"doc": "The relation `r` must be well-founded.\nThis ensures that the GCD algorithm always terminates. ", "kind": "field", "name": "r_wellFounded", "owner": "EuclideanDomain", "proj": "EuclideanDomain.r_wellFounded", "type": "∀ {R : Type u} [self : EuclideanDomain R], WellFounded EuclideanDomain.r"}, {"doc": "The relation `r` satisfies `r (a % b) b`. ", "kind": "field", "name": "remainder_lt", "owner": "EuclideanDomain", "proj": "EuclideanDomain.remainder_lt", "type": "∀ {R : Type u} [self : EuclideanDomain R] (a : R) {b : R},\n  b ≠ 0 → EuclideanDomain.r (EuclideanDomain.remainder a b) b"}, {"doc": "An additional constraint on `r`. ", "kind": "field", "name": "mul_left_not_lt", "owner": "EuclideanDomain", "proj": "EuclideanDomain.mul_left_not_lt", "type": "∀ {R : Type u} [self : EuclideanDomain R] (a : R) {b : R}, b ≠ 0 → ¬EuclideanDomain.r (a * b) a"}], "fieldCount": 45}, {"name": "IsPrincipalIdealRing", "doc": "A ring is a principal ideal ring if all (left) ideals are principal. ", "type": "(R : Type u) → [Semiring R] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "", "kind": "field", "name": "principal", "owner": "IsPrincipalIdealRing", "proj": "IsPrincipalIdealRing.principal", "type": "∀ {R : Type u} {inst : Semiring R} [self : IsPrincipalIdealRing R] (S : Ideal R),\n  Submodule.IsPrincipal S"}], "addedOverParents": [{"doc": "", "kind": "field", "name": "principal", "owner": "IsPrincipalIdealRing", "proj": "IsPrincipalIdealRing.principal", "type": "∀ {R : Type u} {inst : Semiring R} [self : IsPrincipalIdealRing R] (S : Ideal R),\n  Submodule.IsPrincipal S"}], "fieldCount": 1}, {"name": "Nontrivial", "doc": "Predicate typeclass for expressing that a type is not reduced to a single element. In rings,\nthis is equivalent to `0 ≠ 1`. In vector spaces, this is equivalent to positive dimension. ", "type": "Type u_3 → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "In a nontrivial type, there exists a pair of distinct terms. ", "kind": "field", "name": "exists_pair_ne", "owner": "Nontrivial", "proj": "Nontrivial.exists_pair_ne", "type": "∀ {α : Type u_3} [self : Nontrivial α], ∃ x y, x ≠ y"}], "addedOverParents": [{"doc": "In a nontrivial type, there exists a pair of distinct terms. ", "kind": "field", "name": "exists_pair_ne", "owner": "Nontrivial", "proj": "Nontrivial.exists_pair_ne", "type": "∀ {α : Type u_3} [self : Nontrivial α], ∃ x y, x ≠ y"}], "fieldCount": 1}, {"name": "IsDomain", "doc": "A domain is a nontrivial semiring such that multiplication by a nonzero element\nis cancellative on both sides. In other words, a nontrivial semiring `R` satisfying\n`∀ {a b c : R}, a ≠ 0 → a * b = a * c → b = c` and\n`∀ {a b c : R}, b ≠ 0 → a * b = c * b → a = c`.\n\nThis is implemented as a mixin for `Semiring α`.\nTo obtain an integral domain use `[CommRing α] [IsDomain α]`. ", "type": "(α : Type u) → [Semiring α] → Prop", "isAbbrev": false, "parents": [{"doc": "A mixin for cancellative multiplication by nonzero elements. ", "name": "IsCancelMulZero", "projection": "IsDomain.toIsCancelMulZero", "subobject": true, "type": "(M₀ : Type u) → [Mul M₀] → [Zero M₀] → Prop"}, {"doc": "Predicate typeclass for expressing that a type is not reduced to a single element. In rings,\nthis is equivalent to `0 ≠ 1`. In vector spaces, this is equivalent to positive dimension. ", "name": "Nontrivial", "projection": "IsDomain.toNontrivial", "subobject": true, "type": "Type u_3 → Prop"}], "ownFields": [], "addedOverParents": [], "fieldCount": 3}, {"name": "NoZeroDivisors", "doc": "Predicate typeclass for expressing that `a * b = 0` implies `a = 0` or `b = 0`\nfor all `a` and `b` of type `M₀`. It is weaker than `IsCancelMulZero` in general,\nbut equivalent to it if `M₀` is a (not necessarily unital or associative) ring. ", "type": "(M₀ : Type u_2) → [Mul M₀] → [Zero M₀] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "For all `a` and `b` of `M₀`, `a * b = 0` implies `a = 0` or `b = 0`. ", "kind": "field", "name": "eq_zero_or_eq_zero_of_mul_eq_zero", "owner": "NoZeroDivisors", "proj": "NoZeroDivisors.eq_zero_or_eq_zero_of_mul_eq_zero", "type": "∀ {M₀ : Type u_2} {inst : Mul M₀} {inst_1 : Zero M₀} [self : NoZeroDivisors M₀] {a b : M₀},\n  a * b = 0 → a = 0 ∨ b = 0"}], "addedOverParents": [{"doc": "For all `a` and `b` of `M₀`, `a * b = 0` implies `a = 0` or `b = 0`. ", "kind": "field", "name": "eq_zero_or_eq_zero_of_mul_eq_zero", "owner": "NoZeroDivisors", "proj": "NoZeroDivisors.eq_zero_or_eq_zero_of_mul_eq_zero", "type": "∀ {M₀ : Type u_2} {inst : Mul M₀} {inst_1 : Zero M₀} [self : NoZeroDivisors M₀] {a b : M₀},\n  a * b = 0 → a = 0 ∨ b = 0"}], "fieldCount": 1}, {"name": "IsCancelMulZero", "doc": "A mixin for cancellative multiplication by nonzero elements. ", "type": "(M₀ : Type u) → [Mul M₀] → [Zero M₀] → Prop", "isAbbrev": false, "parents": [{"doc": "A mixin for left cancellative multiplication by nonzero elements. ", "name": "IsLeftCancelMulZero", "projection": "IsCancelMulZero.toIsLeftCancelMulZero", "subobject": true, "type": "(M₀ : Type u) → [Mul M₀] → [Zero M₀] → Prop"}, {"doc": "A mixin for right cancellative multiplication by nonzero elements. ", "name": "IsRightCancelMulZero", "projection": "IsCancelMulZero.toIsRightCancelMulZero", "subobject": true, "type": "(M₀ : Type u) → [Mul M₀] → [Zero M₀] → Prop"}], "ownFields": [], "addedOverParents": [], "fieldCount": 2}, {"name": "IsLocalRing", "doc": "A semiring is local if it is nontrivial and `a` or `b` is a unit whenever `a + b = 1`.\nNote that `IsLocalRing` is a predicate. ", "type": "(R : Type u_1) → [Semiring R] → Prop", "isAbbrev": false, "parents": [{"doc": "Predicate typeclass for expressing that a type is not reduced to a single element. In rings,\nthis is equivalent to `0 ≠ 1`. In vector spaces, this is equivalent to positive dimension. ", "name": "Nontrivial", "projection": "IsLocalRing.toNontrivial", "subobject": true, "type": "Type u_3 → Prop"}], "ownFields": [{"doc": "in a local ring `R`, if `a + b = 1`, then either `a` is a unit or `b` is a unit. In another\nword, for every `a : R`, either `a` is a unit or `1 - a` is a unit. ", "kind": "field", "name": "isUnit_or_isUnit_of_add_one", "owner": "IsLocalRing", "proj": "IsLocalRing.isUnit_or_isUnit_of_add_one", "type": "∀ {R : Type u_1} {inst : Semiring R} [self : IsLocalRing R] {a b : R},\n  a + b = 1 → IsUnit a ∨ IsUnit b"}], "addedOverParents": [{"doc": "in a local ring `R`, if `a + b = 1`, then either `a` is a unit or `b` is a unit. In another\nword, for every `a : R`, either `a` is a unit or `1 - a` is a unit. ", "kind": "field", "name": "isUnit_or_isUnit_of_add_one", "owner": "IsLocalRing", "proj": "IsLocalRing.isUnit_or_isUnit_of_add_one", "type": "∀ {R : Type u_1} {inst : Semiring R} [self : IsLocalRing R] {a b : R},\n  a + b = 1 → IsUnit a ∨ IsUnit b"}], "fieldCount": 2}, {"name": "IsNoetherianRing", "doc": "A (semi)ring is Noetherian if it is Noetherian as a module over itself,\ni.e. all its ideals are finitely generated. ", "type": "(R : Type u_1) → [Semiring R] → Prop", "isAbbrev": true, "parents": [], "ownFields": [], "addedOverParents": [], "fieldCount": 0, "note": "Abbrev, not a structure/class with fields: IsNoetherianRing R := IsNoetherian R R."}, {"name": "IsLeftCancelMulZero", "doc": "A mixin for left cancellative multiplication by nonzero elements. ", "type": "(M₀ : Type u) → [Mul M₀] → [Zero M₀] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "Multiplication by a nonzero element is left cancellative. ", "kind": "field", "name": "mul_left_cancel_of_ne_zero", "owner": "IsLeftCancelMulZero", "proj": "IsLeftCancelMulZero.mul_left_cancel_of_ne_zero", "type": "∀ {M₀ : Type u} {inst : Mul M₀} {inst_1 : Zero M₀} [self : IsLeftCancelMulZero M₀] {a : M₀},\n  a ≠ 0 → IsLeftRegular a"}], "addedOverParents": [{"doc": "Multiplication by a nonzero element is left cancellative. ", "kind": "field", "name": "mul_left_cancel_of_ne_zero", "owner": "IsLeftCancelMulZero", "proj": "IsLeftCancelMulZero.mul_left_cancel_of_ne_zero", "type": "∀ {M₀ : Type u} {inst : Mul M₀} {inst_1 : Zero M₀} [self : IsLeftCancelMulZero M₀] {a : M₀},\n  a ≠ 0 → IsLeftRegular a"}], "fieldCount": 1}, {"name": "IsRightCancelMulZero", "doc": "A mixin for right cancellative multiplication by nonzero elements. ", "type": "(M₀ : Type u) → [Mul M₀] → [Zero M₀] → Prop", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "Multiplication by a nonzero element is right cancellative. ", "kind": "field", "name": "mul_right_cancel_of_ne_zero", "owner": "IsRightCancelMulZero", "proj": "IsRightCancelMulZero.mul_right_cancel_of_ne_zero", "type": "∀ {M₀ : Type u} {inst : Mul M₀} {inst_1 : Zero M₀} [self : IsRightCancelMulZero M₀] {a : M₀},\n  a ≠ 0 → IsRightRegular a"}], "addedOverParents": [{"doc": "Multiplication by a nonzero element is right cancellative. ", "kind": "field", "name": "mul_right_cancel_of_ne_zero", "owner": "IsRightCancelMulZero", "proj": "IsRightCancelMulZero.mul_right_cancel_of_ne_zero", "type": "∀ {M₀ : Type u} {inst : Mul M₀} {inst_1 : Zero M₀} [self : IsRightCancelMulZero M₀] {a : M₀},\n  a ≠ 0 → IsRightRegular a"}], "fieldCount": 1}, {"name": "MonoidWithZero", "doc": "A type `M₀` is a “monoid with zero” if it is a monoid with zero element, and `0` is left\nand right absorbing. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A `Monoid` is a `Semigroup` with an element `1` such that `1 * a = a * 1 = a`. ", "name": "Monoid", "projection": "MonoidWithZero.toMonoid", "subobject": true, "type": "Type u → Type u"}, {"doc": "A typeclass for non-associative monoids with zero elements. ", "name": "MulZeroOneClass", "projection": "MonoidWithZero.toMulZeroOneClass", "subobject": false, "type": "Type u → Type u"}, {"doc": "A type `S₀` is a \"semigroup with zero” if it is a semigroup with zero element, and `0` is left\nand right absorbing. ", "name": "SemigroupWithZero", "projection": "MonoidWithZero.toSemigroupWithZero", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Zero is a left absorbing element for multiplication ", "kind": "field", "name": "zero_mul", "owner": "MonoidWithZero", "proj": "MonoidWithZero.zero_mul", "type": "∀ {M₀ : Type u} [self : MonoidWithZero M₀] (a : M₀), 0 * a = 0"}, {"doc": "Zero is a right absorbing element for multiplication ", "kind": "field", "name": "mul_zero", "owner": "MonoidWithZero", "proj": "MonoidWithZero.mul_zero", "type": "∀ {M₀ : Type u} [self : MonoidWithZero M₀] (a : M₀), a * 0 = 0"}], "addedOverParents": [], "fieldCount": 11, "copiedFromParents": ["zero_mul", "mul_zero"]}, {"name": "Monoid", "doc": "A `Monoid` is a `Semigroup` with an element `1` such that `1 * a = a * 1 = a`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A semigroup is a type with an associative `(*)`. ", "name": "Semigroup", "projection": "Monoid.toSemigroup", "subobject": true, "type": "Type u → Type u"}, {"doc": "Typeclass for expressing that a type `M` with multiplication and a one satisfies\n`1 * a = a` and `a * 1 = a` for all `a : M`. ", "name": "MulOneClass", "projection": "Monoid.toMulOneClass", "subobject": false, "type": "Type u → Type u"}, {"doc": "`NPow` is an implementation detail of `Monoid`. It is needed because it is\nimpossible to extend `Pow M ℕ` and `Pow M ℤ` at the same time. ", "name": "NPow", "projection": "Monoid.toNPow", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "One is a left neutral element for multiplication ", "kind": "field", "name": "one_mul", "owner": "Monoid", "proj": "Monoid.one_mul", "type": "∀ {M : Type u} [self : Monoid M] (a : M), 1 * a = a"}, {"doc": "One is a right neutral element for multiplication ", "kind": "field", "name": "mul_one", "owner": "Monoid", "proj": "Monoid.mul_one", "type": "∀ {M : Type u} [self : Monoid M] (a : M), a * 1 = a"}, {"doc": "Raising to the power `(0 : ℕ)` gives `1`. ", "kind": "field", "name": "npow_zero", "owner": "Monoid", "proj": "Monoid.npow_zero", "type": "∀ {M : Type u} [self : Monoid M] (x : M), x ^ 0 = 1"}, {"doc": "Raising to the power `(n + 1 : ℕ)` behaves as expected. ", "kind": "field", "name": "npow_succ", "owner": "Monoid", "proj": "Monoid.npow_succ", "type": "∀ {M : Type u} [self : Monoid M] (n : ℕ) (x : M), x ^ (n + 1) = x ^ n * x"}], "addedOverParents": [{"doc": "Raising to the power `(0 : ℕ)` gives `1`. ", "kind": "field", "name": "npow_zero", "owner": "Monoid", "proj": "Monoid.npow_zero", "type": "∀ {M : Type u} [self : Monoid M] (x : M), x ^ 0 = 1"}, {"doc": "Raising to the power `(n + 1 : ℕ)` behaves as expected. ", "kind": "field", "name": "npow_succ", "owner": "Monoid", "proj": "Monoid.npow_succ", "type": "∀ {M : Type u} [self : Monoid M] (n : ℕ) (x : M), x ^ (n + 1) = x ^ n * x"}], "fieldCount": 8, "copiedFromParents": ["one_mul", "mul_one"]}, {"name": "SemigroupWithZero", "doc": "A type `S₀` is a \"semigroup with zero” if it is a semigroup with zero element, and `0` is left\nand right absorbing. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A semigroup is a type with an associative `(*)`. ", "name": "Semigroup", "projection": "SemigroupWithZero.toSemigroup", "subobject": true, "type": "Type u → Type u"}, {"doc": "Typeclass for expressing that a type `M₀` with multiplication and a zero satisfies\n`0 * a = 0` and `a * 0 = 0` for all `a : M₀`. ", "name": "MulZeroClass", "projection": "SemigroupWithZero.toMulZeroClass", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Zero is a left absorbing element for multiplication ", "kind": "field", "name": "zero_mul", "owner": "SemigroupWithZero", "proj": "SemigroupWithZero.zero_mul", "type": "∀ {S₀ : Type u} [self : SemigroupWithZero S₀] (a : S₀), 0 * a = 0"}, {"doc": "Zero is a right absorbing element for multiplication ", "kind": "field", "name": "mul_zero", "owner": "SemigroupWithZero", "proj": "SemigroupWithZero.mul_zero", "type": "∀ {S₀ : Type u} [self : SemigroupWithZero S₀] (a : S₀), a * 0 = 0"}], "addedOverParents": [], "fieldCount": 5, "copiedFromParents": ["zero_mul", "mul_zero"]}, {"name": "MulZeroOneClass", "doc": "A typeclass for non-associative monoids with zero elements. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "Typeclass for expressing that a type `M` with multiplication and a one satisfies\n`1 * a = a` and `a * 1 = a` for all `a : M`. ", "name": "MulOneClass", "projection": "MulZeroOneClass.toMulOneClass", "subobject": true, "type": "Type u → Type u"}, {"doc": "Typeclass for expressing that a type `M₀` with multiplication and a zero satisfies\n`0 * a = 0` and `a * 0 = 0` for all `a : M₀`. ", "name": "MulZeroClass", "projection": "MulZeroOneClass.toMulZeroClass", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Zero is a left absorbing element for multiplication ", "kind": "field", "name": "zero_mul", "owner": "MulZeroOneClass", "proj": "MulZeroOneClass.zero_mul", "type": "∀ {M₀ : Type u} [self : MulZeroOneClass M₀] (a : M₀), 0 * a = 0"}, {"doc": "Zero is a right absorbing element for multiplication ", "kind": "field", "name": "mul_zero", "owner": "MulZeroOneClass", "proj": "MulZeroOneClass.mul_zero", "type": "∀ {M₀ : Type u} [self : MulZeroOneClass M₀] (a : M₀), a * 0 = 0"}], "addedOverParents": [], "fieldCount": 7, "copiedFromParents": ["zero_mul", "mul_zero"]}, {"name": "ZPow", "doc": "`ZPow` is an implementation detail of `DivInvMonoid`. It is needed because it is\nimpossible to extend `Pow M ℕ` and `Pow M ℤ` at the same time. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "The power operation: `a ^ n = a * ··· * a`; `a ^ (-n) = a⁻¹ * ··· a⁻¹` (`n` times) ", "kind": "field", "name": "zpow", "owner": "ZPow", "proj": "ZPow.zpow", "type": "{G : Type u} → [self : ZPow G] → ℤ → G → G"}], "addedOverParents": [{"doc": "The power operation: `a ^ n = a * ··· * a`; `a ^ (-n) = a⁻¹ * ··· a⁻¹` (`n` times) ", "kind": "field", "name": "zpow", "owner": "ZPow", "proj": "ZPow.zpow", "type": "{G : Type u} → [self : ZPow G] → ℤ → G → G"}], "fieldCount": 1}, {"name": "NonUnitalNonAssocRing", "doc": "A not-necessarily-unital, not-necessarily-associative ring. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "An additive commutative group is an additive group with commutative `(+)`. \n\n[Wikidata Q181296](https://www.wikidata.org/wiki/Q181296)", "name": "AddCommGroup", "projection": "NonUnitalNonAssocRing.toAddCommGroup", "subobject": true, "type": "Type u → Type u"}, {"doc": "A not-necessarily-unital, not-necessarily-associative semiring. See `CommutatorRing` and the\ndocumentation thereof in case you need a `NonUnitalNonAssocSemiring` instance on a Lie ring\nor a Lie algebra. ", "name": "NonUnitalNonAssocSemiring", "projection": "NonUnitalNonAssocRing.toNonUnitalNonAssocSemiring", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Multiplication is left distributive over addition ", "kind": "field", "name": "left_distrib", "owner": "NonUnitalNonAssocRing", "proj": "NonUnitalNonAssocRing.left_distrib", "type": "∀ {α : Type u} [self : NonUnitalNonAssocRing α] (a b c : α), a * (b + c) = a * b + a * c"}, {"doc": "Multiplication is right distributive over addition ", "kind": "field", "name": "right_distrib", "owner": "NonUnitalNonAssocRing", "proj": "NonUnitalNonAssocRing.right_distrib", "type": "∀ {α : Type u} [self : NonUnitalNonAssocRing α] (a b c : α), (a + b) * c = a * c + b * c"}, {"doc": "Zero is a left absorbing element for multiplication ", "kind": "field", "name": "zero_mul", "owner": "NonUnitalNonAssocRing", "proj": "NonUnitalNonAssocRing.zero_mul", "type": "∀ {α : Type u} [self : NonUnitalNonAssocRing α] (a : α), 0 * a = 0"}, {"doc": "Zero is a right absorbing element for multiplication ", "kind": "field", "name": "mul_zero", "owner": "NonUnitalNonAssocRing", "proj": "NonUnitalNonAssocRing.mul_zero", "type": "∀ {α : Type u} [self : NonUnitalNonAssocRing α] (a : α), a * 0 = 0"}], "addedOverParents": [], "fieldCount": 22, "copiedFromParents": ["left_distrib", "right_distrib", "zero_mul", "mul_zero"]}, {"name": "NonUnitalNonAssocSemiring", "doc": "A not-necessarily-unital, not-necessarily-associative semiring. See `CommutatorRing` and the\ndocumentation thereof in case you need a `NonUnitalNonAssocSemiring` instance on a Lie ring\nor a Lie algebra. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "An additive commutative monoid is an additive monoid with commutative `(+)`. ", "name": "AddCommMonoid", "projection": "NonUnitalNonAssocSemiring.toAddCommMonoid", "subobject": true, "type": "Type u → Type u"}, {"doc": "A typeclass stating that multiplication is left and right distributive\nover addition. ", "name": "Distrib", "projection": "NonUnitalNonAssocSemiring.toDistrib", "subobject": false, "type": "Type u_1 → Type u_1"}, {"doc": "Typeclass for expressing that a type `M₀` with multiplication and a zero satisfies\n`0 * a = 0` and `a * 0 = 0` for all `a : M₀`. ", "name": "MulZeroClass", "projection": "NonUnitalNonAssocSemiring.toMulZeroClass", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Multiplication is left distributive over addition ", "kind": "field", "name": "left_distrib", "owner": "NonUnitalNonAssocSemiring", "proj": "NonUnitalNonAssocSemiring.left_distrib", "type": "∀ {α : Type u} [self : NonUnitalNonAssocSemiring α] (a b c : α), a * (b + c) = a * b + a * c"}, {"doc": "Multiplication is right distributive over addition ", "kind": "field", "name": "right_distrib", "owner": "NonUnitalNonAssocSemiring", "proj": "NonUnitalNonAssocSemiring.right_distrib", "type": "∀ {α : Type u} [self : NonUnitalNonAssocSemiring α] (a b c : α), (a + b) * c = a * c + b * c"}, {"doc": "Zero is a left absorbing element for multiplication ", "kind": "field", "name": "zero_mul", "owner": "NonUnitalNonAssocSemiring", "proj": "NonUnitalNonAssocSemiring.zero_mul", "type": "∀ {α : Type u} [self : NonUnitalNonAssocSemiring α] (a : α), 0 * a = 0"}, {"doc": "Zero is a right absorbing element for multiplication ", "kind": "field", "name": "mul_zero", "owner": "NonUnitalNonAssocSemiring", "proj": "NonUnitalNonAssocSemiring.mul_zero", "type": "∀ {α : Type u} [self : NonUnitalNonAssocSemiring α] (a : α), a * 0 = 0"}], "addedOverParents": [], "fieldCount": 14, "copiedFromParents": ["left_distrib", "right_distrib", "zero_mul", "mul_zero"]}, {"name": "AddMonoidWithOne", "doc": "An `AddMonoidWithOne` is an `AddMonoid` with a `1`.\nIt also contains data for the unique homomorphism `ℕ → R`. ", "type": "Type u_2 → Type u_2", "isAbbrev": false, "parents": [{"doc": "The canonical homomorphism `Nat → R`. In most use cases, the target type will have a (semi)ring\nstructure, and this homomorphism should be a (semi)ring homomorphism.\n\n`NatCast` and `IntCast` exist to allow different libraries with their own types that can be notated\nas natural numbers to have consistent `simp` normal forms without needing to create coercion\nsimplification sets that are aware of all combinations. Libraries should make it easy to work with\n`NatCast` where possible. For instance, in Mathlib there will be such a homomorphism (and thus a\n`NatCast R` instance) whenever `R` is an additive monoid with a `1`.\n\nThe prototypical example is `Int.ofNat`.\n", "name": "NatCast", "projection": "AddMonoidWithOne.toNatCast", "subobject": true, "type": "Type u → Type u"}, {"doc": "An `AddMonoid` is an `AddSemigroup` with an element `0` such that `0 + a = a + 0 = a`. ", "name": "AddMonoid", "projection": "AddMonoidWithOne.toAddMonoid", "subobject": true, "type": "Type u → Type u"}, {"doc": "A type with a \"one\" element. ", "name": "One", "projection": "AddMonoidWithOne.toOne", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "The canonical map `ℕ → R` sends `0 : ℕ` to `0 : R`. ", "kind": "field", "name": "natCast_zero", "owner": "AddMonoidWithOne", "proj": "AddMonoidWithOne.natCast_zero", "type": "∀ {R : Type u_2} [self : AddMonoidWithOne R], ↑0 = 0"}, {"doc": "The canonical map `ℕ → R` is a homomorphism. ", "kind": "field", "name": "natCast_succ", "owner": "AddMonoidWithOne", "proj": "AddMonoidWithOne.natCast_succ", "type": "∀ {R : Type u_2} [self : AddMonoidWithOne R] (n : ℕ), ↑(n + 1) = ↑n + 1"}], "addedOverParents": [{"doc": "The canonical map `ℕ → R` sends `0 : ℕ` to `0 : R`. ", "kind": "field", "name": "natCast_zero", "owner": "AddMonoidWithOne", "proj": "AddMonoidWithOne.natCast_zero", "type": "∀ {R : Type u_2} [self : AddMonoidWithOne R], ↑0 = 0"}, {"doc": "The canonical map `ℕ → R` is a homomorphism. ", "kind": "field", "name": "natCast_succ", "owner": "AddMonoidWithOne", "proj": "AddMonoidWithOne.natCast_succ", "type": "∀ {R : Type u_2} [self : AddMonoidWithOne R] (n : ℕ), ↑(n + 1) = ↑n + 1"}], "fieldCount": 12}, {"name": "NatCast", "doc": "The canonical homomorphism `Nat → R`. In most use cases, the target type will have a (semi)ring\nstructure, and this homomorphism should be a (semi)ring homomorphism.\n\n`NatCast` and `IntCast` exist to allow different libraries with their own types that can be notated\nas natural numbers to have consistent `simp` normal forms without needing to create coercion\nsimplification sets that are aware of all combinations. Libraries should make it easy to work with\n`NatCast` where possible. For instance, in Mathlib there will be such a homomorphism (and thus a\n`NatCast R` instance) whenever `R` is an additive monoid with a `1`.\n\nThe prototypical example is `Int.ofNat`.\n", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "The canonical map `Nat → R`. ", "kind": "field", "name": "natCast", "owner": "NatCast", "proj": "NatCast.natCast", "type": "{R : Type u} → [self : NatCast R] → ℕ → R"}], "addedOverParents": [{"doc": "The canonical map `Nat → R`. ", "kind": "field", "name": "natCast", "owner": "NatCast", "proj": "NatCast.natCast", "type": "{R : Type u} → [self : NatCast R] → ℕ → R"}], "fieldCount": 1}, {"name": "One", "doc": "A type with a \"one\" element. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "The \"one\" element of the type. ", "kind": "field", "name": "one", "owner": "One", "proj": "One.one", "type": "{α : Type u} → [self : One α] → α"}], "addedOverParents": [{"doc": "The \"one\" element of the type. ", "kind": "field", "name": "one", "owner": "One", "proj": "One.one", "type": "{α : Type u} → [self : One α] → α"}], "fieldCount": 1}, {"name": "AddMonoid", "doc": "An `AddMonoid` is an `AddSemigroup` with an element `0` such that `0 + a = a + 0 = a`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "An additive semigroup is a type with an associative `(+)`. ", "name": "AddSemigroup", "projection": "AddMonoid.toAddSemigroup", "subobject": true, "type": "Type u → Type u"}, {"doc": "Typeclass for expressing that a type `M` with addition and a zero satisfies\n`0 + a = a` and `a + 0 = a` for all `a : M`. ", "name": "AddZeroClass", "projection": "AddMonoid.toAddZeroClass", "subobject": false, "type": "Type u → Type u"}, {"doc": "`NSMul` is an implementation detail of `AddMonoid`. It is needed because it is\nimpossible to extend `SMul ℕ M` and `SMul ℤ M` at the same time. ", "name": "NSMul", "projection": "AddMonoid.toNSMul", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "Zero is a left neutral element for addition ", "kind": "field", "name": "zero_add", "owner": "AddMonoid", "proj": "AddMonoid.zero_add", "type": "∀ {M : Type u} [self : AddMonoid M] (a : M), 0 + a = a"}, {"doc": "Zero is a right neutral element for addition ", "kind": "field", "name": "add_zero", "owner": "AddMonoid", "proj": "AddMonoid.add_zero", "type": "∀ {M : Type u} [self : AddMonoid M] (a : M), a + 0 = a"}, {"doc": "Multiplication by `(0 : ℕ)` gives `0`. ", "kind": "field", "name": "nsmul_zero", "owner": "AddMonoid", "proj": "AddMonoid.nsmul_zero", "type": "∀ {M : Type u} [self : AddMonoid M] (x : M), 0 • x = 0"}, {"doc": "Multiplication by `(n + 1 : ℕ)` behaves as expected. ", "kind": "field", "name": "nsmul_succ", "owner": "AddMonoid", "proj": "AddMonoid.nsmul_succ", "type": "∀ {M : Type u} [self : AddMonoid M] (n : ℕ) (x : M), (n + 1) • x = n • x + x"}], "addedOverParents": [{"doc": "Multiplication by `(0 : ℕ)` gives `0`. ", "kind": "field", "name": "nsmul_zero", "owner": "AddMonoid", "proj": "AddMonoid.nsmul_zero", "type": "∀ {M : Type u} [self : AddMonoid M] (x : M), 0 • x = 0"}, {"doc": "Multiplication by `(n + 1 : ℕ)` behaves as expected. ", "kind": "field", "name": "nsmul_succ", "owner": "AddMonoid", "proj": "AddMonoid.nsmul_succ", "type": "∀ {M : Type u} [self : AddMonoid M] (n : ℕ) (x : M), (n + 1) • x = n • x + x"}], "fieldCount": 8, "copiedFromParents": ["zero_add", "add_zero"]}, {"name": "Distrib", "doc": "A typeclass stating that multiplication is left and right distributive\nover addition. ", "type": "Type u_1 → Type u_1", "isAbbrev": false, "parents": [{"doc": "The homogeneous version of `HMul`: `a * b : α` where `a b : α`. ", "name": "Mul", "projection": "Distrib.toMul", "subobject": true, "type": "Type u → Type u"}, {"doc": "The homogeneous version of `HAdd`: `a + b : α` where `a b : α`. ", "name": "Add", "projection": "Distrib.toAdd", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "Multiplication is left distributive over addition ", "kind": "field", "name": "left_distrib", "owner": "Distrib", "proj": "Distrib.left_distrib", "type": "∀ {R : Type u_1} [self : Distrib R] (a b c : R), a * (b + c) = a * b + a * c"}, {"doc": "Multiplication is right distributive over addition ", "kind": "field", "name": "right_distrib", "owner": "Distrib", "proj": "Distrib.right_distrib", "type": "∀ {R : Type u_1} [self : Distrib R] (a b c : R), (a + b) * c = a * c + b * c"}], "addedOverParents": [{"doc": "Multiplication is left distributive over addition ", "kind": "field", "name": "left_distrib", "owner": "Distrib", "proj": "Distrib.left_distrib", "type": "∀ {R : Type u_1} [self : Distrib R] (a b c : R), a * (b + c) = a * b + a * c"}, {"doc": "Multiplication is right distributive over addition ", "kind": "field", "name": "right_distrib", "owner": "Distrib", "proj": "Distrib.right_distrib", "type": "∀ {R : Type u_1} [self : Distrib R] (a b c : R), (a + b) * c = a * c + b * c"}], "fieldCount": 4}, {"name": "Sub", "doc": "The homogeneous version of `HSub`: `a - b : α` where `a b : α`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "`a - b` computes the difference of `a` and `b`. See `HSub`. ", "kind": "field", "name": "sub", "owner": "Sub", "proj": "Sub.sub", "type": "{α : Type u} → [self : Sub α] → α → α → α"}], "addedOverParents": [{"doc": "`a - b` computes the difference of `a` and `b`. See `HSub`. ", "kind": "field", "name": "sub", "owner": "Sub", "proj": "Sub.sub", "type": "{α : Type u} → [self : Sub α] → α → α → α"}], "fieldCount": 1}, {"name": "NonAssocSemiring", "doc": "A unital but not-necessarily-associative semiring. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A not-necessarily-unital, not-necessarily-associative semiring. See `CommutatorRing` and the\ndocumentation thereof in case you need a `NonUnitalNonAssocSemiring` instance on a Lie ring\nor a Lie algebra. ", "name": "NonUnitalNonAssocSemiring", "projection": "NonAssocSemiring.toNonUnitalNonAssocSemiring", "subobject": true, "type": "Type u → Type u"}, {"doc": "A typeclass for non-associative monoids with zero elements. ", "name": "MulZeroOneClass", "projection": "NonAssocSemiring.toMulZeroOneClass", "subobject": false, "type": "Type u → Type u"}, {"doc": "An `AddCommMonoidWithOne` is an `AddMonoidWithOne` satisfying `a + b = b + a`. ", "name": "AddCommMonoidWithOne", "projection": "NonAssocSemiring.toAddCommMonoidWithOne", "subobject": false, "type": "Type u_2 → Type u_2"}], "ownFields": [{"doc": "One is a left neutral element for multiplication ", "kind": "field", "name": "one_mul", "owner": "NonAssocSemiring", "proj": "NonAssocSemiring.one_mul", "type": "∀ {α : Type u} [self : NonAssocSemiring α] (a : α), 1 * a = a"}, {"doc": "One is a right neutral element for multiplication ", "kind": "field", "name": "mul_one", "owner": "NonAssocSemiring", "proj": "NonAssocSemiring.mul_one", "type": "∀ {α : Type u} [self : NonAssocSemiring α] (a : α), a * 1 = a"}, {"doc": "The canonical map `ℕ → R` sends `0 : ℕ` to `0 : R`. ", "kind": "field", "name": "natCast_zero", "owner": "NonAssocSemiring", "proj": "NonAssocSemiring.natCast_zero", "type": "∀ {α : Type u} [self : NonAssocSemiring α], ↑0 = 0"}, {"doc": "The canonical map `ℕ → R` is a homomorphism. ", "kind": "field", "name": "natCast_succ", "owner": "NonAssocSemiring", "proj": "NonAssocSemiring.natCast_succ", "type": "∀ {α : Type u} [self : NonAssocSemiring α] (n : ℕ), ↑(n + 1) = ↑n + 1"}], "addedOverParents": [], "fieldCount": 20, "copiedFromParents": ["one_mul", "mul_one", "natCast_zero", "natCast_succ"]}, {"name": "AddCommMonoidWithOne", "doc": "An `AddCommMonoidWithOne` is an `AddMonoidWithOne` satisfying `a + b = b + a`. ", "type": "Type u_2 → Type u_2", "isAbbrev": false, "parents": [{"doc": "An `AddMonoidWithOne` is an `AddMonoid` with a `1`.\nIt also contains data for the unique homomorphism `ℕ → R`. ", "name": "AddMonoidWithOne", "projection": "AddCommMonoidWithOne.toAddMonoidWithOne", "subobject": true, "type": "Type u_2 → Type u_2"}, {"doc": "An additive commutative monoid is an additive monoid with commutative `(+)`. ", "name": "AddCommMonoid", "projection": "AddCommMonoidWithOne.toAddCommMonoid", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Addition is commutative in a commutative additive magma. ", "kind": "field", "name": "add_comm", "owner": "AddCommMonoidWithOne", "proj": "AddCommMonoidWithOne.add_comm", "type": "∀ {R : Type u_2} [self : AddCommMonoidWithOne R] (a b : R), a + b = b + a"}], "addedOverParents": [], "fieldCount": 13, "copiedFromParents": ["add_comm"]}, {"name": "MulOneClass", "doc": "Typeclass for expressing that a type `M` with multiplication and a one satisfies\n`1 * a = a` and `a * 1 = a` for all `a : M`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "Bundling a `Mul` and `One` structure together without any axioms about their\ncompatibility. See `MulOneClass` for the additional assumption that 1 is an identity. ", "name": "MulOne", "projection": "MulOneClass.toMulOne", "subobject": true, "type": "Type u_2 → Type u_2"}], "ownFields": [{"doc": "One is a left neutral element for multiplication ", "kind": "field", "name": "one_mul", "owner": "MulOneClass", "proj": "MulOneClass.one_mul", "type": "∀ {M : Type u} [self : MulOneClass M] (a : M), 1 * a = a"}, {"doc": "One is a right neutral element for multiplication ", "kind": "field", "name": "mul_one", "owner": "MulOneClass", "proj": "MulOneClass.mul_one", "type": "∀ {M : Type u} [self : MulOneClass M] (a : M), a * 1 = a"}], "addedOverParents": [{"doc": "One is a left neutral element for multiplication ", "kind": "field", "name": "one_mul", "owner": "MulOneClass", "proj": "MulOneClass.one_mul", "type": "∀ {M : Type u} [self : MulOneClass M] (a : M), 1 * a = a"}, {"doc": "One is a right neutral element for multiplication ", "kind": "field", "name": "mul_one", "owner": "MulOneClass", "proj": "MulOneClass.mul_one", "type": "∀ {M : Type u} [self : MulOneClass M] (a : M), a * 1 = a"}], "fieldCount": 4}, {"name": "MulOne", "doc": "Bundling a `Mul` and `One` structure together without any axioms about their\ncompatibility. See `MulOneClass` for the additional assumption that 1 is an identity. ", "type": "Type u_2 → Type u_2", "isAbbrev": false, "parents": [{"doc": "A type with a \"one\" element. ", "name": "One", "projection": "MulOne.toOne", "subobject": true, "type": "Type u → Type u"}, {"doc": "The homogeneous version of `HMul`: `a * b : α` where `a b : α`. ", "name": "Mul", "projection": "MulOne.toMul", "subobject": true, "type": "Type u → Type u"}], "ownFields": [], "addedOverParents": [], "fieldCount": 2}, {"name": "AddCommSemigroup", "doc": "A commutative additive semigroup is a type with an associative commutative `(+)`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "An additive semigroup is a type with an associative `(+)`. ", "name": "AddSemigroup", "projection": "AddCommSemigroup.toAddSemigroup", "subobject": true, "type": "Type u → Type u"}, {"doc": "A commutative additive magma is a type with an addition which commutes. ", "name": "AddCommMagma", "projection": "AddCommSemigroup.toAddCommMagma", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Addition is commutative in a commutative additive magma. ", "kind": "field", "name": "add_comm", "owner": "AddCommSemigroup", "proj": "AddCommSemigroup.add_comm", "type": "∀ {G : Type u} [self : AddCommSemigroup G] (a b : G), a + b = b + a"}], "addedOverParents": [], "fieldCount": 3, "copiedFromParents": ["add_comm"]}, {"name": "AddCommMagma", "doc": "A commutative additive magma is a type with an addition which commutes. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "The homogeneous version of `HAdd`: `a + b : α` where `a b : α`. ", "name": "Add", "projection": "AddCommMagma.toAdd", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "Addition is commutative in a commutative additive magma. ", "kind": "field", "name": "add_comm", "owner": "AddCommMagma", "proj": "AddCommMagma.add_comm", "type": "∀ {G : Type u} [self : AddCommMagma G] (a b : G), a + b = b + a"}], "addedOverParents": [{"doc": "Addition is commutative in a commutative additive magma. ", "kind": "field", "name": "add_comm", "owner": "AddCommMagma", "proj": "AddCommMagma.add_comm", "type": "∀ {G : Type u} [self : AddCommMagma G] (a b : G), a + b = b + a"}], "fieldCount": 2}, {"name": "AddSemigroup", "doc": "An additive semigroup is a type with an associative `(+)`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "The homogeneous version of `HAdd`: `a + b : α` where `a b : α`. ", "name": "Add", "projection": "AddSemigroup.toAdd", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "Addition is associative ", "kind": "field", "name": "add_assoc", "owner": "AddSemigroup", "proj": "AddSemigroup.add_assoc", "type": "∀ {G : Type u} [self : AddSemigroup G] (a b c : G), a + b + c = a + (b + c)"}], "addedOverParents": [{"doc": "Addition is associative ", "kind": "field", "name": "add_assoc", "owner": "AddSemigroup", "proj": "AddSemigroup.add_assoc", "type": "∀ {G : Type u} [self : AddSemigroup G] (a b c : G), a + b + c = a + (b + c)"}], "fieldCount": 2}, {"name": "AddZero", "doc": "Bundling an `Add` and `Zero` structure together without any axioms about their\ncompatibility. See `AddZeroClass` for the additional assumption that 0 is an identity. ", "type": "Type u_2 → Type u_2", "isAbbrev": false, "parents": [{"doc": "A type with a zero element. ", "name": "Zero", "projection": "AddZero.toZero", "subobject": true, "type": "Type u → Type u"}, {"doc": "The homogeneous version of `HAdd`: `a + b : α` where `a b : α`. ", "name": "Add", "projection": "AddZero.toAdd", "subobject": true, "type": "Type u → Type u"}], "ownFields": [], "addedOverParents": [], "fieldCount": 2}, {"name": "Zero", "doc": "A type with a zero element. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "The zero element of the type. ", "kind": "field", "name": "zero", "owner": "Zero", "proj": "Zero.zero", "type": "{α : Type u} → [self : Zero α] → α"}], "addedOverParents": [{"doc": "The zero element of the type. ", "kind": "field", "name": "zero", "owner": "Zero", "proj": "Zero.zero", "type": "{α : Type u} → [self : Zero α] → α"}], "fieldCount": 1}, {"name": "Add", "doc": "The homogeneous version of `HAdd`: `a + b : α` where `a b : α`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "`a + b` computes the sum of `a` and `b`. See `HAdd`. ", "kind": "field", "name": "add", "owner": "Add", "proj": "Add.add", "type": "{α : Type u} → [self : Add α] → α → α → α"}], "addedOverParents": [{"doc": "`a + b` computes the sum of `a` and `b`. See `HAdd`. ", "kind": "field", "name": "add", "owner": "Add", "proj": "Add.add", "type": "{α : Type u} → [self : Add α] → α → α → α"}], "fieldCount": 1}, {"name": "IntCast", "doc": "The canonical homomorphism `Int → R`. In most use cases, the target type will have a ring structure,\nand this homomorphism should be a ring homomorphism.\n\n`IntCast` and `NatCast` exist to allow different libraries with their own types that can be notated\nas natural numbers to have consistent `simp` normal forms without needing to create coercion\nsimplification sets that are aware of all combinations. Libraries should make it easy to work with\n`IntCast` where possible. For instance, in Mathlib there will be such a homomorphism (and thus an\n`IntCast R` instance) whenever `R` is an additive group with a `1`.\n", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "The canonical map `Int → R`. ", "kind": "field", "name": "intCast", "owner": "IntCast", "proj": "IntCast.intCast", "type": "{R : Type u} → [self : IntCast R] → ℤ → R"}], "addedOverParents": [{"doc": "The canonical map `Int → R`. ", "kind": "field", "name": "intCast", "owner": "IntCast", "proj": "IntCast.intCast", "type": "{R : Type u} → [self : IntCast R] → ℤ → R"}], "fieldCount": 1}, {"name": "Inv", "doc": "The notation typeclass for inverses.\nThis enables the notation `a⁻¹ : α` where `a : α`.\n", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "`a⁻¹` computes the inverse of `a`.\nThe meaning of this notation is type-dependent. \n\nConventions for notations in identifiers:\n\n * The recommended spelling of `⁻¹` in identifiers is `inv`.", "kind": "field", "name": "inv", "owner": "Inv", "proj": "Inv.inv", "type": "{α : Type u} → [self : Inv α] → α → α"}], "addedOverParents": [{"doc": "`a⁻¹` computes the inverse of `a`.\nThe meaning of this notation is type-dependent. \n\nConventions for notations in identifiers:\n\n * The recommended spelling of `⁻¹` in identifiers is `inv`.", "kind": "field", "name": "inv", "owner": "Inv", "proj": "Inv.inv", "type": "{α : Type u} → [self : Inv α] → α → α"}], "fieldCount": 1}, {"name": "CommMonoid", "doc": "A commutative monoid is a monoid with commutative `(*)`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A `Monoid` is a `Semigroup` with an element `1` such that `1 * a = a * 1 = a`. ", "name": "Monoid", "projection": "CommMonoid.toMonoid", "subobject": true, "type": "Type u → Type u"}, {"doc": "A commutative semigroup is a type with an associative commutative `(*)`. ", "name": "CommSemigroup", "projection": "CommMonoid.toCommSemigroup", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Multiplication is commutative in a commutative multiplicative magma. ", "kind": "field", "name": "mul_comm", "owner": "CommMonoid", "proj": "CommMonoid.mul_comm", "type": "∀ {M : Type u} [self : CommMonoid M] (a b : M), a * b = b * a"}], "addedOverParents": [], "fieldCount": 9, "copiedFromParents": ["mul_comm"]}, {"name": "CommSemigroup", "doc": "A commutative semigroup is a type with an associative commutative `(*)`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A semigroup is a type with an associative `(*)`. ", "name": "Semigroup", "projection": "CommSemigroup.toSemigroup", "subobject": true, "type": "Type u → Type u"}, {"doc": "A commutative multiplicative magma is a type with a multiplication which commutes. ", "name": "CommMagma", "projection": "CommSemigroup.toCommMagma", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Multiplication is commutative in a commutative multiplicative magma. ", "kind": "field", "name": "mul_comm", "owner": "CommSemigroup", "proj": "CommSemigroup.mul_comm", "type": "∀ {G : Type u} [self : CommSemigroup G] (a b : G), a * b = b * a"}], "addedOverParents": [], "fieldCount": 3, "copiedFromParents": ["mul_comm"]}, {"name": "Neg", "doc": "The notation typeclass for negation.\nThis enables the notation `-a : α` where `a : α`.\n", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "`-a` computes the negative or opposite of `a`.\nThe meaning of this notation is type-dependent. \n\nConventions for notations in identifiers:\n\n * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator).", "kind": "field", "name": "neg", "owner": "Neg", "proj": "Neg.neg", "type": "{α : Type u} → [self : Neg α] → α → α"}], "addedOverParents": [{"doc": "`-a` computes the negative or opposite of `a`.\nThe meaning of this notation is type-dependent. \n\nConventions for notations in identifiers:\n\n * The recommended spelling of `-` in identifiers is `neg` (when used as a unary operator).", "kind": "field", "name": "neg", "owner": "Neg", "proj": "Neg.neg", "type": "{α : Type u} → [self : Neg α] → α → α"}], "fieldCount": 1}, {"name": "Semigroup", "doc": "A semigroup is a type with an associative `(*)`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "The homogeneous version of `HMul`: `a * b : α` where `a b : α`. ", "name": "Mul", "projection": "Semigroup.toMul", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "Multiplication is associative ", "kind": "field", "name": "mul_assoc", "owner": "Semigroup", "proj": "Semigroup.mul_assoc", "type": "∀ {G : Type u} [self : Semigroup G] (a b c : G), a * b * c = a * (b * c)"}], "addedOverParents": [{"doc": "Multiplication is associative ", "kind": "field", "name": "mul_assoc", "owner": "Semigroup", "proj": "Semigroup.mul_assoc", "type": "∀ {G : Type u} [self : Semigroup G] (a b c : G), a * b * c = a * (b * c)"}], "fieldCount": 2}, {"name": "NPow", "doc": "`NPow` is an implementation detail of `Monoid`. It is needed because it is\nimpossible to extend `Pow M ℕ` and `Pow M ℤ` at the same time. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "Raising to the power of a natural number. ", "kind": "field", "name": "npow", "owner": "NPow", "proj": "NPow.npow", "type": "{M : Type u} → [self : NPow M] → ℕ → M → M"}], "addedOverParents": [{"doc": "Raising to the power of a natural number. ", "kind": "field", "name": "npow", "owner": "NPow", "proj": "NPow.npow", "type": "{M : Type u} → [self : NPow M] → ℕ → M → M"}], "fieldCount": 1}, {"name": "DivInvMonoid", "doc": "A `DivInvMonoid` is a `Monoid` with operations `/` and `⁻¹` satisfying\n`div_eq_mul_inv : ∀ a b, a / b = a * b⁻¹`.\n\nThis deduplicates the name `div_eq_mul_inv`.\nThe default for `div` is such that `a / b = a * b⁻¹` holds by definition.\n\nAdding `div` as a field rather than defining `a / b := a * b⁻¹` allows us to\navoid certain classes of unification failures, for example:\nLet `Foo X` be a type with a `∀ X, Div (Foo X)` instance but no\n`∀ X, Inv (Foo X)`, e.g. when `Foo X` is a `EuclideanDomain`. Suppose we\nalso have an instance `∀ X [Cromulent X], GroupWithZero (Foo X)`. Then the\n`(/)` coming from `GroupWithZero.div` cannot be definitionally equal to\nthe `(/)` coming from `Foo.Div`.\n\nIn the same way, adding a `zpow` field makes it possible to avoid definitional failures\nin diamonds. See the definition of `Monoid` and Note [forgetful inheritance] for more\nexplanations on this.\n", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A `Monoid` is a `Semigroup` with an element `1` such that `1 * a = a * 1 = a`. ", "name": "Monoid", "projection": "DivInvMonoid.toMonoid", "subobject": true, "type": "Type u → Type u"}, {"doc": "The notation typeclass for inverses.\nThis enables the notation `a⁻¹ : α` where `a : α`.\n", "name": "Inv", "projection": "DivInvMonoid.toInv", "subobject": true, "type": "Type u → Type u"}, {"doc": "The homogeneous version of `HDiv`: `a / b : α` where `a b : α`. ", "name": "Div", "projection": "DivInvMonoid.toDiv", "subobject": true, "type": "Type u → Type u"}, {"doc": "`ZPow` is an implementation detail of `DivInvMonoid`. It is needed because it is\nimpossible to extend `Pow M ℕ` and `Pow M ℤ` at the same time. ", "name": "ZPow", "projection": "DivInvMonoid.toZPow", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "`a / b := a * b⁻¹` ", "kind": "field", "name": "div_eq_mul_inv", "owner": "DivInvMonoid", "proj": "DivInvMonoid.div_eq_mul_inv", "type": "∀ {G : Type u} [self : DivInvMonoid G] (a b : G), a / b = a * b⁻¹"}, {"doc": "`a ^ 0 = 1` ", "kind": "field", "name": "zpow_zero'", "owner": "DivInvMonoid", "proj": "DivInvMonoid.zpow_zero'", "type": "∀ {G : Type u} [self : DivInvMonoid G] (a : G), a ^ 0 = 1"}, {"doc": "`a ^ (n + 1) = a ^ n * a` ", "kind": "field", "name": "zpow_succ'", "owner": "DivInvMonoid", "proj": "DivInvMonoid.zpow_succ'", "type": "∀ {G : Type u} [self : DivInvMonoid G] (n : ℕ) (a : G), a ^ ↑n.succ = a ^ ↑n * a"}, {"doc": "`a ^ -(n + 1) = (a ^ (n + 1))⁻¹` ", "kind": "field", "name": "zpow_neg'", "owner": "DivInvMonoid", "proj": "DivInvMonoid.zpow_neg'", "type": "∀ {G : Type u} [self : DivInvMonoid G] (n : ℕ) (a : G), a ^ Int.negSucc n = (a ^ ↑n.succ)⁻¹"}], "addedOverParents": [{"doc": "`a / b := a * b⁻¹` ", "kind": "field", "name": "div_eq_mul_inv", "owner": "DivInvMonoid", "proj": "DivInvMonoid.div_eq_mul_inv", "type": "∀ {G : Type u} [self : DivInvMonoid G] (a b : G), a / b = a * b⁻¹"}, {"doc": "`a ^ 0 = 1` ", "kind": "field", "name": "zpow_zero'", "owner": "DivInvMonoid", "proj": "DivInvMonoid.zpow_zero'", "type": "∀ {G : Type u} [self : DivInvMonoid G] (a : G), a ^ 0 = 1"}, {"doc": "`a ^ (n + 1) = a ^ n * a` ", "kind": "field", "name": "zpow_succ'", "owner": "DivInvMonoid", "proj": "DivInvMonoid.zpow_succ'", "type": "∀ {G : Type u} [self : DivInvMonoid G] (n : ℕ) (a : G), a ^ ↑n.succ = a ^ ↑n * a"}, {"doc": "`a ^ -(n + 1) = (a ^ (n + 1))⁻¹` ", "kind": "field", "name": "zpow_neg'", "owner": "DivInvMonoid", "proj": "DivInvMonoid.zpow_neg'", "type": "∀ {G : Type u} [self : DivInvMonoid G] (n : ℕ) (a : G), a ^ Int.negSucc n = (a ^ ↑n.succ)⁻¹"}], "fieldCount": 15}, {"name": "Div", "doc": "The homogeneous version of `HDiv`: `a / b : α` where `a b : α`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "`a / b` computes the result of dividing `a` by `b`. See `HDiv`. ", "kind": "field", "name": "div", "owner": "Div", "proj": "Div.div", "type": "{α : Type u} → [self : Div α] → α → α → α"}], "addedOverParents": [{"doc": "`a / b` computes the result of dividing `a` by `b`. See `HDiv`. ", "kind": "field", "name": "div", "owner": "Div", "proj": "Div.div", "type": "{α : Type u} → [self : Div α] → α → α → α"}], "fieldCount": 1}, {"name": "Mul", "doc": "The homogeneous version of `HMul`: `a * b : α` where `a b : α`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "`a * b` computes the product of `a` and `b`. See `HMul`. ", "kind": "field", "name": "mul", "owner": "Mul", "proj": "Mul.mul", "type": "{α : Type u} → [self : Mul α] → α → α → α"}], "addedOverParents": [{"doc": "`a * b` computes the product of `a` and `b`. See `HMul`. ", "kind": "field", "name": "mul", "owner": "Mul", "proj": "Mul.mul", "type": "{α : Type u} → [self : Mul α] → α → α → α"}], "fieldCount": 1}, {"name": "Dvd", "doc": "Notation typeclass for the `∣` operation (typed as `\\|`), which represents divisibility. ", "type": "Type u_1 → Type u_1", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "Divisibility. `a ∣ b` (typed as `\\|`) means that there is some `c` such that `b = a * c`. \n\nConventions for notations in identifiers:\n\n * The recommended spelling of `∣` in identifiers is `dvd`.", "kind": "field", "name": "dvd", "owner": "Dvd", "proj": "Dvd.dvd", "type": "{α : Type u_1} → [self : Dvd α] → α → α → Prop"}], "addedOverParents": [{"doc": "Divisibility. `a ∣ b` (typed as `\\|`) means that there is some `c` such that `b = a * c`. \n\nConventions for notations in identifiers:\n\n * The recommended spelling of `∣` in identifiers is `dvd`.", "kind": "field", "name": "dvd", "owner": "Dvd", "proj": "Dvd.dvd", "type": "{α : Type u_1} → [self : Dvd α] → α → α → Prop"}], "fieldCount": 1}, {"name": "MulZeroClass", "doc": "Typeclass for expressing that a type `M₀` with multiplication and a zero satisfies\n`0 * a = 0` and `a * 0 = 0` for all `a : M₀`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "The homogeneous version of `HMul`: `a * b : α` where `a b : α`. ", "name": "Mul", "projection": "MulZeroClass.toMul", "subobject": true, "type": "Type u → Type u"}, {"doc": "A type with a zero element. ", "name": "Zero", "projection": "MulZeroClass.toZero", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "Zero is a left absorbing element for multiplication ", "kind": "field", "name": "zero_mul", "owner": "MulZeroClass", "proj": "MulZeroClass.zero_mul", "type": "∀ {M₀ : Type u} [self : MulZeroClass M₀] (a : M₀), 0 * a = 0"}, {"doc": "Zero is a right absorbing element for multiplication ", "kind": "field", "name": "mul_zero", "owner": "MulZeroClass", "proj": "MulZeroClass.mul_zero", "type": "∀ {M₀ : Type u} [self : MulZeroClass M₀] (a : M₀), a * 0 = 0"}], "addedOverParents": [{"doc": "Zero is a left absorbing element for multiplication ", "kind": "field", "name": "zero_mul", "owner": "MulZeroClass", "proj": "MulZeroClass.zero_mul", "type": "∀ {M₀ : Type u} [self : MulZeroClass M₀] (a : M₀), 0 * a = 0"}, {"doc": "Zero is a right absorbing element for multiplication ", "kind": "field", "name": "mul_zero", "owner": "MulZeroClass", "proj": "MulZeroClass.mul_zero", "type": "∀ {M₀ : Type u} [self : MulZeroClass M₀] (a : M₀), a * 0 = 0"}], "fieldCount": 4}, {"name": "AddCommMonoid", "doc": "An additive commutative monoid is an additive monoid with commutative `(+)`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "An `AddMonoid` is an `AddSemigroup` with an element `0` such that `0 + a = a + 0 = a`. ", "name": "AddMonoid", "projection": "AddCommMonoid.toAddMonoid", "subobject": true, "type": "Type u → Type u"}, {"doc": "A commutative additive semigroup is a type with an associative commutative `(+)`. ", "name": "AddCommSemigroup", "projection": "AddCommMonoid.toAddCommSemigroup", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Addition is commutative in a commutative additive magma. ", "kind": "field", "name": "add_comm", "owner": "AddCommMonoid", "proj": "AddCommMonoid.add_comm", "type": "∀ {M : Type u} [self : AddCommMonoid M] (a b : M), a + b = b + a"}], "addedOverParents": [], "fieldCount": 9, "copiedFromParents": ["add_comm"]}, {"name": "AddGroup", "doc": "An `AddGroup` is an `AddMonoid` with a unary `-` satisfying `-a + a = 0`.\n\nThere is also a binary operation `-` such that `a - b = a + -b`,\nwith a default so that `a - b = a + -b` holds by definition.\n\nUse `AddGroup.ofLeftAxioms` or `AddGroup.ofRightAxioms` to define an\nadditive group structure on a type with the minimum proof obligations.\n\n\n[Wikidata Q83478](https://www.wikidata.org/wiki/Q83478)", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A `SubNegMonoid` is an `AddMonoid` with unary `-` and binary `-` operations\nsatisfying `sub_eq_add_neg : ∀ a b, a - b = a + -b`.\n\nThe default for `sub` is such that `a - b = a + -b` holds by definition.\n\nAdding `sub` as a field rather than defining `a - b := a + -b` allows us to\navoid certain classes of unification failures, for example:\nLet `foo X` be a type with a `∀ X, Sub (Foo X)` instance but no\n`∀ X, Neg (Foo X)`. Suppose we also have an instance\n`∀ X [Cromulent X], AddGroup (Foo X)`. Then the `(-)` coming from\n`AddGroup.sub` cannot be definitionally equal to the `(-)` coming from\n`Foo.Sub`.\n\nIn the same way, adding a `zsmul` field makes it possible to avoid definitional failures\nin diamonds. See the definition of `AddMonoid` and Note [forgetful inheritance] for more\nexplanations on this.\n", "name": "SubNegMonoid", "projection": "AddGroup.toSubNegMonoid", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "", "kind": "field", "name": "neg_add_cancel", "owner": "AddGroup", "proj": "AddGroup.neg_add_cancel", "type": "∀ {A : Type u} [self : AddGroup A] (a : A), -a + a = 0"}], "addedOverParents": [{"doc": "", "kind": "field", "name": "neg_add_cancel", "owner": "AddGroup", "proj": "AddGroup.neg_add_cancel", "type": "∀ {A : Type u} [self : AddGroup A] (a : A), -a + a = 0"}], "fieldCount": 16}, {"name": "Semiring", "doc": "A `Semiring` is a type with addition, multiplication, a `0` and a `1` where addition is\ncommutative and associative, multiplication is associative and left and right distributive over\naddition, and `0` and `1` are additive and multiplicative identities. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "An additive commutative monoid is an additive monoid with commutative `(+)`. ", "name": "AddCommMonoid", "projection": "Semiring.toAddCommMonoid", "subobject": true, "type": "Type u → Type u"}, {"doc": "A type `M₀` is a “monoid with zero” if it is a monoid with zero element, and `0` is left\nand right absorbing. ", "name": "MonoidWithZero", "projection": "Semiring.toMonoidWithZero", "subobject": false, "type": "Type u → Type u"}, {"doc": "An associative but not-necessarily unital semiring. ", "name": "NonUnitalSemiring", "projection": "Semiring.toNonUnitalSemiring", "subobject": false, "type": "Type u → Type u"}, {"doc": "A unital but not-necessarily-associative semiring. ", "name": "NonAssocSemiring", "projection": "Semiring.toNonAssocSemiring", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Zero is a left absorbing element for multiplication ", "kind": "field", "name": "zero_mul", "owner": "Semiring", "proj": "Semiring.zero_mul", "type": "∀ {α : Type u} [self : Semiring α] (a : α), 0 * a = 0"}, {"doc": "Zero is a right absorbing element for multiplication ", "kind": "field", "name": "mul_zero", "owner": "Semiring", "proj": "Semiring.mul_zero", "type": "∀ {α : Type u} [self : Semiring α] (a : α), a * 0 = 0"}, {"doc": "Multiplication is left distributive over addition ", "kind": "field", "name": "left_distrib", "owner": "Semiring", "proj": "Semiring.left_distrib", "type": "∀ {α : Type u} [self : Semiring α] (a b c : α), a * (b + c) = a * b + a * c"}, {"doc": "Multiplication is right distributive over addition ", "kind": "field", "name": "right_distrib", "owner": "Semiring", "proj": "Semiring.right_distrib", "type": "∀ {α : Type u} [self : Semiring α] (a b c : α), (a + b) * c = a * c + b * c"}, {"doc": "The canonical map `ℕ → R` sends `0 : ℕ` to `0 : R`. ", "kind": "field", "name": "natCast_zero", "owner": "Semiring", "proj": "Semiring.natCast_zero", "type": "∀ {α : Type u} [self : Semiring α], ↑0 = 0"}, {"doc": "The canonical map `ℕ → R` is a homomorphism. ", "kind": "field", "name": "natCast_succ", "owner": "Semiring", "proj": "Semiring.natCast_succ", "type": "∀ {α : Type u} [self : Semiring α] (n : ℕ), ↑(n + 1) = ↑n + 1"}], "addedOverParents": [], "fieldCount": 24, "copiedFromParents": ["zero_mul", "mul_zero", "left_distrib", "right_distrib", "natCast_zero", "natCast_succ"]}, {"name": "AddGroupWithOne", "doc": "An `AddGroupWithOne` is an `AddGroup` with a 1. It also contains data for the unique\nhomomorphisms `ℕ → R` and `ℤ → R`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "The canonical homomorphism `Int → R`. In most use cases, the target type will have a ring structure,\nand this homomorphism should be a ring homomorphism.\n\n`IntCast` and `NatCast` exist to allow different libraries with their own types that can be notated\nas natural numbers to have consistent `simp` normal forms without needing to create coercion\nsimplification sets that are aware of all combinations. Libraries should make it easy to work with\n`IntCast` where possible. For instance, in Mathlib there will be such a homomorphism (and thus an\n`IntCast R` instance) whenever `R` is an additive group with a `1`.\n", "name": "IntCast", "projection": "AddGroupWithOne.toIntCast", "subobject": true, "type": "Type u → Type u"}, {"doc": "An `AddMonoidWithOne` is an `AddMonoid` with a `1`.\nIt also contains data for the unique homomorphism `ℕ → R`. ", "name": "AddMonoidWithOne", "projection": "AddGroupWithOne.toAddMonoidWithOne", "subobject": true, "type": "Type u_2 → Type u_2"}, {"doc": "An `AddGroup` is an `AddMonoid` with a unary `-` satisfying `-a + a = 0`.\n\nThere is also a binary operation `-` such that `a - b = a + -b`,\nwith a default so that `a - b = a + -b` holds by definition.\n\nUse `AddGroup.ofLeftAxioms` or `AddGroup.ofRightAxioms` to define an\nadditive group structure on a type with the minimum proof obligations.\n\n\n[Wikidata Q83478](https://www.wikidata.org/wiki/Q83478)", "name": "AddGroup", "projection": "AddGroupWithOne.toAddGroup", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "", "kind": "field", "name": "sub_eq_add_neg", "owner": "AddGroupWithOne", "proj": "AddGroupWithOne.sub_eq_add_neg", "type": "∀ {R : Type u} [self : AddGroupWithOne R] (a b : R), a - b = a + -b"}, {"doc": "", "kind": "field", "name": "zsmul_zero'", "owner": "AddGroupWithOne", "proj": "AddGroupWithOne.zsmul_zero'", "type": "∀ {R : Type u} [self : AddGroupWithOne R] (a : R), 0 • a = 0"}, {"doc": "", "kind": "field", "name": "zsmul_succ'", "owner": "AddGroupWithOne", "proj": "AddGroupWithOne.zsmul_succ'", "type": "∀ {R : Type u} [self : AddGroupWithOne R] (n : ℕ) (a : R), ↑n.succ • a = ↑n • a + a"}, {"doc": "", "kind": "field", "name": "zsmul_neg'", "owner": "AddGroupWithOne", "proj": "AddGroupWithOne.zsmul_neg'", "type": "∀ {R : Type u} [self : AddGroupWithOne R] (n : ℕ) (a : R), Int.negSucc n • a = -(↑n.succ • a)"}, {"doc": "", "kind": "field", "name": "neg_add_cancel", "owner": "AddGroupWithOne", "proj": "AddGroupWithOne.neg_add_cancel", "type": "∀ {R : Type u} [self : AddGroupWithOne R] (a : R), -a + a = 0"}, {"doc": "The canonical homomorphism `ℤ → R` agrees with the one from `ℕ → R` on `ℕ`. ", "kind": "field", "name": "intCast_ofNat", "owner": "AddGroupWithOne", "proj": "AddGroupWithOne.intCast_ofNat", "type": "∀ {R : Type u} [self : AddGroupWithOne R] (n : ℕ), IntCast.intCast ↑n = ↑n"}, {"doc": "The canonical homomorphism `ℤ → R` for negative values is just the negation of the values\nof the canonical homomorphism `ℕ → R`. ", "kind": "field", "name": "intCast_negSucc", "owner": "AddGroupWithOne", "proj": "AddGroupWithOne.intCast_negSucc", "type": "∀ {R : Type u} [self : AddGroupWithOne R] (n : ℕ), IntCast.intCast (Int.negSucc n) = -↑(n + 1)"}], "addedOverParents": [{"doc": "The canonical homomorphism `ℤ → R` agrees with the one from `ℕ → R` on `ℕ`. ", "kind": "field", "name": "intCast_ofNat", "owner": "AddGroupWithOne", "proj": "AddGroupWithOne.intCast_ofNat", "type": "∀ {R : Type u} [self : AddGroupWithOne R] (n : ℕ), IntCast.intCast ↑n = ↑n"}, {"doc": "The canonical homomorphism `ℤ → R` for negative values is just the negation of the values\nof the canonical homomorphism `ℕ → R`. ", "kind": "field", "name": "intCast_negSucc", "owner": "AddGroupWithOne", "proj": "AddGroupWithOne.intCast_negSucc", "type": "∀ {R : Type u} [self : AddGroupWithOne R] (n : ℕ), IntCast.intCast (Int.negSucc n) = -↑(n + 1)"}], "fieldCount": 23, "copiedFromParents": ["sub_eq_add_neg", "zsmul_zero'", "zsmul_succ'", "zsmul_neg'", "neg_add_cancel"]}, {"name": "NSMul", "doc": "`NSMul` is an implementation detail of `AddMonoid`. It is needed because it is\nimpossible to extend `SMul ℕ M` and `SMul ℤ M` at the same time. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "Multiplication by a natural number.\nSet this to `nsmulRec` unless `Module` diamonds are possible. ", "kind": "field", "name": "nsmul", "owner": "NSMul", "proj": "NSMul.nsmul", "type": "{M : Type u} → [self : NSMul M] → ℕ → M → M"}], "addedOverParents": [{"doc": "Multiplication by a natural number.\nSet this to `nsmulRec` unless `Module` diamonds are possible. ", "kind": "field", "name": "nsmul", "owner": "NSMul", "proj": "NSMul.nsmul", "type": "{M : Type u} → [self : NSMul M] → ℕ → M → M"}], "fieldCount": 1}, {"name": "AddZeroClass", "doc": "Typeclass for expressing that a type `M` with addition and a zero satisfies\n`0 + a = a` and `a + 0 = a` for all `a : M`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "Bundling an `Add` and `Zero` structure together without any axioms about their\ncompatibility. See `AddZeroClass` for the additional assumption that 0 is an identity. ", "name": "AddZero", "projection": "AddZeroClass.toAddZero", "subobject": true, "type": "Type u_2 → Type u_2"}], "ownFields": [{"doc": "Zero is a left neutral element for addition ", "kind": "field", "name": "zero_add", "owner": "AddZeroClass", "proj": "AddZeroClass.zero_add", "type": "∀ {M : Type u} [self : AddZeroClass M] (a : M), 0 + a = a"}, {"doc": "Zero is a right neutral element for addition ", "kind": "field", "name": "add_zero", "owner": "AddZeroClass", "proj": "AddZeroClass.add_zero", "type": "∀ {M : Type u} [self : AddZeroClass M] (a : M), a + 0 = a"}], "addedOverParents": [{"doc": "Zero is a left neutral element for addition ", "kind": "field", "name": "zero_add", "owner": "AddZeroClass", "proj": "AddZeroClass.zero_add", "type": "∀ {M : Type u} [self : AddZeroClass M] (a : M), 0 + a = a"}, {"doc": "Zero is a right neutral element for addition ", "kind": "field", "name": "add_zero", "owner": "AddZeroClass", "proj": "AddZeroClass.add_zero", "type": "∀ {M : Type u} [self : AddZeroClass M] (a : M), a + 0 = a"}], "fieldCount": 4}, {"name": "NNRatCast", "doc": "Typeclass for the canonical homomorphism `ℚ≥0 → K`.\n\nThis should be considered as a notation typeclass. The sole purpose of this typeclass is to be\nextended by `DivisionSemiring`. ", "type": "Type u_1 → Type u_1", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "The canonical homomorphism `ℚ≥0 → K`.\n\nDo not use directly. Use the coercion instead. ", "kind": "field", "name": "nnratCast", "owner": "NNRatCast", "proj": "NNRatCast.nnratCast", "type": "{K : Type u_1} → [self : NNRatCast K] → ℚ≥0 → K"}], "addedOverParents": [{"doc": "The canonical homomorphism `ℚ≥0 → K`.\n\nDo not use directly. Use the coercion instead. ", "kind": "field", "name": "nnratCast", "owner": "NNRatCast", "proj": "NNRatCast.nnratCast", "type": "{K : Type u_1} → [self : NNRatCast K] → ℚ≥0 → K"}], "fieldCount": 1}, {"name": "SubNegMonoid", "doc": "A `SubNegMonoid` is an `AddMonoid` with unary `-` and binary `-` operations\nsatisfying `sub_eq_add_neg : ∀ a b, a - b = a + -b`.\n\nThe default for `sub` is such that `a - b = a + -b` holds by definition.\n\nAdding `sub` as a field rather than defining `a - b := a + -b` allows us to\navoid certain classes of unification failures, for example:\nLet `foo X` be a type with a `∀ X, Sub (Foo X)` instance but no\n`∀ X, Neg (Foo X)`. Suppose we also have an instance\n`∀ X [Cromulent X], AddGroup (Foo X)`. Then the `(-)` coming from\n`AddGroup.sub` cannot be definitionally equal to the `(-)` coming from\n`Foo.Sub`.\n\nIn the same way, adding a `zsmul` field makes it possible to avoid definitional failures\nin diamonds. See the definition of `AddMonoid` and Note [forgetful inheritance] for more\nexplanations on this.\n", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "An `AddMonoid` is an `AddSemigroup` with an element `0` such that `0 + a = a + 0 = a`. ", "name": "AddMonoid", "projection": "SubNegMonoid.toAddMonoid", "subobject": true, "type": "Type u → Type u"}, {"doc": "The notation typeclass for negation.\nThis enables the notation `-a : α` where `a : α`.\n", "name": "Neg", "projection": "SubNegMonoid.toNeg", "subobject": true, "type": "Type u → Type u"}, {"doc": "The homogeneous version of `HSub`: `a - b : α` where `a b : α`. ", "name": "Sub", "projection": "SubNegMonoid.toSub", "subobject": true, "type": "Type u → Type u"}, {"doc": "`ZSMul` is an implementation detail of `SubNegMonoid`. It is needed because it is\nimpossible to extend `SMUl ℕ M` and `SMul ℤ M` at the same time. ", "name": "ZSMul", "projection": "SubNegMonoid.toZSMul", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "", "kind": "field", "name": "sub_eq_add_neg", "owner": "SubNegMonoid", "proj": "SubNegMonoid.sub_eq_add_neg", "type": "∀ {G : Type u} [self : SubNegMonoid G] (a b : G), a - b = a + -b"}, {"doc": "", "kind": "field", "name": "zsmul_zero'", "owner": "SubNegMonoid", "proj": "SubNegMonoid.zsmul_zero'", "type": "∀ {G : Type u} [self : SubNegMonoid G] (a : G), 0 • a = 0"}, {"doc": "", "kind": "field", "name": "zsmul_succ'", "owner": "SubNegMonoid", "proj": "SubNegMonoid.zsmul_succ'", "type": "∀ {G : Type u} [self : SubNegMonoid G] (n : ℕ) (a : G), ↑n.succ • a = ↑n • a + a"}, {"doc": "", "kind": "field", "name": "zsmul_neg'", "owner": "SubNegMonoid", "proj": "SubNegMonoid.zsmul_neg'", "type": "∀ {G : Type u} [self : SubNegMonoid G] (n : ℕ) (a : G), Int.negSucc n • a = -(↑n.succ • a)"}], "addedOverParents": [{"doc": "", "kind": "field", "name": "sub_eq_add_neg", "owner": "SubNegMonoid", "proj": "SubNegMonoid.sub_eq_add_neg", "type": "∀ {G : Type u} [self : SubNegMonoid G] (a b : G), a - b = a + -b"}, {"doc": "", "kind": "field", "name": "zsmul_zero'", "owner": "SubNegMonoid", "proj": "SubNegMonoid.zsmul_zero'", "type": "∀ {G : Type u} [self : SubNegMonoid G] (a : G), 0 • a = 0"}, {"doc": "", "kind": "field", "name": "zsmul_succ'", "owner": "SubNegMonoid", "proj": "SubNegMonoid.zsmul_succ'", "type": "∀ {G : Type u} [self : SubNegMonoid G] (n : ℕ) (a : G), ↑n.succ • a = ↑n • a + a"}, {"doc": "", "kind": "field", "name": "zsmul_neg'", "owner": "SubNegMonoid", "proj": "SubNegMonoid.zsmul_neg'", "type": "∀ {G : Type u} [self : SubNegMonoid G] (n : ℕ) (a : G), Int.negSucc n • a = -(↑n.succ • a)"}], "fieldCount": 15}, {"name": "CommMagma", "doc": "A commutative multiplicative magma is a type with a multiplication which commutes. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "The homogeneous version of `HMul`: `a * b : α` where `a b : α`. ", "name": "Mul", "projection": "CommMagma.toMul", "subobject": true, "type": "Type u → Type u"}], "ownFields": [{"doc": "Multiplication is commutative in a commutative multiplicative magma. ", "kind": "field", "name": "mul_comm", "owner": "CommMagma", "proj": "CommMagma.mul_comm", "type": "∀ {G : Type u} [self : CommMagma G] (a b : G), a * b = b * a"}], "addedOverParents": [{"doc": "Multiplication is commutative in a commutative multiplicative magma. ", "kind": "field", "name": "mul_comm", "owner": "CommMagma", "proj": "CommMagma.mul_comm", "type": "∀ {G : Type u} [self : CommMagma G] (a b : G), a * b = b * a"}], "fieldCount": 2}, {"name": "NonUnitalSemiring", "doc": "An associative but not-necessarily unital semiring. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A not-necessarily-unital, not-necessarily-associative semiring. See `CommutatorRing` and the\ndocumentation thereof in case you need a `NonUnitalNonAssocSemiring` instance on a Lie ring\nor a Lie algebra. ", "name": "NonUnitalNonAssocSemiring", "projection": "NonUnitalSemiring.toNonUnitalNonAssocSemiring", "subobject": true, "type": "Type u → Type u"}, {"doc": "A type `S₀` is a \"semigroup with zero” if it is a semigroup with zero element, and `0` is left\nand right absorbing. ", "name": "SemigroupWithZero", "projection": "NonUnitalSemiring.toSemigroupWithZero", "subobject": false, "type": "Type u → Type u"}], "ownFields": [{"doc": "Multiplication is associative ", "kind": "field", "name": "mul_assoc", "owner": "NonUnitalSemiring", "proj": "NonUnitalSemiring.mul_assoc", "type": "∀ {α : Type u} [self : NonUnitalSemiring α] (a b c : α), a * b * c = a * (b * c)"}], "addedOverParents": [], "fieldCount": 15, "copiedFromParents": ["mul_assoc"]}, {"name": "ZSMul", "doc": "`ZSMul` is an implementation detail of `SubNegMonoid`. It is needed because it is\nimpossible to extend `SMUl ℕ M` and `SMul ℤ M` at the same time. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "Multiplication by an integer.\nSet this to `zsmulRec` unless `Module` diamonds are possible. ", "kind": "field", "name": "zsmul", "owner": "ZSMul", "proj": "ZSMul.zsmul", "type": "{G : Type u} → [self : ZSMul G] → ℤ → G → G"}], "addedOverParents": [{"doc": "Multiplication by an integer.\nSet this to `zsmulRec` unless `Module` diamonds are possible. ", "kind": "field", "name": "zsmul", "owner": "ZSMul", "proj": "ZSMul.zsmul", "type": "{G : Type u} → [self : ZSMul G] → ℤ → G → G"}], "fieldCount": 1}, {"name": "RatCast", "doc": "Type class for the canonical homomorphism `Rat → K`. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [], "ownFields": [{"doc": "The canonical homomorphism `Rat → K`. ", "kind": "field", "name": "ratCast", "owner": "RatCast", "proj": "RatCast.ratCast", "type": "{K : Type u} → [self : RatCast K] → ℚ → K"}], "addedOverParents": [{"doc": "The canonical homomorphism `Rat → K`. ", "kind": "field", "name": "ratCast", "owner": "RatCast", "proj": "RatCast.ratCast", "type": "{K : Type u} → [self : RatCast K] → ℚ → K"}], "fieldCount": 1}, {"name": "GroupWithZero", "doc": "A type `G₀` is a “group with zero” if it is a monoid with zero element (distinct from `1`)\nsuch that every nonzero element is invertible.\nThe type is required to come with an “inverse” function, and the inverse of `0` must be `0`.\n\nExamples include division rings and the ordered monoids that are the\ntarget of valuations in general valuation theory. ", "type": "Type u → Type u", "isAbbrev": false, "parents": [{"doc": "A type `M₀` is a “monoid with zero” if it is a monoid with zero element, and `0` is left\nand right absorbing. ", "name": "MonoidWithZero", "projection": "GroupWithZero.toMonoidWithZero", "subobject": true, "type": "Type u → Type u"}, {"doc": "A `DivInvMonoid` is a `Monoid` with operations `/` and `⁻¹` satisfying\n`div_eq_mul_inv : ∀ a b, a / b = a * b⁻¹`.\n\nThis deduplicates the name `div_eq_mul_inv`.\nThe default for `div` is such that `a / b = a * b⁻¹` holds by definition.\n\nAdding `div` as a field rather than defining `a / b := a * b⁻¹` allows us to\navoid certain classes of unification failures, for example:\nLet `Foo X` be a type with a `∀ X, Div (Foo X)` instance but no\n`∀ X, Inv (Foo X)`, e.g. when `Foo X` is a `EuclideanDomain`. Suppose we\nalso have an instance `∀ X [Cromulent X], GroupWithZero (Foo X)`. Then the\n`(/)` coming from `GroupWithZero.div` cannot be definitionally equal to\nthe `(/)` coming from `Foo.Div`.\n\nIn the same way, adding a `zpow` field makes it possible to avoid definitional failures\nin diamonds. See the definition of `Monoid` and Note [forgetful inheritance] for more\nexplanations on this.\n", "name": "DivInvMonoid", "projection": "GroupWithZero.toDivInvMonoid", "subobject": false, "type": "Type u → Type u"}, {"doc": "Predicate typeclass for expressing that a type is not reduced to a single element. In rings,\nthis is equivalent to `0 ≠ 1`. In vector spaces, this is equivalent to positive dimension. ", "name": "Nontrivial", "projection": "GroupWithZero.toNontrivial", "subobject": true, "type": "Type u_3 → Prop"}], "ownFields": [{"doc": "`a / b := a * b⁻¹` ", "kind": "field", "name": "div_eq_mul_inv", "owner": "GroupWithZero", "proj": "GroupWithZero.div_eq_mul_inv", "type": "∀ {G₀ : Type u} [self : GroupWithZero G₀] (a b : G₀), a / b = a * b⁻¹"}, {"doc": "`a ^ 0 = 1` ", "kind": "field", "name": "zpow_zero'", "owner": "GroupWithZero", "proj": "GroupWithZero.zpow_zero'", "type": "∀ {G₀ : Type u} [self : GroupWithZero G₀] (a : G₀), a ^ 0 = 1"}, {"doc": "`a ^ (n + 1) = a ^ n * a` ", "kind": "field", "name": "zpow_succ'", "owner": "GroupWithZero", "proj": "GroupWithZero.zpow_succ'", "type": "∀ {G₀ : Type u} [self : GroupWithZero G₀] (n : ℕ) (a : G₀), a ^ ↑n.succ = a ^ ↑n * a"}, {"doc": "`a ^ -(n + 1) = (a ^ (n + 1))⁻¹` ", "kind": "field", "name": "zpow_neg'", "owner": "GroupWithZero", "proj": "GroupWithZero.zpow_neg'", "type": "∀ {G₀ : Type u} [self : GroupWithZero G₀] (n : ℕ) (a : G₀), a ^ Int.negSucc n = (a ^ ↑n.succ)⁻¹"}, {"doc": "The inverse of `0` in a group with zero is `0`. ", "kind": "field", "name": "inv_zero", "owner": "GroupWithZero", "proj": "GroupWithZero.inv_zero", "type": "∀ {G₀ : Type u} [self : GroupWithZero G₀], 0⁻¹ = 0"}, {"doc": "Every nonzero element of a group with zero is invertible. ", "kind": "field", "name": "mul_inv_cancel", "owner": "GroupWithZero", "proj": "GroupWithZero.mul_inv_cancel", "type": "∀ {G₀ : Type u} [self : GroupWithZero G₀] (a : G₀), a ≠ 0 → a * a⁻¹ = 1"}], "addedOverParents": [{"doc": "The inverse of `0` in a group with zero is `0`. ", "kind": "field", "name": "inv_zero", "owner": "GroupWithZero", "proj": "GroupWithZero.inv_zero", "type": "∀ {G₀ : Type u} [self : GroupWithZero G₀], 0⁻¹ = 0"}, {"doc": "Every nonzero element of a group with zero is invertible. ", "kind": "field", "name": "mul_inv_cancel", "owner": "GroupWithZero", "proj": "GroupWithZero.mul_inv_cancel", "type": "∀ {G₀ : Type u} [self : GroupWithZero G₀] (a : G₀), a ≠ 0 → a * a⁻¹ = 1"}], "fieldCount": 21, "copiedFromParents": ["div_eq_mul_inv", "zpow_zero'", "zpow_succ'", "zpow_neg'"]}, {"name": "DivisionSemiring", "doc": "A `DivisionSemiring` is a `Semiring` with multiplicative inverses for nonzero elements.\n\nAn instance of `DivisionSemiring K` includes maps `nnratCast : ℚ≥0 → K` and `nnqsmul : ℚ≥0 → K → K`.\nThose two fields are needed to implement the `DivisionSemiring K → Algebra ℚ≥0 K` instance since we\nneed to control the specific definitions for some special cases of `K` (in particular `K = ℚ≥0`\nitself). See also note [forgetful inheritance].\n\nIf the division semiring has positive characteristic `p`, our division by zero convention forces\n`nnratCast (1 / p) = 1 / 0 = 0`. ", "type": "Type u_2 → Type u_2", "isAbbrev": false, "parents": [{"doc": "A `Semiring` is a type with addition, multiplication, a `0` and a `1` where addition is\ncommutative and associative, multiplication is associative and left and right distributive over\naddition, and `0` and `1` are additive and multiplicative identities. ", "name": "Semiring", "projection": "DivisionSemiring.toSemiring", "subobject": true, "type": "Type u → Type u"}, {"doc": "A type `G₀` is a “group with zero” if it is a monoid with zero element (distinct from `1`)\nsuch that every nonzero element is invertible.\nThe type is required to come with an “inverse” function, and the inverse of `0` must be `0`.\n\nExamples include division rings and the ordered monoids that are the\ntarget of valuations in general valuation theory. ", "name": "GroupWithZero", "projection": "DivisionSemiring.toGroupWithZero", "subobject": false, "type": "Type u → Type u"}, {"doc": "Typeclass for the canonical homomorphism `ℚ≥0 → K`.\n\nThis should be considered as a notation typeclass. The sole purpose of this typeclass is to be\nextended by `DivisionSemiring`. ", "name": "NNRatCast", "projection": "DivisionSemiring.toNNRatCast", "subobject": true, "type": "Type u_1 → Type u_1"}], "ownFields": [{"doc": "`a / b := a * b⁻¹` ", "kind": "field", "name": "div_eq_mul_inv", "owner": "DivisionSemiring", "proj": "DivisionSemiring.div_eq_mul_inv", "type": "∀ {K : Type u_2} [self : DivisionSemiring K] (a b : K), a / b = a * b⁻¹"}, {"doc": "`a ^ 0 = 1` ", "kind": "field", "name": "zpow_zero'", "owner": "DivisionSemiring", "proj": "DivisionSemiring.zpow_zero'", "type": "∀ {K : Type u_2} [self : DivisionSemiring K] (a : K), a ^ 0 = 1"}, {"doc": "`a ^ (n + 1) = a ^ n * a` ", "kind": "field", "name": "zpow_succ'", "owner": "DivisionSemiring", "proj": "DivisionSemiring.zpow_succ'", "type": "∀ {K : Type u_2} [self : DivisionSemiring K] (n : ℕ) (a : K), a ^ ↑n.succ = a ^ ↑n * a"}, {"doc": "`a ^ -(n + 1) = (a ^ (n + 1))⁻¹` ", "kind": "field", "name": "zpow_neg'", "owner": "DivisionSemiring", "proj": "DivisionSemiring.zpow_neg'", "type": "∀ {K : Type u_2} [self : DivisionSemiring K] (n : ℕ) (a : K), a ^ Int.negSucc n = (a ^ ↑n.succ)⁻¹"}, {"doc": "The inverse of `0` in a group with zero is `0`. ", "kind": "field", "name": "inv_zero", "owner": "DivisionSemiring", "proj": "DivisionSemiring.inv_zero", "type": "∀ {K : Type u_2} [self : DivisionSemiring K], 0⁻¹ = 0"}, {"doc": "Every nonzero element of a group with zero is invertible. ", "kind": "field", "name": "mul_inv_cancel", "owner": "DivisionSemiring", "proj": "DivisionSemiring.mul_inv_cancel", "type": "∀ {K : Type u_2} [self : DivisionSemiring K] (a : K), a ≠ 0 → a * a⁻¹ = 1"}, {"doc": "However `NNRat.cast` is defined, it must be propositionally equal to `a / b`.\n\nDo not use this lemma directly. Use `NNRat.cast_def` instead. ", "kind": "field", "name": "nnratCast_def", "owner": "DivisionSemiring", "proj": "DivisionSemiring.nnratCast_def", "type": "∀ {K : Type u_2} [self : DivisionSemiring K] (q : ℚ≥0), ↑q = ↑q.num / ↑q.den"}, {"doc": "Scalar multiplication by a nonnegative rational number.\n\nUnless there is a risk of a `Module ℚ≥0 _` instance diamond, write `nnqsmul := _`. This will set\n`nnqsmul` to `(NNRat.cast · * ·)` thanks to unification in the default proof of `nnqsmul_def`.\n\nDo not use directly. Instead use the `•` notation. ", "kind": "field", "name": "nnqsmul", "owner": "DivisionSemiring", "proj": "DivisionSemiring.nnqsmul", "type": "{K : Type u_2} → [self : DivisionSemiring K] → ℚ≥0 → K → K"}, {"doc": "However `qsmul` is defined, it must be propositionally equal to multiplication by `Rat.cast`.\n\nDo not use this lemma directly. Use `NNRat.smul_def` instead. ", "kind": "field", "name": "nnqsmul_def", "owner": "DivisionSemiring", "proj": "DivisionSemiring.nnqsmul_def", "type": "∀ {K : Type u_2} [self : DivisionSemiring K] (q : ℚ≥0) (a : K),\n  DivisionSemiring.nnqsmul q a = ↑q * a"}], "addedOverParents": [{"doc": "However `NNRat.cast` is defined, it must be propositionally equal to `a / b`.\n\nDo not use this lemma directly. Use `NNRat.cast_def` instead. ", "kind": "field", "name": "nnratCast_def", "owner": "DivisionSemiring", "proj": "DivisionSemiring.nnratCast_def", "type": "∀ {K : Type u_2} [self : DivisionSemiring K] (q : ℚ≥0), ↑q = ↑q.num / ↑q.den"}, {"doc": "Scalar multiplication by a nonnegative rational number.\n\nUnless there is a risk of a `Module ℚ≥0 _` instance diamond, write `nnqsmul := _`. This will set\n`nnqsmul` to `(NNRat.cast · * ·)` thanks to unification in the default proof of `nnqsmul_def`.\n\nDo not use directly. Instead use the `•` notation. ", "kind": "field", "name": "nnqsmul", "owner": "DivisionSemiring", "proj": "DivisionSemiring.nnqsmul", "type": "{K : Type u_2} → [self : DivisionSemiring K] → ℚ≥0 → K → K"}, {"doc": "However `qsmul` is defined, it must be propositionally equal to multiplication by `Rat.cast`.\n\nDo not use this lemma directly. Use `NNRat.smul_def` instead. ", "kind": "field", "name": "nnqsmul_def", "owner": "DivisionSemiring", "proj": "DivisionSemiring.nnqsmul_def", "type": "∀ {K : Type u_2} [self : DivisionSemiring K] (q : ℚ≥0) (a : K),\n  DivisionSemiring.nnqsmul q a = ↑q * a"}], "fieldCount": 38, "copiedFromParents": ["div_eq_mul_inv", "zpow_zero'", "zpow_succ'", "zpow_neg'", "inv_zero", "mul_inv_cancel"]}]