public HashSet<GeneratorNode> spawn(Constant op)
    {
        HashSet<GeneratorNode> spawnedSet, outSet = new HashSet<GeneratorNode>();

        // TODO: true and false are checked by comparing their
        // string representations; there should be a more graceful
        // way
        // to check for true and false
        if (op.getSymbol() == Operator.m_trueAtom.getSymbol())
        {
            // Constant TRUE, just pass on the recursive evaluation
            spawnedSet = spawn();

            if (spawnedSet != null)
            {
                foreach (GeneratorNode gn in spawnedSet)
                {
                    outSet.Add(gn);
                }
            }
        }

        else if (op.getSymbol() == Operator.m_falseAtom.getSymbol())
        {
        }

        // Constant FALSE, return empty set
        /*else
        {
            // This should never happen! All atoms should evaluate
            // down
            // to either true or false.
            assert(false);
        }*/

        return outSet;
    }