Given context free grammar I use breadth first search and left most derivation rule to generate all possible words for a given language.
For example:
rules_1 = [('s', ''), ('s', '(s)s')]
depths = 0, nodes_on_current_level = 1, nodes = ['s']
depths = 1, nodes_on_current_level = 2, nodes = ['', '(s)s']
depths = 2, nodes_on_current_level = 2, nodes = ['()s', '((s)s)s']
depths = 3, nodes_on_current_level = 4, nodes = ['()', '()(s)s', '(()s)s', '(((s)s)s)s']
depths = 4, nodes_on_current_level = 6
depths = 5, nodes_on_current_level = 12
depths = 6, nodes_on_current_level = 20
depths = 7, nodes_on_current_level = 40
It is clear that the number of nodes increases with depths. Dynamic branching factor.
Different production rules can create different number of nodes: s->()
produces 0 nodes, s->s()
produces 1 node, s->(s)s
produces 2 nodes.
Not all production rules can apply for each node: A->B(), A->(), B->B()
. For node 'A' there are 2 rules, for node 'B' only one rule.
Can you please suggest algorithm / formula how to count the number of nodes (in total and on provided depth) as a function of depth and any set of production rules? I need algorithm for nodes_on_current_level
.