<?xml version="1.0" encoding="ISO-8859-1"?>

<cv>

<name>Adam Chlipala</name>

<address>
	<city>Cambridge, MA</city>
	<country>USA</country>
	<email>adamc@hcoop.net</email>
	<url>http://adam.chlipala.net/</url>
</address>

<address1>Cambridge, MA</address1>

<address2>adamc@hcoop.net; http://adam.chlipala.net/</address2>

<objective>Not currently seeking employment</objective>
<interests>Dependent type systems; interactive theorem proving; type-based programming methodologies that integrate programming with correctness proofs</interests>
<interests>Program verification; language-based security; proof-carrying code; typed assembly language; model checking; formal methods for low-level software</interests>
<interests>Design and implementation of declarative programming languages; type systems and logics; functional programming</interests>
<interests>Automated deduction; interactive proof assistants</interests>

<specialty>
	<name>Computer theorem proving</name>

	<project>
		<name>Certified type-preserving compilers</name>
		<url>http://ltamer.sf.net/</url>
	</project>

	<project>
		<name>Certified machine code safety analysis</name>
		<url>http://proofos.sf.net/</url>
	</project>
</specialty>

<specialty>
	<name>Design, implementation, and analysis of functional programming languages</name>

	<project>
		<name>Statically-typed metaprogramming for web apps</name>
		<url>http://laconic.sf.net/</url>
	</project>

	<project>
		<name>Static types for system configuration</name>
		<url>http://wiki.hcoop.net/DomTool</url>
	</project>
</specialty>

<citizenship>American citizen</citizenship>

<month id="jan">
	<name>January</name>
</month>
<month id="feb">
	<name>February</name>
</month>
<month id="mar">
	<name>March</name>
</month>
<month id="apr">
	<name>April</name>
</month>
<month id="may">
	<name>May</name>
</month>
<month id="jun">
	<name>June</name>
</month>
<month id="jul">
	<name>July</name>
</month>
<month id="aug">
	<name>August</name>
</month>
<month id="sep">
	<name>September</name>
</month>
<month id="oct">
	<name>October</name>
</month>
<month id="nov">
	<name>November</name>
</month>
<month id="dec">
	<name>December</name>
</month>

<person id="adamc">
	<name>Adam Chlipala</name>
	<url>http://adam.chlipala.net/</url>
</person>

<person id="bec">
	<name>Evan Chang</name>
	<citeName>Bor-Yuh Evan Chang</citeName>
	<url>http://www.cs.berkeley.edu/~bec/</url>
</person>

<person id="beyer">
	<name>Dirk Beyer</name>
	<url>http://mtc.epfl.ch/~beyer/</url>
</person>

<person id="crary">
	<name>Karl Crary</name>
	<url>http://www.cs.cmu.edu/~crary/</url>
</person>

<person id="greg">
	<name>Greg Morrisett</name>
	<url>http://www.eecs.harvard.edu/~greg/</url>
</person>

<person id="jhala">
	<name>Ranjit Jhala</name>
	<url>http://www.cse.ucsd.edu/~rjhala/</url>
</person>

<person id="leaf">
	<name>Leaf Petersen</name>
	<url>http://www.cs.cmu.edu/~leaf/</url>
</person>

<person id="lucena">
	<name>Brian Lucena</name>
	<url>http://www.aucegypt.edu/faculty/lucena/</url>
</person>

<person id="maf">
	<name>Manuel Fahndrich</name>
	<url>http://research.microsoft.com/~maf/</url>
</person>

<person id="me">
	<name>Michael Erdmann</name>
	<url>http://www.cs.cmu.edu/~me/</url>
</person>

<person id="necula">
	<name>George Necula</name>
	<citeName>George C. Necula</citeName>
	<url>http://www.cs.berkeley.edu/~necula/</url>
</person>

<person id="rupak">
	<name>Rupak Majumdar</name>
	<url>http://www.cs.ucla.edu/~rupak/</url>
</person>

<person id="rwh">
	<name>Robert Harper</name>
	<url>http://www.cs.cmu.edu/~rwh/</url>
</person>

<person id="schneck">
	<name>Robert Schneck</name>
	<citeName>Robert R. Schneck</citeName>
	<url>http://math.berkeley.edu/~schneck/</url>
</person>

<person id="tah">
	<name>Thomas Henzinger</name>
	<url>http://mtc.epfl.ch/~tah/</url>
</person>

<person id="wing">
	<name>Jeannette Wing</name>
	<url>http://www.cs.cmu.edu/~wing/</url>
</person>

<org id="avaya">
	<name>Avaya Communication</name>
	<abbrev>Avaya</abbrev>
	<location>Holmdel</location>
	<location>NJ</location>
	<url>http://www.avaya.com/</url>
</org>

<org id="cmu">
	<name>Carnegie Mellon University</name>
	<location>Pittsburgh</location>
	<location>PA</location>
	<url>http://www.cmu.edu/</url>

	<org id="cmu_cs">
		<name>Computer Science Department</name>
		<url>http://www.cs.cmu.edu/</url>

		<org id="cs212">
			<name>15-212: Principles of Programming</name>
			<note>(introduction to formal reasoning about programs and functional programming with Standard ML)</note>
			<abbrev>15-212</abbrev>
			<url>http://www.cs.cmu.edu/~me/courses/212/</url>
		</org>

		<org id="tilt">
			<name>The TILT type-directed Standard ML compiler project</name>
			<abbrev>TILT</abbrev>
			<url>http://www.cs.cornell.edu/home/jgm/tilt.html</url>
		</org>
	</org>
</org>

<org id="ieee_computer">
	<name>IEEE Computer Society Press</name>
	<abbrev>IEEE</abbrev>
	<url>http://www.ieee.org/</url>
</org>

<org id="cup">
	<name>Cambridge University Press</name>
	<abbrev>CUP</abbrev>
	<url>http://www.cambridge.org/</url>
</org>

<org id="harvard">
	<name>Harvard University</name>
        <abbrev>Harvard</abbrev>
	<location>Cambridge</location>
	<location>MA</location>
	<url>http://www.harvard.edu/</url>

	<org id="harvard_seas">
		<name>School of Engineering and Applied Sciences</name>
		<url>http://www.seas.harvard.edu/</url>

                <org id="cpdt">
                        <name>COMPSCI 252: Certified Programming with Dependent Types</name>
                        <abbrev>CS252</abbrev>
                        <url>http://www.cs.harvard.edu/~adamc/cpdt/</url>
                </org>
	</org>
</org>

<org id="msr">
	<name>Microsoft Research</name>
	<abbrev>MSR</abbrev>
	<url>http://research.microsoft.com/</url>

	<org id="spt">
		<name>Software Productivity Tools group</name>
		<location>Redmond</location>
		<location>WA</location>
		<abbrev>SPT</abbrev>
	</org>

	<org id="singularity">
		<name>The Singularity project</name>
		<abbrev>Singularity</abbrev>
		<url>http://research.microsoft.com/os/singularity/</url>
	</org>
</org>

<org id="oregon">
	<name>University of Oregon</name>
	<url>http://www.uoregon.edu/</url>
</org>

<org id="trifecta">
	<name>Trifecta Technologies</name>
	<abbrev>Trifecta</abbrev>
	<location>Allentown</location>
	<location>PA</location>
	<url>http://www.trifecta.com/</url>
</org>

<org id="ucb">
	<name>University of California, Berkeley</name>
	<abbrev>Berkeley</abbrev>
	<url>http://www.berkeley.edu/</url>

	<org id="ucb_eecs">
		<name>Electrical Engineering and Computer Science Department</name>
		<abbrev>EECS</abbrev>
		<url>http://www.eecs.berkeley.edu/</url>

		<org id="ucb_cs">
			<name>Computer Science Division</name>
			<abbrev>CS</abbrev>
			<url>http://www.cs.berkeley.edu/</url>

			<org id="blast">
				<name>The BLAST project</name>
				<url>http://www.cs.ucla.edu/~rupak/blast/</url>
				<abbrev>BLAST</abbrev>
			</org>

			<org id="cs172">
				<name>CS172: Computability and Complexity</name>
				<url>http://inst.eecs.berkeley.edu/~cs172/sp05/</url>
				<abbrev>CS172</abbrev>
			</org>

			<org id="openver">
				<name>The Open Verifier project</name>
				<abbrev>Open Verifier</abbrev>
			</org>

			<org id="ictp">
				<name>CS294-9: Interactive Computer Theorem Proving</name>
				<abbrev>CS294-9</abbrev>
				<url>http://adam.chlipala.net/itp/</url>
			</org>
		</org>
	</org>

	<org id="ucb_eecs_combined">
		<name>UC Berkeley EECS Department</name>
		<url>http://www.eecs.berkeley.edu/</url>
	</org>
</org>

<org id="ehs">
	<name>Emmaus High School</name>
	<location>Emmaus, PA</location>
	<url>http://www.eastpenn.k12.pa.us/ehs/</url>
</org>

<org id="acm">
	<abbrev>ACM</abbrev>
	<url>http://www.acm.org/</url>
</org>

<org id="ieee">
	<abbrev>IEEE</abbrev>
	<url>http://www.ieee.org/</url>
</org>

<org id="springer">
	<abbrev>Springer-Verlag</abbrev>
	<url>http://www.springer.de/comp/lncs</url>
</org>

<org id="janest">
	<name>Jane Street Capital</name>
	<abbrev>Jane Street Capital</abbrev>
	<url>http://www.janestcapital.com/</url>
</org>

<event id="icse04">
	<name>26th International Conference on Software Engineering</name>
	<abbrev>ICSE'04</abbrev>
	<url>http://www.icse-conferences.org/2004/index.html</url>
	<publisher org="ieee_computer" />
	<month month="may" />
	<year>2004</year>
	<location>Edinburgh, Scotland</location>
	<copyright org="ieee" />
</event>

<event id="sas04">
	<name>11th Static Analysis Symposium</name>
	<abbrev>SAS'04</abbrev>
	<url>http://profs.sci.univr.it/~sas04/</url>
	<month month="aug" />
	<year>2004</year>
	<location>Verona, Italy</location>
	<copyright org="springer" />
</event>

<event id="icfp04">
	<name>9th ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'04</abbrev>
	<url>http://www.cs.indiana.edu/icfp04/</url>
	<month month="sep" />
	<location>Snowbird, Utah, USA</location>
	<year>2004</year>
</event>

<event id="tldi05">
	<name>2nd ACM SIGPLAN Workshop on Types in Language Design and Implementation</name>
	<abbrev>TLDI'05</abbrev>
	<url>http://research.microsoft.com/~maf/tldi05/</url>
	<month month="jan" />
	<year>2005</year>
	<location>Long Beach, California, USA</location>
	<copyright org="acm" />
</event>

<event id="lpar05">
	<name>12th International Conference on Logic for Programming, Artificial Intelligence, and Reasoning</name>
	<url>http://www.lpar.net/2005/</url>
	<abbrev>LPAR'05</abbrev>
	<month month="dec" />
	<location>Montego Bay, Jamaica</location>
	<year>2005</year>
</event>

<event id="vmcai06">
	<name>7th International Conference on Verification, Model Checking, and Abstract Interpretation</name>
	<url>http://www.informatik.uni-trier.de/~ley/db/conf/vmcai/vmcai2006.html</url>
	<abbrev>VMCAI'06</abbrev>
	<month month="jan" />
	<year>2006</year>
	<location>Charleston, South Carolina, USA</location>
	<copyright org="springer" />
</event>

<event id="lics06">
	<name>21st Annual IEEE Symposium on Logic in Computer Science</name>
	<url>http://www.easychair.org/FLoC-06/LICS.html</url>
	<abbrev>LICS'06</abbrev>
	<month month="aug" />
	<year>2006</year>
	<location>Seattle, Washington, USA</location>
</event>

<event id="icfp06">
	<name>11th ACM SIGPLAN International Conference on Functional Programming</name>
	<url>http://icfp06.cs.uchicago.edu/</url>
	<abbrev>ICFP'06</abbrev>
	<month month="sep" />
	<year>2006</year>
	<location>Portland, Oregon, USA</location>
	<copyright org="acm" />
</event>

<event id="aplas06">
	<name>4th ASIAN Symposium on Programming Languages and Systems</name>
	<url>http://www.kb.ecei.tohoku.ac.jp/aplas2006/</url>
	<abbrev>APLAS'06</abbrev>
	<month month="nov" />
	<year>2006</year>
	<location>Sydney, Australia</location>
</event>

<event id="pcc06">
	<name>International Workshop on Proof-Carrying Code</name>
	<url>http://www.cs.stevens.edu/~abc/PCC-Workshop.html</url>
	<abbrev>PCC'06</abbrev>
	<month month="aug" />
	<year>2006</year>
	<location>Seattle, Washington, USA</location>
</event>

<event id="strategies06">
	<name>6th International Workshop on Strategies in Automated Deduction</name>
	<url>http://www.easychair.org/FLoC-06/Strategies.html</url>
	<abbrev>STRATEGIES'06</abbrev>
	<month month="aug" />
	<year>2006</year>
	<location>Seattle, Washington, USA</location>
</event>

<event id="plpv06">
	<name>Programming Languages meets Program Verification Workshop</name>
	<url>http://www.easychair.org/FLoC-06/PLPV.html</url>
	<abbrev>PLPV'06</abbrev>
	<month month="aug" />
	<year>2006</year>
	<location>Seattle, Washington, USA</location>
</event>

<event id="tldi07">
	<name>3nd ACM SIGPLAN Workshop on Types in Language Design and Implementation</name>
	<abbrev>TLDI'07</abbrev>
	<url>http://www.cs.berkeley.edu/~necula/tldi07/</url>
	<month month="jan" />
	<year>2007</year>
	<location>Nice, France</location>
	<copyright org="acm" />
</event>

<event id="pldi07">
	<name>ACM SIGPLAN 2007 Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'07</abbrev>
	<url>http://ties.ucsd.edu/PLDI/</url>
	<month month="jun" />
	<year>2007</year>
	<location>San Diego, California, USA</location>
	<copyright org="acm" />
</event>

<event id="osq05">
	<name>2005 Open Source Quality Project Retreat</name>
	<abbrev>Open Source Quality Project Retreat</abbrev>
	<url>http://www.cs.berkeley.edu/~bodik/OSQ05.htm</url>
	<month month="may" />
	<year>2005</year>
</event>

<event id="osq06">
	<name>2006 Open Source Quality Project Retreat</name>
	<abbrev>Open Source Quality Project Retreat</abbrev>
	<url>http://www.cs.berkeley.edu/~bodik/OSQ06.htm</url>
	<month month="may" />
	<year>2006</year>
</event>

<event id="osq07">
	<name>2007 Open Source Quality Project Retreat</name>
	<abbrev>Open Source Quality Project Retreat</abbrev>
	<url>http://www.eecs.berkeley.edu/~sseshia/OSQ07.htm</url>
	<month month="may" />
	<year>2007</year>
</event>

<event id="gallium07">
	<abbrev>Projet Gallium seminar</abbrev>
	<url>http://www-c.inria.fr/Internet/rendez-vous/seminaires-des-equipes-de-recherche/a-certified-type-preserving-compiler-from-lambda-calculus-to-assembly-language</url>
	<month month="jan" />
	<year>2007</year>
</event>

<event id="rta07">
	<name>The 18th International Conference on Term Rewriting and Applications</name>
	<abbrev>RTA'07</abbrev>
	<url>http://www.lsv.ens-cachan.fr/rdp07/rta.html</url>
	<month month="jun" />
	<year>2007</year>
	<location>Paris, France</location>
	<copyright org="springer" />
</event>

<event id="wmm07">
	<name>The 2nd Informal ACM SIGPLAN Workshop on Mechanizing Metatheory</name>
	<abbrev>WMM'07</abbrev>
	<url>http://www.cis.upenn.edu/~sweirich/wmm/</url>
	<month month="oct" />
	<location>Freiburg, Germany</location>
	<year>2007</year>
</event>

<event id="popl08">
	<name>The 35th Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'08</abbrev>
	<url>http://www.cs.ucsd.edu/popl/08/</url>
	<month month="jan" />
	<year>2008</year>
	<location>San Francisco, California, USA</location>
	<copyright org="acm" />
</event>

<event id="vmcai08">
	<name>The 9th International Conference on Verification, Model Checking and Abstract Interpretation</name>
	<abbrev>VMCAI'08</abbrev>
	<url>http://www.cs.uic.edu/vmcai08/</url>
	<month month="jan" />
	<year>2008</year>
	<location>San Francisco, California, USA</location>
	<copyright org="springer" />
</event>

<event id="pldi08">
        <name>ACM SIGPLAN 2008 Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'08</abbrev>
	<url>http://pldi2008.cs.ucr.edu/</url>
	<month month="jun" />
	<year>2008</year>
	<location>Tucson, Arizona, USA</location>
	<copyright org="acm" />
</event>

<event id="wmm08">
        <name>3rd Informal ACM SIGPLAN Workshop on Mechanizing Metatheory</name>
	<abbrev>WMM'08</abbrev>
	<url>http://www.cis.upenn.edu/~sweirich/wmm/wmm08.html</url>
	<month month="sep" />
	<year>2008</year>
	<location>Victoria, British Columbia, Canada</location>
	<copyright org="acm" />
</event>

<event id="icfp08">
        <name>13th ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'08</abbrev>
	<url>http://www.icfpconference.org/icfp2008/</url>
	<month month="sep" />
	<year>2008</year>
	<location>Victoria, British Columbia, Canada</location>
	<copyright org="acm" />
</event>

<event id="popl09">
	<name>The 36th Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'09</abbrev>
	<url>http://www.cs.ucsd.edu/popl/09/</url>
	<month month="jan" />
	<year>2009</year>
	<location>Savannah, Georgia, USA</location>
	<copyright org="acm" />
</event>

<event id="tldi09">
	<name>4th ACM SIGPLAN Workshop on Types in Language Design and Implementation</name>
	<abbrev>TLDI'09</abbrev>
	<url>http://ttic.uchicago.edu/~amal/tldi2009/</url>
	<month month="jan" />
	<year>2009</year>
	<location>Savannah, Georgia, USA</location>
	<copyright org="acm" />
</event>

<event id="esop09">
	<name>18th European Symposium on Programming</name>
	<abbrev>ESOP'09</abbrev>
	<url>http://esop09.pps.jussieu.fr/</url>
	<month month="mar" />
	<year>2009</year>
	<location>York, United Kingdom</location>
</event>

<event id="nepls21">
	<name>21st New England Programming Languages and Systems Symposium</name>
	<abbrev>NEPLS 21</abbrev>
	<url>http://www.nepls.org/Events/21/</url>
	<month month="nov" />
	<year>2008</year>
	<location>Cambridge, MA, USA</location>
</event>

<event id="types08">
	<name>2008 TYPES Meeting</name>
	<abbrev>TYPES'08</abbrev>
	<url>http://types2008.di.unito.it/</url>
	<month month="mar" />
	<year>2008</year>
	<location>Torino, Italy</location>
</event>

<journal id="jfp">
	<name>Journal of Functional Programming</name>
	<abbrev>JFP</abbrev>
	<url>http://journals.cambridge.org/jid_JFP</url>
	<publisher org="cup" />
</journal>

<tidbit>I was the main administrator and general head honcho from about 1997 to 2001 for <a href="http://www.tpu.org/">Teen Programmers Unite</a>, the first Internet organization for young programmers.</tidbit>

<tidbit>I first became interested in programming language technology at age 15, when I wrote an ANSI C compiler targeting Texas Instruments graphing calculators.</tidbit>

<tidbit>Working as a programmer at a small Web development company during high school, I had the chance to write most of the custom code that drove the Web political campaign donation system used by Senator John McCain in his 2000 bid for the presidency, among others. After his announcement of the URL on national television, our system successfully collected \$6.4 million in donations without any serious technical difficulties, surprisingly enough.</tidbit>

<tidbit>Throughout high school, I worked on a novel virtual machine system and its development tools, including another C compiler. The bytecode language supported an unusual method for distributed execution of programs where opcode-level annotations directed different instructions to execute on different machines. I used this system to implement a shared 3D virtual world environment, with object behavior controlled by bytecode programs.</tidbit>

<tidbit>I did my undergraduate education in computer science at Carnegie Mellon University. There I learned about functional programming and became a big fan of the ML family of programming languages, which I've used in almost all of my official and side projects since then. I worked as a teaching assistant for an ML programming class and as a research assistant in a project developing a novel ML compiler.</tidbit>

<tidbit>In 2002, I founded <a href="http://hcoop.net/">HCoop</a>, the first democratically-run, public Internet hosting cooperative. Since we incorporated in 2004 as a U.S. non-profit, tax exempt corporation, I've served as the elected president of the co-op. I'm also responsible for developing new software infrastructure to support our unusual model of giving mutually-untrusting members ``almost free reign'' on shared servers. This has included developing a distributed system configuration system called <a href="http://wiki.hcoop.net/DomTool">DomTool</a>, whose latest version is based on the use of a new statically-typed, purely functional programming language to express member configuration settings, such that the language's static type system is expressive enough to rule out most potential security policy violations. The co-op recently passed the 100 member mark after expanding almost entirely through word of mouth, and we hope to begin a wide advertising campaign in the coming months after moving our latest set of servers into new colocation space.</tidbit>

<tidbit>I entered the computer science PhD program at UC Berkeley in 2003, starting out working on research projects in software model checking and proof-carrying code. These led me to discover the world of interactive computer theorem proving, which has been the focus of my research since then. In particular, I've been lucky enough to get in on the ground floor of the ``new renaissance'' in formal verification of deep correctness properties of real programs. Advances in theorem proving methods and hardware capacity have quite recently made it reasonable to move past the bad reputation that formal verification was left with in the 1980's. My recent projects have been in the design and implementation of infrastructures for building certified machine code safety analyzers and certified compilers for high-level programming languages.</tidbit>

<tidbit>I worked as a research intern at Microsoft Research in summer 2005. I was part of the <a href="http://research.microsoft.com/os/singularity/">Singularity project</a>, which is re-thinking operating system design with security and reliability in mind by writing almost all OS code in C#. I implemented the first bytecode verifier for Singularity applications that is able to check the key static properties that Singularity's security depends on, including adherence to message-passing channel communication protocols and proper manual memory management of a shared heap area.</tidbit>

<tidbit>In Fall 2006, I taught a graduate course at Berkeley on interactive computer theorem proving, focusing on highlighting practical applications outside pure math and on the engineering issues of effective proof construction.</tidbit>

<tidbit>I have a long-standing interest in programming language technology for Web development. I developed the <a href="http://smlweb.sourceforge.net/">smlweb</a> Web programming language, which today drives HCoop's member support portal. I like to describe it as a re-envisioning of PHP based on the Standard ML programming language, supporting static type checking. More recently, I created a prototype implementation of a language called <a href="http://laconic.sourceforge.net/">Laconic</a>, which uses ideas from theorem proving to support the construction of sophisticated Web applications that can be checked statically for the absence of failures across entire client-server interaction sessions.</tidbit>

<pubs>
	<pubKind id="conference" name="Refereed conference papers">

	<pub id="PhoasICFP08" kind="conference">
		<author person="adamc" />
		<title>Parametric Higher-Order Abstract Syntax for Mechanized Semantics</title>
		<proceedings event="icfp08" />

		<summary>A new trick for encoding variable binders in Coq, along with an exploration of its consequences: almost trivial syntax and type-theoretic semantics for languages including such features as polymorphism and complicated binding structure (e.g., ML-style pattern matching); almost trivial type preservation proofs for compiler passes that don't need intensional analysis of variables; mostly-automated semantic correctness proofs about those passes, by way of adding an axiom to make the parametricity of CIC usable explicitly in proofs; and the ability to drop down to more traditional syntactic representations for more arduous but feasible proofs of the same properties, when intensional variable analysis is needed.</summary>

		<abstract>We present <i>parametric higher-order abstract syntax (PHOAS)</i>, a new approach to formalizing the syntax of programming languages in computer proof assistants based on type theory.  Like higher-order abstract syntax (HOAS), PHOAS uses the meta language's binding constructs to represent the object language's binding constructs.  Unlike HOAS, PHOAS types are definable in general-purpose type theories that support traditional functional programming, like Coq's Calculus of Inductive Constructions.  We walk through how Coq can be used to develop certified, executable program transformations over several statically-typed functional programming languages formalized with PHOAS; that is, each transformation has a machine-checked proof of type preservation and semantic preservation.  Our examples include CPS translation and closure conversion for simply-typed lambda calculus, CPS translation for System F, and translation from a language with ML-style pattern matching to a simpler language with no variable-arity binding constructs.  By avoiding the syntactic hassle associated with first-order representation techniques, we achieve a very high degree of proof automation.</abstract>

		<abstract><a href="http://ltamer.sourceforge.net/">Software/proof source code and documentation</a></abstract>

		<abstract>Slides are available from my ICFP talk in <a href="PhoasICFP08Talk.odp">OpenOffice</a> and <a href="PhoasICFP08Talk.pdf">PDF</a> formats.</abstract>
	</pub>

	<pub id="CtpcPLDI07" kind="conference">
		<author person="adamc" />
		<title>A Certified Type-Preserving Compiler from Lambda Calculus to Assembly Language</title>
		<proceedings event="pldi07" />

		<summary>A compiler for a tiny statically-typed functional programming language, implemented in Coq with a proof of correctness. The main interesting bits are my use of dependently-typed abstract syntax and denotational semantics, along with some engineering tricks for making the task manageable.</summary>

		<abstract>We present a certified compiler from the simply-typed lambda calculus to assembly language.  The compiler is certified in the sense that it comes with a machine-checked proof of semantics preservation, performed with the Coq proof assistant.  The compiler and the terms of its several intermediate languages are given dependent types that guarantee that only well-typed programs are representable.  Thus, type preservation for each compiler pass follows without any significant "proofs" of the usual kind.  Semantics preservation is proved based on denotational semantics assigned to the intermediate languages.  We demonstrate how working with a type-preserving compiler enables type-directed proof search to discharge large parts of our proof obligations automatically.</abstract>

		<abstract><a href="http://ltamer.sourceforge.net/">Software/proof source code and documentation</a></abstract>

		<abstract>Slides are available from my PLDI talk in <a href="CtpcPLDI07Talk.odp">OpenOffice</a> and <a href="CtpcPLDI07Talk.pdf">PDF</a> formats.</abstract>

		<abstract>Slides are also available from a talk I gave at the <a href="http://gallium.inria.fr/">Projet Gallium</a> seminar at INRIA Rocquencourt, in <a href="CtpcINRIA.odp">OpenOffice</a> and <a href="CtpcINRIA.pdf">PDF</a> formats.</abstract>
	</pub>

	<pub id="CertVerICFP06" kind="conference">
		<author person="adamc" />
		<title>Modular Development of Certified Program Verifiers with a Proof Assistant</title>
		<proceedings event="icfp06" />

		<summary>I report on an experience using the Coq proof assistant to develop a program verification tool with a machine-checkable proof of full correctness. The verifier is able to prove memory safety of x86 machine code programs compiled from code that uses algebraic datatypes. The tool's soundness theorem is expressed in terms of the bit-level semantics of x86 programs, so its correctness depends on very few assumptions. I take advantage of Coq's support for programming with dependent types and modules in the structure of my development. The approach is based on developing a library of reusable functors for transforming a verifier at one level of abstraction into a verifier at a lower level. Using this library, it's possible to prototype a verifier based on a new type system with a minimal amount of work, while obtaining a very strong soundness theorem about the final product.</summary>

		<abstract>I report on an experience using the Coq proof assistant to develop a program verification tool with a machine-checkable proof of full correctness. The verifier is able to prove memory safety of x86 machine code programs compiled from code that uses algebraic datatypes. The tool's soundness theorem is expressed in terms of the bit-level semantics of x86 programs, so its correctness depends on very few assumptions. I take advantage of Coq's support for programming with dependent types and modules in the structure of my development. The approach is based on developing a library of reusable functors for transforming a verifier at one level of abstraction into a verifier at a lower level. Using this library, it's possible to prototype a verifier based on a new type system with a minimal amount of work, while obtaining a very strong soundness theorem about the final product.</abstract>

		<abstract><a href="http://proofos.sourceforge.net/">Software/proof source code and documentation</a></abstract>

		<abstract>Talk slides available in <a href="CertVerICFP06Talk.odp">OpenOffice</a> and <a href="CertVerICFP06Talk.pdf">PDF</a> formats.</abstract>
	</pub>

	<pub id="PcvVMCAI06" kind="conference">
		<author person="bec" />
		<author person="adamc" />
		<author person="necula" />
		<title>A Framework for Certified Program Analysis and Its Applications to Mobile-Code Safety</title>
		<proceedings event="vmcai06" />

		<summary>We propose a new technique in support of the construction of efficient Foundational Proof-Carrying Code systems. Instead of suggesting that pieces of mobile code come with proofs of their safety, we instead suggest that they come with executable verifiers that can attest to their safety, as in our previous work on the Open Verifier. However, in constrast to that previous work, here we do away with any runtime proof generation by these verifiers. Instead, we require that the verifier itself is proved sound. To support this, we present a novel technique for extracting proof obligations about ML programs. Using this approach, we are able to demonstrate the first foundational verification technique for Typed Assembly Language with performance comparable to that of the traditional, uncertified TAL type checker.</summary>

		<abstract>A certified program analysis is an analysis whose implementation is accompanied by a checkable proof of soundness. We present a framework whose purpose is to simplify the development of certified program analyses without compromising the run-time efficiency of the analyses. At the core of the framework is a novel technique for automatically extracting Coq proof-assistant specifications from ML implementations of program analyses, while preserving to a large extent the structure of the implementation.</abstract>

		<abstract>We show that this framework allows developers of mobile code to provide to the code receivers untrusted code verifiers in the form of certified program analyses. We demonstrate efficient implementations in this framework of bytecode verification, typed assembly language, and proof-carrying code.</abstract>

		<abstract>Talk slides available in <a href="PcvVMCAI06Talk.sxi">OpenOffice</a> and <a href="PcvVMCAI06Talk.pdf">PDF</a> formats.</abstract>
	</pub>

	<pub id="BlastICSE04" kind="conference">
		<author person="beyer" />
		<author person="adamc" as="Adam J. Chlipala" />
		<author person="tah" />
		<author person="jhala" />
		<author person="rupak" />
		<title>Generating Tests from Counterexamples</title>
		<proceedings event="icse04" />

		<summary>We describe how to use the BLAST model checker to generate program test suites that achieve full coverage with respect to a given set of predicates.</summary>

		<abstract>We have extended the software model checker Blast to automatically generate test suites that guarantee full coverage with respect to a given predicate. More precisely, given a C program and a target predicate p, Blast determines the set L of program locations which program execution can reach with p true, and automatically generates a set of test vectors that exhibit the truth of p at all locations in L. We have used Blast to generate test suites and to detect dead code in C programs with up to 30K lines of code. The analysis and test-vector generation is fully automatic (no user intervention) and exact (no false positives).</abstract>
	</pub>

	</pubKind>

	<pubKind id="journal" name="Refereed journal articles">

	<pub id="CertVerJFP" kind="journal">
		<author person="adamc" />
		<title>Modular Development of Certified Program Verifiers with a Proof Assistant</title>
		<journal journal="jfp" volume="18(5/6)" pages="599-647" year="2008" />

		<summary>Extended version of <a href="CertVerICFP06/">my ICFP'06 paper</a></summary>

		<abstract>Extended version of <a href="../CertVerICFP06/">my ICFP'06 paper</a></abstract>

		<abstract>I report on an experience using the Coq proof assistant to develop a program verification tool with a machine-checked proof of full correctness. The verifier is able to prove memory safety of x86 machine code programs compiled from code that uses algebraic datatypes. The tool's soundness theorem is expressed in terms of the bit-level semantics of x86 programs, so its correctness depends on very few assumptions. I take advantage of Coq's support for programming with dependent types and modules in the structure of the development. The approach is based on developing a library of reusable functors for transforming a verifier at one level of abstraction into a verifier at a lower level. Using this library, it's possible to prototype a verifier based on a new type system with a minimal amount of work, while obtaining a very strong soundness theorem about the final product.</abstract>

                <nops/>
	</pub>

	</pubKind>

	<pubKind id="workshop" name="Refereed workshop papers">

	<pub id="PositionPLPV06" kind="workshop">
		<author person="adamc" />
		<title>Position Paper: Thoughts on Programming with Proof Assistants</title>
		<proceedings event="plpv06" />

		<summary>Some thoughts on how Coq is actually in pretty good shape to use today for non-trivial programming with dependent types</summary>

		<abstract>Today the reigning opinion about computer proof assistants based on constructive logic (even from some of the developers of these tools!) is that, while they are very helpful for doing math, they are an absurdly heavy-weight solution to use for practical programming. Yet the Curry-Howard isomorphism foundation of proof assistants like Coq gives them clear interpretations as programming environments.</abstract>

		<abstract>My purpose in this position paper is to make the general claim that Coq is already quite useful today for non-trivial certified programming tasks, as well as to highlight some reasons why you might want to consider using it as a base for your next project in dependently-typed programming.</abstract>

		<abstract>Talk slides available in <a href="PositionPLPV06Talk.odp">OpenOffice</a> and <a href="PositionPLPV06Talk.pdf">PDF</a> formats.</abstract>
	</pub>

	<pub id="KettleStrategies06" kind="workshop">
		<author person="adamc" />
		<author person="necula" />
		<title>Cooperative Integration of an Interactive Proof Assistant and an Automated Prover</title>
		<proceedings event="strategies06" />

		<summary>We show how to combine the interactive proof assistant Coq and the Nelson-Oppen-style automated first-order theorem prover Kettle in a synergistic way. We do this with a Kettle tactic for Coq that uses theory-specific reasoning to simplify goals based on automatically chosen case analyses, returning to the user as subgoals the cases it couldn't prove automatically. The process can then be repeated recursively, using Coq's tactical language as a very expressive extension of the matching strategies found in provers like Simplify. We also discuss how to encode specialized first-order proofs efficiently in Coq using proof by reflection.</summary>

		<abstract>We propose a mechanism for semi-automated proving of theorems, using a tactic for the Coq proof assistant that consults a proof-generating Nelson-Oppen-style automated prover. Instead of simply proving or failing to prove a goal, our tactic decides on relevant case splits using theory-specific axioms, proves some of the resulting cases, and returns the remainder to the Coq user as subgoals. These subgoals can then be proved using inductions and lemma instantiations that are beyond the capabilities of the automated prover. We show that the Coq tactic language provides an excellent way to script this process to an extent not supported by current Nelson-Oppen provers. Like with any Coq proof, a separately checkable proof term in a core calculus is produced at the end of any successful proving session where our method is used, and we take advantage of the ``proof by reflection'' technique to translate the specialized first-order proofs of the automated prover into compact Coq representations.</abstract>

		<abstract>Talk slides available in <a href="KettleStrategies06Talk.odp">OpenOffice</a> and <a href="KettleStrategies06Talk.pdf">PDF</a> formats.</abstract>
	</pub>

	<pub id="OpenverTLDI05" kind="workshop">
		<author person="bec" />
		<author person="adamc" />
		<author person="necula" />
		<author person="schneck" />
		<title>The <literal>Open Verifier</literal> Framework for Foundational Verifiers</title>
		<proceedings event="tldi05" />

		<summary>We propose a new framework for the construction of trustworthy program verifiers. The Open Verifier architecture can be viewed as an optimized Foundational Proof-Carrying Code toolkit. Instead of proposing that code producers send proofs of safety with all of their programs, we instead suggest that they send re-usable proof-generating verifiers. The proofs are generated in an online fashion via a novel interaction scheme between the untrusted verifier and the trusted core of the system.</summary>

		<abstract>We present the Open Verifier approach for verifying untrusted code using customized verifiers. This approach can be viewed as an instance of foundational proof-carrying code where an untrusted program can be checked using the verifier most natural for it instead of using a single generic type system. In this paper we focus on a specialized architecture designed to reduce the burden of expressing both type-based and Hoare-style verifiers.</abstract>
		<abstract>A new verifier is created by providing an untrusted executable extension module, which can incorporate directly pre-existing non-foundational verifiers based on dataflow analysis or type checking. The extensions control virtually all aspects of the verification by carrying on a dialogue with the Open Verifier using a language designed both to correspond closely to common verification actions and to carry simple adequacy proofs for those actions.</abstract>
		<abstract>We prove the soundness of the framework, and we describe our experience implementing proof-carrying code, typed assembly language, and dataflow or abstract interpretation based verifiers in this unified setting.</abstract>
	</pub>

	<pub id="CoolaidTLDI05" kind="workshop">
		<author person="bec" />
		<author person="adamc" />
		<author person="necula" />
		<author person="schneck" />
		<title>Type-Based Verification of Assembly Language for Compiler Debugging</title>
		<proceedings event="tldi05" />

		<summary>A new approach to checking assembly programs in a way similar to that used in the Java Bytecode Verifier. We introduce a novel mixed type/value technique that makes it tractable to deal with some of the "dependent typing" issues that come up. We also present results on using this technique to help students in an undergraduate compilers class debug their class projects.</summary>

		<abstract>It is a common belief that certifying compilation, which typically verifies the well-typedness of compiler output, can be an effective mechanism for compiler debugging, in addition to ensuring basic safety properties. Bytecode verification is a fairly simple example of this approach and derives its simplicity in part by compiling to carefully crafted high-level bytecodes. In this paper, we seek to push this method to native assembly code, while maintaining much of the simplicity of bytecode verification. Furthermore, we wish to provide experimental confirmation that such a tool can be accessible and effective for compiler debugging. To achieve these goals, we present a type-based data-flow analysis or abstract interpretation for assembly code compiled from a Java-like language, and evaluate its bug-finding efficacy on a large set of student compilers.</abstract>
	</pub>

	<pub id="StrictTLDI05" kind="workshop">
		<author person="adamc" />
		<author person="leaf" />
		<author person="rwh" />
		<title>Strict Bidirectional Type Checking</title>
		<proceedings event="tldi05" />

		<summary>We present a type system that is useful in saving type annotation space in intermediate language terms expressed in the restricted form called "A-normal form" or "one-half CPS." Our approach imports ideas from strict logic, which is based on the idea of hypotheses that must be used at least once. The resulting system is relevant to the efficiency of type-preserving compilers.</summary>

		<abstract>Completely annotated lambda terms (such as are arrived at via the straightforward encodings of various types from System F) contain much redundant type information. Consequently, the completely annotated forms are almost never used in practice, since partially annotated forms can be defined which still allow syntax directed typechecking. An additional optimization that is used in some proof and type systems is to take advantage of the context of occurrence of terms to further elide type information using bi-directional typechecking rules. While this technique is generally effective, we show that there exist bi-directional terms which exhibit asymptotic increases in the size of their type decorations when sequentialized into a named-form calculus (a common first step in compilation). In this paper, we introduce a refinement of the bi-directional type system based on strict  logic which allows additional type decorations to be eliminated, and show that it is well-behaved under sequentialization.</abstract>
	</pub>

	</pubKind>

	<pubKind id="poster" name="Refereed poster sessions">

	<pub id="PosterPCC06" kind="workshop">
		<author person="adamc" />
		<title>Developing Certified Program Verifiers with a Proof Assistant</title>
		<proceedings event="pcc06" />

		<summary>A poster about <a href="CertVerICFP06/">certified program verifiers in Coq</a></summary>

		<abstract>Abstract about a poster on <a href="../CertVerICFP06/">certified program verifiers in Coq</a></abstract>

		<abstract>You can download the poster in <a href="PosterPCC06Poster.odg">OpenOffice</a> or <a href="PosterPCC06Poster.pdf">PDF</a> format.</abstract>
	</pub>

	</pubKind>

	<pubKind id="invited" name="Invited conference papers">

	<pub id="BlastSAS04" kind="invited">
		<author person="beyer" />
		<author person="adamc" as="Adam J. Chlipala" />
		<author person="tah" />
		<author person="jhala" />
		<author person="rupak" />
		<title>The <literal>Blast</literal> Query Language for Software Verification</title>
		<proceedings event="sas04" lncs="3148" />

		<summary>We describe a system that combines security automaton-based program specification with a facility for relational-style queries about the possible execution paths of a program.</summary>

		<abstract>Blast is an automatic verification tool for checking temporal safety properties of C programs. Blast is based on lazy predicate abstraction driven by interpolation-based predicate discovery. In this paper, we present the Blast specification language. The language specifies program properties at two levels of precision. At the lower level, monitor automata are used to specify temporal safety properties of program executions (traces). At the higher level, relational reachability queries over program locations are used to combine lower-level trace properties. The two-level specification language can be used to break down a verification task into several independent calls of the model-checking engine. In this way, each call to the model checker may have to analyze only part of the program, or part of the specification, and may thus succeed in a reduction of the number of predicates needed for the analysis. In addition, the two-level specification language provides a means for structuring and maintaining specifications.</abstract>
	</pub>

	</pubKind>

	<pubKind id="tr" name="Technical reports">

	<pub id="AutoSyntaxTR" kind="tr">
		<author person="adamc" />
		<title>Generic Programming and Proving for Programming Language Metatheory</title>
		<report>UCB/EECS-2007-147</report>
		<year>2007</year>

		<summary>How to do dependently-typed generation of proofs about programming language syntax and semantics</summary>

		<abstract>We present a system for both the generic programming of operations that work over classes of tree-structured data types and the automatic generation of formal type-theoretical proofs about such operations.  The system is implemented in the Coq proof assistant, using dependent types to validate code and proof generation statically, quantified over all possible input data types.  We focus on generic programming of variable-manipulating operations, such as substitution and free variable set calculation, over abstract syntax tree types implemented as GADTs that combine syntax and typing rules.  By accompanying these operations with generic lemmas about their interactions, we significantly ease the burden of formalizing programming language metatheory.  Our implementation strategy, based on <i>proof by reflection</i>, requires users to trust none of its associated code to be able to trust in the validity of theorems derived with it.</abstract>

		<abstract>Slides are available from a talk I gave at <a href="http://www.cis.upenn.edu/~sweirich/wmm/">WMM'07</a>, in <a href="AutoSyntaxWMM07.odp">OpenOffice</a> and <a href="AutoSyntaxWMM07.pdf">PDF</a> formats.</abstract>
	</pub>

	<pub id="ChlipalaPhD" kind="tr">
		<author person="adamc" />
		<title>Implementing Certified Programming Language Tools in Dependent Type Theory</title>
		<report>UCB/EECS-2007-113</report>
		<year>2007</year>

		<summary>My PhD dissertation, re-presenting the work on certified program verifiers (from ICFP'06) and certified compilers (from PLDI'07)</summary>

		<abstract>I present two case studies supporting the assertion that type-based methods enable effective <i>certified programming</i>.  By certified programming, I mean the development of software with formal, machine-checked total correctness proofs.  While the classical formal methods domain is most commonly concerned with after-the-fact verification of programs written in a traditional way, I explore an alternative technique, based on using <i>dependent types</i> to integrate correctness proving with programming.  I have chosen the Coq proof assistant as the vehicle for these experiments.  Throughout this dissertation, I draw attention to features of formal theorem proving tools based on <i>dependent type theory</i> that make such tools superior choices for certified programming, compared to their competition.</abstract>

		<abstract>In the first case study, I present techniques for constructing <i>certified program verifiers</i>.  I present a Coq toolkit for building foundational memory safety verifiers for x86 machine code.  The implementation uses rich <i>specification types</i> to mix behavioral requirements with the traditional types of functions, and I mix standard programming practice with tactic-based interactive theorem proving to implement programs of these types.  I decompose verifier implementations into libraries of components, where each component is implemented as <i>a functor that transforms a verifier at one level of abstraction into a verifier at a lower level</i>.  I use the toolkit to assemble a verifier for programs that use algebraic datatypes using only several hundred lines of code specific to its type system.</abstract>

		<abstract>The second case study presents work in <i>certified compilers</i>.  I focus in particular on <i>type-preserving compilation</i>, where source-level type information is preserved through several statically-typed intermediate languages and used at runtime for such purposes as guiding a garbage collector.  I suggest a novel approach to mechanizing the semantics of programming languages, based on <i>dependently-typed abstract syntax</i> and <i>denotational semantics</i>.  I use this approach to certify a compiler from simply-typed lambda calculus to an idealized assembly language that interfaces with a garbage collector through tables listing the appropriate root registers for different program points.  Significant parts of the proof effort are automated using type-driven heuristics.  I also present a generic programming system for automating construction of syntactic helper functions and their correctness proofs, based on an implementation technique called <i>proof by reflection</i>.</abstract>
	</pub>

	<pub id="LaconicTR" kind="tr">
		<author person="adamc" />
		<title>Scrap Your Web Application Boilerplate, or Metaprogramming with Row Types</title>
		<report>UCB/EECS-2006-120</report>
		<year>2006</year>

		<summary>An overview of a work-in-progress functional programming language that puts dependent types and theorem proving to work to make it easier to write concise and maintainable web applications</summary>

		<abstract>I introduce a new functional programming language, called Laconic/Web, for rapid development of web applications. Its strong static type system guarantees that entire sequences of interaction with these applications ``can't go wrong.'' Moreover, a higher-order dependent type system is used to enable statically-checked metaprogramming. In contrast to most dependently-typed programming languages, Laconic/Web can be used by programmers with no knowledge of proof theory. Instead, more expert developers develop libraries that extend the Laconic/Web type checker with type rewrite rules that have proofs of soundness. I compare Laconic/Web against Ruby on Rails, the most well-known representative of a popular class of Web application frameworks based around dynamic languages and runtime reflection, and show that my approach leads both to more concise programs and to better runtime efficiency.</abstract>

		<abstract><a href="http://laconic.sourceforge.net/">Project web site</a></abstract>
	</pub>

	<pub id="PcvTR" kind="tr">
		<author person="bec" />
		<author person="adamc" />
		<author person="necula" />
		<title>A Framework for Certified Program Analysis and Its Applications to Mobile-Code Safety</title>
		<report>UCB/ERL M05/32</report>
		<atOrg org="ucb_eecs_combined" />
		<year>2005</year>

		<summary>This is an extended version of our VMCAI'06 paper, containing a formalization of our model extraction procedure and additional examples.</summary>

		<abstract>A certified program analysis is an analysis whose implementation is accompanied by a checkable proof of soundness. We present a framework whose purpose is to simplify the development of certified program analyses without compromising the run-time efficiency of the analyses. At the core of the framework is a novel technique for automatically extracting Coq proof-assistant specifications from ML implementations of program analyses, while preserving to a large extent the structure of the implementation.</abstract>

		<abstract>We show that this framework allows developers of mobile code to provide to the code receivers untrusted code verifiers in the form of certified program analyses. We demonstrate efficient implementations in this framework of bytecode verification, typed assembly language, and proof-carrying code.</abstract>

		<abstract>This is an extended version of our VMCAI'06 paper, containing a formalization of our model extraction procedure and additional examples.</abstract>
	</pub>

	<pub id="ChlipalaMS" kind="tr">
		<author person="adamc" />
		<title>An Untrusted Verifier for Typed Assembly Language</title>
		<type>MS Project Report</type>
		<report>UCB/ERL M04/41</report>
		<atOrg org="ucb_eecs_combined" />
		<year>2004</year>

		<summary>A summary of my experiences developing a proof-generating TAL type checker within the Open Verifier framework. In the style of Foundational PCC, the soundness of this verifier and the proofs it generates is based on no assumptions about the TAL type system. This was one of the first projects to consider the runtime performance of Foundational PCC-style verification.</summary>

		<abstract>I present the results of constructing a fully untrusted verifier for memory safety of Typed Assembly Language programs, using the Open Verifier architecture. The verifier is untrusted in the sense that its soundness depends only on axioms about the semantics of a concrete machine architecture, not on any axioms specific to a type system. This experiment served to evaluate both the expressiveness of the Open Verifier architecture and the quality of its support for simplifying the construction of verifiers. I discuss issues of proof generation that are generally not the focus of previous efforts for foundational checking of TAL, and I contrast with these past approaches the sort of logical formalization that is natural in the context of the Open Verifier. My approach is novel in that it uses direct reasoning about concrete machine states where past approaches have formalized typed abstract machines and proved their correspondence with concrete machines. I also describe a new approach to modeling higher-order functions that uses only first-order logic.</abstract>
	</pub>

	</pubKind>

	<pubKind id="imaginary" name="Imaginary">
	<dontShow/>

	</pubKind>

