OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 27 Июнь, 2019 00:59

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




Начать новую тему Ответить на тему  [ Сообщений: 235 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 12  След.
Автор Сообщение
СообщениеДобавлено: Среда, 27 Ноябрь, 2013 17:15 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3055
Откуда: Астрахань
igor писал(а):
Валерий Лаптев писал(а):
Я придерживаюсь определения вашего оппонента с добавлением об инварианте.
Тогда у меня вопрос к Вам и к моему оппоненту. Скажите пожалуйста, чем продиктовано ваше требование, что последовательность действий в цикле должна "целиком выполняться N раз"?


Блин!
Писал-писал, а все гикнулось.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Ноябрь, 2013 17:25 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
ilovb писал(а):
igor писал(а):
Скажите пожалуйста, чем продиктовано ваше требование, что последовательность действий в цикле должна "целиком выполняться N раз"?

Тем, что если не придерживаться этого требования, то мы автоматически возвращаемся к программированию на ассемблере.
цикл + break/exit = goto + if
Само требование и его обоснование никак не связаны друг с другом. По моему Вы не приняли во внимание вот это моё сообщение:
Цитата:
EXIT есть только в неудачном синтаксисе КП, а на картинке нет никаких EXIT'ов и бряков. :wink:
(Поэтому я и начал с картинки, потому что ни в одном известном мне языке нет адекватного оператора цикла).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Ноябрь, 2013 17:37 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Валерий Лаптев писал(а):
Блин!
Писал-писал, а все гикнулось.
Поэтому я когда пишу сообщение периодически нажимаю Ctrl+A, Ctrl+C :wink:

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

PS: Куда же Илья запропастился! Он мог бы меня "добить". :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Ноябрь, 2013 18:37 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1523
Вижу что не понят. Потому еще картинка! :D
Попытался выделить самую суть структурного программирования (как я его понимаю)
Вложение:
Snap 2013-11-27 at 18.57.36.png
Snap 2013-11-27 at 18.57.36.png [ 126.92 КБ | Просмотров: 4969 ]

Желтые кружочки - это действия в последовательности.
Розовые кружочки - это действия в подпоследовательности.
Красные кружочки - это абстрактный оператор ветвления
Черные стрелки - это безусловный путь.
Красные стрелки - это условный путь.

1. Первая конструкция - простая последовательность. Все действия выполняются в строгом порядке ровно 1 раз.
2. Вторая конструкция - ветвление. Получается из последовательности путем выделения подпоследовательности, которая может выполняться 0 или 1 раз.
3. Третья конструкция - цикл. Отличается от ветвления только тем, что подпоследовательность может выполняться N >= 0 раз.

Вот три кита структурного программирования. (последовательность, "IF THEN END" и "WHILE DO END")
Простейшие конструкции, но путем их комбинирования можно закодить любой алгоритм. И программа, построенная по таким правилам, будет легко поддаваться анализу.

Подозреваю что вы спросите где ELSE.
Вот он:
Код:
<действие1>
IF cond THEN
   <действие2>
END
IF ~cond THEN (* это ELSE *)
   <действие3>
END
<действие4>

REPEAT уже показывал:
Код:
<действие1>
next := true;
while next do
   <действие2>
   <действие3>
   if cond then
      next := false;
   end;
end;
<действие4>


ps На самом деле IF тоже можно через WHILE выразить. (т.е. базовых конструкций всего две в сухом остатке) :wink:
Код:
<действие1>
flag := true;
while cond & flag do (* это IF *)
   <действие2>
   <действие3>
   flag := false;
end;
<действие4>

pps REPEAT UNTIL, IF END, IF ELSE END etc - это все лишь синтаксический сахар для WHILE.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Ноябрь, 2013 18:45 

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

PS: Куда же Илья запропастился! Он мог бы меня "добить". :)


