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)