Mechanized Verification of the Correctness and Asymptotic Complexity of Programs
Total Page:16
File Type:pdf, Size:1020Kb
Universit´ede Paris Ecole´ doctorale 386 | Sciences Math´ematiquesde Paris Centre Doctorat d'Informatique Mechanized Verification of the Correctness and Asymptotic Complexity of Programs The Right Answer at the Right Time Arma¨elGu´eneau Th`ese dirig´eepar Fran¸coisPottier et Arthur Chargu´eraud et soutenue le 16 d´ecembre 2019 devant le jury compos´ede : Jan Hoffmann Assistant Professor, Carnegie Mellon University Rapporteur Yves Bertot Directeur de Recherche, Inria Rapporteur Georges Gonthier Directeur de Recherche, Inria Examinateur Sylvie Boldo Directrice de Recherche, Inria Examinatrice Mihaela Sighireanu Ma^ıtrede Conf´erences, Universit´ede Paris Examinatrice Fran¸coisPottier Directeur de Recherche, Inria Directeur Arthur Chargu´eraud Charg´ede Recherche, Inria Co-directeur Abstract This dissertation is concerned with the question of formally verifying that the imple- mentation of an algorithm is not only functionally correct (it always returns the right result), but also has the right asymptotic complexity (it reliably computes the result in the expected amount of time). In the algorithms literature, it is standard practice to characterize the performance of an algorithm by indicating its asymptotic time complexity, typically using Landau's \big-O" notation. We first argue informally that asymptotic complexity bounds are equally useful as formal specifications, because they enable modular reasoning: a O bound abstracts over the concrete cost expression of a program, and therefore abstracts over the specifics of its implementation. We illustrate|with the help of small illustrative examples|a number of challenges with the use of the O notation, in particular in the multivariate case, that might be overlooked when reasoning informally. We put these considerations into practice by formalizing the O notation in the Coq proof assistant, and by extending an existing program verification framework, CFML, with support for a methodology enabling robust and modular proofs of asymptotic complexity bounds. We extend the existing framework of Separation Logic with Time Credits, which allows to reason at the same time about correctness and time complexity, and introduce negative time credits. Negative time credits increase the expressiveness of the logic, and enable convenient reasoning principles as well as elegant specifications. At the level of specifications, we show how asymptotic complexity specifications using O can be integrated and composed within Separation Logic with Time Credits. Then, in order to establish such specifications, we develop a methodology that allows proofs of complexity in Separation Logic to be robust and carried out at a relatively high level of abstraction, by relying on two key elements: a mechanism for collecting and deferring constraints during the proof, and a mechanism for semi-automatically synthesizing cost expressions without loss of generality. We demonstrate the usefulness and practicality of our approach on a number of increasingly challenging case studies. These include algorithms whose complexity analysis is relatively simple (such as binary search, which is nonetheless out of the scope of many automated complexity analysis tools) and data structures (such as Okasaki's binary random access lists). In our most challenging case study, we establish the correctness and amortized complexity of a state-of-the-art incremental cycle detection algorithm: our methodology scales up to highly non-trivial algorithms whose complexity analysis intimately depends on subtle functional invariants, and furthermore makes it possible to formally verify OCaml code which can then actually be used as part of real world programs. Keywords Formal verification, Algorithms, Asymptotic Complexity, Interactive Proofs, Proof assistants, Program logics, Separation Logic, Resource analysis R´esum´e Cette th`eses'int´eresse`ala question de d´emontrer rigoureusement que l'implantation d'un algorithme donn´eest non seulement correcte (elle renvoie bien le bon r´esultatdans tous les cas possibles), mais aussi poss`edela bonne complexit´easymptotique (elle calcule toujours ce r´esultaten le temps attendu). Pour les chercheurs en algorithmique, caract´eriserla performance d'un algorithme se fait g´en´eralement en indiquant sa complexit´easymptotique, notamment `al'aide de la notation \grand O" due `aLandau. Nous d´etaillons,tout d'abord informellement, pourquoi de telles bornes de complexit´easymptotiques sont ´egalement utiles en tant que sp´ecificationsformelles. La raison est que celles-ci permettent de raisonner de fa¸conmodulaire `apropos du co^utd'un programme : une borne en O s'abstrait de l'expression exacte du co^ut du programme, et par l`ades divers d´etailsd'implantation. Par ailleurs, nous illustrons, `al'aide d'exemples simples, un certain nombre de difficult´es li´ees`al'utilisation rigoureuse de la notation O, et qu'il est facile de n´egligerlors d'un raisonnement informel. Ces consid´erationssont mises en pratique en formalisant d'une part la notation O dans l'assistant de preuve Coq, et d'autre part en ´etendant CFML, un outil existant d´edi´e`ala v´erificationde programmes, afin de permettre `al'utilisateur d'´elaborer des d´emonstrationsrobustes et modulaires ´etablissant des bornes de complexit´easymptotiques. Nous ´etendons la logique de s´eparation avec cr´editstemps|qui permet de raisonner `ala fois sur des propri´et´esde correction et de complexit´een temps|avec la notion de cr´edits temps n´egatifs.Ces derniers augmentent l'expressivit´ede la logique, donnent acc`es`ades principes de raisonnement commodes et permettent d'exprimer certaines sp´ecifications de mani`ereplus ´el´egante. Au niveau des sp´ecifications,nous montrons comment des bornes de complexit´easymptotique avec O s'expriment en logique de s´eparationavec cr´editstemps. Afin d'^etrecapable d'´etablirde telles sp´ecifications, nous d´eveloppons une m´ethodologie qui permet `al'utilisateur de d´evelopper des d´emonstrationsqui soient `a la fois robustes et men´ees`aun niveau d'abstraction satisfaisant. Celle-ci s'appuie sur deux principes clefs : d'une part, un m´ecanismepermettant de collecter et remettre `a plus tard certaines contraintes durant une d´emonstrationinteractive, et par ailleurs, un m´ecanismepermettant de synth´etisersemi-automatiquement une expression de co^ut,et ce sans perte de g´en´eralit´e. Nous d´emontrons l'utilit´eet l’efficacit´ede notre approche en nous attaquant `aun certain nombre d'´etudesde cas. Celles-ci comprennent des algorithmes dont l'analyse de complexit´eest relativement simple (par exemple, une recherche dichotomique, d´ej`a hors de port´eede la plupart des approches automatis´ees)et des structures de donn´ees (comme les \binary random access lists" d'Okasaki). Dans notre ´etudede cas la plus significative, nous ´etablissonsla correction et la complexit´easymptotique d'un algorithme incr´emental de d´etectionde cycles publi´er´ecemment. Nous d´emontrons ainsi que notre m´ethodologie passe `al'´echelle, permet de traiter des algorithmes complexes, donc l'analyse de complexit´es'appuie sur des invariants fonctionnels subtils, et peut v´erifierdu code qu'il est au final possible d'utiliser au sein de programmes r´eellement utiles et utilis´es. Mots-clefs Preuves formelles, Algorithmes, Complexit´easymptotique, Preuves inter- actives, Assistants de preuve, Logiques de programme, Logique de s´eparation Remerciements Mes premiers remerciements vont `ames encadrants, Arthur et Fran¸cois,qui ont su m'accueillir et m'accompagner tout au long de cette th`ese.Fran¸coisa ´et´ecelui qui m'a initi´e`ala recherche, lors de mon tout premier stage de six semaines, avec les (heureuses) cons´equencesque l'on sait. Toujours disponible, Fran¸coiscombine une grande curiosit´e intellectuelle et ouverture d'esprit avec une rigueur scientifique sans faille, deux qualit´es inestimables. Merci `aArthur, tout d'abord pour son implication malgr´ela distance g´eographique,et ensuite pour son optimisme et enthousiasme ind´efectible. Arthur a toujours ´et´epr´esent pour me remonter le moral et m'aider dans les moments difficiles. I would like to thank Jan Hoffmann and Yves Bertot for their meticulous proofreading and many comments on my manuscript. Je remercie ´egalement Georges Gonthier, Sylvie Boldo et Mihaela Sighireanu d'avoir accept´ed'^etremembres de mon jury ; leur pr´esence m'honore. Merci `aceux qui ont contribu´e`ace qui est racont´edans ce manuscrit. Merci `a Jacques-Henri Jourdan, dont la sagacit´ea ´et´ecruciale pour le succ`esde la v´erification de l'algorithme de d´etectionde cycles ; et merci `aGlen M´evel pour les discussions productives au sujet des O `aplusieurs variables. Cette th`eses'est nourrie des quelques ann´eespass´ees`al'Inria ; merci `atous ceux qui ont contribu´e`aen faire un cadre de travail enrichissant. Merci `atous ceux de la \famille Gallium" ´etendue,aux conversations au coin caf´ediverses et toujours int´eressantes. Merci `aJonathan et Tahina pour m'avoir donn´eun aper¸cude la belle vie le long de la c^otenord-ouest des Etats-Unis.´ And thank you to my friendly German colleagues, Max, Simon and Manuel, for your enthusiasm, the time in Munich, and all the interesting discussions. Pour finir, merci au personnel administratif, assistants et assistantes d'´equipe qui nous fournissent une pr´ecieusetranquillit´ed'esprit. Merci `aceux qui, en aval, ont permis que cette th`eseadvienne un jour. Merci `ames enseignants. Et merci plus particuli`erement `aGabriel Scherer, de qui j'ai appris|alors lyc´een|qu'il ´etaitpossible de faire