This junior/senior level text starts with a thorough treatment of
first-order logic and its role in the foundations of mathematics. It
covers several advanced topics, not commonly treated in introductory
texts, such as Trachtenbrot's undecidability theorem, Fraïssé's
characterization of elementary equivalence, Lindström's theorem on the
maximality of first-order logic, and the fundamentals of logic
programming.