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

<cv>

<name>Adam Chlipala</name>

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

<address1>Cambridge, MA</address1>

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

<htmlurl>http://adam.chlipala.net/cv.html</htmlurl>

<objective>Not currently seeking employment</objective>

<interests>Program verification (verifying low-level programs, verifying programming language tools, reducing the human costs of interactive theorem-proving and formal verification)</interests>
<interests>Design and implementation of programming languages (functional and declarative programming languages, dependent types and other very expressive type systems, safe low-level programming, Web programming, domain-specific languages)</interests>

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

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

	<project>
		<name>Verifying imperative programs</name>
		<url>http://ynot.cs.harvard.edu/</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://www.impredicative.com/ur/</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.colorado.edu/~bec/</url>
</person>

<person id="beyer">
	<name>Dirk Beyer</name>
	<url>http://www.sosy-lab.org/~dbeyer/</url>
</person>

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

<person id="gmalecha">
        <name>Gregory Malecha</name>
        <url>http://www.people.fas.harvard.edu/~gmalecha/</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://tupelo-schneck.org/robert/</url>
</person>

<person id="shinnar">
        <name>Avraham Shinnar</name>
        <url>http://www.eecs.harvard.edu/~shinnar/</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>

<person id="ryan">
        <name>Ryan Wisnesky</name>
        <url>http://wisnesky.net/</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="ibm">
	<name>IBM Research</name>
	<abbrev>IBM</abbrev>
	<url>http://research.ibm.com/</url>

	<org id="watson">
		<name>IBM Watson Research Center</name>
		<location>Hawthorne</location>
		<location>NY</location>
		<abbrev>IBM Watson</abbrev>
	</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="mit">
	<name>Massachusetts Institute of Technology</name>
	<abbrev>MIT</abbrev>
	<url>http://www.mit.edu/</url>

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

	<org id="csail">
		<name>Computer Science and Artificial Intelligence Laboratory</name>
		<abbrev>CSAIL</abbrev>
		<url>http://www.csail.mit.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="elsevier">
	<abbrev>Elsevier</abbrev>
	<url>http://www.elsevier.com/</url>
</org>

<org id="janest">
	<name>Jane Street Capital</name>
	<abbrev>Jane Street Capital</abbrev>
	<url>http://www.janestreet.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>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>2nd Informal ACM SIGPLAN Workshop on Mechanizing Metatheory</name>
	<abbrev>WMM'07</abbrev>
	<url>http://www.cis.upenn.edu/~sweirich/wmm/wmm07.html</url>
	<month month="oct" />
	<location>Freiburg, Germany</location>
	<year>2007</year>
</event>

<event id="popl08">
	<name>35th 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>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>36th 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>

<event id="pldi09">
	<name>ACM SIGPLAN 2009 Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'09</abbrev>
	<url>http://www-plan.cs.colorado.edu/~pldi09/</url>
	<month month="jun" />
	<year>2009</year>
	<location>Dublin, Ireland</location>
	<copyright org="acm" />
</event>

<event id="lfmtp09">
        <name>4th International Workshop on Logical Frameworks and Meta-languages: Theory and Practice</name>
	<abbrev>LFMTP'09</abbrev>
	<url>http://workshops.inf.ed.ac.uk/lfmtp/</url>
	<month month="aug" />
	<year>2009</year>
	<location>Montreal, Canada</location>
</event>

<event id="bu09">
	<abbrev>Boston University Programming Languages Reading Group</abbrev>
        <url>http://www.church-project.org/reading-group/reading-group.html</url>
	<month month="feb" />
	<year>2009</year>
</event>

<event id="neu09">
	<abbrev>Northeastern University Programming Languages Seminar</abbrev>
        <url>http://www.ccs.neu.edu/home/wand/pl-seminar/</url>
	<month month="feb" />
	<year>2009</year>
</event>

<event id="msr09">
	<abbrev>Microsoft Research Redmond</abbrev>
        <url>http://research.microsoft.com/</url>
	<month month="jul" />
	<year>2009</year>
</event>

<event id="icfp09">
        <name>14th ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'09</abbrev>
	<url>http://www.cs.nott.ac.uk/~gmh/icfp09.html</url>
	<month month="aug" />
	<year>2009</year>
	<location>Edinburgh, Scotland</location>
	<copyright org="acm" />
</event>

<event id="wmm09">
        <name>4th Informal ACM SIGPLAN Workshop on Mechanizing Metatheory</name>
	<abbrev>WMM'09</abbrev>
	<url>http://www.cis.upenn.edu/~sweirich/wmm/wmm09.html</url>
	<month month="sep" />
	<year>2009</year>
	<location>Edinburgh, Scotland</location>
</event>

<event id="defun09">
        <name>ACM SIGPLAN Developer Tracks on Functional Programming</name>
	<abbrev>DEFUN'09</abbrev>
	<url>http://www.defun2009.info/</url>
	<month month="sep" />
	<year>2009</year>
	<location>Edinburgh, Scotland</location>
