# HG changeset patch # User nipkow # Date 1149614202 -7200 # Node ID 100ba10eee64057a463d7b5f9b9c9bf80b4ada1b # Parent 14fdd2a3d117413fd576d834ba6f855b72df8b36 revised nbe command and examples diff -r 14fdd2a3d117 -r 100ba10eee64 src/HOL/ex/nbe.thy --- a/src/HOL/ex/nbe.thy Tue Jun 06 17:07:27 2006 +0200 +++ b/src/HOL/ex/nbe.thy Tue Jun 06 19:16:42 2006 +0200 @@ -9,13 +9,19 @@ ML "reset quick_and_dirty" +norm_by_eval "True \ p" + +(* FIXME Eventually the code generator should be able to handle this +by re-generating the existing code for "or": + declare disj_assoc[code] norm_by_eval "(P | Q) | R" -(*lemma[code]: "(P \ P) = True" by blast +lemma[code]: "(P \ P) = True" by blast norm_by_eval "P \ P" -norm_by_eval "True \ P"*) +norm_by_eval "True \ P" +*) datatype n = Z | S n @@ -55,27 +61,29 @@ norm_by_eval "mul2 (S(S(S(S(S(S(S Z))))))) (S(S(S(S(S Z)))))" norm_by_eval "mul (S(S(S(S(S(S(S Z))))))) (S(S(S(S(S Z)))))" -norm_by_eval "exp (S(S(S(S(S(S(S Z))))))) (S(S(S(S(S Z)))))" +norm_by_eval "exp (S(S Z)) (S(S(S(S(S Z)))))" norm_by_eval "[] @ []" norm_by_eval "[] @ xs" -norm_by_eval "[a,b,c] @ xs" -norm_by_eval "[%a. a, %b. b, c] @ xs" -norm_by_eval "[%a. a, %b. b, c] @ [u,v]" -norm_by_eval "map f [x,y,z]" +norm_by_eval "[] @ (xs:: 'b list)" +norm_by_eval "[a::'d,b,c] @ xs" +norm_by_eval "[%a::'x. a, %b. b, c] @ xs" +norm_by_eval "[%a::'x. a, %b. b, c] @ [u,v]" +norm_by_eval "map f (xs::'c list)" +norm_by_eval "map f [x,y,z::'x]" norm_by_eval "map (%f. f True) [id,g,Not]" norm_by_eval "map (%f. f True) ([id,g,Not] @ fs)" norm_by_eval "rev[a,b,c]" norm_by_eval "rev(a#b#cs)" norm_by_eval "map map [f,g,h]" -norm_by_eval "map (%F. F [a,b,c]) (map map [f,g,h])" +norm_by_eval "map (%F. F [a,b,c::'x]) (map map [f,g,h])" norm_by_eval "map (%F. F ([a,b,c] @ ds)) (map map ([f,g,h]@fs))" norm_by_eval "map (%F. F [Z,S Z,S(S Z)]) (map map [S,add (S Z),mul (S(S Z)),id])" norm_by_eval "map (%x. case x of None \ False | Some y \ True) [None, Some ()]" norm_by_eval "case xs of [] \ True | x#xs \ False" norm_by_eval "case Z of Z \ True | S x \ False" norm_by_eval "map (%x. case x of None \ False | Some y \ True) xs" -norm_by_eval "let x = y in [x,x]" +norm_by_eval "let x = y::'x in [x,x]" norm_by_eval "Let y (%x. [x,x])" norm_by_eval "case n of Z \ True | S x \ False" norm_by_eval "(%(x,y). add x y) (S z,S z)" @@ -84,6 +92,7 @@ norm_by_eval "0 + (n::nat)" norm_by_eval "0 + Suc(n)" +norm_by_eval "0::nat" norm_by_eval "Suc(n) + Suc m" norm_by_eval "[] @ xs" norm_by_eval "(x#xs) @ ys" @@ -92,14 +101,15 @@ norm_by_eval "(%(xs, ys). xs @ ys) ([a, b, c], [d, e, f])" norm_by_eval "%x. case x of None \ False | Some y \ True" norm_by_eval "map (%x. case x of None \ False | Some y \ True) [None, Some ()]" -norm_by_eval "rev [a, b, c]" norm_by_eval "case n of None \ True | Some((x,y),(u,v)) \ False" norm_by_eval "let ((x,y),(u,v)) = ((Z,Z),(Z,Z)) in add (add x y) (add u v)" norm_by_eval "(%((x,y),(u,v)). add (add x y) (add u v)) ((Z,Z),(Z,Z))" norm_by_eval "last[a,b,c]" +norm_by_eval "last([a,b,c]@xs)" +norm_by_eval " (0::nat) < (0::nat)" -(* +(* FIXME won't work since it relies on polymorphically used ad-hoc overloaded function: norm_by_eval "max 0 (0::nat)"