Your program has to read lambda expression and to do 3 basic operations of the lambda calculation: calculate the “spent” variables, calculate the free variables, and do substitutions.
The language of the lambda expressions (expressions from now on) is described with the following three cases and no one else:
Strings of characteres from 'a' to 'z'
are expressions (variables).
Given an expression
and a variable
,
the string formed by the character '\', followed by
,
followed by the character '.' followed
($\verb|\|v\verb|.|B$) is an expression
(abstraction).
Given two expressions
and
,
the string formed by the character '(', followed by
,
followed by the character ' ' (space), followed by
,
followed by the character ')' ($\verb|(|F\verb| |A\verb|)|$) is an
expressionn (application).
The set of spent variables
of an expression
is the set of all the variables from 'a' to
'z' that appear in the expression
,
in any way. Equally, $$VG(E)=
\left\{
\begin{array}{ll}
\{v\} & \textbf{If } E = v\\
VG(B) \cup \{v\} & \textbf{If } E = \verb|\|v\verb|.|B\\
VG(F) \cup VG(A) & \textbf{If } E = \verb|(|F\verb|
|A\verb|)|\\
\end{array}
\right.$$
The set of the free variables of an expression is defined: $$VL(E) = \left\{ \begin{array}{ll} \{v\} & \textbf{If } E = v\\ VL(B) - \{v\} & \textbf{If } E = \verb|\|v\verb|.|B\\ VL(F) \cup VL(A) & \textbf{If } E = \verb|(|F\verb| |A\verb|)|\\ \end{array} \right.$$
The substitution of a variable in an expression by other expression is defined:
$$E[x := E'] = \left\{ \begin{array}{ll} v & \textbf{If } E \textrm{\ is a variable $v$ different from $x$ }\\ E' & \textbf{If } E = x\\ \verb|\|v\verb|.|B & \textbf{If } E = \verb|\|v\verb|.|B \textrm{ y } v=x \\ \verb|\|v\verb|.|B[x := E'] & \textbf{If } E = \verb|\|v\verb|.|B \textrm{, } v\neq x \textrm{ y } v \not\in VL(E')\\ \verb|(|F[x := E']\verb| |A[x := E']\verb|)| & \textbf{If } E = \verb|(|F\verb| |A\verb|)|\\ \end{array} \right.$$
Notice that, when has the form $\verb|\|v\verb|.|B$, it is not possible to do the substitution. This can always be corrected applying an alpha conversion, described in the next lines, in the expression $\verb|\|v\verb|.|B$ replacing with a no spent variable. However, the inputs of the problems will be in a way that you will never need to do an alpha conversion to do a substitution.
A test data is a sequence of calculations, each one of them takes a
line. The calculations can be “G
”,
“L
”
or “S
”,
where
and
are valid expressions and
is a variable. No line will take more than 2000 characteres. In the
calculation of types S we assure you that the substitution
can be done it, without being necessary that you do any alpha conversion
in any moment.
For each calculation, your program must print a line with the answer.
It must print the spent variables
of
if the petition is of the type G, the free variables
of
if is of the type L, and the substitution
if the petition is of the type S. It must print a set of
variables as a sequence in alphabetical order (look the instances).
Notice that the result of the substitution may be longer than 2000
characters.
TestA:
Tests with less than 200 expressions that only contain calculation
petitions of type G.
TestA:
Tests with less than 200 expressions that only contain calculation
petitions of type L.
TestA:
Tests with less than 200 expressions that only contain calculation
petitions of type S.
If you are able to solve this problem, you are very close to be able to evaluate lambda expressions. We describe the necessary steps below.
The change in the name of the variable in expressions like $\verb|\|v\verb|.|B$ creates equivalent expressions.
Any expression like
(\. )
is reduced to
,
where may have been necessary to apply an alpha conversion to
.
renaming
to no spent variable.
It is said that an expression is in a normal form when no more beta reductions can be applied to any of its subexpressions.
Input
G x G \x.(x \y.(x y)) G (x y) G \x.(x y) G (\x.x f) G (\x.(x \x.x) f) G (\y.\x.y x) G (((\c.\t.\e.((c t) e) \a.\b.a) a) b)
Output
x xy xy xy fx fx xy abcet
Input
L x L \x.(x \y.(x y)) L (x y) L \x.(x y) L (\x.x f) L (\x.(x \x.x) f) L (\y.\x.y x) L (((\c.\t.\e.((c t) e) \a.\b.a) a) b)
Output
x xy y f f x ab
Input
S x x y S y y y S x x (x z) S x (x x) (x z) S x (x (y x)) (\x.(f f) g) S x \x.x (a a) S x \y.x (a a) S x \y.(x \x.(x x)) (a z)
Output
y y (x z) ((x z) (x z)) ((\x.(f f) g) (y (\x.(f f) g))) \x.x \y.(a a) \y.((a z) \x.(x x))