<?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>Design and implementation of computer systems supporting programmer productivity, correctness, security, and performance (including compilers, computer architecture, cryptography, databases, and operating systems)</interests>
<interests>Design, implementation, and applications of interactive proof assistants</interests>
<interests>Programming languages (broadly construed to include all development tools) and formal methods (for software and hardware)</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="acwright">
  <name>Andrew Wright</name>
  <url>https://www.rle.mit.edu/isg/people_andy_wright.htm</url>
</person>

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

<person id="akonradi">
  <name>Alex Konradi</name>
  <url>https://www.linkedin.com/in/alex-konradi-89604081/</url>
</person>

<person id="alicerlee">
  <name>Alice Lee</name>
  <url>https://www.linkedin.com/in/alicerlee</url>
</person>

<person id="andersk">
  <name>Anders Kaseorg</name>
  <url>https://github.com/andersk</url>
</person>

<person id="andreser">
  <name>Andres Erbsen</name>
  <url>https://andres.systems/</url>
</person>

<person id="antonis">
  <name>Antonis Stampoulis</name>
  <url>http://astampoulis.github.com/</url>
</person>

<person id="arthur">
  <name>Arthur Charguéraud</name>
  <url>https://www.chargueraud.org/</url>
</person>

<person id="appel">
  <name>Andrew W. Appel</name>
  <url>https://www.cs.princeton.edu/~appel/</url>
</person>

<person id="arvind">
  <name>Arvind</name>
  <url>http://csg.csail.mit.edu/Users/arvind/</url>
</person>

<person id="ashlin">
  <name>Ashley Lin</name>
  <url>https://github.com/ashley-lin</url>
</person>

<person id="atalay">
  <name>Atalay Ileri</name>
  <url>https://github.com/Atalay-Ileri</url>
</person>

<person id="azhang03">
  <name>Anna Zhang</name>
  <url>https://www.linkedin.com/in/annazhang03/</url>
</person>

<person id="bcpierce">
  <name>Benjamin C. Pierce</name>
  <url>http://www.cis.upenn.edu/~bcpierce/</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="bendy">
  <name>Benjamin Delaware</name>
  <url>https://www.cs.purdue.edu/homes/bendy/</url>
</person>

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

<person id="bkaiser">
  <name>Benjamin Kaiser</name>
  <url>https://benkaiser.org/</url>
</person>

<person id="braibant">
  <name>Thomas Braibant</name>
  <url>http://braibant.github.io/</url>
</person>

<person id="bthom">
  <name>Thomas Bourgeat</name>
  <url>https://people.csail.mit.edu/bthom/</url>
</person>

<person id="carotti">
  <name>Thomas Carotti</name>
  <url>https://github.com/Carotti</url>
</person>

<person id="chitchanok.chuengsatiansup">
  <name>Chitchanok Chuengsatiansup</name>
  <url>https://cs.adelaide.edu.au/~cchuengs/</url>
</person>

<person id="chuyues">
  <name>Chuyue Sun</name>
  <url>http://web.mit.edu/chuyues/www/</url>
</person>

<person id="cj">
  <name>Christian J. Bell</name>
  <url>http://people.csail.mit.edu/cj/</url>
</person>

<person id="clark.wood">
  <name>Clark Wood</name>
  <url>https://www.linkedin.com/in/clark-wood/</url>
</person>

<person id="cpitcla">
  <name>Clément Pit-Claudel</name>
  <url>http://pit-claudel.fr/clement/</url>
</person>

<person id="cuellar">
  <name>Santiago Cuellar</name>
  <url>http://scholar.princeton.edu/scuellar/</url>
</person>

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

<person id="danwcpark">
  <name>Daniel Park</name>
  <url>https://dancwpark.com/</url>
</person>

<person id="davidwu9">
  <name>David Wu</name>
  <url>https://github.com/daviduwu9</url>
</person>

<person id="dijamner">
  <name>Dustin Jamner</name>
  <url>https://jamner.net/</url>
</person>

<person id="diwang">
  <name>Di Wang</name>
  <url>https://www.cs.cmu.edu/~diw3/</url>
</person>

<person id="dmz">
  <name>Daniel Ziegler</name>
  <url>http://events.ccc.de/congress/2014/Fahrplan/speakers/5081.html</url>
</person>

<person id="dspivak">
  <name>David Spivak</name>
  <url>http://math.mit.edu/~dspivak/</url>
</person>

<person id="dukhovni">
  <name>Samuel Duchovni</name>
  <url>https://github.com/sdukhovni</url>
</person>

<person id="eberinge">
  <name>Lennart Beringer</name>
  <url>https://www.cs.princeton.edu/~eberinge/</url>
</person>

<person id="emjun">
  <name>Eunice Jun</name>
  <url>https://emjun.github.io/</url>
</person>

<person id="ezyang">
  <name>Edward Z. Yang</name>
  <url>http://ezyang.com/</url>
</person>

<person id="genkin">
  <name>Daniel Genkin</name>
  <url>https://faculty.cc.gatech.edu/~genkin/</url>
</person>

<person id="gilbo">
  <name>Gilbert Bernstein</name>
  <url>http://www.gilbertbernstein.com/</url>
</person>

<person id="gkammer">
  <name>Gabriel Kammer</name>
  <url>https://kammer.xyz/</url>
</person>

<person id="gmalecha">
  <name>Gregory Malecha</name>
  <url>https://gmalecha.github.io/</url>
</person>

<person id="greg">
  <name>Greg Morrisett</name>
  <url>http://www.cs.cornell.edu/~jgm/</url>
</person>

<person id="gregoire">
  <name>Thomas Gregoire</name>
  <url>https://www.linkedin.com/in/thgregoire1</url>
</person>

<person id="gruetter">
  <name>Samuel Gruetter</name>
  <url>https://samuelgruetter.net/</url>
</person>

<person id="hchen">
  <name>Haogang Chen</name>
  <url>http://pdos.csail.mit.edu/~hchen/</url>
</person>

<person id="ijc">
  <name>Ian Clester</name>
  <url>https://ijc8.me/</url>
</person>

<person id="ikebuchi">
  <name>Mirai Ikebuchi</name>
  <url>https://mir-ikbch.github.io/</url>
</person>

<person id="jadep">
  <name>Jade Philipoom</name>
  <url>https://semiprecious.net/</url>
</person>

<person id="jgross">
  <name>Jason Gross</name>
  <url>https://jasongross.github.io/</url>
</person>

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

<person id="joel.kuepper">
  <name>Joel Kuepper</name>
  <url>https://researchers.adelaide.edu.au/profile/joel.kuepper</url>
</person>

<person id="joonwonc">
  <name>Joonwon Choi</name>
  <url>http://joonwon.net/c/</url>
</person>

<person id="jrk">
  <name>Jonathan Ragan-Kelley</name>
  <url>http://people.csail.mit.edu/jrk/</url>
</person>

<person id="jzanders">
  <name>Julian Zanders</name>
  <url>https://www.researchgate.net/profile/Julian-Zanders</url>
</person>

<person id="kaashoek">
  <name>Frans Kaashoek</name>
  <url>http://pdos.csail.mit.edu/~kaashoek/</url>
</person>

<person id="kalke">
  <name>Martine Kalke</name>
  <url>https://www.ll.mit.edu/biographies/martine-m-kalke</url>
</person>

<person id="kamil">
  <name>Shoaib Kamil</name>
  <url>https://research.adobe.com/person/shoaib-kamil/</url>
</person>

<person id="kohler">
  <name>Eddie Kohler</name>
  <url>http://read.seas.harvard.edu/~kohler/</url>
</person>

<person id="kosinw">
  <name>Kosi Nwabueze</name>
  <url>https://www.linkedin.com/in/kosinw/</url>
</person>

<person id="kqy">
  <name>Katherine Ye</name>
  <url>https://www.cs.cmu.edu/~kqy/</url>
</person>

<person id="lamanda">
  <name>Amanda Liu</name>
  <url>http://people.csail.mit.edu/lamanda/</url>
</person>

<person id="jzliu">
  <name>Jiazheng Liu</name>
  <url>https://www.linkedin.com/in/jiazheng-liu-95a552197/</url>
</person>

<person id="lesani">
  <name>Mohsen Lesani</name>
  <url>https://mohsenlesani.github.io/</url>
</person>

<person id="lazard">
  <name>David Lazar</name>
  <url>http://www.csail.mit.edu/user/3604</url>
</person>

<person id="leaf">
  <name>Leaf Petersen</name>
  <url>http://www.leafpetersen.com/</url>
</person>

<person id="londonbielicke">
  <name>London Bielicke</name>
  <url>https://londonmae.github.io/</url>
</person>

<person id="lucena">
  <name>Brian Lucena</name>
  <url>https://www.linkedin.com/in/brianlucena/</url>
</person>

<person id="lukesci">
  <name>Luke Sciarappa</name>
  <url>https://github.com/lsciarappa</url>
</person>

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

<person id="mcarbin">
  <name>Michael Carbin</name>
  <url>http://people.csail.mit.edu/mcarbin/</url>
</person>

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

<person id="mengjiay">
  <name>Mengjia Yan</name>
  <url>https://people.csail.mit.edu/mengjia/</url>
</person>

<person id="miraya">
  <name>Miraya Poddar-Agrawal</name>
  <url>https://www.linkedin.com/in/rajashreeagrawal/</url>
</person>

<person id="ndave">
  <name>Nirav Dave</name>
  <url>http://people.csail.mit.edu/ndave/</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="nickolai">
  <name>Nickolai Zeldovich</name>
  <url>http://people.csail.mit.edu/nickolai/</url>
</person>

<person id="owenc">
  <name>Owen Conoly</name>
  <url>https://www.csail.mit.edu/person/owen-conoly</url>
</person>

<person id="phulin">
  <name>Patrick Hulin</name>
  <url>https://www.linkedin.com/in/patrick-hulin-027939109/</url>
</person>

<person id="pratap">
  <name>Pratap Singh</name>
  <url>https://pratap.dev/</url>
</person>

<person id="ql101">
  <name>Qinglan Luo</name>
  <url>https://www.linkedin.com/in/blanca-luo-434097279/</url>
</person>

<person id="rnag">
  <name>Ritam Nag</name>
  <url>https://www.linkedin.com/in/ritam-nag-a019381b2/</url>
</person>

<person id="robertkcunningham">
  <name>Robert Cunningham</name>
  <url>https://www.research.pitt.edu/people/robert-k-cunningham</url>
</person>

<person id="rogerdtz">
  <name>Tingzhen Dong</name>
  <url>https://github.com/RogerDTZ</url>
</person>

<person id="rsloan">
  <name>Robert Sloan</name>
  <url>https://blog.modt.io/</url>
</person>

<person id="rupak">
  <name>Rupak Majumdar</name>
  <url>http://www.mpi-sws.org/~rupak/</url>
</person>

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

<person id="ryan">
  <name>Ryan Wisnesky</name>
  <url>http://wisnesky.net/</url>
</person>

<person id="schneck">
  <name>Robert Schneck</name>
  <citeName>Robert R. Schneck</citeName>
  <url>http://tupelo-schneck.org/robert/</url>
</person>

<person id="shao">
  <name>Zhong Shao</name>
  <url>http://www.cs.yale.edu/homes/shao/</url>
</person>

<person id="shardulc">
  <name>Shardul Chiplunkar</name>
  <url>https://etaoin-shrdlu.xyz/</url>
</person>

<person id="sherman">
  <name>Benjamin Sherman</name>
  <url>http://www.ben-sherman.net/</url>
</person>

<person id="shinnar">
  <name>Avraham Shinnar</name>
  <url>http://researcher.watson.ibm.com/researcher/view.php?person=us-shinnar</url>
</person>

<person id="shixins">
  <name>Shixin Song</name>
  <url>https://zhizhuoxin.github.io/</url>
</person>

<person id="sorawit">
  <name>Sorawit Suriyakarn</name>
  <url>https://github.com/sorawit</url>
</person>

<person id="stellal">
  <name>Stella Lau</name>
  <url>https://people.csail.mit.edu/stellal/</url>
</person>

<person id="stevez">
  <name>Steve Zdancewic</name>
  <url>http://www.cis.upenn.edu/~stevez/</url>
</person>

<person id="swang93">
  <name>Stephanie Wang</name>
  <url>https://github.com/stephanie-wang</url>
</person>

<person id="sweirich">
  <name>Stephanie Weirich</name>
  <url>http://www.cis.upenn.edu/~sweirich/</url>
</person>

<person id="swtian">
  <name>Samuel Tian</name>
  <url>https://github.com/samuel-tian</url>
</person>

<person id="tah">
	<name>Thomas Henzinger</name>
	<url>http://pub.ist.ac.at/~tah/</url>
</person>

<person id="tbraje">
	<name>Timothy Braje</name>
	<url>https://www.ll.mit.edu/biographies/timothy-m-braje</url>
</person>

<person id="tchajed">
	<name>Tej Chajed</name>
	<url>https://github.com/tchajed</url>
</person>

<person id="theo">
	<name>Théo Zimmermann</name>
	<url>https://www.theozimmermann.net/en/</url>
</person>

<person id="tockman">
	<name>Andy Tockman</name>
	<url>https://tck.mn/</url>
</person>

<person id="vfukala">
	<name>Viktor Fukala</name>
	<url>https://www.linkedin.com/in/viktor-fukala/</url>
</person>

<person id="vmurali">
	<name>Muralidaran Vijayaraghavan</name>
	<url>http://people.csail.mit.edu/vmurali/</url>
</person>

<person id="wagner">
        <name>Markus Wagner</name>
        <url>http://www.acrocon.com/~wagner/</url>
</person>

<person id="wagner.andr">
	<name>Andrew Wagner</name>
	<url>https://github.com/a-wagner</url>
</person>

<person id="wangpeng">
        <name>Peng Wang</name>
        <url>http://people.csail.mit.edu/wangpeng/</url>
</person>

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

<person id="xi">
        <name>Xi Wang</name>
        <url>http://homes.cs.washington.edu/~xi/</url>
</person>

<person id="xialiyao">
	<name>Li-yao Xia</name>
	<url>https://poisson.chat/</url>
</person>

<person id="ye202">
        <name>Qianchuan Ye</name>
        <url>https://www.cs.purdue.edu/homes/ye202/</url>
</person>

<person id="yval">
        <name>Yuval Yarom</name>
        <url>https://cs.adelaide.edu.au/~yval/</url>
</person>

<person id="ziv">
	<name>Ziv Scully</name>
	<url>http://ziv.codes/</url>
</person>

<person id="ztatlock">
	<name>Zachary Tatlock</name>
	<url>http://homes.cs.washington.edu/~ztatlock/</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://cseweb.ucsd.edu/~rjhala/blast.html</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.eastpennsd.org/ehs/</url>
</org>

<org id="acm">
        <name>Association for Computing Machinery</name>
	<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="rs">
        <name>Royal Society</name>
	<abbrev>Royal Society</abbrev>
	<url>https://royalsociety.org/</url>
</org>

<org id="springer">
	<name>Springer-Verlag</name>
	<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="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="sp12">
        <name>IEEE Symposium on Security &amp; Privacy 2012</name>
	<abbrev>S&amp;P'12</abbrev>
	<url>http://www.ieee-security.org/TC/SP2012/</url>
	<month month="may" />
	<year>2012</year>
	<location>San Francisco, CA, USA</location>
</event>

<event id="haskell12">
        <name>ACM SIGPLAN Haskell Symposium 2012</name>
	<abbrev>Haskell'12</abbrev>
        <url>http://www.haskell.org/haskell-symposium/2012/</url>
        <month month="sep" />
	<year>2012</year>
	<location>Copenhagen, Denmark</location>
	<copyright org="acm" />
</event>

<event id="nepls26">
	<name>26th New England Programming Languages and Systems Symposium</name>
	<abbrev>NEPLS 26</abbrev>
	<url>http://www.nepls.org/Events/26/home.html</url>
	<month month="dec" />
	<year>2012</year>
	<location>Portland, ME, USA</location>
</event>

<event id="cpp12">
	<name>2nd International Conference on Certified Programs and Proofs</name>
	<abbrev>CPP'12</abbrev>
	<url>http://cpp12.kuis.kyoto-u.ac.jp/</url>
	<month month="dec" />
	<year>2012</year>
	<location>Kyoto, Japan</location>
</event>

<event id="padl13">
	<name>15th International Symposium on Practical Aspects of Declarative Languages</name>
	<abbrev>PADL'13</abbrev>
	<url>http://www.it.uu.se/conf/padl2013/</url>
	<month month="jan" />
	<year>2013</year>
	<location>Rome, Italy</location>
</event>

<event id="ddfp13">
	<name>Data Driven Functional Programming Workshop 2013</name>
	<abbrev>DDFP'13</abbrev>
	<url>http://research.microsoft.com/en-us/events/ddfp2013/</url>
	<month month="jan" />
	<year>2013</year>
	<location>Rome, Italy</location>
</event>

<event id="lfcs13">
	<name>Symposium on Logical Foundations of Computer Science 2013</name>
	<abbrev>LFCS'13</abbrev>
	<url>http://lfcs.info/lfcs13/</url>
	<month month="jan" />
	<year>2013</year>
	<location>San Diego, California, USA</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>

<event id="pldi13">
        <name>ACM SIGPLAN 2013 Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'13</abbrev>
	<url>http://pldi2013.ucombinator.org/</url>
	<month month="jun" />
	<year>2013</year>
	<location>Seattle, Washington, USA</location>
	<copyright org="acm" />
</event>

<event id="popl13">
	<name>40th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'13</abbrev>
	<url>http://popl.mpi-sws.org/2013/</url>
	<month month="jan" />
	<year>2013</year>
	<location>Rome, Italy</location>
	<copyright org="acm" />
</event>

<event id="popltut13">
	<name>POPL 2013 TutorialFest</name>
	<abbrev>POPL'13 TutorialFest</abbrev>
	<url>http://wrigstad.com/popl13/tutorialfest.html</url>
	<month month="jan" />
	<year>2013</year>
	<location>Rome, Italy</location>
	<copyright org="acm" />
</event>

<event id="dsn13">
	<name>43th Annual IEEE/IFIP International Conference on Dependable Systems and Networks</name>
	<abbrev>DSN'13</abbrev>
	<url>http://2013.dsn.org/</url>
	<month month="jun" />
	<year>2013</year>
	<location>Budapest, Hungary</location>
</event>

<event id="itp13">
	<name>Interactive Theorem Proving - Fourth International Conference</name>
	<abbrev>ITP'13</abbrev>
	<url>http://itp2013.inria.fr/</url>
	<month month="jul" />
	<year>2013</year>
	<location>Rennes, France</location>
</event>

<event id="usenixsec13">
	<name>22nd USENIX Security Symposium</name>
	<abbrev>USENIX Security'13</abbrev>
	<url>https://www.usenix.org/conference/usenixsecurity13</url>
	<month month="aug" />
	<year>2013</year>
	<location>Washington, D.C., USA</location>
</event>

<event id="fpcdsl13">
	<name>Functional Programming Concepts in Domain-Specific Languages</name>
	<abbrev>FPCDSL'13</abbrev>
	<url>http://quantum.bbn.com/FPCDSL/</url>
	<month month="sep" />
	<year>2013</year>
	<location>Boston, MA, USA</location>
</event>

<event id="cav13">
	<name>25th International Conference on Computer Aided Verification</name>
	<abbrev>CAV'13</abbrev>
	<url>http://cav2013.forsyte.at/</url>
	<month month="jul" />
	<year>2013</year>
	<location>Saint Petersburg, Russia</location>
</event>

<event id="lfmtp13">
        <name>8th International Workshop on Logical Frameworks and Meta-languages: Theory and Practice</name>
	<abbrev>LFMTP'13</abbrev>
	<url>http://complogic.cs.mcgill.ca/lfmtp13</url>
	<month month="sep" />
	<year>2013</year>
	<location>Boston, MA, USA</location>
</event>

<event id="icfp13">
        <name>18th ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'13</abbrev>
        <url>http://www.icfpconference.org/icfp2013/</url>
        <month month="sep" />
	<year>2013</year>
	<location>Boston, MA, USA</location>
</event>

<event id="hope13">
        <name>The 2nd ACM SIGPLAN Workshop on Higher-Order Programming with Effects</name>
	<abbrev>HOPE'13</abbrev>
        <url>http://hope2013.mpi-sws.org/</url>
        <month month="sep" />
	<year>2013</year>
	<location>Boston, MA, USA</location>
</event>

<event id="ppdp13">
	<name>15th International Symposium on Principles and Practice of Declarative Programming</name>
	<abbrev>PPDP'13</abbrev>
	<url>http://users.ugent.be/~tschrijv/PPDP2013/</url>
	<year>2013</year>
	<location>Madrid, Spain</location>
</event>

<event id="plpv14">
	<name>Programming Languages meets Program Verification Workshop</name>
	<url>http://www.cse.chalmers.se/~nad/plpv-2014/</url>
	<abbrev>PLPV'14</abbrev>
	<month month="jan" />
	<year>2014</year>
	<location>San Diego, CA, USA</location>
</event>

<event id="popl14">
	<name>41st ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'14</abbrev>
	<url>http://popl.mpi-sws.org/2014/</url>
	<month month="jan" />
	<year>2014</year>
	<location>San Diego, CA, USA</location>
	<copyright org="acm" />
</event>

<event id="script13">
        <name>Workshop on Secure Cloud and Reactive Internet Programming Technology</name>
	<abbrev>SCRIPT'13</abbrev>
	<url>http://soft.vub.ac.be/script/</url>
	<month month="nov" />
	<year>2013</year>
	<location>Brussels, Belgium</location>
</event>

<event id="twitter14">
        <name>Twitter, Inc.</name>
	<abbrev>Twitter, Inc., San Francisco</abbrev>
	<month month="jan" />
	<year>2014</year>
	<location>San Francisco, CA</location>
</event>

<event id="esop14">
	<name>23rd European Symposium on Programming</name>
	<abbrev>ESOP'14</abbrev>
	<url>http://flint.cs.yale.edu/esop2014/</url>
	<month month="apr" />
	<year>2014</year>
	<location>Grenoble, France</location>
</event>

<event id="atc14">
	<name>2014 USENIX Annual Technical Conference</name>
	<abbrev>USENIX ATC'14</abbrev>
	<url>https://www.usenix.org/conference/atc14</url>
	<month month="jun" />
	<year>2014</year>
	<location>Philadelphia, PA, USA</location>
</event>

<event id="ihp14">
  <name>IHP Workshop on Certification of High-Level and Low-Level Programs</name>
  <abbrev>IHP Workshop on Certification of High-Level and Low-Level Programs</abbrev>
  <url>https://ihp2014.pps.univ-paris-diderot.fr/doku.php?id=workshop_5</url>
  <month month="jul" />
  <year>2014</year>
  <location>Paris, France</location>
</event>

<event id="lfmtp14">
        <name>9th International Workshop on Logical Frameworks and Meta-languages: Theory and Practice</name>
	<abbrev>LFMTP'14</abbrev>
	<url>http://complogic.cs.mcgill.ca/lfmtp14/</url>
	<month month="jul" />
	<year>2014</year>
	<location>Vienna, Austria</location>
</event>

<event id="itp14">
	<name>5th International Conference on Interactive Theorem Proving</name>
	<abbrev>ITP'14</abbrev>
	<url>http://www.cs.uwyo.edu/~ruben/itp-2014/</url>
	<month month="jul" />
	<year>2014</year>
	<location>Vienna, Austria</location>
</event>

<event id="icfp14">
        <name>19th ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'14</abbrev>
        <url>http://www.icfpconference.org/icfp2014/</url>
        <month month="sep" />
	<year>2014</year>
	<location>Gothenburg, Sweden</location>
</event>

<event id="bh14">
  <name>Boston Haskell</name>
  <abbrev>Boston Haskell</abbrev>
  <url>http://www.meetup.com/Boston-Haskell/events/190579132/</url>
  <month month="aug" />
  <year>2014</year>
  <location>Cambridge, MA</location>
</event>

<event id="kyoto14">
  <name>Kyoto University RIMS</name>
  <abbrev>Kyoto University RIMS</abbrev>
  <url>http://www.kurims.kyoto-u.ac.jp/en/</url>
  <month month="dec" />
  <year>2014</year>
  <location>Kyoto, Japan</location>
</event>

<event id="tpp14">
	<name>Theorem proving and provers for reliable theory and implementations</name>
	<abbrev>TPP'14</abbrev>
	<url>http://imi.kyushu-u.ac.jp/lasm/tpp2014/</url>
	<month month="dec" />
	<year>2014</year>
	<location>Fukuoka, Japan</location>
</event>

<event id="msr14">
	<name>Microsoft Research Cambridge, PPT Group</name>
	<abbrev>Microsoft Research Cambridge, PPT Group</abbrev>
	<url>http://research.microsoft.com/en-us/groups/ppt/</url>
	<month month="dec" />
	<year>2014</year>
	<location>Cambridge, England</location>
</event>

<event id="osdi14">
	<name>11th USENIX Symposium on Operating System Design and Implementation</name>
	<abbrev>OSDI'14</abbrev>
	<url>https://www.usenix.org/conference/osdi14/</url>
	<month month="oct" />
	<year>2014</year>
	<location>Broomfield, CO, USA</location>
</event>

<event id="oopsla14">
	<name>2014 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages, &amp; Applications</name>
	<abbrev>OOPSLA'14</abbrev>
	<url>http://2014.splashcon.org/track/oopsla2014</url>
	<month month="oct" />
	<year>2014</year>
	<location>Portland, OR, USA</location>
</event>

<event id="popl15">
	<name>42nd ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'15</abbrev>
	<url>http://popl.mpi-sws.org/2015/</url>
	<month month="jan" />
	<year>2015</year>
	<location>Mumbai, India</location>
</event>

<event id="popl15_src">
	<name>POPL'15 Student Research Competition</name>
	<abbrev>SRC</abbrev>
	<url>http://popl.mpi-sws.org/2015/posters2.html</url>
	<month month="jan" />
	<year>2015</year>
	<location>Mumbai, India</location>
</event>

<event id="plmw15">
	<name>ACM SIGPLAN Programming Languages Mentoring Workshop 2015</name>
	<abbrev>PLMW'15</abbrev>
	<url>http://plmw15.iisc-seal.net/</url>
	<month month="jan" />
	<year>2015</year>
	<location>Mumbai, India</location>
</event>

<event id="coqpl15">
	<name>The First International Workshop on Coq for PL</name>
	<abbrev>CoqPL'15</abbrev>
	<url>http://coqpl.cs.washington.edu/</url>
	<month month="jan" />
	<year>2015</year>
	<location>Mumbai, India</location>
</event>

<event id="esop15">
	<name>24th European Symposium on Programming</name>
	<abbrev>ESOP'15</abbrev>
	<url>http://conf.researchr.org/home/esop-2015</url>
	<month month="apr" />
	<year>2015</year>
	<location>London, United Kingdom</location>
</event>

<event id="lics15">
	<name>30th Annual ACM/IEEE Symposium on Logic in Computer Science</name>
	<url>http://lics.rwth-aachen.de/lics15/</url>
	<abbrev>LICS'15</abbrev>
	<month month="jul" />
	<year>2015</year>
	<location>Kyoto, Japan</location>
</event>

<event id="oopsla15">
	<name>2015 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages, &amp; Applications</name>
	<abbrev>OOPSLA'15</abbrev>
	<url>http://2015.splashcon.org/track/oopsla</url>
	<month month="oct" />
	<year>2015</year>
	<location>Pittsburgh, PA, USA</location>
</event>

<event id="hotos15">
	<name>15th Workshop on Hot Topics in Operating Systems</name>
	<abbrev>HotOS'15</abbrev>
	<url>https://www.usenix.org/conference/hotos15</url>
	<month month="may" />
	<year>2015</year>
	<location>Kartause Ittingen, Switzerland</location>
</event>

<event id="oplss15">
	<name>Oregon Programming Languages Summer School</name>
	<abbrev>OPLSS'15</abbrev>
	<url>https://www.cs.uoregon.edu/research/summerschool/summer15/</url>
	<month month="jun" />
	<year>2015</year>
	<location>Eugene, OR, USA</location>
</event>

<event id="cav15">
	<name>27th International Conference on Computer Aided Verification</name>
	<abbrev>CAV'15</abbrev>
	<url>http://i-cav.org/2015/</url>
	<month month="jul" />
	<year>2015</year>
	<location>San Francisco, CA, USA</location>
</event>

<event id="icfp15">
        <name>20th ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'15</abbrev>
        <url>http://www.icfpconference.org/icfp2015/</url>
        <month month="aug" />
	<year>2015</year>
	<location>Vancouver, BC, Canada</location>
</event>

<event id="imdea15">
	<abbrev>IMDEA Software</abbrev>
        <url>http://software.imdea.org/</url>
	<month month="jul" />
	<year>2015</year>
</event>

<event id="cyberx">
	<name>MITx online course: Cybersecurity: Technology, Application and Policy</name>
	<abbrev>MITx online course: Cybersecurity: Technology, Application and Policy</abbrev>
	<url>https://mitprofessionalx.mit.edu/courses/course-v1:MITProfessionalX+CSx+2015_T1/about</url>
	<month month="sep" />
	<year>2015</year>
	<location>Cambridge, MA, USA</location>
</event>

<event id="sosp15">
	<name>25th ACM Symposium on Operating Systems Principles</name>
	<abbrev>SOSP'15</abbrev>
	<url>http://www.ssrc.ucsc.edu/sosp15/</url>
	<month month="oct" />
	<year>2015</year>
	<location>Monterey, CA, USA</location>
</event>

<event id="nepls28">
	<name>28th New England Programming Languages and Systems Symposium</name>
	<abbrev>NEPLS 28</abbrev>
	<url>http://www.nepls.org/Events/28/home.html</url>
	<month month="nov" />
	<year>2015</year>
	<location>Medford, MA, USA</location>
</event>

<event id="cpp16">
	<name>5th International Conference on Certified Programs and Proofs</name>
	<abbrev>CPP'16</abbrev>
	<url>http://people.csail.mit.edu/adamc/cpp16/</url>
	<month month="jan" />
	<year>2016</year>
	<location>St. Petersburg, FL, USA</location>
</event>

<event id="pepm16">
	<name>ACM SIGPLAN 2016 Workshop on Partial Evaluation and Program Manipulation</name>
	<abbrev>PEPM'16</abbrev>
	<url>http://conf.researchr.org/home/pepm-2016</url>
	<month month="jan" />
	<year>2016</year>
	<location>St. Petersburg, FL, USA</location>
</event>

<event id="popl16">
	<name>43rd ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'16</abbrev>
	<url>http://popl16.sigplan.org/</url>
	<month month="jan" />
	<year>2016</year>
	<location>St. Petersburg, FL, USA</location>
</event>

<event id="coqpl16">
	<name>The Second International Workshop on Coq for PL</name>
	<abbrev>CoqPL'16</abbrev>
	<url>http://conf.researchr.org/home/CoqPL-2016</url>
	<month month="jan" />
	<year>2016</year>
	<location>St. Petersburg, FL, USA</location>
</event>

<event id="sp16">
	<name>37th IEEE Symposium on Security and Privacy</name>
	<abbrev>S&amp;P'16</abbrev>
	<url>http://www.ieee-security.org/TC/SP2016/</url>
	<month month="may" />
	<year>2016</year>
	<location>San Jose, CA, USA</location>
</event>

<event id="cav16">
	<name>28th International Conference on Computer Aided Verification</name>
	<abbrev>CAV'16</abbrev>
	<url>http://i-cav.org/2016/</url>
	<month month="jul" />
	<year>2016</year>
	<location>Toronto, ON, Canada</location>
</event>

<event id="itp16">
	<name>Interactive Theorem Proving - Seventh International Conference</name>
	<abbrev>ITP'16</abbrev>
	<url>http://itp2016.inria.fr/</url>
	<month month="aug" />
	<year>2016</year>
	<location>Nancy, France</location>
</event>

<event id="icfp16">
        <name>21st ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'16</abbrev>
        <url>https://icfp16.sigplan.org/</url>
        <month month="sep" />
	<year>2016</year>
	<location>Nara, Japan</location>
</event>

<event id="coq16">
	<name>The Eighth Coq Workshop</name>
	<abbrev>Coq-8</abbrev>
	<url>http://coq.inria.fr/coq-workshop/2016</url>
	<month month="aug" />
	<year>2016</year>
	<location>Nancy, France</location>
</event>

<event id="mozilla16">
	<name>Mozilla San Francisco</name>
	<abbrev>Mozilla San Francisco</abbrev>
	<url>https://www.mozilla.org/</url>
	<month month="jan" />
	<year>2016</year>
	<location>San Francisco, CA, USA</location>
</event>

<event id="royal16_public">
	<name>Verified Trustworthy Software Systems (public meeting)</name>
	<abbrev>Verified Trustworthy Software Systems (public meeting)</abbrev>
	<url>https://royalsociety.org/events/2016/04/software-systems/</url>
	<month month="apr" />
	<year>2016</year>
	<location>London, UK</location>
</event>

<event id="royal16_specialist">
	<name>Verified Trustworthy Software Systems (specialist meeting)</name>
	<abbrev>Verified Trustworthy Software Systems (specialist meeting)</abbrev>
	<url>https://verificationinstitute.org/event/verified-trustworthy-software-systems-specialist-meeting/</url>
	<month month="apr" />
	<year>2016</year>
	<location>London, UK</location>
</event>

<event id="nepls30">
	<name>30th New England Programming Languages and Systems Symposium</name>
	<abbrev>NEPLS 30</abbrev>
	<url>http://www.nepls.org/Events/30/home.html</url>
	<month month="oct" />
	<year>2016</year>
	<location>Boston, MA, USA</location>
</event>

<event id="splashi16">
	<name>SPLASH-I</name>
	<abbrev>SPLASH-I'16</abbrev>
	<url>https://2016.splashcon.org/track/splash-2016-splash-i</url>
	<month month="nov" />
	<year>2016</year>
	<location>Amsterdam, Netherlands</location>
</event>

<event id="aplas16">
	<name>APLAS</name>
	<abbrev>APLAS'16</abbrev>
	<url>http://soict.hust.edu.vn/~aplas2016/</url>
	<month month="nov" />
	<year>2016</year>
	<location>Hanoi, Vietnam</location>
</event>

<event id="ndist16">
	<name>New Directions In Software Technology 2016</name>
	<abbrev>NDIST'16</abbrev>
	<url>https://ndist.kestrel.edu/events/NDIST16/</url>
	<month month="dec" />
	<year>2016</year>
	<location>St. John, U.S. Virgin Islands</location>
</event>

<event id="popl17">
	<name>44th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'17</abbrev>
	<url>https://popl17.sigplan.org/</url>
	<month month="jan" />
	<year>2017</year>
	<location>Paris, France</location>
</event>

<event id="rdp17">
	<name>Workshop on Reasoning about Declarative Programs</name>
	<abbrev>RDP'17</abbrev>
	<url>http://conf.researchr.org/track/POPL-2017/RDP-2017</url>
	<month month="jan" />
	<year>2017</year>
	<location>Paris, France</location>
</event>

<event id="snapl17">
	<name>The 2nd Summit oN Advances in Programming Languages</name>
	<abbrev>SNAPL'17</abbrev>
	<url>http://snapl.org/2017/</url>
	<month month="may" />
	<year>2017</year>
	<location>Asilomar, CA, USA</location>
</event>

<event id="pldi17">
        <name>ACM SIGPLAN 2017 Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'17</abbrev>
	<url>https://pldi17.sigplan.org/</url>
	<month month="jun" />
	<year>2017</year>
	<location>Barcelona, Spain</location>
	<copyright org="acm" />
</event>

<event id="dsss17">
        <name>Deep Specifications Summer School 2017</name>
	<abbrev>DSSS'17</abbrev>
	<url>https://deepspec.org/event/dsss17/</url>
	<month month="jul" />
	<year>2017</year>
	<location>Philadelphia, PA</location>
</event>

<event id="csf17">
	<name>30th IEEE Computer Security Foundations Symposium</name>
	<abbrev>CSF'17</abbrev>
	<url>http://csf2017.tecnico.ulisboa.pt/</url>
	<month month="aug" />
	<year>2017</year>
	<location>Santa Barbara, CA, USA</location>
</event>

<event id="icfp17">
        <name>22nd ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'17</abbrev>
        <url>https://icfp17.sigplan.org/</url>
        <month month="sep" />
	<year>2017</year>
	<location>Oxford, UK</location>
</event>

<event id="itp17">
	<name>Interactive Theorem Proving - Eighth International Conference</name>
	<abbrev>ITP'17</abbrev>
	<url>http://itp2017.cic.unb.br/</url>
	<month month="sep" />
	<year>2017</year>
	<location>Brasília, Brazil</location>
</event>

<event id="oopsla17">
        <name>2017 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages, &amp; Applications</name>
	<abbrev>OOPSLA'17</abbrev>
        <url>http://2017.splashcon.org/track/splash-2017-OOPSLA</url>
        <month month="oct" />
	<year>2017</year>
	<location>Vancouver, BC, Canada</location>
</event>

<event id="splashw17">
	<name>ACM SIGPLAN Conference on Systems, Programming, Languages and Applications: Software for Humanity</name>
	<abbrev>SPLASH'17</abbrev>
	<url>http://2017.splashcon.org/track/splash-2017-Workshops</url>
	<month month="oct" />
	<year>2017</year>
	<location>Vancouver, BC, Canada</location>
</event>

<event id="sosp17">
	<name>26th ACM Symposium on Operating Systems Principles</name>
	<abbrev>SOSP'17</abbrev>
	<url>http://sigops.org/s/conferences/sosp/2017/</url>
	<month month="oct" />
	<year>2017</year>
	<location>Shanghai, China</location>
</event>

<event id="riscv7">
	<name>7th RISC-V Workshop</name>
	<abbrev>7th RISC-V Workshop</abbrev>
	<url>https://riscv.org/2017/12/7th-risc-v-workshop-proceedings/</url>
	<month month="nov" />
	<year>2017</year>
	<location>Milpitas, CA, USA</location>
</event>

<event id="msr17">
	<name>Microsoft Research Redmond, RiSE group</name>
	<abbrev>Microsoft Research Remond, RiSE group</abbrev>
	<url>https://www.microsoft.com/en-us/research/group/research-in-software-engineering-rise/</url>
	<month month="dec" />
	<year>2017</year>
	<location>Redmond, WA, USA</location>
</event>

<event id="34c3">
	<name>34th Chaos Communication Congress</name>
	<abbrev>34th Chaos Communication Congress</abbrev>
	<url>https://events.ccc.de/congress/2017/</url>
	<month month="dec" />
	<year>2017</year>
	<location>Leipzig, Germany</location>
</event>

<event id="popl18">
	<name>45th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'18</abbrev>
	<url>https://popl18.sigplan.org/</url>
	<month month="jan" />
	<year>2018</year>
	<location>Los Angeles, CA, USA</location>
</event>

<event id="eth18">
	<name>ETH Zurich, Programming Methodology</name>
	<abbrev>ETH Zurich, Programming Methodology</abbrev>
	<url>http://www.pm.inf.ethz.ch/</url>
	<month month="jan" />
	<year>2018</year>
	<location>Zurich, Switzerland</location>
</event>

<event id="inria18">
	<name>Inria Paris, Gallium team</name>
	<abbrev>Inria Paris, Gallium team</abbrev>
	<url>http://gallium.inria.fr/seminar.html</url>
	<month month="jan" />
	<year>2018</year>
	<location>Paris, France</location>
</event>

<event id="entropy18">
	<name>ENabling TRust through Os Proofs...and beYond 2018</name>
	<abbrev>ENTROPY 2018</abbrev>
	<url>https://entropy2018.sciencesconf.org/</url>
	<month month="jan" />
	<year>2018</year>
	<location>Lille, France</location>
</event>

<event id="wpdai18">
	<name>Web Programming, Design, Analysis, and Implementation track of The Web Conference 2018</name>
	<abbrev>WPDAI'18</abbrev>
	<url>https://www2018.thewebconf.org/call-for-papers/web-programming-cfp/</url>
	<month month="apr" />
	<year>2018</year>
	<location>Lyon, France</location>
</event>

<event id="pldi18">
        <name>ACM SIGPLAN 2018 Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'18</abbrev>
	<url>https://pldi18.sigplan.org/</url>
	<month month="jun" />
	<year>2018</year>
	<location>Philadelphia, PA, USA</location>
	<copyright org="acm" />
</event>

<event id="deepspec18">
        <name>Deep Specifications Workshop 2018</name>
	<abbrev>DeepSpec'18</abbrev>
	<url>https://deepspec.org/events/dsw18/</url>
	<month month="jun" />
	<year>2018</year>
	<location>Philadelphia, PA</location>
</event>

<event id="itp18">
	<name>Interactive Theorem Proving - Ninth International Conference</name>
	<abbrev>ITP'18</abbrev>
	<url>https://itp2018.inria.fr/</url>
	<month month="jul" />
	<year>2018</year>
	<location>Oxford, UK</location>
</event>

<event id="lics18">
	<name>33rd Annual ACM/IEEE Symposium on Logic in Computer Science</name>
	<abbrev>LICS'18</abbrev>
	<url>http://lics.siglog.org/lics18/</url>
	<month month="jul" />
	<year>2018</year>
	<location>Oxford, UK</location>
</event>

<event id="ecoop18">
	<name>2018 European Conference on Object-Oriented Programming</name>
	<abbrev>ECOOP'18</abbrev>
	<url>https://2018.ecoop.org/</url>
	<month month="jul" />
	<year>2018</year>
	<location>Amsterdam, Netherlands</location>
</event>

<event id="dsss18">
        <name>Deep Specifications Summer School 2018</name>
	<abbrev>DSSS'18</abbrev>
	<url>https://deepspec.org/event/dsss18/</url>
	<month month="jul" />
	<year>2018</year>
	<location>Princeton, NJ</location>
</event>

<event id="msfs18">
      <name>Microsoft Research Faculty Summit 2018</name>
      <url>https://www.microsoft.com/en-us/research/event/faculty-summit-2018/</url>
      <abbrev>Microsoft Research Faculty Summit 2018</abbrev>
      <month month="aug" />
      <year>2018</year>
      <location>Redmond, WA</location>
</event>

<event id="nepls32">
	<name>32nd New England Programming Languages and Systems Symposium</name>
	<abbrev>NEPLS 32</abbrev>
	<url>http://www.nepls.org/Events/32/</url>
	<month month="aug" />
	<year>2018</year>
	<location>Cambridge, MA, USA</location>
</event>

<event id="ifl18">
        <name>The 30th Symposium on Implementation and Application of Functional Languages</name>
	<abbrev>IFL'18</abbrev>
        <url>http://2018.iflconference.org/</url>
        <month month="sep" />
	<year>2018</year>
	<location>Lowell, MA, USA</location>
</event>

<event id="harper18">
        <name>Festschrift for Robert Harper</name>
	<abbrev>Festschrift for Robert Harper</abbrev>
        <url>http://www.cs.cmu.edu/~harperfest/</url>
        <month month="sep" />
	<year>2018</year>
	<location>Pittsburgh, PA, USA</location>
</event>

<event id="icfp18">
        <name>23rd ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'18</abbrev>
        <url>https://icfp18.sigplan.org/</url>
        <month month="sep" />
	<year>2018</year>
	<location>Saint Louis, MO, USA</location>
</event>

<event id="osdi18">
	<name>13th USENIX Symposium on Operating Systems Design and Implementation</name>
	<abbrev>OSDI'18</abbrev>
	<url>https://www.usenix.org/conference/osdi18/</url>
	<month month="oct" />
	<year>2018</year>
	<location>Carlsbad, CA, USA</location>
</event>

<event id="splashi18">
	<name>SPLASH-I</name>
	<abbrev>SPLASH-I'18</abbrev>
	<url>http://2018.splashcon.org/track/splash-2018-splash-i</url>
	<month month="nov" />
	<year>2018</year>
	<location>Boston, MA, USA</location>
</event>

<event id="riscvs1">
	<name>Inaugural RISC-V Summit</name>
	<abbrev>RISC-V Summit</abbrev>
	<url>https://tmt.knect365.com/risc-v-summit/</url>
	<month month="dec" />
	<year>2018</year>
	<location>San Jose, CA, USA</location>
</event>

<event id="popl19">
	<name>46th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'19</abbrev>
	<url>https://popl19.sigplan.org/</url>
	<month month="jan" />
	<year>2019</year>
	<location>Cascais, Portugal</location>
</event>

<event id="sifive19">
	<name>SiFive Technical Symposium, Boston</name>
	<abbrev>SiFive Technical Symposium, Boston</abbrev>
	<url>https://sifivetechsymposium.com/</url>
	<month month="feb" />
	<year>2019</year>
	<location>Burlington, MA, USA</location>
</event>

<event id="gomac19">
        <name>Annual GOMACTech Conference 2019</name>
	<abbrev>GOMACTech'19</abbrev>
        <url>https://www.gomactech.net/2019/</url>
        <month month="mar" />
	<year>2019</year>
	<location>Albuquerque, NM, USA</location>
</event>

<event id="rwc19">
	<name>Real World Cryptography 2019</name>
	<abbrev>RWC'19</abbrev>
	<url>https://rwc.iacr.org/2019/</url>
	<month month="mar" />
	<year>2019</year>
	<location>San Jose, CA, USA</location>
</event>

<event id="sp19">
        <name>IEEE Symposium on Security &amp; Privacy 2019</name>
	<abbrev>S&amp;P'19</abbrev>
	<url>http://www.ieee-security.org/TC/SP2019/</url>
	<month month="may" />
	<year>2019</year>
	<location>San Francisco, CA, USA</location>
</event>

<event id="types19">
        <name>25th International Conference on Types for Proofs and Programs</name>
	<abbrev>TYPES'19</abbrev>
	<url>https://cas.oslo.no/types2019/</url>
	<month month="jun" />
	<year>2019</year>
	<location>Oslo, Norway</location>
</event>

<event id="deepspec19">
        <name>Deep Specifications Workshop 2019</name>
	<abbrev>DeepSpec'19</abbrev>
	<url>https://pldi19.sigplan.org/home/deepspec-2019</url>
	<month month="jun" />
	<year>2019</year>
	<location>Phoenix, AZ</location>
</event>

<event id="sigarch19">
        <name>SIGARCH Visioning Workshop: Agile and Open Hardware for Next-Generation Computing</name>
	<abbrev>SIGARCH Visioning Workshop 2019</abbrev>
	<url>https://sites.google.com/view/agile-and-open-hardware/</url>
	<month month="jun" />
	<year>2019</year>
	<location>Phoenix, AZ</location>
</event>

<event id="pldi19">
        <name>ACM SIGPLAN 2019 Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'19</abbrev>
	<url>https://pldi19.sigplan.org/</url>
	<month month="jun" />
	<year>2019</year>
	<location>Phoenix, AZ, USA</location>
	<copyright org="acm" />
</event>

<event id="cav19">
	<name>31st International Conference on Computer Aided Verification</name>
	<abbrev>CAV'19</abbrev>
	<url>http://i-cav.org/2019/</url>
	<month month="jul" />
	<year>2019</year>
	<location>New York, NY, USA</location>
</event>

<event id="icfp19">
        <name>24th ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'19</abbrev>
        <url>https://icfp19.sigplan.org/</url>
        <month month="aug" />
	<year>2019</year>
	<location>Berlin, Germany</location>
</event>

<event id="sosp19">
	<name>27th ACM Symposium on Operating Systems Principles</name>
	<abbrev>SOSP'19</abbrev>
	<url>https://www.sigops.org/sosp/sosp19/</url>
	<month month="oct" />
	<year>2019</year>
	<location>Huntsville, Ontario, Canada</location>
</event>

<event id="riscv19">
	<name>2019 RISC-V Summit</name>
	<abbrev>RISC-V Summit 2019</abbrev>
	<url>https://riscv.org/blog/2019/12/highlights-from-the-2019-risc-v-summit-a-look-at-the-future-of-computing/</url>
	<month month="dec" />
	<year>2019</year>
	<location>San Jose, CA, USA</location>
</event>

<event id="cpp20">
	<name>9th International Conference on Certified Programs and Proofs</name>
	<abbrev>CPP'20</abbrev>
	<url>https://popl20.sigplan.org/home/CPP-2020</url>
	<month month="jan" />
	<year>2020</year>
	<location>New Orleans, LA, USA</location>
</event>

<event id="pldi20">
        <name>ACM SIGPLAN 2020 Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'20</abbrev>
	<url>https://pldi20.sigplan.org/</url>
	<month month="jun" />
	<year>2020</year>
	<location>London, England</location>
	<copyright org="acm" />
</event>

<event id="ijcar20">
        <name>9th International Joint Conference on Automated Reasoning</name>
	<abbrev>IJCAR'20</abbrev>
        <url>https://ijcar2020.org/</url>
        <month month="jun" />
	<year>2020</year>
	<location>Paris, France</location>
</event>

<event id="icfp20">
        <name>25th ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'20</abbrev>
        <url>https://icfp20.sigplan.org/</url>
        <month month="aug" />
	<year>2020</year>
	<location>Jersey City, NJ, USA</location>
</event>

<event id="flops20">
        <name>15th International Symposium on Functional and Logic Programming</name>
	<abbrev>FLOPS'20</abbrev>
        <url>https://www.ipl.riec.tohoku.ac.jp/FLOPS2020/</url>
        <month month="sep" />
	<year>2020</year>
	<location>Akita, Japan</location>
</event>

<event id="popl21">
	<name>48th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'21</abbrev>
	<url>https://popl21.sigplan.org/</url>
	<month month="jan" />
	<year>2021</year>
	<location>Copenhagen, Denmark</location>
</event>

<event id="coqpl21">
	<name>The Seventh International Workshop on Coq for Programming Languages</name>
	<abbrev>CoqPL'21</abbrev>
	<url>https://popl21.sigplan.org/home/CoqPL-2021</url>
	<month month="jan" />
	<year>2021</year>
	<location>virtual</location>
</event>

<event id="lambda21">
	<name>2021 Lambda Days</name>
	<abbrev>Lambda Days'21</abbrev>
	<url>https://www.lambdadays.org/lambdadays2021</url>
	<month month="feb" />
	<year>2021</year>
</event>

<event id="asplos21">
        <name>26th International Conference on Architectural Support for Programming Languages and Operating Systems</name>
	<abbrev>ASPLOS'21</abbrev>
        <url>https://asplos-conference.org/2021/</url>
        <month month="apr" />
	<year>2021</year>
	<location>virtual</location>
</event>

<event id="newton21">
	<name>Verified software: from theory to practice (a workshop of the Isaac Newton Institute)</name>
	<abbrev>Verified software: from theory to practice (a workshop of the Isaac Newton Institute)</abbrev>
	<url>https://www.newton.ac.uk/event/vsow03</url>
	<month month="may" />
	<year>2021</year>
</event>

<event id="pldi21">
	<name>42nd ACM SIGPLAN Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'21</abbrev>
	<url>https://pldi21.sigplan.org/</url>
	<month month="jun" />
	<year>2021</year>
	<location>Quebec City, QC, Canada</location>
</event>

<event id="itp21">
	<name>Interactive Theorem Proving - Twelfth International Conference</name>
	<abbrev>ITP'21</abbrev>
	<url>http://easyconferences.eu/itp2021/</url>
	<month month="jun" />
	<year>2021</year>
	<location>Rome, Italy</location>
</event>

<event id="osdi21">
	<name>15th USENIX Symposium on Operating Systems Design and Implementation</name>
	<abbrev>OSDI'21</abbrev>
	<url>https://www.usenix.org/conference/osdi21/</url>
	<month month="jul" />
	<year>2021</year>
	<location>Santa Clara, CA, USA</location>
</event>

<event id="icfp21">
        <name>26th ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'21</abbrev>
        <url>https://icfp21.sigplan.org/</url>
        <month month="aug" />
	<year>2021</year>
	<location>Virtual</location>
</event>

<event id="nus22">
	<name>NUS Computer Science Research Week</name>
	<abbrev>NUS Computer Science Research Week</abbrev>
	<url>https://researchweek.comp.nus.edu.sg/</url>
	<month month="jan" />
	<year>2022</year>
</event>

<event id="popl22">
	<name>49th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'22</abbrev>
	<url>https://popl22.sigplan.org/</url>
	<month month="jan" />
	<year>2022</year>
	<location>Philadelphia, PA, USA</location>
</event>

<event id="hcss22">
	<name>High Confidence Software and Systems Conference 2022</name>
	<abbrev>HCSS'22</abbrev>
	<url>https://cps-vo.org/group/hcss_conference</url>
	<month month="may" />
	<year>2022</year>
	<location>Virtual</location>
</event>

<event id="pldi22">
	<name>43rd ACM SIGPLAN Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'22</abbrev>
	<url>https://pldi22.sigplan.org/</url>
	<month month="jun" />
	<year>2022</year>
	<location>San Diego, CA, USA</location>
</event>

<event id="oplss22">
	<name>Oregon Programming Languages Summer School</name>
	<abbrev>OPLSS'22</abbrev>
	<url>https://www.cs.uoregon.edu/research/summerschool/summer22/</url>
	<month month="jun" />
	<year>2022</year>
	<location>Eugene, OR, USA</location>
</event>

<event id="vso22">
	<name>Isaac Newton Institute Verified Software Workshop</name>
	<abbrev>VSO'22</abbrev>
	<url>https://www.newton.ac.uk/event/vso2/</url>
	<month month="jul" />
	<year>2022</year>
	<location>Cambridge, England</location>
</event>

<event id="cav22">
	<name>34th International Conference on Computer-Aided Verification</name>
	<abbrev>CAV'22</abbrev>
	<url>http://i-cav.org/2022/</url>
	<month month="aug" />
	<year>2022</year>
	<location>Haifa, Israel</location>
</event>

<event id="csf22">
	<name>35th IEEE Computer Security Foundations Symposium</name>
	<abbrev>CSF'22</abbrev>
	<url>https://www.ieee-security.org/TC/CSF2022/</url>
	<month month="aug" />
	<year>2022</year>
	<location>Haifa, Israel</location>
</event>

<event id="itp22">
	<name>Interactive Theorem Proving - Thirteenth International Conference</name>
	<abbrev>ITP'22</abbrev>
	<url>https://itpconference.github.io/ITP22/</url>
	<month month="aug" />
	<year>2022</year>
	<location>Haifa, Israel</location>
</event>

<event id="nepls33">
	<name>33rd New England Programming Languages and Systems Symposium</name>
	<abbrev>NEPLS 33</abbrev>
	<url>http://www.nepls.org/Events/33/home.html</url>
	<month month="nov" />
	<year>2022</year>
	<location>Boston, MA, USA</location>
</event>

<event id="oopsla22">
    <name>2022 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages, &amp; Applications</name>
    <abbrev>OOPSLA'22</abbrev>
    <url>http://2022.splashcon.org/track/splash-2022-oopsla</url>
    <month month="nov" />
	<year>2022</year>
	<location>Auckland, New Zealand</location>
</event>

<event id="pepm23">
	<name>ACM SIGPLAN 2023 Workshop on Partial Evaluation and Program Manipulation</name>
	<abbrev>PEPM'23</abbrev>
	<url>https://popl23.sigplan.org/home/PEPM-2023</url>
	<month month="jan" />
	<year>2023</year>
	<location>Boston, MA, USA</location>
</event>

<event id="coqpl23">
	<name>The Ninth International Workshop on Coq for Programming Languages</name>
	<abbrev>CoqPL'23</abbrev>
	<url>https://popl23.sigplan.org/home/CoqPL-2023</url>
	<month month="jan" />
	<year>2023</year>
	<location>Boston, MA, USA</location>
</event>

<event id="rwc23">
	<name>Real World Cryptography 2023</name>
	<abbrev>RWC'23</abbrev>
	<url>https://rwc.iacr.org/2023/</url>
	<month month="mar" />
	<year>2023</year>
	<location>Tokyo, Japan</location>
</event>

<event id="pldi23">
	<name>44th ACM SIGPLAN Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'23</abbrev>
	<url>https://pldi23.sigplan.org/</url>
	<month month="jun" />
	<year>2023</year>
	<location>Orlando, FL, USA</location>
</event>

<event id="asplos23">
        <name>28th International Conference on Architectural Support for Programming Languages and Operating Systems</name>
	<abbrev>ASPLOS'23</abbrev>
        <url>https://asplos-conference.org/</url>
        <month month="apr" />
	<year>2023</year>
	<location>TBD</location>
</event>

<event id="icfp23">
        <name>28th ACM SIGPLAN International Conference on Functional Programming</name>
	<abbrev>ICFP'23</abbrev>
        <url>https://icfp23.sigplan.org/</url>
        <month month="sep" />
	<year>2023</year>
	<location>Seattle, WA, USA</location>
</event>

<event id="coqpl24">
        <name>The Tenth International Workshop on Coq for Programming Languages</name>
	<abbrev>CoqPL'24</abbrev>
        <url>https://popl24.sigplan.org/home/CoqPL-2024</url>
        <month month="jan" />
	<year>2024</year>
	<location>London, England</location>
</event>

<event id="dafny24">
        <name>Dafny 2024</name>
	<abbrev>Dafny'24</abbrev>
        <url>https://popl24.sigplan.org/home/dafny-2024</url>
        <month month="jan" />
	<year>2024</year>
	<location>London, England</location>
</event>

<event id="popl24">
	<name>51st ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'24</abbrev>
	<url>https://popl24.sigplan.org/</url>
	<month month="jan" />
	<year>2024</year>
	<location>London, England</location>
</event>

<event id="aimr24">
	<name>National Academies Workshop: AI to Assist Mathematical Reasoning</name>
	<abbrev>AIMR'24</abbrev>
	<url>https://www.nationalacademies.org/our-work/ai-to-assist-mathematical-reasoning-a-workshop</url>
	<month month="apr" />
	<year>2024</year>
</event>

<event id="pldi24">
	<name>45th ACM SIGPLAN Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'24</abbrev>
	<url>https://pldi24.sigplan.org/</url>
	<month month="jun" />
	<year>2024</year>
	<location>Copenhagen, Denmark</location>
</event>

<event id="fmcp24">
	<name>First NIST Workshop on Formal Methods within Certification Programs</name>
	<abbrev>FMCP'24</abbrev>
	<url>https://www.nist.gov/news-events/events/nist-workshop-formal-methods-within-certification-programs-fmcp-2024</url>
	<month month="jul" />
	<year>2024</year>
	<location>Rockville, MD, USA</location>
</event>

<event id="csf24">
	<name>37th IEEE Computer Security Foundations Symposium</name>
	<abbrev>CSF'24</abbrev>
	<url>https://csf2024.ieee-security.org/</url>
	<month month="jul" />
	<year>2024</year>
	<location>Enschede, The Netherlands</location>
</event>

<event id="itp24">
	<name>Interactive Theorem Proving - Fifteenth International Conference</name>
	<abbrev>ITP'24</abbrev>
	<url>https://www.viam.science.tsu.ge/itp2024/</url>
	<month month="sep" />
	<year>2024</year>
	<location>Tbilisi, Georgia</location>
</event>

<event id="ccs24">
	<name>2024 ACM SIGSAC Conference on Computer and Communications Security</name>
	<abbrev>CCS'24</abbrev>
	<url>https://www.sigsac.org/ccs/CCS2024/</url>
	<month month="oct" />
	<year>2024</year>
	<location>Salt Lake City, UT, USA</location>
</event>

<event id="popl25">
	<name>52nd ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'25</abbrev>
	<url>https://popl25.sigplan.org/</url>
	<month month="jan" />
	<year>2025</year>
	<location>Denver, CO, USA</location>
</event>

<event id="plmw25">
	<name>ACM SIGPLAN Programming Languages Mentoring Workshop 2025</name>
	<abbrev>PLMW@PLDI'25</abbrev>
	<url>https://pldi25.sigplan.org/home/PLMW-pldi-2025</url>
	<month month="jun" />
	<year>2025</year>
	<location>Seoul, South Korea</location>
</event>

<event id="pldi25">
	<name>46th ACM SIGPLAN Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'25</abbrev>
	<url>https://pldi25.sigplan.org/</url>
	<month month="jun" />
	<year>2025</year>
	<location>Seoul, South Korea</location>
</event>

<event id="buffalo25">
	<name>University at Buffalo CSE Distinguished Speaker Series</name>
	<abbrev>University at Buffalo CSE Distinguished Speaker Series</abbrev>
    <url>https://engineering.buffalo.edu/computer-science-engineering.html</url>
	<month month="sep" />
	<year>2025</year>
</event>

<event id="ccs25">
	<name>2025 ACM SIGSAC Conference on Computer and Communications Security</name>
	<abbrev>CCS'25</abbrev>
	<url>https://www.sigsac.org/ccs/CCS2025/</url>
	<month month="oct" />
	<year>2025</year>
	<location>Taipei, Taiwan</location>
</event>

<event id="oopsla25">
    <name>2025 ACM SIGPLAN International Conference on Object-Oriented Programming, Systems, Languages, &amp; Applications</name>
    <abbrev>OOPSLA'25</abbrev>
    <url>https://2025.splashcon.org/track/OOPSLA</url>
    <month month="oct" />
	<year>2025</year>
	<location>Singapore</location>
</event>

<event id="cpp26">
  <name>15th International Conference on Certified Programs and Proofs</name>
  <abbrev>CPP'26</abbrev>
  <url>https://popl26.sigplan.org/home/CPP-2026</url>
  <month month="jan" />
  <year>2026</year>
  <location>Rennes, France</location>
</event>

<event id="popl26">
	<name>53rd ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages</name>
	<abbrev>POPL'26</abbrev>
	<url>https://popl26.sigplan.org/</url>
	<month month="jan" />
	<year>2026</year>
	<location>Rennes, France</location>
</event>

<event id="tamiu26">
	<name>Texas A&amp;M International University School of Engineering Distinguished Lecture Series (virtual)</name>
	<abbrev>Texas A&amp;M International University School of Engineering Distinguished Lecture Series (virtual)</abbrev>
	<month month="apr" />
	<year>2026</year>
</event>

<event id="pldi26">
	<name>46th ACM SIGPLAN Conference on Programming Language Design and Implementation</name>
	<abbrev>PLDI'26</abbrev>
	<url>https://pldi26.sigplan.org/</url>
	<month month="jun" />
	<year>2026</year>
	<location>Boulder, CO, USA</location>
</event>

<event id="wg2.8">
	<name>IFIP Working Group on Functional Programming</name>
	<url>http://www.cs.ox.ac.uk/ralf.hinze/WG2.8/</url>
	<abbrev>WG 2.8</abbrev>
</event>

<event id="wg2.16">
	<name>IFIP Working Group on Language Design</name>
	<url>https://languagedesign.org/</url>
	<abbrev>WG 2.16</abbrev>
</event>

<event id="isat">
	<name>DARPA Information Science and Technology study group</name>
	<url>https://www.darpa.mil/about-us/offices/i2o</url>
	<abbrev>ISAT</abbrev>
</event>

<event id="cpp">
	<name>International Conference on Certified Programs and Proofs</name>
	<url>https://popl21.sigplan.org/home/CPP-2021#The-CPP-Series</url>
	<abbrev>CPP</abbrev>
</event>

<event id="icfp">
	<name>International Conference on Functional Programming</name>
	<url>https://www.icfpconference.org/structure.html</url>
	<abbrev>ICFP</abbrev>
</event>

<event id="nsf">
	<name>National Science Foundation panelist</name>
	<abbrev>NSF</abbrev>
	<url>https://nsf.gov/dir/index.jsp?org=cise</url>
</event>

<journal id="cacm">
	<name>Communications of the ACM</name>
	<abbrev>CACM</abbrev>
	<url>http://cacm.acm.org/</url>
	<publisher org="acm" />
</journal>

<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.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://www.springer.com/computer/theoretical+computer+science/journal/10990</url>
</journal>

<journal id="pta">
	<name>Philosophical Transactions of the Royal Society A</name>
	<abbrev>PTA</abbrev>
	<url>http://rsta.royalsocietypublishing.org/</url>
	<publisher org="rs" />
</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>

<journal id="fi">
	<name>Fundamenta Informaticae</name>
	<abbrev>FI</abbrev>
	<url>http://fi.mimuw.edu.pl/</url>
</journal>

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

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

	<pub id="OmniTOPLAS23" kind="journal">
		<author person="arthur" />
		<author person="adamc" />
		<author person="andreser" />
		<author person="gruetter" />
		<title>Omnisemantics: Smooth Handling of Nondeterminism</title>
		<journal journal="toplas" year="2023" volume="Volume 45" pages="Article No. 5"/>

		<summary>Extended treatment of a new style of operational semantics that was applied in the work from <a href="LightbulbPLDI21/">our PLDI'21 paper</a></summary>

        <abstract>This paper gives an in-depth presentation of the omni-big-step and omni-small-step styles of semantic judgments.  These styles describe operational semantics by relating starting states to sets of outcomes rather than to individual outcomes.  A single derivation of these continuation-passing-style semantics for a particular starting state and program describes all possible nondeterministic executions (hence the name <i>omni</i>), whereas in traditional small-step and big-step semantics, each derivation only talks about one single execution.  This restructuring allows for straightforward modeling of both nondeterminism and undefined behavior as commonly encountered in sequential functional and imperative programs.  Specifically, omnisemantics inherently assert <i>safety</i>, i.e. they guarantee that none of the execution branches gets stuck, while traditional semantics need either a separate judgment or additional error markers to specify safety in the presence of nondeterminism.</abstract>

		<abstract>Omnisemantics can be understood as an inductively defined weakest-precondition semantics (or more generally, predicate-transformer semantics) that does not involve invariants for loops and recursion but instead uses unrolling rules like in traditional small-step and big-step semantics.  Omnisemantics were previously described in association with several projects, but we believe the technique has been underappreciated and deserves a well-motivated, extensive, and pedagogical presentation of its benefits.  We also explore several novel aspects associated with these semantics, in particular their use in type-safety proofs for lambda calculi, partial-correctness reasoning, and forward proofs of compiler correctness for terminating but potentially nondeterministic programs being compiled to nondeterministic target languages.  All results in this paper are formalized in Coq.</abstract>

        <nops/>
	</pub>

	<pub id="StencilsJAR18" kind="journal">
		<author person="gregoire" />
		<author person="adamc" />
		<title>Mostly Automated Formal Verification of Loop Dependencies with Applications to Distributed Stencil Algorithms</title>
		<journal journal="jar" year="2018" alt="https://doi.org/10.1007/s10817-018-9451-y"/>

		<summary>Extended version of <a href="StencilsITP16/">our ITP'16 paper</a></summary>

        <abstract>The class of <i>stencil</i> programs involves repeatedly updating elements of arrays according to fixed patterns, referred to as stencils. Stencil problems are ubiquitous in scientific computing and are used as an ingredient to solve more involved problems. Their high regularity allows massive parallelization. Two important challenges in designing such algorithms are cache efficiency and minimizing the number of communication steps between nodes. In this paper, we introduce a mathematical framework for a crucial aspect of formal verification of both sequential and distributed stencil algorithms, and we describe its Coq implementation. We present a domain-specific embedded programming language with support for automating the most tedious steps of proofs that nested loops respect dependencies, applicable to sequential and distributed examples. Finally, we evaluate the robustness of our library by proving the dependency-correctness of some real-world stencil algorithms, including a state-of-the-art cache-oblivious sequential algorithm, as well as two optimized distributed kernels.</abstract>

        <abstract><a href="https://github.com/mit-plv/stencils">Source code</a></abstract>

        <url>http://www.springer.com/-/3/AWGg8n_juCj1iLTSijwC</url>
	</pub>

	<pub id="DeepSpecPT" kind="journal">
		<author person="appel" />
		<author person="eberinge" />
		<author person="adamc" />
		<author person="bcpierce" />
		<author person="shao" />
		<author person="sweirich" />
		<author person="stevez" />
		<title>The Science of Deep Specification</title>
		<journal journal="pta" year="2017" alt="2017 375 20160331" />

		<summary>Overview of and case for the <a href="https://deepspec.org/">DeepSpec project</a></summary>

                <abstract>We introduce our efforts within the project "The Science of Deep Specification" to work out the key formal underpinnings of industrial-scale formal specifications of software and hardware components, anticipating a world where large verified systems are routinely built out of smaller verified components that are also used by many other projects.  We identify an important class of specification that has already been used in a few experiments that connect strong component-correctness theorems across the work of different teams.  To help popularize the unique advantages of that style, we dub it <i>deep specification</i>, and we say that it encompasses specifications that are <i>rich</i>, <i>two-sided</i>, <i>formal</i>, and <i>live</i> (terms that we define in the article).  Our core team is developing a proof-of-concept system (based on the Coq proof assistant) whose specification and verification work is divided across largely decoupled subteams at our four institutions, encompassing hardware microarchitecture, compilers, operating systems, and applications, along with cross-cutting principles and tools for effective specification.  We also aim to catalyze interest in the approach, not just by basic researchers but also by users in industry.</abstract>

                <abstract><a href="https://deepspec.org/">Project web site</a></abstract>

                <url>http://rsta.royalsocietypublishing.org/cgi/content/abstract/rsta.2016.0331</url>
	</pub>

	<pub id="FscqCACM" kind="journal">
		<author person="tchajed" />
		<author person="hchen" />
		<author person="adamc" />
		<author person="kaashoek" />
		<author person="nickolai" />
		<author person="dmz" />
		<title>Research Highlight: Certifying a File System using Crash Hoare Logic: Correctness in the Presence of Crashes</title>
		<journal journal="cacm" volume="60(4)" pages="75-84" year="2017" />

		<summary>A file system implemented and verified in Coq, using separation logic, connected to Linux and providing respectable performance</summary>

                <abstract>FSCQ is the first file system with a machine-checkable proof that its implementation meets a specification, even in the presence of fail-stop crashes. FSCQ provably avoids bugs that have plagued previous file systems, such as performing disk writes without sufficient barriers or forgetting to zero out directory blocks. If a crash happens at an inopportune time, these bugs can lead to data loss. FSCQ's theorems prove that, under any sequence of crashes followed by reboots, FSCQ will recover its state correctly without losing data.</abstract>

                <abstract>To state FSCQ's theorems, this paper introduces the Crash Hoare logic (CHL), which extends traditional Hoare logic with a crash condition, a recovery procedure, and logical address spaces for specifying disk states at different abstraction levels. CHL also reduces the proof effort for developers through proof automation. Using CHL, we developed, specified, and proved the correctness of the FSCQ file system. Although FSCQ's design is relatively simple, experiments with FSCQ as a user-level file system show that it is sufficient to run Unix applications with usable performance. FSCQ's specifications and proofs required significantly more work than the implementation, but the work was manageable even for a small team of a few researchers.</abstract>

                <url>http://cacm.acm.org/magazines/2017/4/215044-certifying-a-file-system-using-crash-hoare-logic/abstract</url>
	</pub>

	<pub id="UrWebCACM" kind="journal">
		<author person="adamc" />
		<title>Research Highlight: Ur/Web: A Simple Model for Programming the Web</title>
		<journal journal="cacm" volume="59(8)" pages="93-100" year="2016" />

		<summary>Introducing the Ur/Web programming language</summary>

		<abstract>The World Wide Web has evolved gradually from a document delivery platform to an architecture for distributed programming.  This largely unplanned evolution is apparent in the set of interconnected languages and protocols that any Web application must manage.  This paper presents Ur/Web, a domain-specific, statically typed functional programming language with a much simpler model for programming modern Web applications.  Ur/Web's model is <i>unified</i>, where programs in a single programming language are compiled to other "Web standards" languages as needed; supports novel kinds of <i>encapsulation</i> of Web-specific state; and exposes <i>simple concurrency</i>, where programmers can reason about distributed, multithreaded applications via a mix of transactions and cooperative preemption.  We give a tutorial introduction to the main features of Ur/Web.</abstract>

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

		<abstract>[Condensed version of <a href="/papers/UrWebPOPL15">POPL'15 paper</a>, also including some tweaks to be accessible to a broader audience]</abstract>

                <url>http://cacm.acm.org/magazines/2016/8/205041-ur-web/abstract</url>
	</pub>

	<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="CausalityPLDI26" kind="conference">
        <author person="azhang03" />
        <author person="ql101" />
  	<author person="londonbielicke" />
  	<author person="emjun" />
	<author person="adamc" />

	<title>Causality and Semantic Separation</title>
	<proceedings event="pldi26" />

	<summary>PL-style soundness and completeness theorems for <i>d</i>-separation, a standard "program analysis" for causal diagrams</summary>

        <abstract>The design of scientific experiments deserves its own variation of formal verification to catch cases where scientists made important mistakes, such as forgetting to take confounding variables into account. One of the most fundamental underpinnings of science is <i>causality</i>, or what it means for interventions in the world to <i>cause</i> other outcomes, as formalized by computer scientists like Judea Pearl. However, these ideas had not previously been made rigorous to the standards of the programming-languages community, where one expects a (syntactic) program analysis to be proved sound with respect to a natural semantics. In the domain of causality, as the relevant "program analysis," we focused on d-<i>separation</i>, a classic (and arguably unintuitive) condition on graphs that can be used to decide when the design of an experiment controls for sufficiently many confounding variables. Our central result (mechanized in Rocq) is that <i>d</i>-separation exactly coincides with a novel (and arguably intuitive) <i>semantic</i> definition inspired by noninterference from the theory of security. For each given automated test on the quality of an experiment design, our theorem justifies an associated method for falsifying the world-modeling hypothesis behind the experiment.</abstract>

        <comingSoon/>
      </pub>

      <pub id="AtlPLDI26" kind="conference">
	<author person="lamanda" />
	<author person="gilbo" />
        <author person="kamil" />
	<author person="adamc" />
	<author person="jrk" />
	<title>A Mechanized Algebra of Verified Data Structures for Optimizing Sparse Tensor Programs</title>
	<proceedings event="pldi26" />
        
	<summary>Extending <a href="/papers/AtlPOPL22/">ATL</a> to compile sparse tensors efficiently</summary>

        <abstract>In this paper, we introduce a verified framework for defining and composing sparse tensor formats.  We extend the ATL tensor language and scheduling framework, which formerly could only express dense tensor kernels.  We define a levelized abstraction to describe per-dimension tensor formats via their encoding routines, access and iteration functions, and formal properties enforcing soundness of the sparse structures as representations of the original dense tensors.  Using this abstraction, we compositionally define format-agnostic, multidimensional compression and decompression functions that are used to express the top-level soundness theorem for these abstract sparse tensor formats.  We then use this soundness theorem as an adjoint-pair rewrite theorem to introduce sparse data structures and iteration into a dense tensor kernel via the existing scheduling-rewrite framework of ATL.  Overall, we are able to start with a program computing over dense operands and derive a proven semantically equivalent, optimized program computing over sparse structures.  We further prove a minimal set of instances of the level-format abstraction, which can be composed and passed as parameters to compression to capture a broad range of canonical, multidimensional tensor-compression formats.</abstract>

        <comingSoon/>
      </pub>

      <pub id="MetricsCPP26" kind="conference">
        <!--author person="carotti" /-->
        <author person="tockman" />
        <author person="pratap" />
        <author person="andreser" />
        <author person="gruetter" />
        <author person="adamc" />

        <title>Foundational Verification of Running-Time Bounds for Interactive Programs</title>
        <proceedings event="cpp26" />

        <summary>Extending the Bedrock2 program-verification approach with omnisemantics to handling proof of timing upper bounds</summary>

        <abstract>Some important domains of software demand concrete bounds on how long functions may run, for instance for real-time cyberphysical systems where missed deadlines may damage industrial machinery.  Such programs may interact with external devices throughout execution, where time deadlines ought to depend on, for instance, sensor readings (e.g. we only scramble to close a valve immediately when a sensor reports that a tank is about to overflow).  We present the first software-development toolchain that delivers first-principles proofs of meaningful time bounds for interactive machine code, while allowing all per-application programming and verification to happen at the source-code level.  We allow C-like programs to be proved against separation-logic specifications that constrain their running time, and such proofs are composed with verification of a compiler to RISC-V machine code.  All components are implemented and proved inside the Rocq proof assistant, producing final theorems whose statements depend only on machine-language formal semantics and some elementary specification constructions for describing running time.  As a capstone case study, we extended a past verification (of a real microcontroller-based cyberphysical system) to bound time between arrival of network packets and actuation of an attached device.</abstract>

        <abstract><a href="https://github.com/mit-plv/bedrock2">GitHub repository</a></abstract>
        
        <nops/>
      </pub>

      <pub id="PyrosomeOOPSLA25" kind="conference">
        <author person="dijamner" />
        <author person="gkammer" />
        <author person="rnag" />
        <author person="adamc" />

        <title>Pyrosome: Verified Compilation for Modular Metatheory</title>
        <proceedings event="oopsla25" />

        <summary>Modularizing compiler proofs in units of language features and their associated compilation code</summary>

        <abstract>We present Pyrosome, a generic framework for modular language metatheory that embodies a novel approach to extensible semantics and compilation, implemented in Coq.  Common techniques for semantic reasoning are often tied to the specific structures of the languages and compilers that they support.  In Pyrosome, verified compilers are fully extensible, meaning that to extend a language (even with a new kind of effect) simply requires defining and verifying the compilation of the new feature, reusing the old correctness theorem for all other cases.  The novel enabling idea is an inductive formulation of equivalence preservation that supports the addition of new rules to the source language, target language, and compiler.</abstract>

        <abstract>Pyrosome defines a formal, deeply embedded notion of programming languages with semantics given by dependently sorted equational theories, so all compiler-correctness proofs boil down to type-checking and equational reasoning. We support vertical composition of any compilers expressed in our framework in addition to feature extension.  As a case study, we present a multipass compiler from System F with simple references, through CPS translation and closure conversion.  Specifically, we demonstrate how we can build such a compiler incrementally by starting with a compiler for simply typed lambda-calculus and adding natural numbers, the unit type, recursive functions, and a global heap, then extending judgments with a type environment and adding type abstraction, all while reusing the original theorems.  We also present a linear version of the simply typed CPS pass and compile a small imperative language to the simply typed target to show how Pyrosome handles substructural typing and imperative features.</abstract>

        <nops/>
      </pub>

      <pub id="TalCCS25" kind="conference">
	    <author person="shixins" />
        <author person="rogerdtz" />
        <author person="kosinw" />
        <author person="jzanders" />
        <author person="andreser" />
	    <author person="adamc" />
	    <author person="mengjiay" />

	    <title>Securing Cryptographic Software via Typed Assembly Language and a Hardware Extension</title>
	    <proceedings event="ccs25" />

	    <summary>Retrofitting cryptographic software to use a new hardware defense, by inferring types and rewriting at the assembly level</summary>

        <abstract>Authors of cryptographic software are well aware that their code should not leak secrets through its timing behavior, and, until 2018, they believed that following industry-standard <i>constant-time</i> coding guidelines was sufficient.  However, the revelation of the Spectre family of speculative execution attacks injected new complexities.</abstract>

        <abstract>To block speculative attacks, prior work has proposed annotating the program's source code to mark secret data, with hardware using this information to decide when to speculate (i.e., when only public values are involved) or not (when secrets are in play).  While these solutions are able to track secret information stored on the heap, they suffer from limitations that prevent them from correctly tracking secrets on the stack, at a cost in performance.</abstract>

        <abstract>This paper introduces <i>SecSep</i>, a transformation framework that rewrites assembly programs so that they partition secret and public data on the stack. By moving from the source-code level to assembly rewriting, SecSep is able to address limitations of prior work.  The key challenge in performing this assembly rewriting stems from the loss of semantic information through the lengthy compilation process. The key innovation of our methodology is a new variant of typed assembly language (TAL), <i>Octal</i>, which allows us to address this challenge.  Assembly rewriting is driven by compile-time inference within Octal.  We apply our technique to cryptographic programs and demonstrate that it enables secure speculation efficiently, incurring a low average overhead of 1.2%.</abstract>

        <abstract><a href="https://github.com/MATCHA-MIT/secsep">GitHub repository</a></abstract>
            
        <nops/>
      </pub>

      <pub id="TimingPLDI25" kind="conference">
        <author person="owenc" />
  	    <author person="andreser" />
	    <author person="adamc" />

	    <title>Smooth, Integrated Proofs of Cryptographic Constant Time for Nondeterministic Programs and Compilers</title>
	    <proceedings event="pldi25" />

	    <summary>Another variation on use of omnisemantics: compilers preserve security against timing side channels, even on programs with I/O and other sources of nondeterminism</summary>

        <abstract>Formal verification of software and compilers has been used to rule out large classes of security-critical issues, but risk of unintentional information leakage has received much less consideration.  It is a key requirement for formal specifications to leave some details of a system's behavior unspecified so that future implementation changes can be accommodated, and yet it is nonetheless expected that these choices would not be made based on confidential information the system handles.  This paper formalizes that notion using omnisemantics and plain single-copy assertions, giving for the first time a specification of what it means for a nondeterministic program to be constant-time or more generally to avoid leaking (a part of) its inputs.  We use this theory to prove data-leak-free execution of core cryptographic routines compiled from Bedrock2 C to RISC-V machine code, showing that the smooth specification and proof experience omnisemantics provides for nondeterminism extends to constant-time properties in the same setting.  We also study variants of the key program-compiler contract, highlighting pitfalls of tempting simplifications and subtle consequences of how inputs to nondeterministic choices are constrained.  Our results are backed by modular program-logic and compiler-correctness theorems, and they integrate into a neat end-to-end theorem in the Coq proof assistant.</abstract>

        <abstract><a href="https://github.com/mit-plv/bedrock2">GitHub repository</a></abstract>

        <nops/>
	  </pub>

	  <pub id="FjfjPLDI25" kind="conference">
        <author person="bthom" />
  	    <author person="jzliu" />
	    <author person="adamc" />
        <author person="arvind" />
            
	    <title>Making Concurrent Hardware Verification Sequential</title>
	    <proceedings event="pldi25" />

	    <summary>Simplifying modular proofs of hardware blocks by taking advantage of hierarchy</summary>

            <abstract>Compared to familiar hardware-description languages like Verilog, rule-based languages like Bluespec offer opportunities to import modularity features from software programming.  While Verilog modules are about connecting wires between submodules, Bluespec modules resemble objects in object-oriented programming, where interactions with a module occur only through calls to its methods.  However, while software objects can typically be characterized one method at a time, the concurrent nature of hardware makes it essential to consider the repercussions of invoking multiple methods simultaneously.  Prior formalizations of rule-based languages conceptualized modules by describing their semantics considering <i>arbitrary sets of simultaneous method calls</i>.  This internalized concurrency significantly complicates correctness proofs.  Rather than analyzing methods one-at-a-time, as is done when verifying software object methods, validating the correctness of rule-based modules necessitated simultaneous consideration of arbitrary subsets of method calls.  The result was a number of proof cases that grew exponentially in the size of the module's API.</abstract>

            <abstract>In this work, we side-step the exponential blowup through a set of judicious language restrictions.  We introduce a new Bluespec-inspired formal language, Fjfj, that supports <i>sequential characterization of modules</i>, while preserving the concurrent hardware nature of the language.  We evaluated Fjfj by implementing it in Coq, proving the key framework principle: the refinement theorem.  We demonstrated Fjfj expressivity via implementations and verification of three examples: a pipelined processor, a parameterized crossbar, and a network switch.</abstract>
            
            <nops/>
	  </pub>

      <pub id="IsolationCCS24" kind="conference">
	    <author person="stellal" />
        <author person="bthom" />
        <author person="cpitcla" />
	    <author person="adamc" />

	    <title>Specification and Verification of Strong Timing Isolation of Hardware Enclaves</title>
	    <proceedings event="ccs24" />
	    <award>Distinguished Artifact Award</award>

	    <summary>How to verify formally that an enclave-style hardware architecture fully isolates running threads from each other, e.g. considering timing side channels</summary>

        <abstract>The process isolation enforceable by commodity hardware and operating systems is too weak to protect secrets from malicious code running on the same machine: Spectre-era attacks exploit timing side channels derived from contention on shared microarchitectural resources to extract secrets.  With appropriate hardware support, however, we can construct <i>isolated enclaves</i> and safeguard independent processes from interference through timing side channels, a necessary step towards integrity and confidentiality guarantees.</abstract>
            
        <abstract>In this paper, we describe our work on formally specifying and verifying that a synthesizable hardware architecture implements <i>strong timing isolation</i> for enclaves.  We reason about the cycle-accurate semantics of circuits with respect to a trustworthy formulation of strong isolation based on "air-gapped machines" and develop a modular proof strategy that sidesteps the need to prove functionalf correctness of processors.  We apply our method on a synthesizable, multicore, pipelined RISC-V design formalized in Coq.</abstract>

        <abstract><a href="https://github.com/mit-plv/isolation">GitHub repository</a></abstract>
            
            <nops/>
	  </pub>

      <pub id="UnsupportedITP24" kind="conference">
		<author person="gruetter" />
        <author person="bthom" />
		<author person="adamc" />

		<title>Verifying Software Emulation of an Unsupported Hardware Instruction</title>
		<proceedings event="itp24" />

		<summary>Proving the right correctness relationship between two RISC-V implementation techniques: multiplication via a hardware instruction or via trapping to a software routine</summary>

                <abstract>Some processors, especially embedded ones, do not implement all instructions in hardware.  Instead, if the processor encounters an unimplemented instruction, an unsupported-instruction exception is raised, and an exception handler is run which implements the missing instruction in software.  Getting such a system to work correctly is tricky: The exception handler code must not destroy any state of the user program and must use the control and status registers (CSRs) of the processor correctly. Moreover, parts of the handler are typically implemented in assembly, while other parts are implemented in a language like C, and one must make sure that when jumping from the user program into the handler assembly, from the handler assembly into C, back to assembly and finally back to the user program, all the assumptions made by the different pieces of code, hardware, and the compiler are satisfied.</abstract>

                <abstract>Despite all these tricky details, there is a concise and intuitive way of stating the correctness of such a system: User programs running on a system where some instructions are implemented in software behave the same as if they were running on a system where all instructions are implemented in hardware.</abstract>

                <abstract>We formalize and prove such a statement in the Coq proof assistant, for the case of a simple exception handler implementing the multiplication instruction on a RISC-V processor.</abstract>

		<abstract><a href="https://github.com/mit-plv/softmul">GitHub repository</a></abstract>
		
        <nops/>
	  </pub>

	  <pub id="ConFrmCSF24" kind="conference">
		  <author person="atalay" />
		  <author person="nickolai" />
		  <author person="adamc" />
		  <author person="kaashoek" />
		  <title>Probability from Possibility: Probabilistic Confidentiality for Storage Systems Under Nondeterminism</title>
		  <proceedings event="csf24" />

		  <summary>Security verification of file systems that takes probabilistic failures into account</summary>

		  <abstract>Nondeterminism, such as system crashes, poses an important challenge to the security of storage systems by making leakages possible through secret-dependent result probabilities. This paper proposes a new possibilistic confidentiality specification prohibiting such probabilistic leakages. Our specification is preserved under simulation to enable modularity and is sequentially compositional. We implemented our specification in a framework that contains structures to implement storage systems and prove their confidentiality in a modular fashion. On top of our framework, we implemented the first crash-safe file system with a termination-insensitive version of our specification and machine-checkable confidentiality proofs. Our evaluation shows that proving confidentiality incurs 9.2x proof overhead per line of implementation code. Both our framework and file system are implemented in Coq and extracted to Haskell to obtain an executable artifact.</abstract>

		  <nops/>
	  </pub>

	  <pub id="GarageDoorPLDI24" kind="conference">
  	        <author person="andreser" />
            	<author person="jadep" />
                <author person="dijamner" />
		<author person="ashlin" />
		<author person="gruetter" />
                <author person="cpitcla" />
		<author person="adamc" />

		<title>Foundational Integration Verification of a Cryptographic Server</title>
		<proceedings event="pldi24" />

		<summary>An integrated Coq proof of a cryptographic server, as one machine-code image that runs on bare metal, built up from quite different programming languages and verification approaches</summary>

                <abstract>Some important dimensions of a formal verification might be called its <i>stack height</i>, or how many layers of a system are proved as a whole; <i>tool diversity</i>, or heterogeneity of tools used to verify different parts of a system; and <i>foundationalness</i>, or minimality of the tool-implementation code that must be trusted to believe verification results.  This paper presents our verification case study that is, to our knowledge, the first to reach our level of tool diversity while covering all software installed in a demonstration computer system and roughly maxing out foundationalness within a proof assistant.  That is, our unified proof is checked by Coq, and its statement depends on neither syntax nor semantics for any programming language but machine language, nor do we leave any compiler or verification tool as trusted, beyond Coq's kernel proof checker.  Our case study is a simple cryptographic server for flipping of a bit of state through authenticated network messages, adopting code conventions of embedded systems, like static bounds on memory usage.  We believe it is the first formal verification covering a full software stack that models both network input and output.  Perhaps most distinctive is that we have chosen quite different programming languages and verification tools for different parts of the software stack (e.g., some libraries are proved as functional programs with equational reasoning, and others are proved as C-like programs or even machine code with separation logic), yet all of the correctness theorems for libraries and layers are integrated into one foundational result.  We developed a unified specification style that is able to support that diversity well, and we experienced widely varying productivity with the different verification styles we employed, some of which we recommend for future work and some of which we do not.</abstract>

                <abstract>GitHub repositories: <a href="https://github.com/mit-plv/fiat-crypto">fiat-crypto</a> and <a href="https://github.com/mit-plv/bedrock2">bedrock2</a></abstract>

                <nops/>
	  </pub>

      <pub id="AtlPLDI24" kind="conference">
		<author person="lamanda" />
		<author person="gilbo" />
		<author person="adamc" />
		<author person="jrk" />
		<title>A Verified Compiler for a Functional Tensor Language</title>
		<proceedings event="pldi24" />
                
		<summary>Pushing the Coq-verified compilation guarantees even lower (to a C subset), within our <a href="/papers/AtlPOPL22/">ATL tensor-programming project</a></summary>

        <abstract>Producing efficient array code is crucial in high-performance domains like image processing and machine learning.  This goal depends on an ability to control factors like compute intensity and locality by reordering computations into different stages and granularities with respect to where they are stored.  However, traditional pure, functional tensor languages struggle to do so.  In a previous publication, the ATL language was introduced as a pure, functional tensor language capable of systematically decoupling compute and storage order via a set of high-level combinators known as reshape operators.  Reshape operators are a unique functional-programming construct since they manipulate storage location in the generated code by modifying the indices that appear on the left-hand sides of storage expressions.  We present a formal correctness proof for an implementation of the compilation algorithm, marking the first verification of a lowering algorithm from a functional language that enables separate control of compute and storage ordering.  One of the core difficulties of this proof required properly formulating the complex invariants to ensure that these storage-index remappings were well-formed.  Notably, this revealed a <i>soundness bug</i> in the original published compilation algorithm regarding the truncation reshape operator.  Our fix is a new type system that captures safety conditions that were previously implicit and enables us to prove compiler correctness for well-typed source programs.  We evaluate this type system and compiler implementation on a range of common programs and optimizations, including but not limited to those previously studied, which demonstrated performance comparable to established compilers like Halide.</abstract>

        <abstract><a href="https://github.com/ChezJrk/verified-scheduling">GitHub repository</a></abstract>

        <nops/>
	  </pub>

      <pub id="LivePLDI24" kind="conference">
		<author person="gruetter" />
		<author person="vfukala" />
		<author person="adamc" />
		<title>Live Verification in an Interactive Proof Assistant</title>
		<proceedings event="pldi24" />
                
		<summary>Could Coq be an even more pleasant C-programming IDE than the big names, if we work the right magic with notations and tactics?</summary>

        <abstract>We present a prototype for a tool that enables programmers to verify their code as they write it in real-time.  After each line of code that the programmer writes, the tool tells the programmer what it can prove about the program so far and indicates potential oversights or potentially violated assumptions.  Once the programmer has finished writing the program, it is already verified with a mathematical correctness proof.  Other tools providing real-time feedback already exist, but ours is the first one that only relies on a small trusted proof checker and that provides a concise summary of all the facts that are provable at the point in the program currently being edited, as opposed to only indicating whether user-stated assertions or postconditions hold.</abstract>

        <abstract>Program verification requires loop invariants, which are hard to find and tedious to spell out.  We explore a middle ground in the design space between the two extremes of requiring users to spell out loop invariants manually and attempting to infer loop invariants automatically: Based on the observation that a loop invariant often looks quite similar to the symbolic state right before the loop, our tool asks users to express the desired loop invariant as a diff from the symbolic state before the loop, which has the potential to lead to less verbose and more maintainable proofs.</abstract>

        <abstract>We prototyped our technique in the interactive proof assistant Coq, so our framework creates machine-checked proofs that the developed functions satisfy their specifications when executed according to the formal semantics of the source language.  Using a verified compiler proven against the same source-language semantics, we can ensure that the behavior of the compiled program matches the program's behavior as represented by the framework during the proof.  Additionally, since our polyglot source files can be viewed as Coq or C files at the same time, users willing to accept a bigger trusted code base can compile them with GCC.</abstract>

        <abstract><a href="https://github.com/mit-plv/bedrock2">GitHub repository</a></abstract>

        <nops/>
	  </pub>

      <pub id="RiscvICFP23" kind="conference">
	    <author person="bthom" />
		<author person="ijc" />
		<author person="andreser" />
		<author person="gruetter" />
		<author person="pratap" />
		<author person="acwright" />
		<author person="adamc" />
		<title>Flexible Instruction-Set Semantics via Abstract Monads (Experience Report)</title>
		<proceedings event="icfp23" />

		<summary>Our lightweight but flexible approach to mechanized semantics of hardware instruction sets</summary>

        <abstract>Instruction sets, from families like x86 and ARM, are at the center of many ambitious formal-methods projects. Many verification, synthesis, programming, and debugging tools rely on formal semantics of instruction sets, but different tools can use semantics in rather different ways. The best-known work applying single semantics across diverse tools relies on domain-specific languages like Sail, where the language and its translation tools are specialized to the realm of instruction sets. In the context of the open RISC-V instruction-set family, we decided to explore a different approach, with semantics written in a carefully chosen subset of Haskell. This style does not depend on any new language translators, relying instead on parameterization of semantics over type-class instances. Our case study is for the open RISC-V instruction-set family, and we have used a single core semantics to support testing, interactive proof, and model checking of both software and hardware, demonstrating that this functional-programming feature can support pleasant prototyping of ISA semantics.</abstract>

        <abstract>GitHub repositories: <a href="https://github.com/mit-plv/riscv-semantics">Haskell baseline</a> and <a href="https://github.com/mit-plv/riscv-coq">related Coq code</a></abstract>

        <nops/>
	  </pub>

      <pub id="CryptoptPLDI23" kind="conference">
	    <author person="joel.kuepper" />
		<author person="andreser" />
		<author person="jgross" />
		<author person="owenc" />
		<author person="chuyues" />
		<author person="swtian" />
		<author person="davidwu9" />
		<author person="adamc" />
		<author person="chitchanok.chuengsatiansup" />
		<author person="genkin" />
		<author person="wagner" />
		<author person="yval" />
		<title>CryptOpt: Verified Compilation with Random Program Search for Cryptographic Primitives</title>
		<proceedings event="pldi23" />
        <award>Distinguished Paper Award</award>

		<summary>Genetic program search meets translation validation for Fiat Cryptography, improving performance and shrinking the trusted base even while bringing in more avant-garde compiler techniques</summary>

        <abstract>Most software domains rely on compilers to translate high-level code to multiple different machine languages, with performance not too much worse than what developers would have the patience to write directly in assembly language.  However, cryptography has been an exception, where many performance-critical routines have been written directly in assembly (sometimes through metaprogramming layers).  Some past work has shown how to do formal verification of that assembly, and other work has shown how to generate C code automatically along with formal proof, but with consequent performance penalties vs. the best-known assembly.  We present Cryptopt, the first compilation pipeline that specializes high-level cryptographic functional programs into assembly code significantly faster than what GCC or Clang produce, with mechanized proof (in Coq) whose final theorem statement mentions little beyond the input functional program and the operational semantics of x86-64 assembly.  On the optimization side, we apply randomized search through the space of assembly programs, with repeated automatic benchmarking on target CPUs.  On the formal-verification side, we connect to the Fiat Cryptography framework (which translates functional programs into C-like IR code) and extend it with a new formally verified program-equivalence checker, incorporating a modest subset of known features of SMT solvers and symbolic-execution engines.  The overall prototype is quite practical, e.g. producing new fastest-known implementations for the relatively new Intel i9 12G, of finite-field arithmetic for both Curve25519 (part of the TLS standard) and the Bitcoin elliptic curve secp256k1.</abstract>

        <abstract>Code: <a href="https://github.com/0xADE1A1DE/CryptOpt">CryptOpt</a>, <a href="https://github.com/mit-plv/fiat-crypto">fiat-crypto</a></abstract>
                
        <nops/>
	  </pub>

	  <pub id="TransactionsOOPSLA22" kind="conference">
    	<author person="lesani" />
        <author person="xialiyao" />
		<author person="andersk" />
		<author person="cj" />
		<author person="adamc" />
        <author person="bcpierce" />
		<author person="stevez" />
		<title>C4: Verified Transactional Objects</title>
		<proceedings event="oopsla22" />
                
		<summary>Modular proofs of concurrent libraries, mixing classic lock-free data structures and transactional memory, in the style of interaction trees</summary>

        <abstract>Transactional objects combine the performance of classical concurrent objects with the high-level programmability of transactional memory. But verifying the correctness of transactional objects is tricky, requiring reasoning simultaneously about classical concurrent objects, which guarantee the atomicity of individual methods -- the property known as linearizability -- and about software-transactional-memory libraries, which guarantee the atomicity of user-defined sequences of method calls -- or serializability.</abstract>

        <abstract>We present a formal verification framework, built up from the familiar notion of linearizability and its compositional properties, that allows proof of both kinds of libraries, along with composition of theorems from both styles to prove correctness of applications or further libraries. We apply the framework in a significant case study, verifying a transactional set object built out of both classical and transactional components following the technique of transactional predication; the proof is modular, reasoning separately about the transactional and non-transactional parts of the implementation. Central to our approach is the use of syntactic transformers on interaction trees -- e.g., transactional libraries that transform client code to enforce a particular synchronization discipline. Our framework and case studies are mechanized in Coq.</abstract>

        <nops/>
  	  </pub>

      <pub id="HemiolaCAV22" kind="conference">
        <author person="joonwonc" />
        <author person="adamc" />
        <author person="arvind" />
        <title>Hemiola: A DSL and Verification Tools to Guide Design and Proof of Hierarchical Cache-Coherence Protocols</title>
        <proceedings event="cav22" />

        <summary>Taking all the fine-grained concurrency reasoning out of design and proof of cache-coherence protocols, via a DSL proved sound with commutativity analysis</summary>

        <abstract>Cache-coherence protocols have been one of the greatest challenges in formal verification of hardware, due to their central complication of executing multiple memory-access transactions concurrently within a distributed message-passing system.  In this paper, we introduce Hemiola, a framework embedded in Coq that guides the user to design protocols that never experience inconsistent interleavings while handling transactions concurrently.  The framework provides a DSL, where any protocol designed in the DSL always satisfies the serializability property, allowing a user to verify the protocol assuming that transactions are executed one-at-a-time.  Hemiola also provides a novel invariant proof method, for protocols designed in Hemiola, that only requires considering execution histories without interleaved memory accesses.  We used Hemiola to design and prove hierarchical MSI and MESI protocols as case studies.  We also demonstrated that the case-study protocols are hardware-synthesizable, by using a compilation/synthesis toolchain targeting FPGAs.</abstract>

        <abstract><a href="https://github.com/mit-plv/hemiola">GitHub repository</a></abstract>

        <nops/>
      </pub>

      <pub id="SpicyCSF22" kind="conference">
        <author person="tbraje" />
		<author person="alicerlee" />
        <author person="wagner.andr" />
        <author person="bkaiser" />
        <author person="danwcpark" />
        <author person="kalke" />
        <author person="robertkcunningham" />
        <author person="adamc" />
		<title>Adversary Safety by Construction in a Language of Cryptographic Protocols</title>
		<proceedings event="csf22" />
        <award>Lincoln Laboratory Best Paper Award</award>

		<summary>Mechanized cryptographic protocols that are guaranteed to resist adversary interference, in much the same way that traditional type systems resist memory errors</summary>

        <abstract>Compared to ordinary concurrent and distributed systems, cryptographic protocols are distinguished by the need to reason about interference by adversaries.  We suggest a new layered approach to tame that complexity, via an executable protocol language whose semantics does not reveal an adversary directly, instead enforcing a set of intuitive hygiene rules.  By virtue of those rules, protocols written in this language provably behave identically with or without interference by active Dolev-Yao-style adversaries.  As a result, formal reasoning about protocols can be simplified enough that even naive model checking can establish correctness of a multiparty protocol, through analysis of a state space with no adversary.</abstract>

        <abstract>We present the design and implementation of SPICY, short for Secure Protocols Implemented CorrectlY, including the semantics of its input languages; the essential safety proofs, formalized in the Coq theorem prover; and the automation techniques.  We provide a preliminary evaluation of the tool's performance and capabilities via a handful of case studies.</abstract>

        <abstract><a href="https://github.com/MIT-LL/spicy">GitHub repository</a></abstract>
        
        <nops/>
   	  </pub>
          
      <pub id="RewriterITP22" kind="conference">
    	<author person="jgross" />
        <author person="andreser" />
		<author person="miraya" />
		<author person="jadep" />
		<author person="adamc" />
		<title>Accelerating Verified-Compiler Development with a Verified Rewriting Engine</title>
		<proceedings event="itp22" />
        
		<summary>Generating formally verified compilers modularly via Coq-proved rewrite rules, applied to make Fiat Cryptography a lot faster</summary>

        <abstract>Compilers are a prime target for formal verification, since compiler bugs invalidate higher-level correctness guarantees, but compiler changes may become more labor-intensive to implement, if they must come with proof patches.  One appealing approach is to present compilers as sets of algebraic rewrite rules, which a generic engine can apply efficiently.  Now each rewrite rule can be proved separately, with no need to revisit past proofs for other parts of the compiler.  We present the first realization of this idea, in the form of a framework for the Coq proof assistant.  Our new Coq command takes normal proved theorems and combines them automatically into fast compilers with proofs.  We applied our framework to improve the Fiat Cryptography toolchain for generating cryptographic arithmetic, producing an extracted command-line compiler that is about 1000X faster while actually featuring simpler compiler-specific proofs.</abstract>

        <abstract><a href="https://github.com/mit-plv/rewriter">GitHub repository</a></abstract>
        
        <nops/>
  	  </pub>

      <pub id="MinimizerITP22" kind="conference">
    	<author person="jgross" />
        <author person="theo" />
		<author person="miraya" />
		<author person="adamc" />
		<title>Automatic Test-Case Reduction in Proof Assistants: A Case Study in Coq</title>
		<proceedings event="itp22" />
        
		<summary>Understanding regressions in Coq itself with automatic reduction of test cases</summary>

        <abstract>As the adoption of proof assistants increases, there is a need for efficiency in identifying, documenting, and fixing compatibility issues that arise from proof assistant evolution.  We present the Coq Bug Minimizer, a tool for <i>reproducing buggy behavior</i> with <i>minimal</i> and <i>standalone</i> files, integrated with coqbot to trigger <i>automatically</i> on Coq reverse CI failures.  Our tool eliminates the overhead of having to download, set up, compile, and then explore and understand large developments: enabling Coq developers to easily obtain modular test-case files for fast experimentation.  In this paper, we describe insights about how test-case reduction is different in Coq than in traditional compilers.We expect that our insights will generalize to other proof assistants.  We evaluate the Coq Bug Minimizer on over 150 CI failures.  Our tool succeeds in reducing failures to smaller test cases in roughly 75% of the time.  The minimizer produces a fully standalone test case 89% of the time, and it is on average about one-third the size of the original test.  The average reduced test case compiles in 1.25 seconds, with 75% taking under half a second.</abstract>

        <abstract><a href="https://github.com/JasonGross/coq-tools">GitHub repository</a></abstract>

        <nops/>
  	  </pub>

      <pub id="RupicolaPLDI22" kind="conference">
        <author person="cpitcla" />
		<author person="jadep" />
        <author person="dijamner" />
        <author person="andreser" />
        <author person="adamc" />
		<title>Relational Compilation for Performance-Critical Applications</title>
		<proceedings event="pldi22" />

		<summary>Round two of using Coq to compile functional programs to imperative programs with proof, using proof-generating extensions for flexibility</summary>

        <abstract>There are typically two ways to compile and run a purely functional program verified using an interactive theorem prover (ITP): automatically extracting it to a similar language (typically an unverified process, like Coq to OCaml) or manually proving it equivalent to a lower-level reimplementation (like a C program).  Traditionally, only the latter produced both excellent performance and end-to-end proofs.</abstract>

        <abstract>This paper shows how to recast program extraction as a proof-search problem to automatically derive correct-by-construction, high-performance code from purely functional programs.
        We call this idea <i>relational compilation</i> -- it extends recent developments with novel solutions to loop-invariant inference and genericity in kinds of side effects.</abstract>

        <abstract>Crucially, relational compilers are incomplete, and unlike traditional compilers, they generate good code not because of a fixed set of clever built-in optimizations but because they allow experts to plug in domain-specific extensions that give them complete control over the compiler's output.</abstract>

        <abstract>We demonstrate the benefits of this approach with Rupicola, a new compiler-construction toolkit designed to extract fast, verified, idiomatic low-level code from annotated functional models.  Using case studies and performance benchmarks, we show that it is extensible with minimal effort and that it achieves performance on par with that of handwritten C programs.</abstract>

        <abstract><a href="https://github.com/mit-plv/rupicola">GitHub repository</a></abstract>
        
        <nops/>
	  </pub>

      <pub id="AtlPOPL22" kind="conference">
		<author person="lamanda" />
		<author person="gilbo" />
		<author person="adamc" />
		<author person="jrk" />
		<title>Verified Tensor-Program Optimization Via High-level Scheduling Rewrites</title>
		<proceedings event="popl22" />
        
		<summary>Deriving correct imperative loop programs from functional programs with Coq proof, in a style inspired by <a href="https://halide-lang.org/">Halide</a></summary>

        <abstract>We present a lightweight Coq framework for optimizing tensor kernels written in a pure, functional array language. Optimizations rely on user scheduling using series of verified, semantics-preserving rewrites. Unusually for compilation targeting imperative code with arrays and nested loops, all rewrites are source-to-source within a purely functional language. Our language comprises a set of core constructs for expressing high-level computation detail and a set of what we call reshape operators, which can be derived from core constructs but trigger low-level decisions about storage patterns and ordering. We demonstrate that not only is this system capable of deriving the optimizations of existing state-of-the-art languages like Halide and generating comparably performant code, it is also able to schedule a family of useful program transformations beyond what is reachable in Halide.</abstract>

        <abstract><a href="https://github.com/ChezJrk/verified-scheduling">GitHub repository</a></abstract>

        <nops/>
	  </pub>

      <pub id="CoroutinesPOPL22" kind="conference">
		<author person="ikebuchi" />
		<author person="andreser" />
		<author person="adamc" />
		<title>Certifying Derivation of State Machines from Coroutines</title>
		<proceedings event="popl22" />
        
		<summary>Using Coq to derive correct first-order implementations of network protocols from higher-order descriptions, applied to TLS 1.3</summary>

        <abstract>One of the biggest implementation challenges in security-critical network protocols is nested state machines. In practice today, state machines are either implemented manually at a low level, risking bugs easily missed in audits; or are written using higher-level abstractions like threads, depending on runtime systems that may sacrifice performance or compatibility with the ABIs of important platforms (e.g., resource-constrained IoT systems). We present a compiler-based technique allowing the best of both worlds, coding protocols in a natural high-level form, using freer monads to represent nested coroutines, then compiled automatically to lower-level code with explicit state. In fact, our compiler is implemented as a tactic in the Coq proof assistant, structuring compilation as search for an equivalence proof for source and target programs. As such, it is straightforwardly (and soundly) extensible with new hints, for instance regarding new data structures that may be used to index coroutines. As a case study, we implemented a core of TLS sufficient for use with popular Web browsers, and our experiments show that the extracted Haskell code achieves reasonable performance.</abstract>
        
        <abstract><a href="https://github.com/mit-plv/certifying-derivation-of-state-machines-from-coroutines">GitHub repository</a></abstract>

        <nops/>
	  </pub>

      <pub id="FrapICFP21" kind="conference">
		<author person="adamc" />
		<title>Skipping the Binder Bureaucracy with Mixed Embeddings in a Semantics Course (Functional Pearl)</title>
		<proceedings event="icfp21" />
        
		<summary>Overview of a key design principle in <a href="http://adam.chlipala.net/frap/">FRAP</a> courses: <i>mixed embeddings</i> for concise but flexible syntax definitions for embedded languages</summary>

        <abstract>Rigorous reasoning about programs calls for some amount of bureaucracy in managing details like variable binding, but, in guiding students through big ideas in semantics, we might hope to minimize the overhead.  We describe our experiment introducing a range of such ideas, using the Coq proof assistant, without any explicit representation of variables, instead using a higher-order syntax encoding that we dub "mixed embedding": it is neither the fully explicit syntax of deep embeddings nor the syntax-free programming of shallow embeddings.  Marquee examples include different takes on concurrency reasoning, including in the traditions of model checking (partial-order reduction), program logics (concurrent separation logic), and type checking (session types) -- all presented without any side conditions on variables.</abstract>

        <abstract><a href="http://adam.chlipala.net/frap/">Book home page</a></abstract>

        <nops/>
	  </pub>

      <pub id="LightbulbPLDI21" kind="conference">
        <author person="andreser" />
        <author person="gruetter" />
        <author person="joonwonc" />
		<author person="clark.wood" />
        <author person="adamc" />
		<title>Integration Verification Across Software and Hardware for a Simple Embedded System</title>
		<proceedings event="pldi21" />

		<summary>An end-to-end, software+hardware Coq proof for an Internet-connected lightbulb</summary>

        <abstract>The interfaces between layers of a system are susceptible to bugs if developers of adjacent layers proceed under subtly different assumptions.  Formal verification of two layers against the same formal model of the interface between them can be used to shake out these bugs.  Doing so for every interface in the system can, in principle, yield unparalleled assurance of the correctness and security of the system as a whole.  However, there have been remarkably few efforts that carry out this exercise, and all of them have simplified the task by restricting interactivity of the application, inventing new simplified instruction sets, and using unrealistic input and output mechanisms.  We report on the first verification of a realistic embedded system, with its application software, device drivers, compiler, and RISC-V processor represented inside the Coq proof assistant as one mathematical object, with a machine-checked proof of functional correctness.  A key challenge is structuring the proof modularly, so that further refinement of the components or expansion of the system can proceed without revisiting the rest of the system.</abstract>

        <abstract><a href="https://github.com/mit-plv/bedrock2">GitHub repository</a></abstract>
        
        <nops/>
	  </pub>

      <pub id="CuttlesimASPLOS21" kind="conference">
        <author person="cpitcla" />
        <author person="bthom" />
        <author person="stellal" />
        <author person="arvind" />
		<author person="adamc" />
		<title>Effective Simulation and Debugging for a High-Level Hardware Language Using Software Compilers</title>
		<proceedings event="asplos21" />

		<summary>Bootstrapping on software-development tools to create a good experience simulating, debugging, and profiling hardware designs in Bluespec-like languages, taking advantage of high-level properties of source files</summary>

        <abstract>Rule-based hardware design languages (RHDLs) promise to enhance developer productivity by offering convenient abstractions.  Advanced compiler technology keeps the cost of these abstractions low, generating circuits with excellent area and timing properties.</abstract>

        <abstract>Unfortunately, comparatively little effort has been spent on building simulators and debuggers for these languages, so users often simulate and debug their designs at the RTL level.  This is problematic because generated circuits typically suffer from poor readability, as compiler optimizations can break high-level abstractions.  Worse, optimizations that operate under the assumption that concurrency is essentially free yield faster circuits but often actively hurt simulation performance on platforms with limited concurrency, like desktop computers or servers.</abstract>

        <abstract>This paper demonstrates the benefits of completely separating the simulation and synthesis pipelines.  We propose a new approach, yielding the first compiler designed for effective simulation and debugging of a language in the Bluespec family.  We generate cycle-accurate C++ models that are readable, compatible with a wide range of traditional software-debugging tools, and fast (often 2 to 3x faster than circuit-level simulation).  We achieve these results by optimizing for sequential performance and using static analysis to minimize redundant work.  The result is a vastly-improved hardware-design experience, which we demonstrate on embedded processor designs and DSP building blocks using performance benchmarks and debugging case studies.</abstract>

        <abstract><a href="https://github.com/mit-plv/koika">GitHub repository</a></abstract>
        
        <nops/>
	  </pub>

	  <pub id="FiatIJCAR20" kind="conference">
        <author person="cpitcla" />
		<author person="wangpeng" />
        <author person="bendy" />
		<author person="jgross" />
		<author person="adamc" />
		<title>Extensible Extraction of Efficient Imperative Programs with Foreign Functions, Manually Managed Memory, and Proofs</title>
		<proceedings event="ijcar20" />

		<summary>The last link in a pipeline for automatic compilation, with proofs, from relational specifications to Bedrock assembly programs</summary>

        <abstract>We present an original approach to sound program extraction in a proof assistant, using syntax-driven automation to derive correct-by-construction imperative programs from nondeterministic functional source code. Our approach does not require committing to a single inflexible compilation strategy and instead makes it straightforward to create domain-specific code translators. In addition to a small set of core definitions, our framework is a large, user-extensible collection of compilation rules each phrased to handle specific language constructs, code patterns, or data manipulations. By mixing and matching these pieces of logic, users can easily tailor extraction to their own domains and programs, getting maximum performance and ensuring correctness of the resulting assembly code.</abstract>

        <abstract>Using this approach, we complete the first proof-generating pipeline that goes automatically from high-level specifications to assembly code. In our main case study, the original specifications are phrased to resemble SQL-style queries, while the final assembly code does manual memory management, calls out to foreign data structures and functions, and is suitable to deploy on resource-constrained platforms. The pipeline runs entirely within the Coq proof assistant, leading to final, linked assembly code with overall full-functional-correctness proofs in separation logic. </abstract>

        <abstract><a href="https://github.com/mit-plv/fiat">GitHub repository</a></abstract>

        <nops/>
	  </pub>

	  <pub id="KoikaPLDI20" kind="conference">
        <author person="bthom" />
        <author person="cpitcla" />
		<author person="adamc" />
        <author person="arvind" />
		<title>The Essence of Bluespec: A Core Language for Rule-Based Hardware Design</title>
		<proceedings event="pldi20" />

		<summary>A new hardware-description language that combines Bluespec's modular-decomposition style with fine-grained control of timing; includes Coq embedding with a verified compiler to circuits</summary>

        <abstract>The Bluespec hardware-description language presents a significantly higher-level view than hardware engineers are used to, exposing a simpler concurrency model that promotes formal proof, without compromising on performance of compiled circuits. Unfortunately, the cost model of Bluespec has been unclear, with performance details depending on a mix of user hints and opaque static analysis of potential concurrency conflicts within a design. In this paper we present Kôika, a derivative of Bluespec that preserves its desirable properties and yet gives direct control over the <i>scheduling</i> decisions that determine performance. Kôika has a novel and deterministic operational semantics that uses dynamic analysis to avoid concurrency anomalies. Our implementation includes Coq definitions of syntax, semantics, key metatheorems, and a verified compiler to circuits. We argue that most of the extra circuitry required for dynamic analysis can be eliminated by compile-time BSV-style static analysis.</abstract>

        <abstract><a href="https://github.com/mit-plv/koika">GitHub repository</a></abstract>
        
        <nops/>
	  </pub>

      <pub id="NarcissusICFP19" kind="conference">
        <author person="bendy" />
        <author person="sorawit" />
        <author person="cpitcla" />
        <author person="ye202" />
		<author person="adamc" />
		<title>Narcissus: Correct-By-Construction Derivation of Decoders and Encoders from Binary Formats</title>
		<proceedings event="icfp19" />

		<summary>Using Coq to derive efficient binary-format parsers from declarative specifications, automatically</summary>

        <abstract>It is a neat result from functional programming that libraries of <i>parser combinators</i> can support rapid construction of decoders for quite a range of formats.  With a little more work, the same combinator program can denote both a decoder and an encoder.  Unfortunately, the real world is full of gnarly formats, as with the packet formats that make up the standard Internet protocol stack.  Most past parser-combinator approaches cannot handle these formats, and the few exceptions require redundancy -- one part of the natural grammar needs to be hand-translated into hints in multiple parts of a parser program.  We show how to recover very natural and nonredundant format specifications, covering all popular network packet formats and generating both decoders and encoders automatically.  The catch is that we use the Coq proof assistant to derive both kinds of artifacts using tactics, automatically, in a way that guarantees that they form inverses of each other.  We used our approach to reimplement packet processing for a full Internet protocol stack, inserting our replacement into the OCaml-based MirageOS unikernel, resulting in minimal performance degradation.</abstract>

        <abstract><a href="https://github.com/mit-plv/fiat/tree/master/src/Narcissus">GitHub repository</a></abstract>

        <nops/>
	  </pub>
      
	  <pub id="FiatCryptoSP19" kind="conference">
		<author person="andreser" />
		<author person="jadep" />
		<author person="jgross" />
		<author person="rsloan" />
		<author person="adamc" />
		<title>Simple High-Level Code For Cryptographic Arithmetic -- With Proofs, Without Compromises</title>
		<proceedings event="sp19" />

		<summary>Correct-by-construction generation of low-level crypto-primitive code using Coq</summary>

        <abstract>We introduce a new approach for implementing cryptographic arithmetic in short high-level code with machine-checked proofs of functional correctness.  We further demonstrate that simple partial evaluation is sufficient to transform into the fastest-known C code, breaking the decades-old pattern that the only fast implementations are those whose instruction-level steps were written out by hand.</abstract>

        <abstract>These techniques were used to build an elliptic-curve library that achieves competitive performance for 80 prime fields and multiple CPU architectures, showing that implementation and proof effort scales with the number and complexity of conceptually different algorithms, not their use cases.  As one outcome, we present the first verified high-performance implementation of P-256, the most widely used elliptic curve.  Implementations from our library were included in BoringSSL to replace existing specialized code, for inclusion in several large deployments for Chrome, Android, and CloudFlare.</abstract>

        <abstract><i>Note on errata:</i> a prepublication version was posted here for several months, containing some errors that have been fixed in the final version posted now.</abstract>

        <abstract><a href="https://github.com/mit-plv/fiat-crypto">Source code</a></abstract>

        <nops/>
	  </pub>

	  <pub id="HscGOMAC19" kind="conference">
		<author person="adamc" />
		<title>Algorithmic Checking of Security Arguments for Microprocessors</title>
		<proceedings event="gomac19" />

		<summary>Summarizing our team's work with formal methods in <a href="https://www.darpa.mil/program/system-security-integration-through-hardware-and-firmware">the DARPA SSITH program</a></summary>

        <abstract>Anticipating all possible attacks on a system is hard work.  Malicious actors seem to have an inherent advantage, since they can win by finding single vulnerabilities.  In our MIT team within the DARPA SSITH program, we are exploring principled ways to rule out human error as a source of security issues in computer processors.  A typical security audit involves prose arguments about attack models and why they are thwarted.  We instead write down formal mathematical theorems about real digital hardware designs, and we build their formal proofs that can be checked algorithmically.  That is, a program, rather than a potentially distracted human, confirms that the security argument is convincing.</abstract>

        <abstract>After giving some background on the general technology, I would like to focus on two concrete uses in the SSITH program.  First, we are exploring flexible tagging support, to flow additional security-relevant information through the microarchitectural state of a Linux-capable processor.  Unusually, however, we propose to compile custom processor descriptions automatically from descriptions of security policies to be enforced.  We aim to do this compilation in a way that gives formal theorems that the generated processors truly enforce the security policies.  Second, we are tackling the issues with timing side channels exposed by the Spectre and Meltdown vulnerabilities.  Through a synergistic connection with work funded by the National Science Foundation, we are able to prove security theorems for whole hardware-software system stacks.  For instance, we can show that a compiled C program with a cryptographic function will run on a specific RISC-V processor, in a way where a secret input flowing into the function provably has no effect on timing of output events flowing out of the processor.</abstract>

        <nops/>
	  </pub>
      
	  <pub id="FscqOSDI18" kind="conference">
		<author person="atalay" />
		<author person="tchajed" />
		<author person="adamc" />
		<author person="kaashoek" />
		<author person="nickolai" />
		<title>Proving confidentiality in a file system using DiskSec</title>
		<proceedings event="osdi18" />

		<summary><a href="FscqSOSP15/">FSCQ</a> extended to track information-flow policies that distinguish between different users</summary>

        <abstract>SFSCQ is the first file system with a machine-checked proof of security.  To develop, specify, and prove SFSCQ, this paper introduces DiskSec, a novel approach for reasoning about confidentiality of storage systems, such as a file system.  DiskSec addresses the challenge of specifying confidentiality using the notion of <i>data noninterference</i> to find a middle ground between strong and precise information-flow-control guarantees and the weaker but more practical discretionary access control.  DiskSec factors out reasoning about confidentiality from other properties (such as functional correctness) using a notion of <i>sealed blocks</i>.  Sealed blocks enforce that the file system treats confidential file blocks as opaque in the bulk of the code, greatly reducing the effort of proving data noninterference.  An evaluation of SFSCQ shows that its theorems preclude security bugs that have been found in real file systems, that DiskSec imposes little performance overhead, and that SFSCQ's incremental development effort, on top of DiskSec and DFSCQ, on which it is based, was moderate.</abstract>

        <nops/>
	  </pub>
      
	  <pub id="MakamICFP18" kind="conference">
		<author person="antonis" />
		<author person="adamc" />
		<title>Prototyping a Functional Language using Higher-Order Logic Programming: A Functional Pearl on Learning the Ways of Lambda-Prolog/Makam</title>
		<proceedings event="icfp18" />

		<summary>An introduction to a slick way of implementing programming languages concisely and modularly, focusing on type checking, told in the style of a play, including songs</summary>

        <abstract>We demonstrate how the framework of <i>higher-order logic programming</i>, as exemplified in the Lambda-Prolog language design, is a prime vehicle for rapid prototyping of implementations for programming languages with sophisticated type systems.  We present the literate development of a type checker for a language with a number of complicated features, culminating in a standard ML-style core with algebraic datatypes and type generalization, extended with staging constructs that are generic over a separately defined language of terms.  We add each new feature in sequence, with little to no changes to existing code.  Scaling the higher-order logic programming approach to this setting required us to develop approaches to challenges like complex variable binding patterns in object languages and performing generic structural traversals of code, making use of novel constructions in the setting of Lambda-Prolog, such as GADTs and generic programming.  For our development, we make use of Makam, a new implementation of Lambda-Prolog, which we introduce in tutorial style as part of our (quasi-)literate development.</abstract>

        <abstract><a href="http://astampoulis.github.io/makam/">Project site</a></abstract>

        <nops/>
	  </pub>

	  <pub id="ComputableLICS18" kind="conference">
		<author person="sherman" />
		<author person="lukesci" />
		<author person="adamc" />
		<author person="mcarbin" />
		<title>Computable decision-making on the reals and other spaces via partiality and nondeterminism</title>
		<proceedings event="lics18" />

		<summary>A theorem in real analysis shows that, in a world where all computations are continuous, we can't implement interesting conditional tests over, say, the real numbers.  Here we show how to get around the problem with a functional-programming-friendly topological treatment of nondeterminism.  (We can make discrete decisions about values from continuous spaces so long as we leave some wiggle room about what will actually happen at runtime.)</summary>

        <abstract>Though many safety-critical software systems use floating point to represent real-world input and output, the mathematical specifications of these systems' behaviors use real numbers.  Significant deviations from those specifications can cause errors and jeopardize safety.  To ensure system safety, some programming systems offer exact real arithmetic, which often enables a program's computation to match its mathematical specification exactly. However, exact real arithmetic complicates decision-making: in these systems, it is impossible to compute (total and deterministic) discrete decisions based on connected spaces such as R. We present programming-language semantics based on constructive topology with variants allowing nondeterminism and/or partiality.  Either nondeterminism or partiality suffices to allow computable decision making on connected spaces such as R.  We then introduce <i>pattern matching</i> on spaces, a language construct for creating programs on spaces, generalizing pattern matching in functional programming, where patterns need not represent decidable predicates and also may overlap or be inexhaustive, giving rise to nondeterminism or partiality, respectively.  Nondeterminism and/or partiality also yield formal <i>logics for constructing approximate decision procedures</i>.  We extended the Marshall language for exact real arithmetic with these constructs and implemented some programs with it.</abstract>

        <abstract><a href="https://github.com/psg-mit/marshall-lics/">Source code</a></abstract>

        <nops/>
	  </pub>

	  <pub id="ReificationITP18" kind="conference">
		<author person="jgross" />
		<author person="andreser" />
		<author person="adamc" />
		<title>Reification by Parametricity: Fast Setup for Proof by Reflection, in Two Lines of Ltac</title>
		<proceedings event="itp18" />

		<summary>A surprisingly simple way to convert terms in higher-order logic into first-class syntax trees, using standard features: would you believe that reification can mostly be done by term normalization in the metalanguage?</summary>

        <abstract>We present a new strategy for performing reification in Coq.  That is, we show how to generate first-class abstract syntax trees from "native" terms of Coq's logic, suitable as inputs to verified compilers or procedures in the <i>proof-by-reflection</i> style.  Our new strategy, based on simple generalization of subterms as variables, is straightforward, short, and fast.  In its pure form, it is only complete for constants and function applications, but "let" binders, eliminators, lambdas, and quantifiers can be accommodated through lightweight coding conventions or preprocessing.</abstract>

        <abstract>We survey the existing methods of reification across multiple Coq metaprogramming facilities, describing various design choices and tricks that can be used to speed them up, as well as various limitations.  We report benchmarking results for 18 variants, in addition to our own, finding that our own reification outperforms 16 of these methods in all cases, and one additional method in some cases; writing an OCaml plugin is the only method tested to be faster.  Our method is the most concise of the strategies we considered, reifying terms using only two to four lines of Ltac---beyond lists of the identifiers to reify and their reified variants.  Additionally, our strategy automatically provides error messages that are no less helpful than Coq's own error messages.</abstract>

        <abstract><a href="https://github.com/mit-plv/reification-by-parametricity">Source code</a></abstract>

        <nops/>
	  </pub>

	  <pub id="FscqSOSP17" kind="conference">
		<author person="hchen" />
		<author person="tchajed" />
		<author person="akonradi" />
		<author person="swang93" />
		<author person="atalay" />
		<author person="adamc" />
		<author person="kaashoek" />
		<author person="nickolai" />
		<title>Verifying a High-Performance Crash-Safe File System Using a Tree Specification</title>
		<proceedings event="sosp17" />

		<summary><a href="FscqSOSP15/">FSCQ</a> extended to support "flush" operations and delayed syncing of data to disk, as a performance optimization</summary>

        <abstract>VDFS is the first file system that (1) provides a precise specification for <tt>fsync</tt> and <tt>fdatasync</tt>, which allow applications to achieve high performance and crash safety, and that (2) provides a machine-checked proof that its implementation meets this precise specification.  VDFS's proof rules out some of the most common bugs in file-system implementations, as system calls are proved to expose the expected atomic behavior.  VDFS's specification also allows applications to prove their own crash safety, avoiding application-level bugs such as forgetting to invoke <tt>fsync</tt> on both the file and the containing directory.</abstract>

        <abstract>The key challenge in building VDFS is to write concise specifications for the file system and its internal implementation.  VDFS introduces a <i>metadata-prefix</i> specification that captures the properties of <tt>fsync</tt> and <tt>fdatasync</tt>, which roughly follows the behavior of Linux ext4.  This specification uses a notion of <i>tree sequences</i> -- a logical sequence of file system tree states -- to succinctly describe the possible states after a crash, and to describe how data writes can be re-ordered with respect to metadata updates.</abstract>

        <abstract>An evaluation shows that VDFS achieves 103 MB/s on large file writes to an SSD and durably creates small files at a rate of 1,618 files per second.  In comparison, Linux ext4 achieves 295 MB/s for large file writes and 4,977 files/s for small file creation.  VDFS is much faster than any previous verified file system (none can even implement large file writes, and the fastest can create 350 files/s).</abstract>

        <abstract><a href="https://github.com/mit-pdos/fscq">GitHub repository</a></abstract>

        <nops/>
	  </pub>

	  <pub id="TimlOOPSLA17" kind="conference">
		<author person="wangpeng" />
		<author person="diwang" />
		<author person="adamc" />
		<title>TiML: A Functional Language for Practical Complexity Analysis with Invariants</title>
		<proceedings event="oopsla17" />

		<summary>Using refinement types to upper-bound program asymptotic running time, taking advantage of invariants specific to data structures</summary>

        <abstract>We present TiML (Timed ML), an ML-like functional language with time-complexity annotations in types. It uses indexed types to express sizes of data structures and upper bounds on running time of functions; and refinement kinds to constrain these indices, expressing data-structure invariants and pre/post-conditions. Indexed types are flexible enough that TiML avoids a built-in notion of "size", and the programmer can choose to index user-defined datatypes in any way that helps her analysis. TiML's distinguishing characteristic is supporting highly automated time-bound verification applicable to data structures with nontrivial invariants. The programmer provides type annotations, and the typechecker generates verification conditions that are discharged by an SMT solver. Type and index inference are supported to lower annotation burden, and, furthermore, big-O complexity can be inferred from recurrences generated during typechecking by a recurrence solver based on heuristic pattern matching (e.g. using the Master Theorem to handle divide-and-conquer-like recurrences).  We have evaluated TiML's usability by implementing a broad suite of case-study modules, demonstrating that TiML, though lacking full automation and theoretical completeness, is versatile enough to verify worst-case and/or amortized complexities for algorithms and data structures like classic list operations, merge sort, Dijkstra's shortest-path algorithm, red-black trees, Braun trees, functional queues and dynamic tables with bounds like mn log n.  The learning curve and annotation burden are reasonable, as we argue with statistics on our case studies. We formalized TiML's type-soundness proof in Coq.</abstract>

        <nops/>
	  </pub>

	  <pub id="KamiICFP17" kind="conference">
		<author person="joonwonc" />
		<author person="vmurali" />
		<author person="sherman" />
		<author person="adamc" />
		<author person="arvind" />
		<title>Kami: A Platform for High-Level Parametric Hardware Specification and its Modular Verification</title>
		<proceedings event="icfp17" />

		<summary>A Coq framework for modular correctness proofs of computer-architecture designs, supporting automatic extraction to circuits that run on FPGAs, etc.</summary>

        <abstract>It has become fairly standard in the programming-languages research world to verify functional programs in proof assistants using induction, algebraic simplification, and rewriting.  In this paper, we introduce Kami, a Coq library that uses labeled transition systems to enable similar expressive and modular reasoning for hardware designs expressed in the style of the Bluespec language.  We can specify, implement, and verify realistic designs entirely within Coq, ending with automatic extraction into a pipeline that bottoms out in FPGAs.  Our methodology has been evaluated in a case study verifying an infinite family of multicore systems, with cache-coherent shared memory and pipelined cores implementing (the base integer subset of) the RISC-V instruction set.</abstract>

        <abstract><a href="http://plv.csail.mit.edu/kami/">Project web site</a></abstract>

        <nops/>
	  </pub>

	  <pub id="FiatSNAPL17" kind="conference">
		<author person="adamc" />
		<author person="bendy" />
		<author person="dukhovni" />
		<author person="jgross" />
		<author person="cpitcla" />
		<author person="sorawit" />
		<author person="wangpeng" />
		<author person="kqy" />
		<title>The End of History? Using a Proof Assistant to Replace Language Design with Library Design</title>
		<proceedings event="snapl17" />

		<summary>The sales pitch for our Fiat system as embodying a new programming style, with novel and effective kinds of abstraction and modularity</summary>

        <abstract>Functionality of software systems has exploded in part because of advances in programming-language support for packaging reusable functionality as libraries.  Developers benefit from the uniformity that comes of exposing many interfaces in the same language, as opposed to stringing together hodgepodges of command-line tools.  Domain-specific languages may be viewed as an evolution of the power of reusable interfaces, when those interfaces become so flexible as to deserve to be called programming languages.  However, common approaches to domain-specific languages give up many of the hard-won advantages of library-building in a rich common language, and even the traditional approach poses significant challenges in learning new APIs.  We suggest that instead of continuing to develop new domain-specific languages, our community should embrace library-based ecosystems within very expressive languages that mix programming and theorem proving.  Our prototype framework Fiat, a library for the Coq proof assistant, turns languages into easily comprehensible libraries via the key idea of modularizing <i>functionality</i> and <i>performance</i> away from each other, the former via <i>macros that desugar into higher-order logic</i> and the latter via <i>optimization scripts</i> that derive efficient code from logical programs.</abstract>

        <abstract><a href="http://plv.csail.mit.edu/fiat/">Project web site</a></abstract>

		<abstract>Slides are available from my talk [<a href="FiatSNAPL17Talk.odp">LibreOffice</a>, <a href="FiatSNAPL17Talk.pdf">PDF</a>].</abstract>

        <nops/>
	  </pub>

	  <pub id="SqlcachePOPL17" kind="conference">
		<author person="ziv" />
		<author person="adamc" />
		<title>A Program Optimization for Automatic Database Result Caching</title>
		<proceedings event="popl17" />

		<summary>A compiler optimization for <a href="http://www.impredicative.com/ur/">Ur/Web</a> that adds caching for SQL-query results and derived computations, inferring sound invalidation strategies that often avoid bottlenecks for parallel execution</summary>

        <abstract>Most popular Web applications rely on persistent databases based on languages like SQL for declarative specification of data models and the operations that read and modify them.  As applications scale up in user base, they often face challenges responding quickly enough to the high volume of requests.  A common aid is <i>caching</i> of database results in the application's memory space, taking advantage of program-specific knowledge of which caching schemes are sound and useful, embodied in handwritten modifications that make the program less maintainable.  These modifications also require nontrivial reasoning about the read-write dependencies across operations.  In this paper, we present a compiler optimization that automatically adds sound SQL caching to Web applications coded in the Ur/Web domain-specific functional language, with no modifications required to source code.  We use a custom cache implementation that supports concurrent operations without compromising the transactional semantics of the database abstraction.  Through experiments with microbenchmarks and production Ur/Web applications, we show that our optimization in many cases enables an easy doubling or more of an application's throughput, requiring nothing more than passing an extra command-line flag to the compiler.</abstract>

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

        <nops/>
	  </pub>

	  <pub id="StencilsITP16" kind="conference">
		<author person="gregoire" />
		<author person="adamc" />
		<title>Mostly Automated Formal Verification of Loop Dependencies with Applications to Distributed Stencil Algorithms</title>
		<proceedings event="itp16" />

		<summary>A Coq framework for verifying that nested loops obey dependency constraints, in message-passing distributed programs that collaboratively fill in the cells of large multidimensional grids</summary>

        <abstract>The class of <i>stencil</i> programs involves repeatedly updating elements of arrays according to fixed patterns, referred to as stencils. Stencil problems are ubiquitous in scientific computing and are used as an ingredient to solve more involved problems. Their high regularity allows massive parallelization. Two important challenges in designing such algorithms are cache efficiency and minimizing the number of communication steps between nodes. In this paper, we introduce a mathematical framework for a crucial aspect of formal verification of both sequential and distributed stencil algorithms, and we describe its Coq implementation. We present a domain-specific embedded programming language with support for automating the most tedious steps of proofs that nested loops respect dependencies, applicable to sequential and distributed examples. Finally, we evaluate the robustness of our library by proving the dependency-correctness of some real-world stencil algorithms, including a state-of-the-art cache-oblivious sequential algorithm, as well as two optimized distributed kernels.</abstract>

        <abstract><a href="https://github.com/mit-plv/stencils">Source code</a></abstract>

        <nops/>
	  </pub>

	  <pub id="ChaparPOPL16" kind="conference">
		<author person="lesani" />
		<author person="cj" />
		<author person="adamc" />
		<title>Chapar: Certified Causally Consistent Distributed Key-Value Stores</title>
		<proceedings event="popl16" />

		<summary>Coq proofs of several distributed key-value store algorithms, including principles for modular reasoning about client programs that use them</summary>

        <abstract>Today's Internet services are often expected to stay available and render high responsiveness even in the face of site crashes and network partitions.  Theoretical results state that causal consistency is one of the strongest consistency guarantees that is possible under these requirements, and many practical systems provide causally consistent key-value stores.  In this paper, we present a framework called Chapar for modular verification of causal consistency for replicated key-value store implementations and their client programs.  Specifically, we formulate separate correctness conditions for key-value store implementations and for their clients.  The interface between the two is a novel operational semantics for causal consistency.  We have verified the causal consistency of two key-value store implementations from the literature using a novel proof technique.  We have also implemented a simple automatic model checker for the correctness of client programs.  The two independently verified results for the implementations and clients can be composed to conclude the correctness of any of the programs when executed with any of the implementations.  We have developed and checked our framework in Coq, extracted it to OCaml, and built executable stores.</abstract>

        <nops/>
	  </pub>

	  <pub id="FscqSOSP15" kind="conference">
		<author person="hchen" />
		<author person="dmz" />
		<author person="tchajed" />
		<author person="adamc" />
		<author person="kaashoek" />
		<author person="nickolai" />
		<title>Using Crash Hoare Logic for Certifying the FSCQ File System</title>
		<proceedings event="sosp15" />
        <award>Best Paper Award and (ten years later) Test of Time Award</award>
        
		<summary>A file system implemented and verified in Coq, using separation logic, connected to Linux and providing respectable performance</summary>

        <abstract>FSCQ is the first file system with a machine-checkable proof (using the Coq proof assistant) that its implementation meets its specification and whose specification includes crashes.  FSCQ provably avoids bugs that have plagued previous file systems, such as performing disk writes without sufficient barriers or forgetting to zero out directory blocks.  If a crash happens at an inopportune time, these bugs can lead to data loss.  FSCQ's theorems prove that, under any sequence of crashes followed by reboots, FSCQ will recover the file system correctly without losing data.</abstract>

        <abstract>To state FSCQ's theorems, this paper introduces the Crash Hoare logic (CHL), which extends traditional Hoare logic with a crash condition, a recovery procedure, and logical address spaces for specifying disk states at different abstraction levels.  CHL also reduces the proof effort for developers through proof automation.  Using CHL, we developed, specified, and proved the correctness of the FSCQ file system.  Although FSCQ's design is relatively simple, experiments with FSCQ running as a user-level file system show that it is sufficient to run Unix applications with usable performance.  FSCQ's specifications and proofs required significantly more work than the implementation, but the work was manageable even for a small team of a few researchers.</abstract>

        <abstract><a href="https://github.com/mit-pdos/fscq">GitHub repository</a></abstract>

        <nops/>
	  </pub>

	  <pub id="UrWebICFP15" kind="conference">
		<author person="adamc" />
		<title>An Optimizing Compiler for a Purely Functional Web-Application Language</title>
		<proceedings event="icfp15" />

		<summary>The whole-program optimizing compiler for <a href="http://www.impredicative.com/ur/">Ur/Web</a></summary>

        <abstract>High-level scripting languages have become tremendously popular for development of dynamic Web applications.  Many programmers appreciate the productivity benefits of automatic storage management, freedom from verbose type annotations, and so on.  While it is often possible to improve performance substantially by rewriting an application in C or a similar language, very few programmers bother to do so, because of the consequences for human development effort.  This paper describes a compiler that makes it possible to have most of the best of both worlds, coding Web applications in a high-level language but compiling to native code with performance comparable to handwritten C code.  The source language is Ur/Web, a domain-specific, purely functional, statically typed language for the Web.  Through a coordinated suite of relatively straightforward program analyses and algebraic optimizations, we transform Ur/Web programs into almost-idiomatic C code, with no garbage collection, little unnecessary memory allocation for intermediate values, etc.  Our compiler is in production use for commercial Web sites supporting thousands of users, and microbenchmarks demonstrate very competitive performance versus mainstream tools.</abstract>

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

		<abstract>Slides are available from my talk at ICFP'15 [<a href="UrWebICFP15Talk.odp">LibreOffice</a>, <a href="UrWebICFP15Talk.pdf">PDF</a>].  There's also <a href="https://www.youtube.com/watch?v=McYhbIubeTc">an online video</a> of the talk.</abstract>

        <nops/>
	  </pub>

	  <pub id="BlueCAV15" kind="conference">
		<author person="vmurali" />
		<author person="adamc" />
		<author person="arvind" />
		<author person="ndave" />
		<title>Modular Deductive Verification of Multiprocessor Hardware Designs</title>
		<proceedings event="cav15" />

		<summary>Modular Coq proofs of Bluespec-style hardware descriptions, where processors and memory systems can be verified separately against generic specs (in the style of labeled transition systems) that are compatible with many different optimizations</summary>

        <abstract>We present a new framework for modular verification of hardware designs in the style of the Bluespec language.  That is, we formalize the idea of components in a hardware design, with well-defined input and output channels; and we show how to specify and verify components individually, with machine-checked proofs in the Coq proof assistant.  As a demonstration, we verify a fairly realistic implementation of a multicore shared-memory system with two types of components: memory system and processor.  Both components include nontrivial optimizations, with the memory system employing an arbitrary hierarchy of cache nodes that communicate with each other concurrently, and with the processor doing speculative execution of many concurrent read operations.  Nonetheless, we prove that the combined system implements sequential consistency. To our knowledge, our memory-system proof is the first machine verification of a cache-coherence protocol parameterized over an arbitrary cache hierarchy, and our full-system proof is the first machine verification of sequential consistency for a multicore hardware design that includes caches and speculative processors.</abstract>

        <nops/>
	  </pub>

	  <pub id="FiatPOPL15" kind="conference">
		<author person="bendy" />
		<author person="cpitcla" />
		<author person="jgross" />
		<author person="adamc" />
		<title>Fiat: Deductive Synthesis of Abstract Data Types in a Proof Assistant</title>
		<proceedings event="popl15" />

		<summary>Deriving efficient OCaml implementations of abstract data types, from declarative specifications, in Coq, mostly automatically.  The main case study works with SQL-style relational queries and update operations.</summary>

        <abstract>We present Fiat, a library for the Coq proof assistant supporting refinement of declarative specifications into efficient functional programs with a high degree of automation.  Each refinement process leaves a proof trail, checkable by the normal Coq kernel, justifying its soundness.  We focus on the synthesis of abstract data types that package methods with private data. We demonstrate the utility of our framework by applying it to the synthesis of <i>query structures</i> -- abstract data types with SQL-like query and insert operations. Fiat includes a library for writing specifications of query structures in SQL-inspired notation, expressing operations over relations (tables) in terms of mathematical sets. This library includes a set of tactics for automating the refinement of these specifications into efficient, correct-by-construction OCaml code.  Using these tactics, a programmer can generate such an implementation completely automatically by only specifying the equivalent of SQL indexes, data structures capturing useful views of the abstract data. We conclude by speculating on the new programming modularity possibilities enabled by an automated refinement system with proved-correct rules.</abstract>

        <abstract><a href="http://plv.csail.mit.edu/fiat/">Software/proof source code</a></abstract>

        <nops/>
	  </pub>

	  <pub id="UrWebPOPL15" kind="conference">
		<author person="adamc" />
		<title>Ur/Web: A Simple Model for Programming the Web</title>
		<proceedings event="popl15" />

		<summary>At long last, a paper on the design of <a href="http://www.impredicative.com/ur/">Ur/Web</a>, a DSL for Web applications, supporting novel encapsulation techniques and a simple concurrency model for distributed applications</summary>

        <abstract>The World Wide Web has evolved gradually from a document delivery platform to an architecture for distributed programming.  This largely unplanned evolution is apparent in the set of interconnected languages and protocols that any Web application must manage.  This paper presents Ur/Web, a domain-specific, statically typed functional programming language with a much simpler model for programming modern Web applications.  Ur/Web's model is <b>unified</b>, where programs in a single programming language are compiled to other "Web standards" languages as needed; <b>modular</b>, supporting novel kinds of encapsulation of Web-specific state; and exposes <b>simple concurrency</b>, where programmers can reason about distributed, multithreaded applications via a mix of transactions and cooperative preemption.  We give a tutorial introduction to the main features of Ur/Web, formalize the basic programming model with operational semantics, and discuss the language implementation and the production Web applications that use it.</abstract>

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

		<abstract>Slides are available from my talk at POPL'15 [<a href="UrWebPOPL15Talk.odp">LibreOffice</a>, <a href="UrWebPOPL15Talk.pdf">PDF</a>].</abstract>

        <nops/>
	  </pub>

	  <pub id="BedrockPOPL15" kind="conference">
		<author person="adamc" />
		<title>From Network Interface to Multithreaded Web Applications: A Case Study in Modular Program Verification</title>
		<proceedings event="popl15" />

		<summary>A case study in building a whole-program Coq proof that covers both an application (a database-backed dynamic Web application) and systems infrastructure (a cooperative thread library).  The components are verified modularly with <a href="http://plv.csail.mit.edu/bedrock/">Bedrock</a>, and there is a verified compiler for a domain-specific language that can be used to derive similar theorems for similar Web applications, with minimal new proving work.</summary>

        <abstract>Many verifications of realistic software systems are <i>monolithic</i>, in the sense that they define single <i>global invariants</i> over complete system state.  More <i>modular</i> proof techniques promise to support reuse of component proofs and even reduce the effort required to verify one concrete system, just as modularity simplifies standard software development.  This paper reports on one case study applying modular proof techniques in the Coq proof assistant.  To our knowledge, it is the first modular verification certifying a system that combines infrastructure with an application of interest to end users.  We assume a nonblocking API for managing TCP networking streams, and on top of that we work our way up to certifying multithreaded, database-backed Web applications.  Key verified components include a cooperative threading library and an implementation of a domain-specific language for XML processing.  We have deployed our case-study system on mobile robots, where it interfaces with off-the-shelf components for sensing, actuation, and control.</abstract>

        <abstract><a href="http://plv.csail.mit.edu/bedrock/">Software/proof source code</a></abstract>

		<abstract>Slides are available from my talk at POPL'15 [<a href="BedrockPOPL15Talk.odp">LibreOffice</a>, <a href="BedrockPOPL15Talk.pdf">PDF</a>].</abstract>

        <nops/>
	  </pub>

	  <pub id="CitoOOPSLA14" kind="conference">
		<author person="wangpeng" />
		<author person="cuellar" />
		<author person="adamc" />
		<title>Compiler Verification Meets Cross-Language Linking via Data Abstraction</title>
		<proceedings event="oopsla14" />

		<summary>An approach to verifying multilanguage programs in the <a href="http://plv.csail.mit.edu/bedrock/">Bedrock</a> framework, mixing operational semantics for intralanguage reasoning and axiomatic semantics for interlanguage reasoning</summary>

        <abstract>Many real programs are written in multiple different programming languages, and supporting this pattern creates challenges for formal compiler verification.  We describe our Coq verification of a compiler for a high-level language, such that the compiler correctness theorem allows us to derive partial-correctness Hoare-logic theorems for programs built by linking the assembly code output by our compiler and assembly code produced by other means.  Our compiler supports such tricky features as storable cross-language function pointers, without giving up the usual benefits of being able to verify different compiler phases (including, in our case, two classic optimizations) independently.  The key technical innovation is a mixed operational and axiomatic semantics for the source language, with a built-in notion of <i>abstract data types</i>, such that compiled code interfaces with other languages only through axiomatically specified methods that mutate encapsulated private data, represented in whatever formats are most natural for those languages.</abstract>

        <abstract><a href="http://plv.csail.mit.edu/bedrock/">Software/proof source code</a></abstract>

        <nops/>
	  </pub>

	  <pub id="JitkOSDI14" kind="conference">
		<author person="xi" />
		<author person="lazard" />
		<author person="nickolai" />
		<author person="adamc" />
		<author person="ztatlock" />
		<title>Jitk: A Trustworthy In-Kernel Interpreter Infrastructure</title>
		<proceedings event="osdi14" />

		<summary>Coq-verified just-in-time compilation for packet filters, etc., in Linux</summary>

        <abstract>Modern operating systems run multiple interpreters in the kernel, which enable user-space applications to add new functionality or specialize system policies.  The correctness of such interpreters is critical to the overall system security: bugs in interpreters could allow adversaries to compromise user-space applications and even the kernel.</abstract>

        <abstract>Jitk is a new infrastructure for building in-kernel interpreters that guarantee <i>functional correctness</i> as they compile user-space policies down to native instructions for execution in the kernel. To demonstrate Jitk, we implement two interpreters in the Linux kernel, BPF and INET-DIAG, which are used for network and system call filtering and socket monitoring, respectively. To help application developers write correct filters, we introduce a high-level rule language, along with a proof that Jitk correctly translates high-level rules all the way to native machine code, and demonstrate that this language can be integrated into OpenSSH with tens of lines of code. We built a prototype of Jitk on top of the CompCert verified compiler and integrated it into the Linux kernel. Experimental results show that Jitk is practical, fast, and trustworthy.</abstract>

        <nops/>
	  </pub>

	  <pub id="MirrorShardITP14" kind="conference">
		<author person="gmalecha" />
		<author person="adamc" />
		<author person="braibant" />
		<title>Compositional Computational Reflection</title>
		<proceedings event="itp14" />

		<summary>A framework for combining reflective Coq tactics, applied in the <a href="http://plv.csail.mit.edu/bedrock/">Bedrock</a> system to verify imperative programs</summary>

        <abstract>Current work on computational reflection is single-minded; each reflective procedure is written with a specific application or scope in mind.  Composition of these reflective procedures is done by a proof-generating tactic language such as Ltac.  This composition, however, comes at the cost of both larger proof terms and redundant preprocessing.  In this work, we propose a methodology for writing composable reflective procedures that solve many small tasks in a single invocation.  The key technical insights are techniques for reasoning semantically about extensible syntax in intensional type theory.  We also consider sound methods for user extension of such procedures using lemmas and full reflective procedures, which mimicks Coq's support for hint databases with only slightly more user effort.</abstract>

		<abstract>Source code is available for <a href="https://github.com/gmalecha/mirror-shard/">the framework</a> and <a href="https://github.com/gmalecha/bedrock-mirror-shard/">the instantiation for Bedrock</a></abstract>

        <nops/>
	  </pub>

	  <pub id="CategoryITP14" kind="conference">
		<author person="jgross" />
		<author person="adamc" />
		<author person="dspivak" />
		<title>Experience Implementing a Performant Category-Theory Library in Coq</title>
		<proceedings event="itp14" />

		<summary>A Coq category-theory library, designed to support computationally efficient proofs of large goals, taking advantage of recent improvements to the homotopy-type-theory Coq version and giving some other wishlist items for Coq</summary>

        <abstract>We describe our experience implementing a broad category-theory library in Coq.  Category theory and computational performance are not usually mentioned in the same breath, but we have needed substantial engineering effort to teach Coq to cope with large categorical constructions without slowing proof script processing unacceptably.  In this paper, we share the lessons we have learned about how to represent very abstract mathematical objects and arguments in Coq and how future proof assistants might be designed to better support such reasoning.  One particular encoding trick to which we draw attention allows category-theoretic arguments involving <i>duality</i> to be internalized in Coq's logic with definitional equality.  Ours may be the largest Coq development to date that uses the relatively new Coq version developed by homotopy type theorists, and we reflect on which new features were especially helpful.</abstract>

		<abstract><a href="https://github.com/JasonGross/HoTT/tree/master/theories/Categories">Library source code</a></abstract>

        <nops/>
	  </pub>

	  <pub id="BedrockICFP13" kind="conference">
		<author person="adamc" />
		<title>The Bedrock Structured Programming System: Combining Generative Metaprogramming and Hoare Logic in an Extensible Program Verifier</title>
		<proceedings event="icfp13" />

		<summary>Bedrock takes literally the idea of C as a "macro assembly language."  All the programming features are built up as macros on top of assembly language, and macros have verified Hoare logic-style proof rules attached to them, so that one gets a "free" environment for mostly automated deductive program verification for any mix of macros used in a particular program.</summary>

        <abstract>We report on the design and implementation of an extensible programming language and its intrinsic support for formal verification.  Our language is targeted at low-level programming of infrastructure like operating systems and runtime systems.  It is based on a cross-platform core combining characteristics of assembly languages and compiler intermediate languages.  From this foundation, we take literally the saying that C is a "macro assembly language": we introduce an expressive notion of <i>certified low-level macros</i>, sufficient to build up the usual features of C and beyond as macros with no special support in the core.  Furthermore, our macros have integrated support for strongest postcondition calculation and verification condition generation, so that we can provide a high-productivity formal verification environment within Coq for programs composed from any combination of macros.  Our macro interface is expressive enough to support features that low-level programs usually only access through external tools with no formal guarantees, such as declarative parsing or SQL-inspired querying.  The abstraction level of these macros only imposes a <i>compile-time</i> cost, via the execution of functional Coq programs that compute programs in our intermediate language; but the <i>run-time</i> cost is not substantially greater than for more conventional C code.  We describe our experiences constructing a full C-like language stack using macros, with some experiments on the verifiability and performance of individual programs running on that stack.</abstract>

		<abstract><a href="http://plv.csail.mit.edu/bedrock/">Software/proof source code</a></abstract>

		<abstract>Slides are available from my talk at ICFP'13 [<a href="BedrockICFP13Talk.odp">OpenOffice</a>, <a href="BedrockICFP13Talk.pdf">PDF</a>].</abstract>

        <nops/>
	  </pub>

	  <pub id="FesiCAV13" kind="conference">
		<author person="braibant" />
		<author person="adamc" />
		<title>Formal Verification of Hardware Synthesis</title>
		<proceedings event="cav13" />

		<summary>A verified compiler for an idealization of the Bluespec hardware description language</summary>

        <abstract>We report on the implementation of a certified compiler for a high-level hardware description language (HDL) called Fe-Si (FEath-erweight SynthesIs). Fe-Si is a simplified version of Bluespec, an HDL based on a notion of guarded atomic actions. Fe-Si is defined as a dependently typed deep embedding in Coq. The target language of the compiler corresponds to a synthesisable subset of Verilog or VHDL. A key aspect of our approach is that input programs to the compiler can be defined and proved correct inside Coq. Then, we use extraction and a Verilog back-end (written in OCaml) to get a certified version of a hardware design.</abstract>

		<abstract><a href="https://github.com/braibant/Synthesis">Public source-code repository</a></abstract>

        <nops/>
	  </pub>

	  <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="http://plv.csail.mit.edu/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="http://plv.csail.mit.edu/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" />
        <award>Awarded Most Influential Paper ten years later</award>

		<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="StorageHotOS15" kind="workshop">
                <author person="hchen" />
                <author person="dmz" />
		<author person="adamc" />
                <author person="kaashoek" />
                <author person="kohler" />
                <author person="nickolai" />
		<title>Towards Certified Storage Systems</title>
		<proceedings event="hotos15" />

		<summary>On verifying functional properties of filesystems in the presence of failures, using proof assistants</summary>

		<abstract>On verifying functional properties of filesystems in the presence of failures, using proof assistants</abstract>

                <nops/>
	</pub>

	<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="tamiu26">
    <title>Scaling Formal Verification to Complete Hardware-Software Stacks</title>
  </talk>

  <talk event="buffalo25">
    <title>Scaling Formal Verification to Complete Hardware-Software Stacks</title>
  </talk>

  <talk event="plmw25">
    <title>Research on Different Time Horizons (and an Example with Machine-Checked Proofs)</title>
    <kind>keynote talk</kind>
  </talk>

  <talk event="aimr24">
    <title>Programming with Proof Assistants</title>
    <kind>invited webinar talk</kind>
  </talk>
  
  <talk event="pepm23">
    <title>Fast Cryptographic Code via Partial Evaluation</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="vso22">
    <title>Fiat Cryptography: A Formally Verified Compiler for Finite-Field Arithmetic</title>
  </talk>

  <talk event="oplss22">
    <title>Lectures: From Type Theory to End-to-End Proof of Realistic Systems</title>
  </talk>

  <talk event="hcss22">
    <title>Fiat Cryptography: A Formally Verified Compiler for Finite-Field Arithmetic</title>
  </talk>

  <talk event="nus22">
    <title>Correct-by-Construction Cryptography Without Performance Compromises</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="newton21">
    <title>Fiat Cryptography: A Code-Generation Approach to Correct-by-Construction Cryptography</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="lambda21">
    <title>Correct-by-Construction Cryptographic Arithmetic in Coq</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="flops20">
    <title>Performance-Scaling Challenges in Formal Verification with Proof Assistants</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="cpp20">
    <title>Proof Assistants at the Hardware-Software Interface</title>
    <kind>invited talk</kind>
    <url>https://youtu.be/GXXOyXeyKeY</url>
  </talk>

  <talk event="sigarch19">
    <title>Strong Formal Verification Across a Hardware-Software Stack with RISC-V</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="deepspec19">
    <title>Fast, Verified Partial Evaluation</title>
  </talk>
  
  <talk event="types19">
    <title>Challenges Scaling Type-Theory-Based Verification to Cryptographic Code in Production</title>
    <kind>invited talk</kind>
  </talk>
  
  <talk event="gomac19">
    <title>Algorithmic Checking of Security Arguments for Microprocessors</title>
  </talk>

  <talk event="sifive19">
    <title>Research with RISC-V at MIT CSAIL: Modular Design for Performance, Security, and Formal Verification</title>
  </talk>
  
  <talk event="riscvs1">
    <title>Never Again: Spectre-Proofing Chip Designs with End-to-End Formal Methods</title>
    <url>https://www.youtube.com/watch?v=uIbPt1v6QKE</url>
  </talk>

  <talk event="splashi18">
    <title>Mechanized Proofs of System Correctness in Production: Cryptography and Beyond</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="harper18">
    <title>Parametric Higher-Order Abstract Syntax in Fiat Cryptography</title>
  </talk>
  
  <talk event="ifl18">
    <title>Interactive Proof and the Fall and Rise of the Standard Model of Functional-Program Execution</title>
    <kind>invited talk</kind>
  </talk>
  
  <talk event="nepls32">
    <title>Opportunities to Simplify Computer Systems via Formal Methods</title>
  </talk>

  <talk event="msfs18">
    <title>How Formal-Methods Adoption Should Drive Changes to System Designs</title>
  </talk>
  
  <talk event="dsss18">
    <title>Lectures: Implementing, specifying, verifying, and compiling hardware components with Kami</title>
  </talk>

  <talk event="deepspec18">
    <title>Verification Around the Hardware-Software Interface: Instruction Set, Processors, and Side Channels</title>
  </talk>
  
  <talk event="entropy18">
    <title>Raising the Level of Abstraction in Systems Programming with Fiat and Extensible, Correct-by-Construction Compilers</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="inria18">
    <title>Kami: Modular Verification of Digital Hardware in Coq</title>
  </talk>

  <talk event="eth18">
    <title>Fiat Cryptography: Automatic Correct-by-Construction Generation of Low-Level Cryptographic Code</title>
  </talk>

  <talk event="34c3">
    <title>Coming Soon: Machine-Checked Mathematical Proofs in Everyday Software and Hardware Development</title>
    <url>https://media.ccc.de/v/34c3-9105-coming_soon_machine-checked_mathematical_proofs_in_everyday_software_and_hardware_development</url>
  </talk>

  <talk event="msr17">
    <title>Fiat Cryptography: Automatic Correct-by-Construction Generation of Low-Level Cryptographic Code</title>
  </talk>

  <talk event="riscv7">
    <title>Strong Formal Verification for RISC-V: From Instruction-Set Manual to RTL</title>
    <url>https://www.youtube.com/watch?v=4DYVJdHMV5k</url>
  </talk>

  <talk event="dsss17">
    <title>Lectures: Program-specific proof automation</title>
  </talk>
  
  <talk paper="FiatSNAPL17" event="snapl17">
    <title>The End of History? Using a Proof Assistant to Replace Language Design with Library Design</title>
  </talk>

  <talk event="rdp17">
    <title>Fiat: A New Take on Domain-Specific Languages by Programming with Specifications</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="aplas16">
    <title>Fiat: A New Perspective on Compiling Domain-Specific Languages in a Proof Assistant</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="splashi16">
    <title>Rapid Development of Web Applications with Typed Metaprogramming in Ur/Web</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="royal16_specialist">
    <title>Bedrock &amp; Fiat: Specifications and Proofs at the Center of a Programming Ecosystem</title>
    <url>https://www.youtube.com/watch?v=jE0DY5pS-xY#t=127m4s</url>
  </talk>

  <talk event="royal16_public">
    <title>The Science of Deep Specification</title>
    <url>http://deepspec.org/</url>
    <kind>panel</kind>
  </talk>

  <talk event="pepm16">
    <title>Fiat: Extensible Code Generation with Proofs</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="mozilla16">
    <title>Ur/Web: A Simple Model for Programming the Web</title>
  </talk>

  <talk event="cyberx">
    <title>Lectures: Formal Proof for C-Like Programs</title>
  </talk>

  <talk paper="UrWebICFP15" event="icfp15">
    <title>An Optimizing Compiler for a Purely Functional Web-Application Language</title>
  </talk>

  <talk event="imdea15">
    <title>Phantom Monitors: A Simple Foundation for Modular Proofs of Fine-Grained Concurrent Programs</title>
  </talk>

  <talk event="oplss15">
    <title>Lectures: The Coq Proof Assistant and Its Applications to Programming-Language Semantics</title>
  </talk>

  <talk event="coqpl15">
    <title>Bedrock: A Clean-Slate Platform for Developing Verified Software Inside a Proof Assistant</title>
    <kind>invited talk</kind>
  </talk>

  <talk paper="BedrockPOPL15" event="popl15">
    <title>From Network Interface to Multithreaded Web Applications: A Case Study in Modular Program Verification</title>
  </talk>

  <talk paper="UrWebPOPL15" event="popl15">
    <title>Ur/Web: A Simple Model for Programming the Web</title>
  </talk>

  <talk event="plmw15">
    <title>Proof Engineering: Implementation Challenges in Rigorously Verified Software</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="msr14">
    <title>Bedrock: A Software Development Ecosystem Inside a Proof Assistant</title>
    <url>http://talks.cam.ac.uk/talk/index/56590</url>
  </talk>

  <talk event="tpp14">
    <title>Correct-by-Construction Program Synthesis in Coq</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="kyoto14">
    <title>Ur/Web: A Simple Model for Programming the Web</title>
  </talk>

  <talk event="bh14">
    <title>Ur/Web: A Simple Model for Programming the Web</title>
  </talk>

  <talk event="ihp14">
    <title>Bedrock: A Foundational Proof-Carrying Code Platform with Functional Correctness Proofs</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="twitter14">
    <title>Ur/Web: Streamlined Web Apps via Fancy Types</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="script13">
    <title>Ur/Web: Taking Syntax Seriously</title>
    <kind>invited talk</kind>
  </talk>

  <talk event="hope13">
    <title>Adventures in Knot-Tying while Verifying a Thread Library in Coq</title>
  </talk>

  <talk paper="BedrockICFP13" event="icfp13">
    <title>The Bedrock Structured Programming System: Combining Generative Metaprogramming and Hoare Logic in an Extensible Program Verifier</title>
  </talk>

  <talk event="popltut13">
    <title>A Taste of Effective Coq Proof Automation</title>
    <kind>invited tutorial</kind>
    <url>http://adam.chlipala.net/popltut13/</url>
  </talk>

  <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="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>

<othertalks>
  <othertalk at="rwc23">
    <author person="joel.kuepper" />
    <author person="andreser" />
    <author person="jgross" />
    <author person="owenc" />
    <author person="chuyues" />
    <author person="swtian" />
    <author person="davidwu9" />
    <author person="adamc" />
    <author person="chitchanok.chuengsatiansup" />
    <author person="genkin" />
    <author person="wagner" />
    <author person="yval" />
    <title>CryptOpt: Verified Compilation with Random Program Search for Cryptographic Primitives</title>
  </othertalk>

  <othertalk at="coqpl23">
    <author person="dijamner" />
    <author person="gkammer" />
    <author person="adamc" />
    <title>Pyrosome: A Framework for Modular, Extensible, Equivalence-Preserving Compilation</title>
  </othertalk>

  <othertalk at="coqpl23">
    <author person="gruetter" />
    <author person="adamc" />
    <author person="arthur" />
    <author person="andreser" />
    <title>Omnisemantics: Smooth Handling of Nondeterminism</title>
  </othertalk>

  <othertalk at="nepls33">
    <author person="gruetter" />
    <author person="adamc" />
    <author person="arthur" />
    <author person="andreser" />
    <title>Omnisemantics: Smooth Handling of Nondeterminism</title>
  </othertalk>

  <othertalk at="coqpl21">
    <author person="shardulc" />
    <author person="cpitcla" />
    <author person="adamc" />
    <title>Automated Synthesis of Verified Firewalls</title>
  </othertalk>

  <othertalk at="riscv19">
    <author person="gruetter" />
    <author person="andreser" />
    <author person="joonwonc" />
    <author person="adamc" />
    <title>Formal methods for hardware-software integration on RISC-V embedded systems</title>
  </othertalk>

  <othertalk at="rwc19">
    <author person="andreser" />
    <author person="jadep" />
    <author person="jgross" />
    <author person="rsloan" />
    <author person="adamc" />
    <title>Efficient and Verified Finite-Field Operations</title>
  </othertalk>

  <othertalk at="nepls30">
    <author person="sherman" />
    <author person="lukesci" />
    <author person="adamc" />
    <author person="mcarbin" />
    <title>Programming with Continuous Spaces</title>
  </othertalk>

  <othertalk at="nepls28">
    <author person="cj" />
    <author person="lesani" />
    <author person="adamc" />
    <title>Phantom Monitors: A Simple Foundation for Modular Proofs of Fine-Grained Concurrent Programs</title>
  </othertalk>

  <othertalk at="nepls28">
    <author person="lesani" />
    <author person="andersk" />
    <author person="cj" />
    <author person="adamc" />
    <title>Composable Modular Atomicity</title>
  </othertalk>

  <othertalk at="nepls26">
    <author person="gmalecha" />
    <author person="adamc" />
    <author person="phulin" />
    <author person="ezyang" />
    <title>A Framework for Verifying Low-level Programs</title>
  </othertalk>
</othertalks>

<workshops>
  <workshop>
    <title>8th High-Assurance Crypto Software Workshop</title>
    <url>https://www.hacs-workshop.org/</url>
    <when>March 2024</when>
  </workshop>

  <workshop>
    <title>7th High-Assurance Crypto Software Workshop</title>
    <url>https://www.hacs-workshop.org/</url>
    <when>March 2023</when>
  </workshop>

  <workshop>
    <title>6th High-Assurance Crypto Software Workshop</title>
    <url>https://www.hacs-workshop.org/</url>
    <when>April 2022</when>
  </workshop>

  <workshop>
    <title>5th High-Assurance Crypto Software Workshop</title>
    <url>https://www.hacs-workshop.org/</url>
    <when>April 2021</when>
  </workshop>

  <workshop>
    <title>4th High-Assurance Crypto Software Workshop</title>
    <url>https://www.hacs-workshop.org/</url>
    <when>January 2020</when>
  </workshop>

  <workshop>
    <title>1st High Assurance Systems Engineering Workshop</title>
    <url>https://hase-workshop.github.io/</url>
    <when>January 2019</when>
  </workshop>

  <workshop>
    <title>Microsoft Research Faculty Summit 2018</title>
    <url>https://www.microsoft.com/en-us/research/event/faculty-summit-2018/</url>
    <when>August 2018</when>
  </workshop>
  
  <workshop>
    <title>3rd High-Assurance Crypto Software Workshop</title>
    <url>https://www.hacs-workshop.org/</url>
    <when>January 2018</when>
  </workshop>

  <workshop>
    <title>SAP HANA TechDays</title>
    <url>https://www.sap.com/products/hana.html</url>
    <when>August 2017</when>
  </workshop>

  <workshop>
    <title>Google Academic Security and Privacy Research Summit</title>
    <url>https://sites.google.com/view/securitysummit2017/</url>
    <when>June 2017</when>
  </workshop>

  <workshop>
    <title>NII Shonan Seminar #98: Language integrated queries: towards standard logics for big data analytics</title>
    <url>http://shonan.nii.ac.jp/seminar/seminardetails098/</url>
    <when>May 2017</when>
  </workshop>

  <workshop>
    <title>ISAT Workshop: Augmented Developers: Tools for Hybrid Man-Machine Software Engineering</title>
    <when>February 2017</when>
  </workshop>

  <workshop>
    <title>2nd High-Assurance Crypto Software Workshop</title>
    <url>https://www.hacs-workshop.org/</url>
    <when>January 2017</when>
  </workshop>

  <workshop>
    <title>1st High-Assurance Crypto Software Workshop</title>
    <url>https://www.hacs-workshop.org/</url>
    <when>January 2016</when>
  </workshop>

  <workshop>
    <title>2nd Core Infrastructure Workshop (Linux Foundation)</title>
    <url>https://www.coreinfrastructure.org/</url>
    <when>July 2015</when>
  </workshop>

  <workshop>
    <title>Dagstuhl Seminar #15191: Compositional Verification Methods for Next-Generation Concurrency</title>
    <url>http://www.dagstuhl.de/15191/</url>
    <when>May 2015</when>
  </workshop>

  <workshop>
    <title>1st Core Infrastructure Workshop (Linux Foundation)</title>
    <url>https://www.coreinfrastructure.org/</url>
    <when>January 2015</when>
  </workshop>

  <workshop>
    <title>Dagstuhl Seminar #10351: Modelling, Controlling and Reasoning About State</title>
    <url>http://www.dagstuhl.de/10351/</url>
    <when>August 2010</when>
  </workshop>
</workshops>

<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>Arthur J. Conner (1888) Professor of Computer Science</title>
        <when>
          <start>
            <month>7</month>
            <year>2024</year>
          </start>
          <end_tbd/>
        </when>
        <old>
	  <title>Professor of Computer Science</title>
          <when>
            <start>
              <month>7</month>
              <year>2022</year>
            </start>
            <end_tbd/>
          </when>
        </old>
        <old>
          <title>Associate Professor of Computer Science</title>
          <when>
            <start>
              <month>7</month>
              <year>2018</year>
            </start>
            <end>
              <month>6</month>
              <year>2022</year>
            </end>
          </when>
        </old>
        <old>
          <title>Associate Professor without Tenure of Computer Science</title>
          <when>
            <start>
              <month>7</month>
              <year>2015</year>
            </start>
            <end>
              <month>6</month>
              <year>2018</year>
            </end>
          </when>
        </old>
        <old>
          <title>Assistant Professor of Computer Science</title>
          <when>
            <start>
              <month>7</month>
              <year>2011</year>
            </start>
            <end>
              <month>6</month>
              <year>2015</year>
            </end>
          </when>
        </old>
        <old>
          <title>Douglas T. Ross (1954) Career Development Professor of Software Technology</title>
          <when>
            <start>
              <month>7</month>
              <year>2012</year>
            </start>
          <end>
            <month>6</month>
            <year>2015</year>
          </end>
          </when>
        </old>
	<important/>
	<shortOrg>MIT</shortOrg>
	<atOrg org="csail" />
	<atOrg org="mit_eecs" />
	<atOrg org="mit" />
</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>
	<award>
	  <name>SOSP Test of Time Award (for FSCQ)</name>
	  <url>https://www.sosp.org/</url>
	  <year>2025</year>
	</award>
  
    <award>
      <name>German IT Security Award (for CryptOpt)</name>
	  <url>https://www.deutscher-it-sicherheitspreis.de/prize.php</url>
	  <year>2024</year>
	</award>
  
    <award>
      <name>Annual "Humies" Awards For Human-Competitive Results Produced By Genetic And Evolutionary Computation (Gold Award, for CryptOpt)</name>
	  <url>https://www.human-competitive.org/</url>
	  <year>2023</year>
	</award>
  
    <award>
      <name>PLDI Distinguished Reviewer Award</name>
	  <url>https://pldi23.sigplan.org/</url>
	  <year>2023</year>
	</award>

    <award>
	  <name>Burgess (1952) &amp; Elizabeth Jamieson Prize for Excellence in Teaching</name>
	  <year>2023</year>
	</award>
  
	<award>
		<name>ACM Distinguished Member</name>
		<url>https://awards.acm.org/distinguished-members</url>
		<year>2019</year>
	</award>

        <award>
		<name>Ruth and Joel Spira Award for Excellence in Teaching</name>
		<url>https://engineering.mit.edu/faculty-research/faculty-awards/teaching-awards/</url>
		<year>2019</year>
	</award>
  
	<award>
		<name>Most Influential ICFP Paper Award (for PHOAS)</name>
		<url>http://www.sigplan.org/Awards/ICFP/</url>
		<year>2018</year>
	</award>
  
	<award>
		<name>ACM Senior Member</name>
		<url>https://awards.acm.org/senior-members</url>
		<year>2016</year>
	</award>

	<award>
		<name>National Science Foundation CAREER Award</name>
		<url>http://www.nsf.gov/awardsearch/showAward?AWD_ID=1253229</url>
		<year>2012</year>
	</award>

	<fellowship>
		<important/>
		<name>National Defense Science and Engineering Graduate Fellowship</name>
		<url>https://www.ndsegfellowships.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>
        <gov name="National Science Foundation" url="https://new.nsf.gov/cise" desc="panelist, 2012, 2013, 2016, 2021, 2024"/>
        <role event="wg2.8" name="member"/>
        <role event="wg2.16" name="member"/>
        <role event="cpp" name="steering committee, 2015-present"/>
        <role event="popl25" name="program committee"/>
	    <role event="fmcp24" name="co-organizer"/>
        <role event="coqpl24" name="program committee"/>        
        <role event="dafny24" name="program committee"/>
        <role event="pldi23" name="program committee"/>
        <role event="asplos23" name="external review committee"/>
        <role event="icfp" name="steering committee, 2019-2022"/>
        <role event="isat" name="member, 2018-2022"/>
        <role event="popl22" name="virtualization chair"/>
        <role event="osdi21" name="external review committee"/>
        <role event="itp21" name="program committee"/>
        <role event="pldi21" name="program committee (area chair)"/>
        <role event="popl21" name="program committee"/>
        <role event="icfp20" name="program chair"/>
        <role event="sosp19" name="program committee"/>
        <role event="icfp19" name="external review committee"/>
        <role event="cav19" name="program committee"/>
        <role event="itp18" name="program committee"/>
        <role event="pldi18" name="program committee"/>
        <role event="wpdai18" name="program committee"/>
        <role event="splashw17" name="workshop-selection program committee"/>
        <role event="itp17" name="program committee"/>
        <role event="icfp17" name="program committee"/>
        <role event="csf17" name="program committee"/>
        <role event="pldi17" name="external review committee"/>
        <role event="popl17" name="program committee"/>
        <role event="ndist16" name="program co-chair"/>
        <role event="icfp16" name="external review committee"/>
        <role event="coq16" name="program committee"/>
        <role event="itp16" name="program committee"/>
        <role event="cav16" name="program committee"/>
        <role event="sp16" name="program committee"/>
        <role event="coqpl16" name="program committee"/>
        <role event="cpp16" name="program co-chair"/>
        <role event="oopsla15" name="program committee"/>
        <role event="lics15" name="program committee"/>
        <role event="popl15_src" name="judge"/>
        <role event="esop15" name="program committee"/>
        <role event="lfmtp14" name="program committee"/>
        <role event="atc14" name="program committee"/>
        <role event="plpv14" name="program committee"/>
        <role event="fpcdsl13" name="program committee"/>
        <role event="lfmtp13" name="program committee"/>
        <role event="usenixsec13" name="program committee"/>
        <role event="itp13" name="program committee"/>
        <role event="dsn13" name="DCCS program committee"/>
        <role event="pldi13" name="external review committee"/>
        <role event="fossacs13" name="program committee"/>
        <role event="ddfp13" name="program committee"/>
        <role event="padl13" name="program committee"/>
        <role event="cpp12" 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="sp12" name="poster chair"/>
        <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" />
	<for event="haskell12" />
	<for event="lfcs13" />
	<for event="icfp13" />
	<for event="ppdp13" />
	<for event="popl14" />
	<for event="esop14" />
	<for event="icfp14" />
	<for event="popl16" />
	<for event="popl18" />
	<for event="ecoop18" />
    <for event="popl19" />
    <for event="pldi19" />
    <for event="pldi22" />
    <for event="icfp23" />
    <for event="popl24" />
    <for event="popl26" />
</reviewed>

<referee>
        <for journal="cacm"/>
        <for journal="esl"/>
        <for journal="fi"/>
        <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="Benjamin Delaware" url="https://www.cs.purdue.edu/homes/bendy/" uni="U. of Texas, Austin" uniUrl="http://www.cs.utexas.edu/"/>
        <person name="Ronghui Gu" url="http://www.cs.yale.edu/homes/gu_ronghui/Ronghui_profile/RonghuiGu.htm" uni="Yale" uniUrl="http://cpsc.yale.edu/"/>
        <person name="Andreas Lööw" url="http://www.cse.chalmers.se/~loow/" uni="Chalmers" uniUrl="https://www.chalmers.se/en/departments/cse/Pages/default.aspx"/>
        <person name="Brandon Moore" url="http://fsl.cs.illinois.edu/index.php/Brandon_Moore" uni="U. of Illinois, Urbana-Champaign" uniUrl="http://cs.illinois.edu/"/>
        <person name="Wilmer Ricciotti" url="http://www.irit.fr/~Wilmer.Ricciotti/" uni="U. of Bologna" uniUrl="http://www.cs.unibo.it/"/>
        <person name="Cyril Six" url="https://conf.researchr.org/profile/conf/cyrilsix" uni="Grenoble" uniUrl="https://www.grenoble-inp.fr/en"/>
        <person name="Xiang Wu" url="https://www.linkedin.com/in/xiang-wu-0617b520a/" uni="Yale" uniUrl="https://cpsc.yale.edu/"/>
        <person name="Li-yao Xia" url="https://poisson.chat/" uni="U. Pennsylvania" uniUrl="http://www.cis.upenn.edu/"/>
</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>

<funding>
  <grant>
    <project url="https://www.nsf.gov/awardsearch/showAward?AWD_ID=2421734">FMitF: Track I: Formally Verified Programmable Network Switches</project>
    <program url="https://new.nsf.gov/funding/opportunities/formal-methods-field-fmitf">NSF FMitF</program>
    <role>PI</role>
  </grant>
  
  <grant>
    <project url="https://www.nsf.gov/awardsearch/showAward?AWD_ID=2313023">Collaborative Research: SHF: Medium: High-Performance, Verified Accelerator Programming</project>
    <program url="http://www.nsf.gov/div/index.jsp?div=CCF">NSF CCF</program>
    <role>PI</role>
  </grant>
  
  <grant>
    <project url="https://www.nsf.gov/awardsearch/showAward?AWD_ID=2217064">PPoSS: LARGE: Intel: Combining Learning and Formal Verification for Scalable Machine Programming (ScaMP)</project>
    <program url="https://beta.nsf.gov/funding/opportunities/principles-practice-scalable-systems-pposs">NSF PPoSS (with Intel)</program>
    <role>co-PI</role>
  </grant>

  <grant>
    <project url="https://www.nsf.gov/awardsearch/showAward?AWD_ID=2130671">SaTC: CORE: Small: Scaling Correct-by-Construction Code Generation for Cryptography</project>
    <program url="https://beta.nsf.gov/funding/opportunities/secure-trustworthy-cyberspace-satc">NSF SaTC</program>
    <role>PI</role>
  </grant>
  
  <grant>
    <project url="https://www.nsf.gov/awardsearch/showAward?AWD_ID=2115587">SaTC: CORE: Medium: Provably Secure, Usable, and Performant Enclaves in Multicore Processors</project>
    <program url="https://beta.nsf.gov/funding/opportunities/secure-trustworthy-cyberspace-satc">NSF SaTC</program>
    <role>co-PI</role>
  </grant>

  <grant>
    <project>Tools for Correct-by-Construction Hardware and Software in Critical Systems</project>
    <program url="https://www.sandia.gov/">Sandia National Laboratories</program>
  </grant>

  <grant>
    <project>ACHILLES: Assured CryptograpHic Integration of muLtiple Languages for Encrypted Systems</project>
    <program url="https://www.iarpa.gov/index.php/research-programs/hector">IARPA HECTOR program</program>
    <role>co-PI for sub</role>
  </grant>
  
  <grant>
    <project>The Hardware Security Compiler: A Rapid-Development Workflow with End-to-End Formal Verification</project>
    <program url="https://www.darpa.mil/program/system-security-integration-through-hardware-and-firmware">DARPA SSITH program</program>
    <role>PI for prime</role>
  </grant>

  <grant>
    <project url="https://www.nsf.gov/awardsearch/showAward?AWD_ID=1836712">FMitF: Verifying Concurrent System Software with Cspec</project>
    <program url="http://www.nsf.gov/div/index.jsp?div=CCF">NSF CCF</program>
    <role>co-PI</role>
  </grant>

  <grant>
    <project url="https://www.nsf.gov/awardsearch/showAward?AWD_ID=1812522">SaTC: CORE: Small: verifying security for data non-interference</project>
    <program url="http://www.nsf.gov/div/index.jsp?div=CNS">NSF CNS</program>
    <role>co-PI</role>
  </grant>
  
  <grant>
    <project>Correct-by-Construction and Automatic Generation of Elliptic Curve Cryptography Primitives</project>
    <program url="http://research.google.com/university/relations/research_awards.html">Google Research Award</program>
  </grant>

  <grant>
    <project url="http://www.nsf.gov/awardsearch/showAward?AWD_ID=1563763">CSR: Medium: A High-Performance Certified File System and Applications</project>
    <program url="http://www.nsf.gov/div/index.jsp?div=CNS">NSF CNS</program>
    <role>co-PI</role>
  </grant>

  <grant>
    <project>RINGS: Regenerative, INtent-Guided Systems</project>
    <program url="http://www.darpa.mil/program/building-resource-adaptive-software-systems">DARPA BRASS program</program>
    <role>PI for sub</role>
  </grant>

  <grant>
    <project url="http://www.nsf.gov/awardsearch/showAward?AWD_ID=1521584">Collaborative Research: Expeditions in Computing: The Science of Deep Specification</project>
    <program url="http://www.nsf.gov/funding/pgm_summ.jsp?pims_id=503169">NSF Expeditions in Computing</program>
    <role>PI for MIT</role>
  </grant>

  <grant>
    <project url="http://www.nsf.gov/awardsearch/showAward?AWD_ID=1512611">SHF: Medium: Fiat: Correct-by-Construction and Mostly Automated Derivation of Programs with an Interactive Theorem Prover</project>
    <program url="http://www.nsf.gov/div/index.jsp?div=CCF">NSF CCF</program>
    <role>PI</role>
  </grant>

  <grant>
    <project>A Trust Anchor Secure Language via the Bedrock Platform</project>
    <program url="https://plus.google.com/+GoogleATAP">Google ATAP Trust Anchor program</program>
    <role>PI</role>
  </grant>

  <grant>
    <project>Cybersecurity project</project>
    <program url="http://qcri.org.qa/">QCRI-CSAIL joint program</program>
  </grant>

  <grant>
    <project url="http://www.nsf.gov/awardsearch/showAward?AWD_ID=1253229">CAREER: A Formal Verification Platform Focused on Programmer Productivity</project>
    <program url="http://www.nsf.gov/div/index.jsp?div=CCF">NSF CCF</program>
    <role>PI</role>
  </grant>

  <grant>
    <project url="http://www.nsf.gov/awardsearch/showAward?AWD_ID=1217501">SHF: Small: Capitalizing on First-Class SQL Support in the Ur/Web Programming Language</project>
    <program url="http://www.nsf.gov/div/index.jsp?div=CCF">NSF CCF</program>
    <role>PI</role>
  </grant>

  <grant>
    <project>CAP<sup>3</sup>: A Computer Aided Performance Programming Platform</project>
    <program>DoE X-Stack program</program>
    <role>co-PI</role>
  </grant>

  <grant>
    <project>CARS: A Platform for Scaling Formal Verification to Component-Based Vehicular Software Stacks</project>
    <program url="http://www.darpa.mil/program/high-assurance-cyber-military-systems">DARPA HACMS program</program>
    <role>PI for sub</role>
  </grant>

  <grant>
    <project>Safe but Unsandboxed Native Code in the Browser</project>
    <program url="http://research.google.com/university/relations/research_awards.html">Google Research Award</program>
  </grant>
</funding>

</cv>