1. Дейкстра не "считает", а обосновывает и доказывает. И не на пустом месте. а на на теореме о трех структурных конструкциях.
2. Я не считаю эти результаты устаревшими, ибо они подтверждаются практикой - помогают бороться со сложностью.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Ноябрь, 2013 19:33 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Борис и Валерий, спасибо за информацию и за разъяснения. Полагаю мне необходимо взять тайм-аут для осмысления. Да и Дейкстру что-то захотелось перечитать. В общем, не теряйте меня, я на некоторое время исчезну.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Ноябрь, 2013 13:07 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9127
Откуда: Россия, Орёл
Ну, мне кажется, говорит, что "это цикл, а это не цикл" - терминологически неправильно...
Но можно сказать о некоей канонической форме цикла.
Процесс выполнения которой имеет вид: Проверка; { Действия; Проверка }

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Ноябрь, 2013 13:09 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9127
Откуда: Россия, Орёл
Хотя рассуждения Игоря, по мне, тоже интересны - если смотреть на них как на умственное упражнение "а что, если..".

Пётр Алмазов, кстати, на Оберспейсе приводил пример цикла с проверкой условия в произвольном месте.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Ноябрь, 2013 13:20 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 530
Откуда: Москва
Похоже, Илья имеет ввиду это viewtopic.php?p=57745#p57745


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Ноябрь, 2013 14:19 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1523
Остается один вопрос: Зачем? Избежать дублирования?
Неужели это так важно?

За свою практику написал довольно много кода, и ни разу не думал break'ами.

Проблема то в том, что формализм, который тут описывал igor и Peter Almazov, никакого сильного профита не дает, но при этом он очевидно сложнее для восприятия и анализа чем классический структурный цикл.

На практике, люди(большинство), которые регулярно пользуются break, никакими такими формализмами не думают. Они думают goto'ами(переходами), т.е. просто не видят цикла (хоть и употребляют это слово)

Само слово "цикл", кстати, некоторые воспринимают как "переход на начало блока".
Сам термин, да, провоцирует такое восприятие (ибо представляется какая-то "зацикленная" цепочка), но это не верно!
Лучше бы был термин "повтор", и путаницы было бы меньше.
Потому как в структурном программировании вроде как можно все последовательности завернуть в процедуры/подпрограммы.
Т.е. любую программу можно представить в таком виде:
Цитата:
процедура1()
повторять(процедура2) пока <условие1>
процедура3()
повторять(процедура4) пока <условие2>
процедура4()


И тут уже ясно видно что никаких выходов из середины цикла быть не может, потому как у "повторять" нету тела.

Очевидно что формализм "break" никак в эту схему не вписывается.

ps Все сказанное - это только мое личное мнение.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Ноябрь, 2013 14:32 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3055
Откуда: Астрахань
Которое я поддержтиваю.
Посмотрим на обобщенный цикл Алмазова.
Если внимательно присмотреться, то становится понятно,
что это обычный цикл с постусловием, в котором тело цикла включает оператор if.
Цикл Алмазова:
Код:
do
  часть1
  if (условие) выход
  часть2
enddo

Преобразуется в следующий:
Код:
do
  часть1
  if(~условие)
  часть2
  endif
while(условие)

И цикл становится структурным.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Ноябрь, 2013 18:05 

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


Вложения:
Extract Pages.pdf [281.08 КБ]
Скачиваний: 112
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Ноябрь, 2013 18:44 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1523
Н.Вирт. О некоторых основных понятиях языков программирования. Перевод А.П.Ершова. Из архива Ершова

ps Какой однако ужасный почерк у этого вашего Ершова... :D
pps Оригинал: http://oberon2005.oberoncore.ru/paper/nw1967may.pdf


Последний раз редактировалось ilovb Четверг, 28 Ноябрь, 2013 18:50, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Ноябрь, 2013 20:16 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1523
igor писал(а):
igor писал(а):
Да и Дейкстру что-то захотелось перечитать.
Наткнулся на перевод одной из ранних статей Никлауса Вирта, датированной 1967 годом (автор перевода мне неизвестен). В частности в ней рассматривается такой же цикл, как я предложил в этой теме. Вирт называет его "тройственной конструкцией". Свою оценку этому циклу Вирт не даёт, но говорит, что эту идею высказал Д. Кнут.
Получается, что этот цикл был известен отцам-основателям с самого начала (невозможно себе представить иное), но впоследствии эта "тройственная конструкция" впала у них в немилость.


Думаю, что даты немного проясняют эту ситуацию:
1. Bohm, Corrado; and Giuseppe Jacopini (May 1966). «Flow Diagrams, Turing Machines and Languages with Only Two Formation Rules»
2. Dijkstra, Edsger (1968). «Go To Statement Considered Harmful»
Цитата:
Публикация теоремы была толчком к началу дебатов о структурном программировании. Спустя 2 года вышла статья Эдсгера Дейкстры «Go To Statement Considered Harmful»[2], в которой он критиковал использование оператора GOTO и высказывался в пользу улучшения стиля программного кода за счёт использования структур управления и отказа от других инструкций, управляющих ходом алгоритма.

Теорема Бёма — Якопини


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Ноябрь, 2013 23:37 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1523
Илья Ермаков писал(а):
Процесс выполнения которой имеет вид: Проверка; { Действия; Проверка }


Это сообщение натолкнуло на любопытную фантазию :)

Если определить последовательность следующим образом:
Последовательность = Действие; {Последовательность}
и связать с каждой последовательностью охранники, то имеем первичный вид охранника:
Код:
flag := true
while flag do
   <sequence>
   flag := false
end

и его модификации:

IF <condition> THEN <sequence> END
Код:
flag := <condition>
while flag do
   <sequence>
   flag := false
end

WHILE <condition> DO <sequence> END
Код:
flag := <condition>
while flag do
   <sequence>
   flag := <condition>
end

REPEAT <sequence> UNTIL ~<condition> END
Код:
flag := true
while flag do
   <sequence>
   flag := <condition>
end


Т.е. охранник в общем виде описывается так:
Код:
flag := [ true | <condition> ]
while flag do
   <sequence>
   flag := [ false | <condition> ]
end


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 29 Ноябрь, 2013 08:58 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9127
Откуда: Россия, Орёл
Ну да )
Фантазия любопытная.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 29 Ноябрь, 2013 09:22 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1523
Получается, что структурная программа имеет следующий вид:
:D
<PrimaryGuard>, <SecondaryGuard>, <Sequence>;
<PrimaryGuard>, <SecondaryGuard>, <Sequence>;
<PrimaryGuard>, <SecondaryGuard>, <Sequence>;
<PrimaryGuard>, <SecondaryGuard>, <Sequence>;
<PrimaryGuard>, <SecondaryGuard>, <Sequence>;
<PrimaryGuard>, <SecondaryGuard>, <Sequence>;
<PrimaryGuard>, <SecondaryGuard>, <Sequence>;
...

где:
Sequence = Operation; {Sequence}
PrimaryGuard = [True | Condition]
SecondaryGuard = [False | Condition]

--------------------------------------------------------------------------
Простая последовательность выглядит так:
True, False, Sequence;
"Последовательность выполняется, и не повторяется"

Простое ветвление так:
Condition, False, Sequence;
"Последовательность выполняется если Condition = True, и не повторяется"

Цикл с предусловием так:
Condition, Condition, Sequence;
"Последовательность выполняется если Condition = True, и повторяется пока Condition = True"

Цикл с постусловием так:
True, Condition, Sequence;
"Последовательность выполняется, и повторяется пока Condition = True"


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 29 Ноябрь, 2013 10:02 

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 2046
Э... так это типа как в стандарте на "программные конструктивы": http://www.gametest.ru/doc/sw/8631_94.pdf объясняется, что ли?..


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 29 Ноябрь, 2013 10:09 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1523
Не. Это скорее разновидность брэйнфака получается. :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 29 Ноябрь, 2013 10:12 

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 2046
Просто, поскольку обдумывал формализацию строения "прогконструктивов", как они там описаны на словах, то обнаружил аналогию с Вашими формулами.


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

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


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

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


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

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