Commit 93de71b2 authored by Robbert Krebbers's avatar Robbert Krebbers

Clean up ars.v.

parent 7df27997
......@@ -37,28 +37,35 @@ Section definitions.
| tc_once x y : R x y tc x y
| tc_l x y z : R x y tc y z tc x z.
(** An element [x] is looping if all paths starting at [x] are infinite. *)
CoInductive looping : A Prop :=
| looping_do_step x : red x ( y, R x y looping y) looping x.
(** An element [x] is universally looping if all paths starting at [x]
are infinite. *)
CoInductive all_loop : A Prop :=
| all_loop_do_step x : red x ( y, R x y all_loop y) all_loop x.
(** An element [x] is existentally looping if some path starting at [x]
is infinite. *)
CoInductive ex_loop : A Prop :=
| ex_loop_do_step x y : R x y ex_loop y ex_loop x.
End definitions.
Hint Constructors rtc nsteps bsteps tc : ars.
(** * General theorems *)
Section rtc.
Context `{R : relation A}.
Hint Constructors rtc nsteps bsteps tc.
Global Instance rtc_reflexive: Reflexive (rtc R).
Proof. red. apply rtc_refl. Qed.
Global Instance rtc_transitive: Transitive (rtc R).
Proof. red. induction 1; eauto with ars. Qed.
Proof. exact (@rtc_refl A R). Qed.
Lemma rtc_transitive x y z : rtc R x y rtc R y z rtc R x z.
Proof. induction 1; eauto. Qed.
Global Instance: Transitive (rtc R).
Proof. exact rtc_transitive. Qed.
Lemma rtc_once x y : R x y rtc R x y.
Proof. eauto with ars. Qed.
Proof. eauto. Qed.
Instance rtc_once_subrel: subrelation R (rtc R).
Proof. exact @rtc_once. Qed.
Lemma rtc_r x y z : rtc R x y R y z rtc R x z.
Proof. intros. etransitivity; eauto with ars. Qed.
Proof. intros. etransitivity; eauto. Qed.
Lemma rtc_inv x z : rtc R x z x = z y, R x y rtc R y z.
Proof. inversion_clear 1; eauto. Qed.
Lemma rtc_ind_r_weak (P : A A Prop)
......@@ -79,22 +86,22 @@ Section rtc.
Proof. revert z. apply rtc_ind_r; eauto. Qed.
Lemma nsteps_once x y : R x y nsteps R 1 x y.
Proof. eauto with ars. Qed.
Proof. eauto. Qed.
Lemma nsteps_trans n m x y z :
nsteps R n x y nsteps R m y z nsteps R (n + m) x z.
Proof. induction 1; simpl; eauto with ars. Qed.
Proof. induction 1; simpl; eauto. Qed.
Lemma nsteps_r n x y z : nsteps R n x y R y z nsteps R (S n) x z.
Proof. induction 1; eauto with ars. Qed.
Proof. induction 1; eauto. Qed.
Lemma nsteps_rtc n x y : nsteps R n x y rtc R x y.
Proof. induction 1; eauto with ars. Qed.
Proof. induction 1; eauto. Qed.
Lemma rtc_nsteps x y : rtc R x y n, nsteps R n x y.
Proof. induction 1; firstorder eauto with ars. Qed.
Proof. induction 1; firstorder eauto. Qed.
Lemma bsteps_once n x y : R x y bsteps R (S n) x y.
Proof. eauto with ars. Qed.
Proof. eauto. Qed.
Lemma bsteps_plus_r n m x y :
bsteps R n x y bsteps R (n + m) x y.
Proof. induction 1; simpl; eauto with ars. Qed.
Proof. induction 1; simpl; eauto. Qed.
Lemma bsteps_weaken n m x y :
n m bsteps R n x y bsteps R m x y.
Proof.
......@@ -107,62 +114,57 @@ Section rtc.
Proof. apply bsteps_weaken. lia. Qed.
Lemma bsteps_trans n m x y z :
bsteps R n x y bsteps R m y z bsteps R (n + m) x z.
Proof. induction 1; simpl; eauto using bsteps_plus_l with ars. Qed.
Proof. induction 1; simpl; eauto using bsteps_plus_l. Qed.
Lemma bsteps_r n x y z : bsteps R n x y R y z bsteps R (S n) x z.
Proof. induction 1; eauto with ars. Qed.
Proof. induction 1; eauto. Qed.
Lemma bsteps_rtc n x y : bsteps R n x y rtc R x y.
Proof. induction 1; eauto with ars. Qed.
Proof. induction 1; eauto. Qed.
Lemma rtc_bsteps x y : rtc R x y n, bsteps R n x y.
Proof.
induction 1.
* exists 0. constructor.
* naive_solver eauto with ars.
Qed.
Proof. induction 1; [exists 0; constructor|]. naive_solver eauto. Qed.
Lemma bsteps_ind_r (P : nat A Prop) (x : A)
(Prefl : n, P n x)
(Pstep : n y z, bsteps R n x y R y z P n y P (S n) z) :
n z, bsteps R n x z P n z.
Proof.
cut ( m y z, bsteps R m y z n,
bsteps R n x y
( m', n m' m' n + m P m' y)
P (n + m) z).
{ intros help ?. change n with (0 + n). eauto with ars. }
bsteps R n x y ( m', n m' m' n + m P m' y) P (n + m) z).
{ intros help ?. change n with (0 + n). eauto. }
induction 1 as [|m x' y z p2 p3 IH]; [by eauto with arith|].
intros n p1 H. rewrite <-plus_n_Sm.
apply (IH (S n)); [by eauto using bsteps_r |].
intros [|m'] [??]; [lia |].
apply Pstep with x'.
intros [|m'] [??]; [lia |]. apply Pstep with x'.
* apply bsteps_weaken with n; intuition lia.
* done.
* apply H; intuition lia.
Qed.
Global Instance tc_trans: Transitive (tc R).
Proof. red; induction 1; eauto with ars. Qed.
Lemma tc_transitive x y z : tc R x y tc R y z tc R x z.
Proof. induction 1; eauto. Qed.
Global Instance: Transitive (tc R).
Proof. exact tc_transitive. Qed.
Lemma tc_r x y z : tc R x y R y z tc R x z.
Proof. intros. etransitivity; eauto with ars. Qed.
Proof. intros. etransitivity; eauto. Qed.
Lemma tc_rtc_l x y z : rtc R x y tc R y z tc R x z.
Proof. induction 1; eauto. Qed.
Lemma tc_rtc_r x y z : tc R x y rtc R y z tc R x z.
Proof. intros Hxy Hyz. revert x Hxy. induction Hyz; eauto using tc_r. Qed.
Lemma tc_rtc x y : tc R x y rtc R x y.
Proof. induction 1; eauto with ars. Qed.
Proof. induction 1; eauto. Qed.
Instance tc_once_subrel: subrelation (tc R) (rtc R).
Proof. exact @tc_rtc. Qed.
Lemma looping_red x : looping R x red R x.
Lemma all_loop_red x : all_loop R x red R x.
Proof. destruct 1; auto. Qed.
Lemma looping_step x y : looping R x R x y looping R y.
Lemma all_loop_step x y : all_loop R x R x y all_loop R y.
Proof. destruct 1; auto. Qed.
Lemma looping_rtc x y : looping R x rtc R x y looping R y.
Proof. induction 2; eauto using looping_step. Qed.
Lemma looping_alt x :
looping R x y, rtc R x y red R y.
Lemma all_loop_rtc x y : all_loop R x rtc R x y all_loop R y.
Proof. induction 2; eauto using all_loop_step. Qed.
Lemma all_loop_alt x :
all_loop R x y, rtc R x y red R y.
Proof.
split.
* eauto using looping_red, looping_rtc.
* intros H. cut ( z, rtc R x z looping R z).
{ eauto with ars. }
cofix FIX. constructor; eauto using rtc_r with ars.
split; [eauto using all_loop_red, all_loop_rtc|].
intros H. cut ( z, rtc R x z all_loop R z); [eauto|].
cofix FIX. constructor; eauto using rtc_r.
Qed.
End rtc.
......@@ -172,9 +174,9 @@ Hint Extern 5 (subrelation _ (rtc _)) =>
Hint Extern 5 (subrelation _ (tc _)) =>
eapply @tc_once_subrel : typeclass_instances.
Hint Resolve
rtc_once rtc_r tc_r
bsteps_once bsteps_r bsteps_refl bsteps_trans : ars.
Hint Constructors rtc nsteps bsteps tc : ars.
Hint Resolve rtc_once rtc_r tc_r rtc_transitive tc_rtc_l tc_rtc_r
tc_rtc bsteps_once bsteps_r bsteps_refl bsteps_trans : ars.
(** * Theorems on sub relations *)
Section subrel.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment