OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 20 Сентябрь, 2017 14:06

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




Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 00:05 
Модератор
Аватара пользователя

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

Код:
Первый_этап;
IF первый этап удался THEN
  Второй_этап
AND второй этап удался THEN
  Третий_этап
AND третий этап удался THEN
  Завершающие действия
ELSE
  Задача не выполнена
END


Пока условия истинны, выполнение продвигается. При первом ложном условии выполнение переключается на ELSE.

В ряде задач нужно ещё различать, на каком этапе неуспех. Но это делается явной переменной, хранящей текущий этап.

Код:
step := 1;
Первый_этап;
IF первый этап удался THEN
  step := 2;
  Второй этап;
AND второй этап удался THEN
  ...
ELSE
  Log.String("Ошибка на этапе "); Log.Int(step)
END


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 00:20 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 2846
Откуда: Астрахань
А сейчас как это моделируется?
Код:
Первый этап;
IF первый этап удался THEN
   Второй этап;
END;
IF второй этап удался THEN
   Третий этап;
END;
IF третий этап удался THEN
   Завершающие действия;
ELSE
   Задача не выполнена;
END;

Да, AND THEN является неделимой конструкцией - это хорошо.
Но не похоже ли это на if Дейкстры, который я приводил ранее в другой теме (viewtopic.php?p=57323#p57323)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 00:27 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8781
Откуда: Россия, Орёл
Валерий Лаптев писал(а):
А сейчас как это моделируется?


Нет, не так, как Вы привели.

У Вас проверка "второй этап удался" не стоит под охраной "первый этап удался".

Сейчас, если не громоздить вложенные IF-ы, обычно делаем:
(обсуждалось тут: viewtopic.php?f=6&t=2290)
Код:
Первый этап;
ok := первый этап удался;
IF ok THEN
  Второй этап;
  ok := второй этап удался
END;
IF ok THEN
  Действия при успехе
ELSE
  Действия при неуспехе
END


Т.е. переход состояния управления моделируется спец. переменной. То ли мы ещё на успешном маршруте, то ли уже нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 06:02 
Аватара пользователя

Зарегистрирован: Суббота, 27 Февраль, 2010 23:34
Сообщения: 746
Что мешает сделать этапы логическими функциями? Тогда было бы просто...
Код:
IF <этап0> AND <этап1> AND <этап3> ... THEN....

или даже так:
Код:
i := 0;
WHILE ((i < Count) AND <зтап[i]>) DO BEGIN
        ...
        i := i + 1;
END;
ok := (i = Count);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 06:56 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2284
Откуда: Россия, Санкт-Петербург
Можно ANDIF по аналогии с ELSIF.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 08:18 

Зарегистрирован: Воскресенье, 01 Ноябрь, 2009 05:13
Сообщения: 2046
Илья Ермаков писал(а):
...
Сейчас, если не громоздить вложенные IF-ы, обычно делаем:
Код:
 Первый этап;
ok := первый этап удался;
IF ok THEN
  Второй этап;
  ok := второй этап удался
END;
IF ok THEN
  Действия при успехе
ELSE
  Действия при неуспехе
END
Т.е. переход состояния управления моделируется спец. переменной. То ли мы ещё на успешном маршруте, то ли уже нет.
А для скрытия этой переменной какие мотивы? Так получается удобнее писать? или читать?
Я к тому, что можно записать логику выбора по-разному - см. этот пример хотя бы. Тут во втором варианте переменная состояния присутствует явно - а в первом неявно через "символизацию" адресов силуэтных БП (которые трактуются как коды состояния). А если совсем убрать - не лишится ли мышление читателя (особенно "предметника") существенной опоры для восприятия (особенно когда действительно имеются в виду состояния деятельности)? Можно, конечно, фиксировать это в комментариях...


Последний раз редактировалось Владислав Жаринов Среда, 19 Январь, 2011 09:04, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 08:37 

Зарегистрирован: Пятница, 24 Апрель, 2009 16:28
Сообщения: 524
Откуда: Москва
Илья Ермаков писал(а):
Сейчас, если не громоздить вложенные IF-ы, обычно делаем:
Вот так и дальше делайте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 08:38 

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 630
Откуда: Псков
Из своей практики (MUMPS) могу предложить:
1. Такой же как у И.Ермакова с переменной ok.
2. Каждый этап оформлен как функция, возвращающая успешность выполнения. Тогда получается что-то вроде (сама идея) :
IF not этап1
ELSEIF not этап2
...
ELSEIF not этапN
ELSE итоговые

3. WHILE в комбинации с CASE в теле WHILE (что то вроде наипростейшего автомата)

P.S.
А сама конструкция (начало темы) не очень нравится :(


Последний раз редактировалось albobin Среда, 19 Январь, 2011 09:26, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 08:55 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Илья Ермаков писал(а):
После написания очередного кода взаимодействия с окружением, с кучей проверок - полуночная мыслишка о конструкции:
Код:
Первый_этап;
IF первый этап удался THEN
  Второй_этап
AND второй этап удался THEN
  Третий_этап
AND третий этап удался THEN
  Завершающие действия
ELSE
  Задача не выполнена
END

Пока условия истинны, выполнение продвигается. При первом ложном условии выполнение переключается на ELSE.

Интересно, почему нет такой конструкции в распространённых языках. Наверное потому, что она легко имитируется использованием выхода из середины процедуры и генерацией/обработкой исключений.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 08:56 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Peter Almazov писал(а):
Илья Ермаков писал(а):
Сейчас, если не громоздить вложенные IF-ы, обычно делаем:
Вот так и дальше делайте.

Любая ручная рутина провоцирует лишние ашипки.
То, что может быть автоматизировано -- должно быть автоматизировано.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 09:29 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4392
Откуда: Россия, Орёл
Илья Ермаков писал(а):
После написания очередного кода взаимодействия с окружением, с кучей проверок - полуночная мыслишка о конструкции:
"Утро вечера мудренее". Стоит исчо подумать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 12:07 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Просто используйте вложенные IF и нечего огород городить.

Кстати, большинство вложенных IF можно раскрутить в линейную цепочку с использованием ELSIF если сначала проверять "противное" условие.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 13:05 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2284
Откуда: Россия, Санкт-Петербург
Сергей Губанов писал(а):
Кстати, большинство вложенных IF можно раскрутить в линейную цепочку с использованием ELSIF если сначала проверять "противное" условие.
О! Спасибо за подсказку!
Пример:
Код:
IF A THEN
   IF B THEN
      a;
   ELSE
      b;
   END;
ELSE
   c;
END;
Превращаем в:
Код:
IF ~A THEN
   c;
ELSIF ~B THEN
   b;
ELSE
   a;
END;
Жаль, что не получится между проверкой A и проверкой B вставить какое-то действие, например, присваивание. Например, если B = (item = NIL), и item можно присвоить только если A = TRUE:
Код:
IF list # NIL THEN
   item := list.first;
   IF item # NIL THEN
      a;
   ELSE
      b;
   END;
ELSE
   c;
END;
Не преобразуется.

Разве что завести процедуру GetItem (list: List; VAR res: Item): BOOLEAN, но это редко стоит выигранного отступа.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 14:15 
Аватара пользователя

Зарегистрирован: Суббота, 15 Март, 2008 20:00
Сообщения: 293
Откуда: Київ, Україна
Илья, а почему не сделать просто:
Код:
PROCEDURE ПервыйЭтап(VAR step:LONGINT):BOOLEAN;
BEGIN
 INC(step)
END ПервыйЭтап;

step := 0;
IF ПервыйЭтап(step) AND ВторойЭтап(step) AND Трет..... THEN
  Завершающие действия
ELSE
  Log.String("Ошибка на этапе "); Log.Int(step)
END


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 14:25 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4392
Откуда: Россия, Орёл
Александр Ильин писал(а):
Сергей Губанов писал(а):
Кстати, большинство вложенных IF можно раскрутить в линейную цепочку с использованием ELSIF если сначала проверять "противное" условие.
О! Спасибо за подсказку!
Уже обсуждалось: viewtopic.php?f=82&t=2349, viewtopic.php?f=6&t=2290


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 16:56 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2178
Откуда: Нижний Новгород
Илья Ермаков писал(а):
После написания очередного кода взаимодействия с окружением, с кучей проверок - полуночная мыслишка о конструкции:

В общем вот для С++: http://valexey.blogspot.com/2011/01/and-then-in-c.html
Язык менять не надо. Макросы не нужны. Шаблоны не нужны. Перегрузка операторов не нужна.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 18:41 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
albobin писал(а):
2. Каждый этап оформлен как функция, возвращающая успешность выполнения. Тогда получается что-то вроде (сама идея) :
IF not этап1
ELSEIF not этап2
...
ELSEIF not этапN
ELSE итоговые

Не всегда эти этапы стоит оформлять как функции. Часто этап занимает 2-3 строки -- и что, эти 2-3 строки выдирать из контекста, добавлять ещё три строки на PROCEDURE ... BEGIN ... END, протаскивать туда нужный этапу конекст? Стоит ли?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 20:19 
Аватара пользователя

Зарегистрирован: Суббота, 27 Февраль, 2010 23:34
Сообщения: 746
Надо расширить постановку задачи... Не только AND THEN, но и OR THEN, XOR THEN, NOT THEN...
Ну, а дальше простор для фантазии... Например, EQ1 THEN, EQ2 THEN, EB0 THEN, EA1 THEN...
Потом подумать про обобщающие конструкции... :)

PS. "Сон разума рождает чудовищ" Гете.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 20:42 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8781
Откуда: Россия, Орёл
albobin писал(а):
Из своей практики (MUMPS) могу предложить:
1. Такой же как у И.Ермакова с переменной ok.
2. Каждый этап оформлен как функция, возвращающая успешность выполнения. Тогда получается что-то вроде (сама идея) :
IF not этап1
ELSEIF not этап2
...
ELSEIF not этапN
ELSE итоговые

3. WHILE в комбинации с CASE в теле WHILE (что то вроде наипростейшего автомата)

P.S.
А сама конструкция (начало темы) не очень нравится :(


Да, мне представляется хорошим вот такой вариант:

Код:
step := 1; ok := TRUE;
WHILE (step # 3) & ok DO
  CASE step OF
  | 1:
    Первый этап;
    ok := первый этап успешен
  | 2:
    Второй этап;
    ok := второй этап успешен
  END;
  INC(step)
END


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

Ну, расширять язык я, разумеется, и не предлагал. Конструкция была затравкой к рассмотрению такого класса алг. структур :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Конструкция AND THEN?
СообщениеДобавлено: Среда, 19 Январь, 2011 20:55 

Зарегистрирован: Пятница, 20 Июль, 2007 17:26
Сообщения: 630
Откуда: Псков
Чем не очень нравится конструкция с AND THEN, так тем (по мимо всего прочего), что она не эквивалентна последовательности IFов:
IF лог.выражение1 THEN действие 1 END
IF лог.выражение1 AND лог.выражение2 THEN действие 2 END
и т.д.


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

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


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

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


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

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