Library Regularity

Require Export Omega Coq.Setoids.Setoid List Util AutoIndTac Base CFP FreeVariables TailRecursion.

Set Implicit Arguments.
Unset Printing Records.

Require Import Autosubst.

Regularity for context-free programs


Inductive reg: natcfpProp :=
| RegEps n
  : reg n CFPEps
| RegVar n x
  : n xreg n (CFPVar x)
| RegSeq n s t
  : reg n sreg n treg n (CFPSeq s t)
| RegChoice n s t
  : reg n sreg n treg n (CFPChoice s t)
| RegStar n s
  : reg (S n) sreg n (Star s)
| RegNull n
  : reg n Null.

Properties of reg


Fact reg_bound n s
  : reg n sbound 0 n s.
Proof.
  intros. general induction H; eauto using bound.
  constructor. constructor; eauto using bound.
  constructor; eauto using bound.
  assert (1 = 0+1); try omega. rewrite H0.
  apply bound_shift_interval. asimpl.
  eauto.
Qed.

Fact reg_tailrec n s
  : reg n stailrec n s.
Proof.
  intros. general induction H; eauto using tailrec, reg_bound.
Qed.

Fact reg_step n m s
  : reg n sm nreg m s.
Proof.
  intros. general induction H; eauto using reg.
  - constructor. omega.
  - constructor. apply IHreg. omega.
Qed.

Fact reg_name_preserve s n m f
  : ( x, n xm f x)
    → reg n sreg m s.[ren(f)].
Proof.
  intros. general induction H0; eauto using reg.
  constructor. asimpl. apply IHreg.
  intros. destruct x; try omega.
  asimpl. assert (m f x).
  { apply H. omega. }
  omega.
Qed.

Fact reg_shift s n
  : reg (S n) sreg n s.[ren(shift)].
Proof.
  intros.
  apply reg_name_preserve with (n:= S n); eauto.
  intros. destruct x; asimpl; try omega.
Qed.

Fact bound_reg n k s
  : reg n sbound n k sreg (n+k) s.
Proof.
  intros. general induction H; eauto using reg.
  - inv H0; constructor; omega.
  - inv H1. eauto using reg.
  - inv H1. eauto using reg.
  - inv H0. constructor. apply IHreg.
    inv H4. inv H7. eauto.
Qed.

Alternative characterization of regularity


Inductive regi: cfpProp :=
| RegiEps
  : regi CFPEps
| RegiVar x
  : regi (CFPVar x)
| RegiSeq s t
  : regi sregi tregi (CFPSeq s t)
| RegiChoice s t
  : regi sregi tregi (CFPChoice s t)
| RegiNull
  : regi Null
| RegiStar s
  : bound 0 1 sregi sregi (Star s).

Correspondence of reg and regi


Fact reg_regi n s
  : reg n sregi s.
Proof.
  intros. general induction H; eauto using regi.
  constructor; eauto.
  apply reg_bound in H. apply bound_step with (k:= S n); eauto.
  omega.
Qed.

Fact regi_reg s
  : regi sreg 0 s.
Proof.
  intros. general induction H; eauto using reg.
  - constructor. omega.
  - constructor. assert (1 = 0 +1); try omega.
    rewrite H1. apply bound_reg; eauto.
Qed.

Fact reg_correct n s
  : reg n s regi s bound 0 n s.
Proof.
  split; intros.
  - split; eauto using reg_regi, reg_bound.
  - destruct H. apply regi_reg in H.
    assert (n = 0 + n); try omega.
    rewrite H1.
    eauto using bound_reg.
Qed.