Domáca úloha č.3

Naprogramujte templatovu triedu konečná relácia tak aby rozumne fungovali nasledovné veci.

Relation r1 = {{1, "a"}, {1, "b"}, {2, "aa"}};
Relation r2 = {{5, "a"}, {1, "b"}, {2, "aa"}};
Relation r3 = {{1, 2}, {2, 2}, {2, 1}};
Relation r4 = {{1, 1}, {2, 2}, {2, 3}};

r1.contains({1, "a"}); //vracia true
r1.contains({1, "aa"}); //vracia false
r1.contains({1, 1}); //sa neskompiluje

auto r12a = r1 * _union_ * r2; //funguje ocakavane
auto r13a = r1 * _union_ * r3; //sa neskompiluje

auto r12b = r1 * _intersection_ * r2; //funguje ocakavane
auto r13b = r1 * _intersection_ * r3; //sa neskompiluje

auto r12c = r1 * _compose_ * r2; //na neskompiluje
auto r13c = r1 * _compose_ * r3; //funguje podla ocakavania

auto r1d = r1^-1;
auto r3e = r3^2;
auto r1e = r1^2; //neskompiluje

//bonus
auto r3f = power<2>(r3); //rychlejsia verzia, kde 2ka je fixovana compile-time.