Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓to navigate, Ctrl+πŸ–±οΈto focus. On Mac, use Cmdinstead of Ctrl.
/-
Copyright (c) 2018 Johannes HΓΆlzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes HΓΆlzl, Kenny Lau, Johan Commelin, Mario Carneiro, Kevin Buzzard,
Amelia Livingston, Yury Kudryashov, Yakov Pechersky

! This file was ported from Lean 3 source module group_theory.subsemigroup.basic
! leanprover-community/mathlib commit feb99064803fd3108e37c18b0f77d0a8344677a3
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Algebra.Hom.Group
import Mathlib.Data.Set.Lattice
import Mathlib.Data.SetLike.Basic

/-!
# Subsemigroups: definition and `CompleteLattice` structure

This file defines bundled multiplicative and additive subsemigroups. We also define
a `CompleteLattice` structure on `Subsemigroup`s,
and define the closure of a set as the minimal subsemigroup that includes this set.

## Main definitions

* `Subsemigroup M`: the type of bundled subsemigroup of a magma `M`; the underlying set is given in
  the `carrier` field of the structure, and should be accessed through coercion as in `(S : Set M)`.
* `AddSubsemigroup M` : the type of bundled subsemigroups of an additive magma `M`.

For each of the following definitions in the `Subsemigroup` namespace, there is a corresponding
definition in the `AddSubsemigroup` namespace.

* `Subsemigroup.copy` : copy of a subsemigroup with `carrier` replaced by a set that is equal but
  possibly not definitionally equal to the carrier of the original `Subsemigroup`.
* `Subsemigroup.closure` :  semigroup closure of a set, i.e.,
  the least subsemigroup that includes the set.
* `Subsemigroup.gi` : `closure : Set M β†’ Subsemigroup M` and coercion `coe : Subsemigroup M β†’ Set M`
  form a `GaloisInsertion`;

## Implementation notes

Subsemigroup inclusion is denoted `≀` rather than `βŠ†`, although `∈` is defined as
membership of a subsemigroup's underlying set.

Note that `Subsemigroup M` does not actually require `Semigroup M`,
instead requiring only the weaker `Mul M`.

This file is designed to have very few dependencies. In particular, it should not use natural
numbers.

## Tags
subsemigroup, subsemigroups
-/


-- Only needed for notation
variable {
M: Type ?u.8983
M
:
Type _: Type (?u.4117+1)
Type _
} {
N: Type ?u.19092
N
:
Type _: Type (?u.29+1)
Type _
} {
A: Type ?u.5756
A
:
Type _: Type (?u.32+1)
Type _
} section NonAssoc variable [
Mul: Type ?u.19581 β†’ Type ?u.19581
Mul
M: Type ?u.26
M
] {
s: Set M
s
:
Set: Type ?u.7487 β†’ Type ?u.7487
Set
M: Type ?u.11
M
} variable [
Add: Type ?u.7490 β†’ Type ?u.7490
Add
A: Type ?u.32
A
] {
t: Set A
t
:
Set: Type ?u.4857 β†’ Type ?u.4857
Set
A: Type ?u.8989
A
} /-- `MulMemClass S M` says `S` is a type of sets `s : Set M` that are closed under `(*)` -/ class
MulMemClass: βˆ€ {S : Type u_1} {M : Type u_2} [inst : Mul M] [inst_1 : SetLike S M], (βˆ€ {s : S} {a b : M}, a ∈ s β†’ b ∈ s β†’ a * b ∈ s) β†’ MulMemClass S M
MulMemClass
(
S: Type ?u.68
S
:
Type _: Type (?u.68+1)
Type _
) (
M: Type ?u.71
M
:
Type _: Type (?u.71+1)
Type _
) [
Mul: Type ?u.74 β†’ Type ?u.74
Mul
M: Type ?u.71
M
] [
SetLike: Type ?u.78 β†’ outParam (Type ?u.77) β†’ Type (max?u.78?u.77)
SetLike
S: Type ?u.68
S
M: Type ?u.71
M
] :
Prop: Type
Prop
where /-- A substructure satisfying `MulMemClass` is closed under multiplication. -/
mul_mem: βˆ€ {S : Type u_1} {M : Type u_2} [inst : Mul M] [inst_1 : SetLike S M] [self : MulMemClass S M] {s : S} {a b : M}, a ∈ s β†’ b ∈ s β†’ a * b ∈ s
mul_mem
: βˆ€ {
s: S
s
:
S: Type ?u.68
S
} {
a: M
a
b: M
b
:
M: Type ?u.71
M
},
a: M
a
∈
s: S
s
β†’
b: M
b
∈
s: S
s
β†’
a: M
a
*
b: M
b
∈
s: S
s
#align mul_mem_class
MulMemClass: (S : Type u_1) β†’ (M : Type u_2) β†’ [inst : Mul M] β†’ [inst : SetLike S M] β†’ Prop
MulMemClass
export MulMemClass (mul_mem) /-- `AddMemClass S M` says `S` is a type of sets `s : Set M` that are closed under `(+)` -/ class
AddMemClass: (S : Type u_1) β†’ (M : Type u_2) β†’ [inst : Add M] β†’ [inst : SetLike S M] β†’ Prop
AddMemClass
(
S: Type ?u.251
S
:
Type _: Type (?u.251+1)
Type _
) (
M: Type ?u.254
M
:
Type _: Type (?u.254+1)
Type _
) [
Add: Type ?u.257 β†’ Type ?u.257
Add
M: Type ?u.254
M
] [
SetLike: Type ?u.261 β†’ outParam (Type ?u.260) β†’ Type (max?u.261?u.260)
SetLike
S: Type ?u.251
S
M: Type ?u.254
M
] :
Prop: Type
Prop
where /-- A substructure satisfying `AddMemClass` is closed under addition. -/
add_mem: βˆ€ {S : Type u_1} {M : Type u_2} [inst : Add M] [inst_1 : SetLike S M] [self : AddMemClass S M] {s : S} {a b : M}, a ∈ s β†’ b ∈ s β†’ a + b ∈ s
add_mem
: βˆ€ {
s: S
s
:
S: Type ?u.251
S
} {
a: M
a
b: M
b
:
M: Type ?u.254
M
},
a: M
a
∈
s: S
s
β†’
b: M
b
∈
s: S
s
β†’
a: M
a
+
b: M
b
∈
s: S
s
#align add_mem_class
AddMemClass: (S : Type u_1) β†’ (M : Type u_2) β†’ [inst : Add M] β†’ [inst : SetLike S M] β†’ Prop
AddMemClass
export AddMemClass (add_mem) attribute [
to_additive: (S : Type u_1) β†’ (M : Type u_2) β†’ [inst : Add M] β†’ [inst : SetLike S M] β†’ Prop
to_additive
]
MulMemClass: (S : Type u_1) β†’ (M : Type u_2) β†’ [inst : Mul M] β†’ [inst : SetLike S M] β†’ Prop
MulMemClass
/-- A subsemigroup of a magma `M` is a subset closed under multiplication. -/ structure
Subsemigroup: (M : Type u_1) β†’ [inst : Mul M] β†’ Type u_1
Subsemigroup
(
M: Type ?u.436
M
:
Type _: Type (?u.436+1)
Type _
) [
Mul: Type ?u.439 β†’ Type ?u.439
Mul
M: Type ?u.436
M
] where /-- The carrier of a subsemigroup. -/
carrier: {M : Type u_1} β†’ [inst : Mul M] β†’ Subsemigroup M β†’ Set M
carrier
:
Set: Type ?u.444 β†’ Type ?u.444
Set
M: Type ?u.436
M
/-- The product of two elements of a subsemigroup belongs to the subsemigroup. -/
mul_mem': βˆ€ {M : Type u_1} [inst : Mul M] (self : Subsemigroup M) {a b : M}, a ∈ self.carrier β†’ b ∈ self.carrier β†’ a * b ∈ self.carrier
mul_mem'
{
a: ?m.447
a
b: ?m.450
b
} :
a: ?m.447
a
∈
carrier: Set M
carrier
β†’
b: ?m.450
b
∈
carrier: Set M
carrier
β†’
a: ?m.447
a
*
b: ?m.450
b
∈
carrier: Set M
carrier
#align subsemigroup
Subsemigroup: (M : Type u_1) β†’ [inst : Mul M] β†’ Type u_1
Subsemigroup
/-- An additive subsemigroup of an additive magma `M` is a subset closed under addition. -/ structure
AddSubsemigroup: {M : Type u_1} β†’ [inst : Add M] β†’ (carrier : Set M) β†’ (βˆ€ {a b : M}, a ∈ carrier β†’ b ∈ carrier β†’ a + b ∈ carrier) β†’ AddSubsemigroup M
AddSubsemigroup
(
M: Type ?u.1006
M
:
Type _: Type (?u.1006+1)
Type _
) [
Add: Type ?u.1009 β†’ Type ?u.1009
Add
M: Type ?u.1006
M
] where /-- The carrier of an additive subsemigroup. -/
carrier: {M : Type u_1} β†’ [inst : Add M] β†’ AddSubsemigroup M β†’ Set M
carrier
:
Set: Type ?u.1014 β†’ Type ?u.1014
Set
M: Type ?u.1006
M
/-- The sum of two elements of an additive subsemigroup belongs to the subsemigroup. -/
add_mem': βˆ€ {M : Type u_1} [inst : Add M] (self : AddSubsemigroup M) {a b : M}, a ∈ self.carrier β†’ b ∈ self.carrier β†’ a + b ∈ self.carrier
add_mem'
{
a: ?m.1017
a
b: ?m.1020
b
} :
a: ?m.1017
a
∈
carrier: Set M
carrier
β†’
b: ?m.1020
b
∈
carrier: Set M
carrier
β†’
a: ?m.1017
a
+
b: ?m.1020
b
∈
carrier: Set M
carrier
#align add_subsemigroup
AddSubsemigroup: (M : Type u_1) β†’ [inst : Add M] β†’ Type u_1
AddSubsemigroup
attribute [to_additive
AddSubsemigroup: (M : Type u_1) β†’ [inst : Add M] β†’ Type u_1
AddSubsemigroup
]
Subsemigroup: (M : Type u_1) β†’ [inst : Mul M] β†’ Type u_1
Subsemigroup
namespace Subsemigroup @[
to_additive: {M : Type u_1} β†’ [inst : Add M] β†’ SetLike (AddSubsemigroup M) M
to_additive
]
instance: {M : Type u_1} β†’ [inst : Mul M] β†’ SetLike (Subsemigroup M) M
instance
:
SetLike: Type ?u.1577 β†’ outParam (Type ?u.1576) β†’ Type (max?u.1577?u.1576)
SetLike
(
Subsemigroup: (M : Type ?u.1578) β†’ [inst : Mul M] β†’ Type ?u.1578
Subsemigroup
M: Type ?u.1555
M
)
M: Type ?u.1555
M
:= ⟨
Subsemigroup.carrier: {M : Type ?u.1598} β†’ [inst : Mul M] β†’ Subsemigroup M β†’ Set M
Subsemigroup.carrier
, fun
p: ?m.1620
p
q: ?m.1623
q
h: ?m.1626
h
=>

Goals accomplished! πŸ™
M: Type ?u.1555

N: Type ?u.1558

A: Type ?u.1561

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

p, q: Subsemigroup M

h: p.carrier = q.carrier


p = q
M: Type ?u.1555

N: Type ?u.1558

A: Type ?u.1561

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

q: Subsemigroup M

carrier✝: Set M

mul_mem'✝: βˆ€ {a b : M}, a ∈ carrier✝ β†’ b ∈ carrier✝ β†’ a * b ∈ carrier✝

h: { carrier := carrier✝, mul_mem' := mul_mem'✝ }.carrier = q.carrier


mk
{ carrier := carrier✝, mul_mem' := mul_mem'✝ } = q
M: Type ?u.1555

N: Type ?u.1558

A: Type ?u.1561

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

q: Subsemigroup M

carrier✝: Set M

mul_mem'✝: βˆ€ {a b : M}, a ∈ carrier✝ β†’ b ∈ carrier✝ β†’ a * b ∈ carrier✝

h: { carrier := carrier✝, mul_mem' := mul_mem'✝ }.carrier = q.carrier


mk
{ carrier := carrier✝, mul_mem' := mul_mem'✝ } = q
M: Type ?u.1555

N: Type ?u.1558

A: Type ?u.1561

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

p, q: Subsemigroup M

h: p.carrier = q.carrier


p = q
M: Type ?u.1555

N: Type ?u.1558

A: Type ?u.1561

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

carrier✝¹: Set M

mul_mem'✝¹: βˆ€ {a b : M}, a ∈ carrier✝¹ β†’ b ∈ carrier✝¹ β†’ a * b ∈ carrier✝¹

carrier✝: Set M

mul_mem'✝: βˆ€ {a b : M}, a ∈ carrier✝ β†’ b ∈ carrier✝ β†’ a * b ∈ carrier✝

h: { carrier := carrier✝¹, mul_mem' := mul_mem'✝¹ }.carrier = { carrier := carrier✝, mul_mem' := mul_mem'✝ }.carrier


mk.mk
{ carrier := carrier✝¹, mul_mem' := mul_mem'✝¹ } = { carrier := carrier✝, mul_mem' := mul_mem'✝ }
M: Type ?u.1555

N: Type ?u.1558

A: Type ?u.1561

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

carrier✝¹: Set M

mul_mem'✝¹: βˆ€ {a b : M}, a ∈ carrier✝¹ β†’ b ∈ carrier✝¹ β†’ a * b ∈ carrier✝¹

carrier✝: Set M

mul_mem'✝: βˆ€ {a b : M}, a ∈ carrier✝ β†’ b ∈ carrier✝ β†’ a * b ∈ carrier✝

h: { carrier := carrier✝¹, mul_mem' := mul_mem'✝¹ }.carrier = { carrier := carrier✝, mul_mem' := mul_mem'✝ }.carrier


mk.mk
{ carrier := carrier✝¹, mul_mem' := mul_mem'✝¹ } = { carrier := carrier✝, mul_mem' := mul_mem'✝ }
M: Type ?u.1555

N: Type ?u.1558

A: Type ?u.1561

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

p, q: Subsemigroup M

h: p.carrier = q.carrier


p = q

Goals accomplished! πŸ™
⟩ @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M], AddMemClass (AddSubsemigroup M) M
to_additive
]
instance: βˆ€ {M : Type u_1} [inst : Mul M], MulMemClass (Subsemigroup M) M
instance
:
MulMemClass: (S : Type ?u.2144) β†’ (M : Type ?u.2143) β†’ [inst : Mul M] β†’ [inst : SetLike S M] β†’ Prop
MulMemClass
(
Subsemigroup: (M : Type ?u.2145) β†’ [inst : Mul M] β†’ Type ?u.2145
Subsemigroup
M: Type ?u.2122
M
)
M: Type ?u.2122
M
where mul_mem := fun {
_: ?m.2179
_
_: ?m.2182
_
_: ?m.2185
_
} =>
Subsemigroup.mul_mem': βˆ€ {M : Type ?u.2187} [inst : Mul M] (self : Subsemigroup M) {a b : M}, a ∈ self.carrier β†’ b ∈ self.carrier β†’ a * b ∈ self.carrier
Subsemigroup.mul_mem'
_: Subsemigroup ?m.2188
_
initialize_simps_projections
Subsemigroup: (M : Type u_1) β†’ [inst : Mul M] β†’ Type u_1
Subsemigroup
(
carrier: (M : Type u_1) β†’ [inst : Mul M] β†’ Subsemigroup M β†’ Set M
carrier
β†’
coe: (M : Type u_1) β†’ [inst : Mul M] β†’ Subsemigroup M β†’ Set M
coe
) initialize_simps_projections
AddSubsemigroup: (M : Type u_1) β†’ [inst : Add M] β†’ Type u_1
AddSubsemigroup
(
carrier: (M : Type u_1) β†’ [inst : Add M] β†’ AddSubsemigroup M β†’ Set M
carrier
β†’
coe: (M : Type u_1) β†’ [inst : Add M] β†’ AddSubsemigroup M β†’ Set M
coe
) @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {s : AddSubsemigroup M} {x : M}, x ∈ s.carrier ↔ x ∈ s
to_additive
(attr := simp)] theorem
mem_carrier: βˆ€ {M : Type u_1} [inst : Mul M] {s : Subsemigroup M} {x : M}, x ∈ s.carrier ↔ x ∈ s
mem_carrier
{s :
Subsemigroup: (M : Type ?u.2374) β†’ [inst : Mul M] β†’ Type ?u.2374
Subsemigroup
M: Type ?u.2353
M
} {
x: M
x
:
M: Type ?u.2353
M
} :
x: M
x
∈ s.
carrier: {M : Type ?u.2391} β†’ [inst : Mul M] β†’ Subsemigroup M β†’ Set M
carrier
↔
x: M
x
∈ s :=
Iff.rfl: βˆ€ {a : Prop}, a ↔ a
Iff.rfl
#align subsemigroup.mem_carrier
Subsemigroup.mem_carrier: βˆ€ {M : Type u_1} [inst : Mul M] {s : Subsemigroup M} {x : M}, x ∈ s.carrier ↔ x ∈ s
Subsemigroup.mem_carrier
#align add_subsemigroup.mem_carrier
AddSubsemigroup.mem_carrier: βˆ€ {M : Type u_1} [inst : Add M] {s : AddSubsemigroup M} {x : M}, x ∈ s.carrier ↔ x ∈ s
AddSubsemigroup.mem_carrier
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} {x : M} (h_mul : βˆ€ {a b : M}, a ∈ s β†’ b ∈ s β†’ a + b ∈ s), x ∈ { carrier := s, add_mem' := h_mul } ↔ x ∈ s
to_additive
(attr := simp)] theorem
mem_mk: βˆ€ {s : Set M} {x : M} (h_mul : βˆ€ {a b : M}, a ∈ s β†’ b ∈ s β†’ a * b ∈ s), x ∈ { carrier := s, mul_mem' := h_mul } ↔ x ∈ s
mem_mk
{
s: Set M
s
:
Set: Type ?u.2527 β†’ Type ?u.2527
Set
M: Type ?u.2506
M
} {
x: M
x
:
M: Type ?u.2506
M
} (
h_mul: ?m.2532
h_mul
) :
x: M
x
∈
mk: {M : Type ?u.2540} β†’ [inst : Mul M] β†’ (carrier : Set M) β†’ (βˆ€ {a b : M}, a ∈ carrier β†’ b ∈ carrier β†’ a * b ∈ carrier) β†’ Subsemigroup M
mk
s: Set M
s
h_mul: ?m.2532
h_mul
↔
x: M
x
∈
s: Set M
s
:=
Iff.rfl: βˆ€ {a : Prop}, a ↔ a
Iff.rfl
#align subsemigroup.mem_mk
Subsemigroup.mem_mk: βˆ€ {M : Type u_1} [inst : Mul M] {s : Set M} {x : M} (h_mul : βˆ€ {a b : M}, a ∈ s β†’ b ∈ s β†’ a * b ∈ s), x ∈ { carrier := s, mul_mem' := h_mul } ↔ x ∈ s
Subsemigroup.mem_mk
#align add_subsemigroup.mem_mk
AddSubsemigroup.mem_mk: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} {x : M} (h_mul : βˆ€ {a b : M}, a ∈ s β†’ b ∈ s β†’ a + b ∈ s), x ∈ { carrier := s, add_mem' := h_mul } ↔ x ∈ s
AddSubsemigroup.mem_mk
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} (h_mul : βˆ€ {a b : M}, a ∈ s β†’ b ∈ s β†’ a + b ∈ s), ↑{ carrier := s, add_mem' := h_mul } = s
to_additive
(attr := simp)] theorem
coe_set_mk: βˆ€ {M : Type u_1} [inst : Mul M] {s : Set M} (h_mul : βˆ€ {a b : M}, a ∈ s β†’ b ∈ s β†’ a * b ∈ s), ↑{ carrier := s, mul_mem' := h_mul } = s
coe_set_mk
{
s: Set M
s
:
Set: Type ?u.2781 β†’ Type ?u.2781
Set
M: Type ?u.2760
M
} (
h_mul: βˆ€ {a b : M}, a ∈ s β†’ b ∈ s β†’ a * b ∈ s
h_mul
) : (
mk: {M : Type ?u.2790} β†’ [inst : Mul M] β†’ (carrier : Set M) β†’ (βˆ€ {a b : M}, a ∈ carrier β†’ b ∈ carrier β†’ a * b ∈ carrier) β†’ Subsemigroup M
mk
s: Set M
s
h_mul: ?m.2784
h_mul
:
Set: Type ?u.2789 β†’ Type ?u.2789
Set
M: Type ?u.2760
M
) =
s: Set M
s
:=
rfl: βˆ€ {Ξ± : Sort ?u.2923} {a : Ξ±}, a = a
rfl
#align subsemigroup.coe_set_mk
Subsemigroup.coe_set_mk: βˆ€ {M : Type u_1} [inst : Mul M] {s : Set M} (h_mul : βˆ€ {a b : M}, a ∈ s β†’ b ∈ s β†’ a * b ∈ s), ↑{ carrier := s, mul_mem' := h_mul } = s
Subsemigroup.coe_set_mk
#align add_subsemigroup.coe_set_mk
AddSubsemigroup.coe_set_mk: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} (h_mul : βˆ€ {a b : M}, a ∈ s β†’ b ∈ s β†’ a + b ∈ s), ↑{ carrier := s, add_mem' := h_mul } = s
AddSubsemigroup.coe_set_mk
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {s t : Set M} (h_mul : βˆ€ {a b : M}, a ∈ s β†’ b ∈ s β†’ a + b ∈ s) (h_mul' : βˆ€ {a b : M}, a ∈ t β†’ b ∈ t β†’ a + b ∈ t), { carrier := s, add_mem' := h_mul } ≀ { carrier := t, add_mem' := h_mul' } ↔ s βŠ† t
to_additive
(attr := simp)] theorem
mk_le_mk: βˆ€ {M : Type u_1} [inst : Mul M] {s t : Set M} (h_mul : βˆ€ {a b : M}, a ∈ s β†’ b ∈ s β†’ a * b ∈ s) (h_mul' : βˆ€ {a b : M}, a ∈ t β†’ b ∈ t β†’ a * b ∈ t), { carrier := s, mul_mem' := h_mul } ≀ { carrier := t, mul_mem' := h_mul' } ↔ s βŠ† t
mk_le_mk
{
s: Set M
s
t: Set M
t
:
Set: Type ?u.3065 β†’ Type ?u.3065
Set
M: Type ?u.3041
M
} (
h_mul: βˆ€ {a b : M}, a ∈ s β†’ b ∈ s β†’ a * b ∈ s
h_mul
) (
h_mul': βˆ€ {a b : M}, a ∈ t β†’ b ∈ t β†’ a * b ∈ t
h_mul'
) :
mk: {M : Type ?u.3075} β†’ [inst : Mul M] β†’ (carrier : Set M) β†’ (βˆ€ {a b : M}, a ∈ carrier β†’ b ∈ carrier β†’ a * b ∈ carrier) β†’ Subsemigroup M
mk
s: Set M
s
h_mul: ?m.3068
h_mul
≀
mk: {M : Type ?u.3088} β†’ [inst : Mul M] β†’ (carrier : Set M) β†’ (βˆ€ {a b : M}, a ∈ carrier β†’ b ∈ carrier β†’ a * b ∈ carrier) β†’ Subsemigroup M
mk
t: Set M
t
h_mul': ?m.3071
h_mul'
↔
s: Set M
s
βŠ†
t: Set M
t
:=
Iff.rfl: βˆ€ {a : Prop}, a ↔ a
Iff.rfl
#align subsemigroup.mk_le_mk
Subsemigroup.mk_le_mk: βˆ€ {M : Type u_1} [inst : Mul M] {s t : Set M} (h_mul : βˆ€ {a b : M}, a ∈ s β†’ b ∈ s β†’ a * b ∈ s) (h_mul' : βˆ€ {a b : M}, a ∈ t β†’ b ∈ t β†’ a * b ∈ t), { carrier := s, mul_mem' := h_mul } ≀ { carrier := t, mul_mem' := h_mul' } ↔ s βŠ† t
Subsemigroup.mk_le_mk
#align add_subsemigroup.mk_le_mk
AddSubsemigroup.mk_le_mk: βˆ€ {M : Type u_1} [inst : Add M] {s t : Set M} (h_mul : βˆ€ {a b : M}, a ∈ s β†’ b ∈ s β†’ a + b ∈ s) (h_mul' : βˆ€ {a b : M}, a ∈ t β†’ b ∈ t β†’ a + b ∈ t), { carrier := s, add_mem' := h_mul } ≀ { carrier := t, add_mem' := h_mul' } ↔ s βŠ† t
AddSubsemigroup.mk_le_mk
/-- Two subsemigroups are equal if they have the same elements. -/ @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {S T : AddSubsemigroup M}, (βˆ€ (x : M), x ∈ S ↔ x ∈ T) β†’ S = T
to_additive
(attr := ext) "Two `AddSubsemigroup`s are equal if they have the same elements."] theorem
ext: βˆ€ {M : Type u_1} [inst : Mul M] {S T : Subsemigroup M}, (βˆ€ (x : M), x ∈ S ↔ x ∈ T) β†’ S = T
ext
{S T :
Subsemigroup: (M : Type ?u.3536) β†’ [inst : Mul M] β†’ Type ?u.3536
Subsemigroup
M: Type ?u.3505
M
} (
h: βˆ€ (x : M), x ∈ S ↔ x ∈ T
h
: βˆ€
x: ?m.3541
x
,
x: ?m.3541
x
∈ S ↔
x: ?m.3541
x
∈ T) : S = T :=
SetLike.ext: βˆ€ {A : Type ?u.3604} {B : Type ?u.3603} [i : SetLike A B] {p q : A}, (βˆ€ (x : B), x ∈ p ↔ x ∈ q) β†’ p = q
SetLike.ext
h: βˆ€ (x : M), x ∈ S ↔ x ∈ T
h
#align subsemigroup.ext
Subsemigroup.ext: βˆ€ {M : Type u_1} [inst : Mul M] {S T : Subsemigroup M}, (βˆ€ (x : M), x ∈ S ↔ x ∈ T) β†’ S = T
Subsemigroup.ext
#align add_subsemigroup.ext
AddSubsemigroup.ext: βˆ€ {M : Type u_1} [inst : Add M] {S T : AddSubsemigroup M}, (βˆ€ (x : M), x ∈ S ↔ x ∈ T) β†’ S = T
AddSubsemigroup.ext
/-- Copy a subsemigroup replacing `carrier` with a set that is equal to it. -/ @[
to_additive: {M : Type u_1} β†’ [inst : Add M] β†’ (S : AddSubsemigroup M) β†’ (s : Set M) β†’ s = ↑S β†’ AddSubsemigroup M
to_additive
"Copy an additive subsemigroup replacing `carrier` with a set that is equal to it."] protected def
copy: (S : Subsemigroup M) β†’ (s : Set M) β†’ s = ↑S β†’ Subsemigroup M
copy
(S :
Subsemigroup: (M : Type ?u.3712) β†’ [inst : Mul M] β†’ Type ?u.3712
Subsemigroup
M: Type ?u.3691
M
) (
s: Set M
s
:
Set: Type ?u.3722 β†’ Type ?u.3722
Set
M: Type ?u.3691
M
) (
hs: s = ↑S
hs
:
s: Set M
s
= S) :
Subsemigroup: (M : Type ?u.3885) β†’ [inst : Mul M] β†’ Type ?u.3885
Subsemigroup
M: Type ?u.3691
M
where carrier :=
s: Set M
s
mul_mem' :=
hs: s = ↑S
hs
.
symm: βˆ€ {Ξ± : Sort ?u.3898} {a b : Ξ±}, a = b β†’ b = a
symm
β–Έ S.
mul_mem': βˆ€ {M : Type ?u.3909} [inst : Mul M] (self : Subsemigroup M) {a b : M}, a ∈ self.carrier β†’ b ∈ self.carrier β†’ a * b ∈ self.carrier
mul_mem'
#align subsemigroup.copy
Subsemigroup.copy: {M : Type u_1} β†’ [inst : Mul M] β†’ (S : Subsemigroup M) β†’ (s : Set M) β†’ s = ↑S β†’ Subsemigroup M
Subsemigroup.copy
#align add_subsemigroup.copy
AddSubsemigroup.copy: {M : Type u_1} β†’ [inst : Add M] β†’ (S : AddSubsemigroup M) β†’ (s : Set M) β†’ s = ↑S β†’ AddSubsemigroup M
AddSubsemigroup.copy
variable {S :
Subsemigroup: (M : Type ?u.12567) β†’ [inst : Mul M] β†’ Type ?u.12567
Subsemigroup
M: Type ?u.4117
M
} @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {S : AddSubsemigroup M} {s : Set M} (hs : s = ↑S), ↑(AddSubsemigroup.copy S s hs) = s
to_additive
(attr := simp)] theorem
coe_copy: βˆ€ {s : Set M} (hs : s = ↑S), ↑(Subsemigroup.copy S s hs) = s
coe_copy
{
s: Set M
s
:
Set: Type ?u.4179 β†’ Type ?u.4179
Set
M: Type ?u.4148
M
} (
hs: s = ↑S
hs
:
s: Set M
s
= S) : (S.
copy: {M : Type ?u.4346} β†’ [inst : Mul M] β†’ (S : Subsemigroup M) β†’ (s : Set M) β†’ s = ↑S β†’ Subsemigroup M
copy
s: Set M
s
hs: s = ↑S
hs
:
Set: Type ?u.4345 β†’ Type ?u.4345
Set
M: Type ?u.4148
M
) =
s: Set M
s
:=
rfl: βˆ€ {Ξ± : Sort ?u.4437} {a : Ξ±}, a = a
rfl
#align subsemigroup.coe_copy
Subsemigroup.coe_copy: βˆ€ {M : Type u_1} [inst : Mul M] {S : Subsemigroup M} {s : Set M} (hs : s = ↑S), ↑(Subsemigroup.copy S s hs) = s
Subsemigroup.coe_copy
#align add_subsemigroup.coe_copy
AddSubsemigroup.coe_copy: βˆ€ {M : Type u_1} [inst : Add M] {S : AddSubsemigroup M} {s : Set M} (hs : s = ↑S), ↑(AddSubsemigroup.copy S s hs) = s
AddSubsemigroup.coe_copy
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {S : AddSubsemigroup M} {s : Set M} (hs : s = ↑S), AddSubsemigroup.copy S s hs = S
to_additive
] theorem
copy_eq: βˆ€ {s : Set M} (hs : s = ↑S), Subsemigroup.copy S s hs = S
copy_eq
{
s: Set M
s
:
Set: Type ?u.4545 β†’ Type ?u.4545
Set
M: Type ?u.4514
M
} (
hs: s = ↑S
hs
:
s: Set M
s
= S) : S.
copy: {M : Type ?u.4710} β†’ [inst : Mul M] β†’ (S : Subsemigroup M) β†’ (s : Set M) β†’ s = ↑S β†’ Subsemigroup M
copy
s: Set M
s
hs: s = ↑S
hs
= S :=
SetLike.coe_injective: βˆ€ {A : Type ?u.4732} {B : Type ?u.4733} [i : SetLike A B], Function.Injective SetLike.coe
SetLike.coe_injective
hs: s = ↑S
hs
#align subsemigroup.copy_eq
Subsemigroup.copy_eq: βˆ€ {M : Type u_1} [inst : Mul M] {S : Subsemigroup M} {s : Set M} (hs : s = ↑S), Subsemigroup.copy S s hs = S
Subsemigroup.copy_eq
#align add_subsemigroup.copy_eq
AddSubsemigroup.copy_eq: βˆ€ {M : Type u_1} [inst : Add M] {S : AddSubsemigroup M} {s : Set M} (hs : s = ↑S), AddSubsemigroup.copy S s hs = S
AddSubsemigroup.copy_eq
variable (
S: ?m.4836
S
) /-- A subsemigroup is closed under multiplication. -/ @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] (S : AddSubsemigroup M) {x y : M}, x ∈ S β†’ y ∈ S β†’ x + y ∈ S
to_additive
"An `AddSubsemigroup` is closed under addition."] protected theorem
mul_mem: βˆ€ {x y : M}, x ∈ S β†’ y ∈ S β†’ x * y ∈ S
mul_mem
{
x: M
x
y: M
y
:
M: Type ?u.4839
M
} :
x: M
x
∈ S β†’
y: M
y
∈ S β†’
x: M
x
*
y: M
y
∈ S :=
Subsemigroup.mul_mem': βˆ€ {M : Type ?u.4999} [inst : Mul M] (self : Subsemigroup M) {a b : M}, a ∈ self.carrier β†’ b ∈ self.carrier β†’ a * b ∈ self.carrier
Subsemigroup.mul_mem'
S #align subsemigroup.mul_mem
Subsemigroup.mul_mem: βˆ€ {M : Type u_1} [inst : Mul M] (S : Subsemigroup M) {x y : M}, x ∈ S β†’ y ∈ S β†’ x * y ∈ S
Subsemigroup.mul_mem
#align add_subsemigroup.add_mem
AddSubsemigroup.add_mem: βˆ€ {M : Type u_1} [inst : Add M] (S : AddSubsemigroup M) {x y : M}, x ∈ S β†’ y ∈ S β†’ x + y ∈ S
AddSubsemigroup.add_mem
/-- The subsemigroup `M` of the magma `M`. -/ @[
to_additive: {M : Type u_1} β†’ [inst : Add M] β†’ Top (AddSubsemigroup M)
to_additive
"The additive subsemigroup `M` of the magma `M`."]
instance: {M : Type u_1} β†’ [inst : Mul M] β†’ Top (Subsemigroup M)
instance
:
Top: Type ?u.5090 β†’ Type ?u.5090
Top
(
Subsemigroup: (M : Type ?u.5091) β†’ [inst : Mul M] β†’ Type ?u.5091
Subsemigroup
M: Type ?u.5059
M
) := ⟨{ carrier :=
Set.univ: {Ξ± : Type ?u.5110} β†’ Set Ξ±
Set.univ
mul_mem' := fun
_: ?m.5117
_
_: ?m.5120
_
=>
Set.mem_univ: βˆ€ {Ξ± : Type ?u.5122} (x : Ξ±), x ∈ Set.univ
Set.mem_univ
_: ?m.5123
_
}⟩ /-- The trivial subsemigroup `βˆ…` of a magma `M`. -/ @[
to_additive: {M : Type u_1} β†’ [inst : Add M] β†’ Bot (AddSubsemigroup M)
to_additive
"The trivial `AddSubsemigroup` `βˆ…` of an additive magma `M`."]
instance: {M : Type u_1} β†’ [inst : Mul M] β†’ Bot (Subsemigroup M)
instance
:
Bot: Type ?u.5278 β†’ Type ?u.5278
Bot
(
Subsemigroup: (M : Type ?u.5279) β†’ [inst : Mul M] β†’ Type ?u.5279
Subsemigroup
M: Type ?u.5247
M
) := ⟨{ carrier :=
βˆ…: ?m.5299
βˆ…
mul_mem' :=
False.elim: βˆ€ {C : Sort ?u.5344}, False β†’ C
False.elim
}⟩ @[
to_additive: {M : Type u_1} β†’ [inst : Add M] β†’ Inhabited (AddSubsemigroup M)
to_additive
]
instance: {M : Type u_1} β†’ [inst : Mul M] β†’ Inhabited (Subsemigroup M)
instance
:
Inhabited: Sort ?u.5485 β†’ Sort (max1?u.5485)
Inhabited
(
Subsemigroup: (M : Type ?u.5486) β†’ [inst : Mul M] β†’ Type ?u.5486
Subsemigroup
M: Type ?u.5454
M
) := ⟨
βŠ₯: ?m.5501
βŠ₯
⟩ @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {x : M}, Β¬x ∈ βŠ₯
to_additive
] theorem
not_mem_bot: βˆ€ {M : Type u_1} [inst : Mul M] {x : M}, Β¬x ∈ βŠ₯
not_mem_bot
{
x: M
x
:
M: Type ?u.5615
M
} :
x: M
x
βˆ‰ (
βŠ₯: ?m.5663
βŠ₯
:
Subsemigroup: (M : Type ?u.5654) β†’ [inst : Mul M] β†’ Type ?u.5654
Subsemigroup
M: Type ?u.5615
M
) :=
Set.not_mem_empty: βˆ€ {Ξ± : Type ?u.5723} (x : Ξ±), Β¬x ∈ βˆ…
Set.not_mem_empty
x: M
x
#align subsemigroup.not_mem_bot
Subsemigroup.not_mem_bot: βˆ€ {M : Type u_1} [inst : Mul M] {x : M}, Β¬x ∈ βŠ₯
Subsemigroup.not_mem_bot
#align add_subsemigroup.not_mem_bot
AddSubsemigroup.not_mem_bot: βˆ€ {M : Type u_1} [inst : Add M] {x : M}, Β¬x ∈ βŠ₯
AddSubsemigroup.not_mem_bot
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] (x : M), x ∈ ⊀
to_additive
(attr := simp)] theorem
mem_top: βˆ€ (x : M), x ∈ ⊀
mem_top
(
x: M
x
:
M: Type ?u.5750
M
) :
x: M
x
∈ (
⊀: ?m.5810
⊀
:
Subsemigroup: (M : Type ?u.5801) β†’ [inst : Mul M] β†’ Type ?u.5801
Subsemigroup
M: Type ?u.5750
M
) :=
Set.mem_univ: βˆ€ {Ξ± : Type ?u.5865} (x : Ξ±), x ∈ Set.univ
Set.mem_univ
x: M
x
#align subsemigroup.mem_top
Subsemigroup.mem_top: βˆ€ {M : Type u_1} [inst : Mul M] (x : M), x ∈ ⊀
Subsemigroup.mem_top
#align add_subsemigroup.mem_top
AddSubsemigroup.mem_top: βˆ€ {M : Type u_1} [inst : Add M] (x : M), x ∈ ⊀
AddSubsemigroup.mem_top
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M], β†‘βŠ€ = Set.univ
to_additive
(attr := simp)] theorem
coe_top: β†‘βŠ€ = Set.univ
coe_top
: ((
⊀: ?m.5971
⊀
:
Subsemigroup: (M : Type ?u.5962) β†’ [inst : Mul M] β†’ Type ?u.5962
Subsemigroup
M: Type ?u.5927
M
) :
Set: Type ?u.5960 β†’ Type ?u.5960
Set
M: Type ?u.5927
M
) =
Set.univ: {Ξ± : Type ?u.6091} β†’ Set Ξ±
Set.univ
:=
rfl: βˆ€ {Ξ± : Sort ?u.6123} {a : Ξ±}, a = a
rfl
#align subsemigroup.coe_top
Subsemigroup.coe_top: βˆ€ {M : Type u_1} [inst : Mul M], β†‘βŠ€ = Set.univ
Subsemigroup.coe_top
#align add_subsemigroup.coe_top
AddSubsemigroup.coe_top: βˆ€ {M : Type u_1} [inst : Add M], β†‘βŠ€ = Set.univ
AddSubsemigroup.coe_top
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M], ↑βŠ₯ = βˆ…
to_additive
(attr := simp)] theorem
coe_bot: βˆ€ {M : Type u_1} [inst : Mul M], ↑βŠ₯ = βˆ…
coe_bot
: ((
βŠ₯: ?m.6210
βŠ₯
:
Subsemigroup: (M : Type ?u.6201) β†’ [inst : Mul M] β†’ Type ?u.6201
Subsemigroup
M: Type ?u.6166
M
) :
Set: Type ?u.6199 β†’ Type ?u.6199
Set
M: Type ?u.6166
M
) =
βˆ…: ?m.6336
βˆ…
:=
rfl: βˆ€ {Ξ± : Sort ?u.6412} {a : Ξ±}, a = a
rfl
#align subsemigroup.coe_bot
Subsemigroup.coe_bot: βˆ€ {M : Type u_1} [inst : Mul M], ↑βŠ₯ = βˆ…
Subsemigroup.coe_bot
#align add_subsemigroup.coe_bot
AddSubsemigroup.coe_bot: βˆ€ {M : Type u_1} [inst : Add M], ↑βŠ₯ = βˆ…
AddSubsemigroup.coe_bot
/-- The inf of two subsemigroups is their intersection. -/ @[
to_additive: {M : Type u_1} β†’ [inst : Add M] β†’ Inf (AddSubsemigroup M)
to_additive
"The inf of two `AddSubsemigroup`s is their intersection."]
instance: {M : Type u_1} β†’ [inst : Mul M] β†’ Inf (Subsemigroup M)
instance
:
Inf: Type ?u.6486 β†’ Type ?u.6486
Inf
(
Subsemigroup: (M : Type ?u.6487) β†’ [inst : Mul M] β†’ Type ?u.6487
Subsemigroup
M: Type ?u.6455
M
) := ⟨fun
S₁: ?m.6502
S₁
Sβ‚‚: ?m.6505
Sβ‚‚
=> { carrier :=
S₁: ?m.6502
S₁
∩
Sβ‚‚: ?m.6505
Sβ‚‚
mul_mem' := fun ⟨
hx: a✝ ∈ ↑S₁
hx
,
hx': a✝ ∈ ↑Sβ‚‚
hx'
⟩ ⟨
hy: b✝ ∈ ↑S₁
hy
,
hy': b✝ ∈ ↑Sβ‚‚
hy'
⟩ => ⟨
S₁: ?m.6502
S₁
.
mul_mem: βˆ€ {M : Type ?u.6734} [inst : Mul M] (S : Subsemigroup M) {x y : M}, x ∈ S β†’ y ∈ S β†’ x * y ∈ S
mul_mem
hx: a✝ ∈ ↑S₁
hx
hy: b✝ ∈ ↑S₁
hy
,
Sβ‚‚: ?m.6505
Sβ‚‚
.
mul_mem: βˆ€ {M : Type ?u.6761} [inst : Mul M] (S : Subsemigroup M) {x y : M}, x ∈ S β†’ y ∈ S β†’ x * y ∈ S
mul_mem
hx': a✝ ∈ ↑Sβ‚‚
hx'
hy': b✝ ∈ ↑Sβ‚‚
hy'
⟩ }⟩ @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] (p p' : AddSubsemigroup M), ↑(p βŠ“ p') = ↑p ∩ ↑p'
to_additive
(attr := simp)] theorem
coe_inf: βˆ€ (p p' : Subsemigroup M), ↑(p βŠ“ p') = ↑p ∩ ↑p'
coe_inf
(p p' :
Subsemigroup: (M : Type ?u.7142) β†’ [inst : Mul M] β†’ Type ?u.7142
Subsemigroup
M: Type ?u.7101
M
) : ((p βŠ“ p' :
Subsemigroup: (M : Type ?u.7150) β†’ [inst : Mul M] β†’ Type ?u.7150
Subsemigroup
M: Type ?u.7101
M
) :
Set: Type ?u.7148 β†’ Type ?u.7148
Set
M: Type ?u.7101
M
) = (p :
Set: Type ?u.7275 β†’ Type ?u.7275
Set
M: Type ?u.7101
M
) ∩ p' :=
rfl: βˆ€ {Ξ± : Sort ?u.7410} {a : Ξ±}, a = a
rfl
#align subsemigroup.coe_inf
Subsemigroup.coe_inf: βˆ€ {M : Type u_1} [inst : Mul M] (p p' : Subsemigroup M), ↑(p βŠ“ p') = ↑p ∩ ↑p'
Subsemigroup.coe_inf
#align add_subsemigroup.coe_inf
AddSubsemigroup.coe_inf: βˆ€ {M : Type u_1} [inst : Add M] (p p' : AddSubsemigroup M), ↑(p βŠ“ p') = ↑p ∩ ↑p'
AddSubsemigroup.coe_inf
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {p p' : AddSubsemigroup M} {x : M}, x ∈ p βŠ“ p' ↔ x ∈ p ∧ x ∈ p'
to_additive
(attr := simp)] theorem
mem_inf: βˆ€ {p p' : Subsemigroup M} {x : M}, x ∈ p βŠ“ p' ↔ x ∈ p ∧ x ∈ p'
mem_inf
{p p' :
Subsemigroup: (M : Type ?u.7516) β†’ [inst : Mul M] β†’ Type ?u.7516
Subsemigroup
M: Type ?u.7475
M
} {
x: M
x
:
M: Type ?u.7475
M
} :
x: M
x
∈ p βŠ“ p' ↔
x: M
x
∈ p ∧
x: M
x
∈ p' :=
Iff.rfl: βˆ€ {a : Prop}, a ↔ a
Iff.rfl
#align subsemigroup.mem_inf
Subsemigroup.mem_inf: βˆ€ {M : Type u_1} [inst : Mul M] {p p' : Subsemigroup M} {x : M}, x ∈ p βŠ“ p' ↔ x ∈ p ∧ x ∈ p'
Subsemigroup.mem_inf
#align add_subsemigroup.mem_inf
AddSubsemigroup.mem_inf: βˆ€ {M : Type u_1} [inst : Add M] {p p' : AddSubsemigroup M} {x : M}, x ∈ p βŠ“ p' ↔ x ∈ p ∧ x ∈ p'
AddSubsemigroup.mem_inf
@[
to_additive: {M : Type u_1} β†’ [inst : Add M] β†’ InfSet (AddSubsemigroup M)
to_additive
]
instance: {M : Type u_1} β†’ [inst : Mul M] β†’ InfSet (Subsemigroup M)
instance
:
InfSet: Type ?u.7712 β†’ Type ?u.7712
InfSet
(
Subsemigroup: (M : Type ?u.7713) β†’ [inst : Mul M] β†’ Type ?u.7713
Subsemigroup
M: Type ?u.7681
M
) := ⟨fun
s: ?m.7728
s
=> { carrier := β‹‚
t: ?m.7742
t
∈
s: ?m.7728
s
, ↑
t: ?m.7742
t
mul_mem' := fun
hx: ?m.7878
hx
hy: ?m.7881
hy
=>
Set.mem_biInter: βˆ€ {Ξ± : Type ?u.7883} {Ξ² : Type ?u.7884} {s : Set Ξ±} {t : Ξ± β†’ Set Ξ²} {y : Ξ²}, (βˆ€ (x : Ξ±), x ∈ s β†’ y ∈ t x) β†’ y ∈ Set.iInter fun x => Set.iInter fun h => t x
Set.mem_biInter
fun
i: ?m.7915
i
h: ?m.7918
h
=>
i: ?m.7915
i
.
mul_mem: βˆ€ {M : Type ?u.7920} [inst : Mul M] (S : Subsemigroup M) {x y : M}, x ∈ S β†’ y ∈ S β†’ x * y ∈ S
mul_mem
(

Goals accomplished! πŸ™
M: Type ?u.7681

N: Type ?u.7684

A: Type ?u.7687

inst✝¹: Mul M

s✝: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

s: Set (Subsemigroup M)

a✝, b✝: M

hx: a✝ ∈ Set.iInter fun t => Set.iInter fun h => ↑t

hy: b✝ ∈ Set.iInter fun t => Set.iInter fun h => ↑t

i: Subsemigroup M

h: i ∈ s


a✝ ∈ i

Goals accomplished! πŸ™
) (

Goals accomplished! πŸ™
M: Type ?u.7681

N: Type ?u.7684

A: Type ?u.7687

inst✝¹: Mul M

s✝: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

s: Set (Subsemigroup M)

a✝, b✝: M

hx: a✝ ∈ Set.iInter fun t => Set.iInter fun h => ↑t

hy: b✝ ∈ Set.iInter fun t => Set.iInter fun h => ↑t

i: Subsemigroup M

h: i ∈ s


b✝ ∈ i

Goals accomplished! πŸ™
) }⟩ @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] (S : Set (AddSubsemigroup M)), ↑(sInf S) = Set.iInter fun s => Set.iInter fun h => ↑s
to_additive
(attr := simp, norm_cast)] theorem
coe_sInf: βˆ€ (S : Set (Subsemigroup M)), ↑(sInf S) = Set.iInter fun s => Set.iInter fun h => ↑s
coe_sInf
(S :
Set: Type ?u.8245 β†’ Type ?u.8245
Set
(
Subsemigroup: (M : Type ?u.8246) β†’ [inst : Mul M] β†’ Type ?u.8246
Subsemigroup
M: Type ?u.8214
M
)) : ((
sInf: {Ξ± : Type ?u.8262} β†’ [self : InfSet Ξ±] β†’ Set Ξ± β†’ Ξ±
sInf
S :
Subsemigroup: (M : Type ?u.8260) β†’ [inst : Mul M] β†’ Type ?u.8260
Subsemigroup
M: Type ?u.8214
M
) :
Set: Type ?u.8258 β†’ Type ?u.8258
Set
M: Type ?u.8214
M
) = β‹‚
s: ?m.8386
s
∈ S, ↑
s: ?m.8386
s
:=
rfl: βˆ€ {Ξ± : Sort ?u.8668} {a : Ξ±}, a = a
rfl
#align subsemigroup.coe_Inf
Subsemigroup.coe_sInf: βˆ€ {M : Type u_1} [inst : Mul M] (S : Set (Subsemigroup M)), ↑(sInf S) = Set.iInter fun s => Set.iInter fun h => ↑s
Subsemigroup.coe_sInf
#align add_subsemigroup.coe_Inf
AddSubsemigroup.coe_sInf: βˆ€ {M : Type u_1} [inst : Add M] (S : Set (AddSubsemigroup M)), ↑(sInf S) = Set.iInter fun s => Set.iInter fun h => ↑s
AddSubsemigroup.coe_sInf
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {S : Set (AddSubsemigroup M)} {x : M}, x ∈ sInf S ↔ βˆ€ (p : AddSubsemigroup M), p ∈ S β†’ x ∈ p
to_additive
] theorem
mem_sInf: βˆ€ {S : Set (Subsemigroup M)} {x : M}, x ∈ sInf S ↔ βˆ€ (p : Subsemigroup M), p ∈ S β†’ x ∈ p
mem_sInf
{S :
Set: Type ?u.9014 β†’ Type ?u.9014
Set
(
Subsemigroup: (M : Type ?u.9015) β†’ [inst : Mul M] β†’ Type ?u.9015
Subsemigroup
M: Type ?u.8983
M
)} {
x: M
x
:
M: Type ?u.8983
M
} :
x: M
x
∈
sInf: {Ξ± : Type ?u.9032} β†’ [self : InfSet Ξ±] β†’ Set Ξ± β†’ Ξ±
sInf
S ↔ βˆ€
p: ?m.9083
p
∈ S,
x: M
x
∈
p: ?m.9083
p
:=
Set.mem_iInterβ‚‚: βˆ€ {Ξ³ : Type ?u.9139} {ΞΉ : Sort ?u.9140} {ΞΊ : ΞΉ β†’ Sort ?u.9141} {x : Ξ³} {s : (i : ΞΉ) β†’ ΞΊ i β†’ Set Ξ³}, (x ∈ Set.iInter fun i => Set.iInter fun j => s i j) ↔ βˆ€ (i : ΞΉ) (j : ΞΊ i), x ∈ s i j
Set.mem_iInterβ‚‚
#align subsemigroup.mem_Inf
Subsemigroup.mem_sInf: βˆ€ {M : Type u_1} [inst : Mul M] {S : Set (Subsemigroup M)} {x : M}, x ∈ sInf S ↔ βˆ€ (p : Subsemigroup M), p ∈ S β†’ x ∈ p
Subsemigroup.mem_sInf
#align add_subsemigroup.mem_Inf
AddSubsemigroup.mem_sInf: βˆ€ {M : Type u_1} [inst : Add M] {S : Set (AddSubsemigroup M)} {x : M}, x ∈ sInf S ↔ βˆ€ (p : AddSubsemigroup M), p ∈ S β†’ x ∈ p
AddSubsemigroup.mem_sInf
@[
to_additive: βˆ€ {M : Type u_2} [inst : Add M] {ΞΉ : Sort u_1} {S : ΞΉ β†’ AddSubsemigroup M} {x : M}, (x ∈ β¨… i, S i) ↔ βˆ€ (i : ΞΉ), x ∈ S i
to_additive
] theorem
mem_iInf: βˆ€ {M : Type u_2} [inst : Mul M] {ΞΉ : Sort u_1} {S : ΞΉ β†’ Subsemigroup M} {x : M}, (x ∈ β¨… i, S i) ↔ βˆ€ (i : ΞΉ), x ∈ S i
mem_iInf
{
ΞΉ: Sort u_1
ΞΉ
:
Sort _: Type ?u.9256
Sort
Sort _: Type ?u.9256
_
} {
S: ΞΉ β†’ Subsemigroup M
S
:
ΞΉ: Sort ?u.9256
ΞΉ
β†’
Subsemigroup: (M : Type ?u.9261) β†’ [inst : Mul M] β†’ Type ?u.9261
Subsemigroup
M: Type ?u.9225
M
} {
x: M
x
:
M: Type ?u.9225
M
} : (
x: M
x
∈ β¨…
i: ?m.9298
i
,
S: ΞΉ β†’ Subsemigroup M
S
i: ?m.9298
i
) ↔ βˆ€
i: ?m.9335
i
,
x: M
x
∈
S: ΞΉ β†’ Subsemigroup M
S
i: ?m.9335
i
:=

