fun lnth :: "nat ==> 'a llist ==> 'a"where "lnth 0 (x # xs) = x"
| "lnth (Suc n) (x # xs) = lnth n xs"
value [code] "llist" value [code] "let x = lnth 2 llist in (x, llist)" value [code] "llist"
fun lfilter :: "('a ==> bool) ==> 'a llist ==> 'a llist"where "lfilter P [] = []"
| "lfilter P (x # xs) = (if P x then x # lfilter P xs else lfilter P xs)"
value [code] "lhd (lfilter odd llist)"
definition lfilter_test :: "nat llist ==> _"where"lfilter_test xs = lhd (lfilter even xs)" ―‹Filtering term‹llist› for term‹even› fails because only the datatype is lazy, not the
filter function itself.›
ML_val ‹ (@{code lfilter_test} @{code llist}; raise Fail "Failure expected") handle Match => () ›
subsection‹Records as free type›
record ('a, 'b) rec =
rec1 :: 'a
rec2 :: 'b
free_constructors rec_ext for rec.rec_ext subgoalby(rule rec.cases_scheme) subgoalby(rule rec.ext_inject) done
codatatype tree = L | Node tree tree (infix‹△›900)
code_lazy_type tree
fun mk_tree :: "nat ==> tree"where
mk_tree_0: "mk_tree 0 = L"
| "mk_tree (Suc n) = (let t = mk_tree n in t △ t)"
function subtree :: "bool list ==> tree ==> tree"where "subtree [] t = t"
| "subtree (True # p) (l △ r) = subtree p l"
| "subtree (False # p) (l △ r) = subtree p r"
| "subtree _ L = L" by pat_completeness auto terminationby lexicographic_order
value [code] "mk_tree 10" value [code] "let t = mk_tree 10; _ = subtree [True, True, False, False] t in t"
value [code] "let t = mk_tree 10; _ = subtree [True, True, False, False] t in t" value [code] "let t = mk_tree 4; _ = subtree [True, True, False, False] t in t"
subsection‹Corecursion›
corec (friend) plus :: "'a :: plus stream ==> 'a stream ==> 'a stream"where "plus xs ys = (shd xs + shd ys) ## plus (stl xs) (stl ys)"
corec (friend) times :: "'a :: {plus, times} stream ==> 'a stream ==> 'a stream"where "times xs ys = (shd xs * shd ys) ## plus (times (stl xs) ys) (times xs (stl ys))"
lemma f1_code1 [code]: "f1 True c d [] = ()" "f1 b True d [n] = Code.abort (STR ''2'') (λ_. ())" "f1 b c True [n, m] = Code.abort (STR ''3'') (λ_. ())" "f1 b c d ns = Code.abort (STR ''4'') (λ_. ())" by (simp_all add: f1_def)
value [code] "f1 True False False []"
deactivate_lazy_type llist value [code] "f1 True False False []" declare f1_code1(4) [code del] value [code] "f1 True False False []"
activate_lazy_type llist value [code] "f1 True False False []"
declare [[code drop: f1]] lemma f1_code2 [code]: "f1 True c d [] = Code.abort (STR ''1'') (λ_. ())" "f1 b True d [n] = ()" "f1 b c True [n, m] = Code.abort (STR ''3'') (λ_. ())" "f1 b c d ns = Code.abort (STR ''4'') (λ_. ())" by (simp_all add: f1_def)
value [code] "f1 True True True [0]" declare f1_code2(4)[code del] value [code] "f1 True True True [0]"
declare [[code drop: f1]] lemma f1_code3 [code]: "f1 True c d [] = Code.abort (STR ''1'') (λ_. ())" "f1 b True d [n] = Code.abort (STR ''2'') (λ_. ())" "f1 b c True [n, m] = ()" "f1 b c d ns = Code.abort (STR ''4'') (λ_. ())" by (simp_all add: f1_def)
value [code] "f1 True True True [0, 1]" declare f1_code3(4)[code del] value [code] "f1 True True True [0, 1]"
declare [[code drop: f1]] lemma f1_code4 [code]: "f1 True c d [] = Code.abort (STR ''1'') (λ_. ())" "f1 b True d [n] = Code.abort (STR ''2'') (λ_. ())" "f1 b c True [n, m] = Code.abort (STR ''3'') (λ_. ())" "f1 b c d ns = ()" by (simp_all add: f1_def)
value [code] "f1 True True True [0, 1, 2]" value [code] "f1 True True False [0, 1]" value [code] "f1 True False True [0]" value [code] "f1 False True True []"
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.