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); }