OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 27 Апрель, 2024 20:30

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




Начать новую тему Ответить на тему  [ Сообщений: 85 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
СообщениеДобавлено: Среда, 28 Апрель, 2010 11:17 
Аватара пользователя

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

Код:
 WHILE ОбщееУсловие DO (или LOOP вместо предыдущей конструкции – в зависимости от обстоятельств)
     [ОбщаяПоследовательностьОператоров_Начало]
{WHEN ЧастноеУсловие THEN
     ПоследовательностьОператоровДляЧастногоУсловия}
[ALWAYS
     ОбщаяПоследовательностьОператоров_Окончание]
 END;


Последний раз редактировалось Сергей Прохоренко Среда, 28 Апрель, 2010 11:20, всего редактировалось 2 раз(а).

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

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Речь вроде как про способ записи цикла Дейкстры, а не про альтернативы, на него похожие...


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

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


Это не альтернатива, а обобщение (необходимость подсказана Александром Ильиным). А цикл Дейкстры - частный случай. Для получения цикла Дейкстры в чистом виде достаточно выбрать из двух вариантов LOOP, а также убрать опциональную ветвь ALWAYS.


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

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Сергей Прохоренко писал(а):
Это не альтернатива, а обобщение (необходимость подсказана Александром Ильиным).
Александр Ильин, хотелось бы услышать Ваше мнение касательно необходимости этого обобщения.


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Общая последовательность часто возникает - и в гнёздах IF-ов тоже. Это не повод так усложнять конструкцию. Если нужно, общая часть выделяется во вложенную процедуру.

(в двумерной структуре такой проблемы нет)


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

Зарегистрирован: Вторник, 11 Август, 2009 11:44
Сообщения: 516
Откуда: Бердск
MaximGB писал(а):
Не понятно зачем там "|", ...
Мне представляется, без этого магического символа, неотличимо продолжение StatementSeq от начала ExpX по одному терминальному символу.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Апрель, 2010 14:32 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Вариант Сергея, мне кажется, вполне можно реализовать с использованием ранее предложенной формы. Для этого достаточно не писать expr перед первым или перед последним do
Код:
while | do ... | expr do ... end

или
Код:
while | expr do ... | do ... end


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

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

1) будет ли проверяться условие следующей ветки (как в Си в переключателе без Break на конце ветки)? С другой стороны, непонятно, какой смысл может иметь последовательное выполнение нескольких вроде как альтернативных веток.

2) или же произойдет переход к первому оператору, следующему за циклом(как в Си в переключателе с Break на конце ветки)?

3) или же условия всех веток должны проверяться одновременно, и при выполнении условий двух и более веток должна возникать исключительная ситуация? Тогда ясность и однозначность этой конструкции будет сопоставима с оператором выбора CASE, но время выполнения будет довольно большим.

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

Какие есть соображения?

Еще одни момент: по идее общую последовательность операторов без условия (т.е. | DO ...) можно размещать не только в начале или в конце цикла, но и в середине.


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

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Евгений Темиргалеев писал(а):
Александр Ильин, хотелось бы услышать Ваше мнение касательно необходимости этого обобщения.
Я просто встретил такой цикл и понял, что это не цикл Дейкстры. На всякий случай уточнил здесь. У меня теперь есть вопрос, как его преобразовать к структурному виду, но это за рамками данной темы. Необходимость обобщения я не утверждаю, это просто Сергею Прохоренко показалось интересным, вот он и развивает мысль.

Мой цикл можно преобразовать так:
Код:
LOOP
   AlwaysDo;
   IF A THEN Do1 ()
   ELSIF B THEN Do2 ()
   ...
   ELSE
      EXIT
   END;
END;
В принципе, это цикл REPEAT, просто проверка условий нагружается побочными действиями. Переделываем процедуры DoX () так, чтобы они возвращали результат TRUE. Тем самым мы создаём возможность включить их в логическое выражение.
Код:
REPEAT
   AlwaysDo;
UNTIL ~(A & Do1 ()) & ~(B & Do2 ()) & ...;
Вариант:
Код:
REPEAT
   AlwaysDo;
UNTIL ~DoA () & ~DoB () & ...;
Процедура DoA выглядит при этом так:
Код:
PROCEDURE DoA;
BEGIN
   res := A;
   IF res THEN
      Do1 ();
   END;
   RETURN res
END DoA;


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

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
В принципе и цикл Дейкстры можно редуцировать до WHILE:
Код:
WHILE DoA () OR DoB () OR ... DO
END;
Так что не знаю, насколько он фундаментален. Где у самого Дейкстры можно прочитать обоснование? Дайте кто-нибудь ссылку на первоисточник, пожалуйста.


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

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 563
Откуда: Москва
Александр Ильин писал(а):
В принципе, это цикл REPEAT, просто проверка условий нагружается побочными действиями. Переделываем процедуры DoX () так, чтобы они возвращали результат TRUE. Тем самым мы создаём возможность включить их в логическое выражение.
...
А зачем так извращаться?
Код:
REPEAT
   Выйти:=FALSE;
   AlwaysDo;
   IF A THEN Do1 ()
   ELSIF B THEN Do2 ()
   ...
   ELSE
     Выйти:=TRUE;
   END;
UNTIL Выйти;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Апрель, 2010 16:58 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 987
Откуда: Казань
Александр Ильин писал(а):
... Так что не знаю, насколько он фундаментален. Где у самого Дейкстры можно прочитать обоснование? Дайте кто-нибудь ссылку на первоисточник, пожалуйста.

В своей книге "Дисциплина программирования", Дейкстра описывает мини язык, который он по ходу книги развивает и добавляет туда новые элементы. Сначала появляется оператор "пропустить", затем "отказать", затем "набор охраняемых команд" и наконец "набор охраняемых команд" немного преобразуется и получается цикл Дейкстры, хотя в самой книге он так не называется.
Вот как происходит переход от "набора охраняемых команд" к циклу:
Цитата:
ŠКонструкция if-fi представляет собой только один из двух возможных способов построения оператора из набора охраняемых команд. В конструкции if-fi состояние, при котором все предохранители имеют ложные значения, ведет к отказу. В нашей второй форме мы разрешаем, чтобы состояние, при котором нет ни одного предохранителя с истинным значением, приводило к правильному завершению; поскольку в этой ситуации не запускается никакой список операторов, вполне естественно, что при этом возникает семантическая эквивалентность с пустым оператором. Однако это разрешение на правильное завершение, когда нет ни одного предохранителя с истинным значением, дополняется тем, что работе не разрешается завершаться, пока хотя бы один предохранитель является истиной.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Апрель, 2010 17:37 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Сергей Прохоренко писал(а):
Самый "скользкий" момент, который не обсудили: если была выполнена одна из веток DO, то:

1) будет ли проверяться условие следующей ветки (как в Си в переключателе без Break на конце ветки)? С другой стороны, непонятно, какой смысл может иметь последовательное выполнение нескольких вроде как альтернативных веток.

2) или же произойдет переход к первому оператору, следующему за циклом(как в Си в переключателе с Break на конце ветки)?

3) или же условия всех веток должны проверяться одновременно, и при выполнении условий двух и более веток должна возникать исключительная ситуация? Тогда ясность и однозначность этой конструкции будет сопоставима с оператором выбора CASE, но время выполнения будет довольно большим.

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

Еще одни момент: по идее общую последовательность операторов без условия (т.е. | DO ...) можно размещать не только в начале или в конце цикла, но и в середине.

Сначала - на последний. Понятно, что можно и в середине. Ног, мне кажется, что тут как раз можно было бы и запретить. Может кто подскажет, почему мне не нравится общая последовательность в середине? :)
Теперь первый.
У самого Дейкстры написано, что для выполнения выбирается ОДНА ИЗ... Он упоминает о недетерминированности выбора, но в замечании отмечает, что недетерминированности не возникает, если все предохранители попарно исключают друг друга.
Мне кажется, что нужно сделать в цикле последовательную проверку ВСЕХ условий. Выполнять те списки операторов, условия которых истинны. Выход из цикла - если ни одно из них не является истинным.

Добавлю.
Можно сделать ветку else, которая выполняется один раз по выходе из цикла. Так в Питоне сделано. Полезно бывает...


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

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

1) будет ли проверяться условие следующей ветки (как в Си в переключателе без Break на конце ветки)? С другой стороны, непонятно, какой смысл может иметь последовательное выполнение нескольких вроде как альтернативных веток.


У самого Дейкстры написано, что для выполнения выбирается ОДНА ИЗ... Он упоминает о недетерминированности выбора, но в замечании отмечает, что недетерминированности не возникает, если все предохранители попарно исключают друг друга.
Мне кажется, что нужно сделать в цикле последовательную проверку ВСЕХ условий. Выполнять те списки операторов, условия которых истинны. Выход из цикла - если ни одно из них не является истинным.


Я понял так, что Вы выбрали первый вариант. А почему? Он, конечно, лучше других сопрягается с общими последовательностями операторов, но он медленный (все условия проверяются) и, в то же время, чреват ошибками (если условия двух или более веток неожиданно совпали).


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

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Валерий Лаптев писал(а):
Можно сделать ветку else, которая выполняется один раз по выходе из цикла. Так в Питоне сделано. Полезно бывает...
Зачем, если этот же код можно элементарно поместить сразу после цикла?


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

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Прелюбопытное чтение, да.


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

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

Я слишком много раз в структурных программах видел СРАЗУ ПОСЛЕ ЦИКЛА дополнительные проверки. Это обычное дело при поиске. И после цикла проверяется, каким способом вышли: то ли нашли, то ли не нашли и исчерпали все элементы... :)


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

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

Я слишком много раз в структурных программах видел СРАЗУ ПОСЛЕ ЦИКЛА дополнительные проверки. Это обычное дело при поиске. И после цикла проверяется, каким способом вышли: то ли нашли, то ли не нашли и исчерпали все элементы... :)


Правильно ли я понимаю, что ветка else будет выполняться, если цикл не исполнился ни разу, то есть при первой попытке выполнить цикл условия всех веток имели значение "ложь"?

Кстати, слово else - не очень удачный выбор. Я бы использовал что-нибудь типа failed.


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

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
1. Понимаете правильно. Но имхо ветка else - факультативна. Как в if: можно писать, можно не писать.
2. Возможно, вы правы. :) С одной стороны, оставить else только для if, чтобы не путать. С другой стороны, семантика-то этой ветки та же самая, что и в if.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 29 Апрель, 2010 18:24 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Целый день не было постов - консенсус?... :)
Тогда прошу написать ваше мнение по поводу дейкстриного оператора присваивания.
В ДП у него такой вариант:
x, y, ...z := exprX, exprY, ... exprZ;


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

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


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

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


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

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