# Documentation

Mathlib.Algebra.Opposites

# Multiplicative opposite and algebraic operations on it #

In this file we define MulOpposite α = αᵐᵒᵖ to be the multiplicative opposite of α. It inherits all additive algebraic structures on α (in other files), and reverses the order of multipliers in multiplicative structures, i.e., op (x * y) = op y * op x, where MulOpposite.op is the canonical map from α to αᵐᵒᵖ.

We also define AddOpposite α = αᵃᵒᵖ to be the additive opposite of α. It inherits all multiplicative algebraic structures on α (in other files), and reverses the order of summands in additive structures, i.e. op (x + y) = op y + op x, where AddOpposite.op is the canonical map from α to αᵃᵒᵖ.

## Notation #

• αᵐᵒᵖ = MulOpposite α
• αᵃᵒᵖ = AddOpposite α

## Implementation notes #

In mathlib3 αᵐᵒᵖ was just a type synonym for α, marked irreducible after the API was developed. In mathlib4 we use a structure with one field, because it is not possible to change the reducibility of a declaration after its definition, and because Lean 4 has definitional eta reduction for structures (Lean 3 does not).

## Tags #

structure PreOpposite (α : Type u) :
• op' :: (
• unop' : α

The element of α represented by x : PreOpposite α.

• )

Auxiliary type to implement MulOpposite and AddOpposite.

It turns out to be convenient to have MulOpposite α= AddOpposite α true by definition, in the same way that it is convenient to have Additive α = α; this means that we also get the defeq AddOpposite (Additive α) = MulOpposite α, which is convenient when working with quotients.

