dilettoСверхкраткое введение в формальные языки и теорию доказательств. А то мне лично кажется (извините, если я ошибся), что Вы не очень понимаете, о чём говорят собеседники.
Подробности можно посмотреть, например, в "Клини. Математическая логика".
1. Определяем алфавит (обычно в него входят латинские буквы, цифры, скобки, логические символы и т.д.). Просто перечисляем символы. Их конечное и обычно небольшое число.
2. Определяем, какие наборы символов являются высказываниями (например,
является высказыванием, а
- нет).
Пункты 1-2 называются "определим язык".
3. Определяем, какие высказывания мы принимаем за аксиомы.
4. Определяем, какие конечные цепочки высказываний являются доказательством последнего высказывания в цепочке.
Пункт 4 называется "определяем правила вывода".
Пункты 1-4 вместе называются "определяем формальную теорию". Важно, что пп. 1-4 формулируются предельно конкретно, формально, механически. Так, чтобы не оставалось никакой двусмысленности и свободы толкования. Так, чтобы можно было буквально компьютерной программой, написанной школьником, проверить, является ли данный набор символов высказыванием, данное высказывание аксиомой и данная цепочка высказываний - доказательством.
Теперь о том, что такое алгоритм. Алгоритм - это компьютерная программа для компьютера с неограниченной памятью. Который может, таким образом, запомнить любое конечное количество данных.
Тривиально строится алгоритм, который для любого высказывания
ищет его доказательство или же доказательство его отрицания.
Ясно, что все строки языка конечной длины можно упорядочить в алфавитном порядке. Определим функцию
, которая выводит любую строку языка по её номеру.
(Например, так)
Пусть алфавит состоит из
символов.
- если
, то
-
-тый в алфавитном порядке символ.
- если
, то
- слово из двух символов, в котором на первой позиции стоит первый в алфавитном порядке символ, а на второй -
-ый в алфавитном порядке символ.
- и т.д., думаю, принцип ясен. Как ясно и то, что любая строка конечной длины будет порождаться при некотором
.
Дальше всё просто.
Присваиваем
(сознательно не оформляю как код, в данном случае это неудобно).
1. Вычисляем
.
2. Получилось доказательство высказывания
? Если да, завершаем работу. Если нет, переходим к следующему пункту.
3. Получилось доказательство высказывания
? Если да, завершаем работу. Если нет, переходим к следующему пункту.
4. Увеличиваем
на единицу и переходим к п. 1.
Ясно, что если в данной теории вообще существует доказательство высказывания
или же его отрицания, то алгоритм рано или поздно их найдёт и остановится. Только вот при попытке сделать это на реальном, а не воображаемом, компьютере ему может понадобиться столько времени, что все умрут, звёзды погаснут, и даже белые карлики взорвутся как термоядерные сверхновые из-за туннельного эффекта. Полный перебор такой полный. Поэтому с практической точки зрения такой алгоритм никакого интереса не представляет.
А есть ещё такая теорема Гёделя о неполноте. Она утверждает, что в любой непротиворечивой и достаточно богатой теории, начиная с арифметики, найдутся высказывания, для которых в этой теории не будет ни доказательств, ни опровержений (доказательств их отрицания). Наткнувшись на такое утверждение
, алгоритм зациклится навеки.