Library Fairisle.Fairisle.PROOFS.Lemmas_for_Arbitration



Require Export Behaviour_Struct_lemmas.
Require Export Timing_Arbiter.
Require Export Arbitration_Proof.
Require Export Arbitration_Specif.
Require Export Arbitration_beh_sc.

Set Implicit Arguments.
Unset Strict Implicit.

Lemma Inv_P_Timing_Inv_A :
 
   (i : Stream
          (bool ×
           (d_list bool 4 × (d_list bool 4 × d_list (d_list bool 2) 4))))
   (sA : Stream STATE_A)
   (sitpa4 : Stream (state_id × (label_t × STATE_p) × STATE_a4)),
 Inv_P_Timing (S_map (fst (B:=_)) i) (S_Snd_of_3 (S_map (fst (B:=_)) sitpa4)) →
 Inv P_A i sA sitpa4.
cofix.
intros i sA sitpa4 H_p.
inversion_clear H_p.
apply C_Inv.
unfold P_A in |- *; simpl in H.
generalize H; clear H.
elim (S_head sitpa4); intros itp sa4.
elim itp; intros si tp.
elim tp; intros t p.
simpl in |- *; try trivial.
elim (S_head i); simpl in |- ×.
intros y y0; elim y0; simpl in |- *; auto.
apply Inv_P_Timing_Inv_A; try trivial.
Qed.

 Definition f_tpi
   (i : bool × (d_list bool 4 × (d_list bool 4 × d_list (d_list bool 2) 4))) :=
   let (fs, t) := i in
   let (act, p) := t in
   let (pri, route) := p in (fs, (fs, (act, (pri, route)))).

 Definition f_tp
   (i : bool × (d_list bool 4 × (d_list bool 4 × d_list (d_list bool 2) 4))) :=
   let (fs, t) := i in
   let (act, p) := t in
   let (pri, route) := p in (fs, act, (act, (pri, route))).

  Lemma S_Snd_S_f_tpi_simpl :
   
     i : Stream
           (bool ×
            (d_list bool 4 × (d_list bool 4 × d_list (d_list bool 2) 4))),
   EqS (S_map (snd (B:=_)) (S_map f_tpi i)) i.
  cofix.
  intro i'.
  apply eqS; simpl in |- ×.
  unfold f_tpi in |- ×.
  elim (S_head i'); intros fs y.
  elim y; intros act y'.
  elim y'; intros pri route; auto.
  auto.
  Qed.

  Lemma S_Fst_S_f_tp_simpl :
   
     i : Stream
           (bool ×
            (d_list bool 4 × (d_list bool 4 × d_list (d_list bool 2) 4))),
   EqS (S_map (fst (B:=_)) (S_map f_tp i))
     (Compact (S_map (fst (B:=_)) i)
        (S_map (fst (B:=_)) (S_map (snd (B:=_)) i))).
  cofix.
  intro.
  apply eqS.
  simpl in |- *; auto.
  unfold f_tp in |- *; auto.
  elim (S_head i); intros y y0.
  elim y0; intros y1 y2.
  elim y2; intros y3 y4.
  auto.
  simpl in |- *; auto.
  Qed.

  Lemma EqS_Snd_SC_TIMING :
   
     (i : Stream
            (bool ×
             (d_list bool 4 × (d_list bool 4 × d_list (d_list bool 2) 4))))
     (si : state_id) (st : label_t) (sp : STATE_p)
     (sa4 : STATE_a4),
   EqS
     (S_Snd_of_3
        (S_map (fst (B:=_)) (States_Beh_SC_ARBITRATION i (si, (st, sp), sa4))))
     (States_TIMING
        (Compact (S_map (fst (B:=_)) i)
           (S_map (fst (B:=_)) (S_map (snd (B:=_)) i))) st).

  intros i si st sp sa4.
  unfold States_Beh_SC_ARBITRATION in |- ×.
  apply
   EqS_trans with (S_Snd_of_3 (States_Beh_TIMINGPDECODE_ID i (si, (st, sp)))).
  apply EqS_S_Snd_of_3.
  unfold States_Beh_TIMINGPDECODE_ID in |- *; unfold States_PC in |- *;
   unfold Trans_TimingPDecode_Id in |- ×.
  apply States_SC_simpl.
  unfold States_Beh_TIMINGPDECODE_ID in |- ×.

  apply
   EqS_trans
    with
      (S_Snd_of_3
         (Compact (States_IDENTITY (S_map (fst (B:=_)) (S_map f_tpi i)) si)
            (States_Beh_TIMING_PDECODE (S_map (snd (B:=_)) (S_map f_tpi i))
               (st, sp)))).

  apply EqS_S_Snd_of_3.
  unfold States_IDENTITY in |- *; unfold States_Beh_TIMING_PDECODE in |- *;
   unfold States_PC at 2 in |- ×.
  apply EqS_sym; apply Equiv_States_A1A2_PC.

  apply
   EqS_trans
    with
      (S_Snd_of_3
         (Compact (States_IDENTITY (S_map (fst (B:=_)) (S_map f_tpi i)) si)
            (States_Beh_TIMING_PDECODE i (st, sp)))).

  apply EqS_S_Snd_of_3.
  apply EqS_Compact.
  apply EqS_reflex.
  unfold States_Beh_TIMING_PDECODE in |- *; apply Equiv_States_PC; auto.
  apply S_Snd_S_f_tpi_simpl.
  apply
   EqS_trans
    with
      (S_Snd_of_3
         (Compact (States_IDENTITY (S_map (fst (B:=_)) (S_map f_tpi i)) si)
            (Compact (States_TIMING (S_map (fst (B:=_)) (S_map f_tp i)) st)
               (States_PRIORITY_DECODE (S_map (snd (B:=_)) (S_map f_tp i)) sp)))).
  apply EqS_S_Snd_of_3.
  apply EqS_Compact.
  apply EqS_reflex.
  unfold States_TIMING in |- *; unfold States_PRIORITY_DECODE in |- *;
   unfold States_Beh_TIMING_PDECODE in |- ×.
  apply EqS_sym; apply Equiv_States_A1A2_PC.
  apply EqS_trans with (States_TIMING (S_map (fst (B:=_)) (S_map f_tp i)) st). apply S_Snd_of_3_Compact.
  unfold States_TIMING in |- ×.
  apply EqS_States_Mealy.
  try trivial.
  apply S_Fst_S_f_tp_simpl.
  Qed.