====== MI-FME Formalni metody a specifikace ====== * http://cs.cas.cz/~ratschan * stefan.ratschan at cs.cas.cz * FIT 319 ==== Ekvivalence ==== * A ∧ T ⇔ A * A ∧ F ⇔ F * A ∨ T ⇔ T * A ∨ F ⇔ A * A ∧ B ⇔ B ∧ A * A ∨ B ⇔ B ∨ A * A ∧ (B ∨ C) ⇔ (A ∧ B) ∨ (A ∧ C) * A ∨ (B ∧ C) ⇔ (A ∨ B) ∧ (A ∨ C) * ¬¬ A ⇔ A * ¬ (A ∧ B) ⇔ ¬ A ∨ ¬ B * ¬ (A ∨ B) ⇔ ¬ A ∧ ¬ B * (A ⇔ B) ⇔ (A ⇒ B ∧ B ⇒ A) * (A ⇒ B) ⇔ (¬ B ⇐ ¬ A) * (A ⇔ B) ⇔ (¬ B ⇔ ¬ A) * ∃ x. ∃ y.A ⇔ ∃ y. ∃ x.A * ∀ x. ∀ y.A ⇔ ∀ y. ∀ x.A * ¬∀ x.A je ⇔ ∃ x. ¬ A * ¬∃ x.A je ⇔ ∀ x. ¬ A * ∀ x . A ∧ B ⇔ [ ∀ x.A] ∧ [ ∀ x.B] * ∃ x . A ∨ B ⇔ [ ∃ x.A] ∨ [ ∃ x.B] * ∀ x . A ∨ B ⇔ [ ∀ x.A] ∨ B pokud B neobsahuje x * ∃ x . A ∧ B ⇔ [ ∃ x.A] ∧ B pokud B neobsahuje x == Pravidla ekvivalence: == * A je ekvivalentní A * Pokud A je ekvivalentní B pak B je ekvivalentní A * Pokud A je ekvivalentní B, a B je ekvivalentní C pak A je ekvivalentní C === Implikace, ekvivalence === * A ⇒ B je zkratka pro ¬ A ∨ B * A ⇔ B je zkratka pro A ⇒ B ∧ B ⇒ A **Z toho plyne:** * A ⇒ B je ekvivalentni ¬ B ⇐ ¬ A * A ⇔ B je ekvivalentni ¬ B ⇔ ¬ A
==== Důkazní pravidla ==== === Jak zjednodušovat to, co chceme dokázat? === * A ∧ B: Nejdřív dokážeme A, pak B * A ∨ B: Předpokládáme ¬ A a dokážeme B * A ⇒ B: Předpokládáme A a dokážeme B. * ¬ A: Předpokládáme A a zkusíme najít rozpor. Rozpor: Situace kdy pro určité P, P i ¬ P jsou známé skutečnosti. === Jak produkovat nové známé věci? === * A ∧ B: Usoudíme i A i B * A ∨ B: Píšeme nejdřív ”Případ A :”, předpokládáme A a dokončíme důkaz. Pak píšeme ”Případ B :”, předpokládáme B, a dokončíme důkaz. * A ⇒ B: Pokud známe A pak usoudíme B * ¬ A: Pokud už hledáme spor, pak místo ¬A dokazujeme A. === Jak zjednodušovat to, co chceme dokázat? === * ∃ x . A: Vybereme (intuicí, kreativitou) term t, a dokážeme A[x ← t] * ∀ x . A: Vybereme novou konstantu a, píšeme ”Nechť a je libovolné ale pevné” a dokážeme A[x ← a] * A ∧ B: Nejdřív dokážeme A, pak B * A ∨ B: Předpokládáme ¬ A a dokážeme B * A ⇒ B: Předpokládáme A a dokážeme B. * ¬ A: Předpokládáme A a zkusíme najít rozpor === Jak produkovat nové známé věci? === * ∃ x . A: Vybereme novou konstantu a, píšeme ”necht’ a je tak, že A[x ← a]”, a přiřadíme A[x ← a] do našeho seznamu známých skutečností. * ∀ x . A: Vybereme (intuicí, kreativitou) term t a usoudíme A[x ← t] * A ∧ B: Usoudíme A i B * A ∨ B: Píšeme nejdřív ”Případ A :”, předpokládáme A a dokončíme důkaz. Pak píšeme ”Případ B :”, předpokládáme B, a dokončíme důkaz. * A ⇒ B: Pokud známe A pak usoudíme B * ¬ A: Pokud už hledáme spor, pak místo ¬A dokazujeme A.
==== Správnost algoritmu ==== ∀x ∀x' . [I (x) ∧ x' = f (x)] ⇒ O(x, x') ==== Axiomatizace seznamů ==== === Funkční symboly === * cons : T × L → L * first : L → T * rest : L → L * empty : → L === Axiomy (l ∈ L , x ∈ T ): === * ∀ l, x . first(cons(x, l)) = x * ∀ l, x . rest(cons(x, l)) = l * ∀ l, x . l ≠ empty() ⇒ cons(first(l), rest(l)) = l * ∀ l, x . cons(x, l) ≠ empty() * Chování first(empty()), rest(empty()) není specifikováno. ==== Axiomatizace polí ==== === Funkční symboly: === * · [·] : A n × { 1, . . . , n } → T * write : A n × { 1, . . . , n } × T → A n === Axiomy (a, b ∈ A n, v ∈ T , i, j ∈ { 1, . . . , n } ): === * ∀ a, v, i, j . i = j ⇒ write(a, i, v)[j] = v * ∀ a, v, i, j . i ≠ j ⇒ write(a, i, v)[j] = a[j] * ∀ a, b . [ ∀ i . a[i] = b[i]] ⇔ a = b ==== Axiomatizace přirozených čísel ==== === Funkční symboly: === * 0 : → N * 1 : → N * + : N × N → N * · : N × N → N === Axiomy (Peanova aritmetika) === * ∀ x . x + 1 ≠ 0 * ∀ x, y . x + 1 = y + 1 ⇒ x = y * ∀ x . x + 0 = x * ∀ x, y . x + (y + 1) = (x + y) + 1 * ∀ x . x0 = 0 * ∀ x, y x(y + 1) = xy + x == Indukce == Pro každou formuli F s přesně jednou volnou proměnnou x, další axiom * [ F[x ← 0] ∧ [∀ x . F ⇒ F [x ← x + 1] ] ] ⇒ ∀ x . F
==== Aserce ====
=== goto l ===
* αi ⇒ αl
=== input v ===
* αi ⇒ αi+1[v ← v0]
=== if P then ===
* [[αi ∧ P] ⇒ αi+1] ∧ [[αi ∧ ¬ P] ⇒ αl ]
=== v ← t ===
@ α
v1 ← t1; . . . ; vn ← tn
@ α'
* α ⇒ α'[vn ← tn] . . . [v1 ← t1]
**!!Pozor na posloupnost přiřazení!!**
=== while ===
@ α
while P do
@β
. . .
@β'
@ α'
* [α ∧ P] ⇒ β
* [α ∧ ¬ P] ⇒ α'
* [β' ∧ P] ⇒ β
* [β' ∧ ¬ P] ⇒ α'
=== for ===
@ α
for i ← l to u
@β
. . .
@β'
@ α'
* [α ∧ l ≤ u] ⇒ β[i ← l]
* [α ∧ l > u] ⇒ α'
* [β' ∧ i < u] ⇒ β[i ← i + 1]
* β'[i ← u] ⇒ α'