eolymp
Задачи

Рекурсия

Рекурсия

Лимит времени 1 секунда
Лимит использования памяти 64 MiB

Рекурсия. сущ. муж. см. рекурсия.

Фольклор

   Петя разрабатывает новую среду разработки для языка Ж±. Сейчас он пишет модуль, который будет отслеживать потенциальную бесконечную рекурсию.

Ж± - процедурный язык. Все переменный в Ж± являются двоичными, каждая переменная может принимать два значения: "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

Пример

Входные данные #1
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) {
}
Выходные данные #1
NO