Парадигмы программирования

Программирование по контракту

Структура курса

Содержание

Структура

  • Лекции
  • Домашние задания
  • Практика
  • Зачет

Содержание

  • Концепции
    • Программирование по контракту
    • ООП
    • Обобщённое программирование
    • Функциональное программирование
    • Логическое программирование
  • Языки
    • Java
    • JavaScript
    • Clojure
    • Prolog
    • ???

Практика и баллы

  • Версии
    • Простая M3131−35
    • Сложная M3136−39
  • Модификации
  • Задержка
    • Не более 3 недель
  • Минусы
    • Не горят
  • Бонусы
    • Первому сдавшему
    • Нашедшим ошибки

Последовательный код

Содержание

Быстрое возведение в степень

  • int power(int a, int n) {
        int r = 1;
        while (n != 0) {
            if (n % 2 == 1) {
                r *= a;
            }
            n /= 2;
            a *= a;
        }
        return r;
    }
    

Формализация

Содержание

Пред- и постусловия

  • Определены на действиях
  • Предусловие
    • Должно быть выполнено до исполнения действия
  • Постусловие
    • Выполнено после исполнения действия

Условия для БВС

  • // Pre: n ≥ 0
    // Post: ℝ = a ^ n
    int power(int a, int n) {
        ...
    }
    

Теорема о структурировании

  • Бём и Якопини
  • Любой управляющий граф можно составить из
    • Последовательность
    • Ветвление
    • Цикл while

Оператор присванивания (1)

  • Определение
    • Обратная подстановка
    • // Pre: P[x→expr] (подставить expr вместо x)
      x = expr;
      // Post: P
      
  • Примеры
    • // Pre: b = 0
      a = b;
      // Post: a = 0
      
    • // Pre: a + a = b
      a += a;
      // Post: a = b
      

Оператор присванивания (2)

  • Неверные подходы
    • Прямая подстановка
      • // Pre: P
        x = expr;
        // Post: P[x→expr]
        
      • // Pre: x = 1
        x = 2;
        // Post: 2 = 1
        
    • Простая конъюнкция
      • // Pre: P
        x = expr;
        // Post: P ∧ x = expr
        
      • // Pre: x = 5
        x = x + 1;
        // Post: x = 5 ∧ x = x + 1
        

Последовательность действий

  • из
    • // Pre: P1
      S1
      // Post: Q1
      
    • // Pre: P2
      S2
      // Post: Q2
      
    • Q1 ⇒ P2
      
  • следует
    • // Pre: P1
      S1
      S2
      // Post: Q2
      

Ветвление

  • из
    • // Pre: P ∧ cond
      S1
      // Post: Q
      
    • // Pre: P ∧ ¬cond
      S2
      // Post: Q
      
  • следует
    • // Pre: P
      if (cond) S1 else S2
      // Post: Q
      

Цикл

  • Из
    • // Pre: P ∧ cond
      S
      // Post: P
      
  • следует
    • // Pre: P
      while (cond) S
      // Post: P ∧ ¬cond
      
  • Цикл может не завершиться
    • Доказательство завершения

Стратегии доказательств

  • Сверху-вниз
    • От посылок к следствиям
    • Предусловие + действие ⇒ постусловие
  • Снизу-вверх
    • От следствий к необходимым посылкам
    • Постусловие + действие ⇒ необходимое предусловие

Доказательство

Содержание

Быстрое возведение в степень

  • int power(int a, int n) {
        int r = 1;
        while (n != 0) {
            if (n % 2 == 1) {
                r *= a;
            }
            n /= 2;
            a *= a;
        }
        return r;
    }
    

Инвариант цикла

  • int power(int a, int n) {
        int r = 1;
        // r' * a'^n' = a^n
        while (n != 0) {
            ...
        }
        // r' * a'^n' = a^n ∧ n' = 0
        // ⇒ r' = a^n
        return r;
    }
    

Тело цикла

  • // I ∧ n' != 0
    if (n % 2 == 1) {
        // I ∧ n' % 2 = 1
        r *= a; n--;
        // I ∧ n' % 2 = 0
    } else {
        // I ∧ n' % 2 = 0
    }
    // I ∧ n' % 2 = 0
    n /= 2; a *= a;
    // I
    

Функции

Содержание

Чистые функции

Содержание

Чистая функция

  • Результат зависит только от аргументов
  • Не имеет побочных эффектов
  • Пример
    • Функция double sqrt(double x)

Предусловие

  • Условие, которое должно быть верно на момент вызова
    • Результат вызова с неверным предусловием не определен
  • Пример
    // Pre: x > 0
    double sqrt(double x)
    

Постусловие

  • Условие, которое верно на момент возврата
    • Постусловие не выполнено ⇒ ошибка в программе
  • Пример
    // Post: ℝ × ℝ = x ∧ ℝ ≥ 0
    double sqrt(double x)
    

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

  • Предусловие + постусловие
    // Pre: x > 0
    // Post: ℝ × ℝ = x ∧ ℝ ≥ 0
    double sqrt(double x)
    

Поиск максимума

  • // Pre: a.length > 0
    // Post: (∀ i=0..a.length-1: ℝ ≥ a[i]) ∧ 
    //          (∃ i=0..a.length-1: ℝ = a[i])
    int max(int[] a)
    

Функции с состояниями

Содержание

Сумма с аккумулированием (1)

  • Реализация
    // Состояние
    int value = 0;
     
    // Pre: v ≥ 0
    // Post: ℝ = value + v ∧ value' = value + v
    int add(int v) {
        return value += v;
    }
    

Сумма с аккумулированием (2)

  • Предусловие на неотрицательность value
    // Состояние
    int value = 0;
     
    // Pre: v ≥ 0 ∧ value ≥ 0
    // Post: ℝ = value + v ∧ value' = value + v
    int add(int v) {
        return value += v;
    }
    

Сумма с аккумулированием (3)

  • Постусловие на неотрицательность value
    // Состояние
    int value = 0;
     
    // Pre: v ≥ 0 ∧ value ≥ 0
    // Post: ℝ = value + v ∧ value' = value + v
    //      ∧ value ≥ 0
    int add(int v) {
        return value += v;
    }
    

Инвариант

  • Общая часть пред- и постусловия
    • Сохраняется всегда
  • Пример
    // Inv: value ≥ 0
    int value = 0;
     
    // Pre: v ≥ 0
    // Post: ℝ = value + v ∧ value' = value + v
    int add(int v) {
        return value += v;
    }
    

Контракт функции с состоянием

  • Инвариант + предусловие + постусловие
  • Пример
    // Inv: value ≥ 0
    int value = 0;
     
    // Pre: v ≥ 0
    // Post: ℝ = value + v ∧ value' = value + v
    int add(int v) {
        return value += v;
    }
    

Пример нескольких функций

  • int value;
     
    void init() { value = 0; }
     
    // Pre: Был вызван init()
    // Post: value' = value + 1
    void inc() { value++; }
     
    // Pre: Был вызван init()
    // Post: ℝ = value ∧ value' = value
    int get() { return value; }
    

Заключение

Содержание

Ссылки

Вопросы

???