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) 2019 Simon Hudon. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Simon Hudon, Yury Kudryashov

! This file was ported from Lean 3 source module algebra.free_monoid.basic
! leanprover-community/mathlib commit 657df4339ae6ceada048c8a2980fb10e393143ec
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathlib.Data.List.BigOperators.Basic

/-!
# Free monoid over a given alphabet

## Main definitions

* `FreeMonoid α`: free monoid over alphabet `α`; defined as a synonym for `List α`
  with multiplication given by `(++)`.
* `FreeMonoid.of`: embedding `α → FreeMonoid α` sending each element `x` to `[x]`;
* `FreeMonoid.lift`: natural equivalence between `α → M` and `FreeMonoid α →* M`
* `FreeMonoid.map`: embedding of `α → β` into `FreeMonoid α →* FreeMonoid β` given by `List.map`.
-/


variable {
α: Type ?u.16741
α
:
Type _: Type (?u.5665+1)
Type _
} {
β: Type ?u.5
β
:
Type _: Type (?u.12678+1)
Type _
} {
γ: Type ?u.1625
γ
:
Type _: Type (?u.29+1)
Type _
} {
M: Type ?u.11
M
:
Type _: Type (?u.11+1)
Type _
} [
Monoid: Type ?u.14 → Type ?u.14
Monoid
M: Type ?u.11
M
] {
N: Type ?u.38
N
:
Type _: Type (?u.55103+1)
Type _
} [
Monoid: Type ?u.16759 → Type ?u.16759
Monoid
N: Type ?u.43329
N
] /-- Free monoid over a given alphabet. -/ @[
to_additive: Type u_1 → Type u_1
to_additive
"Free nonabelian additive monoid over a given alphabet"] def
FreeMonoid: (α : ?m.44) → ?m.48 α
FreeMonoid
(
α: ?m.44
α
) :=
List: Type ?u.51 → Type ?u.51
List
α: ?m.44
α
#align free_monoid
FreeMonoid: Type u_1 → Type u_1
FreeMonoid
#align free_add_monoid
FreeAddMonoid: Type u_1 → Type u_1
FreeAddMonoid
namespace FreeMonoid -- Porting note: TODO. Check this is still needed @[
to_additive: {α : Type u_1} → [inst : DecidableEq α] → DecidableEq (FreeAddMonoid α)
to_additive
]
instance: {α : Type u_1} → [inst : DecidableEq α] → DecidableEq (FreeMonoid α)
instance
[
DecidableEq: Sort ?u.84 → Sort (max1?u.84)
DecidableEq
α: Type ?u.63
α
] :
DecidableEq: Sort ?u.93 → Sort (max1?u.93)
DecidableEq
(
FreeMonoid: Type ?u.94 → Type ?u.94
FreeMonoid
α: Type ?u.63
α
) :=
instDecidableEqList: {α : Type ?u.104} → [inst : DecidableEq α] → DecidableEq (List α)
instDecidableEqList
/-- The identity equivalence between `FreeMonoid α` and `List α`. -/ @[
to_additive: {α : Type u_1} → FreeAddMonoid α List α
to_additive
"The identity equivalence between `FreeAddMonoid α` and `List α`."] def
toList: FreeMonoid α List α
toList
:
FreeMonoid: Type ?u.405 → Type ?u.405
FreeMonoid
α: Type ?u.382
α
List: Type ?u.406 → Type ?u.406
List
α: Type ?u.382
α
:=
Equiv.refl: (α : Sort ?u.408) → α α
Equiv.refl
_: Sort ?u.408
_
#align free_monoid.to_list
FreeMonoid.toList: {α : Type u_1} → FreeMonoid α List α
FreeMonoid.toList
#align free_add_monoid.to_list
FreeAddMonoid.toList: {α : Type u_1} → FreeAddMonoid α List α
FreeAddMonoid.toList
/-- The identity equivalence between `List α` and `FreeMonoid α`. -/ @[
to_additive: {α : Type u_1} → List α FreeAddMonoid α
to_additive
"The identity equivalence between `List α` and `FreeAddMonoid α`."] def
ofList: {α : Type u_1} → List α FreeMonoid α
ofList
:
List: Type ?u.503 → Type ?u.503
List
α: Type ?u.480
α
FreeMonoid: Type ?u.504 → Type ?u.504
FreeMonoid
α: Type ?u.480
α
:=
Equiv.refl: (α : Sort ?u.506) → α α
Equiv.refl
_: Sort ?u.506
_
#align free_monoid.of_list
FreeMonoid.ofList: {α : Type u_1} → List α FreeMonoid α
FreeMonoid.ofList
#align free_add_monoid.of_list
FreeAddMonoid.ofList: {α : Type u_1} → List α FreeAddMonoid α
FreeAddMonoid.ofList
@[
to_additive: ∀ {α : Type u_1}, FreeAddMonoid.toList.symm = FreeAddMonoid.ofList
to_additive
(attr := simp)] theorem
toList_symm: ∀ {α : Type u_1}, toList.symm = ofList
toList_symm
: (@
toList: {α : Type ?u.597} → FreeMonoid α List α
toList
α: Type ?u.575
α
).
symm: {α : Sort ?u.599} → {β : Sort ?u.598} → α ββ α
symm
=
ofList: {α : Type ?u.607} → List α FreeMonoid α
ofList
:=
rfl: ∀ {α : Sort ?u.646} {a : α}, a = a
rfl
#align free_monoid.to_list_symm
FreeMonoid.toList_symm: ∀ {α : Type u_1}, toList.symm = ofList
FreeMonoid.toList_symm
#align free_add_monoid.to_list_symm
FreeAddMonoid.toList_symm: ∀ {α : Type u_1}, FreeAddMonoid.toList.symm = FreeAddMonoid.ofList
FreeAddMonoid.toList_symm
@[
to_additive: ∀ {α : Type u_1}, FreeAddMonoid.ofList.symm = FreeAddMonoid.toList
to_additive
(attr := simp)] theorem
ofList_symm: ∀ {α : Type u_1}, ofList.symm = toList
ofList_symm
: (@
ofList: {α : Type ?u.711} → List α FreeMonoid α
ofList
α: Type ?u.689
α
).
symm: {α : Sort ?u.713} → {β : Sort ?u.712} → α ββ α
symm
=
toList: {α : Type ?u.721} → FreeMonoid α List α
toList
:=
rfl: ∀ {α : Sort ?u.760} {a : α}, a = a
rfl
#align free_monoid.of_list_symm
FreeMonoid.ofList_symm: ∀ {α : Type u_1}, ofList.symm = toList
FreeMonoid.ofList_symm
#align free_add_monoid.of_list_symm
FreeAddMonoid.ofList_symm: ∀ {α : Type u_1}, FreeAddMonoid.ofList.symm = FreeAddMonoid.toList
FreeAddMonoid.ofList_symm
@[
to_additive: ∀ {α : Type u_1} (l : List α), FreeAddMonoid.toList (FreeAddMonoid.ofList l) = l
to_additive
(attr := simp)] theorem
toList_ofList: ∀ (l : List α), toList (ofList l) = l
toList_ofList
(
l: List α
l
:
List: Type ?u.824 → Type ?u.824
List
α: Type ?u.803
α
) :
toList: {α : Type ?u.828} → FreeMonoid α List α
toList
(
ofList: {α : Type ?u.906} → List α FreeMonoid α
ofList
l: List α
l
) =
l: List α
l
:=
rfl: ∀ {α : Sort ?u.992} {a : α}, a = a
rfl
#align free_monoid.to_list_of_list
FreeMonoid.toList_ofList: ∀ {α : Type u_1} (l : List α), toList (ofList l) = l
FreeMonoid.toList_ofList
#align free_add_monoid.to_list_of_list
FreeAddMonoid.toList_ofList: ∀ {α : Type u_1} (l : List α), FreeAddMonoid.toList (FreeAddMonoid.ofList l) = l
FreeAddMonoid.toList_ofList
@[
to_additive: ∀ {α : Type u_1} (xs : FreeAddMonoid α), FreeAddMonoid.ofList (FreeAddMonoid.toList xs) = xs
to_additive
(attr := simp)] theorem
ofList_toList: ∀ (xs : FreeMonoid α), ofList (toList xs) = xs
ofList_toList
(
xs: FreeMonoid α
xs
:
FreeMonoid: Type ?u.1079 → Type ?u.1079
FreeMonoid
α: Type ?u.1058
α
) :
ofList: {α : Type ?u.1083} → List α FreeMonoid α
ofList
(
toList: {α : Type ?u.1161} → FreeMonoid α List α
toList
xs: FreeMonoid α
xs
) =
xs: FreeMonoid α
xs
:=
rfl: ∀ {α : Sort ?u.1247} {a : α}, a = a
rfl
#align free_monoid.of_list_to_list
FreeMonoid.ofList_toList: ∀ {α : Type u_1} (xs : FreeMonoid α), ofList (toList xs) = xs
FreeMonoid.ofList_toList
#align free_add_monoid.of_list_to_list
FreeAddMonoid.ofList_toList: ∀ {α : Type u_1} (xs : FreeAddMonoid α), FreeAddMonoid.ofList (FreeAddMonoid.toList xs) = xs
FreeAddMonoid.ofList_toList
@[
to_additive: ∀ {α : Type u_1}, FreeAddMonoid.toList FreeAddMonoid.ofList = id
to_additive
(attr := simp)] theorem
toList_comp_ofList: toList ofList = id
toList_comp_ofList
: @
toList: {α : Type ?u.1341} → FreeMonoid α List α
toList
α: Type ?u.1313
α
ofList: {α : Type ?u.1422} → List α FreeMonoid α
ofList
=
id: {α : Sort ?u.1504} → αα
id
:=
rfl: ∀ {α : Sort ?u.1545} {a : α}, a = a
rfl
#align free_monoid.to_list_comp_of_list
FreeMonoid.toList_comp_ofList: ∀ {α : Type u_1}, toList ofList = id
FreeMonoid.toList_comp_ofList
#align free_add_monoid.to_list_comp_of_list
FreeAddMonoid.toList_comp_ofList: ∀ {α : Type u_1}, FreeAddMonoid.toList FreeAddMonoid.ofList = id
FreeAddMonoid.toList_comp_ofList
@[
to_additive: ∀ {α : Type u_1}, FreeAddMonoid.ofList FreeAddMonoid.toList = id
to_additive
(attr := simp)] theorem
ofList_comp_toList: ofList toList = id
ofList_comp_toList
: @
ofList: {α : Type ?u.1647} → List α FreeMonoid α
ofList
α: Type ?u.1619
α
toList: {α : Type ?u.1728} → FreeMonoid α List α
toList
=
id: {α : Sort ?u.1810} → αα
id
:=
rfl: ∀ {α : Sort ?u.1852} {a : α}, a = a
rfl
#align free_monoid.of_list_comp_to_list
FreeMonoid.ofList_comp_toList: ∀ {α : Type u_1}, ofList toList = id
FreeMonoid.ofList_comp_toList
#align free_add_monoid.of_list_comp_to_list
FreeAddMonoid.ofList_comp_toList: ∀ {α : Type u_1}, FreeAddMonoid.ofList FreeAddMonoid.toList = id
FreeAddMonoid.ofList_comp_toList
@[
to_additive: {α : Type u_1} → AddCancelMonoid (FreeAddMonoid α)
to_additive
]
instance: {α : Type u_1} → CancelMonoid (FreeMonoid α)
instance
:
CancelMonoid: Type ?u.1947 → Type ?u.1947
CancelMonoid
(
FreeMonoid: Type ?u.1948 → Type ?u.1948
FreeMonoid
α: Type ?u.1926
α
) where one :=
ofList: {α : Type ?u.3073} → List α FreeMonoid α
ofList
[]: List ?m.3152
[]
mul
x: ?m.1966
x
y: ?m.1969
y
:=
ofList: {α : Type ?u.1971} → List α FreeMonoid α
ofList
(
toList: {α : Type ?u.2052} → FreeMonoid α List α
toList
x: ?m.1966
x
++
toList: {α : Type ?u.2132} → FreeMonoid α List α
toList
y: ?m.1969
y
) mul_one :=
List.append_nil: ∀ {α : Type ?u.3192} (as : List α), as ++ [] = as
List.append_nil
one_mul :=
List.nil_append: ∀ {α : Type ?u.3155} (as : List α), [] ++ as = as
List.nil_append
mul_assoc :=
List.append_assoc: ∀ {α : Type ?u.2277} (as bs cs : List α), as ++ bs ++ cs = as ++ (bs ++ cs)
List.append_assoc
mul_left_cancel
_: ?m.2807
_
_: ?m.2810
_
_: ?m.2813
_
:=
List.append_left_cancel: ∀ {α : Type ?u.2815} {s t₁ t₂ : List α}, s ++ t₁ = s ++ t₂t₁ = t₂
List.append_left_cancel
mul_right_cancel
_: ?m.3265
_
_: ?m.3268
_
_: ?m.3271
_
:=
List.append_right_cancel: ∀ {α : Type ?u.3273} {s₁ s₂ t : List α}, s₁ ++ t = s₂ ++ ts₁ = s₂
List.append_right_cancel
@[
to_additive: {α : Type u_1} → Inhabited (FreeAddMonoid α)
to_additive
]
instance: {α : Type u_1} → Inhabited (FreeMonoid α)
instance
:
Inhabited: Sort ?u.4709 → Sort (max1?u.4709)
Inhabited
(
FreeMonoid: Type ?u.4710 → Type ?u.4710
FreeMonoid
α: Type ?u.4688
α
) := ⟨
1: ?m.4718
1
⟩ @[
to_additive: ∀ {α : Type u_1}, FreeAddMonoid.toList 0 = []
to_additive
(attr := simp)] theorem
toList_one: toList 1 = []
toList_one
:
toList: {α : Type ?u.5213} → FreeMonoid α List α
toList
(
1: ?m.5294
1
:
FreeMonoid: Type ?u.5292 → Type ?u.5292
FreeMonoid
α: Type ?u.5191
α
) =
[]: List ?m.5575
[]
:=
rfl: ∀ {α : Sort ?u.5610} {a : α}, a = a
rfl
#align free_monoid.to_list_one
FreeMonoid.toList_one: ∀ {α : Type u_1}, toList 1 = []
FreeMonoid.toList_one
#align free_add_monoid.to_list_zero
FreeAddMonoid.toList_zero: ∀ {α : Type u_1}, FreeAddMonoid.toList 0 = []
FreeAddMonoid.toList_zero
@[
to_additive: ∀ {α : Type u_1}, FreeAddMonoid.ofList [] = 0
to_additive
(attr := simp)] theorem
ofList_nil: ofList [] = 1
ofList_nil
:
ofList: {α : Type ?u.5687} → List α FreeMonoid α
ofList
(
[]: List ?m.5768
[]
:
List: Type ?u.5766 → Type ?u.5766
List
α: Type ?u.5665
α
) =
1: ?m.5771
1
:=
rfl: ∀ {α : Sort ?u.6139} {a : α}, a = a
rfl
#align free_monoid.of_list_nil
FreeMonoid.ofList_nil: ∀ {α : Type u_1}, ofList [] = 1
FreeMonoid.ofList_nil
#align free_add_monoid.of_list_nil
FreeAddMonoid.ofList_nil: ∀ {α : Type u_1}, FreeAddMonoid.ofList [] = 0
FreeAddMonoid.ofList_nil
@[
to_additive: ∀ {α : Type u_1} (xs ys : FreeAddMonoid α), FreeAddMonoid.toList (xs + ys) = FreeAddMonoid.toList xs ++ FreeAddMonoid.toList ys
to_additive
(attr := simp)] theorem
toList_mul: ∀ (xs ys : FreeMonoid α), toList (xs * ys) = toList xs ++ toList ys
toList_mul
(
xs: FreeMonoid α
xs
ys: FreeMonoid α
ys
:
FreeMonoid: Type ?u.6211 → Type ?u.6211
FreeMonoid
α: Type ?u.6190
α
) :
toList: {α : Type ?u.6218} → FreeMonoid α List α
toList
(
xs: FreeMonoid α
xs
*
ys: FreeMonoid α
ys
) =
toList: {α : Type ?u.6724} → FreeMonoid α List α
toList
xs: FreeMonoid α
xs
++
toList: {α : Type ?u.6803} → FreeMonoid α List α
toList
ys: FreeMonoid α
ys
:=
rfl: ∀ {α : Sort ?u.6941} {a : α}, a = a
rfl
#align free_monoid.to_list_mul
FreeMonoid.toList_mul: ∀ {α : Type u_1} (xs ys : FreeMonoid α), toList (xs * ys) = toList xs ++ toList ys
FreeMonoid.toList_mul
#align free_add_monoid.to_list_add
FreeAddMonoid.toList_add: ∀ {α : Type u_1} (xs ys : FreeAddMonoid α), FreeAddMonoid.toList (xs + ys) = FreeAddMonoid.toList xs ++ FreeAddMonoid.toList ys
FreeAddMonoid.toList_add
@[
to_additive: ∀ {α : Type u_1} (xs ys : List α), FreeAddMonoid.ofList (xs ++ ys) = FreeAddMonoid.ofList xs + FreeAddMonoid.ofList ys
to_additive
(attr := simp)] theorem
ofList_append: ∀ {α : Type u_1} (xs ys : List α), ofList (xs ++ ys) = ofList xs * ofList ys
ofList_append
(
xs: List α
xs
ys: List α
ys
:
List: Type ?u.7082 → Type ?u.7082
List
α: Type ?u.7058
α
) :
ofList: {α : Type ?u.7086} → List α FreeMonoid α
ofList
(
xs: List α
xs
++
ys: List α
ys
) =
ofList: {α : Type ?u.7220} → List α FreeMonoid α
ofList
xs: List α
xs
*
ofList: {α : Type ?u.7299} → List α FreeMonoid α
ofList
ys: List α
ys
:=
rfl: ∀ {α : Sort ?u.8291} {a : α}, a = a
rfl
#align free_monoid.of_list_append
FreeMonoid.ofList_append: ∀ {α : Type u_1} (xs ys : List α), ofList (xs ++ ys) = ofList xs * ofList ys
FreeMonoid.ofList_append
#align free_add_monoid.of_list_append
FreeAddMonoid.ofList_append: ∀ {α : Type u_1} (xs ys : List α), FreeAddMonoid.ofList (xs ++ ys) = FreeAddMonoid.ofList xs + FreeAddMonoid.ofList ys
FreeAddMonoid.ofList_append
@[
to_additive: ∀ {α : Type u_1} (xs : List (FreeAddMonoid α)), FreeAddMonoid.toList (List.sum xs) = List.join (List.map (FreeAddMonoid.toList) xs)
to_additive
(attr := simp)] theorem
toList_prod: ∀ {α : Type u_1} (xs : List (FreeMonoid α)), toList (List.prod xs) = List.join (List.map (toList) xs)
toList_prod
(
xs: List (FreeMonoid α)
xs
:
List: Type ?u.8396 → Type ?u.8396
List
(
FreeMonoid: Type ?u.8397 → Type ?u.8397
FreeMonoid
α: Type ?u.8375
α
)) :
toList: {α : Type ?u.8401} → FreeMonoid α List α
toList
xs: List (FreeMonoid α)
xs
.
prod: {α : Type ?u.8479} → [inst : Mul α] → [inst : One α] → List αα
prod
= (
xs: List (FreeMonoid α)
xs
.
map: {α : Type ?u.9084} → {β : Type ?u.9083} → (αβ) → List αList β
map
toList: {α : Type ?u.9091} → FreeMonoid α List α
toList
).
join: {α : Type ?u.9171} → List (List α)List α
join
:=

