Ruby で同値(必要十分)関係

Ruby で「p と q が同値」あるいは「必要十分」、つまり
 
の関係を表すにはどうしたらよいでしょうか。

これはp == qのことでも、p.equal?(q) のことでもありません。ではなくて、

p が T ならば q も T、p が F ならば q も F

ということです。T とか F は何だということになりますが、Rubytruefalseはちょっと曖昧で、Ruby の if ではnilfalseが「偽」と判定されますね。この「偽」になるオブジェクトを 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

とすればよいことになります。