Чому важливі інваріанти в інформатиці


16

Я розумію «інваріант» у прямому сенсі. Я також розпізнаю їх під час введення коду. Але я не думаю, що я розумію важливість цього терміна в контексті інформатики.

Щоразу, коли я читаю бесіди \ довідки про дизайн мови від відомих програмістів \ комп'ютерних працівників, термін "інваріант" постійно з'являється як жаргон; і це частина, яку я не розумію. Що в цьому такого особливого?


Я багато використовую твердження ... не стільки для того, щоб гарантувати правильність, як зменшити ймовірність помилок.
робота

Відповіді:


7

Алгоритм - це повторюваний процес. Якщо він повторюється, він повинен мати атрибути, які не змінюються при повторенні. Це ваші інваріанти. Інваріанти поєднуються з та / або працюють на (потенційно) різних даних, які будуть передані у ваш алгоритм.

Таким чином, вся суть програмування полягає у визначенні того, що не змінюється, - це по суті ваша програма.

У об'єктно-орієнтованій програмі існує поняття, що кожен об’єкт повинен добре робити одну річ. Це по суті означає, що (для OOP на основі класу) клас визначає інваріанти для одного алгоритму, а також заповнювачі місць (змінних) для будь-яких варіантів даних, які можуть знадобитися його об'єктам. В ідеалі в OO ви виділите те, що змінюється наскільки це можливо, так що кожен об'єкт здебільшого інваріантний.


27

Поняття інваріанта тісно пов'язане з "побічними ефектами". Я вважаю, що це сприяло підходу Бертрана Мейєра "Дизайн за контрактом (DbC)" для розробки програмного забезпечення.

DbC збагачує абстрактні типи даних (основу класів) трьома важливими поняттями, передумовами, пост-умовами , інваріантами . Це легко пояснюється при посиланні на процедури, тому я спробую пояснити посиланням на нього:

  1. Попередня умова являє собою вхідні дані умови для процедури, яка повинна дотримуватися, щоб викликати цю процедуру. Клієнт цієї конкретної процедури повинен дотримуватися та виконувати цю умову. Проте дизайнер процедури може захищати від клієнтів, які не дотримуються передумови, стверджуючи цю умову як перші рядки в процедурі. Наприклад, наявність методу double divide(double dividend, double divisor)може бути передумовою divisor != 0.

  2. Постусловіем є умова на вихідних даних після того , як процедура повертається; цілком належним завданням дизайнера процедур є дотримання цієї повної умови за умови дотримання передумови; у стилі програмування оборони перед поверненням, постумова може бути затверджена.

  3. Інваріант можна розглядати як як передумову і послеусловіе, але з різним розумінням для передумови і постумови з вищевказаних понять. В основному інваріант говорить, що якщо вхід має певну умову, виконану до виклику процедури, то ця умова діє після виклику процедури. Наприклад, дійсний інваріант для процедури boolean search(int term, int array[])може сказати, що стан arrayперед викликом такий же, як і після виклику.

Захоплення інваріантів на процедурах (і не тільки процедурах) - чудова річ, оскільки вона зменшує побічні ефекти ; це корисно, оскільки побічні ефекти - це велике зло в програмуванні. Конкретна процедура може змінити стан вхідних аргументів, або змінити стан деяких глобальних змінних, або залежати від деяких глобальних змінних; це може призвести до неприємних ситуацій, коли два однакових виклику за тією ж процедурою (з однаковим входом) можуть дати різні результати. Це призводить до знання історії викликів і дуже важко налагоджувати, особливо в багатопотоковому контексті.


2

Інваріант - це логічна властивість, яка зберігається деякими операціями.

  • Вам потрібні інваріанти, щоб міркувати про петлі. Оскільки ви заздалегідь не знаєте, скільки ітерацій буде (або вам не знадобиться цикл), кожна ітерація повинна зберігати інваріант, щоб в кінці ви могли довести якусь корисну властивість щодо циклу.

  • Вам потрібні інваріанти для міркування про властивості інкапсульованих даних. Часто різні дані всередині модуля або об'єкта потребують задоволення певних властивостей для правильної роботи (наприклад, список, що представляє набір, завжди повинен бути відсортований). Ви хочете, щоб кожна функція чи метод, що працює над даними, зберігали ці властивості, тому вони також є інваріантами.


0

З того, що мені відомо, важливість інваріанта випливає з того, що саме це є складовим елементом для доказування того, що алгоритм обчислює певну функцію. Наприклад, ви розробили новий алгоритм сортування, але як ви можете бути впевнені, що він дійсно сортує з кожним входом або з кожним правильним результатом. Наступним кроком є ​​побудова інваріантів, які відповідають потоку алгоритму, і доведення, що він сортує за допомогою інваріантів.


0

У контексті системи типів мови програмування інваріантний тип - це неконвертований тип. Наприклад, у java при перевантаженні методу всі параметри є інваріантними, тоді як тип повернення є коваріантним (може бути однаковим або підтипом).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.