Socks and Shoes
===============
<!--
SPDX-FileCopyrightText: The authors of this work have dedicated it to the public domain.
For more information, please refer to <https://unlicense.org/>
SPDX-License-Identifier: Unlicense
-->
See [Socks and shoes proof](https://en.wikiversity.org/wiki/Introduction_to_group_theory/Socks_and_shoes_proof)
on Wikiversity.
Also see [Inverse of Product](https://proofwiki.org/wiki/Inverse_of_Product) on ProofWiki.
Requires [Group theory](group-theory.eqthy.md).
theorem (#socks-and-shoes)
inv(mul(A, B)) = mul(inv(B), inv(A))
proof
e = e
mul(A, inv(A)) = e
mul(mul(A, B), inv(mul(A, B))) = e [by substitution of mul(A, B) into A]
mul(mul(A, B), inv(mul(A, B))) = mul(A, inv(A))
mul(mul(A, B), inv(mul(A, B))) = mul(mul(A, e), inv(A))
mul(mul(A, B), inv(mul(A, B))) = mul(mul(A, mul(B, inv(B))), inv(A)) [by #inv-right with A=B]
mul(mul(A, B), inv(mul(A, B))) = mul(mul(mul(A, B), inv(B)), inv(A))
mul(mul(A, B), inv(mul(A, B))) = mul(mul(A, B), mul(inv(B), inv(A)))
mul(inv(A), mul(mul(A, B), inv(mul(A, B)))) = mul(inv(A), mul(mul(A, B), mul(inv(B), inv(A)))) [by congruence of C and mul(inv(A), C)]
mul(mul(inv(A), mul(A, B)), inv(mul(A, B))) = mul(inv(A), mul(mul(A, B), mul(inv(B), inv(A))))
mul(mul(mul(inv(A), A), B), inv(mul(A, B))) = mul(inv(A), mul(mul(A, B), mul(inv(B), inv(A))))
mul(mul(e, B), inv(mul(A, B))) = mul(inv(A), mul(mul(A, B), mul(inv(B), inv(A))))
mul(B, inv(mul(A, B))) = mul(inv(A), mul(mul(A, B), mul(inv(B), inv(A))))
mul(B, inv(mul(A, B))) = mul(mul(inv(A), mul(A, B)), mul(inv(B), inv(A)))
mul(B, inv(mul(A, B))) = mul(mul(mul(inv(A), A), B), mul(inv(B), inv(A)))
mul(B, inv(mul(A, B))) = mul(mul(e, B), mul(inv(B), inv(A)))
mul(B, inv(mul(A, B))) = mul(B, mul(inv(B), inv(A)))
mul(inv(B), mul(B, inv(mul(A, B)))) = mul(inv(B), mul(B, mul(inv(B), inv(A)))) [by congruence of C and mul(inv(B), C)]
mul(mul(inv(B), B), inv(mul(A, B))) = mul(inv(B), mul(B, mul(inv(B), inv(A))))
mul(mul(inv(B), B), inv(mul(A, B))) = mul(mul(inv(B), B), mul(inv(B), inv(A)))
mul(e, inv(mul(A, B))) = mul(mul(inv(B), B), mul(inv(B), inv(A)))
mul(e, inv(mul(A, B))) = mul(e, mul(inv(B), inv(A)))
inv(mul(A, B)) = mul(e, mul(inv(B), inv(A)))
inv(mul(A, B)) = mul(inv(B), inv(A))
qed