Hi Eric, Firstly - in this case, without knowing more about your problem, you might actually get better results if you don't try and restrict your types like this and actually allow 'or' and 'and' to accept an 'if' and ensure that the 'if' will return something that can be interpreted by the 'or' and 'and' - even if the 'if' just passes through it's boolean check, or returns whether the first or second path was taken. It may look weird, but the extra flexibility may result in a better answer. Now, if you do want to proceed with the type restrictions, then what you're looking for is 'set' types. The only thing I'm confused about is whether you actually do allow your 'if' node to take another 'if' as it's first parameter. I had assumed that your 'if' node would not be returning anything as you don't want it used in your 'and' and 'or' nodes and I had also assumed that the first parameter of your 'if' node was a 'boolean' check... but anyway, I'll lay out the problem exactly as you specified: gp.type.a.0.name = void-sort-of gp.type.a.1.name = boolean gp.type.a.size = 2 gp.type.s.0.name = boolean-and-void gp.type.s.0.size = 2 gp.type.s.0.member.0 = void-sort-of gp.type.s.0.member.1 = boolean gp.type.s.size = 1 gp.nc.0 = ec.gp.GPNodeConstraints gp.nc.0.name = if-constraint gp.nc.0.returns = void-sort-of gp.nc.0.size = 3 gp.nc.0.child.0 = boolean-and-void gp.nc.0.child.1 = boolean-and-void gp.nc.0.child.2 = boolean-and-void gp.nc.1 = ec.gp.GPNodeConstraints gp.nc.1.name = boolean-constraint gp.nc.1.returns = boolean gp.nc.1.size = 2 gp.nc.1.child.0 = boolean gp.nc.1.child.1 = boolean gp.nc.size = 2 Then you'd use 'if-constraint' for your 'if' node and 'boolean- constraint' for your 'and' and 'or' nodes. Hope that helps, Michael On 28/11/2008, at 1:52 AM, Eric B wrote: > Hello, > > I'd like to put constraints on my nodes. I have 3 functions: 'if', > 'or', > 'and' with arity respectively 3, 2, 2. I also have 9 terminals. > > The if-function can accept ANYTHING as its parameters (including > another if) > while 'or' and 'and' should accept everything EXCEPT 'if'. So for > example > and( or(T, T), T) is acceptable while and(if(T,T,T),or(T,T)) is not > because > of the 'if' where 'T' represents a random terminal. > > If I could define 2 types: one more 'general' than the other my > problem > would be solved. However, as far as I know, this is not included in > ECJ. > > > Anyone can help me? (I prefer to not mess with the Tree Builders, > putting > these constraints in the .params file is of course prefered)