参照透明性とは何ですか? 質問する

参照透明性とは何ですか? 質問する

参照透過性という用語はどういう意味ですか? 「equals を equals に置き換えることができる」と説明されているのを聞いたことがありますが、これは不十分な説明のように思えます。

ベストアンサー1

「参照透明性」という用語は、分析哲学は、自然言語の構造、文、議論を論理と数学の手法に基づいて分析する哲学の一分野です。言い換えれば、コンピュータサイエンス以外で、いわゆる「自然言語学」に最も近い分野です。プログラミング言語のセマンティクス哲学者ウィラード・クワイン参照透明性の概念を提唱したのは彼であるが、それはバートランド・ラッセルやアルフレッド・ホワイトヘッドのアプローチにも暗黙的に含まれていた。

本質的に、「参照透過性」は非常に単純で明確な概念です。「参照対象」という用語は、分析哲学において、表現が参照するものについて話すときに使用されます。これは、プログラミング言語の意味論における「意味」または「表示」の意味とほぼ同じです。Andrew Birkett の例 (ブログ投稿) では、「スコットランドの首都」という用語はエディンバラ市を指します。これは「指示対象」のわかりやすい例です。

文中の文脈が「参照透過的」であるとは、文脈中の用語を同じ実体を指す別の用語に置き換えても意味が変わらない場合を指します。例えば、

スコットランド議会はスコットランドの首都で開催される。

と同じ意味です

スコットランド議会はエディンバラで開催される。

したがって、「スコットランド議会は…で会合する」という文脈は、参照が透明な文脈です。意味を変えずに、「スコットランドの首都」を「エディンバラ」に置き換えることができます。言い換えると、文脈は用語が何を指すかだけを気にし、他のことは気にしません。それが文脈が「参照が透明」であるという意味です。

一方、次の文では、

エディンバラは1999年以来スコットランドの首都となっている。

そのような置き換えはできません。もし置き換えたとしたら、「エディンバラは 1999 年からエディンバラになっています」という表現になりますが、これはおかしな言い方ですし、元の文と同じ意味を伝えません。したがって、「エディンバラは 1999 年から ... になっています」という文脈は参照不透明 (参照透明の反対) であると思われます。どうやら、用語が指すもの以上の何かに関心があるようです。それは何でしょうか?

「スコットランドの首都」のようなことは限定語と呼ばれ、長い間、論理学者や哲学者に頭痛の種となってきた。ラッセルとクワインは、それらは実際には「指示的」ではない、つまり、上記の例が実体を指すために使われていると考えるのは間違いだと言って、それらを整理した。「エディンバラは1999年以来スコットランドの首都である」を理解する正しい方法は、次のように言うことである。

スコットランドには 1999 年から首都があり、その首都はエディンバラです。

この文を、おかしな文に変えることはできません。問題解決です! クワインの論点は、自然言語は実用上便利になるように作られているため、乱雑、または少なくとも複雑であるが、哲学者や論理学者は、自然言語を正しく理解することで、意味を明確にすべきだ、というものでした。参照透明性は、そのような意味の明確さをもたらすために使用されるツールです。

これらすべてはプログラミングとどのような関係があるのでしょうか? 実はあまり関係ありません。前述したように、参照の透明性は言語を理解する、つまり意味を割り当てる際に使用するツールです。クリストファー・ストラチェイプログラミング言語意味論の分野を創始した彼は、意味の研究にそれを利用しました。彼の基礎論文「プログラミング言語の基本概念」はウェブ上で公開されています。素晴らしい論文で、誰でも読んで理解することができます。ぜひ読んでみてください。きっと多くのことを学べるでしょう。彼はこの段落で「参照透明性」という用語を紹介しています。

式の最も有用な特性の 1 つは、Quine の「参照透明性」と呼ばれるものです。本質的には、これは、部分式を含む式の値を求める場合、部分式について知っておく必要があるのは、その値だけであることを意味します。部分式のその他の特性、たとえば、内部構造、コンポーネントの数と性質、評価される順序、書き込まれたインクの色などは、メイン式の値とは無関係です。

