Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Что такое "Инвариант цикла" ? / 23 сообщений из 23, страница 1 из 1
24.07.2018, 03:53
    #39678000
vi0
vi0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
Добрый день
Помогите простыми словами или же более менее формально, структурировано определить понятие инварианта цикла.
Потребность в этом возникла при прорешивании упражнений из "Алгоритмы. Построение и анализ" Т.Кормена.
Не могу уловить, что именно от меня требуется при задании "сформулируйте инвариант".

В основном, все источники говорят о том, что это логическое выражение, хотя если взять книгу того же Кормена, но попроще "Вводный курс", то у него все сводится к логическим рассуждениям - привожу скриншот. Он так упростил это понятие, что заменил "выражение" на "утверждение", или же термин "утверждение" тоже подходит?
Есть ли источники с понятными формулировками и примерами.
...
Рейтинг: 0 / 0
24.07.2018, 03:53
    #39678001
vi0
vi0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
vi0,
...
Рейтинг: 0 / 0
24.07.2018, 03:54
    #39678002
vi0
vi0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
vi0,
...
Рейтинг: 0 / 0
24.07.2018, 06:59
    #39678019
MBo
MBo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
vi0,

Это набор из трёх правил. Они необходимы (но не достаточны) для определения правильности логики алгоритма.

Такой формальный подход порой позволяет выловить логическую ошибку, когда "на глазок" кажется, что всё правильно.

Попробуй сформулировать эти правила для какой-либо из простых сортировок - выбором или вставками.
Для них это дело смотрится логичнее.
...
Рейтинг: 0 / 0
24.07.2018, 09:02
    #39678052
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
vi0,

если на пальцах, то это адаптация программистами для своих целей метода математической индукции )
...
Рейтинг: 0 / 0
24.07.2018, 22:35
    #39678607
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
vi0, пример инварианта - проверка выхода за границы массива. В некоторых ЯП и runtime этот ивариант - встроен.

Еще пример. На некоторых собесах задают задачу - проверить корректность вложенных скобок.

Пример корректных
Код: sql
1.
(((( () () ))))



Пример некорректных
Код: sql
1.
())



Можно тут взять следующий ивариант. Если скобка открылась - то считаем +1 к некой переменной.
Если закрылась - то считаем -1. Если в теле цикла мы вышли ниже нуля - то ошибка вложенных скобок.

Ивариантом в нашем случае является НЕ-ОТРИЦАТЕЛЬНОСТЬ счетчика скобок.

+В конце можно проверить на ноль. Но это уже пост-вариант.

Инварианты очень леко толкать в математике. Берете просто любую формулу и как только видите
квадратный корень - то сразу говорите что под корнем - не отрицательное. Это инвариант.

Ну и модульные тесты и еще раз тесты. Утверждения (asserts). Контракты.
...
Рейтинг: 0 / 0
24.07.2018, 22:59
    #39678619
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
maytonМожно тут взять следующий ивариант. Если скобка открылась - то считаем +1 к некой переменной.
Если закрылась - то считаем -1. Если в теле цикла мы вышли ниже нуля - то ошибка вложенных скобок.

Ивариантом в нашем случае является НЕ-ОТРИЦАТЕЛЬНОСТЬ счетчика скобок.

+В конце можно проверить на ноль. Но это уже пост-вариант.vi0, пример инварианта - проверка выхода за границы массива. В некоторых ЯП и runtime этот ивариант - встроен.

Еще пример. На некоторых собесах задают задачу - проверить корректность вложенных скобок.

Пример корректных
Код: sql
1.
(((( () () ))))



Пример некорректных
Код: sql
1.
())





Инварианты очень леко толкать в математике. Берете просто любую формулу и как только видите
квадратный корень - то сразу говорите что под корнем - не отрицательное. Это инвариант.

Ну и модульные тесты и еще раз тесты. Утверждения (asserts). Контракты.

Это неверный ответ.

Инварианты в программировании используются для формального доказательства корректности алгоритмов.

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

В примере со скобками инвариант цикла - это текущая накопленная сумма, плюс алгебраическая сумма оставшихся скобок.
...
Рейтинг: 0 / 0
24.07.2018, 23:05
    #39678621
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
Aleksandr SharahovВ общем случае инвариантом называется выражение, которое всегда принимает одинаковое значение в некоторых "контрольных" точках алгоритма (например, на входе в цикл, в начале каждой итерации и на выходе).

