Парадигмы программирования
Программирование по контракту
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; }