「本質的に」という表現は、ストラチェイが簡単な言葉で説明するために言い換えていることを示しています。関数型プログラマーは、この段落を独自の方法で理解しているようです。論文には「参照透過性」という表現が他に 9 回ありますが、他の表現については気にしていないようです。実際、ストラチェイの論文全体は、命令型プログラミング言語の意味の説明に費やされています。しかし、今日、関数型プログラマーは、命令型プログラミング言語は参照透過性がないと主張しています。ストラチェイは墓の中で身をよじっているでしょう。

状況は改善できます。自然言語は「乱雑、または少なくとも複雑」であるのは、実用上便利になるように作られているからだ、と私たちは言いました。プログラミング言語も同じです。プログラミング言語は「乱雑、または少なくとも複雑」であるのは、実用上便利になるように作られているからです。だからといって、プログラミング言語が私たちを混乱させる必要があるわけではありません。プログラミング言語は、意味を明確にするために、参照透過性のあるメタ言語を使用して、正しい方法で理解されなければなりません。私が引用した論文で、ストラチーはまさにそれを行っています。彼は命令型プログラミング言語の意味を、基本概念に分解して説明し、どこも明確さを失っていません。彼の分析の重要な部分は、プログラミング言語の式には、l -valuer-valueと呼ばれる 2 種類の「値」があることを指摘することです。ストラチーの論文以前は、これが理解されておらず、混乱が支配していました。今日では、C の定義でこれが日常的に言及されており、すべての C プログラマーがその違いを理解しています。(他の言語のプログラマーが同様に理解しているかどうかはわかりません。)

クワインとストラチーはどちらも、何らかの形の文脈依存性を伴う言語構造の意味に関心を持っていました。たとえば、「エディンバラは 1999 年以来スコットランドの首都となっている」という例は、「スコットランドの首都」が考慮されている時間に依存するという事実を意味します。このような文脈依存性は、自然言語とプログラミング言語の両方で現実に存在します。関数型プログラミングでも、自由変数と束縛変数は、それらが出現する文脈を考慮して解釈されます。あらゆる種類の文脈依存性は、何らかの形で参照の透明性を妨げます。用語の意味を、それらが依存する文脈を考慮せずに理解しようとすると、やはり混乱に陥ります。クワインは様相論理の意味に関心を持っていました。彼は次のように主張しました。様相論理は参照的に不透明であり、参照的に透明なフレームワークに翻訳することによって(たとえば、必然性を証明可能性と見なすことによって)クリーンアップされる必要があります。彼はこの議論で大部分負けました。論理学者と哲学者は同様に、クリプキの可能世界意味論が完全に適切であるとわかりました。同様の状況は命令型プログラミングにも当てはまります。ストラチーによって説明された状態依存性とレイノルズによって説明されたストア依存性(クリプキの可能世界意味論に似た方法で)は完全に適切です。関数型プログラマーはこの研究についてあまり知りません。参照透明性に関する彼らのアイデアは、かなり疑ってかかる必要があります。

[追加メモ: 上記の例は、「スコットランドの首都」のような単純なフレーズが複数の意味レベルを持つことを示しています。あるレベルでは、現在の首都について話しているかもしれません。別のレベルでは、スコットランドが時間の流れの中で持っていた可能性のあるすべての首都について話しているかもしれません。通常の実践では、特定のコンテキストに「ズームイン」したり、「ズームアウト」してすべてのコンテキストにまたがったりすることが非常に簡単です。自然言語の効率性は、そうする能力を利用しています。命令型プログラミング言語もほぼ同じように効率的です。割り当ての右側 ( r-値) で変数xを使用して、特定の状態におけるその値について話すことができます。または、すべての状態にまたがるl-値について話すこともできます。このようなことで混乱することはめったにありません。ただし、言語構造に固有のすべての意味の層を正確に説明できる場合とできない場合があります。このようなすべての意味の層は必ずしも「明白」ではなく、それらを適切に研究することは科学の問題です。しかし、一般の人々がそのような階層化された意味をうまく説明できないことは、彼らがその意味について混乱していることを意味するものではありません。

以下の別の「追記」では、この議論を関数型プログラミングと命令型プログラミングの問題に関連付けています

おすすめ記事