Theory ClassRel

(*  Title:       CoreC++

    Author:      Daniel Wasserrab
    Maintainer:  Daniel Wasserrab <wasserra at fmi.uni-passau.de>

    Based on the Jinja theory Common/TypeRel.thy by Tobias Nipkow
*)

section ‹The subclass relation›

theory ClassRel imports Decl begin


― ‹direct repeated subclass›
inductive_set
  subclsR :: "prog  (cname × cname) set"
  and subclsR' :: "prog  [cname, cname]  bool" ("_  _ R _" [71,71,71] 70)
  for P :: prog
where
  "P  C R D  (C,D)  subclsR P"
| subclsRI: "class P C = Some (Bs,rest); Repeats(D)  set Bs  P  C R D"

― ‹direct shared subclass›
inductive_set
  subclsS :: "prog  (cname × cname) set"
  and subclsS' :: "prog  [cname, cname]  bool" ("_  _ S _" [71,71,71] 70)
  for P :: prog
where
  "P  C S D  (C,D)  subclsS P"
| subclsSI: "class P C = Some (Bs,rest); Shares(D)  set Bs  P  C S D"

 ― ‹direct subclass›
inductive_set
  subcls1 :: "prog  (cname × cname) set"
  and subcls1' :: "prog  [cname, cname]  bool" ("_  _ 1 _" [71,71,71] 70)
  for P :: prog
where
  "P  C 1 D  (C,D)  subcls1 P"
| subcls1I: "class P C = Some (Bs,rest); D   baseClasses Bs  P  C 1 D"

abbreviation
  subcls    :: "prog  [cname, cname]  bool" ("_  _ * _"  [71,71,71] 70) where
  "P  C * D  (C,D)  (subcls1 P)*"
 

lemma subclsRD:
  "P  C R D  fs ms Bs. (class P C = Some (Bs,fs,ms))  (Repeats(D)  set Bs)"
by(auto elim: subclsR.cases)

lemma subclsSD:
  "P  C S D  fs ms Bs. (class P C = Some (Bs,fs,ms))  (Shares(D)  set Bs)"
by(auto elim: subclsS.cases)

lemma subcls1D:
  "P  C 1 D  fs ms Bs. (class P C = Some (Bs,fs,ms))  (D  baseClasses Bs)"
by(auto elim: subcls1.cases)


lemma subclsR_subcls1:
  "P  C R D  P  C 1 D"
by (auto elim!:subclsR.cases intro:subcls1I simp:RepBaseclass_isBaseclass)

lemma subclsS_subcls1:
  "P  C S D  P  C 1 D"
by (auto elim!:subclsS.cases intro:subcls1I simp:ShBaseclass_isBaseclass)

lemma subcls1_subclsR_or_subclsS:
  "P  C 1 D  P  C R D  P  C S D"
by (auto dest!:subcls1D intro:subclsRI 
  dest:baseClasses_repeats_or_shares subclsSI)

lemma finite_subcls1: "finite (subcls1 P)"

apply(subgoal_tac "subcls1 P = (SIGMA C: {C. is_class P C} . 
                     {D. D  baseClasses (fst(the(class P C)))})")
 prefer 2
 apply(fastforce simp:is_class_def dest: subcls1D elim: subcls1I)
apply simp
apply(rule finite_SigmaI [OF finite_is_class])
apply(rule_tac B = "baseClasses (fst (the (class P C)))" in finite_subset)
apply (auto intro:finite_baseClasses simp:is_class_def)
done


lemma finite_subclsR: "finite (subclsR P)"
by(rule_tac B = "subcls1 P" in finite_subset, 
  auto simp:subclsR_subcls1 finite_subcls1)

lemma finite_subclsS: "finite (subclsS P)"
by(rule_tac B = "subcls1 P" in finite_subset, 
  auto simp:subclsS_subcls1 finite_subcls1)

lemma subcls1_class:
  "P  C 1 D  is_class P C"
by (auto dest:subcls1D simp:is_class_def)

lemma subcls_is_class:
"P  D * C; is_class P C  is_class P D"
by (induct rule:rtrancl_induct,auto dest:subcls1_class)

end