Problem solving applied to natural language generation