2013年12月18日水曜日

ソシュールの言語理論と言語使用

ここでは、ソシュールのラングと言語使用との関係を考える。意味の使用説では、意味は言語の使用を説明しなければならないという要請があった。ラングとパロールを区別するソシュールの言語理論では、この要請が満たされないことを論じる。

まずソシュールの言語理論、とくにラングとパロールの分離について簡単にまとめる。

ソシュールはまず、単純な連合心理学的言語モデルを考える。人間が音声を聞くと、それがある概念に対応付けられる。同様に発話する際には、発話内容の概念が心のなかにあり、それが音声に翻訳される。この音声―概念間の対応をラングとソシュールは呼んでいる。これはある集団が共有する社会的なものである。一方、パロールは個々の言語使用の総体であり、言語を使用してある概念を他者へ伝えようとする意志的行為の集まりである。

この2つの相違をソシュールは擬似数式を用いて次のように表している。
+ ラングは1+1+1+1+... = I
+ パロールは1+1'+1''+1'''+... → 発散

ソシュールによればパロールは言語学の対象とはならず、ラングのみが言語学の対象となる。この分離は、おそらく、言語学という純粋科学を立ち上げようとする意図から来ているのだろう。パロールを言語学の対象から排除することにより、心理学という「余計なもの」を言語学の中から排除し、言語学を独自の対象を持ち、ほとんどアプリオリな原則からその事実が導出されるような学問体系へと純化することが目的だと思われる。

では、ラングと言語使用とはどのような関係にあるのだろうか?単純な連合心理学モデルによれば、ラングによって音声と観念との間の記号関係が与えられる。その観念がどのように使用されるかは、心理学の領域になるとソシュールは考えているようだ。

とは言え、ソシュールによれば、記号関係にあるものはシニフィアンとシニフィエであって、実際の音声や観念ではない。シニフィアンもシニフィエも言語体系に依存して与えられるものであり、何らかの意味で言語から独立したもの、というわけでない。

であるとすると、シニフィエと言語使用との間はまったく結合の方法がないように思われる。観念と使用との間は心理学的な結びつきがあると仮定できる。しかし、シニフィエは未だ言語的なものであり、心理学的に使用と結び付けられるものではないからだ。

したがって、ラングと言語使用との間の関連は、ソシュールの言語学では何ら説明できないことになる。

2013年12月8日日曜日

意味の使用説について

本論では、ヴィトゲンシュタインが唱えたとされる「意味の使用説」についてそれを主張するに至るアーギュメントを再構成してみたい。ここでヴィトゲンシュタインの考えとしては、「哲学探究」のものを主として考える。「哲学探究」のテキストとしては、丘沢静也訳の岩波書店版を参照する。

「意味の使用説」とはなんだろうか。若干ヴィトゲンシュタインの書いているものからは飛躍があるが、私はまず第一義的には「言葉の意味とは言葉の使用を説明するものでなくてはならない」という要請なのだと考える。その上で、規則のパラドックスによりどんな存在者もそのような説明を可能にしないことが導かれ、意味の概念を放棄して言葉の使用の記述に徹するというヴィトゲンシュタインの立場が導かれると考える。

通常の理解での意味の使用説


意味の使用説と通例されている主張は、特に「哲学探究」の43節において表明されているとされることが多い。
「意味」という単語が使われる―すべての場合ではないにしてもーほとんどの場合、この単語は次のように説明できる。単語の意味とは、言語におけるその使われ方である、と。
しかし、この部分は歯切れが悪いし、これを正当化する何らのアーギュメントも提示されていない。そもそも、ヴィトゲンシュタインは哲学においてはアーギュメントは存在しないとも述べている。
哲学は、あらゆることを提示するだけ。なにも説明しないし、なにも推論しない。ー あらゆることがオープンになっているので、なにも説明することがない。隠されているようなものに、私たちは興味を持たない。
哲学探究124節
ただ、ではこれでは他の立場を取る人をどう説得するのかよく分からない。ヴィトゲンシュタインは、自分の主張は正しく理解されれば自明である、と言いたいのかもしれない。しかし、ソシュールのように言語使用を意味から切り離す主張もあるのだから、すくなくとも表面上は意味の使用説は自明とは言いがたい主張である。少なくとも、「正しい」理解に達するためのアーギュメントが存在しなければならないだろう。実際、ヴィトゲンシュタインは「哲学探究」の中で、ある種の対話という形でアーギュメントを導入しているように思える。

そして、むしろ哲学にはアーギュメントが存在しない、という主張自体ある種の結論であって、やはりそれを正当化する何かのアーギュメントが存在するのではないか。その結論として、ある種限定した「哲学」という営みが成り立ち、その営みの中ではアーギュメントが存在しない、と言えるのではないかと思う。

意味の使用説は何でないか


では、意味の使用説はなにを主張しているのだろうか。これが「言葉の意味とは、それが表す観念のことである」といった立場や、「言葉の意味とは、それが表す指示対象のことである」といった立場のように、言葉に何か指示値(それがどんな存在論的資格をもつものであれ)があって、それが何であるかを問題にする立場ではないことは明らかだろう。確かに、使用全体を言葉の指示値と見なすことは可能で、こうすることで自明にあらゆる言語の使用を説明する意味論が構築できるが、それがヴィトゲンシュタインの意図だとは思えない。むしろ、ヴィトゲンシュタインは言葉が何か指示値(意味)をもつ、という考えそのものを批判している。

…品詞の区別について、アウグスティヌスは語っていない。言葉の習得をアウグスティヌスのように説明する人は、どうやら、まず第一に「テーブル」、「椅子」、「パン」などの名詞や、人の名前のことを考えているのではないか。その後でようやく、活動や性質をあらわす名前のことを考え、それ以外の品詞については、勝手に見つかるものだと思っているふしがある。
哲学探究第1節
1の例をながめてみれば、見当がつくかもしれない。言葉の意味という一般的な概念が言語の機能を靄で包んで、クリアに見えなくしてしまっているのだ。
哲学探究第5節

よってヴィトゲンシュタインは、言葉の指示値、という概念に対立するものとして言葉の使用、という概念を持ちだしているのだと思われる。

意味は使用を説明しなくてはならない


「哲学探究」に至る前段階である「青色本」では、言語にまつわる問題の核心が次のように述べられている。
If I give someone the order "fetch me a red flower from that meadow", how is he to know what sort of flower to bring, as I have only given him a word?
The Blue and Brown books, Harper & Row, p3 
一般化して言うと、言語記号しか与えられていないのに、それがなぜ言語使用を決定するのか、という問題である。これへの解として、「精神」というオカルト的な媒体の中の記号、つまり意味の存在が想定されてきたのだ、というのがヴィトゲンシュタインの指摘であり、これを批判することがヴィトゲンシュタインの目的である。つまり、「意味」や「精神」といった概念が引き起こす哲学的問題(キマイラ狩り, 哲学探究94節)を解消するためには、「意味は使用を説明しなくてはならない」という要請が課題とされるのである。

よって、「哲学探究」の冒頭部分では、プリミティブな言語における言語使用が繰り返し記述されることになる。

規則のパラドックス ー 使用を説明する「意味」は存在しない


言語使用を説明するものとして、簡単に考えつくのはその語の使用ルールである。しかし、いわゆる規則のパラドックスによれば、どんなルールもその使用を説明しない。ただ、この議論は誤解である、と批判されているので、検討を要するだろう。

私たちのパラドクスは、こういうものだった。「ルールは行動の仕方を決定できない。どんな行動の仕方でもルールと一致させることができるから。」それに対する答えは、こういうものだった。「どんな行動の仕方もルールと一致させることができるなら、ルールに矛盾させることもできる。だからここでは、一致も矛盾も存在しない。
そこに誤解があることは、私たちがこうして考えているあいだ解釈に解釈を重ねていることからも明らかである。まるでどの解釈も、少なくとも一瞬のあいだは私たちを安心させてくれるのだが、私たちはすぐにその解釈の背後にある解釈を考えてしまうかのようだ。つまり、このことによってわかるのは、ルールの解釈ではないルール把握というものが存在していることだ。ルール把握は、ルールを適用するケースごとに、「ルールにしたがう」ことと「ルールにそむく」ことにおいてあらわれる。
だから、「ルールに従った行動はどれも解釈だ」と言いたくなるのである。「解釈」と呼んでもいいのは、ルールについてひとつの表現を別の表現に置き換えることだけである。
哲学探究201節

通例の議論では、この引用の最初のパラグラフがいわゆる規則のパラドックスを表明していて、しかし第2パラグラフで「これは誤解である」と言われているので、すくなくとも規則のパラドックスの議論は解釈としては誤りだ、といわれる。

しかし、この「誤解」はもちろんヴィトゲンシュタインの議論に対する誤解ではなく、「ルール」の働きに対する「誤解」である。ヴィトゲンシュタインが指摘するように、このパラドックスは、解釈を行わず、我々が慣習にしたがったやり方でルールに「ただ」したがう、ということがあることを示すだけである。したがって、このパラドックスはパラドックスではないのだが、しかしパラドックスではなくとも、アーギュメントとしての価値はあるように思われる。そして、なにを示すアーギュメントかというと、ルールが「指し示す」対象を提示するだけ、つまり「解釈」を重ねるだけではルール把握は不可能である、ということを示すアーギュメントなのである。

ただ記述するだけ ー どんなものでも、そのままにしておく


したがって、言語がその使用を獲得するのは、その意味によってではない。というのも、どんな意味も誤解されえるからである。むしろ、言語がその使用を獲得するのは、その使用の慣習であり、また自然誌的事実である。これらを記述することから、言語の問題に関わろう、というのが「意味の使用説」であると思われる。

2013年8月28日水曜日

OCamlとRubyで同じプログラムを書いてみた

以前書いたとおり、OCamlRubyで簡単な家計簿プログラムmohを作った。全く同じというわけではなく、後に作ったRuby版のほうが機能を追加したりしているけど、面白い経験だったので感想を書いてみる。

客観的な比較


サイズを行数で比較すると、OCaml版は279、Ruby版は360で、Ruby版の方が機能が増えていることを考えるとほぼ同じくらいといえると思う。ただし、Rubyはユニットテストが作成に不可欠だったので、それを加えると499行とOCaml版に比べて倍くらいになる。まあユニットテストはOCamlでもした方がいいのだろうが、あとで述べる通り、しなくても動いてしまったのでユニットテストはしていない。いずれにしても、どちらも同じくらいコンパクトな言語だといえると思う。

OCamlのいいところ


これからは主観の入った比較となる。

よくOCamlは「コンパイルが通ればバグはないと言わしめる…」という枕詞が付く。もちろん、それは誇張だが、という但し書き付きで。しかし、mohを作ったときは本当にそうで、型検査が通った後のメインのロジックでバグは出なかった。悩まされたバグの原因はすべて正規表現だった。一方で、Rubyで書いたときは何度か型エラーに悩まされた。ユニットテストを書いてはいたが、型エラーが最後の段階、つまり誤ったメソッドが呼ばれるところまで分からないのでデバッグが難しかった。一方で、OCamlの型チェッカは型エラーの原因の比較的近くでエラーを検出するので型エラーではほとんど悩まされなかった。

よくユニットテストをするから型検査は不要、という議論があるけれどそれが間違いであることがわかると思う。一方で、ちゃんとした型システムをもった言語(JavaとかC++ではなく)を使うと実際に信頼性と生産性の向上に役に立つこともわかると思う。mohの開発では結局ユニットテストはしていない。(した方がいいことはわかっている。)

Rubyのいいところ

正直あまり感じなかった…ただ、オブジェクト指向というのは良い点かもしれない。OCaml版のmohでは内部のデータ構造にListを使っているのだけど、これをコードにベタに書いてしまっているのであとで変え難いというにはある。もちろんOCamlでもモジュールに隠蔽すれば簡単に変えられるようになるけれど、モジュールは若干構文が重い感じがする。全体的にOCamlは構文が重い気がする。

あと、正規表現の扱い。OCamlでは正規表現で何度も悩まされた。文字列リテラルでバックスラッシュ「\」をエスケープしなくてはいけないので、正規表現だと2重にエスケープしなくてはいけないことが多く、何がなんだかわからなくなる。これはStrモジュールを使った(Pcreではなく)せいもあるのかもしれないけど。

あと、CSVを解析するモジュールとか、ライブラリはやはり豊富でよく考えられていると思った。

まあまとめると、OCamlは中身、Rubyは見た目とHypeだなあと思いました。

2013年8月27日火曜日

お財布をプレーンテキストで管理する その2

mohとは?


moh (MOney Handler)はコマンドラインベースのシンプルな家計簿ソフトウェア。シンプルと言っても、複式簿記になんとなくは基づいているつもり。私は簿記は習ったことがないので、あまりあてにはならないけど。以前OCamlで書いた時のエントリはこちら。今回はRubyで書きなおして、家計簿の記法を変えたり機能を追加したりした。小さいソフトウェアだが、だいたい同じものをRubyとOCamlで書いてみて色々面白かったので、そのこともいずれ書きたいと思うが、とりあえず今回は使い方だけ。

インストール


まずRubyをインストールする必要がある。Macの人は、付属のruby 1.8.7を使えば良いので何もしなくて良い。

次にwhen_exeをインストールする
\$ sudo gem install when_exe

あとはhttps://github.com/yoriyuki/moh/tree/0.0.1からmoh.rbをダウンロードし、適当なところに置くだけ。家計簿データの置いてあるディレクトリのトップに置くと便利だと思う。

使い方

家計簿を書く

mohの家計簿はプレーンテキスト。指定したディレクトリの下にあるテキストファイルを全部スキャンして、mohの形式で書かれた行を家計簿データと見なす。例えば、

[2012-11-29]\$ Wallet  Expense 7-11 convenience store 700

と書くと、WalletからExpenseへ700円移動した(使った)ことになる。7-11 convenience storeはコメント。

口座は階層化することができる。

[2012-11-29]\$ Wallet  Expense:Lunch 7-11 convenience store 700

今、口座に何円あるか分かっていれば、それを記述できる。

[2013-08-01]\$= Wallet 6000

これで財布に6000円あることになる。もしこれがこれまでの集計結果と違えば、mohは自動的に使途不明金または不明な収入をこの時点に挿入する。

レポートの生成


\$ ruby moh.rb -d XXX -s Wallet 20130101 20131231

とすると、XXXディレクトリの下にある*.howmファイルを読み込んで、口座Walletの2013年1月1日から2013年12月31日までの取引に関するサマリーを生成する。-dを省略するとカレントディレクトリが仮定される。-sでサマリーを生成するが、-tとすると条件に対応する取引がすべて表示される。

--howm_suffix=[SFX]で読み込むファイルのサフィックスをSFXに変更できる。

\$ ruby moh.rb -d XXX --howm_suffix=txt -s Wallet 20120101 20121231

個人的な理由から、三井住友銀行と三井住友VISAが生成するcsvファイルを読み込むことができる。
\$ ruby moh.rb --smbc_dir=XXX -s -t Wallet 20120101 20121231
\$ ruby moh.rb --smbc_visa_dir XXX -s Wallet 20120101 20121231

便利にお使いいただければ幸い。

2013年7月24日水曜日

荘子、孟子を批判する

孟子と荘子はほぼ同時代の人であったらしい。互いに全く言及していないようだが、似たような思想的雰囲気を共有していた可能性はあると思う。孟子の文章と荘子の文章のなかにつながるように思われる部分があったので、それを荘子の孟子批判として読んでみたいと思う。

孟子の性善説について


孟子は一般に人間の本性が善である、という性善説を唱えたとされる。孟子の性善説の例証として「惻隠の情」の話はとても有名である。もし赤ん坊が井戸に落ちかけていたとすると、人間誰も打算抜きで助けようとするだろう、これが人間に善なる本性が備わっている証拠だと。まあ現代日本の都会では見て見ぬふりをされそうな気もするが。

ただ、ここから人間の本性が善である、と結論するのには問題がある。人間には悪の性質も十分に持ち合わせているように見えるからである。これに対して孟子は、告子編で繰り返し論じられているように、それは人間の本性ではなく外的な要因によるものだ、と考える。

では、その論拠はなんだろうか。多分この一節がその論拠になっているように思う。
告子曰く、性これを生と謂う。孟子曰く、性これを生と謂うは、猶白これを白と謂うがごときか。曰く、然り。羽の白きを白しとするは、猶雪の白きを白しとするがごとく、雪の白きを白とするは、猶玉の白きを白しとするがごときかごときか。曰く、然り。然らば、即ち犬の性は、猶牛の性のごとく、牛の性は猶人の性のごときか。 
(岩波文庫「孟子」(下)告子章句上三)
告子は、人間の生全体が人間の本性であると説く。当然、善も悪も本性に含まれるわけである。その後の議論はどうも古代中国の言語哲学特有の議論の気がして面白そうだが、そのへんは端折って現代的な議論でごまかすと、孟子は他の動物と区別できるような人間の性質が人間の本性であると考えているようだ。そして、その本性すなわち仁義(善)と定義しているように思う。

まあ、他の動物もしないような悪事を人間はたくさんするからそんなことでは善を定義できないように思うが、とりあえずそれは置くする。

荘子の性善説批判


このような孟子の議論を「荘子」の中では恵子に語らせて批判している。恵子は「性」の代わりに「情」という言葉を使っているが、「孟子」告子篇章句上八に「是れ豈人の情ならんや。」と孟子も「情」を本性の意味に使っているので「荘子」のこの恵子の議論は孟子の議論と関連していると理解できる。

恵子、荘子に謂いて曰わく、人は故より情なきかと。荘子曰く、然りと。恵子曰わく、人にして情なくんば、何を以ってかこれを人と謂わんと。荘子曰く、道これに貌を与え、天これに形を与う。悪んぞこれを人と謂わざるを得んやと。恵子曰く、既にこれを人と謂う、悪んぞ情なきを得んやと。荘子、是れ吾の謂わゆる情には非ず。吾の謂わゆる情なしとは、人の好悪を以て内に其の身を傷らず、常に自然に因りて生を益さざることを言うなりと。恵子曰く、性を益さざれば、何を以てか其の身を有たんと。荘子曰く、道これに貌を与え、天これに形を与う。好悪を以て内に其の身を傷ることなし。今、子は子の神を外にし、子の精を労し、樹に倚りて吟じ、稿梧に拠りて瞑す。天、子の形を選しに、子は堅白を以て鳴ると。
(岩波文庫「荘子」第一冊内篇徳充符篇六)

恵子に問われて、荘子は人間には生まれもっての本性はない、と答えている。恵子はこれに反論して、人間という生物種として一定の本質(二本足で歩くなど)を与えられているのだから、本性がないはずがない、と論じている。これは孟子と似たような立場であろう。孟子は人間を他の動物を区別する性質を人間の本質ととらえ、それを「善」と見なしているから。

さて、これに対す荘子の反論は、一見、恵子の議論に答えていないように見えるが、孟子のような議論を念頭に置いて批判していると考えると、次のように解釈できると思う。まず、人間にはいろいろな性質がある。その中には人間を他の動物から区別する性質もあるし、生きている、ということからくる性質もある。しかし、だからといって孟子のように特定の性質、例えば人間を他の動物から区別する性質、を善とみなして好んだり、ある性質を動物的とみなして嫌ったり、あるいは生きている、ということを重視してそれを助長すべきだ、ということが帰結するわけではない。むしろそれらはすべて、死に向かう性質も含めて天(道)が与えたものである。

では荘子の立場とは何かというと、この天が与えたものをただ受け入れる、ということである。なぜ天が与えた性質をすべて受け入れるべきかというと、それは天は自然(自ずと然りとなるもの)だからである。これは私の作業仮説だが、荘子は「道」(従ったり従わなかったりされるもの全般、例えば聖王の事績など)を2つに分類しているように思う。一つは、聖王の事績などというように、従うこともできるし、従わないこともできるもの。もう一つは万物が従っていると想定される「大道」のように、従わない、ということが考えられないような道のことである。後者の道は、自ずと然り、つまり自然である。というのも然りとならないことがあらかじめ排除されているからである。そしてすべての事物は大道のもとに生じる以上、自ずと大道に従う(自然)。したがって、われわれはこれを受け入れる他ないのである。

2013年7月10日水曜日

CSPによる並行システムの検証その2

阪大での講義のスライドとサンプルコードを公開する。前回→CSPによるコンカレントシステムの検証(1)

スライド


