もう1つの極端な例は、2つのプログラムが同じ関数を計算する(または同様の環境で同じ観測可能な動作を示す)場合に同等であると言うことです。しかし、これらは良くありません。素数をチェックするすべてのプログラムが同じというわけではありません。結果に影響を与えないコード行を追加できますが、それでも同じプログラムと見なします。
これは極端ではありません。プログラムの等価性は、観測の概念に関連して定義する必要があります。
PL研究で最も一般的な定義は、文脈的同等性です。コンテキスト等価では、アイデアは、プログラムをより大きなプログラム(コンテキスト)のコンポーネントとして使用して観察するというものです。したがって、2つのプログラムがすべてのコンテキストに対して同じ最終値を計算する場合、それらは等しいと判断されます。この定義は、考えられるすべてのプログラムコンテキストを定量化するため、直接作業することは困難です。したがって、PLの典型的な研究プログラムは、文脈的同等性を暗示する構成的推論の原則を見つけることです。
ただし、これが観察の考えられる唯一の概念ではありません。たとえば、プログラムのメモリ、時間、または電力の挙動は観察可能であると簡単に言うことができます。この場合、より多くのプログラムを区別できるため、保持されるプログラムの同等性は少なくなります(たとえば、マージソートはクイックソートと区別できるようになりました)。タイミングチャネル攻撃の影響を受けない言語を設計したい場合、またはスペースに制限のあるプログラミング言語を設計したい場合、これはあなたがしなければならないことです。
また、計算の中間状態のいくつかを観測可能と判断することもできます。これは、干渉の可能性があるため、並行言語では常に発生します。ただし、シーケンシャル言語でもこのビューを使用したい場合があります。たとえば、暗号化されていないデータをメインメモリに保存しないようにするには、メインメモリへの書き込みを監視可能と見なす必要があります。
基本的に、プログラムの等価性という単一の概念はありません。それは常にあなたが選ぶ観察の概念に関連しており、それはあなたが念頭に置いているアプリケーションに依存します。