</event>

<event id="njpls0910">
	<name>New Jersey Programming Languages and Systems Seminar</name>
	<abbrev>NJPLS</abbrev>
	<url>http://www.njpls.org/oct09.html</url>
	<month month="oct" />
	<year>2009</year>
	<location>Bethlehem, PA, USA</location>
</event>

<event id="fsug09">
	<name>New England F# User Group</name>
	<abbrev>New England F# User Group</abbrev>
	<url>http://www.fsug.org/</url>
	<month month="nov" />
	<year>2009</year>
	<location>Cambridge, MA, USA</location>
</event>

<event id="popl10">
	<name>37th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'10</abbrev>
	<url>http://www.cse.psu.edu/popl/10/</url>
	<month month="jan" />
	<year>2010</year>
	<location>Madrid, Spain</location>
	<copyright org="acm" />
</event>

<event id="plpv10">
	<name>Programming Languages meets Program Verification Workshop</name>
	<url>http://slang.soe.ucsc.edu/plpv10/</url>
	<abbrev>PLPV'10</abbrev>
	<month month="jan" />
	<year>2010</year>
	<location>Madrid, Spain</location>
</event>

<event id="blisp10">
	<name>Boston Lisp</name>
	<abbrev>Boston Lisp</abbrev>
	<url>http://common-lisp.net/project/boston-lisp/</url>
	<month month="feb" />
	<year>2010</year>
	<location>Cambridge, MA, USA</location>
</event>

<event id="fossacs10">
	<name>13th International Conference on Foundations of Software Science and Computation Structures</name>
	<abbrev>FoSSaCS'10</abbrev>
	<url>http://users.comlab.ox.ac.uk/luke.ong/FoSSaCS2010/</url>
	<month month="mar" />
	<year>2010</year>
	<location>Paphos, Cyprus</location>
</event>

<event id="tacas10">
	<name>Sixteenth International Conference on Tools and Algorithms for the Construction and Analysis of Systems</name>
	<abbrev>TACAS'10</abbrev>
	<url>http://tacas10.in.tum.de/</url>
	<month month="mar" />
	<year>2010</year>
	<location>Paphos, Cyprus</location>
</event>

<event id="pldi10">
	<name>ACM SIGPLAN 2010 Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'10</abbrev>
	<url>http://cs.stanford.edu/pldi10/</url>
	<month month="jun" />
	<year>2010</year>
	<location>Toronto, Canada</location>
	<copyright org="acm" />
</event>

<event id="coq10">
	<name>The Second Coq Workshop</name>
	<abbrev>Coq-2</abbrev>
	<url>http://coq.inria.fr/coq-workshop/2010</url>
	<month month="jul" />
	<year>2010</year>
	<location>Edinburgh, Scotland</location>
</event>

<event id="dtp10">
	<name>Dependently Typed Programming 2010</name>
	<abbrev>DTP'10</abbrev>
	<url>http://sneezy.cs.nott.ac.uk/darcs/dtp10/</url>
	<month month="jul" />
	<year>2010</year>
	<location>Edinburgh, Scotland</location>
</event>

<event id="mlpa10">
	<name>2nd Workshop on Module Systems and Libraries for Proof Assistants</name>
	<abbrev>MLPA'10</abbrev>
	<url>http://kwarc.info/frabe/events/mlpa-10.html</url>
	<month month="jul" />
	<year>2010</year>
	<location>Edinburgh, Scotland</location>
</event>

<event id="elc10">
	<name>Emerging Languages Camp 2010</name>
	<abbrev>Emerging Languages Camp 2010</abbrev>
	<url>http://emerginglangs.com/</url>
	<month month="jul" />
	<year>2010</year>
	<location>Portland, OR, USA</location>
</event>

<event id="msfp10">
	<name>Mathematically Structured Functional Programming 2010</name>
	<abbrev>MSFP'10</abbrev>
	<url>http://cs.ioc.ee/msfp/msfp2010/</url>
	<month month="sep" />
	<year>2010</year>
	<location>Baltimore, MD, USA</location>
</event>

<event id="osdi10">
	<name>9th USENIX Symposium on Operating Systems Design and Implementation</name>
	<abbrev>OSDI'10</abbrev>
	<url>http://www.usenix.org/event/osdi10/</url>
	<month month="oct" />
	<year>2010</year>
	<location>Vancouver, BC, Canada</location>
</event>

<event id="ssv10">
	<name>5th International Workshop on Systems Software Verification</name>
	<abbrev>SSV'10</abbrev>
        <url>http://usenix.org/events/ssv10/</url>
	<year>2010</year>
	<location>Vancouver, BC, Canada</location>
</event>

<event id="mfps10">
	<name>Twenty-sixth Conference on the Mathematical Foundations of Programming Semantics</name>
	<abbrev>MFPS'10</abbrev>
	<url>http://www.math.tulane.edu/~mfps/mfps26/MFPS_XXVI.html</url>
	<year>2010</year>
	<location>Ottawa, Ontario, Canada</location>
