OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 21:10

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




Начать новую тему Ответить на тему  [ Сообщений: 122 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 7  След.
Автор Сообщение
СообщениеДобавлено: Вторник, 28 Апрель, 2009 19:34 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Сергей Губанов писал(а):
Каноническое использование цикла WHILE есть линейный поиск элемента в одномерном массиве/списке.
Каноническое использование цикла Дейкстры есть линейный поиск элемента в многомерном массиве/списке.

Да, именно так - но более общо мы говорим не о массивах/списках, а о последовательностях ситуаций.
Здесь как раз и есть двумерность в ситуациях, так сказать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 28 Апрель, 2009 20:44 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Вообще, штука тут получается в том, что мы слишком привыкли думать о цикле как о повторяемом блоке действий, на который навешана некая "повторяющая фиговина" :)

На самом деле, цикл (как и любой участок алгоритма) нас интересует ровно постольку, поскольку достигает какой-то цели - т.е. обеспечивает нам постусловие. Поэтому и внимание всё должно быть на логические условия (окончания, продолжения, инвариант), и только потом внутрь добавляются некие действия, такие, чтобы они нам состояния в соответствии с этими условиями двигали.

Вот в разбираемом примере первым желанием было взять действие (выборка пары команд и их выполнение), а потом уже начать повторять. Потом выяснилось, что цикл недостаточно "часто обращается", неудобно.
Если бы мы задумались исключительно об условиях и об их проверках, то цикл у нас сразу получился бы с числом обращений как раз по числу проверок (в 4 раза большим, чем сначала казалось нормальным...)...
И никаких лишних выходов не захотелось бы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 28 Апрель, 2009 20:50 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
Здесь нет ошибок. Ошибка исполнения пользовательской программы - нормальная ситуация для интерпретатора.


На этом конкретно примере удобнее рассматривать "ошибку", равно как и "останов", как исключительную ситуацию. Потому что в таком виде код понятнее любого из приведенных здесь примеров, при всем уважении к Дейкстре и автоматам.
Буквально вчера реализовывал некую batch-операцию, в процессе которой пользователь может отменить ее. for_each + throw cancel. Никаких злобных WHILE'ов с протаскиванием признака отмены операции (там и без этого достаточно полезного "состояния"). Все просто и понятно. При тестирования нашел только одну ошибку - в форматировании строки сообщения.


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Vlad писал(а):
Потому что в таком виде код понятнее любого из приведенных здесь примеров, при всем уважении к Дейкстре и автоматам.


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

Речь не о том, как понятнее; а речь о том, какой стиль мышления принять. Затем уже от нотации требуется показывать то, что для этого стиля важно.


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
Речь не о том, как понятнее; а речь о том, какой стиль мышления принять. Затем уже от нотации требуется показывать то, что для этого стиля важно.


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


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Лично моё мнение, что двумерные чертежи на ДРАКОНе вполне подходят.


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

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
Лично моё мнение, что двумерные чертежи на ДРАКОНе вполне подходят.


Да, давно хочу попробовать ДРАКОН в деле. Хотя идея генерить "настоящий" код (для традиционных ЯП) на основании драконовских чертежей мне по-прежнему кажется нереальной.


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Илья Ермаков писал(а):
Здесь как раз и есть двумерность в ситуациях, так сказать.
Не согласен. Геометрия пространства ситуаций здесь, так сказать, есть "пересечение двух линий". Пересечение двух линий за двумерное пространство не катит. Короче, задача здесь одномерная и состоит из IF-а вложенного внутрь REPEAT, а бинарную псевдо двумерность Вы внесли сами введя для этого вспомогательную команду empty.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 29 Апрель, 2009 11:00 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну, может быть, что и так :)

Просто я вообще не привык использовать цикл REPEAT, а если трансформировать его в WHILE, то выносимое до него первое действие слишком длинное... Поэтому я сразу отбросил вариант с IF.

Хотя... IF - это охрана на действие. Выражающая, что действие выполняется не всегда.
В Вашем варианте она выражает, что выполнение Run происходит всегда, кроме, возможно, последнего обращения цикла. Т.е. этот IF внутри цикла нужен только для того, чтобы "подстрогать" на один раз. Что-то мне это напоминает засовывание обрабтки найденного элемента внутрь FOR-IF :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 29 Апрель, 2009 17:43 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Так выше в этой ветке мы как раз убедились, как стремление - нет, не отказаться от чего-то... а наоборот - привести к прозрачной схеме, привело к свёртке действий в понятные процедуры.
В ветке по грамотной алгоритмизации я приводил пример с просчётом графа, где сразу же после осознания семантики цикла естественным образом вылезли две крупных операции - и всё свернулось в три строчки...

Как только проясняем основную идею (базовую схему; либо более нестандартное соотношение-инвариант, но явно записанное), уже ясно, как всё уложить. Разбивается сверху вниз. От балды можно разбить неудачно. Пример - с интерфейсом потокового чтения. Семантика "попробовал-узнал результат попытки" следует из знания паттернов циклов (что гораздо более общая штука). Если же знания нет, то пёс его знает, как там возвращать этот eof...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 29 Апрель, 2009 20:02 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Илья Ермаков писал(а):
В ветке по грамотной алгоритмизации я приводил пример с просчётом графа, где сразу же после осознания семантики цикла естественным образом вылезли две крупных операции - и всё свернулось в три строчки...


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

