IEnumerable <T> Eval(Node expr, T root) { if (expr is App) { var app = (App)expr; var op = app.Operation; var lhs = app.Operands[0]; var rhs = app.Operands[1]; var res = _ops .DepthFirstSearch(root, r => Satisfies(lhs, r)) .SelectMany(n => _ops.Navigate(n, op)) .Where(n => Satisfies(rhs, n)); foreach (var c in res) { yield return(c); } } else { var res = _ops.DepthFirstSearch(root, r => Satisfies(expr, r)); foreach (var c in res) { yield return(c); } } yield break; }