Просто отметим, что стандартное доказательство неразрешимости проблемы остановки основывается на той же идее, что и на языке quines: можно написать программу, подстроку которой соответствует исходный код всей программы. Затем, если бы была функция, halts
которая, учитывая исходный код программы, вернула True, если эта программа остановилась на всех входных данных, и False в противном случае, это была бы легальная программа:
prog() = if halts "prog" then prog() else ()
где "prog"
будет какое-то выражение, которое оценивается для исходного кода prog
; однако вы можете быстро увидеть, что он prog
останавливается (для всех входов), если он не останавливается, что является противоречием. Ничто в этом доказательстве никак не зависит от ввода-вывода (нужен ли ввод-вывод для написания квин?).
Кстати, вы можете захотеть заглянуть в «ввод-вывод на основе диалога», чтобы получить дополнительные доказательства того, что ввод-вывод совершенно не имеет отношения к вашей проблеме (в основном, программы, выполняющие ввод-вывод, могут быть сведены к программам, которые принимают ввод как (явные) функциональные аргументы и возвращают вывод в виде (явных) дополнительных результатов на ленивом языке). К сожалению, я не могу найти разумную, непредвзятую (или поддерживающую диалог) страницу в Интернете прямо сейчас.