Pravdivostní tabulka
Zadáno v pátek 18. 9.
K odevzdání v neděli 20. 9.
Zadání úkolu z hodiny, k odevzdání do neděle večer.
Zadání
Napište své vlastní funkce AND
, OR
, NOT
, NOR
, NAND
, XOR
, IMPL
(implikace), EQUIV
(ekvivalence). Jedná se o tradiční funkce z matematické logiky, jejich definice tím pádem můžete v případě nutnosti vyhledat na netu. S výjimkou funkce NOT
berou všechny tyto funkce dva booleany — tj. hodnoty True
nebo False
— a vrací rovněž boolean.
Nejedná se o žádné chytáky, implementace těchto funkcí bude velice jednoduchá. Například funkce AND
, která vrátí True
právě tehdy, když jsou oba její parametry True
by se dala napsat takto:
def AND(a: bool, b: bool):
return a and b
A podobně funkce NOT
se napíše jako:
def NOT(a: bool):
return not a
Pomocí těchto vašich funkcí můžete psát i složitější logické výrazy; například pokud byste chtěli napsat výraz x a zároveň (y nebo (negace x))
a zajímalo by vás, jakou hodnotu bude mít v závislosti na tom zda x
a y
budou True
či False
, můžete si v Pythonu definovat následující funkci
def logical_expression(x, y):
return AND(x, OR(y, NOT(x)))
a zkusit ji zavolat s různými hodnotami x
a y
, např.
logical_expression(True, True) # vrací True logical_expression(False, True) # vrací False
Obecně řečeno každý logický výraz bude mít tvar funkce která bere dva argumenty a vrací nějaký boolean.
Vaším úkolem je nyní napsat funkci table(expr)
, která jako argument dostane nějaký takový logický výraz (tj. funkci, která bere dva argumenty) a vypíše jeho pravdivostní tabulku, tedy jeho hodnotu pro všechny kombinace x
a y
, přičemž x
i y
nabývají pouze hodnot True
a False
.
Řáky pravdivostní tabulky odpovídají jednotlivým kombinacím True
a False
dosazeným za x
a y
a sloupce pak pořadě značí hodnotu x
, hodnotu y
a hodnotu várazu expr(x, y)
— tj. hodnotu logického výrazu, do kterého je dosazeno x
a y
.
Příklady vstupů a výstupů
Pokud by nás například zajímala pravdivostní tabulka x a zároveň (negace y)
, nejprve definujeme náš logický výraz jako funkci
def logical_expression(x, y):
return AND(x, NOT(y))
a poté na něj zavoláme naší funkci table
# Zavoláme table(logical_expression) # Vypíše se True True False # odpovídá x = True, y = True, logical_expression(True, True) True False True # odpovídá x = True, y = False, logical_expression(True, False) False True False # odpovídá x = False, y = True, logical_expression(False, True) False False False # odpovídá x = False, y = False, logical_expression(False, False)
Všimněte si, že logical_expression
je sice funkce, ale zároveň se chová jako běžná hodnota — můžeme ji poslat jako argument do jiné funkce, podobně jako obyčejné číslo nebo string.
Pro jiný logický výraz bude tabulka vypadat jinak, např. pro
def logical_expression2(x, y):
return OR(x, AND(x, y))
získáme po zavolání table
# Zavoláme table(logical_expression2) # Vypíše se True True True # odpovídá x = True, y = True, logical_expression2(True, True) True False True # odpovídá x = True, y = False, logical_expression2(True, False) False True False # odpovídá x = False, y = True, logical_expression2(False, True) False False False # odpovídá x = False, y = False, logical_expression2(False, False)