src/HOL/ex/Executable_Relation.thy
changeset 47097 987cb55cac44
parent 46871 9100e6aa9272
child 47308 9caab698dbe4
child 47433 07f4bf913230
--- a/src/HOL/ex/Executable_Relation.thy	Fri Mar 23 14:25:31 2012 +0100
+++ b/src/HOL/ex/Executable_Relation.thy	Fri Mar 23 14:26:09 2012 +0100
@@ -12,6 +12,7 @@
   "(x, y) : (rel_raw X R) = ((x = y \<and> x : X) \<or> (x, y) : R)"
 unfolding rel_raw_def by auto
 
+
 lemma Id_raw:
   "Id = rel_raw UNIV {}"
 unfolding rel_raw_def by auto
@@ -74,36 +75,34 @@
 
 lemmas rel_raw_of_set_eqI[intro!] = arg_cong[where f="rel_of_set"]
 
-definition rel :: "'a set => ('a * 'a) set => 'a rel"
-where
-  "rel X R = rel_of_set (rel_raw X R)"
+quotient_definition rel where "rel :: 'a set => ('a * 'a) set => 'a rel" is rel_raw done
 
 subsubsection {* Constant definitions on relations *}
 
 hide_const (open) converse rel_comp rtrancl Image
 
 quotient_definition member :: "'a * 'a => 'a rel => bool" where
-  "member" is "Set.member :: 'a * 'a => ('a * 'a) set => bool"
+  "member" is "Set.member :: 'a * 'a => ('a * 'a) set => bool" done
 
 quotient_definition converse :: "'a rel => 'a rel"
 where
-  "converse" is "Relation.converse :: ('a * 'a) set => ('a * 'a) set"
+  "converse" is "Relation.converse :: ('a * 'a) set => ('a * 'a) set" done
 
 quotient_definition union :: "'a rel => 'a rel => 'a rel"
 where
-  "union" is "Set.union :: ('a * 'a) set => ('a * 'a) set => ('a * 'a) set"
+  "union" is "Set.union :: ('a * 'a) set => ('a * 'a) set => ('a * 'a) set" done
 
 quotient_definition rel_comp :: "'a rel => 'a rel => 'a rel"
 where
-  "rel_comp" is "Relation.rel_comp :: ('a * 'a) set => ('a * 'a) set => ('a * 'a) set"
+  "rel_comp" is "Relation.rel_comp :: ('a * 'a) set => ('a * 'a) set => ('a * 'a) set" done
 
 quotient_definition rtrancl :: "'a rel => 'a rel"
 where
-  "rtrancl" is "Transitive_Closure.rtrancl :: ('a * 'a) set => ('a * 'a) set"
+  "rtrancl" is "Transitive_Closure.rtrancl :: ('a * 'a) set => ('a * 'a) set" done
 
 quotient_definition Image :: "'a rel => 'a set => 'a set"
 where
-  "Image" is "Relation.Image :: ('a * 'a) set => 'a set => 'a set"
+  "Image" is "Relation.Image :: ('a * 'a) set => 'a set => 'a set" done
 
 subsubsection {* Code generation *}
 
@@ -111,33 +110,27 @@
 
 lemma [code]:
   "member (x, y) (rel X R) = ((x = y \<and> x : X) \<or> (x, y) : R)"
-unfolding rel_def member_def
-by (simp add: member_raw)
+by (lifting member_raw)
 
 lemma [code]:
   "converse (rel X R) = rel X (R^-1)"
-unfolding rel_def converse_def
-by (simp add: converse_raw)
+by (lifting converse_raw)
 
 lemma [code]:
   "union (rel X R) (rel Y S) = rel (X Un Y) (R Un S)"
-unfolding rel_def union_def
-by (simp add: union_raw)
+by (lifting union_raw)
 
 lemma [code]:
    "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))"
-unfolding rel_def rel_comp_def
-by (simp add: rel_comp_raw)
+by (lifting rel_comp_raw)
 
 lemma [code]:
   "rtrancl (rel X R) = rel UNIV (R^+)"
-unfolding rel_def rtrancl_def
-by (simp add: rtrancl_raw)
+by (lifting rtrancl_raw)
 
 lemma [code]:
   "Image (rel X R) S = (X Int S) Un (R `` S)"
-unfolding rel_def Image_def
-by (simp add: Image_raw)
+by (lifting Image_raw)
 
 quickcheck_generator rel constructors: rel