【論理包含演算子Imp】をRubyまたは、Pythonのメソッドまたは、演算子の定義で作るプログラムを教えてください。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2018/10/27 06:37:54
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント100pt

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
id:rsc96074

 回答ありがとうございます。Rubyだと簡単にできるんですね。(^_^;
 個人的な予想としては、「(!self) || target」が出てくるのかと思っていました。(^_^;

2018/10/21 17:17:26
id:a-kuma3

今まで気にしたことがなかったのですが、組み込みのクラスで Boolean みたいのがないんですよね、Ruby って。
true と false の実体を表すクラスしかなくて、左側が固定になっちゃうので、回答に書いた感じになりました。

2018/10/21 20:15:33

その他の回答1件)

id:MIYADO No.1

回答回数1059ベストアンサー獲得回数194

ポイント10pt

命題論理で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を加えたものも無理数である」

のように、仮定が未解決問題の場合に使うものです。

id:rsc96074

 回答ありがとうございます。Rubyの関数で書いたら、次のようになるのでしょうか。

def Imp(p,q)
    return (!p) ||q
end

 でも、この質問では、クラス・メソッドを教えてほしいです。(^_^;
 ちなみに、最終的には、拙ブログのプログラムのImp関数をImpメソッドに書き直そうかと思っています。(^_^;
「Imp(p,q)」から、「p.Imp(q)」または、「p Imp q」に書き直したいです。
http://rsc.hatenablog.com/entry/20160120/1453238549

2018/10/21 10:09:22
id:MIYADO

すみません、でしたら他の人が答えるのをお待ち願います。

2018/10/21 10:47:56
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント100pt

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
id:rsc96074

 回答ありがとうございます。Rubyだと簡単にできるんですね。(^_^;
 個人的な予想としては、「(!self) || target」が出てくるのかと思っていました。(^_^;

2018/10/21 17:17:26
id:a-kuma3

今まで気にしたことがなかったのですが、組み込みのクラスで Boolean みたいのがないんですよね、Ruby って。
true と false の実体を表すクラスしかなくて、左側が固定になっちゃうので、回答に書いた感じになりました。

2018/10/21 20:15:33
  • id:Lhankor_Mhy
    Pythonは q ** p で概ね代用できそうな気がする。
  • id:a-kuma3
    これか。
    https://docs.python.jp/3/library/stdtypes.html#bltin-boolean-values
  • id:rsc96074
     コメントありがとうございます。
     順番が変わるところが、ちょっと残念ですが、確かに、上手くいくようです。(^_^;
    遠慮されずに、回答欄にどうぞ。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
    '''
    ||<
  • id:a-kuma3
    >順番が変わるところが、ちょっと残念ですが、
    Python は、演算子のオーバーロードができるので、__pow__ をオーバロードすると、それっぽくなるかもという気がしなくもなく。
  • id:Lhankor_Mhy
    たぶん、ビルトインオブジェクトの演算子オーバーロードはできなかった気がします。
    たしか、メソッド生やすのもできないので、Pythonで質問に添う形での回答は難しいかと。
  • id:rsc96074
     皆さん、回答・コメント有難うございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません