Automata
Homeworks for the
course CS 3350, Spring 2025
General comment. The main purpose of most homeworks is to
show how well you understand the algorithms.
In many cases, the resulting finite automata, pushdown automata,
and Turing machines can be simplified, but please first
literally apply the algorithm so that we know that you can use
it.
If in addition to this, you also show how to make the
corresponding Turing machine or finite automaton or whatever more
concise, nothing wrong with that, the TA may even give you some
extra points (if he/she has time to grade these additional things).
But the most important thing is to show that you can follow the
algorithm.
For simple examples that we give you as homeworks:
- you
may immediately see how to convert, e.g., a context-free grammar
into a Chomsky normal form,
- but if someone gives you a more
complex case, you will have to use the algorithm.
So, it is
important to learn how to follow the algorithm.
If you deviate from the algorithm, how do we know that you learned
the algorithms? It was the same with sorting.
- Of course,
if someone gives you a list of 4 numbers on the test, you can sort
them yourself easily.
- The purpose of the question was that you
show that you understand mergesort, quicksort etc., not that
you sort 4 numbers.
In general: - If after you
show that you understand the algorithm you also provide a simpler
answer -- great,
- but not instead of following the
algorithm.
1. (Due February 3) In class, we designed automata for
recognizing integers and real numbers.
1.1. Use the same ideas to describe an automaton for a body
position: sit, stand, or lie down. You start with a normal
(sitting) position (N), u (up) brings you to standing (S), down (d)
brings you to lying down (L), and vice versa. A sequence of ups and
downs is accepted if you end up with in the normal (sitting)
position.
A natural idea is to have 3 states:
- the start state N
(sitting) which is also final,
- the state S meaning standing,
and
- the state L meaning lying down.
The start state N is
the only final state. The transitions are as follows: -
from N, u leads to S and d to L;
- from S, u leads back to S,
and d leads to N; and
- from L, u leads to N and d leads back to
L.
1.2. Trace, step-by-step, how the finite automaton from Part 1.1
will check whether the following two words (sequences of symbols)
lead back to the normal position:
- the word ud (which this
automaton should accept) and
- the word uu (which this automaton
should reject).
1.3. Write down the tuple <Q, Σ, δ, q0,
F> corresponding to the automaton from Part 1.1:
- Q is
the set of all the states,
- Σ is the alphabet, i.e., the
set of all the symbols that this automaton can encounter; for
simplicity, consider only two symbols: u and d;
- δ: Q x
Σ → Q is the function that describes, for each state q
and for each symbol s, the state δ(q,s) to which the
automaton that was originally in the state q moves when it sees the
symbol s (you do not need to describe all possible transitions this
way, just describe two of them);
- q0 is the starting
state, and
- F is the set of all final states.
1.4. For each automaton A, let LA denote
the language of all the words accepted by this automaton, i.e., of
all the words for which this automaton ends up in a final state. In
class, we learned a general algorithm that:
- given two
automata A and B that correspond to languages
LA and LB,
- constructs two new
automata for recognizing, correspondingly, the union and
intersection of languages LA and
LB.
Apply this algorithm to the following
two automata: - the automaton from Part 1.1 as Automaton
A, and
- an automaton for words that end with down as
Automaton B.
A natural idea is to have 2 states for
Automaton B: - the state D meaning that the last move was
down, and
- the state N meaning that the last move was not down.
The state N is the starting state, and D is the only final
state. The transitions are as follows: - from N, d leads to
D and u leads back to N;
- from D, d leads back to D and u leads
to N.
Send solutions to Problem 1 to Melina Salazar-Perez.
Solution to Problem 1
2. (Due February 3)
- Use the general algorithm that
we learned in class to design a non-deterministic finite automaton
that recognizes the language (u U d)*d of all the words that end
with d.
- u and d are languages consisting of only one
1-symbol word each: u is a language consisting of a single 1-symbol
word u; d is a language consisting of a single 1-symbol word d;
- for any two languages C and D, the notation CD means
concatenation;
- transform the resulting non-deterministic
finite automaton into a deterministic one.
Send solutions to Problem 2 to Melina Salazar-Perez.
Solution to Problem 2
3. (Due February 5) Apply the general algorithm for
transforming the finite automaton into a regular language (i.e., a
language described by a regular expression) to Automaton B from
Problem 1.4.
Send solutions to Problem 3 to Md. Jahangir Alam.
Solution to Problem 3
4. (Due February 12) Prove that the language L of all the
sequences that have exactly the same numbers of ups and downs is
not regular. For example, the word uddu is in the language L, while
the word duu is not in L.
Send solutions to Problem 4 to Garab Dorji.
Solution to Problem 4
5. (Due February 12) Write and test a method that simulates
a general finite automaton. Your program should enable the computer
to simulate any given finite automaton and then to simulate, for
any given word, step-by-step, how this automaton decides whether
this word is accepted by the automaton.
The input to this method should include the full description of the
corresponding finite automaton:
- the number N of states;
these states are q0, ..., qN − 1; we
assume that q0 is the start state; for simplicity, we
describe the states by the corresponding integers 0, ..., N;
- the number M of symbols; these symbols are s0, ...
sM − 1; for simplicity, we describe the symbols by
the corresponding integers 0, ..., M;
- an integer array
state[n][m] whose elements describe to what state the finite
automaton moves if it was in the state qn and sees the
symbol sm; and
- a boolean array final[n] whose
elements describe, for each state qn, whether this state
is final or not.
When simulating a finite automaton, your
program needs to keep track, at each moment of time, of the current
state. Initially, the state is q0 -- which is described
by number 0.
For this and other programming assignments, turn in the actual code
and the printout of the result of testing this code.
Send solutions to Problem 5 to Garab Dorji.
6. (Due February 12) Show, step by step, how the word uddu
is accepted by the following pushdown automaton that accepts all
the words that have equal number of d's and u's. This pushdown
automaton has 5 states:
- the starting state S,
- the
state B (for "balanced") indicating that so far we had equal number
of u's and d's,
- the state U indicating that so far, we had
more u's than d's;
- the state D indicating that so far, we had
more d's than u's; and
- the final state F.
In the stack, in addition to the bottom symbol $, we have:
- either one or several u's -- indicating the difference between
the number of u's and d's minus 1,
- or one or several d's --
indicating the difference between the number of d's and u's minus
1.
Transitions are as follows:
- From S to B, the transition is ε, ε → $.
- From B to U, the transition is: u, ε → ε.
- From U to B, the transition is: d, $ → $.
- From B to D, the transition is: d, ε → ε.
- From D to B, the transition is: u, $ → $.
- From B to F, the transition is: ε, $ → ε.
- From U to U, we have two transitions: u, ε → u
and d, u → ε.
- From D to D, we have two transitions: d, ε → d
and u, d → ε.
Send solutions to Problem 6 to Garab Dorji.
Solution to Problem 6
7. (Due February 12) Show, step by step, how the following
grammar describing sequences with equal number of u's and d's will
generate the expression uddu. The rules are:
- S → ε
- S → uSd
- S → dSu
- S → SS
Send solutions to Problem 7 to Garab Dorji.
Solution to Problem 7
8. (Due February 26) In the corresponding lecture, we
described an algorithm that, given a finite automaton, produces a
context-free grammar -- a grammar that generate a word if and only
if this word is accepted by the given automaton.
- On the
example of the automaton B from Homework 1.4, show how this
algorithm will generate the corresponding context-free grammar.
- On the example of the word uud accepted by this automaton,
show how the tracing of acceptance of this word by the finite
automaton can be translated into a generation of this same word by
your context-free grammar.
Send solutions to Problem 8 to Melina Salazar-Perez.
Solution to Problem 8
9. (Due February 26) Use a general algorithm to construct a
(non-deterministic) pushdown automaton that corresponds to
context-free grammar described in Problem 7. Show, step by step,
how the expression uddu will be accepted by this automaton.
Send solutions to Problem 9 to Melina Salazar-Perez.
Solution to Problem 9
10. (Due March 5) Transform the grammar from Homework 7 into
Chomsky normal form.
Send solutions to Problem 10 to Md. Jahangir Alam.
Solution to Problem 10
11. (Due March 5) Use the general algorithm to transform the
pushdown automaton from Problem 6 into a context-free grammar.
Before doing this, you need to replace each transition in which you
pop and push with two transitions in which you first pop, and then
push. Show, step-by-step, how the resulting grammar will generate
the word ud.
Send solutions to Problem 11 to Md. Jahangir Alam.
Solution to Problem 11
12. (Due March 19) For the grammar described in Homework 7,
show how the expression uddu can be represented as uvxyz in
accordance with the pumping lemma for context-free grammars. Show
that the corresponding word uvvxyyz will be generated by this
grammar.
Send solutions to Problem 12 to Garab Dorji.
Solution to Problem 12
13. (Due March 19) A perfect arrangement would be for a
student to have equal number of up and downs, and also to have a
sit-and-study experience (s) for each up or down. Show that the
language of all the words that have equal number of u's and d's and
and twice as many s's is not context-free.
Send solutions to Problem 13 to Garab Dorji.
Solution to Problem 13
14. (Due March 19) Show, step by step, how the stack-based
algorithm will transform the expression (2 + 0) * (2 − 5)
into a postfix expression, and then how a second stack-based
algorithm will compute the value of this postfix expression.
Send solutions to Problem 14 to Melina Salazar-Perez.
Solution to Problem 14
15. (Due March 26) Write a program that, given an arithmetic
expression,
- first transforms it to a postfix form, and
then
- computes its value (by using the stack-based algorithms
that we recalled in class).
You can assume that the
expression contains no variables, only numbers, and all the numbers
are one-digit numbers, i.e., each of these numbers is either 0, or
1, or 2, ..., or 9. For example, your program should correctly
process expressions like 2+3*4, but there is no need to process
expressions like 11+22. For simplicity, assume that the only
arithmetic operations are addition +, subtraction −, and
multiplication *, and that there are no parentheses.
Comments:
- as with all programming assignments for
this class, submit a file containing the code, and a file
containing an example of what this program generates on each
step;
- ideally, use Java, but if you want to write it in some
other programming language, check with the TA that it is OK;
usually, C or C++ are OK.
Send solutions to Problem 15 to Md. Jahangir Alam.
16. (Due April 2) Design a Turing machine that, given a
binary number n which is larger than or equal to 4, subtracts 4
from this number. Test it, step-by-step, on the example of n =
5.
Send solutions to Problem 16 to Md. Jahangir Alam.
Solution to Problem 16
17. (Due April 2) Design a Turing machine that, given a
unary number n, adds 2 to this number. Test it, step-by-step, on
the example of n = 0.
Send solutions to Problem 17 to Md. Jahangir Alam.
Solution to Problem 17
18. (Due April 2) Use the general algorithm to transform a
finite automaton B from Homework 1.4 into a Turing machine. Show
step-by-step, on an example of a word ud, how this word will be
processed by your Turing machine.
Send solutions to Problem 18 to Md. Jahangir Alam.
Solution to Problem 18
19. (Due April 2) As described in the corresponding lecture,
every grammar obtained from a finite automaton is LL(1). For the
grammar from Homework 8, build the corresponding table. Use this
table to check whether the word ud can be derived in this
grammar.
Send solutions to Problem 19 to Md. Jahangir Alam.
Solution to Problem 19
20. (Due April 9) As we discussed in the corresponding
lecture, a Turing machine can be described as a finite automaton
with two stacks:
- the right stack contains, on top, the
symbol to which the head points; below is the next symbol to the
right, then the next to next symbol to the right, etc.;
- the
left stack contains, on top, the symbol directly to the left of the
head (if there is a one), under it is the next symbol to the left,
etc.
On the example a Turing machine that computes n − 4
for a binary number n = 5, show, step-by-step: - how each
state of the corresponding Turing machine can be represented in
terms of two stacks, and
- how each transition from one state to
another can be implemented by push and pop operations.
Send solutions to Problem 20 to Garab Dorji.
Solution to Problem 20
21. (Due April 9) Write and test a method that simulates a
general Turing machine. Your program should enable the computer to
simulate any given Turing machine for accepting-rejecting and then
to simulate, for any given word, step-by-step, how this Turing
machine decides whether this word is accepted or not.
The input to this method should include:
- the number N of
states q0, ..., qN − 1; we assume that
q0 is the start state, that the last-but-one state
qN − 2 is the accept state, and the last state
qN − 1 is the reject state;
- the number M of
symbols s0, ... sM − 1; we assume that
s0 is the blank state _;
- an integer array
state[n][m] that describes to what state the head of the Turing
machine changes if it was in the state qn and sees the
symbol sm;
- an integer array symbol[n][m] that
describes what symbol should be on the tape after the head in the
state qn sees the symbol sm (it may be the
same symbol as before, or it may be some other symbol written by
the Turing machine);
- a character array lr[n][m] that
describes, for each state qn and for each symbol
sm, whether the head moves to the left (L), or to the
right (R), or stays in place (blank symbol);
- the integer array
of a large size describing the original contents of the tape, i.e.,
what symbols are written in each cell.
This program needs to
keep track of a current location of the head. Initially, this
location is 0.
Your program should simulate the work of the Turing machine
step-by-step. Return the printout of the method, the printout of
the program that you used to test this method, and the printout of
the result of this testing. Feel free to use Java, C, C++, Fortran,
or any programming language in which the code is understandable.
Send solutions to Problem 21 to Garab Dorji.
22. (Due April 16) Give two examples:
- an example of
computation time which makes an algorithm feasible according to the
formal definition but not practically feasible, and
- an example
of computation time for which the corresponding algorithm is
practically feasible, but not feasible according to the formal
definition.
These examples should be different from what you
learned in class and what is given in the posted lectures and in
solutions to previous semesters' homeworks -- a minor difference is
OK.
Send solutions to Problem 22 to Melina Salazar-Perez.
Solution to Problem 22
23. (Due April 23) What is NP? What is P? What is
NP-complete? What is NP-hard? Give brief definitions. Give an
example of an NP-complete problem. Is P equal to NP?
Send solutions to Problem 23 to Melina Salazar-Perez.
Solution to Problem 23
24. (Due April 23) Prove that the cubic root of 24 is not a
rational number.
Send solutions to Problem 24 to Melina Salazar-Perez.
Solution to Problem 24