</pubs>

<pubSummary>
	5 papers published at peer-reviewed scholarly conferences; 5 at workshops; 1 journal article
</pubSummary>

<talks>
	<talk event="nepls21">
		<title>Statically-Checked Metaprogramming for Web Applications</title>
	</talk>

	<talk paper="PhoasICFP08" event="icfp08">
		<title>Parametric Higher-Order Abstract Syntax for Mechanized Semantics</title>
	</talk>

	<talk paper="AutoSyntaxTR" event="wmm07">
		<title>Generic Programming and Proving for Programming Language Metatheory</title>
	</talk>

	<talk paper="CtpcPLDI07" event="pldi07">
		<title>A Certified Type-Preserving Compiler from Lambda Calculus to Assembly Language</title>
	</talk>

	<talk paper="CtpcPLDI07" event="osq07">
		<title>A Certified Type-Preserving Compiler from Lambda Calculus to Assembly Language</title>
	</talk>

	<talk paper="CtpcPLDI07" event="gallium07">
		<title>A Certified Type-Preserving Compiler from Lambda Calculus to Assembly Language</title>
	</talk>

	<talk paper="CertVerICFP06" event="icfp06">
		<title>Modular Development of Certified Program Verifiers with a Proof Assistant</title>
	</talk>

	<talk paper="PositionPLPV06" event="plpv06">
		<title>Position Paper: Thoughts on Programming with Proof Assistants</title>
	</talk>

	<talk paper="KettleStrategies06" event="strategies06">
		<title>Cooperative Integration of an Interactive Proof Assistant and an Automated Prover</title>
	</talk>

	<talk paper="CertVerICFP06" event="osq06">
		<title>Developing Sound Program Analysis Tools by Programming with Proofs</title>
	</talk>

	<talk paper="PcvVMCAI06" event="vmcai06">
		<title>A Framework for Certified Program Analysis and Its Applications to Mobile-Code Safety</title>
	</talk>

	<talk paper="PcvVMCAI06" event="osq05">
		<title>Proof-Carrying Verifiers</title>
	</talk>

	<talk paper="OpenverTLDI05" event="tldi05">
		<title>The <literal>Open Verifier</literal> Framework for Foundational Verifiers</title>
	</talk>
