Problem Solving for Teaching and Learning