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 2021-2022

### Computer Science

#### Artificial Intelligence and Society

##### Open, Seminar—Spring

In recent years, the field of artificial intelligence (AI) has made astonishing technical progress and has begun to assume an increasingly widespread and important role in society. AI systems can now (at least to some extent) drive cars; recognize human faces, speech, and gestures; diagnose diseases; control autonomous robots; instantly translate text from one language to another; beat world-champion human players at chess, Go, and other games; and perform many other amazing feats that just a few decades ago were only possible within the realm of science fiction. This progress has led to extravagant expectations, claims, hopes, and fears about the future of AI technology and its potential impact on society. In this course, we will attempt to peer beyond the hype and to come to grips with both the promise and the peril of AI. We will consider AI from many angles, including historical, philosophical, ethical, and public-policy perspectives. We will also examine many of the technical concepts and achievements of the field in detail, as well as its many failures and setbacks. Throughout the course, students will be asked to read texts, write responses, do follow-up research, and participate in classroom discussions. This is not a programming course, and no background in computer programming is expected or required.

###### Faculty

#### Data Structures and Algorithms

##### Intermediate, Seminar—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. 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 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

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

##### Open, Small 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

#### Principles of Programming Languages

##### Intermediate, Seminar—Fall

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

## Previous Courses

### Computer Science

#### Bio-Inspired Artificial Intelligence

##### Intermediate, Seminar—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 processes and structures 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 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

#### 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

#### 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.

###### Faculty

#### Introduction to Functional Programming

##### Open, Seminar—Spring

This course will explore the functional programming paradigm, a style of programming in which all computation is performed by applying functions to arguments. Our study of functional programming will make ample use of recursion—one of the most powerful concepts in computer science—and recursively-defined data structures such as lists, using the strangely beautiful programming language Scheme. Scheme and other functional languages provide powerful abstraction techniques for controlling the complexity of programs and a simple mathematical basis for reasoning about their correctness. Many of the most important concepts and features of modern programming languages were first introduced and studied within the framework of functional programming. Today, functional languages remain at the cutting edge of new programming-language design, and key ideas from functional programming continue to play a central role in the development of highly parallel, scalable, and distributed computing systems. Topics to be covered include recursion and its close cousin, mathematical induction; induction proofs and program correctness; mapping, filtering, and reducing lists; lambda expressions and higher-order functions; data abstraction and representation independence; infinite lists; continuations and continuation-passing style; and other topics as time permits. No prior knowledge of computer programming is necessary, though students should be comfortable with algebra and the fundamentals of mathematical thinking.

###### Faculty

#### Principles of Programming Languages

##### Intermediate, Seminar—Fall

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

#### Quantum Computing

##### Intermediate, Seminar—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 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

#### 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.