Computer programs are new kinds of machines with great potential for improving the quality of life. In particular, expert systems could improve the ability of the small, weak and poor members of society to access the information they need to solve their problems. However, like most areas of computing, expert systems design is currently practiced as an art. In order to realise its potential it must also become an engineering science: providing the kinds of assurances of reliability that are normal in other branches of engineering. The way to do this is to put the techniques used to build expert systems and other artificial intelligence programs onto a sound theoretical foundation. The tools of mathematical logic appear to be a good basis for doing this, but we need to be imaginative in their use-not restricting ourselves to the kind of deductive reasoning usually thought of as 'logical', but investigating other aspects of reasoning, including uncertain reasoning, making conjectures and the guidance of inference. Acknow ledgement