サンプルコード

OS.csp

enum {l, m, h, none};

var active = none;

var wait_h = false;
var wait_m = false;
var wait_l = false;

H = [active == h](act_h -> H [] act_h{wait_h = false} -> H);
M = [active == m](act_m -> M [] act_m{wait_m = false} -> M);
L = [active == l](act_l -> L [] act_l{wait_l = false} -> L);

Scheduler =
 atomic {
  (req_h -> {wait_h = true} -> Skip
  [] req_m -> {wait_m = true} -> Skip
  [] req_l -> {wait_l = true} -> Skip);
  case {
   wait_h: {active = h} -> Skip
   wait_m: {active = m} -> Skip
   wait_l: {active = l} -> Skip
   default: {active = none} -> Skip
  }
 }; Scheduler;

Env = [!wait_h]req_h -> Env [] [!wait_m]req_m -> Env [] [!wait_l]req_l -> Env;

System = H ||| M ||| L ||| (Scheduler || Env);
 
#assert System deadlockfree;

#assert System |= G(req_h -> F act_h);
#assert System |= G(req_m -> F act_m);
#assert System |= G(req_l -> F act_l);

#assert System |= G(req_h -> ((! act_l) U act_h));
#assert System |= G(req_l -> ((! act_h) U act_l));

OS-PriInv.csp

enum {l, m, h, none};

var active = none;

var wait_h = false;
var wait_m = false;
var wait_l = false;

var resource = none;

H = [active == h && (resource == none || resource == h)]
 (act_h{resource = h} -> H
  [] act_h{resource = none; wait_h = false} -> H);
M = [active == m](act_m -> M [] act_m{wait_m = false} -> M);
L = [active == l && (resource == none || resource == l)]
 (act_l{resource = l} -> L 
  [] act_l{resource = none; wait_l = false} -> L);

Scheduler =
 atomic {
  (req_h -> {wait_h = true} -> Skip
  [] req_m -> {wait_m = true} -> Skip
  [] req_l -> {wait_l = true} -> Skip);
  case {
   wait_h: {active = h} -> Skip
   wait_m: {active = m} -> Skip
   wait_l: {active = l} -> Skip
   default: {active = none} -> Skip
  }
 }; Scheduler;

Env = [!wait_h]req_h -> Env [] [!wait_m]req_m -> Env [] [!wait_l]req_l -> Env;

System = H ||| M ||| L ||| (Scheduler || Env);
 
#assert System deadlockfree;

#assert System |= G(req_h -> F act_h);
#assert System |= G(req_m -> F act_m);
#assert System |= G(req_l -> F act_l);

#assert System |= G(req_h -> ((! act_l) U act_h));
#assert System |= G(req_l -> ((! act_h) U act_l));

OS-PriInh.csp

enum {l, m, h, none};

var active = none;

var wait_h = false;
var wait_m = false;
var wait_l = false;

var resource = none;

H = [active == h && (resource == none || resource == h)]
 (act_h{resource = h} -> H
  [] act_h{resource = none; wait_h = false} -> H);
M = [active == m](act_m -> M [] act_m{wait_m = false} -> M);
L = [active == l && (resource == none || resource == l)]
 (act_l{resource = l} -> L 
  [] act_l{resource = none; wait_l = false} -> L);

Scheduler =
 atomic {
  (req_h -> {wait_h = true} -> Skip
  [] req_m -> {wait_m = true} -> Skip
  [] req_l -> {wait_l = true} -> Skip);
  case {
   resource == l: {active = l} -> Skip
   wait_h: {active = h} -> Skip
   wait_m: {active = m} -> Skip
   wait_l: {active = l} -> Skip
   default: {active = none} -> Skip
  }
 }; Scheduler;

Env = [!wait_h]req_h -> Env [] [!wait_m]req_m -> Env [] [!wait_l]req_l -> Env;

System = H ||| M ||| L ||| (Scheduler || Env);
 
#assert System deadlockfree;

#assert System |= G(req_h -> F act_h);
#assert System |= G(req_m -> F act_m);
#assert System |= G(req_l -> F act_l);

#assert System |= G(req_h -> ((! act_l) U act_h));
#assert System |= G(req_l -> ((! act_h) U act_l));