==== Preliminary test for the course on Models of Computation ====
There are no prerequisites for MOD, but we expect the students to have some familiarity with discrete mathematics, first-order logic formulas, context-free grammars, and code fragments in imperative and functional style.
We encourage the students to use the following basic exercises to self-assess their level of knowledge for the above arguments.
=== Exercise 1 ===
Write the formal definitions of //injective// function and //surjective// function. Prove that the composition of two injective functions (respectively of two surjective functions) is an injective function (respectively, a surjective function).
=== Exercise 2 ===
Are the formulas "(∀x. P(x)) ⇒ Q" and "∀x. (P(x) ⇒ Q)" equivalent?
=== Exercise 3 ===
Let 7n denote the nth power of 7. Prove by induction that for any natural number n > 1 we have that 3 divides 7n - 1.
=== Exercise 4 ===
Consider the strings (i.e., finite sequences) of symbols {0,1}. Let #0(s) and #1(s) denote the number of occurrences of 0 and 1 in the string s, respectively, and let sn denote the sequence obtained as the concatenation of n instances of the string s. Define context-free grammars that generate each of the following languages
- The set of all and only strings s such that #1(s) is odd.
- The set of all and only strings s such that #0(s) = #1(s).
- The set of all and only strings s such that s = (01)n for some natural number n.
- The set of all and only strings s such that s = 0n 1n for some natural number n.
=== Exercise 5 ===
Let us consider the imperative code fragment
while (x!=0 and y!=0) do {
x := x-y;
y := y-1
}
where x and y are two integer variables.
For which initial values of x and y does the execution of the above program terminate?