Notes
The proof of symmetry is worth to look at.
The definition of the impredicative leibniz equality
leibniz a b has an asymmetric form, due to
the implication P a -> P b , but the symmetry is
restored by a proper substitution for P :
Let us assume leibniz a b, i.e.
H : forall P:A->Prop, P a -> P b
Then for every predicate Q over A,
the term H fun a0:A => Q a0 -> Q a is a proof of the proposition :
(Q a -> Q a)-> Q b -> Q a
from which we trivially prove Q b -> Q a
The theorems leibniz_eq
and eq_leibniz imply together that
the propositions leibniz a b and
a=b are logically equivalent. Nevertheless, there is a
slight diffrence. There is a constant eq_rec which allows
to rewrite a in b in a construction of sort Set ,
but you can't do that with the proposition
leibniz a b.
In other words, you can't build a term of the following type :
forall (x : A) (P:A->Set), P x -> (forall y:A, leibniz x y-> P y
The same problem remains if one replaces Set with Type and
eq_rec with eq_rect.