xxx draft
authorlammich <lammich@in.tum.de>
Fri, 18 May 2018 09:52:22 +0200
changeset 69924 0e735cf0b9db
parent 69923 4f7a7124bd4f
child 69925 1b4ad2b154da
xxx
SS18/Exercises/ROOT
SS18/Exercises/ex04.pdf
SS18/Exercises/ex04/ex04.thy
SS18/Exercises/ex04/tmpl04.thy
SS18/Exercises/ex05.pdf
SS18/Exercises/ex05/document/build
SS18/Exercises/ex05/document/exercise.sty
SS18/Exercises/ex05/document/root.tex
SS18/Exercises/ex05/ex05.thy
SS18/Exercises/ex05/tmpl05.thy
SS18/Exercises/ex06.pdf
SS18/Exercises/ex06/document/build
SS18/Exercises/ex06/document/exercise.sty
SS18/Exercises/ex06/document/root.tex
SS18/Exercises/ex06/ex06.thy
SS18/Exercises/ex06/tmpl06.thy
SS18/Exercises/hwsubm/email.log
SS18/Exercises/hwsubm/hw03/a.kutafina@tum.de/msg-13020-1.txt
SS18/Exercises/hwsubm/hw03/a.kutafina@tum.de/tree_addr.thy
SS18/Exercises/hwsubm/hw03/alexejrotar@gmail.com/hw03.thy
SS18/Exercises/hwsubm/hw03/alexejrotar@gmail.com/msg-13020-2.txt
SS18/Exercises/hwsubm/hw03/clemens.jonischkeit@yahoo.de/jonischkeit03.thy
SS18/Exercises/hwsubm/hw03/clemens.jonischkeit@yahoo.de/msg-13020-3.txt
SS18/Exercises/hwsubm/hw03/daniel.kutasi@outlook.de/hw03.thy
SS18/Exercises/hwsubm/hw03/daniel.kutasi@outlook.de/msg-13020-4.txt
SS18/Exercises/hwsubm/hw03/daniel.kutasi@outlook.de/msg-13020-5.html
SS18/Exercises/hwsubm/hw03/eric.koepke@online.de/ex03.thy
SS18/Exercises/hwsubm/hw03/eric.koepke@online.de/msg-13020-6.txt
SS18/Exercises/hwsubm/hw03/explode_info
SS18/Exercises/hwsubm/hw03/felix.wielander@tum.de/hw03.thy
SS18/Exercises/hwsubm/hw03/felix.wielander@tum.de/msg-13020-7.txt
SS18/Exercises/hwsubm/hw03/florian.stamer@tum.de/ex03.thy
SS18/Exercises/hwsubm/hw03/florian.stamer@tum.de/msg-13020-8.txt
SS18/Exercises/hwsubm/hw03/florian.stamer@tum.de/msg-13020-9.html
SS18/Exercises/hwsubm/hw03/g.bidlingmaier@tum.de/msg-13020-12.txt
SS18/Exercises/hwsubm/hw03/g.bidlingmaier@tum.de/tmpl03.thy
SS18/Exercises/hwsubm/hw03/ga53qud@mytum.de/hw03.thy
SS18/Exercises/hwsubm/hw03/ga53qud@mytum.de/msg-13020-10.txt
SS18/Exercises/hwsubm/hw03/ga53qud@mytum.de/msg-13020-11.html
SS18/Exercises/hwsubm/hw03/ge72lic@mytum.de/ex03.thy
SS18/Exercises/hwsubm/hw03/ge72lic@mytum.de/msg-13020-13.txt
SS18/Exercises/hwsubm/hw03/ge72lic@mytum.de/msg-13020-14.html
SS18/Exercises/hwsubm/hw03/hw3.mbox
SS18/Exercises/hwsubm/hw03/j.gottfriedsen@tum.de/homework03.thy
SS18/Exercises/hwsubm/hw03/j.gottfriedsen@tum.de/msg-13020-15.txt
SS18/Exercises/hwsubm/hw03/j.gottfriedsen@tum.de/msg-13020-16.html
SS18/Exercises/hwsubm/hw03/j.v.mutius@gmail.com/hw03.thy
SS18/Exercises/hwsubm/hw03/j.v.mutius@gmail.com/msg-13020-19.txt
SS18/Exercises/hwsubm/hw03/jonatan.juhas@tum.de/DeepinScreenshot_select-area_20180503230542.png
SS18/Exercises/hwsubm/hw03/jonatan.juhas@tum.de/ha03.thy
SS18/Exercises/hwsubm/hw03/jonatan.juhas@tum.de/msg-13020-17.txt
SS18/Exercises/hwsubm/hw03/jonatan.juhas@tum.de/msg-13020-18.html
SS18/Exercises/hwsubm/hw03/katharinaluise.schmitt@tum.de/ex03.thy
SS18/Exercises/hwsubm/hw03/katharinaluise.schmitt@tum.de/msg-13020-20.txt
SS18/Exercises/hwsubm/hw03/katharinaluise.schmitt@tum.de/msg-13020-21.html
SS18/Exercises/hwsubm/hw03/markuswebel@gmail.com/msg-13020-22.txt
SS18/Exercises/hwsubm/hw03/markuswebel@gmail.com/msg-13020-23.html
SS18/Exercises/hwsubm/hw03/markuswebel@gmail.com/tut03.thy
SS18/Exercises/hwsubm/hw03/martin.rau@tum.de/Home03.thy
SS18/Exercises/hwsubm/hw03/martin.rau@tum.de/msg-13020-24.txt
SS18/Exercises/hwsubm/hw03/mitja.krebs@tum.de/msg-13020-25.txt
SS18/Exercises/hwsubm/hw03/mitja.krebs@tum.de/tmpl03.thy
SS18/Exercises/hwsubm/hw03/omar.badramany@tum.de/hw03.thy
SS18/Exercises/hwsubm/hw03/omar.badramany@tum.de/msg-13020-26.txt
SS18/Exercises/hwsubm/hw03/omar.badramany@tum.de/msg-13020-27.html
SS18/Exercises/hwsubm/hw03/s.griebel@tum.de/homework3.thy
SS18/Exercises/hwsubm/hw03/s.griebel@tum.de/msg-13020-30.txt
SS18/Exercises/hwsubm/hw03/s.griebel@tum.de/msg-13020-31.html
SS18/Exercises/hwsubm/hw03/sabine.rieder@tum.de/msg-13020-28.txt
SS18/Exercises/hwsubm/hw03/sabine.rieder@tum.de/msg-13020-29.html
SS18/Exercises/hwsubm/hw03/sabine.rieder@tum.de/tmpl03.thy
SS18/Exercises/hwsubm/hw03/smith.nickh@gmail.com/HW03.thy
SS18/Exercises/hwsubm/hw03/smith.nickh@gmail.com/msg-13020-32.txt
SS18/Exercises/hwsubm/hw03/smith.nickh@gmail.com/msg-13020-33.html
SS18/Exercises/hwsubm/hw04/Bidlingmaier_Gunther_g.bidlingmaier@tum.de_389/SENTMAIL
SS18/Exercises/hwsubm/hw04/Bidlingmaier_Gunther_g.bidlingmaier@tum.de_389/tmpl04.thy
SS18/Exercises/hwsubm/hw04/Bidlingmaier_Gunther_g.bidlingmaier@tum.de_389/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Das_Sharma_Amartya_ga53qud@mytum.de_376/SENTMAIL
SS18/Exercises/hwsubm/hw04/Das_Sharma_Amartya_ga53qud@mytum.de_376/hw04.thy
SS18/Exercises/hwsubm/hw04/Das_Sharma_Amartya_ga53qud@mytum.de_376/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Elbadramany_Omar_omar.badramany@tum.de_393/SENTMAIL
SS18/Exercises/hwsubm/hw04/Elbadramany_Omar_omar.badramany@tum.de_393/hw04.thy
SS18/Exercises/hwsubm/hw04/Elbadramany_Omar_omar.badramany@tum.de_393/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Gottfriedsen_Jakob_j.gottfriedsen@tum.de_385/SENTMAIL
SS18/Exercises/hwsubm/hw04/Gottfriedsen_Jakob_j.gottfriedsen@tum.de_385/homework04.thy
SS18/Exercises/hwsubm/hw04/Gottfriedsen_Jakob_j.gottfriedsen@tum.de_385/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Griebel_Simon_s.griebel@tum.de_387/SENTMAIL
SS18/Exercises/hwsubm/hw04/Griebel_Simon_s.griebel@tum.de_387/homework04.thy
SS18/Exercises/hwsubm/hw04/Griebel_Simon_s.griebel@tum.de_387/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Jonischkeit_Clemens_clemens.jonischkeit@tum.de_384/SENTMAIL
SS18/Exercises/hwsubm/hw04/Jonischkeit_Clemens_clemens.jonischkeit@tum.de_384/jonischkeit04.thy
SS18/Exercises/hwsubm/hw04/Jonischkeit_Clemens_clemens.jonischkeit@tum.de_384/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Juhas_Jonatan_jonatan.juhas@tum.de_379/SENTMAIL
SS18/Exercises/hwsubm/hw04/Juhas_Jonatan_jonatan.juhas@tum.de_379/ha04.thy
SS18/Exercises/hwsubm/hw04/Juhas_Jonatan_jonatan.juhas@tum.de_379/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Kirchmeier_Maximilian_max.kirchmeier@tum.de_367/SENTMAIL
SS18/Exercises/hwsubm/hw04/Kirchmeier_Maximilian_max.kirchmeier@tum.de_367/tut04.thy
SS18/Exercises/hwsubm/hw04/Kirchmeier_Maximilian_max.kirchmeier@tum.de_367/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Koepke_Eric_eric.koepke@tum.de_382/SENTMAIL
SS18/Exercises/hwsubm/hw04/Koepke_Eric_eric.koepke@tum.de_382/ex04.thy
SS18/Exercises/hwsubm/hw04/Koepke_Eric_eric.koepke@tum.de_382/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Krebs_Mitja_mitja.krebs@tum.de_365/SENTMAIL
SS18/Exercises/hwsubm/hw04/Krebs_Mitja_mitja.krebs@tum.de_365/tmpl04.thy
SS18/Exercises/hwsubm/hw04/Krebs_Mitja_mitja.krebs@tum.de_365/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Kutafina_Anastassiya_a.kutafina@tum.de_386/SENTMAIL
SS18/Exercises/hwsubm/hw04/Kutafina_Anastassiya_a.kutafina@tum.de_386/tmpl04.thy
SS18/Exercises/hwsubm/hw04/Kutafina_Anastassiya_a.kutafina@tum.de_386/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Kutasi_Daniel_daniel.kutasi@mytum.de_392/SENTMAIL
SS18/Exercises/hwsubm/hw04/Kutasi_Daniel_daniel.kutasi@mytum.de_392/hw04.thy
SS18/Exercises/hwsubm/hw04/Kutasi_Daniel_daniel.kutasi@mytum.de_392/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Mutius_Joshua_ga96koz@mytum.de_397/SENTMAIL
SS18/Exercises/hwsubm/hw04/Mutius_Joshua_ga96koz@mytum.de_397/hw04.thy
SS18/Exercises/hwsubm/hw04/Mutius_Joshua_ga96koz@mytum.de_397/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Pfeiffer_Marcus_ge72lic@mytum.de_372/SENTMAIL
SS18/Exercises/hwsubm/hw04/Pfeiffer_Marcus_ge72lic@mytum.de_372/ex04.thy
SS18/Exercises/hwsubm/hw04/Pfeiffer_Marcus_ge72lic@mytum.de_372/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Putwattana_Attakorn_a.putwattana@tum.de_368/SENTMAIL
SS18/Exercises/hwsubm/hw04/Putwattana_Attakorn_a.putwattana@tum.de_368/hw04.thy
SS18/Exercises/hwsubm/hw04/Putwattana_Attakorn_a.putwattana@tum.de_368/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Rau_Martin_martin.rau@tum.de_362/Home04.thy
SS18/Exercises/hwsubm/hw04/Rau_Martin_martin.rau@tum.de_362/SENTMAIL
SS18/Exercises/hwsubm/hw04/Rau_Martin_martin.rau@tum.de_362/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Rieder_Sabine_sabine.rieder@tum.de_391/SENTMAIL
SS18/Exercises/hwsubm/hw04/Rieder_Sabine_sabine.rieder@tum.de_391/tmpl04.thy
SS18/Exercises/hwsubm/hw04/Rieder_Sabine_sabine.rieder@tum.de_391/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Rotar_Alexej_ga59zew@mytum.de_388/SENTMAIL
SS18/Exercises/hwsubm/hw04/Rotar_Alexej_ga59zew@mytum.de_388/hw04.thy
SS18/Exercises/hwsubm/hw04/Rotar_Alexej_ga59zew@mytum.de_388/testoutput.html
SS18/Exercises/hwsubm/hw04/Schmitt_Katharina_katharinaluise.schmitt@tum.de_395/SENTMAIL
SS18/Exercises/hwsubm/hw04/Schmitt_Katharina_katharinaluise.schmitt@tum.de_395/ex04.thy
SS18/Exercises/hwsubm/hw04/Schmitt_Katharina_katharinaluise.schmitt@tum.de_395/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Smith_Nicholas_nick.smith@tum.de_394/HW04.thy
SS18/Exercises/hwsubm/hw04/Smith_Nicholas_nick.smith@tum.de_394/SENTMAIL
SS18/Exercises/hwsubm/hw04/Smith_Nicholas_nick.smith@tum.de_394/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Somasundaram_Arun_ge69kel@mytum.de_378/SENTMAIL
SS18/Exercises/hwsubm/hw04/Somasundaram_Arun_ge69kel@mytum.de_378/tmpl04.thy
SS18/Exercises/hwsubm/hw04/Somasundaram_Arun_ge69kel@mytum.de_378/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Stamer_Florian_florian.stamer@tum.de_364/SENTMAIL
SS18/Exercises/hwsubm/hw04/Stamer_Florian_florian.stamer@tum.de_364/ex04.thy
SS18/Exercises/hwsubm/hw04/Stamer_Florian_florian.stamer@tum.de_364/user_error_log.txt
SS18/Exercises/hwsubm/hw04/Wielander_Felix_felix.wielander@tum.de_374/SENTMAIL
SS18/Exercises/hwsubm/hw04/Wielander_Felix_felix.wielander@tum.de_374/hw04.thy
SS18/Exercises/hwsubm/hw04/Wielander_Felix_felix.wielander@tum.de_374/user_error_log.txt
SS18/Exercises/hwsubm/hw04/meta.csv
SS18/Exercises/hwsubm/mimeexplode
SS18/Exercises/hwsubm/split.gawk
Thys/Worklist_DFS.thy
--- a/SS18/Exercises/ROOT	Wed May 02 13:14:58 2018 +0200
+++ b/SS18/Exercises/ROOT	Fri May 18 09:52:22 2018 +0200
@@ -21,6 +21,18 @@
   theories ex04
   document_files "root.tex" "exercise.sty" "build"
 
+session "ex05" in "ex05" = HOL +
+  options [document = pdf, document_output = "generated", document_variants = "ex05"]
+  theories [document = false] "../BST_Demo"
+  theories ex05
+  document_files "root.tex" "exercise.sty" "build"
+
+session "ex06" in "ex06" = HOL +
+  options [document = pdf, document_output = "generated", document_variants = "ex06"]
+  theories ex06
+  document_files "root.tex" "exercise.sty" "build"
+
+
 (*
 session hwsol_basis = HOL +
   theories
Binary file SS18/Exercises/ex04.pdf has changed
--- a/SS18/Exercises/ex04/ex04.thy	Wed May 02 13:14:58 2018 +0200
+++ b/SS18/Exercises/ex04/ex04.thy	Fri May 18 09:52:22 2018 +0200
@@ -179,7 +179,7 @@
 
 
 text \<open>
-  \Homework{Rank Annotated Trees}{May 26}
+  \Homework{Rank Annotated Trees}{May 11}
 
 \<close>
 
@@ -190,6 +190,21 @@
     to return the position of a given element in the inorder traversal.
   \<close>
 
+
+  (*
+    Scoring scheme:
+
+      2 Invariant and basic defs:
+      2 insert
+      2 isin
+      2 rank
+      2 select
+
+
+
+
+  *)
+
   datatype 'a rtree = Leaf | Node "'a rtree" nat 'a "'a rtree"
 
   text \<open>Define a function to count the number of nodes in a tree\<close>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/ex04/tmpl04.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,198 @@
+(*<*)
+theory tmpl04
+  imports "../BST_Demo"
+begin
+(*>*)
+
+
+text {* \ExerciseSheet{4}{4.~5.~2017} *}
+
+
+text \<open>
+  \Exercise{List Elements in Interval}
+  Write a function to in-order list all elements of a BST in a given interval.
+  I.e., \<open>in_range t u v\<close> shall list all elements \<open>x\<close> with \<open>u\<le>x\<le>v\<close>.
+  Write a recursive function that does not descend into nodes that definitely
+  contain no elements in the given range.
+\<close>
+fun in_range :: "'a::linorder tree \<Rightarrow> 'a \<Rightarrow> 'a \<Rightarrow> 'a list"
+  where
+    "in_range Leaf u v = []"
+
+text \<open>Show that you list the right set of elements\<close>
+lemma "bst t \<Longrightarrow> set (in_range t u v) = {x\<in>set_tree t. u\<le>x \<and> x\<le>v}"
+  oops
+
+text \<open>Show that your list is actually in-order\<close>
+lemma "bst t \<Longrightarrow> in_range t u v = filter (\<lambda>x. u\<le>x \<and> x\<le>v) (inorder t)"
+  oops
+
+
+
+
+text \<open>\Exercise{Pretty Printing of Binary Trees}\<close>
+
+  text \<open>Define a function that checks whether two binary trees have the same
+      structure. The values at the nodes may differ.\<close>
+  fun bin_tree2 :: "'a tree \<Rightarrow> 'b tree \<Rightarrow> bool"
+    where
+    "bin_tree2 Leaf Leaf \<longleftrightarrow> True"
+
+  text \<open>While this function itself is not very useful, the induction rule generated by the function package is!
+    It allows simultaneous induction over two trees:\<close>
+  print_statement bin_tree2.induct
+
+  text \<open>Binary trees can be uniquely pretty-printed by emitting a symbol L
+    for a leaf, and a symbol N for a node. Each N is followed by
+    the pretty-prints of the left and right tree. No additional brackets
+    are required!\<close>
+
+  datatype 'a tchar = L | N 'a
+
+  fun pretty :: "'a tree \<Rightarrow> 'a tchar list"
+    where
+    "pretty _ = undefined"
+
+  text \<open>Show that pretty-printing is actually unique, i.e.,
+    no two different trees are pretty-printed the same way.
+    Hint: Auxiliary lemma. Simultaneous induction over both trees.
+  \<close>
+
+  lemma pretty_unique: "pretty t = pretty t' \<Longrightarrow> t=t'"
+    oops
+
+
+text \<open>\Exercise{Enumeration of Trees}\<close>
+
+text \<open>Write a function that generates the set of all trees up to a given height.
+  Show that only trees up to the specified height are contained.
+
+  (The other direction, i.e., that all trees are contained, requires an
+    advanced case split, which has not yet been introduced in the lecture,
+    so it is omitted here)
+\<close>
+
+fun enum :: "nat \<Rightarrow> unit tree set" where
+  "enum _ = undefined"
+
+lemma enum_sound: "t \<in> enum n \<Longrightarrow> height t \<le> n"
+  oops
+
+
+
+
+
+text \<open>
+  \Homework{Rank Annotated Trees}{May 26}
+
+\<close>
+
+  text \<open>In this homework, we will develop a binary search tree that additionally
+    stores the rank (= number of nodes) of the left subtree in each node.
+
+    With this auxiliary information, it is easy to implement a rank query, i.e.,
+    to return the position of a given element in the inorder traversal.
+  \<close>
+
+  datatype 'a rtree = Leaf | Node "'a rtree" nat 'a "'a rtree"
+
+  text \<open>Define a function to count the number of nodes in a tree\<close>
+  fun num_nodes :: "'a rtree \<Rightarrow> nat" where
+    "num_nodes _ = undefined"
+
+  text \<open>Define a function to check for the invariant: search tree property and the correct
+    rank annotation (number of nodes in left subtree)\<close>
+  fun rbst :: "'a::linorder rtree \<Rightarrow> bool" where
+    "rbst _ \<longleftrightarrow> undefined"
+
+  text \<open>Define the insert function. You may assume that the value to be inserted is
+    not contained in the tree.
+    Note: Double-check to correctly update the rank annotation.
+    \<close>
+  fun rins :: "'a::linorder \<Rightarrow> 'a rtree \<Rightarrow> 'a rtree" where
+    "rins _ _ = undefined"
+
+
+  text \<open>Show that \<open>rins\<close> actually inserts, and preserves the invariant.
+    Hint: Auxiliary lemma on number of nodes.\<close>
+  lemma rins_set: "set_rtree (rins x t) = insert x (set_rtree t)"
+    oops
+
+
+  lemma "x\<notin>set_rtree t \<Longrightarrow> rbst t \<Longrightarrow> rbst (rins x t)"
+    oops
+
+  text \<open>Define the membership query function and show it correct.\<close>
+  fun risin :: "'a::linorder \<Rightarrow> 'a rtree \<Rightarrow> bool" where
+    "risin _ _ \<longleftrightarrow> undefined"
+
+  lemma "rbst t \<Longrightarrow> risin x t \<longleftrightarrow> x\<in>set_rtree t"
+    oops
+
+
+  text \<open>Define the inorder traversal\<close>
+  fun inorder :: "'a rtree \<Rightarrow> 'a list" where
+    "inorder _ = undefined"
+
+  text \<open>Define a function that returns the rank of an element.
+    Use the rank annotation to avoid unnecessary descents into the tree.
+
+    Note: You may assume that the element is contained in the tree.
+  \<close>
+  fun rank :: "'a::linorder \<Rightarrow> _" where
+    "rank _ _ = undefined"
+
+
+  text \<open>The operator @{term_type "op !"} indexes a list, i.e.,
+    \<open>l!n\<close> is the \<open>n\<close>th element of list \<open>l\<close>, or \<open>undefined\<close>, if the index is out of bounds.
+    The following predicate states that index \<open>i\<close> into list \<open>l\<close> contains element \<open>x\<close>
+  \<close>
+  definition "at_index i l x \<equiv> i<length l \<and> l!i=x"
+
+  text \<open>Show your rank function correct.
+    Hint: Auxiliary lemma relating \<open>num_nodes\<close> and \<open>inorder\<close>.
+    \<close>
+  lemma "rbst t \<Longrightarrow> x\<in>set_rtree t \<Longrightarrow> at_index (rank x t) (inorder t) x"
+    oops
+
+  text \<open>Define a select function, that returns the \<open>i\<close>th element of the inorder
+    traversal, and prove it correct.
+
+    Only recurse over the tree once, following a single path. In particular,
+    \<open>inorder t ! i\<close> is not the desired solution, as it would enumerate all nodes of
+    the tree in a list first, and not exploit the rank annotations at all.
+  \<close>
+
+  fun select :: "nat \<Rightarrow> 'a::linorder rtree \<Rightarrow> 'a" where
+    "select _ _ = undefined"
+
+  lemma select_correct: "rbst t \<Longrightarrow> i<length (inorder t) \<Longrightarrow> select i t = inorder t ! i"
+    oops
+
+
+text \<open>
+  For 3 \<^bold>\<open>bonus\<close> points, remove the assumption that the inserted element
+  is not yet contained in the tree. Only recurse over the tree once, i.e.,
+  do not simply use @{term \<open>if risin x t then t else rins x t\<close>}!
+
+  Hint: Add an additional return value to the insert function that indicates
+    whether the element was in the tree or not, in order to correctly update
+    the rank annotation. At the end, you must provide a function \<open>rins'\<close> that
+    satisfies the following specification (and only recurses over the tree once,
+    following a single path):
+\<close>
+
+
+definition rins' :: "'a::linorder \<Rightarrow> 'a rtree \<Rightarrow> 'a rtree"
+  where "rins' x t \<equiv> undefined"
+
+lemma rins'_set: "rbst t \<Longrightarrow> set_rtree (rins' x t) = {x} \<union> set_rtree t"
+  oops
+
+lemma rins'_bst: "rbst t \<Longrightarrow> rbst (rins' x t)"
+  oops
+
+(*<*)
+end
+(*>*)
+
Binary file SS18/Exercises/ex05.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/ex05/document/build	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+${ISABELLE_TOOL} latex -o sty root.tex && \
+${ISABELLE_TOOL} latex -o pdf root.tex && \
+${ISABELLE_TOOL} latex -o pdf root.tex && \
+${ISABELLE_TOOL} latex -o pdf root.tex && \
+cp root.pdf ../../../$2.pdf
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/ex05/document/exercise.sty	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,51 @@
+
+\newcommand{\Lecture}{Functional Data Structures}
+\newcommand{\Semester}{SS 2018}
+\newcommand{\Prof}{Prof.~Tobias~Nipkow,~Ph.D.}
+\newcommand{\Tutor}{Dr. Peter Lammich}
+
+\newcounter{sheet}
+\newcounter{homework}
+
+\newlength{\abslength}\setlength{\abslength}{2mm plus 1mm minus 1mm}
+\newcommand{\abs}{\par\vspace{\abslength}}
+
+\newlength{\TUMBr}\settowidth{\TUMBr}{{\bf Technische Universit{\"a}t M{\"u}nchen}}
+\newcommand{\Header}[5]{{\bf
+ \makebox[\TUMBr]{Technische Universit{\"a}t M{\"u}nchen} \hfill #3\\
+ \makebox[\TUMBr]{Institut f{\"u}r Informatik} \hfill #4\\
+ \makebox[\TUMBr]{#1} \hfill #5\\
+ \makebox[\TUMBr]{#2}}\abs}
+
+\newcommand{\Title}[1]{%
+  \begin{center}{\LARGE\bf\Lecture}\\[1ex]{\bf Exercise Sheet #1}\end{center}}
+
+\newcommand{\ExerciseSheet}[2]{%
+  \pagestyle{empty}%
+  \setcounter{sheet}{#1}%
+  \vspace*{-2cm}\Header{\Prof}{\Tutor}{\Semester}{#2}{}\vspace*{1cm}%
+  \Title{#1}\abs}
+
+\newcounter{exercise}
+\newcommand{\Exercise}[1]{%
+  \refstepcounter{exercise}%
+  \pagebreak[3]%
+  \relax%
+  \vspace{0.8em}%
+  \subsection*{{Exercise \arabic{sheet}.\arabic{exercise}\ \ \normalfont\sffamily #1}}}
+
+\newcommand{\Homework}[2]{%
+  \pagebreak[3]%
+  \relax%
+  \vspace{0.8em}%
+  \subsection*{{Homework \arabic{sheet}\ \ \normalfont\sffamily #1}}%
+  \emph{Submission until Friday, #2, 11:59am.}}
+
+\newcommand{\NumHomework}[2]{%
+  \refstepcounter{homework}%
+  \pagebreak[3]%
+  \relax%
+  \vspace{0.8em}%
+  \subsection*{{Homework \arabic{sheet}.\arabic{homework}\ \ \normalfont\sffamily #1}}%
+  \emph{Submission until Friday, #2, 11:59am.}}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/ex05/document/root.tex	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,66 @@
+\documentclass[11pt,a4paper]{scrartcl}
+\usepackage{isabelle,isabellesym}
+\usepackage{exercise}
+\usepackage{amsmath}
+
+% further packages required for unusual symbols (see also
+% isabellesym.sty), use only when needed
+
+\usepackage{amssymb}
+  %for \<leadsto>, \<box>, \<diamond>, \<sqsupset>, \<mho>, \<Join>,
+  %\<lhd>, \<lesssim>, \<greatersim>, \<lessapprox>, \<greaterapprox>,
+  %\<triangleq>, \<yen>, \<lozenge>
+
+%\usepackage[greek,english]{babel}
+  %option greek for \<euro>
+  %option english (default language) for \<guillemotleft>, \<guillemotright>
+
+\usepackage[latin1]{inputenc}
+  %for \<onesuperior>, \<onequarter>, \<twosuperior>, \<onehalf>,
+  %\<threesuperior>, \<threequarters>, \<degree>
+
+\usepackage[only,bigsqcap]{stmaryrd}
+  %for \<Sqinter>
+
+%\usepackage{eufrak}
+  %for \<AA> ... \<ZZ>, \<aa> ... \<zz> (also included in amssymb)
+
+%\usepackage{textcomp}
+  %for \<cent>, \<currency>
+
+% this should be the last package used
+\usepackage{pdfsetup}
+
+% urls in roman style, theory text in math-similar italics
+\urlstyle{rm}
+\isabellestyle{it}
+
+% for uniform font size
+%\renewcommand{\isastyle}{\isastyleminor}
+
+\begin{document}
+
+% sane default for proof documents
+\parindent 0pt\parskip 0.5ex
+
+
+\renewcommand{\isachardoublequote}{`\"}
+\renewcommand{\isachardoublequoteopen}{``}
+\renewcommand{\isachardoublequoteclose}{''}
+\renewcommand{\isacharunderscore}{\_}
+\renewcommand{\isacharunderscorekeyword}{\_}
+
+
+% generated text of all theories
+\input{session}
+
+% optional bibliography
+%\bibliographystyle{abbrv}
+%\bibliography{root}
+
+\end{document}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/ex05/ex05.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,303 @@
+(*<*)
+theory ex05
+  imports
+    Complex_Main
+    "~~/src/HOL/Library/Tree"
+begin
+(*>*)
+
+
+text {* \ExerciseSheet{5}{11.~5.~2017} *}
+
+text \<open>
+  \<^item> Import \<open>Complex_Main\<close> and \<open>~~/src/HOL/Library/Tree\<close>
+  \<^item> For this exercise sheet (and Homework 1), you are not allowed to use sledgehammer!
+    Proofs using the \<open>smt, metis, meson, or moura\<close> methods are forbidden!
+\<close>
+
+text \<open>
+  \Exercise{Bounding power-of-two by factorial}
+  Prove that, for all natural numbers $n>3$, we have $2^n < n!$.
+  We have already prepared the proof skeleton for you.
+\<close>
+lemma exp_fact_estimate: "n>3 \<Longrightarrow> (2::nat)^n < fact n"
+proof (induction n)
+  case 0 then show ?case by auto
+next
+  case (Suc n)
+  assume IH: "3 < n \<Longrightarrow> (2::nat) ^ n < fact n"
+  assume PREM: "3 < Suc n"
+  show "(2::nat) ^ Suc n < fact (Suc n)"
+    text \<open>Fill in a proof here. Hint: Start with a case distinction
+      whether \<open>n>3\<close> or \<open>n=3\<close>. \<close>
+  (*<*)
+  proof -
+    from PREM have "n>3 \<or> n=3" by auto
+    then show "(2::nat) ^ Suc n < fact (Suc n)"
+    proof
+      assume GT: "n>3"
+      from IH[OF GT] have "(2::nat) * 2 ^ n < fact n + fact n" by simp
+      also have "\<dots> \<le> fact n + n*fact n" using GT by simp
+      finally have "2 * 2 ^ n < fact n + n * fact n" .
+      then show "(2::nat) ^ Suc n < fact (Suc n)"
+        by simp
+    next
+      assume "n=3"
+      thus ?case by (simp add: eval_nat_numeral)
+    qed
+  qed
+  (*>*)
+qed
+
+text \<open>
+  \vspace{1em}
+  {\bfseries Warning!}
+  Make sure that your numerals have the right type, otherwise
+  proofs will not work! To check the type of a numeral, hover the mouse over
+  it with pressed CTRL (Mac: CMD) key. Example:
+\<close>
+lemma "2^n \<le> 2^Suc n"
+  apply auto oops -- \<open>Leaves the subgoal \<open>2 ^ n \<le> 2 * 2 ^ n\<close>\<close>
+  text \<open>You will find out that the numeral \<open>2\<close> has type @{typ 'a},
+    for which you do not have any ordering laws. So you have to
+    manually restrict the numeral's type to, e.g., @{typ nat}.\<close>
+lemma "(2::nat)^n \<le> 2^Suc n" by simp -- \<open>Note: Type inference will
+  infer \<open>nat\<close> for the unannotated numeral, too. Use CTRL+hover to double check!\<close>
+
+text \<open>
+  \vspace{1em}
+\<close>
+
+text \<open>\Exercise{Sum Squared is Sum of Cubes}
+  \<^item> Define a recursive function $sumto~f~n = \sum_{i=0\ldots n} f(i)$.
+  \<^item> Show that $\left(\sum_{i=0\ldots n}i\right)^2 = \sum_{i=0\ldots n} i^3$.
+\<close>
+
+
+fun sumto :: "(nat \<Rightarrow> nat) \<Rightarrow> nat \<Rightarrow> nat"
+(*<*)
+where
+"sumto f 0 = 0" |
+"sumto f (Suc n) = sumto f n + f(Suc n)"
+(*>*)
+
+text \<open>You may need the following lemma:\<close>
+lemma sum_of_naturals: "2 * sumto (\<lambda>x. x) n = n * Suc n"
+  by (induction n) auto
+
+lemma "sumto (\<lambda>x. x) n ^ 2 = sumto (\<lambda>x. x^3) n"
+proof (induct n)
+  case 0 show ?case by simp
+next
+  case (Suc n)
+  assume IH: "(sumto (\<lambda>x. x) n)\<^sup>2 = sumto (\<lambda>x. x ^ 3) n"
+  note [simp] = algebra_simps -- \<open>Extend the simpset only in this block\<close>
+  show "(sumto (\<lambda>x. x) (Suc n))\<^sup>2 = sumto (\<lambda>x. x ^ 3) (Suc n)"
+  text \<open>Insert a proof here\<close>
+  (*<*)
+  proof -
+    have "sumto (\<lambda>x. x) (Suc n) ^ 2 = (sumto (\<lambda>x. x) n + (n+1))^2"
+      by (simp)
+    also have "\<dots> = sumto (\<lambda>x. x) n ^ 2 + (2 * sumto (\<lambda>x. x) n * (n+1) + (n+1)^2)"
+      by (simp add: power2_eq_square)
+    also have "\<dots> = sumto (\<lambda>x. x^3) n + 2 * sumto (\<lambda>x. x) n * (n+1) + (n+1)^2"
+      using IH by (simp)
+    also have "\<dots> = sumto (\<lambda>x. x^3) n + n * Suc n * (n+1) + (n+1)^2"
+      by (simp add: sum_of_naturals)
+    also have "\<dots> = sumto (\<lambda>x. x^3) n + (n+1)^3"
+      by (simp add: eval_nat_numeral)
+    also have "... = sumto (\<lambda>x. x^3) (Suc n)" by (simp)
+    finally show ?thesis .
+  qed
+  (*>*)
+qed
+
+text \<open>
+  \Exercise{Paths in Graphs}
+  A graph is described by its adjacency matrix, i.e., \<open>G :: 'a \<Rightarrow> 'a \<Rightarrow> bool\<close>.
+
+  Define a predicate \<open>path G u p v\<close> that is true if \<open>p\<close> is a path from
+  \<open>u\<close> to \<open>v\<close>, i.e., \<open>p\<close> is a list of nodes, not including \<open>u\<close>, such that
+  the nodes on the path are connected with edges.
+  In other words, \<open>path G u (p\<^sub>1\<dots>p\<^sub>n) v\<close>, iff \<open>G u p\<^sub>1\<close>, \<open>G p\<^sub>i p\<^sub>i\<^sub>+\<^sub>1\<close>,
+  and \<open>p\<^sub>n = v\<close>. For the empty path (\<open>n=0\<close>), we have \<open>u=v\<close>.
+\<close>
+
+fun path :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a \<Rightarrow> 'a list \<Rightarrow> 'a \<Rightarrow> bool"
+(*<*)
+  where
+  "path G u [] v \<longleftrightarrow> u=v"
+| "path G u (x#xs) v \<longleftrightarrow> G u x \<and> path G x xs v"
+(*>*)
+
+text \<open>Test cases\<close>
+definition "nat_graph x y \<longleftrightarrow> y=Suc x"
+value \<open>path nat_graph 2 [] 2\<close>
+value \<open>path nat_graph 2 [3,4,5] 5\<close>
+value \<open>\<not> path nat_graph 3 [3,4,5] 6\<close>
+value \<open>\<not> path nat_graph 2 [3,4,5] 6\<close>
+
+text \<open>Show the following lemma, that decomposes paths. Register it as simp-lemma.\<close>
+lemma path_append[simp]: "path G u (p1@p2) v \<longleftrightarrow> (\<exists>w. path G u p1 w \<and> path G w p2 v)"
+(*<*)
+  by (induction p1 arbitrary: u) auto
+(*>*)
+
+text \<open>
+  Show that, for a non-distinct path from \<open>u\<close> to \<open>v\<close>,
+  we find a longer non-distinct path from \<open>u\<close> to \<open>v\<close>.
+  Note: This can be seen as a simple pumping-lemma,
+  allowing to pump the length of the path.
+
+  Hint: Theorem @{thm [source] not_distinct_decomp}.
+\<close>
+lemma pump_nondistinct_path:
+  assumes P: "path G u p v"
+  assumes ND: "\<not>distinct p"
+  shows "\<exists>p'. length p' > length p \<and> \<not>distinct p' \<and> path G u p' v"
+(*<*)
+proof -
+  from not_distinct_decomp[OF ND]
+  obtain xs ys zs y where [simp]: "p = xs @ y # ys @ y # zs" by auto
+  from P have 1: "path G u (xs@y#ys@y#ys@y#zs) v"
+    by auto
+
+  have 2: "length (xs@y#ys@y#ys@y#zs) > length p" "\<not>distinct (xs@y#ys@y#ys@y#zs)"
+    by auto
+
+  from 1 2 show ?thesis by blast
+qed
+(*>*)
+
+
+(*<*)  (* Not part of exercise sheet *)
+lemma long_path_nd:
+  assumes "finite V"
+  assumes "set l \<subseteq> V"
+  assumes "length l > card V"
+  shows "\<not>distinct l"
+  by (metis assms card_mono distinct_card leD)
+
+lemma path_subset_V:
+  assumes "\<forall>x y. G x y \<longrightarrow> x\<in>V \<and> y\<in>V"
+  assumes "path G u p v"
+  shows "set p \<subseteq> V"
+  using assms
+  by (induction p arbitrary: u) auto
+
+lemma pump_long_path:
+  assumes FIN: "finite V"
+  assumes SUB: "\<forall>x y. G x y \<longrightarrow> x\<in>V \<and> y\<in>V"
+  assumes PATH: "path G u p v"
+  assumes LEN: "length p > card V"
+  shows "\<exists>p'. length p' > length p \<and> path G u p' v"
+proof -
+  note 1 = path_subset_V[OF SUB PATH]
+  note 2 = long_path_nd[OF FIN 1 LEN]
+  note 3 = pump_nondistinct_path[OF PATH 2]
+  then show ?thesis by blast
+qed
+(*>*)
+
+text \<open>
+  \NumHomework{Split Lists}{May 18}
+  Recall: Use Isar where appropriate, proofs using
+    \<open>metis, smt, meson, or moura\<close> (as generated by sledgehammer) are forbidden!
+
+  Show that every list can be split into a prefix and a suffix,
+  such that the length of the prefix is \<open>1/n\<close> of the original lists's length.
+
+\<close>
+
+lemma
+  assumes "n\<ge>0" -- \<open>Note: This assumption is actually not needed,
+    as @{lemma "n div 0 = 0" by auto}, so don't be puzzled if you do
+    not use it at all in your proof.\<close>
+  shows "\<exists>ys zs. length ys = length xs div n \<and> xs=ys@zs"
+(*<*)
+proof (intro exI)
+  let ?l = "length xs div n"
+  let ?ys = "take ?l xs"
+  let ?zs = "drop ?l xs"
+
+  { fix x
+    have "min x (x div n) \<le> x div n"
+      by auto
+    also have "min x (x div n) \<ge> x div n"
+      by auto
+    finally have "min x (x div n) = x div n" .
+  }
+  then show "length ?ys = ?l \<and> xs = ?ys @ ?zs"
+    by auto
+
+qed
+(*>*)
+
+
+text \<open>
+  \NumHomework{Estimate Recursion Equation}{May 18}
+
+  (Sledgehammer allowed again)
+
+  Show that the function defined by \<open>a 0 = 0\<close> and \<open>a (n+1) = (a n)\<^sup>2 + 1\<close>
+  is bounded by the double-exponential function \<open>2^(2^n)\<close>
+\<close>
+
+fun a :: "nat \<Rightarrow> int" where
+"a 0 = 0" |
+"a (Suc n) = a n ^ 2 + 1"
+
+(*<*)
+lemma a_ge0: "0 \<le> a n" by (induction n) auto
+(*>*)
+
+text \<open>
+  We have given you a proof skeleton, setting up the induction.
+  To complete your proof, you should come up with a chain of inequations.
+  You may try to solve the intermediate steps with sledgehammer.
+
+  Hint: It is a bit tricky to get the approximation right.
+    We strongly recommend to sketch the inequations on paper first.
+
+  Hint: Have a look at the lemma @{thm [source] power_mono}, in particular its
+  instance for squares:
+\<close>
+
+thm power_mono[where n=2]
+
+lemma "a n \<le> 2 ^ (2 ^ n) - 1"
+proof(induction n)
+  case 0 thus ?case by simp
+next
+  case (Suc n)
+  assume IH: "a n \<le> 2 ^ 2 ^ n - 1"
+    -- \<open>Refer to the induction hypothesis by name \<open>IH\<close> or \<open>Suc.IH\<close>\<close>
+  show "a (Suc n) \<le> 2 ^ 2 ^ Suc n - 1"
+  proof -
+    text \<open>Insert your proof here\<close>
+(*<*)
+    have 1: "(4::nat) \<le> 2 ^ (2 ^ n + 1)"
+    proof -
+      have "(4::nat) = 2^2" by simp
+      also have "\<dots> \<le> 2 ^ (2 ^ n + 1)"
+        by (metis add_le_mono1 nat_1_add_1 one_le_numeral one_le_power power_increasing)
+      finally show ?thesis .
+    qed
+    have "a(Suc n) = a n ^ 2 + 1" by simp
+    also have "\<dots> \<le> (2 ^ 2 ^ n -1) ^ 2 + 1" using Suc.IH
+      using power_mono[OF Suc.IH a_ge0]
+      by simp
+    also have "\<dots> = (2 ^ 2 ^ n) ^ 2 - 2 ^ (2 ^ n + 1) + 2"
+      by(simp add: power2_diff)
+    also have "\<dots> \<le> (2 ^ 2 ^ n) ^ 2 - 1" using 1 by simp
+    also have "\<dots> = 2 ^ 2 ^ (Suc n) - 1"
+      by (simp add: power2_eq_square power_add[symmetric])
+    finally show ?thesis .
+  (*>*)
+  qed
+qed
+
+
+(*<*)
+end
+(*>*)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/ex05/tmpl05.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,183 @@
+(*<*)
+theory tmpl05
+  imports
+    Complex_Main
+    "HOL-Library.Tree"
+begin
+(*>*)
+
+
+text {* \ExerciseSheet{5}{11.~5.~2017} *}
+
+text \<open>
+  \<^item> Import \<open>Complex_Main\<close> and \<open>HOL-Library.Tree\<close>
+  \<^item> For this exercise sheet (and Homework 1), you are not allowed to use sledgehammer!
+    Proofs using the \<open>smt, metis, meson, or moura\<close> methods are forbidden!
+\<close>
+
+text \<open>
+  \Exercise{Bounding power-of-two by factorial}
+  Prove that, for all natural numbers $n>3$, we have $2^n < n!$.
+  We have already prepared the proof skeleton for you.
+\<close>
+lemma exp_fact_estimate: "n>3 \<Longrightarrow> (2::nat)^n < fact n"
+proof (induction n)
+  case 0 then show ?case by auto
+next
+  case (Suc n)
+  assume IH: "3 < n \<Longrightarrow> (2::nat) ^ n < fact n"
+  assume PREM: "3 < Suc n"
+  show "(2::nat) ^ Suc n < fact (Suc n)"
+    text \<open>Fill in a proof here. Hint: Start with a case distinction
+      whether \<open>n>3\<close> or \<open>n=3\<close>. \<close>
+    sorry
+qed
+
+text \<open>
+  \vspace{1em}
+  {\bfseries Warning!}
+  Make sure that your numerals have the right type, otherwise
+  proofs will not work! To check the type of a numeral, hover the mouse over
+  it with pressed CTRL (Mac: CMD) key. Example:
+\<close>
+lemma "2^n \<le> 2^Suc n"
+  apply auto oops -- \<open>Leaves the subgoal \<open>2 ^ n \<le> 2 * 2 ^ n\<close>\<close>
+  text \<open>You will find out that the numeral \<open>2\<close> has type @{typ 'a},
+    for which you do not have any ordering laws. So you have to
+    manually restrict the numeral's type to, e.g., @{typ nat}.\<close>
+lemma "(2::nat)^n \<le> 2^Suc n" by simp -- \<open>Note: Type inference will
+  infer \<open>nat\<close> for the unannotated numeral, too. Use CTRL+hover to double check!\<close>
+
+text \<open>
+  \vspace{1em}
+\<close>
+
+text \<open>\Exercise{Sum Squared is Sum of Cubes}
+  \<^item> Define a recursive function $sumto~f~n = \sum_{i=0\ldots n} f(i)$.
+  \<^item> Show that $\left(\sum_{i=0\ldots n}i\right)^2 = \sum_{i=0\ldots n} i^3$.
+\<close>
+
+
+fun sumto :: "(nat \<Rightarrow> nat) \<Rightarrow> nat \<Rightarrow> nat"
+where
+"sumto f 0 = 0"
+
+text \<open>You may need the following lemma:\<close>
+lemma sum_of_naturals: "2 * sumto (\<lambda>x. x) n = n * Suc n"
+  (*by (induction n) auto*) oops
+
+lemma "sumto (\<lambda>x. x) n ^ 2 = sumto (\<lambda>x. x^3) n"
+proof (induct n)
+  case 0 show ?case by simp
+next
+  case (Suc n)
+  assume IH: "(sumto (\<lambda>x. x) n)\<^sup>2 = sumto (\<lambda>x. x ^ 3) n"
+  note [simp] = algebra_simps -- \<open>Extend the simpset only in this block\<close>
+  show "(sumto (\<lambda>x. x) (Suc n))\<^sup>2 = sumto (\<lambda>x. x ^ 3) (Suc n)"
+  text \<open>Insert a proof here\<close>
+    sorry
+qed
+
+text \<open>
+  \Exercise{Paths in Graphs}
+  A graph is described by its adjacency matrix, i.e., \<open>G :: 'a \<Rightarrow> 'a \<Rightarrow> bool\<close>.
+
+  Define a predicate \<open>path G u p v\<close> that is true if \<open>p\<close> is a path from
+  \<open>u\<close> to \<open>v\<close>, i.e., \<open>p\<close> is a list of nodes, not including \<open>u\<close>, such that
+  the nodes on the path are connected with edges.
+  In other words, \<open>path G u (p\<^sub>1\<dots>p\<^sub>n) v\<close>, iff \<open>G u p\<^sub>1\<close>, \<open>G p\<^sub>i p\<^sub>i\<^sub>+\<^sub>1\<close>,
+  and \<open>p\<^sub>n = v\<close>. For the empty path (\<open>n=0\<close>), we have \<open>u=v\<close>.
+\<close>
+
+fun path :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a \<Rightarrow> 'a list \<Rightarrow> 'a \<Rightarrow> bool"
+  where
+  "path _ _ _ _ \<longleftrightarrow> False"
+
+text \<open>Test cases\<close>
+definition "nat_graph x y \<longleftrightarrow> y=Suc x"
+value \<open>path nat_graph 2 [] 2\<close>
+value \<open>path nat_graph 2 [3,4,5] 5\<close>
+value \<open>\<not> path nat_graph 3 [3,4,5] 6\<close>
+value \<open>\<not> path nat_graph 2 [3,4,5] 6\<close>
+
+text \<open>Show the following lemma, that decomposes paths. Register it as simp-lemma.\<close>
+lemma path_append[simp]: "path G u (p1@p2) v \<longleftrightarrow> (\<exists>w. path G u p1 w \<and> path G w p2 v)"
+  oops
+
+text \<open>
+  Show that, for a non-distinct path from \<open>u\<close> to \<open>v\<close>,
+  we find a longer non-distinct path from \<open>u\<close> to \<open>v\<close>.
+  Note: This can be seen as a simple pumping-lemma,
+  allowing to pump the length of the path.
+
+  Hint: Theorem @{thm [source] not_distinct_decomp}.
+\<close>
+lemma pump_nondistinct_path:
+  assumes P: "path G u p v"
+  assumes ND: "\<not>distinct p"
+  shows "\<exists>p'. length p' > length p \<and> \<not>distinct p' \<and> path G u p' v"
+  oops
+
+
+text \<open>
+  \NumHomework{Split Lists}{May 18}
+  Recall: Use Isar where appropriate, proofs using
+    \<open>metis, smt, meson, or moura\<close> (as generated by sledgehammer) are forbidden!
+
+  Show that every list can be split into a prefix and a suffix,
+  such that the length of the prefix is \<open>1/n\<close> of the original lists's length.
+
+\<close>
+
+lemma
+  assumes "n\<ge>0" -- \<open>Note: This assumption is actually not needed,
+    as @{lemma "n div 0 = 0" by auto}, so don't be puzzled if you do
+    not use it at all in your proof.\<close>
+  shows "\<exists>ys zs. length ys = length xs div n \<and> xs=ys@zs"
+  oops
+
+text \<open>
+  \NumHomework{Estimate Recursion Equation}{May 18}
+
+  (Sledgehammer allowed again)
+
+  Show that the function defined by \<open>a 0 = 0\<close> and \<open>a (n+1) = (a n)\<^sup>2 + 1\<close>
+  is bounded by the double-exponential function \<open>2^(2^n)\<close>
+\<close>
+
+fun a :: "nat \<Rightarrow> int" where
+"a 0 = 0" |
+"a (Suc n) = a n ^ 2 + 1"
+
+text \<open>
+  We have given you a proof skeleton, setting up the induction.
+  To complete your proof, you should come up with a chain of inequations.
+  You may try to solve the intermediate steps with sledgehammer.
+
+  Hint: It is a bit tricky to get the approximation right.
+    We strongly recommend to sketch the inequations on paper first.
+
+  Hint: Have a look at the lemma @{thm [source] power_mono}, in particular its
+  instance for squares:
+\<close>
+
+thm power_mono[where n=2]
+
+lemma "a n \<le> 2 ^ (2 ^ n) - 1"
+proof(induction n)
+  case 0 thus ?case by simp
+next
+  case (Suc n)
+  assume IH: "a n \<le> 2 ^ 2 ^ n - 1"
+    -- \<open>Refer to the induction hypothesis by name \<open>IH\<close> or \<open>Suc.IH\<close>\<close>
+  show "a (Suc n) \<le> 2 ^ 2 ^ Suc n - 1"
+  proof -
+    text \<open>Insert your proof here\<close>
+    show ?thesis sorry
+  qed
+qed
+
+
+(*<*)
+end
+(*>*)
Binary file SS18/Exercises/ex06.pdf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/ex06/document/build	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+${ISABELLE_TOOL} latex -o sty root.tex && \
+${ISABELLE_TOOL} latex -o pdf root.tex && \
+${ISABELLE_TOOL} latex -o pdf root.tex && \
+${ISABELLE_TOOL} latex -o pdf root.tex && \
+cp root.pdf ../../../$2.pdf
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/ex06/document/exercise.sty	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,51 @@
+
+\newcommand{\Lecture}{Functional Data Structures}
+\newcommand{\Semester}{SS 2018}
+\newcommand{\Prof}{Prof.~Tobias~Nipkow,~Ph.D.}
+\newcommand{\Tutor}{Dr. Peter Lammich}
+
+\newcounter{sheet}
+\newcounter{homework}
+
+\newlength{\abslength}\setlength{\abslength}{2mm plus 1mm minus 1mm}
+\newcommand{\abs}{\par\vspace{\abslength}}
+
+\newlength{\TUMBr}\settowidth{\TUMBr}{{\bf Technische Universit{\"a}t M{\"u}nchen}}
+\newcommand{\Header}[5]{{\bf
+ \makebox[\TUMBr]{Technische Universit{\"a}t M{\"u}nchen} \hfill #3\\
+ \makebox[\TUMBr]{Institut f{\"u}r Informatik} \hfill #4\\
+ \makebox[\TUMBr]{#1} \hfill #5\\
+ \makebox[\TUMBr]{#2}}\abs}
+
+\newcommand{\Title}[1]{%
+  \begin{center}{\LARGE\bf\Lecture}\\[1ex]{\bf Exercise Sheet #1}\end{center}}
+
+\newcommand{\ExerciseSheet}[2]{%
+  \pagestyle{empty}%
+  \setcounter{sheet}{#1}%
+  \vspace*{-2cm}\Header{\Prof}{\Tutor}{\Semester}{#2}{}\vspace*{1cm}%
+  \Title{#1}\abs}
+
+\newcounter{exercise}
+\newcommand{\Exercise}[1]{%
+  \refstepcounter{exercise}%
+  \pagebreak[3]%
+  \relax%
+  \vspace{0.8em}%
+  \subsection*{{Exercise \arabic{sheet}.\arabic{exercise}\ \ \normalfont\sffamily #1}}}
+
+\newcommand{\Homework}[2]{%
+  \pagebreak[3]%
+  \relax%
+  \vspace{0.8em}%
+  \subsection*{{Homework \arabic{sheet}\ \ \normalfont\sffamily #1}}%
+  \emph{Submission until Friday, #2, 11:59am.}}
+
+\newcommand{\NumHomework}[2]{%
+  \refstepcounter{homework}%
+  \pagebreak[3]%
+  \relax%
+  \vspace{0.8em}%
+  \subsection*{{Homework \arabic{sheet}.\arabic{homework}\ \ \normalfont\sffamily #1}}%
+  \emph{Submission until Friday, #2, 11:59am.}}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/ex06/document/root.tex	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,66 @@
+\documentclass[11pt,a4paper]{scrartcl}
+\usepackage{isabelle,isabellesym}
+\usepackage{exercise}
+\usepackage{amsmath}
+
+% further packages required for unusual symbols (see also
+% isabellesym.sty), use only when needed
+
+\usepackage{amssymb}
+  %for \<leadsto>, \<box>, \<diamond>, \<sqsupset>, \<mho>, \<Join>,
+  %\<lhd>, \<lesssim>, \<greatersim>, \<lessapprox>, \<greaterapprox>,
+  %\<triangleq>, \<yen>, \<lozenge>
+
+%\usepackage[greek,english]{babel}
+  %option greek for \<euro>
+  %option english (default language) for \<guillemotleft>, \<guillemotright>
+
+\usepackage[latin1]{inputenc}
+  %for \<onesuperior>, \<onequarter>, \<twosuperior>, \<onehalf>,
+  %\<threesuperior>, \<threequarters>, \<degree>
+
+\usepackage[only,bigsqcap]{stmaryrd}
+  %for \<Sqinter>
+
+%\usepackage{eufrak}
+  %for \<AA> ... \<ZZ>, \<aa> ... \<zz> (also included in amssymb)
+
+%\usepackage{textcomp}
+  %for \<cent>, \<currency>
+
+% this should be the last package used
+\usepackage{pdfsetup}
+
+% urls in roman style, theory text in math-similar italics
+\urlstyle{rm}
+\isabellestyle{it}
+
+% for uniform font size
+%\renewcommand{\isastyle}{\isastyleminor}
+
+\begin{document}
+
+% sane default for proof documents
+\parindent 0pt\parskip 0.5ex
+
+
+\renewcommand{\isachardoublequote}{`\"}
+\renewcommand{\isachardoublequoteopen}{``}
+\renewcommand{\isachardoublequoteclose}{''}
+\renewcommand{\isacharunderscore}{\_}
+\renewcommand{\isacharunderscorekeyword}{\_}
+
+
+% generated text of all theories
+\input{session}
+
+% optional bibliography
+%\bibliographystyle{abbrv}
+%\bibliography{root}
+
+\end{document}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/ex06/ex06.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,260 @@
+(*<*)
+theory ex06
+  imports Main
+begin
+(*>*)
+
+
+text {* \ExerciseSheet{6}{18.~5.~2018} *}
+
+text \<open>\Exercise{Complexity of Naive Reverse}
+  Show that the naive reverse function needs quadratically many
+  \<open>Cons\<close> operations in the length of the input list.
+  (Note that \<open>[x]\<close> is syntax sugar for \<open>Cons x []\<close>!)
+\<close>
+
+thm append.simps
+
+fun reverse where
+  "reverse [] = []"
+| "reverse (x#xs) = reverse xs @ [x]"
+
+(*<*)
+fun t_append :: "'a list \<Rightarrow> 'a list \<Rightarrow> nat" where
+  "t_append [] _ = 0"
+| "t_append (x#xs) ys = 1 + t_append xs ys"
+
+fun t_reverse :: "'a list \<Rightarrow> nat" where
+  "t_reverse [] = 0"
+| "t_reverse (x#xs) = t_reverse xs + t_append (reverse xs) [x] + 1"
+
+lemma [simp]: "t_append xs ys = length xs"
+  by (induction xs) auto
+
+lemma [simp]: "length (reverse xs) = length xs"
+  by (induction xs) auto
+
+value "map (\<lambda>n. t_reverse (replicate n ())) [1,2,3,4,5,6,7] "
+
+lemma [simp]: "t_reverse xs = (length xs * (length xs+1)) div 2"
+  by (induction xs) auto
+(*>*)
+
+
+text \<open>
+  \Exercise{Simple Paths}
+  Recall the definition of paths from last exercise sheet:
+\<close>
+fun path :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a \<Rightarrow> 'a list \<Rightarrow> 'a \<Rightarrow> bool"
+  where
+  "path G u [] v \<longleftrightarrow> u=v"
+| "path G u (x#xs) v \<longleftrightarrow> G u x \<and> path G x xs v"
+
+lemma path_append[simp]: "path G u (p1@p2) v \<longleftrightarrow> (\<exists>w. path G u p1 w \<and> path G w p2 v)"
+  by (induction p1 arbitrary: u) auto
+
+
+text \<open>
+  A simple path is a path without loops, or, in other words, a path
+  where no node occurs twice. (Note that the first node of the path is
+  not included, such that there may be a simple path from \<open>u\<close> to \<open>u\<close>.)
+
+  Show that for every path, there is a corresponding simple path.
+
+  Hint: Induction on the length of the path
+\<close>
+thm measure_induct_rule[where f=length, case_names shorter]
+
+lemma exists_simple_path:
+  assumes "path G u p v"
+  shows "\<exists>p'. path G u p' v \<and> distinct p'"
+(*<*)
+  using assms
+proof (induction p rule: measure_induct_rule[where f=length, case_names shorter])
+  case (shorter p)
+  assume PREM: "path G u p v"
+  show "\<exists>p'. path G u p' v \<and> distinct p'"
+  proof cases
+    assume "distinct p"
+    with PREM show ?thesis by auto
+  next
+    assume A: "\<not>distinct p"
+    from not_distinct_decomp[OF A]
+    obtain xs ys zs y where [simp]: "p = xs @ [y] @ ys @ [y] @ zs" by blast
+    then have PP: "path G u (xs@y#zs) v" using PREM by auto
+    have "length (xs@y#zs) < length p" by auto
+    with shorter.IH PP obtain p' where P': "path G u p' v" "distinct p'"
+      by blast
+    thus ?thesis by blast
+  qed
+qed
+(*>*)
+
+
+
+text \<open>\NumHomework{Stability of Insertion Sort}{May 25}
+  Have a look at Isabelle's standard implementation of sorting: @{const sort_key}.
+  (Use Ctrl-Click to jump to the definition in @{file "~~/src/HOL/List.thy"})
+  Show that this function is a stable sorting algorithm, i.e., the order of elements
+  with the same key is not changed during sorting!
+\<close>
+
+lemma "[x\<leftarrow>sort_key k xs. k x = a] = [x\<leftarrow>xs. k x = a]"
+(*<*)
+  apply (induction xs)
+  apply (auto simp: filter_insort insort_is_Cons filter_insort_triv)
+  done
+(*>*)
+
+term "[x\<leftarrow>xs. P x]"
+text \<open>
+  Note: @{term [source] \<open>[x\<leftarrow>xs. P x] \<close>} is syntax sugar for @{term [source] \<open>filter P xs\<close>},
+  where the filter function returns only the elements of list \<open>xs\<close> for which \<open>P xs = True\<close>.
+
+  Hint: You do not necessarily need Isar, and the auxiliary lemmas
+    you need are already in Isabelle's library. @{command find_theorems} is your friend!
+\<close>
+
+
+text \<open>\NumHomework{Quickselect}{May 25}
+
+From \<^url>\<open>https://en.wikipedia.org/wiki/Quickselect\<close>:
+
+Quickselect is a selection algorithm to find the kth smallest element in an unordered list.
+It is related to the quicksort sorting algorithm.
+Like quicksort, it was developed by Tony Hoare, and thus is also known as Hoare's selection
+algorithm. Like quicksort, it is efficient in practice and has good average-case performance,
+but has poor worst-case performance. Quickselect and its variants are the selection algorithms
+most often used in efficient real-world implementations.
+
+Quickselect uses the same overall approach as quicksort, choosing one element as a pivot and
+partitioning the data in two based on the pivot, accordingly as less than or greater than the
+pivot. However, instead of recursing into both sides, as in quicksort, quickselect only
+recurses into one side --- the side with the element it is searching for.
+
+
+Your task is to prove correct the quickselect algorithm, which can be
+  implemented in Isabelle as follows:
+\<close>
+
+fun quickselect :: "'a::linorder list \<Rightarrow> nat \<Rightarrow> 'a" where
+  "quickselect (x#xs) k = (let
+    xs1 = [y\<leftarrow>xs. y<x];
+    xs2 = [y\<leftarrow>xs. \<not>(y<x)]
+  in
+    if k<length xs1 then quickselect xs1 k
+    else if k=length xs1 then x
+    else quickselect xs2 (k-length xs1-1)
+  )"
+| "quickselect [] _ = undefined"
+
+
+text \<open>Your first task is to prove the crucial idea of quicksort, i.e., that
+  partitioning wrt.\ a pivot element $p$ is correct.
+\<close>
+(*<*)
+lemma aux1: "\<forall>k\<in>set xs. k<x \<Longrightarrow> insort x (xs@ys) = xs@insort x ys"
+  by (induction xs) auto
+
+lemma aux21: "\<forall>xa\<in>set ys. \<not>(x > xa) \<Longrightarrow> insort x ys = x # ys"
+  by (induction ys) auto
+
+lemma aux2: "\<forall>k\<in>set ys. \<not>k<x \<Longrightarrow> insort x (xs@ys) = insort x xs @ ys"
+  apply (induction xs)
+  apply (auto simp: aux21)
+  done
+(*>*)
+
+lemma partition_correct: "sort xs = sort [x\<leftarrow>xs. x<p] @ sort [x\<leftarrow>xs. \<not>(x<p)]"
+(*<*)
+proof (induction xs)
+  case Nil
+  then show ?case by auto
+next
+  case (Cons a xs)
+  then show ?case proof cases
+    assume "a<p"
+    hence 1: "\<forall>x\<in>set (sort [x\<leftarrow>xs . \<not> x < p]). \<not>x<a" by auto
+    from Cons \<open>a<p\<close> show ?thesis by (simp add: aux2[OF 1])
+  next
+    assume "\<not>a<p"
+    hence 1: "\<forall>x\<in>set (sort [x\<leftarrow>xs . x < p]). x<a" by auto
+    from Cons \<open>\<not>a<p\<close> show ?thesis by (simp add: aux1[OF 1])
+  qed
+qed
+(*>*)
+
+text \<open>
+  Hint: Induction, and auxiliary lemmas to transform a term of the
+    form @{term \<open>insort x (xs@ys)\<close>} when you know that \<open>x\<close> is greater than
+    all elements in \<open>xs\<close> / less than or equal all elements in \<open>ys\<close>.
+\<close>
+
+
+
+text \<open>Next, show that quickselect is correct\<close>
+lemma "k<length xs \<Longrightarrow> quickselect xs k = sort xs ! k"
+  text \<open>Proceed by computation induction, and a case distinction according to the
+    cases in the body of the quickselect function\<close>
+proof (induction xs k rule: quickselect.induct)
+  case (1 x xs k)
+
+  text \<open>Note: To make the induction hypothesis more readable,
+    you can collapse the first two premises of the form \<open>?x=\<dots>\<close>
+    by reflexivity:\<close>
+  note IH = "1.IH"[OF refl refl]
+
+  text \<open>Insert your proof here!\<close>
+
+  (*<*)
+
+  let ?xs1 = "[y\<leftarrow>xs . y < x]"
+  let ?xs2 = "[y\<leftarrow>xs . \<not>(y < x)]"
+
+  have [simp]: "sort (x#xs) = sort ?xs1 @ x # sort ?xs2"
+    using partition_correct[of "x#xs" x]
+  text \<open>Hint: Use the lemma @{thm [source] partition_correct} and another auxiliary lemma here.\<close>
+    by (auto simp: aux21)
+  note [simp del] = sort_key_simps
+
+  consider (L) "k<length ?xs1" | (E) "k=length ?xs1" | (G) "k>length ?xs1"
+    using nat_neq_iff by blast
+  then show ?case proof cases
+    case L
+    then have "quickselect (x # xs) k = quickselect ?xs1 k" by simp (* Braucht man nicht, man sieht aber, das man die richtige Fallunterscheidung gemacht hat *)
+
+    show ?thesis using L IH(1)
+      by (simp add: nth_append)
+    (* Es ist komisch, dass diese OF refl notwendig sind *)
+    thm "1.IH"
+  next
+    case E
+    then have "quickselect (x # xs) k = x" by simp
+    show ?thesis by (simp add: nth_append E)
+  next
+    case G
+    then have "quickselect (x # xs) k = quickselect ?xs2 (k-length ?xs1-1)"
+      by simp
+
+    have "k < 1 + length ?xs1 + length ?xs2" (* Hier braucht man ein Hilfslemma ...
+       ohne das findet sledgehammer *manchmal* einen sehr langen  smt-Beweis, aber nicht immer *)
+    proof -
+      have "length xs = length ?xs1 + length ?xs2"
+        by (simp add: sum_length_filter_compl)
+      with "1.prems" show ?thesis by simp
+    qed
+    then show ?thesis using G IH(2)
+      by (simp add: nth_append)
+  qed
+  (*>*)
+next
+  case 2 then show ?case by simp
+qed
+
+
+
+
+
+(*<*)
+end
+(*>*)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/ex06/tmpl06.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,149 @@
+(*<*)
+theory tmpl06
+  imports Main
+begin
+(*>*)
+
+
+text {* \ExerciseSheet{6}{18.~5.~2018} *}
+
+text \<open>\Exercise{Complexity of Naive Reverse}
+  Show that the naive reverse function needs quadratically many
+  \<open>Cons\<close> operations in the length of the input list.
+  (Note that \<open>[x]\<close> is syntax sugar for \<open>Cons x []\<close>!)
+\<close>
+
+thm append.simps
+
+fun reverse where
+  "reverse [] = []"
+| "reverse (x#xs) = reverse xs @ [x]"
+
+(** Define cost functions and prove that they are equal to quadratic function *)
+
+text \<open>
+  \Exercise{Simple Paths}
+  Recall the definition of paths from last exercise sheet:
+\<close>
+fun path :: "('a \<Rightarrow> 'a \<Rightarrow> bool) \<Rightarrow> 'a \<Rightarrow> 'a list \<Rightarrow> 'a \<Rightarrow> bool"
+  where
+  "path G u [] v \<longleftrightarrow> u=v"
+| "path G u (x#xs) v \<longleftrightarrow> G u x \<and> path G x xs v"
+
+lemma path_append[simp]: "path G u (p1@p2) v \<longleftrightarrow> (\<exists>w. path G u p1 w \<and> path G w p2 v)"
+  by (induction p1 arbitrary: u) auto
+
+
+text \<open>
+  A simple path is a path without loops, or, in other words, a path
+  where no node occurs twice. (Note that the first node of the path is
+  not included, such that there may be a simple path from \<open>u\<close> to \<open>u\<close>.)
+
+  Show that for every path, there is a corresponding simple path.
+
+  Hint: Induction on the length of the path
+\<close>
+thm measure_induct_rule[where f=length, case_names shorter]
+
+thm not_distinct_decomp
+
+lemma exists_simple_path:
+  assumes "path G u p v"
+  shows "\<exists>p'. path G u p' v \<and> distinct p'"
+  oops
+
+
+text \<open>\NumHomework{Stability of Insertion Sort}{May 25}
+  Have a look at Isabelle's standard implementation of sorting: @{const sort_key}.
+  (Use Ctrl-Click to jump to the definition in @{file "~~/src/HOL/List.thy"})
+  Show that this function is a stable sorting algorithm, i.e., the order of elements
+  with the same key is not changed during sorting!
+\<close>
+
+lemma "[x\<leftarrow>sort_key k xs. k x = a] = [x\<leftarrow>xs. k x = a]"
+  oops
+
+term "[x\<leftarrow>xs. P x]"
+text \<open>
+  Note: @{term [source] \<open>[x\<leftarrow>xs. P x] \<close>} is syntax sugar for @{term [source] \<open>filter P xs\<close>},
+  where the filter function returns only the elements of list \<open>xs\<close> for which \<open>P xs = True\<close>.
+
+  Hint: You do not necessarily need Isar, and the auxiliary lemmas
+    you need are already in Isabelle's library. @{command find_theorems} is your friend!
+\<close>
+
+
+text \<open>\NumHomework{Quickselect}{May 25}
+
+From \<^url>\<open>https://en.wikipedia.org/wiki/Quickselect\<close>:
+
+Quickselect is a selection algorithm to find the kth smallest element in an unordered list.
+It is related to the quicksort sorting algorithm.
+Like quicksort, it was developed by Tony Hoare, and thus is also known as Hoare's selection
+algorithm. Like quicksort, it is efficient in practice and has good average-case performance,
+but has poor worst-case performance. Quickselect and its variants are the selection algorithms
+most often used in efficient real-world implementations.
+
+Quickselect uses the same overall approach as quicksort, choosing one element as a pivot and
+partitioning the data in two based on the pivot, accordingly as less than or greater than the
+pivot. However, instead of recursing into both sides, as in quicksort, quickselect only
+recurses into one side --- the side with the element it is searching for.
+
+
+Your task is to prove correct the quickselect algorithm, which can be
+  implemented in Isabelle as follows:
+\<close>
+
+fun quickselect :: "'a::linorder list \<Rightarrow> nat \<Rightarrow> 'a" where
+  "quickselect (x#xs) k = (let
+    xs1 = [y\<leftarrow>xs. y<x];
+    xs2 = [y\<leftarrow>xs. \<not>(y<x)]
+  in
+    if k<length xs1 then quickselect xs1 k
+    else if k=length xs1 then x
+    else quickselect xs2 (k-length xs1-1)
+  )"
+| "quickselect [] _ = undefined"
+
+
+text \<open>Your first task is to prove the crucial idea of quicksort, i.e., that
+  partitioning wrt.\ a pivot element $p$ is correct.
+\<close>
+
+lemma partition_correct: "sort xs = sort [x\<leftarrow>xs. x<p] @ sort [x\<leftarrow>xs. \<not>(x<p)]"
+  oops
+
+text \<open>
+  Hint: Induction, and auxiliary lemmas to transform a term of the
+    form @{term \<open>insort x (xs@ys)\<close>} when you know that \<open>x\<close> is greater than
+    all elements in \<open>xs\<close> / less than or equal all elements in \<open>ys\<close>.
+\<close>
+
+
+
+text \<open>Next, show that quickselect is correct\<close>
+lemma "k<length xs \<Longrightarrow> quickselect xs k = sort xs ! k"
+  text \<open>Proceed by computation induction, and a case distinction according to the
+    cases in the body of the quickselect function\<close>
+proof (induction xs k rule: quickselect.induct)
+  case (1 x xs k)
+
+  text \<open>Note: To make the induction hypothesis more readable,
+    you can collapse the first two premises of the form \<open>?x=\<dots>\<close>
+    by reflexivity:\<close>
+  note IH = "1.IH"[OF refl refl]
+
+  text \<open>Insert your proof here!\<close>
+
+  show ?case sorry
+next
+  case 2 then show ?case by simp
+qed
+
+
+
+
+
+(*<*)
+end
+(*>*)
--- a/SS18/Exercises/hwsubm/email.log	Wed May 02 13:14:58 2018 +0200
+++ b/SS18/Exercises/hwsubm/email.log	Fri May 18 09:52:22 2018 +0200
@@ -73,3 +73,72 @@
 Fr 27. Apr 16:38:11 CEST 2018
 /home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw02 a.kutafina@tum.de assoc_list.thy delta_encoding.thy per_bal_tree.thy
 OK
+Di 15. Mai 11:23:10 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 martin.rau@tum.de Home04.thy
+OK
+Di 15. Mai 11:23:11 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 florian.stamer@tum.de ex04.thy
+OK
+Di 15. Mai 11:23:11 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 mitja.krebs@tum.de tmpl04.thy
+OK
+Di 15. Mai 11:23:11 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 max.kirchmeier@tum.de tut04.thy
+OK
+Di 15. Mai 11:23:11 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 a.putwattana@tum.de hw04.thy
+OK
+Di 15. Mai 11:23:11 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 ge72lic@mytum.de ex04.thy
+OK
+Di 15. Mai 11:23:11 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 felix.wielander@tum.de hw04.thy
+OK
+Di 15. Mai 11:23:11 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 ga53qud@mytum.de hw04.thy
+OK
+Di 15. Mai 11:23:12 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 ge69kel@mytum.de tmpl04.thy
+OK
+Di 15. Mai 11:23:12 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 jonatan.juhas@tum.de ha04.thy
+OK
+Di 15. Mai 11:23:12 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 eric.koepke@tum.de ex04.thy
+OK
+Di 15. Mai 11:23:12 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 clemens.jonischkeit@tum.de jonischkeit04.thy
+OK
+Di 15. Mai 11:23:12 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 j.gottfriedsen@tum.de homework04.thy
+OK
+Di 15. Mai 11:23:12 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 a.kutafina@tum.de tmpl04.thy
+OK
+Di 15. Mai 11:23:12 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 s.griebel@tum.de homework04.thy
+OK
+Di 15. Mai 11:23:12 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 ga59zew@mytum.de hw04.thy
+OK
+Di 15. Mai 11:23:12 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 g.bidlingmaier@tum.de tmpl04.thy
+OK
+Di 15. Mai 11:23:12 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 sabine.rieder@tum.de tmpl04.thy
+OK
+Di 15. Mai 11:23:12 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 daniel.kutasi@mytum.de hw04.thy
+OK
+Di 15. Mai 11:23:12 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 omar.badramany@tum.de hw04.thy
+OK
+Di 15. Mai 11:23:13 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 nick.smith@tum.de HW04.thy
+OK
+Di 15. Mai 11:23:13 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 katharinaluise.schmitt@tum.de ex04.thy
+OK
+Di 15. Mai 11:23:13 CEST 2018
+/home/lammich/lehre/FDS/Private/SS18/Exercises/hwsubm/_sendmail.py PASSWORD hw04 ga96koz@mytum.de hw04.thy
+OK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/a.kutafina@tum.de/msg-13020-1.txt	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,12 @@
+Good morning Dr. Lammich,
+
+Herewith I send you my third homework.
+
+Sincerely yours
+Anastassiya Kutafina
+
+-- 
+Mit freundlichen Grüßen
+
+Anastassiya Kutafina
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/a.kutafina@tum.de/tree_addr.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,64 @@
+(** Score: 2/10
+
+  hw1: defs, simple lemmas  |  no valid-preconds, no append lemmas, no put append
+  hw2: Missing
+*)
+
+theory tree_addr
+  imports Main  "~~/src/HOL/Library/Tree"
+begin
+
+datatype direction = L | R
+type_synonym path = "direction list"
+
+(*Specify when a path is valid*)
+fun valid :: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+"valid t [] = True"
+|"valid Leaf _ = False"
+|"valid (Node l a r) (x#xs) = (if x=L then valid l xs else valid r xs)"
+
+(*Specify a function to return the subtree addressed by a given path*)
+fun get :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree" where
+"get t [] = t"
+| "get Leaf _ = Leaf"  (** Why not use undefined as indicated in question? *)
+| "get (Node l a r) (x#xs) = (if x=L then get l xs else get r xs)"
+
+(*Specify a function put t p s, that returns t, with the subtree at p replaced by s.*)
+fun put :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+"put t [] s = s"
+| "put (Node l1 a1 r1) (x#xs) s = (if x=L then Node (put l1 xs s) a1 r1 else Node l1 a1 (put r1 xs s))"
+| "put t p s = t"
+
+(*Specify your function such that it does nothing if an invalid path is given, and prove*)
+lemma put_invalid[simp] : "\<not>valid t p \<Longrightarrow> put t p s = t"
+  apply (induction t p rule: valid.induct)
+  apply (auto split: tree.splits)
+  done
+
+(*Prove the following algebraic laws on put and get.
+Add preconditions of the form valid t p where needed!*)
+lemma get_put[simp]: "put t p (get t p) = t"
+  apply (induction p rule: valid.induct)
+  apply (auto split: tree.splits)
+  done
+
+
+lemma put_put[simp]: "put (put t p s) p s' = put t p s'"
+  apply (induction t p rule: valid.induct)
+  apply (auto)
+  done
+
+lemma put_get[simp]: "get (put t p s) p = s"
+  sorry
+lemma valid_put[simp]: "valid (put t p s) p"
+  sorry
+
+(* Show the following lemmas about appending two paths *)
+
+lemma valid_append[simp]:"valid t (p@q) \<longleftrightarrow> valid t p \<and> valid (get t p) q"
+  sorry
+lemma get_append[simp]: "valid t p \<Longrightarrow> get t (p@q) = get (get t p) q"
+  sorry
+(* lemma put_append[simp]: "put t (p@q) s = specify a meaningful term here" *)
+
+end
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/alexejrotar@gmail.com/hw03.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,184 @@
+(** Score: 6/10
+  hw1: ok
+  hw2: no final lemmas proved, wrong def of sublist,
+*)
+(*<*)
+theory hw03
+imports "../../../BST_Demo"
+begin
+(*>*)
+
+text {* \NumHomework{Tree Addressing}{May 4} *}
+text \<open>
+  A position in a tree can be given as a list of
+  navigation instructions from the root, i.e., whether to go
+  to the left or right subtree. We call such a list a path.
+\<close>
+  datatype direction = L | R
+  type_synonym path = "direction list"
+
+text \<open>Specify when a path is valid:\<close>
+
+  fun valid :: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+    "valid t [] = True" |
+    "valid Leaf (x#xs) = False" |
+    "valid (Node l a r) (x#xs) = (if x=L then valid l xs else valid r xs)"
+
+text \<open>Specify a function to return the subtree addressed by a given path:\<close>
+  fun get :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree"
+  where
+  (* Insert your eqns here *)
+    "get t [] = t" |
+    "get (Node l a r) (x#xs) = (if x=L then get l xs else get r xs)" |
+    "get _ _ = undefined" -- \<open>Catch-all clause to get rid of missing patterns warning\<close>
+
+
+text \<open>Specify a function \<open>put t p s\<close>, that returns \<open>t\<close>, with the subtree
+  at \<open>p\<close> replaced by \<open>s\<close>.
+\<close>
+  fun put :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree \<Rightarrow> 'a tree"
+    where
+      "put t [] s = s" |
+      "put (Node l a r) (x#xs) s = (
+        if x=L then (Node (put l xs s) a r)
+        else (Node l a (put r xs s)))" |
+      "put Leaf (x#xs) _ = Leaf"
+
+text \<open>Specify your function such that it does nothing if an invalid path
+  is given, and prove:
+  \<close>
+
+lemma put_invalid: "\<not>valid t p \<Longrightarrow> put t p s = t"
+  apply (induction rule: valid.induct)
+   apply auto
+  done
+
+text \<open>Note: this convention will simplify some of
+  the lemmas, reducing the required validity preconditions.
+
+  Prove the following algebraic laws on \<open>put\<close> and \<open>get\<close>.
+  Add preconditions of the form \<open>valid t p\<close> where needed!
+  \<close>
+
+lemma get_put[simp]: "valid t p \<Longrightarrow> put t p (get t p) = t"
+  apply (induction rule: valid.induct)
+    apply auto
+  done
+
+lemma put_put[simp]: "put (put t p s) p s' = put t p s'"
+  apply (induction arbitrary: s s' rule: valid.induct)
+    apply auto
+  done
+
+lemma put_get[simp]: "valid t p \<Longrightarrow> get (put t p s) p = s"
+  apply (induction arbitrary: s rule: valid.induct)
+    apply auto
+  done
+
+lemma valid_put[simp]: "valid t p \<Longrightarrow> valid (put t p s) p"
+  apply (induction arbitrary: s rule: valid.induct)
+    apply auto
+  done
+
+  text \<open>
+    Show the following lemmas about appending two paths:
+  \<close>
+
+lemma valid_append[simp]: "valid t (p@q) \<longleftrightarrow> valid t p \<and> valid (get t p) q"
+  apply (induction t p arbitrary: q rule: valid.induct)
+    apply auto
+  done
+
+lemma get_append[simp]: "valid t (p@q) \<Longrightarrow> get t (p@q) = get (get t p) q"
+  apply (induction t p arbitrary: q rule: valid.induct)
+    apply auto
+  done
+
+lemma put_append[simp]: "put t (p@q) s = put t p (put (get t p) q s)"
+  apply (induction t p arbitrary: q s rule: valid.induct)
+    apply auto
+  done
+
+text {* \NumHomework{Remdups}{May 4} *}
+
+text \<open>Your task is to write a function that removes duplicates from a list, using a
+  BST to efficiently store the set of already encountered elements.
+
+  You may want to start with an auxiliary function, that takes the BST with
+  the elements seen so far as additional argument, and then define the actual function.
+\<close>
+
+fun bst_remdups_aux :: "'a::linorder tree \<Rightarrow> 'a list \<Rightarrow> 'a list" where
+  "bst_remdups_aux t [] = []" |
+  "bst_remdups_aux t (x#xs) = (
+    if (isin t x) then bst_remdups_aux t xs
+    else x#bst_remdups_aux (ins x t) xs)"
+
+definition "bst_remdups xs \<equiv> bst_remdups_aux Leaf xs"
+
+text \<open>Show that your function preserves the set of elements, and returns a list
+  with no duplicates (predicate \<open>distinct\<close> in Isabelle).
+  Hint: Generalization!
+\<close>
+
+lemma remdups_append: "set (bst_remdups (xs@ys)) = set (xs@ys)"
+  apply (simp add: bst_remdups_def)
+  apply (induction xs arbitrary: ys rule: bst_remdups_aux.induct)
+   apply auto
+  oops
+
+lemma set_bst_remdups_aux1: "set (bst_remdups_aux t xs) \<subseteq> set xs"
+  apply (induction t xs rule: bst_remdups_aux.induct)
+   apply auto
+  done
+
+lemma set_bst_remdups_aux2: "set xs \<le> set (bst_remdups_aux t xs) \<union> set_tree t"
+  apply (induction t xs rule: bst_remdups_aux.induct)
+   apply auto
+  oops
+
+lemma "set (bst_remdups xs) = set xs"
+  apply (simp add: bst_remdups_def)
+  apply (induction xs rule: bst_remdups_aux.induct)
+   apply simp_all
+  oops
+
+lemma "distinct (bst_remdups xs)"
+  apply (simp add: bst_remdups_def)
+  apply (induction xs rule: bst_remdups_aux.induct)
+  apply (auto)
+  oops
+
+text \<open>A list \<open>xs\<close> is a sublist of \<open>ys\<close>,
+  if \<open>xs\<close> can be produced from \<open>ys\<close> by deleting an
+  arbitrary number of elements.
+
+  Define a function \<open>sublist xs ys\<close> to check whether \<open>xs\<close> is a sublist of \<open>ys\<close>.
+\<close>
+fun sublist :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool"
+where
+  "sublist [] ys = True" |
+  "sublist (x#xs) ys = (if x\<in>set ys then sublist xs ys else False)"
+
+(** This definition isn't correct, as it can also swap the order of elements, or duplicate elements *)
+value "sublist [1,2::int] [2,1]"
+value "sublist [1,2,2,2::int] [2,1]"
+
+
+
+
+text \<open>Show that your remdups function produces a sublist of the original list!
+
+  Hint: Generalization. Auxiliary lemma required.
+\<close>
+
+lemma "sublist (bst_remdups xs) xs"
+  apply (simp add: bst_remdups_def)
+  apply (induction xs rule: bst_remdups_aux.induct)
+   apply auto
+  oops
+
+(*<*)
+end
+(*>*)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/alexejrotar@gmail.com/msg-13020-2.txt	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,1 @@
+Greetings Alexej Rotar
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/clemens.jonischkeit@yahoo.de/jonischkeit03.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,320 @@
+(** Score: 10/10
+
+  Nice job!
+
+  (At the end, you didn't use the dilemma ;) )
+*)
+(*<*)
+theory jonischkeit03
+imports "../../../BST_Demo"
+begin
+(*>*)
+
+
+
+text {* \ExerciseSheet{3}{27.~4.~2018} *}
+
+text \<open>
+  \Exercise{Membership Test with Less Comparisons}
+
+  In worst case, the @{const isin} function performs two comparisons per node.
+  In this exercise, we want to reduce this to one comparison per node, with the
+  following idea:
+
+  One never tests for \<open>>\<close>, but always goes right if not \<open><\<close>.
+  However, one remembers the value where one should have tested for \<open>=\<close>,
+  and performs the comparison when a leaf is reached.
+\<close>
+
+fun isin2 :: "('a::linorder) tree \<Rightarrow> 'a option \<Rightarrow> 'a \<Rightarrow> bool"
+ \<comment> \<open>The second parameter stores the value for the deferred comparison\<close>
+where
+  "isin2 Leaf rem k = (case rem of Some a \<Rightarrow> a=k | None \<Rightarrow> False)"
+| "isin2 (Node l a r) rem k = (
+    if k<a then isin2 l rem k
+    else isin2 r (Some a) k)"
+
+
+text \<open>Show that your function is correct.
+
+  Hint: Auxiliary lemma for \<open>isin2 t (Some y) x\<close> !
+\<close>
+
+lemma aux:
+  "bst t \<Longrightarrow> \<forall>x\<in>set_tree t. a<x \<Longrightarrow> isin2 t (Some a) k \<longleftrightarrow> (a=k \<or> isin t k)"
+  by (induction t arbitrary: a, auto)
+
+
+lemma isin2_None:
+  "bst t \<Longrightarrow> isin2 t None k = isin t k"
+by (induction t, auto simp: aux)
+
+
+text \<open>
+  \Exercise{Height-Preserving In-Order Join}
+  Write a function that joins two binary trees such that
+  \<^item> The in-order traversal of the new tree is the concatenation of the in-order traversals of the original tree
+  \<^item> The new tree is at most one higher than the highest original tree
+
+  Hint: Once you got the function right, proofs are easy!
+\<close>
+fun join :: "'a tree \<Rightarrow> 'a tree \<Rightarrow> 'a tree"
+  where
+  "join Leaf t = t"
+| "join t Leaf = t"
+| "join (Node l1 a1 r1) (Node l2 a2 r2) = (
+      case join r1 l2 of
+        Leaf \<Rightarrow> Node l1 a1 (Node Leaf a2 r2)
+      | Node l a r \<Rightarrow> Node (Node l1 a1 l) a (Node r a2 r2))"
+
+lemma join_inorder[simp]: "inorder(join t1 t2) = inorder t1 @ inorder t2"
+  by (induction t1 t2 rule: join.induct, auto split: tree.splits)
+
+lemma "height(join t1 t2) \<le> max (height t1) (height t2) + 1"
+  by (induction t1 t2 rule: join.induct, auto split: tree.splits)
+
+text \<open>
+  \Exercise{Implement Delete}
+  Implement delete using the \<open>join\<close> function from last exercise.
+\<close>
+
+text \<open>Note: At this point, we are not interested in the implementation details
+  of join any more, but just in its specification, i.e., what it does to trees.
+  Thus, as first step, we declare its equations to not being automatically unfolded.
+\<close>
+
+thm join.simps
+
+declare join.simps[simp del]
+
+text \<open>Both, \<open>set_tree\<close> and \<open>bst\<close> can be expressed by the inorder traversal over trees:\<close>
+
+thm set_inorder[symmetric] bst_iff_sorted_wrt_less
+
+text \<open>Note: As @{thm [source] set_inorder} is declared as simp.
+  Be careful not to have both directions of the lemma in the simpset at the
+  same time, otherwise the simplifier is likely to loop.
+
+  You can use \<open>simp del: set_inorder add: set_inorder[symmetric]\<close>, or
+  \<open>auto simp del: set_inorder simp: set_inorder[symmetric]\<close> to
+  temporarily remove the lemma from the simpset.
+
+  Alternatively, you can write \<open>declare set_inorder[simp_del]\<close> to
+  remove it once and forall.
+\<close>
+declare set_inorder[simp del]
+
+
+text "For the \<open>sorted_wrt\<close> predicate, you might want to use these lemmas as simp:"
+thm sorted_wrt_append sorted_wrt_Cons
+
+text \<open>Show that join preserves the set of entries\<close>
+lemma [simp]: "set_tree (join t1 t2) = set_tree t1 \<union> set_tree t2"
+  by (simp add: set_inorder[symmetric])
+
+text \<open>Show that joining the left and right child of a BST is again a BST:\<close>
+
+lemma [simp]: "bst (Node l (x::_::linorder) r) \<Longrightarrow> bst (join l r)"
+  by (auto simp add: bst_iff_sorted_wrt_less sorted_wrt_append set_inorder[symmetric], fastforce)
+
+text \<open>Implement a delete function using the idea contained in the lemmas above.\<close>
+fun delete :: "'a::linorder \<Rightarrow> 'a tree \<Rightarrow> 'a tree"
+where
+  "delete _ Leaf = Leaf" |
+  "delete a (Node l s r) = (if a = s then join l r else Node (delete a l) s (delete a r))"
+
+text \<open>Prove it correct! Note: You'll need the first lemma to prove the second one! \<close>
+lemma [simp]: "bst t \<Longrightarrow> set_tree (delete x t) = set_tree t - {x}"
+  by (induction t, auto)
+
+lemma "bst t \<Longrightarrow> bst (delete x t)"
+  by (induction t, auto)
+
+text \<open>Homework 3.1\<close>
+datatype direction = L|R
+type_synonym path = "direction list"
+
+inductive valid_ind :: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+"valid_ind _ []" |
+"\<lbrakk>valid_ind l x\<rbrakk> \<Longrightarrow> valid_ind (Node l s r) (L # x)" |
+"\<lbrakk>valid_ind r x\<rbrakk> \<Longrightarrow> valid_ind (Node l s r) (R # x)"
+
+fun valid :: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+"valid _ [] = True" |
+"valid (Node l _ r) (d # p) = (if d = L then valid l p else valid r p)" |
+"valid _ _ = False"
+
+fun get :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree" where
+"get t [] = t" |
+"get (Node l _ r) (d # p) = (if d = L then get l p else get r p)" |
+"get _ _ = undefined"
+
+fun put :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+"put _ [] t = t" |
+"put (Node l s r) (d # p) t = (if (d = L) then Node (put l p t) s r else Node l s (put r p t))" |
+"put s _ _ = s"
+
+lemma put_invalid: "\<not>valid t p \<Longrightarrow> put t p s = t"
+proof(induction p arbitrary: t)
+  case (Cons a p)
+  thus ?case by (cases t, auto)
+qed (simp)
+
+lemma get_put[simp]: "valid t p \<Longrightarrow> put t p (get t p) = t"
+proof(induction p arbitrary: t)
+  case (Cons a p)
+  thus ?case by (cases t, auto)
+qed (simp)
+
+lemma put_put[simp]:
+  "put (put t p s) p s' = put t p s'"
+proof (induction p arbitrary: t)
+  case (Cons a p)
+  thus ?case using put_invalid by (cases t, auto)
+qed (simp)
+
+lemma put_get[simp]: "valid t p \<Longrightarrow> get (put t p s) p = s"
+proof(induction p arbitrary: t)
+  case Cons
+  thus ?case by (cases t, auto)
+qed (simp)
+
+lemma valid_put[simp]: "valid t p \<Longrightarrow> valid (put t p s) p"
+proof (induction p arbitrary: t)
+  case Cons
+  thus ?case by (cases t, auto)
+qed (simp)
+
+lemma valid_append[simp]: "valid t (p@q) \<longleftrightarrow> valid t p \<and> valid (get t p) q"
+proof (induction p arbitrary: t)
+  case (Cons a p)
+  then show ?case by (cases t, auto)
+qed (auto)
+
+lemma get_append[simp]: "valid t p \<Longrightarrow> get t (p@q) = get (get t p) q"
+proof (induction p arbitrary:t)
+  case Cons
+  thus ?case by (cases t, auto)
+qed (simp)
+
+lemma put_append[simp]: "put t (p@q) s = put t p (put (get t p) q s)"
+proof (induction p arbitrary: t)
+  case Cons
+  thus ?case by (cases t, auto)
+qed (simp)
+
+text \<open>Homework 3.2\<close>
+
+fun bst_remdups_aux :: "'a::linorder tree \<Rightarrow> 'a list \<Rightarrow> 'a list" where
+"bst_remdups_aux _ [] = []" |
+"bst_remdups_aux t (x#xs) = (if isin t x then bst_remdups_aux t xs else x # bst_remdups_aux (ins x t) xs)"
+
+definition "bst_remdups xs \<equiv> bst_remdups_aux Leaf xs"
+
+lemma bst_remdups_aux_gen: "bst t \<Longrightarrow> set (bst_remdups_aux t xs) = (set xs - set_tree t)"
+proof (induction xs arbitrary: t)
+case Nil
+  then show ?case by simp
+next
+  case (Cons a xs)
+  then show ?case
+  proof (cases "isin t a")
+    case True
+    hence "a \<in> set_tree t" using Cons.prems set_tree_isin by blast
+    thus ?thesis using Cons True by simp
+  next
+    case False
+    hence "a \<notin> set_tree t" using Cons.prems set_tree_isin by blast
+    moreover
+    have "bst_remdups_aux t (a # xs) = a # (bst_remdups_aux (ins a t) xs)"
+      using False by simp
+    moreover
+    have "bst (ins a t)" using Cons.prems bst_ins by auto
+    hence "set (bst_remdups_aux (ins a t) xs) = set xs - set_tree (ins a t)"
+      using Cons by auto
+    moreover
+    have "set (a # bst_remdups_aux (ins a t) xs) = {a} \<union> (set xs - set_tree (ins a t))"
+      using calculation(3) by auto
+    moreover
+    have "{a} \<union> (set xs - set_tree (ins a t)) = {a} \<union> (set xs - set_tree t)"
+      using set_tree_ins by fastforce
+    ultimately show ?thesis using Cons by auto
+  qed
+qed
+
+lemma "set (bst_remdups xs) = set xs"
+  unfolding bst_remdups_def
+  by (auto simp add: bst_remdups_aux_gen)
+
+lemma dist_remdups_gen: "bst t \<Longrightarrow> distinct (bst_remdups_aux t xs)"
+proof (induction xs arbitrary: t)
+  case Nil
+  then show ?case by simp
+next
+  case (Cons a xs)
+  have a_not_in:"a \<notin> set (bst_remdups_aux (ins a t) xs)" using bst_remdups_aux_gen set_tree_ins bst_ins
+    by (metis Cons.prems DiffD2 insert_iff insert_is_Un)
+  then show ?case using Cons by (simp add: bst_ins)
+qed
+
+lemma "distinct (bst_remdups xs)"
+  unfolding bst_remdups_def
+  by (auto simp add: dist_remdups_gen)
+
+fun sublist :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool" where
+"sublist [] _ = True" |
+"sublist (x#xs) (y#ys) = (if x = y then sublist xs ys else sublist (x # xs) ys)" |
+"sublist _ [] = False"
+
+lemma sublist_app:
+  "sublist xs ys \<Longrightarrow> sublist xs (ys @ zs)"
+proof (induction xs ys rule: sublist.induct)
+case (1 uu)
+  then show ?case by (cases uu, auto)
+qed (auto)
+
+lemma sublist_split:
+  "sublist (a # as) bs \<Longrightarrow> \<exists> cs ds. bs = cs @ ds \<and> sublist [a] cs \<and> sublist as ds \<and> sublist (a # as) (cs @ ds)"
+proof (induction bs)
+case Nil
+  then show ?case by simp
+next
+  case (Cons b bs)
+  then show ?case
+  proof (cases "a = b")
+    case True
+    hence "sublist [a] [b]" by simp
+    moreover
+    have "sublist as bs" using Cons True by simp
+    ultimately show ?thesis using Cons True
+      by (metis Cons_eq_appendI self_append_conv2)
+  next
+    case False
+    then show ?thesis using Cons
+      by (metis Cons_eq_appendI sublist.simps(2))
+  qed
+qed
+
+lemma dilemma: "sublist [x] (ys @ [y]) = sublist [x] (y # ys)"
+  by (induction ys, auto)
+
+lemma sublist_remdups_gen:
+  "bst t \<Longrightarrow> sublist (bst_remdups_aux t xs) xs"
+proof (induction xs arbitrary: t)
+case Nil
+  then show ?case by simp
+next
+  case (Cons a xs)
+  then show ?case
+    by (smt DiffD2 bst_ins bst_remdups_aux.simps(2) bst_remdups_aux_gen insertI1 list.set(2) set_tree_isin sublist.elims(3) sublist.simps(2))
+qed
+
+lemma
+  "sublist (bst_remdups xs) xs"
+  unfolding bst_remdups_def
+  by (auto simp add: sublist_remdups_gen)
+
+(*<*)
+end
+(*>*)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/clemens.jonischkeit@yahoo.de/msg-13020-3.txt	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,23 @@
+Hi,
+
+the submission is the same, i resend it so i have [FDS] in the subject,
+to give you an easier time looking for it.
+
+Best,
+Clemens
+
+
+-------- Forwarded Message --------
+Subject: Submission not opened yet
+Date: Fri, 4 May 2018 00:36:18 +0200
+From: Clemens Jonischkeit <clemens.jonischkeit@yahoo.de>
+To: Peter Lammich <peter.lammich@tum.de>
+
+Hi,
+
+as submission is not open you or at least i have not the option to
+upload for task 03, i attached the theory file to this email
+
+Best,
+Clemens
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/daniel.kutasi@outlook.de/hw03.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,122 @@
+(** Score: 7/10
+  hw1: ok (you forgot to prove one lemma, you could have copied the proof from the lemma above, so no points subtracted here )
+  hw2: no main lemmas proved, def looks ok
+    Why did you copy over the definition of ins and isin instead of simply importing BST_Demo?
+    Of course, you would also need the correctness lemmas of these operations!
+
+*)
+theory hw03
+imports "~~/src/HOL/Library/Tree"
+begin
+
+(* 3.1 *)
+
+datatype direction = L | R
+type_synonym path = "direction list"
+
+fun valid :: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+  "valid _ [] = True"
+| "valid Leaf _ = False"
+| "valid (Node l _ r) (x#xs) = (
+    if x=L then valid l xs
+    else  valid r xs)"
+
+fun get :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree" where
+    "get a [] = a"
+  | "get (Node l _ r) (x#xs) = (
+    if x=L then get l xs
+    else get r xs)"
+  | "get _ _ = undefined" (* catch-all clause to get rid of
+                              missing patterns warning *)
+
+fun put :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+  "put _ [] s = s"
+| "put (Node l a r) (p#ps) s = (
+    if p=L then Node (put l ps s) a r
+    else Node l a (put r ps s))"
+| "put t _ _ = t"
+
+lemma put_invalid[simp]: "\<not>valid t p \<Longrightarrow> put t p s = t"
+  apply (induction t p rule: valid.induct)
+  by auto
+
+lemma get_put[simp]: "put t p (get t p) = t"
+  apply (induction t p rule: get.induct)
+  by auto
+
+lemma put_put[simp]: "put (put t p s) p s' = put t p s'"
+  sorry
+
+lemma put_get[simp]: "valid t p \<Longrightarrow> get (put t p s) p = s"
+  apply (induction t p rule: get.induct)
+  by auto
+
+lemma valid_put[simp]: "valid t p \<Longrightarrow> valid (put t p s) p"
+  apply (induction t p rule: valid.induct)
+  by auto
+
+lemma valid_append[simp]: "valid t (p@q) \<longleftrightarrow> valid t p \<and> valid (get t p) q"
+  apply (induction t p rule: valid.induct)
+  by auto
+
+lemma get_append[simp]: "valid t p \<Longrightarrow> get t (p@q) = get (get t p) q"
+  apply (induction t p rule: valid.induct)
+  by auto
+
+lemma put_append[simp]: "put t (p@q) s = put t p (put (get t p) q s)"
+  apply (induction t p rule: get.induct)
+  by auto
+
+(* 3.2 *)
+
+fun ins :: "'a::linorder \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+"ins x Leaf = Node Leaf x Leaf" |
+"ins x (Node l a r) =
+  (if x < a then Node (ins x l) a r else
+   if x > a then Node l a (ins x r)
+   else Node l a r)"
+
+fun isin :: "('a::linorder) tree \<Rightarrow> 'a \<Rightarrow> bool" where
+"isin Leaf x = False" |
+"isin (Node l a r) x =
+  (if x < a then isin l x else
+   if x > a then isin r x
+   else True)"
+
+fun bst_remdups_aux :: "'a::linorder tree \<Rightarrow> 'a list \<Rightarrow> 'a list" where
+  "bst_remdups_aux t [] = []"
+| "bst_remdups_aux t (x#xs) =
+    (if isin t x then
+      bst_remdups_aux t xs
+    else
+      x # bst_remdups_aux (ins x t) xs)"
+
+definition "bst_remdups xs \<equiv> bst_remdups_aux Leaf xs"
+
+(* x \<notin> set xs \<Longrightarrow> x \<in> set (bst_remdups_aux \<langle>\<langle>\<rangle>, a, \<langle>\<rangle>\<rangle> xs) \<Longrightarrow> x = a *)
+
+lemma "set (bst_remdups xs) = set (xs)"
+  apply (simp add: bst_remdups_def)
+  apply (induction xs)
+  apply (auto)
+  sorry
+
+lemma aux_distinct1[simp]: "distinct (bst_remdups_aux \<langle>\<rangle> xs) \<Longrightarrow> a \<notin> set (bst_remdups_aux \<langle>\<langle>\<rangle>, a, \<langle>\<rangle>\<rangle> xs)"
+  sorry
+
+lemma "distinct (bst_remdups xs)"
+  sorry
+
+fun sublist :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool" where
+  "sublist [] _ = True"
+| "sublist xs [] = (xs = [])"
+| "sublist (x#xs) (y#ys) =
+    (if (x=y) then sublist xs ys else sublist (x#xs) ys)"
+
+lemma "sublist (bst_remdups xs) xs"
+  apply (simp add:bst_remdups_def)
+  apply (induction xs)
+   apply (auto)
+  sorry
+
+end
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/daniel.kutasi@outlook.de/msg-13020-4.txt	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,8 @@
+Hi Peter,
+
+as the upload slot for sheet 3 is not available, here is my submission for the homework.
+
+Best regards
+Daniel
+
+(03623674 / ga68zak)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/daniel.kutasi@outlook.de/msg-13020-5.html	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,19 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+<div dir="ltr">Hi Peter,
+<div><br>
+</div>
+<div>as the upload slot for sheet 3 is not available, here is my submission for the homework.</div>
+<div><br>
+</div>
+<div>Best regards</div>
+<div>Daniel</div>
+<div><br>
+</div>
+<div>(03623674 / ga68zak)</div>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/eric.koepke@online.de/ex03.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,167 @@
+(** Score 7/10
+  hw1: ok
+  hw2: No main lemmas proved, defs look ok
+
+  why not simply import BST_Demo, instead of copy-pasting the text into your solution?
+*)
+theory ex03
+imports "~~/src/HOL/Library/Tree"
+begin
+
+datatype direction = L | R
+type_synonym path = "direction list"
+
+fun valid :: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+ "valid (Node a b c) (L#p) = valid a p"
+|"valid (Node a b c) (R#p) = valid c p"
+|"valid a [] = True"
+|"valid Leaf p = False"
+
+value "valid (Node (Node Leaf (1::nat) Leaf) (0::nat) Leaf) [L,L]"
+
+fun get:: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree" where
+ "get (Node a b c) (L#p) = get a p"
+|"get (Node a b c) (R#p) = get c p"
+|"get a [] = a"
+|"get Leaf p = Leaf"
+
+fun put:: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree \<Rightarrow>'a tree" where
+ "put (Node a b c) (L#p) t = Node (put a p t) b c"
+|"put (Node a b c) (R#p) t = Node a b (put c p t)"
+|"put a [] t = t"
+|"put Leaf p t = Leaf"
+
+value "put (Node (Node Leaf (1::nat) Leaf) (0::nat) Leaf) [L,L,L] (Node Leaf (2::nat) Leaf)"
+
+
+lemma put_invalid: " \<not>valid t p \<Longrightarrow> put t p s = t"
+  apply (induction t p rule: get.induct)
+  apply auto
+  done
+
+
+lemma get_put[simp]: "put t p (get t p) = t"
+  apply (induction t p rule: get.induct)
+  apply auto
+  done
+
+lemma put_put[simp]: "put (put t p s) p s' = put t p s'"
+  apply (induction t p rule: get.induct)
+  apply auto
+  done
+
+lemma put_get[simp]: "valid t p \<Longrightarrow> get (put t p s) p = s"
+  apply (induction t p rule: get.induct)
+  apply auto
+  done
+
+lemma valid_put[simp]: "valid t p \<Longrightarrow> valid (put t p s) p"
+  apply (induction t p rule: get.induct)
+  apply auto
+  done
+
+lemma valid_append[simp]: "valid t (p@q) \<longleftrightarrow> valid t p \<and> valid (get t p) q"
+  apply (induction t p rule: get.induct)
+  apply auto
+  done
+
+lemma get_append[simp]: "valid t p \<Longrightarrow> get t (p@q) = get (get t p) q"
+  apply (induction t p rule: get.induct)
+  apply auto
+  done
+
+lemma put_append[simp]: "put t (p@q) s = put t p (put (get t p) q s)"
+  apply (induction t p rule: get.induct)
+  apply auto
+  done
+
+section "BST Search and Insertion"
+
+fun isin :: "('a::linorder) tree \<Rightarrow> 'a \<Rightarrow> bool" where
+"isin Leaf x = False" |
+"isin (Node l a r) x =
+  (if x < a then isin l x else
+   if x > a then isin r x
+   else True)"
+
+fun ins :: "'a::linorder \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+"ins x Leaf = Node Leaf x Leaf" |
+"ins x (Node l a r) =
+  (if x < a then Node (ins x l) a r else
+   if x > a then Node l a (ins x r)
+   else Node l a r)"
+
+subsection "Functional Correctness"
+
+lemma set_tree_isin[simp]: "bst t \<Longrightarrow> isin t x = (x \<in> set_tree t)"
+apply(induction t)
+apply auto
+done
+
+lemma set_tree_ins[simp]: "set_tree (ins x t) = {x} \<union> set_tree t"
+apply(induction t)
+apply auto
+done
+
+subsection "Preservation of Invariant"
+
+lemma bst_ins[simp]: "bst t \<Longrightarrow> bst (ins x t)"
+apply(induction t)
+apply (auto simp: set_tree_ins)
+done
+
+
+value "isin Leaf (3::nat)"
+
+fun bst_remdups_aux :: " 'a::linorder tree \<Rightarrow> 'a list \<Rightarrow> 'a list" where
+ "bst_remdups_aux t (a#l) = (if (isin t a) then (bst_remdups_aux t l) else a#(bst_remdups_aux (ins a t) l))"
+|"bst_remdups_aux t [] = []"
+
+definition remdups[simp]: "bst_remdups xs \<equiv> bst_remdups_aux Leaf xs"
+
+value "bst_remdups [1::nat,2,3,4,4,4,5,6,7,12,9,9]"
+
+value "set [1::nat,2,3,4,4,4,5,6,7,12,9,9]"
+
+
+
+lemma aux_set1[simp]:"set (bst_remdups_aux t xs) \<subseteq> set xs"
+  apply (induction xs arbitrary: t)
+   apply auto
+  done
+
+
+lemma aux_set2[simp]:"set xs \<subseteq> set (bst_remdups xs)"
+  sorry
+
+
+lemma "set (bst_remdups xs) = set xs"
+  apply (auto)
+  sorry
+
+lemma aux2[simp]: "isin (ins a t) a"
+  apply (induction t)
+   apply auto
+  done
+
+lemma "distinct (bst_remdups_aux t xs)"
+  apply (induction xs arbitrary: t)
+   apply auto
+  sorry
+
+fun sublist :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool" where
+  "sublist (a#l1) (b#l2) = (if (a=b) then (sublist l1 l2) else (sublist (a#l1) l2))"
+| "sublist [] l2 = True"
+| "sublist l1 [] = False"
+
+value "sublist [1::nat,2,4] [1,3,4,5]"
+
+lemma "sublist xs ys \<Longrightarrow> sublist xs (a#ys)"
+  apply (induction xs)
+   apply auto
+  sorry
+
+lemma "sublist (bst_remdups_aux t xs) xs"
+  apply (induction xs arbitrary: t)
+   apply auto
+  sorry
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/eric.koepke@online.de/msg-13020-6.txt	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,6 @@
+Hello,
+I uploaded the exercise to the website in homework slot 2 as well. (in time)
+Matr.Nr.: 03665531
+
+Greetings,
+Eric Koepke
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/explode_info	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,76 @@
+Message: msg0 (a.kutafina@tum.de)
+    Part: msg0/msg-13020-1.txt (text/plain)
+    Part: msg0/tree_addr.thy (text/plain)
+Message: msg1 (alexejrotar@gmail.com)
+    Part: msg1/msg-13020-2.txt (text/plain)
+    Part: msg1/hw03.thy (text/plain)
+Message: msg2 (clemens.jonischkeit@yahoo.de)
+    Part: msg2/msg-13020-3.txt (text/plain)
+    Part: msg2/jonischkeit03.thy (text/plain)
+Message: msg3 (daniel.kutasi@outlook.de)
+    Part: msg3/msg-13020-4.txt (text/plain)
+    Part: msg3/msg-13020-5.html (text/html)
+    Part: msg3/hw03.thy (application/octet-stream)
+Message: msg4 (eric.koepke@online.de)
+    Part: msg4/msg-13020-6.txt (text/plain)
+    Part: msg4/ex03.thy (text/plain)
+Message: msg5 (felix.wielander@tum.de)
+    Part: msg5/msg-13020-7.txt (text/plain)
+    Part: msg5/hw03.thy (text/plain)
+Message: msg6 (florian.stamer@tum.de)
+    Part: msg6/msg-13020-8.txt (text/plain)
+    Part: msg6/msg-13020-9.html (text/html)
+    Part: msg6/ex03.thy (application/octet-stream)
+Message: msg7 (ga53qud@mytum.de)
+    Part: msg7/msg-13020-10.txt (text/plain)
+    Part: msg7/msg-13020-11.html (text/html)
+    Part: msg7/hw03.thy (application/octet-stream)
+Message: msg8 (g.bidlingmaier@tum.de)
+    Part: msg8/msg-13020-12.txt (text/plain)
+    Part: msg8/tmpl03.thy (text/plain)
+Message: msg9 (ge72lic@mytum.de)
+    Part: msg9/msg-13020-13.txt (text/plain)
+    Part: msg9/msg-13020-14.html (text/html)
+    Part: msg9/ex03.thy (application/octet-stream)
+Message: msg10 (j.gottfriedsen@tum.de)
+    Part: msg10/msg-13020-15.txt (text/plain)
+    Part: msg10/msg-13020-16.html (text/html)
+    Part: msg10/homework03.thy (application/octet-stream)
+Message: msg11 (jonatan.juhas@tum.de)
+    Part: msg11/msg-13020-17.txt (text/plain)
+    Part: msg11/msg-13020-18.html (text/html)
+    Part: msg11/ha03.thy (application/octet-stream)
+    Part: msg11/DeepinScreenshot_select-area_20180503230542.png (image/png)
+Message: msg12 (j.v.mutius@gmail.com)
+    Part: msg12/msg-13020-19.txt (text/plain)
+    Part: msg12/hw03.thy (text/plain)
+Message: msg13 (katharinaluise.schmitt@tum.de)
+    Part: msg13/msg-13020-20.txt (text/plain)
+    Part: msg13/msg-13020-21.html (text/html)
+    Part: msg13/ex03.thy (application/octet-stream)
+Message: msg14 (markuswebel@gmail.com)
+    Part: msg14/msg-13020-22.txt (text/plain)
+    Part: msg14/msg-13020-23.html (text/html)
+    Part: msg14/tut03.thy (application/octet-stream)
+Message: msg15 (martin.rau@tum.de)
+    Part: msg15/msg-13020-24.txt (text/plain)
+    Part: msg15/Home03.thy (text/plain)
+Message: msg16 (mitja.krebs@tum.de)
+    Part: msg16/msg-13020-25.txt (text/plain)
+    Part: msg16/tmpl03.thy (application/octet-stream)
+Message: msg17 (omar.badramany@tum.de)
+    Part: msg17/msg-13020-26.txt (text/plain)
+    Part: msg17/msg-13020-27.html (text/html)
+    Part: msg17/hw03.thy (application/octet-stream)
+Message: msg18 (sabine.rieder@tum.de)
+    Part: msg18/msg-13020-28.txt (text/plain)
+    Part: msg18/msg-13020-29.html (text/html)
+    Part: msg18/tmpl03.thy (application/octet-stream)
+Message: msg19 (s.griebel@tum.de)
+    Part: msg19/msg-13020-30.txt (text/plain)
+    Part: msg19/msg-13020-31.html (text/html)
+    Part: msg19/homework3.thy (application/octet-stream)
+Message: msg20 (smith.nickh@gmail.com)
+    Part: msg20/msg-13020-32.txt (text/plain)
+    Part: msg20/msg-13020-33.html (text/html)
+    Part: msg20/HW03.thy (application/octet-stream)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/felix.wielander@tum.de/hw03.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,294 @@
+(** Score: 5/10
+  hw1: not meaningful, rest ok
+  hw2: no lemmas proved, def of sublist wrong
+
+*)
+(*<*)
+theory hw03
+imports "../../../BST_Demo"
+begin
+(*>*)
+
+
+
+text {* \ExerciseSheet{3}{27.~4.~2018} *}
+
+text \<open>
+  \Exercise{Membership Test with Less Comparisons}
+
+  In worst case, the @{const isin} function performs two comparisons per node.
+  In this exercise, we want to reduce this to one comparison per node, with the
+  following idea:
+
+  One never tests for \<open>>\<close>, but always goes right if not \<open><\<close>.
+  However, one remembers the value where one should have tested for \<open>=\<close>,
+  and performs the comparison when a leaf is reached.
+\<close>
+
+fun isin2 :: "('a::linorder) tree \<Rightarrow> 'a option \<Rightarrow> 'a \<Rightarrow> bool"
+ \<comment> \<open>The second parameter stores the value for the deferred comparison\<close>
+where
+  "isin2 Leaf rem k = (case rem of Some a \<Rightarrow> a=k | None \<Rightarrow> False)" |
+  "isin2 (Node l a r) rem k = (if k<a then isin2 l rem k else isin2 r (Some a) k)"
+
+
+text \<open>Show that your function is correct.
+
+  Hint: Auxiliary lemma for \<open>isin2 t (Some y) x\<close> !
+\<close>
+
+lemma aux: "bst t \<Longrightarrow> \<forall>x\<in> set_tree t. a < x \<Longrightarrow>  isin2 t (Some a) k \<longleftrightarrow> (a = k \<or> isin t k)"
+  apply(induction t arbitrary: a)
+  apply auto
+  done
+
+lemma isin2_None:
+  "bst t \<Longrightarrow> isin2 t None k = isin t k"
+  apply(induction t)
+  apply(auto simp: aux)
+  done
+
+
+text \<open>
+  \Exercise{Height-Preserving In-Order Join}
+  Write a function that joins two binary trees such that
+  \<^item> The in-order traversal of the new tree is the concatenation of the in-order traversals of the original tree
+  \<^item> The new tree is at most one higher than the highest original tree
+
+  Hint: Once you got the function right, proofs are easy!
+\<close>
+fun join :: "'a tree \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+  "join Leaf t  = t"|
+  "join t Leaf = t" |
+  "join (Node l1 a1 r1) (Node l2 a2 r2) = (
+    case join r1 l2 of
+      Leaf \<Rightarrow> Node l1 a1 (Node Leaf a2 r2)
+    | Node l a r \<Rightarrow> Node (Node l1 a1 l) a (Node r a2 r2))"
+
+
+lemma join_inorder[simp]: "inorder(join t1 t2) = inorder t1 @ inorder t2"
+  apply(induction t1 t2 rule: join.induct)
+  apply(auto split: tree.splits)
+  done
+
+lemma "height(join t1 t2) \<le> max (height t1) (height t2) + 1"
+  apply(induction t1 t2 rule: join.induct)
+  apply(auto split: tree.splits)
+  done
+
+text \<open>
+  \Exercise{Implement Delete}
+  Implement delete using the \<open>join\<close> function from last exercise.
+\<close>
+
+text \<open>Note: At this point, we are not interested in the implementation details
+  of join any more, but just in its specification, i.e., what it does to trees.
+  Thus, as first step, we declare its equations to not being automatically unfolded.
+\<close>
+
+declare set_inorder[simp del]
+
+text \<open>Both, \<open>set_tree\<close> and \<open>bst\<close> can be expressed by the inorder traversal over trees:\<close>
+
+thm set_inorder[symmetric] bst_iff_sorted_wrt_less
+
+text \<open>Note: As @{thm [source] set_inorder} is declared as simp.
+  Be careful not to have both directions of the lemma in the simpset at the
+  same time, otherwise the simplifier is likely to loop.
+
+  You can use \<open>simp del: set_inorder add: set_inorder[symmetric]\<close>, or
+  \<open>auto simp del: set_inorder simp: set_inorder[symmetric]\<close> to
+  temporarily remove the lemma from the simpset.
+
+  Alternatively, you can write \<open>declare set_inorder[simp_del]\<close> to
+  remove it once and forall.
+\<close>
+
+
+text "For the \<open>sorted_wrt\<close> predicate, you might want to use these lemmas as simp:"
+thm sorted_wrt_append sorted_wrt_Cons
+
+text \<open>Show that join preserves the set of entries\<close>
+lemma [simp]: "set_tree (join t1 t2) = set_tree t1 \<union> set_tree t2"
+  apply(simp add: set_inorder[symmetric])
+  done
+
+text \<open>Show that joining the left and right child of a BST is again a BST:\<close>
+
+lemma [simp]: "bst (Node l (x::_::linorder) r) \<Longrightarrow> bst (join l r)"
+  apply(auto simp add: bst_iff_sorted_wrt_less sorted_wrt_append set_inorder[symmetric])
+  apply fastforce
+  done
+
+
+text \<open>Implement a delete function using the idea contained in the lemmas above.\<close>
+fun delete :: "'a::linorder \<Rightarrow> 'a tree \<Rightarrow> 'a tree"
+where
+  "delete _ _ = undefined"
+
+text \<open>Prove it correct! Note: You'll need the first lemma to prove the second one! \<close>
+lemma [simp]: "bst t \<Longrightarrow> set_tree (delete x t) = set_tree t - {x}"
+  oops
+
+lemma "bst t \<Longrightarrow> bst (delete x t)"
+  oops
+
+text {* \NumHomework{Tree Addressing}{May 4} *}
+text \<open>
+  A position in a tree can be given as a list of
+  navigation instructions from the root, i.e., whether to go
+  to the left or right subtree. We call such a list a path.
+\<close>
+  datatype direction = L | R
+  type_synonym path = "direction list"
+
+text \<open>Specify when a path is valid:\<close>
+
+  fun valid :: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+    "valid x [] = True" |
+    "valid Leaf (d#ds) = False" |
+    "valid (Node l a r) (d#ds) = (if d=L then valid l ds else valid r ds)"
+
+text \<open>Specify a function to return the subtree addressed by a given path:\<close>
+  fun get :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree"
+  where
+  "get x [] = x" |
+  "get (Node l a r) (d#ds) = (if d=L then get l ds else get r ds)" |
+  "get _ _ = undefined"
+
+
+text \<open>Specify a function \<open>put t p s\<close>, that returns \<open>t\<close>, with the subtree
+  at \<open>p\<close> replaced by \<open>s\<close>.
+\<close>
+fun put :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+  "put x [] s = s" |
+  "put (Node l a r) (d#ds) s = (if d=L then (Node (put l ds s) a r) else (Node l a (put r ds s)))" |
+  "put t _ _ = t"
+
+value "put (Node (Node Leaf 2 Leaf) 1 (Node Leaf 3 Leaf)) [L,L] (Node (Node Leaf 5 Leaf) 4 (Node Leaf (6::nat) Leaf))"
+value "put Leaf [] (Node Leaf a Leaf)"
+
+
+text \<open>Specify your function such that it does nothing if an invalid path
+  is given, and prove:
+  \<close>
+
+lemma put_invalid: "\<lbrakk>\<not>valid t p\<rbrakk> \<Longrightarrow> put t p s = t"
+  apply(induction t p rule: valid.induct)
+  apply(auto)
+  done
+
+
+text \<open>Note: this convention will simplify some of
+  the lemmas, reducing the required validity preconditions.
+
+  Prove the following algebraic laws on \<open>put\<close> and \<open>get\<close>.
+  Add preconditions of the form \<open>valid t p\<close> where needed!
+  \<close>
+
+lemma get_put[simp]: "\<lbrakk>valid t p\<rbrakk> \<Longrightarrow> put t p (get t p) = t"
+  apply(induction t p rule: valid.induct)
+  apply(auto)
+  done
+
+lemma put_put[simp]: "put (put t p s) p s' = put t p s'"
+  apply(induction t p s rule: put.induct)
+  apply(auto)
+  done
+
+lemma put_get[simp]: "\<lbrakk>valid t p\<rbrakk> \<Longrightarrow> get (put t p s) p = s"
+  apply(induction t p rule: valid.induct)
+  apply(auto)
+  done
+
+lemma valid_put[simp]: "\<lbrakk>valid t p\<rbrakk> \<Longrightarrow> valid (put t p s) p"
+  apply(induction t p rule: valid.induct)
+  apply(auto)
+  done
+
+  text \<open>
+    Show the following lemmas about appending two paths:
+  \<close>
+lemma valid_append[simp]: "valid t (p@q) \<longleftrightarrow> valid t p \<and> valid (get t p) q"
+  apply(induction t p rule: get.induct)
+  apply(auto)
+  done
+
+lemma get_append[simp]: "valid t p \<Longrightarrow> get t (p@q) = get (get t p) q"
+  apply(induction t p rule: valid.induct)
+  apply(auto)
+  done
+
+lemma put_append[simp]: "put t (p@q) s = put (put t (p@q) s) (p@q) s"
+  (** This lemma is actually an instance of the put_put lemma, and does not
+    resolve the concatenated path, as the other _append lemmas do \<dots> *)
+  apply(induction t)
+  apply(auto)
+  done
+
+text {* \NumHomework{Remdups}{May 4} *}
+
+text \<open>Your task is to write a function that removes duplicates from a list, using a
+  BST to efficiently store the set of already encountered elements.
+
+  You may want to start with an auxiliary function, that takes the BST with
+  the elements seen so far as additional argument, and then define the actual function.
+\<close>
+
+fun bst_remdups_aux :: "'a::linorder tree \<Rightarrow> 'a list \<Rightarrow> 'a list" where
+  "bst_remdups_aux _ [] = []" |
+  "bst_remdups_aux t (x#xs) = (if isin t x then bst_remdups_aux t xs else x # bst_remdups_aux (ins x t) xs)"
+
+definition "bst_remdups xs \<equiv> bst_remdups_aux Leaf xs"
+
+
+text \<open>Show that your function preserves the set of elements, and returns a list
+  with no duplicates (predicate \<open>distinct\<close> in Isabelle).
+  Hint: Generalization!
+\<close>
+
+lemma "set (bst_remdups xs) = set xs"
+  apply(simp add: bst_remdups_def)
+  apply(induction xs rule: bst_remdups_aux.induct)
+  apply(simp add: set_tree_isin bst_ins set_tree_ins)
+  apply(auto split: tree.splits)
+  sorry
+
+lemma "distinct (bst_remdups xs)"
+  apply(simp add: bst_remdups_def)
+  apply(induction xs rule: bst_remdups_aux.induct)
+   apply(simp add: set_tree_isin bst_ins set_tree_ins)
+  apply(auto split: tree.splits)
+  sorry
+
+text \<open>A list \<open>xs\<close> is a sublist of \<open>ys\<close>,
+  if \<open>xs\<close> can be produced from \<open>ys\<close> by deleting an
+  arbitrary number of elements.
+
+  Define a function \<open>sublist xs ys\<close> to check whether \<open>xs\<close> is a sublist of \<open>ys\<close>.
+\<close>
+fun sublist :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool"
+  where
+  "sublist [] ys \<longleftrightarrow> True" |
+  "sublist xs [] \<longleftrightarrow> False" |
+  "sublist (x#xs) ys \<longleftrightarrow> x \<in> set ys \<and> sublist xs (remove1 x ys)"
+
+value "sublist [1,2::int] [2,1]" (** Your def. allows changing the order of elements,
+  which cannot be done by deleting elements as specified!*)
+
+
+text \<open>Show that your remdups function produces a sublist of the original list!
+
+  Hint: Generalization. Auxiliary lemma required.
+\<close>
+
+lemma "sublist (bst_remdups xs) xs"
+  apply(simp add: bst_remdups_def)
+  apply(induction xs rule: bst_remdups_aux.induct)
+  apply(auto simp: set_tree_isin bst_ins set_tree_ins)
+  sorry
+
+(*<*)
+end
+(*>*)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/felix.wielander@tum.de/msg-13020-7.txt	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,7 @@
+Hallo,
+
+im Anhang finden Sie Homework 3.
+
+Viele Grüße,
+Felix Wielander
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/florian.stamer@tum.de/ex03.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,297 @@
+(** Score: 8/10
+
+  hw1: ok (too many valid preconditions added, but no score subtracted for that)
+  hw2: used wrong function (insert into bst; inorder), that does not satisfy sublist property.
+
+*)
+theory ex03
+  imports "../../../BST_Demo"
+begin
+
+fun isin2 :: "('a::linorder) tree \<Rightarrow> 'a option \<Rightarrow> 'a \<Rightarrow> bool" where
+  "isin2 Leaf rem k = (case rem of Some a \<Rightarrow> a=k | None \<Rightarrow> False)"
+| "isin2 (Node l a r) rem k = (
+      if a>k then isin2 l rem k
+      else isin2 r (Some a) k)"
+
+
+lemma aux1: "bst t \<Longrightarrow> \<forall>x\<in>set_tree t. a<x \<Longrightarrow> isin2 t (Some a) k \<longleftrightarrow> (a=k \<or> isin t k)"
+  apply (induction t arbitrary: a)
+   apply (auto)
+  done
+
+lemma isin2_None: "bst t \<Longrightarrow> isin2 t None k = isin t k"
+  apply (induction t)
+   apply (auto simp add: aux1)
+  done
+
+text \<open>
+  \Exercise{Height-Preserving In-Order Join}
+  Write a function that joins two binary trees such that
+  \<^item> The in-order traversal of the new tree is the concatenation of the in-order traversals of the original tree
+  \<^item> The new tree is at most one higher than the highest original tree
+
+  Hint: Once you got the function right, proofs are easy!
+\<close>
+fun join :: "'a tree \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+  "join t1 Leaf = t1"
+| "join Leaf t2 = t2"
+| "join (Node l1 a1 r1) (Node l2 a2 r2) =
+      (case join r1 l2 of
+        Leaf \<Rightarrow> Node l1 a1 (Node Leaf a2 r2)
+      | Node l a r \<Rightarrow> Node (Node l1 a1 l) a (Node r a2 r2))"
+
+lemma join_inorder[simp]: "inorder(join t1 t2) = inorder t1 @ inorder t2"
+  apply (induction t1 t2 rule: join.induct)
+    apply (auto split: tree.splits)
+  done
+
+lemma "height(join t1 t2) \<le> max (height t1) (height t2) + 1"
+  apply (induction t1 t2 rule: join.induct)
+    apply (auto split: tree.splits)
+  done
+
+text \<open>
+  \Exercise{Implement Delete}
+  Implement delete using the \<open>join\<close> function from last exercise.
+\<close>
+
+text \<open>Note: At this point, we are not interested in the implementation details
+  of join any more, but just in its specification, i.e., what it does to trees.
+  Thus, as first step, we declare its equations to not being automatically unfolded.
+\<close>
+
+declare join.simps[simp del]
+
+text \<open>Both, \<open>set_tree\<close> and \<open>bst\<close> can be expressed by the inorder traversal over trees:\<close>
+
+declare set_inorder[simp del]
+thm set_inorder[symmetric] bst_iff_sorted_wrt_less
+
+text \<open>Note: As @{thm [source] set_inorder} is declared as simp.
+  Be careful not to have both directions of the lemma in the simpset at the
+  same time, otherwise the simplifier is likely to loop.
+
+  You can use \<open>simp del: set_inorder add: set_inorder[symmetric]\<close>, or
+  \<open>auto simp del: set_inorder simp: set_inorder[symmetric]\<close> to
+  temporarily remove the lemma from the simpset.
+
+  Alternatively, you can write \<open>declare set_inorder[simp_del]\<close> to
+  remove it once and forall.
+\<close>
+
+
+text "For the \<open>sorted_wrt\<close> predicate, you might want to use these lemmas as simp:"
+thm sorted_wrt_append sorted_wrt_Cons
+
+text \<open>Show that join preserves the set of entries\<close>
+lemma [simp]: "set_tree (join t1 t2) = set_tree t1 \<union> set_tree t2"
+  apply (simp add: set_inorder[symmetric])
+  done
+
+text \<open>Show that joining the left and right child of a BST is again a BST:\<close>
+
+lemma [simp]: "bst (Node l (x::_::linorder) r) \<Longrightarrow> bst (join l r)"
+  apply (auto simp add: bst_iff_sorted_wrt_less sorted_wrt_append set_inorder[symmetric])
+  apply fastforce
+  done
+
+text \<open>Implement a delete function using the idea contained in the lemmas above.\<close>
+fun delete :: "'a::linorder \<Rightarrow> 'a tree \<Rightarrow> 'a tree"
+  where
+    "delete _ _ = undefined"
+
+text \<open>Prove it correct! Note: You'll need the first lemma to prove the second one! \<close>
+lemma [simp]: "bst t \<Longrightarrow> set_tree (delete x t) = set_tree t - {x}"
+  oops
+
+lemma "bst t \<Longrightarrow> bst (delete x t)"
+  oops
+
+  text {* \NumHomework{Tree Addressing}{May 4} *}
+  text \<open>
+  A position in a tree can be given as a list of
+  navigation instructions from the root, i.e., whether to go
+  to the left or right subtree. We call such a list a path.
+\<close>
+datatype direction = L | R
+type_synonym path = "direction list"
+
+text \<open>Specify when a path is valid:\<close>
+
+fun valid :: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+  "valid _ [] = True"
+| "valid (Node l a r) (x#xs) = (
+      case x of
+        L \<Rightarrow> valid l xs
+      | R \<Rightarrow> valid r xs)"
+| "valid Leaf ps = False"
+
+text \<open>Specify a function to return the subtree addressed by a given path:\<close>
+fun get :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree" where
+  "get t [] = t"
+| "get (Node l a r) (p#ps) = (
+      case p of
+        L \<Rightarrow> get l ps
+      | R \<Rightarrow> get r ps)"
+| "get _ _ = undefined"
+
+text \<open>Specify a function \<open>put t p s\<close>, that returns \<open>t\<close>, with the subtree
+  at \<open>p\<close> replaced by \<open>t\<close>.
+\<close>
+fun put :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+  "put t [] s = s"
+| "put (Node l a r) (p#ps) s = (
+      case p of
+        L \<Rightarrow> Node (put l ps s) a r
+      | R \<Rightarrow> Node l a (put r ps s))"
+| "put Leaf ps s = Leaf"
+
+text \<open>Specify your function such that it does nothing if an invalid path
+  is given, and prove:
+  \<close>
+
+thm put.induct
+thm valid.induct
+
+lemma put_invalid: "\<not>valid t p \<Longrightarrow> put t p s = t"
+  apply (induction t p rule: valid.induct)
+    apply (auto split: direction.splits)
+  done
+
+text \<open>Note: this convention will simplify some of
+  the lemmas, reducing the required validity preconditions.
+
+  Prove the following algebraic laws on \<open>put\<close> and \<open>get\<close>.
+  Add preconditions of the form \<open>valid t p\<close> where needed!
+  \<close>
+
+thm valid.induct
+
+lemma get_put[simp]: "valid t p \<Longrightarrow> put t p (get t p) = t"
+  apply (induction t p rule: valid.induct)
+    apply (auto split: direction.splits)
+  done
+
+lemma put_put[simp]: "valid t p \<Longrightarrow> put (put t p s) p s' = put t p s'"
+  apply (induction t p rule: valid.induct)
+    apply (auto split: direction.splits)
+  done
+
+lemma put_get[simp]: "valid t p \<Longrightarrow> get (put t p s) p = s"
+  apply (induction t p rule: valid.induct)
+    apply (auto split: direction.splits)
+  done
+
+lemma valid_put[simp]: "valid t p \<Longrightarrow> valid (put t p s) p"
+  apply (induction t p rule: valid.induct)
+    apply (auto split: direction.splits)
+  done
+
+text \<open>
+    Show the following lemmas about appending two paths:
+  \<close>
+lemma valid_append[simp]: "valid t (p@q) \<longleftrightarrow> valid t p \<and> valid (get t p) q"
+  apply (induction t p rule: valid.induct)
+    apply (auto split: direction.splits)
+  done
+
+lemma get_append[simp]: "valid t p \<Longrightarrow> get t (p@q) = get (get t p) q"
+  apply (induction t p rule: valid.induct)
+    apply (auto split: direction.splits)
+  done
+
+lemma put_append[simp]: "put t (p@q) s = put t p (put (get t p) q s)"
+  apply (induction t p rule: valid.induct)
+    apply (auto split: direction.splits)
+  done
+
+text {* \NumHomework{Remdups}{May 4} *}
+
+text \<open>Your task is to write a function that removes duplicates from a list, using a
+  BST to efficiently store the set of already encountered elements.
+
+  You may want to start with an auxiliary function, that takes the BST with
+  the elements seen so far as additional argument, and then define the actual function.
+\<close>
+
+(**
+  Your function does not satisfy the sublist specification, as it will always
+  sort the elements. (The commented out version at the bottom is the sought one!)
+*)
+
+fun bst_remdups_aux :: "'a::linorder tree \<Rightarrow> 'a list \<Rightarrow> 'a list" where
+  (*"bst_remdups_aux t l = inorder (fold ins l t)"*)
+    "bst_remdups_aux t [] = inorder t"
+  | "bst_remdups_aux t (x#xs) = bst_remdups_aux (ins x t) xs"
+  (*  "bst_remdups_aux t [] = []"
+  | "bst_remdups_aux t (x#xs) =
+      (if isin t x then
+        bst_remdups_aux t xs
+      else x # bst_remdups_aux (ins x t) xs)"*)
+
+definition "bst_remdups xs \<equiv> bst_remdups_aux Leaf xs"
+value "bst_remdups [1,3,3,2,1::nat]"
+text \<open>Show that your function preserves the set of elements, and returns a list
+  with no duplicates (predicate \<open>distinct\<close> in Isabelle).
+  Hint: Generalization!
+\<close>
+
+lemma aux: "set (bst_remdups_aux t xs) = (set_tree t)\<union>(set xs)"
+  apply (induction xs arbitrary: t)
+  apply (auto simp add: set_inorder set_tree_ins)
+  done
+
+lemma "set (bst_remdups xs) = set xs"
+  unfolding bst_remdups_def
+  apply (induction xs)
+  apply (auto simp add: aux)
+  done
+
+lemma aux2: "bst t \<Longrightarrow> distinct (inorder t)"
+  apply (induction t)
+  apply (auto simp add: set_inorder)
+  using order.asym by blast
+
+lemma aux3: "bst t \<Longrightarrow> distinct (bst_remdups_aux t xs)"
+  apply (induction xs arbitrary: t)
+  apply (auto simp add: bst_ins aux2)
+  done
+
+lemma "distinct (bst_remdups xs)"
+  unfolding bst_remdups_def
+  apply (induction xs)
+  apply (auto simp add: aux3)
+  done
+
+  text \<open>A list \<open>xs\<close> is a sublist of \<open>ys\<close>,
+  if \<open>xs\<close> can be produced from \<open>ys\<close> by deleting an
+  arbitrary number of elements.
+
+  Define a function \<open>sublist xs ys\<close> to check whether \<open>xs\<close> is a sublist of \<open>ys\<close>.
+\<close>
+
+fun sublist :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool" where
+    "sublist [] ys = True"
+  | "sublist xs [] = False"
+  | "sublist (x#xs) (y#ys) =
+      (if x = y then
+        sublist xs ys
+      else sublist (x#xs) ys)"
+
+text \<open>Show that your remdups function produces a sublist of the original list!
+
+  Hint: Generalization. Auxiliary lemma required.
+\<close>
+
+lemma aux4: ""
+  oops
+
+lemma "sublist (bst_remdups xs) xs"
+  unfolding bst_remdups_def
+  apply (induction xs)
+  apply (auto simp add: )
+  sorry
+
+
+end
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/florian.stamer@tum.de/msg-13020-8.txt	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,9 @@
+Dear Mr. Lammich,
+
+
+the file is in the attachment.
+
+
+Best regards
+
+Florian Stamer [03664701]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/florian.stamer@tum.de/msg-13020-9.html	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,19 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
+</head>
+<body dir="ltr">
+<div id="divtagdefaultwrapper" dir="ltr" style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, Helvetica, EmojiFont, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, NotoColorEmoji, &quot;Segoe UI Symbol&quot;, &quot;Android Emoji&quot;, EmojiSymbols;">
+<p style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont;">Dear Mr. Lammich,</p>
+<p style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont;"><br>
+</p>
+<p style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont;">the file is in the attachment.</p>
+<p style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont;"><br>
+</p>
+<p style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont;">Best regards</p>
+<p></p>
+<p style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont;">Florian Stamer [03664701]</p>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/g.bidlingmaier@tum.de/msg-13020-12.txt	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,4 @@
+Gunther Bidlingmaier
+
+03663324
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/g.bidlingmaier@tum.de/tmpl03.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,254 @@
+(** Score: 10/10
+
+  Nice job!
+
+*)
+(*<*)
+theory tmpl03
+imports "../../../BST_Demo"
+begin
+(*>*)
+
+
+
+text {* \ExerciseSheet{3}{27.~4.~2018} *}
+
+text \<open>
+  \Exercise{Membership Test with Less Comparisons}
+
+  In worst case, the @{const isin} function performs two comparisons per node.
+  In this exercise, we want to reduce this to one comparison per node, with the
+  following idea:
+
+  One never tests for \<open>>\<close>, but always goes right if not \<open><\<close>.
+  However, one remembers the value where one should have tested for \<open>=\<close>,
+  and performs the comparison when a leaf is reached.
+\<close>
+
+fun isin2 :: "('a::linorder) tree \<Rightarrow> 'a option \<Rightarrow> 'a \<Rightarrow> bool"
+ \<comment> \<open>The second parameter stores the value for the deferred comparison\<close>
+where "isin2 _ _ _ = undefined"
+
+
+text \<open>Show that your function is correct.
+
+  Hint: Auxiliary lemma for \<open>isin2 t (Some y) x\<close> !
+\<close>
+lemma isin2_None:
+  "bst t \<Longrightarrow> isin2 t None x = isin t x" oops
+
+
+text \<open>
+  \Exercise{Height-Preserving In-Order Join}
+  Write a function that joins two binary trees such that
+  \<^item> The in-order traversal of the new tree is the concatenation of the in-order traversals of the original tree
+  \<^item> The new tree is at most one higher than the highest original tree
+
+  Hint: Once you got the function right, proofs are easy!
+\<close>
+fun join :: "'a tree \<Rightarrow> 'a tree \<Rightarrow> 'a tree"
+  where
+"join _ _ = undefined"
+
+lemma join_inorder[simp]: "inorder(join t1 t2) = inorder t1 @ inorder t2"
+  oops
+
+lemma "height(join t1 t2) \<le> max (height t1) (height t2) + 1"
+  oops
+
+text \<open>
+  \Exercise{Implement Delete}
+  Implement delete using the \<open>join\<close> function from last exercise.
+\<close>
+
+text \<open>Note: At this point, we are not interested in the implementation details
+  of join any more, but just in its specification, i.e., what it does to trees.
+  Thus, as first step, we declare its equations to not being automatically unfolded.
+\<close>
+
+declare join.simps[simp del]
+
+text \<open>Both, \<open>set_tree\<close> and \<open>bst\<close> can be expressed by the inorder traversal over trees:\<close>
+
+thm set_inorder[symmetric] bst_iff_sorted_wrt_less
+
+text \<open>Note: As @{thm [source] set_inorder} is declared as simp.
+  Be careful not to have both directions of the lemma in the simpset at the
+  same time, otherwise the simplifier is likely to loop.
+
+  You can use \<open>simp del: set_inorder add: set_inorder[symmetric]\<close>, or
+  \<open>auto simp del: set_inorder simp: set_inorder[symmetric]\<close> to
+  temporarily remove the lemma from the simpset.
+
+  Alternatively, you can write \<open>declare set_inorder[simp_del]\<close> to
+  remove it once and forall.
+\<close>
+
+
+text "For the \<open>sorted_wrt\<close> predicate, you might want to use these lemmas as simp:"
+thm sorted_wrt_append sorted_wrt_Cons
+
+text \<open>Show that join preserves the set of entries\<close>
+lemma [simp]: "set_tree (join t1 t2) = set_tree t1 \<union> set_tree t2"
+  oops
+
+text \<open>Show that joining the left and right child of a BST is again a BST:\<close>
+
+lemma [simp]: "bst (Node l (x::_::linorder) r) \<Longrightarrow> bst (join l r)"
+  oops
+
+text \<open>Implement a delete function using the idea contained in the lemmas above.\<close>
+fun delete :: "'a::linorder \<Rightarrow> 'a tree \<Rightarrow> 'a tree"
+where
+  "delete _ _ = undefined"
+
+text \<open>Prove it correct! Note: You'll need the first lemma to prove the second one! \<close>
+lemma [simp]: "bst t \<Longrightarrow> set_tree (delete x t) = set_tree t - {x}"
+  oops
+
+lemma "bst t \<Longrightarrow> bst (delete x t)"
+  oops
+(* Homework 3.1 *)
+text {* \NumHomework{Tree Addressing}{May 4} *}
+text \<open>
+  A position in a tree can be given as a list of
+  navigation instructions from the root, i.e., whether to go
+  to the left or right subtree. We call such a list a path.
+\<close>
+  datatype direction = L | R
+  type_synonym path = "direction list"
+
+text \<open>Specify when a path is valid:\<close>
+
+  fun valid :: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+    "valid t [] = True"
+  | "valid Leaf (d#ds) = False"
+  | "valid (Node l _ r) (L#ds) = valid l ds"
+  | "valid (Node l _ r) (R#ds) = valid r ds"
+
+text \<open>Specify a function to return the subtree addressed by a given path:\<close>
+  fun get :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree"
+  where
+    "get t [] = t"
+  | "get (Node l v r) (L#ds) = get l ds"
+  | "get (Node l v r) (R#ds) = get r ds"
+  | "get _ _ = undefined" -- \<open>Catch-all clause to get rid of missing patterns warning\<close>
+
+  fun put :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree \<Rightarrow> 'a tree"
+    where
+      "put t1 [] t2 = t2"
+    | "put Leaf (d#ds) t2 = Leaf"
+    | "put (Node l v r) (L#ds) t2 = Node (put l ds t2) v r"
+    | "put (Node l v r) (R#ds) t2 = Node l v (put r ds t2)"
+
+thm put.induct
+lemma put_invalid: "\<not>valid t p \<Longrightarrow> put t p s = t"
+  apply (induction t p rule: valid.induct)
+  apply auto
+  done
+
+lemma get_put[simp]: "valid t p \<Longrightarrow> put t p (get t p) = t"
+  apply (induction t p rule: valid.induct)
+  apply auto
+  done
+
+lemma put_put[simp]: "put (put t p s) p s' = put t p s'"
+  apply (induction t p rule: valid.induct)
+  apply auto
+  done
+
+
+lemma put_get[simp]: "valid t p \<Longrightarrow> get (put t p s) p = s"
+  apply (induction t p rule: valid.induct)
+  apply auto
+  done
+
+lemma valid_put[simp]: "valid t p \<Longrightarrow> valid (put t p s) p"
+  apply (induction t p rule: valid.induct)
+  apply auto
+  done
+
+  text \<open>
+    Show the following lemmas about appending two paths:
+  \<close>
+lemma valid_append[simp]: "valid t (p@q) \<longleftrightarrow> valid t p \<and> valid (get t p) q"
+  apply (induction t p rule: valid.induct)
+  apply auto
+  done
+
+lemma get_append[simp]: "valid t p \<Longrightarrow> get t (p@q) = get (get t p) q"
+  apply (induction t p rule: valid.induct)
+  apply auto
+  done
+
+lemma put_append[simp]: "valid t p \<Longrightarrow> put t (p@q) s = put t p (put (get t p) q s)"
+  apply (induction t p rule: valid.induct)
+  apply auto
+  done
+
+(* Homework 3.2 *)
+text {* \NumHomework{Remdups}{May 4} *}
+
+
+fun bst_remdups_aux :: "'a::linorder tree \<Rightarrow> 'a list \<Rightarrow> 'a list" where
+  "bst_remdups_aux t [] = []"
+| "bst_remdups_aux t (x#xs) = (
+    if isin t x then bst_remdups_aux t xs
+    else x # bst_remdups_aux (ins x t) xs)"
+
+value "isin (Node Leaf (3::int) (Node Leaf 5 Leaf))"
+value "set(bst_remdups_aux (Node Leaf (3::int) (Node Leaf 5 Leaf)) [5])"
+value "bst_remdups_aux (\<langle>\<langle>\<rangle>, 3::int, \<langle>\<langle>\<rangle>, 5, \<langle>\<rangle>\<rangle>\<rangle>) [5]"
+
+(*
+fun bst_remdups :: "'a::linorder list \<Rightarrow> 'a list" where
+  "bst_remdups xs = bst_remdups_aux Leaf xs"
+*)
+
+definition "bst_remdups xs \<equiv> bst_remdups_aux Leaf xs"
+
+
+lemma aux1: "bst t \<Longrightarrow> set (bst_remdups_aux t xs) = (set xs) - (set_tree t)"
+  apply (induction xs arbitrary: t)
+  apply (auto simp add: set_tree_isin set_tree_ins bst_ins)
+  done
+
+lemma remdups: "set (bst_remdups xs) = set xs"
+  apply (induction xs)
+  apply (auto simp add: aux1 bst_remdups_def)
+  done
+
+lemma aux2: "bst t \<Longrightarrow> distinct (bst_remdups_aux t xs)"
+  apply (induction xs arbitrary: t)
+  apply (auto simp add: aux1 bst_ins set_tree_ins)
+  done
+lemma distinct: "distinct (bst_remdups xs)"
+  apply (induction xs)
+  apply (auto simp add: bst_remdups_def aux2 aux1)
+  done
+
+fun sublist :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool" where
+    "sublist [] ys = True"
+  | "sublist (x#xs) [] = False"
+  | "sublist (x#xs) (y#ys) = (
+      if x = y then sublist xs ys
+      else sublist (x#xs) ys)"
+
+
+
+lemma aux3: "bst t \<Longrightarrow> sublist (bst_remdups_aux t xs) xs"
+  apply (induction xs arbitrary: t) (* rule: sublist.induct*)
+  apply (auto simp add: bst_remdups_def aux2 aux1 set_tree_isin
+            set_tree_ins bst_ins)
+  apply (metis Diff_iff aux1 insert_iff list.set(2) sublist.elims(2) sublist.simps(1) sublist.simps(3))
+  done
+
+lemma "sublist (bst_remdups xs) xs"
+  apply (induction xs)
+  apply (auto simp add: aux3 bst_remdups_def)
+  done
+
+(*<*)
+end
+(*>*)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/ga53qud@mytum.de/hw03.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,128 @@
+(** Score: 6/10
+  hw1: ok
+  hw2: Used insert-all; inorder which does not satisfy sublist spec.
+    No main lemmas proved.
+    Wrong sublist def
+
+*)
+
+theory hw03
+  imports  "~~/src/HOL/Library/Tree" Main
+begin
+
+(* Part 1 - complete*)
+
+declare Let_def [simp]
+
+datatype direction = L|R
+type_synonym path = "direction list"
+
+fun valid:: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+  "valid _ [] = True"
+| "valid Leaf _ = False"
+| "valid (Node ltr a rtr) (x#xs) = (if x = L then (valid ltr xs) else (valid rtr xs))"
+
+fun get:: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree" where
+  "get x [] = x"
+| "get (Node ltr a rtr) (x# xs) = (if x = L then get ltr xs else get rtr xs)"
+| "get _ _ = undefined "
+
+fun put:: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+  "put x [] y = y"
+| "put Leaf _ _ = Leaf"
+| "put (Node l a r) (x# xs) y = (if x = L then (Node (put l xs y) a r) else (Node l a (put r xs y)))"
+
+value "put (Node (Node (Leaf) b (Leaf)) d Leaf) [R,R] (Node Leaf q Leaf)"
+value "valid (Node Leaf a Leaf) [R]"
+
+lemma put_invalid[simp]: "\<not>valid t p \<Longrightarrow> put t p s = t"
+  apply(induction p rule:valid.induct)
+     apply(auto)
+  done
+
+lemma get_put[simp]: "put t p (get t p) = t"
+  apply(induction p rule:get.induct)
+     apply(auto)
+  done
+
+
+lemma put_put[simp]: "valid t p \<Longrightarrow> put (put t p s) p s' = put t p s'"
+  apply(induction p arbitrary:s' rule: valid.induct)
+  apply(auto)
+  done
+
+lemma put_get[simp]: "valid t p \<Longrightarrow> get (put t p s) p = s"
+  apply(induction t p rule:get.induct)
+    apply(auto)
+  done
+
+lemma valid_put[simp]: "valid t p \<longleftrightarrow> valid (put t p s) p"
+  apply(induction t p rule:valid.induct)
+    apply(auto)
+  done
+
+lemma valid_append[simp]: "valid t (p@q)\<longleftrightarrow> valid t p \<and> valid (get t p) q"
+  apply(induction t p rule:valid.induct)
+    apply auto
+  done
+
+lemma get_append[simp]: "valid t p \<Longrightarrow> get t (p@q) = get (get t p) q"
+  apply(induction t p rule:get.induct)
+    apply auto
+  done
+
+lemma put_append[simp]: "put t (p@q) s = put t p (put (get t p) q s)"
+  apply(induction t p rule:get.induct)
+  apply auto
+  done
+
+
+(*Part 2 - Incomplete, bst_remdups done, sublist done, first proof done with a generalization which I couldn't prove*)
+
+
+
+fun ins :: "'a::linorder \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+"ins x Leaf = Node Leaf x Leaf" |
+"ins x (Node l a r) =
+  (if x < a then Node (ins x l) a r else
+   if x > a then Node l a (ins x r)
+   else Node l a r)"
+
+fun bst_remdups_aux:: "'a::linorder tree \<Rightarrow> 'a list \<Rightarrow> 'a list" where
+  "bst_remdups_aux t [] = inorder t"
+| "bst_remdups_aux t (x # xs) = bst_remdups_aux (ins x t) xs"
+
+definition "bst_remdups xs \<equiv> bst_remdups_aux Leaf xs"
+
+value "bst_remdups [1::int,2,3,4,1,5,5,6,6,10,7]"
+
+value "bst_remdups_aux (Node Leaf (7::nat) (Node Leaf (1::nat) Leaf)) [2::nat]"
+
+lemma bst_gen[simp]:"set (bst_remdups_aux t s) = set(bst_remdups_aux t []) \<union> set s"
+  sorry
+
+value "filter (\<lambda>x. x \<le> (2::nat)) [2::nat,3,4]"
+
+lemma "set (bst_remdups xs) = set xs"
+  unfolding bst_remdups_def
+  apply(induction xs)
+  apply(auto)
+  done
+
+fun remove:: "'a \<Rightarrow> 'a list \<Rightarrow> 'a list" where
+  "remove a [] = []"
+| "remove a (x #xs) = (if (a = x) then xs else x #(remove a xs))"
+
+(** Have a look at this standard function! *)
+term remove1
+
+fun sublist:: "'a list \<Rightarrow> 'a list \<Rightarrow> bool" where
+  "sublist [] ys = True"
+| "sublist xs [] = False"
+| "sublist (x#xs) ys = (if x\<in> set ys then sublist xs (remove x ys) else False)"
+
+value "sublist [1,2::nat] [2,1]" (** You cannot swap elements according to sublist! *)
+
+
+
+end
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/ga53qud@mytum.de/msg-13020-10.txt	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,14 @@
+Dear Dr.Lammich,
+
+
+Please find attached my homework 3.
+
+
+I was unable to do question 2, could you please give me some help?
+
+
+Regards,
+
+Amartya Das Sharma
+
+03694265
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/ga53qud@mytum.de/msg-13020-11.html	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,23 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
+</head>
+<body dir="ltr">
+<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
+<p>Dear Dr.Lammich,</p>
+<p><br>
+</p>
+<p>Please find attached my homework 3.</p>
+<p><br>
+</p>
+<p>I was unable to do question 2, could you please give me some help?</p>
+<p><br>
+</p>
+<p>Regards,</p>
+<p>Amartya Das Sharma</p>
+<p>03694265<br>
+</p>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/ge72lic@mytum.de/ex03.thy	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,171 @@
+(** Score: 8/10
+
+  hw1: ok
+  hw2: insert-all; inorder based solution, that does not satisfy sublist spec
+
+    Why not just import BST_Demo, instead of copy-pasting the stuff from there into your solution?
+
+*)
+
+theory ex03
+  imports  "~~/src/HOL/Library/Tree"
+begin
+
+
+datatype direction = L | R
+type_synonym path = "direction list"
+
+
+(* Homework 3.1 *)
+
+fun valid :: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+  "valid _ [] = True"
+| "valid Leaf _ = False"
+| "valid (Node l a r) (x#xs) = (if x = L then valid l xs else valid r xs)"
+
+fun get :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree" where
+  "get t [] = t"
+| "get (Node l a r) (x#xs) = (if x = L then get l xs else get r xs)"
+| "get Leaf (x#xs) = Leaf"
+
+fun put :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+  "put Leaf (x#xs) s = Leaf"
+| "put t [] s = s"
+| "put (Node l a r) (x#xs) s =
+    (if x = L then (Node (put l xs s) a r) else (Node l a (put r xs s)))"
+
+
+
+lemma put_invalid[simp]: "\<not>valid t p \<Longrightarrow> put t p s = t"
+  apply(induction t p rule: valid.induct)
+  apply(auto)
+  done
+
+lemma get_put[simp]: "put t p (get t p) = t"
+  apply(induction t p rule: get.induct)
+    apply(auto)
+  done
+
+lemma put_put[simp]: "put (put t p s) p s' = put t p s'"
+  apply(induction t p s rule: put.induct)
+  apply(auto)
+  done
+
+lemma put_get[simp]: "valid t p \<Longrightarrow> get (put t p s) p = s"
+  apply(induction t p s rule: put.induct)
+  apply(auto)
+  done
+
+ lemma valid_put[simp]: "valid t p \<Longrightarrow> valid (put t p s) p"
+  apply(induction t p s rule: put.induct)
+  apply(auto)
+   done
+
+
+lemma valid_append[simp]: "valid t (p@q) \<longleftrightarrow> valid t p \<and> valid (get t p) q"
+  apply(induction t p rule: valid.induct)
+    apply(auto)
+  done
+
+lemma get_append[simp]: "valid t p \<Longrightarrow> get t (p@q) = get (get t p) q"
+  apply(induction t p rule: valid.induct)
+    apply(auto)
+  done
+
+lemma put_append[simp]: "put t (p@q) s = put t p (put (get t p) q s)"
+  apply(induction t p s rule: put.induct)
+  apply(auto)
+  done
+
+(*******************************)
+
+
+fun isin :: "('a::linorder) tree \<Rightarrow> 'a \<Rightarrow> bool" where
+"isin Leaf x = False" |
+"isin (Node l a r) x =
+  (if x < a then isin l x else
+   if x > a then isin r x
+   else True)"
+
+
+fun ins :: "'a::linorder \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+"ins x Leaf = Node Leaf x Leaf" |
+"ins x (Node l a r) =
+  (if x < a then Node (ins x l) a r else
+   if x > a then Node l a (ins x r)
+   else Node l a r)"
+
+
+lemma set_tree_isin[simp]: "bst t \<Longrightarrow> isin t x = (x \<in> set_tree t)"
+apply(induction t)
+apply auto
+done
+
+lemma set_tree_ins[simp]: "set_tree (ins x t) = {x} \<union> set_tree t"
+apply(induction t)
+apply auto
+done
+
+
+lemma bst_ins[simp]: "bst t \<Longrightarrow> bst (ins x t)"
+apply(induction t)
+apply (auto)
+done
+
+
+
+(*Homework 3.2*)
+
+
+fun bst_remdups_aux :: "'a::linorder tree \<Rightarrow> 'a list \<Rightarrow> 'a list" where
+  "bst_remdups_aux t [] = inorder t"
+| "bst_remdups_aux t (x#xs) = bst_remdups_aux (ins x t) xs"
+
+
+definition "bst_remdups xs \<equiv> bst_remdups_aux Leaf xs"
+
+
+lemma aux: "set (bst_remdups_aux t xs) = set (inorder t) \<union> set xs "
+  apply(induction t xs rule: bst_remdups_aux.induct)
+   apply(auto)
+  done
+
+lemma "set (bst_remdups xs) = set xs"
+  apply(simp add: bst_remdups_def aux)
+  done
+
+lemma aux2: "bst t \<Longrightarrow> distinct (inorder t)"
+  apply(induction t)
+   apply(auto)
+  apply(auto intro: dual_order.asym)
+  done
+
+
+lemma aux3: "\<lbrakk> bst t \<rbrakk> \<Longrightarrow> distinct (bst_remdups_aux t xs)"
+  apply(induction t xs rule: bst_remdups_aux.induct)
+   apply(auto simp: aux2)
+  done
+
+
+lemma "distinct (bst_remdups xs)"
+  apply(simp add: bst_remdups_def)
+  apply(simp add: aux3)
+  done
+
+
+
+fun sublist :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool"
+where
+  "sublist [] _ = True"
+| "sublist _ [] = False"
+| "sublist (x#xs) (y#ys) = (if x = y then sublist xs ys else sublist (x#xs) ys)"
+
+
+
+
+lemma "sublist (bst_remdups xs) xs"
+  sorry
+
+
+
+end
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/ge72lic@mytum.de/msg-13020-13.txt	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,1 @@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/ge72lic@mytum.de/msg-13020-14.html	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,12 @@
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
+</head>
+<body dir="ltr">
+<div id="divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,&quot;EmojiFont&quot;,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;,NotoColorEmoji,&quot;Segoe UI Symbol&quot;,&quot;Android Emoji&quot;,EmojiSymbols">
+<p><br>
+</p>
+</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SS18/Exercises/hwsubm/hw03/hw3.mbox	Fri May 18 09:52:22 2018 +0200
@@ -0,0 +1,6480 @@
+From martin.rau@tum.de Thu May  3 23:36:33 2018
+Return-Path: <martin.rau@tum.de>
+Delivered-To: <lammich@mailstore.informatik.tu-muenchen.de>
+Received: from vmmailstore1.informatik.tu-muenchen.de by
+ vmmailstore1.informatik.tu-muenchen.de (Dovecot) with LMTP id
+ Vq9vDuGA61rjNAAArPjJig for <lammich@mailstore.informatik.tu-muenchen.de>;
+ Thu, 03 May 2018 23:36:33 +0200
+Received: from vmmailproxy1.informatik.tu-muenchen.de
+ (vmmailproxy1.informatik.tu-muenchen.de [131.159.0.83]) by
+ vmmailstore1.informatik.tu-muenchen.de (Postfix) with ESMTP id 39E9B1C2029
+ for <lammich@mailstore.informatik.tu-muenchen.de>; Thu,  3 May 2018
+ 23:36:33 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de
+ (mailrelay1.informatik.tu-muenchen.de [131.159.254.14]) by
+ vmmailproxy1.informatik.tu-muenchen.de (Postfix) with ESMTP id 383901E012D
+ for <lammich@mail.informatik.tu-muenchen.de>; Thu,  3 May 2018 23:36:33
+ +0200 (CEST)
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix) id
+ 3590C1C037B; Thu,  3 May 2018 23:36:33 +0200 (CEST)
+Delivered-To: peter.lammich@informatik.tu-muenchen.de
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id 330FE1C038A; Thu,  3 May 2018 23:36:33 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de (localhost
+ [127.0.0.1]) by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP
+ id 0F9D51C037C for <lammich@in.tum.de>; Thu,  3 May 2018 23:36:33 +0200
+ (CEST)
+Received: from vmmaildmz1.informatik.tu-muenchen.de
+ (vmmaildmz1.informatik.tu-muenchen.de [131.159.0.87]) by
+ vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id 0481C1C037B
+ for <lammich@in.tum.de>; Thu,  3 May 2018 23:36:33 +0200 (CEST)
+Received: by vmmaildmz1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id 02F7F1C2DB5; Thu,  3 May 2018 23:36:33 +0200 (CEST)
+X-Spam-Checker-Version: SpamAssassin 3.4.0-tuminfo_1 (2014-02-07) on
+ vmmaildmz1.informatik.tu-muenchen.de
+X-Spam-Level: 
+X-Spam-Status: No, score=-4.3 required=7.0 tests=AWL,BAYES_00,DKIM_SIGNED,
+ DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_MED autolearn=no autolearn_force=no
+ version=3.4.0-tuminfo_1
+Received: from vmmaildmz1.informatik.tu-muenchen.de (localhost [127.0.0.1])
+ by vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTP id 3A3C01C2DB4
+ for <lammich@in.tum.de>; Thu,  3 May 2018 23:36:31 +0200 (CEST)
+Received: from postout1.mail.lrz.de (postout1.mail.lrz.de
+ [129.187.255.137]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256
+ bits)) (No client certificate requested) by
+ vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTPS id 2F6BC1C2DB3
+ for <lammich@in.tum.de>; Thu,  3 May 2018 23:36:31 +0200 (CEST)
+Received: from lxmhs51.srv.lrz.de (localhost [127.0.0.1]) by
+ postout1.mail.lrz.de (Postfix) with ESMTP id 40cT3z1DzNzyTs for
+ <lammich@in.tum.de>; Thu,  3 May 2018 23:36:31 +0200 (CEST)
+Authentication-Results: postout.lrz.de (amavisd-new); dkim=pass (2048-bit
+ key) reason="pass (just generated, assumed good)" header.d=tum.de
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tum.de; h=
+ content-language:content-type:content-type:mime-version
+ :user-agent:date:date:message-id:subject:subject:from:from
+ :received:received; s=postout; t=1525383390; bh=y/pqzI0GI2ayIZK9
+ eKik+iz3C3UeCswtXyaKuDiIO+c=; b=nNvqTBnocGr00vg20C+dfX8NjoqecPwT
+ v3OhIJSu9lbFbmYiay5BN6gZCmfHc5eTNiPUlgW3HVMsezy+QBHtq4XERH/jW49S
+ iYZxfU7e2PLW2U/zQ86q0sVv/zmNcVP9wgQIbxJSPotm4cktumxZVBqv08G0CZak
+ kActefFn+jeMdWRgbGtuklmvzNr0cw7gBup1XQm59Gl720VZVsO1f6eGgNHQQ6gc
+ nJQunY6oaaxKN027nvDrJAEsUOKgwWA1HjaA1pDtXs8SxhjnggyHwr7iSATGMfss
+ hadjbG2ZnQ1vpwVG4Bbx+q1AMEAo5D2zAT081TWIlhmqf4CKfb+3Mw==
+X-Virus-Scanned: by amavisd-new at lrz.de in lxmhs51.srv.lrz.de
+Received: from postout1.mail.lrz.de ([127.0.0.1]) by lxmhs51.srv.lrz.de
+ (lxmhs51.srv.lrz.de [127.0.0.1]) (amavisd-new, port 20024) with LMTP id
+ VHvHwSui1VjH for <lammich@in.tum.de>; Thu,  3 May 2018 23:36:30 +0200 (CEST)
+Received: from [IPv6:2a02:810d:4240:1778:1bf:9aa1:3a96:2f06] (unknown
+ [IPv6:2a02:810d:4240:1778:1bf:9aa1:3a96:2f06]) (using TLSv1.2 with cipher
+ ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate
+ requested) by postout1.mail.lrz.de (Postfix) with ESMTPSA id 40cT3y3ZlxzyTm
+ for <lammich@in.tum.de>; Thu,  3 May 2018 23:36:30 +0200 (CEST)
+To: lammich@in.tum.de
+From: Martin Rau <martin.rau@tum.de>
+Subject: [FDS] Homework #03
+Message-ID: <54ca734d-07b2-b7f2-ec31-f4a1b183adf9@tum.de>
+Date: Thu, 3 May 2018 23:36:25 +0200
+User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
+ Thunderbird/52.7.0
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="------------F63D92E9EFD561004CF56823"
+Content-Language: en-US
+X-Evolution-Source: 1479990504.8344.16@lapnipkow10
+
+This is a multi-part message in MIME format.
+--------------F63D92E9EFD561004CF56823
+Content-Type: text/plain; charset=utf-8; format=flowed
+Content-Transfer-Encoding: 8bit
+
+Dear Peter Lammich,
+
+There is option to hand in Homework # 03 by the Submission System.
+
+So I'm submitting by email.
+
+Kind regards,
+
+Martin Rau
+
+
+--------------F63D92E9EFD561004CF56823
+Content-Type: text/plain; charset=UTF-8; name="Home03.thy"
+Content-Disposition: attachment; filename="Home03.thy"
+Content-Transfer-Encoding: 8bit
+
+theory Home03
+imports "~~/src/HOL/Library/Tree"
+begin 
+
+(* Functions and Lemmas taken from BST_Demo *)
+fun isin :: "('a::linorder) tree \<Rightarrow> 'a \<Rightarrow> bool" where
+"isin Leaf x = False" |
+"isin (Node l a r) x =
+  (if x < a then isin l x else
+   if x > a then isin r x
+   else True)"
+
+fun ins :: "'a::linorder \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+"ins x Leaf = Node Leaf x Leaf" |
+"ins x (Node l a r) =
+  (if x < a then Node (ins x l) a r else
+   if x > a then Node l a (ins x r)
+   else Node l a r)"
+
+lemma set_tree_isin: "bst t \<Longrightarrow> isin t x = (x \<in> set_tree t)"
+apply(induction t)
+apply auto
+done
+
+lemma set_tree_ins: "set_tree (ins x t) = {x} \<union> set_tree t"
+apply(induction t)
+apply auto
+done
+
+lemma bst_ins: "bst t \<Longrightarrow> bst (ins x t)"
+apply(induction t)
+apply (auto simp: set_tree_ins)
+done
+
+(* Homework 3.1 Tree Adressing *)
+
+datatype direction = L | R
+type_synonym path = "direction list"
+
+fun valid :: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+  "valid _ [] = True"
+| "valid Leaf _ = False"
+| "valid (Node l a r) (p#ps) = (case p of L \<Rightarrow> valid l ps | R \<Rightarrow> valid r ps)"
+
+value "valid (Node Leaf a Leaf) []"
+
+fun get :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree" where
+  "get t [] = t"
+| "get Leaf _ = Leaf"
+| "get (Node l a r) (p#ps) = (case p of L \<Rightarrow> get l ps | R \<Rightarrow> get r ps)"
+
+value "get (Node (Node Leaf b Leaf) a (Node Leaf c Leaf)) []"
+
+fun put :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+  "put _ [] s = s"
+| "put Leaf _ _ = Leaf"
+| "put (Node l a r) (p#ps) s = (case p of L \<Rightarrow> Node (put l ps s) a r | R \<Rightarrow> Node l a (put r ps s))"
+
+value "put (Node Leaf a Leaf) [] (Node Leaf s Leaf)"
+
+lemma put_invalid: "\<not>valid t p \<Longrightarrow> put t p s = t"
+apply(induction t p rule: valid.induct)
+apply(auto split: direction.split)
+done
+
+lemma get_put[simp]: "put t p (get t p) = t"
+apply(induction t p rule: get.induct)
+apply(auto split: direction.split)
+done
+
+lemma put_put[simp]: "put (put t p s) p s' = put t p s'"
+apply(induction t p s rule: put.induct)
+apply(auto split: direction.split)
+done
+
+lemma put_get[simp]: "valid t p \<Longrightarrow> get (put t p s) p = s"
+apply(induction t p s rule: put.induct)
+apply(auto split: direction.split)
+done
+
+lemma valid_put[simp]: "valid t p \<Longrightarrow> valid (put t p s) p"
+apply(induction t p s rule: put.induct)
+apply(auto split: direction.split)
+done
+
+lemma valid_append[simp]: "valid t (p@q) \<longleftrightarrow> valid t p \<and> valid (get t p) q"
+apply(induction t p rule: get.induct)
+apply(auto split: direction.split)
+done
+
+lemma get_append[simp]: "valid t p \<Longrightarrow> get t (p@q) = get (get t p) q"
+apply(induction t p rule: get.induct)
+apply(auto split: direction.split)
+done
+
+lemma put_append[simp]: "put t (p@q) s = put t p (put (get t p) q s)"
+apply(induction t p rule: get.induct)
+apply(auto split: direction.split)
+done
+
+(* Homework 3.2 Remdups *)
+
+fun bst_remdups_aux :: "'a::linorder tree \<Rightarrow> 'a list \<Rightarrow> 'a list" where
+  "bst_remdups_aux _ [] = []"
+| "bst_remdups_aux t (x#xs) = (
+    if isin t x then bst_remdups_aux t xs
+    else x # bst_remdups_aux (ins x t) xs)" 
+
+definition "bst_remdups xs \<equiv> bst_remdups_aux Leaf xs"
+
+value "bst_remdups [1::nat,1,2,3,4,2,5,1]"
+
+lemma aux1: "bst t \<Longrightarrow> set (bst_remdups_aux t xs) = set xs - set_tree t"
+apply(induction xs arbitrary: t)
+apply(auto simp add: bst_ins set_tree_ins set_tree_isin)
+done
+
+lemma "set (bst_remdups xs) = set xs"
+by (simp add: bst_remdups_def aux1)
+
+lemma aux2: "bst t \<Longrightarrow> distinct (bst_remdups_aux t xs)"
+apply(induction xs arbitrary: t)
+apply(auto simp add: bst_ins set_tree_ins aux1)
+done
+
+lemma "distinct (bst_remdups xs)"
+by (simp add: bst_remdups_def aux2)
+
+fun sublist :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool" where
+  "sublist [] _ = True"
+| "sublist _ [] = False"
+| "sublist (x#xs) (y#ys) = (
+    if x = y then sublist xs ys
+    else sublist (x#xs) ys)"
+
+value "sublist [] [1::nat,2,3]"
+
+lemma aux3: "bst t \<Longrightarrow> isin t a \<Longrightarrow> a \<notin> set (bst_remdups_aux t xs)"
+apply(induction xs arbitrary: t)
+apply(auto simp add: bst_ins set_tree_ins set_tree_isin)
+done
+
+lemma aux4: "a \<notin> set xs \<Longrightarrow> sublist xs ys \<Longrightarrow> sublist xs (a#ys)"
+apply(induction xs ys rule: sublist.induct)
+apply(auto)
+done
+
+lemma aux5: "bst t \<Longrightarrow> sublist (bst_remdups_aux t xs) xs"
+apply(induction xs arbitrary: t)
+apply(auto simp add: bst_ins aux3 aux4)
+done
+
+lemma "sublist (bst_remdups xs) xs"
+by (simp add: bst_remdups_def aux5) 
+
+end
+--------------F63D92E9EFD561004CF56823--
+
+From daniel.kutasi@outlook.de Fri May  4 08:27:03 2018
+Return-Path: <daniel.kutasi@outlook.de>
+Delivered-To: <lammich@mailstore.informatik.tu-muenchen.de>
+Received: from vmmailstore1.informatik.tu-muenchen.de by
+ vmmailstore1.informatik.tu-muenchen.de (Dovecot) with LMTP id
+ vTkDNBr961pXdgAArPjJig for <lammich@mailstore.informatik.tu-muenchen.de>;
+ Fri, 04 May 2018 08:27:03 +0200
+Received: from vmmailproxy1.informatik.tu-muenchen.de
+ (vmmailproxy1.informatik.tu-muenchen.de [131.159.0.83]) by
+ vmmailstore1.informatik.tu-muenchen.de (Postfix) with ESMTP id 931DF1C2029
+ for <lammich@mailstore.informatik.tu-muenchen.de>; Fri,  4 May 2018
+ 08:27:03 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de
+ (mailrelay1.informatik.tu-muenchen.de [131.159.254.14]) by
+ vmmailproxy1.informatik.tu-muenchen.de (Postfix) with ESMTP id 91A011E0125
+ for <lammich@mail.informatik.tu-muenchen.de>; Fri,  4 May 2018 08:27:03
+ +0200 (CEST)
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix) id
+ 8EADD1C037B; Fri,  4 May 2018 08:27:03 +0200 (CEST)
+Delivered-To: peter.lammich@informatik.tu-muenchen.de
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id 8BDF41C038A; Fri,  4 May 2018 08:27:03 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de (localhost
+ [127.0.0.1]) by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP
+ id 678871C037C for <lammich@in.tum.de>; Fri,  4 May 2018 08:27:03 +0200
+ (CEST)
+Received: from vmmaildmz1.informatik.tu-muenchen.de
+ (vmmaildmz1.informatik.tu-muenchen.de [131.159.0.87]) by
+ vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id 5CF6E1C037B
+ for <lammich@in.tum.de>; Fri,  4 May 2018 08:27:03 +0200 (CEST)
+Received: by vmmaildmz1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id 5B6BC1C2DB5; Fri,  4 May 2018 08:27:03 +0200 (CEST)
+X-Spam-Checker-Version: SpamAssassin 3.4.0-tuminfo_1 (2014-02-07) on
+ vmmaildmz1.informatik.tu-muenchen.de
+X-Spam-Level: 
+X-Spam-Status: No, score=-2.5 required=7.0
+ tests=AWL,BAYES_00,FREEMAIL_FROM,
+ HTML_MESSAGE,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS autolearn=no
+ autolearn_force=no version=3.4.0-tuminfo_1
+Received: from vmmaildmz1.informatik.tu-muenchen.de (localhost [127.0.0.1])
+ by vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTP id 74E631C2DB4
+ for <lammich@in.tum.de>; Fri,  4 May 2018 08:27:01 +0200 (CEST)
+Received: from EUR02-VE1-obe.outbound.protection.outlook.com
+ (mail-oln040092069104.outbound.protection.outlook.com [40.92.69.104])
+ (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No
+ client certificate requested) by vmmaildmz1.informatik.tu-muenchen.de
+ (Postfix) with ESMTPS id 511B01C2D9F for <lammich@in.tum.de>; Fri,  4 May
+ 2018 08:27:01 +0200 (CEST)
+Received: from AM5EUR02FT034.eop-EUR02.prod.protection.outlook.com
+ (10.152.8.60) by AM5EUR02HT115.eop-EUR02.prod.protection.outlook.com
+ (10.152.9.57) with Microsoft SMTP Server (version=TLS1_2,
+ cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.715.13; Fri, 4
+ May 2018 06:27:00 +0000
+Received: from AM5PR1001MB0995.EURPRD10.PROD.OUTLOOK.COM (10.152.8.57) by
+ AM5EUR02FT034.mail.protection.outlook.com (10.152.8.118) with Microsoft
+ SMTP Server (version=TLS1_2,
+ cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.715.13 via
+ Frontend Transport; Fri, 4 May 2018 06:27:00 +0000
+Received: from AM5PR1001MB0995.EURPRD10.PROD.OUTLOOK.COM
+ ([fe80::9003:ab51:5157:63b1]) by AM5PR1001MB0995.EURPRD10.PROD.OUTLOOK.COM
+ ([fe80::9003:ab51:5157:63b1%4]) with mapi id 15.20.0735.016; Fri, 4 May
+ 2018 06:27:00 +0000
+From: Daniel Kutasi <daniel.kutasi@outlook.de>
+To: Peter Lammich <lammich@in.tum.de>
+Subject: [FDS-Homework] 3
+Thread-Topic: [FDS-Homework] 3
+Thread-Index: AQHT43DoHfe93oMuGUqe96XgC+CfkQ==
+Date: Fri, 4 May 2018 06:27:00 +0000
+Message-ID: <AM5PR1001MB0995AD4267960A6BD3D7C69B88860@AM5PR1001MB0995.EURPRD10.PROD.OUTLOOK.COM>
+Accept-Language: de-DE, en-US
+Content-Language: en-US
+X-MS-Has-Attach: yes
+X-MS-TNEF-Correlator: 
+x-clientproxiedby: VI1PR08CA0239.eurprd08.prod.outlook.com
+ (2603:10a6:802:15::48) To AM5PR1001MB0995.EURPRD10.PROD.OUTLOOK.COM
+ (2603:10a6:203:11::18)
+x-incomingtopheadermarker:
+ OriginalChecksum:B38EAC25F8CEFA3E33FCE6D2878D181581CE24965B035FD5C31484DB4A57AF64;UpperCasedChecksum:0DC7AE6AF3F8A07A788F40769747F7286D266C9AD62803EA9AE335A352554A58;SizeAsReceived:7236;Count:47
+x-ms-exchange-messagesentrepresentingtype: 1
+x-tmn: [lg7y8zZ9JVyAH8CCrvWsBtumDAwuFCBE]
+x-ms-publictraffictype: Email
+x-microsoft-exchange-diagnostics:
+ 1;AM5EUR02HT115;7:d/XwLrs0WIaoFpsxTJMMFUiiTHP0O45sUp35f9Svivml6qkK1+bvbdxSq18215qYgk+uIElOM3rnz37mK6Gb9b3YiV0w0YJ30VnrMrl4eVyHEnDeAa7aAAr/4V6batytGq+0BjsPTJFAghEFUqMHhnkoMlXCZxN7yI2N8eHA/a9H3wa4XBim9nK3toOm08cE9T2GZs964S8rUGWo+nuBvD/J/XfS5ewFQf44t1hekTdvToVQMX66sfVktF01Sy07
+x-incomingheadercount: 47
+x-eopattributedmessage: 0
+x-microsoft-antispam:
+ UriScan:;BCL:0;PCL:0;RULEID:(7020095)(201702061078)(5061506573)(5061507331)(1603103135)(2017031320274)(2017031324274)(2017031323274)(2017031322404)(1601125374)(1603101448)(1701031045);SRVR:AM5EUR02HT115;
+x-ms-traffictypediagnostic: AM5EUR02HT115:
+x-exchange-antispam-report-cfa-test:
+ BCL:0;PCL:0;RULEID:(444000031);SRVR:AM5EUR02HT115;BCL:0;PCL:0;RULEID:;SRVR:AM5EUR02HT115;
+x-forefront-prvs: 06628F7CA4
+x-forefront-antispam-report:
+ SFV:NSPM;SFS:(7070007)(98901004);DIR:OUT;SFP:1901;SCL:1;SRVR:AM5EUR02HT115;H:AM5PR1001MB0995.EURPRD10.PROD.OUTLOOK.COM;FPR:;SPF:None;LANG:;
+x-microsoft-antispam-message-info:
+ +69I/07NzchOuT3hKyD/IJvp/zvBs6t9nZEwBdsKSj1NLD8c2CUOJbUm0RV5f/eeshPn4/iP+VSFpSE2T9z+3B+agMN/GXQUsZng34rLcYiHDMDWbhqISJXGxjypkhXxwkQYZwzMvsGgyNnJmqYCykVp8BQEF6DPwJCzVzaIxYk3fTXkHpWqQm9YGgwyRtc3
+Content-Type: multipart/mixed; boundary="_004_AM5PR1001MB0995AD4267960A6BD3D7C69B88860AM5PR1001MB0995_"
+MIME-Version: 1.0
+X-MS-Office365-Filtering-Correlation-Id:
+ 8f4f6b21-0537-4e4a-c004-08d5b18809ad
+X-OriginatorOrg: outlook.com
+X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg:
+ 9bd8b953-1c55-4da7-b616-8bcad099ae8b
+X-MS-Exchange-CrossTenant-Network-Message-Id:
+ 8f4f6b21-0537-4e4a-c004-08d5b18809ad
+X-MS-Exchange-CrossTenant-rms-persistedconsumerorg:
+ 9bd8b953-1c55-4da7-b616-8bcad099ae8b
+X-MS-Exchange-CrossTenant-originalarrivaltime: 04 May 2018 06:27:00.3688
+ (UTC)
+X-MS-Exchange-CrossTenant-fromentityheader: Internet
+X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa
+X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5EUR02HT115
+X-Evolution-Source: 1479990504.8344.16@lapnipkow10
+
+
+--_004_AM5PR1001MB0995AD4267960A6BD3D7C69B88860AM5PR1001MB0995_
+Content-Type: multipart/alternative; boundary="_000_AM5PR1001MB0995AD4267960A6BD3D7C69B88860AM5PR1001MB0995_"
+
+
+--_000_AM5PR1001MB0995AD4267960A6BD3D7C69B88860AM5PR1001MB0995_
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 8bit
+
+Hi Peter,
+
+as the upload slot for sheet 3 is not available, here is my submission for the homework.
+
+Best regards
+Daniel
+
+(03623674 / ga68zak)
+
+--_000_AM5PR1001MB0995AD4267960A6BD3D7C69B88860AM5PR1001MB0995_
+Content-Type: text/html; charset="utf-8"
+Content-ID: <A7994E17A3B85445923075B726144109@EURPRD10.PROD.OUTLOOK.COM>
+Content-Transfer-Encoding: 8bit
+
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+<div dir="ltr">Hi Peter,
+<div><br>
+</div>
+<div>as the upload slot for sheet 3 is not available, here is my submission for the homework.</div>
+<div><br>
+</div>
+<div>Best regards</div>
+<div>Daniel</div>
+<div><br>
+</div>
+<div>(03623674 / ga68zak)</div>
+</div>
+</body>
+</html>
+
+--_000_AM5PR1001MB0995AD4267960A6BD3D7C69B88860AM5PR1001MB0995_--
+
+--_004_AM5PR1001MB0995AD4267960A6BD3D7C69B88860AM5PR1001MB0995_
+Content-Type: application/octet-stream; name="hw03.thy"
+Content-Description: hw03.thy
+Content-Disposition: attachment; filename="hw03.thy"; size=3415; creation-date="Fri, 04 May 2018 06:26:57 GMT"; modification-date="Fri, 04 May 2018 06:26:57 GMT"
+Content-ID: <16329d398641f4dbbe91>
+Content-Transfer-Encoding: base64
+
+dGhlb3J5IGh3MDMKaW1wb3J0cyAifn4vc3JjL0hPTC9MaWJyYXJ5L1RyZWUiCmJlZ2luCgooKiAz
+LjEgKikKCmRhdGF0eXBlIGRpcmVjdGlvbiA9IEwgfCBSCnR5cGVfc3lub255bSBwYXRoID0gImRp
+cmVjdGlvbiBsaXN0IgoKZnVuIHZhbGlkIDo6ICInYSB0cmVlIFw8UmlnaHRhcnJvdz4gcGF0aCBc
+PFJpZ2h0YXJyb3c+IGJvb2wiIHdoZXJlCiAgInZhbGlkIF8gW10gPSBUcnVlIgp8ICJ2YWxpZCBM
+ZWFmIF8gPSBGYWxzZSIKfCAidmFsaWQgKE5vZGUgbCBfIHIpICh4I3hzKSA9ICgKICAgIGlmIHg9
+TCB0aGVuIHZhbGlkIGwgeHMKICAgIGVsc2UgIHZhbGlkIHIgeHMpIgoKZnVuIGdldCA6OiAiJ2Eg
+dHJlZSBcPFJpZ2h0YXJyb3c+IHBhdGggXDxSaWdodGFycm93PiAnYSB0cmVlIiB3aGVyZQogICAg
+ImdldCBhIFtdID0gYSIKICB8ICJnZXQgKE5vZGUgbCBfIHIpICh4I3hzKSA9ICgKICAgIGlmIHg9
+TCB0aGVuIGdldCBsIHhzCiAgICBlbHNlIGdldCByIHhzKSIKICB8ICJnZXQgXyBfID0gdW5kZWZp
+bmVkIiAoKiBjYXRjaC1hbGwgY2xhdXNlIHRvIGdldCByaWQgb2YKICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgbWlzc2luZyBwYXR0ZXJucyB3YXJuaW5nICopCgpmdW4gcHV0IDo6ICInYSB0
+cmVlIFw8UmlnaHRhcnJvdz4gcGF0aCBcPFJpZ2h0YXJyb3c+ICdhIHRyZWUgXDxSaWdodGFycm93
+PiAnYSB0cmVlIiB3aGVyZQogICJwdXQgXyBbXSBzID0gcyIKfCAicHV0IChOb2RlIGwgYSByKSAo
+cCNwcykgcyA9ICgKICAgIGlmIHA9TCB0aGVuIE5vZGUgKHB1dCBsIHBzIHMpIGEgcgogICAgZWxz
+ZSBOb2RlIGwgYSAocHV0IHIgcHMgcykpIgp8ICJwdXQgdCBfIF8gPSB0IgoKbGVtbWEgcHV0X2lu
+dmFsaWRbc2ltcF06ICJcPG5vdD52YWxpZCB0IHAgXDxMb25ncmlnaHRhcnJvdz4gcHV0IHQgcCBz
+ID0gdCIKICBhcHBseSAoaW5kdWN0aW9uIHQgcCBydWxlOiB2YWxpZC5pbmR1Y3QpCiAgYnkgYXV0
+bwoKbGVtbWEgZ2V0X3B1dFtzaW1wXTogInB1dCB0IHAgKGdldCB0IHApID0gdCIKICBhcHBseSAo
+aW5kdWN0aW9uIHQgcCBydWxlOiBnZXQuaW5kdWN0KQogIGJ5IGF1dG8KCmxlbW1hIHB1dF9wdXRb
+c2ltcF06ICJwdXQgKHB1dCB0IHAgcykgcCBzJyA9IHB1dCB0IHAgcyciCiAgc29ycnkKCmxlbW1h
+IHB1dF9nZXRbc2ltcF06ICJ2YWxpZCB0IHAgXDxMb25ncmlnaHRhcnJvdz4gZ2V0IChwdXQgdCBw
+IHMpIHAgPSBzIgogIGFwcGx5IChpbmR1Y3Rpb24gdCBwIHJ1bGU6IGdldC5pbmR1Y3QpCiAgYnkg
+YXV0bwoKbGVtbWEgdmFsaWRfcHV0W3NpbXBdOiAidmFsaWQgdCBwIFw8TG9uZ3JpZ2h0YXJyb3c+
+IHZhbGlkIChwdXQgdCBwIHMpIHAiCiAgYXBwbHkgKGluZHVjdGlvbiB0IHAgcnVsZTogdmFsaWQu
+aW5kdWN0KQogIGJ5IGF1dG8KCmxlbW1hIHZhbGlkX2FwcGVuZFtzaW1wXTogInZhbGlkIHQgKHBA
+cSkgXDxsb25nbGVmdHJpZ2h0YXJyb3c+IHZhbGlkIHQgcCBcPGFuZD4gdmFsaWQgKGdldCB0IHAp
+IHEiCiAgYXBwbHkgKGluZHVjdGlvbiB0IHAgcnVsZTogdmFsaWQuaW5kdWN0KQogIGJ5IGF1dG8K
+CmxlbW1hIGdldF9hcHBlbmRbc2ltcF06ICJ2YWxpZCB0IHAgXDxMb25ncmlnaHRhcnJvdz4gZ2V0
+IHQgKHBAcSkgPSBnZXQgKGdldCB0IHApIHEiCiAgYXBwbHkgKGluZHVjdGlvbiB0IHAgcnVsZTog
+dmFsaWQuaW5kdWN0KQogIGJ5IGF1dG8KCmxlbW1hIHB1dF9hcHBlbmRbc2ltcF06ICJwdXQgdCAo
+cEBxKSBzID0gcHV0IHQgcCAocHV0IChnZXQgdCBwKSBxIHMpIgogIGFwcGx5IChpbmR1Y3Rpb24g
+dCBwIHJ1bGU6IGdldC5pbmR1Y3QpCiAgYnkgYXV0bwoKKCogMy4yICopCgpmdW4gaW5zIDo6ICIn
+YTo6bGlub3JkZXIgXDxSaWdodGFycm93PiAnYSB0cmVlIFw8UmlnaHRhcnJvdz4gJ2EgdHJlZSIg
+d2hlcmUKImlucyB4IExlYWYgPSBOb2RlIExlYWYgeCBMZWFmIiB8CiJpbnMgeCAoTm9kZSBsIGEg
+cikgPQogIChpZiB4IDwgYSB0aGVuIE5vZGUgKGlucyB4IGwpIGEgciBlbHNlCiAgIGlmIHggPiBh
+IHRoZW4gTm9kZSBsIGEgKGlucyB4IHIpCiAgIGVsc2UgTm9kZSBsIGEgcikiCgpmdW4gaXNpbiA6
+OiAiKCdhOjpsaW5vcmRlcikgdHJlZSBcPFJpZ2h0YXJyb3c+ICdhIFw8UmlnaHRhcnJvdz4gYm9v
+bCIgd2hlcmUKImlzaW4gTGVhZiB4ID0gRmFsc2UiIHwKImlzaW4gKE5vZGUgbCBhIHIpIHggPQog
+IChpZiB4IDwgYSB0aGVuIGlzaW4gbCB4IGVsc2UKICAgaWYgeCA+IGEgdGhlbiBpc2luIHIgeAog
+ICBlbHNlIFRydWUpIgoKZnVuIGJzdF9yZW1kdXBzX2F1eCA6OiAiJ2E6Omxpbm9yZGVyIHRyZWUg
+XDxSaWdodGFycm93PiAnYSBsaXN0IFw8UmlnaHRhcnJvdz4gJ2EgbGlzdCIgd2hlcmUKICAiYnN0
+X3JlbWR1cHNfYXV4IHQgW10gPSBbXSIKfCAiYnN0X3JlbWR1cHNfYXV4IHQgKHgjeHMpID0KICAg
+IChpZiBpc2luIHQgeCB0aGVuCiAgICAgIGJzdF9yZW1kdXBzX2F1eCB0IHhzCiAgICBlbHNlCiAg
+ICAgIHggIyBic3RfcmVtZHVwc19hdXggKGlucyB4IHQpIHhzKSIKCmRlZmluaXRpb24gImJzdF9y
+ZW1kdXBzIHhzIFw8ZXF1aXY+IGJzdF9yZW1kdXBzX2F1eCBMZWFmIHhzIgoKKCogeCBcPG5vdGlu
+PiBzZXQgeHMgXDxMb25ncmlnaHRhcnJvdz4geCBcPGluPiBzZXQgKGJzdF9yZW1kdXBzX2F1eCBc
+PGxhbmdsZT5cPGxhbmdsZT5cPHJhbmdsZT4sIGEsIFw8bGFuZ2xlPlw8cmFuZ2xlPlw8cmFuZ2xl
+PiB4cykgXDxMb25ncmlnaHRhcnJvdz4geCA9IGEgKikKCmxlbW1hICJzZXQgKGJzdF9yZW1kdXBz
+IHhzKSA9IHNldCAoeHMpIgogIGFwcGx5IChzaW1wIGFkZDogYnN0X3JlbWR1cHNfZGVmKQogIGFw
+cGx5IChpbmR1Y3Rpb24geHMpCiAgYXBwbHkgKGF1dG8pCiAgc29ycnkKCmxlbW1hIGF1eF9kaXN0
+aW5jdDFbc2ltcF06ICJkaXN0aW5jdCAoYnN0X3JlbWR1cHNfYXV4IFw8bGFuZ2xlPlw8cmFuZ2xl
+PiB4cykgXDxMb25ncmlnaHRhcnJvdz4gYSBcPG5vdGluPiBzZXQgKGJzdF9yZW1kdXBzX2F1eCBc
+PGxhbmdsZT5cPGxhbmdsZT5cPHJhbmdsZT4sIGEsIFw8bGFuZ2xlPlw8cmFuZ2xlPlw8cmFuZ2xl
+PiB4cykiCiAgc29ycnkKCmxlbW1hICJkaXN0aW5jdCAoYnN0X3JlbWR1cHMgeHMpIgogIHNvcnJ5
+CgpmdW4gc3VibGlzdCA6OiAiJ2EgbGlzdCBcPFJpZ2h0YXJyb3c+ICdhIGxpc3QgXDxSaWdodGFy
+cm93PiBib29sIiB3aGVyZQogICJzdWJsaXN0IFtdIF8gPSBUcnVlIgp8ICJzdWJsaXN0IHhzIFtd
+ID0gKHhzID0gW10pIgp8ICJzdWJsaXN0ICh4I3hzKSAoeSN5cykgPSAKICAgIChpZiAoeD15KSB0
+aGVuIHN1Ymxpc3QgeHMgeXMgZWxzZSBzdWJsaXN0ICh4I3hzKSB5cykiCgpsZW1tYSAic3VibGlz
+dCAoYnN0X3JlbWR1cHMgeHMpIHhzIgogIGFwcGx5IChzaW1wIGFkZDpic3RfcmVtZHVwc19kZWYp
+CiAgYXBwbHkgKGluZHVjdGlvbiB4cykKICAgYXBwbHkgKGF1dG8pCiAgc29ycnkKCmVuZA==
+
+--_004_AM5PR1001MB0995AD4267960A6BD3D7C69B88860AM5PR1001MB0995_--
+
+From jonatan.juhas@tum.de Thu May  3 23:12:15 2018
+Return-Path: <SRS0=j99Z=HW=gmail.com=jonatan.juhas@srs.mail.lrz.de>
+Delivered-To: <lammich@mailstore.informatik.tu-muenchen.de>
+Received: from vmmailstore1.informatik.tu-muenchen.de by
+ vmmailstore1.informatik.tu-muenchen.de (Dovecot) with LMTP id
+ dSn3J/N661oNZQAArPjJig for <lammich@mailstore.informatik.tu-muenchen.de>;
+ Thu, 03 May 2018 23:12:15 +0200
+Received: from vmmailproxy1.informatik.tu-muenchen.de
+ (vmmailproxy1.informatik.tu-muenchen.de [131.159.0.83]) by
+ vmmailstore1.informatik.tu-muenchen.de (Postfix) with ESMTP id 4C9281C2029
+ for <lammich@mailstore.informatik.tu-muenchen.de>; Thu,  3 May 2018
+ 23:12:15 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de
+ (mailrelay1.informatik.tu-muenchen.de [131.159.254.14]) by
+ vmmailproxy1.informatik.tu-muenchen.de (Postfix) with ESMTP id 3FA611E012D
+ for <lammich@mail.informatik.tu-muenchen.de>; Thu,  3 May 2018 23:12:15
+ +0200 (CEST)
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix) id
+ 3CBEE1C037B; Thu,  3 May 2018 23:12:15 +0200 (CEST)
+Delivered-To: peter.lammich@informatik.tu-muenchen.de
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id 390CF1C038A; Thu,  3 May 2018 23:12:15 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de (localhost
+ [127.0.0.1]) by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP
+ id 08CD51C037C for <lammich@in.tum.de>; Thu,  3 May 2018 23:12:15 +0200
+ (CEST)
+Received: from vmmaildmz1.informatik.tu-muenchen.de
+ (vmmaildmz1.informatik.tu-muenchen.de [131.159.0.87]) by
+ vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id F1E3E1C037B
+ for <lammich@in.tum.de>; Thu,  3 May 2018 23:12:14 +0200 (CEST)
+Received: by vmmaildmz1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id F043C1C2DB6; Thu,  3 May 2018 23:12:14 +0200 (CEST)
+X-Spam-Checker-Version: SpamAssassin 3.4.0-tuminfo_1 (2014-02-07) on
+ vmmaildmz1.informatik.tu-muenchen.de
+X-Spam-Level: 
+X-Spam-Status: No, score=-1.7 required=7.0
+ tests=AWL,BAYES_00,DC_PNG_UNO_LARGO,
+ HTML_IMAGE_ONLY_08,HTML_IMAGE_RATIO_08,HTML_MESSAGE,RCVD_IN_DNSWL_MED
+ autolearn=no autolearn_force=no version=3.4.0-tuminfo_1
+Received: from vmmaildmz1.informatik.tu-muenchen.de (localhost [127.0.0.1])
+ by vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTP id E335C1C2DB4
+ for <lammich@in.tum.de>; Thu,  3 May 2018 23:12:12 +0200 (CEST)
+Received: from forwout2.mail.lrz.de (forwout2.mail.lrz.de
+ [129.187.255.131]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256
+ bits)) (No client certificate requested) by
+ vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTPS id D7C131C2DB3
+ for <lammich@in.tum.de>; Thu,  3 May 2018 23:12:12 +0200 (CEST)
+Received: from postforw1.mail.lrz.de (lxmhs61.srv.lrz.de
+ [IPv6:2001:4ca0:0:116::a9c:63d]) by forwout2.mail.lrz.de (Postfix) with
+ ESMTP id 40cSWw5qwBzbn for <lammich@in.tum.de>; Thu,  3 May 2018 23:12:12
+ +0200 (CEST)
+Received: from postrelay2b.lrz.de (lxmhs90.srv.lrz.de
+ [IPv6:2001:4ca0:0:116::a9c:65a]) by postforw1.mail.lrz.de (Postfix) with
+ ESMTP id 40cSWw5j6RzyfL for <peter.lammich@tum.de>; Thu,  3 May 2018
+ 23:12:12 +0200 (CEST)
+Received: from lxmhs90.srv.lrz.de (localhost [127.0.0.1]) by
+ postrelay2b.lrz.de (Postfix) with ESMTP id 40cSWw5Cb6zyp1 for
+ <peter.lammich@tum.de>; Thu,  3 May 2018 23:12:12 +0200 (CEST)
+X-Virus-Scanned: by amavisd-new at lrz.de in lxmhs90.srv.lrz.de
+Received: from postrelay2b.lrz.de ([127.0.0.1]) by lxmhs90.srv.lrz.de
+ (lxmhs90.srv.lrz.de [127.0.0.1]) (amavisd-new, port 10001) with ESMTP id
+ 0XlII4A0FLNf for <peter.lammich@tum.de>; Thu,  3 May 2018 23:12:12 +0200
+ (CEST)
+Received: from mail-wm0-f50.google.com (mail-wm0-f50.google.com
+ [74.125.82.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384
+ (256/256 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet
+ Authority G2" (verified OK)) by postrelay2b.lrz.de (Postfix) with ESMTPS
+ for <peter.lammich@tum.de>; Thu,  3 May 2018 23:12:12 +0200 (CEST)
+Received: by mail-wm0-f50.google.com with SMTP id w194so1103857wmf.2 for
+ <peter.lammich@tum.de>; Thu, 03 May 2018 14:12:12 -0700 (PDT)
+X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net;
+ s=20161025;
+ h=x-gm-message-state:date:from:to:message-id:subject:mime-version;
+ bh=jE9ttE58l/GAP+qDNaYRGO1A81oXU9FakIgYhvpbcZI=;
+ b=TejhxH9eObkFstNoryCdKUB+fNXIK2TBj1XO1MQoqmBhHwojXdGrp9E8J+qC9uET2B
+ CE14pzk0h3HnKh+cZ8qHi9iciceSEbv6zN/78s0UniBWBE18Sf3lTeEf9TiRCqTYvGzE
+ LHGZNFD047UwjWq7JWrwtAv0F2znbeBEVXooJKKVhWNQF0dG5uTNXoE19A26FANsRejp
+ WDMXe9F2dicm/9uf4Rr3WaERPBOfa7muhItS84l8JyggA3It7CjUOlSVvwgXI2WAtStl
+ yIqUQLXDeocqGWqWmZcHdo0+Ol62gwEbYKowMzpCnood59GLV4OLvrL4ZrmrFzvHKI7x oSrg==
+X-Gm-Message-State:
+ ALQs6tANAvBXmOWiZKxnWaE2/B9AFexhUGgsZOknn2Qm99j8QLSDEzgR
+ Oa5Wz+ISgq/3Hj8IdFphono1hHzy
+X-Google-Smtp-Source:
+ AB8JxZqlIJPhaO+TEth/Z61yrd2Ze3s2hUkyS6dWL73Y8IYSfQc4pYjEMWsbPlzn+3PooAt8lpKYkQ==
+X-Received: by 2002:a50:af05:: with SMTP id
+ g5-v6mr9110586edd.286.1525381925492; Thu, 03 May 2018 14:12:05 -0700 (PDT)
+Received: from DisMyLaptop ([195.242.213.115]) by smtp.gmail.com with
+ ESMTPSA id j22-v6sm8885305eda.72.2018.05.03.14.12.03 for
+ <peter.lammich@tum.de> (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256
+ bits=128/128); Thu, 03 May 2018 14:12:04 -0700 (PDT)
+Date: Thu, 3 May 2018 23:12:02 +0200
+From: "J. Juhas" <jonatan.juhas@tum.de>
+To: Peter Lammich <peter.lammich@tum.de>
+Message-ID: <1525381370.local-7a4358e7-0874-v1.2.1-7e7447b6@getmailspring.com>
+Subject: [FDS-Homework]
+X-Mailer: Mailspring
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="5aeb7b22_686b0f6c_5cb8"
+X-Evolution-Source: 1479990504.8344.16@lapnipkow10
+
+
+--5aeb7b22_686b0f6c_5cb8
+Content-Type: multipart/alternative; boundary="5aeb7b22_1c1dbfc1_5cb8"
+
+
+--5aeb7b22_1c1dbfc1_5cb8
+Content-Type: text/plain; charset="utf-8"
+Content-Disposition: inline
+Content-Transfer-Encoding: 8bit
+
+Hi Peter,
+
+Tomorrow is the deadline for the submission of the third exercise sheet but I can't find the entry in the submission system.
+I'm therefore submitting my homework to you via E-Mail. Hope that that is not a problem.
+
+Best Regards,
+Jonathan Juhas
+
+PS: I was unable to finish all of the proof exercises but well, I'll leave the assessment for you to make.
+
+--5aeb7b22_1c1dbfc1_5cb8
+Content-Type: text/html; charset="utf-8"
+Content-Disposition: inline
+Content-Transfer-Encoding: 8bit
+
+<div>Hi Peter,</div><br><div>Tomorrow is the deadline for the submission of the third exercise sheet but I can't find the entry in the submission system.</div><div>I'm therefore submitting my homework to you via E-Mail. Hope that that is not a problem.</div><br><div>Best Regards,</div><div>Jonathan Juhas</div><br><div>PS: I was unable to finish all of the proof exercises but well, I'll leave the assessment for you to make.</div><div><signature id="local-2d702942-d407"></signature></div><br><img class="mailspring-open" alt="Open Tracking" width="0" height="0" style="border:0; width:0; height:0;" src="https://link.getmailspring.com/open/1525381370.local-7a4358e7-0874-v1.2.1-7e7447b6@getmailspring.com?recipient=cGV0ZXIubGFtbWljaEB0dW0uZGU%3D">
+--5aeb7b22_1c1dbfc1_5cb8--
+
+--5aeb7b22_686b0f6c_5cb8
+Content-Type: application/octet-stream
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename="ha03.thy"
+
+dGhlb3J5IGhhMDMKaW1wb3J0cyAiLi4vbWF0ZXJpYWwvRGVtb3MvQlNUX0RlbW8iCmJlZ2luCgpc
+PGNvbW1lbnQ+IFw8b3Blbj4gSG9tZXdvcms6IFBhcnQgMSBcPGNsb3NlPgoKZGF0YXR5cGUgZGly
+ZWN0aW9uID0gTCB8IFIKdHlwZV9zeW5vbnltIHBhdGggPSAiZGlyZWN0aW9uIGxpc3QiCgooKiBT
+cGVjaWZ5IHdoZW4gYSBwYXRoIGlzIHZhbGlkICopCmZ1biB2YWxpZCA6OiAiJ2EgdHJlZSBcPFJp
+Z2h0YXJyb3c+IHBhdGggXDxSaWdodGFycm93PiBib29sIiB3aGVyZQogICJ2YWxpZCBfIFtdID0g
+VHJ1ZSIgfAogICJ2YWxpZCBMZWFmICh4I3hzKSA9IEZhbHNlIiB8CiAgInZhbGlkIChOb2RlIGwg
+XyByKSAoeCN4cykgPSAoCiAgICBjYXNlIHggb2YKICAgICAgTCBcPFJpZ2h0YXJyb3c+IHZhbGlk
+IGwgeHMgfAogICAgICBSIFw8UmlnaHRhcnJvdz4gdmFsaWQgciB4cwogICkiCgp0ZXh0IFw8b3Bl
+bj4gdmFsaWQ6IEJydXRlIGZvcmNlIHRlc3RzIFw8Y2xvc2U+CmRlZmluaXRpb24gc2ltcGxlX3Ry
+ZWUgd2hlcmUgInNpbXBsZV90cmVlID0gKE5vZGUgKE5vZGUgKE5vZGUgKE5vZGUgKExlYWYpICgx
+OjpuYXQpIChMZWFmKSkgMiAoTGVhZikpIDQgKExlYWYpKSA1IChOb2RlIChOb2RlIChMZWFmKSA2
+IChMZWFmKSkgOCAoTm9kZSAoTGVhZikgMTUgKExlYWYpKSkpIgpsZW1tYSAidmFsaWQgc2ltcGxl
+X3RyZWUgW0wsTCxMXSA9IFRydWUiIGJ5IGV2YWwKbGVtbWEgInZhbGlkIHNpbXBsZV90cmVlIFtS
+LExdID0gVHJ1ZSIgYnkgZXZhbApsZW1tYSAidmFsaWQgc2ltcGxlX3RyZWUgW0wsUl0gPSBUcnVl
+IiBieSBldmFsCmxlbW1hICJ2YWxpZCBzaW1wbGVfdHJlZSBbTCwgUiwgUl0gPSBGYWxzZSIgYnkg
+ZXZhbApsZW1tYSAidmFsaWQgc2ltcGxlX3RyZWUgW10gPSBUcnVlIiBieSBldmFsCgooKiBTcGVj
+aWZ5IGEgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBzdWJ0cmVlIGFkZHJlc3NlZCBieSBhIGdpdmVu
+IHBhdGggKikKZnVuIGdldCA6OiAiJ2EgdHJlZSBcPFJpZ2h0YXJyb3c+IHBhdGggXDxSaWdodGFy
+cm93PiAnYSB0cmVlIiB3aGVyZSAKICAiZ2V0IExlYWYgXyA9IExlYWYiIHwKICAiZ2V0IHQgW10g
+PSB0IiB8CiAgImdldCAoTm9kZSBsIGEgcikgKHgjeHMpID0gKAogICAgY2FzZSB4IG9mCiAgICAg
+IEwgXDxSaWdodGFycm93PiBnZXQgbCB4cyB8CiAgICAgIFIgXDxSaWdodGFycm93PiBnZXQgciB4
+cwogICkiCgp0ZXh0IFw8b3Blbj4gZ2V0OiBCcnV0ZSBmb3JjZSB0ZXN0cyBcPGNsb3NlPgpsZW1t
+YSAiZ2V0IHNpbXBsZV90cmVlIFtMLExdID0gKE5vZGUgKE5vZGUgTGVhZiAxIExlYWYpIDIgTGVh
+ZikiIGJ5IGV2YWwKbGVtbWEgImdldCBzaW1wbGVfdHJlZSBbTCxMLExdID0gKE5vZGUgTGVhZiAx
+IExlYWYpIiBieSBldmFsCmxlbW1hICJnZXQgc2ltcGxlX3RyZWUgW10gPSBzaW1wbGVfdHJlZSIg
+YnkgZXZhbApsZW1tYSAiZ2V0IHNpbXBsZV90cmVlIFtMLCBSLCBSXSA9IExlYWYiIGJ5IGV2YWwK
+CigqIFNwZWNpZnkgYSBmdW5jdGlvbiBwdXQgdCBwIHMsIHRoYXQgcmV0dXJucyB0LCB3aXRoIHRo
+ZSBzdWJ0cmVlIGF0IHAgcmVwbGFjZWQgYnkgcyAqKQpmdW4gcHV0IDo6ICInYSB0cmVlIFw8Umln
+aHRhcnJvdz4gcGF0aCBcPFJpZ2h0YXJyb3c+ICdhIHRyZWUgXDxSaWdodGFycm93PiAnYSB0cmVl
+IiB3aGVyZQogICJwdXQgXyBbXSB0JyA9IHQnIiB8CiAgInB1dCBMZWFmICh4I3hzKSBfID0gTGVh
+ZiIgfCAgKCogRWRnZSBjYXNlIC0gaWYgcGF0aCBub3QgdmFsaWQgZG8gbm90aGluZyAqKQogICJw
+dXQgKE5vZGUgbCBhIHIpICh4I3hzKSB0JyA9ICgKICAgIGNhc2UgeCBvZgogICAgICBMIFw8Umln
+aHRhcnJvdz4gKE5vZGUgKHB1dCBsIHhzIHQnKSBhIHIpIHwKICAgICAgUiBcPFJpZ2h0YXJyb3c+
+IChOb2RlIGwgYSAocHV0IHIgeHMgdCcpKQogICkiCgp0ZXh0IFw8b3Blbj4gcHV0OiBCcnV0ZSBm
+b3JjZSB0ZXN0IFw8Y2xvc2U+CigqIC4uLiAqKQoKKCogU3BlY2lmeSB5b3VyIGZ1bmN0aW9uIHN1
+Y2ggdGhhdCBpdCBkb2VzIG5vdGhpbmcgaWYgYW4gaW52YWxpZCBwYXRoIGlzIGdpdmVuLCBhbmQg
+cHJvdmUgKikKbGVtbWEgcHV0X2ludmFsaWQ6ICJcPG5vdD52YWxpZCB0IHAgXDxMb25ncmlnaHRh
+cnJvdz4gcHV0IHQgcCBzID0gdCIKICBhcHBseSAoaW5kdWN0aW9uIHAgcnVsZTogdmFsaWQuaW5k
+dWN0KQogIGFwcGx5IChhdXRvIHNwbGl0OiBkaXJlY3Rpb24uc3BsaXRzKQogIGRvbmUKCigqIFBy
+b3ZlIHRoZSBmb2xsb3dpbmcgYWxnZWJyYWljIGxhd3Mgb24gcHV0IGFuZCBnZXQgKikKbGVtbWEg
+Z2V0X2JsYW5rX3JldHVybnNfc2VsZjogImdldCB0IFtdID0gdCIKICBhcHBseSAoaW5kdWN0aW9u
+IHQpIGJ5IGF1dG8KbGVtbWEgZ2V0X3B1dFtzaW1wXTogInB1dCB0IHAgKGdldCB0IHApID0gdCIK
+ICBhcHBseSAoaW5kdWN0aW9uIHAgcnVsZTogdmFsaWQuaW5kdWN0KQogIGFwcGx5IChhdXRvIHNp
+bXA6IGdldF9ibGFua19yZXR1cm5zX3NlbGYgc3BsaXQ6IGRpcmVjdGlvbi5zcGxpdHMpCiAgZG9u
+ZQoKbGVtbWEgcHV0X3B1dFtzaW1wXTogInB1dCAocHV0IHQgcCBzKSBwIHMnID0gcHV0IHQgcCBz
+JyIKICBhcHBseSAoaW5kdWN0aW9uIHAgYXJiaXRyYXJ5OiBzJyBydWxlOiB2YWxpZC5pbmR1Y3Qp
+CiAgYXBwbHkgKGF1dG8gc3BsaXQ6IGRpcmVjdGlvbi5zcGxpdHMpCiAgZG9uZQoKbGVtbWEgcHV0
+X2dldFtzaW1wXTogInZhbGlkIHQgcCBcPExvbmdyaWdodGFycm93PiBnZXQgKHB1dCB0IHAgcykg
+cCA9IHMiCiAgYXBwbHkgKGluZHVjdGlvbiBwIGFyYml0cmFyeTogcyBydWxlOiB2YWxpZC5pbmR1
+Y3QpCiAgYXBwbHkgKGF1dG8gc2ltcDogZ2V0X2JsYW5rX3JldHVybnNfc2VsZiBzcGxpdDogZGly
+ZWN0aW9uLnNwbGl0cykKICBkb25lCgpsZW1tYSB2YWxpZF9wdXRbc2ltcF06ICJ2YWxpZCB0IHAg
+XDxMb25ncmlnaHRhcnJvdz4gdmFsaWQgKHB1dCB0IHAgcykgcCIKICBhcHBseSAoaW5kdWN0aW9u
+IHAgYXJiaXRyYXJ5OiBzIHJ1bGU6IHZhbGlkLmluZHVjdCkKICBhcHBseSAoYXV0byBzcGxpdDog
+ZGlyZWN0aW9uLnNwbGl0cykKICBkb25lCgooKiBTaG93IHRoZSBmb2xsb3dpbmcgbGVtbWFzIGFi
+b3V0IGFwcGVuZGluZyB0d28gcGF0aHMgKikKbGVtbWEgc2hvcnRlbmVkX3BhdGhfaXNfc3RpbGxf
+dmFsaWQ6ICJ2YWxpZCB0IChwQHEpIFw8TG9uZ3JpZ2h0YXJyb3c+IHZhbGlkIHQgcCIKICBhcHBs
+eSAoaW5kdWN0aW9uIHAgcnVsZTogdmFsaWQuaW5kdWN0KQogIGFwcGx5IChhdXRvIHNwbGl0OiBk
+aXJlY3Rpb24uc3BsaXRzKQogIGRvbmUKCmxlbW1hIHZhbGlkX2FwcGVuZF9yaWdodF90b19sZWZ0
+OiAidmFsaWQgdCBwIFw8YW5kPiB2YWxpZCAoZ2V0IHQgcCkgcSBcPExvbmdyaWdodGFycm93PiB2
+YWxpZCB0IChwQHEpIgogIGFwcGx5IChpbmR1Y3Rpb24gcCBydWxlOiB2YWxpZC5pbmR1Y3QpCiAg
+YXBwbHkgKGF1dG8gc2ltcDogZ2V0X2JsYW5rX3JldHVybnNfc2VsZiBzcGxpdDogZGlyZWN0aW9u
+LnNwbGl0cykKICBkb25lCgpsZW1tYSB2YWxpZF9hcHBlbmRfbGVmdF90b19yaWdodDogInZhbGlk
+IHQgKHBAcSkgXDxMb25ncmlnaHRhcnJvdz4gdmFsaWQgKGdldCB0IHApIHEiCiAgYXBwbHkgKGlu
+ZHVjdGlvbiBxIGFyYml0cmFyeTpwIHJ1bGU6IGdldC5pbmR1Y3QpCiAgYXBwbHkgKGF1dG8gc2lt
+cDogZ2V0X2JsYW5rX3JldHVybnNfc2VsZiApCiAgdXNpbmcgdmFsaWQuZWxpbXMoMikgYXBwbHkg
+ZmFzdGZvcmNlCiAgKCogU29tZXRoaW5nIGlzIG1pc3NpbmcgaGVyZSAqKQogIG9vcHMKCmxlbW1h
+IHZhbGlkX2FwcGVuZFtzaW1wXTogInZhbGlkIHQgKHBAcSkgXDxsb25nbGVmdHJpZ2h0YXJyb3c+
+IHZhbGlkIHQgcCBcPGFuZD4gdmFsaWQgKGdldCB0IHApIHEiICgqIERvZXNuJ3Qgd29yayAqKQpc
+PGNvbW1lbnQ+IFw8b3Blbj4gYXBwbHkgKGF1dG8gc2ltcDogdmFsaWRfYXBwZW5kX3JpZ2h0X3Rv
+X2xlZnQgdmFsaWRfYXBwZW5kX2xlZnRfdG9fcmlnaHQpIFw8Y2xvc2U+Clw8Y29tbWVudD4gXDxv
+cGVuPiBhcHBseSAoZmFzdGZvcmNlIHNpbXA6IHNob3J0ZW5lZF9wYXRoX2lzX3N0aWxsX3ZhbGlk
+KSBcPGNsb3NlPgogIG9vcHMKCmxlbW1hIGdldF9hcHBlbmRbc2ltcF06ICJ2YWxpZCB0IHAgXDxM
+b25ncmlnaHRhcnJvdz4gZ2V0IHQgKHBAcSkgPSBnZXQgKGdldCB0IHApIHEiICgqIERvZXNuJ3Qg
+d29yayAqKQogIGFwcGx5IChpbmR1Y3Rpb24gcSBhcmJpdHJhcnk6IHAgcnVsZTogZ2V0LmluZHVj
+dCkKICBhcHBseSAoYXV0byBzaW1wOiBnZXRfYmxhbmtfcmV0dXJuc19zZWxmKQogICgqIFNvbWV0
+aGluZyBpcyBtaXNzaW5nIGhlcmUgKikKICBvb3BzCgpsZW1tYSBwdXRfYXBwZW5kW3NpbXBdOiAi
+cHV0IHQgKHBAcSkgcyA9IHVuZGVmaW5lZCIgKCogRG9lc24ndCB3b3JrICopCiAgb29wcwoKXDxj
+b21tZW50PiBcPG9wZW4+IEhvbWV3b3JrOiBQYXJ0IDIgXDxjbG9zZT4KCmZ1biBic3RfcmVtZHVw
+c19hdXggOjogIidhOjpsaW5vcmRlciB0cmVlIFw8UmlnaHRhcnJvdz4gJ2EgbGlzdCBcPFJpZ2h0
+YXJyb3c+ICdhIGxpc3QiIHdoZXJlCiAgImJzdF9yZW1kdXBzX2F1eCBfIFtdID0gW10iIHwKICAi
+YnN0X3JlbWR1cHNfYXV4IHQgKHgjeHMpID0gKGlmIGlzaW4gdCB4IHRoZW4gYnN0X3JlbWR1cHNf
+YXV4IHQgeHMgZWxzZSB4I2JzdF9yZW1kdXBzX2F1eCAoaW5zIHggdCkgeHMpIgoKZGVmaW5pdGlv
+biAiYnN0X3JlbWR1cHMgeHMgXDxlcXVpdj4gYnN0X3JlbWR1cHNfYXV4IExlYWYgeHMiCgpsZW1t
+YSBic3RfcmVtZHVwc19hdXhfZ2VuOiAiYnN0IHQgXDxMb25ncmlnaHRhcnJvdz4gc2V0IChic3Rf
+cmVtZHVwc19hdXggdCB4cykgPSBzZXQgeHMgLSBzZXQgKGlub3JkZXIgdCkiCiAgYXBwbHkgKGlu
+ZHVjdGlvbiB4cyBydWxlOiBic3RfcmVtZHVwc19hdXguaW5kdWN0KQogICgqIFNvbWV0aGluZyBp
+cyBtaXNzaW5nIGhlcmUgKikKICBvb3BzCgpsZW1tYSAic2V0IChic3RfcmVtZHVwcyB4cykgPSBz
+ZXQgeHMiICgqIERvZXNuJ3Qgd29yayAqKQpcPGNvbW1lbnQ+IFw8b3Blbj4gYnkgKHNpbXAgYWRk
+OiBic3RfcmVtZHVwc19hdXhfZ2VuKSBcPGNsb3NlPgogIG9vcHMKCigqIERlZmluZSBhIGZ1bmN0
+aW9uIHN1Ymxpc3QgeHMgeXMgdG8gY2hlY2sgd2hldGhlciB4cyBpcyBhIHN1Ymxpc3Qgb2YgeXMg
+KikKZnVuIHN1Ymxpc3QgOjogIidhIGxpc3QgXDxSaWdodGFycm93PiAnYSBsaXN0IFw8UmlnaHRh
+cnJvdz4gYm9vbCIgd2hlcmUKICAic3VibGlzdCBbXSBfID0gVHJ1ZSIgfAogICJzdWJsaXN0ICh4
+I3hzKSB5ID0gKAogICAgY2FzZSBmaW5kIChcPGxhbWJkYT56LiB6PXgpIHkgb2YKICAgICAgTm9u
+ZSBcPFJpZ2h0YXJyb3c+IEZhbHNlIHwKICAgICAgKFNvbWUgXykgXDxSaWdodGFycm93PiBzdWJs
+aXN0IHhzIHkgIAogICkiCgpsZW1tYSAic3VibGlzdCAoYnN0X3JlbWR1cHMgeHMpIHhzIiAoKiBE
+b2Vzbid0IHdvcmsgKikKICBhcHBseSAoaW5kdWN0aW9uIHhzKQogIGFwcGx5IChhdXRvIHNpbXA6
+IGJzdF9yZW1kdXBzX2RlZikKICAoKiBTb21ldGhpbmcgaXMgbWlzc2luZyBoZXJlICopCiAgb29w
+cwplbmQ=
+
+--5aeb7b22_686b0f6c_5cb8
+Content-Type: image/png
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;  filename="=?utf-8?Q?DeepinScreenshot=5Fselect-area=5F20180503230542.png?="
+
+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
+QqilpUUx7M8DBw5QFDVp0qTnn39e3ZKb2CBnNYC76667hoeHNSvs9/sRQn6/P2u7GpwdOHAglUlj
+Y+PAwICiKL29veoDIt566y0lcxRdfPHFCKE1a9aomcRiMYTQvHnzFMMBduGFFyKEHn30UfVd6uc9
+hNCuXbuM+nqiUoPXCy+8UFGU3//+9wihb33rW6lX1e664IILPv/8c0VR+vr6amtrEUKdnZ2Kopx7
+7rkIoccff1xNnDqppnaFQR8aZ2swQgA4UWDxAeCE25IE56SNnH766aeffrqiKH19fT09Pf/7v/97
++umnq0tYulAoJAhCV1dXNBrt6+s7fvw4QgjuXy6X48ePv/vuu1OmTHnppZfUSyzUvjW+63x4ePjW
+W28VBOH++++/4YYbSs75xhtvnDRp0iibcPfdd0+dOhUhRJLkTTfd9MQTT7z99tvp30gcP3588+bN
+FRUVd9xxh7rF6XTOnTt37969e/fu1Rtgx44de//996dMmXLXXXep7/J4PD6fr7RLuicCNfy95ppr
+Dh48aLPZ1BNdv/nNb0477bRUmv/zf/6PemMTQRC33HJLMBh86623Ghsbt27dWllZ6fF41GS33Xbb
+vffe29/fr/437yTVzPaaa64pYewBMHHA4gPAWINI2shdd9313//93+rf77333tKlS++///5vfetb
+Z5xxRnqyX//619/73vfUJQaUXW9v7+Dg4KRJkx5//PF4PK4kb0v/+OOPDd71wAMPvPzyyw6H48EH
+HxxNzpWVlcbVy/1CU80nPf4mSTLr76x713p7e4eGhqqrq9OLq6mp6e3t3bNnz/PPP685wERRHBoa
+mj17tnqkRAhNnjx5zpw5J+nB7NixY9FoFCH0s5/9LPUwxCNHjjz33HO33357KplmZ6on4UwmU+pq
+jUmTJs2aNSsVSeedpJrZljb2ABgfsPgAMBHAHYeFuvDCCymKGhoa4nk+fXtfX19ra+vg4ODDDz/8
++uuvb926Fa5+Lq/TTz+9oqKisrKyv79/aGjo888/37dvX09Pz5tvvqn3lueff76trW3BggVr166d
+PFl3kJeQc7oFCxYghD766KP0jYIgDA0NmUymGTNmpDamH7o++eQThJB6/UB6TSorKw8dOjQwMKBu
+URTlX//6F0KIIAi9ATZ37twpU6YcOnRIlmV1y+DgoOb99SeF9evXHzp0aObMmbYk9RF46mUeKWoH
+pv9dW1t7+umnT506VX1Oi/rSZ599lkpZyCTVy3Y0IwSAMQKLDwATB0TShXr11Vc//PBDhJDZbE7f
+/sknnwwNDc2YMeN73/veFVdcUVFRsXXr1tSrqavWDLYAYxUVFQ0NDceOHXvssccmTZp06qmn/v3v
+f1+2bFlbWxvS6s8dO3bcfvvtOI4/99xzWb9al5XYOOe8Lr/8cvUi7A0bNqhbZFlWL/654oor0k8L
+/epXvzpy5AhCqKen59lnn500adJll12WVbFLL710aGjokUceUbc8+eST+/fvr6urGxoa0htglZWV
+F1100fDw8OrVq9Utv/71r9WCTkbqpR0/+tGPNiW98cYbOI53dXXt2bMnley3v/2t+sMToiiuXbsW
+IbR06dIpU6Y0NTUpinLffff19fX19fXdd999qcjAeJIaZDvKEQLAGIHFB4AJ5ERdqT3BqXe/VVVV
+zZs374wzzqiqqlK7684771QTpG7XOH78+Lx58xBCdXV1V1999SmnnKKmfPXVVxVFicfj6iM2zz77
+bJ/Pp7kFqNQ+nzZtWvrT6+rq6hRFef3119VTyw0NDZdccklFRcXkyZNfeOEFRas/lyxZghBatGjR
+7bfffvPNN19//fV2u33btm2aiQ1yVu/XUfejcZ0nTZpktVqvvfbampoatQk7duxQE6SeOzFnzpzL
+L79cvRK3ublZfTX9pp833nhDrcn5559/4YUXqsfCZ5991niAvfTSS2rKCy64oL6+PjWvT7qbfj79
+9NPKyspJkybt3bs3ffvXv/51hNBPf/pTJdldCKGZM2defvnlJpMJIXTNNdeoKbdu3UoQRPripn7v
+vGvXLuM+NM7WYIQAcALB4gPAiZW64xAiaW1Zz+447bTTlixZ8uijjx47dkxNkL4MvffeexdccAFC
+qLKy8tprr/3qV7+aHoFFo9G5c+cihFwul94WoOg8L4UgCPXVV199NfVtQF1d3Z///OfUG7P6Myuc
+Ur3zzjuaiQ1yLiSSHhwc/OUvf6nGXqorrrhiy5YtqQRqJg8//HBdXR1C6JRTTlmxYoV6xa2SOYoU
+RWEY5pxzzlEPTnV1dbFYTN1uPMCeffZZ9cJ9k8l0xx13XH755SfjwezRRx9FCDU2NmZtf+655xBC
+ZrNZSXZXIBA477zzEEIYhrnd7sOHD6cSf/jhh9/+9rfr6+tvuummP/3pT+rTPNSuMOjDvNkajD0A
+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
+
+--5aeb7b22_686b0f6c_5cb8--
+
+
+From mitja.krebs@tum.de Fri May  4 09:49:26 2018
+Return-Path: <mitja.krebs@tum.de>
+Delivered-To: <lammich@mailstore.informatik.tu-muenchen.de>
+Received: from vmmailstore1.informatik.tu-muenchen.de by
+ vmmailstore1.informatik.tu-muenchen.de (Dovecot) with LMTP id
+ 4FBdLi0Q7FqKCgAArPjJig for <lammich@mailstore.informatik.tu-muenchen.de>;
+ Fri, 04 May 2018 09:49:26 +0200
+Received: from vmmailproxy1.informatik.tu-muenchen.de
+ (vmmailproxy1.informatik.tu-muenchen.de [131.159.0.83]) by
+ vmmailstore1.informatik.tu-muenchen.de (Postfix) with ESMTP id CAE611C2029
+ for <lammich@mailstore.informatik.tu-muenchen.de>; Fri,  4 May 2018
+ 09:49:26 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de
+ (mailrelay1.informatik.tu-muenchen.de [131.159.254.14]) by
+ vmmailproxy1.informatik.tu-muenchen.de (Postfix) with ESMTP id C95591E012D
+ for <lammich@mail.informatik.tu-muenchen.de>; Fri,  4 May 2018 09:49:26
+ +0200 (CEST)
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix) id
+ C6D991C038B; Fri,  4 May 2018 09:49:26 +0200 (CEST)
+Delivered-To: peter.lammich@informatik.tu-muenchen.de
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id C48041C038A; Fri,  4 May 2018 09:49:26 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de (localhost
+ [127.0.0.1]) by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP
+ id 9F3101C037C for <lammich@in.tum.de>; Fri,  4 May 2018 09:49:26 +0200
+ (CEST)
+Received: from vmmaildmz2.informatik.tu-muenchen.de
+ (vmmaildmz2.informatik.tu-muenchen.de [131.159.0.88]) by
+ vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id 94AE11C037B
+ for <lammich@in.tum.de>; Fri,  4 May 2018 09:49:26 +0200 (CEST)
+Received: by vmmaildmz2.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id 935881C24C9; Fri,  4 May 2018 09:49:26 +0200 (CEST)
+X-Spam-Checker-Version: SpamAssassin 3.4.0-tuminfo_1 (2014-02-07) on
+ vmmaildmz2.informatik.tu-muenchen.de
+X-Spam-Level: 
+X-Spam-Status: No, score=-4.2 required=7.0 tests=BAYES_00,RCVD_IN_DNSWL_MED
+ autolearn=no autolearn_force=no version=3.4.0-tuminfo_1
+Received: from vmmaildmz2.informatik.tu-muenchen.de (localhost [127.0.0.1])
+ by vmmaildmz2.informatik.tu-muenchen.de (Postfix) with ESMTP id EBE321C24C7
+ for <lammich@in.tum.de>; Fri,  4 May 2018 09:49:24 +0200 (CEST)
+Received: from rmail.zv.tum.de (rmail.zv.tum.de [129.187.125.248]) by
+ vmmaildmz2.informatik.tu-muenchen.de (Postfix) with ESMTP id E0C771C24AD
+ for <lammich@in.tum.de>; Fri,  4 May 2018 09:49:24 +0200 (CEST)
+Message-ID: <-120981678.1525420138516.JavaMail.javamailuser@localhost>
+Date: Fri, 4 May 2018 09:48:58 +0200 (CEST)
+From: Mitja Daniel Krebs <mitja.krebs@tum.de>
+To: lammich@in.tum.de
+Subject: [FDS] homework 3 submission
+Mime-Version: 1.0
+Content-Type: multipart/mixed;  boundary="----=_Part_0_1179332346.1525420138515"
+X-Evolution-Source: 1479990504.8344.16@lapnipkow10
+
+
+------=_Part_0_1179332346.1525420138515
+Content-Type: text/plain; charset="utf-8"
+Content-Transfer-Encoding: 8bit
+
+Sehr geehrter Herr Dr. Lammich,
+
+anbei finden Sie meinen Lösungsvorschlag für die Hausaufgaben von Blatt 3.
+
+Mit freundlichen Grüßen
+Mitja Krebs
+------=_Part_0_1179332346.1525420138515
+Content-Type: application/octet-stream; name=tmpl03.thy
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename=tmpl03.thy
+
+KCo8KikKdGhlb3J5IHRtcGwwMwppbXBvcnRzIE1haW4gIn5+L3NyYy9IT0wvTGlicmFyeS9UcmVl
+IgpiZWdpbgooKj4qKQoKZnVuIGlzaW4gOjogIignYTo6bGlub3JkZXIpIHRyZWUgXDxSaWdodGFy
+cm93PiAnYSBcPFJpZ2h0YXJyb3c+IGJvb2wiIHdoZXJlCiAgImlzaW4gTGVhZiB4ID0gRmFsc2Ui
+CnwgImlzaW4gKE5vZGUgbCBhIHIpIHggPSAoCiAgIGlmIHggPCBhIHRoZW4gaXNpbiBsIHggZWxz
+ZQogICBpZiB4ID4gYSB0aGVuIGlzaW4gciB4CiAgIGVsc2UgVHJ1ZSkiCgpmdW4gaW5zIDo6ICIn
+YTo6bGlub3JkZXIgXDxSaWdodGFycm93PiAnYSB0cmVlIFw8UmlnaHRhcnJvdz4gJ2EgdHJlZSIg
+d2hlcmUKICAiaW5zIHggTGVhZiA9IE5vZGUgTGVhZiB4IExlYWYiCnwgImlucyB4IChOb2RlIGwg
+YSByKSA9ICgKICAgIGlmIHggPCBhIHRoZW4gTm9kZSAoaW5zIHggbCkgYSByIGVsc2UKICAgIGlm
+IHggPiBhIHRoZW4gTm9kZSBsIGEgKGlucyB4IHIpCiAgICBlbHNlIE5vZGUgbCBhIHIpIgoKbGVt
+bWEgc2V0X3RyZWVfaXNpbjogImJzdCB0IFw8TG9uZ3JpZ2h0YXJyb3c+IGlzaW4gdCB4ID0gKHgg
+XDxpbj4gc2V0X3RyZWUgdCkiCiAgYXBwbHkgKGluZHVjdGlvbiB0KQogIGFwcGx5IGF1dG8KICBk
+b25lCgpsZW1tYSBzZXRfdHJlZV9pbnM6ICJzZXRfdHJlZSAoaW5zIHggdCkgPSB7eH0gXDx1bmlv
+bj4gc2V0X3RyZWUgdCIKICBhcHBseSAoaW5kdWN0aW9uIHQpCiAgYXBwbHkgYXV0bwogIGRvbmUK
+CmxlbW1hIGJzdF9pbnM6ICJic3QgdCBcPExvbmdyaWdodGFycm93PiBic3QgKGlucyB4IHQpIgog
+IGFwcGx5IChpbmR1Y3Rpb24gdCkKICBhcHBseSAoYXV0byBzaW1wOiBzZXRfdHJlZV9pbnMpCiAg
+ZG9uZQoKdGV4dCB7KiBcRXhlcmNpc2VTaGVldHszfXsyNy5+NC5+MjAxOH0gKn0KCnRleHQgXDxv
+cGVuPgogIFxFeGVyY2lzZXtNZW1iZXJzaGlwIFRlc3Qgd2l0aCBMZXNzIENvbXBhcmlzb25zfQoK
+ICBJbiB3b3JzdCBjYXNlLCB0aGUgQHtjb25zdCBpc2lufSBmdW5jdGlvbiBwZXJmb3JtcyB0d28g
+Y29tcGFyaXNvbnMgcGVyIG5vZGUuCiAgSW4gdGhpcyBleGVyY2lzZSwgd2Ugd2FudCB0byByZWR1
+Y2UgdGhpcyB0byBvbmUgY29tcGFyaXNvbiBwZXIgbm9kZSwgd2l0aCB0aGUgCiAgZm9sbG93aW5n
+IGlkZWE6CiAgCiAgT25lIG5ldmVyIHRlc3RzIGZvciBcPG9wZW4+Plw8Y2xvc2U+LCBidXQgYWx3
+YXlzIGdvZXMgcmlnaHQgaWYgbm90IFw8b3Blbj48XDxjbG9zZT4uIAogIEhvd2V2ZXIsIG9uZSBy
+ZW1lbWJlcnMgdGhlIHZhbHVlIHdoZXJlIG9uZSBzaG91bGQgaGF2ZSB0ZXN0ZWQgZm9yIFw8b3Bl
+bj49XDxjbG9zZT4sCiAgYW5kIHBlcmZvcm1zIHRoZSBjb21wYXJpc29uIHdoZW4gYSBsZWFmIGlz
+IHJlYWNoZWQuClw8Y2xvc2U+CiAgICAgIApmdW4gaXNpbjIgOjogIignYTo6bGlub3JkZXIpIHRy
+ZWUgXDxSaWdodGFycm93PiAnYSBvcHRpb24gXDxSaWdodGFycm93PiAnYSBcPFJpZ2h0YXJyb3c+
+IGJvb2wiIHdoZXJlCiBcPGNvbW1lbnQ+IFw8b3Blbj5UaGUgc2Vjb25kIHBhcmFtZXRlciBzdG9y
+ZXMgdGhlIHZhbHVlIGZvciB0aGUgZGVmZXJyZWQgY29tcGFyaXNvblw8Y2xvc2U+CiAgImlzaW4y
+IExlYWYgeiB4ID0gKGNhc2UgeiBvZiBOb25lIFw8UmlnaHRhcnJvdz4gRmFsc2UgfCBTb21lIHkg
+XDxSaWdodGFycm93PiAoeCA9IHkpKSIKfCAiaXNpbjIgKE5vZGUgbCBhIHIpIHogeCA9CiAgICAo
+aWYgeCA8IGEgdGhlbiBpc2luMiBsIHogeCBlbHNlIGlzaW4yIHIgKFNvbWUgYSkgeCkiCgoKdGV4
+dCBcPG9wZW4+U2hvdyB0aGF0IHlvdXIgZnVuY3Rpb24gaXMgY29ycmVjdC4gCgogIEhpbnQ6IEF1
+eGlsaWFyeSBsZW1tYSBmb3IgXDxvcGVuPmlzaW4yIHQgKFNvbWUgeSkgeFw8Y2xvc2U+ICEKXDxj
+bG9zZT4KCmxlbW1hIGlzaW4yX1NvbWU6ICJcPGxicmFraz4gYnN0IHQ7IFw8Zm9yYWxsPnogXDxp
+bj4gc2V0X3RyZWUgdC4geSA8IHogXDxyYnJha2s+IFw8TG9uZ3JpZ2h0YXJyb3c+IGlzaW4yIHQg
+KFNvbWUgeSkgeCA9IChpc2luIHQgeCBcPG9yPiB5ID0geCkiCiAgYXBwbHkgKGluZHVjdGlvbiB0
+IGFyYml0cmFyeTogeSkKICBhcHBseSAoYXV0bykKICBkb25lCgpsZW1tYSBpc2luMl9Ob25lOiAi
+YnN0IHQgXDxMb25ncmlnaHRhcnJvdz4gaXNpbjIgdCBOb25lIHggPSBpc2luIHQgeCIKICBhcHBs
+eSAoaW5kdWN0aW9uIHQpCiAgYXBwbHkgKGF1dG8gc2ltcDogaXNpbjJfU29tZSkKICBkb25lCiAg
+ICAgIAp0ZXh0IFw8b3Blbj4KICBcRXhlcmNpc2V7SGVpZ2h0LVByZXNlcnZpbmcgSW4tT3JkZXIg
+Sm9pbn0KICBXcml0ZSBhIGZ1bmN0aW9uIHRoYXQgam9pbnMgdHdvIGJpbmFyeSB0cmVlcyBzdWNo
+IHRoYXQKICBcPF5pdGVtPiBUaGUgaW4tb3JkZXIgdHJhdmVyc2FsIG9mIHRoZSBuZXcgdHJlZSBp
+cyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgaW4tb3JkZXIgdHJhdmVyc2FscyBvZiB0aGUgb3Jp
+Z2luYWwgdHJlZQogIFw8Xml0ZW0+IFRoZSBuZXcgdHJlZSBpcyBhdCBtb3N0IG9uZSBoaWdoZXIg
+dGhhbiB0aGUgaGlnaGVzdCBvcmlnaW5hbCB0cmVlCgogIEhpbnQ6IE9uY2UgeW91IGdvdCB0aGUg
+ZnVuY3Rpb24gcmlnaHQsIHByb29mcyBhcmUgZWFzeSEKXDxjbG9zZT4gIApmdW4gam9pbiA6OiAi
+J2EgdHJlZSBcPFJpZ2h0YXJyb3c+ICdhIHRyZWUgXDxSaWdodGFycm93PiAnYSB0cmVlIiB3aGVy
+ZQogICJqb2luIExlYWYgdDIgPSB0MiIKfCAiam9pbiB0MSBMZWFmID0gdDEiCnwgImpvaW4gKE5v
+ZGUgbDEgYTEgcjEpIChOb2RlIGwyIGEyIHIyKSA9ICgKICAgIGNhc2Ugam9pbiByMSBsMiBvZgog
+ICAgICBMZWFmIFw8UmlnaHRhcnJvdz4gTm9kZSBsMSBhMSAoTm9kZSBMZWFmIGEyIHIyKQogICAg
+fCBOb2RlIGwgYSByIFw8UmlnaHRhcnJvdz4gTm9kZSAoTm9kZSBsMSBhMSBsKSBhIChOb2RlIHIg
+YTIgcjIpKSIKCmxlbW1hIGpvaW5faW5vcmRlcltzaW1wXTogImlub3JkZXIoam9pbiB0MSB0Mikg
+PSBpbm9yZGVyIHQxIEAgaW5vcmRlciB0MiIKICBhcHBseSAoaW5kdWN0aW9uIHQxIHQyIHJ1bGU6
+IGpvaW4uaW5kdWN0KQogIGFwcGx5IChhdXRvIHNwbGl0OiB0cmVlLnNwbGl0KQogIGRvbmUKCmxl
+bW1hICJoZWlnaHQoam9pbiB0MSB0MikgXDxsZT4gbWF4IChoZWlnaHQgdDEpIChoZWlnaHQgdDIp
+ICsgMSIKICBhcHBseSAoaW5kdWN0aW9uIHQxIHQyIHJ1bGU6IGpvaW4uaW5kdWN0KQogIGFwcGx5
+IChhdXRvIHNwbGl0OiB0cmVlLnNwbGl0KQogIGRvbmUKCnRleHQgXDxvcGVuPgogIFxFeGVyY2lz
+ZXtJbXBsZW1lbnQgRGVsZXRlfQogIEltcGxlbWVudCBkZWxldGUgdXNpbmcgdGhlIFw8b3Blbj5q
+b2luXDxjbG9zZT4gZnVuY3Rpb24gZnJvbSBsYXN0IGV4ZXJjaXNlLgpcPGNsb3NlPiAgCgp0ZXh0
+IFw8b3Blbj5Ob3RlOiBBdCB0aGlzIHBvaW50LCB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhl
+IGltcGxlbWVudGF0aW9uIGRldGFpbHMgCiAgb2Ygam9pbiBhbnkgbW9yZSwgYnV0IGp1c3QgaW4g
+aXRzIHNwZWNpZmljYXRpb24sIGkuZS4sIHdoYXQgaXQgZG9lcyB0byB0cmVlcy4KICBUaHVzLCBh
+cyBmaXJzdCBzdGVwLCB3ZSBkZWNsYXJlIGl0cyBlcXVhdGlvbnMgdG8gbm90IGJlaW5nIGF1dG9t
+YXRpY2FsbHkgdW5mb2xkZWQuClw8Y2xvc2U+CgpkZWNsYXJlIGpvaW4uc2ltcHNbc2ltcCBkZWxd
+Cgp0ZXh0IFw8b3Blbj5Cb3RoLCBcPG9wZW4+c2V0X3RyZWVcPGNsb3NlPiBhbmQgXDxvcGVuPmJz
+dFw8Y2xvc2U+IGNhbiBiZSBleHByZXNzZWQgYnkgdGhlIGlub3JkZXIgdHJhdmVyc2FsIG92ZXIg
+dHJlZXM6XDxjbG9zZT4KCnRobSBzZXRfaW5vcmRlcltzeW1tZXRyaWNdIGJzdF9pZmZfc29ydGVk
+X3dydF9sZXNzCgp0ZXh0IFw8b3Blbj5Ob3RlOiBBcyBAe3RobSBbc291cmNlXSBzZXRfaW5vcmRl
+cn0gaXMgZGVjbGFyZWQgYXMgc2ltcC4gCiAgQmUgY2FyZWZ1bCBub3QgdG8gaGF2ZSBib3RoIGRp
+cmVjdGlvbnMgb2YgdGhlIGxlbW1hIGluIHRoZSBzaW1wc2V0IGF0IHRoZSAKICBzYW1lIHRpbWUs
+IG90aGVyd2lzZSB0aGUgc2ltcGxpZmllciBpcyBsaWtlbHkgdG8gbG9vcC4KICAKICBZb3UgY2Fu
+IHVzZSBcPG9wZW4+c2ltcCBkZWw6IHNldF9pbm9yZGVyIGFkZDogc2V0X2lub3JkZXJbc3ltbWV0
+cmljXVw8Y2xvc2U+LCBvcgogIFw8b3Blbj5hdXRvIHNpbXAgZGVsOiBzZXRfaW5vcmRlciBzaW1w
+OiBzZXRfaW5vcmRlcltzeW1tZXRyaWNdXDxjbG9zZT4gdG8gCiAgdGVtcG9yYXJpbHkgcmVtb3Zl
+IHRoZSBsZW1tYSBmcm9tIHRoZSBzaW1wc2V0LgogIAogIEFsdGVybmF0aXZlbHksIHlvdSBjYW4g
+d3JpdGUgXDxvcGVuPmRlY2xhcmUgc2V0X2lub3JkZXJbc2ltcF9kZWxdXDxjbG9zZT4gdG8KICBy
+ZW1vdmUgaXQgb25jZSBhbmQgZm9yYWxsLgpcPGNsb3NlPgoKCnRleHQgIkZvciB0aGUgXDxvcGVu
+PnNvcnRlZF93cnRcPGNsb3NlPiBwcmVkaWNhdGUsIHlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGVz
+ZSBsZW1tYXMgYXMgc2ltcDoiCnRobSBzb3J0ZWRfd3J0X2FwcGVuZCBzb3J0ZWRfd3J0X0NvbnMK
+CmRlY2xhcmUgc2V0X2lub3JkZXJbc2ltcCBkZWxdCgp0ZXh0IFw8b3Blbj5TaG93IHRoYXQgam9p
+biBwcmVzZXJ2ZXMgdGhlIHNldCBvZiBlbnRyaWVzXDxjbG9zZT4KbGVtbWEgW3NpbXBdOiAic2V0
+X3RyZWUgKGpvaW4gdDEgdDIpID0gc2V0X3RyZWUgdDEgXDx1bmlvbj4gc2V0X3RyZWUgdDIiCiAg
+YnkgKHNpbXAgYWRkOiBzZXRfaW5vcmRlcltzeW1tZXRyaWNdKQoKdGV4dCBcPG9wZW4+U2hvdyB0
+aGF0IGpvaW5pbmcgdGhlIGxlZnQgYW5kIHJpZ2h0IGNoaWxkIG9mIGEgQlNUIGlzIGFnYWluIGEg
+QlNUOlw8Y2xvc2U+CgpsZW1tYSBbc2ltcF06ICJic3QgKE5vZGUgbCAoeDo6Xzo6bGlub3JkZXIp
+IHIpIFw8TG9uZ3JpZ2h0YXJyb3c+IGJzdCAoam9pbiBsIHIpIgogIGFwcGx5IChhdXRvIHNpbXAg
+YWRkOiBic3RfaWZmX3NvcnRlZF93cnRfbGVzcyBzb3J0ZWRfd3J0X2FwcGVuZCBzZXRfaW5vcmRl
+cltzeW1tZXRyaWNdKQogIGFwcGx5IGZhc3Rmb3JjZQogIGRvbmUKCgp0ZXh0IFw8b3Blbj5JbXBs
+ZW1lbnQgYSBkZWxldGUgZnVuY3Rpb24gdXNpbmcgdGhlIGlkZWEgY29udGFpbmVkIGluIHRoZSBs
+ZW1tYXMgYWJvdmUuXDxjbG9zZT4gIApmdW4gZGVsZXRlIDo6ICInYTo6bGlub3JkZXIgXDxSaWdo
+dGFycm93PiAnYSB0cmVlIFw8UmlnaHRhcnJvdz4gJ2EgdHJlZSIgCndoZXJlCiAgImRlbGV0ZSBf
+IF8gPSB1bmRlZmluZWQiCgp0ZXh0IFw8b3Blbj5Qcm92ZSBpdCBjb3JyZWN0ISBOb3RlOiBZb3Un
+bGwgbmVlZCB0aGUgZmlyc3QgbGVtbWEgdG8gcHJvdmUgdGhlIHNlY29uZCBvbmUhIFw8Y2xvc2U+
+ICAKbGVtbWEgW3NpbXBdOiAiYnN0IHQgXDxMb25ncmlnaHRhcnJvdz4gc2V0X3RyZWUgKGRlbGV0
+ZSB4IHQpID0gc2V0X3RyZWUgdCAtIHt4fSIKICBvb3BzCgpsZW1tYSAiYnN0IHQgXDxMb25ncmln
+aHRhcnJvdz4gYnN0IChkZWxldGUgeCB0KSIKICBvb3BzICAKCnRleHQgeyogXE51bUhvbWV3b3Jr
+e1RyZWUgQWRkcmVzc2luZ317TWF5IDR9ICp9CnRleHQgXDxvcGVuPgogIEEgcG9zaXRpb24gaW4g
+YSB0cmVlIGNhbiBiZSBnaXZlbiBhcyBhIGxpc3Qgb2YgCiAgbmF2aWdhdGlvbiBpbnN0cnVjdGlv
+bnMgZnJvbSB0aGUgcm9vdCwgaS5lLiwgd2hldGhlciB0byBnbyAKICB0byB0aGUgbGVmdCBvciBy
+aWdodCBzdWJ0cmVlLiBXZSBjYWxsIHN1Y2ggYSBsaXN0IGEgcGF0aC4KXDxjbG9zZT4KZGF0YXR5
+cGUgZGlyZWN0aW9uID0gTCB8IFIKdHlwZV9zeW5vbnltIHBhdGggPSAiZGlyZWN0aW9uIGxpc3Qi
+Cgp0ZXh0IFw8b3Blbj5TcGVjaWZ5IHdoZW4gYSBwYXRoIGlzIHZhbGlkOlw8Y2xvc2U+ICAKICAK
+ZnVuIHZhbGlkIDo6ICInYSB0cmVlIFw8UmlnaHRhcnJvdz4gcGF0aCBcPFJpZ2h0YXJyb3c+IGJv
+b2wiIHdoZXJlCiAgInZhbGlkIF8gW10gPSBUcnVlIgp8ICJ2YWxpZCBMZWFmIF8gPSBGYWxzZSIK
+fCAidmFsaWQgKE5vZGUgbCBfIHIpICh4I3hzKSA9ICgKICAgIGNhc2UgeCBvZgogICAgICBMIFw8
+UmlnaHRhcnJvdz4gdmFsaWQgbCB4cwogICAgfCBSIFw8UmlnaHRhcnJvdz4gdmFsaWQgciB4cyki
+CiAgCnRleHQgXDxvcGVuPlNwZWNpZnkgYSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHN1YnRyZWUg
+YWRkcmVzc2VkIGJ5IGEgZ2l2ZW4gcGF0aDpcPGNsb3NlPiAgCgpmdW4gZ2V0IDo6ICInYSB0cmVl
+IFw8UmlnaHRhcnJvdz4gcGF0aCBcPFJpZ2h0YXJyb3c+ICdhIHRyZWUiIHdoZXJlCiAgImdldCB0
+IFtdID0gdCIKfCAiZ2V0IChOb2RlIGwgXyByKSAoeCN4cykgPSAoCiAgICBjYXNlIHggb2YKICAg
+ICAgTCBcPFJpZ2h0YXJyb3c+IGdldCBsIHhzCiAgICB8IFIgXDxSaWdodGFycm93PiBnZXQgciB4
+cykiCnwgImdldCBfIF8gPSB1bmRlZmluZWQiIC0tIFw8b3Blbj5DYXRjaC1hbGwgY2xhdXNlIHRv
+IGdldCByaWQgb2YgbWlzc2luZyBwYXR0ZXJucyB3YXJuaW5nXDxjbG9zZT4KICAKICAKdGV4dCBc
+PG9wZW4+U3BlY2lmeSBhIGZ1bmN0aW9uIFw8b3Blbj5wdXQgdCBwIHNcPGNsb3NlPiwgdGhhdCBy
+ZXR1cm5zIFw8b3Blbj50XDxjbG9zZT4sIHdpdGggdGhlIHN1YnRyZWUgCiAgYXQgXDxvcGVuPnBc
+PGNsb3NlPiByZXBsYWNlZCBieSBcPG9wZW4+c1w8Y2xvc2U+LgpcPGNsb3NlPgpmdW4gcHV0IDo6
+ICInYSB0cmVlIFw8UmlnaHRhcnJvdz4gcGF0aCBcPFJpZ2h0YXJyb3c+ICdhIHRyZWUgXDxSaWdo
+dGFycm93PiAnYSB0cmVlIiB3aGVyZQogICJwdXQgXyBbXSBzID0gcyIKfCAicHV0IExlYWYgXyBf
+ID0gTGVhZiIKfCAicHV0IChOb2RlIGwgYSByKSAoeCN4cykgcyA9ICgKICAgIGNhc2UgeCBvZgog
+ICAgICBMIFw8UmlnaHRhcnJvdz4gTm9kZSAocHV0IGwgeHMgcykgYSByCiAgICB8IFIgXDxSaWdo
+dGFycm93PiBOb2RlIGwgYSAocHV0IHIgeHMgcykpIgoKdGV4dCBcPG9wZW4+U3BlY2lmeSB5b3Vy
+IGZ1bmN0aW9uIHN1Y2ggdGhhdCBpdCBkb2VzIG5vdGhpbmcgaWYgYW4gaW52YWxpZCBwYXRoIAog
+IGlzIGdpdmVuLCBhbmQgcHJvdmU6ICAKICBcPGNsb3NlPgoKbGVtbWEgcHV0X2ludmFsaWQ6ICJc
+PG5vdD52YWxpZCB0IHAgXDxMb25ncmlnaHRhcnJvdz4gcHV0IHQgcCBzID0gdCIKICBhcHBseSAo
+aW5kdWN0aW9uIHQgcCBzIHJ1bGU6IHB1dC5pbmR1Y3QpCiAgYXBwbHkgKGF1dG8gc3BsaXQ6IGRp
+cmVjdGlvbi5zcGxpdCkKICBkb25lCgp0ZXh0IFw8b3Blbj5Ob3RlOiB0aGlzIGNvbnZlbnRpb24g
+d2lsbCBzaW1wbGlmeSBzb21lIG9mIAogIHRoZSBsZW1tYXMsIHJlZHVjaW5nIHRoZSByZXF1aXJl
+ZCB2YWxpZGl0eSBwcmVjb25kaXRpb25zLgogIAogIFByb3ZlIHRoZSBmb2xsb3dpbmcgYWxnZWJy
+YWljIGxhd3Mgb24gXDxvcGVuPnB1dFw8Y2xvc2U+IGFuZCBcPG9wZW4+Z2V0XDxjbG9zZT4uIAog
+IEFkZCBwcmVjb25kaXRpb25zIG9mIHRoZSBmb3JtIFw8b3Blbj52YWxpZCB0IHBcPGNsb3NlPiB3
+aGVyZSBuZWVkZWQhCiAgXDxjbG9zZT4KCmxlbW1hIGdldF9wdXRbc2ltcF06ICJwdXQgdCBwIChn
+ZXQgdCBwKSA9IHQiCiAgYXBwbHkgKGluZHVjdGlvbiB0IHAgcnVsZTogZ2V0LmluZHVjdCkKICBh
+cHBseSAoYXV0byBzcGxpdDogZGlyZWN0aW9uLnNwbGl0KQogIGRvbmUKICAgIApsZW1tYSBwdXRf
+cHV0W3NpbXBdOiAicHV0IChwdXQgdCBwIHMpIHAgcycgPSBwdXQgdCBwIHMnIgogIGFwcGx5IChp
+bmR1Y3Rpb24gdCBwIHMgcnVsZTogcHV0LmluZHVjdCkKICBhcHBseSAoYXV0byBzcGxpdDogZGly
+ZWN0aW9uLnNwbGl0KQogIGRvbmUKCmxlbW1hIHB1dF9nZXRbc2ltcF06ICJ2YWxpZCB0IHAgXDxM
+b25ncmlnaHRhcnJvdz4gZ2V0IChwdXQgdCBwIHMpIHAgPSBzIgogIGFwcGx5IChpbmR1Y3Rpb24g
+dCBwIHMgcnVsZTogcHV0LmluZHVjdCkKICBhcHBseSAoYXV0byBzcGxpdDogZGlyZWN0aW9uLnNw
+bGl0KQogIGRvbmUKCmxlbW1hIHZhbGlkX3B1dFtzaW1wXTogInZhbGlkIHQgcCBcPExvbmdyaWdo
+dGFycm93PiB2YWxpZCAocHV0IHQgcCBzKSBwIgogIGFwcGx5IChpbmR1Y3Rpb24gdCBwIHMgcnVs
+ZTogcHV0LmluZHVjdCkKICBhcHBseSAoYXV0byBzcGxpdDogZGlyZWN0aW9uLnNwbGl0KQogIGRv
+bmUKICAgIAp0ZXh0IFw8b3Blbj4KICAgIFNob3cgdGhlIGZvbGxvd2luZyBsZW1tYXMgYWJvdXQg
+YXBwZW5kaW5nIHR3byBwYXRoczoKICBcPGNsb3NlPiAgCmxlbW1hIHZhbGlkX2FwcGVuZFtzaW1w
+XTogInZhbGlkIHQgKHBAcSkgXDxsb25nbGVmdHJpZ2h0YXJyb3c+IHZhbGlkIHQgcCBcPGFuZD4g
+dmFsaWQgKGdldCB0IHApIHEiCiAgYXBwbHkgKGluZHVjdGlvbiB0IHAgcnVsZTogZ2V0LmluZHVj
+dCkKICBhcHBseSAoYXV0byBzcGxpdDogZGlyZWN0aW9uLnNwbGl0KQogIGRvbmUKICAgIApsZW1t
+YSBnZXRfYXBwZW5kW3NpbXBdOiAidmFsaWQgdCBwIFw8TG9uZ3JpZ2h0YXJyb3c+IGdldCB0IChw
+QHEpID0gZ2V0IChnZXQgdCBwKSBxIgogIGFwcGx5IChpbmR1Y3Rpb24gdCBwIHJ1bGU6IGdldC5p
+bmR1Y3QpCiAgYXBwbHkgKGF1dG8gc3BsaXQ6IGRpcmVjdGlvbi5zcGxpdCkKICBkb25lCiAgICAK
+bGVtbWEgcHV0X2FwcGVuZFtzaW1wXTogInZhbGlkIHQgcCBcPExvbmdyaWdodGFycm93PiBwdXQg
+dCAocEBxKSBzID0gcHV0IHQgcCAocHV0IChnZXQgdCBwKSBxIHMpIgogIGFwcGx5IChpbmR1Y3Rp
+b24gdCBwIHJ1bGU6IGdldC5pbmR1Y3QpCiAgYXBwbHkgKGF1dG8gc3BsaXQ6IGRpcmVjdGlvbi5z
+cGxpdCkKICBkb25lCgoKdGV4dCB7KiBcTnVtSG9tZXdvcmt7UmVtZHVwc317TWF5IDR9ICp9Cgp0
+ZXh0IFw8b3Blbj5Zb3VyIHRhc2sgaXMgdG8gd3JpdGUgYSBmdW5jdGlvbiB0aGF0IHJlbW92ZXMg
+ZHVwbGljYXRlcyBmcm9tIGEgbGlzdCwgdXNpbmcgYSAKICBCU1QgdG8gZWZmaWNpZW50bHkgc3Rv
+cmUgdGhlIHNldCBvZiBhbHJlYWR5IGVuY291bnRlcmVkIGVsZW1lbnRzLgoKICBZb3UgbWF5IHdh
+bnQgdG8gc3RhcnQgd2l0aCBhbiBhdXhpbGlhcnkgZnVuY3Rpb24sIHRoYXQgdGFrZXMgdGhlIEJT
+VCB3aXRoIAogIHRoZSBlbGVtZW50cyBzZWVuIHNvIGZhciBhcyBhZGRpdGlvbmFsIGFyZ3VtZW50
+LCBhbmQgdGhlbiBkZWZpbmUgdGhlIGFjdHVhbCBmdW5jdGlvbi4KXDxjbG9zZT4KCmZ1biBic3Rf
+cmVtZHVwc19hdXggOjogIidhOjpsaW5vcmRlciB0cmVlIFw8UmlnaHRhcnJvdz4gJ2EgbGlzdCBc
+PFJpZ2h0YXJyb3c+ICdhIGxpc3QiIHdoZXJlCiAgImJzdF9yZW1kdXBzX2F1eCBfIFtdID0gW10i
+CnwgImJzdF9yZW1kdXBzX2F1eCB0ICh4I3hzKSA9ICgKICAgIGlmIGlzaW4gdCB4IHRoZW4gYnN0
+X3JlbWR1cHNfYXV4IHQgeHMKICAgIGVsc2UgeCNic3RfcmVtZHVwc19hdXggKGlucyB4IHQpIHhz
+KSIKCmRlZmluaXRpb24gImJzdF9yZW1kdXBzIHhzIFw8ZXF1aXY+IGJzdF9yZW1kdXBzX2F1eCBM
+ZWFmIHhzIgoKCnRleHQgXDxvcGVuPlNob3cgdGhhdCB5b3VyIGZ1bmN0aW9uIHByZXNlcnZlcyB0
+aGUgc2V0IG9mIGVsZW1lbnRzLCBhbmQgcmV0dXJucyBhIGxpc3QgCiAgd2l0aCBubyBkdXBsaWNh
+dGVzIChwcmVkaWNhdGUgXDxvcGVuPmRpc3RpbmN0XDxjbG9zZT4gaW4gSXNhYmVsbGUpLgogIEhp
+bnQ6IEdlbmVyYWxpemF0aW9uIQpcPGNsb3NlPgoKbGVtbWEgYXV4Ml8xOiAiYnN0IHQgXDxMb25n
+cmlnaHRhcnJvdz4gc2V0IChic3RfcmVtZHVwc19hdXggdCB4cykgPSBzZXQgeHMgLSBzZXRfdHJl
+ZSB0IgogIGFwcGx5IChpbmR1Y3Rpb24geHMgYXJiaXRyYXJ5OiB0KQogIGFwcGx5IChhdXRvIHNp
+bXA6IHNldF90cmVlX2lzaW4gc2V0X3RyZWVfaW5zIGJzdF9pbnMpCiAgZG9uZQoKbGVtbWEgInNl
+dCAoYnN0X3JlbWR1cHMgeHMpID0gc2V0IHhzIgogIHVuZm9sZGluZyBic3RfcmVtZHVwc19kZWYK
+ICBhcHBseSAoYXV0byBzaW1wOiBhdXgyXzEpCiAgZG9uZQoKbGVtbWEgYXV4Ml8yOiAiYnN0IHQg
+XDxMb25ncmlnaHRhcnJvdz4gZGlzdGluY3QgKGJzdF9yZW1kdXBzX2F1eCB0IHhzKSIKICBhcHBs
+eSAoaW5kdWN0aW9uIHhzIGFyYml0cmFyeTogdCkKICBhcHBseSAoYXV0byBzaW1wOiBzZXRfdHJl
+ZV9pbnMgYnN0X2lucyBhdXgyXzEpCiAgZG9uZQoKbGVtbWEgImRpc3RpbmN0IChic3RfcmVtZHVw
+cyB4cykiCiAgdW5mb2xkaW5nIGJzdF9yZW1kdXBzX2RlZgogIGFwcGx5IChhdXRvIHNpbXA6IGF1
+eDJfMikKICBkb25lCgp0ZXh0IFw8b3Blbj5BIGxpc3QgXDxvcGVuPnhzXDxjbG9zZT4gaXMgYSBz
+dWJsaXN0IG9mIFw8b3Blbj55c1w8Y2xvc2U+LAogIGlmIFw8b3Blbj54c1w8Y2xvc2U+IGNhbiBi
+ZSBwcm9kdWNlZCBmcm9tIFw8b3Blbj55c1w8Y2xvc2U+IGJ5IGRlbGV0aW5nIGFuIAogIGFyYml0
+cmFyeSBudW1iZXIgb2YgZWxlbWVudHMuCgogIERlZmluZSBhIGZ1bmN0aW9uIFw8b3Blbj5zdWJs
+aXN0IHhzIHlzXDxjbG9zZT4gdG8gY2hlY2sgd2hldGhlciBcPG9wZW4+eHNcPGNsb3NlPiBpcyBh
+IHN1Ymxpc3Qgb2YgXDxvcGVuPnlzXDxjbG9zZT4uClw8Y2xvc2U+CmZ1biBzdWJsaXN0IDo6ICIn
+YSBsaXN0IFw8UmlnaHRhcnJvdz4gJ2EgbGlzdCBcPFJpZ2h0YXJyb3c+IGJvb2wiIHdoZXJlCiAg
+InN1Ymxpc3QgW10gXyA9IFRydWUiCnwgInN1Ymxpc3QgXyBbXSA9IEZhbHNlIgp8ICJzdWJsaXN0
+ICh4I3hzKSAoeSN5cykgPSBzdWJsaXN0IChpZiB4ID0geSB0aGVuIHhzIGVsc2UgKHgjeHMpKSB5
+cyIKCnRleHQgXDxvcGVuPlNob3cgdGhhdCB5b3VyIHJlbWR1cHMgZnVuY3Rpb24gcHJvZHVjZXMg
+YSBzdWJsaXN0IG9mIHRoZSBvcmlnaW5hbCBsaXN0IQoKICBIaW50OiBHZW5lcmFsaXphdGlvbi4g
+QXV4aWxpYXJ5IGxlbW1hIHJlcXVpcmVkLgpcPGNsb3NlPgpsZW1tYSBhdXgyXzM6ICJ5IFw8bm90
+aW4+IHNldCB4cyBcPExvbmdyaWdodGFycm93PiBzdWJsaXN0IHhzIHlzIFw8TG9uZ3JpZ2h0YXJy
+b3c+IHN1Ymxpc3QgeHMgKHkjeXMpIgogIGFwcGx5IChpbmR1Y3Rpb24geHMpCiAgYXBwbHkgKGF1
+dG8pCiAgZG9uZQoKbGVtbWEgYXV4Ml80OiAiYnN0IHQgXDxMb25ncmlnaHRhcnJvdz4gc3VibGlz
+dCAoYnN0X3JlbWR1cHNfYXV4IHQgeHMpIHhzIgogIGFwcGx5IChpbmR1Y3Rpb24geHMgYXJiaXRy
+YXJ5OiB0KQogIGFwcGx5IChhdXRvIHNpbXA6IGF1eDJfMSBhdXgyXzMgc2V0X3RyZWVfaXNpbiBi
+c3RfaW5zKQogIGRvbmUKCmxlbW1hICJzdWJsaXN0IChic3RfcmVtZHVwcyB4cykgeHMiCiAgdW5m
+b2xkaW5nIGJzdF9yZW1kdXBzX2RlZgogIGFwcGx5IChhdXRvIHNpbXA6IGF1eDJfNCkKICBkb25l
+CiAKKCo8KikKZW5kCigqPiopCgo=
+------=_Part_0_1179332346.1525420138515--
+
+
+From s.griebel@tum.de Fri May  4 10:08:19 2018
+Return-Path: <s.griebel@tum.de>
+Delivered-To: <lammich@mailstore.informatik.tu-muenchen.de>
+Received: from vmmailstore1.informatik.tu-muenchen.de by
+ vmmailstore1.informatik.tu-muenchen.de (Dovecot) with LMTP id
+ wKClEaoU7FoPTAAArPjJig for <lammich@mailstore.informatik.tu-muenchen.de>;
+ Fri, 04 May 2018 10:08:19 +0200
+Received: from vmmailproxy1.informatik.tu-muenchen.de
+ (vmmailproxy1.informatik.tu-muenchen.de [131.159.0.83]) by
+ vmmailstore1.informatik.tu-muenchen.de (Postfix) with ESMTP id 0579F1C2029
+ for <lammich@mailstore.informatik.tu-muenchen.de>; Fri,  4 May 2018
+ 10:08:19 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de
+ (mailrelay1.informatik.tu-muenchen.de [131.159.254.14]) by
+ vmmailproxy1.informatik.tu-muenchen.de (Postfix) with ESMTP id 0401D1E012D
+ for <lammich@mail.informatik.tu-muenchen.de>; Fri,  4 May 2018 10:08:19
+ +0200 (CEST)
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix) id
+ 00FD51C038A; Fri,  4 May 2018 10:08:19 +0200 (CEST)
+Delivered-To: peter.lammich@informatik.tu-muenchen.de
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id F21CD1C038F; Fri,  4 May 2018 10:08:18 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de (localhost
+ [127.0.0.1]) by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP
+ id CD16B1C038B for <lammich@in.tum.de>; Fri,  4 May 2018 10:08:18 +0200
+ (CEST)
+Received: from vmmaildmz1.informatik.tu-muenchen.de
+ (vmmaildmz1.informatik.tu-muenchen.de [131.159.0.87]) by
+ vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id C25811C038A
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:08:18 +0200 (CEST)
+Received: by vmmaildmz1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id A9F6E1C2DB6; Fri,  4 May 2018 10:08:18 +0200 (CEST)
+X-Spam-Checker-Version: SpamAssassin 3.4.0-tuminfo_1 (2014-02-07) on
+ vmmaildmz1.informatik.tu-muenchen.de
+X-Spam-Level: 
+X-Spam-Status: No, score=-4.3 required=7.0 tests=AWL,BAYES_00,DKIM_SIGNED,
+ DKIM_VALID,DKIM_VALID_AU,HTML_MESSAGE,RCVD_IN_DNSWL_MED autolearn=no
+ autolearn_force=no version=3.4.0-tuminfo_1
+Received: from vmmaildmz1.informatik.tu-muenchen.de (localhost [127.0.0.1])
+ by vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTP id F3CC31C2DB4
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:08:16 +0200 (CEST)
+Received: from postout2.mail.lrz.de (postout2.mail.lrz.de
+ [129.187.255.138]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256
+ bits)) (No client certificate requested) by
+ vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTPS id E94C21C2D9F
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:08:16 +0200 (CEST)
+Received: from lxmhs52.srv.lrz.de (localhost [127.0.0.1]) by
+ postout2.mail.lrz.de (Postfix) with ESMTP id 40cl4w6PrzzySy for
+ <lammich@in.tum.de>; Fri,  4 May 2018 10:08:16 +0200 (CEST)
+Authentication-Results: postout.lrz.de (amavisd-new); dkim=pass (2048-bit
+ key) reason="pass (just generated, assumed good)" header.d=tum.de
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tum.de; h=
+ mime-version:content-type:content-type:content-language
+ :accept-language:message-id:date:date:subject:subject:from:from
+ :received:received:received:received; s=postout; t=1525421296;
+ bh=Nsxjok1G6JzlXXUmHyPYJuF4D4P7MEwnjk2cXbOmf1k=; b=QRo/9QYvdro4
+ r89wfQeqYYZbShRX1kw0ZxqwaG1KVCzrnfqaMaea8q+7FkjyOUpD5Om8U8SWNsgL
+ bjF89HNsOCyCZNe2HYhNU4VDB1qpIsHwV/6UFkJ7kJwipIlCZeVwjCVp6KNloMoa
+ ilesDDv/Thic+6XvikN42gt4Q4QvhidEUbrbAMFdadnkhXhs3jznO9E0OjsuVwkO
+ Q3NYaSSJvavIXDUZbWWRrH0+rZOM0vTVERGrBmnZppQOjP74PixHbMtiJTe5IJvI
+ MJMbUpMyQaI6sUraBIiQl0YBddSd0QanG9575kqd7cppyROp8VRZzU1u4uzmTihJ
+ OCqKJEKyqg==
+X-Virus-Scanned: by amavisd-new at lrz.de in lxmhs52.srv.lrz.de
+Received: from postout2.mail.lrz.de ([127.0.0.1]) by lxmhs52.srv.lrz.de
+ (lxmhs52.srv.lrz.de [127.0.0.1]) (amavisd-new, port 20024) with LMTP id
+ F6jutI9rHRft for <lammich@in.tum.de>; Fri,  4 May 2018 10:08:16 +0200 (CEST)
+Received: from BADWLRZ-SWMBX09.ads.mwn.de (BADWLRZ-SWMBX09.ads.mwn.de
+ [IPv6:2001:4ca0:0:108::165]) (using TLSv1.2 with cipher
+ ECDHE-RSA-AES256-SHA384 (256/256 bits)) (Client CN "BADWLRZ-SWMBX09",
+ Issuer "BADWLRZ-SWMBX09" (not verified)) by postout2.mail.lrz.de (Postfix)
+ with ESMTPS id 40cl4w4P24zyRg for <lammich@in.tum.de>; Fri,  4 May 2018
+ 10:08:16 +0200 (CEST)
+Received: from BADWLRZ-SWMBX01.ads.mwn.de (2001:4ca0:0:108::157) by
+ BADWLRZ-SWMBX09.ads.mwn.de (2001:4ca0:0:108::165) with Microsoft SMTP
+ Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256)
+ id 15.1.1466.3; Fri, 4 May 2018 10:08:15 +0200
+Received: from BADWLRZ-SWMBX01.ads.mwn.de ([fe80::7d02:f283:edbd:b19c]) by
+ BADWLRZ-SWMBX01.ads.mwn.de ([fe80::7d02:f283:edbd:b19c%12]) with mapi id
+ 15.01.1466.003; Fri, 4 May 2018 10:08:15 +0200
+From: "Griebel, Simon" <s.griebel@tum.de>
+To: "lammich@in.tum.de" <lammich@in.tum.de>
+Subject: [FDS] Homework 3
+Thread-Topic: [FDS] Homework 3
+Thread-Index: AQHT43xfL84RWdX0/0645BeXrlbpEA==
+Date: Fri, 4 May 2018 08:08:15 +0000
+Message-ID: <2748855447f94fbfbf730bf677b71007@tum.de>
+Accept-Language: de-DE, en-US
+Content-Language: de-DE
+X-MS-Exchange-Organization-AuthAs: Internal
+X-MS-Exchange-Organization-AuthMechanism: 04
+X-MS-Exchange-Organization-AuthSource: BADWLRZ-SWMBX01.ads.mwn.de
+X-MS-Has-Attach: yes
+X-MS-TNEF-Correlator: 
+x-originating-ip: [2001:4ca0:2fff:1::d1]
+Content-Type: multipart/mixed; boundary="_004_2748855447f94fbfbf730bf677b71007tumde_"
+MIME-Version: 1.0
+X-Evolution-Source: 1479990504.8344.16@lapnipkow10
+
+
+--_004_2748855447f94fbfbf730bf677b71007tumde_
+Content-Type: multipart/alternative; boundary="_000_2748855447f94fbfbf730bf677b71007tumde_"
+
+
+--_000_2748855447f94fbfbf730bf677b71007tumde_
+Content-Type: text/plain; charset="iso-8859-1"
+Content-Transfer-Encoding: 8bit
+
+Hallo Peter,
+
+anbei befindet sich meine Lsung fr die Hausaufgabe auf Blatt 3.
+
+
+Gre,
+
+Simon Griebel
+
+--_000_2748855447f94fbfbf730bf677b71007tumde_
+Content-Type: text/html; charset="iso-8859-1"
+Content-Transfer-Encoding: 8bit
+
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
+</head>
+<body dir="ltr">
+<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
+<p>Hallo Peter,</p>
+<p>anbei befindet sich meine Lsung fr die Hausaufgabe auf Blatt 3.</p>
+<p><br>
+</p>
+<p>Gre,</p>
+<p>Simon Griebel<br>
+</p>
+</div>
+</body>
+</html>
+
+--_000_2748855447f94fbfbf730bf677b71007tumde_--
+
+--_004_2748855447f94fbfbf730bf677b71007tumde_
+Content-Type: application/octet-stream; name="homework3.thy"
+Content-Description: homework3.thy
+Content-Disposition: attachment; filename="homework3.thy"; size=6475; creation-date="Fri, 04 May 2018 08:06:43 GMT"; modification-date="Fri, 04 May 2018 08:06:43 GMT"
+Content-Transfer-Encoding: base64
+
+KCo8KikKdGhlb3J5IGhvbWV3b3JrMwppbXBvcnRzICIuLi9mZHNfc3MxOC9EZW1vcy9CU1RfRGVt
+byIgCmJlZ2luCigqPiopCnRleHQgeyogXE51bUhvbWV3b3Jre1RyZWUgQWRkcmVzc2luZ317TWF5
+IDR9ICp9CnRleHQgXDxvcGVuPgogIEEgcG9zaXRpb24gaW4gYSB0cmVlIGNhbiBiZSBnaXZlbiBh
+cyBhIGxpc3Qgb2YgCiAgbmF2aWdhdGlvbiBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgcm9vdCwgaS5l
+Liwgd2hldGhlciB0byBnbyAKICB0byB0aGUgbGVmdCBvciByaWdodCBzdWJ0cmVlLiBXZSBjYWxs
+IHN1Y2ggYSBsaXN0IGEgcGF0aC4KXDxjbG9zZT4KICBkYXRhdHlwZSBkaXJlY3Rpb24gPSBMIHwg
+UgogIHR5cGVfc3lub255bSBwYXRoID0gImRpcmVjdGlvbiBsaXN0IgoKdGV4dCBcPG9wZW4+U3Bl
+Y2lmeSB3aGVuIGEgcGF0aCBpcyB2YWxpZDpcPGNsb3NlPiAgCiAgCiAgZnVuIHZhbGlkIDo6ICIn
+YSB0cmVlIFw8UmlnaHRhcnJvdz4gcGF0aCBcPFJpZ2h0YXJyb3c+IGJvb2wiIHdoZXJlCiAgICAi
+dmFsaWQgXyBbXSA9IFRydWUiCiAgfCAidmFsaWQgTGVhZiAoZCNkcykgPSBGYWxzZSIKICB8ICJ2
+YWxpZCAoTm9kZSBsIGEgcikgKGQjZHMpID0gCiAgICAgIChpZiBkID0gTCB0aGVuIHZhbGlkIGwg
+ZHMgZWxzZSB2YWxpZCByIGRzKSIKICAKdGV4dCBcPG9wZW4+U3BlY2lmeSBhIGZ1bmN0aW9uIHRv
+IHJldHVybiB0aGUgc3VidHJlZSBhZGRyZXNzZWQgYnkgYSBnaXZlbiBwYXRoOlw8Y2xvc2U+ICAK
+ICBmdW4gZ2V0IDo6ICInYSB0cmVlIFw8UmlnaHRhcnJvdz4gcGF0aCBcPFJpZ2h0YXJyb3c+ICdh
+IHRyZWUiIAogICAgd2hlcmUKICAgICAgImdldCB0IFtdID0gdCIgCiAgICB8ICJnZXQgTGVhZiAo
+ZCNkcykgPSBMZWFmIgogICAgfCAiZ2V0IChOb2RlIGwgYSByKSAoZCNkcykgPSAKICAgICAgICAo
+aWYgZCA9IEwgdGhlbiBnZXQgbCBkcyBlbHNlIGdldCByIGRzKSIKCiAgdmFsdWUgImdldCAoTm9k
+ZSBMZWFmICgxOjppbnQpIExlYWYpIFtdIgogIHZhbHVlICJnZXQgKE5vZGUgTGVhZiAoMTo6aW50
+KSBMZWFmKSBbTF0iCiAgdmFsdWUgImdldCAoTm9kZSBMZWFmICgxOjppbnQpIExlYWYpIFtMLCBS
+XSIKICB2YWx1ZSAiZ2V0IChOb2RlIExlYWYgKDE6OmludCkgKE5vZGUgTGVhZiAyIExlYWYpKSBb
+Ul0iCiAgCnRleHQgXDxvcGVuPlNwZWNpZnkgYSBmdW5jdGlvbiBcPG9wZW4+cHV0IHQgcCBzXDxj
+bG9zZT4sIHRoYXQgcmV0dXJucyBcPG9wZW4+dFw8Y2xvc2U+LCB3aXRoIHRoZSBzdWJ0cmVlIAog
+IGF0IFw8b3Blbj5wXDxjbG9zZT4gcmVwbGFjZWQgYnkgXDxvcGVuPnNcPGNsb3NlPi4KXDxjbG9z
+ZT4KICBmdW4gcHV0IDo6ICInYSB0cmVlIFw8UmlnaHRhcnJvdz4gcGF0aCBcPFJpZ2h0YXJyb3c+
+ICdhIHRyZWUgXDxSaWdodGFycm93PiAnYSB0cmVlIiAKICAgIHdoZXJlIAogICAgICAicHV0IHQg
+W10gcyA9IHMiCiAgICB8ICJwdXQgTGVhZiAoZCNkcykgXyA9IExlYWYiCiAgICB8ICJwdXQgKE5v
+ZGUgbCBhIHIpIChkI2RzKSBzID0gCiAgICAgICAgKGlmIGQgPSBMIHRoZW4gKE5vZGUgKHB1dCBs
+IGRzIHMpIGEgcikgCiAgICAgICAgIGVsc2UgKE5vZGUgbCBhIChwdXQgciBkcyBzKSkpIgoKdGV4
+dCBcPG9wZW4+U3BlY2lmeSB5b3VyIGZ1bmN0aW9uIHN1Y2ggdGhhdCBpdCBkb2VzIG5vdGhpbmcg
+aWYgYW4gaW52YWxpZCBwYXRoIAogIGlzIGdpdmVuLCBhbmQgcHJvdmU6ICAKICBcPGNsb3NlPgoK
+bGVtbWEgcHV0X2ludmFsaWQ6ICJcPG5vdD52YWxpZCB0IHAgXDxMb25ncmlnaHRhcnJvdz4gcHV0
+IHQgcCBzID0gdCIKICBhcHBseShpbmR1Y3Rpb24gcCBydWxlOiB2YWxpZC5pbmR1Y3QpCiAgYnkg
+YXV0bwoKdGV4dCBcPG9wZW4+Tm90ZTogdGhpcyBjb252ZW50aW9uIHdpbGwgc2ltcGxpZnkgc29t
+ZSBvZiAKICB0aGUgbGVtbWFzLCByZWR1Y2luZyB0aGUgcmVxdWlyZWQgdmFsaWRpdHkgcHJlY29u
+ZGl0aW9ucy4KICAKICBQcm92ZSB0aGUgZm9sbG93aW5nIGFsZ2VicmFpYyBsYXdzIG9uIFw8b3Bl
+bj5wdXRcPGNsb3NlPiBhbmQgXDxvcGVuPmdldFw8Y2xvc2U+LiAKICBBZGQgcHJlY29uZGl0aW9u
+cyBvZiB0aGUgZm9ybSBcPG9wZW4+dmFsaWQgdCBwXDxjbG9zZT4gd2hlcmUgbmVlZGVkIQogIFw8
+Y2xvc2U+CgpsZW1tYSBnZXRfcHV0W3NpbXBdOiAicHV0IHQgcCAoZ2V0IHQgcCkgPSB0IgogIGFw
+cGx5KGluZHVjdGlvbiBwIHJ1bGU6IGdldC5pbmR1Y3QpCiAgYnkgYXV0bwogICAgCmxlbW1hIHB1
+dF9wdXRbc2ltcF06ICJwdXQgKHB1dCB0IHAgcykgcCBzJyA9IHB1dCB0IHAgcyciICAgIAogIGFw
+cGx5KGluZHVjdGlvbiBwIGFyYml0cmFyeTogcycgcyBydWxlOiB2YWxpZC5pbmR1Y3QpCiAgYnkg
+YXV0bwoKKCoKVGhlIHZhbGlkIHByZWNvbmRpdGlvbiBpcyBuZWVkZWQgaGVyZSBzaW5jZSBpZiBw
+IGlzIGFuIGludmFsaWQgcGF0aCBvbiB0CnRoZW4gcHV0IHdpbGwgcmV0dXJuIHQgYW5kIG5vdCBz
+LCBzbyBnZXQgY2FuIG5ldmVyIHJldHVybiBzCiopCmxlbW1hIHB1dF9nZXRbc2ltcF06ICJ2YWxp
+ZCB0IHAgXDxMb25ncmlnaHRhcnJvdz4gZ2V0IChwdXQgdCBwIHMpIHAgPSBzIgogIGFwcGx5KGlu
+ZHVjdGlvbiBwIGFyYml0cmFyeTogcyAgcnVsZTogdmFsaWQuaW5kdWN0KQogIGJ5IGF1dG8KCigq
+ClRoZSB2YWxpZCBwcmVjb25kaXRpb24gaXMgbmVlZGVkIGhlcmUgc2luY2UgaWYgcCBpcyBhbiBp
+bnZhbGlkIHBhdGggb24gdAp0aGVuIHB1dCB3aWxsIHJldHVybiB0IGJ1dCBwIHdpbGwgb2YgY291
+cnNlIHN0aWxsIGJlIGludmFsaWQKKikKbGVtbWEgdmFsaWRfcHV0W3NpbXBdOiAidmFsaWQgdCBw
+IFw8TG9uZ3JpZ2h0YXJyb3c+IHZhbGlkIChwdXQgdCBwIHMpIHAiCiAgYXBwbHkoaW5kdWN0aW9u
+IHAgYXJiaXRyYXJ5OiBzIHJ1bGU6IHZhbGlkLmluZHVjdCkKICBieSBhdXRvCiAgICAKICB0ZXh0
+IFw8b3Blbj4KICAgIFNob3cgdGhlIGZvbGxvd2luZyBsZW1tYXMgYWJvdXQgYXBwZW5kaW5nIHR3
+byBwYXRoczoKICBcPGNsb3NlPiAgCgpsZW1tYSB2YWxpZF9hcHBlbmRbc2ltcF06ICJ2YWxpZCB0
+IChwQHEpIFw8bG9uZ2xlZnRyaWdodGFycm93PiB2YWxpZCB0IHAgXDxhbmQ+IHZhbGlkIChnZXQg
+dCBwKSBxIgogIGFwcGx5KGluZHVjdGlvbiB0IHAgcnVsZTogdmFsaWQuaW5kdWN0KQogIGJ5IGF1
+dG8KICAgIApsZW1tYSBnZXRfYXBwZW5kW3NpbXBdOiAidmFsaWQgdCBwIFw8TG9uZ3JpZ2h0YXJy
+b3c+IGdldCB0IChwQHEpID0gZ2V0IChnZXQgdCBwKSBxIgogIGFwcGx5KGluZHVjdCB0IHAgcnVs
+ZTogdmFsaWQuaW5kdWN0KQogIGJ5IGF1dG8KCmxlbW1hIHB1dF9hcHBlbmRbc2ltcF06ICJwdXQg
+dCAocEBxKSBzID0gcHV0IHQgcCAocHV0IChnZXQgdCBwKSBxIHMpIgogIGFwcGx5KGluZHVjdCB0
+IHAgcnVsZTogdmFsaWQuaW5kdWN0KQogIGJ5IGF1dG8KCnRleHQgeyogXE51bUhvbWV3b3Jre1Jl
+bWR1cHN9e01heSA0fSAqfQoKdGV4dCBcPG9wZW4+WW91ciB0YXNrIGlzIHRvIHdyaXRlIGEgZnVu
+Y3Rpb24gdGhhdCByZW1vdmVzIGR1cGxpY2F0ZXMgZnJvbSBhIGxpc3QsIHVzaW5nIGEgCiAgQlNU
+IHRvIGVmZmljaWVudGx5IHN0b3JlIHRoZSBzZXQgb2YgYWxyZWFkeSBlbmNvdW50ZXJlZCBlbGVt
+ZW50cy4KCiAgWW91IG1heSB3YW50IHRvIHN0YXJ0IHdpdGggYW4gYXV4aWxpYXJ5IGZ1bmN0aW9u
+LCB0aGF0IHRha2VzIHRoZSBCU1Qgd2l0aCAKICB0aGUgZWxlbWVudHMgc2VlbiBzbyBmYXIgYXMg
+YWRkaXRpb25hbCBhcmd1bWVudCwgYW5kIHRoZW4gZGVmaW5lIHRoZSBhY3R1YWwgZnVuY3Rpb24u
+Clw8Y2xvc2U+CgpmdW4gYnN0X3JlbWR1cHNfYXV4IDo6ICInYTo6bGlub3JkZXIgdHJlZSBcPFJp
+Z2h0YXJyb3c+ICdhIGxpc3QgXDxSaWdodGFycm93PiAnYSBsaXN0IiB3aGVyZSAKICAiYnN0X3Jl
+bWR1cHNfYXV4IF8gW10gPSBbXSIKfCAiYnN0X3JlbWR1cHNfYXV4IHQgKHgjeHMpID0gKAogICAg
+aWYgKGlzaW4gdCB4KSB0aGVuIChic3RfcmVtZHVwc19hdXggdCB4cykgICAKICAgIGVsc2UgeCMo
+YnN0X3JlbWR1cHNfYXV4IChpbnMgeCB0KSB4cykpIgoKdGhtIGJzdF9yZW1kdXBzX2F1eC5zaW1w
+cwoKZGVmaW5pdGlvbiAiYnN0X3JlbWR1cHMgeHMgXDxlcXVpdj4gYnN0X3JlbWR1cHNfYXV4IExl
+YWYgeHMiCgoKdGV4dCBcPG9wZW4+U2hvdyB0aGF0IHlvdXIgZnVuY3Rpb24gcHJlc2VydmVzIHRo
+ZSBzZXQgb2YgZWxlbWVudHMsIGFuZCByZXR1cm5zIGEgbGlzdCAKICB3aXRoIG5vIGR1cGxpY2F0
+ZXMgKHByZWRpY2F0ZSBcPG9wZW4+ZGlzdGluY3RcPGNsb3NlPiBpbiBJc2FiZWxsZSkuCiAgSGlu
+dDogR2VuZXJhbGl6YXRpb24hClw8Y2xvc2U+CgoKbGVtbWEgYnN0X3JlbWR1cHNfc2V0X2dlbltz
+aW1wXToiYnN0IHQgXDxMb25ncmlnaHRhcnJvdz4gc2V0IChic3RfcmVtZHVwc19hdXggdCB4cykg
+PSBzZXQgeHMgLSBzZXRfdHJlZSB0IgogIGFwcGx5KGluZHVjdGlvbiB0IHhzIHJ1bGU6IGJzdF9y
+ZW1kdXBzX2F1eC5pbmR1Y3QpIAogIGJ5IChhdXRvIHNpbXAgYWRkOiBzZXRfdHJlZV9pc2luIGJz
+dF9pbnMgc2V0X3RyZWVfaW5zKQoKbGVtbWEgInNldCAoYnN0X3JlbWR1cHMgeHMpID0gc2V0IHhz
+IgogIGJ5IChzaW1wIGFkZDogYnN0X3JlbWR1cHNfZGVmKQoKCmxlbW1hIGJzdF9yZW1kdXBzX2F1
+eF9kaXN0aW5jdDogImJzdCB0IFw8TG9uZ3JpZ2h0YXJyb3c+IGRpc3RpbmN0IChic3RfcmVtZHVw
+c19hdXggdCB4cykiCiAgYXBwbHkoaW5kdWN0aW9uIHQgeHMgcnVsZTogYnN0X3JlbWR1cHNfYXV4
+LmluZHVjdCkgCiAgYnkgKGF1dG8gc2ltcCBhZGQ6IGJzdF9pbnMgc2V0X3RyZWVfaW5zKQoKbGVt
+bWEgImRpc3RpbmN0IChic3RfcmVtZHVwcyB4cykiCiAgYXBwbHkoc2ltcCBhZGQ6IGJzdF9yZW1k
+dXBzX2RlZikKICBieSAoc2ltcCBhZGQ6IGJzdF9yZW1kdXBzX2F1eF9kaXN0aW5jdCkKICAKCnRl
+eHQgXDxvcGVuPkEgbGlzdCBcPG9wZW4+eHNcPGNsb3NlPiBpcyBhIHN1Ymxpc3Qgb2YgXDxvcGVu
+PnlzXDxjbG9zZT4sCiAgaWYgXDxvcGVuPnhzXDxjbG9zZT4gY2FuIGJlIHByb2R1Y2VkIGZyb20g
+XDxvcGVuPnlzXDxjbG9zZT4gYnkgZGVsZXRpbmcgYW4gCiAgYXJiaXRyYXJ5IG51bWJlciBvZiBl
+bGVtZW50cy4KCiAgRGVmaW5lIGEgZnVuY3Rpb24gXDxvcGVuPnN1Ymxpc3QgeHMgeXNcPGNsb3Nl
+PiB0byBjaGVjayB3aGV0aGVyIFw8b3Blbj54c1w8Y2xvc2U+IGlzIGEgc3VibGlzdCBvZiBcPG9w
+ZW4+eXNcPGNsb3NlPi4KXDxjbG9zZT4KCmZ1biBzdWJsaXN0IDo6ICInYSBsaXN0IFw8UmlnaHRh
+cnJvdz4gJ2EgbGlzdCBcPFJpZ2h0YXJyb3c+IGJvb2wiIAogIHdoZXJlCiAgInN1Ymxpc3QgW10g
+bCA9IFRydWUiCnwgInN1Ymxpc3QgXyBbXSA9IEZhbHNlIgp8ICJzdWJsaXN0ICh4I3hzKSAoeSN5
+cykgPSAKICAgICgoKHggPSB5KSBcPGFuZD4gc3VibGlzdCB4cyB5cykgXDxvcj4gc3VibGlzdCAo
+eCN4cykgeXMpIgoKKCpPcmdpbmlhbGx5IEkgaGFkIHRoZSBmb2xsb3dpbmcgaWYgZXhwcmVzc2lv
+biBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlLiBTaW5jZSBpdCBJIHdhc24ndAphYmxlIHRvIHByb3Zl
+IHRoZSBzdWJsaXN0X2NvbnMgbGVtbWEgSSBleHBlcmltZW50ZWQgYW5kIHJlcGxhY2VkIGl0IHdp
+dGggdGhlIGN1cnJlbnQgZXhwcmVzc2lvbi4gClRoZSBmb2xsb3dpbmcgbGVtbWEgc2hvd3MgdGhh
+dCBib3RoIGFyZSBlcXVpdmFsZW50LiopCmxlbW1hICIoaWYgKHggPSB5KSB0aGVuIHN1Ymxpc3Qg
+eHMgeXMgZWxzZSBzdWJsaXN0ICh4I3hzKSB5cykgPSAKICAgICAgICAoKHggPSB5KSBcPGFuZD4g
+c3VibGlzdCB4cyB5cykgXDxvcj4gc3VibGlzdCAoeCN4cykgeXMiCiAgYXBwbHkoaW5kdWN0aW9u
+IHhzIHlzIHJ1bGU6IHN1Ymxpc3QuaW5kdWN0KQogIGJ5IGF1dG8KCnZhbHVlICJzdWJsaXN0IFsy
+LDZdIFsxOjppbnQsMiwzLDQsNSw2XSIKdmFsdWUgInN1Ymxpc3QgWzYsMl0gWzE6OmludCwyLDMs
+NCw1LDZdIgp2YWx1ZSAic3VibGlzdCBbXSBbMTo6aW50LDIsMyw0LDUsNl0iCgp0ZXh0IFw8b3Bl
+bj5TaG93IHRoYXQgeW91ciByZW1kdXBzIGZ1bmN0aW9uIHByb2R1Y2VzIGEgc3VibGlzdCBvZiB0
+aGUgb3JpZ2luYWwgbGlzdCEKCiAgSGludDogR2VuZXJhbGl6YXRpb24uIEF1eGlsaWFyeSBsZW1t
+YSByZXF1aXJlZC4KXDxjbG9zZT4KCmxlbW1hIHN1Ymxpc3RfY29uczogInN1Ymxpc3QgeHMgeXMg
+XDxMb25ncmlnaHRhcnJvdz4gc3VibGlzdCB4cyAoeSN5cykiCiAgYXBwbHkoaW5kdWN0aW9uIHhz
+KQogIGJ5IGF1dG8KCmxlbW1hIHN1Ymxpc3RfYnN0X3JlbWR1cHNfYXV4W3NpbXBdOiAic3VibGlz
+dCAoYnN0X3JlbWR1cHNfYXV4IHQgeHMpIHhzIgogIGFwcGx5KGluZHVjdGlvbiB0IHhzIHJ1bGU6
+IGJzdF9yZW1kdXBzX2F1eC5pbmR1Y3QpCiAgYnkgKGF1dG8gc2ltcCBhZGQ6IHN1Ymxpc3RfY29u
+cykKCmxlbW1hICJzdWJsaXN0IChic3RfcmVtZHVwcyB4cykgeHMiCiAgYnkgKGF1dG8gc2ltcDog
+YnN0X3JlbWR1cHNfZGVmKQogCigqPCopCmVuZAooKj4qKQ==
+
+--_004_2748855447f94fbfbf730bf677b71007tumde_--
+
+From sabine.rieder@tum.de Fri May  4 10:19:35 2018
+Return-Path: <sabine.rieder@tum.de>
+Delivered-To: <lammich@mailstore.informatik.tu-muenchen.de>
+Received: from vmmailstore1.informatik.tu-muenchen.de by
+ vmmailstore1.informatik.tu-muenchen.de (Dovecot) with LMTP id
+ OaE1NjYX7FqAcgAArPjJig for <lammich@mailstore.informatik.tu-muenchen.de>;
+ Fri, 04 May 2018 10:19:35 +0200
+Received: from vmmailproxy1.informatik.tu-muenchen.de
+ (vmmailproxy1.informatik.tu-muenchen.de [131.159.0.83]) by
+ vmmailstore1.informatik.tu-muenchen.de (Postfix) with ESMTP id 4B99F1C2029
+ for <lammich@mailstore.informatik.tu-muenchen.de>; Fri,  4 May 2018
+ 10:19:35 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de
+ (mailrelay1.informatik.tu-muenchen.de [131.159.254.14]) by
+ vmmailproxy1.informatik.tu-muenchen.de (Postfix) with ESMTP id 4A3A51E012D
+ for <lammich@mail.informatik.tu-muenchen.de>; Fri,  4 May 2018 10:19:35
+ +0200 (CEST)
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix) id
+ 479AB1C037B; Fri,  4 May 2018 10:19:35 +0200 (CEST)
+Delivered-To: peter.lammich@informatik.tu-muenchen.de
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id 44AE01C038A; Fri,  4 May 2018 10:19:35 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de (localhost
+ [127.0.0.1]) by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP
+ id 1F3D21C037C for <lammich@in.tum.de>; Fri,  4 May 2018 10:19:35 +0200
+ (CEST)
+Received: from vmmaildmz2.informatik.tu-muenchen.de
+ (vmmaildmz2.informatik.tu-muenchen.de [131.159.0.88]) by
+ vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id 13F341C037B
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:19:35 +0200 (CEST)
+Received: by vmmaildmz2.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id 1276C1C24C9; Fri,  4 May 2018 10:19:35 +0200 (CEST)
+X-Spam-Checker-Version: SpamAssassin 3.4.0-tuminfo_1 (2014-02-07) on
+ vmmaildmz2.informatik.tu-muenchen.de
+X-Spam-Level: 
+X-Spam-Status: No, score=-4.3 required=7.0 tests=AWL,BAYES_00,DKIM_SIGNED,
+ DKIM_VALID,DKIM_VALID_AU,HTML_MESSAGE,RCVD_IN_DNSWL_MED autolearn=no
+ autolearn_force=no version=3.4.0-tuminfo_1
+Received: from vmmaildmz2.informatik.tu-muenchen.de (localhost [127.0.0.1])
+ by vmmaildmz2.informatik.tu-muenchen.de (Postfix) with ESMTP id 67F3D1C24C7
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:19:33 +0200 (CEST)
+Received: from postout1.mail.lrz.de (postout1.mail.lrz.de
+ [129.187.255.137]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256
+ bits)) (No client certificate requested) by
+ vmmaildmz2.informatik.tu-muenchen.de (Postfix) with ESMTPS id 5D06E1C24AD
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:19:33 +0200 (CEST)
+Received: from lxmhs51.srv.lrz.de (localhost [127.0.0.1]) by
+ postout1.mail.lrz.de (Postfix) with ESMTP id 40clKx2HTjzyWC for
+ <lammich@in.tum.de>; Fri,  4 May 2018 10:19:33 +0200 (CEST)
+Authentication-Results: postout.lrz.de (amavisd-new); dkim=pass (2048-bit
+ key) reason="pass (just generated, assumed good)" header.d=tum.de
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tum.de; h=
+ mime-version:content-type:content-type:content-language
+ :accept-language:message-id:date:date:subject:subject:from:from
+ :received:received:received:received; s=postout; t=1525421973;
+ bh=ZiT4BOWXmTdTuCRVly6tiPk3PQaaDK8QKhht2fMBevk=; b=cFAtxoGHKi9S
+ 8ojHS3EzKxryvZiyllP2R4qXYTTfP1ePTqJk7w/i9wW9mTwwqEiH3Dlt04sRTiZB
+ qFOVFOGqNgrfmZ9f53QT/7eDEv3qjCB/b++JsjtbRbAb5698G0yFcwn9CtXMMuwZ
+ i7al/0kc64xgyT7oSW0sz7bgF4u4CJZTymf8m0HZX7mrzIy1ki+4TAj68DcYr/is
+ Hoz+CINceFDjyP7KeMfGFB7WzY8kFHg6Xs+51ouoOCfNAJRNgbw5vO6F3/2+4qgR
+ YYBCOu5exmYh8xbAccNX+mnp2xWnFp81ktFdst3quqNzfzNwuMA4Cwdns7g0pGOZ
+ aGOAt4aYxg==
+X-Virus-Scanned: by amavisd-new at lrz.de in lxmhs51.srv.lrz.de
+Received: from postout1.mail.lrz.de ([127.0.0.1]) by lxmhs51.srv.lrz.de
+ (lxmhs51.srv.lrz.de [127.0.0.1]) (amavisd-new, port 20024) with LMTP id
+ Y7IanIAnH89i for <lammich@in.tum.de>; Fri,  4 May 2018 10:19:33 +0200 (CEST)
+Received: from BADWLRZ-SWMBX12.ads.mwn.de (BADWLRZ-SWMBX12.ads.mwn.de
+ [IPv6:2001:4ca0:0:108::168]) (using TLSv1.2 with cipher
+ ECDHE-RSA-AES256-SHA384 (256/256 bits)) (Client CN "BADWLRZ-SWMBX12",
+ Issuer "BADWLRZ-SWMBX12" (not verified)) by postout1.mail.lrz.de (Postfix)
+ with ESMTPS id 40clKx0FmGzyW1 for <lammich@in.tum.de>; Fri,  4 May 2018
+ 10:19:33 +0200 (CEST)
+Received: from BADWLRZ-SWMBX09.ads.mwn.de (2001:4ca0:0:108::165) by
+ BADWLRZ-SWMBX12.ads.mwn.de (2001:4ca0:0:108::168) with Microsoft SMTP
+ Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256)
+ id 15.1.1466.3; Fri, 4 May 2018 10:19:31 +0200
+Received: from BADWLRZ-SWMBX09.ads.mwn.de ([fe80::28c9:20b8:a4d6:473c]) by
+ BADWLRZ-SWMBX09.ads.mwn.de ([fe80::28c9:20b8:a4d6:473c%12]) with mapi id
+ 15.01.1466.003; Fri, 4 May 2018 10:19:31 +0200
+From: "Rieder, Sabine" <sabine.rieder@tum.de>
+To: "lammich@in.tum.de" <lammich@in.tum.de>
+Subject: [FDS] Homework 3
+Thread-Topic: [FDS] Homework 3
+Thread-Index: AQHT44CLa98j2/DxU0CueZAY4877bw==
+Date: Fri, 4 May 2018 08:19:31 +0000
+Message-ID: <016f8249475440aab6973e38a18ca1e8@tum.de>
+Accept-Language: de-DE, en-US
+Content-Language: de-DE
+X-MS-Exchange-Organization-AuthAs: Internal
+X-MS-Exchange-Organization-AuthMechanism: 04
+X-MS-Exchange-Organization-AuthSource: BADWLRZ-SWMBX09.ads.mwn.de
+X-MS-Has-Attach: yes
+X-MS-TNEF-Correlator: 
+x-originating-ip: [2001:4ca0:2fff:1::cc]
+Content-Type: multipart/mixed; boundary="_004_016f8249475440aab6973e38a18ca1e8tumde_"
+MIME-Version: 1.0
+X-Evolution-Source: 1479990504.8344.16@lapnipkow10
+
+
+--_004_016f8249475440aab6973e38a18ca1e8tumde_
+Content-Type: multipart/alternative; boundary="_000_016f8249475440aab6973e38a18ca1e8tumde_"
+
+
+--_000_016f8249475440aab6973e38a18ca1e8tumde_
+Content-Type: text/plain; charset="iso-8859-1"
+Content-Transfer-Encoding: 8bit
+
+Dear Dr. Lammich,
+
+Please find homework 3 attached to this mail.
+
+
+Best regards,
+
+Sabine Rieder
+
+--_000_016f8249475440aab6973e38a18ca1e8tumde_
+Content-Type: text/html; charset="iso-8859-1"
+Content-Transfer-Encoding: 8bit
+
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
+</head>
+<body dir="ltr">
+<div id="divtagdefaultwrapper" dir="ltr" style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, &quot;EmojiFont&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, NotoColorEmoji, &quot;Segoe UI Symbol&quot;, &quot;Android Emoji&quot;, EmojiSymbols;">
+<p>Dear Dr. Lammich,</p>
+<p>Please find homework 3 attached to this mail.</p>
+<p><br>
+</p>
+<p>Best regards,</p>
+<p>Sabine Rieder<br>
+</p>
+</div>
+</body>
+</html>
+
+--_000_016f8249475440aab6973e38a18ca1e8tumde_--
+
+--_004_016f8249475440aab6973e38a18ca1e8tumde_
+Content-Type: application/octet-stream; name="tmpl03.thy"
+Content-Description: tmpl03.thy
+Content-Disposition: attachment; filename="tmpl03.thy"; size=10646; creation-date="Fri, 04 May 2018 08:18:26 GMT"; modification-date="Fri, 04 May 2018 08:18:26 GMT"
+Content-Transfer-Encoding: base64
+
+KCo8KikKdGhlb3J5IHRtcGwwMwppbXBvcnRzICIuLi9EZW1vcy9CU1RfRGVtbyIKYmVnaW4KKCo+
+KikKCgoKdGV4dCB7KiBcRXhlcmNpc2VTaGVldHszfXsyNy5+NC5+MjAxOH0gKn0KCnRleHQgXDxv
+cGVuPgogIFxFeGVyY2lzZXtNZW1iZXJzaGlwIFRlc3Qgd2l0aCBMZXNzIENvbXBhcmlzb25zfQoK
+ICBJbiB3b3JzdCBjYXNlLCB0aGUgQHtjb25zdCBpc2lufSBmdW5jdGlvbiBwZXJmb3JtcyB0d28g
+Y29tcGFyaXNvbnMgcGVyIG5vZGUuCiAgSW4gdGhpcyBleGVyY2lzZSwgd2Ugd2FudCB0byByZWR1
+Y2UgdGhpcyB0byBvbmUgY29tcGFyaXNvbiBwZXIgbm9kZSwgd2l0aCB0aGUgCiAgZm9sbG93aW5n
+IGlkZWE6CiAgCiAgT25lIG5ldmVyIHRlc3RzIGZvciBcPG9wZW4+Plw8Y2xvc2U+LCBidXQgYWx3
+YXlzIGdvZXMgcmlnaHQgaWYgbm90IFw8b3Blbj48XDxjbG9zZT4uIAogIEhvd2V2ZXIsIG9uZSBy
+ZW1lbWJlcnMgdGhlIHZhbHVlIHdoZXJlIG9uZSBzaG91bGQgaGF2ZSB0ZXN0ZWQgZm9yIFw8b3Bl
+bj49XDxjbG9zZT4sCiAgYW5kIHBlcmZvcm1zIHRoZSBjb21wYXJpc29uIHdoZW4gYSBsZWFmIGlz
+IHJlYWNoZWQuClw8Y2xvc2U+CiAgICAgIApmdW4gaXNpbjIgOjogIignYTo6bGlub3JkZXIpIHRy
+ZWUgXDxSaWdodGFycm93PiAnYSBvcHRpb24gXDxSaWdodGFycm93PiAnYSBcPFJpZ2h0YXJyb3c+
+IGJvb2wiIAogXDxjb21tZW50PiBcPG9wZW4+VGhlIHNlY29uZCBwYXJhbWV0ZXIgc3RvcmVzIHRo
+ZSB2YWx1ZSBmb3IgdGhlIGRlZmVycmVkIGNvbXBhcmlzb25cPGNsb3NlPgogd2hlcmUKICAgImlz
+aW4yIExlYWYgb3B0IGsgPSAoY2FzZSBvcHQgb2YgU29tZSBhIFw8UmlnaHRhcnJvdz4gYSA9IGsg
+fCBOb25lIFw8UmlnaHRhcnJvdz4gRmFsc2UpIiB8CiAgICJpc2luMiAoTm9kZSBsIGEgcikgb3B0
+IGsgPSAoCiAgICAgIGlmIChrIDwgYSkgdGhlbiAoaXNpbjIgbCBvcHQgaykgCiAgICAgIGVsc2Ug
+KGlzaW4yIHIgKFNvbWUgYSkgaykpIgoKCnRleHQgXDxvcGVuPlNob3cgdGhhdCB5b3VyIGZ1bmN0
+aW9uIGlzIGNvcnJlY3QuIAoKICBIaW50OiBBdXhpbGlhcnkgbGVtbWEgZm9yIFw8b3Blbj5pc2lu
+MiB0IChTb21lIHkpIHhcPGNsb3NlPiAhClw8Y2xvc2U+CmxlbW1hIGlzaW4yX1NvbWU6ICJic3Qg
+dFw8TG9uZ3JpZ2h0YXJyb3c+IFw8Zm9yYWxsPnhcPGluPnNldF90cmVlIHQuIGE8eCBcPExvbmdy
+aWdodGFycm93PiBpc2luMiB0IChTb21lIGEpIHggXDxsb25nbGVmdHJpZ2h0YXJyb3c+ICgoaXNp
+biB0IHgpIFw8b3I+IChhPXgpKSIKICBhcHBseSAoaW5kdWN0aW9uIHQgYXJiaXRyYXJ5OiBhKQog
+IGFwcGx5KGF1dG8pCiAgZG9uZQoKbGVtbWEgaXNpbjJfTm9uZToKICAiYnN0IHQgXDxMb25ncmln
+aHRhcnJvdz4gaXNpbjIgdCBOb25lIHggPSBpc2luIHQgeCIgCiAgYXBwbHkoaW5kdWN0aW9uIHQp
+CiAgYXBwbHkoYXV0byBzaW1wIGFkZDogaXNpbjJfU29tZSkKICBkb25lCgogICAgICAKdGV4dCBc
+PG9wZW4+CiAgXEV4ZXJjaXNle0hlaWdodC1QcmVzZXJ2aW5nIEluLU9yZGVyIEpvaW59CiAgV3Jp
+dGUgYSBmdW5jdGlvbiB0aGF0IGpvaW5zIHR3byBiaW5hcnkgdHJlZXMgc3VjaCB0aGF0CiAgXDxe
+aXRlbT4gVGhlIGluLW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgbmV3IHRyZWUgaXMgdGhlIGNvbmNh
+dGVuYXRpb24gb2YgdGhlIGluLW9yZGVyIHRyYXZlcnNhbHMgb2YgdGhlIG9yaWdpbmFsIHRyZWUK
+ICBcPF5pdGVtPiBUaGUgbmV3IHRyZWUgaXMgYXQgbW9zdCBvbmUgaGlnaGVyIHRoYW4gdGhlIGhp
+Z2hlc3Qgb3JpZ2luYWwgdHJlZQoKICBIaW50OiBPbmNlIHlvdSBnb3QgdGhlIGZ1bmN0aW9uIHJp
+Z2h0LCBwcm9vZnMgYXJlIGVhc3khClw8Y2xvc2U+ICAKZnVuIGpvaW4gOjogIidhIHRyZWUgXDxS
+aWdodGFycm93PiAnYSB0cmVlIFw8UmlnaHRhcnJvdz4gJ2EgdHJlZSIgCiAgd2hlcmUKImpvaW4g
+TGVhZiB0MiA9IHQyInwKImpvaW4gdDEgTGVhZiA9IHQxInwKImpvaW4gKE5vZGUgbDEgYTEgcjEp
+ICAoTm9kZSBsMiBhMiByMikgPSAoIGNhc2UgKGpvaW4gcjEgbDIpIG9mIAogIExlYWYgXDxSaWdo
+dGFycm93PiAoTm9kZSBsMSBhMSAoTm9kZSBMZWFmIGEyIHIyKSkgfCAKICAoTm9kZSBsIGEgcikg
+XDxSaWdodGFycm93PiAoTm9kZSAoTm9kZSBsMSBhMSBsKSBhIChOb2RlIHIgYTIgcjIpKSkiCgps
+ZW1tYSBqb2luX2lub3JkZXJbc2ltcF06ICJpbm9yZGVyKGpvaW4gdDEgdDIpID0gaW5vcmRlciB0
+MSBAIGlub3JkZXIgdDIiCiAgYXBwbHkoaW5kdWN0aW9uIHQxIHQyIHJ1bGU6IGpvaW4uaW5kdWN0
+KQogIGFwcGx5KGF1dG8gc3BsaXQ6IHRyZWUuc3BsaXRzKQogIGRvbmUKCigqVXNlIHNwbGl0IHRv
+IHNwbGl0IGluIGFzc3VtcHRpb24gYW5kIGNvbmNsdXNpb24qKQoKbGVtbWEgImhlaWdodChqb2lu
+IHQxIHQyKSBcPGxlPiBtYXggKGhlaWdodCB0MSkgKGhlaWdodCB0MikgKyAxIgogIGFwcGx5KGlu
+ZHVjdGlvbiB0MSB0MiBydWxlOiBqb2luLmluZHVjdCkKICBhcHBseShhdXRvIHNwbGl0OiB0cmVl
+LnNwbGl0cykKICBkb25lCgp0ZXh0IFw8b3Blbj4KICBcRXhlcmNpc2V7SW1wbGVtZW50IERlbGV0
+ZX0KICBJbXBsZW1lbnQgZGVsZXRlIHVzaW5nIHRoZSBcPG9wZW4+am9pblw8Y2xvc2U+IGZ1bmN0
+aW9uIGZyb20gbGFzdCBleGVyY2lzZS4KXDxjbG9zZT4gIAoKdGV4dCBcPG9wZW4+Tm90ZTogQXQg
+dGhpcyBwb2ludCwgd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBk
+ZXRhaWxzIAogIG9mIGpvaW4gYW55IG1vcmUsIGJ1dCBqdXN0IGluIGl0cyBzcGVjaWZpY2F0aW9u
+LCBpLmUuLCB3aGF0IGl0IGRvZXMgdG8gdHJlZXMuCiAgVGh1cywgYXMgZmlyc3Qgc3RlcCwgd2Ug
+ZGVjbGFyZSBpdHMgZXF1YXRpb25zIHRvIG5vdCBiZWluZyBhdXRvbWF0aWNhbGx5IHVuZm9sZGVk
+LgpcPGNsb3NlPgoKZGVjbGFyZSBqb2luLnNpbXBzW3NpbXAgZGVsXQoKdGV4dCBcPG9wZW4+Qm90
+aCwgXDxvcGVuPnNldF90cmVlXDxjbG9zZT4gYW5kIFw8b3Blbj5ic3RcPGNsb3NlPiBjYW4gYmUg
+ZXhwcmVzc2VkIGJ5IHRoZSBpbm9yZGVyIHRyYXZlcnNhbCBvdmVyIHRyZWVzOlw8Y2xvc2U+Cgp0
+aG0gc2V0X2lub3JkZXJbc3ltbWV0cmljXSBic3RfaWZmX3NvcnRlZF93cnRfbGVzcwoKdGV4dCBc
+PG9wZW4+Tm90ZTogQXMgQHt0aG0gW3NvdXJjZV0gc2V0X2lub3JkZXJ9IGlzIGRlY2xhcmVkIGFz
+IHNpbXAuIAogIEJlIGNhcmVmdWwgbm90IHRvIGhhdmUgYm90aCBkaXJlY3Rpb25zIG9mIHRoZSBs
+ZW1tYSBpbiB0aGUgc2ltcHNldCBhdCB0aGUgCiAgc2FtZSB0aW1lLCBvdGhlcndpc2UgdGhlIHNp
+bXBsaWZpZXIgaXMgbGlrZWx5IHRvIGxvb3AuCiAgCiAgWW91IGNhbiB1c2UgXDxvcGVuPnNpbXAg
+ZGVsOiBzZXRfaW5vcmRlciBhZGQ6IHNldF9pbm9yZGVyW3N5bW1ldHJpY11cPGNsb3NlPiwgb3IK
+ICBcPG9wZW4+YXV0byBzaW1wIGRlbDogc2V0X2lub3JkZXIgc2ltcDogc2V0X2lub3JkZXJbc3lt
+bWV0cmljXVw8Y2xvc2U+IHRvIAogIHRlbXBvcmFyaWx5IHJlbW92ZSB0aGUgbGVtbWEgZnJvbSB0
+aGUgc2ltcHNldC4KICAKICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHdyaXRlIFw8b3Blbj5kZWNs
+YXJlIHNldF9pbm9yZGVyW3NpbXBfZGVsXVw8Y2xvc2U+IHRvCiAgcmVtb3ZlIGl0IG9uY2UgYW5k
+IGZvcmFsbC4KXDxjbG9zZT4KZGVjbGFyZSBzZXRfaW5vcmRlcltzaW1wIGRlbF0KCnRleHQgIkZv
+ciB0aGUgXDxvcGVuPnNvcnRlZF93cnRcPGNsb3NlPiBwcmVkaWNhdGUsIHlvdSBtaWdodCB3YW50
+IHRvIHVzZSB0aGVzZSBsZW1tYXMgYXMgc2ltcDoiCnRobSBzb3J0ZWRfd3J0X2FwcGVuZCBzb3J0
+ZWRfd3J0X0NvbnMKCnRleHQgXDxvcGVuPlNob3cgdGhhdCBqb2luIHByZXNlcnZlcyB0aGUgc2V0
+IG9mIGVudHJpZXNcPGNsb3NlPgpsZW1tYSBbc2ltcF06ICJzZXRfdHJlZSAoam9pbiB0MSB0Mikg
+PSBzZXRfdHJlZSB0MSBcPHVuaW9uPiBzZXRfdHJlZSB0MiIKICBieShzaW1wIGFkZDogc2V0X2lu
+b3JkZXJbc3ltbWV0cmljXSkKCnRleHQgXDxvcGVuPlNob3cgdGhhdCBqb2luaW5nIHRoZSBsZWZ0
+IGFuZCByaWdodCBjaGlsZCBvZiBhIEJTVCBpcyBhZ2FpbiBhIEJTVDpcPGNsb3NlPgoKbGVtbWEg
+W3NpbXBdOiAiYnN0IChOb2RlIGwgKHg6Ol86Omxpbm9yZGVyKSByKSBcPExvbmdyaWdodGFycm93
+PiBic3QgKGpvaW4gbCByKSIKICBhcHBseShhdXRvIHNpbXAgYWRkOmJzdF9pZmZfc29ydGVkX3dy
+dF9sZXNzIHNvcnRlZF93cnRfYXBwZW5kIHNldF9pbm9yZGVyW3N5bW1ldHJpY10pCiAgYXBwbHkg
+ZmFzdGZvcmNlCiAgZG9uZQoKdGV4dCBcPG9wZW4+SW1wbGVtZW50IGEgZGVsZXRlIGZ1bmN0aW9u
+IHVzaW5nIHRoZSBpZGVhIGNvbnRhaW5lZCBpbiB0aGUgbGVtbWFzIGFib3ZlLlw8Y2xvc2U+ICAK
+ZnVuIGRlbGV0ZSA6OiAiJ2E6Omxpbm9yZGVyIFw8UmlnaHRhcnJvdz4gJ2EgdHJlZSBcPFJpZ2h0
+YXJyb3c+ICdhIHRyZWUiIAp3aGVyZQogICJkZWxldGUgXyBfID0gdW5kZWZpbmVkIgoKdGV4dCBc
+PG9wZW4+UHJvdmUgaXQgY29ycmVjdCEgTm90ZTogWW91J2xsIG5lZWQgdGhlIGZpcnN0IGxlbW1h
+IHRvIHByb3ZlIHRoZSBzZWNvbmQgb25lISBcPGNsb3NlPiAgCmxlbW1hIFtzaW1wXTogImJzdCB0
+IFw8TG9uZ3JpZ2h0YXJyb3c+IHNldF90cmVlIChkZWxldGUgeCB0KSA9IHNldF90cmVlIHQgLSB7
+eH0iCiAgb29wcwoKbGVtbWEgImJzdCB0IFw8TG9uZ3JpZ2h0YXJyb3c+IGJzdCAoZGVsZXRlIHgg
+dCkiCiAgb29wcyAgCgp0ZXh0IHsqIFxOdW1Ib21ld29ya3tUcmVlIEFkZHJlc3Npbmd9e01heSA0
+fSAqfQp0ZXh0IFw8b3Blbj4KICBBIHBvc2l0aW9uIGluIGEgdHJlZSBjYW4gYmUgZ2l2ZW4gYXMg
+YSBsaXN0IG9mIAogIG5hdmlnYXRpb24gaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIHJvb3QsIGkuZS4s
+IHdoZXRoZXIgdG8gZ28gCiAgdG8gdGhlIGxlZnQgb3IgcmlnaHQgc3VidHJlZS4gV2UgY2FsbCBz
+dWNoIGEgbGlzdCBhIHBhdGguClw8Y2xvc2U+CiAgZGF0YXR5cGUgZGlyZWN0aW9uID0gTCB8IFIK
+ICB0eXBlX3N5bm9ueW0gcGF0aCA9ICJkaXJlY3Rpb24gbGlzdCIKCnRleHQgXDxvcGVuPlNwZWNp
+Znkgd2hlbiBhIHBhdGggaXMgdmFsaWQ6XDxjbG9zZT4gIAogIAogIGZ1biB2YWxpZCA6OiAiJ2Eg
+dHJlZSBcPFJpZ2h0YXJyb3c+IHBhdGggXDxSaWdodGFycm93PiBib29sIiB3aGVyZQogICAgInZh
+bGlkIHQgW10gPSBUcnVlIiB8CiAgICAidmFsaWQgTGVhZiAoZCNkcykgPSBGYWxzZSIgfAogICAg
+InZhbGlkIChOb2RlIGwgYSByKSAoZCNkcykgPSAoaWYgZCA9IEwgdGhlbiAodmFsaWQgbCBkcykg
+ZWxzZSAodmFsaWQgciBkcykpIgogIAp0ZXh0IFw8b3Blbj5TcGVjaWZ5IGEgZnVuY3Rpb24gdG8g
+cmV0dXJuIHRoZSBzdWJ0cmVlIGFkZHJlc3NlZCBieSBhIGdpdmVuIHBhdGg6XDxjbG9zZT4gIAog
+IGZ1biBnZXQgOjogIidhIHRyZWUgXDxSaWdodGFycm93PiBwYXRoIFw8UmlnaHRhcnJvdz4gJ2Eg
+dHJlZSIgCiAgd2hlcmUKICAiZ2V0IHQgW10gPSB0IiB8CiAgImdldCAoTm9kZSBsIGEgcikgKGQg
+IyBkcykgPSAoaWYgZCA9IEwgdGhlbiAoZ2V0IGwgZHMpIGVsc2UgKGdldCByIGRzKSkifAogICJn
+ZXQgXyBfID0gdW5kZWZpbmVkIiAtLSBcPG9wZW4+Q2F0Y2gtYWxsIGNsYXVzZSB0byBnZXQgcmlk
+IG9mIG1pc3NpbmcgcGF0dGVybnMgd2FybmluZ1w8Y2xvc2U+CiAgCiAgCnRleHQgXDxvcGVuPlNw
+ZWNpZnkgYSBmdW5jdGlvbiBcPG9wZW4+cHV0IHQgcCBzXDxjbG9zZT4sIHRoYXQgcmV0dXJucyBc
+PG9wZW4+dFw8Y2xvc2U+LCB3aXRoIHRoZSBzdWJ0cmVlIAogIGF0IFw8b3Blbj5wXDxjbG9zZT4g
+cmVwbGFjZWQgYnkgXDxvcGVuPnNcPGNsb3NlPi4KXDxjbG9zZT4KICBmdW4gcHV0IDo6ICInYSB0
+cmVlIFw8UmlnaHRhcnJvdz4gcGF0aCBcPFJpZ2h0YXJyb3c+ICdhIHRyZWUgXDxSaWdodGFycm93
+PiAnYSB0cmVlIiAKICAgIHdoZXJlIAogICAgICJwdXQgdCBbXSBzID0gcyIgfAogICAgICJwdXQg
+KE5vZGUgbCBhIHIpIChkI2RzKSBzID0gKGlmIGQgPSBMIHRoZW4gKE5vZGUgKHB1dCBsIGRzIHMp
+IGEgcikgZWxzZSAoTm9kZSBsIGEgKHB1dCByIGRzIHMpKSkiIHwKICAgICAicHV0IExlYWYgZHMg
+cyA9IExlYWYiCgp0ZXh0IFw8b3Blbj5TcGVjaWZ5IHlvdXIgZnVuY3Rpb24gc3VjaCB0aGF0IGl0
+IGRvZXMgbm90aGluZyBpZiBhbiBpbnZhbGlkIHBhdGggCiAgaXMgZ2l2ZW4sIGFuZCBwcm92ZTog
+IAogIFw8Y2xvc2U+CgpsZW1tYSBwdXRfaW52YWxpZFtzaW1wXTogIlw8bm90PnZhbGlkIHQgcCBc
+PExvbmdyaWdodGFycm93PiBwdXQgdCBwIHMgPSB0IiAKICBhcHBseShpbmR1Y3Rpb24gdCBwIHJ1
+bGU6IHZhbGlkLmluZHVjdCkKICBhcHBseShhdXRvKQogIGRvbmUKCnRleHQgXDxvcGVuPk5vdGU6
+IHRoaXMgY29udmVudGlvbiB3aWxsIHNpbXBsaWZ5IHNvbWUgb2YgCiAgdGhlIGxlbW1hcywgcmVk
+dWNpbmcgdGhlIHJlcXVpcmVkIHZhbGlkaXR5IHByZWNvbmRpdGlvbnMuCiAgCiAgUHJvdmUgdGhl
+IGZvbGxvd2luZyBhbGdlYnJhaWMgbGF3cyBvbiBcPG9wZW4+cHV0XDxjbG9zZT4gYW5kIFw8b3Bl
+bj5nZXRcPGNsb3NlPi4gCiAgQWRkIHByZWNvbmRpdGlvbnMgb2YgdGhlIGZvcm0gXDxvcGVuPnZh
+bGlkIHQgcFw8Y2xvc2U+IHdoZXJlIG5lZWRlZCEKICBcPGNsb3NlPgoKbGVtbWEgZ2V0X3B1dFtz
+aW1wXTogInB1dCB0IHAgKGdldCB0IHApID0gdCIKICBhcHBseShpbmR1Y3Rpb24gdCBwIHJ1bGU6
+IGdldC5pbmR1Y3QpCiAgYXBwbHkoYXV0bykKICBkb25lCiAgICAKbGVtbWEgcHV0X3B1dFtzaW1w
+XTogInB1dCAocHV0IHQgcCBzKSBwIHMnID0gcHV0IHQgcCBzJyIgCiAgYXBwbHkoaW5kdWN0aW9u
+IHQgcCBzIHJ1bGU6IHB1dC5pbmR1Y3QpCiAgYXBwbHkoYXV0bykKICBkb25lCgpsZW1tYSBwdXRf
+Z2V0W3NpbXBdOiAidmFsaWQgdCBwIFw8TG9uZ3JpZ2h0YXJyb3c+IGdldCAocHV0IHQgcCBzKSBw
+ID0gcyIKICBhcHBseShpbmR1Y3Rpb24gdCBwIHMgcnVsZTogcHV0LmluZHVjdCkKICBhcHBseShh
+dXRvKQogIGRvbmUKCmxlbW1hIHZhbGlkX3B1dFtzaW1wXTogInZhbGlkIHQgcCBcPExvbmdyaWdo
+dGFycm93PiB2YWxpZCAocHV0IHQgcCBzKSBwIgogIGFwcGx5KGluZHVjdGlvbiB0IHAgcyBydWxl
+OiBwdXQuaW5kdWN0KQogIGFwcGx5KGF1dG8pCiAgZG9uZQogICAgCiAgdGV4dCBcPG9wZW4+CiAg
+ICBTaG93IHRoZSBmb2xsb3dpbmcgbGVtbWFzIGFib3V0IGFwcGVuZGluZyB0d28gcGF0aHM6CiAg
+XDxjbG9zZT4gIApsZW1tYSB2YWxpZF9hcHBlbmRbc2ltcF06ICJ2YWxpZCB0IChwQHEpIFw8bG9u
+Z2xlZnRyaWdodGFycm93PiB2YWxpZCB0IHAgXDxhbmQ+IHZhbGlkIChnZXQgdCBwKSBxIiAKICBh
+cHBseShpbmR1Y3Rpb24gdCBwIHJ1bGU6IGdldC5pbmR1Y3QpCiAgYXBwbHkoYXV0bykKICBkb25l
+CiAgICAKbGVtbWEgZ2V0X2FwcGVuZFtzaW1wXTogInZhbGlkIHQgcCBcPExvbmdyaWdodGFycm93
+PiBnZXQgdCAocEBxKSA9IGdldCAoZ2V0IHQgcCkgcSIKICBhcHBseShpbmR1Y3Rpb24gdCBwIHJ1
+bGU6IGdldC5pbmR1Y3QpCiAgYXBwbHkoYXV0bykKICBkb25lCiAgICAKbGVtbWEgcHV0X2FwcGVu
+ZFtzaW1wXTogInB1dCB0IChwQHEpIHMgPXB1dCB0IHAgKHB1dCAoZ2V0IHQgcCkgcSBzKSIgKCpz
+Y2hvdWxkIHNwZWNpZmllIHRlcm0gb24gcmlnaHQqKQogIGFwcGx5KGluZHVjdGlvbiB0IHAgcnVs
+ZTogZ2V0LmluZHVjdCkKICBhcHBseShhdXRvKQogIGRvbmUKCiAgdmFsdWUgIihpZiAodmFsaWQg
+XDxsYW5nbGU+XDxsYW5nbGU+XDxyYW5nbGU+LCBhXDxec3ViPjEsIFw8bGFuZ2xlPlw8cmFuZ2xl
+Plw8cmFuZ2xlPiAgKFtMXSBAIFtdKSkgdGhlbiAocHV0IChnZXQgXDxsYW5nbGU+XDxsYW5nbGU+
+XDxyYW5nbGU+LCBhXDxec3ViPjEsIFw8bGFuZ2xlPlw8cmFuZ2xlPlw8cmFuZ2xlPiAgW0xdKSBb
+XSBMZWFmKSBlbHNlIFw8bGFuZ2xlPlw8bGFuZ2xlPlw8cmFuZ2xlPiwgYVw8XnN1Yj4xLCBcPGxh
+bmdsZT5cPHJhbmdsZT5cPHJhbmdsZT4pIgoKdGV4dCB7KiBcTnVtSG9tZXdvcmt7UmVtZHVwc317
+TWF5IDR9ICp9Cgp0ZXh0IFw8b3Blbj5Zb3VyIHRhc2sgaXMgdG8gd3JpdGUgYSBmdW5jdGlvbiB0
+aGF0IHJlbW92ZXMgZHVwbGljYXRlcyBmcm9tIGEgbGlzdCwgdXNpbmcgYSAKICBCU1QgdG8gZWZm
+aWNpZW50bHkgc3RvcmUgdGhlIHNldCBvZiBhbHJlYWR5IGVuY291bnRlcmVkIGVsZW1lbnRzLgoK
+ICBZb3UgbWF5IHdhbnQgdG8gc3RhcnQgd2l0aCBhbiBhdXhpbGlhcnkgZnVuY3Rpb24sIHRoYXQg
+dGFrZXMgdGhlIEJTVCB3aXRoIAogIHRoZSBlbGVtZW50cyBzZWVuIHNvIGZhciBhcyBhZGRpdGlv
+bmFsIGFyZ3VtZW50LCBhbmQgdGhlbiBkZWZpbmUgdGhlIGFjdHVhbCBmdW5jdGlvbi4KXDxjbG9z
+ZT4KCmZ1biBic3RfcmVtZHVwc19hdXggOjogIignYTo6bGlub3JkZXIpIHRyZWUgXDxSaWdodGFy
+cm93PiAnYSBsaXN0IFw8UmlnaHRhcnJvdz4gJ2EgbGlzdCIgd2hlcmUgCiAgImJzdF9yZW1kdXBz
+X2F1eCB0ICh4ICMgeHMpID0gKGlmIChpc2luIHQgeCkgdGhlbiAoYnN0X3JlbWR1cHNfYXV4IHQg
+eHMpIGVsc2UgKHgjKGJzdF9yZW1kdXBzX2F1eCAoaW5zIHggdCkgeHMpKSkiIHwKICAiYnN0X3Jl
+bWR1cHNfYXV4IHQgW10gPSBbXSIgCgoKZGVmaW5pdGlvbiAiYnN0X3JlbWR1cHMgeHMgXDxlcXVp
+dj4gYnN0X3JlbWR1cHNfYXV4IExlYWYgeHMiCgoKdGV4dCBcPG9wZW4+U2hvdyB0aGF0IHlvdXIg
+ZnVuY3Rpb24gcHJlc2VydmVzIHRoZSBzZXQgb2YgZWxlbWVudHMsIGFuZCByZXR1cm5zIGEgbGlz
+dCAKICB3aXRoIG5vIGR1cGxpY2F0ZXMgKHByZWRpY2F0ZSBcPG9wZW4+ZGlzdGluY3RcPGNsb3Nl
+PiBpbiBJc2FiZWxsZSkuCiAgSGludDogR2VuZXJhbGl6YXRpb24hClw8Y2xvc2U+CgooKmxlbW1h
+IFtzaW1wXTogInggXDxub3Rpbj4gc2V0IHhzIFw8TG9uZ3JpZ2h0YXJyb3c+IHggXDxub3Rpbj4g
+c2V0IChic3RfcmVtZHVwc19hdXggdCB4cykiIAogIGFwcGx5KGluZHVjdGlvbiB4cyBhcmJpdHJh
+cnk6IHQpCiAgYXBwbHkoYXV0bykKICBkb25lKikKCmRlY2xhcmUgc2V0X3RyZWVfaXNpbltzaW1w
+IGFkZF0KZGVjbGFyZSBzZXRfdHJlZV9pbnNbc2ltcCBhZGRdCmRlY2xhcmUgYnN0X2luc1tzaW1w
+IGFkZF0KCmxlbW1hW3NpbXBdOiAiYnN0IHQgXDxMb25ncmlnaHRhcnJvdz4gc2V0IChic3RfcmVt
+ZHVwc19hdXggdCB4cykgPSAoc2V0IHhzKSAtIChzZXRfdHJlZSB0KSIKICBhcHBseShpbmR1Y3Rp
+b24geHMgYXJiaXRyYXJ5OiB0KQogIGFwcGx5KGF1dG8pIGRvbmUKCmxlbW1hW3NpbXBdOiAic2V0
+IChic3RfcmVtZHVwcyB4cykgPSBzZXQgeHMiIAogIGFwcGx5KHNpbXAgYWRkOiBic3RfcmVtZHVw
+c19kZWYpIAogIGRvbmUKCmxlbW1hW3NpbXBdOiAiYnN0IHQgXDxMb25ncmlnaHRhcnJvdz4gZGlz
+dGluY3QgKGJzdF9yZW1kdXBzX2F1eCB0IHhzKSIKICBhcHBseShpbmR1Y3Rpb24geHMgYXJiaXRy
+YXJ5OiB0KQogIGFwcGx5KGF1dG8pIAogIGRvbmUKCmxlbW1hICJkaXN0aW5jdCAoYnN0X3JlbWR1
+cHMgeHMpIgogIGFwcGx5KGF1dG8gc2ltcCBhZGQ6IGJzdF9yZW1kdXBzX2RlZikKICBkb25lCgp0
+ZXh0IFw8b3Blbj5BIGxpc3QgXDxvcGVuPnhzXDxjbG9zZT4gaXMgYSBzdWJsaXN0IG9mIFw8b3Bl
+bj55c1w8Y2xvc2U+LAogIGlmIFw8b3Blbj54c1w8Y2xvc2U+IGNhbiBiZSBwcm9kdWNlZCBmcm9t
+IFw8b3Blbj55c1w8Y2xvc2U+IGJ5IGRlbGV0aW5nIGFuIAogIGFyYml0cmFyeSBudW1iZXIgb2Yg
+ZWxlbWVudHMuCgogIERlZmluZSBhIGZ1bmN0aW9uIFw8b3Blbj5zdWJsaXN0IHhzIHlzXDxjbG9z
+ZT4gdG8gY2hlY2sgd2hldGhlciBcPG9wZW4+eHNcPGNsb3NlPiBpcyBhIHN1Ymxpc3Qgb2YgXDxv
+cGVuPnlzXDxjbG9zZT4uClw8Y2xvc2U+CmZ1biBzdWJsaXN0IDo6ICInYSBsaXN0IFw8UmlnaHRh
+cnJvdz4gJ2EgbGlzdCBcPFJpZ2h0YXJyb3c+IGJvb2wiIAp3aGVyZQogICJzdWJsaXN0IFtdIHlz
+ID0gVHJ1ZSIgfAogICJzdWJsaXN0ICh4ICMgeHMpIFtdICA9IEZhbHNlIiB8CiAgInN1Ymxpc3Qg
+KHggIyB4cykgKHkgIyB5cykgPSAoaWYgeCA9IHkgdGhlbiBzdWJsaXN0IHhzIHlzIGVsc2Ugc3Vi
+bGlzdCAoeCAjIHhzKSB5cykiCgp0ZXh0IFw8b3Blbj5TaG93IHRoYXQgeW91ciByZW1kdXBzIGZ1
+bmN0aW9uIHByb2R1Y2VzIGEgc3VibGlzdCBvZiB0aGUgb3JpZ2luYWwgbGlzdCEKCiAgSGludDog
+R2VuZXJhbGl6YXRpb24uIEF1eGlsaWFyeSBsZW1tYSByZXF1aXJlZC4KXDxjbG9zZT4KCmxlbW1h
+W3NpbXBdOiAiYSBcPG5vdGluPiBzZXQgeHMgXDxMb25ncmlnaHRhcnJvdz4gKHN1Ymxpc3QgeHMg
+KGEjeXMpID0gc3VibGlzdCB4cyB5cykiCiAgYXBwbHkoaW5kdWN0aW9uIHhzKQogICBhcHBseShh
+dXRvKQogIGRvbmUKCmxlbW1hW3NpbXBdOiAgImJzdCB0IFw8TG9uZ3JpZ2h0YXJyb3c+IHN1Ymxp
+c3QgKGJzdF9yZW1kdXBzX2F1eCB0IHhzKSB4cyIKICBhcHBseShpbmR1Y3Rpb24geHMgIGFyYml0
+cmFyeTogdCkKICBhcHBseShhdXRvKQogIGRvbmUKICAKbGVtbWEgInN1Ymxpc3QgKGJzdF9yZW1k
+dXBzIHhzKSB4cyIgCiAgYXBwbHkoaW5kdWN0aW9uIHhzKQogIGFwcGx5KGF1dG8gc2ltcCBhZGQ6
+IGJzdF9yZW1kdXBzX2RlZikKICBkb25lCiAKKCo8KikKZW5kCigqPiopCgo=
+
+--_004_016f8249475440aab6973e38a18ca1e8tumde_--
+
+From alexejrotar@gmail.com Fri May  4 10:23:34 2018
+Return-Path: <alexejrotar@gmail.com>
+Delivered-To: <lammich@mailstore.informatik.tu-muenchen.de>
+Received: from vmmailstore1.informatik.tu-muenchen.de by
+ vmmailstore1.informatik.tu-muenchen.de (Dovecot) with LMTP id
+ 8KfWMzcY7FqRBAAArPjJig for <lammich@mailstore.informatik.tu-muenchen.de>;
+ Fri, 04 May 2018 10:23:34 +0200
+Received: from vmmailproxy1.informatik.tu-muenchen.de
+ (vmmailproxy1.informatik.tu-muenchen.de [131.159.0.83]) by
+ vmmailstore1.informatik.tu-muenchen.de (Postfix) with ESMTP id 118621C2029
+ for <lammich@mailstore.informatik.tu-muenchen.de>; Fri,  4 May 2018
+ 10:23:34 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de
+ (mailrelay1.informatik.tu-muenchen.de [131.159.254.14]) by
+ vmmailproxy1.informatik.tu-muenchen.de (Postfix) with ESMTP id 0FDCF1E012D
+ for <lammich@mail.informatik.tu-muenchen.de>; Fri,  4 May 2018 10:23:34
+ +0200 (CEST)
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix) id
+ 0CE251C037B; Fri,  4 May 2018 10:23:34 +0200 (CEST)
+Delivered-To: peter.lammich@informatik.tu-muenchen.de
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id 08DFD1C038A; Fri,  4 May 2018 10:23:34 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de (localhost
+ [127.0.0.1]) by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP
+ id D8C9D1C037C for <lammich@in.tum.de>; Fri,  4 May 2018 10:23:33 +0200
+ (CEST)
+Received: from vmmaildmz2.informatik.tu-muenchen.de
+ (vmmaildmz2.informatik.tu-muenchen.de [131.159.0.88]) by
+ vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id CDB991C037B
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:23:33 +0200 (CEST)
+Received: by vmmaildmz2.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id CC3411C24C8; Fri,  4 May 2018 10:23:33 +0200 (CEST)
+X-Spam-Checker-Version: SpamAssassin 3.4.0-tuminfo_1 (2014-02-07) on
+ vmmaildmz2.informatik.tu-muenchen.de
+X-Spam-Level: 
+X-Spam-Status: No, score=-2.5 required=7.0 tests=AWL,BAYES_00,DKIM_SIGNED,
+ DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,
+ RCVD_IN_MSPIKE_WL autolearn=no autolearn_force=no version=3.4.0-tuminfo_1
+Received: from vmmaildmz2.informatik.tu-muenchen.de (localhost [127.0.0.1])
+ by vmmaildmz2.informatik.tu-muenchen.de (Postfix) with ESMTP id 0B2781C24C7
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:23:32 +0200 (CEST)
+Received: from mail-wm0-f44.google.com (mail-wm0-f44.google.com
+ [74.125.82.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256
+ (128/128 bits)) (No client certificate requested) by
+ vmmaildmz2.informatik.tu-muenchen.de (Postfix) with ESMTPS id E3C691C24AD
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:23:31 +0200 (CEST)
+Received: by mail-wm0-f44.google.com with SMTP id f6so2703868wmc.4 for
+ <lammich@in.tum.de>; Fri, 04 May 2018 01:23:31 -0700 (PDT)
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com;
+ s=20161025; h=message-id:subject:from:to:date:mime-version;
+ bh=ZhEuE7YtcIDJbR6bR4yorYnS/ocPxvfyk6U038fG/iU=;
+ b=ZxjDGV0BtBXP745vfdDr7NNNKnCMTmZKRolmOGIaMN3gY95wV7Ouz8TTKbcChPRoVS
+ zViwFuFsC8FjwQe8o+xNobQeTkWOgjwglTAgK/Ocqr/r4Zo3qbNILv5Rwmr6HLoJ2p6x
+ LcT0Xxfl6CRfdG4G3gYUkYon08ochzHN2D91C6gWr5WJnpEzOC3VbE8oozjf8hBMixBU
+ CJnjfffPi/nf6zzsUofchHgcIshAK8kOgm5Qu/nb2e983++zap65gLQ9E9GP4KvsUOsO
+ h+WNQjIW8vh4RyDzg5T+Ge56+8i0lPJ3CV6Uar+J/xpVuQg7rGWJcSV2jm2HmAzAWHwV qVIw==
+X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net;
+ s=20161025;
+ h=x-gm-message-state:message-id:subject:from:to:date:mime-version;
+ bh=ZhEuE7YtcIDJbR6bR4yorYnS/ocPxvfyk6U038fG/iU=;
+ b=dtOPBxD4XIFVP9Dr7vYDmXoO1qzqz0RjuwH+VMhjR0ef75zfvlIN2xNK2k8P+jzeKu
+ DtYAvB0hVbrxPT4RAbsQ/LayZvmtEc79+LMYA+RmyGtqMld11lRQoJ+7AFdLdAzue6B0
+ RPZ9htMwhOHb0g+q0iSiCQd73EYaJxxEux9NTs/cxrSkSpuil1WkdlDBVZTv4fxOG5+E
+ tIs3K0W1ynAWRmeGR+pXoSr8sN4g7InZU5r/ehS8mjzdSnfYhw7dtI3wIagH0pLYHECP
+ v4mn1MvDoq/s2U+gsW8qVETHcPL4GD2NezqZDbdmyO2Q0wyU9DZs4UY2AM/ttOzPEVRX qAKw==
+X-Gm-Message-State:
+ ALQs6tAxiRFyOAeNPst7uoJLyd6cK3UNdRSKfg8l0hee9DIIz5Qr28C3
+ gCLKCVvDOdIV7WMnRAPDd3vSy6PM
+X-Google-Smtp-Source:
+ AB8JxZq7eWOGJo/50jJjFO1YsIhpKO0E1Y2O7NZvCBD/yAZjY4dtBSUMjYo5a4QTPJMEFs90AnMOCQ==
+X-Received: by 10.28.0.206 with SMTP id 197mr15722121wma.118.1525422211396;
+ Fri, 04 May 2018 01:23:31 -0700 (PDT)
+Received: from w204-6-v4.eduroam.dynamic.rbg.tum.de
+ (w204-6-v4.eduroam.dynamic.rbg.tum.de. [131.159.204.6]) by
+ smtp.googlemail.com with ESMTPSA id
+ q2-v6sm16175663wrm.26.2018.05.04.01.23.29 for <lammich@in.tum.de>
+ (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 04
+ May 2018 01:23:30 -0700 (PDT)
+Message-ID: <1525422208.10994.1.camel@gmail.com>
+Subject: [FDS] Homework 3
+From: Alexej Rotar <alexejrotar@gmail.com>
+To: lammich@in.tum.de
+Date: Fri, 04 May 2018 10:23:28 +0200
+Content-Type: multipart/mixed; boundary="=-CXMariF7H0Ler5xVeHgT"
+X-Mailer: Evolution 3.26.6 (3.26.6-1.fc27) 
+Mime-Version: 1.0
+X-Evolution-Source: 1479990504.8344.16@lapnipkow10
+
+
+--=-CXMariF7H0Ler5xVeHgT
+Content-Type: text/plain
+Content-Transfer-Encoding: 8bit
+
+Greetings Alexej Rotar
+--=-CXMariF7H0Ler5xVeHgT
+Content-Disposition: attachment; filename="hw03.thy"
+Content-Type: text/plain; name="hw03.thy"; charset="UTF-8"
+Content-Transfer-Encoding: 8bit
+
+(*<*)
+theory hw03
+imports "../repo/Demos/BST_Demo" 
+begin
+(*>*)
+
+text {* \NumHomework{Tree Addressing}{May 4} *}
+text \<open>
+  A position in a tree can be given as a list of 
+  navigation instructions from the root, i.e., whether to go 
+  to the left or right subtree. We call such a list a path.
+\<close>
+  datatype direction = L | R
+  type_synonym path = "direction list"
+
+text \<open>Specify when a path is valid:\<close>  
+  
+  fun valid :: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+    "valid t [] = True" |
+    "valid Leaf (x#xs) = False" |
+    "valid (Node l a r) (x#xs) = (if x=L then valid l xs else valid r xs)"
+  
+text \<open>Specify a function to return the subtree addressed by a given path:\<close>  
+  fun get :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree" 
+  where
+  (* Insert your eqns here *)
+    "get t [] = t" |
+    "get (Node l a r) (x#xs) = (if x=L then get l xs else get r xs)" | 
+    "get _ _ = undefined" -- \<open>Catch-all clause to get rid of missing patterns warning\<close>
+  
+  
+text \<open>Specify a function \<open>put t p s\<close>, that returns \<open>t\<close>, with the subtree 
+  at \<open>p\<close> replaced by \<open>s\<close>.
+\<close>
+  fun put :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree \<Rightarrow> 'a tree" 
+    where 
+      "put t [] s = s" |
+      "put (Node l a r) (x#xs) s = (
+        if x=L then (Node (put l xs s) a r)
+        else (Node l a (put r xs s)))" |
+      "put Leaf (x#xs) _ = Leaf"
+
+text \<open>Specify your function such that it does nothing if an invalid path 
+  is given, and prove:  
+  \<close>
+
+lemma put_invalid: "\<not>valid t p \<Longrightarrow> put t p s = t"
+  apply (induction rule: valid.induct)
+   apply auto
+  done
+
+text \<open>Note: this convention will simplify some of 
+  the lemmas, reducing the required validity preconditions.
+  
+  Prove the following algebraic laws on \<open>put\<close> and \<open>get\<close>. 
+  Add preconditions of the form \<open>valid t p\<close> where needed!
+  \<close>
+
+lemma get_put[simp]: "valid t p \<Longrightarrow> put t p (get t p) = t"
+  apply (induction rule: valid.induct)
+    apply auto
+  done
+
+lemma put_put[simp]: "put (put t p s) p s' = put t p s'"
+  apply (induction arbitrary: s s' rule: valid.induct)
+    apply auto
+  done
+
+lemma put_get[simp]: "valid t p \<Longrightarrow> get (put t p s) p = s"
+  apply (induction arbitrary: s rule: valid.induct)
+    apply auto
+  done
+
+lemma valid_put[simp]: "valid t p \<Longrightarrow> valid (put t p s) p"
+  apply (induction arbitrary: s rule: valid.induct)
+    apply auto
+  done
+    
+  text \<open>
+    Show the following lemmas about appending two paths:
+  \<close>  
+
+lemma valid_append[simp]: "valid t (p@q) \<longleftrightarrow> valid t p \<and> valid (get t p) q"
+  apply (induction t p arbitrary: q rule: valid.induct)
+    apply auto
+  done
+    
+lemma get_append[simp]: "valid t (p@q) \<Longrightarrow> get t (p@q) = get (get t p) q"
+  apply (induction t p arbitrary: q rule: valid.induct)
+    apply auto
+  done
+    
+lemma put_append[simp]: "put t (p@q) s = put t p (put (get t p) q s)"
+  apply (induction t p arbitrary: q s rule: valid.induct)
+    apply auto
+  done
+
+text {* \NumHomework{Remdups}{May 4} *}
+
+text \<open>Your task is to write a function that removes duplicates from a list, using a 
+  BST to efficiently store the set of already encountered elements.
+
+  You may want to start with an auxiliary function, that takes the BST with 
+  the elements seen so far as additional argument, and then define the actual function.
+\<close>
+
+fun bst_remdups_aux :: "'a::linorder tree \<Rightarrow> 'a list \<Rightarrow> 'a list" where 
+  "bst_remdups_aux t [] = []" |
+  "bst_remdups_aux t (x#xs) = (
+    if (isin t x) then bst_remdups_aux t xs
+    else x#bst_remdups_aux (ins x t) xs)"
+
+definition "bst_remdups xs \<equiv> bst_remdups_aux Leaf xs"
+
+text \<open>Show that your function preserves the set of elements, and returns a list 
+  with no duplicates (predicate \<open>distinct\<close> in Isabelle).
+  Hint: Generalization!
+\<close>
+
+lemma remdups_append: "set (bst_remdups (xs@ys)) = set (xs@ys)"
+  apply (simp add: bst_remdups_def)
+  apply (induction xs arbitrary: ys rule: bst_remdups_aux.induct)
+   apply auto
+  oops
+
+lemma set_bst_remdups_aux1: "set (bst_remdups_aux t xs) \<subseteq> set xs"
+  apply (induction t xs rule: bst_remdups_aux.induct)
+   apply auto
+  done
+
+lemma set_bst_remdups_aux2: "set xs \<le> set (bst_remdups_aux t xs) \<union> set_tree t"
+  apply (induction t xs rule: bst_remdups_aux.induct)
+   apply auto
+  oops
+
+lemma "set (bst_remdups xs) = set xs"
+  apply (simp add: bst_remdups_def)
+  apply (induction xs rule: bst_remdups_aux.induct)
+   apply simp_all
+  oops
+
+lemma "distinct (bst_remdups xs)"
+  apply (simp add: bst_remdups_def)
+  apply (induction xs rule: bst_remdups_aux.induct)
+  apply (auto)
+  oops
+
+text \<open>A list \<open>xs\<close> is a sublist of \<open>ys\<close>,
+  if \<open>xs\<close> can be produced from \<open>ys\<close> by deleting an 
+  arbitrary number of elements.
+
+  Define a function \<open>sublist xs ys\<close> to check whether \<open>xs\<close> is a sublist of \<open>ys\<close>.
+\<close>
+fun sublist :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool" 
+where
+  "sublist [] ys = True" |
+  "sublist (x#xs) ys = (if x\<in>set ys then sublist xs ys else False)"
+
+text \<open>Show that your remdups function produces a sublist of the original list!
+
+  Hint: Generalization. Auxiliary lemma required.
+\<close>
+  
+lemma "sublist (bst_remdups xs) xs"
+  apply (simp add: bst_remdups_def)
+  apply (induction xs rule: bst_remdups_aux.induct)
+   apply auto
+  oops
+ 
+(*<*)
+end
+(*>*)
+
+
+--=-CXMariF7H0Ler5xVeHgT--
+
+
+From florian.stamer@tum.de Fri May  4 10:26:42 2018
+Return-Path: <florian.stamer@tum.de>
+Delivered-To: <lammich@mailstore.informatik.tu-muenchen.de>
+Received: from vmmailstore1.informatik.tu-muenchen.de by
+ vmmailstore1.informatik.tu-muenchen.de (Dovecot) with LMTP id
+ pFsXFAkZ7FpqEwAArPjJig for <lammich@mailstore.informatik.tu-muenchen.de>;
+ Fri, 04 May 2018 10:26:42 +0200
+Received: from vmmailproxy1.informatik.tu-muenchen.de
+ (vmmailproxy1.informatik.tu-muenchen.de [131.159.0.83]) by
+ vmmailstore1.informatik.tu-muenchen.de (Postfix) with ESMTP id ABD661C2029
+ for <lammich@mailstore.informatik.tu-muenchen.de>; Fri,  4 May 2018
+ 10:26:42 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de
+ (mailrelay1.informatik.tu-muenchen.de [131.159.254.14]) by
+ vmmailproxy1.informatik.tu-muenchen.de (Postfix) with ESMTP id AA6181E012D
+ for <lammich@mail.informatik.tu-muenchen.de>; Fri,  4 May 2018 10:26:42
+ +0200 (CEST)
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix) id
+ A74D01C037B; Fri,  4 May 2018 10:26:42 +0200 (CEST)
+Delivered-To: peter.lammich@informatik.tu-muenchen.de
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id A4B281C038A; Fri,  4 May 2018 10:26:42 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de (localhost
+ [127.0.0.1]) by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP
+ id 7FEFE1C037C for <lammich@in.tum.de>; Fri,  4 May 2018 10:26:42 +0200
+ (CEST)
+Received: from vmmaildmz1.informatik.tu-muenchen.de
+ (vmmaildmz1.informatik.tu-muenchen.de [131.159.0.87]) by
+ vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id 75C9D1C037B
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:26:42 +0200 (CEST)
+Received: by vmmaildmz1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id 741081C2DB5; Fri,  4 May 2018 10:26:42 +0200 (CEST)
+X-Spam-Checker-Version: SpamAssassin 3.4.0-tuminfo_1 (2014-02-07) on
+ vmmaildmz1.informatik.tu-muenchen.de
+X-Spam-Level: 
+X-Spam-Status: No, score=-4.3 required=7.0 tests=BAYES_00,DKIM_SIGNED,
+ DKIM_VALID,DKIM_VALID_AU,HTML_MESSAGE,RCVD_IN_DNSWL_MED autolearn=no
+ autolearn_force=no version=3.4.0-tuminfo_1
+Received: from vmmaildmz1.informatik.tu-muenchen.de (localhost [127.0.0.1])
+ by vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTP id BC23E1C2DB4
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:26:40 +0200 (CEST)
+Received: from postout2.mail.lrz.de (postout2.mail.lrz.de
+ [129.187.255.138]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256
+ bits)) (No client certificate requested) by
+ vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTPS id B12A41C2D9F
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:26:40 +0200 (CEST)
+Received: from lxmhs52.srv.lrz.de (localhost [127.0.0.1]) by
+ postout2.mail.lrz.de (Postfix) with ESMTP id 40clV84lLtzyTZ for
+ <lammich@in.tum.de>; Fri,  4 May 2018 10:26:40 +0200 (CEST)
+Authentication-Results: postout.lrz.de (amavisd-new); dkim=pass (2048-bit
+ key) reason="pass (just generated, assumed good)" header.d=tum.de
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tum.de; h=
+ mime-version:content-type:content-type:content-language
+ :accept-language:message-id:date:date:subject:subject:from:from
+ :received:received:received:received; s=postout; t=1525422400;
+ bh=6KlbxV3x5qjMrSQzxAzjRil67nS5QHcLYtF5pNPSIiA=; b=SapDzMF4z7y0
+ JV0SLRDrloVnMUPH01ahrmVnDnsMh6Ccr4/1xpqE6T1HeXAkHHH8kvPcMXC3L1V1
+ 3H9lHo/9zfqBaBo1JfD8+ZY6cfgD8cb7cloIxwRQcvyHaMHnYybDKU23Jqt3w/tq
+ l/WbH9Ocx7Tv4rTHy03DksiGwiIQRbaZuHP1ZZVFprbfsIiX+1hY8dgMLJ1H0g69
+ vg9s3JOcN7hXxP3i8hSyigEKoBbAJdeNsPDcUwZmUVHwpT8ysLVetalXzPKi3AF1
+ hnHEAexW1f5AI6NDkaLQK4tyKP03d/Y/64VEKIX3ni17OOHq9nXA/70SN0OSCjWf
+ HfuWsufFtg==
+X-Virus-Scanned: by amavisd-new at lrz.de in lxmhs52.srv.lrz.de
+Received: from postout2.mail.lrz.de ([127.0.0.1]) by lxmhs52.srv.lrz.de
+ (lxmhs52.srv.lrz.de [127.0.0.1]) (amavisd-new, port 20024) with LMTP id
+ 9LoYY1XWkQJp for <lammich@in.tum.de>; Fri,  4 May 2018 10:26:40 +0200 (CEST)
+Received: from BADWLRZ-SWMBX01.ads.mwn.de (BADWLRZ-SWMBX01.ads.mwn.de
+ [IPv6:2001:4ca0:0:108::157]) (using TLSv1.2 with cipher
+ ECDHE-RSA-AES256-SHA384 (256/256 bits)) (Client CN "BADWLRZ-SWMBX01",
+ Issuer "BADWLRZ-SWMBX01" (not verified)) by postout2.mail.lrz.de (Postfix)
+ with ESMTPS id 40clV8399XzyT5 for <lammich@in.tum.de>; Fri,  4 May 2018
+ 10:26:40 +0200 (CEST)
+Received: from BADWLRZ-SWMBX09.ads.mwn.de (2001:4ca0:0:108::165) by
+ BADWLRZ-SWMBX01.ads.mwn.de (2001:4ca0:0:108::157) with Microsoft SMTP
+ Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256)
+ id 15.1.1466.3; Fri, 4 May 2018 10:26:39 +0200
+Received: from BADWLRZ-SWMBX09.ads.mwn.de ([fe80::28c9:20b8:a4d6:473c]) by
+ BADWLRZ-SWMBX09.ads.mwn.de ([fe80::28c9:20b8:a4d6:473c%12]) with mapi id
+ 15.01.1466.003; Fri, 4 May 2018 10:26:39 +0200
+From: "Stamer, Florian" <florian.stamer@tum.de>
+To: "lammich@in.tum.de" <lammich@in.tum.de>
+Subject: [FDS] - exercise 3
+Thread-Topic: [FDS] - exercise 3
+Thread-Index: AQHT44GBq3WB/oSWPkW2DdLtcnvJVg==
+Date: Fri, 4 May 2018 08:26:39 +0000
+Message-ID: <e6d3c690aa384b8880fe64415aedb118@tum.de>
+Accept-Language: de-DE, en-US
+Content-Language: de-DE
+X-MS-Exchange-Organization-AuthAs: Internal
+X-MS-Exchange-Organization-AuthMechanism: 04
+X-MS-Exchange-Organization-AuthSource: BADWLRZ-SWMBX09.ads.mwn.de
+X-MS-Has-Attach: yes
+X-MS-TNEF-Correlator: 
+x-originating-ip: [88.72.224.111]
+Content-Type: multipart/mixed; boundary="_004_e6d3c690aa384b8880fe64415aedb118tumde_"
+MIME-Version: 1.0
+X-Evolution-Source: 1479990504.8344.16@lapnipkow10
+
+
+--_004_e6d3c690aa384b8880fe64415aedb118tumde_
+Content-Type: multipart/alternative; boundary="_000_e6d3c690aa384b8880fe64415aedb118tumde_"
+
+
+--_000_e6d3c690aa384b8880fe64415aedb118tumde_
+Content-Type: text/plain; charset="iso-8859-1"
+Content-Transfer-Encoding: 8bit
+
+Dear Mr. Lammich,
+
+
+the file is in the attachment.
+
+
+Best regards
+
+Florian Stamer [03664701]
+
+--_000_e6d3c690aa384b8880fe64415aedb118tumde_
+Content-Type: text/html; charset="iso-8859-1"
+Content-Transfer-Encoding: 8bit
+
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
+</head>
+<body dir="ltr">
+<div id="divtagdefaultwrapper" dir="ltr" style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, Helvetica, EmojiFont, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, NotoColorEmoji, &quot;Segoe UI Symbol&quot;, &quot;Android Emoji&quot;, EmojiSymbols;">
+<p style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont;">Dear Mr. Lammich,</p>
+<p style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont;"><br>
+</p>
+<p style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont;">the file is in the attachment.</p>
+<p style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont;"><br>
+</p>
+<p style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont;">Best regards</p>
+<p></p>
+<p style="font-family: Calibri, Helvetica, sans-serif, serif, EmojiFont;">Florian Stamer [03664701]</p>
+</div>
+</body>
+</html>
+
+--_000_e6d3c690aa384b8880fe64415aedb118tumde_--
+
+--_004_e6d3c690aa384b8880fe64415aedb118tumde_
+Content-Type: application/octet-stream; name="ex03.thy"
+Content-Description: ex03.thy
+Content-Disposition: attachment; filename="ex03.thy"; size=9811; creation-date="Fri, 04 May 2018 08:25:50 GMT"; modification-date="Fri, 04 May 2018 08:25:50 GMT"
+Content-Transfer-Encoding: base64
+
+dGhlb3J5IGV4MDMKICBpbXBvcnRzICJCU1RfRGVtbyIKYmVnaW4KCmZ1biBpc2luMiA6OiAiKCdh
+OjpsaW5vcmRlcikgdHJlZSBcPFJpZ2h0YXJyb3c+ICdhIG9wdGlvbiBcPFJpZ2h0YXJyb3c+ICdh
+IFw8UmlnaHRhcnJvdz4gYm9vbCIgd2hlcmUKICAiaXNpbjIgTGVhZiByZW0gayA9IChjYXNlIHJl
+bSBvZiBTb21lIGEgXDxSaWdodGFycm93PiBhPWsgfCBOb25lIFw8UmlnaHRhcnJvdz4gRmFsc2Up
+Igp8ICJpc2luMiAoTm9kZSBsIGEgcikgcmVtIGsgPSAoCiAgICAgIGlmIGE+ayB0aGVuIGlzaW4y
+IGwgcmVtIGsKICAgICAgZWxzZSBpc2luMiByIChTb21lIGEpIGspIgoKCmxlbW1hIGF1eDE6ICJi
+c3QgdCBcPExvbmdyaWdodGFycm93PiBcPGZvcmFsbD54XDxpbj5zZXRfdHJlZSB0LiBhPHggXDxM
+b25ncmlnaHRhcnJvdz4gaXNpbjIgdCAoU29tZSBhKSBrIFw8bG9uZ2xlZnRyaWdodGFycm93PiAo
+YT1rIFw8b3I+IGlzaW4gdCBrKSIKICBhcHBseSAoaW5kdWN0aW9uIHQgYXJiaXRyYXJ5OiBhKQog
+ICBhcHBseSAoYXV0bykKICBkb25lCgpsZW1tYSBpc2luMl9Ob25lOiAiYnN0IHQgXDxMb25ncmln
+aHRhcnJvdz4gaXNpbjIgdCBOb25lIGsgPSBpc2luIHQgayIKICBhcHBseSAoaW5kdWN0aW9uIHQp
+CiAgIGFwcGx5IChhdXRvIHNpbXAgYWRkOiBhdXgxKQogIGRvbmUKCnRleHQgXDxvcGVuPgogIFxF
+eGVyY2lzZXtIZWlnaHQtUHJlc2VydmluZyBJbi1PcmRlciBKb2lufQogIFdyaXRlIGEgZnVuY3Rp
+b24gdGhhdCBqb2lucyB0d28gYmluYXJ5IHRyZWVzIHN1Y2ggdGhhdAogIFw8Xml0ZW0+IFRoZSBp
+bi1vcmRlciB0cmF2ZXJzYWwgb2YgdGhlIG5ldyB0cmVlIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9m
+IHRoZSBpbi1vcmRlciB0cmF2ZXJzYWxzIG9mIHRoZSBvcmlnaW5hbCB0cmVlCiAgXDxeaXRlbT4g
+VGhlIG5ldyB0cmVlIGlzIGF0IG1vc3Qgb25lIGhpZ2hlciB0aGFuIHRoZSBoaWdoZXN0IG9yaWdp
+bmFsIHRyZWUKCiAgSGludDogT25jZSB5b3UgZ290IHRoZSBmdW5jdGlvbiByaWdodCwgcHJvb2Zz
+IGFyZSBlYXN5IQpcPGNsb3NlPiAgCmZ1biBqb2luIDo6ICInYSB0cmVlIFw8UmlnaHRhcnJvdz4g
+J2EgdHJlZSBcPFJpZ2h0YXJyb3c+ICdhIHRyZWUiIHdoZXJlCiAgImpvaW4gdDEgTGVhZiA9IHQx
+Igp8ICJqb2luIExlYWYgdDIgPSB0MiIKfCAiam9pbiAoTm9kZSBsMSBhMSByMSkgKE5vZGUgbDIg
+YTIgcjIpID0KICAgICAgKGNhc2Ugam9pbiByMSBsMiBvZgogICAgICAgIExlYWYgXDxSaWdodGFy
+cm93PiBOb2RlIGwxIGExIChOb2RlIExlYWYgYTIgcjIpCiAgICAgIHwgTm9kZSBsIGEgciBcPFJp
+Z2h0YXJyb3c+IE5vZGUgKE5vZGUgbDEgYTEgbCkgYSAoTm9kZSByIGEyIHIyKSkiCgpsZW1tYSBq
+b2luX2lub3JkZXJbc2ltcF06ICJpbm9yZGVyKGpvaW4gdDEgdDIpID0gaW5vcmRlciB0MSBAIGlu
+b3JkZXIgdDIiCiAgYXBwbHkgKGluZHVjdGlvbiB0MSB0MiBydWxlOiBqb2luLmluZHVjdCkKICAg
+IGFwcGx5IChhdXRvIHNwbGl0OiB0cmVlLnNwbGl0cykKICBkb25lCgpsZW1tYSAiaGVpZ2h0KGpv
+aW4gdDEgdDIpIFw8bGU+IG1heCAoaGVpZ2h0IHQxKSAoaGVpZ2h0IHQyKSArIDEiCiAgYXBwbHkg
+KGluZHVjdGlvbiB0MSB0MiBydWxlOiBqb2luLmluZHVjdCkKICAgIGFwcGx5IChhdXRvIHNwbGl0
+OiB0cmVlLnNwbGl0cykKICBkb25lCgp0ZXh0IFw8b3Blbj4KICBcRXhlcmNpc2V7SW1wbGVtZW50
+IERlbGV0ZX0KICBJbXBsZW1lbnQgZGVsZXRlIHVzaW5nIHRoZSBcPG9wZW4+am9pblw8Y2xvc2U+
+IGZ1bmN0aW9uIGZyb20gbGFzdCBleGVyY2lzZS4KXDxjbG9zZT4gIAoKdGV4dCBcPG9wZW4+Tm90
+ZTogQXQgdGhpcyBwb2ludCwgd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoZSBpbXBsZW1lbnRh
+dGlvbiBkZXRhaWxzIAogIG9mIGpvaW4gYW55IG1vcmUsIGJ1dCBqdXN0IGluIGl0cyBzcGVjaWZp
+Y2F0aW9uLCBpLmUuLCB3aGF0IGl0IGRvZXMgdG8gdHJlZXMuCiAgVGh1cywgYXMgZmlyc3Qgc3Rl
+cCwgd2UgZGVjbGFyZSBpdHMgZXF1YXRpb25zIHRvIG5vdCBiZWluZyBhdXRvbWF0aWNhbGx5IHVu
+Zm9sZGVkLgpcPGNsb3NlPgoKZGVjbGFyZSBqb2luLnNpbXBzW3NpbXAgZGVsXQoKdGV4dCBcPG9w
+ZW4+Qm90aCwgXDxvcGVuPnNldF90cmVlXDxjbG9zZT4gYW5kIFw8b3Blbj5ic3RcPGNsb3NlPiBj
+YW4gYmUgZXhwcmVzc2VkIGJ5IHRoZSBpbm9yZGVyIHRyYXZlcnNhbCBvdmVyIHRyZWVzOlw8Y2xv
+c2U+CgpkZWNsYXJlIHNldF9pbm9yZGVyW3NpbXAgZGVsXQp0aG0gc2V0X2lub3JkZXJbc3ltbWV0
+cmljXSBic3RfaWZmX3NvcnRlZF93cnRfbGVzcwoKdGV4dCBcPG9wZW4+Tm90ZTogQXMgQHt0aG0g
+W3NvdXJjZV0gc2V0X2lub3JkZXJ9IGlzIGRlY2xhcmVkIGFzIHNpbXAuIAogIEJlIGNhcmVmdWwg
+bm90IHRvIGhhdmUgYm90aCBkaXJlY3Rpb25zIG9mIHRoZSBsZW1tYSBpbiB0aGUgc2ltcHNldCBh
+dCB0aGUgCiAgc2FtZSB0aW1lLCBvdGhlcndpc2UgdGhlIHNpbXBsaWZpZXIgaXMgbGlrZWx5IHRv
+IGxvb3AuCiAgCiAgWW91IGNhbiB1c2UgXDxvcGVuPnNpbXAgZGVsOiBzZXRfaW5vcmRlciBhZGQ6
+IHNldF9pbm9yZGVyW3N5bW1ldHJpY11cPGNsb3NlPiwgb3IKICBcPG9wZW4+YXV0byBzaW1wIGRl
+bDogc2V0X2lub3JkZXIgc2ltcDogc2V0X2lub3JkZXJbc3ltbWV0cmljXVw8Y2xvc2U+IHRvIAog
+IHRlbXBvcmFyaWx5IHJlbW92ZSB0aGUgbGVtbWEgZnJvbSB0aGUgc2ltcHNldC4KICAKICBBbHRl
+cm5hdGl2ZWx5LCB5b3UgY2FuIHdyaXRlIFw8b3Blbj5kZWNsYXJlIHNldF9pbm9yZGVyW3NpbXBf
+ZGVsXVw8Y2xvc2U+IHRvCiAgcmVtb3ZlIGl0IG9uY2UgYW5kIGZvcmFsbC4KXDxjbG9zZT4KCgp0
+ZXh0ICJGb3IgdGhlIFw8b3Blbj5zb3J0ZWRfd3J0XDxjbG9zZT4gcHJlZGljYXRlLCB5b3UgbWln
+aHQgd2FudCB0byB1c2UgdGhlc2UgbGVtbWFzIGFzIHNpbXA6Igp0aG0gc29ydGVkX3dydF9hcHBl
+bmQgc29ydGVkX3dydF9Db25zCgp0ZXh0IFw8b3Blbj5TaG93IHRoYXQgam9pbiBwcmVzZXJ2ZXMg
+dGhlIHNldCBvZiBlbnRyaWVzXDxjbG9zZT4KbGVtbWEgW3NpbXBdOiAic2V0X3RyZWUgKGpvaW4g
+dDEgdDIpID0gc2V0X3RyZWUgdDEgXDx1bmlvbj4gc2V0X3RyZWUgdDIiCiAgYXBwbHkgKHNpbXAg
+YWRkOiBzZXRfaW5vcmRlcltzeW1tZXRyaWNdKQogIGRvbmUKCnRleHQgXDxvcGVuPlNob3cgdGhh
+dCBqb2luaW5nIHRoZSBsZWZ0IGFuZCByaWdodCBjaGlsZCBvZiBhIEJTVCBpcyBhZ2FpbiBhIEJT
+VDpcPGNsb3NlPgoKbGVtbWEgW3NpbXBdOiAiYnN0IChOb2RlIGwgKHg6Ol86Omxpbm9yZGVyKSBy
+KSBcPExvbmdyaWdodGFycm93PiBic3QgKGpvaW4gbCByKSIKICBhcHBseSAoYXV0byBzaW1wIGFk
+ZDogYnN0X2lmZl9zb3J0ZWRfd3J0X2xlc3Mgc29ydGVkX3dydF9hcHBlbmQgc2V0X2lub3JkZXJb
+c3ltbWV0cmljXSkKICBhcHBseSBmYXN0Zm9yY2UgCiAgZG9uZQoKdGV4dCBcPG9wZW4+SW1wbGVt
+ZW50IGEgZGVsZXRlIGZ1bmN0aW9uIHVzaW5nIHRoZSBpZGVhIGNvbnRhaW5lZCBpbiB0aGUgbGVt
+bWFzIGFib3ZlLlw8Y2xvc2U+ICAKZnVuIGRlbGV0ZSA6OiAiJ2E6Omxpbm9yZGVyIFw8UmlnaHRh
+cnJvdz4gJ2EgdHJlZSBcPFJpZ2h0YXJyb3c+ICdhIHRyZWUiIAogIHdoZXJlCiAgICAiZGVsZXRl
+IF8gXyA9IHVuZGVmaW5lZCIKCnRleHQgXDxvcGVuPlByb3ZlIGl0IGNvcnJlY3QhIE5vdGU6IFlv
+dSdsbCBuZWVkIHRoZSBmaXJzdCBsZW1tYSB0byBwcm92ZSB0aGUgc2Vjb25kIG9uZSEgXDxjbG9z
+ZT4gIApsZW1tYSBbc2ltcF06ICJic3QgdCBcPExvbmdyaWdodGFycm93PiBzZXRfdHJlZSAoZGVs
+ZXRlIHggdCkgPSBzZXRfdHJlZSB0IC0ge3h9IgogIG9vcHMKCmxlbW1hICJic3QgdCBcPExvbmdy
+aWdodGFycm93PiBic3QgKGRlbGV0ZSB4IHQpIgogIG9vcHMgIAoKICB0ZXh0IHsqIFxOdW1Ib21l
+d29ya3tUcmVlIEFkZHJlc3Npbmd9e01heSA0fSAqfQogIHRleHQgXDxvcGVuPgogIEEgcG9zaXRp
+b24gaW4gYSB0cmVlIGNhbiBiZSBnaXZlbiBhcyBhIGxpc3Qgb2YgCiAgbmF2aWdhdGlvbiBpbnN0
+cnVjdGlvbnMgZnJvbSB0aGUgcm9vdCwgaS5lLiwgd2hldGhlciB0byBnbyAKICB0byB0aGUgbGVm
+dCBvciByaWdodCBzdWJ0cmVlLiBXZSBjYWxsIHN1Y2ggYSBsaXN0IGEgcGF0aC4KXDxjbG9zZT4K
+ZGF0YXR5cGUgZGlyZWN0aW9uID0gTCB8IFIKdHlwZV9zeW5vbnltIHBhdGggPSAiZGlyZWN0aW9u
+IGxpc3QiCgp0ZXh0IFw8b3Blbj5TcGVjaWZ5IHdoZW4gYSBwYXRoIGlzIHZhbGlkOlw8Y2xvc2U+
+ICAKCmZ1biB2YWxpZCA6OiAiJ2EgdHJlZSBcPFJpZ2h0YXJyb3c+IHBhdGggXDxSaWdodGFycm93
+PiBib29sIiB3aGVyZQogICJ2YWxpZCBfIFtdID0gVHJ1ZSIKfCAidmFsaWQgKE5vZGUgbCBhIHIp
+ICh4I3hzKSA9ICgKICAgICAgY2FzZSB4IG9mCiAgICAgICAgTCBcPFJpZ2h0YXJyb3c+IHZhbGlk
+IGwgeHMKICAgICAgfCBSIFw8UmlnaHRhcnJvdz4gdmFsaWQgciB4cykiCnwgInZhbGlkIExlYWYg
+cHMgPSBGYWxzZSIKCnRleHQgXDxvcGVuPlNwZWNpZnkgYSBmdW5jdGlvbiB0byByZXR1cm4gdGhl
+IHN1YnRyZWUgYWRkcmVzc2VkIGJ5IGEgZ2l2ZW4gcGF0aDpcPGNsb3NlPiAgCmZ1biBnZXQgOjog
+IidhIHRyZWUgXDxSaWdodGFycm93PiBwYXRoIFw8UmlnaHRhcnJvdz4gJ2EgdHJlZSIgd2hlcmUK
+ICAiZ2V0IHQgW10gPSB0Igp8ICJnZXQgKE5vZGUgbCBhIHIpIChwI3BzKSA9ICgKICAgICAgY2Fz
+ZSBwIG9mCiAgICAgICAgTCBcPFJpZ2h0YXJyb3c+IGdldCBsIHBzCiAgICAgIHwgUiBcPFJpZ2h0
+YXJyb3c+IGdldCByIHBzKSIKfCAiZ2V0IF8gXyA9IHVuZGVmaW5lZCIKCnRleHQgXDxvcGVuPlNw
+ZWNpZnkgYSBmdW5jdGlvbiBcPG9wZW4+cHV0IHQgcCBzXDxjbG9zZT4sIHRoYXQgcmV0dXJucyBc
+PG9wZW4+dFw8Y2xvc2U+LCB3aXRoIHRoZSBzdWJ0cmVlIAogIGF0IFw8b3Blbj5wXDxjbG9zZT4g
+cmVwbGFjZWQgYnkgXDxvcGVuPnRcPGNsb3NlPi4KXDxjbG9zZT4KZnVuIHB1dCA6OiAiJ2EgdHJl
+ZSBcPFJpZ2h0YXJyb3c+IHBhdGggXDxSaWdodGFycm93PiAnYSB0cmVlIFw8UmlnaHRhcnJvdz4g
+J2EgdHJlZSIgd2hlcmUKICAicHV0IHQgW10gcyA9IHMiCnwgInB1dCAoTm9kZSBsIGEgcikgKHAj
+cHMpIHMgPSAoCiAgICAgIGNhc2UgcCBvZgogICAgICAgIEwgXDxSaWdodGFycm93PiBOb2RlIChw
+dXQgbCBwcyBzKSBhIHIKICAgICAgfCBSIFw8UmlnaHRhcnJvdz4gTm9kZSBsIGEgKHB1dCByIHBz
+IHMpKSIKfCAicHV0IExlYWYgcHMgcyA9IExlYWYiCgp0ZXh0IFw8b3Blbj5TcGVjaWZ5IHlvdXIg
+ZnVuY3Rpb24gc3VjaCB0aGF0IGl0IGRvZXMgbm90aGluZyBpZiBhbiBpbnZhbGlkIHBhdGggCiAg
+aXMgZ2l2ZW4sIGFuZCBwcm92ZTogIAogIFw8Y2xvc2U+Cgp0aG0gcHV0LmluZHVjdAp0aG0gdmFs
+aWQuaW5kdWN0CgpsZW1tYSBwdXRfaW52YWxpZDogIlw8bm90PnZhbGlkIHQgcCBcPExvbmdyaWdo
+dGFycm93PiBwdXQgdCBwIHMgPSB0IgogIGFwcGx5IChpbmR1Y3Rpb24gdCBwIHJ1bGU6IHZhbGlk
+LmluZHVjdCkKICAgIGFwcGx5IChhdXRvIHNwbGl0OiBkaXJlY3Rpb24uc3BsaXRzKQogIGRvbmUK
+CnRleHQgXDxvcGVuPk5vdGU6IHRoaXMgY29udmVudGlvbiB3aWxsIHNpbXBsaWZ5IHNvbWUgb2Yg
+CiAgdGhlIGxlbW1hcywgcmVkdWNpbmcgdGhlIHJlcXVpcmVkIHZhbGlkaXR5IHByZWNvbmRpdGlv
+bnMuCiAgCiAgUHJvdmUgdGhlIGZvbGxvd2luZyBhbGdlYnJhaWMgbGF3cyBvbiBcPG9wZW4+cHV0
+XDxjbG9zZT4gYW5kIFw8b3Blbj5nZXRcPGNsb3NlPi4gCiAgQWRkIHByZWNvbmRpdGlvbnMgb2Yg
+dGhlIGZvcm0gXDxvcGVuPnZhbGlkIHQgcFw8Y2xvc2U+IHdoZXJlIG5lZWRlZCEKICBcPGNsb3Nl
+PgoKdGhtIHZhbGlkLmluZHVjdAoKbGVtbWEgZ2V0X3B1dFtzaW1wXTogInZhbGlkIHQgcCBcPExv
+bmdyaWdodGFycm93PiBwdXQgdCBwIChnZXQgdCBwKSA9IHQiCiAgYXBwbHkgKGluZHVjdGlvbiB0
+IHAgcnVsZTogdmFsaWQuaW5kdWN0KQogICAgYXBwbHkgKGF1dG8gc3BsaXQ6IGRpcmVjdGlvbi5z
+cGxpdHMpCiAgZG9uZQoKbGVtbWEgcHV0X3B1dFtzaW1wXTogInZhbGlkIHQgcCBcPExvbmdyaWdo
+dGFycm93PiBwdXQgKHB1dCB0IHAgcykgcCBzJyA9IHB1dCB0IHAgcyciCiAgYXBwbHkgKGluZHVj
+dGlvbiB0IHAgcnVsZTogdmFsaWQuaW5kdWN0KQogICAgYXBwbHkgKGF1dG8gc3BsaXQ6IGRpcmVj
+dGlvbi5zcGxpdHMpCiAgZG9uZQoKbGVtbWEgcHV0X2dldFtzaW1wXTogInZhbGlkIHQgcCBcPExv
+bmdyaWdodGFycm93PiBnZXQgKHB1dCB0IHAgcykgcCA9IHMiCiAgYXBwbHkgKGluZHVjdGlvbiB0
+IHAgcnVsZTogdmFsaWQuaW5kdWN0KQogICAgYXBwbHkgKGF1dG8gc3BsaXQ6IGRpcmVjdGlvbi5z
+cGxpdHMpCiAgZG9uZQoKbGVtbWEgdmFsaWRfcHV0W3NpbXBdOiAidmFsaWQgdCBwIFw8TG9uZ3Jp
+Z2h0YXJyb3c+IHZhbGlkIChwdXQgdCBwIHMpIHAiCiAgYXBwbHkgKGluZHVjdGlvbiB0IHAgcnVs
+ZTogdmFsaWQuaW5kdWN0KQogICAgYXBwbHkgKGF1dG8gc3BsaXQ6IGRpcmVjdGlvbi5zcGxpdHMp
+CiAgZG9uZQoKdGV4dCBcPG9wZW4+CiAgICBTaG93IHRoZSBmb2xsb3dpbmcgbGVtbWFzIGFib3V0
+IGFwcGVuZGluZyB0d28gcGF0aHM6CiAgXDxjbG9zZT4gIApsZW1tYSB2YWxpZF9hcHBlbmRbc2lt
+cF06ICJ2YWxpZCB0IChwQHEpIFw8bG9uZ2xlZnRyaWdodGFycm93PiB2YWxpZCB0IHAgXDxhbmQ+
+IHZhbGlkIChnZXQgdCBwKSBxIgogIGFwcGx5IChpbmR1Y3Rpb24gdCBwIHJ1bGU6IHZhbGlkLmlu
+ZHVjdCkKICAgIGFwcGx5IChhdXRvIHNwbGl0OiBkaXJlY3Rpb24uc3BsaXRzKQogIGRvbmUKCmxl
+bW1hIGdldF9hcHBlbmRbc2ltcF06ICJ2YWxpZCB0IHAgXDxMb25ncmlnaHRhcnJvdz4gZ2V0IHQg
+KHBAcSkgPSBnZXQgKGdldCB0IHApIHEiCiAgYXBwbHkgKGluZHVjdGlvbiB0IHAgcnVsZTogdmFs
+aWQuaW5kdWN0KQogICAgYXBwbHkgKGF1dG8gc3BsaXQ6IGRpcmVjdGlvbi5zcGxpdHMpCiAgZG9u
+ZQoKbGVtbWEgcHV0X2FwcGVuZFtzaW1wXTogInB1dCB0IChwQHEpIHMgPSBwdXQgdCBwIChwdXQg
+KGdldCB0IHApIHEgcykiCiAgYXBwbHkgKGluZHVjdGlvbiB0IHAgcnVsZTogdmFsaWQuaW5kdWN0
+KQogICAgYXBwbHkgKGF1dG8gc3BsaXQ6IGRpcmVjdGlvbi5zcGxpdHMpCiAgZG9uZQoKdGV4dCB7
+KiBcTnVtSG9tZXdvcmt7UmVtZHVwc317TWF5IDR9ICp9Cgp0ZXh0IFw8b3Blbj5Zb3VyIHRhc2sg
+aXMgdG8gd3JpdGUgYSBmdW5jdGlvbiB0aGF0IHJlbW92ZXMgZHVwbGljYXRlcyBmcm9tIGEgbGlz
+dCwgdXNpbmcgYSAKICBCU1QgdG8gZWZmaWNpZW50bHkgc3RvcmUgdGhlIHNldCBvZiBhbHJlYWR5
+IGVuY291bnRlcmVkIGVsZW1lbnRzLgoKICBZb3UgbWF5IHdhbnQgdG8gc3RhcnQgd2l0aCBhbiBh
+dXhpbGlhcnkgZnVuY3Rpb24sIHRoYXQgdGFrZXMgdGhlIEJTVCB3aXRoIAogIHRoZSBlbGVtZW50
+cyBzZWVuIHNvIGZhciBhcyBhZGRpdGlvbmFsIGFyZ3VtZW50LCBhbmQgdGhlbiBkZWZpbmUgdGhl
+IGFjdHVhbCBmdW5jdGlvbi4KXDxjbG9zZT4KCgpmdW4gYnN0X3JlbWR1cHNfYXV4IDo6ICInYTo6
+bGlub3JkZXIgdHJlZSBcPFJpZ2h0YXJyb3c+ICdhIGxpc3QgXDxSaWdodGFycm93PiAnYSBsaXN0
+IiB3aGVyZSAKICAoKiJic3RfcmVtZHVwc19hdXggdCBsID0gaW5vcmRlciAoZm9sZCBpbnMgbCB0
+KSIqKQogICAgImJzdF9yZW1kdXBzX2F1eCB0IFtdID0gaW5vcmRlciB0IgogIHwgImJzdF9yZW1k
+dXBzX2F1eCB0ICh4I3hzKSA9IGJzdF9yZW1kdXBzX2F1eCAoaW5zIHggdCkgeHMiCiAgKCogICJi
+c3RfcmVtZHVwc19hdXggdCBbXSA9IFtdIgogIHwgImJzdF9yZW1kdXBzX2F1eCB0ICh4I3hzKSA9
+CiAgICAgIChpZiBpc2luIHQgeCB0aGVuCiAgICAgICAgYnN0X3JlbWR1cHNfYXV4IHQgeHMKICAg
+ICAgZWxzZSB4ICMgYnN0X3JlbWR1cHNfYXV4IChpbnMgeCB0KSB4cykiKikKCmRlZmluaXRpb24g
+ImJzdF9yZW1kdXBzIHhzIFw8ZXF1aXY+IGJzdF9yZW1kdXBzX2F1eCBMZWFmIHhzIgp2YWx1ZSAi
+YnN0X3JlbWR1cHMgWzEsMywzLDIsMTo6bmF0XSIKdGV4dCBcPG9wZW4+U2hvdyB0aGF0IHlvdXIg
+ZnVuY3Rpb24gcHJlc2VydmVzIHRoZSBzZXQgb2YgZWxlbWVudHMsIGFuZCByZXR1cm5zIGEgbGlz
+dCAKICB3aXRoIG5vIGR1cGxpY2F0ZXMgKHByZWRpY2F0ZSBcPG9wZW4+ZGlzdGluY3RcPGNsb3Nl
+PiBpbiBJc2FiZWxsZSkuCiAgSGludDogR2VuZXJhbGl6YXRpb24hClw8Y2xvc2U+CgpsZW1tYSBh
+dXg6ICJzZXQgKGJzdF9yZW1kdXBzX2F1eCB0IHhzKSA9IChzZXRfdHJlZSB0KVw8dW5pb24+KHNl
+dCB4cykiCiAgYXBwbHkgKGluZHVjdGlvbiB4cyBhcmJpdHJhcnk6IHQpCiAgYXBwbHkgKGF1dG8g
+c2ltcCBhZGQ6IHNldF9pbm9yZGVyIHNldF90cmVlX2lucykKICBkb25lCgpsZW1tYSAic2V0IChi
+c3RfcmVtZHVwcyB4cykgPSBzZXQgeHMiCiAgdW5mb2xkaW5nIGJzdF9yZW1kdXBzX2RlZgogIGFw
+cGx5IChpbmR1Y3Rpb24geHMpCiAgYXBwbHkgKGF1dG8gc2ltcCBhZGQ6IGF1eCkKICBkb25lCgps
+ZW1tYSBhdXgyOiAiYnN0IHQgXDxMb25ncmlnaHRhcnJvdz4gZGlzdGluY3QgKGlub3JkZXIgdCki
+CiAgYXBwbHkgKGluZHVjdGlvbiB0KQogIGFwcGx5IChhdXRvIHNpbXAgYWRkOiBzZXRfaW5vcmRl
+cikKICB1c2luZyBvcmRlci5hc3ltIGJ5IGJsYXN0CgpsZW1tYSBhdXgzOiAiYnN0IHQgXDxMb25n
+cmlnaHRhcnJvdz4gZGlzdGluY3QgKGJzdF9yZW1kdXBzX2F1eCB0IHhzKSIKICBhcHBseSAoaW5k
+dWN0aW9uIHhzIGFyYml0cmFyeTogdCkKICBhcHBseSAoYXV0byBzaW1wIGFkZDogYnN0X2lucyBh
+dXgyKQogIGRvbmUKCmxlbW1hICJkaXN0aW5jdCAoYnN0X3JlbWR1cHMgeHMpIgogIHVuZm9sZGlu
+ZyBic3RfcmVtZHVwc19kZWYKICBhcHBseSAoaW5kdWN0aW9uIHhzKQogIGFwcGx5IChhdXRvIHNp
+bXAgYWRkOiBhdXgzKQogIGRvbmUKCiAgdGV4dCBcPG9wZW4+QSBsaXN0IFw8b3Blbj54c1w8Y2xv
+c2U+IGlzIGEgc3VibGlzdCBvZiBcPG9wZW4+eXNcPGNsb3NlPiwKICBpZiBcPG9wZW4+eHNcPGNs
+b3NlPiBjYW4gYmUgcHJvZHVjZWQgZnJvbSBcPG9wZW4+eXNcPGNsb3NlPiBieSBkZWxldGluZyBh
+biAKICBhcmJpdHJhcnkgbnVtYmVyIG9mIGVsZW1lbnRzLgoKICBEZWZpbmUgYSBmdW5jdGlvbiBc
+PG9wZW4+c3VibGlzdCB4cyB5c1w8Y2xvc2U+IHRvIGNoZWNrIHdoZXRoZXIgXDxvcGVuPnhzXDxj
+bG9zZT4gaXMgYSBzdWJsaXN0IG9mIFw8b3Blbj55c1w8Y2xvc2U+LgpcPGNsb3NlPgoKZnVuIHN1
+Ymxpc3QgOjogIidhIGxpc3QgXDxSaWdodGFycm93PiAnYSBsaXN0IFw8UmlnaHRhcnJvdz4gYm9v
+bCIgd2hlcmUKICAgICJzdWJsaXN0IFtdIHlzID0gVHJ1ZSIKICB8ICJzdWJsaXN0IHhzIFtdID0g
+RmFsc2UiCiAgfCAic3VibGlzdCAoeCN4cykgKHkjeXMpID0KICAgICAgKGlmIHggPSB5IHRoZW4K
+ICAgICAgICBzdWJsaXN0IHhzIHlzCiAgICAgIGVsc2Ugc3VibGlzdCAoeCN4cykgeXMpIgoKdGV4
+dCBcPG9wZW4+U2hvdyB0aGF0IHlvdXIgcmVtZHVwcyBmdW5jdGlvbiBwcm9kdWNlcyBhIHN1Ymxp
+c3Qgb2YgdGhlIG9yaWdpbmFsIGxpc3QhCgogIEhpbnQ6IEdlbmVyYWxpemF0aW9uLiBBdXhpbGlh
+cnkgbGVtbWEgcmVxdWlyZWQuClw8Y2xvc2U+CgpsZW1tYSBhdXg0OiAiIgogIG9vcHMKCmxlbW1h
+ICJzdWJsaXN0IChic3RfcmVtZHVwcyB4cykgeHMiCiAgdW5mb2xkaW5nIGJzdF9yZW1kdXBzX2Rl
+ZgogIGFwcGx5IChpbmR1Y3Rpb24geHMpCiAgYXBwbHkgKGF1dG8gc2ltcCBhZGQ6ICkKICBzb3Jy
+eQoKCmVuZA==
+
+--_004_e6d3c690aa384b8880fe64415aedb118tumde_--
+
+From katharinaluise.schmitt@tum.de Fri May  4 10:42:35 2018
+Return-Path: <katharinaluise.schmitt@tum.de>
+Delivered-To: <lammich@mailstore.informatik.tu-muenchen.de>
+Received: from vmmailstore1.informatik.tu-muenchen.de by
+ vmmailstore1.informatik.tu-muenchen.de (Dovecot) with LMTP id
+ dzIzNoYc7FpkRQAArPjJig for <lammich@mailstore.informatik.tu-muenchen.de>;
+ Fri, 04 May 2018 10:42:35 +0200
+Received: from vmmailproxy1.informatik.tu-muenchen.de
+ (vmmailproxy1.informatik.tu-muenchen.de [131.159.0.83]) by
+ vmmailstore1.informatik.tu-muenchen.de (Postfix) with ESMTP id C74B01C2029
+ for <lammich@mailstore.informatik.tu-muenchen.de>; Fri,  4 May 2018
+ 10:42:35 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de
+ (mailrelay1.informatik.tu-muenchen.de [131.159.254.14]) by
+ vmmailproxy1.informatik.tu-muenchen.de (Postfix) with ESMTP id C5B891E012D
+ for <lammich@mail.informatik.tu-muenchen.de>; Fri,  4 May 2018 10:42:35
+ +0200 (CEST)
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix) id
+ C311D1C037B; Fri,  4 May 2018 10:42:35 +0200 (CEST)
+Delivered-To: peter.lammich@informatik.tu-muenchen.de
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id C01831C038B; Fri,  4 May 2018 10:42:35 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de (localhost
+ [127.0.0.1]) by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP
+ id 9B44B1C038A for <lammich@in.tum.de>; Fri,  4 May 2018 10:42:35 +0200
+ (CEST)
+Received: from vmmaildmz1.informatik.tu-muenchen.de
+ (vmmaildmz1.informatik.tu-muenchen.de [131.159.0.87]) by
+ vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id 90AF51C037B
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:42:35 +0200 (CEST)
+Received: by vmmaildmz1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id 8F12E1C2DB5; Fri,  4 May 2018 10:42:35 +0200 (CEST)
+X-Spam-Checker-Version: SpamAssassin 3.4.0-tuminfo_1 (2014-02-07) on
+ vmmaildmz1.informatik.tu-muenchen.de
+X-Spam-Level: 
+X-Spam-Status: No, score=-4.3 required=7.0 tests=BAYES_00,DKIM_SIGNED,
+ DKIM_VALID,DKIM_VALID_AU,HTML_MESSAGE,RCVD_IN_DNSWL_MED autolearn=no
+ autolearn_force=no version=3.4.0-tuminfo_1
+Received: from vmmaildmz1.informatik.tu-muenchen.de (localhost [127.0.0.1])
+ by vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTP id E52661C2DB4
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:42:33 +0200 (CEST)
+Received: from postout2.mail.lrz.de (postout2.mail.lrz.de
+ [129.187.255.138]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256
+ bits)) (No client certificate requested) by
+ vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTPS id D95DD1C2D9F
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:42:33 +0200 (CEST)
+Received: from lxmhs52.srv.lrz.de (localhost [127.0.0.1]) by
+ postout2.mail.lrz.de (Postfix) with ESMTP id 40clrT5sddzyTm for
+ <lammich@in.tum.de>; Fri,  4 May 2018 10:42:33 +0200 (CEST)
+Authentication-Results: postout.lrz.de (amavisd-new); dkim=pass (2048-bit
+ key) reason="pass (just generated, assumed good)" header.d=tum.de
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tum.de; h=
+ mime-version:content-type:content-type:content-language
+ :accept-language:message-id:date:date:subject:subject:from:from
+ :received:received:received:received; s=postout; t=1525423353;
+ bh=QprBl3d9x/n/VCkJL7zcysZTJxrhpIAf+0c/HX5FLTg=; b=M6bAoI7wn2ZN
+ XQ7mi/5+HgihQYnWDp/mGAJWfYWEbRHD3ah/TxojOfwzEXY8FsYPShH9zvknJvxe
+ BCCuwThth9VB21YQBIVVLCNqZtUCrKkNlpT3z8S9l/43S2Uj6jTsgeLcQg8j/p5W
+ 7UXYv/1YcwjjHH1WY36gAccS69gY6oXC7f88AhT2zYfwnyT0rBWPSWoT8oS8GSr/
+ ps7uT0y6q0UkDmsqJnx5z0bFIK618KRaZRhVMF8VOTAe5lp7l8/5rxXHPu2GPz4q
+ buwhI7MQ+0d1C+prGdkr3SO+qCjG97ku+dg71sOaQ4iY13ZM9HGBI79fV51ZPwEx
+ CChQNEr3+A==
+X-Virus-Scanned: by amavisd-new at lrz.de in lxmhs52.srv.lrz.de
+Received: from postout2.mail.lrz.de ([127.0.0.1]) by lxmhs52.srv.lrz.de
+ (lxmhs52.srv.lrz.de [127.0.0.1]) (amavisd-new, port 20024) with LMTP id
+ o37qE1dPvf-7 for <lammich@in.tum.de>; Fri,  4 May 2018 10:42:33 +0200 (CEST)
+Received: from BADWLRZ-SWMBX02.ads.mwn.de (BADWLRZ-SWMBX02.ads.mwn.de
+ [IPv6:2001:4ca0:0:108::158]) (using TLSv1.2 with cipher
+ ECDHE-RSA-AES256-SHA384 (256/256 bits)) (Client CN "BADWLRZ-SWMBX02",
+ Issuer "BADWLRZ-SWMBX02" (not verified)) by postout2.mail.lrz.de (Postfix)
+ with ESMTPS id 40clrT44zqzyTk for <lammich@in.tum.de>; Fri,  4 May 2018
+ 10:42:33 +0200 (CEST)
+Received: from BADWLRZ-SWMBX09.ads.mwn.de (2001:4ca0:0:108::165) by
+ BADWLRZ-SWMBX02.ads.mwn.de (2001:4ca0:0:108::158) with Microsoft SMTP
+ Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256)
+ id 15.1.1466.3; Fri, 4 May 2018 10:42:32 +0200
+Received: from BADWLRZ-SWMBX09.ads.mwn.de ([fe80::28c9:20b8:a4d6:473c]) by
+ BADWLRZ-SWMBX09.ads.mwn.de ([fe80::28c9:20b8:a4d6:473c%12]) with mapi id
+ 15.01.1466.003; Fri, 4 May 2018 10:42:32 +0200
+From: "Schmitt, Katharina" <katharinaluise.schmitt@tum.de>
+To: "lammich@in.tum.de" <lammich@in.tum.de>
+Subject: [FDS] Submission for exercise sheet 3
+Thread-Topic: [FDS] Submission for exercise sheet 3
+Thread-Index: AQHT44OSn1+7U/WQhEiN9ficbZsSVw==
+Date: Fri, 4 May 2018 08:42:32 +0000
+Message-ID: <9e846a05f26544788a17f35b117bd117@tum.de>
+Accept-Language: de-DE, en-US
+Content-Language: de-DE
+X-MS-Exchange-Organization-AuthAs: Internal
+X-MS-Exchange-Organization-AuthMechanism: 04
+X-MS-Exchange-Organization-AuthSource: BADWLRZ-SWMBX09.ads.mwn.de
+X-MS-Has-Attach: yes
+X-MS-TNEF-Correlator: 
+x-originating-ip: [194.76.29.70]
+Content-Type: multipart/mixed; boundary="_004_9e846a05f26544788a17f35b117bd117tumde_"
+MIME-Version: 1.0
+X-Evolution-Source: 1479990504.8344.16@lapnipkow10
+
+
+--_004_9e846a05f26544788a17f35b117bd117tumde_
+Content-Type: multipart/alternative; boundary="_000_9e846a05f26544788a17f35b117bd117tumde_"
+
+
+--_000_9e846a05f26544788a17f35b117bd117tumde_
+Content-Type: text/plain; charset="iso-8859-1"
+Content-Transfer-Encoding: 8bit
+
+Dear Dr. Lammich,
+
+
+attached please find my homework submission for exercise sheet 3.
+
+My administrative data is the following:
+
+
+Name: Katharina Schmitt
+
+Enrollment Number: 03630761
+
+TUM User ID: ga49ceq
+
+
+Best regards,
+
+Katharina Schmitt
+
+
+--_000_9e846a05f26544788a17f35b117bd117tumde_
+Content-Type: text/html; charset="iso-8859-1"
+Content-Transfer-Encoding: 8bit
+
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
+</head>
+<body dir="ltr">
+<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
+<p></p>
+<p>Dear Dr. Lammich,</p>
+<p><br>
+</p>
+<p>attached please find my homework submission for&nbsp;exercise sheet 3. <br>
+</p>
+<p>My administrative data is the following:</p>
+<p><br>
+</p>
+<p>Name: Katharina Schmitt</p>
+<p>Enrollment Number: 03630761</p>
+<p>TUM User ID: ga49ceq<br>
+</p>
+<p><br>
+</p>
+<p>Best regards,</p>
+<p>Katharina Schmitt</p>
+<br>
+<p></p>
+</div>
+</body>
+</html>
+
+--_000_9e846a05f26544788a17f35b117bd117tumde_--
+
+--_004_9e846a05f26544788a17f35b117bd117tumde_
+Content-Type: application/octet-stream; name="ex03.thy"
+Content-Description: ex03.thy
+Content-Disposition: attachment; filename="ex03.thy"; size=4539; creation-date="Fri, 04 May 2018 08:41:43 GMT"; modification-date="Fri, 04 May 2018 08:41:43 GMT"
+Content-Transfer-Encoding: base64
+
+dGhlb3J5IGV4MDMKICBpbXBvcnRzICJIT0wtTGlicmFyeS5UcmVlIgpiZWdpbgoKKCoKICBIb21l
+d29yayAzLjEKKikKKCpkYXRhdHlwZSAnYSB0cmVlID0gTEVBRiB8IE5PREUgIidhIHRyZWUiICdh
+ICInYSB0cmVlIiopCmRhdGF0eXBlIGRpcmVjdGlvbiA9IEwgfCBSCnR5cGVfc3lub255bSBwYXRo
+ID0gImRpcmVjdGlvbiBsaXN0IgoKZnVuIHZhbGlkIDo6ICIgJ2EgdHJlZSBcPFJpZ2h0YXJyb3c+
+IHBhdGggXDxSaWdodGFycm93PiBib29sIiB3aGVyZQoidmFsaWQgTGVhZiBbXSA9IFRydWUiIHwK
+InZhbGlkIExlYWYgKHgjeHMpID0gRmFsc2UiIHwKInZhbGlkIChOb2RlIGwgYSByKSBbXSA9IFRy
+dWUiIHwKInZhbGlkIChOb2RlIGwgYSByKSAoeCN4cykgPSAoaWYgeCA9IEwgdGhlbiAodmFsaWQg
+bCB4cykgZWxzZSAodmFsaWQgciB4cykpIgoKZnVuIGdldCA6OiAiICdhIHRyZWUgXDxSaWdodGFy
+cm93PiBwYXRoIFw8UmlnaHRhcnJvdz4gJ2EgdHJlZSIgd2hlcmUKImdldCBMZWFmIFtdID0gTGVh
+ZiIgfAoiZ2V0IExlYWYgKHgjeHMpID0gdW5kZWZpbmVkIiB8CiJnZXQgKE5vZGUgbCBhIHIpIFtd
+ID0gTm9kZSBsIGEgciIgfAoiZ2V0IChOb2RlIGwgYSByKSAoeCN4cykgPSAoaWYgeCA9IEwgdGhl
+biAoZ2V0IGwgeHMpIGVsc2UgKGdldCByIHhzKSkiCgpmdW4gcHV0IDo6ICIgJ2EgdHJlZSBcPFJp
+Z2h0YXJyb3c+IHBhdGggXDxSaWdodGFycm93PiAnYSB0cmVlIFw8UmlnaHRhcnJvdz4gJ2EgdHJl
+ZSIgd2hlcmUKInB1dCBMZWFmIFtdIHMgPSBzIiB8CiJwdXQgTGVhZiAocCNwcykgcyA9IExlYWYi
+IHwKInB1dCAoTm9kZSBsIGEgcikgW10gcyA9IHMiIHwKInB1dCAoTm9kZSBsIGEgcikgKEwjeHMp
+IHMgPSAoaWYgdmFsaWQgKE5vZGUgbCBhIHIpIChMI3hzKSB0aGVuIChOb2RlIChwdXQgbCB4cyBz
+KSBhIHIpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIChOb2RlIGwgYSByKSki
+IHwKInB1dCAoTm9kZSBsIGEgcikgKFIjeHMpIHMgPSAoaWYgdmFsaWQgKE5vZGUgbCBhIHIpIChS
+I3hzKSB0aGVuIChOb2RlIGwgYSAocHV0IHIgeHMgcykpCiAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgIGVsc2UgKE5vZGUgbCBhIHIpKSIgCgpsZW1tYSBwdXRfaW52YWxpZCA6ICJcPG5vdD4g
+dmFsaWQgdCBwIFw8bG9uZ3JpZ2h0YXJyb3c+IHB1dCB0IHAgcyA9IHQiCiBhcHBseShpbmR1Y3Rp
+b24gdCBwIHMgcnVsZTogcHV0LmluZHVjdCkKIGFwcGx5KGF1dG8gc3BsaXQ6IHRyZWUuc3BsaXRz
+KQogIGRvbmUKCmxlbW1hIGF1eF8xIDogInB1dCB0IFtdIHMgPSBzIiAKICBhcHBseShpbmR1Y3Rp
+b24gdCkKICBhcHBseShhdXRvKQogIGRvbmUKCmxlbW1hIGF1eF8xXzIgOiAKInggXDxub3RlcT4g
+TCBcPGxvbmdyaWdodGFycm93PiBwdXQgKE5vZGUgbCBhIHIpICh4I3hzKSBzID0gKE5vZGUgbCBh
+IChwdXQgciB4cyBzKSkiCiAgYXBwbHkoaW5kdWN0aW9uIHIgeHMgcyBhcmJpdHJhcnk6IHhzIHMg
+cnVsZTogcHV0LmluZHVjdCkKICBhcHBseShhdXRvKQogIHNvcnJ5CgpsZW1tYSBnZXRfcHV0W3Np
+bXBdOiAicHV0IHQgcCAoZ2V0IHQgcCkgPSB0IgogIGFwcGx5IChpbmR1Y3Rpb24gdCBwIHJ1bGU6
+IGdldC5pbmR1Y3QpCiAgYXBwbHkgKGF1dG8gc2ltcCBhZGQ6IGF1eF8xXzIgc3BsaXQ6IHRyZWUu
+c3BsaXRzKQogIGRvbmUKCmxlbW1hIHB1dF9wdXRbc2ltcF06ICJwdXQgKHB1dCB0IHAgcykgcCBz
+JyA9IHB1dCB0IHAgcyciCiAgYXBwbHkoaW5kdWN0aW9uIHQgcCBzIHJ1bGU6IHB1dC5pbmR1Y3Qp
+CiAgYXBwbHkoYXV0byBzaW1wIGFkZDogcHV0X2ludmFsaWQgYXV4XzEgc3BsaXQ6IHRyZWUuc3Bs
+aXRzKQogIGRvbmUKCmxlbW1hIGF1eF8yIDogImdldCBzIFtdID0gcyIKICBhcHBseShpbmR1Y3Rp
+b24gcykKICBhcHBseShhdXRvKQogIGRvbmUKCmxlbW1hIHB1dF9nZXRbc2ltcF06ICJ2YWxpZCB0
+IHAgXDxsb25ncmlnaHRhcnJvdz4gZ2V0IChwdXQgdCBwIHMpIHAgPSBzIgogIGFwcGx5KGluZHVj
+dGlvbiB0IHAgcyBydWxlOiBwdXQuaW5kdWN0KQogIGFwcGx5KGF1dG8gc2ltcCBhZGQ6IGF1eF8y
+IHNwbGl0OiB0cmVlLnNwbGl0cykKICBkb25lCgpsZW1tYSBhdXhfMyA6ICJ2YWxpZCB0IFtdID0g
+VHJ1ZSIKICBhcHBseShpbmR1Y3Rpb24gdCkKICBhcHBseShhdXRvKQogIGRvbmUKCmxlbW1hIHZh
+bGlkX3B1dFtzaW1wXTogInZhbGlkIHQgcCBcPGxvbmdyaWdodGFycm93PnZhbGlkIChwdXQgdCBw
+IHMpIHAiCiAgYXBwbHkoaW5kdWN0aW9uIHQgcCBzIHJ1bGU6IHB1dC5pbmR1Y3QpCiAgYXBwbHko
+YXV0byBzaW1wIGFkZDogYXV4XzMgc3BsaXQ6dHJlZS5zcGxpdHMpCiAgZG9uZQoKbGVtbWEgdmFs
+aWRfYXBwZW5kIFtzaW1wXTogIih2YWxpZCB0IChwQHEpKSBcPGxvbmdsZWZ0cmlnaHRhcnJvdz4g
+KCh2YWxpZCB0IHApIFw8YW5kPiAodmFsaWQgKGdldCB0IHApIHEpKSIKICBhcHBseShpbmR1Y3Rp
+b24gdCBwIGFyYml0cmFyeTogcSBydWxlOiB2YWxpZC5pbmR1Y3QpCiAgYXBwbHkoYXV0bykKICBk
+b25lCgpsZW1tYSBnZXRfYXBwZW5kIFtzaW1wXTogInZhbGlkIHQgcCBcPGxvbmdyaWdodGFycm93
+PiBnZXQgdCAocEBxKSA9IGdldCAoZ2V0IHQgcCkgcSIKICBhcHBseShpbmR1Y3Rpb24gdCBwIGFy
+Yml0cmFyeTogcSBydWxlOiBnZXQuaW5kdWN0KQogIGFwcGx5KGF1dG8gc3BsaXQ6IHRyZWUuc3Bs
+aXRzKQogIGRvbmUKCmxlbW1hIHB1dF9hcHBlbmQgW3NpbXBdOiAicHV0IHQgKHBAcSkgcyA9IHB1
+dCB0IHAgKHB1dCAoZ2V0IHQgcCkgcSBzKSIKICBhcHBseShpbmR1Y3Rpb24gdCBwIHMgYXJiaXRy
+YXJ5OiBxIHJ1bGU6IHB1dC5pbmR1Y3QpCiAgYXBwbHkoYXV0byBzaW1wIGFkZDogcHV0X2ludmFs
+aWQgc3BsaXQ6IHRyZWUuc3BsaXQpCiAgZG9uZQoKKCoKICBIb21ld29yayAzLjIKKikKCmZ1biBp
+c2luIDo6ICIoJ2E6Omxpbm9yZGVyKSB0cmVlIFw8UmlnaHRhcnJvdz4gJ2EgXDxSaWdodGFycm93
+PiBib29sIiB3aGVyZQoiaXNpbiBMZWFmIHggPSBGYWxzZSIgfAoiaXNpbiAoTm9kZSBsIGEgcikg
+eCA9CiAgKGlmIHggPCBhIHRoZW4gaXNpbiBsIHggZWxzZQogICBpZiB4ID4gYSB0aGVuIGlzaW4g
+ciB4CiAgIGVsc2UgVHJ1ZSkiCgpmdW4gaXNpbjIgOjogIignYTo6bGlub3JkZXIpIHRyZWUgXDxS
+aWdodGFycm93PiAnYSBvcHRpb24gXDxSaWdodGFycm93PiAnYSBcPFJpZ2h0YXJyb3c+IGJvb2wi
+IAogXDxjb21tZW50PiBcPG9wZW4+VGhlIHNlY29uZCBwYXJhbWV0ZXIgc3RvcmVzIHRoZSB2YWx1
+ZSBmb3IgdGhlIGRlZmVycmVkIGNvbXBhcmlzb25cPGNsb3NlPgp3aGVyZSAKICAiaXNpbjIgTGVh
+ZiByZW0gayA9IChjYXNlIHJlbSBvZiBTb21lIGEgXDxSaWdodGFycm93PiBhPWsgfCBOb25lIFw8
+UmlnaHRhcnJvdz4gRmFsc2UpIgp8ICJpc2luMiAoTm9kZSBsIGEgcikgcmVtIGsgPSAoCiAgICBp
+ZiBrPGEgdGhlbiBpc2luMiBsIHJlbSBrIAogICAgZWxzZSBpc2luMiByIChTb21lIGEpIGspIiAK
+CmZ1biBpbnMgOjogIidhOjpsaW5vcmRlciBcPFJpZ2h0YXJyb3c+ICdhIHRyZWUgXDxSaWdodGFy
+cm93PiAnYSB0cmVlIiB3aGVyZQoiaW5zIHggTGVhZiA9IE5vZGUgTGVhZiB4IExlYWYiIHwKImlu
+cyB4IChOb2RlIGwgYSByKSA9CiAgKGlmIHggPCBhIHRoZW4gTm9kZSAoaW5zIHggbCkgYSByIGVs
+c2UKICAgaWYgeCA+IGEgdGhlbiBOb2RlIGwgYSAoaW5zIHggcikKICAgZWxzZSBOb2RlIGwgYSBy
+KSIKCmZ1biBic3RfcmVtZHVwc19hdXggOjogIiAnYTo6bGlub3JkZXIgdHJlZSBcPFJpZ2h0YXJy
+b3c+ICdhIGxpc3QgXDxSaWdodGFycm93PiAnYSBsaXN0IiB3aGVyZQoiYnN0X3JlbWR1cHNfYXV4
+IHQgW10gPSBbXSIgfAoiYnN0X3JlbWR1cHNfYXV4IHQgKHgjeHMpID0gKGlmIChpc2luIHQgeCkg
+dGhlbiBic3RfcmVtZHVwc19hdXggdCB4cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVs
+c2UgKHgjKGJzdF9yZW1kdXBzX2F1eCAoaW5zIHggdCkgeHMpKSkiCgpkZWZpbml0aW9uICJic3Rf
+cmVtZHVwcyB4cyBcPGVxdWl2PiBic3RfcmVtZHVwc19hdXggTGVhZiB4cyIKCmxlbW1hICJzZXQg
+KGJzdF9yZW1kdXBzIHhzKSA9IHNldCB4cyIKICBhcHBseShhdXRvKQogIHNvcnJ5CgpsZW1tYSAi
+ZGlzdGluY3QgKGJzdF9yZW1kdXBzIHhzKSIKICBhcHBseShpbmR1Y3Rpb24geHMgcnVsZTogYnN0
+X3JlbWR1cHNfYXV4LmluZHVjdCkKICBhcHBseShhdXRvKQogIHNvcnJ5CgpmdW4gc3VibGlzdCA6
+OiAiICdhIGxpc3QgXDxSaWdodGFycm93PiAnYSBsaXN0IFw8UmlnaHRhcnJvdz4gYm9vbCIgd2hl
+cmUKInN1Ymxpc3QgW10geXMgPSBUcnVlIiB8CiJzdWJsaXN0IHhzIFtdID0gRmFsc2UiIHwKInN1
+Ymxpc3QgKHgjeHMpICh5I3lzKSA9IChpZiB4PXkgdGhlbiBzdWJsaXN0IHhzIHlzIGVsc2Ugc3Vi
+bGlzdCAoeCN4cykgeXMpIgoKbGVtbWEgInN1Ymxpc3QgKGJzdF9yZW1kdXBzIHhzKSB4cyIKICBh
+cHBseShpbmR1Y3Rpb24geHMgcnVsZTpzdWJsaXN0LmluZHVjdCkKICBhcHBseShzaW1wKQogIGFw
+cGx5KHNpbXApCiAgYXBwbHkoYXV0bykKICBzb3JyeQoKZW5k
+
+--_004_9e846a05f26544788a17f35b117bd117tumde_--
+
+From j.v.mutius@gmail.com Fri May  4 10:43:24 2018
+Return-Path: <j.v.mutius@gmail.com>
+Delivered-To: <lammich@mailstore.informatik.tu-muenchen.de>
+Received: from vmmailstore1.informatik.tu-muenchen.de by
+ vmmailstore1.informatik.tu-muenchen.de (Dovecot) with LMTP id
+ PZ1qLxYd7FoZTwAArPjJig for <lammich@mailstore.informatik.tu-muenchen.de>;
+ Fri, 04 May 2018 10:43:24 +0200
+Received: from vmmailproxy1.informatik.tu-muenchen.de
+ (vmmailproxy1.informatik.tu-muenchen.de [131.159.0.83]) by
+ vmmailstore1.informatik.tu-muenchen.de (Postfix) with ESMTP id 07CAD1C2029
+ for <lammich@mailstore.informatik.tu-muenchen.de>; Fri,  4 May 2018
+ 10:43:24 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de
+ (mailrelay1.informatik.tu-muenchen.de [131.159.254.14]) by
+ vmmailproxy1.informatik.tu-muenchen.de (Postfix) with ESMTP id 0619A1E012D
+ for <lammich@mail.informatik.tu-muenchen.de>; Fri,  4 May 2018 10:43:24
+ +0200 (CEST)
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix) id
+ 0392A1C038B; Fri,  4 May 2018 10:43:24 +0200 (CEST)
+Delivered-To: peter.lammich@informatik.tu-muenchen.de
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id 0132D1C038F; Fri,  4 May 2018 10:43:23 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de (localhost
+ [127.0.0.1]) by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP
+ id D0F991C037C for <lammich@in.tum.de>; Fri,  4 May 2018 10:43:23 +0200
+ (CEST)
+Received: from vmmaildmz1.informatik.tu-muenchen.de
+ (vmmaildmz1.informatik.tu-muenchen.de [131.159.0.87]) by
+ vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id C69231C037B
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:43:23 +0200 (CEST)
+Received: by vmmaildmz1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id C512E1C2DB6; Fri,  4 May 2018 10:43:23 +0200 (CEST)
+X-Spam-Checker-Version: SpamAssassin 3.4.0-tuminfo_1 (2014-02-07) on
+ vmmaildmz1.informatik.tu-muenchen.de
+X-Spam-Level: 
+X-Spam-Status: No, score=-2.0 required=7.0 tests=AWL,BAYES_00,DKIM_SIGNED,
+ DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,
+ RCVD_IN_MSPIKE_WL autolearn=no autolearn_force=no version=3.4.0-tuminfo_1
+Received: from vmmaildmz1.informatik.tu-muenchen.de (localhost [127.0.0.1])
+ by vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTP id 0587C1C2D9F
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:43:22 +0200 (CEST)
+Received: from mail-wm0-f51.google.com (mail-wm0-f51.google.com
+ [74.125.82.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256
+ (128/128 bits)) (No client certificate requested) by
+ vmmaildmz1.informatik.tu-muenchen.de (Postfix) with ESMTPS id D9F8B1C2DB4
+ for <lammich@in.tum.de>; Fri,  4 May 2018 10:43:21 +0200 (CEST)
+Received: by mail-wm0-f51.google.com with SMTP id x12-v6so6083518wmc.0 for
+ <lammich@in.tum.de>; Fri, 04 May 2018 01:43:21 -0700 (PDT)
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com;
+ s=20161025; h=message-id:subject:from:to:date:mime-version;
+ bh=NxLgbwuztx5RnKyxFdzzX0otL24JrtK75VCIvmyr1AE=;
+ b=RcHVSlL47gflWSFGsOC8ApWYyBuOzaUX9ZZL25zcJ1ezpOrb+gKeYNi8JWJF/b1DwH
+ 9MnUZMgWFN2EYAz1ArWem3lwK1OVJXNCvlSoXMVMBdHFZw1DGYbHcQNnRakC9I5fPgZB
+ /0tapI7mQ5Dm/TIjjDmbC/jSAozt/N4+FqcHtRJJBtO7qva4xHnt557H8ELncVl4RZND
+ S4+qaNPmVO//gjIjC2cerZPaTu9Q5Th8T+iOEfCrDO2nGoNzX+KPu6ad75lCw3sezTWy
+ ETCEY1jrJMtLpJsU2yM9p3qVdi5PQyKL2BVc4esr5Lhhesbpt69vHyMvSi7UVPZwmiup pvIQ==
+X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net;
+ s=20161025;
+ h=x-gm-message-state:message-id:subject:from:to:date:mime-version;
+ bh=NxLgbwuztx5RnKyxFdzzX0otL24JrtK75VCIvmyr1AE=;
+ b=Edz39D5SQZrECxREoNhklb+JA4ubeiKxX4g+26iNwYXwd6scUZVh2TOUteK5FxVnLw
+ +7mf30lcaMj32mzVe0P/l4y9U/7c3TI+pPaoISd16VOYHIZ6fVpzQCyLi+T1AhhHZ3s7
+ PxXU8l8PBqsTclxAXGMP6r3Mc/oOgXNhYr+oySMLFQzL4NbFWrg5uHc6jgJn5jjzWgfi
+ L71RNak291zsTB+yBhNbDPRAZIgRYjlO2UvzWL9UsMydgud06R+etyY/TiSoldnsVZCu
+ 1dANZkhZP26VKzTimQq7cWe59yzLC4rQPdtZvzABH9/hSnI5fnCghgsxq0qYFKuyG7JT vf4w==
+X-Gm-Message-State:
+ ALQs6tDIXLYvcVTiLHm0esdlW1e/RI14vayAZ/nUtIpi/MeLPePktZDC
+ lHVMY6bXAICvp6+CLClm4558T2cy
+X-Google-Smtp-Source:
+ AB8JxZon3obO+6/+fQ302Utj2gfI1hD7euk9q9vjG0F3tg3mA79ECvt17VIofsui8oI7SUA/gIGRuw==
+X-Received: by 10.28.217.19 with SMTP id q19mr3778177wmg.91.1525423401338;
+ Fri, 04 May 2018 01:43:21 -0700 (PDT)
+Received: from x200arch (w3mcopupx55fiv-v6.eduroam.dynamic.rbg.tum.de.
+ [2001:4ca0:2003:1920:ee1a:a3c0:db1f:36d8]) by smtp.googlemail.com with
+ ESMTPSA id 135sm1538524wmx.21.2018.05.04.01.43.19 for <lammich@in.tum.de>
+ (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 04
+ May 2018 01:43:20 -0700 (PDT)
+Message-ID: <dfd16ed92c3e14587703168e6275260d3dfc3e7f.camel@gmail.com>
+Subject: [FDS]
+From: Joshua von Mutius <j.v.mutius@gmail.com>
+To: Peter Lammich <lammich@in.tum.de>
+Date: Fri, 04 May 2018 10:40:32 +0200
+Content-Type: multipart/mixed; boundary="=-XLCxpUZDKq+v8c+K+mYv"
+X-Mailer: Evolution 3.28.1 
+Mime-Version: 1.0
+X-Evolution-Source: 1479990504.8344.16@lapnipkow10
+
+
+--=-XLCxpUZDKq+v8c+K+mYv
+Content-Type: text/plain; charset="UTF-8"
+Content-Transfer-Encoding: 8bit
+
+Hello Mr. Lammich,
+
+you can find my solution for homework 3 attached to this email.
+
+Joshua von Mutius
+--=-XLCxpUZDKq+v8c+K+mYv
+Content-Disposition: attachment; filename="hw03.thy"
+Content-Type: text/plain; name="hw03.thy"; charset="UTF-8"
+Content-Transfer-Encoding: 8bit
+
+(*<*)
+theory hw03
+imports "../Demos/BST_Demo" 
+begin
+(*>*)
+
+text {* \NumHomework{Tree Addressing}{May 4} *}
+text \<open>
+  A position in a tree can be given as a list of 
+  navigation instructions from the root, i.e., whether to go 
+  to the left or right subtree. We call such a list a path.
+\<close>
+  datatype direction = L | R
+  type_synonym path = "direction list"
+
+text \<open>Specify when a path is valid:\<close>  
+  
+fun valid :: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+  "valid _ [] = True"
+| "valid Leaf (x#_) = False"
+| "valid (Node l x r) (L#xs) = valid l xs"
+| "valid (Node l x r) (R#xs) = valid r xs"
+
+text \<open>Specify a function to return the subtree addressed by a given path:\<close>
+
+fun get :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree" where
+  "get Leaf _ = Leaf"
+| "get (Node l a r) [] = (Node l a r)"
+| "get (Node l a r) (L#xs) = (get l xs)" 
+| "get (Node l a r) (R#xs) = (get r xs)"
+  
+text \<open>Specify a function \<open>put t p s\<close>, that returns \<open>t\<close>, with the subtree 
+  at \<open>p\<close> replaced by \<open>t\<close>.
+\<close>
+
+fun put :: " 'a tree \<Rightarrow> path \<Rightarrow> 'a tree \<Rightarrow> 'a tree" where
+  "put _ [] s = s"
+| "put Leaf (x#_) s = Leaf"
+| "put (Node l a r) (L#xs) s = (Node (put l xs s) a r)"
+| "put (Node l a r) (R#xs) s = (Node l a (put r xs s))"
+
+text \<open>Specify your function such that it does nothing if an invalid path 
+  is given, and prove:  
+  \<close>
+
+  lemma put_invalid : " \<not>valid t p \<Longrightarrow> put t p s = t"
+    by (induction t p s  rule: put.induct) auto
+
+
+text \<open>Note: this convention will simplify some of 
+  the lemmas, reducing the required validity preconditions.
+  
+  Prove the following algebraic laws on \<open>put\<close> and \<open>get\<close>. 
+  Add preconditions of the form \<open>valid t p\<close> where needed!
+  \<close>
+  
+  lemma put_leaf_leaf[simp]: "put Leaf p Leaf = Leaf"
+    by (induction p) auto
+
+  lemma get_put[simp]:"put t p (get t p) = t"
+    by (induction t p rule: get.induct)
+    auto
+      
+  lemma put_put[simp]: "put (put t p s) p s = put t p s"
+    by(induction t p s rule: put.induct)
+    auto
+
+  lemma get_empty_path[simp]: "get s [] = s" by (cases s) auto
+  
+  lemma put_get[simp]: "valid t p \<Longrightarrow> get (put t p s) p = s"
+    by(induction t p s rule: put.induct)
+    auto
+
+  lemma valid_put[simp]: "valid t p \<Longrightarrow> valid (put t p s) p"
+    by (induction t  p rule: valid.induct) auto
+    
+  text \<open>
+    Show the following lemmas about appending two paths:
+  \<close>  
+
+  lemma valid_append [simp]: "valid t (p @ q) \<longleftrightarrow> valid t p \<and> valid (get t p) q"
+    by (induction t p  rule: valid.induct) auto
+
+  lemma get_append [simp]: "valid t p \<Longrightarrow> get t (p@q) = get (get t p) q"
+    by (induction t p rule: valid.induct) auto
+
+  lemma put_append [simp]: "valid t (p @q) \<Longrightarrow> put t (p@q) s = put t p (put (get t p) q s)"
+    by (induction t p s rule: put.induct) auto
+
+text {* \NumHomework{Remdups}{May 4} *}
+
+text \<open>Your task is to write a function that removes duplicates from a list, using a 
+  BST to efficiently store the set of already encountered elements.
+
+  You may want to start with an auxiliary function, that takes the BST with 
+  the elements seen so far as additional argument, and then define the actual function.
+\<close>
+
+fun bst_remdups_aux :: "'a::linorder tree \<Rightarrow> 'a list \<Rightarrow> 'a list" where
+  "bst_remdups_aux t [] = inorder t"
+| "bst_remdups_aux t (x#xs) = bst_remdups_aux (ins x t) xs"
+
+definition "bst_remdups xs \<equiv> bst_remdups_aux Leaf xs"
+
+
+text \<open>Show that your function preserves the set of elements, and returns a list 
+  with no duplicates (predicate \<open>distinct\<close> in Isabelle).
+  Hint: Generalization!
+\<close>
+declare BST_Demo.set_tree_ins[simp add]
+declare BST_Demo.bst_ins[simp add]
+
+  lemma ins_remdups[simp]: "set (bst_remdups_aux (ins x t) xs) = {x} \<union> set (bst_remdups_aux t xs)"
+    by(induction xs arbitrary: x t) auto
+
+  lemma set_bst_remdups_aux[simp]: "set (bst_remdups_aux t xs) = set_tree t \<union> set xs"
+    by (induction xs) auto
+
+  lemma "set (bst_remdups xs) = set xs"
+    by (simp add: bst_remdups_def)
+
+  lemma bst_inorder_dist[simp]: "bst t \<Longrightarrow> distinct (inorder t)"
+    apply (induction t)
+     apply simp 
+      apply fastforce
+    done
+
+  lemma distinct_bst_remdups_aux[simp]: "bst t \<Longrightarrow> distinct (bst_remdups_aux t xs)"
+    by (induction xs arbitrary: t) auto
+
+  lemma "distinct(bst_remdups xs)"
+    by (simp add: bst_remdups_def)
+
+text \<open>A list \<open>xs\<close> is a sublist of \<open>ys\<close>,
+  if \<open>xs\<close> can be produced from \<open>ys\<close> by deleting an 
+  arbitrary number of elements.
+
+  Define a function \<open>sublist xs ys\<close> to check whether \<open>xs\<close> is a sublist of \<open>ys\<close>.
+\<close>
+
+fun sublist :: "'a list \<Rightarrow> 'a list \<Rightarrow> bool" 
+where
+  "sublist [] [] = True"
+| "sublist [] (y#ys) = True"
+| "sublist (x#xs) [] = False"
+| "sublist (x#xs) (y#ys) = 
+    (if x = y then True \<and> sublist xs ys else sublist [x] ys \<and> sublist xs (y#ys))"
+
+text \<open>Show that your remdups function produces a sublist of the original list!
+
+  Hint: Generalization. Auxiliary lemma required.
+\<close>
+  lemma sublist_subset[simp]:"\<lbrakk>distinct xs ; set xs \<subseteq> set ys\<rbrakk> \<Longrightarrow> sublist xs ys"
+    by (induction xs ys rule: sublist.induct) auto
+
+  lemma "sublist (bst_remdups xs) xs" by(simp add: bst_remdups_def)
+
+(*<*) end (*>*)
+--=-XLCxpUZDKq+v8c+K+mYv--
+
+
+From g.bidlingmaier@tum.de Fri May  4 11:19:37 2018
+Return-Path: <g.bidlingmaier@tum.de>
+Delivered-To: <lammich@mailstore.informatik.tu-muenchen.de>
+Received: from vmmailstore1.informatik.tu-muenchen.de by
+ vmmailstore1.informatik.tu-muenchen.de (Dovecot) with LMTP id
+ KNNPJmQl7FpwUAAArPjJig for <lammich@mailstore.informatik.tu-muenchen.de>;
+ Fri, 04 May 2018 11:19:37 +0200
+Received: from vmmailproxy1.informatik.tu-muenchen.de
+ (vmmailproxy1.informatik.tu-muenchen.de [131.159.0.83]) by
+ vmmailstore1.informatik.tu-muenchen.de (Postfix) with ESMTP id 740E01C2029
+ for <lammich@mailstore.informatik.tu-muenchen.de>; Fri,  4 May 2018
+ 11:19:37 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de
+ (mailrelay1.informatik.tu-muenchen.de [131.159.254.14]) by
+ vmmailproxy1.informatik.tu-muenchen.de (Postfix) with ESMTP id 7225E1E012D
+ for <lammich@mail.informatik.tu-muenchen.de>; Fri,  4 May 2018 11:19:37
+ +0200 (CEST)
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix) id
+ 6FABD1C038B; Fri,  4 May 2018 11:19:37 +0200 (CEST)
+Delivered-To: peter.lammich@informatik.tu-muenchen.de
+Received: by vmmailrelay1.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id 6D3761C038A; Fri,  4 May 2018 11:19:37 +0200 (CEST)
+Received: from vmmailrelay1.informatik.tu-muenchen.de (localhost
+ [127.0.0.1]) by vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP
+ id 4848B1C037C for <lammich@in.tum.de>; Fri,  4 May 2018 11:19:37 +0200
+ (CEST)
+Received: from vmmaildmz2.informatik.tu-muenchen.de
+ (vmmaildmz2.informatik.tu-muenchen.de [131.159.0.88]) by
+ vmmailrelay1.informatik.tu-muenchen.de (Postfix) with ESMTP id 3DAC41C037B
+ for <lammich@in.tum.de>; Fri,  4 May 2018 11:19:37 +0200 (CEST)
+Received: by vmmaildmz2.informatik.tu-muenchen.de (Postfix, from userid
+ 109) id 3C0F61C24C7; Fri,  4 May 2018 11:19:37 +0200 (CEST)
+X-Spam-Checker-Version: SpamAssassin 3.4.0-tuminfo_1 (2014-02-07) on
+ vmmaildmz2.informatik.tu-muenchen.de
+X-Spam-Level: 
+X-Spam-Status: No, score=-4.3 required=7.0 tests=BAYES_00,DKIM_SIGNED,
+ DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_MED autolearn=no autolearn_force=no
+ version=3.4.0-tuminfo_1
+Received: from vmmaildmz2.informatik.tu-muenchen.de (localhost [127.0.0.1])
+ by vmmaildmz2.informatik.tu-muenchen.de (Postfix) with ESMTP id DD2491C24C8
+ for <lammich@in.tum.de>; Fri,  4 May 2018 11:19:31 +0200 (CEST)
+Received: from postout1.mail.lrz.de (postout1.mail.lrz.de
+ [129.187.255.137]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256
+ bits)) (No client certificate requested) by
+ vmmaildmz2.informatik.tu-muenchen.de (Postfix) with ESMTPS id D222B1C24AD
+ for <lammich@in.tum.de>; Fri,  4 May 2018 11:19:31 +0200 (CEST)
+Received: from lxmhs51.srv.lrz.de (localhost [127.0.0.1]) by
+ postout1.mail.lrz.de (Postfix) with ESMTP id 40cmg75jcqzyWW for
+ <lammich@in.tum.de>; Fri,  4 May 2018 11:19:31 +0200 (CEST)
+Authentication-Results: postout.lrz.de (amavisd-new); dkim=pass (2048-bit
+ key) reason="pass (just generated, assumed good)" header.d=tum.de
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tum.de; h=
+ content-language:content-type:content-type:mime-version
+ :user-agent:date:date:message-id:subject:subject:from:from
+ :received:received; s=postout; t=1525425571; bh=z6DjyM/moajBgLBi
+ XIrp0XTKPPZNo7tHZ28D3Ss2WZE=; b=Lq/1/vHMX8OqVKW6+6RkEzhmnHr1zO1+
+ 8LBCDVUCnpKVsmgPzePPoiZZOv463oaSkjEXxBJytk7trnMZWlXQyIH8uawRjPPP
+ uRcYXmKhBPc8Q/mNoJRVW9GD0jl3OYnYjDH54ds0Z3jd8ombakmPaOt6RyOki/dt
+ rpwbZANqrel1Q8H2R9s6wfo4eQoHMYqj75E+YpUQl+v7yykeT8THVQCEf/4YM7mm
+ zYNqHY6f+Ytz9IlI0YweDUWOzsXkJgbYo4Tkj87dkqUVZG3qKucMI9fVQTy46p4Y
+ 8w/khVScPL9/ztqJTS33rzyYm0pawvf70kKB/Jyr5wkWx0wAVKpzzA==
+X-Virus-Scanned: by amavisd-new at lrz.de in lxmhs51.srv.lrz.de
+Received: from postout1.mail.lrz.de ([127.0.0.1]) by lxmhs51.srv.lrz.de
+ (lxmhs51.srv.lrz.de [127.0.0.1]) (amavisd-new, port 20024) with LMTP id
+ EHw-efczniwC for <lammich@in.tum.de>; Fri,  4 May 2018 11:19:31 +0200 (CEST)
+Received: from [192.168.2.197]
+ (dslb-094-216-124-037.094.216.pools.vodafone-ip.de [94.216.124.37]) (using
+ TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client
+ certificate requested) by postout1.mail.lrz.de (Postfix) with ESMTPSA id
+ 40cmg66yPLzyW8 for <lammich@in.tum.de>; Fri,  4 May 2018 11:19:30 +0200
+ (CEST)
+To: lammich@in.tum.de
+From: Gunther Bidlingmaier <g.bidlingmaier@tum.de>
+Subject: [FDS] Submission homework 3 Gunther Bidlingmaier
+Message-ID: <022fa81a-8043-0f6b-1c1a-332f9b43abe5@tum.de>
+Date: Fri, 4 May 2018 11:19:30 +0200
+User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
+ Thunderbird/52.7.0
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="------------F7C4AEF7D874DB1FA4A41C1D"
+Content-Language: en-US
+X-Evolution-Source: 1479990504.8344.16@lapnipkow10
+
+This is a multi-part message in MIME format.
+--------------F7C4AEF7D874DB1FA4A41C1D
+Content-Type: text/plain; charset=utf-8; format=flowed
+Content-Transfer-Encoding: 8bit
+
+Gunther Bidlingmaier
+
+03663324
+
+
+--------------F7C4AEF7D874DB1FA4A41C1D
+Content-Type: text/plain; charset=UTF-8; name="tmpl03.thy"
+Content-Disposition: attachment; filename="tmpl03.thy"
+Content-Transfer-Encoding: 8bit
+
+(*<*)
+theory tmpl03
+imports "../Demos/BST_Demo" 
+begin
+(*>*)
+
+
+
+text {* \ExerciseSheet{3}{27.~4.~2018} *}
+
+text \<open>
+  \Exercise{Membership Test with Less Comparisons}
+
+  In worst case, the @{const isin} function performs two comparisons per node.
+  In this exercise, we want to reduce this to one comparison per node, with the 
+  following idea:
+  
+  One never tests for \<open>>\<close>, but always goes right if not \<open><\<close>. 
+  However, one remembers the value where one should have tested for \<open>=\<close>,
+  and performs the comparison when a leaf is reached.
+\<close>
+      
+fun isin2 :: "('a::linorder) tree \<Rightarrow> 'a option \<Rightarrow> 'a \<Rightarrow> bool" 
+ \<comment> \<open>The second parameter stores the value for the deferred comparison\<close>
+where "isin2 _ _ _ = undefined"
+
+
+text \<open>Show that your function is correct. 
+
+  Hint: Auxiliary lemma for \<open>isin2 t (Some y) x\<close> !
+\<close>
+lemma isin2_None:
+  "bst t \<Longrightarrow> isin2 t None x = isin t x" oops
+
+      
+text \<open>
+  \Exercise{Height-Preserving In-Order Join}
+  Write a function that joins two binary trees such that
+  \<^item> The in-order traversal of the new tree is the concatenation of the in-order traversals of the original tree
+  \<^item> The new tree is at most one higher than the highest original tree
+
+  Hint: Once you got the function right, proofs are easy!
+\<close>  
+fun join :: "'a tree \<Rightarrow> 'a tree \<Rightarrow> 'a tree" 
+  where
+"join _ _ = undefined"
+
+lemma join_inorder[simp]: "inorder(join t1 t2) = inorder t1 @ inorder t2"
+  oops
+
+lemma "height(join t1 t2) \<le> max (height t1) (height t2) + 1"
+  oops
+
+text \<open>
+  \Exercise{Implement Delete}
+  Implement delete using the \<open>join\<close> function from last exercise.
+\<close>  
+
+text \<open>Note: At this point, we are not interested in the implementation details 
+  of join any more, but just in its specification, i.e., what it does to trees.
+  Thus, as first step, we declare its equations to not being automatically unfolded.
+\<close>
+
+declare join.simps[simp del]
+
+text \<open>Both, \<open>set_tree\<close> and \<open>bst\<close> can be expressed by the inorder traversal over trees:\<close>
+
+thm set_inorder[symmetric] bst_iff_sorted_wrt_less
+
+text \<open>Note: As @{thm [source] set_inorder} is declared as simp. 
+  Be careful not to have both directions of the lemma in the simpset at the 
+  same time, otherwise the simplifier is likely to loop.
+  
+  You can use \<open>simp del: set_inorder add: set_inorder[symmetric]\<close>, or
+  \<open>auto simp del: set_inorder simp: set_inorder[symmetric]\<close> to 
+  temporarily remove the lemma from the simpset.
+  
+  Alternatively, you can write \<open>declare set_inorder[simp_del]\<close> to
+  remove it once and forall.
+\<close>
+
+
+text "For the \<open>sorted_wrt\<close> predicate, you might want to use these lemmas as simp:"
+thm sorted_wrt_append sorted_wrt_Cons
+
+text \<open>Show that join preserves the set of entries\<close>
+lemma [simp]: "set_tree (join t1 t2) = set_tree t1 \<union> set_tree t2"
+  oops
+
+text \<open>Show that joining the left and right child of a BST is again a BST:\<close>
+
+lemma [simp]: "bst (Node l (x::_::linorder) r) \<Longrightarrow> bst (join l r)"
+  oops
+
+text \<open>Implement a delete function using the idea contained in the lemmas above.\<close>  
+fun delete :: "'a::linorder \<Rightarrow> 'a tree \<Rightarrow> 'a tree" 
+where
+  "delete _ _ = undefined"
+
+text \<open>Prove it correct! Note: You'll need the first lemma to prove the second one! \<close>  
+lemma [simp]: "bst t \<Longrightarrow> set_tree (delete x t) = set_tree t - {x}"
+  oops
+
+lemma "bst t \<Longrightarrow> bst (delete x t)"
+  oops  
+(* Homework 3.1 *)
+text {* \NumHomework{Tree Addressing}{May 4} *}
+text \<open>
+  A position in a tree can be given as a list of 
+  navigation instructions from the root, i.e., whether to go 
+  to the left or right subtree. We call such a list a path.
+\<close>
+  datatype direction = L | R
+  type_synonym path = "direction list"
+
+text \<open>Specify when a path is valid:\<close>  
+
+  fun valid :: "'a tree \<Rightarrow> path \<Rightarrow> bool" where
+    "valid t [] = True"
+  | "valid Leaf (d#ds) = False"
+  | "valid (Node l _ r) (L#ds) = valid l ds"
+  | "valid (Node l _ r) (R#ds) = valid r ds"
+  
+text \<open>Specify a function to return the subtree addressed by a given path:\<close>  
+  fun get :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree"
+  where
+    "get t [] = t"
+  | "get (Node l v r) (L#ds) = get l ds"
+  | "get (Node l v r) (R#ds) = get r ds"
+  | "get _ _ = undefined" -- \<open>Catch-all clause to get rid of missing patterns warning\<close>
+  
+  fun put :: "'a tree \<Rightarrow> path \<Rightarrow> 'a tree \<Rightarrow> 'a tree" 
+    where 
+      "put t1 [] t2 = t2"
+    | "put Leaf (d#ds) t2 = Leaf"
+    | "put (Node l v r) (L#ds) t2 = Node (put l ds t2) v r"
+    | "put (Node l v r) (R#ds) t2 = Node l v (put r ds t2)"
+
+thm put.induct
+lemma put_invalid: "\<not>valid t p \<Longrightarrow> put t p s = t"
+  apply (induction t p rule: valid.induct)
+  apply auto
+  done
+
+lemma get_put[simp]: "valid t p \<Longrightarrow> put t p (get t p) = t"
+  apply (induction t p rule: valid.induct)
+  apply auto
+  done
+
+lemma put_put[simp]: "put (put t p s) p s' = put t p s'"
+  apply (induction t p rule: valid.induct)
+  apply auto
+  done
+
+
+lemma put_get[simp]: "valid t p \<Longrightarrow> get (put t p s) p = s"
+  apply (induction t p rule: valid.indu