<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Data Analysis - Programming
Week 1
Oefeningen met uitwerkingen
Opageve 1. Schrijf een Python programma dat de waarheidstabel van de volgende expressie produceert
Step1:  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$.
<br/>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.  
<table width="50%">
  <tr><th>$A$</th><th>$B$</th><th>$A \Leftrightarrow B$</th></tr>
  <tr><td>False</td><td>False</td><td>True</td></tr>
  <tr><td>False</td><td>True</td><td>False</td></tr>
  <tr><td>True</td><td>False</td><td>False</td></tr>
  <tr><td>True</td><td>True</td><td>True</td></tr>
</table>
Opgave 2 - uitwerking
In de onderstaande afleiding wordt om technische reden een iets andere notatie gebruikt
Step2:  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
<ASSISTANT_TASK:>
Python Code:
## Opgave 1 - uitwerking
for A in [False, True]:
    for B in [False, True]:
        print(A, B, not(A or B))
Explanation: 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)
End of explanation
## 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)
Explanation: 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$.
<br/>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.  
<table width="50%">
  <tr><th>$A$</th><th>$B$</th><th>$A \Leftrightarrow B$</th></tr>
  <tr><td>False</td><td>False</td><td>True</td></tr>
  <tr><td>False</td><td>True</td><td>False</td></tr>
  <tr><td>True</td><td>False</td><td>False</td></tr>
  <tr><td>True</td><td>True</td><td>True</td></tr>
</table>
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$ | &#124; |
| $\land$ | & |
Afleiding $A \Leftrightarrow B$ met behulp van $\neg{}$, $\lor$ en $\land$:
A | B | A &#124; B | -(A &#124; B) | A & B | -(A &#124; B) &#124; (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.   
<table width="50%">
  <tr><th>$A$</th><th>$B$</th><th>$A \land B$</th></tr>
  <tr><td>False</td><td>False</td><td>False</td></tr>
  <tr><td>False</td><td>True</td><td>False</td></tr>
  <tr><td>True</td><td>False</td><td>False</td></tr>
  <tr><td>True</td><td>True</td><td>True</td></tr>
</table>
<br/><br/>
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 &#124; -B | -(-A &#124; -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
End of explanation
## 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")
Explanation: 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)$
End of explanation
<END_TASK>