Solving Problems by Analogy