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