Goals accomplished! 🐙
α: Type u_1

β: Type ?u.8378

γ: Type ?u.8381

M: Type ?u.8384

inst✝¹: Monoid M

N: Type ?u.8390

inst✝: Monoid N

xs: List (FreeMonoid α)


toList (List.prod xs) = List.join (List.map (toList) xs)
α: Type u_1

β: Type ?u.8378

γ: Type ?u.8381

M: Type ?u.8384

inst✝¹: Monoid M

N: Type ?u.8390

inst✝: Monoid N


nil
toList (List.prod []) = List.join (List.map toList [])
α: Type u_1

β: Type ?u.8378

γ: Type ?u.8381

M: Type ?u.8384

inst✝¹: Monoid M

N: Type ?u.8390

inst✝: Monoid N

head✝: FreeMonoid α

tail✝: List (FreeMonoid α)

tail_ih✝: toList (List.prod tail✝) = List.join (List.map (toList) tail✝)


cons
toList (List.prod (head✝ :: tail✝)) = List.join (List.map (toList) (head✝ :: tail✝))
α: Type u_1

β: Type ?u.8378

γ: Type ?u.8381

M: Type ?u.8384

inst✝¹: Monoid M

N: Type ?u.8390

inst✝: Monoid N

xs: List (FreeMonoid α)


toList (List.prod xs) = List.join (List.map (toList) xs)
α: Type u_1

β: Type ?u.8378

γ: Type ?u.8381

M: Type ?u.8384

inst✝¹: Monoid M

N: Type ?u.8390

inst✝: Monoid N


nil
toList (List.prod []) = List.join (List.map toList [])
α: Type u_1

β: Type ?u.8378

γ: Type ?u.8381

M: Type ?u.8384

inst✝¹: Monoid M

N: Type ?u.8390

inst✝: Monoid N

head✝: FreeMonoid α

tail✝: List (FreeMonoid α)

tail_ih✝: toList (List.prod tail✝) = List.join (List.map (toList) tail✝)


cons
toList (List.prod (head✝ :: tail✝)) = List.join (List.map (toList) (head✝ :: tail✝))
α: Type u_1

β: Type ?u.8378

γ: Type ?u.8381

M: Type ?u.8384

inst✝¹: Monoid M

N: Type ?u.8390

inst✝: Monoid N

xs: List (FreeMonoid α)


toList (List.prod xs) = List.join (List.map (toList) xs)

Goals accomplished! 🐙
#align free_monoid.to_list_prod
FreeMonoid.toList_prod: ∀ {α : Type u_1} (xs : List (FreeMonoid α)), toList (List.prod xs) = List.join (List.map (toList) xs)
FreeMonoid.toList_prod
#align free_add_monoid.to_list_sum
FreeAddMonoid.toList_sum: ∀ {α : Type u_1} (xs : List (FreeAddMonoid α)), FreeAddMonoid.toList (List.sum xs) = List.join (List.map (FreeAddMonoid.toList) xs)
FreeAddMonoid.toList_sum
@[
to_additive: ∀ {α : Type u_1} (xs : List (List α)), FreeAddMonoid.ofList (List.join xs) = List.sum (List.map (FreeAddMonoid.ofList) xs)
to_additive
(attr := simp)] theorem
ofList_join: ∀ (xs : List (List α)), ofList (List.join xs) = List.prod (List.map (ofList) xs)
ofList_join
(
xs: List (List α)
xs
:
List: Type ?u.10913 → Type ?u.10913
List
(
List: Type ?u.10914 → Type ?u.10914
List
α: Type ?u.10892
α
)) :
ofList: {α : Type ?u.10918} → List α FreeMonoid α
ofList
xs: List (List α)
xs
.
join: {α : Type ?u.10996} → List (List α)List α
join
= (
xs: List (List α)
xs
.
map: {α : Type ?u.11003} → {β : Type ?u.11002} → (αβ) → List αList β
map
ofList: {α : Type ?u.11010} → List α FreeMonoid α
ofList
).
prod: {α : Type ?u.11090} → [inst : Mul α] → [inst : One α] → List αα
prod
:=
toList: {α : Type ?u.11695} → FreeMonoid α List α
toList
.
injective: ∀ {α : Sort ?u.11698} {β : Sort ?u.11697} (e : α β), Function.Injective e
injective
<|

Goals accomplished! 🐙
α: Type u_1

β: Type ?u.10895

γ: Type ?u.10898

M: Type ?u.10901

inst✝¹: Monoid M

N: Type ?u.10907

inst✝: Monoid N

xs: List (List α)


toList (ofList (List.join xs)) = toList (List.prod (List.map (ofList) xs))

