public Func<bool> Call(ILiteral predicate, params IReferenceLiteral[] arguments) { // Assume that predicate is correct // Load the arguments into a simple unifier var unifier = new SimpleUnifier(); unifier.LoadArguments(arguments); // Unify using the predicate unifier.ProgramUnifier.Bind(_clauseAssignments[0].Assignments); if (!unifier.ProgramUnifier.Compile(_clauseAssignments[0].Assignments)) { // Fail if we can't unify return () => false; } // Call using the clauses return SolveAllSubclauses(_clauseAssignments.Skip(1), unifier); }