Skip to content
Snippets Groups Projects
Commit c73f285d authored by Robbert Krebbers's avatar Robbert Krebbers
Browse files

The symmetric and reflexive/transitive/symmetric closure.

parent 51d69170
No related branches found
No related tags found
1 merge request!53Confluent relations
...@@ -17,6 +17,9 @@ Section definitions. ...@@ -17,6 +17,9 @@ Section definitions.
(** An element is in normal form if no further steps are possible. *) (** An element is in normal form if no further steps are possible. *)
Definition nf (x : A) := ¬red x. Definition nf (x : A) := ¬red x.
(** The symmetric closure. *)
Definition sc : relation A := λ x y, R x y R y x.
(** The reflexive transitive closure. *) (** The reflexive transitive closure. *)
Inductive rtc : relation A := Inductive rtc : relation A :=
| rtc_refl x : rtc x x | rtc_refl x : rtc x x
...@@ -53,13 +56,16 @@ Section definitions. ...@@ -53,13 +56,16 @@ Section definitions.
| ex_loop_do_step x y : R x y ex_loop y ex_loop x. | ex_loop_do_step x y : R x y ex_loop y ex_loop x.
End definitions. End definitions.
(* Strongly normalizing elements *) (** The reflexive transitive symmetric closure. *)
Definition rtsc {A} (R : relation A) := rtc (sc R).
(** Strongly normalizing elements. *)
Notation sn R := (Acc (flip R)). Notation sn R := (Acc (flip R)).
Hint Unfold nf red : core. Hint Unfold nf red : core.
(** * General theorems *) (** * General theorems *)
Section rtc. Section closure.
Context `{R : relation A}. Context `{R : relation A}.
Hint Constructors rtc nsteps bsteps tc : core. Hint Constructors rtc nsteps bsteps tc : core.
...@@ -78,6 +84,14 @@ Section rtc. ...@@ -78,6 +84,14 @@ Section rtc.
Global Instance rtc_po : PreOrder (rtc R) | 10. Global Instance rtc_po : PreOrder (rtc R) | 10.
Proof. split. exact (@rtc_refl A R). exact rtc_transitive. Qed. Proof. split. exact (@rtc_refl A R). exact rtc_transitive. Qed.
(* Not an instance, related to the issue described above, this sometimes makes
[setoid_rewrite] queries loop. *)
Lemma rtc_equivalence : Symmetric R Equivalence (rtc R).
Proof.
split; try apply _.
intros x y. induction 1 as [|x1 x2 x3]; [done|trans x2; eauto].
Qed.
Lemma rtc_once x y : R x y rtc R x y. Lemma rtc_once x y : R x y rtc R x y.
Proof. eauto. Qed. Proof. eauto. Qed.
Lemma rtc_r x y z : rtc R x y R y z rtc R x z. Lemma rtc_r x y z : rtc R x y R y z rtc R x z.
...@@ -105,6 +119,9 @@ Section rtc. ...@@ -105,6 +119,9 @@ Section rtc.
Lemma rtc_inv_r x z : rtc R x z x = z y, rtc R x y R y z. Lemma rtc_inv_r x z : rtc R x z x = z y, rtc R x y R y z.
Proof. revert z. apply rtc_ind_r; eauto. Qed. Proof. revert z. apply rtc_ind_r; eauto. Qed.
Lemma rtc_nf x y : rtc R x y nf R x x = y.
Proof. destruct 1 as [x|x y1 y2]. done. intros []; eauto. Qed.
Lemma nsteps_once x y : R x y nsteps R 1 x y. Lemma nsteps_once x y : R x y nsteps R 1 x y.
Proof. eauto. Qed. Proof. eauto. Qed.
Lemma nsteps_trans n m x y z : Lemma nsteps_trans n m x y z :
...@@ -171,6 +188,36 @@ Section rtc. ...@@ -171,6 +188,36 @@ Section rtc.
Lemma tc_rtc x y : tc R x y rtc R x y. Lemma tc_rtc x y : tc R x y rtc R x y.
Proof. induction 1; eauto. Qed. Proof. induction 1; eauto. Qed.
Global Instance sc_symmetric : Symmetric (sc R).
Proof. unfold Symmetric, sc. naive_solver. Qed.
Lemma sc_lr x y : R x y sc R x y.
Proof. by left. Qed.
Lemma sc_rl x y : R y x sc R x y.
Proof. by right. Qed.
End closure.
Section more_closure.
Context `{R : relation A}.
Global Instance rtsc_equivalence : Equivalence (rtsc R) | 10.
Proof. apply rtc_equivalence, _. Qed.
Lemma rtsc_lr x y : R x y rtsc R x y.
Proof. unfold rtsc. eauto using sc_lr, rtc_once. Qed.
Lemma rtsc_rl x y : R y x rtsc R x y.
Proof. unfold rtsc. eauto using sc_rl, rtc_once. Qed.
Lemma rtc_rtsc_rl x y : rtc R x y rtsc R x y.
Proof. induction 1; econstructor; eauto using sc_lr. Qed.
Lemma rtc_rtsc_lr x y : rtc R y x rtsc R x y.
Proof. intros. symmetry. eauto using rtc_rtsc_rl. Qed.
End more_closure.
Section properties.
Context `{R : relation A}.
Hint Constructors rtc nsteps bsteps tc : core.
Lemma acc_not_ex_loop x : Acc (flip R) x ¬ex_loop R x. Lemma acc_not_ex_loop x : Acc (flip R) x ¬ex_loop R x.
Proof. unfold not. induction 1; destruct 1; eauto. Qed. Proof. unfold not. induction 1; destruct 1; eauto. Qed.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment