
In general, there are two main approaches to ILP. The bottom-up family of approaches (e.g. Progol) start by examining the provided examples and extract specific clauses from those and try to generalize from those specific clauses. In the top-down approaches (e.g., most neural implementations as well as Metagol and dILP ([1]})), the possible clauses are generated via a template and the generated clauses are tested against positive and negative examples. Since the space of possible clauses are vast, in most of these systems, very restrictive template rules are employed to reduce the size of the search space. For example, dILP allows for clauses of at most two atoms and only two rules per each predicate. In the above example, since \(|\mathbb {I}^2_{lt}|=18\) , this corresponds to considering only \(\binom{18}{2}\)  items from all the possible clauses (i.e., the power set of \(\mathbb {I}^2_{lt}\) ). Metagol employs a more flexible approach by allowing the programmer to define the rule templates via some meta-rules. However, in practice, this approach does not resolve the issue completely. Even though it allows for more flexibility, defining those templates is itself a complicated task which requires expert knowledge and possible trials and it can still lead to exponentially large space of possible solutions. Later we will consider examples where these kinds of approaches are practically impossible.
