http://techtalks.nsu.ru
18 ноября 2014. Ренат Идрисов, к.ф.-м.н., ИСИ СО РАН, рассказывает про автоматическое доказательство теорем:
«Вы наверняка слышали, что в последнее время далеко не все теоремы доказываются вручную.
Как именно работают системы автоматических доказательств и что за языки лежат в их основе? Похоже ли построение автоматических доказательств на программирование? Могу ли я доказывать свои любимые теоремы на C или C++?
В рамках лекции прозвучат ответы на эти и другие вопросы, а также будет проведен небольшой вводный инструктаж по Coq.»
Лекция прочитана в рамках проекта Tech Talks @NSU – серии открытых лекций о разработке ПО и карьере в IT, проводимых в Новосибирском государственном университете.
Подробности: http://techtalks.nsu.ru
2. Первые шаги
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)
«Было величайшим триумфом доказать чётность
суммы чётных чисел»
3. Первые шаги
• 1956 г. The Logic Theory Machine
Удалось доказать 38 из 52 первых теорем
Principia Mathematica
4. Изоморфизм Карри-Говарда
Построение конструктивного доказательства
похоже на описание вычислений 1958
• Типы – высказывания
• Программы – доказательства
• Вычисление – упрощение
(P→Q→R)→(P→Q)→P→R
(P⇒(Q⇒R))⇒((P⇒Q)⇒(P⇒R))
10. Подходы к улучшению качества
• Социальные
– Код-ревью
– Парное программирование
• Методологический
– Паттерны
– Тесты
– Версии
– Баг-треккеры
• Технологический
– Lint
• Математический
11. Язык описания свойств
• Если не описаны свойства то программа
всегда правильная
• Не любой язык удобно использовать в
качестве языка описания свойств
(def sort-idempotent-prop
(prop/for-all [v (gen/vector gen/int)]
(= (sort v) (sort (sort v)))))
12. 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
13. Eiffel AutoTest проблемы
• Контракты очень редко описывают
тестируемую систему. Например, постусловие
должно описывать что процедура меняет и что
не должна менять. Функция вывода на экран
не должна увеличивать счётчиков,
соединяться с базой данных и так далее
• Контракты не только не полны, но и содержат
ошибки, допущенные разработчиками
14. Автоматическая генерация
• Предусловие должно быть выполнено, но
сильные предусловия могут не быть
достигнуты случайным генератором за
разумное время
• Кроме того, генерируемые значения
должны соответствовать критерию
адекватности теста (обеспечивать покрытие
и т. д.)
15. Eiffel autotest achieved
2005-2007 Начальный этап разработки системы
Например, было найдено следующее количество
различных ошибок в основных библиотеках:
• STRING - 12
• BOUNDED_STACK - 11
• HASH_TABLE - 23
• ARRAYED_SET - 27
• LINKED_LIST - 25
16. От языка программирования к
системе доказательств
• Как вместо того чтобы писать программы
начать писать доказательства?
• Языки программирования с зависимыми
типами (типы индексируемые значениями
другого типа)
• Логические высказывания записываются
как типы, а доказательствами являются
программы соответствующего типа
• ФП + ЗТ => АДТ
17. Agda
data Nat : Set where
zero : Nat
suc : Nat -> Nat
_+_ : Nat -> Nat -> Nat
zero + m = m
suc n + m = suc (n + m)
18. 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
(пример из Википедии)
19. 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)).
20. 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".
21. 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.
22. 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.
25. Coq не единственный в своём роде
• The World Championship for Automated
Theorem Proving
• http://www.cs.miami.edu/~tptp/CASC/
Таблица со страницы википедии про автоматическое доказательство теорем