
Jeffrey Shallit 
This book focuses on a decision procedure, which is rather easy to implement as a computer program and allows one to prove many results, classical and new, in combinatorics on words. It addresses decision problems and enumeration problems on sequences that are expressible in firstorder logic. The reader will appreciate the style, which is relaxed and pleasant to read, and the numerous examples and exercises. This book is a useful complement to the previous monograph, Automatic Sequences, coauthored by Shallit and Allouche.
Yann Bugeaud  University of Strasbourg
This is a marvelous book with a very fresh approach to the decidability and structural analysis of combinatorics on words. It combines three different mathematical research topics: firstorder logic, automatic sequences, and combinatorics on words. More precisely, it interprets infinite morphic words as automatic sequences via kautomata and expresses properties (of words) in firstorder logic. Due to the decidability of such logic, decision results and structural properties of combinatorics on words are established. A crucial role in this approach is to employ a powerful software package called Walnut. The author illustrates the power of his approach by giving a huge number of results obtained by this method. Not only are old and new results proved, but even some errors in previous ones are corrected. Anybody interested in, or curious about, this topic should be enthusiastic about this masterpiece.
Juhani Karhumäki  University of Turku (Emeritus)
[Walnut] is an elegant and powerful tool that can be used with great effect in the analysis of morphic sequences...
We encourage the reader to check out the new and highly entertaining textbook for many more examples of the power of Walnut.
Robbert Fokkink, Gerard Francis Ortega, and Dan Rust,
Corner The Empress,
Arxiv preprint, 2022.
Page 55: Line 10, replace F with F_{i}. (Lucas Mol)
Exercise 41, section 7.1.1: Part (c), second term should be F_3, not F_4. (Robbert Fokkink).
Section 8.1.9: the Walnut code for "rsrun0" is wrong; it should be
def rsrun0 "n>=1 & (At t<n => RS[i+t]=@0) & RS[i+n]!=@0 & (i=0RS[i1]!=@0)":
Page 125: Line 4, delete the word "corresponding". (Lucas Mol)
Page 136: Not exactly an erratummore of an addendum. Part of Theorem 8.5.4 can be found in T. Downarowicz, Reading along arithmetic progressions, Colloq. Math. 80 (1999), 293296.
Page 233: Open Question 9.11.9 has now been solved, by the preprint at https://arxiv.org/abs/2301.11473.