If I have sets V and W, I can define duals V* and W* as function spaces, V*={v|v:V→R}, i.e. the spaces of functions from the space into (in this case) R. Given a function f:V→W, then given w*∈W*, we can define v*∈V*: ∀ v∈V, v*(v)=w*(f(v)). Thus f implies a map f*:W*→V*, the adjoint of f.

In the case in which V and W have extra structure, I usually define my dual to be a restricted set of the duals defined above; in particular, if V and W are vector spaces, I can define V* and W* to include only linear maps. Then any linear map from V to W implies a linear adjoint from W* to V*. There exist isomorphisms between V and V*; choosing such an isomorphism is equivalent to choosing something of an inner product, ⟨v

_{1},v

_{2}⟩=v

_{1}*(v

_{2}), though one would typically want to restrict the choice of isomorphism such that this is symmetric. Defined this way, V** is (canonically isomorphic to) V, at least for finite dimensions.

I also don't need to use R; in particular (and the main point of this post), if I use instead the set {0,1} then V* is (canonically isomorphic to) the set of subsets of V (the relevant subset being the set of elements such that v*(v)=1), and the adjoint f*:W*→V* takes sets in W to their preimages (under f).