expression resolving and symbolic execution
treat calls to :[] as left join; treat calls to :empty? as the 'no' unary operator