</talks>

<degree>
	<important/>
	<name>Doctor of Philosophy (PhD) in Computer Science</name>
	<shortName>PhD, MS, Computer Science</shortName>
	<atOrg org="ucb" />
	<atOrg org="ucb_eecs" />
	<atOrg org="ucb_cs" />
	<when>
		<start>
			<month>8</month>
			<year>2003</year>
		</start>
		<end>
		        <month>9</month>
			<year>2007</year>
		</end>
	</when>
	<thesis pub="ChlipalaPhD" />
	<advisor person="necula" />
	<gpa max="4.0">4.0</gpa>
</degree>

<degree>
	<name>Master of Science (MS) in Computer Science</name>
	<shortName>MS, Computer Science</shortName>
	<atOrg org="ucb" />
	<atOrg org="ucb_eecs" />
	<atOrg org="ucb_cs" />
	<when>
		<end>
			<month>12</month>
			<year>2004</year>
		</end>
	</when>
	<thesis pub="ChlipalaMS" />
	<advisor person="necula" />
</degree>

<degree>
	<important/>
	<name>Bachelor of Science (BS) in Computer Science with a minor in Mathematical Sciences and University Honors</name>
	<shortName>BS, Computer Science</shortName>
	<atOrg org="cmu" />
	<when>
		<start>
			<month>8</month>
			<year>2000</year>
		</start>
		<end>
			<month>5</month>
			<year>2003</year>
		</end>
	</when>
	<gpa max="4.0">4.0</gpa>
