1212
1313(** #<style> .doc { font-family: monospace; white-space: pre; } </style># * *)
1414
15- Require Import Setoid .
15+ Require Import Setoid Morphisms .
1616Require Import ssreflect ssrfun.
1717
1818(**
@@ -1272,8 +1272,7 @@ Proof. by split=> // -[]. Qed.
12721272
12731273Lemma reflectP (P Q : decProp) : (P <-> Q) <-> (? P = ? Q).
12741274Proof .
1275- by case: (propbP P) => [/iffT|/iffF] ->;
1276- case: (propbP Q) => [/iffT|/iffF] -> //; split=> // -[]//.
1275+ by elim: (propbP P) => _; elim: (propbP Q) => _ //; split=> // -[].
12771276Qed .
12781277
12791278Lemma propbE (P Q : decProp) {RP RQ : Prop} `{@Unfold_prop Prop (prop P) RP} `{@Unfold_prop Prop (prop Q) RQ} : (P <-> Q) -> (? (reverse_coercion P RP) = ? (reverse_coercion Q RQ)).
@@ -1354,7 +1353,7 @@ Lemma andNp P : ~ (~ P /\ P).
13541353Proof . by move=> [] /[apply]. Qed .
13551354
13561355Lemma orpN (P : decProp) : P \/ ~ P.
1357- Proof . by case : (propbP P) => p ; [left|right]. Qed .
1356+ Proof . by elim : (propbP P) => _ ; [left|right]. Qed .
13581357
13591358Lemma orNp (P : decProp) : ~ P \/ P.
13601359Proof . by rewrite orpC (iffT (orpN _)). Qed .
@@ -1389,18 +1388,15 @@ Lemma orp_idl P Q : (Q -> P) -> P \/ Q <-> P.
13891388Proof . by move=> QP; split=> [[|/QP]//|]?; left. Qed .
13901389Lemma orp_idr P Q : (P -> Q) -> P \/ Q <-> Q.
13911390Proof . by rewrite orpC (iffT (@orp_idl _ _)). Qed .
1391+
13921392Lemma orp_id2l (P : decProp) Q R :
13931393 (~ P -> Q <-> R) -> P \/ Q <-> P \/ R.
1394- Proof . by move=> PQR; case : (propbP P) => [|/PQR -> //]; split; left. Qed .
1394+ Proof . by elim : (propbP P) => [_ _|_ /(_ id) -> //]; split; left. Qed .
13951395Lemma orp_id2r P (Q : decProp) R : (~ Q -> P <-> R) -> P \/ Q <-> R \/ Q.
13961396Proof . by rewrite ![_ \/ Q]orpC (iffT (@orp_id2l _ _ _)). Qed .
13971397
13981398Lemma negp_and (P Q : decProp) : ~ (P /\ Q) <-> ~ P \/ ~ Q.
1399- Proof .
1400- by case: (propbP P) => [/iffT|/iffF] ->;
1401- case: (propbP Q) => [/iffT|/iffF] ->;
1402- apply/propbP.
1403- Qed .
1399+ Proof . by elim: (propbP P) => _; elim: (propbP Q) => _; apply/propbP. Qed .
14041400
14051401Lemma negp_or P Q : ~ (P \/ Q) <-> (~ P) /\ ~ Q.
14061402Proof . by split=> [pq|[]p q [/p|/q]//]; split=> ?; apply: pq; [left|right]. Qed .
@@ -1425,7 +1421,7 @@ Lemma implypp P : P -> P. Proof. by []. Qed.
14251421Lemma negp_imply (P : decProp) Q : ~ (P -> Q) <-> P /\ ~ Q.
14261422Proof .
14271423split=> [|[]p q /(_ p)/q//] pq; split=> [|q]; last exact: pq.
1428- by case : (propbP P) => // p; elim: pq => /p .
1424+ by elim : (propbP P) pq => _ //; apply .
14291425Qed .
14301426
14311427Lemma implypE (P : decProp) Q : (P -> Q) <-> ~ P \/ Q.
@@ -1445,20 +1441,18 @@ Proof. by rewrite /iff !implypNN ![(Q -> _) /\ _]andpC. Qed.
14451441
14461442Lemma implyp_idl (P : decProp) Q : (~ P -> Q) -> (P -> Q) <-> Q.
14471443Proof . by move=> npq; split=> // pq; case: (propbP P) => [/pq|/npq]. Qed .
1448- Lemma implyp_idr (P : decProp) Q : (Q -> ~ P) -> (P -> Q) <-> ~ P.
1444+ Lemma implyp_idr P Q : (Q -> ~ P) -> (P -> Q) <-> ~ P.
14491445Proof .
1450- by move=> qnp; split=> [pq|/[apply]//]; case: (propbP P) => [/pq/qnp|] .
1446+ by move=> qnp; split=> [pq p |/[apply]//]; apply: qnp => //; apply: pq .
14511447Qed .
14521448Lemma implyp_id2l T P Q : (forall x : T, P x <-> Q x) -> (forall x, P x) <-> (forall x, Q x).
14531449Proof .
14541450move=> xqr; split=> + x.
1455- (* FIXME: This looks like a bug either in setoid_rewrite or in ssrmatching. *)
14561451 by rewrite -(xqr x); apply.
14571452by rewrite (xqr x); apply.
14581453Qed .
14591454
1460- Definition xor (P Q : Prop ) :=
1461- (P \/ Q) /\ ~ (P /\ Q).
1455+ Definition xor (P Q : Prop) := (P \/ Q) /\ ~ (P /\ Q).
14621456
14631457Instance xor_iff_morphism : Morphisms.Proper (iff ==> iff ==> iff) xor.
14641458Proof . by move=> P Q PQ R S RS; rewrite /xor PQ RS. Qed .
@@ -1478,13 +1472,13 @@ Proof. by rewrite /xor (iffT (orTp _)) !andTp. Qed.
14781472Lemma xorpT P : xor P True <-> ~ P.
14791473Proof . by rewrite xorpC xorTp. Qed .
14801474
1475+ Lemma xorpp P : ~ (xor P P).
1476+ Proof . by move=> [] /orpp p; rewrite andpp; apply. Qed .
1477+
14811478Lemma xorP (P Q : decProp) : reflect (xor P Q) (addb P Q).
14821479Proof .
1483- case: (propbP P) => [/iffT|/iffF] p.
1484- apply: (@equivP (~ Q)); first exact: negPP.
1485- by rewrite p xorTp.
1486- apply: (@equivP Q); first exact: propbP.
1487- by rewrite p xorFp.
1480+ by apply: (iffP idP); elim: (propbP P); elim: (propbP Q) => //= _ _;
1481+ rewrite ?(iffF (@xorpp _))// ?xorTp ?xorpT => _.
14881482Qed .
14891483
14901484Canonical xor_decProp (P Q : decProp) := {|
@@ -1493,23 +1487,20 @@ Canonical xor_decProp (P Q : decProp) := {|
14931487 propbP := xorP P Q
14941488|}.
14951489
1496- Lemma xorpp P : ~ (xor P P).
1497- Proof . by move=> [] /orpp p; rewrite andpp; apply. Qed .
1498-
14991490Lemma xorpN (P : decProp) Q : xor P (~ Q) <-> ~ (xor P Q).
1500- Proof . by case : (propbP P) => [/iffT|/iffF] -> ; rewrite ?xorTp ?xorFp. Qed .
1491+ Proof . by elim : (propbP P); rewrite ?xorTp ?xorFp. Qed .
15011492
15021493Lemma xorNp P (Q : decProp) : xor (~ P) Q <-> ~ (xor P Q).
15031494Proof . by rewrite xorpC xorpN xorpC. Qed .
15041495
15051496Lemma xorpA (P : decProp) Q (R : decProp) : xor P (xor Q R) <-> xor (xor P Q) R.
15061497Proof .
1507- by case : (propbP P) => [/iffT|/iffF] -> ; rewrite ?xorFp// !xorTp xorNp.
1498+ by elim : (propbP P); rewrite ?xorFp// !xorTp xorNp.
15081499Qed .
15091500
15101501Lemma xorpCA (P Q : decProp) R : xor P (xor Q R) <-> xor Q (xor P R).
15111502Proof .
1512- by case : (propbP P) => [/iffT|/iffF] -> ; rewrite ?xorFp// !xorTp xorpN.
1503+ by elim : (propbP P); rewrite ?xorFp// !xorTp xorpN.
15131504Qed .
15141505
15151506Lemma xorpAC P (Q R : decProp) : xor (xor P Q) R <-> xor (xor P R) Q.
@@ -1530,15 +1521,15 @@ Proof. by rewrite andpC andp_xorl !(andpC P). Qed.
15301521
15311522Lemma xorKp (P Q : decProp) : xor P (xor P Q) <-> Q.
15321523Proof .
1533- by case : (propbP P) => [/iffT|/iffF] -> ; rewrite ?xorFp// !xorTp negpK.
1524+ by elim : (propbP P); rewrite ?xorFp// !xorTp negpK.
15341525Qed .
15351526
15361527Lemma xorpK (P Q : decProp) : xor (xor Q P) P <-> Q.
15371528Proof . by rewrite ![xor _ P]xorpC xorKp. Qed .
15381529
15391530Lemma xorpP (P : decProp) Q : xor P Q <-> (~ P <-> Q).
15401531Proof .
1541- case : (propbP P) => [/iffT|/iffF] -> .
1532+ elim : (propbP P).
15421533 by rewrite xorTp (iffF (_ : ~ ~ True))// iffFp.
15431534by rewrite xorFp (iffT negpF) iffTp.
15441535Qed .
0 commit comments