🍎

ウィトゲンシュタイン『論理哲学論考』とプログラミング言語的世界観

2021/10/17に公開

ウィトゲンシュタインの『論理哲学論考』の解説本を読んでいて、
「これはプログラミング言語の世界観だ」
と思ったところがあった。
解説本とは、古田徹也『ウィトゲンシュタイン 論理哲学論考 シリーズ世界の思想 (角川選書)』である。
今回、言及するのは、§2 「事実と事態、事態と物(対象)」の部分である。

結論から先に言うと、

物のなかで可能性が予定されている

という世界観だ。
以下、『論理哲学論考』の記載を引用する。[1]

2.012
論理においては何ひとつ偶然ではない。
ある物がある事態のなかに現れることが可能であるなら、その事態の可能性はその物のなかで予定されているのでなければならない。

2.0121
物が事態のなかに現れることが可能であるなら、その可能性は物のなかにすでにあるのでなければならない。
(論理的なことは、単に可能なことにとどまるものではありえない。論理はすべての可能性を扱い、そして、すべての可能性は論理にとっての事実となる。)

引用終わり。

これはどういうことか。

以下、簡単な JavaScript のコードを例にとって話を進めたい。

index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>HTML</title>
  </head>
  <body>
    <script src="index.js"></script>
  </body>
</html>
index.js
const STRING = "a"

const x = STRING.toUpperCase()

console.log(x)

const NUMBER = 7

const y = NUMBER.toUpperCase() 

console.log(y)

これをブラウザ(ここでは Google Chrome)で開いて、デベロッパーツールのコンソールで確認する。

すると、

A
index.js:9 Uncaught TypeError: NUMBER.toUpperCase is not a function
    at index.js:9

STRING.toUpperCase()により、小文字のアルファベット a は、大文字の A に変換されている。
しかし、NUMBER.toUpperCase()は、エラーとなっている。

ここで、toUpperCase() というメソッドについて mozilla のリファレンスを見てみる。

String.prototype.toUpperCase()
toUpperCase() メソッドは、呼び出す文字列の値を(文字列でない場合、文字列に変換して)大文字に変換して返します。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/toUpperCase

ようするに、toUpperCase()というメソッドは、String.prototype、つまり、文字列というデータ型がもっているメソッドということだ。

上のindex.js の例では、
const STRING = "a" で定義した STRING は string 型、つまり文字列というデータ型である。

そして、JavaScript の Number 型は、toUpperCase() というメソッドを持っていなかったので、STRING.toUpperCase() はエラーとなる。

これは、より抽象的に言えば、
「あるデータ型が、あるメソッドやプロパティを持っている」ということになり、

上記のウィトゲンシュタインの
「事態の可能性はその物のなかで予定されている」
に対応していると私は考える。

ここでは、JavaScript のメソッドを例にとったが、もっと日常的な例を出そう。

上記の古田氏の著書に載っている例として、果物のリンゴを出す。
リンゴという物があるとして、リンゴが机の上に載っている可能性は、ありえる。
しかし、リンゴが外科手術を施したり、リンゴが輸血を受けたりする可能性ない。

リンゴが机の上に載っていたり、リンゴが食べられて、人体の栄養になる可能性をもっているのは、
String 型の小文字のアルファベットが、toUpperCase()で大文字のアルファベットに変換される可能性をもっていることに対応している。
リンゴが外科手術を施したり、リンゴが輸血を受けたりするということはありえないというのは、Number、数値が、toUpperCase()で大文字になる可能性をもっていないことに対応している。

これが、

物が事態のなかに現れることが可能であるなら、その可能性は物のなかにすでにあるのでなければならない。

というウィトゲンシュタインの記載と、プログラミングの世界観が共通していると感じられた。
(というか、歴史的に見れば、ウィトゲンシュタインやラッセルの哲学が、現代のプログラミング言語のもとになっているのかもしれないが。)
また、この「可能性」のことをウィトゲンシュタインは、物(対象)の形式と呼んだ。

2.0141
事態のなかに現れる可能性が、対象の形式である。

話を拡張すると、オブジェクト指向言語において、class では、プロパティやメソッドをあらかじめ定義する。
これは class がもつ形式を定義することになる。
また、Haskell や PureScript などの関数型言語では、型クラスにより、データが持つメソッドを定義する。
これは型が持つメソッドを定義することになる。
オブジェクト指向言語でも、関数型言語でも、手法の違いはあれ、「物(対象)が、可能性(形式)を持っている」という点は共通している。

今回なぜこれを書いたかと言えば、自分が JavaScript なりのプログラミング言語を学習する過程で、「わかった」「上達した」と感じられた時があった。
そのときに、「物(対象)が、可能性(形式)を持っている」
ということを暗黙裡に納得したような気がする。
認知心理学的に言えば、「スキーマ」が形成されたと思う。
記憶としては、狩野祐東氏の『確かな力が身につく JavaScript「超」入門』[2]という本を読んだことがきっかけのひとつになっていたと思う。

それが長らく言語化できなかった。今回、完全ではないにしろ、『論理哲学論考』の解説本を読んで一部言語化できそうになったので、言語化した次第である。

脚注
  1. 『論理哲学論考』の引用は、以下の本から。
    古田 徹也『ウィトゲンシュタイン 論理哲学論考 シリーズ世界の思想 (角川選書)』(2019/4/26)
    https://www.kadokawa.co.jp/product/321707000026/ ↩︎

  2. 確かな力が身につく JavaScript「超」入門 第2版
    https://www.sbcr.jp/product/4815601577/ ↩︎

Discussion