OberonCore
https://forum.oberoncore.ru/

Конструкция AND THEN?
https://forum.oberoncore.ru/viewtopic.php?f=27&t=3175
Страница 1 из 2

Автор:  Илья Ермаков [ Среда, 19 Январь, 2011 00:05 ]
Заголовок сообщения:  Конструкция AND THEN?

После написания очередного кода взаимодействия с окружением, с кучей проверок - полуночная мыслишка о конструкции:

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


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

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

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

Автор:  Валерий Лаптев [ Среда, 19 Январь, 2011 00:20 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

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

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

Автор:  Илья Ермаков [ Среда, 19 Январь, 2011 00:27 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Валерий Лаптев писал(а):
А сейчас как это моделируется?


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

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

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


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

Автор:  alexus [ Среда, 19 Январь, 2011 06:02 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Что мешает сделать этапы логическими функциями? Тогда было бы просто...
Код:
IF <этап0> AND <этап1> AND <этап3> ... THEN....

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

Автор:  Александр Ильин [ Среда, 19 Январь, 2011 06:56 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Можно ANDIF по аналогии с ELSIF.

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

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

Автор:  Peter Almazov [ Среда, 19 Январь, 2011 08:37 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Илья Ермаков писал(а):
Сейчас, если не громоздить вложенные IF-ы, обычно делаем:
Вот так и дальше делайте.

Автор:  albobin [ Среда, 19 Январь, 2011 08:38 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

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

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

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

Автор:  Geniepro [ Среда, 19 Январь, 2011 08:55 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

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

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

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

Автор:  Geniepro [ Среда, 19 Январь, 2011 08:56 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Peter Almazov писал(а):
Илья Ермаков писал(а):
Сейчас, если не громоздить вложенные IF-ы, обычно делаем:
Вот так и дальше делайте.

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

Автор:  Евгений Темиргалеев [ Среда, 19 Январь, 2011 09:29 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Илья Ермаков писал(а):
После написания очередного кода взаимодействия с окружением, с кучей проверок - полуночная мыслишка о конструкции:
"Утро вечера мудренее". Стоит исчо подумать.

Автор:  Сергей Губанов [ Среда, 19 Январь, 2011 12:07 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Просто используйте вложенные IF и нечего огород городить.

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

Автор:  Александр Ильин [ Среда, 19 Январь, 2011 13:05 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Сергей Губанов писал(а):
Кстати, большинство вложенных 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, но это редко стоит выигранного отступа.

Автор:  bohdant [ Среда, 19 Январь, 2011 14:15 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Илья, а почему не сделать просто:
Код:
PROCEDURE ПервыйЭтап(VAR step:LONGINT):BOOLEAN;
BEGIN
 INC(step)
END ПервыйЭтап;

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

Автор:  Евгений Темиргалеев [ Среда, 19 Январь, 2011 14:25 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

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

Автор:  Alexey Veselovsky [ Среда, 19 Январь, 2011 16:56 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Илья Ермаков писал(а):
После написания очередного кода взаимодействия с окружением, с кучей проверок - полуночная мыслишка о конструкции:

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

Автор:  Geniepro [ Среда, 19 Январь, 2011 18:41 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

albobin писал(а):
2. Каждый этап оформлен как функция, возвращающая успешность выполнения. Тогда получается что-то вроде (сама идея) :
IF not этап1
ELSEIF not этап2
...
ELSEIF not этапN
ELSE итоговые

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

Автор:  alexus [ Среда, 19 Январь, 2011 20:19 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

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

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

Автор:  Илья Ермаков [ Среда, 19 Январь, 2011 20:42 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

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


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

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

Автор:  albobin [ Среда, 19 Январь, 2011 20:55 ]
Заголовок сообщения:  Re: Конструкция AND THEN?

Чем не очень нравится конструкция с AND THEN, так тем (по мимо всего прочего), что она не эквивалентна последовательности IFов:
IF лог.выражение1 THEN действие 1 END
IF лог.выражение1 AND лог.выражение2 THEN действие 2 END
и т.д.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/