How to improve this proof?
Question
I work on mereology and I wanted to prove that a given theorem (Extensionality) follows from the four axioms I had.
This is my code:
Require Import Classical. Parameter Entity: Set. Parameter P : Entity -> Entity -> Prop. Axiom P_refl : forall x, P x x. Axiom P_trans : forall x y z, P x y -> P y z -> P x z. Axiom P_antisym : forall x y, P x y -> P y x -> x = y. Definition PP x y := P x y /\ x <> y. Definition O x y := exists z, P z x /\ P z y. Axiom strong_supp : forall x y, ~ P y x -> exists z, P z y /\ ~ O z x.
And this is my proof:
forall x y : Entity, (exists z : Entity, PP z x) -> (forall z : Entity, PP z x <-> PP z y) -> x = yforall x y : Entity, (exists z : Entity, PP z x) -> (forall z : Entity, PP z x <-> PP z y) -> x = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z yx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y(x = y -> False) -> x = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> Falsex = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
yesP: P y xx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y xx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
yesP: P y xx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
yesP: P y x
H0: PP y x -> PP y y
H1: PP y y -> PP y xx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
yesP: P y x
H1: PP y y -> PP y xPP y xx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
yesP: P y x
H1: PP y y -> PP y x
H0: P y y
H2: y <> yx = ycontradiction.x, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
yesP: P y x
H1: PP y y -> PP y x
H0: P y y
H2: y <> yx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y xx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z xx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z xy = zx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
H2: y = zx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x(y = z -> False) -> y = zx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
H2: y = zx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
Hcontra': y = z -> Falsey = zx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
H2: y = zx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
Hcontra': y = z -> False
H2: PP z x -> PP z y
H3: PP z y -> PP z xy = zx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
H2: y = zx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
Hcontra': y = z -> False
H2: PP z x -> PP z yPP z yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
Hcontra': y = z -> False
H2: PP z x -> PP z y
H3: P z x
H4: z <> xy = zx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
H2: y = zx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
Hcontra': y = z -> False
H2: PP z x -> PP z y
H3: P z x
H4: z <> xy = zx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
H2: y = zx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
Hcontra': y = z -> False
H2: PP z x -> PP z y
H3: P z x
H4: z <> xO z xx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
H2: y = zx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
Hcontra': y = z -> False
H2: PP z x -> PP z y
H3: P z x
H4: z <> xP z z /\ P z xx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
H2: y = zx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
Hcontra': y = z -> False
H2: PP z x -> PP z y
H3: P z x
H4: z <> xP z zx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
Hcontra': y = z -> False
H2: PP z x -> PP z y
H3: P z x
H4: z <> xP z xx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
H2: y = zx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
Hcontra': y = z -> False
H2: PP z x -> PP z y
H3: P z x
H4: z <> xP z xx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
H2: y = zx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O z x
H2: y = zx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O y x
H2: y = zx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O y x
H2: y = z
H3: PP w x -> PP w y
H4: PP w y -> PP w xx = yx, y, w: Entity
PPwx: PP w x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O y x
H2: y = z
H3: PP w x -> PP w y
H4: PP w y -> PP w x
H5: PP w yx = yx, y, w: Entity
H6: P w x
H7: w <> x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O y x
H2: y = z
H3: PP w x -> PP w y
H4: PP w y -> PP w x
H5: PP w yx = yx, y, w: Entity
H6: P w x
H7: w <> x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H1: ~ O y x
H2: y = z
H3: PP w x -> PP w y
H4: PP w y -> PP w x
H5: P w y
H8: w <> yx = yx, y, w: Entity
H6: P w x
H7: w <> x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H2: y = z
H3: PP w x -> PP w y
H4: PP w y -> PP w x
H5: P w y
H8: w <> yO y xsplit; assumption. Qed.x, y, w: Entity
H6: P w x
H7: w <> x
H: forall z : Entity, PP z x <-> PP z y
Hcontra: x = y -> False
notP: ~ P y x
z: Entity
H0: P z y
H2: y = z
H3: PP w x -> PP w y
H4: PP w y -> PP w x
H5: P w y
H8: w <> yP w y /\ P w x
I'm happy with the fact that I completed this proof. However, I find it quite messy. And I don't know how to improve it. (The only thing I think of is to use patterns instead of destruct.) It is possible to improve this proof? If so, please do not use super complex tactics: I would like to understand the upgrades you will propose.
Answer
Here is a refactoring of your proof:
Require Import Classical. Parameter Entity: Set. Parameter P : Entity -> Entity -> Prop. Axiom P_refl : forall x, P x x. Axiom P_trans : forall x y z, P x y -> P y z -> P x z. Axiom P_antisym : forall x y, P x y -> P y x -> x = y. Definition PP x y := P x y /\ x <> y. Definition O x y := exists z, P z x /\ P z y. Axiom strong_supp : forall x y, ~ P y x -> exists z, P z y /\ ~ O z x.forall x y : Entity, (exists z : Entity, PP z x) -> (forall z : Entity, PP z x <-> PP z y) -> x = yforall x y : Entity, (exists z : Entity, PP z x) -> (forall z : Entity, PP z x <-> PP z y) -> x = yx, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z yx = yx, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y~ x <> yx, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> yFalsex, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y~ P y xx, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y xFalsex, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y~ P y xx, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
Pxy: P y xFalsex, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
Pxy: P y xPP y ysplit; congruence.x, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
Pxy: P y xPP y xx, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y xFalsex, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
z: Entity
Pzy: P z y
NOzx: ~ O z xFalsex, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
z: Entity
Pzy: P z y
NOzx: ~ O z xy <> zx, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
z: Entity
Pzy: P z y
NOzx: ~ O z x
y_ne_z: y <> zFalsex, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
z: Entity
Pzy: P z y
NOzx: ~ O z xy <> zx, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
NOzx: ~ O y x
Pzy: P y yFalsex, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
NOzx: ~ O y x
Pzy: P y y
Pwy: P w y
NEwy: w <> yFalsex, y, w: Entity
Pwx: P w x
NEwx: w <> x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
NOzx: ~ O y x
Pzy: P y y
Pwy: P w y
NEwy: w <> yFalsenow exists w.x, y, w: Entity
Pwx: P w x
NEwx: w <> x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
NOzx: ~ O y x
Pzy: P y y
Pwy: P w y
NEwy: w <> yO y xx, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
z: Entity
Pzy: P z y
NOzx: ~ O z x
y_ne_z: y <> zFalsex, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
z: Entity
Pzy: P z y
NOzx: ~ O z x
y_ne_z: y <> zPP z xx, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
z: Entity
Pzy: P z y
NOzx: ~ O z x
y_ne_z: y <> z
Pzx: P z xFalsex, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
z: Entity
Pzy: P z y
NOzx: ~ O z x
y_ne_z: y <> zPP z xsplit; congruence.x, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
z: Entity
Pzy: P z y
NOzx: ~ O z x
y_ne_z: y <> zPP z yx, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
z: Entity
Pzy: P z y
NOzx: ~ O z x
y_ne_z: y <> z
Pzx: P z xFalsex, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
z: Entity
Pzy: P z y
NOzx: ~ O z x
y_ne_z: y <> z
Pzx: P z xO z xx, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
z: Entity
Pzy: P z y
NOzx: ~ O z x
y_ne_z: y <> z
Pzx: P z xP z z /\ P z xapply P_refl. Qed.x, y, w: Entity
PPwx: PP w x
x_equiv_y: forall z : Entity, PP z x <-> PP z y
x_ne_y: x <> y
NPyx: ~ P y x
z: Entity
Pzy: P z y
NOzx: ~ O z x
y_ne_z: y <> z
Pzx: P z xP z z
The main changes are:
Give explicit and informative names to all the intermediate hypotheses (i.e., avoid doing destruct foo as [x []])
Use curly braces to separate the proofs of the intermediate assertions from the main proof.
Use the congruence tactic to automate some of the low-level equality reasoning. Roughly speaking, this tactic solves goals that can be established just by rewriting with equalities and pruning subgoals with contradictory statements like x <> x.
Condense trivial proof steps using the assert ... by tactic, which does not generate new subgoals.
Use the (a & b & c) destruct patterns rather than [a [b c]], which are harder to read.
Rewrite with x_equiv_y to avoid doing sequences such as specialize... destruct... apply H0 in H1
Avoid some unnecessary uses of classical reasoning.
Q: Is destruct (strong_supp x y NPyx) as (z & Pzy & NOzx). equivalent to pose proof (strong_supp x y NPyx) as (z & Pzy & NOzx).? I tried and its the same result. Is there a difference?
A: In this particular case, yes, they are equivalent.
A: Classical reasoning can be replaced with an extra assumption that equality of Entity is decidable.