OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 06:27

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Суббота, 26 Февраль, 2011 16:49 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Синтаксис полного детерминированного конечного автомата в PureBuilder (щёлкните по этой гиперссылке)


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


Последний раз редактировалось Сергей Прохоренко Понедельник, 28 Февраль, 2011 11:41, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 27 Февраль, 2011 12:00 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Я бы не стал пользоваться таким автоматом.

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 27 Февраль, 2011 18:54 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
igor писал(а):
Я бы не стал пользоваться таким автоматом.


Почему?

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

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


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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 27 Февраль, 2011 21:33 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Форма реализации конечных автоматов может быть самая разная. Большой переключатель - '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 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Валерий Лаптев писал(а):
Форма реализации конечных автоматов может быть самая разная. Большой переключатель - это только один из вариантов, самый простой и самый громоздский.


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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 28 Февраль, 2011 07:22 

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 28 Февраль, 2011 08:09 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Сергей Прохоренко писал(а):
Валерий Лаптев писал(а):
Форма реализации конечных автоматов может быть самая разная. Большой переключатель - это только один из вариантов, самый простой и самый громоздский.


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

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 28 Февраль, 2011 09:45 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Сергей Прохоренко писал(а):
Мой вариант - это автоматическое :!: ...

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

Здорово!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 28 Февраль, 2011 10:27 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Info21 писал(а):
Сергей Прохоренко писал(а):
Мой вариант - это автоматическое :!: ...

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

Здорово!

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 28 Февраль, 2011 10:37 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Вот немного другой способ реализации - с чистыми функциями, без классов.
Но в виде 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;
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 28 Февраль, 2011 11:26 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Валерий Лаптев писал(а):
Info21 писал(а):
Сергей Прохоренко писал(а):
Мой вариант - это автоматическое :!: ...

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 28 Февраль, 2011 11:47 
Аватара пользователя

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


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


Последний раз редактировалось Сергей Прохоренко Понедельник, 28 Февраль, 2011 12:25, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 28 Февраль, 2011 12:09 
Аватара пользователя

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


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

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


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 28 Февраль, 2011 12:23 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Валерий Лаптев писал(а):
Вот немного другой способ реализации - с чистыми функциями, без классов.
Но в виде templates.


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 28 Февраль, 2011 13:28 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 28 Февраль, 2011 14:59 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Info21 писал(а):
Нет, я к тому, там в высказываниях Futurum I или Futurum II?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 28 Февраль, 2011 22:09 
Аватара пользователя

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


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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 01 Март, 2011 08:12 

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 01 Март, 2011 10:01 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Вложение:
Ручной труд.jpg
Ручной труд.jpg [ 27.49 КБ | Просмотров: 15701 ]


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 01 Март, 2011 13:53 

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB