Страницы

Неправильные «правильные» ответы. Обратная сторона парадокса лжеца

Издревле люди размышляют об утверждении, противоречащем самому себе и называемом парадоксом лжеца. В одном из представлений его можно выразить как Это высказывание ложно. Утверждение обросло огромным пластом рассуждений и, как утверждается, даже привело к нескольким смертельным исходам. И до сих пор оно составляет трудность для понимания, слишком часто способствующей ошибочным выводам. Их список так велик, что его перечисление составило бы значительную трудность.

В то же время вся проблематичность, по видимому, проистекает из избыточности и многослойности естественного языка, которая позволяет легко запутаться в размытых смыслах слов. Если же утверждение сформулировать с помощью языка программирования, то всё становится до неприличия простым.

Задача настолько простая, что даже ChatGPT справляется с ней сразу в законченном виде. Но мы попробуем описать всё по шагам. Для примера опишем простое высказывание a это 5 или a равно 5. Чтобы понять как это сделать, достаточно догадки, что высказывание — это предикат, то есть функция, возвращающая значение логического типа. Это легко отображается на код, в данном случае в параметрическую процедуру.

PROCEDURE IsFive(a: INTEGER): BOOLEAN;
RETURN
 a = 5
END IsFive;

Напишем составное высказывание, который применяет (вызывает) первое высказывание — 'высказывание а это 5 ложно'.

PROCEDURE IsFalseIsFive(a: INTEGER): BOOLEAN;
RETURN
 IsFive(a) = FALSE
END IsFalseIsFive;

И наконец запишем высказывание, которое проверяет ложность не другого высказывания, а самого себя, из-за чего ему даже не нужны входные аргументы.

[0]PROCEDURE ThisSentence(): BOOLEAN;
RETURN
 ThisSentence() = FALSE
END ThisSentence;

Это и есть программный код для Это высказывание ложно. Для большей ясности лучше избавиться от неуклюжего сравнения с ложностью, диктуемого исходной формулировкой. Такое сравнение равноценно отрицанию рассматриваемого значения [1].

RETURN
 ~ThisSentence()
— Приборы!
— Триста!
— Что триста?
— А что приборы?

Если пытаться высчитать истинность интуитивно и неформально, легко запутаться в действиях. При размышлении о парадоксе в терминах естественного языка можно предполагать, что проблема высказывания в том, что из предположения об его истинности должно следовать, что оно ложно, и наоборот. Но совсем неясно, из чего следует, что подобный подход применим. Вряд ли кто-то будет размышлять об истинности IsFive подобным образом. Если же подход неприменим, то из противоречия, получающегося в результате его применения, ничего не следует.

При рассмотрении же в коде строгой формальной системы становится очевидно, что сопоставление с ложью является лишь отвлекающей деталью, а единственная проблема высказывания заключается в совершенно другом — в безусловной[1] ссылке на себя, что приводит к неразрешимости выражения. Чтобы вычислить значение высказывания, сначала нужно вычислить значение высказывания. Из-за зацикленности здесь попросту не происходит возврата значения, а потому и сравнения с ложностью. Поэтому в высказывании даже нет противоречия, которое порождалось бы этим сравнением. Если перевести формальный код упрощённого выражения обратно в естественный язык, остаётся очевидной бессодержательность исходного предложения — Отрицание этого высказывания. Отрицание-то есть, а самого высказывания нет. Истинная парадоксальность «парадокса» лжеца в том, что это и не парадокс вовсе. Это, скорее, софизм или апория, зато слово «лжец» в названии оказывается совершенно оправданным.

Может показаться, что вывод о том, высказывание бессодержательно, а не истинно или ложно, противоречит закону логики об исключённом третьем. Но нарушение здесь находится не в выводе, а в постановке вопроса, которая предлагает совершить логическое отрицание над значением, которое не является логическим, то есть речь о подмене понятий. Закон об исключенном третьем задаёт область применимости логики, которое в псевдо-утверждении из парадокса лжеца нарушается.

На тёмной стороне

Раз зацикленность — это единственная проблема, то высказывание из парадокса лжеца по существу не отличается от своей кажущейся противоположной стороны — Это высказывание истинно. Ссылка на себя никуда не девается. И только на первый взгляд из-за всё той же словесной шелухи может показаться, что это утверждение непротиворечиво. На самом деле его противоречие даже более интересно, ведь оно гораздо лучше проявляет сущность ложности. Вряд ли лжец будет честно говорить о своей лживости, наоборот, от него следует ждать лжи о своей честности.

В коде же произойдёт замена FALSE на TRUE

PROCEDURE ThisSentence(): BOOLEAN;
RETURN
 ThisSentence() = TRUE

