2013-05-06 50 views

回答

15

p => qnot(p) or q相同,所以你可以試試!

+0

而且比(x和y)simplier或不是x。謝謝 – 2013-05-06 19:39:09

+5

TTL同意 - 但它不一定很容易看到代碼,雖然比原來簡單。一個函數 - 也就是「暗示(x,y)」 - 可能有助於更多地傳達這個想法,如果這樣的結構足夠頻繁地發生以保證名稱的話。 – user2246674 2013-05-06 19:39:44

+5

@ user2246674同意,我會建議使這個功能清晰。 – 2013-05-06 19:42:22

5

您的問題在Python中是否存在單個邏輯運算符,簡單的答案是否定的:The docs列表布爾運算,Python根本就沒有這樣的東西。

顯然,正如Juampi's answer所指出的那樣,邏輯上等價的操作有點短,但沒有一個操作符正如你問的那樣。

+0

請看看[this](http://stackoverflow.com/questions/16405892/is-there-an-implication-logical-operator-in-python/33768787#33768787)的答案。看起來不是所有內容都可以在[docs]中找到(http://docs.python.org/3.3/reference/expressions.html#boolean-operations)。 – 2015-11-18 10:11:30

+0

@ running.t它不在文檔中,因爲答案是錯誤的 - 沒有這樣的操作符,相反,它是濫用另一個操作符而發生相同的結果。使用它的最終結果將是可怕的,沒有效率的代碼可能會引入錯誤。 – 2015-11-22 14:03:50

1

基於我在這裏和那裏找到的內容,我在尋找一個蘊涵運算符的額外細節:您可以使用巧妙的hack來定義您自己的運算符。這裏是一個正在運行的示例,它帶有源代碼,可以讓我看到這個結果。

#!/usr/bin/python 

# From http://code.activestate.com/recipes/384122/ (via http://stackoverflow.com/questions/932328/python-defining-my-own-operators) 
class Infix: 
    def __init__(self, function): 
     self.function = function 
    def __ror__(self, other): 
     return Infix(lambda x, self=self, other=other: self.function(other, x)) 
    def __rlshift__(self, other): 
     return Infix(lambda x, self=self, other=other: self.function(other, x)) 
    def __or__(self, other): 
     return self.function(other) 
    def __rshift__(self, other): 
     return self.function(other) 
    def __call__(self, value1, value2): 
     return self.function(value1, value2) 

from itertools import product 

booleans = [False,True] 

# http://stackoverflow.com/questions/16405892/is-there-an-implication-logical-operator-in-python 
# http://jacob.jkrall.net/lost-operator/ 
operators=[ 
    (Infix(lambda p,q: False),     "F"), 
    (Infix(lambda p,q: True),     "T"), 
    (Infix(lambda p,q: p and q),    "&"), 
    (Infix(lambda p,q: p or q)   ,  "V"), 
    (Infix(lambda p,q: p != q)   ,  "^"), 
    (Infix(lambda p,q: ((not p) or not q)),  "nad"), 
    (Infix(lambda p,q: ((not p) and not q)), "nor"), 
    (Infix(lambda p,q: ((not p) or q)),   "=>"), 
    ] 

for op,sym in operators: 
    print "\nTruth tables for %s" % sym 

    print "\np\tq\tp %s q\tq %s p" % (sym,sym) 
    for p,q in product(booleans,repeat=2): 
     print "%d\t%d\t%d\t%d" % (p,q,p |op| q,q |op| p) 

    print "\np\tq\tr\tp %s q\tq %s r\t(p %s q) %s r\tp %s (q %s r)\tp %s q %s r" % (sym,sym,sym,sym,sym,sym,sym,sym) 
    for p,q,r in product(booleans,repeat=3): 
     print "%d\t%d\t%d\t%d\t%d\t%d\t\t%d\t\t%d" % (p,q,r,p |op| q,q |op| r, (p |op| q) |op| r, p |op| (q |op| r), p |op| q |op| r) 
     assert((p |op| q) |op| r == p |op| q |op| r) 
4

只是因爲它很有趣:x => y可能是bool(x) <= bool(y)在Python中。

+3

這是(最後)確鑿的證據,證明布爾值的「真」應該是「-1」,「假」應該是「0」! (而不是當前Python慣例中的'True == 1')。因爲那麼我們就會爲匹配布爾值的'y = x'(看起來像是從右到左的含義)匹配'x => y'。 – 2015-10-07 18:44:51

1

有一個相反的蘊涵算:

if y ** x: 
    do_sth() 

這寫着:如果y由X暗示。

https://github.com/cosmologicon/pywat

+0

是的。這正是我所期待的。而且看起來這個相反的含義是沒有記錄的,所以@Latty的回答基本上是不正確的。 – 2015-11-18 10:08:27

+1

@running。t這與'x => y'具有相同的效果,但不是用於此目的的操作符。這是電力運營商,不是合乎邏輯的運營商,而是數字運營商。它不會返回「True」或「False」,而是一個數字。這比較慢,並且可能會引入錯誤,更不用說難以理解且難以閱讀。我會*非常*建議不要這樣做,而是按照[Juampi的回答](http://stackoverflow.com/a/16405931/722121)使用'not(p)或q'。 – 2015-11-22 14:02:04

0

我認爲一個更可讀的一個班輪將

x_implies_y = y if x else True 

在你原來的例子:

if (y if x else True): do_sth()