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–

## Undergraduate Courses 2019-2020

### Computer Science

#### The Computational Beauty of Nature

##### Open , Lecture—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, formal models of computation such as Turing machines, artificial neural networks, genetic algorithms, and artificial life. 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 mathematical concepts and 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

#### Quantum Computing

##### Intermediate , Seminar—Fall

*Prerequisite: Familiarity with linear algebra or equivalent mathematical preparation.*

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; it 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, quantum teleportation, 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

###### Related Disciplines

#### Data Structures and Algorithms

##### Intermediate , Seminar—Spring

*Students should have at least one semester of programming experience in an object-oriented language such as Python, Java, or C++.*

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. Throughout the course, we will use Java, a strongly typed, object-oriented programming language. Topics covered will include types and polymorphism, arrays, linked lists, stacks, queues, priority queues, heaps, dictionaries, balanced trees, and graphs, as well as several important algorithms for sorting, searching, and manipulating structured data. We will also study some mathematical 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

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

##### Open , Lecture—Fall

This lecture course is a rigorous introduction to computer science and the art of computer programming, using the elegant, eminently practical, yet easy-to-learn programming language Python. We will learn the principles of problem solving with a computer while gaining the programming skills necessary for further study in the discipline. We will emphasize the power of abstraction and the benefits of clearly written, well-structured programs, beginning with imperative programming and working our way up to object-oriented concepts such as classes, methods, and inheritance. Along the way, we will explore the fundamental idea of an algorithm; how computers represent and manipulate numbers, text, and other data (such as images and sound) in binary; Boolean logic; conditional, iterative, and recursive programming; functional abstraction; file processing; and basic data structures such as lists and dictionaries. We will also learn introductory computer graphics, how to process simple user interactions via mouse and keyboard, and some principles of game design and implementation. All students will complete a final programming project of their own design. Weekly hands-on laboratory sessions will reinforce the concepts covered in class through extensive practice at the computer.

###### Faculty

###### Related Disciplines

## Previous Courses

#### Bio-Inspired Artificial Intelligence

##### Intermediate , Seminar—Spring

*At least one semester of prior programming experience is expected. Students should be very comfortable programming in a high-level, object-oriented language such as Python, Java, or C++.*

The field of artificial intelligence (AI) is concerned with reproducing in computers the abilities of human intelligence. In recent years, exciting new approaches to AI have been developed—inspired by a wide variety of biological processes and structures that are capable of self-organization, adaptation, and learning. Examples of those 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 genetic algorithms, neural networks, deep learning, reinforcement learning, and robotics—from both a theoretical and practical perspective. We will use the Python programming language to implement and experiment with those techniques in detail and test them out using both simulated and real robots. Students will have many opportunities for extended exploration through open-ended, hands-on, lab exercises and conference work.

###### Faculty

###### Related Disciplines

#### Principles of Programming Languages

##### Intermediate , Seminar—Fall

*No prior knowledge of Scheme is needed, but at least one semester of prior programming experience is expected.*

This course explores the principles of programming-language design through the study and implementation of computer programs called interpreters, which are programs that process other programs as input. A famous computer scientist once remarked that if you don't understand interpreters, you can still write programs—and you can 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 develop an interpreter for a Scheme-like language of our own design, gradually expanding its power in a step-by-step fashion. Along the way, we will become acquainted with the lambda calculus (the basis of modern programming language theory), scoping mechanisms, continuations, lazy evaluation, nondeterministic programming, and other topics if time permits. We will use Scheme as our "meta-language" for exploring those 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

###### Related Disciplines

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

##### Open , FYS—Year

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 emerges, somehow, 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 those 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—and 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 Disciplines

#### The Computational Beauty of Nature

##### Open , Lecture—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; formal models of computation, such as Turing machines; artificial neural networks; genetic algorithms; and artificial life. 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 mathematical concepts and 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

###### Related Disciplines

#### Quantum Computing

##### Intermediate , Seminar—Fall

*Prerequisite: one semester of linear algebra or equivalent mathematical preparation.*

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 harnessed as 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 it 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, quantum teleportation, 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

###### Related Disciplines

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

##### Open , Lecture—Fall

This lecture presents a rigorous introduction to computer science and the art of computer programming, using the elegant, eminently practical, yet easy-to-learn programming language Python. We will learn the principles of problem solving with a computer while gaining the programming skills necessary for further study in the discipline. We will emphasize the power of abstraction and the benefits of clearly written, well-structured programs, beginning with basic imperative programming and working our way up to object-oriented concepts such as classes, methods, and inheritance. Along the way, we will explore the fundamental idea of an algorithm; how computers represent and manipulate numbers, text, and other data (such as images and sound) in binary; Boolean logic; conditional, iterative, and recursive programming; functional abstraction; file processing; and standard data structures such as lists, dictionaries, and trees. We will also learn the basics of computer graphics, how to process simple user interactions via mouse and keyboard, and some principles of game design and implementation. All students will complete a final programming project of their own design. Weekly hands-on laboratory sessions will reinforce the concepts covered in class through extensive practice at the computer.