Learning problem solving strategies using refinement and macro generation