Автор Тема: Инварианты к двум циклам  (Прочитано 35831 раз)

DIzer

  • Гость
Re: Инварианты к двум циклам
« Ответ #45 : Сентябрь 28, 2012, 06:31:38 am »
Теперь по поводу инвариантов от Dizer. Я не зря спросил про множество всех истинных утверждений, все они будут инвариантами цикла.
...
Поэтому толку от инвариантов типа "Волга впадает в Каспийское море" будет маловато.
Инвариант цикла должен подсказывать логику работы цикла.
Утверждения вроде "2*2=4" или "Волга впадает в Каспийское море" никак не подсказывают нам свойств цикла, а значит и не являются инвариантами цикла.
Да, эти утверждения являются инвариантами, но не цикла...
:) Никто никому не должен - есть четкое определение инварианта (по которому можно определить является ли  ПРОИЗВОЛЬНОЕ логическое  выражение оным), есть примеры  примененя методы- в основной  своей массе  на таких циклах где формулировка инвариантов скорее в тягость, есть ОСТОРОЖНЫЕ высказывания МЭТРОВ (Дейкстры, Грисома) по данной методе- а есть танцульки вокруг "идола" в коровне , в основе которой манипуляция с естественным желанием человека получить все с наименьшими затратами, ну  :D. и есть Петр Алмазов...

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #46 : Сентябрь 28, 2012, 06:48:21 am »
Вариант от info21 (псевдоцикл Дейкстры)i := 0;
oneZero := FALSE; (*oneZero = перед i стоит нуль*)
WHILE (i < LEN(a)) & ~oneZero DO
    oneZero := a[i] = 0;
    INC(i);
ELSIF (i < LEN(a)) & (a[i] # 0) DO
    oneZero := FALSE;
    INC(i);
END;
плох тем, что оставляет неверное представление о настоящем цикле Дейкстры.

Вообще я попробовал сделать этот алгоритм в виде цикла Дейкстры, но что-то сомневаюсь, что из этого выйдет что-то путное -- ну не подходит этот алгоритм для ЦД. Вот что реально из себя представляет алгоритм, представленный info21:
i     := 0;
found := FALSE; (* found = (a[i-1] = 0) & (a[i] = 0) *)
WHILE (i < LEN(a)) & ~found DO
   WHILE (i < LEN(a)) & a[i] # 0 DO   INC(i) END;
   IF    (i < LEN(a)) & a[i] # 0 THEN INC(i)
   ELSE                               found := TRUE
   END;
END;
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #47 : Сентябрь 28, 2012, 07:03:19 am »
Вот что реально из себя представляет алгоритм, представленный info21:
i     := 0;
found := FALSE; (* found = (a[i-1] = 0) & (a[i] = 0) *)
WHILE (i < LEN(a)) & ~found DO
   WHILE (i < LEN(a)) & a[i] # 0 DO   INC(i) END;
   IF    (i < LEN(a)) & a[i] # 0 THEN INC(i)
   ELSE                               found := TRUE
   END;
END;

Да ну?
WHILE (i < LEN(a)) & (~oneZero OR a[i] # 0)   DO   oneZero := a[i] = 0; INC(i) END;

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #48 : Сентябрь 28, 2012, 07:05:26 am »
Вот что реально из себя представляет алгоритм, представленный info21:
Таки ошибся, вот правильный вариант:
i     := 0;
found := FALSE; (* found = (a[i-1] = 0) & (a[i] = 0) *)
WHILE (i < LEN(a)) & ~found DO
    WHILE (i < LEN(a)) & a[i] # 0 DO INC(i) END;
    INC(i);
    IF (i < LEN(a)) THEN
        IF a[i] = 0 THEN found := TRUE
        ELSE             INC(i)
        END
    END
END;
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #49 : Сентябрь 28, 2012, 07:10:42 am »
Да ну?
WHILE (i < LEN(a)) & (~oneZero OR a[i] # 0)   DO   oneZero := a[i] = 0; INC(i) END;

Ваш вариант по сути аналогичен этому:
WHILE (i < LEN(a)-1) & (a[i] # 0 OR a[i+1] # 0) DO INC(i) END;
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #50 : Сентябрь 28, 2012, 07:12:19 am »
Да ну?
WHILE (i < LEN(a)) & (~oneZero OR a[i] # 0)   DO   oneZero := a[i] = 0; INC(i) END;

Ваш вариант по сути аналогичен этому:
WHILE (i < LEN(a)-1) & (a[i] # 0 OR a[i+1] # 0) DO INC(i) END;
Это не мой вариант - это суть варианта от info21

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #51 : Сентябрь 28, 2012, 07:30:46 am »
Это не мой вариант - это суть варианта от info21
Логически да, но вычислительная сложность всё-таки разная.
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #52 : Сентябрь 28, 2012, 07:36:34 am »
А можно объяснить такой ниграмытной быдле как я, какой собственно профит от этих "формальных" методов в императивных языках общего назначения?
Вот здесь http://oberspace.dyndns.org/index.php/topic,261.msg6309.html#msg6309 я уже предлагал всем желающим сделать 2 упражнения.

Отношение к ним может быть разное.

Некто может сказать:
"Что за херня? Я не могу уверенно, быстро и без ошибок написать цикл длиной порядка 10 строк, при том, что общая идея мне ясна. Не мудак ли я?
Хочу перезжать подобные задачи как трактор."

Другой может сказать:
"Все это – х@$#я"
"Программист с такими циклами не встретится" (c) И.Е.Ермаков
"Я посмотрю в справочнике"
"Я использую библиотечную сортировку"
"Я покрою все тестами"
и т. п.

Тут уж каждый сам выбирает :)

DIzer

  • Гость
Re: Инварианты к двум циклам
« Ответ #53 : Сентябрь 28, 2012, 07:42:52 am »
А можно объяснить такой ниграмытной быдле как я, какой собственно профит от этих "формальных" методов в императивных языках общего назначения?
Вот здесь http://oberspace.dyndns.org/index.php/topic,261.msg6309.html#msg6309 я уже предлагал всем желающим сделать 2 упражнения.

Отношение к ним может быть разное.

Некто может сказать:
"Что за херня? Я не могу уверенно, быстро и без ошибок написать цикл длиной порядка 10 строк, при том, что общая идея мне ясна. Не мудак ли я?
Хочу перезжать подобные задачи как трактор."

Другой может сказать:
"Все это – х@$#я"
"Программист с такими циклами не встретится" (c) И.Е.Ермаков
"Я посмотрю в справочнике"
"Я использую библиотечную сортировку"
"Я покрою все тестами"
и т. п.

Тут уж каждый сам выбирает :)
может ... может да , может нет.... может быть, может не быть... а где ответ то на вопрос==частное мнение "познавшего дзен" ?  :D ;)

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #54 : Сентябрь 28, 2012, 07:47:29 am »
Это не мой вариант - это суть варианта от info21
Логически да, но вычислительная сложность всё-таки разная.

То есть Ваш вариант того,
что реально из себя представляет алгоритм, представленный info21:
i     := 0;
found := FALSE; (* found = (a[i-1] = 0) & (a[i] = 0) *)
WHILE (i < LEN(a)) & ~found DO
    WHILE (i < LEN(a)) & a[i] # 0 DO INC(i) END;
    INC(i);
    IF (i < LEN(a)) THEN
        IF a[i] = 0 THEN found := TRUE
        ELSE             INC(i)
        END
    END
END;
остаётся в силе ? :)




Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #55 : Сентябрь 28, 2012, 08:07:52 am »
То есть Ваш вариант того,
что реально из себя представляет алгоритм, представленный info21:
...
остаётся в силе ? :)
Думаю, да. Хотя он и выглядит страшно без синтаксического сахара, использованного info21, но и логически, и по выч. сложности он аналогичен варианту info21...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #56 : Сентябрь 28, 2012, 08:13:54 am »
Тревожно как-то от таких аналогий  :-[

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #57 : Сентябрь 28, 2012, 09:50:57 am »
Тревожно как-то от таких аналогий  :-[

В Обероне-07 операторWHILE cond1 DO s1
ELSIF cond2 DO s2
ELSIF cond3 DO s3
...
ELSIF condN DO sN
END
эквивалентен конструкцииLOOP
    WHILE cond1 DO   s1 END;
    IF    cond2 THEN s2
    ELSIF cond3 THEN s3
    ...
    ELSIF condN THEN sN
    ELSE  EXIT
    END
END

Берём алгоритм info21i := 0;
oneZero := FALSE;
WHILE (i < LEN(a)) & ~oneZero DO
    oneZero := a[i] = 0;
    INC(i)
ELSIF (i < LEN(a)) & (a[i] # 0) DO
    oneZero := FALSE;
    INC(i)
END;
и преобразуем его по этой схеме в:i := 0;
oneZero := FALSE;
LOOP
    WHILE (i < LEN(a)) & ~oneZero DO
        oneZero := a[i] = 0;
        INC(i)
    END;
    IF (i < LEN(a)) & (a[i] # 0) THEN
        oneZero := FALSE;
        INC(i)
    ELSE
        EXIT
    END
END
Далее избавляемся от выхода из середины:i := 0;
oneZero := FALSE;
b := TRUE;
WHILE b
    WHILE (i < LEN(a)) & ~oneZero DO
        oneZero := a[i] = 0;
        INC(i)
    END;
    IF (i < LEN(a)) & (a[i] # 0) THEN
        oneZero := FALSE;
        INC(i)
    ELSE
        b := FALSE
    END
END
избавляемся от лишнего флажка oneZero:i := 0;
not_found := TRUE;
WHILE (i < LEN(a)) & not_found
    WHILE (i < LEN(a)) & (a[i] # 0) DO
        INC(i)
    END;
    INC(i);
    IF (i < LEN(a)) THEN
        IF a[i] # 0 THEN
            INC(i)
        ELSE
            not_found := FALSE
        END
    END
END
Выбирайте, какой Вам больше по душе...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Инварианты к двум циклам
« Ответ #58 : Сентябрь 28, 2012, 10:13:32 am »
Тревожно как-то от таких аналогий  :-[

В Обероне-07 операторWHILE cond1 DO s1
ELSIF cond2 DO s2
ELSIF cond3 DO s3
...
ELSIF condN DO sN
END
эквивалентен конструкцииLOOP
    WHILE cond1 DO   s1 END;
    IF    cond2 THEN s2
    ELSIF cond3 THEN s3
    ...
    ELSIF condN THEN sN
    ELSE  EXIT
    END
END

Не понял... почему такой?

Зачем там while?
LOOP
    IF    cond1 THEN s1
    ELSIF cond2 THEN s2
    ELSIF cond3 THEN s3
    ...
    ELSIF condN THEN sN
    ELSE  EXIT
    END
END

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Инварианты к двум циклам
« Ответ #59 : Сентябрь 28, 2012, 10:26:02 am »
Не понял... почему такой?
Зачем там while?
Это простейшая оптимизация.
Пока условие cond1 истинно, выполняться в цикле будет s1.
С другими охранными выражениями такой оптимизации сделать не получится...

Я имею в виду, что в такой вид этот псевдо-ЦД переводят компиляторы сей и компилятор Оберона-07М от Рифата...
« Последнее редактирование: Сентябрь 28, 2012, 10:28:34 am от Geniepro »
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…