</event>

<event id="ppdp10">
	<name>12th International  Symposium on Principles and Practice of Declarative Programming</name>
	<abbrev>PPDP'10</abbrev>
	<url>http://www.risc.uni-linz.ac.at/about/conferences/ppdp2010/</url>
	<year>2010</year>
	<location>Hagenberg, Austria</location>
</event>

<event id="hor10">
	<name>5th International Workshop on Higher-Order Rewriting</name>
	<abbrev>HOR'10</abbrev>
	<url>http://hor.pps.jussieu.fr/10/</url>
	<year>2010</year>
	<location>Edinburgh, Scotland</location>
</event>

<event id="itu10">
	<abbrev>COPLAS, ITU Copenhagen</abbrev>
        <url>http://www.coplas.org/</url>
	<month month="aug" />
	<year>2010</year>
</event>

<event id="dag10">
	<abbrev>Dagstuhl Seminar #10351</abbrev>
        <url>http://www.dagstuhl.de/10351/</url>
	<month month="aug" />
	<year>2010</year>
</event>

<event id="icfp10">
        <name>15th ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'10</abbrev>
	<url>http://www.icfpconference.org/icfp2010/</url>
	<month month="sep" />
	<year>2010</year>
	<location>Baltimore, MD, USA</location>
	<copyright org="acm" />
</event>

<event id="radical10">
        <name>First International Workshop on Relations and Data Integrity Constraints and Languages</name>
	<abbrev>RADICAL'10</abbrev>
	<url>http://research.microsoft.com/en-us/um/people/adg/RADICAL2010/</url>
	<month month="may" />
	<year>2010</year>
	<location>Cambridge, England</location>
</event>

<event id="mit10">
	<name>MIT PL Working Group</name>
	<abbrev>MIT PL Working Group</abbrev>
	<url>http://people.csail.mit.edu/jeanyang/pl/</url>
	<month month="dec" />
	<year>2010</year>
	<location>Cambridge, MA, USA</location>
</event>

<event id="gcm10">
        <name>Third International Workshop on Graph Computation Models</name>
	<abbrev>GCM'10</abbrev>
	<url>http://gcm-events.org/gcm2010/</url>
	<month month="oct" />
	<year>2010</year>
	<location>Enschede, The Netherlands</location>
</event>

<event id="popl11">
	<name>38th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'11</abbrev>
	<url>http://www.cse.psu.edu/popl/11/</url>
	<month month="jan" />
	<year>2011</year>
	<location>Austin, TX, USA</location>
	<copyright org="acm" />
</event>

<event id="vmcai11">
	<name>Twelfth International Conference on Verification, Model Checking, and Abstract Interpretation </name>
	<abbrev>VMCAI'11</abbrev>
	<url>http://vmcai11.cis.ksu.edu/</url>
	<month month="jan" />
	<year>2011</year>
	<location>Austin, TX, USA</location>
	<copyright org="springer" />
</event>

<event id="esop11">
	<name>20th European Symposium on Programming</name>
	<abbrev>ESOP'11</abbrev>
	<url>http://software.imdea.org/~gbarthe/esop11/</url>
	<month month="mar" />
	<year>2011</year>
	<location>Saarbrücken, Germany</location>
</event>

<event id="rta11">
	<name>22nd International Conference on Rewriting Techniques and Applications</name>
	<abbrev>RTA'11</abbrev>
	<url>http://www.rdp2011.uns.ac.rs/rta/</url>
	<month month="may" />
	<year>2011</year>
</event>

<event id="pldi11">
	<name>ACM SIGPLAN 2011 Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'11</abbrev>
	<url>http://pldi11.cs.utah.edu/</url>
	<month month="jun" />
	<year>2011</year>
	<location>San Jose, CA, USA</location>
	<copyright org="acm" />
</event>

<event id="berkeley11">
	<name>UC Berkeley</name>
	<abbrev>UC Berkeley</abbrev>
	<month month="jun" />
	<year>2011</year>
	<location>Berkeley, CA, USA</location>
</event>

<event id="fcs11">
	<name>Workshop on Foundations of Computer Security</name>
	<abbrev>FCS'11</abbrev>
	<url>http://www.di.ens.fr/~blanchet/fcs11/</url>
	<month month="jun" />
	<year>2011</year>
	<location>Toronto, ON, Canada</location>
</event>

<event id="lola11">
	<name>Syntax and Semantics of Low-Level Languages </name>
	<abbrev>LOLA'11</abbrev>
	<url>http://flint.cs.yale.edu/lola2011/</url>
	<month month="jun" />
	<year>2011</year>
	<location>Toronto, ON, Canada</location>
</event>

<event id="ibm11">
	<name>IBM Watson Research Center</name>
	<abbrev>IBM Watson Research Center</abbrev>
	<month month="aug" />
	<year>2011</year>
	<location>Hawthorne, NY, USA</location>
