File AlphaBetaDiamond.ML


(*  Title:      AlphaBetaDiamond.ML
    Author:     James Brotherston / Rene Vestergaard
    Revised:    30th August, 2000

- Diamond property of (alpha U beta), following from combining the key lemmas:
  
     * weak commutativity of alpha and parallel-beta
     * diamond property of parallel-beta
     * fresh-naming alpha confluence
     * existence of BCFs via an alpha0-rewrite sequence

*)

val relation2_E = relation2.mk_cases "s ->2 t";

Goalw [diamond_def,commute_def,square_def] "diamond(relation2)";
by(strip_tac 1);
by(etac relation2_E 1);
by(etac relation2_E 1);
(* Apply fresh-naming alpha confluence *)
by(datac FreshAlphaConf 1 1);
by(etac exE 1);
by(etac conjE 1);
(* Apply BCF-existence lemma *)
by(cut_inst_tac [("e1.0","e3")] ExistsBCF 1);
by(etac exE 1);
by(etac conjE 1);
by(rotate_tac ~4 1);
by(datac rtrancl_trans 1 1);
by(datac rtrancl_trans 1 1);
(* Apply weak alpha/par-beta commutativity x 2 *)
by(rotate_tac ~2 1);
by(datac WeakABComm 1 1);
by(datac WeakABComm 1 1);
by(REPEAT_DETERM (etac exE 1));
by(REPEAT_DETERM (etac conjE 1));
(* Apply diamond property of parallel-beta *)
by(datac par_beta_diamond 1 1);
by(rotate_tac ~2 1);
by(atac 1);
by(etac exE 1);
by(etac conjE 1);
(* Use the target of the diamond as the witness for the proof and tidy up *)
by(res_inst_tac [("x","s'b")] exI 1);
by(rtac conjI 1);
by(ALLGOALS (eatac relation2.cons 1));
qed "diamond_relation2";