前言 废话

最近我都挺佛系的……没有想着开坑,也没有想填以前的坑。

有时候偶然碰到楼下教室的羿,我回想起自己十月份考CSP-J差3.5分晋级当初就是死在逻辑运算,我没看懂运算符,感觉自己实力还是不够。今天整理房间,才发现自己在疫情期间买的《程序员的数学》还没看几个章节,就躺在床头吃了几个月的灰……

肝疼

逻辑非

这里把第一章跳过了,因为第一章主要是在讲“数”,比较有价值的是各个进制。但这些大家都会吧?

非运算在编程中是比较常用的逻辑运算。下面是一个确切的例子:

一个词本身就包含了它的相反意义。比如说‘好’,有了像‘好’这样的词,还有什么必要存在另一个词‘坏’?‘不好’一样管用嘛——而且还要更好些,因为它是更准确的反义词。再比如,要是你需要比‘好’语气强一些的词语,有什么道理存在一连串像‘很棒’、‘一流’这样含义不明的无用词语?‘加好’就能涵盖这个意义,如果你需要语气更强一点,就用‘加加好’。当然,我们已经在使用这些词形,但在最终版本的新话里,不会再有别的词。到最后,只用六个词,就能全部涵盖好和坏的意义——实际上只是一个词。你难道看不出这有多妙吗,温斯顿? ——乔治·奥威尔《1984》

那么,当A这个命题且为时,非A即为不好

命题A的非可以有几种写法(摘自维基百科):

  • $\overline{A}$(A上加一横) //书中对于“逻辑非”运算的写法

  • $\sim{A}$

  • $\lnot{A}$ //书中对于“逻辑非”运算的写法,这个比较常用

  • $NOT A$

  • $!A$ //源码中经常这么写

以上可以读做”A不成立”或者”非A”。

真值表

用真值表来表示为:

$A$ $\lnot{A}$
True False
False True

真值表没有遗漏,覆盖到了所有情况。

文氏图

A

not A

由此可得,逻辑非的定义为:

  • 当命题$A$为True时,$\lnot{A}$为False
  • 当命题$A$为False时,$\lnot{A}$为True

真值表没有遗漏和重复,兼顾完整性和排他性。

此外,双重否定等于肯定,即$\lnot{\lnot{A}} = A$ 。

老大哥$2\times{10^{1024} }$加好!

逻辑与

逻辑与表示两种命题都为真。

A是“我喜欢蕾姆”这一命题,B是“我喜欢魂魄妖梦”这一命题。

AB我都符合,我就能自信地说:

我既喜欢蕾姆又喜欢魂魄妖梦!

自信.jpg

也可以记作${A}\wedge{B}$。

真值表

$A$ $B$ ${A}\wedge{B}$
True True True
True False False
False True False
False False False

文氏图

A and B

A 与 B 不可兼得: not (A and B)

如阴影部分,文氏图粗略但直观地展现了A与B的关系。

逻辑或

现在,A使用阴阳玉可以退治妖怪这个命题,B使用符卡可以退治妖怪

只要AB两个命题中有一个命题为真,那么A或者B这个命题为,即带了阴阳玉或者符卡就能退治妖怪。这种运算就叫作逻辑或

退  治  警  告

AB,可以表示为${A}\vee{B}$。

真值表

$A$ $B$ ${A}\vee{B}$
True True True
False True True
True False True
False False False

文氏图

A or B

异或

异或这种运算类似逻辑或,但是,它与逻辑或最大的区别在于,当AB两个命题都为时,A异或B这个命题为

准确来说,A异或B,当AB之间只有一个命题为真时,结果为,当A命题与B命题都为真或为假的时候,结果为

写法:${A}\oplus{B}$。

真值表

$A$ $B$ ${A}\oplus{B}$
True True False
False True True
True False True
False False False

文氏图

A XOR B

相等

这个是我们生活中接触的最多的运算符。

A命题为真,B命题也为真时,A与B相等这个命题成立。那么可以得到的是,只有AB都为真或假的时候,A与B相等这个命题才会成立。

记作:$A=B$

蕴含

可以这样理解:假如小明的爸爸对小明承诺,只要小明离散数学考了100分,就给他买iPhone 7。这个例子中,$p$是“小明离散数学考了100分”,$q$是“小明爸爸给小明买iPhone 7”。假如$p$为真,也就是小明考了100分,如果此时$q$为假,那爸爸的承诺${p}\Rightarrow {q}$就为假。假如$p$为假,那无论小明他爸给不给他买iPhone 7,都不会违背那个承诺,也就是${p}\Rightarrow {q}$为真。因此,只有当$p$为真,$q$为假时,${p}\Rightarrow {q}$才为假。 ——知乎答主 阳光伤了狗眼

我自己当时都没整明白……

真值表

$p$ $q$ ${p}\Rightarrow {q}$
True True True
True False False
False True True
False False True

如上,只有$p = True$且$q = False$时,${p}\Rightarrow {q} = False$。除了这一种情况,${p}\Rightarrow {q} = True$。由此可得,只要前提条件$p$为False,则不论$q$的真假,${p}\Rightarrow {q}$的值恒为True

文氏图

p -> q

德·摩根定律

类似于乘法中的分配律, $\left ( \neg A \right ) \vee \left ( \neg B \right ) $可以简化为$\neg \left ( A \wedge B \right ) $;而$\left ( \neg A \right ) \wedge \left ( \neg B \right ) $也可以简化为$\neg \left ( A \vee B \right ) $。

  • $\left ( \neg A \right ) \vee \left ( \neg B \right ) = \neg \left ( A \wedge B \right ) $ //“非A”或者“非B”等于“非 ‘A与B’ ”
  • $\left ( \neg A \right ) \wedge \left ( \neg B \right ) = \neg \left ( A \vee B \right ) $ //“非A” 且 “非B”等于“非 ‘A或B’”

这被称为德·摩根定律。我差点记成摩尔定律……

真值表

$A$ $B$ $\left ( \neg A \right ) \vee \left ( \neg B \right ) $ $\neg \left ( A \wedge B \right ) $ $\left ( \neg A \right ) \wedge \left ( \neg B \right ) $ $\neg \left ( A \vee B \right ) $
True True False False False False
True False True True False False
False True True True False False
False False True True True True

对偶性

分别将True和False、$A$和$\neg A$、$\vee$和$\wedge$互换,就能得到该逻辑表达式的否定式。这就是逻辑表达式的对偶性。

包含 未定义 的逻辑

三值逻辑:在程序中,逻辑除了真(True)与假(False),还有一种“得不到值”的情况,即 未定义(Undefined)。

带条件的逻辑与 (&&)

直接上真值表:

$A$ $B$ $A\&\&B$
True True True
True False False
True Undefined Undefined
False True False
False False False
False Undefined False
Undefined True Undefined
Undefined False Undefined
Undefined Undefined Undefined

由此可以得出:

  • 不包含Undefined时,$A \&\& B = A \wedge B $
  • $A$为True时,$A\&\&B = B$;
  • $A$为False时,$A\&\&B$恒为False;
  • $A$为Undefined时,$A\&\&B$恒为Undefined。

在判断$A\&\&B$的真伪时,应根据条件A判断是否需要B,因此称为带条件的逻辑与。

此外,$A\&\&B \ne B\&\&A$。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

//这一段

if(A && B){
//etc...
}

//和这一段

if(A){
if(B){
//etc...
}
}

//本质上没有什么区别

//运算符&&可以运用于下面的逻辑

if(check() && execute()){
//etc...
}

//若 check() 返回False,就不会执行 execute()

未完待续https://img.bkryofu.xyz/