# HG changeset patch # User bulwahn # Date 1327324056 -3600 # Node ID 0c4f18fe8218e7489c99b768bf0485d64409b776 # Parent 518cc38a1a8c83fa65e691bf81776461bc73338a adding code generation for some list relations diff -r 518cc38a1a8c -r 0c4f18fe8218 src/HOL/List.thy --- a/src/HOL/List.thy Mon Jan 23 14:06:19 2012 +0100 +++ b/src/HOL/List.thy Mon Jan 23 14:07:36 2012 +0100 @@ -4556,6 +4556,10 @@ inductive_cases listsE [elim!,no_atp]: "x#l : lists A" inductive_cases listspE [elim!,no_atp]: "listsp A (x # l)" +inductive_simps listsp_simps[code]: + "listsp A []" + "listsp A (x # xs)" + lemma listsp_mono [mono]: "A \ B ==> listsp A \ listsp B" by (rule predicate1I, erule listsp.induct, (blast dest: predicate1D)+) @@ -4590,7 +4594,7 @@ -- {* eliminate @{text listsp} in favour of @{text set} *} by (induct xs) auto -lemmas in_lists_conv_set = in_listsp_conv_set [to_set] +lemmas in_lists_conv_set [code_unfold] = in_listsp_conv_set [to_set] lemma in_listspD [dest!,no_atp]: "listsp A xs ==> \x\set xs. A x" by (rule in_listsp_conv_set [THEN iffD1]) @@ -5021,7 +5025,7 @@ lemma listrel_eq_len: "(xs, ys) \ listrel r \ length xs = length ys" by(induct rule: listrel.induct) auto -lemma listrel_iff_zip: "(xs,ys) : listrel r \ +lemma listrel_iff_zip [code_unfold]: "(xs,ys) : listrel r \ length xs = length ys & (\(x,y) \ set(zip xs ys). (x,y) \ r)" (is "?L \ ?R") proof assume ?L thus ?R by induct (auto intro: listrel_eq_len) @@ -5327,6 +5331,36 @@ "xs = ys \ (\x. x \ set ys \ f x = g x) \ list_ex f xs = list_ex g ys" by (simp add: list_ex_iff) +text {* Executable checks for relations on sets *} + +definition listrel1p :: "('a \ 'a \ bool) \ 'a list \ 'a list \ bool" where +"listrel1p r xs ys = ((xs, ys) \ listrel1 {(x, y). r x y})" + +lemma [code_unfold]: + "(xs, ys) \ listrel1 r = listrel1p (\x y. (x, y) \ r) xs ys" +unfolding listrel1p_def by auto + +lemma [code]: + "listrel1p r [] xs = False" + "listrel1p r xs [] = False" + "listrel1p r (x # xs) (y # ys) \ + r x y \ xs = ys \ x = y \ listrel1p r xs ys" +by (simp add: listrel1p_def)+ + +definition + lexordp :: "('a \ 'a \ bool) \ 'a list \ 'a list \ bool" where + "lexordp r xs ys = ((xs, ys) \ lexord {(x, y). r x y})" + +lemma [code_unfold]: + "(xs, ys) \ lexord r = lexordp (\x y. (x, y) \ r) xs ys" +unfolding lexordp_def by auto + +lemma [code]: + "lexordp r xs [] = False" + "lexordp r [] (y#ys) = True" + "lexordp r (x # xs) (y # ys) = (r x y | (x = y & lexordp r xs ys))" +unfolding lexordp_def by auto + text {* Bounded quantification and summation over nats. *} lemma atMost_upto [code_unfold]: