An attempt was made at first to free storage that is no longer being used. As the program became more complex, data structures were shared by more and more modules, making it difficult to determine exactly how and when to free storage. Programming time was saved by ignoring the problem and allowing some memory leaks for the time being. Some of the places in the code where storage might need to be freed are marked with the keyword todoFREE . An automatic garbage collector would also solve this problem.
Many programmers improve the efficiency of their code by eliminating redundant checks.
For example, representation invariants are enforced in one part of the code and then assumed to be true in another. Given the notorious brittleness of AI programs, it was felt that each agent or module should do its best to deal with as many cases as possible and not to break in the face of unexpected input. This leads to somewhat less efficient code, but code that is more robust in the face of program modifications and new inputs. For now, rejecting unlikely possibilities saves processing time, but there is still a nonzero probability that the possibility is the correct one. When additional possibilities are introduced, additional code might also need to be added to order and prune those possibilities.