Ruby で「p と q が同値」あるいは「必要十分」、つまり
の関係を表すにはどうしたらよいでしょうか。
これはp == q
のことでも、p.equal?(q)
のことでもありません。ではなくて、
p が T ならば q も T、p が F ならば q も F
ということです。T とか F は何だということになりますが、Ruby のtrue
false
はちょっと曖昧で、Ruby の if ではnil
とfalse
が「偽」と判定されますね。この「偽」になるオブジェクトを F、それ以外のオブジェクトを T とする、という意味です。真偽表だと
p | q | p⇔q |
---|---|---|
T | T | T |
T | F | F |
F | T | F |
F | F | T |
となります。
じつは同値 EQ は、排他的論理和 XOR の否定です。なので簡単そうですが、じつは Ruby には XOR を表す演算子がありません。
ここにあるように、Ruby で XOR を表すには、!!p ^ !!q
あるいは!p ^ !q
とすればよいようです。なので同値を判定するメソッドは
def eq(p, q) !(!p ^ !q) end
とすればよいことになります。