The idea behind a procedural generation system is that you input a bit of data, and it spits back a more complex dataset that was 'grown' in a logical manner according to defined rules.
A simplified programming challenge to think about for this would be something like "From a starting point, draw a random line, between a defined min and max length, at a min/max angle offset from the previous line (if any), and stop if the point falls outside of a boundary box."
However I feel that starting from a procedural generation stand point for a city is a very awkward and difficult way to go about building a game world. Starting with a procedurally generated terrain to begin building your city is a good starting point. You would then start adding 'key points' and roads connecting things. Once you have a 'core frame work', then a procedural 'in fill' function to add in all the extra things can be extremely valuable.
You shouldn't be spending time placing street lights, signs, or fire hydrants ideally, but rather build a system to populate those things for you.