Welcome to Abella 2.0.3-dev
Abella < Kind name, action type.
Abella < Type tau action.
Abella < Type up, dn name -> action.
Abella < Define is_action : action -> prop by
is_action tau;
is_action (up N);
is_action (dn N).
Abella < Kind proc type.
Abella < Type null proc.
Abella < Type plus, par proc -> proc -> proc.
Abella < Type act action -> proc -> proc.
Abella < Type repl proc -> proc.
Abella < Define is_proc : proc -> prop by
is_proc null;
is_proc (plus P Q) := is_proc P /\ is_proc Q;
is_proc (par P Q) := is_proc P /\ is_proc Q;
is_proc (act A P) := is_action A /\ is_proc P;
is_proc (repl P) := is_proc P.
Abella < Define one : proc -> action -> proc -> prop by
one (act A P) A P;
one (plus P1 P2) A Q := one P1 A Q;
one (plus P1 P2) A Q := one P2 A Q;
one (par P Q) A (par P1 Q) := one P A P1;
one (par P Q) A (par P Q1) := one Q A Q1;
one (repl P) A (par (repl P) Q) := one P A Q;
one (par P Q) tau (par P1 Q1) := exists X, one P (up X) P1 /\ one Q (dn X) Q1;
one (par P Q) tau (par P1 Q1) := exists X, one P (dn X) P1 /\ one Q (up X) Q1;
one (repl P) tau (par (repl P) (par Q R)) := exists X, one P (up X) Q /\ one P (dn X) R.
Abella < CoDefine bisim_up_to : (proc -> proc -> proc -> proc -> prop) -> proc -> proc -> prop by
bisim_up_to Tech P Q := (forall A P1, one P A P1 ->
(exists Q1, one Q A Q1 /\
(exists P2 Q2, Tech P1 P2 Q1 Q2 /\ bisim_up_to Tech P2 Q2))) /\
(forall A Q1, one Q A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, Tech P1 P2 Q1 Q2 /\ bisim_up_to Tech P2 Q2))).
Abella < Define refl_t : proc -> proc -> proc -> proc -> prop by
refl_t P P Q Q.
Abella < Define is_sound : (proc -> proc -> proc -> proc -> prop) -> prop by
is_sound Tech := forall P Q, bisim_up_to Tech P Q -> bisim_up_to refl_t P Q.
Warning: Definition can be used to defeat stratification
(higher-order argument "Tech" occurs to the left of ->)
Abella < CoDefine bisim : proc -> proc -> prop by
bisim P Q := bisim_up_to refl_t P Q.
Abella < Define symmetric_rel : (proc -> proc -> prop) -> prop by
symmetric_rel Rel := forall P Q, Rel P Q -> Rel Q P.
Warning: Definition can be used to defeat stratification
(higher-order argument "Rel" occurs to the left of ->)
Abella < Theorem bisim_symmetric :
symmetric_rel (bisim_up_to refl_t).
============================
symmetric_rel (bisim_up_to refl_t)
bisim_symmetric < unfold.
============================
forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P
bisim_symmetric < coinduction.
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
============================
forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P #
bisim_symmetric < intros.
Variables: P Q
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H1 : bisim_up_to refl_t P Q
============================
bisim_up_to refl_t Q P #
bisim_symmetric < case H1.
Variables: P Q
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
============================
bisim_up_to refl_t Q P #
bisim_symmetric < unfold.
Subgoal 1:
Variables: P Q
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
============================
forall A P1, one Q A P1 ->
(exists Q1, one P A Q1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_symmetric < intros.
Subgoal 1:
Variables: P Q A P1
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one Q A P1
============================
exists Q1, one P A Q1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_symmetric < apply H3 to H4.
Subgoal 1:
Variables: P Q A P1 P2 P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one Q A P1
H5 : one P A P2
H6 : refl_t P2 P3 P1 Q3
H7 : bisim_up_to refl_t P3 Q3
============================
exists Q1, one P A Q1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_symmetric < case H6.
Subgoal 1:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one Q A Q3
H5 : one P A P3
H7 : bisim_up_to refl_t P3 Q3
============================
exists Q1, one P A Q1 /\
(exists P2 Q2, refl_t Q3 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_symmetric < exists P3.
Subgoal 1:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one Q A Q3
H5 : one P A P3
H7 : bisim_up_to refl_t P3 Q3
============================
one P A P3 /\
(exists P2 Q2, refl_t Q3 P2 P3 Q2 /\ bisim_up_to refl_t P2 Q2 +)
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_symmetric < split.
Subgoal 1.1:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one Q A Q3
H5 : one P A P3
H7 : bisim_up_to refl_t P3 Q3
============================
one P A P3
Subgoal 1.2 is:
exists P2 Q2, refl_t Q3 P2 P3 Q2 /\ bisim_up_to refl_t P2 Q2 +
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_symmetric < search.
Subgoal 1.2:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one Q A Q3
H5 : one P A P3
H7 : bisim_up_to refl_t P3 Q3
============================
exists P2 Q2, refl_t Q3 P2 P3 Q2 /\ bisim_up_to refl_t P2 Q2 +
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_symmetric < witness Q3.
Subgoal 1.2:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one Q A Q3
H5 : one P A P3
H7 : bisim_up_to refl_t P3 Q3
============================
exists Q2, refl_t Q3 Q3 P3 Q2 /\ bisim_up_to refl_t Q3 Q2 +
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_symmetric < witness P3.
Subgoal 1.2:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one Q A Q3
H5 : one P A P3
H7 : bisim_up_to refl_t P3 Q3
============================
refl_t Q3 Q3 P3 P3 /\ bisim_up_to refl_t Q3 P3 +
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_symmetric < split.
Subgoal 1.2.1:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one Q A Q3
H5 : one P A P3
H7 : bisim_up_to refl_t P3 Q3
============================
refl_t Q3 Q3 P3 P3
Subgoal 1.2.2 is:
bisim_up_to refl_t Q3 P3 +
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_symmetric < search.
Subgoal 1.2.2:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one Q A Q3
H5 : one P A P3
H7 : bisim_up_to refl_t P3 Q3
============================
bisim_up_to refl_t Q3 P3 +
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_symmetric < backchain CH.
Subgoal 2:
Variables: P Q
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
============================
forall A Q1, one P A Q1 ->
(exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_symmetric < intros.
Subgoal 2:
Variables: P Q A Q1
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one P A Q1
============================
exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
bisim_symmetric < apply H2 to H4.
Subgoal 2:
Variables: P Q A Q1 Q2 P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one P A Q1
H5 : one Q A Q2
H6 : refl_t Q1 P3 Q2 Q3
H7 : bisim_up_to refl_t P3 Q3
============================
exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
bisim_symmetric < case H6.
Subgoal 2:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one P A P3
H5 : one Q A Q3
H7 : bisim_up_to refl_t P3 Q3
============================
exists P1, one Q A P1 /\
(exists P2 Q2, refl_t P1 P2 P3 Q2 /\ bisim_up_to refl_t P2 Q2 +)
bisim_symmetric < exists Q3.
Subgoal 2:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one P A P3
H5 : one Q A Q3
H7 : bisim_up_to refl_t P3 Q3
============================
one Q A Q3 /\
(exists P2 Q2, refl_t Q3 P2 P3 Q2 /\ bisim_up_to refl_t P2 Q2 +)
bisim_symmetric < split.
Subgoal 2.1:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one P A P3
H5 : one Q A Q3
H7 : bisim_up_to refl_t P3 Q3
============================
one Q A Q3
Subgoal 2.2 is:
exists P2 Q2, refl_t Q3 P2 P3 Q2 /\ bisim_up_to refl_t P2 Q2 +
bisim_symmetric < search.
Subgoal 2.2:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one P A P3
H5 : one Q A Q3
H7 : bisim_up_to refl_t P3 Q3
============================
exists P2 Q2, refl_t Q3 P2 P3 Q2 /\ bisim_up_to refl_t P2 Q2 +
bisim_symmetric < witness Q3.
Subgoal 2.2:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one P A P3
H5 : one Q A Q3
H7 : bisim_up_to refl_t P3 Q3
============================
exists Q2, refl_t Q3 Q3 P3 Q2 /\ bisim_up_to refl_t Q3 Q2 +
bisim_symmetric < witness P3.
Subgoal 2.2:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one P A P3
H5 : one Q A Q3
H7 : bisim_up_to refl_t P3 Q3
============================
refl_t Q3 Q3 P3 P3 /\ bisim_up_to refl_t Q3 P3 +
bisim_symmetric < split.
Subgoal 2.2.1:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one P A P3
H5 : one Q A Q3
H7 : bisim_up_to refl_t P3 Q3
============================
refl_t Q3 Q3 P3 P3
Subgoal 2.2.2 is:
bisim_up_to refl_t Q3 P3 +
bisim_symmetric < search.
Subgoal 2.2.2:
Variables: P Q A P3 Q3
CH : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P +
H2 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H3 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : one P A P3
H5 : one Q A Q3
H7 : bisim_up_to refl_t P3 Q3
============================
bisim_up_to refl_t Q3 P3 +
bisim_symmetric < backchain CH.
Proof completed.
Abella < Theorem bisim_symmetric_ :
forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P.
============================
forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P
bisim_symmetric_ < apply bisim_symmetric.
H1 : symmetric_rel (bisim_up_to refl_t)
============================
forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P
bisim_symmetric_ < case H1.
H2 : forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P
============================
forall P Q, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q P
bisim_symmetric_ < search.
Proof completed.
Abella < Define transitive_rel : (proc -> proc -> prop) -> prop by
transitive_rel Rel := forall P Q R, Rel P Q -> Rel Q R -> Rel P R.
Warning: Definition can be used to defeat stratification
(higher-order argument "Rel" occurs to the left of ->)
Abella < Theorem bisim_transitive :
transitive_rel (bisim_up_to refl_t).
============================
transitive_rel (bisim_up_to refl_t)
bisim_transitive < unfold.
============================
forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R
bisim_transitive < coinduction.
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
============================
forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R #
bisim_transitive < intros.
Variables: P Q R
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H1 : bisim_up_to refl_t P Q
H2 : bisim_up_to refl_t Q R
============================
bisim_up_to refl_t P R #
bisim_transitive < case H1.
Variables: P Q R
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H2 : bisim_up_to refl_t Q R
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
============================
bisim_up_to refl_t P R #
bisim_transitive < case H2.
Variables: P Q R
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
============================
bisim_up_to refl_t P R #
bisim_transitive < unfold.
Subgoal 1:
Variables: P Q R
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
============================
forall A P1, one P A P1 ->
(exists Q1, one R A Q1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
Subgoal 2 is:
forall A Q1, one R A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_transitive < intros.
Subgoal 1:
Variables: P Q R A P1
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one P A P1
============================
exists Q1, one R A Q1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
Subgoal 2 is:
forall A Q1, one R A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_transitive < apply H3 to H7.
Subgoal 1:
Variables: P Q R A P1 Q2 P3 Q3
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one P A P1
H8 : one Q A Q2
H9 : refl_t P1 P3 Q2 Q3
H10 : bisim_up_to refl_t P3 Q3
============================
exists Q1, one R A Q1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
Subgoal 2 is:
forall A Q1, one R A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_transitive < apply H5 to H8.
Subgoal 1:
Variables: P Q R A P1 Q2 P3 Q3 Q1 P2 Q4
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one P A P1
H8 : one Q A Q2
H9 : refl_t P1 P3 Q2 Q3
H10 : bisim_up_to refl_t P3 Q3
H11 : one R A Q1
H12 : refl_t Q2 P2 Q1 Q4
H13 : bisim_up_to refl_t P2 Q4
============================
exists Q1, one R A Q1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
Subgoal 2 is:
forall A Q1, one R A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_transitive < case H9.
Subgoal 1:
Variables: P Q R A P3 Q3 Q1 P2 Q4
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one P A P3
H8 : one Q A Q3
H10 : bisim_up_to refl_t P3 Q3
H11 : one R A Q1
H12 : refl_t Q3 P2 Q1 Q4
H13 : bisim_up_to refl_t P2 Q4
============================
exists Q1, one R A Q1 /\
(exists P2 Q2, refl_t P3 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
Subgoal 2 is:
forall A Q1, one R A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_transitive < case H12.
Subgoal 1:
Variables: P Q R A P3 P2 Q4
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one P A P3
H8 : one Q A P2
H10 : bisim_up_to refl_t P3 P2
H11 : one R A Q4
H13 : bisim_up_to refl_t P2 Q4
============================
exists Q1, one R A Q1 /\
(exists P2 Q2, refl_t P3 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
Subgoal 2 is:
forall A Q1, one R A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_transitive < exists Q4.
Subgoal 1:
Variables: P Q R A P3 P2 Q4
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one P A P3
H8 : one Q A P2
H10 : bisim_up_to refl_t P3 P2
H11 : one R A Q4
H13 : bisim_up_to refl_t P2 Q4
============================
one R A Q4 /\
(exists P2 Q2, refl_t P3 P2 Q4 Q2 /\ bisim_up_to refl_t P2 Q2 +)
Subgoal 2 is:
forall A Q1, one R A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_transitive < split.
Subgoal 1.1:
Variables: P Q R A P3 P2 Q4
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one P A P3
H8 : one Q A P2
H10 : bisim_up_to refl_t P3 P2
H11 : one R A Q4
H13 : bisim_up_to refl_t P2 Q4
============================
one R A Q4
Subgoal 1.2 is:
exists P2 Q2, refl_t P3 P2 Q4 Q2 /\ bisim_up_to refl_t P2 Q2 +
Subgoal 2 is:
forall A Q1, one R A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_transitive < search.
Subgoal 1.2:
Variables: P Q R A P3 P2 Q4
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one P A P3
H8 : one Q A P2
H10 : bisim_up_to refl_t P3 P2
H11 : one R A Q4
H13 : bisim_up_to refl_t P2 Q4
============================
exists P2 Q2, refl_t P3 P2 Q4 Q2 /\ bisim_up_to refl_t P2 Q2 +
Subgoal 2 is:
forall A Q1, one R A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_transitive < witness P3.
Subgoal 1.2:
Variables: P Q R A P3 P2 Q4
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one P A P3
H8 : one Q A P2
H10 : bisim_up_to refl_t P3 P2
H11 : one R A Q4
H13 : bisim_up_to refl_t P2 Q4
============================
exists Q2, refl_t P3 P3 Q4 Q2 /\ bisim_up_to refl_t P3 Q2 +
Subgoal 2 is:
forall A Q1, one R A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_transitive < witness Q4.
Subgoal 1.2:
Variables: P Q R A P3 P2 Q4
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one P A P3
H8 : one Q A P2
H10 : bisim_up_to refl_t P3 P2
H11 : one R A Q4
H13 : bisim_up_to refl_t P2 Q4
============================
refl_t P3 P3 Q4 Q4 /\ bisim_up_to refl_t P3 Q4 +
Subgoal 2 is:
forall A Q1, one R A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_transitive < split.
Subgoal 1.2.1:
Variables: P Q R A P3 P2 Q4
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one P A P3
H8 : one Q A P2
H10 : bisim_up_to refl_t P3 P2
H11 : one R A Q4
H13 : bisim_up_to refl_t P2 Q4
============================
refl_t P3 P3 Q4 Q4
Subgoal 1.2.2 is:
bisim_up_to refl_t P3 Q4 +
Subgoal 2 is:
forall A Q1, one R A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_transitive < search.
Subgoal 1.2.2:
Variables: P Q R A P3 P2 Q4
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one P A P3
H8 : one Q A P2
H10 : bisim_up_to refl_t P3 P2
H11 : one R A Q4
H13 : bisim_up_to refl_t P2 Q4
============================
bisim_up_to refl_t P3 Q4 +
Subgoal 2 is:
forall A Q1, one R A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_transitive < backchain CH.
Subgoal 2:
Variables: P Q R
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
============================
forall A Q1, one R A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_transitive < intros.
Subgoal 2:
Variables: P Q R A Q1
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one R A Q1
============================
exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
bisim_transitive < apply H6 to H7.
Subgoal 2:
Variables: P Q R A Q1 P2 P3 Q3
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one R A Q1
H8 : one Q A P2
H9 : refl_t P2 P3 Q1 Q3
H10 : bisim_up_to refl_t P3 Q3
============================
exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
bisim_transitive < apply H4 to H8.
Subgoal 2:
Variables: P Q R A Q1 P2 P3 Q3 P1 P4 Q2
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one R A Q1
H8 : one Q A P2
H9 : refl_t P2 P3 Q1 Q3
H10 : bisim_up_to refl_t P3 Q3
H11 : one P A P1
H12 : refl_t P1 P4 P2 Q2
H13 : bisim_up_to refl_t P4 Q2
============================
exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
bisim_transitive < case H9.
Subgoal 2:
Variables: P Q R A P3 Q3 P1 P4 Q2
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one R A Q3
H8 : one Q A P3
H10 : bisim_up_to refl_t P3 Q3
H11 : one P A P1
H12 : refl_t P1 P4 P3 Q2
H13 : bisim_up_to refl_t P4 Q2
============================
exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q3 Q2 /\ bisim_up_to refl_t P2 Q2 +)
bisim_transitive < case H12.
Subgoal 2:
Variables: P Q R A Q3 P4 Q2
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one R A Q3
H8 : one Q A Q2
H10 : bisim_up_to refl_t Q2 Q3
H11 : one P A P4
H13 : bisim_up_to refl_t P4 Q2
============================
exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q3 Q2 /\ bisim_up_to refl_t P2 Q2 +)
bisim_transitive < exists P4.
Subgoal 2:
Variables: P Q R A Q3 P4 Q2
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one R A Q3
H8 : one Q A Q2
H10 : bisim_up_to refl_t Q2 Q3
H11 : one P A P4
H13 : bisim_up_to refl_t P4 Q2
============================
one P A P4 /\
(exists P2 Q2, refl_t P4 P2 Q3 Q2 /\ bisim_up_to refl_t P2 Q2 +)
bisim_transitive < split.
Subgoal 2.1:
Variables: P Q R A Q3 P4 Q2
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one R A Q3
H8 : one Q A Q2
H10 : bisim_up_to refl_t Q2 Q3
H11 : one P A P4
H13 : bisim_up_to refl_t P4 Q2
============================
one P A P4
Subgoal 2.2 is:
exists P2 Q2, refl_t P4 P2 Q3 Q2 /\ bisim_up_to refl_t P2 Q2 +
bisim_transitive < search.
Subgoal 2.2:
Variables: P Q R A Q3 P4 Q2
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one R A Q3
H8 : one Q A Q2
H10 : bisim_up_to refl_t Q2 Q3
H11 : one P A P4
H13 : bisim_up_to refl_t P4 Q2
============================
exists P2 Q2, refl_t P4 P2 Q3 Q2 /\ bisim_up_to refl_t P2 Q2 +
bisim_transitive < witness P4.
Subgoal 2.2:
Variables: P Q R A Q3 P4 Q2
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one R A Q3
H8 : one Q A Q2
H10 : bisim_up_to refl_t Q2 Q3
H11 : one P A P4
H13 : bisim_up_to refl_t P4 Q2
============================
exists Q2, refl_t P4 P4 Q3 Q2 /\ bisim_up_to refl_t P4 Q2 +
bisim_transitive < witness Q3.
Subgoal 2.2:
Variables: P Q R A Q3 P4 Q2
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one R A Q3
H8 : one Q A Q2
H10 : bisim_up_to refl_t Q2 Q3
H11 : one P A P4
H13 : bisim_up_to refl_t P4 Q2
============================
refl_t P4 P4 Q3 Q3 /\ bisim_up_to refl_t P4 Q3 +
bisim_transitive < split.
Subgoal 2.2.1:
Variables: P Q R A Q3 P4 Q2
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one R A Q3
H8 : one Q A Q2
H10 : bisim_up_to refl_t Q2 Q3
H11 : one P A P4
H13 : bisim_up_to refl_t P4 Q2
============================
refl_t P4 P4 Q3 Q3
Subgoal 2.2.2 is:
bisim_up_to refl_t P4 Q3 +
bisim_transitive < search.
Subgoal 2.2.2:
Variables: P Q R A Q3 P4 Q2
CH : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R +
H3 : forall A P2, one P A P2 ->
(exists Q2, one Q A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H4 : forall A Q2, one Q A Q2 ->
(exists P2, one P A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H5 : forall A P2, one Q A P2 ->
(exists Q2, one R A Q2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H6 : forall A Q2, one R A Q2 ->
(exists P2, one Q A P2 /\
(exists P3 Q3, refl_t P2 P3 Q2 Q3 /\ bisim_up_to refl_t P3 Q3))
H7 : one R A Q3
H8 : one Q A Q2
H10 : bisim_up_to refl_t Q2 Q3
H11 : one P A P4
H13 : bisim_up_to refl_t P4 Q2
============================
bisim_up_to refl_t P4 Q3 +
bisim_transitive < backchain CH.
Proof completed.
Abella < Theorem bisim_transitive_ :
forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R.
============================
forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R
bisim_transitive_ < apply bisim_transitive.
H1 : transitive_rel (bisim_up_to refl_t)
============================
forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R
bisim_transitive_ < case H1.
H2 : forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R
============================
forall P Q R, bisim_up_to refl_t P Q -> bisim_up_to refl_t Q R ->
bisim_up_to refl_t P R
bisim_transitive_ < search.
Proof completed.
Abella < Define reflexive_rel : (proc -> proc -> prop) -> prop by
reflexive_rel Rel := forall P, Rel P P.
Abella < Theorem bisim_reflexive :
reflexive_rel (bisim_up_to refl_t).
============================
reflexive_rel (bisim_up_to refl_t)
bisim_reflexive < unfold.
============================
forall P, bisim_up_to refl_t P P
bisim_reflexive < coinduction.
CH : forall P, bisim_up_to refl_t P P +
============================
forall P, bisim_up_to refl_t P P #
bisim_reflexive < intros.
Variables: P
CH : forall P, bisim_up_to refl_t P P +
============================
bisim_up_to refl_t P P #
bisim_reflexive < unfold.
Subgoal 1:
Variables: P
CH : forall P, bisim_up_to refl_t P P +
============================
forall A P1, one P A P1 ->
(exists Q1, one P A Q1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_reflexive < intros.
Subgoal 1:
Variables: P A P1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A P1
============================
exists Q1, one P A Q1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_reflexive < witness P1.
Subgoal 1:
Variables: P A P1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A P1
============================
one P A P1 /\
(exists P2 Q2, refl_t P1 P2 P1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_reflexive < split.
Subgoal 1.1:
Variables: P A P1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A P1
============================
one P A P1
Subgoal 1.2 is:
exists P2 Q2, refl_t P1 P2 P1 Q2 /\ bisim_up_to refl_t P2 Q2 +
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_reflexive < search.
Subgoal 1.2:
Variables: P A P1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A P1
============================
exists P2 Q2, refl_t P1 P2 P1 Q2 /\ bisim_up_to refl_t P2 Q2 +
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_reflexive < witness P1.
Subgoal 1.2:
Variables: P A P1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A P1
============================
exists Q2, refl_t P1 P1 P1 Q2 /\ bisim_up_to refl_t P1 Q2 +
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_reflexive < witness P1.
Subgoal 1.2:
Variables: P A P1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A P1
============================
refl_t P1 P1 P1 P1 /\ bisim_up_to refl_t P1 P1 +
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_reflexive < split.
Subgoal 1.2.1:
Variables: P A P1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A P1
============================
refl_t P1 P1 P1 P1
Subgoal 1.2.2 is:
bisim_up_to refl_t P1 P1 +
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_reflexive < search.
Subgoal 1.2.2:
Variables: P A P1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A P1
============================
bisim_up_to refl_t P1 P1 +
Subgoal 2 is:
forall A Q1, one P A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_reflexive < backchain CH.
Subgoal 2:
Variables: P
CH : forall P, bisim_up_to refl_t P P +
============================
forall A Q1, one P A Q1 ->
(exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +))
bisim_reflexive < intros.
Subgoal 2:
Variables: P A Q1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A Q1
============================
exists P1, one P A P1 /\
(exists P2 Q2, refl_t P1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
bisim_reflexive < witness Q1.
Subgoal 2:
Variables: P A Q1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A Q1
============================
one P A Q1 /\
(exists P2 Q2, refl_t Q1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +)
bisim_reflexive < split.
Subgoal 2.1:
Variables: P A Q1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A Q1
============================
one P A Q1
Subgoal 2.2 is:
exists P2 Q2, refl_t Q1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +
bisim_reflexive < search.
Subgoal 2.2:
Variables: P A Q1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A Q1
============================
exists P2 Q2, refl_t Q1 P2 Q1 Q2 /\ bisim_up_to refl_t P2 Q2 +
bisim_reflexive < witness Q1.
Subgoal 2.2:
Variables: P A Q1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A Q1
============================
exists Q2, refl_t Q1 Q1 Q1 Q2 /\ bisim_up_to refl_t Q1 Q2 +
bisim_reflexive < witness Q1.
Subgoal 2.2:
Variables: P A Q1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A Q1
============================
refl_t Q1 Q1 Q1 Q1 /\ bisim_up_to refl_t Q1 Q1 +
bisim_reflexive < split.
Subgoal 2.2.1:
Variables: P A Q1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A Q1
============================
refl_t Q1 Q1 Q1 Q1
Subgoal 2.2.2 is:
bisim_up_to refl_t Q1 Q1 +
bisim_reflexive < search.
Subgoal 2.2.2:
Variables: P A Q1
CH : forall P, bisim_up_to refl_t P P +
H1 : one P A Q1
============================
bisim_up_to refl_t Q1 Q1 +
bisim_reflexive < backchain CH.
Proof completed.
Abella < Theorem bisim_reflexive_ :
forall P, bisim_up_to refl_t P P.
============================
forall P, bisim_up_to refl_t P P
bisim_reflexive_ < apply bisim_reflexive.
H1 : reflexive_rel (bisim_up_to refl_t)
============================
forall P, bisim_up_to refl_t P P
bisim_reflexive_ < case H1.
H2 : forall P, bisim_up_to refl_t P P
============================
forall P, bisim_up_to refl_t P P
bisim_reflexive_ < search.
Proof completed.
Abella < Define equiv_rel : (proc -> proc -> prop) -> prop by
equiv_rel R := reflexive_rel R /\ symmetric_rel R /\ transitive_rel R.
Abella < Theorem bisim_equiv :
equiv_rel (bisim_up_to refl_t).
============================
equiv_rel (bisim_up_to refl_t)
bisim_equiv < unfold.
Subgoal 1:
============================
reflexive_rel (bisim_up_to refl_t)
Subgoal 2 is:
symmetric_rel (bisim_up_to refl_t)
Subgoal 3 is:
transitive_rel (bisim_up_to refl_t)
bisim_equiv < backchain bisim_reflexive.
Subgoal 2:
============================
symmetric_rel (bisim_up_to refl_t)
Subgoal 3 is:
transitive_rel (bisim_up_to refl_t)
bisim_equiv < backchain bisim_symmetric.
Subgoal 3:
============================
transitive_rel (bisim_up_to refl_t)
bisim_equiv < backchain bisim_transitive.
Proof completed.
Abella < Goodbye.