public static IEnumerable <KeyValuePair <object, object> > logic_All (IEnumerable <Goal> g, Dictionary <object, object> substitutions) { List <Goal> goals = g.ToList(); if (goals.Count() == 1) { var goal = goals[0]; if (goal.Unify(substitutions)) { return(substitutions); } else { return(null); } } else { var values = new Dictionary <object, object>(); foreach (KeyValuePair <object, object> pair in substitutions) { values.Add(pair.Key, pair.Value); } foreach (Goal goal in goals) { var clonedDict = LogicSharp.CloneDictionaryCloningValues(substitutions); if (goal.Unify(clonedDict)) { IEnumerable <KeyValuePair <object, object> > lst = LogicSharp.DiffTwoDictionary(clonedDict, substitutions); foreach (var pair in lst) { if (!values.ContainsKey(pair.Key)) { values.Add(pair.Key, pair.Value); } else { return(null); } } } else { return(null); } } return(values); } }