To bridge the gap with programming, make a map f: S -> bool which represents our predicate.
all(f, S) => either S is empty or for all elements s in S, f(s) = True.
Now make f work on sets as well as individual values. f({x, y}) means True if f(x) and f(y) are True, False otherwise.
all(f, S) => all(f, P(S))
If we take the opposite and define all(f, {}) = False then this doesn't work and in addition all(f, P(S)) = False for all sets S.
To bridge the gap with programming, make a map f: S -> bool which represents our predicate.
all(f, S) => either S is empty or for all elements s in S, f(s) = True.
Now make f work on sets as well as individual values. f({x, y}) means True if f(x) and f(y) are True, False otherwise.
all(f, S) => all(f, P(S))
If we take the opposite and define all(f, {}) = False then this doesn't work and in addition all(f, P(S)) = False for all sets S.