value [code] "llist" value [code] "lnth 2 llist" value [code] "let x = lnth 2 llist in (x, llist)"
fun lfilter :: "('a \ bool) \ 'a llist \ 'a llist"where "lfilter P \<^bold>\\<^bold>\ = \<^bold>\\<^bold>\"
| "lfilter P (x ### xs) =
(if P x then x ### lfilter P xs else lfilter P xs)"
export_code lfilter in SML file_prefix lfilter
value [code] "lfilter odd llist"
value [code] "lhd (lfilter odd llist)"
section‹Iterator for red-black trees›
text‹Thanks to laziness, we do not need to program a complicated iterator for a tree.
A conversion functiontolazy lists is enough.›
primrec lappend :: "'a llist \ 'a llist \ 'a llist"
(infixr‹@@› 65) where "\<^bold>\\<^bold>\ @@ ys = ys"
| "(x ### xs) @@ ys = x ### (xs @@ ys)"
primrec rbt_iterator :: "('a, 'b) rbt \ ('a \ 'b) llist"where "rbt_iterator rbt.Empty = \<^bold>\\<^bold>\"
| "rbt_iterator (Branch _ l k v r) =
(let _ = Debug.flush (STR ''tick'') in
rbt_iterator l @@ (k, v) ### rbt_iterator r)"
definition tree :: "(nat, unit) rbt" where"tree = fold (\k. rbt_insert k ()) [0..<100] rbt.Empty"
datatype tree
= L (‹♠›)
| Node tree tree (infix‹△› 900)
notation (output) Node
(‹(‹indent=1 notation=‹mixfix tree node››△//(‹open_block notation=‹mixfix tree branch››🚫l: _)//(‹open_block notation=‹mixfix tree branch››🚫r: _))›)
code_lazy_type tree
fun mk_tree :: "nat \ tree"where mk_tree_0: "mk_tree 0 = \"
| "mk_tree (Suc n) = (let t = mk_tree n in t \ t)"
code_thms mk_tree
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 _ \ = \" 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" 🍋‹Since 🍋‹mk_tree› shares the two subtrees of a node thanks to the let binding,
digging into one subtree spreads to the whole tree.› value [code] "let t = mk_tree 3; _ = subtree [True, True, False, False] t in t"
declare mk_tree.simps(1) [code]
lemma mk_tree_Suc_debug [code]: 🍋‹Make the evaluation visible with tracing.› "mk_tree (Suc n) =
(let _ = Debug.flush (STR ''tick''); t = mk_tree n in t △ t)" by simp
value [code] "mk_tree 10" 🍋‹The recursive call to🍋‹mk_tree›is not guarded by a lazy constructor,
so all the suspensions are built up immediately.›
lemma mk_tree_Suc [code]: "mk_tree (Suc n) = mk_tree n \ mk_tree n" 🍋‹In this code equation, there is no sharing and the recursive calls are guarded by a constructor.› by(simp add: Let_def)
value [code] "mk_tree 10" value [code] "let t = mk_tree 10; _ = subtree [True, True, False, False] t in t"
value [code] "mk_tree 10"🍋‹Only one tick thanks to the guarding constructor› value [code] "let t = mk_tree 10; _ = subtree [True, True, False, False] t in t" value [code] "let t = mk_tree 3; _ = subtree [True, True, False, False] t in t"
section‹Pattern matching elimination›
text‹The pattern matching elimination handles deep pattern matches and overlapping equations and only eliminates necessary pattern matches.›
function crazy :: "nat llist llist \ tree \ bool \ unit"where "crazy (\<^bold>\0\<^bold>\ ### xs) _ _ = Debug.flush (1 :: integer)"
| "crazy xs \ True = Debug.flush (2 :: integer)"
| "crazy xs t b = Debug.flush (3 :: integer)" by pat_completeness auto terminationby lexicographic_order
code_thms crazy
end
Messung V0.5
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet)
¤
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.