А после устранения тавтологичного[2] сравнения с TRUE только и останется пустое

RETURN
 ThisSentence()

Это — образцовая бессмыслица уже без малейших примесей — Это высказывание. Его нелепость о собственной истинности можно увидеть и в обычной словесной формулировке. Для начала можно предположить истинность утверждения, что на первый взгляд только подтверждается им самим. Но стоит предположить ложность утверждения, то таким же образом можно найти подтверждение и этому, ведь в утверждении сказано обратное. Таким образом высказывание одновременно якобы подтверждает и свою ложность, и истинность. В воображаемой системе, в которой мог бы существовать такой предикат, следующий код должен был бы успешно выполняться:

ASSERT(ThisSentence() = TRUE);   ASSERT( ThisSentence());
ASSERT(ThisSentence() = FALSE);  ASSERT(~ThisSentence());
Out.String("Чем не парадокс?");

В действительности же при безвыходной закольцованности определения некорректно даже предполагать какое-либо выходное значение вне зависимости от того, какую форму образует такую замкнутость. Пример, конечно, не завершится аварийно на проверках в ASSERT, но только потому, что до выполнения проверок не дойдёт очередь.

Итог

Высказывание о самом себе как ложном или истинном одинаково и не ложно, и не истинно. Оно бессмысленно, а из бессмысленного высказывания ничего не следует вне зависимости, есть ли в нём отрицание или нет. Утверждение о ложности на самом деле не добавляет противоречия, потому что бессмыслица с отрицанием всё равно остаётся бессмыслицей.

Главная логическая ошибка, которую совершают при анализе парадокса лжеца, заключается в ошибочной предпосылке, что произвольное высказывание может быть только истинным или ложным. Выбрасывается из рассмотрения то, что высказывание может быть зацикленным и вообще не давать никакого ответа — ни истинного, ни ложного. Навязанный выбор из множество ответов, ни один из которых не верен, приводит к закономерному тупику.

Возможно, кого-то разочарует слишком простое разрешение мнимо глубокого парадокса, манящего своей таинственной неясностью. Для кого-то парадокс даже служит основой для далеко идущих выводов, иногда столь же масштабных, сколь неправильных, так как они опираются всего-лишь на логические ошибки. Такое разочарование можно сравнить с сожалением Джона Форбса Нэша после отступления у него симптомов шизофрении[3]:

Сейчас, похоже, я мыслю рационально в духе, характерном для учёных. Однако, это не вполне означает радость кого-то, выздоравливающего от физического недуга. Рациональное мышление ограничивает представления человека о его связи с космосом.

Высказывание прекрасно само по себе, а содержание в нём неуверенного утверждения о своём мышлении, делает его ещё лучше в контексте этой заметки. Я мыслю правильно — важный вопрос, тесно связанный с парадоксом лжеца, и на который тоже часто отвечают неправильно.

О выборе формальной системы

И напоследок о важности выбора адекватного формального представления, которое позволит распутать, а не помочь запутаться ещё сильней. Например, Java позволяет выразить парадокс лжеца следующим образом:

public class Liar {
    final boolean
        sentence  =  this.sentence == false;
}

Только полученный эффект от него вряд ли можно назвать адекватным, и в большинтсве языков подобный код не проходил бы проверки. Кстати, и код с противоречащими утверждениями тоже может проходить без уведомлений о проблемах в средах, где аналоги ASSERT по умолчанию выключены, как в той же Java. Стоит считать неудачным язык программирования, который легко позволяет создавать внутренние парадоксы, не диагностируемые как ошибки.

Стоит отметить, что и с неограниченной рекурсией в коде не всё так просто. Совсем недаром во многих языках бесконечный цикл без внешних побочных эффектов, а также его рекурсивный эквивалент являются неопределённым поведением. А это ещё одна из плохо понимаемых тем, хотя это уже и другая история.


Примечания:

[0] Код парадокса в песочнице и ещё одной.
[1] A = FALSE равнозначно ¬A.
A:TRUEFALSE
A = FALSE:FALSETRUE
¬A:FALSETRUE
[2] Сама по себе самореферентность не является проблемой и служит удобным инструментом и в рассуждениях, и в программировании в том случае, если она подаётся через условие, позволяющее его завершить.
[3] A = TRUE равнозначно простому A.
A:TRUEFALSE
A = TRUE:TRUEFALSE
[4] Автобиография Джона Форбса Нэша на сайте Нобелевской премии.

Другие рассмотрения через код

  1. Coding the Liar Paradox
  2. EXPRESSING THE LIAR PARADOX IN RUBY?
  3. Пересказ в коде обычной неправильной трактовки

Комментариев нет:

Отправить комментарий