Goals accomplished! πŸ™
M: Type u_2

N: Type ?u.9228

A: Type ?u.9231

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S✝: Subsemigroup M

ΞΉ: Sort u_1

S: ΞΉ β†’ Subsemigroup M

x: M


(x ∈ β¨… i, S i) ↔ βˆ€ (i : ΞΉ), x ∈ S i

Goals accomplished! πŸ™
#align subsemigroup.mem_infi
Subsemigroup.mem_iInf: βˆ€ {M : Type u_2} [inst : Mul M] {ΞΉ : Sort u_1} {S : ΞΉ β†’ Subsemigroup M} {x : M}, (x ∈ β¨… i, S i) ↔ βˆ€ (i : ΞΉ), x ∈ S i
Subsemigroup.mem_iInf
#align add_subsemigroup.mem_infi
AddSubsemigroup.mem_iInf: βˆ€ {M : Type u_2} [inst : Add M] {ΞΉ : Sort u_1} {S : ΞΉ β†’ AddSubsemigroup M} {x : M}, (x ∈ β¨… i, S i) ↔ βˆ€ (i : ΞΉ), x ∈ S i
AddSubsemigroup.mem_iInf
@[
to_additive: βˆ€ {M : Type u_2} [inst : Add M] {ΞΉ : Sort u_1} {S : ΞΉ β†’ AddSubsemigroup M}, ↑(β¨… i, S i) = Set.iInter fun i => ↑(S i)
to_additive
(attr := simp, norm_cast)] theorem
coe_iInf: βˆ€ {ΞΉ : Sort u_1} {S : ΞΉ β†’ Subsemigroup M}, ↑(β¨… i, S i) = Set.iInter fun i => ↑(S i)
coe_iInf
{
ΞΉ: Sort ?u.9690
ΞΉ
:
Sort _: Type ?u.9690
Sort
Sort _: Type ?u.9690
_
} {
S: ΞΉ β†’ Subsemigroup M
S
:
ΞΉ: Sort ?u.9690
ΞΉ
β†’
Subsemigroup: (M : Type ?u.9695) β†’ [inst : Mul M] β†’ Type ?u.9695
Subsemigroup
M: Type ?u.9659
M
} : (↑(β¨…
i: ?m.9714
i
,
S: ΞΉ β†’ Subsemigroup M
S
i: ?m.9714
i
) :
Set: Type ?u.9707 β†’ Type ?u.9707
Set
M: Type ?u.9659
M
) = β‹‚
i: ?m.9829
i
,
S: ΞΉ β†’ Subsemigroup M
S
i: ?m.9829
i
:=