P.S. К вопросу о тому чему учить в образовательных заведениях. Хоть какой-нибудь функциональный язык обязан присутствовать если не в школьной программе, то в ВУЗовской. И не надо пытаться подменить его обероном, который якобы поддерживает функциональный стиль.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 29 Апрель, 2009 20:14 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
К этому примеру - да, не имеет!
Я просто в очередной раз акцентирую внимание, что стиль построения алгоритмов имеет влияние на разных уровнях системы, а не просто "написали-обернули-забыли-занялись архитектурой".

Про ФП - безусловно. В высшем профильном образовании никто не возражает. Вообще, должен быть обширный курс по разным парадигмам программирования. Без эрудиции никуда.

В школьную программу это за безнадобностью (да если бы и "за надобностью" - это была бы просто маниловщина... ибо там "не до жиру...")


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 30 Апрель, 2009 12:11 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Про ФП - безусловно.
Инсинуации Vladа надоели.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 02 Май, 2009 09:40 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Между прочим, в процессе отладки в цикле выяснился еще один нюанс.
Код:
while (true)
{       RM = mem[RA];            // выбрать слово
       RA = (RA + 1) % N;         // изменение адреса - по модулю 1024
      RC = RM.cmd.first;         // выбрать команду first
      run();                         // выполнить команду
      [b]if (Jump) continue;   // если переход, то не выполнять вторую команду [/b]
      if (Error || stop) break;   // если команда stop или ошибка
      RC = RM.cmd.second;         // выбрать команду second
      run();                  // выполнить команду
      if (Error || stop) break;   // если команда stop или ошибка
}

Как это учесть в цикле Дейкстры, который Илья Ермаков написал?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 02 Май, 2009 10:56 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Код:
   WHILE  ~( Error OR stop )  DO               (*пока нет причин закончить*)
      RM := mem[RA];
      RA := ( RA + 1 ) MOD N;
      RC := RM.cmd.first;
      run();
      IF ( ~( Error OR stop OR Jump ) ) THEN   (*если нет причин не выполнять вторую команду*)
         RC := RM.cmd.second;
         run()
      END
   END


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 02 Май, 2009 11:59 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Ну, такой простой вариант, естественно, понятен. Но как-то Дейкстры тут не видать - обычный программистский цикл. А у Ильи получилось совсем классно - с состояниями!
Я Дейкстру, конечно, читал еще тогда. И даже разбирал все доказательства теорем. И даже сам доказывал то, что он оставлял читателю. Но тогда все это воспринималось исключительно с теоретической точки зрения. А сейчас я хочу все эти дела в учебный язык включить, поэтому нужно с практической точки зрения разобраться, в каком виде это может быть в языке.
Как у Мейерса в Эйфеле?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 02 Май, 2009 12:55 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Валерий Лаптев писал(а):
if (Jump) continue; // если переход, то не выполнять вторую команду

А если Jump будет лежать во второй части слова? Такое предусмотрено?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 02 Май, 2009 13:27 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Peter Almazov писал(а):
Валерий Лаптев писал(а):
if (Jump) continue; // если переход, то не выполнять вторую команду

А если Jump будет лежать во второй части слова? Такое предусмотрено?

Если вторая команда, то специально ничего проверять не нужно: цикл просто переходит на проверку условия (а Регистр адреса RA уже новый!).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 02 Май, 2009 16:18 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Обсуждение выхода из середины процедуры: viewtopic.php?f=7&t=1543


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 02 Май, 2009 16:46 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Валерий Лаптев писал(а):
Ну, такой простой вариант, естественно, понятен. Но как-то Дейкстры тут не видать - обычный программистский цикл.
Что-то я не находил таких статей, где говорилось бы, что Дейкстра любил нагромождать сложности...
Валерий Лаптев писал(а):
А у Ильи получилось совсем классно - с состояниями!
Я не считаю, что Илья правильно использует этот цикл. Зачем оно надо, если тело выполняется только один раз? Какой же это цикл? Правильнее было бы, конечно, не высказывать своего мнения по поводу цикла Дейкстры, пока толком не разобрался, но...
Код:
WHILE  ...  DO  ...  ELSIF  ...  END
ближе всего по семантике к
Код:
WHILE  ...  DO
WHILE  ...  DO    END
 ...
WHILE  ...  DO    END
END
А вообще - это цикл, содержащий CASE-подобную конструкцию (или, скорее, даже WITH-подобную), в каждом из вариантов которой присутствует единственный оператор - обычный цикл WHILE. Выбор варианта делается на основе максимально полного соответствия условию подцикла, следующего далее. Количество вариантов должно быть настолько велико, чтобы полностью покрыть условие наружного цикла.


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

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


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

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


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

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