open LatPreInsts;
(** complete lattices **)
Goal "is_inf x y (Inf {x, y})";
by (rtac (bin_is_Inf_eq RS subst) 1);
by (rtac Inf_is_Inf 1);
qed "Inf_is_inf";
Goal "is_sup x y (Sup {x, y})";
by (rtac (bin_is_Sup_eq RS subst) 1);
by (rtac Sup_is_Sup 1);
qed "Sup_is_sup";
(** product lattices **)
(* pairs *)
Goalw [is_inf_def, le_prod_def] "is_inf p q (fst p && fst q, snd p && snd q)";
by (Simp_tac 1);
by Safe_tac;
by (REPEAT_FIRST (fn i => resolve_tac [inf_lb1, inf_lb2, inf_ub_lbs] i ORELSE atac i));
qed "prod_is_inf";
Goalw [is_sup_def, le_prod_def] "is_sup p q (fst p || fst q, snd p || snd q)";
by (Simp_tac 1);
by Safe_tac;
by (REPEAT_FIRST (fn i => resolve_tac [sup_ub1, sup_ub2, sup_lb_ubs] i ORELSE atac i));
qed "prod_is_sup";
(* functions *)
Goalw [is_inf_def, le_fun_def] "is_inf f g (%x. f x && g x)";
by Safe_tac;
by (rtac inf_lb1 1);
by (rtac inf_lb2 1);
by (rtac inf_ub_lbs 1);
by (REPEAT_FIRST (Fast_tac));
qed "fun_is_inf";
Goalw [is_sup_def, le_fun_def] "is_sup f g (%x. f x || g x)";
by Safe_tac;
by (rtac sup_ub1 1);
by (rtac sup_ub2 1);
by (rtac sup_lb_ubs 1);
by (REPEAT_FIRST (Fast_tac));
qed "fun_is_sup";
(** dual lattices **)
Goalw [is_inf_def, le_dual_def] "is_inf x y (Abs_dual (Rep_dual x || Rep_dual y))";
by (stac Abs_dual_inverse' 1);
by Safe_tac;
by (rtac sup_ub1 1);
by (rtac sup_ub2 1);
by (rtac sup_lb_ubs 1);
by (assume_tac 1);
by (assume_tac 1);
qed "dual_is_inf";
Goalw [is_sup_def, le_dual_def] "is_sup x y (Abs_dual (Rep_dual x && Rep_dual y))";
by (stac Abs_dual_inverse' 1);
by Safe_tac;
by (rtac inf_lb1 1);
by (rtac inf_lb2 1);
by (rtac inf_ub_lbs 1);
by (assume_tac 1);
by (assume_tac 1);
qed "dual_is_sup";