static Expr MultiplyConvoultion(IContext context, Expr arg) { return arg .With(x => MultiplyExpressionExtractor.ExtractMultiply(x)) .ConvertAs<MultiplyExpr>() .With(x => { FunctionExpr lnExpr = x.Args .Where(y => y is FunctionExpr) .Cast<FunctionExpr>() .FirstOrDefault(y => context.GetFunction(y.FunctionName) is LnFunction); if(lnExpr != null) { return new ConvolutionExprBuilder(context).Power(lnExpr.Args.First(), Expr.Multiply(x.Args.Where(y => y != lnExpr))); } return null; }); }