tech talks @nsu: Автоматическое доказательство теорем
TRANSCRIPT
Автоматическое доказательство теорем
История, смежные области
Первые шаги
1954 г. Мартин Дэвис из Принстонского университета реализовал алгоритм для Арифметики Пресбургера: 1. ¬(0 = x + 1) 2. x + 1 = y + 1 → x = y 3. x + 0 = x 4. (x + y) + 1 = x + (y + 1) 5. (P(0) ∧ (P(x)→P(x + 1))) → P(y) «Было величайшим триумфом доказать чётность суммы чётных чисел»
Первые шаги
• 1956 г. The Logic Theory Machine
Удалось доказать 38 из 52 первых теорем Principia Mathematica
Изоморфизм Карри-Говарда
Построение конструктивного доказательства похоже на описание вычислений 1958
• Типы – высказывания
• Программы – доказательства
• Вычисление – упрощение
(P→Q→R)→(P→Q)→P→R
(P⇒(Q⇒R))⇒((P⇒Q)⇒(P⇒R))
Лямбда исчисление
(λf.λx.(f (f x)) (λz.z2) 3 [f/(λz.z2)] λx.(f (f x)) 3 λx.(λz.z2)((λz.z2) x) 3 [x/3] (λz.z2)((λz.z2) x) (λz.z2)((λz.z2) 3) (λz.z2)([z/3]z2) (λz.z2) 32 [z/32] z2 (32)2 Пример из лекций Дмитрия Сошникова
РЕФАЛ
Palindrom {
s.1 e.2 s.1 = <Palindrom e.2> ;
s.1 = True ;
= True;
e.1 = False ;
}
<Palindrom 'abcba'>
Prolog
• Факты
• parent (pam, bob).
• parent (tom, bob).
• parent (tom, liz).
• parent (bob, ann).
• parent (bob, pat).
• parent (mary, ann).
• parent (pat, juli).
Prolog
• Вопросы
• ? - parent (bob, pat).
• yes
• ?-parent (bob,mary).
• no
Верификация программного обеспечения
• Проверка типов
• Статический анализ
• Доказательство свойств
Подходы к улучшению качества
• Социальные – Код-ревью – Парное программирование
• Методологический – Паттерны – Тесты – Версии – Баг-треккеры
• Технологический – Lint
• Математический
Язык описания свойств
• Если не описаны свойства то программа всегда правильная
• Не любой язык удобно использовать в качестве языка описания свойств
(def sort-idempotent-prop
(prop/for-all [v (gen/vector gen/int)]
(= (sort v) (sort (sort v)))))
Eiffel
put (x: ELEMENT; key: STRING) is -- Insert x so that it will be retrievable through key. require count <= capacity not key.empty do ... Some insertion algorithm ... ensure has (x) item (key) = x count = old count + 1 end
Eiffel AutoTest проблемы
• Контракты очень редко описывают тестируемую систему. Например, постусловие должно описывать что процедура меняет и что не должна менять. Функция вывода на экран не должна увеличивать счётчиков, соединяться с базой данных и так далее
• Контракты не только не полны, но и содержат ошибки, допущенные разработчиками
Автоматическая генерация
• Предусловие должно быть выполнено, но сильные предусловия могут не быть достигнуты случайным генератором за разумное время
• Кроме того, генерируемые значения должны соответствовать критерию адекватности теста (обеспечивать покрытие и т. д.)
Eiffel autotest achieved
2005-2007 Начальный этап разработки системы
Например, было найдено следующее количество различных ошибок в основных библиотеках:
• STRING - 12
• BOUNDED_STACK - 11
• HASH_TABLE - 23
• ARRAYED_SET - 27
• LINKED_LIST - 25
От языка программирования к системе доказательств
• Как вместо того чтобы писать программы начать писать доказательства?
• Языки программирования с зависимыми типами (типы индексируемые значениями другого типа)
• Логические высказывания записываются как типы, а доказательствами являются программы соответствующего типа
• ФП + ЗТ => АДТ
Agda
data Nat : Set where
zero : Nat
suc : Nat -> Nat
_+_ : Nat -> Nat -> Nat
zero + m = m
suc n + m = suc (n + m)
Agda
data Vec (A : Set) : Nat -> Set where
[] : Vec A zero
_::_ : {n : Nat} -> A -> Vec A n -> Vec A (suc n)
head : {A : Set}{n : Nat} -> Vec A (suc n) -> A
head (x :: xs) = x
(пример из Википедии)
Coq Proof Assistant
Coq < Inductive even : nat -> Prop :=
Coq < | even_0 : even O
Coq < | even_SS : forall n:nat, even n -> even (S (S n)).
Coq
Coq < Fixpoint wrongplus (n m:nat) {struct n} : nat := Coq < match m with Coq < | O => n Coq < | S p => S (wrongplus n p) Coq < end. Coq < Coq < Error: Recursive definition of wrongplus is ill-formed. In environment wrongplus : nat -> nat -> nat n : nat m : nat p : nat Recursive call to wrongplus has principal argument equal to "n" instead of a subterm of "n". Recursive definition is: "fun n m : nat => match m with | 0 => n | S p => S (wrongplus n p) end".
Coq tactics
Coq < Lemma induction_test : forall n:nat, n = n -> n <= n. 1 subgoal ============================ forall n : nat, n = n -> n <= n Coq < intros n H. 1 subgoal n : nat H : n = n ============================ n <= n Coq < induction n. 2 subgoals H : 0 = 0 ============================ 0 <= 0 subgoal 2 is: S n <= S n
Error messages: Not an inductive product Unable to find an instance for the variables ident …ident Use in this case the variant elim … with … below.
Classical reasoning
Coq < Lemma or_commutative : A \/ B -> B \/ A. 1 subgoal A : Prop B : Prop C : Prop ============================ A \/ B -> B \/ A Coq < tauto. Proof completed.
Coq
Coq < Section club. Coq < Variables Scottish RedSocks WearKilt Married GoOutSunday : Prop. Coq < Hypothesis rule1 : ~ Scottish -> RedSocks. Coq < Hypothesis rule2 : WearKilt \/ ~ RedSocks. Coq < Hypothesis rule3 : Married -> ~ GoOutSunday. Coq < Hypothesis rule4 : GoOutSunday <-> Scottish. Coq < Hypothesis rule5 : WearKilt -> Scottish /\ Married. Coq < Hypothesis rule6 : Scottish -> WearKilt. Coq < Lemma NoMember : False. 1 subgoal Coq < tauto. Proof completed.
Прогонка
Ю. А. Климов Специализатор CILPE
Coq не единственный в своём роде
• The World Championship for Automated Theorem Proving
• http://www.cs.miami.edu/~tptp/CASC/
Таблица со страницы википедии про автоматическое доказательство теорем
Google trends • Formal verification/code review (below)
Итоги
• Для формальной верификации требуется помощь человека
• Случайное тестирование помогает, но ничего не гарантирует