/*
- expressions that form a tree
- operator objects in expressions
- relation objects that connect operators and inverses to transform expressions
*/

struct ScalarRelation {
  int arity;
  set<Operator> operations;
}

struct Operator {
  string name, symbol;
  ScalarRelation & relation;
  vector<int> input_idxs;
  vector<int> output_idxs;
};

struct OperatorExpression : Expression {
  Operator & operator;
  vector<Expression> inputs;
};

/* :D */