One criticism I have is the overloading of the logical or/and operators, which will create confusion in people reading code that uses Castor. The logical operators have very precise and well-understood meaning for any C/C++ programmer, and what Castor uses them for definitely isn't it. I know some other people have very liberal views about operator overloading, but they're just wrong :)
Lets put it like this: eq(x,"logical operators have very precise meaning") && eq(y, "it is well-understood meaning for any C/C++ programmer") && eq(z, "what Castor uses them for definitely isn't it") "Logic"ally you stated : x && y && z. These logical operators are used logically. :)
Also, the relation class seems to be a bit nebulous, as in it seems to embody multiple ideas. It's a fact, it's a collection of facts, or maybe it's a rule too. This criticism may not be well founded though, as I said before I'm not speaking from any experience with logic programming here.
In LP the term "relation" is essentially "some set of information". Wether the information is made up of facts, rules, facts+rules or is empty or infinite it doesn't matter. The class relation in Castor is smiply a way to carry this information around and put it to use.