В примере со скобками инвариант цикла - это текущая накопленная сумма, плюс алгебраическая сумма оставшихся скобок.
А контрольная точка по вашему где должна стоять? В теле цикла может?
...
Рейтинг: 0 / 0
24.07.2018, 23:14
    #39678623
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
maytonAleksandr SharahovВ общем случае инвариантом называется выражение, которое всегда принимает одинаковое значение в некоторых "контрольных" точках алгоритма (например, на входе в цикл, в начале каждой итерации и на выходе).

В примере со скобками инвариант цикла - это текущая накопленная сумма, плюс алгебраическая сумма оставшихся скобок.
А контрольная точка по вашему где должна стоять? В теле цикла может?

Да. Контрольные точки доказывающий расставляет по своему усмотрению, как ему удобно.
Цикла вообще может не быть, а например лапша из goto.
...
Рейтинг: 0 / 0
24.07.2018, 23:15
    #39678624
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
Aleksandr Sharahovmaytonпропущено...

А контрольная точка по вашему где должна стоять? В теле цикла может?

Да. Контрольные точки доказывающий расставляет по своему усмотрению, как ему удобно.
Цикла вообще может не быть, а например лапша из goto.
Но в таком случае почему сумма скобок - не инвариант?
...
Рейтинг: 0 / 0
24.07.2018, 23:32
    #39678627
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
maytonAleksandr Sharahovпропущено...


Да. Контрольные точки доказывающий расставляет по своему усмотрению, как ему удобно.
Цикла вообще может не быть, а например лапша из goto.
Но в таком случае почему сумма скобок - не инвариант?

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

Она не является инвариантом потому, что мы хотим доказать, что в результате работы цикла
(если только он не был прерван досрочно получением отрицательно промежуточной суммы)
действительно будет получено количество незакрытых скобок.
И если я выберу инвариантом свое выражение, то, очевидно, я легко докажу требуемое.
...
Рейтинг: 0 / 0
24.07.2018, 23:59
    #39678629
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
Aleksandr Sharahov, ну а проверка границ массива?
...
Рейтинг: 0 / 0
25.07.2018, 00:06
    #39678630
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
maytonAleksandr Sharahov, ну а проверка границ массива?

Я не совсем понимаю о чем речь, поясните:
1. какой именно алгоритм рассматривается,
2. что необходимо доказать,
3. что предлагается в качестве инварианта,
4. в каких контрольных точках.
...
Рейтинг: 0 / 0
25.07.2018, 00:54
    #39678641
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
Aleksandr Sharahov...
Это неверный ответ.

Инварианты в программировании используются для формального доказательства корректности алгоритмов.

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

Это - очевидно, да, так и есть. +1

Aleksandr SharahovВ примере со скобками инвариант цикла - это текущая накопленная сумма, плюс алгебраическая сумма оставшихся скобок.

Это не понятно, и не ясно, как именно пригодно в качестве инструмента.

Существо доказательства правильности программы в том и состоит, чтобы уверить себя в правильном счете скобок программой.

Она не задваивает учет скобок, например, и/или не пропускает их.

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

инвариантом б) здесь у цикла может быть то, индекс элемента массива на текущем шаге всегда больше значения на предыдущем шаге.

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

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

Касательно границ массива - существо дела в том, что
если компилятор способен понять, что цикл поддерживает инвариант,
состоящий в том, что текущий индекс в цикле на каждом его шаге
не выходит за границы массива, то, в принципе, он способен отключить
для тела цикла проверку на границы массива.
(конечно, если вообще обучен такому умению).
...
Рейтинг: 0 / 0
25.07.2018, 01:23
    #39678647
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
boobyAleksandr SharahovВ примере со скобками инвариант цикла - это текущая накопленная сумма, плюс алгебраическая сумма оставшихся скобок.
Это не понятно, и не ясно, как именно пригодно в качестве инструмента.


На мой взгляд, наоборот доказательство прозрачно.

(Случай с отрицательной промежуточной суммой не рассматриваем - там все очевидно.)

1. Первоначально все скобки лежат в массиве, накоплено 0.

2. На первом и каждом следующем шаге мы одну очередную скобу перекладываем в сумку.
Очевидно, при этом общее их количество (сумка+массив) не изменилось.

3. Цикл обязательно завершится, т.к. число элементов конечно и мы каждый раз переходим к непосредственно к следующему.
В конце цикла все скобки будут переложены в сумку, значит, мы посчитали количество незакрытых скобок в исходном массиве.
...
Рейтинг: 0 / 0
26.07.2018, 00:20
    #39679330
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
Aleksandr Sharahovvi0,

если на пальцах, то это адаптация программистами для своих целей метода математической индукции )
причем без адаптации матиндукция выглядит куда понятнее.
...
Рейтинг: 0 / 0
26.07.2018, 01:31
    #39679340
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
tchingizAleksandr Sharahovvi0,

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

Для доказательства всегда пригодны оба метода, они полностью эквиваленты.

Когда утверждение индукции легко формулируется для промежуточных состояний (как в задаче со скобками), то, разумеется, проще воспользоваться индукцией. Когда формулировка получается тяжеловесной или касается чего-то, что не может существовать в реальной жизни (например, полтора землекопа), то лучше подходит метод инварианта. Мы просто говорим, что вот эта величина всегда равна константе, не вдаваясь в ее физический смысл на различных шагах алгоритма.
...
Рейтинг: 0 / 0
26.07.2018, 01:40
    #39679343
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
Упустил еще один важный момент - простота внесения изменений.
Проверить неизменность инварианта после внесения изменений довольно просто.
...
Рейтинг: 0 / 0
28.07.2018, 09:59
    #39680501
vi0
vi0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
Спасибо
...
Рейтинг: 0 / 0
29.07.2018, 09:54
    #39680655
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
Вот простыми словами, а вот более формально, структурировано, но с понятными примерами.
...
Рейтинг: 0 / 0
30.07.2018, 23:05
    #39681325
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
vi0Добрый день
Помогите простыми словами или же более менее формально, структурировано определить понятие инварианта цикла.
Потребность в этом возникла при прорешивании упражнений из "Алгоритмы. Построение и анализ" Т.Кормена.
Не могу уловить, что именно от меня требуется при задании "сформулируйте инвариант".

В основном, все источники говорят о том, что это логическое выражение, хотя если взять книгу того же Кормена, но попроще "Вводный курс", то у него все сводится к логическим рассуждениям - привожу скриншот. Он так упростил это понятие, что заменил "выражение" на "утверждение", или же термин "утверждение" тоже подходит?
Есть ли источники с понятными формулировками и примерами.

Здесь все довольно просто. Инвариант - это "что-то" постоянное. И он может быть не только для цикла, но и для дерева, например, или любого другого процесса. Нередко используется для обозначения чего-то постоянного в нестационарных процессах, т.е. с течением времени инвариант сохраняется. Простейший пример, скорость света в одинаковой среде. Или в математике, вы переходите из одного множестве в другое, посредством взаимно-однозначного соответствия, мощность в данном случае будет инвариантом для любого оператора перехода.
Что касается доказательства корректности тех или иных конструкций, то совместно применяют такие понятия как инваринт и варианта. Инвариант должен сохраняться на каждой итерации, что свидетельствует о корректности алгоритма на различных наборах входных данных, варианта должна уменьшаться, что необходимо для сходимости
...
Рейтинг: 0 / 0
31.07.2018, 04:57
    #39681359
vi0
vi0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
LR,
интересная формулировка "A loop invariant is a relation among program variables"
ближе к неокрепшим мозгам чем "инвариант это утверждение"
...
Рейтинг: 0 / 0
31.07.2018, 09:44
    #39681411
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что такое "Инвариант цикла" ?
vi0LR,
интересная формулировка "A loop invariant is a relation among program variables"
ближе к неокрепшим мозгам чем "инвариант это утверждение"

Уверен, тут отношение трактуется расширительно и вовсе не подразумевается одна формула.

Существуют классы задач (например, сортировки или оптимизационные и т.п.),
которые оперируют с некоторым обобщенным состоянием процесса
и где упрощенное толкование затруднительно.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Что такое "Инвариант цикла" ? / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]