Рекурсия
Рекурсия
Рекурсия. сущ. муж. см. рекурсия.
Фольклор
Петя разрабатывает новую среду разработки для языка Ж±. Сейчас он пишет модуль, который будет отслеживать потенциальную бесконечную рекурсию.
Ж± - процедурный язык. Все переменный в Ж± являются двоичными, каждая переменная может принимать два значения: "0" и "1". Каждая процедура имеет несколько аргументов. В Ж± есть следующие операторы:
увеличить значение на один "x++" - если x равен 0, он становится равным 1;
уменьшить значение на один "x--" - если x равен 1, он становится равным 0;
условный оператор "if (x) S1 else S2" где S1 и S2 - произвольные операторы, выполнить S1, если x равен 1, или S2, если x равен 0;
вызов процедуры "f (x, y)";
составной оператор "{S1 S2 ...}", где S1, S2, и т.д. - произвольные операторы: выполнить S1, S2, и т.д. в этом порядке.
Описание процедуры выглядит так: "<имя процедуры> (<список аргументов>) S" где S - произвольный оператор.
Все аргументы передаются по значению (то есть изменения внутри процедуры не меняют значений соответствующих переменных в вызывающей процедуре).
Например, программа в первом примере содержит процедуру "inc", которая получает трех-битное значение в виде трёх аргументов x2, x1 и x0 и рано или поздно вызывает процедуру "done" с тремя аргументами, которые задают значение, увеличенное на единицу.
По заданной программе выясните, можно ли так вызвать некоторую процедуру с такими аргументами, чтобы результатом вызова стала бесконечная рекурсия.
Входные данные
Входной файл содержит программу на языке Ж±. Она содержит не более 20 процедур, каждая процедура имеет не более 15 аргументов. Размер входного файла не превышает 1000 байт. Имена процедур и аргументов состоят из букв и цифр и являются зависимыми от регистра. Все имена не длиннее 40 символов. Никакая процедура не называется "if" или "else".
Выходные данные
Выведите "YES", если можно вызвать некоторую процедуру с такими аргументами, что в результате получится бесконечная рекурсия, или "NO", если нет.
Пример входных данных | Пример выходных данных |
inc(x2, x1, x0) { if (x0) { x0-- inc1(x2, x1, x0) } else { x0++ done(x2, x1, x0) } } inc1(x2, x1, x0) { if (x1) { x1-- inc2(x2, x1, x0) } else { x1++ done(x2, x1, x0) } } inc2(x2, x1, x0) { if (x2) { x2-- done(x2, x1, x0) } else { x2++ done(x2, x1, x0) } } done(x2, x1, x0) { } | NO |
a(x0) { if (x0) { } else { a(x0) } } | YES |
Пример
inc(x2, x1, x0) { if (x0) { x0-- inc1(x2, x1, x0) } else { x0++ done(x2, x1, x0) } } inc1(x2, x1, x0) { if (x1) { x1-- inc2(x2, x1, x0) } else { x1++ done(x2, x1, x0) } } inc2(x2, x1, x0) { if (x2) { x2-- done(x2, x1, x0) } else { x2++ done(x2, x1, x0) } } done(x2, x1, x0) { }
NO