There is a public list of predicates, $f, g, h,\dots$, we want to prove we’ve satisfied a predicate but without revealing which one.
We can prove we’ve satisfied a predicate, but the proof reveals which predicate was satisfied (the predicate inputs are note revealed).
$$ (\pi,f)\larr \text{Prove}(f(x)=0) $$
Then to verify the proof that the predicate is satisfied, we need to provide the proof along with the reference to the predicate that we are verifying.
$$ \text{Verify}(\pi, f)=0 $$
We want to hide which predicate is being evaluated here but as it stands, validators need to know the predicate to verify proofs.
Zexe’s insight here is that one layer of recursion gets us function privacy.
We construct a second proof system, that is used to prove the verification of the predicates:
$$ \pi^2\larr \text{Prove}^2(\text{Verify}(\pi_1, f)=0) $$
This $\pi^2$ is the proof that some predicate was satisfied, nothing else is revealed.
A hardened version of this idea needs to prove a few more statements here beyond just a predicate being satisfied. (e.g. we need to prove that the predicate being satisfied is a member of the set of predicates we all agree on, and that the predicate attached to the input note is being evaluated)