ruby のメソッド表現で良ければ、こんな感じになるかと。
def true.imp q q end def false.imp q true end
a = 1 b = 2 p (a == b).imp true # => true p (a != b).imp true # => true p (a == b).imp false # => true p (a != b).imp false # => false
命題論理でp→qというのは(not p) or qのことです。Rubyの記号だと(!p) ||qです。
しかしですよ、それはかなり人工的です。例えば、「人は死すべきものである」というのは命題論理の「ならば」ではなく、述語論理です。
「全てのxに対して、xが人であるならばxは死すべきものである」
という意味です。命題論理の意味では普通は使いません。
「ネコが動物であるならば、1+1=2である」
「ネコが動物であるならば、1+1=3である」
「ネコが植物であるならば、1+1=2である」
「ネコが植物であるならば、1+1=3である」
これらは2番目が偽で、それ以外は真ということになりますが、しかし人工的です。普通はそんなことは言いません。論理学の教材に人工的な例が書いてあるぐらいです。普通に使うのは
「オイラー定数が無理数であるならば、オイラー定数に1を加えたものも無理数である」
のように、仮定が未解決問題の場合に使うものです。
https://docs.python.jp/3/library/stdtypes.html#bltin-boolean-values
順番が変わるところが、ちょっと残念ですが、確かに、上手くいくようです。(^_^;
遠慮されずに、回答欄にどうぞ。p(^-^)q
>|Python|
import itertools
def Imp(p,q):
return (not p) or q
for p,q in itertools.product((True,False),repeat=2):
print('%s --> %s : %s, %s'%(p,q,Imp(p,q),bool(q**p)))
'''
●実行結果
True --> True : True, True
True --> False : False, False
False --> True : True, True
False --> False : True, True
'''
||<
Python は、演算子のオーバーロードができるので、__pow__ をオーバロードすると、それっぽくなるかもという気がしなくもなく。
たしか、メソッド生やすのもできないので、Pythonで質問に添う形での回答は難しいかと。