public bool Run(XPredicate target, out List <XPredicate> solutions)
        {
            logger.LogD("Target: {0}", target);
            solutions = new List <XPredicate>();

            if (!VerifySignature(target.Signature))
            {
                logger.LogD("FAILED");
                return(false);
            }

            foreach (var c in Database.Clauses)
            {
                var clause = c.Bind(target.Clone());

                if (clause != null)
                {
                    logger.LogD("Suitable clause: {0}", clause);
                    ++logger.Indent;
                    var newTarget = clause.Predicate;

                    if (Resolve(newTarget, clause.Body, out List <XPredicate> partialSolutions, out _))
                    {
                        if (clause.Body == null && !solutions.Contains(newTarget))
                        {
                            solutions.Add(newTarget);
                        }
                        else
                        {
                            solutions.AddRange(partialSolutions);
                        }
                    }

                    --logger.Indent;
                }
            }

            if (solutions.Count != 0)
            {
                logger.LogD("SUCCESS");
                return(true);
            }

            logger.LogD("FAILED");
            return(false);
        }