A machine learning program is a program that improves its performance over time, usually by acquiring new knowledge about the tasks it is performing. This research seeks to improve our understanding of both the foundations and the practical aspects of building machine learning programs. The focus is in three directions: (a) finding ways by which learning programs can use the knowledge they already have to learn additional knowledge, (b) understanding the role of active experimentation in aiding the learning process, and (c) analyzing the constraints that different representation languages place on the learning process. To make progress in each of these areas, controlled experiments are conducted to compare different learning methods, experimentation strategies, and representation languages. The importance of this research lies in the fact that the production and debugging of software systems and expert systems is the principal cost of using computers - hardware and personnel costs are small in comparison. Machine learning techniques hold the potential for significantly enhancing the way computers can be used. Rather than programming the computer, step by step, we would like to give the computer an approximate, incomplete, and inefficient procedure for a desired task. This approximate, incomplete, and inefficient program could then be debugged, perfected, and made more efficient automatically, through the use of machine learning techniques. Computers could be efficiently taught, rather than laboriously programmed.