This is a compromise between making MulOpposite α = AddOpposite α = α (what we had in Lean 3) and having no defeqs within those three types (which we had as of mathlib4#1036).

Instances For
def AddOpposite (α : Type u) :

Additive opposite of a type. This type inherits all multiplicative structures on α and reverses left and right in addition.

Instances For
def MulOpposite (α : Type u) :

Multiplicative opposite of a type. This type inherits all additive structures on α and reverses left and right in multiplication.

Instances For

Multiplicative opposite of a type.

Instances For

Instances For
def AddOpposite.op {α : Type u_1} :
ααᵃᵒᵖ

The element of αᵃᵒᵖ that represents x : α.

Instances For
def MulOpposite.op {α : Type u_1} :
ααᵐᵒᵖ

The element of MulOpposite α that represents x : α.

Instances For
def AddOpposite.unop {α : Type u_1} :
αᵃᵒᵖα

The element of α represented by x : αᵃᵒᵖ.

Instances For
def MulOpposite.unop {α : Type u_1} :
αᵐᵒᵖα

The element of α represented by x : αᵐᵒᵖ.

Instances For
@[simp]
theorem AddOpposite.unop_op {α : Type u_1} (x : α) :
@[simp]
theorem MulOpposite.unop_op {α : Type u_1} (x : α) :
@[simp]
theorem AddOpposite.op_unop {α : Type u_1} (x : αᵃᵒᵖ) :
@[simp]
theorem MulOpposite.op_unop {α : Type u_1} (x : αᵐᵒᵖ) :
@[simp]
theorem AddOpposite.op_comp_unop {α : Type u_1} :
@[simp]
theorem MulOpposite.op_comp_unop {α : Type u_1} :
MulOpposite.op MulOpposite.unop = id
@[simp]
theorem AddOpposite.unop_comp_op {α : Type u_1} :
@[simp]
theorem MulOpposite.unop_comp_op {α : Type u_1} :
MulOpposite.unop MulOpposite.op = id
def AddOpposite.rec' {α : Type u_1} {F : αᵃᵒᵖSort v} (h : (X : α) → F ()) (X : αᵃᵒᵖ) :
F X

A recursor for AddOpposite. Use as induction x using AddOpposite.rec'.

Instances For
def MulOpposite.rec' {α : Type u_1} {F : αᵐᵒᵖSort v} (h : (X : α) → F ()) (X : αᵐᵒᵖ) :
F X

A recursor for MulOpposite. Use as induction x using MulOpposite.rec'.

Instances For
def AddOpposite.opEquiv {α : Type u_1} :

The canonical bijection between α and αᵃᵒᵖ.

Instances For
@[simp]
theorem AddOpposite.opEquiv_apply {α : Type u_1} :
@[simp]
theorem MulOpposite.opEquiv_apply {α : Type u_1} :
MulOpposite.opEquiv = MulOpposite.op
@[simp]
theorem MulOpposite.opEquiv_symm_apply {α : Type u_1} :
MulOpposite.opEquiv.symm = MulOpposite.unop
@[simp]
theorem AddOpposite.opEquiv_symm_apply {α : Type u_1} :
def MulOpposite.opEquiv {α : Type u_1} :

The canonical bijection between α and αᵐᵒᵖ.

Instances For
theorem AddOpposite.op_bijective {α : Type u_1} :
theorem MulOpposite.op_bijective {α : Type u_1} :
Function.Bijective MulOpposite.op
theorem AddOpposite.unop_bijective {α : Type u_1} :
theorem MulOpposite.unop_bijective {α : Type u_1} :
Function.Bijective MulOpposite.unop
theorem AddOpposite.op_injective {α : Type u_1} :
theorem MulOpposite.op_injective {α : Type u_1} :
Function.Injective MulOpposite.op
theorem AddOpposite.op_surjective {α : Type u_1} :
theorem MulOpposite.op_surjective {α : Type u_1} :
Function.Surjective MulOpposite.op
theorem AddOpposite.unop_injective {α : Type u_1} :
theorem MulOpposite.unop_injective {α : Type u_1} :
Function.Injective MulOpposite.unop
theorem AddOpposite.unop_surjective {α : Type u_1} :
theorem MulOpposite.unop_surjective {α : Type u_1} :
Function.Surjective MulOpposite.unop
@[simp]
theorem AddOpposite.op_inj {α : Type u_1} {x : α} {y : α} :
x = y
@[simp]
theorem MulOpposite.op_inj {α : Type u_1} {x : α} {y : α} :
x = y
@[simp]
theorem AddOpposite.unop_inj {α : Type u_1} {x : αᵃᵒᵖ} {y : αᵃᵒᵖ} :
x = y
@[simp]
theorem MulOpposite.unop_inj {α : Type u_1} {x : αᵐᵒᵖ} {y : αᵐᵒᵖ} :
x = y
instance AddOpposite.nontrivial (α : Type u_1) [] :
instance MulOpposite.nontrivial (α : Type u_1) [] :
instance AddOpposite.inhabited (α : Type u_1) [] :
instance MulOpposite.inhabited (α : Type u_1) [] :
instance AddOpposite.subsingleton (α : Type u_1) [] :
instance MulOpposite.subsingleton (α : Type u_1) [] :
instance AddOpposite.unique (α : Type u_1) [] :
theorem AddOpposite.unique.proof_1 (α : Type u_1) [] :
instance MulOpposite.unique (α : Type u_1) [] :
theorem AddOpposite.isEmpty.proof_1 (α : Type u_1) [] :
instance AddOpposite.isEmpty (α : Type u_1) [] :
instance MulOpposite.isEmpty (α : Type u_1) [] :
instance MulOpposite.zero (α : Type u_1) [Zero α] :
instance AddOpposite.zero (α : Type u_1) [Zero α] :
instance MulOpposite.one (α : Type u_1) [One α] :
instance MulOpposite.sub (α : Type u_1) [Sub α] :
instance MulOpposite.neg (α : Type u_1) [Neg α] :
instance MulOpposite.involutiveNeg (α : Type u_1) [] :
instance MulOpposite.mul (α : Type u_1) [Mul α] :
instance AddOpposite.neg (α : Type u_1) [Neg α] :
instance MulOpposite.inv (α : Type u_1) [Inv α] :
theorem AddOpposite.involutiveNeg.proof_1 (α : Type u_1) [] :
∀ (x : αᵃᵒᵖ), - -x = x
instance AddOpposite.involutiveNeg (α : Type u_1) [] :
instance MulOpposite.involutiveInv (α : Type u_1) [] :
instance MulOpposite.smul (α : Type u_2) (R : Type u_1) [SMul R α] :
@[simp]
theorem MulOpposite.op_zero (α : Type u_1) [Zero α] :
@[simp]
theorem MulOpposite.unop_zero (α : Type u_1) [Zero α] :
@[simp]
theorem AddOpposite.op_zero (α : Type u_1) [Zero α] :
@[simp]
theorem MulOpposite.op_one (α : Type u_1) [One α] :
@[simp]
theorem AddOpposite.unop_zero (α : Type u_1) [Zero α] :
@[simp]
theorem MulOpposite.unop_one (α : Type u_1) [One α] :
@[simp]
theorem MulOpposite.op_add {α : Type u_1} [Add α] (x : α) (y : α) :
@[simp]
theorem MulOpposite.unop_add {α : Type u_1} [Add α] (x : αᵐᵒᵖ) (y : αᵐᵒᵖ) :
@[simp]
theorem MulOpposite.op_neg {α : Type u_1} [Neg α] (x : α) :
@[simp]
theorem MulOpposite.unop_neg {α : Type u_1} [Neg α] (x : αᵐᵒᵖ) :
@[simp]
@[simp]
theorem MulOpposite.op_mul {α : Type u_1} [Mul α] (x : α) (y : α) :
@[simp]
@[simp]
theorem MulOpposite.unop_mul {α : Type u_1} [Mul α] (x : αᵐᵒᵖ) (y : αᵐᵒᵖ) :
@[simp]
theorem AddOpposite.op_neg {α : Type u_1} [Neg α] (x : α) :
@[simp]
theorem MulOpposite.op_inv {α : Type u_1} [Inv α] (x : α) :
@[simp]
theorem AddOpposite.unop_neg {α : Type u_1} [Neg α] (x : αᵃᵒᵖ) :
@[simp]
theorem MulOpposite.unop_inv {α : Type u_1} [Inv α] (x : αᵐᵒᵖ) :
@[simp]
theorem MulOpposite.op_sub {α : Type u_1} [Sub α] (x : α) (y : α) :
@[simp]
theorem MulOpposite.unop_sub {α : Type u_1} [Sub α] (x : αᵐᵒᵖ) (y : αᵐᵒᵖ) :
@[simp]
theorem AddOpposite.op_vadd {α : Type u_2} {R : Type u_1} [VAdd R α] (c : R) (a : α) :
@[simp]
theorem MulOpposite.op_smul {α : Type u_2} {R : Type u_1} [SMul R α] (c : R) (a : α) :
@[simp]
theorem AddOpposite.unop_vadd {α : Type u_2} {R : Type u_1} [VAdd R α] (c : R) (a : αᵃᵒᵖ) :
@[simp]
theorem MulOpposite.unop_smul {α : Type u_2} {R : Type u_1} [SMul R α] (c : R) (a : αᵐᵒᵖ) :
@[simp]
theorem MulOpposite.unop_eq_zero_iff {α : Type u_1} [Zero α] (a : αᵐᵒᵖ) :
a = 0
@[simp]
theorem MulOpposite.op_eq_zero_iff {α : Type u_1} [Zero α] (a : α) :
a = 0
theorem MulOpposite.unop_ne_zero_iff {α : Type u_1} [Zero α] (a : αᵐᵒᵖ) :
a 0
theorem MulOpposite.op_ne_zero_iff {α : Type u_1} [Zero α] (a : α) :
a 0
@[simp]
theorem AddOpposite.unop_eq_zero_iff {α : Type u_1} [Zero α] (a : αᵃᵒᵖ) :
a = 0
@[simp]
theorem MulOpposite.unop_eq_one_iff {α : Type u_1} [One α] (a : αᵐᵒᵖ) :
a = 1
@[simp]
theorem AddOpposite.op_eq_zero_iff {α : Type u_1} [Zero α] (a : α) :
a = 0
@[simp]
theorem MulOpposite.op_eq_one_iff {α : Type u_1} [One α] (a : α) :
a = 1
instance AddOpposite.one {α : Type u_1} [One α] :
@[simp]
theorem AddOpposite.op_one {α : Type u_1} [One α] :
@[simp]
theorem AddOpposite.unop_one {α : Type u_1} [One α] :
@[simp]
theorem AddOpposite.op_eq_one_iff {α : Type u_1} [One α] {a : α} :
a = 1
@[simp]
theorem AddOpposite.unop_eq_one_iff {α : Type u_1} [One α] {a : αᵃᵒᵖ} :
a = 1
instance AddOpposite.mul {α : Type u_1} [Mul α] :
@[simp]
theorem AddOpposite.op_mul {α : Type u_1} [Mul α] (a : α) (b : α) :
@[simp]
theorem AddOpposite.unop_mul {α : Type u_1} [Mul α] (a : αᵃᵒᵖ) (b : αᵃᵒᵖ) :
instance AddOpposite.inv {α : Type u_1} [Inv α] :
instance AddOpposite.involutiveInv {α : Type u_1} [] :
@[simp]
theorem AddOpposite.op_inv {α : Type u_1} [Inv α] (a : α) :
@[simp]
theorem AddOpposite.unop_inv {α : Type u_1} [Inv α] (a : αᵃᵒᵖ) :
instance AddOpposite.div {α : Type u_1} [Div α] :
@[simp]
theorem AddOpposite.op_div {α : Type u_1} [Div α] (a : α) (b : α) :
@[simp]
theorem AddOpposite.unop_div {α : Type u_1} [Div α] (a : αᵃᵒᵖ) (b : αᵃᵒᵖ) :