1. ホーム
  2. functional-programming

[解決済み】参照透過性とは何ですか?

2022-03-28 03:46:26

質問

とはどういう意味ですか? 参照透過性 とはどういう意味でしょうか?イコールをイコールに置き換えることができる、というような説明を聞いたことがあるのですが、これは説明不足のような気がします。

どのように解決するのですか?

参照透過性という言葉は、次の言葉から来ています。 分析哲学 論理学や数学の手法に基づき、自然言語の構成や文、論証を分析する哲学の一分野である。つまり、コンピュータサイエンス以外の分野では、私たちが プログラミング言語セマンティクス . 哲学者 ウィラード・クワイン しかし、バートランド・ラッセルやアルフレッド・ホワイトヘッドも、この概念を暗黙のうちに持っていた。

参照透明性」の核心は、非常にシンプルで明快な考え方である。 分析哲学では、quot;referential"という用語を使って、次のようなことを話します。 ある表現が指し示すもの . プログラミング言語の意味論でいうところの「意味」や「意味づけ」とほぼ同じ意味である。 Andrew Birkettの例( ブログ記事 という言葉は、スコットランドの首都エディンバラ市を指している。 これは、quot;referent"のわかりやすい例です。

文中の文脈は、その文脈の用語を、以下のような別の用語で置き換えると、「参照透過的」である。 同じ実体を参照する は意味を変えない。 例えば

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

と同じ意味です。

スコットランド議会はエジンバラで開催されます。

つまり、quot;The Scottish Parliament meets in ..."という文脈は、参照的に透明な文脈なのです。 スコットランドの首都をエジンバラに置き換えても、意味は変わりません。 別の言い方をすれば、文脈はその用語が何を指しているのかだけを気にしており、それ以外のことは気にしていないのです。 これが、文脈が「言及的に透明である」という意味である。

一方、文中では

1999年からエディンバラがスコットランドの首都になりました。

そのような置き換えはできません。 もしそうすれば、"Edinburgh has been Edinburgh since 1999" となり、おかしなことになり、元の文と同じ意味が伝わらなくなります。 つまり、"Edinburgh has been ... since 1999"という文脈は、referentially opaque(referentially transparentの反対)であると思われます。 それはどうやら もっと何か その用語が指すものよりも それは何でしょうか?

スコットランドの首都のようなものをこう呼びます。 定型語 そして、長い間、論理学者や哲学者たちに少なからず頭を悩ませてきました。 ラッセルやクワインは、これらの例は実は「参照」ではない、つまり上記の例が実体を参照するために使われていると考えるのは間違いだ、と整理したのである。 1999年以来、エディンバラはスコットランドの首都である」(Edinburgh has been the capital of Scotland since 1999") の正しい理解は、次のようになります。

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

この文章は、ナットクに変換できない。 問題解決!(笑 クワインが言いたかったのは、自然言語は実用に便利なように作られているので、ごちゃごちゃしている、少なくとも複雑になっているが、哲学者や論理学者が正しい方法で理解することによって明瞭さをもたらすべきだということだ。 参照透明性とは、そのようなことをもたらすための道具である。 意味の明確化 .

これがプログラミングとどう関係があるのだろうか? 実は、あまり関係ない。 先程も言ったように、参照透過は言語を理解するための道具であり、例えば 意味 . クリストファー・ストレイシー プログラミング言語の意味論という分野を確立させたヴォルフガングが、意味の研究に使用した。 彼の基礎となる論文「" プログラミング言語における基本概念 ウェブで公開されています。 美しい論文で、誰でも読んで理解することができます。 だから、ぜひ読んでみてください。 きっと啓発されるはずです。 彼はこの段落で「参照透過性」という言葉を紹介している。

<ブロッククオート

式の最も有用な特性の1つは、クワインが言及的と呼ぶものである。 透明性。要するにこれは、ある式の値を知りたいときに、その式が を含む場合、その部分式について知っておく必要があるのは、その部分式だけです。 の値です。副式のその他の特徴、たとえば、内部構造、数、サイズ、サイズ、サイズなど その構成要素の性質、評価される順序、インクの色など。 は、主式の値とは無関係である。

in essence"が使われていることから、ストレイシーはわかりやすく説明するために言い換えているのだと思われる。 関数型プログラマは、この段落を自分なりに理解しているようだ。 この論文には、他にも "参照透過性" が9回出てきますが、彼らは、それ以外のことは気にもしていないようです。 実際、Stracheyの論文全体は、その意味を説明することに費やされています。 命令型プログラミング言語 . しかし、今日、関数型プログラマは、命令型プログラミング言語が ではなく を参照することができます。 ストレイシーは墓の中で寝返りをうっていることでしょう。

この状況を救うことができる。 自然言語は、実用上便利なように作られているので、「面倒くさい」「少なくとも複雑」であると言いました。 プログラミング言語も同じです。 プログラミング言語も同じで、実用上便利なように作られているからこそ、quot;messy, or least complicated"である。 だからといって、私たちを混乱させる必要はない。 ただ、意味を明確にするために、参照的に透明なメタ言語を使って、正しい方法で理解されなければならないのです。 私が引用した論文の中で、ストレイシーはまさにそれを行っている。 彼は、命令型プログラミング言語の意味を、初歩的な概念に分解して説明するが、その際、どこまでも明快さを失わない。 彼の分析で重要なのは、プログラミング言語の式には、次の2種類の"values"があることを指摘することである。 l値 R値 . ストラチェイの論文以前は、このことは理解されず、混乱が支配していた。 今日、C言語の定義では日常的にこのことに触れており、すべてのCプログラマがこの区別を理解している。 (他の言語のプログラマが同じように理解しているかは、何とも言えないが)。

クワインもストレイシーも、ある種の文脈依存性を伴う言語構文の意味に関心を持っていた。 例えば、私たちが例に挙げた「1999年以来、エディンバラはスコットランドの首都である」という表現は、「スコットランドの首都」という表現が、それが考えられている時間によって異なるという事実を意味しているのです。 このような文脈依存性は、自然言語でもプログラミング言語でも、現実のものとなっている。 関数型プログラミングでも、自由変数と束縛変数は、それらが出現する文脈を基準に解釈される。 いかなる種類の文脈依存性も、何らかの形で参照性の透明性を阻害する。 用語が依存する文脈を無視して意味を理解しようとすると、またしても混乱に陥ってしまうだろう。 クワインは、様相論理の意味を考えていた。 彼は次のように考えていた。 様相論理 は言及的に不透明であり、それを言及的に透明な枠組みに変換することによって(例えば、必然性を証明可能性とみなすことによって)一掃する必要がある。 彼はこの議論にほとんど敗れた。 論理学者も哲学者もクリプケの可能世界意味論が完全に適切であると判断したのである。 同様の状況は、命令型プログラミングにも存在する。 ストレイシーが説明した状態依存性、レイノルズが説明したストア依存性(クリプキの可能世界意味論と似たようなもの)は、完全に適切なものです。 関数型プログラマはこの研究をあまり知らない。 関数型プログラマはこの研究内容をあまり知らないので、参照透明性に関する彼らの考え方は大目に見てほしい。

[追記:上記の例は、quot;capital of Scotland"のような単純なフレーズが複数のレベルの意味を持つことを説明している。 あるレベルでは、私たちは現在の首都について話しているかもしれません。 あるレベルでは、現在の首都について話しているかもしれませんし、別のレベルでは、スコットランドが時間の経過とともに持ちえたかもしれないすべての首都について話しているかもしれません。 私たちは通常、特定の文脈にズームインすることも、すべての文脈にズームアウトすることも、非常に簡単に行うことができます。 自然言語の効率性は、このような我々の能力を利用したものである。 命令型プログラミング言語もほとんど同じように効率的です。 私たちは変数 x を代入の右辺に置く( r値 ) を使って、特定の状態におけるその値について話すことができます。 あるいは l値 は、すべての状態にまたがる。 このようなことで人が混乱することはまずありません。 しかし、言語構成に内在するすべての意味の層を正確に説明できるかもしれないし、できないかもしれない。 そのような意味の層はすべて「自明」であるとは限らず、それをきちんと研究することが科学の課題である。 しかし、普通の人がそうした重層的な意味を説明できないことは、彼らがそれについて混乱していることを意味するものではない] 。

以下の別記事で、この議論を関数型プログラミングと命令型プログラミングの関心事に関連付ける。 .