</event>

<event id="csw11">
	<name>CSAIL Student Workshop</name>
	<abbrev>CSAIL Student Workshop</abbrev>
        <url>http://projects.csail.mit.edu/csw/2011/</url>
	<month month="sep" />
	<year>2011</year>
	<location>Beverly, MA, USA</location>
</event>

<event id="coq11">
	<name>The Third Coq Workshop</name>
	<abbrev>Coq-3</abbrev>
	<url>http://www.cs.ru.nl/~spitters/coqw.html</url>
	<month month="aug" />
	<year>2011</year>
	<location>Nijmegen, Holland</location>
</event>

<event id="ssv11">
	<name>6th International Workshop on Systems Software Verification</name>
	<abbrev>SSV'11</abbrev>
        <url>https://es.fbk.eu/events/ssv2011/</url>
	<year>2011</year>
	<location>Nijmegen, Holland</location>
</event>

<event id="icfp11">
        <name>16th ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'11</abbrev>
        <url>http://www.icfpconference.org/icfp2011/</url>
	<year>2011</year>
	<location>Tokyo, Japan</location>
	<copyright org="acm" />
</event>

<event id="popl12">
	<name>39th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'12</abbrev>
	<url>http://www.cse.psu.edu/popl/12/</url>
	<month month="jan" />
	<year>2012</year>
	<location>Philadelphia, PA, USA</location>
	<copyright org="acm" />
</event>

<event id="tldi12">
	<name>7th ACM SIGPLAN Workshop on Types in Language Design and Implementation</name>
	<abbrev>TLDI'12</abbrev>
	<url>http://www.cis.upenn.edu/~bcpierce/tldi12/</url>
	<month month="jan" />
	<year>2012</year>
	<location>Philadelphia, PA, USA</location>
	<copyright org="acm" />
</event>

<event id="vstte12">
	<name>Fourth International Conference on Verified Software: Theories, Tools, and Experiments</name>
	<abbrev>VSTTE'12</abbrev>
	<url>https://sites.google.com/site/vstte2012/</url>
	<month month="jan" />
	<year>2012</year>
	<location>Philadelphia, PA, USA</location>
</event>

<event id="cav12">
	<name>24th International Conference on Computer Aided Verification</name>
	<abbrev>CAV'12</abbrev>
	<url>http://cav12.cs.illinois.edu/</url>
	<month month="jul" />
	<year>2012</year>
	<location>Berkeley, CA, USA</location>
</event>

<event id="coq12">
	<name>The Fourth Coq Workshop</name>
	<abbrev>Coq-4</abbrev>
	<url>http://coq.inria.fr/coq-workshop/2012</url>
	<month month="aug" />
	<year>2012</year>
	<location>Princeton, NJ, USA</location>
</event>

<event id="fossacs12">
	<name>15th International Conference on Foundations of Software Science and Computation Structures</name>
	<abbrev>FoSSaCS'12</abbrev>
	<url>http://www.itu.dk/research/fossacs-2012/</url>
	<month month="mar" />
	<year>2012</year>
	<location>Tallinn, Estonia</location>
</event>

<event id="itp12">
	<name>Interactive Theorem Proving - Third International Conference</name>
	<abbrev>ITP'12</abbrev>
	<url>http://www.cs.princeton.edu/~eberinge/itp12/web/Home.html</url>
	<month month="aug" />
	<year>2012</year>
	<location>Princeton, NJ, USA</location>
</event>

<event id="lfmtp12">
        <name>7th International Workshop on Logical Frameworks and Meta-languages: Theory and Practice</name>
	<abbrev>LFMTP'12</abbrev>
	<url>http://people.csail.mit.edu/adamc/lfmtp12/</url>
	<month month="sep" />
	<year>2012</year>
	<location>Copenhagen, Denmark</location>
</event>

<event id="fossacs13">
	<name>16th International Conference on Foundations of Software Science and Computation Structures</name>
	<abbrev>FoSSaCS'13</abbrev>
	<url>http://www.informatik.uni-trier.de/~ley/db/conf/fossacs/</url>
	<month month="mar" />
	<year>2013</year>
	<location>?</location>
</event>

<journal id="jacm">
	<name>Journal of the ACM</name>
	<abbrev>JACM</abbrev>
	<url>http://jacm.acm.org/</url>
	<publisher org="acm" />
</journal>

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

<journal id="jfr">
	<name>Journal of Formalized Reasoning</name>
	<abbrev>JFR</abbrev>
	<url>http://jfr.cib.unibo.it/</url>
</journal>

<journal id="toplas">
	<name>ACM Transactions on Programming Languages and Systems</name>
	<abbrev>TOPLAS</abbrev>
	<url>http://www.cs.utexas.edu/toplas/</url>
	<publisher org="acm" />
</journal>

<journal id="esl">
	<name>IEEE Embedded Systems Letters</name>
	<abbrev>ESL</abbrev>
	<url>http://ieeexplore.ieee.org/xpl/RecentIssue.jsp?punumber=4563995</url>
