Оставляя в стороне вопросы реализации компилятора и языкового дизайна, вы просите: доказуемо неразрешимо (если только вы не заботитесь только об обнаружении 100% идентичных программ). Решение о том, что две программы вычисляют одну и ту же функцию, эквивалентно решению проблемы остановки. Это классическое следствие теоремы Райса: любое «интересное» свойство машин Тьюринга неразрешимо, тогда как «интересное» просто означает, что оно верно для одних машин и ложно для других.
Просто для удовольствия, вот доказательство. Предположим, мы можем создать функцию для определения эквивалентности двух блоков, называемую EQ (b1, b2). Теперь мы будем использовать эту функцию для решения проблемы остановки. Мы создаем новую функцию HALT (M, I), которая сообщает нам, остановится ли машина Тьюринга M на входе, который мне нравится:
BOOL HALT(M,I) {
return EQ(
^(int) {return 0;},
^(int) {M(I); return 0;}
);
}
Если M (I) останавливается, то блоки эквивалентны, поэтому HALT (M, I) возвращает YES. Если M (I) не останавливается, то блоки не эквивалентны, поэтому HALT (M, I) возвращает NO. Обратите внимание, что нам не нужно выполнять блоки - наша гипотетическая функция EQ может вычислить их эквивалентность, просто взглянув на них.
Мы теперь решили проблему остановки, которая, как мы знаем, невозможна. Следовательно, эквалайзер не может существовать.