I get very confused with this but I think you are referring to IPredicateExpression instances whereas I only have an IPredicate - ie the result of [CustomerFields.Country == "UK"]
My intention after cloning was to invert its Negate property (so it does have state) and then use it elsewhere. So I don't think it would work.
Anyway, I now think I need to put the IPredicate into an IPredicateExpression and Negate that instead.
I found GeneralUtils.CreateUsablePredicateExpressionClone() but I will try your new PredicateExpression(filter) since that looks simpler.
Thanks.