Library RefAlgebraImplem_class

Require Export AlgebraType.

Definition PfCl := FiniteSet WordSize.

Inductive RelCl (h1 h2 : Heap) : Prop :=
  RelCl_def :
    (forall loc, h1 loc <> None -> h2 loc <> None) ->
    (forall loc o1 o2, h1 loc = Some o1 ->
                       h2 loc = Some o2 -> class o1 = class o2) ->
    RelCl h1 h2.

Lemma RelCl_refl : forall h, RelCl h h.
Proof.
  constructor; auto; intros.
  rewrite H in H0; injection H0; intros.
  subst; auto.
Qed.
Hint Resolve RelCl_refl.

Lemma RelCl_same_class : forall h loc o',
  (forall o, h loc = Some o -> class o = class o') ->
   RelCl h (substHeap h loc o').
Proof.
  intros; constructor; unfold substHeap.
  intros loc' H1; case Location_dec; intros; discriminate || auto.
  intros loc' o1 o2; case Location_dec; intros.
  injection H1; clear H1; intros; subst; auto.
  rewrite H0 in H1; injection H1; intros; subst; auto.
Qed.

Definition gammaCl (h:Heap) (s:PfCl) (loc:Location) : Prop :=
 s = None \/
 (h loc <> None /\
  forall o, h loc = Some o -> in_set (class o) s = true).

Definition gammaRefCl : Heap -> Gamma (PowPoset Location) (LatticeFiniteSet WordSize).
intros h.
refine (gamma_constr (PowPoset Location) (LatticeFiniteSet WordSize)
 (gammaCl h)
 _).
intros b1 b2 H loc.
inversion_clear H; intros.
left; auto.
destruct H.
discriminate H.
destruct H; right; split; auto.
intros.
apply in_set_monotone with (Some f1); try constructor; auto.
Defined.

Definition gammaTopRefCl : Heap -> GammaTop (PowPoset Location) (LatticeFiniteSet WordSize).
intros h.
refine (gammatop_constr (gammaRefCl h) _).
intros; simpl.
intros; left; auto.
Defined.

Definition gammaTopBestRefCl : Heap -> GammaBestTop Location LatticeAtomFiniteSet.
intros h.
refine (gammabesttop_constr LatticeAtomFiniteSet (gammaTopRefCl h) _ _ ).
simpl; intros.
destruct b as [S|]; auto; intros.
destruct H.
discriminate H.
destruct H.
destruct H0.
discriminate H0.
destruct H0.
CaseEq (h a); intros.
apply in_set_eq with (class c); auto.
apply in_set_singleton; auto.
elim H; auto.
simpl; intros.
destruct H.
elim H0; auto.
destruct H.
CaseEq (h a); intros.
exists (class c).
simpl; right; split; auto.
intros.
rewrite H3 in H2; injection H2; intros; subst.
apply in_singleton.
elim H; auto.
Defined.

Definition RefAlgebraCl (P:Program) : Ref.Connect P.
refine (fun P => Ref.Build_Connect
  RelCl
  (fun tr => (hSt (currentState tr)))
  gammaTopBestRefCl _
  (fun cl pc => (singleton cl)) _ _ _ _).
intros h1 h2 H s loc H1.
inversion_clear H; destruct H1.
left; auto.
destruct H; right; split; auto.
intros.
CaseEq (h1 loc); intros.
rewrite <- (H2 _ _ _ H4 H3); auto.
elim H; auto.
intros tr1 tr2 cl pc Hsem H loc H1.
inversion_clear H1.
inversion_clear H0.
inversion_clear Hsem; simpl.
CaseEq (currentState tr1); intros.
rewrite H4 in H; rewrite H4 in H2; rewrite H4 in H0; simpl in *; subst.
inversion_clear H0.
right; split; subst.
simpl; unfold substHeap; case Location_dec; intros; auto.
discriminate.
simpl hSt.
intros o'; unfold substHeap; case Location_dec; intros; auto.
injection H0; clear H0; intros; subst.
unfold def; simpl class.
generalize (searchClass_rec_in_l_classname _ _ _ H2); intros.
apply in_singleton_eq; auto.

intros tr1 tr2 r H; inversion_clear H.
CaseEq (currentState tr1); intros h1 pc1 l1 s1 Heq; rewrite Heq in H0.
inversion_clear H0; simpl; auto.
subst; apply RelCl_same_class.
intros.
generalize (searchClass_rec_in_l_classname _ _ _ H1); intros.
generalize (searchClass_in_class _ _ _ H1); intros.
rewrite (newObject_specif _ _ _ h1 H3 H2) in H0.
discriminate H0.
apply RelCl_same_class.
intros.
rewrite H0 in H1; injection H1; intros; subst.
rewrite class_substField; auto.

intros tr1 tr2 r H Hr; inversion_clear H.
CaseEq (currentState tr1); intros h1 pc1 l1 s1 Heq; rewrite Heq in H0.
inversion_clear H0 in Hr; simpl; auto.
inversion_clear Hr.
constructor.
intros loc0; unfold substHeap; case Location_dec; intros.
subst; rewrite H1; discriminate.
auto.
intros loc0; unfold substHeap; case Location_dec; intros.
subst; rewrite H3 in H1; injection H1; intros; subst.
injection H0; intros; subst.
rewrite class_substField; auto.
rewrite H0 in H3; injection H3; intros; subst; auto.

intros.
inversion_clear H in H0 H1 H2.
CaseEq (currentState tr1); intros h1' pc1 l1 s1 Heq.
rewrite Heq in H0; rewrite Heq in H3; simpl in *; subst.
clear Heq; inversion_clear H3 in H1 H2; simpl in *.
destruct H2.
left; auto.
destruct H2.
subst.
right; split; auto.
intros.
generalize dependent H2;
generalize dependent H3;
 unfold substHeap; case Location_dec; intros.
subst.
generalize (searchClass_in_class _ _ _ H0); intros.
generalize (searchClass_in_class_nameClass _ _ _ H0); intros.
elim H1; rewrite (newObject_specif _ _ _ h1' H5 H6); auto.
auto.
Defined.


Index
This page has been generated by coqdoc