a ConditionalClauseBuilder struct has a reference to another ClauseBuilder;
it will implicitly add the given constraint as a hypothesis to any clauses added.
This trait defines all of the helper functions used to build complex clauses.
This methods are defined here instead of on ClauseBuilder directly so that ClauseBuilder remains object-safe.