Goals accomplished! πŸ™
M: Type u_2

N: Type ?u.9662

A: Type ?u.9665

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S✝: Subsemigroup M

ΞΉ: Sort u_1

S: ΞΉ β†’ Subsemigroup M


↑(β¨… i, S i) = Set.iInter fun i => ↑(S i)

Goals accomplished! πŸ™
#align subsemigroup.coe_infi
Subsemigroup.coe_iInf: βˆ€ {M : Type u_2} [inst : Mul M] {ΞΉ : Sort u_1} {S : ΞΉ β†’ Subsemigroup M}, ↑(β¨… i, S i) = Set.iInter fun i => ↑(S i)
Subsemigroup.coe_iInf
#align add_subsemigroup.coe_infi
AddSubsemigroup.coe_iInf: βˆ€ {M : Type u_2} [inst : Add M] {ΞΉ : Sort u_1} {S : ΞΉ β†’ AddSubsemigroup M}, ↑(β¨… i, S i) = Set.iInter fun i => ↑(S i)
AddSubsemigroup.coe_iInf
/-- subsemigroups of a monoid form a complete lattice. -/ @[
to_additive: {M : Type u_1} β†’ [inst : Add M] β†’ CompleteLattice (AddSubsemigroup M)
to_additive
"The `AddSubsemigroup`s of an `AddMonoid` form a complete lattice."]
instance: {M : Type u_1} β†’ [inst : Mul M] β†’ CompleteLattice (Subsemigroup M)
instance
:
CompleteLattice: Type ?u.10745 β†’ Type ?u.10745
CompleteLattice
(
Subsemigroup: (M : Type ?u.10746) β†’ [inst : Mul M] β†’ Type ?u.10746
Subsemigroup
M: Type ?u.10714
M
) := {
completeLatticeOfInf: (Ξ± : Type ?u.10757) β†’ [H1 : PartialOrder Ξ±] β†’ [H2 : InfSet Ξ±] β†’ (βˆ€ (s : Set Ξ±), IsGLB s (sInf s)) β†’ CompleteLattice Ξ±
completeLatticeOfInf
(
Subsemigroup: (M : Type ?u.10758) β†’ [inst : Mul M] β†’ Type ?u.10758
Subsemigroup
M: Type ?u.10714
M
) fun
_: ?m.10939
_
=>
IsGLB.of_image: βˆ€ {Ξ± : Type ?u.10942} {Ξ² : Type ?u.10941} [inst : Preorder Ξ±] [inst_1 : Preorder Ξ²] {f : Ξ± β†’ Ξ²}, (βˆ€ {x y : Ξ±}, f x ≀ f y ↔ x ≀ y) β†’ βˆ€ {s : Set Ξ±} {x : Ξ±}, IsGLB (f '' s) (f x) β†’ IsGLB s x
IsGLB.of_image
SetLike.coe_subset_coe: βˆ€ {A : Type ?u.10951} {B : Type ?u.10950} [i : SetLike A B] {S T : A}, ↑S βŠ† ↑T ↔ S ≀ T
SetLike.coe_subset_coe
isGLB_biInf: βˆ€ {Ξ± : Type ?u.11146} {Ξ² : Type ?u.11145} [inst : CompleteLattice Ξ±] {s : Set Ξ²} {f : Ξ² β†’ Ξ±}, IsGLB (f '' s) (β¨… x, β¨… h, f x)
isGLB_biInf
with le :=
(Β· ≀ Β·): Subsemigroup M β†’ Subsemigroup M β†’ Prop
(Β· ≀ Β·)
lt :=
(Β· < Β·): Subsemigroup M β†’ Subsemigroup M β†’ Prop
(Β· < Β·)
bot :=
βŠ₯: ?m.11859
βŠ₯
bot_le := fun
_: ?m.11915
_
_: ?m.11918
_
hx: ?m.11921
hx
=> (
not_mem_bot: βˆ€ {M : Type ?u.11923} [inst : Mul M] {x : M}, Β¬x ∈ βŠ₯
not_mem_bot
hx: ?m.11921
hx
).
elim: βˆ€ {C : Sort ?u.11941}, False β†’ C
elim
top :=
⊀: ?m.11827
⊀
le_top := fun
_: ?m.11893
_
x: ?m.11896
x
_: ?m.11899
_
=>
mem_top: βˆ€ {M : Type ?u.11901} [inst : Mul M] (x : M), x ∈ ⊀
mem_top
x: ?m.11896
x
inf :=
(Β· βŠ“ Β·): Subsemigroup M β†’ Subsemigroup M β†’ Subsemigroup M
(Β· βŠ“ Β·)
sInf :=
InfSet.sInf: {Ξ± : Type ?u.11750} β†’ [self : InfSet Ξ±] β†’ Set Ξ± β†’ Ξ±
InfSet.sInf
le_inf := fun
_: ?m.11660
_
_: ?m.11663
_
_: ?m.11666
_
ha: ?m.11669
ha
hb: ?m.11672
hb
_: ?m.11675
_
hx: ?m.11678
hx
=> ⟨
ha: ?m.11669
ha
hx: ?m.11678
hx
,
hb: ?m.11672
hb
hx: ?m.11678
hx
⟩ inf_le_left := fun
_: ?m.11618
_
_: ?m.11621
_
_: ?m.11624
_
=>
And.left: βˆ€ {a b : Prop}, a ∧ b β†’ a
And.left
inf_le_right := fun
_: ?m.11639
_
_: ?m.11642
_
_: ?m.11645
_
=>
And.right: βˆ€ {a b : Prop}, a ∧ b β†’ b
And.right
} @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] [inst : Subsingleton (AddSubsemigroup M)], Subsingleton M
to_additive
(attr := simp)] theorem
subsingleton_of_subsingleton: βˆ€ {M : Type u_1} [inst : Mul M] [inst : Subsingleton (Subsemigroup M)], Subsingleton M
subsingleton_of_subsingleton
[
Subsingleton: Sort ?u.12577 β†’ Prop
Subsingleton
(
Subsemigroup: (M : Type ?u.12578) β†’ [inst : Mul M] β†’ Type ?u.12578
Subsemigroup
M: Type ?u.12546
M
)] :
Subsingleton: Sort ?u.12588 β†’ Prop
Subsingleton
M: Type ?u.12546
M
:=

Goals accomplished! πŸ™
M: Type u_1

N: Type ?u.12549

A: Type ?u.12552

inst✝²: Mul M

s: Set M

inst✝¹: Add A

t: Set A

S: Subsemigroup M

inst✝: Subsingleton (Subsemigroup M)


M: Type u_1

N: Type ?u.12549

A: Type ?u.12552

inst✝²: Mul M

s: Set M

inst✝¹: Add A

t: Set A

S: Subsemigroup M

inst✝: Subsingleton (Subsemigroup M)


allEq
βˆ€ (a b : M), a = b
M: Type u_1

N: Type ?u.12549

A: Type ?u.12552

inst✝²: Mul M

s: Set M

inst✝¹: Add A

t: Set A

S: Subsemigroup M

inst✝: Subsingleton (Subsemigroup M)


allEq
βˆ€ (a b : M), a = b
M: Type u_1

N: Type ?u.12549

A: Type ?u.12552

inst✝²: Mul M

s: Set M

inst✝¹: Add A

t: Set A

S: Subsemigroup M

inst✝: Subsingleton (Subsemigroup M)


M: Type u_1

N: Type ?u.12549

A: Type ?u.12552

inst✝²: Mul M

s: Set M

inst✝¹: Add A

t: Set A

S: Subsemigroup M

inst✝: Subsingleton (Subsemigroup M)

x, y: M


allEq
x = y
M: Type u_1

N: Type ?u.12549

A: Type ?u.12552

inst✝²: Mul M

s: Set M

inst✝¹: Add A

t: Set A

S: Subsemigroup M

inst✝: Subsingleton (Subsemigroup M)


M: Type u_1

N: Type ?u.12549

A: Type ?u.12552

inst✝²: Mul M

s: Set M

inst✝¹: Add A

t: Set A

S: Subsemigroup M

inst✝: Subsingleton (Subsemigroup M)

x, y: M


allEq
x = y

Goals accomplished! πŸ™
M: Type u_1

N: Type ?u.12549

A: Type ?u.12552

inst✝²: Mul M

s: Set M

inst✝¹: Add A

t: Set A

S: Subsemigroup M

inst✝: Subsingleton (Subsemigroup M)

x, y: M


βˆ€ (a : M), a ∈ βŠ₯

Goals accomplished! πŸ™
M: Type u_1

N: Type ?u.12549

A: Type ?u.12552

inst✝²: Mul M

s: Set M

inst✝¹: Add A

t: Set A

S: Subsemigroup M

inst✝: Subsingleton (Subsemigroup M)



Goals accomplished! πŸ™
#align subsemigroup.subsingleton_of_subsingleton
Subsemigroup.subsingleton_of_subsingleton: βˆ€ {M : Type u_1} [inst : Mul M] [inst : Subsingleton (Subsemigroup M)], Subsingleton M
Subsemigroup.subsingleton_of_subsingleton
#align add_subsemigroup.subsingleton_of_subsingleton
AddSubsemigroup.subsingleton_of_subsingleton: βˆ€ {M : Type u_1} [inst : Add M] [inst : Subsingleton (AddSubsemigroup M)], Subsingleton M
AddSubsemigroup.subsingleton_of_subsingleton
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] [hn : Nonempty M], Nontrivial (AddSubsemigroup M)
to_additive
]
instance: βˆ€ {M : Type u_1} [inst : Mul M] [hn : Nonempty M], Nontrivial (Subsemigroup M)
instance
[
hn: Nonempty M
hn
:
Nonempty: Sort ?u.13719 β†’ Prop
Nonempty
M: Type ?u.13688
M
] :
Nontrivial: Type ?u.13722 β†’ Prop
Nontrivial
(
Subsemigroup: (M : Type ?u.13723) β†’ [inst : Mul M] β†’ Type ?u.13723
Subsemigroup
M: Type ?u.13688
M
) := ⟨⟨
βŠ₯: ?m.13751
βŠ₯
,
⊀: ?m.13798
⊀
, fun
h: ?m.13828
h
=>

Goals accomplished! πŸ™
M: Type ?u.13688

N: Type ?u.13691

A: Type ?u.13694

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

hn: Nonempty M

h: βŠ₯ = ⊀


M: Type ?u.13688

N: Type ?u.13691

A: Type ?u.13694

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

hn: Nonempty M

h: βŠ₯ = ⊀

x: M


intro
M: Type ?u.13688

N: Type ?u.13691

A: Type ?u.13694

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

hn: Nonempty M

h: βŠ₯ = ⊀


M: Type ?u.13688

N: Type ?u.13691

A: Type ?u.13694

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

hn: Nonempty M

h: βŠ₯ = ⊀

x: M


intro
M: Type ?u.13688

N: Type ?u.13691

A: Type ?u.13694

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

hn: Nonempty M

h: βŠ₯ = ⊀



Goals accomplished! πŸ™
⟩⟩ /-- The `Subsemigroup` generated by a set. -/ @[
to_additive: {M : Type u_1} β†’ [inst : Add M] β†’ Set M β†’ AddSubsemigroup M
to_additive
"The `AddSubsemigroup` generated by a set"] def
closure: Set M β†’ Subsemigroup M
closure
(
s: Set M
s
:
Set: Type ?u.14177 β†’ Type ?u.14177
Set
M: Type ?u.14146
M
) :
Subsemigroup: (M : Type ?u.14180) β†’ [inst : Mul M] β†’ Type ?u.14180
Subsemigroup
M: Type ?u.14146
M
:=
sInf: {Ξ± : Type ?u.14190} β†’ [self : InfSet Ξ±] β†’ Set Ξ± β†’ Ξ±
sInf
{
S: ?m.14212
S
|
s: Set M
s
βŠ†
S: ?m.14212
S
} #align subsemigroup.closure
Subsemigroup.closure: {M : Type u_1} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
Subsemigroup.closure
#align add_subsemigroup.closure
AddSubsemigroup.closure: {M : Type u_1} β†’ [inst : Add M] β†’ Set M β†’ AddSubsemigroup M
AddSubsemigroup.closure
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} {x : M}, x ∈ AddSubsemigroup.closure s ↔ βˆ€ (S : AddSubsemigroup M), s βŠ† ↑S β†’ x ∈ S
to_additive
] theorem
mem_closure: βˆ€ {x : M}, x ∈ closure s ↔ βˆ€ (S : Subsemigroup M), s βŠ† ↑S β†’ x ∈ S
mem_closure
{
x: M
x
:
M: Type ?u.14420
M
} :
x: M
x
∈
closure: {M : Type ?u.14458} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
s: Set M
s
↔ βˆ€ S :
Subsemigroup: (M : Type ?u.14505) β†’ [inst : Mul M] β†’ Type ?u.14505
Subsemigroup
M: Type ?u.14420
M
,
s: Set M
s
βŠ† S β†’
x: M
x
∈ S :=
mem_sInf: βˆ€ {M : Type ?u.14630} [inst : Mul M] {S : Set (Subsemigroup M)} {x : M}, x ∈ sInf S ↔ βˆ€ (p : Subsemigroup M), p ∈ S β†’ x ∈ p
mem_sInf
#align subsemigroup.mem_closure
Subsemigroup.mem_closure: βˆ€ {M : Type u_1} [inst : Mul M] {s : Set M} {x : M}, x ∈ closure s ↔ βˆ€ (S : Subsemigroup M), s βŠ† ↑S β†’ x ∈ S
Subsemigroup.mem_closure
#align add_subsemigroup.mem_closure
AddSubsemigroup.mem_closure: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} {x : M}, x ∈ AddSubsemigroup.closure s ↔ βˆ€ (S : AddSubsemigroup M), s βŠ† ↑S β†’ x ∈ S
AddSubsemigroup.mem_closure
/-- The subsemigroup generated by a set includes the set. -/ @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M}, s βŠ† ↑(AddSubsemigroup.closure s)
to_additive
(attr := simp) "The `AddSubsemigroup` generated by a set includes the set."] theorem
subset_closure: s βŠ† ↑(closure s)
subset_closure
:
s: Set M
s
βŠ†
closure: {M : Type ?u.14746} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
s: Set M
s
:= fun
_: ?m.14866
_
hx: ?m.14869
hx
=>
mem_closure: βˆ€ {M : Type ?u.14871} [inst : Mul M] {s : Set M} {x : M}, x ∈ closure s ↔ βˆ€ (S : Subsemigroup M), s βŠ† ↑S β†’ x ∈ S
mem_closure
.
2: βˆ€ {a b : Prop}, (a ↔ b) β†’ b β†’ a
2
fun
_: ?m.14923
_
hS: ?m.14926
hS
=>
hS: ?m.14926
hS
hx: ?m.14869
hx
#align subsemigroup.subset_closure
Subsemigroup.subset_closure: βˆ€ {M : Type u_1} [inst : Mul M] {s : Set M}, s βŠ† ↑(closure s)
Subsemigroup.subset_closure
#align add_subsemigroup.subset_closure
AddSubsemigroup.subset_closure: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M}, s βŠ† ↑(AddSubsemigroup.closure s)
AddSubsemigroup.subset_closure
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} {P : M}, Β¬P ∈ AddSubsemigroup.closure s β†’ Β¬P ∈ s
to_additive
] theorem
not_mem_of_not_mem_closure: βˆ€ {P : M}, Β¬P ∈ closure s β†’ Β¬P ∈ s
not_mem_of_not_mem_closure
{
P: M
P
:
M: Type ?u.15030
M
} (hP :
P: M
P
βˆ‰
closure: {M : Type ?u.15068} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
s: Set M
s
) :
P: M
P
βˆ‰
s: Set M
s
:= fun
h: ?m.15135
h
=> hP (
subset_closure: βˆ€ {M : Type ?u.15137} [inst : Mul M] {s : Set M}, s βŠ† ↑(closure s)
subset_closure
h: ?m.15135
h
) #align subsemigroup.not_mem_of_not_mem_closure
Subsemigroup.not_mem_of_not_mem_closure: βˆ€ {M : Type u_1} [inst : Mul M] {s : Set M} {P : M}, Β¬P ∈ closure s β†’ Β¬P ∈ s
Subsemigroup.not_mem_of_not_mem_closure
#align add_subsemigroup.not_mem_of_not_mem_closure
AddSubsemigroup.not_mem_of_not_mem_closure: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} {P : M}, Β¬P ∈ AddSubsemigroup.closure s β†’ Β¬P ∈ s
AddSubsemigroup.not_mem_of_not_mem_closure
variable {
S: ?m.15253
S
} open Set /-- A subsemigroup `S` includes `closure s` if and only if it includes `s`. -/ @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} {S : AddSubsemigroup M}, AddSubsemigroup.closure s ≀ S ↔ s βŠ† ↑S
to_additive
(attr := simp) "An additive subsemigroup `S` includes `closure s` if and only if it includes `s`"] theorem
closure_le: closure s ≀ S ↔ s βŠ† ↑S
closure_le
:
closure: {M : Type ?u.15288} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
s: Set M
s
≀ S ↔
s: Set M
s
βŠ† S := ⟨
Subset.trans: βˆ€ {Ξ± : Type ?u.15448} {a b c : Set Ξ±}, a βŠ† b β†’ b βŠ† c β†’ a βŠ† c
Subset.trans
subset_closure: βˆ€ {M : Type ?u.15480} [inst : Mul M] {s : Set M}, s βŠ† ↑(closure s)
subset_closure
, fun
h: ?m.15525
h
=>
sInf_le: βˆ€ {Ξ± : Type ?u.15527} [inst : CompleteSemilatticeInf Ξ±] {s : Set Ξ±} {a : Ξ±}, a ∈ s β†’ sInf s ≀ a
sInf_le
h: ?m.15525
h
⟩ #align subsemigroup.closure_le
Subsemigroup.closure_le: βˆ€ {M : Type u_1} [inst : Mul M] {s : Set M} {S : Subsemigroup M}, closure s ≀ S ↔ s βŠ† ↑S
Subsemigroup.closure_le
#align add_subsemigroup.closure_le
AddSubsemigroup.closure_le: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} {S : AddSubsemigroup M}, AddSubsemigroup.closure s ≀ S ↔ s βŠ† ↑S
AddSubsemigroup.closure_le
/-- subsemigroup closure of a set is monotone in its argument: if `s βŠ† t`, then `closure s ≀ closure t`. -/ @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] ⦃s t : Set M⦄, s βŠ† t β†’ AddSubsemigroup.closure s ≀ AddSubsemigroup.closure t
to_additive
"Additive subsemigroup closure of a set is monotone in its argument: if `s βŠ† t`, then `closure s ≀ closure t`"] theorem
closure_mono: βˆ€ {M : Type u_1} [inst : Mul M] ⦃s t : Set M⦄, s βŠ† t β†’ closure s ≀ closure t
closure_mono
⦃
s: Set M
s
t: Set M
t
:
Set: Type ?u.15702 β†’ Type ?u.15702
Set
M: Type ?u.15668
M
⦄ (
h: s βŠ† t
h
:
s: Set M
s
βŠ†
t: Set M
t
) :
closure: {M : Type ?u.15725} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
s: Set M
s
≀
closure: {M : Type ?u.15736} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
t: Set M
t
:=
closure_le: βˆ€ {M : Type ?u.15790} [inst : Mul M] {s : Set M} {S : Subsemigroup M}, closure s ≀ S ↔ s βŠ† ↑S
closure_le
.
2: βˆ€ {a b : Prop}, (a ↔ b) β†’ b β†’ a
2
<|
Subset.trans: βˆ€ {Ξ± : Type ?u.15830} {a b c : Set Ξ±}, a βŠ† b β†’ b βŠ† c β†’ a βŠ† c
Subset.trans
h: s βŠ† t
h
subset_closure: βˆ€ {M : Type ?u.15843} [inst : Mul M] {s : Set M}, s βŠ† ↑(closure s)
subset_closure
#align subsemigroup.closure_mono
Subsemigroup.closure_mono: βˆ€ {M : Type u_1} [inst : Mul M] ⦃s t : Set M⦄, s βŠ† t β†’ closure s ≀ closure t
Subsemigroup.closure_mono
#align add_subsemigroup.closure_mono
AddSubsemigroup.closure_mono: βˆ€ {M : Type u_1} [inst : Add M] ⦃s t : Set M⦄, s βŠ† t β†’ AddSubsemigroup.closure s ≀ AddSubsemigroup.closure t
AddSubsemigroup.closure_mono
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} {S : AddSubsemigroup M}, s βŠ† ↑S β†’ S ≀ AddSubsemigroup.closure s β†’ AddSubsemigroup.closure s = S
to_additive
] theorem
closure_eq_of_le: βˆ€ {M : Type u_1} [inst : Mul M] {s : Set M} {S : Subsemigroup M}, s βŠ† ↑S β†’ S ≀ closure s β†’ closure s = S
closure_eq_of_le
(
h₁: s βŠ† ↑S
h₁
:
s: Set M
s
βŠ† S) (
hβ‚‚: S ≀ closure s
hβ‚‚
: S ≀
closure: {M : Type ?u.16050} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
s: Set M
s
) :
closure: {M : Type ?u.16100} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
s: Set M
s
= S :=
le_antisymm: βˆ€ {Ξ± : Type ?u.16109} [inst : PartialOrder Ξ±] {a b : Ξ±}, a ≀ b β†’ b ≀ a β†’ a = b
le_antisymm
(
closure_le: βˆ€ {M : Type ?u.16140} [inst : Mul M] {s : Set M} {S : Subsemigroup M}, closure s ≀ S ↔ s βŠ† ↑S
closure_le
.
2: βˆ€ {a b : Prop}, (a ↔ b) β†’ b β†’ a
2
h₁: s βŠ† ↑S
h₁
)
hβ‚‚: S ≀ closure s
hβ‚‚
#align subsemigroup.closure_eq_of_le
Subsemigroup.closure_eq_of_le: βˆ€ {M : Type u_1} [inst : Mul M] {s : Set M} {S : Subsemigroup M}, s βŠ† ↑S β†’ S ≀ closure s β†’ closure s = S
Subsemigroup.closure_eq_of_le
#align add_subsemigroup.closure_eq_of_le
AddSubsemigroup.closure_eq_of_le: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} {S : AddSubsemigroup M}, s βŠ† ↑S β†’ S ≀ AddSubsemigroup.closure s β†’ AddSubsemigroup.closure s = S
AddSubsemigroup.closure_eq_of_le
variable (
S: ?m.16279
S
) /-- An induction principle for closure membership. If `p` holds for all elements of `s`, and is preserved under multiplication, then `p` holds for all elements of the closure of `s`. -/ @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} {p : M β†’ Prop} {x : M}, x ∈ AddSubsemigroup.closure s β†’ (βˆ€ (x : M), x ∈ s β†’ p x) β†’ (βˆ€ (x y : M), p x β†’ p y β†’ p (x + y)) β†’ p x
to_additive
(attr := elab_as_elim) "An induction principle for additive closure membership. If `p` holds for all elements of `s`, and is preserved under addition, then `p` holds for all elements of the additive closure of `s`."] theorem
closure_induction: βˆ€ {p : M β†’ Prop} {x : M}, x ∈ closure s β†’ (βˆ€ (x : M), x ∈ s β†’ p x) β†’ (βˆ€ (x y : M), p x β†’ p y β†’ p (x * y)) β†’ p x
closure_induction
{
p: M β†’ Prop
p
:
M: Type ?u.16282
M
β†’
Prop: Type
Prop
} {
x: M
x
} (h :
x: ?m.16317
x
∈
closure: {M : Type ?u.16337} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
s: Set M
s
) (
Hs: βˆ€ (x : M), x ∈ s β†’ p x
Hs
: βˆ€
x: ?m.16390
x
∈
s: Set M
s
,
p: M β†’ Prop
p
x: ?m.16390
x
) (
Hmul: βˆ€ (x y : M), p x β†’ p y β†’ p (x * y)
Hmul
: βˆ€
x: ?m.16427
x
y: ?m.16430
y
,
p: M β†’ Prop
p
x: ?m.16427
x
β†’
p: M β†’ Prop
p
y: ?m.16430
y
β†’
p: M β†’ Prop
p
(
x: ?m.16427
x
*
y: ?m.16430
y
)) :
p: M β†’ Prop
p
x: ?m.16317
x
:= (@
closure_le: βˆ€ {M : Type ?u.16483} [inst : Mul M] {s : Set M} {S : Subsemigroup M}, closure s ≀ S ↔ s βŠ† ↑S
closure_le
_: Type ?u.16483
_
_
_: Set ?m.16484
_
⟨
p: M β†’ Prop
p
,
Hmul: βˆ€ (x y : M), p x β†’ p y β†’ p (x * y)
Hmul
_: M
_
_: M
_
⟩).
2: βˆ€ {a b : Prop}, (a ↔ b) β†’ b β†’ a
2
Hs: βˆ€ (x : M), x ∈ s β†’ p x
Hs
h #align subsemigroup.closure_induction
Subsemigroup.closure_induction: βˆ€ {M : Type u_1} [inst : Mul M] {s : Set M} {p : M β†’ Prop} {x : M}, x ∈ closure s β†’ (βˆ€ (x : M), x ∈ s β†’ p x) β†’ (βˆ€ (x y : M), p x β†’ p y β†’ p (x * y)) β†’ p x
Subsemigroup.closure_induction
#align add_subsemigroup.closure_induction
AddSubsemigroup.closure_induction: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} {p : M β†’ Prop} {x : M}, x ∈ AddSubsemigroup.closure s β†’ (βˆ€ (x : M), x ∈ s β†’ p x) β†’ (βˆ€ (x y : M), p x β†’ p y β†’ p (x + y)) β†’ p x
AddSubsemigroup.closure_induction
/-- A dependent version of `Subsemigroup.closure_induction`. -/ @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] (s : Set M) {p : (x : M) β†’ x ∈ AddSubsemigroup.closure s β†’ Prop}, (βˆ€ (x : M) (h : x ∈ s), p x (_ : x ∈ ↑(AddSubsemigroup.closure s))) β†’ (βˆ€ (x : M) (hx : x ∈ AddSubsemigroup.closure s) (y : M) (hy : y ∈ AddSubsemigroup.closure s), p x hx β†’ p y hy β†’ p (x + y) (_ : x + y ∈ AddSubsemigroup.closure s)) β†’ βˆ€ {x : M} (hx : x ∈ AddSubsemigroup.closure s), p x hx
to_additive
(attr := elab_as_elim) "A dependent version of `AddSubsemigroup.closure_induction`. "] theorem
closure_induction': βˆ€ (s : Set M) {p : (x : M) β†’ x ∈ closure s β†’ Prop}, (βˆ€ (x : M) (h : x ∈ s), p x (_ : x ∈ ↑(closure s))) β†’ (βˆ€ (x : M) (hx : x ∈ closure s) (y : M) (hy : y ∈ closure s), p x hx β†’ p y hy β†’ p (x * y) (_ : x * y ∈ closure s)) β†’ βˆ€ {x : M} (hx : x ∈ closure s), p x hx
closure_induction'
(
s: Set M
s
:
Set: Type ?u.16723 β†’ Type ?u.16723
Set
M: Type ?u.16692
M
) {
p: (x : M) β†’ x ∈ closure s β†’ Prop
p
: βˆ€
x: ?m.16727
x
,
x: ?m.16727
x
∈
closure: {M : Type ?u.16748} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
s: Set M
s
β†’
Prop: Type
Prop
} (
Hs: βˆ€ (x : M) (h : x ∈ s), p x (_ : x ∈ ↑(closure s))
Hs
: βˆ€ (
x: ?m.16802
x
) (
h: x ∈ s
h
:
x: ?m.16802
x
∈
s: Set M
s
),
p: (x : M) β†’ x ∈ closure s β†’ Prop
p
x: ?m.16802
x
(
subset_closure: βˆ€ {M : Type ?u.16836} [inst : Mul M] {s : Set M}, s βŠ† ↑(closure s)
subset_closure
h: x ∈ s
h
)) (
Hmul: βˆ€ (x : M) (hx : x ∈ closure s) (y : M) (hy : y ∈ closure s), p x hx β†’ p y hy β†’ p (x * y) (_ : x * y ∈ closure s)
Hmul
: βˆ€
x: ?m.16882
x
hx: ?m.16885
hx
y: ?m.16888
y
hy: ?m.16891
hy
,
p: (x : M) β†’ x ∈ closure s β†’ Prop
p
x: ?m.16882
x
hx: ?m.16885
hx
β†’
p: (x : M) β†’ x ∈ closure s β†’ Prop
p
y: ?m.16888
y
hy: ?m.16891
hy
β†’
p: (x : M) β†’ x ∈ closure s β†’ Prop
p
(
x: ?m.16882
x
*
y: ?m.16888
y
) (
mul_mem: βˆ€ {S : Type ?u.16937} {M : Type ?u.16936} [inst : Mul M] [inst_1 : SetLike S M] [self : MulMemClass S M] {s : S} {a b : M}, a ∈ s β†’ b ∈ s β†’ a * b ∈ s
mul_mem
hx: ?m.16885
hx
hy: ?m.16891
hy
)) {
x: ?m.17011
x
} (
hx: x ∈ closure s
hx
:
x: ?m.17011
x
∈
closure: {M : Type ?u.17031} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
s: Set M
s
) :
p: (x : M) β†’ x ∈ closure s β†’ Prop
p
x: ?m.17011
x
hx: x ∈ closure s
hx
:=

