Library PiCalc.xadequacy
Require Export picalcth.
Section picalc_xadeq.
Lemma Op_StBisim_monotone :
forall R1 R2 : proc -> proc -> Prop,
Inclus R1 R2 -> Inclus (Op_StBisim R1) (Op_StBisim R2).
Proof.
unfold Inclus in |- *.
intros.
inversion H0.
apply op_sb.
split.
intro.
cut
((forall p0 : proc,
ftrans p1 a p0 -> exists q1 : proc, ftrans p2 a q1 /\ R1 p0 q1) /\
(forall q1 : proc,
ftrans p2 a q1 -> exists p0 : proc, ftrans p1 a p0 /\ R1 p0 q1)).
intro. elim H2. intros. clear H2. split. intros.
cut (exists q1 : proc, ftrans p2 a q1 /\ R1 p0 q1).
intro.
elim H5. intros. clear H5.
exists x.
split. tauto. elim H6.
intros. clear H6.
auto. auto. intros.
cut (exists p0 : proc, ftrans p1 a p0 /\ R1 p0 q1).
intro.
elim H5. intros. clear H5.
exists x.
split. tauto. elim H6.
intros. clear H6.
auto. auto. elim H1. intros. auto.
split.
intro.
cut
((forall p0 : name -> proc,
btrans p1 (In x) p0 ->
exists q1 : name -> proc,
btrans p2 (In x) q1 /\ (forall y : name, R1 (p0 y) (q1 y))) /\
(forall q1 : name -> proc,
btrans p2 (In x) q1 ->
exists p0 : name -> proc,
btrans p1 (In x) p0 /\ (forall y : name, R1 (p0 y) (q1 y)))).
intro. elim H2. intros. clear H2. split. intros.
cut
(exists q1 : name -> proc,
btrans p2 (In x) q1 /\ (forall y : name, R1 (p0 y) (q1 y))).
intro.
elim H5. intros. clear H5.
exists x0.
split. tauto. elim H6.
intros. clear H6.
auto. auto. intros.
cut
(exists p0 : name -> proc,
btrans p1 (In x) p0 /\ (forall y : name, R1 (p0 y) (q1 y))).
intro.
elim H5. intros. clear H5.
exists x0.
split. tauto. elim H6.
intros. clear H6.
auto. auto. elim H1. intros. elim H3. intros. auto.
intro.
cut
((forall p0 : name -> proc,
btrans p1 (bOut x) p0 ->
exists q1 : name -> proc,
btrans p2 (bOut x) q1 /\
(forall y : name, notin y (nu p0) -> notin y (nu q1) -> R1 (p0 y) (q1 y))) /\
(forall q1 : name -> proc,
btrans p2 (bOut x) q1 ->
exists p0 : name -> proc,
btrans p1 (bOut x) p0 /\
(forall y : name, notin y (nu p0) -> notin y (nu q1) -> R1 (p0 y) (q1 y)))).
intros. elim H2. intros. clear H2. split. intros.
cut
(exists q1 : name -> proc,
btrans p2 (bOut x) q1 /\
(forall y : name, notin y (nu p0) -> notin y (nu q1) -> R1 (p0 y) (q1 y))).
intro.
elim H5. intros. clear H5.
exists x0.
split. tauto. elim H6.
intros. clear H6.
auto. auto. intros.
cut
(exists p0 : name -> proc,
btrans p1 (bOut x) p0 /\
(forall y : name, notin y (nu p0) -> notin y (nu q1) -> R1 (p0 y) (q1 y))).
intro.
elim H5. intros. clear H5.
exists x0.
split. tauto. elim H6.
intros. clear H6.
auto. auto. elim H1. intros. elim H3. intros. auto.
Qed.
Lemma Soundness : forall p1 p2 : proc, StBisim p1 p2 -> StBisim' p1 p2.
Proof.
intros.
apply Co_Ind with StBisim.
unfold Inclus in |- *.
intros.
inversion H0.
apply op_sb.
auto. auto.
Qed.
Lemma Completeness : forall p1 p2 : proc, StBisim' p1 p2 -> StBisim p1 p2.
Proof.
intros. elim H. unfold Inclus in |- *. do 2 intro. generalize p1 p2.
cofix. intros. case (H0 p0 p3 H1). intros.
apply sb. split. intro.
cut
((forall p1 : proc,
ftrans p0 a p1 -> exists q1 : proc, ftrans p3 a q1 /\ R p1 q1) /\
(forall q1 : proc,
ftrans p3 a q1 -> exists p1 : proc, ftrans p0 a p1 /\ R p1 q1)).
intro. elim H3. intros. clear H3. split. intros. cut (exists q1 : proc, ftrans p3 a q1 /\ R p4 q1).
intro. elim H6. intros. clear H6. exists x. split. tauto. apply Completeness. tauto. auto. intros.
cut (exists p1 : proc, ftrans p0 a p1 /\ R p1 q1). intro. elim H6. intros. clear H6. exists x. split. tauto.
apply Completeness. tauto. auto. elim H2. intros. auto.
split.
intro.
cut
((forall p1 : name -> proc,
btrans p0 (In x) p1 ->
exists q1 : name -> proc,
btrans p3 (In x) q1 /\ (forall y : name, R (p1 y) (q1 y))) /\
(forall q1 : name -> proc,
btrans p3 (In x) q1 ->
exists p1 : name -> proc,
btrans p0 (In x) p1 /\ (forall y : name, R (p1 y) (q1 y)))).
intro. elim H3. intros. clear H3. split. intros.
cut
(exists q1 : name -> proc,
btrans p3 (In x) q1 /\ (forall y : name, R (p4 y) (q1 y))).
intro. elim H6. intros. clear H6. exists x0. split. tauto. intro. apply Completeness. elim H7. intros. auto.
auto. intros.
cut
(exists p1 : name -> proc,
btrans p0 (In x) p1 /\ (forall y : name, R (p1 y) (q1 y))).
intro. elim H6. intros. clear H6. exists x0. split. tauto. intro. apply Completeness. elim H7. intros. auto.
auto. elim H2. intros. elim H4. intros. auto.
intro.
cut
((forall p1 : name -> proc,
btrans p0 (bOut x) p1 ->
exists q1 : name -> proc,
btrans p3 (bOut x) q1 /\
(forall y : name, notin y (nu p1) -> notin y (nu q1) -> R (p1 y) (q1 y))) /\
(forall q1 : name -> proc,
btrans p3 (bOut x) q1 ->
exists p1 : name -> proc,
btrans p0 (bOut x) p1 /\
(forall y : name, notin y (nu p1) -> notin y (nu q1) -> R (p1 y) (q1 y)))).
intro. elim H3. intros. clear H3. split. intros.
cut
(exists q1 : name -> proc,
btrans p3 (bOut x) q1 /\
(forall y : name, notin y (nu p4) -> notin y (nu q1) -> R (p4 y) (q1 y))).
intro. elim H6. intros. clear H6. exists x0. split. tauto. intros. apply Completeness. elim H7. intros. auto.
auto. intros.
cut
(exists p1 : name -> proc,
btrans p0 (bOut x) p1 /\
(forall y : name, notin y (nu p1) -> notin y (nu q1) -> R (p1 y) (q1 y))).
intro. elim H6. intros. clear H6. exists x0. split. tauto. intros. apply Completeness. elim H7. intros. auto.
auto. elim H2. intros. elim H4. intros. auto.
Qed.
End picalc_xadeq.