Goals accomplished! 🐙
#align free_monoid.of_list_join
FreeMonoid.ofList_join: ∀ {α : Type u_1} (xs : List (List α)), ofList (List.join xs) = List.prod (List.map (ofList) xs)
FreeMonoid.ofList_join
#align free_add_monoid.of_list_join
FreeAddMonoid.ofList_join: ∀ {α : Type u_1} (xs : List (List α)), FreeAddMonoid.ofList (List.join xs) = List.sum (List.map (FreeAddMonoid.ofList) xs)
FreeAddMonoid.ofList_join
/-- Embeds an element of `α` into `FreeMonoid α` as a singleton list. -/ @[
to_additive: {α : Type u_1} → αFreeAddMonoid α
to_additive
"Embeds an element of `α` into `FreeAddMonoid α` as a singleton list."] def
of: {α : Type u_1} → αFreeMonoid α
of
(
x: α
x
:
α: Type ?u.12090
α
) :
FreeMonoid: Type ?u.12113 → Type ?u.12113
FreeMonoid
α: Type ?u.12090
α
:=
ofList: {α : Type ?u.12117} → List α FreeMonoid α
ofList
[
x: α
x
] #align free_monoid.of
FreeMonoid.of: {α : Type u_1} → αFreeMonoid α
FreeMonoid.of
#align free_add_monoid.of
FreeAddMonoid.of: {α : Type u_1} → αFreeAddMonoid α
FreeAddMonoid.of
@[
to_additive: ∀ {α : Type u_1} (x : α), FreeAddMonoid.toList (FreeAddMonoid.of x) = [x]
to_additive
(attr := simp)] theorem
toList_of: ∀ (x : α), toList (of x) = [x]
toList_of
(
x: α
x
:
α: Type ?u.12359
α
) :
toList: {α : Type ?u.12383} → FreeMonoid α List α
toList
(
of: {α : Type ?u.12461} → αFreeMonoid α
of
x: α
x
) = [
x: α
x
] :=
rfl: ∀ {α : Sort ?u.12474} {a : α}, a = a
rfl
#align free_monoid.to_list_of
FreeMonoid.toList_of: ∀ {α : Type u_1} (x : α), toList (of x) = [x]
FreeMonoid.toList_of
#align free_add_monoid.to_list_of
FreeAddMonoid.toList_of: ∀ {α : Type u_1} (x : α), FreeAddMonoid.toList (FreeAddMonoid.of x) = [x]
FreeAddMonoid.toList_of
@[
to_additive: ∀ {α : Type u_1} (x : α), FreeAddMonoid.ofList [x] = FreeAddMonoid.of x
to_additive
] theorem
ofList_singleton: ∀ {α : Type u_1} (x : α), ofList [x] = of x
ofList_singleton
(
x: α
x
:
α: Type ?u.12536
α
) :
ofList: {α : Type ?u.12560} → List α FreeMonoid α
ofList
[
x: α
x
] =
of: {α : Type ?u.12644} → αFreeMonoid α
of
x: α
x
:=
rfl: ∀ {α : Sort ?u.12651} {a : α}, a = a
rfl
#align free_monoid.of_list_singleton
FreeMonoid.ofList_singleton: ∀ {α : Type u_1} (x : α), ofList [x] = of x
FreeMonoid.ofList_singleton
#align free_add_monoid.of_list_singleton
FreeAddMonoid.ofList_singleton: ∀ {α : Type u_1} (x : α), FreeAddMonoid.ofList [x] = FreeAddMonoid.of x
FreeAddMonoid.ofList_singleton
@[
to_additive: ∀ {α : Type u_1} (x : α) (xs : List α), FreeAddMonoid.ofList (x :: xs) = FreeAddMonoid.of x + FreeAddMonoid.ofList xs
to_additive
(attr := simp)] theorem
ofList_cons: ∀ (x : α) (xs : List α), ofList (x :: xs) = of x * ofList xs
ofList_cons
(
x: α
x
:
α: Type ?u.12675
α
) (
xs: List α
xs
:
List: Type ?u.12698 → Type ?u.12698
List
α: Type ?u.12675
α
) :
ofList: {α : Type ?u.12702} → List α FreeMonoid α
ofList
(
x: α
x
::
xs: List α
xs
) =
of: {α : Type ?u.12787} → αFreeMonoid α
of
x: α
x
*
ofList: {α : Type ?u.12789} → List α FreeMonoid α
ofList
xs: List α
xs
:=
rfl: ∀ {α : Sort ?u.13676} {a : α}, a = a
rfl
#align free_monoid.of_list_cons
FreeMonoid.ofList_cons: ∀ {α : Type u_1} (x : α) (xs : List α), ofList (x :: xs) = of x * ofList xs
FreeMonoid.ofList_cons
#align free_add_monoid.of_list_cons
FreeAddMonoid.ofList_cons: ∀ {α : Type u_1} (x : α) (xs : List α), FreeAddMonoid.ofList (x :: xs) = FreeAddMonoid.of x + FreeAddMonoid.ofList xs
FreeAddMonoid.ofList_cons
@[
to_additive: ∀ {α : Type u_1} (x : α) (xs : FreeAddMonoid α), FreeAddMonoid.toList (FreeAddMonoid.of x + xs) = x :: FreeAddMonoid.toList xs
to_additive
] theorem
toList_of_mul: ∀ (x : α) (xs : FreeMonoid α), toList (of x * xs) = x :: toList xs
toList_of_mul
(
x: α
x
:
α: Type ?u.13768
α
) (
xs: FreeMonoid α
xs
:
FreeMonoid: Type ?u.13791 → Type ?u.13791
FreeMonoid
α: Type ?u.13768
α
) :
toList: {α : Type ?u.13795} → FreeMonoid α List α
toList
(
of: {α : Type ?u.13876} → αFreeMonoid α
of
x: α
x
*
xs: FreeMonoid α
xs
) =
x: α
x
::
toList: {α : Type ?u.14302} → FreeMonoid α List α
toList
xs: FreeMonoid α
xs
:=
rfl: ∀ {α : Sort ?u.14387} {a : α}, a = a
rfl
#align free_monoid.to_list_of_mul
FreeMonoid.toList_of_mul: ∀ {α : Type u_1} (x : α) (xs : FreeMonoid α), toList (of x * xs) = x :: toList xs
FreeMonoid.toList_of_mul
#align free_add_monoid.to_list_of_add
FreeAddMonoid.toList_of_add: ∀ {α : Type u_1} (x : α) (xs : FreeAddMonoid α), FreeAddMonoid.toList (FreeAddMonoid.of x + xs) = x :: FreeAddMonoid.toList xs
FreeAddMonoid.toList_of_add
@[
to_additive: ∀ {α : Type u_1}, Function.Injective FreeAddMonoid.of
to_additive
] theorem
of_injective: ∀ {α : Type u_1}, Function.Injective of
of_injective
:
Function.Injective: {α : Sort ?u.14455} → {β : Sort ?u.14454} → (αβ) → Prop
Function.Injective
(@
of: {α : Type ?u.14458} → αFreeMonoid α
of
α: Type ?u.14433
α
) :=
List.singleton_injective: ∀ {α : Type ?u.14463}, Function.Injective fun a => [a]
List.singleton_injective
#align free_monoid.of_injective
FreeMonoid.of_injective: ∀ {α : Type u_1}, Function.Injective of
FreeMonoid.of_injective
#align free_add_monoid.of_injective
FreeAddMonoid.of_injective: ∀ {α : Type u_1}, Function.Injective FreeAddMonoid.of
FreeAddMonoid.of_injective
/-- Recursor for `FreeMonoid` using `1` and `FreeMonoid.of x * xs` instead of `[]` and `x :: xs`. -/ @[
to_additive: {α : Type u_1} → {C : FreeAddMonoid αSort u_2} → (xs : FreeAddMonoid α) → C 0((x : α) → (xs : FreeAddMonoid α) → C xsC (FreeAddMonoid.of x + xs)) → C xs
to_additive
(attr := elab_as_elim) "Recursor for `FreeAddMonoid` using `0` and `FreeAddMonoid.of x + xs` instead of `[]` and `x :: xs`."] -- Porting note: change from `List.recOn` to `List.rec` since only the latter is computable def
recOn: {C : FreeMonoid αSort ?u.14504} → (xs : FreeMonoid α) → C 1((x : α) → (xs : FreeMonoid α) → C xsC (of x * xs)) → C xs
recOn
{
C: FreeMonoid αSort ?u.14504
C
:
FreeMonoid: Type ?u.14502 → Type ?u.14502
FreeMonoid
α: Type ?u.14480
α
Sort _: Type ?u.14504
Sort
Sort _: Type ?u.14504
_
} (
xs: FreeMonoid α
xs
:
FreeMonoid: Type ?u.14507 → Type ?u.14507
FreeMonoid
α: Type ?u.14480
α
) (
h0: C 1
h0
:
C: FreeMonoid αSort ?u.14504
C
1: ?m.14511
1
) (
ih: (x : ?m.14793) → (xs : FreeMonoid α) → C xsC (of x * xs)
ih
: ∀
x: ?m.14793
x
xs: ?m.14796
xs
,
C: FreeMonoid αSort ?u.14504
C
xs: ?m.14796
xs
C: FreeMonoid αSort ?u.14504
C
(
of: {α : Type ?u.14804} → αFreeMonoid α
of
x: ?m.14793
x
*
xs: ?m.14796
xs
)) :
C: FreeMonoid αSort ?u.14504
C
xs: FreeMonoid α
xs
:=
List.rec: {α : Type ?u.15210} → {motive : List αSort ?u.15211} → motive []((head : α) → (tail : List α) → motive tailmotive (head :: tail)) → (t : List α) → motive t
List.rec
h0: C 1
h0
ih: (x : α) → (xs : FreeMonoid α) → C xsC (of x * xs)
ih
xs: FreeMonoid α
xs
#align free_monoid.rec_on
FreeMonoid.recOn: {α : Type u_1} → {C : FreeMonoid αSort u_2} → (xs : FreeMonoid α) → C 1((x : α) → (xs : FreeMonoid α) → C xsC (of x * xs)) → C xs
FreeMonoid.recOn
#align free_add_monoid.rec_on
FreeAddMonoid.recOn: {α : Type u_1} → {C : FreeAddMonoid αSort u_2} → (xs : FreeAddMonoid α) → C 0((x : α) → (xs : FreeAddMonoid α) → C xsC (FreeAddMonoid.of x + xs)) → C xs
FreeAddMonoid.recOn
@[
to_additive: ∀ {α : Type u_1} {C : FreeAddMonoid αSort u_2} (h0 : C 0) (ih : (x : α) → (xs : FreeAddMonoid α) → C xsC (FreeAddMonoid.of x + xs)), FreeAddMonoid.recOn 0 h0 ih = h0
to_additive
(attr := simp)] theorem
recOn_one: ∀ {C : FreeMonoid αSort u_2} (h0 : C 1) (ih : (x : α) → (xs : FreeMonoid α) → C xsC (of x * xs)), recOn 1 h0 ih = h0
recOn_one
{
C: FreeMonoid αSort u_2
C
:
FreeMonoid: Type ?u.15615 → Type ?u.15615
FreeMonoid
α: Type ?u.15593
α
Sort _: Type ?u.15617
Sort
Sort _: Type ?u.15617
_
} (
h0: C 1
h0
:
C: FreeMonoid αSort ?u.15617
C
1: ?m.15621
1
) (
ih: (x : α) → (xs : FreeMonoid α) → C xsC (of x * xs)
ih
: ∀
x: ?m.15903
x
xs: ?m.15906
xs
,
C: FreeMonoid αSort ?u.15617
C
xs: ?m.15906
xs
C: FreeMonoid αSort ?u.15617
C
(
of: {α : Type ?u.15914} → αFreeMonoid α
of
x: ?m.15903
x
*
xs: ?m.15906
xs
)) : @
recOn: {α : Type ?u.15960} → {C : FreeMonoid αSort ?u.15959} → (xs : FreeMonoid α) → C 1((x : α) → (xs : FreeMonoid α) → C xsC (of x * xs)) → C xs
recOn
α: Type ?u.15593
α
C: FreeMonoid αSort ?u.15617
C
1: ?m.15965
1
h0: C 1
h0
ih: (x : ?m.15903) → (xs : FreeMonoid α) → C xsC (of x * xs)
ih
=
h0: C 1
h0
:=
rfl: ∀ {α : Sort ?u.16656} {a : α}, a = a
rfl
#align free_monoid.rec_on_one
FreeMonoid.recOn_one: ∀ {α : Type u_1} {C : FreeMonoid αSort u_2} (h0 : C 1) (ih : (x : α) → (xs : FreeMonoid α) → C xsC (of x * xs)), recOn 1 h0 ih = h0
FreeMonoid.recOn_one
#align free_add_monoid.rec_on_zero
FreeAddMonoid.recOn_zero: ∀ {α : Type u_1} {C : FreeAddMonoid αSort u_2} (h0 : C 0) (ih : (x : α) → (xs : FreeAddMonoid α) → C xsC (FreeAddMonoid.of x + xs)), FreeAddMonoid.recOn 0 h0 ih = h0
FreeAddMonoid.recOn_zero
@[
to_additive: ∀ {α : Type u_1} {C : FreeAddMonoid αSort u_2} (x : α) (xs : FreeAddMonoid α) (h0 : C 0) (ih : (x : α) → (xs : FreeAddMonoid α) → C xsC (FreeAddMonoid.of x + xs)), FreeAddMonoid.recOn (FreeAddMonoid.of x + xs) h0 ih = ih x xs (FreeAddMonoid.recOn xs h0 ih)
to_additive
(attr := simp)] theorem
recOn_of_mul: ∀ {C : FreeMonoid αSort u_2} (x : α) (xs : FreeMonoid α) (h0 : C 1) (ih : (x : α) → (xs : FreeMonoid α) → C xsC (of x * xs)), recOn (of x * xs) h0 ih = ih x xs (recOn xs h0 ih)
recOn_of_mul
{
C: FreeMonoid αSort u_2
C
:
FreeMonoid: Type ?u.16763 → Type ?u.16763
FreeMonoid
α: Type ?u.16741
α
Sort _: Type ?u.16765
Sort
Sort _: Type ?u.16765
_
} (
x: α
x
:
α: Type ?u.16741
α
) (
xs: FreeMonoid α
xs
:
FreeMonoid: Type ?u.16770 → Type ?u.16770
FreeMonoid
α: Type ?u.16741
α
) (
h0: C 1
h0
:
C: FreeMonoid αSort ?u.16765
C
1: ?m.16774
1
) (
ih: (x : ?m.17056) → (xs : FreeMonoid α) → C xsC (of x * xs)
ih
: ∀
x: ?m.17056
x
xs: ?m.17059
xs
,
C: FreeMonoid αSort ?u.16765
C
xs: ?m.17059
xs
C: FreeMonoid αSort ?u.16765
C
(
of: {α : Type ?u.17067} → αFreeMonoid α
of
x: ?m.17056
x
*
xs: ?m.17059
xs
)) : @
recOn: {α : Type ?u.17113} → {C : FreeMonoid αSort ?u.17112} → (xs : FreeMonoid α) → C 1((x : α) → (xs : FreeMonoid α) → C xsC (of x * xs)) → C xs
recOn
α: Type ?u.16741
α
C: FreeMonoid αSort ?u.16765
C
(
of: {α : Type ?u.17120} → αFreeMonoid α
of
x: α
x
*
xs: FreeMonoid α
xs
)
h0: C 1
h0
ih: (x : ?m.17056) → (xs : FreeMonoid α) → C xsC (of x * xs)
ih
=
ih: (x : ?m.17056) → (xs : FreeMonoid α) → C xsC (of x * xs)
ih
x: α
x
xs: FreeMonoid α
xs
(
recOn: {α : Type ?u.18114} → {C : FreeMonoid αSort ?u.18113} → (xs : FreeMonoid α) → C 1((x : α) → (xs : FreeMonoid α) → C xsC (of x * xs)) → C xs
recOn
xs: FreeMonoid α
xs
h0: C 1
h0
ih: (x : ?m.17056) → (xs : FreeMonoid α) → C xsC (of x * xs)
ih
) :=
rfl: ∀ {α : Sort ?u.18157} {a : α}, a = a
rfl
#align free_monoid.rec_on_of_mul
FreeMonoid.recOn_of_mul: ∀ {α : Type u_1} {C : FreeMonoid αSort u_2} (x : α) (xs : FreeMonoid α) (h0 : C 1) (ih : (x : α) → (xs : FreeMonoid α) → C xsC (of x * xs)), recOn (of x * xs) h0 ih = ih x xs (recOn xs h0 ih)
FreeMonoid.recOn_of_mul
#align free_add_monoid.rec_on_of_add
FreeAddMonoid.recOn_of_add: ∀ {α : Type u_1} {C : FreeAddMonoid αSort u_2} (x : α) (xs : FreeAddMonoid α) (h0 : C 0) (ih : (x : α) → (xs : FreeAddMonoid α) → C xsC (FreeAddMonoid.of x + xs)), FreeAddMonoid.recOn (FreeAddMonoid.of x + xs) h0 ih = ih x xs (FreeAddMonoid.recOn xs h0 ih)
FreeAddMonoid.recOn_of_add
/-- A version of `List.cases_on` for `FreeMonoid` using `1` and `FreeMonoid.of x * xs` instead of `[]` and `x :: xs`. -/ @[
to_additive: {α : Type u_1} → {C : FreeAddMonoid αSort u_2} → (xs : FreeAddMonoid α) → C 0((x : α) → (xs : FreeAddMonoid α) → C (FreeAddMonoid.of x + xs)) → C xs
to_additive
(attr := elab_as_elim) "A version of `List.casesOn` for `FreeAddMonoid` using `0` and `FreeAddMonoid.of x + xs` instead of `[]` and `x :: xs`."] def
casesOn: {α : Type u_1} → {C : FreeMonoid αSort u_2} → (xs : FreeMonoid α) → C 1((x : α) → (xs : FreeMonoid α) → C (of x * xs)) → C xs
casesOn
{
C: FreeMonoid αSort ?u.18335
C
:
FreeMonoid: Type ?u.18333 → Type ?u.18333
FreeMonoid
α: Type ?u.18311
α
Sort _: Type ?u.18335
Sort
Sort _: Type ?u.18335
_
} (
xs: FreeMonoid α
xs
:
FreeMonoid: Type ?u.18338 → Type ?u.18338
FreeMonoid
α: Type ?u.18311
α
) (
h0: C 1
h0
:
C: FreeMonoid αSort ?u.18335
C
1: ?m.18342
1
) (
ih: (x : α) → (xs : FreeMonoid α) → C (of x * xs)
ih
: ∀
x: ?m.18624
x
xs: ?m.18627
xs
,
C: FreeMonoid αSort ?u.18335
C
(
of: {α : Type ?u.18633} → αFreeMonoid α
of
x: ?m.18624
x
*
xs: ?m.18627
xs
)) :
C: FreeMonoid αSort ?u.18335
C
xs: FreeMonoid α
xs
:=
List.casesOn: {α : Type ?u.19043} → {motive : List αSort ?u.19044} → (t : List α) → motive []((head : α) → (tail : List α) → motive (head :: tail)) → motive t
List.casesOn
xs: FreeMonoid α
xs
h0: C 1
h0
ih: (x : α) → (xs : FreeMonoid α) → C (of x * xs)
ih
#align free_monoid.cases_on
FreeMonoid.casesOn: {α : Type u_1} → {C : FreeMonoid αSort u_2} → (xs : FreeMonoid α) → C 1((x : α) → (xs : FreeMonoid α) → C (of x * xs)) → C xs
FreeMonoid.casesOn
#align free_add_monoid.cases_on
FreeAddMonoid.casesOn: {α : Type u_1} → {C : FreeAddMonoid αSort u_2} → (xs : FreeAddMonoid α) → C 0((x : α) → (xs : FreeAddMonoid α) → C (FreeAddMonoid.of x + xs)) → C xs
FreeAddMonoid.casesOn
@[
to_additive: ∀ {α : Type u_1} {C : FreeAddMonoid αSort u_2} (h0 : C 0) (ih : (x : α) → (xs : FreeAddMonoid α) → C (FreeAddMonoid.of x + xs)), FreeAddMonoid.casesOn 0 h0 ih = h0
to_additive
(attr := simp)] theorem
casesOn_one: ∀ {C : FreeMonoid αSort u_2} (h0 : C 1) (ih : (x : α) → (xs : FreeMonoid α) → C (of x * xs)), casesOn 1 h0 ih = h0
casesOn_one
{
C: FreeMonoid αSort u_2
C
:
FreeMonoid: Type ?u.19408 → Type ?u.19408
FreeMonoid
α: Type ?u.19386
α
Sort _: Type ?u.19410
Sort
Sort _: Type ?u.19410
_
} (
h0: C 1
h0
:
C: FreeMonoid αSort ?u.19410
C
1: ?m.19414
1
) (
ih: (x : ?m.19696) → (xs : ?m.19747 x) → C (of x * xs)
ih
: ∀
x: ?m.19696
x
xs: ?m.19699
xs
,
C: FreeMonoid αSort ?u.19410
C
(
of: {α : Type ?u.19705} → αFreeMonoid α
of
x: ?m.19696
x
*
xs: ?m.19699
xs
)) : @
casesOn: {α : Type ?u.19753} → {C : FreeMonoid αSort ?u.19752} → (xs : FreeMonoid α) → C 1((x : α) → (xs : FreeMonoid α) → C (of x * xs)) → C xs
casesOn
α: Type ?u.19386
α
C: FreeMonoid αSort ?u.19410
C
1: ?m.19758
1
h0: C 1
h0
ih: (x : ?m.19696) → (xs : ?m.19747 x) → C (of x * xs)
ih
=
h0: C 1
h0
:=
rfl: ∀ {α : Sort ?u.20448} {a : α}, a = a
rfl
#align free_monoid.cases_on_one
FreeMonoid.casesOn_one: ∀ {α : Type u_1} {C : FreeMonoid αSort u_2} (h0 : C 1) (ih : (x : α) → (xs : FreeMonoid α) → C (of x * xs)), casesOn 1 h0 ih = h0
FreeMonoid.casesOn_one
#align free_add_monoid.cases_on_zero
FreeAddMonoid.casesOn_zero: ∀ {α : Type u_1} {C : FreeAddMonoid αSort u_2} (h0 : C 0) (ih : (x : α) → (xs : FreeAddMonoid α) → C (FreeAddMonoid.of x + xs)), FreeAddMonoid.casesOn 0 h0 ih = h0
FreeAddMonoid.casesOn_zero
@[
to_additive: ∀ {α : Type u_1} {C : FreeAddMonoid αSort u_2} (x : α) (xs : FreeAddMonoid α) (h0 : C 0) (ih : (x : α) → (xs : FreeAddMonoid α) → C (FreeAddMonoid.of x + xs)), FreeAddMonoid.casesOn (FreeAddMonoid.of x + xs) h0 ih = ih x xs
to_additive
(attr := simp)] theorem
casesOn_of_mul: ∀ {α : Type u_1} {C : FreeMonoid αSort u_2} (x : α) (xs : FreeMonoid α) (h0 : C 1) (ih : (x : α) → (xs : FreeMonoid α) → C (of x * xs)), casesOn (of x * xs) h0 ih = ih x xs
casesOn_of_mul
{
C: FreeMonoid αSort u_2
C
:
FreeMonoid: Type ?u.20549 → Type ?u.20549
FreeMonoid
α: Type ?u.20527
α
Sort _: Type ?u.20551
Sort
Sort _: Type ?u.20551
_
} (
x: α
x
:
α: Type ?u.20527
α
) (
xs: FreeMonoid α
xs
:
FreeMonoid: Type ?u.20556 → Type ?u.20556
FreeMonoid
α: Type ?u.20527
α
) (
h0: C 1
h0
:
C: FreeMonoid αSort ?u.20551
C
1: ?m.20560
1
) (
ih: (x : ?m.20842) → (xs : ?m.20893 x) → C (of x * xs)
ih
: ∀
x: ?m.20842
x
xs: ?m.20845
xs
,
C: FreeMonoid αSort ?u.20551
C
(
of: {α : Type ?u.20851} → αFreeMonoid α
of
x: ?m.20842
x
*
xs: ?m.20845
xs
)) : @
casesOn: {α : Type ?u.20899} → {C : FreeMonoid αSort ?u.20898} → (xs : FreeMonoid α) → C 1((x : α) → (xs : FreeMonoid α) → C (of x * xs)) → C xs
casesOn
α: Type ?u.20527
α
C: FreeMonoid αSort ?u.20551
C
(
of: {α : Type ?u.20906} → αFreeMonoid α
of
x: α
x
*
xs: FreeMonoid α
xs
)
h0: C 1
h0
ih: (x : ?m.20842) → (xs : ?m.20893 x) → C (of x * xs)
ih
=
ih: (x : ?m.20842) → (xs : ?m.20893 x) → C (of x * xs)
ih
x: α
x
xs: FreeMonoid α
xs
:=
rfl: ∀ {α : Sort ?u.21905} {a : α}, a = a
rfl
#align free_monoid.cases_on_of_mul
FreeMonoid.casesOn_of_mul: ∀ {α : Type u_1} {C : FreeMonoid αSort u_2} (x : α) (xs : FreeMonoid α) (h0 : C 1) (ih : (x : α) → (xs : FreeMonoid α) → C (of x * xs)), casesOn (of x * xs) h0 ih = ih x xs
FreeMonoid.casesOn_of_mul
#align free_add_monoid.cases_on_of_add
FreeAddMonoid.casesOn_of_add: ∀ {α : Type u_1} {C : FreeAddMonoid αSort u_2} (x : α) (xs : FreeAddMonoid α) (h0 : C 0) (ih : (x : α) → (xs : FreeAddMonoid α) → C (FreeAddMonoid.of x + xs)), FreeAddMonoid.casesOn (FreeAddMonoid.of x + xs) h0 ih = ih x xs
FreeAddMonoid.casesOn_of_add
@[
to_additive: ∀ {α : Type u_1} {M : Type u_2} [inst : AddMonoid M] ⦃f g : FreeAddMonoid α →+ M⦄, (∀ (x : α), f (FreeAddMonoid.of x) = g (FreeAddMonoid.of x)) → f = g
to_additive
(attr := ext)] theorem
hom_eq: ∀ ⦃f g : FreeMonoid α →* M⦄, (∀ (x : α), f (of x) = g (of x)) → f = g
hom_eq
f g :
FreeMonoid: Type ?u.22553 → Type ?u.22553
FreeMonoid
α: Type ?u.22028
α
→*
M: Type ?u.22037
M
⦄ (
h: ∀ (x : α), f (of x) = g (of x)
h
: ∀
x: ?m.22559
x
, f (
of: {α : Type ?u.22861} → αFreeMonoid α
of
x: ?m.22559
x
) = g (
of: {α : Type ?u.23137} → αFreeMonoid α
of
x: ?m.22559
x
)) : f = g :=
MonoidHom.ext: ∀ {M : Type ?u.23149} {N : Type ?u.23150} [inst : MulOneClass M] [inst_1 : MulOneClass N] ⦃f g : M →* N⦄, (∀ (x : M), f x = g x) → f = g
MonoidHom.ext
fun
l: ?m.23189
l
recOn: ∀ {α : Type ?u.23192} {C : FreeMonoid αSort ?u.23191} (xs : FreeMonoid α), C 1(∀ (x : α) (xs : FreeMonoid α), C xsC (of x * xs)) → C xs
recOn
l: ?m.23189
l
(f.
map_one: ∀ {M : Type ?u.23722} {N : Type ?u.23723} [inst : MulOneClass M] [inst_1 : MulOneClass N] (f : M →* N), f 1 = 1
map_one
.
trans: ∀ {α : Sort ?u.23732} {a b c : α}, a = bb = ca = c
trans
g.
map_one: ∀ {M : Type ?u.23745} {N : Type ?u.23746} [inst : MulOneClass M] [inst_1 : MulOneClass N] (f : M →* N), f 1 = 1
map_one
.
symm: ∀ {α : Sort ?u.23751} {a b : α}, a = bb = a
symm
) (fun
x: ?m.23762
x
xs: ?m.23765
xs
hxs: ?m.23768
hxs

Goals accomplished! 🐙
α: Type u_1

β: Type ?u.22031

γ: Type ?u.22034

M: Type u_2

inst✝¹: Monoid M

N: Type ?u.22043

inst✝: Monoid N

f, g: FreeMonoid α →* M

h: ∀ (x : α), f (of x) = g (of x)

l: FreeMonoid α

x: α

xs: FreeMonoid α

hxs: f xs = g xs


f (of x * xs) = g (of x * xs)

Goals accomplished! 🐙
) #align free_monoid.hom_eq
FreeMonoid.hom_eq: ∀ {α : Type u_1} {M : Type u_2} [inst : Monoid M] ⦃f g : FreeMonoid α →* M⦄, (∀ (x : α), f (of x) = g (of x)) → f = g
FreeMonoid.hom_eq
#align free_add_monoid.hom_eq
FreeAddMonoid.hom_eq: ∀ {α : Type u_1} {M : Type u_2} [inst : AddMonoid M] ⦃f g : FreeAddMonoid α →+ M⦄, (∀ (x : α), f (FreeAddMonoid.of x) = g (FreeAddMonoid.of x)) → f = g
FreeAddMonoid.hom_eq
/-- A variant of `List.prod` that has `[x].prod = x` true definitionally. The purpose is to make `FreeMonoid.lift_eval_of` true by `rfl`. -/ @[
to_additive: {M : Type u_1} → [inst : AddMonoid M] → List MM
to_additive
"A variant of `List.sum` that has `[x].sum = x` true definitionally. The purpose is to make `FreeAddMonoid.lift_eval_of` true by `rfl`."] def
prodAux: {M : Type ?u.24210} → [inst : Monoid M] → List MM
prodAux
{
M: Type ?u.24210
M
} [
Monoid: Type ?u.24210 → Type ?u.24210
Monoid
M: ?m.24207
M
] :
List: Type ?u.24214 → Type ?u.24214
List
M: ?m.24207
M
M: ?m.24207
M
| [] =>
1: ?m.24233
1
| (
x: M
x
::
xs: List M
xs
) =>
List.foldl: {α : Type ?u.24574} → {β : Type ?u.24573} → (αβα) → αList βα
List.foldl
(· * ·): MMM
(· * ·)
x: M
x
xs: List M
xs
#align free_monoid.prod_aux
FreeMonoid.prodAux: {M : Type u_1} → [inst : Monoid M] → List MM
FreeMonoid.prodAux
#align free_add_monoid.sum_aux
FreeAddMonoid.sumAux: {M : Type u_1} → [inst : AddMonoid M] → List MM
FreeAddMonoid.sumAux
@[
to_additive: ∀ {M : Type u_1} [inst : AddMonoid M] (l : List M), FreeAddMonoid.sumAux l = List.sum l
to_additive
] lemma
prodAux_eq: ∀ {M : Type u_1} [inst : Monoid M] (l : List M), prodAux l = List.prod l
prodAux_eq
: ∀
l: List M
l
:
List: Type ?u.25679 → Type ?u.25679
List
M: Type ?u.25666
M
,
FreeMonoid.prodAux: {M : Type ?u.25683} → [inst : Monoid M] → List MM
FreeMonoid.prodAux
l: List M
l
=
l: List M
l
.
prod: {α : Type ?u.25696} → [inst : Mul α] → [inst : One α] → List αα
prod
| [] =>
rfl: ∀ {α : Sort ?u.26301} {a : α}, a = a
rfl
| (_ ::
xs: List M
xs
) =>
congr_arg: ∀ {α : Sort ?u.26348} {β : Sort ?u.26347} {a₁ a₂ : α} (f : αβ), a₁ = a₂f a₁ = f a₂
congr_arg
(fun
x: ?m.26354
x
=>
List.foldl: {α : Type ?u.26357} → {β : Type ?u.26356} → (αβα) → αList βα
List.foldl
(· * ·): MMM
(· * ·)
x: ?m.26354
x
xs: List M
xs
) (
one_mul: ∀ {M : Type ?u.26789} [inst : MulOneClass M] (a : M), 1 * a = a
one_mul
_: ?m.26790
_
).
symm: ∀ {α : Sort ?u.26804} {a b : α}, a = bb = a
symm
#align free_monoid.prod_aux_eq
FreeMonoid.prodAux_eq: ∀ {M : Type u_1} [inst : Monoid M] (l : List M), prodAux l = List.prod l
FreeMonoid.prodAux_eq
#align free_add_monoid.sum_aux_eq
FreeAddMonoid.sumAux_eq: ∀ {M : Type u_1} [inst : AddMonoid M] (l : List M), FreeAddMonoid.sumAux l = List.sum l
FreeAddMonoid.sumAux_eq
/-- Equivalence between maps `α → M` and monoid homomorphisms `FreeMonoid α →* M`. -/ @[
to_additive: {α : Type u_1} → {M : Type u_2} → [inst : AddMonoid M] → (αM) (FreeAddMonoid α →+ M)
to_additive
"Equivalence between maps `α → A` and additive monoid homomorphisms `FreeAddMonoid α →+ A`."] def
lift: (αM) (FreeMonoid α →* M)
lift
: (
α: Type ?u.27396
α
M: Type ?u.27405
M
) ≃ (
FreeMonoid: Type ?u.27424 → Type ?u.27424
FreeMonoid
α: Type ?u.27396
α
→*
M: Type ?u.27405
M
) where toFun
f: ?m.27931
f
:= { toFun := fun
l: ?m.28443
l
prodAux: {M : Type ?u.28445} → [inst : Monoid M] → List MM
prodAux
((
toList: {α : Type ?u.28462} → FreeMonoid α List α
toList
l: ?m.28443
l
).
map: {α : Type ?u.28543} → {β : Type ?u.28542} → (αβ) → List αList β
map
f: ?m.27931
f
) map_one' :=
rfl: ∀ {α : Sort ?u.28563} {a : α}, a = a
rfl
map_mul' := fun
_: ?m.28600
_
_: ?m.28603
_

Goals accomplished! 🐙
α: Type ?u.27396

β: Type ?u.27399

γ: Type ?u.27402

M: Type ?u.27405

inst✝¹: Monoid M

N: Type ?u.27411

inst✝: Monoid N

f: αM

x✝¹, x✝: FreeMonoid α


OneHom.toFun { toFun := fun l => prodAux (List.map f (toList l)), map_one' := (_ : (fun l => prodAux (List.map f (toList l))) 1 = (fun l => prodAux (List.map f (toList l))) 1) } (x✝¹ * x✝) = OneHom.toFun { toFun := fun l => prodAux (List.map f (toList l)), map_one' := (_ : (fun l => prodAux (List.map f (toList l))) 1 = (fun l => prodAux (List.map f (toList l))) 1) } x✝¹ * OneHom.toFun { toFun := fun l => prodAux (List.map f (toList l)), map_one' := (_ : (fun l => prodAux (List.map f (toList l))) 1 = (fun l => prodAux (List.map f (toList l))) 1) } x✝

Goals accomplished! 🐙
} invFun
f: ?m.28615
f
x: ?m.28618
x
:=
f: ?m.28615
f
(
of: {α : Type ?u.28914} → αFreeMonoid α
of
x: ?m.28618
x
) left_inv
f: ?m.28921
f
:=
rfl: ∀ {α : Sort ?u.28924} {a : α}, a = a
rfl
right_inv
f: ?m.29057
f
:=
hom_eq: ∀ {α : Type ?u.29059} {M : Type ?u.29060} [inst : Monoid M] ⦃f g : FreeMonoid α →* M⦄, (∀ (x : α), f (of x) = g (of x)) → f = g
hom_eq
fun
x: ?m.29089
x
rfl: ∀ {α : Sort ?u.29091} {a : α}, a = a
rfl
#align free_monoid.lift
FreeMonoid.lift: {α : Type u_1} → {M : Type u_2} → [inst : Monoid M] → (αM) (FreeMonoid α →* M)
FreeMonoid.lift
#align free_add_monoid.lift
FreeAddMonoid.lift: {α : Type u_1} → {M : Type u_2} → [inst : AddMonoid M] → (αM) (FreeAddMonoid α →+ M)
FreeAddMonoid.lift
-- porting note: new @[
to_additive: ∀ {α : Type u_1} {M : Type u_2} [inst : AddMonoid M] (f : αM) (l : List α), ↑(FreeAddMonoid.lift f) (FreeAddMonoid.ofList l) = List.sum (List.map f l)
to_additive
(attr := simp)] theorem
lift_ofList: ∀ (f : αM) (l : List α), ↑(lift f) (ofList l) = List.prod (List.map f l)
lift_ofList
(
f: αM
f
:
α: Type ?u.30499
α
M: Type ?u.30508
M
) (
l: List α
l
:
List: Type ?u.30524 → Type ?u.30524
List
α: Type ?u.30499
α
) :
lift: {α : Type ?u.30529} → {M : Type ?u.30528} → [inst : Monoid M] → (αM) (FreeMonoid α →* M)
lift
f: αM
f
(
ofList: {α : Type ?u.30978} → List α FreeMonoid α
ofList
l: List α
l
) = (
l: List α
l
.
map: {α : Type ?u.31060} → {β : Type ?u.31059} → (αβ) → List αList β
map
f: αM
f
).
prod: {α : Type ?u.31070} → [inst : Mul α] → [inst : One α] → List αα
prod
:=
prodAux_eq: ∀ {M : Type ?u.31661} [inst : Monoid M] (l : List M), prodAux l = List.prod l
prodAux_eq
_: List ?m.31662
_
@[
to_additive: ∀ {α : Type u_1} {M : Type u_2} [inst : AddMonoid M] (f : FreeAddMonoid α →+ M), FreeAddMonoid.lift.symm f = f FreeAddMonoid.of
to_additive
(attr := simp)] theorem
lift_symm_apply: ∀ {α : Type u_1} {M : Type u_2} [inst : Monoid M] (f : FreeMonoid α →* M), lift.symm f = f of
lift_symm_apply
(f :
FreeMonoid: Type ?u.31994 → Type ?u.31994
FreeMonoid
α: Type ?u.31971
α
→*
M: Type ?u.31980
M
) :
lift: {α : Type ?u.32496} → {M : Type ?u.32495} → [inst : Monoid M] → (αM) (FreeMonoid α →* M)
lift
.
symm: {α : Sort ?u.32515} → {β : Sort ?u.32514} → α ββ α
symm
f = f
of: {α : Type ?u.32949} → αFreeMonoid α
of
:=
rfl: ∀ {α : Sort ?u.32966} {a : α}, a = a
rfl
#align free_monoid.lift_symm_apply
FreeMonoid.lift_symm_apply: ∀ {α : Type u_1} {M : Type u_2} [inst : Monoid M] (f : FreeMonoid α →* M), lift.symm f = f of
FreeMonoid.lift_symm_apply
#align free_add_monoid.lift_symm_apply
FreeAddMonoid.lift_symm_apply: ∀ {α : Type u_1} {M : Type u_2} [inst : AddMonoid M] (f : FreeAddMonoid α →+ M), FreeAddMonoid.lift.symm f = f FreeAddMonoid.of
FreeAddMonoid.lift_symm_apply
@[
to_additive: ∀ {α : Type u_1} {M : Type u_2} [inst : AddMonoid M] (f : αM) (l : FreeAddMonoid α), ↑(FreeAddMonoid.lift f) l = List.sum (List.map f (FreeAddMonoid.toList l))
to_additive
] theorem
lift_apply: ∀ {α : Type u_1} {M : Type u_2} [inst : Monoid M] (f : αM) (l : FreeMonoid α), ↑(lift f) l = List.prod (List.map f (toList l))
lift_apply
(
f: αM
f
:
α: Type ?u.33071
α
M: Type ?u.33080
M
) (l :
FreeMonoid: Type ?u.33096 → Type ?u.33096
FreeMonoid
α: Type ?u.33071
α
) :
lift: {α : Type ?u.33101} → {M : Type ?u.33100} → [inst : Monoid M] → (αM) (FreeMonoid α →* M)
lift
f: αM
f
l = ((
toList: {α : Type ?u.33551} → FreeMonoid α List α
toList
l).
map: {α : Type ?u.33631} → {β : Type ?u.33630} → (αβ) → List αList β
map
f: αM
f
).
prod: {α : Type ?u.33642} → [inst : Mul α] → [inst : One α] → List αα
prod
:=
prodAux_eq: ∀ {M : Type ?u.34233} [inst : Monoid M] (l : List M), prodAux l = List.prod l
prodAux_eq
_: List ?m.34234
_
#align free_monoid.lift_apply
FreeMonoid.lift_apply: ∀ {α : Type u_1} {M : Type u_2} [inst : Monoid M] (f : αM) (l : FreeMonoid α), ↑(lift f) l = List.prod (List.map f (toList l))
FreeMonoid.lift_apply
#align free_add_monoid.lift_apply
FreeAddMonoid.lift_apply: ∀ {α : Type u_1} {M : Type u_2} [inst : AddMonoid M] (f : αM) (l : FreeAddMonoid α), ↑(FreeAddMonoid.lift f) l = List.sum (List.map f (FreeAddMonoid.toList l))
FreeAddMonoid.lift_apply
@[
to_additive: ∀ {α : Type u_1} {M : Type u_2} [inst : AddMonoid M] (f : αM), ↑(FreeAddMonoid.lift f) FreeAddMonoid.of = f
to_additive
] theorem
lift_comp_of: ∀ (f : αM), ↑(lift f) of = f
lift_comp_of
(
f: αM
f
:
α: Type ?u.34438
α
M: Type ?u.34447
M
) :
lift: {α : Type ?u.34471} → {M : Type ?u.34470} → [inst : Monoid M] → (αM) (FreeMonoid α →* M)
lift
f: αM
f
of: {α : Type ?u.34922} → αFreeMonoid α
of
=
f: αM
f
:=
rfl: ∀ {α : Sort ?u.34934} {a : α}, a = a
rfl
#align free_monoid.lift_comp_of
FreeMonoid.lift_comp_of: ∀ {α : Type u_1} {M : Type u_2} [inst : Monoid M] (f : αM), ↑(lift f) of = f
FreeMonoid.lift_comp_of
#align free_add_monoid.lift_comp_of
FreeAddMonoid.lift_comp_of: ∀ {α : Type u_1} {M : Type u_2} [inst : AddMonoid M] (f : αM), ↑(FreeAddMonoid.lift f) FreeAddMonoid.of = f
FreeAddMonoid.lift_comp_of
@[
to_additive: ∀ {α : Type u_2} {M : Type u_1} [inst : AddMonoid M] (f : αM) (x : α), ↑(FreeAddMonoid.lift f) (FreeAddMonoid.of x) = f x
to_additive
(attr := simp)] theorem
lift_eval_of: ∀ (f : αM) (x : α), ↑(lift f) (of x) = f x
lift_eval_of
(
f: αM
f
:
α: Type ?u.35024
α
M: Type ?u.35033
M
) (
x: α
x
:
α: Type ?u.35024
α
) :
lift: {α : Type ?u.35053} → {M : Type ?u.35052} → [inst : Monoid M] → (αM) (FreeMonoid α →* M)
lift
f: αM
f
(
of: {α : Type ?u.35502} → αFreeMonoid α
of
x: α
x
) =
f: αM
f
x: α
x
:=
rfl: ∀ {α : Sort ?u.35510} {a : α}, a = a
rfl
#align free_monoid.lift_eval_of
FreeMonoid.lift_eval_of: ∀ {α : Type u_2} {M : Type u_1} [inst : Monoid M] (f : αM) (x : α), ↑(lift f) (of x) = f x
FreeMonoid.lift_eval_of
#align free_add_monoid.lift_eval_of
FreeAddMonoid.lift_eval_of: ∀ {α : Type u_2} {M : Type u_1} [inst : AddMonoid M] (f : αM) (x : α), ↑(FreeAddMonoid.lift f) (FreeAddMonoid.of x) = f x
FreeAddMonoid.lift_eval_of
@[
to_additive: ∀ {α : Type u_1} {M : Type u_2} [inst : AddMonoid M] (f : FreeAddMonoid α →+ M), FreeAddMonoid.lift (f FreeAddMonoid.of) = f
to_additive
(attr := simp)] theorem
lift_restrict: ∀ {α : Type u_1} {M : Type u_2} [inst : Monoid M] (f : FreeMonoid α →* M), lift (f of) = f
lift_restrict
(f :
FreeMonoid: Type ?u.35698 → Type ?u.35698
FreeMonoid
α: Type ?u.35675
α
→*
M: Type ?u.35684
M
) :
lift: {α : Type ?u.36200} → {M : Type ?u.36199} → [inst : Monoid M] → (αM) (FreeMonoid α →* M)
lift
(f
of: {α : Type ?u.36622} → αFreeMonoid α
of
) = f :=
lift: {α : Type ?u.36642} → {M : Type ?u.36641} → [inst : Monoid M] → (αM) (FreeMonoid α →* M)
lift
.
apply_symm_apply: ∀ {α : Sort ?u.36661} {β : Sort ?u.36660} (e : α β) (x : β), e (e.symm x) = x
apply_symm_apply
f #align free_monoid.lift_restrict
FreeMonoid.lift_restrict: ∀ {α : Type u_1} {M : Type u_2} [inst : Monoid M] (f : FreeMonoid α →* M), lift (f of) = f
FreeMonoid.lift_restrict
#align free_add_monoid.lift_restrict
FreeAddMonoid.lift_restrict: ∀ {α : Type u_1} {M : Type u_2} [inst : AddMonoid M] (f : FreeAddMonoid α →+ M), FreeAddMonoid.lift (f FreeAddMonoid.of) = f
FreeAddMonoid.lift_restrict
@[
to_additive: ∀ {α : Type u_3} {M : Type u_1} [inst : AddMonoid M] {N : Type u_2} [inst_1 : AddMonoid N] (g : M →+ N) (f : αM), AddMonoidHom.comp g (FreeAddMonoid.lift f) = FreeAddMonoid.lift (g f)
to_additive
] theorem
comp_lift: ∀ {α : Type u_3} {M : Type u_1} [inst : Monoid M] {N : Type u_2} [inst_1 : Monoid N] (g : M →* N) (f : αM), MonoidHom.comp g (lift f) = lift (g f)
comp_lift
(
g: M →* N
g
:
M: Type ?u.36843
M
→*
N: Type ?u.36849
N
) (
f: αM
f
:
α: Type ?u.36834
α
M: Type ?u.36843
M
) :
g: M →* N
g
.
comp: {M : Type ?u.37296} → {N : Type ?u.37295} → {P : Type ?u.37294} → [inst : MulOneClass M] → [inst_1 : MulOneClass N] → [inst_2 : MulOneClass P] → (N →* P) → (M →* N) → M →* P
comp
(
lift: {α : Type ?u.37316} → {M : Type ?u.37315} → [inst : Monoid M] → (αM) (FreeMonoid α →* M)
lift
f: αM
f
) =
lift: {α : Type ?u.37729} → {M : Type ?u.37728} → [inst : Monoid M] → (αM) (FreeMonoid α →* M)
lift
(
g: M →* N
g
f: αM
f
) := -- Porting note: replace ext by FreeMonoid.hom_eq
FreeMonoid.hom_eq: ∀ {α : Type ?u.38167} {M : Type ?u.38168} [inst : Monoid M] ⦃f g : FreeMonoid α →* M⦄, (∀ (x : α), f (of x) = g (of x)) → f = g
FreeMonoid.hom_eq
(

Goals accomplished! 🐙
α: Type u_3

β: Type ?u.36837

γ: Type ?u.36840

M: Type u_1

inst✝¹: Monoid M

N: Type u_2

inst✝: Monoid N

g: M →* N

f: αM


∀ (x : α), ↑(MonoidHom.comp g (lift f)) (of x) = ↑(lift (g f)) (of x)

Goals accomplished! 🐙
) #align free_monoid.comp_lift
FreeMonoid.comp_lift: ∀ {α : Type u_3} {M : Type u_1} [inst : Monoid M] {N : Type u_2} [inst_1 : Monoid N] (g : M →* N) (f : αM), MonoidHom.comp g (lift f) = lift (g f)
FreeMonoid.comp_lift
#align free_add_monoid.comp_lift
FreeAddMonoid.comp_lift: ∀ {α : Type u_3} {M : Type u_1} [inst : AddMonoid M] {N : Type u_2} [inst_1 : AddMonoid N] (g : M →+ N) (f : αM), AddMonoidHom.comp g (FreeAddMonoid.lift f) = FreeAddMonoid.lift (g f)
FreeAddMonoid.comp_lift
@[
to_additive: ∀ {α : Type u_3} {M : Type u_1} [inst : AddMonoid M] {N : Type u_2} [inst_1 : AddMonoid N] (g : M →+ N) (f : αM) (x : FreeAddMonoid α), g (↑(FreeAddMonoid.lift f) x) = ↑(FreeAddMonoid.lift (g f)) x
to_additive
] theorem
hom_map_lift: ∀ {α : Type u_3} {M : Type u_1} [inst : Monoid M] {N : Type u_2} [inst_1 : Monoid N] (g : M →* N) (f : αM) (x : FreeMonoid α), g (↑(lift f) x) = ↑(lift (g f)) x
hom_map_lift
(
g: M →* N
g
:
M: Type ?u.40724
M
→*
N: Type ?u.40730
N
) (
f: αM
f
:
α: Type ?u.40715
α
M: Type ?u.40724
M
) (x :
FreeMonoid: Type ?u.41174 → Type ?u.41174
FreeMonoid
α: Type ?u.40715
α
) :
g: M →* N
g
(
lift: {α : Type ?u.41477} → {M : Type ?u.41476} → [inst : Monoid M] → (αM) (FreeMonoid α →* M)
lift
f: αM
f
x) =
lift: {α : Type ?u.41923} → {M : Type ?u.41922} → [inst : Monoid M] → (αM) (FreeMonoid α →* M)
lift
(
g: M →* N
g
f: αM
f
) x :=
FunLike.ext_iff: ∀ {F : Sort ?u.42670} {α : Sort ?u.42672} {β : αSort ?u.42671} [i : FunLike F α β] {f g : F}, f = g ∀ (x : α), f x = g x
FunLike.ext_iff
.
1: ∀ {a b : Prop}, (a b) → ab
1
(
comp_lift: ∀ {α : Type ?u.42716} {M : Type ?u.42714} [inst : Monoid M] {N : Type ?u.42715} [inst_1 : Monoid N] (g : M →* N) (f : αM), MonoidHom.comp g (lift f) = lift (g f)
comp_lift
g: M →* N
g
f: αM
f
) x #align free_monoid.hom_map_lift
FreeMonoid.hom_map_lift: ∀ {α : Type u_3} {M : Type u_1} [inst : Monoid M] {N : Type u_2} [inst_1 : Monoid N] (g : M →* N) (f : αM) (x : FreeMonoid α), g (↑(lift f) x) = ↑(lift (g f)) x
FreeMonoid.hom_map_lift
#align free_add_monoid.hom_map_lift
FreeAddMonoid.hom_map_lift: ∀ {α : Type u_3} {M : Type u_1} [inst : AddMonoid M] {N : Type u_2} [inst_1 : AddMonoid N] (g : M →+ N) (f : αM) (x : FreeAddMonoid α), g (↑(FreeAddMonoid.lift f) x) = ↑(FreeAddMonoid.lift (g f)) x
FreeAddMonoid.hom_map_lift
/-- Define a multiplicative action of `FreeMonoid α` on `β`. -/ @[
to_additive: {α : Type u_1} → {β : Type u_2} → (αββ) → AddAction (FreeAddMonoid α) β
to_additive
"Define an additive action of `FreeAddMonoid α` on `β`."] def
mkMulAction: (αββ) → MulAction (FreeMonoid α) β
mkMulAction
(
f: αββ
f
:
α: Type ?u.43314
α
β: Type ?u.43317
β
β: Type ?u.43317
β
) :
MulAction: (α : Type ?u.43342) → Type ?u.43341 → [inst : Monoid α] → Type (max?u.43342?u.43341)
MulAction
(
FreeMonoid: Type ?u.43343 → Type ?u.43343
FreeMonoid
α: Type ?u.43314
α
)
β: Type ?u.43317
β
where smul
l: ?m.43614
l
b: ?m.43617
b
:=
l: ?m.43614
l
.
toList: {α : Type ?u.43619} → FreeMonoid α List α
toList
.
foldr: {α : Type ?u.43699} → {β : Type ?u.43698} → (αββ) → βList αβ
foldr
f: αββ
f
b: ?m.43617
b
one_smul
_: ?m.43719
_
:=
rfl: ∀ {α : Sort ?u.43721} {a : α}, a = a
rfl
mul_smul
_: ?m.43751
_
_: ?m.43754
_
_: ?m.43757
_
:=
List.foldr_append: ∀ {α : Type ?u.43759} {β : Type ?u.43760} (f : αββ) (b : β) (l l' : List α), List.foldr f b (l ++ l') = List.foldr f (List.foldr f b l') l
List.foldr_append
_: ?m.43761?m.43762?m.43762
_
_: ?m.43762
_
_: List ?m.43761
_
_: List ?m.43761
_
#align free_monoid.mk_mul_action
FreeMonoid.mkMulAction: {α : Type u_1} → {β : Type u_2} → (αββ) → MulAction (FreeMonoid α) β
FreeMonoid.mkMulAction
#align free_add_monoid.mk_add_action
FreeAddMonoid.mkAddAction: {α : Type u_1} → {β : Type u_2} → (αββ) → AddAction (FreeAddMonoid α) β
FreeAddMonoid.mkAddAction
@[
to_additive: ∀ {α : Type u_1} {β : Type u_2} (f : αββ) (l : FreeAddMonoid α) (b : β), l +ᵥ b = List.foldr f b (FreeAddMonoid.toList l)
to_additive
] theorem
smul_def: ∀ {α : Type u_1} {β : Type u_2} (f : αββ) (l : FreeMonoid α) (b : β), l b = List.foldr f b (toList l)
smul_def
(
f: αββ
f
:
α: Type ?u.44637
α
β: Type ?u.44640
β
β: Type ?u.44640
β
) (l :
FreeMonoid: Type ?u.44664 → Type ?u.44664
FreeMonoid
α: Type ?u.44637
α
) (
b: β
b
:
β: Type ?u.44640
β
) : haveI :=
mkMulAction: {α : Type ?u.44672} → {β : Type ?u.44671} → (αββ) → MulAction (FreeMonoid α) β
mkMulAction
f: αββ
f
l
b: β
b
= l.
toList: {α : Type ?u.45569} → FreeMonoid α List α
toList
.
foldr: {α : Type ?u.45648} → {β : Type ?u.45647} → (αββ) → βList αβ
foldr
f: αββ
f
b: β
b
:=
rfl: ∀ {α : Sort ?u.45668} {a : α}, a = a
rfl
#align free_monoid.smul_def
FreeMonoid.smul_def: ∀ {α : Type u_1} {β : Type u_2} (f : αββ) (l : FreeMonoid α) (b : β), l b = List.foldr f b (toList l)
FreeMonoid.smul_def
#align free_add_monoid.vadd_def
FreeAddMonoid.vadd_def: ∀ {α : Type u_1} {β : Type u_2} (f : αββ) (l : FreeAddMonoid α) (b : β), l +ᵥ b = List.foldr f b (FreeAddMonoid.toList l)
FreeAddMonoid.vadd_def
@[
to_additive: ∀ {α : Type u_1} {β : Type u_2} (f : αββ) (l : List α) (b : β), FreeAddMonoid.ofList l +ᵥ b = List.foldr f b l
to_additive
] theorem
ofList_smul: ∀ {α : Type u_1} {β : Type u_2} (f : αββ) (l : List α) (b : β), ofList l b = List.foldr f b l
ofList_smul
(
f: αββ
f
:
α: Type ?u.45710
α
β: Type ?u.45713
β
β: Type ?u.45713
β
) (
l: List α
l
:
List: Type ?u.45737 → Type ?u.45737
List
α: Type ?u.45710
α
) (
b: β
b
:
β: Type ?u.45713
β
) : haveI :=
mkMulAction: {α : Type ?u.45745} → {β : Type ?u.45744} → (αββ) → MulAction (FreeMonoid α) β
mkMulAction
f: αββ
f
ofList: {α : Type ?u.45767} → List α FreeMonoid α
ofList
l: List α
l
b: β
b
=
l: List α
l
.
foldr: {α : Type ?u.46836} → {β : Type ?u.46835} → (αββ) → βList αβ
foldr
f: αββ
f
b: β
b
:=
rfl: ∀ {α : Sort ?u.46855} {a : α}, a = a
rfl
#align free_monoid.of_list_smul
FreeMonoid.ofList_smul: ∀ {α : Type u_1} {β : Type u_2} (f : αββ) (l : List α) (b : β), ofList l b = List.foldr f b l
FreeMonoid.ofList_smul
#align free_add_monoid.of_list_vadd
FreeAddMonoid.ofList_vadd: ∀ {α : Type u_1} {β : Type u_2} (f : αββ) (l : List α) (b : β), FreeAddMonoid.ofList l +ᵥ b = List.foldr f b l
FreeAddMonoid.ofList_vadd
@[
to_additive: ∀ {α : Type u_2} {β : Type u_1} (f : αββ) (x : α) (y : β), FreeAddMonoid.of x +ᵥ y = f x y
to_additive
(attr := simp)] theorem
of_smul: ∀ (f : αββ) (x : α) (y : β), of x y = f x y
of_smul
(
f: αββ
f
:
α: Type ?u.46908
α
β: Type ?u.46911
β
β: Type ?u.46911
β
) (
x: α
x
:
α: Type ?u.46908
α
) (
y: β
y
:
β: Type ?u.46911
β
) : (haveI :=
mkMulAction: {α : Type ?u.46947} → {β : Type ?u.46946} → (αββ) → MulAction (FreeMonoid α) β
mkMulAction
f: αββ
f
of: {α : Type ?u.46968} → αFreeMonoid α
of
x: α
x
y: β
y
) =
f: αββ
f
x: α
x
y: β
y
:=
rfl: ∀ {α : Sort ?u.47849} {a : α}, a = a
rfl
#align free_monoid.of_smul
FreeMonoid.of_smul: ∀ {α : Type u_2} {β : Type u_1} (f : αββ) (x : α) (y : β), of x y = f x y
FreeMonoid.of_smul
#align free_add_monoid.of_vadd
FreeAddMonoid.of_vadd: ∀ {α : Type u_2} {β : Type u_1} (f : αββ) (x : α) (y : β), FreeAddMonoid.of x +ᵥ y = f x y
FreeAddMonoid.of_vadd
/-- The unique monoid homomorphism `FreeMonoid α →* FreeMonoid β` that sends each `of x` to `of (f x)`. -/ @[
to_additive: {α : Type u_1} → {β : Type u_2} → (αβ) → FreeAddMonoid α →+ FreeAddMonoid β
to_additive
"The unique additive monoid homomorphism `FreeAddMonoid α →+ FreeAddMonoid β` that sends each `of x` to `of (f x)`."] def
map: {α : Type u_1} → {β : Type u_2} → (αβ) → FreeMonoid α →* FreeMonoid β
map
(
f: αβ
f
:
α: Type ?u.47942
α
β: Type ?u.47945
β
) :
FreeMonoid: Type ?u.47969 → Type ?u.47969
FreeMonoid
α: Type ?u.47942
α
→*
FreeMonoid: Type ?u.47970 → Type ?u.47970
FreeMonoid
β: Type ?u.47945
β
where toFun
l: ?m.48990
l
:=
ofList: {α : Type ?u.48992} → List α FreeMonoid α
ofList
<|
l: ?m.48990
l
.
toList: {α : Type ?u.49070} → FreeMonoid α List α
toList
.
map: {α : Type ?u.49150} → {β : Type ?u.49149} → (αβ) → List αList β
map
f: αβ
f
map_one' :=
rfl: ∀ {α : Sort ?u.49166} {a : α}, a = a
rfl
map_mul'
_: ?m.49191
_
_: ?m.49194
_
:=
List.map_append: ∀ {α : Type ?u.49196} {β : Type ?u.49197} (f : αβ) (l₁ l₂ : List α), List.map f (l₁ ++ l₂) = List.map f l₁ ++ List.map f l₂
List.map_append
_: ?m.49198?m.49199
_
_: List ?m.49198
_
_: List ?m.49198
_
#align free_monoid.map
FreeMonoid.map: {α : Type u_1} → {β : Type u_2} → (αβ) → FreeMonoid α →* FreeMonoid β
FreeMonoid.map
#align free_add_monoid.map
FreeAddMonoid.map: {α : Type u_1} → {β : Type u_2} → (αβ) → FreeAddMonoid α →+ FreeAddMonoid β
FreeAddMonoid.map
@[
to_additive: ∀ {α : Type u_2} {β : Type u_1} (f : αβ) (x : α), ↑(FreeAddMonoid.map f) (FreeAddMonoid.of x) = FreeAddMonoid.of (f x)
to_additive
(attr := simp)] theorem
map_of: ∀ (f : αβ) (x : α), ↑(map f) (of x) = of (f x)
map_of
(
f: αβ
f
:
α: Type ?u.51259
α
β: Type ?u.51262
β
) (
x: α
x
:
α: Type ?u.51259
α
) :
map: {α : Type ?u.51288} → {β : Type ?u.51287} → (αβ) → FreeMonoid α →* FreeMonoid β
map
f: αβ
f
(
of: {α : Type ?u.51594} → αFreeMonoid α
of
x: α
x
) =
of: {α : Type ?u.51597} → αFreeMonoid α
of
(
f: αβ
f
x: α
x
) :=
rfl: ∀ {α : Sort ?u.51605} {a : α}, a = a
rfl
#align free_monoid.map_of
FreeMonoid.map_of: ∀ {α : Type u_2} {β : Type u_1} (f : αβ) (x : α), ↑(map f) (of x) = of (f x)
FreeMonoid.map_of
#align free_add_monoid.map_of
FreeAddMonoid.map_of: ∀ {α : Type u_2} {β : Type u_1} (f : αβ) (x : α), ↑(FreeAddMonoid.map f) (FreeAddMonoid.of x) = FreeAddMonoid.of (f x)
FreeAddMonoid.map_of
@[
to_additive: ∀ {α : Type u_1} {β : Type u_2} (f : αβ) (xs : FreeAddMonoid α), FreeAddMonoid.toList (↑(FreeAddMonoid.map f) xs) = List.map f (FreeAddMonoid.toList xs)
to_additive
] theorem
toList_map: ∀ (f : αβ) (xs : FreeMonoid α), toList (↑(map f) xs) = List.map f (toList xs)
toList_map
(
f: αβ
f
:
α: Type ?u.51717
α
β: Type ?u.51720
β
) (
xs: FreeMonoid α
xs
:
FreeMonoid: Type ?u.51742 → Type ?u.51742
FreeMonoid
α: Type ?u.51717
α
) :
toList: {α : Type ?u.51746} → FreeMonoid α List α
toList
(
map: {α : Type ?u.51825} → {β : Type ?u.51824} → (αβ) → FreeMonoid α →* FreeMonoid β
map
f: αβ
f
xs: FreeMonoid α
xs
) =
xs: FreeMonoid α
xs
.
toList: {α : Type ?u.52134} → FreeMonoid α List α
toList
.
map: {α : Type ?u.52213} → {β : Type ?u.52212} → (αβ) → List αList β
map
f: αβ
f
:=
rfl: ∀ {α : Sort ?u.52230} {a : α}, a = a
rfl
#align free_monoid.to_list_map
FreeMonoid.toList_map: ∀ {α : Type u_1} {β : Type u_2} (f : αβ) (xs : FreeMonoid α), toList (↑(map f) xs) = List.map f (toList xs)
FreeMonoid.toList_map
#align free_add_monoid.to_list_map
FreeAddMonoid.toList_map: ∀ {α : Type u_1} {β : Type u_2} (f : αβ) (xs : FreeAddMonoid α), FreeAddMonoid.toList (↑(FreeAddMonoid.map f) xs) = List.map f (FreeAddMonoid.toList xs)
FreeAddMonoid.toList_map
@[
to_additive: ∀ {α : Type u_1} {β : Type u_2} (f : αβ) (xs : List α), FreeAddMonoid.ofList (List.map f xs) = ↑(FreeAddMonoid.map f) (FreeAddMonoid.ofList xs)
to_additive
] theorem
ofList_map: ∀ {α : Type u_1} {β : Type u_2} (f : αβ) (xs : List α), ofList (List.map f xs) = ↑(map f) (ofList xs)
ofList_map
(
f: αβ
f
:
α: Type ?u.52319
α
β: Type ?u.52322
β
) (
xs: List α
xs
:
List: Type ?u.52344 → Type ?u.52344
List
α: Type ?u.52319
α
) :
ofList: {α : Type ?u.52348} → List α FreeMonoid α
ofList
(
xs: List α
xs
.
map: {α : Type ?u.52427} → {β : Type ?u.52426} → (αβ) → List αList β
map
f: αβ
f
) =
map: {α : Type ?u.52441} → {β : Type ?u.52440} → (αβ) → FreeMonoid α →* FreeMonoid β
map
f: αβ
f
(
ofList: {α : Type ?u.52747} → List α FreeMonoid α
ofList
xs: List α
xs
) :=
rfl: ∀ {α : Sort ?u.52832} {a : α}, a = a
rfl
#align free_monoid.of_list_map
FreeMonoid.ofList_map: ∀ {α : Type u_1} {β : Type u_2} (f : αβ) (xs : List α), ofList (List.map f xs) = ↑(map f) (ofList xs)
FreeMonoid.ofList_map
#align free_add_monoid.of_list_map
FreeAddMonoid.ofList_map: ∀ {α : Type u_1} {β : Type u_2} (f : αβ) (xs : List α), FreeAddMonoid.ofList (List.map f xs) = ↑(FreeAddMonoid.map f) (FreeAddMonoid.ofList xs)
FreeAddMonoid.ofList_map
@[
to_additive: ∀ {α : Type u_1} {β : Type u_2} (f : αβ), (FreeAddMonoid.lift fun x => FreeAddMonoid.of (f x)) = FreeAddMonoid.map f
to_additive
] theorem
lift_of_comp_eq_map: ∀ {α : Type u_1} {β : Type u_2} (f : αβ), (lift fun x => of (f x)) = map f
lift_of_comp_eq_map
(
f: αβ
f
:
α: Type ?u.52881
α
β: Type ?u.52884
β
) : (
lift: {α : Type ?u.52908} → {M : Type ?u.52907} → [inst : Monoid M] → (αM) (FreeMonoid α →* M)
lift
fun
x: ?m.53023
x
of: {α : Type ?u.53025} → αFreeMonoid α
of
(
f: αβ
f
x: ?m.53023
x
)) =
map: {α : Type ?u.53284} → {β : Type ?u.53283} → (αβ) → FreeMonoid α →* FreeMonoid β
map
f: αβ
f
:=
hom_eq: ∀ {α : Type ?u.53299} {M : Type ?u.53300} [inst : Monoid M] ⦃f g : FreeMonoid α →* M⦄, (∀ (x : α), f (of x) = g (of x)) → f = g
hom_eq
fun
_: ?m.53332
_
rfl: ∀ {α : Sort ?u.53334} {a : α}, a = a
rfl
#align free_monoid.lift_of_comp_eq_map
FreeMonoid.lift_of_comp_eq_map: ∀ {α : Type u_1} {β : Type u_2} (f : αβ), (lift fun x => of (f x)) = map f
FreeMonoid.lift_of_comp_eq_map
#align free_add_monoid.lift_of_comp_eq_map
FreeAddMonoid.lift_of_comp_eq_map: ∀ {α : Type u_1} {β : Type u_2} (f : αβ), (FreeAddMonoid.lift fun x => FreeAddMonoid.of (f x)) = FreeAddMonoid.map f
FreeAddMonoid.lift_of_comp_eq_map
@[
to_additive: ∀ {α : Type u_1} {β : Type u_3} {γ : Type u_2} (g : βγ) (f : αβ), FreeAddMonoid.map (g f) = AddMonoidHom.comp (FreeAddMonoid.map g) (FreeAddMonoid.map f)
to_additive
] theorem
map_comp: ∀ {α : Type u_1} {β : Type u_3} {γ : Type u_2} (g : βγ) (f : αβ), map (g f) = MonoidHom.comp (map g) (map f)
map_comp
(
g: βγ
g
:
β: Type ?u.53726
β
γ: Type ?u.53729
γ
) (
f: αβ
f
:
α: Type ?u.53723
α
β: Type ?u.53726
β
) :
map: {α : Type ?u.53754} → {β : Type ?u.53753} → (αβ) → FreeMonoid α →* FreeMonoid β
map
(
g: βγ
g
f: αβ
f
) = (
map: {α : Type ?u.53775} → {β : Type ?u.53774} → (αβ) → FreeMonoid α →* FreeMonoid β
map
g: βγ
g
).
comp: {M : Type ?u.53783} → {N : Type ?u.53782} → {P : Type ?u.53781} → [inst : MulOneClass M] → [inst_1 : MulOneClass N] → [inst_2 : MulOneClass P] → (N →* P) → (M →* N) → M →* P
comp
(
map: {α : Type ?u.53805} → {β : Type ?u.53804} → (αβ) → FreeMonoid α →* FreeMonoid β
map
f: αβ
f
) :=
hom_eq: ∀ {α : Type ?u.54669} {M : Type ?u.54670} [inst : Monoid M] ⦃f g : FreeMonoid α →* M⦄, (∀ (x : α), f (of x) = g (of x)) → f = g
hom_eq
fun
_: ?m.54702
_
rfl: ∀ {α : Sort ?u.54704} {a : α}, a = a
rfl
#align free_monoid.map_comp
FreeMonoid.map_comp: ∀ {α : Type u_1} {β : Type u_3} {γ : Type u_2} (g : βγ) (f : αβ), map (g f) = MonoidHom.comp (map g) (map f)
FreeMonoid.map_comp
#align free_add_monoid.map_comp
FreeAddMonoid.map_comp: ∀ {α : Type u_1} {β : Type u_3} {γ : Type u_2} (g : βγ) (f : αβ), FreeAddMonoid.map (g f) = AddMonoidHom.comp (FreeAddMonoid.map g) (FreeAddMonoid.map f)
FreeAddMonoid.map_comp
@[
to_additive: ∀ {α : Type u_1}, FreeAddMonoid.map id = AddMonoidHom.id (FreeAddMonoid α)
to_additive
(attr := simp)] theorem
map_id: map id = MonoidHom.id (FreeMonoid α)
map_id
:
map: {α : Type ?u.55111} → {β : Type ?u.55110} → (αβ) → FreeMonoid α →* FreeMonoid β
map
(@
id: {α : Sort ?u.55114} → αα
id
α: Type ?u.55088
α
) =
MonoidHom.id: (M : Type ?u.55117) → [inst : MulOneClass M] → M →* M
MonoidHom.id
(
FreeMonoid: Type ?u.55118 → Type ?u.55118
FreeMonoid
α: Type ?u.55088
α
) :=
hom_eq: ∀ {α : Type ?u.55407} {M : Type ?u.55408} [inst : Monoid M] ⦃f g : FreeMonoid α →* M⦄, (∀ (x : α), f (of x) = g (of x)) → f = g
hom_eq
fun
_: ?m.55440
_
rfl: ∀ {α : Sort ?u.55442} {a : α}, a = a
rfl
#align free_monoid.map_id
FreeMonoid.map_id: ∀ {α : Type u_1}, map id = MonoidHom.id (FreeMonoid α)
FreeMonoid.map_id
#align free_add_monoid.map_id
FreeAddMonoid.map_id: ∀ {α : Type u_1}, FreeAddMonoid.map id = AddMonoidHom.id (FreeAddMonoid α)
FreeAddMonoid.map_id
end FreeMonoid