diff -r 478bdcea240a -r ffe99b07c9c0 src/CCL/ex/List.thy --- a/src/CCL/ex/List.thy Tue Mar 29 22:36:56 2011 +0200 +++ b/src/CCL/ex/List.thy Tue Mar 29 23:15:25 2011 +0200 @@ -9,46 +9,47 @@ imports Nat begin -consts - map :: "[i=>i,i]=>i" - comp :: "[i=>i,i=>i]=>i=>i" (infixr "o" 55) - append :: "[i,i]=>i" (infixr "@" 55) - member :: "[i,i]=>i" (infixr "mem" 55) - filter :: "[i,i]=>i" - flat :: "i=>i" - partition :: "[i,i]=>i" - insert :: "[i,i,i]=>i" - isort :: "i=>i" - qsort :: "i=>i" +definition map :: "[i=>i,i]=>i" + where "map(f,l) == lrec(l,[],%x xs g. f(x)$g)" + +definition comp :: "[i=>i,i=>i]=>i=>i" (infixr "\" 55) + where "f \ g == (%x. f(g(x)))" + +definition append :: "[i,i]=>i" (infixr "@" 55) + where "l @ m == lrec(l,m,%x xs g. x$g)" -axioms +axiomatization member :: "[i,i]=>i" (infixr "mem" 55) (* FIXME dangling eq *) + where "a mem l == lrec(l,false,%h t g. if eq(a,h) then true else g)" - map_def: "map(f,l) == lrec(l,[],%x xs g. f(x)$g)" - comp_def: "f o g == (%x. f(g(x)))" - append_def: "l @ m == lrec(l,m,%x xs g. x$g)" - member_def: "a mem l == lrec(l,false,%h t g. if eq(a,h) then true else g)" - filter_def: "filter(f,l) == lrec(l,[],%x xs g. if f`x then x$g else g)" - flat_def: "flat(l) == lrec(l,[],%h t g. h @ g)" +definition filter :: "[i,i]=>i" + where "filter(f,l) == lrec(l,[],%x xs g. if f`x then x$g else g)" - insert_def: "insert(f,a,l) == lrec(l,a$[],%h t g. if f`a`h then a$h$t else h$g)" - isort_def: "isort(f) == lam l. lrec(l,[],%h t g. insert(f,h,g))" +definition flat :: "i=>i" + where "flat(l) == lrec(l,[],%h t g. h @ g)" - partition_def: +definition partition :: "[i,i]=>i" where "partition(f,l) == letrec part l a b be lcase(l,,%x xs. if f`x then part(xs,x$a,b) else part(xs,a,x$b)) in part(l,[],[])" - qsort_def: "qsort(f) == lam l. letrec qsortx l be lcase(l,[],%h t. + +definition insert :: "[i,i,i]=>i" + where "insert(f,a,l) == lrec(l,a$[],%h t g. if f`a`h then a$h$t else h$g)" + +definition isort :: "i=>i" + where "isort(f) == lam l. lrec(l,[],%h t g. insert(f,h,g))" + +definition qsort :: "i=>i" where + "qsort(f) == lam l. letrec qsortx l be lcase(l,[],%h t. let p be partition(f`h,t) in split(p,%x y. qsortx(x) @ h$qsortx(y))) in qsortx(l)" - lemmas list_defs = map_def comp_def append_def filter_def flat_def insert_def isort_def partition_def qsort_def lemma listBs [simp]: - "!!f g. (f o g) = (%a. f(g(a)))" - "!!a f g. (f o g)(a) = f(g(a))" + "!!f g. (f \ g) = (%a. f(g(a)))" + "!!a f g. (f \ g)(a) = f(g(a))" "!!f. map(f,[]) = []" "!!f x xs. map(f,x$xs) = f(x)$map(f,xs)" "!!m. [] @ m = m" @@ -85,7 +86,7 @@ lemma appendTS: "[| l : {l:List(A). m : {m:List(A).P(l @ m)}} |] ==> l @ m : {x:List(A). P(x)}" - by (blast intro!: SubtypeI appendT elim!: SubtypeE) + by (blast intro!: appendT) lemma filterT: "[| f:A->Bool; l : List(A) |] ==> filter(f,l) : List(A)" apply (unfold filter_def) @@ -105,7 +106,7 @@ lemma insertTS: "[| f : {f:A->A->Bool. a : {a:A. l : {l:List(A).P(insert(f,a,l))}}} |] ==> insert(f,a,l) : {x:List(A). P(x)}" - by (blast intro!: SubtypeI insertT elim!: SubtypeE) + by (blast intro!: insertT) lemma partitionT: "[| f:A->Bool; l : List(A) |] ==> partition(f,l) : List(A)*List(A)"