Notes on Logic

Harold Nelson

2023-03-13

Basics

Three operations

Three posible values

Basic Tables

The traditional basic truth table contains every possible combination

P = c(T,T,F,F)
Q = c(T,F,T,F)

basic = data.frame(P,Q)
basic
##       P     Q
## 1  TRUE  TRUE
## 2  TRUE FALSE
## 3 FALSE  TRUE
## 4 FALSE FALSE

Definitions

P_and_Q = P & Q
P_or_Q = P | Q
not_P = !P

definitions = cbind(basic,P_and_Q,P_or_Q,not_P)
definitions
##       P     Q P_and_Q P_or_Q not_P
## 1  TRUE  TRUE    TRUE   TRUE FALSE
## 2  TRUE FALSE   FALSE   TRUE FALSE
## 3 FALSE  TRUE   FALSE   TRUE  TRUE
## 4 FALSE FALSE   FALSE  FALSE  TRUE

Problem

How do we extend the basic table to include the possibility of NA?

Solution

P = c(rep(T,3),rep(F,3),rep(NA,3))
Q = c(rep(c(T,F,NA),3))

ext_basics = data.frame(P,Q)
ext_basics
##       P     Q
## 1  TRUE  TRUE
## 2  TRUE FALSE
## 3  TRUE    NA
## 4 FALSE  TRUE
## 5 FALSE FALSE
## 6 FALSE    NA
## 7    NA  TRUE
## 8    NA FALSE
## 9    NA    NA

Extended Definitions

Create a new truth table showing how the basic oerations work with three possible values.

Solution

P_and_Q = P & Q
P_or_Q = P | Q
not_P = !P

ext_definitions = data.frame(P,Q,P_and_Q,P_or_Q,not_P)
ext_definitions
##       P     Q P_and_Q P_or_Q not_P
## 1  TRUE  TRUE    TRUE   TRUE FALSE
## 2  TRUE FALSE   FALSE   TRUE FALSE
## 3  TRUE    NA      NA   TRUE FALSE
## 4 FALSE  TRUE   FALSE   TRUE  TRUE
## 5 FALSE FALSE   FALSE  FALSE  TRUE
## 6 FALSE    NA   FALSE     NA  TRUE
## 7    NA  TRUE      NA   TRUE    NA
## 8    NA FALSE   FALSE     NA    NA
## 9    NA    NA      NA     NA    NA

Demorgan’s Law(s)

How can we prove Demorgan’s laws in R? We need to worry about the NA cases.

Solution

exp1 = !(P & Q)
exp2 = !P | !Q
check = data.frame(exp1,exp2)
check
##    exp1  exp2
## 1 FALSE FALSE
## 2  TRUE  TRUE
## 3    NA    NA
## 4  TRUE  TRUE
## 5  TRUE  TRUE
## 6  TRUE  TRUE
## 7    NA    NA
## 8  TRUE  TRUE
## 9    NA    NA

Is Visual Necessary

Could we just ask if exp1 and exp2 are the same?

Solution

exp1 == exp2
## [1] TRUE TRUE   NA TRUE TRUE TRUE   NA TRUE   NA

We aren’t sure that the NA values were created by NA values in both. How could we check for this?

Solution

exp1 == exp2 | (is.na(exp1) == is.na(exp2))
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE