OberonCore
https://forum.oberoncore.ru/

Синтаксис конечного автомата в PureBuilder
https://forum.oberoncore.ru/viewtopic.php?f=93&t=3284
Страница 1 из 2

Автор:  Сергей Прохоренко [ Суббота, 26 Февраль, 2011 16:49 ]
Заголовок сообщения:  Синтаксис конечного автомата в PureBuilder

Синтаксис полного детерминированного конечного автомата в PureBuilder (щёлкните по этой гиперссылке)


Жду комментариев.

Автор:  igor [ Воскресенье, 27 Февраль, 2011 12:00 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Я бы не стал пользоваться таким автоматом.

Сергей Прохоренко писал(а):
Синтаксис полного детерминированного конечного автомата в PureBuilder:
Код:
действия_при_переходе_в_состояние_1

Где гарантия, что эти действия не переведут автомат в какое-то состояние, отличное от 1?

Автор:  Сергей Прохоренко [ Воскресенье, 27 Февраль, 2011 18:54 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

igor писал(а):
Я бы не стал пользоваться таким автоматом.


Почему?

igor писал(а):
Сергей Прохоренко писал(а):
Синтаксис полного детерминированного конечного автомата в PureBuilder:
Код:
действия_при_переходе_в_состояние_1

Где гарантия, что эти действия не переведут автомат в какое-то состояние, отличное от 1?


Гарантия в том, что единственная переменная состояния является локальной переменной автомата, не доступной ни из ветвей автомата, ни снаружи. У нее нет даже имени или указателя, по которому можно было бы обратиться. Изменение состояния производится только самим автоматом (на основе стартового состояния, таблицы переходов, входных условий/символов), и больше никем. Разумеется, можно себе представить функцию, возвращающую состояние автомата, но лишь как копию.

Ваш вопрос аналогичен вопросу: а что если мы внутри цикла for изменим значение параметра цикла? В Си такая вещь возможна, и порождает ошибки. В других языках - не знаю. Но вообще я считаю, что это должно быть запрещено и восприниматься компилятором как ошибка.

В языке Паскаль такой запрет существует лишь в качестве пожелания:
Цитата:
На использование параметра цикла в операторе for налагаются ограничения: 1) в качестве параметра цикла должна использоваться переменная порядкового типа; начальное и конечное значение должны иметь тип, совместимый с типом параметра цикла; 2) переменная, используемая в качестве параметра цикла должна быть локальной для того блока, в котором находится оператор for. В теле цикла запрещается явное изменение параметра цикла (например, оператором присваивания); после завершения цикла значение управляющей переменной считается неопределённым. Ограничения первой группы отслеживаются компилятором, ограничения второй группы являются пожеланиями для программиста.
(см. источник)

Автор:  Валерий Лаптев [ Воскресенье, 27 Февраль, 2011 21:33 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Форма реализации конечных автоматов может быть самая разная. Большой переключатель - 'nnj только один из вариантов, самый простой и самый громоздский. Посмотрите на следующий вариант. Перевод целых констант вида 12345 (десятичные), 0xabcd (шестнадцатеричные), 0b1010010 (двоичные)
Цитата:
Определим состояния автомата. В стартовом состоянии может появиться любая цифра, однако нам нужно различать цифру 0 и остальные цифры, так как с нуля не начинаются десятичные константы. Если в стартовом состоянии был ноль, то далее может быть только символ «x» или «b» (или ноль — единственная цифра). После этого действия для десятичных, шестнадцатеричных и двоичных констант фактически повторяются до тех пор, пока не будет выбран символ, недопустимый для целого числа. Это может быть либо знак операции, либо знак пунктуации (например, запятая). Таким образом, обрабатываемые символы можно разбить на следующие классы: ноль, цифра, x, b, другой.
Рассмотрим действия, которые должен выполнять автомат при переводе константы. Пусть результат перевода сохраняется в переменной N. Первоначальное значение N равно 0. Если очередной символ-цифра содержится в переменной ch, то добавить ее в число можно так:
N = N * B + digit(ch);
B — это основание системы счисления (2, 10 или 16), а digit() — это функция, которая выдает цифру, соответствующую символу ch. Таким образом, правила перехода для преобразователя можно записать так:
start: ноль -> s1;
start: цифра -> s2; B = 10; N = digit(ch);
s1: x -> s2; B = 16;
s1: b -> s2; B = 2;
s2: ноль -> s2; N = N * B;
s2: цифра -> s2; N = N * B + digit(ch);
s2: другая -> finish
В стартовом состоянии выполняется проверка первого символа; в состоянии s1 — устанавливается не десятичное основание системы счисления; преобразование символьной константы в число выполняется в состоянии s2. В этом состоянии автомат остается до тех пор, пока входными символами являются цифры. Если же очередной символ — не цифра, то либо это суффикс «u», либо ошибка. Суффикс не является ошибкой только тогда, когда основание системы счисления B равно 10.
Действия в состоянии ошибки очевидны. Если в стартовом состоянии вместо цифры или нуля выбран недопустимый символ, то автомат заканчивает работу, устанавливая флаг ошибки в error; аналогичные действия выполняются и в состояниях s1 и s2.

И программа:
Код:
// автомат-преобразователь для целых чисел
// генерирует исключение
// с установкой кода ошибки разбипается вызывающая функция!
struct Data
{   int N;         // число
    int sign;
    byte B;         // основание системы счисления
};
const int notDigit = -1;
int digit(char ch, byte B = 10)
{ string digits = "0123456789abcdef";
  int d;            // возвращаемая цифра
  for(d = 0; d < B; ++d)
    if(ch == digits[d]) return d;
  string xdigits = "ABCDEF";      // если большая шестнадцатеричная
  for(d = 0; d < 6; ++d)
    if(ch == xdigits[d]) return d+10;
  return notDigit;         // символ - не цифра
}
// класс-преобразователь типа
class State;
typedef State (*function) (char ch, Data &D);
class State
{ public:
    State(function f = NULL): F(f) {}
    operator function() { return F; }
  private:
    function F;
};
// состояние – поступила очередная цифра
State s2(char ch, Data &D)
{   int d = digit(ch, D.B);
    if(d == notDigit)         // ОШИБКА - неправильный символ
   throw IllegalInteger();   // генерируется исключение
    else            // накапливаем
    { D.N = D.N * D.B + d;
      return s2;          // в состояние s2
    }
}
// состояние – после первого нуля!
State s1(char ch, Data &D)
{ if     ((ch == 'x')||(ch == 'X')) D.B = 16;
  else if((ch == 'b')||(ch == 'B')) D.B = 2;
  else                              // ОШИБКА - неправильный символ
    throw IllegalInteger();
  D.sign = +1;            // не десятичные - беззнаковые
  return s2;            // в состояние s2
}
// состояние – первый символ
State start(char ch, Data &D)
{ if(ch == '0')     return s1;   // в состояние s1
               // первый символ - знак
  else if (ch == '-') { D.sign = -1; D.B = 10; }           
  else if (ch == '+') { D.sign = +1; D.B = 10; }
  else               // первая цифра - десятичная
  { D.sign = +1;         // число положительное
    int d = digit(ch);
    if (d == notDigit)      // ОШИБКА - неправильный символ
       throw IllegalInteger();
    else            // если-таки десятичная цифра
    { D.B = 10; D.N = d; }
  }
  return s2;             // в состояние s2
}
// основная программа автомата
int Integer(const string &str)
{ Data D = {0};
  State s = start;
  typedef basic_string<char>::const_iterator Iterator;
  Iterator it = str.begin();
  while(it != str.end())      // основной цикл по сотстояниям
  {
   s = s(*it++, D);      // переходы по состояниям
  }
  return D.N * D.sign;
}

Автор:  Сергей Прохоренко [ Воскресенье, 27 Февраль, 2011 23:24 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Валерий Лаптев писал(а):
Форма реализации конечных автоматов может быть самая разная. Большой переключатель - это только один из вариантов, самый простой и самый громоздский.


Предложенный Вами вариант - это точно такой же переключатель. "Маленький" он только потому, что реализует мало состояний. Представьте себе, скажем, 200 состояний. :shock: Каково это на Си врукопашную программировать? А вносить изменения в таблицу переходов? Ошибки просто гарантированы. Потому и автоматное программирование мало применяется, что инструментарий крайне неудобный - низкого уровня.

Мой вариант - это автоматическое :!: построение программного кода по таблице переходов, которая предварительно подвергается проверке на полноту и отсутствие логических ошибок (и в перспективе даже оптимизируется!) - компилятором. Остается только вписать действия, соответствующие тому или иному состоянию или переходу. Это что-то вроде декларативного программирования. 8)

Когда задача решается компьютером автоматически, громоздкость представления уже не имеет никакого значения. Ведь никого не пугает громоздкость исполнимого кода - всё равно он создается автоматически, и программисту нет необходимости его читать.

Автор:  igor [ Понедельник, 28 Февраль, 2011 07:22 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Сергей Прохоренко писал(а):
igor писал(а):
Где гарантия, что эти действия не переведут автомат в какое-то состояние, отличное от 1?
Гарантия в том, что единственная переменная состояния является локальной переменной автомата, не доступной ни из ветвей автомата, ни снаружи. У нее нет даже имени или указателя, по которому можно было бы обратиться. Изменение состояния производится только самим автоматом (на основе стартового состояния, таблицы переходов, входных условий/символов), и больше никем. Разумеется, можно себе представить функцию, возвращающую состояние автомата, но лишь как копию.
Если я правильно понял, Вы вводите некий сложный оператор, который соответствует автомату. Текущее состояние автомата хранится в некоторой переменной, которая недоступна программисту напрямую. Этот супер-оператор управляет этой переменной автоматически.

Такое решение наверно имеет право на жизнь, но мне оно не нравится. И вот почему. Существует много различных типов автоматов: Мили, Мура, магазинные ... К тому же, автоматы могут быть вложенными, и вообще в сложных случаях представлять собой некую структурную композицию.
Неужели Вы будете вводить отдельный супер-оператор для каждого типа автомата? Это всё-равно что вводить супер-мега-оператор для шаблона MVC или для любого другого паттерна проектирования.

Цитата:
Ваш вопрос аналогичен вопросу: а что если мы внутри цикла for изменим значение параметра цикла?
Да, Вы совершенно правы, таким вопросом я тоже задаюсь. И оператор FOR никогда не использую.

Автор:  Валерий Лаптев [ Понедельник, 28 Февраль, 2011 08:09 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Сергей Прохоренко писал(а):
Валерий Лаптев писал(а):
Форма реализации конечных автоматов может быть самая разная. Большой переключатель - это только один из вариантов, самый простой и самый громоздский.


Предложенный Вами вариант - это точно такой же переключатель. "Маленький" он только потому, что реализует мало состояний. Представьте себе, скажем, 200 состояний. :shock: Каково это на Си врукопашную программировать? А вносить изменения в таблицу переходов? Ошибки просто гарантированы. Потому и автоматное программирование мало применяется, что инструментарий крайне неудобный - низкого уровня.

Мой вариант - это автоматическое :!: построение программного кода по таблице переходов, которая предварительно подвергается проверке на полноту и отсутствие логических ошибок (и в перспективе даже оптимизируется!) - компилятором. Остается только вписать действия, соответствующие тому или иному состоянию или переходу. Это что-то вроде декларативного программирования. 8)

Когда задача решается компьютером автоматически, громоздкость представления уже не имеет никакого значения. Ведь никого не пугает громоздкость исполнимого кода - всё равно он создается автоматически, и программисту нет необходимости его читать.

Не... Мой еще и эргономичен. Как вы могли заметить, основная прога остается неизменной при ЛЮБОМ количестве состояний. 200 состояний - нефиг делать. Просто "добавь воды" ;) - для каждого состояния пишется ОТДЕЛЬНАЯ функция... Как программер, могу со всей ответственностью заявить - такой автомат ЛЕГЧЕ сопровождать и модифицировать.

Автор:  Info21 [ Понедельник, 28 Февраль, 2011 09:45 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Сергей Прохоренко писал(а):
Мой вариант - это автоматическое :!: ...

Валерий Лаптев писал(а):
Не... Мой еще и эргономичен. ...

Здорово!

Автор:  Валерий Лаптев [ Понедельник, 28 Февраль, 2011 10:27 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Info21 писал(а):
Сергей Прохоренко писал(а):
Мой вариант - это автоматическое :!: ...

Валерий Лаптев писал(а):
Не... Мой еще и эргономичен. ...

Здорово!

Идея - не моя. Идея изложена в книжке Герба Саттера Решение сложных задач на С++.
На тему реализации конечных автоматов на сайте РСДН было две статьи. Одна из них - Статья Кодта - Николая Меркина. Очень хорошая статья, где он описывает прнимерно 5 или 6 способов реализации. Но способа реализации с функциями у него нет.
Вторая статья - не помню кого - описывала template конечного автомата. Достаточно сложная прога, но зат о универсальная. С помощью параметров template задавались количественные и типовые аргументы автомата.

Похожая статья была у Шалыто в соавторстве с одним его студентом (сейчас не помню - надо посмотреть).

Автор:  Валерий Лаптев [ Понедельник, 28 Февраль, 2011 10:37 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Вот немного другой способ реализации - с чистыми функциями, без классов.
Но в виде templates.
Обратите внимание на главную функция Real. Она короткая. Весь фокус в матрице, где записаны имена функций-состояний.
В главной функции цикл остается неизменным - меняется только матрица. И вызов функции-состояния делается по указателю. На КП реализовать - нефиг делать.

Код:
Листинг 5.6. Шаблонная реализация автомата–преобразователя дробных констант
// шаблон Number
template<class T>
struct Number
{   int signN;
       T N;
   T FP;
   T F;
   bool signP;
   T P;
   Number():signN(+1), N(),FP(), F(), signP(true), P() {}
};
// Функции-обработчики
// в состоянии start – обработка знака
template<class T>
State startS(const char &ch, Number<T> &D)
{ if (ch == '-') D.signN = -1;
  return s1;    // первая цифра
}
// в состоянии start и s1 – обработка первой цифры
template<class T>
State startD(const char &ch, Number<T> &D)
{ D.N = digit(ch);
  return s2;    // целая часть
}
// в состоянии s2 – обработка цифр целой части
template<class T>
State intD(const char &ch, Number<T> &D)
{ D.N = D.N * 10 + digit(ch);
  return s2;    // целая часть
}
// . . . [b]Здесь еще несколько функций - состояний[/b]
template<class T>
T Real(const string &str)
{ typedef State (*Action)(const char &ch, Number<T> &D);
  Action matrix[Class][states] =
//  start   s1      s2     s3       s4      s5     s6      s7
//  перед   после   целая  после    дроб.   после  после   порядок
//  числом  знака   часть  точки    часть   Е      знака Е
{{startD, startD, intD,  float1D, floatD, exp1D, exp1D,  expD },//цифра
 {Error,  Error,  Point, Error,   Error,  Error, Error,  Error},//точка
 {Error,  Error,  Exp,   Error,   Exp,    Error, Error,  Error},//порядок
 {startS, Error,  Error, Error,   Error,  expS,  Error,  Error},//знак
 {Error,  Error,  Other, Error,   Other,  Error, Error,  Other} //другой
};
  Number<T> D;
  double result;
  size_t n = 0;
  State s = start;
  while((s != finish)&&(s != error)&&(n < str.size()))
  { Symbol t = type(str[n]);
    s = matrix[t][s](str[n], D); //cout << endl;
    ++n;
  }
  if ((s==s2)||(s==s4)||(s==s7)||(s==finish))
  { result = D.N+D.F;
    if(!D.signP) D.P = -D.P;
    result = D.signN * result * pow(static_cast<T>(10.0), D.P);
  }
  else result = 0;
  return result;
}

Автор:  Info21 [ Понедельник, 28 Февраль, 2011 11:26 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Валерий Лаптев писал(а):
Info21 писал(а):
Сергей Прохоренко писал(а):
Мой вариант - это автоматическое :!: ...

Валерий Лаптев писал(а):
Не... Мой еще и эргономичен. ...

Здорово!
Идея - не моя.
Нет, я к тому, там в высказываниях Futurum I или Futurum II?

Автор:  Сергей Прохоренко [ Понедельник, 28 Февраль, 2011 11:47 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

igor писал(а):
Такое решение наверно имеет право на жизнь, но мне оно не нравится. И вот почему. Существует много различных типов автоматов: Мили, Мура, магазинные ... К тому же, автоматы могут быть вложенными, и вообще в сложных случаях представлять собой некую структурную композицию.
Неужели Вы будете вводить отдельный супер-оператор для каждого типа автомата?


Если Вы внимательно посмотрите на предложенный синтаксис, то увидите, что он универсален и позволяет запрограммировать как автомат Мили, так и автомат Мура. Для этого достаточно заполнить ветви соответствующие состояниям или переходам. А можно и гибрид сделать.

Автор:  Сергей Прохоренко [ Понедельник, 28 Февраль, 2011 12:09 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Валерий Лаптев писал(а):
Не... Мой еще и эргономичен. Как вы могли заметить, основная прога остается неизменной при ЛЮБОМ количестве состояний. 200 состояний - нефиг делать. Просто "добавь воды" ;) - для каждого состояния пишется ОТДЕЛЬНАЯ функция...


В моем варианте заголовок тоже остается неизменным - независимо от количества состояний. Каждая ветвь гораздо проще (содержит только обозначение состояния или перехода!), чем отдельная функция. Если хотите, можете в нее поместить и вызов процедуры. Синхронизация между программным кодом и таблицей состояний у меня осуществляется автоматически. А у Вас - вручную! И это Вы называете ЭРГОНОМИКОЙ?!!! :(

Валерий Лаптев писал(а):
Как программер, могу со всей ответственностью заявить - такой автомат ЛЕГЧЕ сопровождать и модифицировать.


Утверждение бездоказательное и противоречит указанным выше фактам. Вы всё-таки попробуйте рассмотреть мой вариант более внимательно и беспристрастно. Для программиста (тем более, студента!) это готовый и удобный шаблон, а не трудоемкое и порождающее ошибки низкоуровневое программирование, требующее изощренного творчества.

Автор:  Сергей Прохоренко [ Понедельник, 28 Февраль, 2011 12:23 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Валерий Лаптев писал(а):
Вот немного другой способ реализации - с чистыми функциями, без классов.
Но в виде templates.


Кошмар! Более 40 строк кода (не считая комментариев, фигурных скобок и матрицы), требующего полдня на вникание. ООП, указатели... Автоматное программирование не требует всего этого! Оно должно быть не сложнее цикла Дейкстры!

Автор:  igor [ Понедельник, 28 Февраль, 2011 13:28 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Сергей Прохоренко писал(а):
Для программиста (тем более, студента!) это готовый и удобный шаблон, а не трудоемкое и порождающее ошибки низкоуровневое программирование, требующее изощренного творчества.
(Подчёркивание моё)
Надеюсь, Вы это не серьёзно. "Изощрённого творчества" не избежать в любом случае. Вы же не хотите сказать, что Ваш автомат и прочее позволят "шлёпать" программы как пирожки на конвейере. Впрочем, Ваша мысль ясна, Вы наверно просто неудачно выразились в запале. :)

Автор:  Валерий Лаптев [ Понедельник, 28 Февраль, 2011 14:59 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Info21 писал(а):
Нет, я к тому, там в высказываниях Futurum I или Futurum II?

Что-то вы витиевато выражаетесь. Не понятно. ЗдОрово или здорОво?

Автор:  Сергей Прохоренко [ Понедельник, 28 Февраль, 2011 22:09 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

igor писал(а):
Сергей Прохоренко писал(а):
Для программиста (тем более, студента!) это готовый и удобный шаблон, а не трудоемкое и порождающее ошибки низкоуровневое программирование, требующее изощренного творчества.
(Подчёркивание моё)
Надеюсь, Вы это не серьёзно. "Изощрённого творчества" не избежать в любом случае. Вы же не хотите сказать, что Ваш автомат и прочее позволят "шлёпать" программы как пирожки на конвейере. Впрочем, Ваша мысль ясна, Вы наверно просто неудачно выразились в запале. :)


Да нет. Я сказал именно то, что хотел. Автоматное программирование вполне можно сделать легким и доступным широким программистским массам. Оно должно быть не сложнее цикла Дейкстры, и не должно требовать от программиста привлечения каких-либо еще парадигм программирования (ООП, функциональное, обобщенное) и использования указателей. Много ли творчества в использовании циклов? Вряд ли. Это обыденная рутина. То же самое должно произойти и с автоматным программированием, чтобы оно из экзотики превратилось в типовой инструмент разработки программ. А для творчества еще очень много места остается - от лучшего понимания предметной области до улучшения качества программ во всех аспектах.

Вы почитайте труды Шалыто. Уже чтобы понять, о чем вообще идет речь, необходимо приложить недюжинные творческие усилия. Что-то на уровне высшей математики, сильно напоминающее определение компакта. Разумеется, это невозможно использовать, если только не посвятить этому пару лет жизни. Автора можно понять - чем оно менее понятно окружающим, тем легче оставаться монополистом. Но если почитать Википедию, где всё это изложено простым человеческим языком, то приходит понимание, что в этой области вполне можно обойтись без высшей математики и "творчества".

Автор:  igor [ Вторник, 01 Март, 2011 08:12 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Сергей Прохоренко писал(а):
Автоматное программирование вполне можно сделать легким и доступным широким программистским массам.
Я же оспариваю не это. Да, конечно можно. Но только за счёт избавления программиста от какой-нибудь рутиной работы. Если же задача требует творческого подхода, то ни семантический редактор, ни какие другие инструменты не изменят этого. Если бы это было не так, то программиста вообще можно было бы убрать, и создавать все программы в автоматическом режиме. Для некоторых задач так и есть. Например, генераторы парсеров и т.д. Но только не для задач, где требуется творческий подход.

Автор:  Сергей Прохоренко [ Вторник, 01 Март, 2011 10:01 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Вложение:
Ручной труд.jpg
Ручной труд.jpg [ 27.49 КБ | Просмотров: 15709 ]

Автор:  Владислав Жаринов [ Вторник, 01 Март, 2011 13:53 ]
Заголовок сообщения:  Re: Синтаксис конечного автомата в PureBuilder

Сергей Прохоренко писал(а):
...
Вы почитайте труды Шалыто. Уже чтобы понять, о чем вообще идет речь, необходимо приложить недюжинные творческие усилия. Что-то на уровне высшей математики, сильно напоминающее определение компакта. Разумеется, это невозможно использовать, если только не посвятить этому пару лет жизни. Автора можно понять - чем оно менее понятно окружающим, тем легче оставаться монополистом. Но если почитать Википедию, где всё это изложено простым человеческим языком, то приходит понимание, что в этой области вполне можно обойтись без высшей математики и "творчества".
В свете сказанного в новой работе Шалыто и Поликарповой я бы несколько поменял оценки :| Именно изложение там ЯВС-метода меня, "предметника", навело на мысль о естественности представления автомата циклом Дейкстры - откуда и этот пример. Там, правда, кодирование посложнее - но ведь не Оберон-07 использован :)
А в структурном редакторе как раз это можно реализовать...
Также Ваши предложения в свете сказанного в этой книге (прежде всего на с.77) вызывают вопрос - по автоматному графу (ну или его табличному представлению) тривиально кодировать автомат с непротиворечивым и полным множеством состояний. А как будет решаться вопрос с автоматизацией для множеств, не обладающих хотя бы одним из этих свойств? Там же авторы приводят подходы - но один, скажем, основан на явных БП...
Кстати, в Гл. 3 говорится о сложности объектного кодирования автоматных моделей, которая в настоящее время не преодолена.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/