BA, Cornell University. MS, PhD, Indiana University-Bloomington. Special interests in robotics, evolutionary computation, artificial intelligence, and cognitive science. Author of research papers on developmental robotics, neural networks, and computational models of analogy; author of the Metacat computer model of analogy. SLC, 2006–

### Current undergraduate courses

#### Data Structures and Algorithms

##### Spring

In this course, we will study a variety of data structures and algorithms that are important for the design of sophisticated computer programs, along with techniques for managing program complexity. We will use Java—a strongly typed, object-oriented programming language—throughout the course. Topics covered will include types and polymorphism, arrays, linked lists, stacks, queues, priority queues, heaps, dictionaries, balanced trees, and graphs, along with several important algorithms for manipulating these structures. We will also study techniques for analyzing the efficiency of algorithms. The central theme tying all of these topics together is the idea of abstraction and the related notions of information hiding and encapsulation, which we will emphasize throughout the course. Weekly lab sessions will reinforce the concepts covered in class through extensive hands-on practice at the computer.

###### Faculty

###### Related Cross-Discipline Paths

#### First-Year Studies: Achilles, the Tortoise, and the Mystery of the Undecidable

##### FYS

In this course, we will take an extended journey through Douglas Hofstadter’s Pulitzer Prize-winning book, *Gödel, Escher, Bach*, which has been called “an entire humanistic education between the covers of a single book.” The key question at the heart of the book is: How can minds possibly arise from mere matter? Few people would claim that individual neurons in a brain are “conscious” in anything like the normal sense in which we experience consciousness. Yet self-awareness somehow emerges out of a myriad of neuronal firings and molecular interactions. How can individually meaningless physical events in a brain, even vast numbers of them, give rise to meaningful awareness, to a sense of self? And could we duplicate such a process in a machine? Considering these questions will lead us to explore a wide range of ideas, from the foundations of mathematics and computer science to molecular biology, art, and music to the research frontiers of modern-day cognitive science and neuroscience. Along the way, we will closely examine Gödel's incompleteness theorem, mathematical logic and formal systems, the limits of computation, and the future prospects for artificial intelligence.

###### Faculty

###### Related Cross-Discipline Paths

#### Principles of Programming Languages

##### Fall

This course explores the principles of programming language design through the study and implementation of computer programs called *interpreters*, which process other programs as input. A famous computer scientist once remarked that if you don't understand interpreters, you can still write programs and even be a competent programmer; but you can't be a master. We will begin by studying functional programming, using the strangely beautiful and recursive programming language Scheme. After getting comfortable with Scheme and recursion, we will see how to design our own languages by starting from a high-level description and systematically deriving a low-level implementation through the application of a series of program transformations. Along the way, we will become acquainted with the lambda calculus (the basis of modern programming language theory), scoping mechanisms, continuations, lazy and nondeterministic evaluation, and other topics as time permits. We will use Scheme as our “meta-language” for exploring these issues in a precise, analytical way, similar to the way in which mathematics is used to describe phenomena in the natural sciences. Our great advantage over mathematics, however, is that we can test our ideas about languages, expressed in the form of interpreters, by directly executing them on the computer.

###### Faculty

### Previous courses

#### Bio-Inspired Artificial Intelligence

##### Spring

The field of artificial intelligence (AI) is concerned with reproducing the abilities of human intelligence in computers. In recent years, exciting new approaches to AI have been developed, inspired by a wide variety of biological structures and processes that are capable of self-organization, adaptation, and learning. Examples of these new approaches include evolutionary computation, artificial neural networks, autonomous robots, and swarm intelligence. This course will provide a hands-on introduction to the algorithms and techniques of biologically-inspired AI, focusing primarily on evolutionary systems, neural networks, and robotics from both a theoretical and practical standpoint. Topics to be covered include genetic algorithms, genetic programming, supervised and unsupervised neural network learning, reinforcement learning, reactive and behavior-based robot control, evolutionary robotics, and developmental robotics. Throughout the course, we will use the Python programming language to implement and experiment with these techniques in detail and to test them out on both real and simulated robots. Students will have many opportunities for extended exploration through open-ended laboratory exercises and conference work.

###### Faculty

#### Introduction to Computer Science: The Way of the Program

##### Fall

This course is an introduction to computer science and the art of computer programming using the elegant, yet easy-to-learn, programming language Python. Students will learn the principles of problem solving with a computer while gaining the programming skills necessary for further study in the discipline. Throughout the course, we will emphasize the power of abstraction and the benefits of clearly written, well-structured programs. We will begin with basic procedural programming and work our way up to object-oriented concepts such as classes, methods, and inheritance. Along the way, we will explore the fundamental concepts of algorithms and their efficiency, binary representations of data, digital logic, and recursion. Other topics include introductory computer graphics, file processing, sorting and searching algorithms, basic data structures such as lists, dictionaries, and binary trees, and some principles of game design and implementation. Weekly laboratory sessions will reinforce the concepts covered in class through extensive hands-on practice at the computer.

###### Faculty

#### Is the Singularity Near?

##### Fall

Something profound is happening on planet Earth. The past 100 years have witnessed the most rapid and far-reaching technological advances in human history. Think of the world of 1913 as compared to the world of 2013. Back then, automobiles, flying machines, and telephones were curiosities only recently invented; television, space travel, computers, mobile phones, and the Internet were unimagined and still decades in the future. What of the next 100 years? A number of serious, highly respected scientists and scholars believe that the relentlessly accelerating pace of technological change over the next few decades will transform our human civilization into something radically different, almost unrecognizable—an event that will mark the beginning of a new “posthuman” era in evolutionary history. This event, often called the Singularity, will be driven by advances in molecular biology, genetic engineering, nanotechnology, and machine intelligence. Ray Kurzweil, a well-known technologist and AI pioneer, has argued that the transition from biologically-based to technologically-based evolution is natural and inevitable and will bring enormous benefits to society. Others, taking a more pessimistic view of the human future, warn of the increasing risk of self-extinction posed by the development of ever more-powerful technologies and worry that our genes may have finally outsmarted themselves. How realistic is the Singularity scenario, and just how seriously should we take these ideas? In this course, we will explore these questions in depth, focusing in particular on developments in computational intelligence and on placing these ideas within the larger context of human and cosmic evolution.

###### Faculty

#### Quantum Computing

##### Fall

Physicists and philosophers have been trying to understand the strangeness of the subatomic world as revealed by quantum theory since its inception back in the 1920s; but it wasn't until the 1980s—more than a half-century after the development of the theory—that computer scientists first began to suspect that quantum physics might hold profound implications for computing, as well, and that its inherent weirdness might possibly be transformed into a source of immense computational power. This dawning realization was followed soon afterward by key theoretical and practical advances, including the discovery of several important algorithms for quantum computers that could potentially revolutionize (and disrupt) the cryptographic systems protecting practically all of our society’s electronic banking, commerce, telecommunications, and national security systems. Around the same time, researchers succeeded in building the first working quantum computers, albeit on a very small scale. Today, the multidisciplinary field of quantum computing lies at the intersection of computer science, mathematics, physics, and engineering and is one of the most active and fascinating areas in science—with potentially far-reaching consequences for the future. This course will introduce students to the theory and applications of quantum computing from the perspective of computer science. Topics to be covered will include bits and qubits, quantum logic gates and reversible computing, Deutsch’s algorithm, Grover's search algorithm, Shor’s factoring algorithm, and applications to cryptography. No advanced background in physics, mathematics, or computer programming is necessary beyond a basic familiarity with linear algebra. We will study the quantitative, mathematical theory of quantum computing in detail but will also consider broader philosophical questions about the nature of physical reality, as well as the future of computing technologies.

###### Faculty

#### The Computational Beauty of Nature

##### Spring

This course will explore the concepts of emergence and complexity within natural and artificial systems. Simple computational rules interacting in complex, nonlinear ways can produce rich and unexpected patterns of behavior and may account for much of what we think of as beautiful or interesting in the world. Taking this as our theme, we will investigate a multitude of topics, including fractals and the Mandelbrot set, chaos theory and strange attractors, cellular automata such as Wolfram’s elementary automata and Conway’s Game of Life, self-organizing and emergent systems, artificial neural networks, genetic algorithms and artificial life, Turing machines, and quantum computation. The central questions motivating our study will be: How does complexity arise in Nature? Can complexity be quantified and objectively measured? Can we capture the patterns of Nature as computational rules in a computer program? What is the essence of computation, and what are its limits? Throughout the course, we will emphasize computer experimentation rather than programming, using the computer as a laboratory in which to design and run simulations of complex systems and observe their behaviors.

###### Faculty

#### The Way of the Program: An Introduction to Computer Science

##### Fall

This course is an introduction to computer science and the art of computer programming using the elegant, yet easy-to-learn, programming language Python. Students will learn the principles of problem solving with a computer, while gaining the programming skills necessary for further study in the discipline. Throughout the course, we will emphasize the power of abstraction and the benefits of clearly written, well-structured programs. We will begin with basic procedural programming and work our way up to object-oriented concepts such as classes, methods, and inheritance. Along the way, we will explore the fundamental concepts of algorithms and their efficiency, binary representations of data, digital logic, and recursion. Other topics include introductory computer graphics; file processing; sorting and searching algorithms; basic data structures such as lists, dictionaries, and binary trees; and some principles of game design and implementation. Weekly laboratory sessions will reinforce the concepts covered in class through extensive, hands-on practice at the computer.