Well for basic arithmetic operators, we could just define `__pow__` on Predicate. In general, if Predicate (or something that corresponded to predicates) were `Expr`, then they would work just fine. The problem is that you can't represent something like `Q.zero + Q.zero`, because that would become `2*Q.zero`. 

It seems we can't hardly do anything without running into these fundamental issues in the core. That's too bad, because I only have the willpower to fix one fundamental issue in SymPy at a time. I'll have to think about a compromise.