Goals accomplished! πŸ™
M: Type u_1

N: Type ?u.16695

A: Type ?u.16698

inst✝¹: Mul M

s✝: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

s: Set M

p: (x : M) β†’ x ∈ closure s β†’ Prop

Hs: βˆ€ (x : M) (h : x ∈ s), p x (_ : x ∈ ↑(closure s))

Hmul: βˆ€ (x : M) (hx : x ∈ closure s) (y : M) (hy : y ∈ closure s), p x hx β†’ p y hy β†’ p (x * y) (_ : x * y ∈ closure s)

x: M

hx: x ∈ closure s


p x hx
M: Type u_1

N: Type ?u.16695

A: Type ?u.16698

inst✝¹: Mul M

s✝: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

s: Set M

p: (x : M) β†’ x ∈ closure s β†’ Prop

Hs: βˆ€ (x : M) (h : x ∈ s), p x (_ : x ∈ ↑(closure s))

Hmul: βˆ€ (x : M) (hx : x ∈ closure s) (y : M) (hy : y ∈ closure s), p x hx β†’ p y hy β†’ p (x * y) (_ : x * y ∈ closure s)

x: M

hx: x ∈ closure s


βˆƒ x_1, p x x_1
M: Type u_1

N: Type ?u.16695

A: Type ?u.16698

inst✝¹: Mul M

s✝: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

s: Set M

p: (x : M) β†’ x ∈ closure s β†’ Prop

Hs: βˆ€ (x : M) (h : x ∈ s), p x (_ : x ∈ ↑(closure s))

Hmul: βˆ€ (x : M) (hx : x ∈ closure s) (y : M) (hy : y ∈ closure s), p x hx β†’ p y hy β†’ p (x * y) (_ : x * y ∈ closure s)

x: M

hx: x ∈ closure s


p x hx

