Library CoLoR.Term.Varyadic.VTrs

CoLoR, a Coq library on rewriting and termination. See the COPYRIGHTS and LICENSE files.
  • Frederic Blanqui, 2005-02-17
rewriting

Set Implicit Arguments.

Require Import VContext.
Require Import VSubstitution.
Require Import RelUtil.

definition

Section def.

Variable Sig : Signature.

Notation term := (term Sig).

Record rule : Type := mkRule { lhs : term; rhs : term }.

Definition red R t1 t2 := exists l, exists r, exists c, exists s,
  In (mkRule l r) R /\ t1 = fill c (sub s l) /\ t2 = fill c (sub s r).

Definition hd_red R t1 t2 := exists l, exists r, exists s,
  In (mkRule l r) R /\ t1 = sub s l /\ t2 = sub s r.

Definition int_red R t1 t2 := exists l, exists r, exists c, exists s,
  c <> Hole
  /\ In (mkRule l r) R /\ t1 = fill c (sub s l) /\ t2 = fill c (sub s r).

Definition red_mod E R := red E # @ red R.

End def.

tactics

Ltac redtac := repeat
  match goal with
    | H : red ?R ?t ?u |- _ =>
      let l := fresh "l" in let r := fresh "r" in let c := fresh "c" in
      let s := fresh "s" in let h1 := fresh in
      (unfold red in H; destruct H as [l]; destruct H as [r]; destruct H as [c];
      destruct H as [s]; destruct H as [H h1]; destruct h1)
    | H : transp (red _) _ _ |- _ => unfold transp in H; redtac
    | H : hd_red ?R ?t ?u |- _ =>
      let l := fresh "l" in let r := fresh "r" in
      let s := fresh "s" in let h1 := fresh in
      (unfold hd_red in H; destruct H as [l]; destruct H as [r];
      destruct H as [s]; destruct H as [H h1]; destruct h1)
    | H : transp (hd_red _) _ _ |- _ => unfold transp in H; redtac
    | H : int_red ?R ?t ?u |- _ =>
      let l := fresh "l" in let r := fresh "r" in let c := fresh "c" in
      let s := fresh "s" in let h1 := fresh in let h2 := fresh in
      (unfold int_red in H; destruct H as [l]; destruct H as [r];
      destruct H as [c]; destruct H as [s]; destruct H as [H h1];
      destruct h1 as [h1 h2]; destruct h2)
    | H : transp (int_red _) _ _ |- _ =>
      unfold transp in H; redtac
  end.

properties

Section S.

Variable Sig : Signature.

Notation rule := (rule Sig).

Variable R : list rule.

Lemma red_rule : forall l r c s,
  In (mkRule l r) R -> red R (fill c (sub s l)) (fill c (sub s r)).

Proof.
intros. unfold red. exists l. exists r. exists c. exists s. auto.
Qed.

Lemma red_rule_top : forall l r s,
  In (mkRule l r) R -> red R (sub s l) (sub s r).

Proof.
intros. unfold red. exists l . exists r. exists (@Hole Sig). exists s. auto.
Qed.

Lemma red_fill : forall c t u, red R t u -> red R (fill c t) (fill c u).

Proof.
intros. redtac. unfold red.
exists l. exists r. exists (VContext.comp c c0). exists s. split. assumption.
subst t. subst u. do 2 rewrite fill_comp. auto.
Qed.

End S.