</journal>

<journal id="jar">
	<name>Journal of Automated Reasoning</name>
	<abbrev>JAR</abbrev>
	<url>http://www.springerlink.com/content/100280/</url>
	<publisher org="springer" />
</journal>

<journal id="ipl">
	<name>Information Processing Letters</name>
	<abbrev>IPL</abbrev>
	<url>http://www.elsevier.com/locate/ipl</url>
	<publisher org="elsevier" />
</journal>

<journal id="hosc">
	<name>Higher-Order and Symbolic Computation</name>
	<abbrev>HOSC</abbrev>
	<url>http://cs.au.dk/~hosc/</url>
	<publisher org="springer" />
</journal>

<journal id="scp">
  <name>Science of Computer Programming</name>
  <abbrev>SCP</abbrev>
  <url>http://www.journals.elsevier.com/science-of-computer-programming/</url>
  <publisher org="elsevier" />
</journal>

<books>
  <book>
    <author person="adamc" />
    <title>Certified Programming with Dependent Types</title>
    <url>http://adam.chlipala.net/cpdt/</url>
    <note>To appear from MIT Press. Available online under a Creative Commons license.</note>
  </book>
</books>

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

	<pub id="CpdtJFR" kind="journal">
		<author person="adamc" />
		<title>An Introduction to Programming and Proving with Dependent Types in Coq</title>
		<journal journal="jfr" volume="3(2)" pages="1-93" year="2010" />

		<summary>Excerpts from <a href="../cpdt/">CPDT</a></summary>

		<abstract>Excerpts from <a href="../../cpdt/">CPDT</a></abstract>

		<abstract>Computer proof assistants vary along many dimensions. Among the mature implementations, the Coq system is distinguished by two key features. First, we have support for programming with dependent types in the tradition of type theory, based on dependent function types and inductive type families. Second, we have a domain-specific language for coding correct-by-construction proof automation. Though the Coq user community has grown quite large, neither of the aspects I highlight is widely used. In this tutorial, I aim to provide a pragmatic introduction to both, showing how they can bring significant improvements in productivity.</abstract>

                <nops/>
	</pub>

	<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="conference" name="Refereed conference papers">

	<pub id="BedrockPLDI11" kind="conference">
		<author person="adamc" />
		<title>Mostly-Automated Verification of Low-Level Programs in Computational Separation Logic</title>
		<proceedings event="pldi11" />

		<summary>A constructive proof that automating separation logic proofs for systems code is easy, despite claims to the contrary coming from SMT solver-centric perspectives. <tt>;-)</tt>  Specifically, this paper introduced <a href="../../bedrock/">Bedrock</a>, a Coq library for foundational verification of code at the assembly level of abstraction.  A mostly-automated separation logic prover uses a modest amount of programmer annotation to drive verification of examples like imperative data structures and a cooperative threading library.</summary>

                <abstract>Several recent projects have shown the feasibility of verifying low-level systems software.  Verifications based on automated theorem-proving have omitted reasoning about <i>first-class code pointers</i>, which is critical for tasks like certifying implementations of threads and processes.  Conversely, verifications that deal with first-class code pointers have featured long, complex, manual proofs.  In this paper, we introduce the Bedrock framework, which supports mostly-automated proofs about programs with the full range of features needed to implement, e.g., language runtime systems.</abstract>

                <abstract>The heart of our approach is in mostly-automated discharge of verification conditions inspired by separation logic.  Our take on separation logic is <i>computational</i>, in the sense that function specifications are usually written in terms of <i>reference implementations in a purely functional language</i>.  Logical quantifiers are the most challenging feature for most automated verifiers; by relying on functional programs (written in the expressive language of the Coq proof assistant), we are able to avoid quantifiers almost entirely.  This leads to some dramatic improvements compared to both the state of the art in classical verification, which we compare against with implementations of data structures like binary search trees and hash tables; and the state of the art in verified programming with code pointers, which we compare against with examples like function memoization and a cooperative threading library.</abstract>

		<abstract><a href="../../bedrock/">Software/proof source code</a></abstract>

		<abstract>Slides are available from my talk at PLDI'11 [<a href="BedrockPLDI11Talk.odp">OpenOffice</a>, <a href="BedrockPLDI11Talk.pdf">PDF</a>].</abstract>
	</pub>

	<pub id="UrFlowOSDI10" kind="conference">
		<author person="adamc" />
		<title>Static Checking of Dynamically-Varying Security Policies in Database-Backed Applications</title>
		<proceedings event="osdi10" />

		<summary>Static analysis for security policies for <a href="http://www.impredicative.com/ur/">Ur/Web</a> applications, based on the key new idea of representing policies as SQL queries.  The analysis follows the well-trod path of symbolic evaluation and automated first-order-logic theorem-proving.</summary>

                <abstract>We present a system for sound static checking of security policies for database-backed Web applications.  Our tool checks a combination of access control and information flow policies, where the policies vary based on database contents.  For instance, one or more database tables may represent an access control matrix, controlling who may read or write which cells of these and other tables.  Using symbolic evaluation and automated theorem-proving, our tool checks these policies statically, requiring no program annotations (beyond the policies themselves) and adding no run-time overhead.  Specifications come in the form of <i>SQL queries as policies</i>: for instance, an application's confidentiality policy is a fixed set of queries, whose results provide an upper bound on what information may be released to the user.  To provide user-dependent policies, we allow queries to depend on <i>what secrets the user knows</i>.  We have used our prototype implementation to check several programs representative of the data-centric Web applications that are common today.</abstract>

                <abstract>From the OSDI'10 talk: slides in <a href="UrFlowOSDI10Talk.odp">OpenOffice</a> and <a href="UrFlowOSDI10Talk.pdf">PDF</a> formats; <a href="http://www.usenix.org/events/osdi10/stream/chlipala/index.html">video</a></abstract>

		<abstract><a href="http://www.impredicative.com/ur/">Project web site</a></abstract>
	</pub>

	<pub id="UrPLDI10" kind="conference">
		<author person="adamc" />
		<title>Ur: Statically-Typed Metaprogramming with Type-Level Record Computation</title>
		<proceedings event="pldi10" />

		<summary>A first paper about <a href="http://www.impredicative.com/ur/">Ur</a>, focusing on the metaprogramming aspect: we can write generic programs that write programs, based on inputs like database schemas, summaries of HTML form configurations, etc., and we can type-check our generators statically without needing to write any proof terms.</summary>

                <abstract><i>Dependent types</i> provide a strong foundation for specifying and verifying rich properties of programs through type-checking.  The earliest implementations combined dependency, which allows types to mention program variables; with type-level computation, which facilitates expressive specifications that compute with recursive functions over types.  While many recent applications of dependent types omit the latter facility, we argue in this paper that it deserves more attention, even when implemented without dependency.</abstract>

                <abstract>In particular, the ability to use functional programs as specifications enables <i>statically-typed metaprogramming</i>: programs write programs, and static type-checking guarantees that the generating process never produces invalid code.  Since our focus is on generic validity properties rather than full correctness verification, it is possible to engineer type inference systems that are very effective in narrow domains.  As a demonstration, we present Ur, a programming language designed to facilitate metaprogramming with first-class records and names.  On top of Ur, we implement Ur/Web, a special standard library that enables the development of modern web applications.  Ad-hoc code generation is already in wide use in the popular web application frameworks, and we show how that generation may be tamed using types, without forcing metaprogram authors to write proofs or forcing metaprogram users to write any fancy types.</abstract>

		<abstract><a href="http://www.impredicative.com/ur/">Project web site</a></abstract>

		<abstract>Slides are available from my talk at PLDI'10 [<a href="UrPLDI10Talk.odp">OpenOffice</a>, <a href="UrPLDI10Talk.pdf">PDF</a>].</abstract>
	</pub>

	<pub id="ImpurePOPL10" kind="conference">
		<author person="adamc" />
		<title>A Verified Compiler for an Impure Functional Language</title>
		<proceedings event="popl10" />

		<summary>A case study in verifying a compiler to an idealized assembly language from an untyped source language with most of the key dynamic features of ML: functions, products, sums, mutable references, and value-carrying exceptions.  Syntax is encoded with parametric higher-order abstract syntax (PHOAS), which makes it possible to avoid almost all bookkeeping having to do with binders and fresh name generation.  The semantics of the object languages are encoded in a new substitution-free style.  All of the proofs are automated with tactic programs that can keep working even after changing the definitions of the languages.</summary>

                <abstract>We present a verified compiler to an idealized assembly language from a small, untyped functional language with mutable references and exceptions.  The compiler is programmed in the Coq proof assistant and has a proof of total correctness with respect to big-step operational semantics for the source and target languages.  Compilation is staged and includes standard phases like translation to continuation-passing style and closure conversion, as well as a common subexpression elimination optimization.  In this work, our focus has been on discovering and using techniques that make our proofs easy to engineer and maintain.  While most programming language work with proof assistants uses very manual proof styles, all of our proofs are implemented as adaptive programs in Coq's tactic language, making it possible to reuse proofs unchanged as new language features are added.</abstract>

                <abstract>In this paper, we focus especially on phases of compilation that rearrange the structure of syntax with nested variable binders.  That aspect has been a key challenge area in past compiler verification projects, with much more effort expended in the statement and proof of binder-related lemmas than is found in standard pencil-and-paper proofs.  We show how to exploit the representation technique of <i>parametric higher-order abstract syntax</i> to avoid the need to prove any of the usual lemmas about binder manipulation, often leading to proofs that are actually shorter than their pencil-and-paper analogues.  Our strategy is based on a new approach to encoding operational semantics which delegates all concerns about substitution to the meta language, without using features incompatible with general-purpose type theories like Coq's logic.</abstract>

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

		<abstract>Slides are available from my talks at POPL'10 [<a href="ImpurePOPL10Talk.odp">OpenOffice</a>, <a href="ImpurePOPL10Talk.pdf">PDF</a>] and WMM'09 [<a href="ImpureWMM09.odp">OpenOffice</a>, <a href="ImpureWMM09.pdf">PDF</a>].</abstract>
	</pub>

	<pub id="YnotICFP09" kind="conference">
		<author person="adamc" />
		<author person="gmalecha" />
		<author person="greg" />
		<author person="shinnar" />
		<author person="ryan" />
		<title>Effective Interactive Proofs for Higher-Order Imperative Programs</title>
		<proceedings event="icfp09" />

		<summary>An approach to automating correctness proofs about higher-order, imperative programs in Coq, based on an extensible simplifier for separation logic formulas</summary>

		<abstract>We present a new approach for constructing and verifying higher-order, imperative programs using the Coq proof assistant.  We build on the past work on the Ynot system, which is based on Hoare Type Theory.  That original system was a proof of concept, where every program verification was accomplished via laborious manual proofs, with much code devoted to uninteresting low-level details.  In this paper, we present a re-implementation of Ynot where verified imperative programming need not be much harder than programming in Haskell.  At the same time, our new system is implemented entirely in Coq source files, showcasing the versatility of that proof assistant as a platform for research on language design and verification.</abstract>

                <abstract>Both versions of the system have been evaluated with case studies in the verification of imperative data structures, such as hash tables with higher-order iterators.  The verification burden in our new system is reduced by at least an order of magnitude compared to the old system, by replacing manual proof with automation.  The core of the automation is a simplification procedure for implications in higher-order separation logic, with hooks that allow programmers to add domain-specific simplification rules.</abstract>
  
                <abstract>We argue for the effectiveness of our infrastructure by verifying a number of data structures and a packrat parser, and we compare to similar efforts within other projects.  Compared to competing approaches to data structure verification, our system includes much less code that must be trusted; namely, about a hundred lines of Coq code defining a program logic.  All of our theorems and decision procedures have or build machine-checkable correctness proofs from first principles, removing opportunities for tool bugs to create faulty verifications.</abstract>

                <abstract>From the ICFP'09 talk: slides in <a href="YnotICFP09Talk.odp">OpenOffice</a> and <a href="YnotICFP09Talk.pdf">PDF</a> formats; <a href="ListTemplate.v">skeleton</a> and <a href="List.v">final solution</a> for the demo; <a href="http://www.vimeo.com/6611351">video</a></abstract>

		<abstract><a href="http://ynot.cs.harvard.edu/">Project web site</a></abstract>
	</pub>

	<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 contrast 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="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>
	10 papers published at peer-reviewed scholarly conferences; 5 at workshops; 2 journal articles
