src/HOL/ex/Executable_Relation.thy
changeset 47967 987cb55cac44
parent 47738 9100e6aa9272
child 48153 9caab698dbe4
child 48301 07f4bf913230
     1.1 --- a/src/HOL/ex/Executable_Relation.thy	Fri Mar 23 14:25:31 2012 +0100
     1.2 +++ b/src/HOL/ex/Executable_Relation.thy	Fri Mar 23 14:26:09 2012 +0100
     1.3 @@ -12,6 +12,7 @@
     1.4    "(x, y) : (rel_raw X R) = ((x = y \<and> x : X) \<or> (x, y) : R)"
     1.5  unfolding rel_raw_def by auto
     1.6  
     1.7 +
     1.8  lemma Id_raw:
     1.9    "Id = rel_raw UNIV {}"
    1.10  unfolding rel_raw_def by auto
    1.11 @@ -74,36 +75,34 @@
    1.12  
    1.13  lemmas rel_raw_of_set_eqI[intro!] = arg_cong[where f="rel_of_set"]
    1.14  
    1.15 -definition rel :: "'a set => ('a * 'a) set => 'a rel"
    1.16 -where
    1.17 -  "rel X R = rel_of_set (rel_raw X R)"
    1.18 +quotient_definition rel where "rel :: 'a set => ('a * 'a) set => 'a rel" is rel_raw done
    1.19  
    1.20  subsubsection {* Constant definitions on relations *}
    1.21  
    1.22  hide_const (open) converse rel_comp rtrancl Image
    1.23  
    1.24  quotient_definition member :: "'a * 'a => 'a rel => bool" where
    1.25 -  "member" is "Set.member :: 'a * 'a => ('a * 'a) set => bool"
    1.26 +  "member" is "Set.member :: 'a * 'a => ('a * 'a) set => bool" done
    1.27  
    1.28  quotient_definition converse :: "'a rel => 'a rel"
    1.29  where
    1.30 -  "converse" is "Relation.converse :: ('a * 'a) set => ('a * 'a) set"
    1.31 +  "converse" is "Relation.converse :: ('a * 'a) set => ('a * 'a) set" done
    1.32  
    1.33  quotient_definition union :: "'a rel => 'a rel => 'a rel"
    1.34  where
    1.35 -  "union" is "Set.union :: ('a * 'a) set => ('a * 'a) set => ('a * 'a) set"
    1.36 +  "union" is "Set.union :: ('a * 'a) set => ('a * 'a) set => ('a * 'a) set" done
    1.37  
    1.38  quotient_definition rel_comp :: "'a rel => 'a rel => 'a rel"
    1.39  where
    1.40 -  "rel_comp" is "Relation.rel_comp :: ('a * 'a) set => ('a * 'a) set => ('a * 'a) set"
    1.41 +  "rel_comp" is "Relation.rel_comp :: ('a * 'a) set => ('a * 'a) set => ('a * 'a) set" done
    1.42  
    1.43  quotient_definition rtrancl :: "'a rel => 'a rel"
    1.44  where
    1.45 -  "rtrancl" is "Transitive_Closure.rtrancl :: ('a * 'a) set => ('a * 'a) set"
    1.46 +  "rtrancl" is "Transitive_Closure.rtrancl :: ('a * 'a) set => ('a * 'a) set" done
    1.47  
    1.48  quotient_definition Image :: "'a rel => 'a set => 'a set"
    1.49  where
    1.50 -  "Image" is "Relation.Image :: ('a * 'a) set => 'a set => 'a set"
    1.51 +  "Image" is "Relation.Image :: ('a * 'a) set => 'a set => 'a set" done
    1.52  
    1.53  subsubsection {* Code generation *}
    1.54  
    1.55 @@ -111,33 +110,27 @@
    1.56  
    1.57  lemma [code]:
    1.58    "member (x, y) (rel X R) = ((x = y \<and> x : X) \<or> (x, y) : R)"
    1.59 -unfolding rel_def member_def
    1.60 -by (simp add: member_raw)
    1.61 +by (lifting member_raw)
    1.62  
    1.63  lemma [code]:
    1.64    "converse (rel X R) = rel X (R^-1)"
    1.65 -unfolding rel_def converse_def
    1.66 -by (simp add: converse_raw)
    1.67 +by (lifting converse_raw)
    1.68  
    1.69  lemma [code]:
    1.70    "union (rel X R) (rel Y S) = rel (X Un Y) (R Un S)"
    1.71 -unfolding rel_def union_def
    1.72 -by (simp add: union_raw)
    1.73 +by (lifting union_raw)
    1.74  
    1.75  lemma [code]:
    1.76     "rel_comp (rel X R) (rel Y S) = rel (X Int Y) (Set.project (%(x, y). y : Y) R Un (Set.project (%(x, y). x : X) S Un R O S))"
    1.77 -unfolding rel_def rel_comp_def
    1.78 -by (simp add: rel_comp_raw)
    1.79 +by (lifting rel_comp_raw)
    1.80  
    1.81  lemma [code]:
    1.82    "rtrancl (rel X R) = rel UNIV (R^+)"
    1.83 -unfolding rel_def rtrancl_def
    1.84 -by (simp add: rtrancl_raw)
    1.85 +by (lifting rtrancl_raw)
    1.86  
    1.87  lemma [code]:
    1.88    "Image (rel X R) S = (X Int S) Un (R `` S)"
    1.89 -unfolding rel_def Image_def
    1.90 -by (simp add: Image_raw)
    1.91 +by (lifting Image_raw)
    1.92  
    1.93  quickcheck_generator rel constructors: rel
    1.94