Coqにおける等号は「Leibniz Equality」というもので、

  (forall P: Prop, P x -> P y) <-> x = y.

つまり「任意の命題に関して、同じ結論を与えるなら二つは等しい」というのが等しいの定義らしい。

等しくないことを示すにはどうすればよいかというと、結果が等しくならない命題を作ってやればいいわけだ。

たとえば Inductive で

Inductive X : Set := a | b.

とした場合は当然「a <> b」であって欲しいわけなのだが、「a」と「b」で結論が違うものをどうやって構成するかというと、奇妙なことに

Definition eq_a (x:X) := match x with a => True | b => False end.

でできるのである。この関数「eq_a」は「match」を使って引数が「a」だったら真を返し、「b」だったら偽を返す。
これを使って「a <> b」を証明する。

Lemma a_ne_b : a <> b.
unfold not; intros.
absurd (eq_a a).
rewrite H.
auto.
unfold eq_a.
trivial.
Qed.

というわけで、Inductiveの場合はmatchが二つのコンストラクタを必ず区別するということから、等しくないことを証明できた。

一般の場合も、二つを区別する述語が存在すれば等しくないことを証明できる。

Variable Y : Set.

Lemma neq : forall x y: Y, (exists P: Y->Prop, P x /\ ~P y) -> x <> y.
intros.
elim H.
intros.
unfold not.
elim H0.
intros.
absurd (x0 x).
rewrite H3.
auto.
auto.
Qed.

というふうにだいたい上のと同じ。

Leibniz Equality の重要な性質は「x=y」を仮定すれば、ほかのところに現れる「x」を勝手に「y」に置き換えてもよいということである。

最初の証明は実は「inversion」を使えば勝手にできる。