</pubSummary>

<talks>
        <talk event="csw11">
                <title>Web Security via Types and Theorem-Proving in the Ur/Web Programming Language</title>
        </talk>

        <talk event="ibm11">
                <title>Web Security via Types and Theorem-Proving in the Ur/Web Programming Language</title>
        </talk>

        <talk paper="BedrockPLDI11" event="lola11">
                <title>Bedrock: Higher-Order and Automated Proofs about Low-Level Programs</title>
                <kind>invited talk</kind>
        </talk>

        <talk event="berkeley11">
                <title>Ur/Web, a Domain-Specific Functional Programming Language for Modern Web Applications</title>
        </talk>

        <talk paper="BedrockPLDI11" event="pldi11">
                <title>Mostly-Automated Verification of Low-Level Programs in Computational Separation Logic</title>
        </talk>

        <talk event="mit10">
                <title>Ur/Web, a Domain-Specific Functional Programming Language for Modern Web Applications</title>
        </talk>

        <talk paper="UrFlowOSDI10" event="osdi10">
                <title>Static Checking of Dynamically-Varying Security Policies in Database-Backed Applications</title>
        </talk>

        <talk event="msfp10">
                <title>Foundational Program Verification in Coq with Automated Proofs</title>
                <kind>invited tutorial</kind>
                <url>http://adam.chlipala.net/msfp10/</url>
        </talk>

        <talk event="dag10">
                <title>Cost-Effective and Foundational Verification of Low-Level Code</title>
        </talk>

        <talk event="itu10">
                <title>Ur/Web, a Domain-Specific Functional Programming Language for Modern Web Applications</title>
        </talk>

        <talk event="elc10">
                <title>Ur/Web: A Statically-Typed Language for Building Web Applications from Components</title>
                <kind>invited talk</kind>
        </talk>

        <talk event="mlpa10">
                <title>A Bottom-Up Approach to Safe Low-Level Programming</title>
                <kind>invited talk</kind>
        </talk>

        <talk event="dtp10">
                <title>Generating Pieces of Web Applications with Type-Level Programming</title>
        </talk>

        <talk paper="UrPLDI10" event="pldi10">
                <title>Ur: Statically-Typed Metaprogramming with Type-Level Record Computation</title>
        </talk>

        <talk event="radical10">
                <title>Safe Database Abstractions with Type-Level Record Computation</title>
                <kind>invited talk</kind>
        </talk>

        <talk event="blisp10">
                <title>A Sane Approach to Modern Web Application Development</title>
        </talk>

        <talk paper="ImpurePOPL10" event="popl10">
                <title>A Verified Compiler for an Impure Functional Language</title>
        </talk>

        <talk event="fsug09">
                <title>Towards the Ultimate Web Application Framework, via Fancy Types</title>
        </talk>

        <talk event="njpls0910">
                <title>Syntactic Proofs of Compositional Compiler Correctness</title>
        </talk>

        <talk event="defun09">
                <title>Metaprogramming AJAX Apps with Static Types</title>
                <url>http://www.impredicative.com/ur/defun09/</url>
        </talk>

        <talk paper="ImpurePOPL10" event="wmm09">
                <title>Engineering a Verified Functional Language Compiler</title>
                <kind>invited talk</kind>
        </talk>

        <talk paper="YnotICFP09" event="icfp09">
                <title>Effective Interactive Proofs for Higher-Order Imperative Programs</title>
        </talk>

        <talk event="msr09">
                <title>Metaprogramming AJAX Apps with Static Types</title>
        </talk>

        <talk event="neu09">
                <title>Liberating Semi-Automated PL Proofs from Binder Bookkeeping</title>
        </talk>

        <talk event="bu09">
                <title>Liberating Semi-Automated PL Proofs from Binder Bookkeeping</title>
        </talk>

	<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>Assistant Professor of Computer Science</title>
	<important/>
	<shortOrg>MIT</shortOrg>
	<atOrg org="csail" />
	<atOrg org="mit_eecs" />
	<atOrg org="mit" />
	<when>
		<start>
			<month>7</month>
			<year>2011</year>
		</start>
                <end_tbd/>
	</when>