</degree>

<degree>
	<name>High school diploma</name>
	<atOrg org="ehs" />
	<when>
		<start>
			<month>9</month>
			<year>1996</year>
		</start>
		<end>
			<month>6</month>
			<year>2000</year>
		</end>
	</when>
</degree>

<job>
	<title>Postdoctoral Fellow</title>
	<important/>
	<shortOrg>Harvard University</shortOrg>
	<atOrg org="harvard_seas" />
	<atOrg org="harvard" />
	<when>
		<start>
			<month>6</month>
			<year>2008</year>
		</start>
                <end_tbd/>
	</when>
        <boss title="Advisor" person="greg" />
</job>

<job>
	<shortOrg>certified programming class, Harvard School of Engineering and Applied Sciences</shortOrg>
	<title>Instructor</title>
	<atOrg org="cpdt" />
	<atOrg org="harvard_seas" />
	<atOrg org="harvard" />
	<when>
		<start>
			<month>9</month>
			<year>2008</year>
		</start>
		<end>
			<month>1</month>
			<year>2009</year>
		</end>
	</when>
</job>

<job>
	<title>OCaml Hacker</title>
	<important/>
	<shortOrg>Jane Street Capital</shortOrg>
	<atOrg org="janest" />
	<when>
		<start>
			<month>9</month>
			<year>2007</year>
		</start>
		<end>
                        <month>4</month>
                        <year>2008</year>
                </end>
	</when>
</job>

<job>
	<title>Graduate Student Researcher</title>
	<important/>
	<shortOrg>UC Berkeley CS Division</shortOrg>
	<atOrg org="openver" />
	<atOrg org="ucb_cs" />
	<atOrg org="ucb" />
	<when>
		<start>
			<month>9</month>
			<year>2003</year>
		</start>
		<end>
			<month>8</month>
			<year>2007</year>
		</end>
	</when>
	<boss title="PI" person="necula" />
	<task>
		Investigating implementation of program verification tools with proofs of correctness, using dependent types in the Coq proof assistant
	</task>
	<task>
		Implemented infrastructure for the Open Verifier and Certified Program Verifiers systems
	</task>
	<task>
		Developed untrusted plug-ins for memory safety of x86 Typed Assembly Language for those systems, including soundness proofs in the Coq proof assistant
	</task>
</job>

<job>
	<important/>
	<shortOrg>computer theorem proving class, UC Berkeley CS Division</shortOrg>
	<title>Instructor</title>
	<atOrg org="ictp" />
	<atOrg org="ucb_cs" />
	<atOrg org="ucb" />
	<when>
		<start>
			<month>8</month>
			<year>2006</year>
		</start>
		<end>
			<month>12</month>
			<year>2006</year>
		</end>
	</when>
</job>

<job>
	<important/>
	<shortOrg>Microsoft Research Redmond</shortOrg>
	<title>Research Intern</title>
	<atOrg org="singularity" />
	<atOrg org="spt" />
	<atOrg org="msr" />
	<when>
		<start>
			<month>6</month>
			<year>2005</year>
		</start>
		<end>
			<month>8</month>
			<year>2005</year>
		</end>
	</when>
	<boss title="Mentor" person="maf" />
	<task>
		Designed and implemented an extensible bytecode verifier based on linear logic, and used this verifier to check properties such as manual memory management and message-passing protocols for untrusted process code in the Singularity operating system
	</task>
</job>

<job>
	<title>Graduate Student Instructor</title>
	<atOrg org="cs172" />	
	<atOrg org="ucb_cs" />
	<atOrg org="ucb" />
	<when>
		<start>
			<month>1</month>
			<year>2005</year>
		</start>
		<end>
			<month>5</month>
			<year>2005</year>
		</end>
	</when>
	<boss title="Instructor" person="lucena" />
	<task>Ran discussion sections</task>
	<task>Graded weekly homework assignments</task>
	<task>Held office hours</task>
</job>

<job>
	<title>Graduate Student Researcher</title>
	<atOrg org="blast" />
	<atOrg org="ucb_cs" />
	<atOrg org="ucb" />
	<when>
		<start>
			<month>6</month>
			<year>2003</year>
		</start>
		<end>
			<month>8</month>
			<year>2003</year>
		</end>
	</when>
	<boss title="PI" person="tah" />
	<task>Implemented processing for an intuitive language for specifying safety properties of C programs to be verified by the BLAST model checker</task>
	<task>Implemented context-free reachability to extend BLAST to verify recursive programs</task>
</job>

<job>
	<important/>
	<shortOrg>CMU CS Department</shortOrg>
	<title>Research Assistant</title>
	<atOrg org="tilt" />	
	<atOrg org="cmu_cs" />
	<atOrg org="cmu" />
	<when>
		<start>
			<month>6</month>
			<year>2002</year>
		</start>
		<end>
			<month>5</month>
			<year>2003</year>
		</end>
	</when>
	<bosses title="PIs">
		<boss person="rwh" />
		<boss person="crary" />
	</bosses>
	<task>Implemented improvements to the mid-level intermediate language of the TILT compiler, along with assorted optimizations</task>
	<task>Studied the problem of efficient type-checking of ML-like intermediate languages in flattened forms analogous to traditional compiler intermediate languages</task>
</job>

<job>
	<shortOrg>ML programming class, CMU CS Department</shortOrg>
	<title>Teaching Assistant</title>
	<atOrg org="cs212" />
	<atOrg org="cmu_cs" />
	<atOrg org="cmu" />
	<when>
		<start>
			<month>1</month>
			<year>2002</year>
		</start>
		<end>
			<month>5</month>
			<year>2002</year>
		</end>
	</when>
	<bosses title="Instructors">
		<boss person="me" />
		<boss person="wing" />
	</bosses>
	<task>Taught a weekly recitation section</task>
	<task>Created homework assignments and exam questions</task>
	<task>Held weekly office hours</task>
	<task>Graded assignments and exams</task>
</job>

<job>
	<title>Intern/Software Developer</title>
	<atOrg org="avaya" />
	<when>
		<start>
			<month>6</month>
			<year>2001</year>
		</start>
		<end>
			<month>8</month>
			<year>2001</year>
		</end>
	</when>
	<task>Developed a database-driven intranet web site to facilitate technology transfer between research and development</task>
</job>

<job>
	<important/>
	<shortOrg>Trifecta Technologies</shortOrg>
	<title>Software Developer</title>
	<atOrg org="trifecta" />
	<when>
		<summers>
			<from>1998</from>
			<to>2000</to>
		</summers>
	</when>
	<task>Designed and coded business and presentation logic for electronic commerce web sites using IBM WebSphere Commerce Suite</task>
</job>

<honors>
	<fellowship>
		<important/>
		<name>National Defense Science and Engineering Graduate Fellowship</name>
		<url>http://www.asee.org/ndseg/</url>
		<year>2004</year>
	</fellowship>

	<fellowship>
		<important/>
		<name>National Science Foundation Graduate Research Fellowship</name>
		<url>http://www.nsfgradfellows.org/</url>
		<year>2004</year>
	</fellowship>

	<fellowship>
		<name>California Microelectronics Fellowship</name>
		<url>http://www.ucop.edu/research/micro/fellows.html</url>
		<fromOrg org="ucb_eecs_combined" />
		<when>
			<start>
				<month>8</month>
				<year>2003</year>
			</start>
			<end>
				<month>5</month>
				<year>2004</year>
			</end>
		</when>	
	</fellowship>

	<inducted>
		<name>Phi Kappa Phi</name>
		<url>http://www.phikappaphi.org/</url>
	</inducted>

	<inducted>
		<name>Phi Beta Kappa</name>
		<url>http://www.pbk.org/</url>
	</inducted>

	<fellowship_honorable>
		<name>National Science Foundation Graduate Research Fellowship</name>
		<url>http://www.nsfgradfellows.org/</url>
		<year>2003</year>
	</fellowship_honorable>

	<fellowship>
		<name>Andrew Carnegie Scholarship</name>
		<url>http://my.cmu.edu/site/admission/menuitem.18c40008673813c019300710d4a02008/</url>
		<fromOrg org="cmu" />
		<when>
			<start>
				<month>8</month>
				<year>2000</year>
			</start>
			<end>
				<month>5</month>
				<year>2003</year>
			</end>
		</when>	
	</fellowship>
</honors>

<summer_schools>
	<summer_school>
		<name>Summer School on Software Security: Theory to Practice</name>
		<url>http://www.cs.uoregon.edu/activities/summerschool/summer04/</url>
		<atOrg org="oregon" />
		<when>
			<end>
				<month>6</month>
				<year>2004</year>
			</end>
		</when>
	</summer_school>
</summer_schools>

<service>
        <role event="wmm08" name="program committee"/>
</service>

<reviewed>
	<for event="icfp04" />
	<for event="lpar05" />
	<for event="lics06" />
	<for event="aplas06" />
	<for event="tldi07" />
	<for event="rta07" />
	<for event="popl08" />
	<for event="vmcai08" />
	<for event="pldi08" />
        <for event="icfp08" />
	<for event="popl09" />
	<for event="tldi09" />
	<for event="esop09" /> 
	<for event="types08" /> 
</reviewed>

<software>
	<program><a href="http://www.impredicative.com/ur/">Ur/Web</a>, a prototype domain-specific programming language design and implementation supporting metaprogramming of web applications with strong static guarantees</program>
	<program><a href="http://hcoop.sourceforge.net/">Cooperative Internet hosting tools</a>, including <a href="http://wiki.hcoop.net/DomTool">DomTool</a>, a domain-specific language in support of shared UNIX system configuration by mutually-untrusting users</program>
	<program><a href="http://smlweb.sourceforge.net/">Dynamic web site tools for Standard ML</a>, including separately usable libraries for accessing SQL databases</program>
</software>

<activities>
	<activity>Founder and chief software developer of <a href="http://hcoop.net/">HCoop, Inc.</a>, a democratically-run Internet hosting cooperative</activity>
	<activity>Black belt in Karate (no longer training)</activity>
</activities>

<languages>
	<category name="I have expert-level experience with and have hacked on implementations of" shortName="Expert on"><important />ML, Coq, C</category>

	<category name="I've written significant amounts of code in" shortName="Significant experience with"><important />F#, Java, SQL, x86 and Z80 assembly languages</category>

	<category name="I'm conversant in" shortName="Some experience with"><important />Haskell, C++, XSLT</category>

	<category name="I have some familiarity with">Twelf, Scheme, Common Lisp, Prolog, C#, Visual Basic, UNIX shell scripting, Perl</category>

	<category name="I've done system administration of these daemons on UNIX systems with at least 100 users">Apache, djbdns, Courier IMAP, Exim, Mailman, SpamAssassin</category>
</languages>

</cv>
