プログラマから見た『テセウスの船』

http://ja.wikipedia.org/wiki/%E3%83%86%E3%82%BB%E3%82%A6%E3%82%B9%E3%81%AE%E8%88%B9

テセウスアテネの若者と共に(クレタ島から)帰還した船には30本の櫂があり、
アテネの人々はこれをファレロンのデメトリウスの時代にも保存していた。
このため、朽ちた木材は徐々に新たな木材に置き換えられていき、論理的な問題から
哲学者らにとって恰好の議論の的となった。
すなわち、ある者はその船はもはや同じものとは言えないとし、
別の者はまだ同じものだと主張したのである。

// テセウスの船が木材Aから作られた
var テセウスの船 = new Ship(木材A);
テセウスの船.構成要素表示();	// 木材Aから作った船底, 木材Aから作ったオール, 木材Aから作ったマスト
var 過去のテセウスの船状態 = テセウスの船.clone();
var 過去のテセウスの船参照 = テセウスの船.getPointer();

// 木材Bによって修理され、構成部品が完全に入れ替わった
var 古い木材 = null;
テセウスの船.修理(木材B, out 古い木材);
テセウスの船.構成要素表示();	// 木材Bから作った船底, 木材Bから作ったオール, 木材Bから作ったマスト
print( 古い木材.getName() ); // 木材A

// Aさんは、その船はもはや同じものとは言えないと主張した
print( テセウスの船.isEquals(過去のテセウスの船状態) ); // false

// Bさんは、まだ同じものだと主張した
print( テセウスの船.getPointer() == 過去のテセウスの船参照 ); // true


// 置き換えられた古い部品を集めて何とか別の船を組み立てた場合...
var 古い木材から作った船 = new Ship(古い木材);
古い木材から作った船.構成要素表示();	// 木材Aから作った船底, 木材Aから作ったオール, 木材Aから作ったマスト

// Aさんは、古い木材から作った船はテセウスの船であると主張した
print( 古い木材から作った船.isEquals(過去のテセウスの船状態) ); // true

// Bさんは、古い木材から作った船はもはやテセウスの船ではないと主張した
print( 古い木材から作った船.getPointer() == 過去のテセウスの船参照 ); // false

つまり同じかどうかの判定基準に、「値の等価」「参照の等価」のどちらを使うかで結論が異なる。
スワンプマン問題や物質転送機/物質複製機問題もこれと同じ考え方ができる。



wikipediaにある『「同じ」の定義』による解答の試みと似ているが、wikipedia側は「質的(qualitatively)」、「数的(numerically)」という区分けになっている。「参照」という概念はプログラマ以外には馴染みがないものなので、こういう書き方になっているのだろうか。
http://ja.wikipedia.org/wiki/%E3%83%86%E3%82%BB%E3%82%A6%E3%82%B9%E3%81%AE%E8%88%B9#.E3.80.8C.E5.90.8C.E3.81.98.E3.80.8D.E3.81.AE.E5.AE.9A.E7.BE.A9


人間は、自我に近いものに対しては「参照の等価」を、遠いものに対しては「値の等価」を使おうとする傾向があるように思われる。
スワンプマンは「参照の等価」によって比較され、「自分ではない」と判断されるが、物質転送機で転送された自分の鞄は「値の透過」によって比較され、「自分の鞄だ」と判断される。