Lean4
/-- A type has an involutive inversion if it admits a surjective map that preserves `⁻¹` to a type
which has an involutive inversion. See note [reducible non-instances] -/
@[to_additive /-- A type has an involutive negation if it admits a surjective map that
preserves `-` to a type which has an involutive negation. -/
]
protected abbrev involutiveInv {M₂ : Type*} [Inv M₂] [InvolutiveInv M₁] (f : M₁ → M₂) (hf : Surjective f)
(inv : ∀ x, f x⁻¹ = (f x)⁻¹) : InvolutiveInv M₂
where
inv := Inv.inv
inv_inv := hf.forall.2 fun x => by rw [← inv, ← inv, inv_inv]