読者です 読者をやめる 読者になる 読者になる

だるろぐ

とてもだるだるした日記です http://about.daruyanagi.jp/

お知らせ

ライプニッツの法則(Leibniz' law)

数学 論理学 哲学

ライプニッツは、識別できない2つの個体はないとする不可識別者同一の原理を立てた。この原理は、Xのもつ全ての性質をYがもち同時にYがもつ全ての性質をXがもつとき、X=Yが成り立つことを示すものと解されている。

同一性 - Wikipedia

ライプニッツによれば、「同一であること」は「区別できないこと」と同値であるらしい。

自然においては、二つの存在がたがいにまったく同一で、そこに内的規定に基づく違いが発見できないなどということはなく、それゆえ、たがいに識別できない二つのものは、実は、同一の1つののものである。

真理を損失することなしに、一方が他方に代入できるものは、互いに同じである。

  1. もし X と Y が同一なら、X がもつ属性と Y がもつ属性はすべてまったく同じである。
  2. もし X がもつ属性と Y がもつ属性がすべてまったく同じなら、X と Y は同一である。
  3. もし X がもつ属性と Y がもつ属性になんらかの違いがあれば、X と Y は同一ではない。

同一性は最大限の類似性であり、最大限の類似性は同一性。ここでいう「同一性」は程度の問題ではなく、真か偽かの問題だ。

分析哲学入門 (講談社選書メチエ)

分析哲学入門 (講談社選書メチエ)


以下は全然関係ない話だけれど、たとえば以下のクラスがあるとする。

class Daruyanagi
{
    string FirstName { get; set; }
    string LastName { get; set; }
    string FullName { get { return FirstName + LastName; } }
    DateTime BirthDay { get; }

    public Daruyanagi(string first_name, string last_name)
    {
        FirstName = first_name;
        LastName = last_name;
        BirthDay = DateTime.Now;
    }
}

で、二つの Daruyanagi を生成する。

var A = new Daruyanagi();
var B = new Daruyanagi();

このとき、A と B は同一か。

ライプニッツ的には A ≠ B だろう。なぜなら、BirthDay が何ミリ秒か違うであろうから。

public static bool Equals(this Daruyanagi src, Daruyanagi dst)
{
    return (src.FirstName == dst.FirstName)
        && (src.LastName  == dst.LastName)
        && (src.BirthDay  == dst.BirthDay);
}

A.Equals(B); // => false

けれど、A がもつプロパティと B がもつプロパティがまったく同じであることから、「両方とも同じ(Daruyanagi だ)」ということもできる。

typeof(A) == typeof(B)

厳密に言えば、双方の“同一”とはまったく異なるレベルなのだけれど、日常会話ではあんまり区別されていない。後者の方は“(Daruyanagi という点で)共通している”と呼ぶべきなのかもね。

あと、仮に

class Daruyanagi
{
    DateTime BirthDay { get; set } // 書き込み可能
}

とすれば、

B.BirthDay = A.BirthDay;

することで、

A.Equals(B); // => true

になるのだけど、これはライプニッツ的に言えば“同一”ということになる。ただし、メモリ空間上には二つあるわけで、これは少し不思議な気がする。

まぁ、メモリ空間におけるアドレスを取得する組み込み関数 addressof() を定義して、Equals() に組み込めば、

public static bool Equals(this Daruyanagi src, Daruyanagi dst)
{
    return (src.FirstName  == dst.FirstName)
        && (src.LastName   == dst.LastName)
        && (src.BirthDay   == dst.BirthDay)
        && (addressof(src) == addressof(dst));
}

A.Equals(B); // => false

となるけれど。その場合は、アドレスを属性として考えているということだと思う。そこでふと疑問に思った。このような同一性の定義を受け入れるとして――

果たして、モノの属性は有限に列挙可能なのだろうか。また、確定しているのだろうか。あーでも、ライプニッツ的には

与えられた議論の言葉内で互いに区別できない対象は、その議論について同じものとみなされるべきである

で解決なのか。