Data Analysis - Programming

Week 1

Oefeningen met uitwerkingen

Opageve 1. Schrijf een Python programma dat de waarheidstabel van de volgende expressie produceert:
$\neg{(A \lor B)}$ (Quine's Dagger)


In [2]:
## Opgave 1 - uitwerking
for A in [False, True]:
    for B in [False, True]:
        print(A, B, not(A or B))


False False True
False True False
True False False
True True False

Opageve 2. De expressies uit opdracht 3 en 4 (in de slides) hebben een eigen naam,
$(\neg{A}) \lor B$ wordt ook wel implicatie genoemd en genoteerd als $A \implies B$,
$(A \lor B) \land \neg{(A \land B)}$ wordt ook wel exclusieve of (of xor) genoemd en genoteerd als $A \oplus B$.

De operator $\Leftrightarrow$ wordt equivalentie (gelijkheid) genoemd.
De expressie $A \Leftrightarrow B$ levert alleen True op, wanneer de waarde van $A$ gelijk is aan die van $B$.
Bedenk een expressie in $A$ en $B$ met behulp van de operatoren or, and en not die precies het resultaat van de operator equivalentie oplevert en controleer je expressie met een Python programma.

$A$$B$$A \Leftrightarrow B$
FalseFalseTrue
FalseTrueFalse
TrueFalseFalse
TrueTrueTrue

Opgave 2 - uitwerking
In de onderstaande afleiding wordt om technische reden een iets andere notatie gebruikt:

operator in wiskundige notatie operator in alternatieve notatie
$\neg{}$ -
$\lor$ |
$\land$ &

Afleiding $A \Leftrightarrow B$ met behulp van $\neg{}$, $\lor$ en $\land$:

A B A | B -(A | B) A & B -(A | B) | (A & B)
0 0 0 1 0 1
0 1 1 0 0 0
1 0 1 0 0 0
1 1 1 0 1 1

Opageve 3. Strikt genomen zijn de extra operatoren uit opgave 2 niet nodig, want je kunt ze namaken met or, and en not.
Eigenlijk kun je zelfs rondkomen met alleen or en not !
Bedenk een combinatie van or en not waarbij de waarheidstabel hetzelfde is als die van and. Controleer je expressie met een Python programma.

$A$$B$$A \land B$
FalseFalseFalse
FalseTrueFalse
TrueFalseFalse
TrueTrueTrue



Opgave 3 - uitwerking
Zie uitwerking opgave 3 voor uitleg over de gebruikte notatie.

Afleiding $A \land B$ met behulp van $\neg{}$ en $\lor$:

A B -A -B -A | -B -(-A | -B) A & B
0 0 1 1 1 0 0
0 1 1 0 1 0 0
1 0 0 1 1 0 0
1 1 0 0 0 1 1

In [3]:
## Opgave 3 - uitwerking

# controle -(-A | -B) == A & B
for A in [False, True]:
    for B in [False, True]:
        print(A, B, not(not A or not B), A and B)

# controle door computer
for A in [False, True]:
    for B in [False, True]:
        if not(not A or not B) != A and B:
            print("De expressie -(-A | -B) is niet gelijk aan (A & B) voor A", A, "en B", B)


False False False False
False True False False
True False False False
True True True True

Opageve 4. Een tautologie is een expressie die altijd waar oplevert, ongeacht de invulling van de variabelen.
De uitdrukking $A \lor \neg{A}$ is een voorbeeld van een tautologie.
Schrijf Python programma's om te bepalen of de onderstaande uitdrukkingen tautologieën zijn.
Let op: de implicatie $A \implies B$ kun je uitrekenen, als in opgave 2 beschreven, met $(\neg{A}) \lor B$

1. $(A \lor B) \implies (A \lor B)$  
2. $(A \lor B) \implies (A \land B)$  
3. $(\neg{A} \implies B) \land (\neg{A} \implies \neg{B})$  
4. $((A \implies B) \land (B \implies C)) \implies (A \implies C)$

In [4]:
## Opgave 4 - uitwerking

# controle door computer, (A or B) -> (A or B)
# uitdrukking vertaald met -(A or B) or (A or B)
is_tautology = True  ## tot het tegendeel bewezen is
for A in [False, True]:
    for B in [False, True]:
        expr = not(A or B) or (A or B)
        if not expr:
            is_tautology = False
if is_tautology:
    print("De expressie (A or B) -> (A or B) is een tautologie")
else:
    print("De expressie (A or B) -> (A or B) is geen tautologie")

# controle door computer, (A or B) -> (A and B)
# uitdrukking vertaald met -(A or B) or (A and B)
is_tautology = True  ## tot het tegendeel bewezen is
for A in [False, True]:
    for B in [False, True]:
        expr = not(A or B) or (A and B)
        if not expr:
            is_tautology = False
if is_tautology:
    print("De expressie (A or B) -> (A and B) is een tautologie")
else:
    print("De expressie (A or B) -> (A and B) is geen tautologie")

# controle door computer, (-A -> B) and (-A -> -B)
# uitdrukking vertaald met (-(-A) or B) and (-(-A) or -B)
is_tautology = True  ## tot het tegendeel bewezen is
for A in [False, True]:
    for B in [False, True]:
        expr = (not(not(A)) or B) and (not(not(A)) or not(B))
        if not expr:
            is_tautology = False
if is_tautology:
    print("De expressie (-A -> B) and (-A -> -B) is een tautologie")
else:
    print("De expressie (-A -> B) and (-A -> -B) is geen tautologie")

# controle door computer, ((A -> B) and (B -> C)) -> (A -> C)
# uitdrukking vertaald met -((-A or B) and (-B or C)) or (-A or C)
is_tautology = True  ## tot het tegendeel bewezen is
for A in [False, True]:
    for B in [False, True]:
        for C in [False, True]:
            expr = not((not A or B) and (not B or C)) or (not A or C)
            if not expr:
                is_tautology = False
if is_tautology:
    print("De expressie ((A -> B) and (B -> C)) -> (A -> C) is een tautologie")
else:
    print("De expressie ((A -> B) and (B -> C)) -> (A -> C) is geen tautologie")


De expressie (A or B) -> (A or B) is een tautologie
De expressie (A or B) -> (A and B) is geen tautologie
De expressie (-A -> B) and (-A -> -B) is geen tautologie
De expressie ((A -> B) and (B -> C)) -> (A -> C) is een tautologie

In [ ]: