童威津性上等


同一であること

二つのものが等しい, ということは, 意外とめんどくさい. いや, めんどくさいのはあたりまえで, 意外でもなんでもないぞ! と思う人も居るかも知れないが, 少なくともわしにはめんどくさいように思えるのである.

ファイルで考えてみよう.

cp file1 file2

というコマンドと,

ln file1 file2

というコマンドは, どちらも file1, file2 という二つのファイル名 (シンボル) を生成する. シンボルの中身は(不正確な表現で) 同じになる. しかし, できる状況は全然違いますね. え? 区別が判らない? そんなばかな. 手元でコマンド実行してみ.

ln でできた file2 は, file1 と同一のファイルだが, cp でできた file2 は file1 とたまたま同じ内容を持っているだけ. ln でできた file2 は, file1 の内容を変更すると同じように変わる. なぜなら, 同じものだから. でも, cp でできた file2 は, file1 の内容と独立だ. あたりまえだ, でないと, cp がバックアップにならねーよ.

たまたま同じってのと, 本質的に同じってのと, 同じといっても 二つの状況があるらしいことが, これで判る.

たまたま同じってのは, つまり, わしのパソコンとあなたのパソコンが同じだ, とかそういう状況で, わりとありがちですね. 機種やメモリやディスクが同じだったら, 「同じ」ってわけです. わしのパソコンが壊れたからといって, あなたのパソコンまで壊れたりはしません. これに対して, 本質的に同じというのは, たとえば一台のパソコンを共有している場合です.

さて, 「シンボルの値は, シンボルが指示しているもの」 といった記号に関する素朴な意味論では, 本質的に同じという状況と, たまたま同じという状況が区別できません. 使用と引用 という記事の中では, シンボルの使用に関してこのような素朴な意味論を採用していましたが, 同一性に関する議論を行なう際には, 実際にはこのような意味論では 不十分というわけです.

lisp ではこの二つの状況にそれぞれ対応する関数があります. emacs lisp で言えば, 二つのシンボルがたまたま同じ値を持っているのが equal で, 同じ lisp オブジェクトの場合は eq です. つまり, eq で t なら equal は t になりますが, 逆は成り立ちません.

ここでは, 本質的に同じときを「同一である」といい, たまたま同じときに 単に「等しい」とでもしておきましょう. 同一なのと等しいのを区別するにはどうすればいいでしょう?

そう. 同一だったら, 片方が変化したらもう片方も同じように変化するはずです. 等しい場合は, そのうち違ってくることもあるはず. でも, これを同一性の定義である, とするのは, ナンか不十分な気がしますな. だって, もし同一ならそうなるだろうけれど, 片方の変化にもう片方が追随するからといって同一であるとは限らないわけですから.

こういう場合は, 問題になっている言語を実装している 下層の構造にアプローチできるとさっさと解決できます. たとえば, シンボルの中身は単なる値ではなく, 値を格納しておく箱(アドレス)であるとしておくと, 同一性の問題は一発で片付きます.

もちろん, これでは言語やその実装に依存した解決しか得られないわけで, 意味論とか偉そうげなことを言い出した割りにはショボい結論にしかなりません. でも, このアプローチには既に, 十分一般化可能なエッセンスが含まれていますね. 一般的に解決するには, こういった操作をもうすこし一般化した形式的な仕組みを 考えれば良いわけです.

ほいぃぃぃぃぃぃる

ホイールでスクロールすると region-active-p が nil になってしまうので, これを直した.


記事リストへ