Library ARS
Abstract Reduction Systems, from Semantics Lecture at Programming Systems Lab, https://www.ps.uni-saarland.de/courses/sem-ws13/
Require Export Base.
Notation "p '<=1' q" := (∀ x, p x → q x) (at level 70).
Notation "p '=1' q" := (p <=1 q ∧ q <=1 p) (at level 70).
Notation "R '<=2' S" := (∀ x y, R x y → S x y) (at level 70).
Notation "R '=2' S" := (R <=2 S ∧ S <=2 R) (at level 70).
Relational composition
Definition rcomp X Y Z (R : X → Y → Prop) (S : Y → Z → Prop)
: X → Z → Prop :=
fun x z ⇒ ∃ y, R x y ∧ S y z.
Power predicates
Require Import Arith.
Definition pow X R n : X → X → Prop := it (rcomp R) n eq.
Section FixX.
Variable X : Type.
Implicit Types R S : X → X → Prop.
Implicit Types x y z : X.
Definition reflexive R := ∀ x, R x x.
Definition symmetric R := ∀ x y, R x y → R y x.
Definition transitive R := ∀ x y z, R x y → R y z → R x z.
Definition functional R := ∀ x y z, R x y → R x z → y = z.
Reflexive transitive closure
Inductive star R : X → X → Prop :=
| starR x : star R x x
| starC x y z : R x y → star R y z → star R x z.
Lemma star_simpl_ind R (p : X → Prop) y :
p y →
(∀ x x', R x x' → star R x' y → p x' → p x) →
∀ x, star R x y → p x.
Proof.
intros A B. induction 1; eauto.
Qed.
Lemma star_trans R:
transitive (star R).
Proof.
induction 1; eauto using star.
Qed.
Power characterization
Lemma star_pow R x y :
star R x y ↔ ∃ n, pow R n x y.
Proof.
split; intros A.
- induction A as [|x x' y B _ [n IH]].
+ ∃ 0. reflexivity.
+ ∃ (S n), x'. auto.
- destruct A as [n A].
revert x A. induction n; intros x A.
+ destruct A. constructor.
+ destruct A as [x' [A B]]. econstructor; eauto.
Qed.
Lemma pow_star R x y n:
pow R n x y → star R x y.
Proof.
intros A. erewrite star_pow. eauto.
Qed.
Equivalence closure
Inductive ecl R : X → X → Prop :=
| eclR x : ecl R x x
| eclC x y z : R x y → ecl R y z → ecl R x z
| eclS x y z : R y x → ecl R y z → ecl R x z.
Lemma ecl_trans R :
transitive (ecl R).
Proof.
induction 1; eauto using ecl.
Qed.
Lemma ecl_sym R :
symmetric (ecl R).
Proof.
induction 1; eauto using ecl, (@ecl_trans R).
Qed.
Lemma star_ecl R :
star R <=2 ecl R.
Proof.
induction 1; eauto using ecl.
Qed.
Diamond, confluence, Church-Rosser
Definition joinable R x y :=
∃ z, R x z ∧ R y z.
Definition diamond R :=
∀ x y z, R x y → R x z → joinable R y z.
Definition confluent R := diamond (star R).
Definition semi_confluent R :=
∀ x y z, R x y → star R x z → joinable (star R) y z.
Definition church_rosser R :=
ecl R <=2 joinable (star R).
Goal ∀ R, diamond R → semi_confluent R.
Proof.
intros R A x y z B C.
revert x C y B.
refine (star_simpl_ind _ _).
- intros y C. ∃ y. eauto using star.
- intros x x' C D IH y E.
destruct (A _ _ _ C E) as [v [F G]].
destruct (IH _ F) as [u [H I]].
assert (J:= starC G H).
∃ u. eauto using star.
Qed.
Lemma diamond_to_semi_confluent R :
diamond R → semi_confluent R.
Proof.
intros A x y z B C. revert y B.
induction C as [|x x' z D _ IH]; intros y B.
- ∃ y. eauto using star.
- destruct (A _ _ _ B D) as [v [E F]].
destruct (IH _ F) as [u [G H]].
∃ u. eauto using star.
Qed.
Lemma semi_confluent_confluent R :
semi_confluent R ↔ confluent R.
Proof.
split; intros A x y z B C.
- revert y B.
induction C as [|x x' z D _ IH]; intros y B.
+ ∃ y. eauto using star.
+ destruct (A _ _ _ D B) as [v [E F]].
destruct (IH _ E) as [u [G H]].
∃ u. eauto using (@star_trans R).
- apply (A x y z); eauto using star.
Qed.
Lemma diamond_to_confluent R :
diamond R → confluent R.
Proof.
intros A. apply semi_confluent_confluent, diamond_to_semi_confluent, A.
Qed.
Lemma confluent_CR R :
church_rosser R ↔ confluent R.
Proof.
split; intros A.
- intros x y z B C. apply A.
eauto using (@ecl_trans R), star_ecl, (@ecl_sym R).
- intros x y B. apply semi_confluent_confluent in A.
induction B as [x|x x' y C B IH|x x' y C B IH].
+ ∃ x. eauto using star.
+ destruct IH as [z [D E]]. ∃ z. eauto using star.
+ destruct IH as [u [D E]].
destruct (A _ _ _ C D) as [z [F G]].
∃ z. eauto using (@star_trans R).
Qed.
Lemma pow_add R n m (x y : X) : pow R (n + m) x y ↔ rcomp (pow R n) (pow R m) x y.
Proof.
revert m x y; induction n; intros m x y.
- simpl. split; intros. econstructor. split. unfold pow. simpl. reflexivity. eassumption.
destruct H as [u [H1 H2]]. unfold pow in H1. simpl in ×. subst x. eassumption.
- simpl in *; split; intros.
+ destruct H as [u [H1 H2]].
change (it (rcomp R) (n + m) eq) with (pow R (n+m)) in H2.
rewrite IHn in H2.
destruct H2 as [u' [A B]]. unfold pow in A.
econstructor.
split. econstructor. repeat split; repeat eassumption. eassumption.
+ destruct H as [u [H1 H2]].
destruct H1 as [u' [A B]].
econstructor. split. eassumption. change (it (rcomp R) (n + m) eq) with (pow R (n + m)).
rewrite IHn. econstructor. split; eassumption.
Qed.
Lemma rcomp_1 (R : X → X → Prop): R =2 pow R 1.
Proof.
split; intros x t; unfold pow in *; simpl in *; intros H.
- ∃ t. tauto.
- destruct H as [u [H1 H2]]; subst u; eassumption.
Qed.
End FixX.
Instance star_PreOrder X (R:X → X → Prop): PreOrder (star R).
Proof.
constructor; hnf.
- eapply starR.
- eapply star_trans.
Qed.
Instance ecl_equivalence X (R:X → X → Prop): Equivalence (ecl R).
Proof.
constructor; hnf.
- apply eclR.
- apply ecl_sym.
-apply ecl_trans.
Qed.
Instance R_star_subrelation X (R:X → X → Prop): subrelation R (star R).
Proof.
intros s t st. eauto using star.
Qed.
Instance pow_star_subrelation X (R:X → X → Prop) n: subrelation (pow R n) (star R).
Proof.
intros ? ?. apply pow_star.
Qed.
Instance star_ecl_subrelation X (R:X → X → Prop) : subrelation (star R) (ecl R).
Proof.
intros ? ?. apply star_ecl.
Qed.
Instance R_ecl_subrelation X (R:X → X → Prop): subrelation R (ecl R).
Proof.
intros ? ? ?. apply star_ecl_subrelation. now apply R_star_subrelation.
Qed.