**Due: Friday, Oct 3rd by 11:59 PM**

Define a context-free grammar that generates the language of all parentheses-enclosed, comma-separated lists. The alphabet of terminal symbols is

(),a

A list member can be an a symbol or a nested list. A list with 0 members (empty list) is allowed.

Examples of strings in the language:

()(a)(a,a)((a,a),((a),a))(a,a,a,(),a,a,a,a)((((a))),a)

Examples of strings not in the language:

aa,()(a))((a)(aa)

Define a context-free grammar that generates the language
a^{n}b^{n}, the language of *n*
a's followed by *n* b's. Because *n* could be 0,
the empty string is a member of this language.

Use JFLAP to define a Turing machine that, given an input string consisting of a sequence of a, b, and c symbols, generates the reverse of the original string. Note that the output string does not have to overwrite the input string; it is acceptable to generate the output somewhere else on the tape.

For example, if the input string is

abcbabac

then when the Turing machine halts, somewhere on the tape it should have generated the output

cababcba

Using the Y-combinator, define a λ-calculus function to raise a number to a power.

For example, if we use the variable *pow* to refer
to your function, and *Y* to refer to the Y-combinator,
then the expression

pow(Ypow) 2 3

should compute the result 8, since 2^{3} = 8.
Your function should only depend on the addition, subtraction,
multiplication, and division operators, and the **if** / **then** / **else**
construct.

Save your answers to Problems 1, 2, and 4 in a text document.

Save your Turing machine in a JFLAP (.jff) file.

Create a zip file containing both your text document and
your JFLAP file, and upload it to the marmoset server as **hw3**.

The Marmoset server is available using the URL:

https://camel.ycp.edu:8443