Goals accomplished! πŸ™
#align subsemigroup.closure_induction'
Subsemigroup.closure_induction': βˆ€ {M : Type u_1} [inst : Mul M] (s : Set M) {p : (x : M) β†’ x ∈ closure s β†’ Prop}, (βˆ€ (x : M) (h : x ∈ s), p x (_ : x ∈ ↑(closure s))) β†’ (βˆ€ (x : M) (hx : x ∈ closure s) (y : M) (hy : y ∈ closure s), p x hx β†’ p y hy β†’ p (x * y) (_ : x * y ∈ closure s)) β†’ βˆ€ {x : M} (hx : x ∈ closure s), p x hx
Subsemigroup.closure_induction'
#align add_subsemigroup.closure_induction'
AddSubsemigroup.closure_induction': βˆ€ {M : Type u_1} [inst : Add M] (s : Set M) {p : (x : M) β†’ x ∈ AddSubsemigroup.closure s β†’ Prop}, (βˆ€ (x : M) (h : x ∈ s), p x (_ : x ∈ ↑(AddSubsemigroup.closure s))) β†’ (βˆ€ (x : M) (hx : x ∈ AddSubsemigroup.closure s) (y : M) (hy : y ∈ AddSubsemigroup.closure s), p x hx β†’ p y hy β†’ p (x + y) (_ : x + y ∈ AddSubsemigroup.closure s)) β†’ βˆ€ {x : M} (hx : x ∈ AddSubsemigroup.closure s), p x hx
AddSubsemigroup.closure_induction'
/-- An induction principle for closure membership for predicates with two arguments. -/ @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} {p : M β†’ M β†’ Prop} {x y : M}, x ∈ AddSubsemigroup.closure s β†’ y ∈ AddSubsemigroup.closure s β†’ (βˆ€ (x : M), x ∈ s β†’ βˆ€ (y : M), y ∈ s β†’ p x y) β†’ (βˆ€ (x y z : M), p x z β†’ p y z β†’ p (x + y) z) β†’ (βˆ€ (x y z : M), p z x β†’ p z y β†’ p z (x + y)) β†’ p x y
to_additive
(attr := elab_as_elim) "An induction principle for additive closure membership for predicates with two arguments."] theorem
closure_inductionβ‚‚: βˆ€ {p : M β†’ M β†’ Prop} {x y : M}, x ∈ closure s β†’ y ∈ closure s β†’ (βˆ€ (x : M), x ∈ s β†’ βˆ€ (y : M), y ∈ s β†’ p x y) β†’ (βˆ€ (x y z : M), p x z β†’ p y z β†’ p (x * y) z) β†’ (βˆ€ (x y z : M), p z x β†’ p z y β†’ p z (x * y)) β†’ p x y
closure_inductionβ‚‚
{
p: M β†’ M β†’ Prop
p
:
M: Type ?u.17690
M
β†’
M: Type ?u.17690
M
β†’
Prop: Type
Prop
} {
x: ?m.17727
x
} {
y: M
y
:
M: Type ?u.17690
M
} (
hx: x ∈ closure s
hx
:
x: ?m.17727
x
∈
closure: {M : Type ?u.17749} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
s: Set M
s
) (
hy: y ∈ closure s
hy
:
y: M
y
∈
closure: {M : Type ?u.17818} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
s: Set M
s
) (
Hs: βˆ€ (x : M), x ∈ s β†’ βˆ€ (y : M), y ∈ s β†’ p x y
Hs
: βˆ€
x: ?m.17851
x
∈
s: Set M
s
, βˆ€
y: ?m.17886
y
∈
s: Set M
s
,
p: M β†’ M β†’ Prop
p
x: ?m.17851
x
y: ?m.17886
y
) (
Hmul_left: βˆ€ (x y z : M), p x z β†’ p y z β†’ p (x * y) z
Hmul_left
: βˆ€
x: ?m.17922
x
y: ?m.17925
y
z: ?m.17928
z
,
p: M β†’ M β†’ Prop
p
x: ?m.17922
x
z: ?m.17928
z
β†’
p: M β†’ M β†’ Prop
p
y: ?m.17925
y
z: ?m.17928
z
β†’
p: M β†’ M β†’ Prop
p
(
x: ?m.17922
x
*
y: ?m.17925
y
)
z: ?m.17928
z
) (
Hmul_right: βˆ€ (x y z : M), p z x β†’ p z y β†’ p z (x * y)
Hmul_right
: βˆ€
x: ?m.17976
x
y: ?m.17979
y
z: ?m.17982
z
,
p: M β†’ M β†’ Prop
p
z: ?m.17982
z
x: ?m.17976
x
β†’
p: M β†’ M β†’ Prop
p
z: ?m.17982
z
y: ?m.17979
y
β†’
p: M β†’ M β†’ Prop
p
z: ?m.17982
z
(
x: ?m.17976
x
*
y: ?m.17979
y
)) :
p: M β†’ M β†’ Prop
p
x: ?m.17727
x
y: M
y
:=
closure_induction: βˆ€ {M : Type ?u.18024} [inst : Mul M] {s : Set M} {p : M β†’ Prop} {x : M}, x ∈ closure s β†’ (βˆ€ (x : M), x ∈ s β†’ p x) β†’ (βˆ€ (x y : M), p x β†’ p y β†’ p (x * y)) β†’ p x
closure_induction
hx: x ∈ closure s
hx
(fun
x: ?m.18093
x
xs: ?m.18096
xs
=>
closure_induction: βˆ€ {M : Type ?u.18098} [inst : Mul M] {s : Set M} {p : M β†’ Prop} {x : M}, x ∈ closure s β†’ (βˆ€ (x : M), x ∈ s β†’ p x) β†’ (βˆ€ (x y : M), p x β†’ p y β†’ p (x * y)) β†’ p x
closure_induction
hy: y ∈ closure s
hy
(
Hs: βˆ€ (x : M), x ∈ s β†’ βˆ€ (y : M), y ∈ s β†’ p x y
Hs
x: ?m.18093
x
xs: ?m.18096
xs
) fun
z: ?m.18184
z
_: ?m.18187
_
h₁: ?m.18190
h₁
hβ‚‚: ?m.18193
hβ‚‚
=>
Hmul_right: βˆ€ (x y z : M), p z x β†’ p z y β†’ p z (x * y)
Hmul_right
z: ?m.18184
z
_: M
_
_: M
_
h₁: ?m.18190
h₁
hβ‚‚: ?m.18193
hβ‚‚
) fun
_: ?m.18153
_
_: ?m.18156
_
h₁: ?m.18159
h₁
hβ‚‚: ?m.18162
hβ‚‚
=>
Hmul_left: βˆ€ (x y z : M), p x z β†’ p y z β†’ p (x * y) z
Hmul_left
_: M
_
_: M
_
_: M
_
h₁: ?m.18159
h₁
hβ‚‚: ?m.18162
hβ‚‚
#align subsemigroup.closure_inductionβ‚‚
Subsemigroup.closure_inductionβ‚‚: βˆ€ {M : Type u_1} [inst : Mul M] {s : Set M} {p : M β†’ M β†’ Prop} {x y : M}, x ∈ closure s β†’ y ∈ closure s β†’ (βˆ€ (x : M), x ∈ s β†’ βˆ€ (y : M), y ∈ s β†’ p x y) β†’ (βˆ€ (x y z : M), p x z β†’ p y z β†’ p (x * y) z) β†’ (βˆ€ (x y z : M), p z x β†’ p z y β†’ p z (x * y)) β†’ p x y
Subsemigroup.closure_inductionβ‚‚
#align add_subsemigroup.closure_inductionβ‚‚
AddSubsemigroup.closure_inductionβ‚‚: βˆ€ {M : Type u_1} [inst : Add M] {s : Set M} {p : M β†’ M β†’ Prop} {x y : M}, x ∈ AddSubsemigroup.closure s β†’ y ∈ AddSubsemigroup.closure s β†’ (βˆ€ (x : M), x ∈ s β†’ βˆ€ (y : M), y ∈ s β†’ p x y) β†’ (βˆ€ (x y z : M), p x z β†’ p y z β†’ p (x + y) z) β†’ (βˆ€ (x y z : M), p z x β†’ p z y β†’ p z (x + y)) β†’ p x y
AddSubsemigroup.closure_inductionβ‚‚
/-- If `s` is a dense set in a magma `M`, `Subsemigroup.closure s = ⊀`, then in order to prove that some predicate `p` holds for all `x : M` it suffices to verify `p x` for `x ∈ s`, and verify that `p x` and `p y` imply `p (x * y)`. -/ @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] {p : M β†’ Prop} (x : M) {s : Set M}, AddSubsemigroup.closure s = ⊀ β†’ (βˆ€ (x : M), x ∈ s β†’ p x) β†’ (βˆ€ (x y : M), p x β†’ p y β†’ p (x + y)) β†’ p x
to_additive
(attr := elab_as_elim) "If `s` is a dense set in an additive monoid `M`, `AddSubsemigroup.closure s = ⊀`, then in order to prove that some predicate `p` holds for all `x : M` it suffices to verify `p x` for `x ∈ s`, and verify that `p x` and `p y` imply `p (x + y)`."] theorem
dense_induction: βˆ€ {p : M β†’ Prop} (x : M) {s : Set M}, closure s = ⊀ β†’ (βˆ€ (x : M), x ∈ s β†’ p x) β†’ (βˆ€ (x y : M), p x β†’ p y β†’ p (x * y)) β†’ p x
dense_induction
{
p: M β†’ Prop
p
:
M: Type ?u.18434
M
β†’
Prop: Type
Prop
} (
x: M
x
:
M: Type ?u.18434
M
) {
s: Set M
s
:
Set: Type ?u.18471 β†’ Type ?u.18471
Set
M: Type ?u.18434
M
} (hs :
closure: {M : Type ?u.18475} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
s: Set M
s
=
⊀: ?m.18488
⊀
) (
Hs: βˆ€ (x : M), x ∈ s β†’ p x
Hs
: βˆ€
x: ?m.18539
x
∈
s: Set M
s
,
p: M β†’ Prop
p
x: ?m.18539
x
) (
Hmul: βˆ€ (x y : M), p x β†’ p y β†’ p (x * y)
Hmul
: βˆ€
x: ?m.18578
x
y: ?m.18581
y
,
p: M β†’ Prop
p
x: ?m.18578
x
β†’
p: M β†’ Prop
p
y: ?m.18581
y
β†’
p: M β†’ Prop
p
(
x: ?m.18578
x
*
y: ?m.18581
y
)) :
p: M β†’ Prop
p
x: M
x
:=

Goals accomplished! πŸ™
M: Type u_1

N: Type ?u.18437

A: Type ?u.18440

inst✝¹: Mul M

s✝: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

p: M β†’ Prop

x: M

s: Set M

hs: closure s = ⊀

Hs: βˆ€ (x : M), x ∈ s β†’ p x

Hmul: βˆ€ (x y : M), p x β†’ p y β†’ p (x * y)


p x
M: Type u_1

N: Type ?u.18437

A: Type ?u.18440

inst✝¹: Mul M

s✝: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

p: M β†’ Prop

x: M

s: Set M

hs: closure s = ⊀

Hs: βˆ€ (x : M), x ∈ s β†’ p x

Hmul: βˆ€ (x y : M), p x β†’ p y β†’ p (x * y)

this: βˆ€ (x : M), x ∈ closure s β†’ p x


p x
M: Type u_1

N: Type ?u.18437

A: Type ?u.18440

inst✝¹: Mul M

s✝: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

p: M β†’ Prop

x: M

s: Set M

hs: closure s = ⊀

Hs: βˆ€ (x : M), x ∈ s β†’ p x

Hmul: βˆ€ (x y : M), p x β†’ p y β†’ p (x * y)


p x

Goals accomplished! πŸ™
#align subsemigroup.dense_induction
Subsemigroup.dense_induction: βˆ€ {M : Type u_1} [inst : Mul M] {p : M β†’ Prop} (x : M) {s : Set M}, closure s = ⊀ β†’ (βˆ€ (x : M), x ∈ s β†’ p x) β†’ (βˆ€ (x y : M), p x β†’ p y β†’ p (x * y)) β†’ p x
Subsemigroup.dense_induction
#align add_subsemigroup.dense_induction
AddSubsemigroup.dense_induction: βˆ€ {M : Type u_1} [inst : Add M] {p : M β†’ Prop} (x : M) {s : Set M}, AddSubsemigroup.closure s = ⊀ β†’ (βˆ€ (x : M), x ∈ s β†’ p x) β†’ (βˆ€ (x y : M), p x β†’ p y β†’ p (x + y)) β†’ p x
AddSubsemigroup.dense_induction
variable (
M: ?m.19120
M
) /-- `closure` forms a Galois insertion with the coercion to set. -/ @[
to_additive: (M : Type u_1) β†’ [inst : Add M] β†’ GaloisInsertion AddSubsemigroup.closure SetLike.coe
to_additive
"`closure` forms a Galois insertion with the coercion to set."] protected def
gi: GaloisInsertion closure SetLike.coe
gi
:
GaloisInsertion: {Ξ± : Type ?u.19155} β†’ {Ξ² : Type ?u.19154} β†’ [inst : Preorder Ξ±] β†’ [inst : Preorder Ξ²] β†’ (Ξ± β†’ Ξ²) β†’ (Ξ² β†’ Ξ±) β†’ Type (max?u.19155?u.19154)
GaloisInsertion
(@
closure: {M : Type ?u.19190} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
M: Type ?u.19123
M
_)
SetLike.coe: {A : Type ?u.19204} β†’ {B : outParam (Type ?u.19203)} β†’ [self : SetLike A B] β†’ A β†’ Set B
SetLike.coe
:=
GaloisConnection.toGaloisInsertion: {Ξ± : Type ?u.19300} β†’ {Ξ² : Type ?u.19299} β†’ [inst : Preorder Ξ±] β†’ [inst_1 : Preorder Ξ²] β†’ {l : Ξ± β†’ Ξ²} β†’ {u : Ξ² β†’ Ξ±} β†’ GaloisConnection l u β†’ (βˆ€ (b : Ξ²), b ≀ l (u b)) β†’ GaloisInsertion l u
GaloisConnection.toGaloisInsertion
(fun
_: ?m.19348
_
_: ?m.19351
_
=>
closure_le: βˆ€ {M : Type ?u.19353} [inst : Mul M] {s : Set M} {S : Subsemigroup M}, closure s ≀ S ↔ s βŠ† ↑S
closure_le
) fun
_: ?m.19390
_
=>
subset_closure: βˆ€ {M : Type ?u.19392} [inst : Mul M] {s : Set M}, s βŠ† ↑(closure s)
subset_closure
#align subsemigroup.gi
Subsemigroup.gi: (M : Type u_1) β†’ [inst : Mul M] β†’ GaloisInsertion closure SetLike.coe
Subsemigroup.gi
#align add_subsemigroup.gi
AddSubsemigroup.gi: (M : Type u_1) β†’ [inst : Add M] β†’ GaloisInsertion AddSubsemigroup.closure SetLike.coe
AddSubsemigroup.gi
variable {
M: ?m.19603
M
} /-- Closure of a subsemigroup `S` equals `S`. -/ @[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] (S : AddSubsemigroup M), AddSubsemigroup.closure ↑S = S
to_additive
(attr := simp) "Additive closure of an additive subsemigroup `S` equals `S`"] theorem
closure_eq: βˆ€ {M : Type u_1} [inst : Mul M] (S : Subsemigroup M), closure ↑S = S
closure_eq
:
closure: {M : Type ?u.19638} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
(S :
Set: Type ?u.19642 β†’ Type ?u.19642
Set
M: Type ?u.19606
M
) = S := (
Subsemigroup.gi: (M : Type ?u.19745) β†’ [inst : Mul M] β†’ GaloisInsertion closure SetLike.coe
Subsemigroup.gi
M: Type ?u.19606
M
).
l_u_eq: βˆ€ {Ξ± : Type ?u.19754} {Ξ² : Type ?u.19753} {l : Ξ± β†’ Ξ²} {u : Ξ² β†’ Ξ±} [inst : Preorder Ξ±] [inst_1 : PartialOrder Ξ²], GaloisInsertion l u β†’ βˆ€ (b : Ξ²), l (u b) = b
l_u_eq
S #align subsemigroup.closure_eq
Subsemigroup.closure_eq: βˆ€ {M : Type u_1} [inst : Mul M] (S : Subsemigroup M), closure ↑S = S
Subsemigroup.closure_eq
#align add_subsemigroup.closure_eq
AddSubsemigroup.closure_eq: βˆ€ {M : Type u_1} [inst : Add M] (S : AddSubsemigroup M), AddSubsemigroup.closure ↑S = S
AddSubsemigroup.closure_eq
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M], AddSubsemigroup.closure βˆ… = βŠ₯
to_additive
(attr := simp)] theorem
closure_empty: βˆ€ {M : Type u_1} [inst : Mul M], closure βˆ… = βŠ₯
closure_empty
:
closure: {M : Type ?u.19930} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
(
βˆ…: ?m.19936
βˆ…
:
Set: Type ?u.19934 β†’ Type ?u.19934
Set
M: Type ?u.19898
M
) =
βŠ₯: ?m.19986
βŠ₯
:= (
Subsemigroup.gi: (M : Type ?u.20044) β†’ [inst : Mul M] β†’ GaloisInsertion closure SetLike.coe
Subsemigroup.gi
M: Type ?u.19898
M
).
gc: βˆ€ {Ξ± : Type ?u.20053} {Ξ² : Type ?u.20052} [inst : Preorder Ξ±] [inst_1 : Preorder Ξ²] {l : Ξ± β†’ Ξ²} {u : Ξ² β†’ Ξ±}, GaloisInsertion l u β†’ GaloisConnection l u
gc
.
l_bot: βˆ€ {Ξ± : Type ?u.20142} {Ξ² : Type ?u.20141} [inst : Preorder Ξ±] [inst_1 : PartialOrder Ξ²] [inst_2 : OrderBot Ξ²] [inst_3 : OrderBot Ξ±] {l : Ξ± β†’ Ξ²} {u : Ξ² β†’ Ξ±}, GaloisConnection l u β†’ l βŠ₯ = βŠ₯
l_bot
#align subsemigroup.closure_empty
Subsemigroup.closure_empty: βˆ€ {M : Type u_1} [inst : Mul M], closure βˆ… = βŠ₯
Subsemigroup.closure_empty
#align add_subsemigroup.closure_empty
AddSubsemigroup.closure_empty: βˆ€ {M : Type u_1} [inst : Add M], AddSubsemigroup.closure βˆ… = βŠ₯
AddSubsemigroup.closure_empty
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M], AddSubsemigroup.closure univ = ⊀
to_additive
(attr := simp)] theorem
closure_univ: closure univ = ⊀
closure_univ
:
closure: {M : Type ?u.20320} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
(
univ: {Ξ± : Type ?u.20325} β†’ Set Ξ±
univ
:
Set: Type ?u.20324 β†’ Type ?u.20324
Set
M: Type ?u.20288
M
) =
⊀: ?m.20336
⊀
:= @
coe_top: βˆ€ {M : Type ?u.20385} [inst : Mul M], β†‘βŠ€ = univ
coe_top
M: Type ?u.20288
M
_ β–Έ
closure_eq: βˆ€ {M : Type ?u.20393} [inst : Mul M] (S : Subsemigroup M), closure ↑S = S
closure_eq
⊀: ?m.20397
⊀
#align subsemigroup.closure_univ
Subsemigroup.closure_univ: βˆ€ {M : Type u_1} [inst : Mul M], closure univ = ⊀
Subsemigroup.closure_univ
#align add_subsemigroup.closure_univ
AddSubsemigroup.closure_univ: βˆ€ {M : Type u_1} [inst : Add M], AddSubsemigroup.closure univ = ⊀
AddSubsemigroup.closure_univ
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] (s t : Set M), AddSubsemigroup.closure (s βˆͺ t) = AddSubsemigroup.closure s βŠ” AddSubsemigroup.closure t
to_additive
] theorem
closure_union: βˆ€ (s t : Set M), closure (s βˆͺ t) = closure s βŠ” closure t
closure_union
(
s: Set M
s
t: Set M
t
:
Set: Type ?u.20523 β†’ Type ?u.20523
Set
M: Type ?u.20489
M
) :
closure: {M : Type ?u.20527} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
(
s: Set M
s
βˆͺ
t: Set M
t
) =
closure: {M : Type ?u.20558} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
s: Set M
s
βŠ”
closure: {M : Type ?u.20576} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
t: Set M
t
:= (
Subsemigroup.gi: (M : Type ?u.20626) β†’ [inst : Mul M] β†’ GaloisInsertion closure SetLike.coe
Subsemigroup.gi
M: Type ?u.20489
M
).
gc: βˆ€ {Ξ± : Type ?u.20635} {Ξ² : Type ?u.20634} [inst : Preorder Ξ±] [inst_1 : Preorder Ξ²] {l : Ξ± β†’ Ξ²} {u : Ξ² β†’ Ξ±}, GaloisInsertion l u β†’ GaloisConnection l u
gc
.
l_sup: βˆ€ {Ξ± : Type ?u.20724} {Ξ² : Type ?u.20723} {a₁ aβ‚‚ : Ξ±} [inst : SemilatticeSup Ξ±] [inst_1 : SemilatticeSup Ξ²] {l : Ξ± β†’ Ξ²} {u : Ξ² β†’ Ξ±}, GaloisConnection l u β†’ l (a₁ βŠ” aβ‚‚) = l a₁ βŠ” l aβ‚‚
l_sup
#align subsemigroup.closure_union
Subsemigroup.closure_union: βˆ€ {M : Type u_1} [inst : Mul M] (s t : Set M), closure (s βˆͺ t) = closure s βŠ” closure t
Subsemigroup.closure_union
#align add_subsemigroup.closure_union
AddSubsemigroup.closure_union: βˆ€ {M : Type u_1} [inst : Add M] (s t : Set M), AddSubsemigroup.closure (s βˆͺ t) = AddSubsemigroup.closure s βŠ” AddSubsemigroup.closure t
AddSubsemigroup.closure_union
@[
to_additive: βˆ€ {M : Type u_2} [inst : Add M] {ΞΉ : Sort u_1} (s : ΞΉ β†’ Set M), AddSubsemigroup.closure (iUnion fun i => s i) = ⨆ i, AddSubsemigroup.closure (s i)
to_additive
] theorem
closure_iUnion: βˆ€ {M : Type u_2} [inst : Mul M] {ΞΉ : Sort u_1} (s : ΞΉ β†’ Set M), closure (iUnion fun i => s i) = ⨆ i, closure (s i)
closure_iUnion
{
ΞΉ: Sort u_1
ΞΉ
} (
s: ΞΉ β†’ Set M
s
:
ΞΉ: ?m.20861
ΞΉ
β†’
Set: Type ?u.20866 β†’ Type ?u.20866
Set
M: Type ?u.20830
M
) :
closure: {M : Type ?u.20871} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
(⋃
i: ?m.20881
i
,
s: ΞΉ β†’ Set M
s
i: ?m.20881
i
) = ⨆
i: ?m.20902
i
,
closure: {M : Type ?u.20904} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
(
s: ΞΉ β†’ Set M
s
i: ?m.20902
i
) := (
Subsemigroup.gi: (M : Type ?u.20953) β†’ [inst : Mul M] β†’ GaloisInsertion closure SetLike.coe
Subsemigroup.gi
M: Type ?u.20830
M
).
gc: βˆ€ {Ξ± : Type ?u.20962} {Ξ² : Type ?u.20961} [inst : Preorder Ξ±] [inst_1 : Preorder Ξ²] {l : Ξ± β†’ Ξ²} {u : Ξ² β†’ Ξ±}, GaloisInsertion l u β†’ GaloisConnection l u
gc
.
l_iSup: βˆ€ {Ξ± : Type ?u.21052} {Ξ² : Type ?u.21051} {ΞΉ : Sort ?u.21050} [inst : CompleteLattice Ξ±] [inst_1 : CompleteLattice Ξ²] {l : Ξ± β†’ Ξ²} {u : Ξ² β†’ Ξ±}, GaloisConnection l u β†’ βˆ€ {f : ΞΉ β†’ Ξ±}, l (iSup f) = ⨆ i, l (f i)
l_iSup
#align subsemigroup.closure_Union
Subsemigroup.closure_iUnion: βˆ€ {M : Type u_2} [inst : Mul M] {ΞΉ : Sort u_1} (s : ΞΉ β†’ Set M), closure (iUnion fun i => s i) = ⨆ i, closure (s i)
Subsemigroup.closure_iUnion
#align add_subsemigroup.closure_Union
AddSubsemigroup.closure_iUnion: βˆ€ {M : Type u_2} [inst : Add M] {ΞΉ : Sort u_1} (s : ΞΉ β†’ Set M), AddSubsemigroup.closure (iUnion fun i => s i) = ⨆ i, AddSubsemigroup.closure (s i)
AddSubsemigroup.closure_iUnion
@[
to_additive: βˆ€ {M : Type u_1} [inst : Add M] (m : M) (p : AddSubsemigroup M), AddSubsemigroup.closure {m} ≀ p ↔ m ∈ p
to_additive
] theorem
closure_singleton_le_iff_mem: βˆ€ (m : M) (p : Subsemigroup M), closure {m} ≀ p ↔ m ∈ p
closure_singleton_le_iff_mem
(
m: M
m
:
M: Type ?u.21166
M
) (p :
Subsemigroup: (M : Type ?u.21199) β†’ [inst : Mul M] β†’ Type ?u.21199
Subsemigroup
M: Type ?u.21166
M
) :
closure: {M : Type ?u.21210} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
closure
{
m: M
m
} ≀ p ↔
m: M
m
∈ p :=

