The semantics of a logic program depends critically on how incomplete information is interpreted. For example, in the program “flies(X) ← bird(X), not abnormal(X),” without further information as to the abnormality of Tweety, can one conclude that Tweety flies? This paper describes how the use of three-valued (true, false, unknown) extensions of nonmonotonic logics can be used to provide a semantics for logic programs. The relationship of this semantics to circumscription, the closed world theory, autoepistemic logic, and default theory is discussed. The author shows that for each of these theories, a three-valued logic extension gives the same well-founded semantics for logic programs.