mirror of
https://github.com/janishutz/eth-summaries.git
synced 2026-07-27 21:29:09 +02:00
[FMFP] Notes
This commit is contained in:
Binary file not shown.
@@ -15,6 +15,8 @@ For all functions with recursion, don't forget the base cases. In addition, for
|
||||
there is no equal sign before the pipe characters.
|
||||
For the cases notation, there are equal signs. We can use underscores as a ``don't care'' character.
|
||||
|
||||
Always consider making use of functions defined in previous subtasks. This can save a lot of time.
|
||||
|
||||
\subparagraph{Lists}
|
||||
In list comprehensions, to draw from a list, \texttt{<-} is used, to delimit the description of the list contents from the generator part, we use a pipe character
|
||||
and to separate each statement in the generator part, we use a comma.
|
||||
@@ -49,6 +51,8 @@ Ideally, we first write the function, then infer its type.
|
||||
Remember that in the definition of these two functions, the \texttt{-> b ->} (and \texttt{-> a ->}, respectively) denote the type of the base case.
|
||||
|
||||
For more elaborate data structures, the functions for each subtype should be in the same order as in the data type definition, for canonical definition of the fold function.
|
||||
Note that these functions' type doesn't contain the data structure typically, but simply, e.g. for \texttt{Mlist a = Bot | Node [a] (Mlist a)},
|
||||
the type of the canonical fold function is simply \texttt{b -> ([a] -> a -> b) -> Mlist a -> b} and not \texttt{(Mlist b) -> ([a] -> Mlist a -> Mlist b) -> (Mlist a) -> (Mlist b)}.
|
||||
|
||||
|
||||
\subparagraph{zipWith}
|
||||
@@ -69,4 +73,6 @@ Remember:
|
||||
\item in the end state that since it holds for all $n$, it, in particular, holds for $n = 0$ (or equivalent)
|
||||
\end{itemize}
|
||||
For generalizing, a very helpful tactic is to think about the statement some, come up with the generalization you think is correct, then doing the base case in the proof
|
||||
after only a very short amount of time, as the correct generalized statement will become apparent there very quickly
|
||||
after only a very short amount of time, as the correct generalized statement will become apparent there very quickly.
|
||||
|
||||
Remember to always check that parenthesis are set correctly and to only apply one rule exactly once.
|
||||
|
||||
@@ -7,7 +7,9 @@ Contrary to those however, we have pre- and postconditions, which we typically n
|
||||
This typically involves finding a loop invariant that holds before and after each iteration of the loop.
|
||||
This invariant should mention every variable used in the loop.
|
||||
Any other variable should also be mentioned in it. The loop \textit{variant} may also be added for proving termination.
|
||||
A typical for-loop loop variant would be \texttt{n - x = Z}, as the next value of the loop variant has to be lower than the previous one.
|
||||
A typical for-loop loop variant would be \texttt{n - x = Z}, or the same for a while loop like \texttt{while i < n do s end},
|
||||
as the next value of the loop variant has to be lower than the previous one.
|
||||
|
||||
The preconditions and postconditions in the loops then reflect that the update to the loop variant variable(s) leads to them being smaller than $Z$,
|
||||
which allows proving that the loop variant is decreasing, signifying that the loop terminates \textit{eventually}.
|
||||
Of course, if \texttt{x} is decreasing, it itself can become the variant, as it fulfils the condition.
|
||||
|
||||
Reference in New Issue
Block a user