Understanding Computation
Table of Contents
Special Upgrade Offer
Preface
Who Should Read This Book?
Conventions Used in This Book
Using Code Examples
Safari® Books Online
How to Contact Us
Acknowledgments
1. Just Enough Ruby
Interactive Ruby Shell
Values
Basic Data
Data Structures
Procs
Control Flow
Objects and Methods
Classes and Modules
Miscellaneous Features
Local Variables and Assignment
String Interpolation
Inspecting Objects
Printing Strings
Variadic Methods
Blocks
Enumerable
Struct
Monkey Patching
Defining Constants
Removing Constants
I. Programs and Machines
2. The Meaning of Programs
The Meaning of “Meaning”
Syntax
Operational Semantics
Small-Step Semantics
Expressions
Statements
Correctness
Applications
Big-Step Semantics
Expressions
Statements
Applications
Denotational Semantics
Expressions
Statements
Applications
Formal Semantics in Practice
Formality
Finding Meaning
Alternatives
Implementing Parsers
3. The Simplest Computers
Deterministic Finite Automata
States, Rules, and Input
Output
Determinism
Simulation
Nondeterministic Finite Automata
Nondeterminism
Free Moves
Regular Expressions
Syntax
Semantics
Parsing
Equivalence
4. Just Add Power
Deterministic Pushdown Automata
Storage
Rules
Determinism
Simulation
Nondeterministic Pushdown Automata
Simulation
Nonequivalence
Parsing with Pushdown Automata
Lexical Analysis
Syntactic Analysis
Practicalities
How Much Power?
5. The Ultimate Machine
Deterministic Turing Machines
Storage
Rules
Determinism
Simulation
Nondeterministic Turing Machines
Maximum Power
Internal Storage
Subroutines
Multiple Tapes
Multidimensional Tape
General-Purpose Machines
Encoding
Simulation
II. Computation and Computability
6. Programming with Nothing
Impersonating the Lambda Calculus
Working with Procs
Plumbing
Arguments
Equality
Syntax
The Problem
Numbers
Booleans
Predicates
Pairs
Numeric Operations
Lists
Strings
The Solution
Advanced Programming Techniques
Infinite streams
Avoiding arbitrary recursion
Implementing the Lambda Calculus
Syntax
Semantics
Replacing variables
Calling functions
Reducing expressions
Parsing
7. Universality Is Everywhere
Lambda Calculus
Partial Recursive Functions
SKI Combinator Calculus
Iota
Tag Systems
Cyclic Tag Systems
Conway’s Game of Life
Rule 110
Wolfram’s 2,3 Turing Machine
8. Impossible Programs
The Facts of Life
Universal Systems Can Perform Algorithms
Programs Can Stand In for Turing Machines
Code Is Data
Universal Systems Can Loop Forever
Programs Can Refer to Themselves
Decidability
The Halting Problem
Building a Halting Checker
It’ll Never Work
Too good to be true
Fundamentally impossible
Other Undecidable Problems
Depressing Implications
Why Does This Happen?
Coping with Uncomputability
9. Programming in Toyland
Abstract Interpretation
Route Planning
Abstraction: Multiplying Signs
Safety and Approximation: Adding Signs
Static Semantics
Implementation
Benefits and Limitations
Applications
A. Afterword
Index
About the Author
Colophon
Special Upgrade Offer
Copyright