public static bool MatchObjects(object obj1, object obj2, Context context) { if (obj1 == null) { if (obj2 == null) { return(true); } else { return(false); } } if (obj1 is Variable) { obj1 = (new VariableExpression((Variable)obj1)).Evaluate(context, true); } if (obj2 is Variable) { obj2 = (new VariableExpression((Variable)obj2)).Evaluate(context, true); } if (obj1.Equals(obj2)) { return(true); } if (obj1 is Variable && !(obj2 is Variable)) { Variable variable = (Variable)obj1; if (variable.Name != "_") { context.SetValue(variable.Name, obj2); } return(true); } if (obj2 is Variable && !(obj1 is Variable)) { Variable variable = (Variable)obj2; context.SetValue(variable.Name, obj1); return(true); } if (obj1 is Atom) { if (obj2 is Atom) { return(((Atom)obj1).Match((Atom)obj2)); } else { return(false); } } if (obj1 is List) { if (obj2 is List) { return(((List)obj1).Match((List)obj2, context)); } else { return(false); } } if (obj1 is Tuple) { if (obj2 is Tuple) { return(((Tuple)obj1).Match((Tuple)obj2, context)); } else { return(false); } } return(false); }