On Feb 1, 2006, at 4:19 PM, George Coles wrote:

>   I am pretty sure that this is not to be found in ECJ, but I  
> wanted to run it by the list. Is there any way to constraint nodes  
> so that you can prevent Node A from ever appearing within the  
> "scope" of Node B, i.e. anywhere below it in the tree? I don't  
> think a constraint based on return type is sufficient.

It's sufficient in some cases.  Let's say you have nodes A(x,y), B 
(x,y), C(x,y) and D().  A can't be in any tree rooted by a B.  You  
could set up types (I'll indicate atomic types with numbers, set  
types with braces) like this:

1 <- A(1,1)
1 <- B(2,2)
1 <- C(1,1)
1 <- D()

2 <- Ba(2,2)
2 <- Ca(2,2)
2 <- Da()

Or in compacter form

1 <- A(1,1)
{1,2} <- B(2,2)
1 <- C(1,1)
2 <- Ca(2,2)
{1,2} <- D()

That is, the children to B are of a different type, and you just  
repeat all legal nodes that are allowed to be under B to be of that  
type and to require kids of that type and so on.

If you need more sophisticated checking, you have to check the  
constraints manually and make sure your particular operators are  
valid.  A quick and dirty but computationally costly way to do this  
is to create a BreedingPipeline which repeatedly pulses its  
subsidiary pipeline until it gets a valid individual, and then  
returns that individual.  Then you can use that pipeline as your  
pipeline root with almost anything hung off of it.