Francez and Wintner's textbook on unification grammars is aimed at students interested in computational linguistics who are at the advanced undergraduate or introductory graduate level. As stated by the authors, the book assumes a solid introductory course in syntax and a year of undergraduate mathematics, but no programming experience; I agree with this assessment. The book will also be of interest to anyone working with unification grammars—for example, an HPSG or LFG theoretician or grammar engineer, who wants to understand more about the mathematical underpinnings of the systems they are working on; even without a strong mathematics background, large portions of the book will be accessible for motivated readers with previous unification grammar experience.

Although at first glance some readers may be intimidated by the technical depth of the book, the material is made accessible by its presentation style. Concepts are introduced in stages, with frequent references to earlier concepts and sections. Each concept is introduced in prose, in relevant proofs, and by examples tied to linguistic issues, thereby reinforcing the material. Exercises are provided throughout each chapter so that readers can check their understanding as they work through the material; many of the exercises have answers provided in the back of the book. Another strength of the book is the detailed further-reading section at the end of each chapter: These provide historical background as well as an introduction to more-advanced topics.

The book comprises seven chapters, three appendices, the bibliography, and an index.

Chapter 1: “Introduction.” The introduction overviews several major issues in the syntax of natural languages (e.g., parts of speech, subcategorization, control, long-distance dependencies, and coordination). There is also an overview of formal languages and context-free grammars. These are then linked by a discussion of some of the arguments against natural languages being context-free. Building on this discussion, mildly context-sensitive languages are introduced. This chapter will serve as a review of relevant concepts for most readers.

Chapter 2: “Feature Structures.” Feature structures are introduced as a way of extending context-free grammars to express linguistic information, using examples from agreement as motivation. The connection between feature graphs, feature structures, abstract feature structures, and attribute-value matrices is presented in detail. Special attention is paid to reentrancies and cycles, two key issues in the formal and practical understanding of feature structures. Numerous graphical examples illustrate the formal proofs and help to provide the intuition behind the concepts and how they relate to one another.

Chapter 3: “Unification.” Using the structures presented in Chapter 2, unification is introduced as the mechanism to combine the information in two compatible feature structures. Again, graphical examples provide an intuitive view into the formalisms introduced. A simple, destructive algorithm for unification is introduced and linked to the formal definitions (computational aspects of unification grammars are discussed in detail in Chapter 6). Generalization is briefly discussed as the dual of unification.

Chapter 4: “Unification Grammars.” In order to capture natural language phenomena, feature structures are extended to multirooted feature structures and then combined with unification to form unification grammars. Grammar rules and derivations, along with the lexicon, are defined. Comparisons to context-free grammars and their limitations are provided to further exemplify the formal power of unification grammars.

Chapter 5: “Linguistic Applications.” The formalisms introduced in Chapters 2–4 are then used to account for a variety of linguistic phenomena, including traditional “movement” phenomena, by starting with a simple unification grammar for a fragment of English and gradually extending it. Examples are provided of where the grammar engineer must choose among different ways to formulate the grammar rules within the unification grammar formalism and how these different choices can reflect different linguistic generalizations as well as have different computational costs.

Chapter 6: “Computational Aspects of Unification Grammars.” This chapter provides a solid overview of computational complexity and then discusses how unification grammars fit into the picture. Issues with recognition and parsing are discussed. Examples are worked out in detail (e.g., showing relevant dotted rules) for context-free grammars and are then extended to unification grammars. This chapter could be skipped by those focused on theoretical and formal aspects, but it provides a practical view of the repercussions of the formal issues introduced earlier and is directly relevant for computational linguists.

There is a short concluding chapter. The three appendices comprise a list of symbols used in the book, a summary of preliminary mathematical notions, and solutions to selected exercises.

In sum, this book will be an excellent textbook for computational linguistics classes, especially in programs that have a grammar engineering track or that want to build on a strong formal language program. I also particularly recommend it for those working with unification grammars, especially with implementations of such grammars.