Загрузка данных


from itertools import product

def nand(a: int, b: int) -> int:
    return int(not (a and b))

def nor(a: int, b: int) -> int:
    return int(not (a or b))

def xor(a: int, b: int) -> int:
    return int((a or b) and not (a and b))

def print_row(*values) -> None:
    print(*[int(v) for v in values])

def truth_table(expr, n: int) -> dict:
    return {values: expr(*values) for values in product((0, 1), repeat=n)}

def equivalent(expr1, expr2, n: int) -> bool:
    table1 = truth_table(expr1, n)
    table2 = truth_table(expr2, n)
    return all(table1[k][-1] == table2[k][-1] for k in table1)

def show_table(title: str, expr, n: int) -> None:
    print(title)
    for values, parts in truth_table(expr, n).items():
        print_row(*values, *parts)

def task1():
    print("A B A&B NAND")
    for a, b in product((0, 1), repeat=2):
        and_part = a and b
        print_row(a, b, and_part, nand(a, b))
    # 1 1 -> 1 0

def task2():
    print("A B A|B NOR")
    for a, b in product((0, 1), repeat=2):
        or_part = a or b
        print_row(a, b, or_part, nor(a, b))
    # 0 0 -> 0 1

def task3():
    print("A B A|B A&B !(A&B) XOR")
    for a, b in product((0, 1), repeat=2):
        or_part = a or b
        and_part = a and b
        nand_part = not and_part
        print_row(a, b, or_part, and_part, nand_part, xor(a, b))
    # 0 1 -> 1 0 1 1

def task4():
    print("A !A !!A")
    valid = True
    for a in (0, 1):
        not_a = not a
        not_not_a = not not_a
        print_row(a, not_a, not_not_a)
        if bool(a) != not_not_a:
            valid = False
    print("Закон выполняется:", valid)

def task5():
    print("A B | A&B B&A | A|B B|A")
    valid_and = True
    valid_or = True
    for a, b in product((0, 1), repeat=2):
        left_and, right_and = a and b, b and a
        left_or, right_or = a or b, b or a
        print_row(a, b, left_and, right_and, left_or, right_or)
        if left_and != right_and:
            valid_and = False
        if left_or != right_or:
            valid_or = False
    print("Коммутативность И:", valid_and)
    print("Коммутативность ИЛИ:", valid_or)

def task6():
    print("A B C (A|B)|C A|(B|C)")
    valid = True
    for a, b, c in product((0, 1), repeat=3):
        left = (a or b) or c
        right = a or (b or c)
        print_row(a, b, c, left, right)
        if left != right:
            valid = False
    print("Закон выполняется:", valid)

def task7():
    # F = (A & B) | (!A & C)
    print("A B C A&B !A !A&C F")
    for a, b, c in product((0, 1), repeat=3):
        ab = a and b
        not_a = not a
        not_a_c = not_a and c
        f = ab or not_a_c
        print_row(a, b, c, ab, not_a, not_a_c, f)
    # 1 1 0 -> 1 0 0 1

def task8():
    de_morgan_left = lambda a, b: [a and b, not (a and b)]
    de_morgan_right = lambda a, b: [not a, not b, (not a) or (not b)]
    show_table("not(A and B): A B A&B result", de_morgan_left, 2)
    show_table("not A or not B: A B !A !B result", de_morgan_right, 2)
    print("De Morgan:", equivalent(de_morgan_left, de_morgan_right, 2)) # True
    f1 = lambda a, b, c: [b or c, a and (b or c)]
    f2 = lambda a, b, c: [a and b, (a and b) or c]
    print("A&(B|C) == (A&B)|C:", equivalent(f1, f2, 3)) # False
    xor_gates = lambda a, b: [a or b, not (a and b), (a or b) and not (a and b)]
    xor_neq = lambda a, b: [a != b]
    print("XOR == (A != B):", equivalent(xor_gates, xor_neq, 2)) # True

match int(input("Номер задания: ")):
    case 1:
        task1()
    case 2:
        task2()
    case 3:
        task3()
    case 4:
        task4()
    case 5:
        task5()
    case 6:
        task6()
    case 7:
        task7()
    case 8:
        task8()