Парадигмы программирования
Программирование по контракту
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) {
    ...
}
// 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
// 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
// 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)
// Состояние
int value = 0;
 
// Pre: v ≥ 0
// Post: ℝ = value + v ∧ value' = value + v
int add(int v) {
    return value += v;
}
// Состояние
int value = 0;
 
// Pre: v ≥ 0 ∧ value ≥ 0
// Post: ℝ = value + v ∧ value' = value + v
int add(int v) {
    return value += v;
}
// Состояние
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; }