Hej,
nie mam pomysłu jak zrobić program który oblicza domknięcia tranzytywne zbioru atrybutów, coś takiego:
z danych wejściowych:
Atrybuty relacji (oddzielone przecinkami):

A,B,C,QX

Zbiór zależności funkcyjnych:

A -> B;
QX -> C;
B,C -> A

Zrobić:
Domknięcia:

{A}+ = {A, B}
{B}+ = {B}
{C}+ = {C}
{QX}+ = {C, QX}
{A, B}+ = {A, B}
{A, C}+ = {A, B, C}
{B, C}+ = {A, B, C}
{A, QX}+ = {A, B, C, QX}        <- Minimalny klucz kandydujący
{B, QX}+ = {A, B, C, QX}        <- Minimalny klucz kandydujący
{C, QX}+ = {C, QX}
{A, B, C}+ = {A, B, C}
{A, B, QX}+ = {A, B, C, QX}     <- Nadklucz
{A, C, QX}+ = {A, B, C, QX}     <- Nadklucz
{B, C, QX}+ = {A, B, C, QX}     <- Nadklucz
{A, B, C, QX}+ = {A, B, C, QX}  <- Nadklucz

na razie wgrałam dane w taki sposób (pewnie też trochę nieudolnie), dalej nie wiem jak, przede wszystkim teraz nie wiem jak wypisać wszystkie kombinacje tych zbiorów. HELP :(

print("Prosze podac atrybuty relacji oddzielone przecinkami")
x = input().split(sep=',')
print("Prosze podac zbior zaleznosci funkcyjnych")
tab=[]
for i in range(int(input())):
przed, po = input().split(sep='->')
dane = [przed, po]
tab.append(dane)
print(x)
print(tab)

Chciałabym, żeby to działało na każdy przypadek, a nie tylko w tym konkretnym