Projekty IB015

Množiny

V Úvodu do informatiky jste se asi potkali s pojmem množiny. Ve studijním textu najdeme definováno několik relací a operací na množinách. Uveďme si teď malý přehled:

Neprázdnou množinu A s konečným počtem prvků lze zadat výčtem jako A={a1,…,an}, prázdnou množinu označujeme ∅. Sjednocení množin A a B se značí A ∪ B, průnik A ∩ B, rozdíl A \ B. Relace a ∈ A, A = B, A ⊂ B asi také znáte. Mohutností (kardinalitou) množiny označujeme počet jejích prvků.

Uvažujme následující abstraktní gramatiku. (Abstraktní gramatika odhlíží od přesné podoby jazyka, jako jsou oddělovače, závorkování apod. Slouží pouze k (orientačnímu) vyjádření jeho struktury. Pro rozpoznávání slov daného jazyka je potřeba ji zjednoznačnit a doplnit o chybějící technické detaily. ):

Výraz	  ::= Množina | Mohutnost | Výrok
Výrok	  ::= identifikátor ∈ Množina | Množina = Množina | Množina ⊂ Množina | NOT Výrok | Výrok AND Výrok | Výrok OR Výrok
Množina	  ::= ∅ | { Seznam } | Množina ∪ Množina | Množina ∩ Množina | Množina \ Množina
Seznam	  ::= identifikátor | Seznam , identifikátor
Mohutnost ::= card(Množina)

Zde „identifikátor” označuje jakýkoli řetězec složený z malých písmen a z čísel. Pokud někoho zmátla definice pro Seznam, pak vězte, že je to totéž, jako

Seznam ::= identifikátor (, identifikátor)*

Vaším úkolem je napsat program, který přečte vstup napsaný podle této gramatiky a odpoví takto:

  • pokud vstupem je množina, zapíše ji výčtem prvků
  • pokud byl vstupem výrok, vypíše jeho pravdivost
  • pokud byl vstupem dotaz na mohutnost, vypíše mohutnost

Příklady:

Vstup:

({a,b,c} ∪ {b,c,d}) \ {d,maxipes}

Výstup (všimněte si zejména, že zápis množiny neobsahuje vícenásobné výskyty téhož prvku):

{a,b,c}

Vstup:

(maxipes ∈ ({a,b,c} ∪ {b,c,d}) \ {d,maxipes}) OR ({a} ⊂ {a,b})

Výstup:

True

Vstup:

card({a,maxipes,c} ∩ {maxipes,minikocka})

Výstup:

1

K tomu všemu je třeba zadefinovat vhodný datový typ k reprezentaci vstupu a rovněž zvolit podrobnou gramatiku pro vstup a implementovat jeho načítání. Možné rozšíření (za které můžete po domluvě obdržet zvýšení limitu pro počet řešitelů) je umožnění definování zkratek. Například tak, aby vstup mohl obsahovat následující definice:

A = {a,b,c}
B = {c,d,e}
C = {maxipes}
card((A ∪ B) \ C)

Odhadovaný počet řešitelů: 2.