</job>

<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>
                  <month>6</month>
                  <year>2011</year>
                </end>
	</when>
        <boss title="Advisor" person="greg" />

	<task>Led a reimplementation of the Ynot system, with a focus on proof automation</task>
        <task>Research on cost-effective program verification</task>
</job>

<job>
	<shortOrg>certified programming class, Harvard University</shortOrg>
	<title>Instructor</title>
        <important/>
	<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>
		Investigated 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>
	<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>
	<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://ndseg.asee.org/</url>
		<year>2004</year>
	</fellowship>

	<fellowship>
		<important/>
		<name>National Science Foundation Graduate Research Fellowship</name>
		<url>http://www.nsfgrfp.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.nsfgrfp.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="fossacs13" name="program committee"/>
        <role event="lfmtp12" name="program co-chair"/>
        <role event="itp12" name="program committee"/>
        <role event="coq12" name="program chair"/>
        <role event="cav12" name="program committee"/>
        <role event="tldi12" name="program committee"/>
        <role event="popl12" name="program committee"/>
        <role event="icfp11" name="program committee"/>
        <role event="ssv11" name="program committee"/>
        <role event="coq11" name="program committee"/>
        <role event="fcs11" name="program committee"/>
        <role event="ssv10" name="program committee"/>
        <role event="msfp10" name="program committee"/>
        <role event="coq10" name="program committee"/>
        <role event="plpv10" name="program committee"/>
        <role event="lfmtp09" name="program committee"/>
        <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" />
	<for event="pldi09" />
	<for event="icfp09" />
	<for event="popl10" />
	<for event="fossacs10" />
	<for event="tacas10" />
	<for event="mfps10" />
	<for event="ppdp10" />
	<for event="hor10" />
	<for event="icfp10" />
	<for event="popl11" />
	<for event="vmcai11" />
	<for event="esop11" />
	<for event="pldi11" />
	<for event="rta11" />
        <for event="gcm10" />
        <for event="vstte12" />
	<for event="fossacs12" />
</reviewed>

<referee>
        <for journal="esl"/>
        <for journal="hosc"/>
        <for journal="ipl"/>
        <for journal="jacm"/>
        <for journal="jar"/>
        <for journal="jfp"/>
        <for journal="jfr"/>
        <for journal="scp"/>
        <for journal="toplas"/>
</referee>

<extPhd>
        <person name="Wilmer Ricciotti" url="http://www.cs.unibo.it/~ricciott/" uni="U. of Bologna" uniUrl="http://www.cs.unibo.it/"/>
</extPhd>

<software>
	<program><a href="http://www.impredicative.com/ur/">Ur/Web</a>, a 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 of <a href="http://hcoop.net/">HCoop, Inc.</a>, a democratically-run Internet hosting cooperative</activity>
	<activity>Main administrator and organizer, <a href="http://www.tpu.org/">Teen Programmers Unite</a>, 1997-2001</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>

