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));