Goals accomplished! πŸ™
M: Type u_1

N: Type ?u.21169

A: Type ?u.21172

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

m: M

p: Subsemigroup M


M: Type u_1

N: Type ?u.21169

A: Type ?u.21172

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

m: M

p: Subsemigroup M


M: Type u_1

N: Type ?u.21169

A: Type ?u.21172

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

m: M

p: Subsemigroup M


{m} βŠ† ↑p ↔ m ∈ p
M: Type u_1

N: Type ?u.21169

A: Type ?u.21172

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

m: M

p: Subsemigroup M


M: Type u_1

N: Type ?u.21169

A: Type ?u.21172

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

m: M

p: Subsemigroup M


m ∈ ↑p ↔ m ∈ p
M: Type u_1

N: Type ?u.21169

A: Type ?u.21172

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

m: M

p: Subsemigroup M


M: Type u_1

N: Type ?u.21169

A: Type ?u.21172

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

m: M

p: Subsemigroup M



Goals accomplished! πŸ™
#align subsemigroup.closure_singleton_le_iff_mem
Subsemigroup.closure_singleton_le_iff_mem: βˆ€ {M : Type u_1} [inst : Mul M] (m : M) (p : Subsemigroup M), closure {m} ≀ p ↔ m ∈ p
Subsemigroup.closure_singleton_le_iff_mem
#align add_subsemigroup.closure_singleton_le_iff_mem
AddSubsemigroup.closure_singleton_le_iff_mem: βˆ€ {M : Type u_1} [inst : Add M] (m : M) (p : AddSubsemigroup M), AddSubsemigroup.closure {m} ≀ p ↔ m ∈ p
AddSubsemigroup.closure_singleton_le_iff_mem
@[
to_additive: βˆ€ {M : Type u_2} [inst : Add M] {ΞΉ : Sort u_1} (p : ΞΉ β†’ AddSubsemigroup M) {m : M}, (m ∈ ⨆ i, p i) ↔ βˆ€ (N : AddSubsemigroup M), (βˆ€ (i : ΞΉ), p i ≀ N) β†’ m ∈ N
to_additive
] theorem
mem_iSup: βˆ€ {ΞΉ : Sort u_1} (p : ΞΉ β†’ Subsemigroup M) {m : M}, (m ∈ ⨆ i, p i) ↔ βˆ€ (N : Subsemigroup M), (βˆ€ (i : ΞΉ), p i ≀ N) β†’ m ∈ N
mem_iSup
{
ΞΉ: Sort u_1
ΞΉ
:
Sort _: Type ?u.21487
Sort
Sort _: Type ?u.21487
_
} (
p: ΞΉ β†’ Subsemigroup M
p
:
ΞΉ: Sort ?u.21487
ΞΉ
β†’
Subsemigroup: (M : Type ?u.21492) β†’ [inst : Mul M] β†’ Type ?u.21492
Subsemigroup
M: Type ?u.21456
M
) {
m: M
m
:
M: Type ?u.21456
M
} : (
m: M
m
∈ ⨆
i: ?m.21527
i
,
p: ΞΉ β†’ Subsemigroup M
p
i: ?m.21527
i
) ↔ βˆ€
N: ?m.21573
N
, (βˆ€
i: ?m.21578
i
,
p: ΞΉ β†’ Subsemigroup M
p
i: ?m.21578
i
≀
N: ?m.21573
N
) β†’
m: M
m
∈
N: ?m.21573
N
:=

Goals accomplished! πŸ™
M: Type u_2

N: Type ?u.21459

A: Type ?u.21462

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

ΞΉ: Sort u_1

p: ΞΉ β†’ Subsemigroup M

m: M


(m ∈ ⨆ i, p i) ↔ βˆ€ (N : Subsemigroup M), (βˆ€ (i : ΞΉ), p i ≀ N) β†’ m ∈ N
M: Type u_2

N: Type ?u.21459

A: Type ?u.21462

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

ΞΉ: Sort u_1

p: ΞΉ β†’ Subsemigroup M

m: M


(m ∈ ⨆ i, p i) ↔ βˆ€ (N : Subsemigroup M), (βˆ€ (i : ΞΉ), p i ≀ N) β†’ m ∈ N
M: Type u_2

N: Type ?u.21459

A: Type ?u.21462

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

ΞΉ: Sort u_1

p: ΞΉ β†’ Subsemigroup M

m: M


(closure {m} ≀ ⨆ i, p i) ↔ βˆ€ (N : Subsemigroup M), (βˆ€ (i : ΞΉ), p i ≀ N) β†’ m ∈ N
M: Type u_2

N: Type ?u.21459

A: Type ?u.21462

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

ΞΉ: Sort u_1

p: ΞΉ β†’ Subsemigroup M

m: M


(m ∈ ⨆ i, p i) ↔ βˆ€ (N : Subsemigroup M), (βˆ€ (i : ΞΉ), p i ≀ N) β†’ m ∈ N
M: Type u_2

N: Type ?u.21459

A: Type ?u.21462

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

ΞΉ: Sort u_1

p: ΞΉ β†’ Subsemigroup M

m: M


(βˆ€ (b : Subsemigroup M), (βˆ€ (i : ΞΉ), p i ≀ b) β†’ closure {m} ≀ b) ↔ βˆ€ (N : Subsemigroup M), (βˆ€ (i : ΞΉ), p i ≀ N) β†’ m ∈ N
M: Type u_2

N: Type ?u.21459

A: Type ?u.21462

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

ΞΉ: Sort u_1

p: ΞΉ β†’ Subsemigroup M

m: M


(βˆ€ (b : Subsemigroup M), (βˆ€ (i : ΞΉ), p i ≀ b) β†’ closure {m} ≀ b) ↔ βˆ€ (N : Subsemigroup M), (βˆ€ (i : ΞΉ), p i ≀ N) β†’ m ∈ N
M: Type u_2

N: Type ?u.21459

A: Type ?u.21462

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

ΞΉ: Sort u_1

p: ΞΉ β†’ Subsemigroup M

m: M


(m ∈ ⨆ i, p i) ↔ βˆ€ (N : Subsemigroup M), (βˆ€ (i : ΞΉ), p i ≀ N) β†’ m ∈ N

Goals accomplished! πŸ™
#align subsemigroup.mem_supr
Subsemigroup.mem_iSup: βˆ€ {M : Type u_2} [inst : Mul M] {ΞΉ : Sort u_1} (p : ΞΉ β†’ Subsemigroup M) {m : M}, (m ∈ ⨆ i, p i) ↔ βˆ€ (N : Subsemigroup M), (βˆ€ (i : ΞΉ), p i ≀ N) β†’ m ∈ N
Subsemigroup.mem_iSup
#align add_subsemigroup.mem_supr
AddSubsemigroup.mem_iSup: βˆ€ {M : Type u_2} [inst : Add M] {ΞΉ : Sort u_1} (p : ΞΉ β†’ AddSubsemigroup M) {m : M}, (m ∈ ⨆ i, p i) ↔ βˆ€ (N : AddSubsemigroup M), (βˆ€ (i : ΞΉ), p i ≀ N) β†’ m ∈ N
AddSubsemigroup.mem_iSup
@[
to_additive: βˆ€ {M : Type u_2} [inst : Add M] {ΞΉ : Sort u_1} (p : ΞΉ β†’ AddSubsemigroup M), (⨆ i, p i) = AddSubsemigroup.closure (iUnion fun i => ↑(p i))
to_additive
] theorem
iSup_eq_closure: βˆ€ {ΞΉ : Sort u_1} (p : ΞΉ β†’ Subsemigroup M), (⨆ i, p i) = closure (iUnion fun i => ↑(p i))
iSup_eq_closure
{
ΞΉ: Sort u_1
ΞΉ
:
Sort _: Type ?u.22198
Sort
Sort _: Type ?u.22198
_
} (
p: ΞΉ β†’ Subsemigroup M
p
:
ΞΉ: Sort ?u.22198
ΞΉ
β†’
Subsemigroup: (M : Type ?u.22203) β†’ [inst : Mul M] β†’ Type ?u.22203
Subsemigroup
M: Type ?u.22167
M
) : (⨆
i: ?m.22220
i
,
p: ΞΉ β†’ Subsemigroup M
p
i: ?m.22220
i
) =
Subsemigroup.closure: {M : Type ?u.22247} β†’ [inst : Mul M] β†’ Set M β†’ Subsemigroup M
Subsemigroup.closure
(⋃
i: ?m.22257
i
, (
p: ΞΉ β†’ Subsemigroup M
p
i: ?m.22257
i
:
Set: Type ?u.22260 β†’ Type ?u.22260
Set
M: Type ?u.22167
M
)) :=

Goals accomplished! πŸ™
M: Type u_2

N: Type ?u.22170

A: Type ?u.22173

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

ΞΉ: Sort u_1

p: ΞΉ β†’ Subsemigroup M


(⨆ i, p i) = closure (iUnion fun i => ↑(p i))
M: Type u_2

N: Type ?u.22170

A: Type ?u.22173

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

ΞΉ: Sort u_1

p: ΞΉ β†’ Subsemigroup M


(⨆ i, p i) = closure (iUnion fun i => ↑(p i))
M: Type u_2

N: Type ?u.22170

A: Type ?u.22173

inst✝¹: Mul M

s: Set M

inst✝: Add A

t: Set A

S: Subsemigroup M

ΞΉ: Sort u_1

p: ΞΉ β†’ Subsemigroup M


(⨆ i, p i) = ⨆ i, closure ↑(p i)