diff --git a/metadata/authors.toml b/metadata/authors.toml --- a/metadata/authors.toml +++ b/metadata/authors.toml @@ -1,7647 +1,7672 @@ [abdulaziz] name = "Mohammad Abdulaziz" [abdulaziz.emails] [abdulaziz.emails.abdulaziz_email] user = [ "mohammad", "abdulaziz", ] host = [ "in", "tum", "de", ] [abdulaziz.emails.abdulaziz_email1] user = [ "mohammad", "abdulaziz8", ] host = [ "gmail", "com", ] [abdulaziz.homepages] abdulaziz_homepage = "http://home.in.tum.de/~mansour/" [adelsberger] name = "Stephan Adelsberger" [adelsberger.emails] [adelsberger.emails.adelsberger_email] user = [ "stvienna", ] host = [ "gmail", "com", ] [adelsberger.homepages] adelsberger_homepage = "http://nm.wu.ac.at/nm/sadelsbe" [aehlig] name = "Klaus Aehlig" [aehlig.emails] [aehlig.homepages] aehlig_homepage = "http://www.linta.de/~aehlig/" [aissat] name = "Romain Aissat" [aissat.emails] [aissat.homepages] [amani] name = "Sidney Amani" [amani.emails] [amani.emails.amani_email] user = [ "sidney", "amani", ] host = [ "data61", "csiro", "au", ] [amani.homepages] [ammer] name = "Thomas Ammer" [ammer.emails] [ammer.emails.ammer_email] user = [ "thomas", "ammer", ] host = [ "tum", "de", ] [ammer.homepages] [andreka] name = "Hajnal Andreka" [andreka.emails] [andreka.homepages] andreka_homepage = "https://renyi.hu/en/researchers/hajnal-andreka" [andronick] name = "June Andronick" [andronick.emails] [andronick.homepages] [aransay] name = "Jesús Aransay" [aransay.emails] [aransay.emails.aransay_email] user = [ "jesus-maria", "aransay", ] host = [ "unirioja", "es", ] [aransay.homepages] aransay_homepage = "https://www.unirioja.es/cu/jearansa" [argyraki] name = "Angeliki Koutsoukou-Argyraki" [argyraki.emails] [argyraki.emails.argyraki_email] user = [ "ak2110", ] host = [ "cam", "ac", "uk", ] [argyraki.homepages] argyraki_homepage = "https://www.cl.cam.ac.uk/~ak2110/" argyraki_homepage2 = "https://www.cst.cam.ac.uk/people/ak2110" [armstrong] name = "Alasdair Armstrong" [armstrong.emails] [armstrong.homepages] [aspinall] name = "David Aspinall" [aspinall.emails] [aspinall.homepages] aspinall_homepage = "http://homepages.inf.ed.ac.uk/da/" [ausaf] name = "Fahad Ausaf" [ausaf.emails] [ausaf.homepages] ausaf_homepage = "http://kcl.academia.edu/FahadAusaf" [avigad] name = "Jeremy Avigad" [avigad.emails] [avigad.emails.avigad_email] user = [ "avigad", ] host = [ "cmu", "edu", ] [avigad.homepages] avigad_homepage = "http://www.andrew.cmu.edu/user/avigad/" [back] name = "Ralph-Johan Back" [back.emails] [back.homepages] back_homepage = "http://users.abo.fi/Ralph-Johan.Back/" [baksys] name = "Mantas Bakšys" [baksys.emails] [baksys.emails.baksys_email] user = [ "mb2412", ] host = [ "cam", "ac", "uk", ] [baksys.homepages] baksys_homepage = "https://github.com/MantasBaksys" [balbach] name = "Frank J. Balbach" [balbach.emails] [balbach.emails.balbach_email] user = [ "frank-balbach", ] host = [ "gmx", "de", ] [balbach.homepages] [ballarin] name = "Clemens Ballarin" [ballarin.emails] [ballarin.emails.ballarin_email] user = [ "ballarin", ] host = [ "in", "tum", "de", ] [ballarin.homepages] ballarin_homepage = "http://www21.in.tum.de/~ballarin/" [ballenghien] name = "Benoît Ballenghien" [ballenghien.emails] [ballenghien.emails.ballenghien_email] user = [ "benoit", "ballenghien", ] host = [ "universite-paris-saclay", "fr", ] [ballenghien.homepages] [barsotti] name = "Damián Barsotti" [barsotti.emails] [barsotti.homepages] barsotti_homepage = "http://www.cs.famaf.unc.edu.ar/~damian/" [bauer] name = "Gertrud Bauer" [bauer.emails] [bauer.homepages] [bauereiss] name = "Thomas Bauereiss" [bauereiss.emails] [bauereiss.emails.bauereiss_email] user = [ "thomas", ] host = [ "bauereiss", "name", ] [bauereiss.homepages] [bayer] name = "Jonas Bayer" [bayer.emails] [bayer.emails.bayer_email] user = [ "jonas", "bayer999", ] host = [ "gmail", "com", ] [bayer.homepages] [becker] name = "Heiko Becker" [becker.emails] [becker.emails.becker_email] user = [ "hbecker", ] host = [ "mpi-sws", "org", ] [becker.homepages] [beeren] name = "Joel Beeren" [beeren.emails] [beeren.homepages] [bella] name = "Giampaolo Bella" [bella.emails] [bella.emails.bella_email] user = [ "giamp", ] host = [ "dmi", "unict", "it", ] [bella.homepages] bella_homepage = "http://www.dmi.unict.it/~giamp/" [bengtson] name = "Jesper Bengtson" [bengtson.emails] [bengtson.homepages] bengtson_homepage = "http://www.itu.dk/people/jebe" [bentkamp] name = "Alexander Bentkamp" [bentkamp.emails] [bentkamp.emails.bentkamp_email] user = [ "bentkamp", ] host = [ "gmail", "com", ] [bentkamp.emails.bentkamp_email1] user = [ "a", "bentkamp", ] host = [ "vu", "nl", ] [bentkamp.homepages] bentkamp_homepage = "https://www.cs.vu.nl/~abp290/" [benzmueller] name = "Christoph Benzmüller" [benzmueller.emails] [benzmueller.emails.benzmueller_email] user = [ "c", "benzmueller", ] host = [ "gmail", "com", ] [benzmueller.emails.benzmueller_email1] user = [ "c", "benzmueller", ] host = [ "fu-berlin", "de", ] [benzmueller.homepages] benzmueller_homepage = "http://christoph-benzmueller.de" benzmueller_homepage1 = "http://page.mi.fu-berlin.de/cbenzmueller/" [beresford] name = "Alastair R. Beresford" [beresford.emails] [beresford.emails.beresford_email] user = [ "arb33", ] host = [ "cam", "ac", "uk", ] [beresford.homepages] [berghofer] name = "Stefan Berghofer" [berghofer.emails] [berghofer.emails.berghofer_email] user = [ "berghofe", ] host = [ "in", "tum", "de", ] [berghofer.homepages] berghofer_homepage = "http://www.in.tum.de/~berghofe" [bergstroem] name = "Axel Bergström" [bergstroem.emails] [bergstroem.emails.bergstroem_email] user = [ "axel", "bergstrom00", ] host = [ "gmail", "com", ] [bergstroem.homepages] [beringer] name = "Lennart Beringer" [beringer.emails] [beringer.emails.beringer_email] user = [ "lennart", "beringer", ] host = [ "ifi", "lmu", "de", ] [beringer.homepages] [bharadwaj] name = "Abhijith Bharadwaj" [bharadwaj.emails] [bharadwaj.homepages] [bhatt] name = "Bhargav Bhatt" [bhatt.emails] [bhatt.emails.bhatt_email] user = [ "bhargav", "bhatt", ] host = [ "inf", "ethz", "ch", ] [bhatt.homepages] [biendarra] name = "Julian Biendarra" [biendarra.emails] [biendarra.homepages] [bisping] name = "Benjamin Bisping" orcid = "0000-0002-0637-0171" [bisping.emails] [bisping.emails.bisping_email] user = [ "benjamin", "bisping", ] host = [ "tu-berlin", "de", ] [bisping.homepages] bisping_homepage = "https://bbisping.de" [blanchette] name = "Jasmin Christian Blanchette" [blanchette.emails] [blanchette.emails.blanchette_email] user = [ "jasmin", "blanchette", ] host = [ "gmail", "com", ] [blanchette.emails.blanchette_email1] user = [ "j", "c", "blanchette", ] host = [ "vu", "nl", ] [blanchette.homepages] blanchette_homepage = "http://www21.in.tum.de/~blanchet" blanchette_homepage1 = "https://www.cs.vu.nl/~jbe248/" [blasum] name = "Holger Blasum" [blasum.emails] [blasum.emails.blasum_email] user = [ "holger", "blasum", ] host = [ "sysgo", "com", ] [blasum.homepages] [blumson] name = "Ben Blumson" [blumson.emails] [blumson.emails.blumson_email] user = [ "benblumson", ] host = [ "gmail", "com", ] [blumson.homepages] blumson_homepage = "https://philpeople.org/profiles/ben-blumson" [bockenek] name = "Joshua Bockenek" [bockenek.emails] [bockenek.homepages] [boehme] name = "Sascha Böhme" [boehme.emails] [boehme.emails.boehme_email] user = [ "boehmes", ] host = [ "in", "tum", "de", ] [boehme.homepages] boehme_homepage = "http://www21.in.tum.de/~boehmes/" [bohrer] name = "Rose Bohrer" [bohrer.emails] [bohrer.emails.bohrer_email] user = [ "rose", "bohrer", "cs", ] host = [ "gmail", "com", ] [bohrer.homepages] [bootle] name = "Jonathan Bootle" [bootle.emails] [bootle.emails.bootle_email] user = [ "JBT", ] host = [ "zurich", "ibm", "com", ] [bootle.homepages] [bordg] name = "Anthony Bordg" [bordg.emails] [bordg.emails.bordg_email] user = [ "apdb3", ] host = [ "cam", "ac", "uk", ] [bordg.homepages] bordg_homepage = "https://sites.google.com/site/anthonybordg/" [borgstroem] name = "Johannes Borgström" [borgstroem.emails] [borgstroem.emails.borgstroem_email] user = [ "johannes", "borgstrom", ] host = [ "it", "uu", "se", ] [borgstroem.homepages] [bortin] name = "Maksym Bortin" [bortin.emails] [bortin.emails.bortin_email] user = [ "maksym", "bortin", ] host = [ "nicta", "com", "au", ] [bortin.emails.bortin_email1] user = [ "mbortin", ] host = [ "gmail", "com", ] [bortin.homepages] [bottesch] name = "Ralph Bottesch" [bottesch.emails] [bottesch.emails.bottesch_email] user = [ "ralph", "bottesch", ] host = [ "uibk", "ac", "at", ] [bottesch.homepages] bottesch_homepage = "http://cl-informatik.uibk.ac.at/users/bottesch/" [boulanger] name = "Frédéric Boulanger" [boulanger.emails] [boulanger.emails.boulanger_email] user = [ "frederic", "boulanger", ] host = [ "centralesupelec", "fr", ] [boulanger.homepages] [bourke] name = "Timothy Bourke" [bourke.emails] [bourke.emails.bourke_email] user = [ "tim", ] host = [ "tbrk", "org", ] [bourke.homepages] bourke_homepage = "http://www.tbrk.org" [boutry] name = "Pierre Boutry" [boutry.emails] [boutry.emails.boutry_email] user = [ "boutry", ] host = [ "unistra", "fr", ] [boutry.homepages] [boyton] name = "Andrew Boyton" [boyton.emails] [boyton.emails.boyton_email] user = [ "andrew", "boyton", ] host = [ "nicta", "com", "au", ] [boyton.homepages] [bracevac] name = "Oliver Bračevac" [bracevac.emails] [bracevac.emails.bracevac_email] user = [ "bracevac", ] host = [ "st", "informatik", "tu-darmstadt", "de", ] [bracevac.homepages] [brandt] name = "Felix Brandt" [brandt.emails] [brandt.homepages] brandt_homepage = "http://dss.in.tum.de/staff/brandt.html" [breitner] name = "Joachim Breitner" [breitner.emails] [breitner.emails.breitner_email] user = [ "mail", ] host = [ "joachim-breitner", "de", ] [breitner.emails.breitner_email1] user = [ "joachim", ] host = [ "cis", "upenn", "edu", ] [breitner.homepages] breitner_homepage = "http://pp.ipd.kit.edu/~breitner" [brien] name = "Nicolas Robinson-O'Brien" [brien.emails] [brien.homepages] [brinkop] name = "Hauke Brinkop" [brinkop.emails] [brinkop.emails.brinkop_email] user = [ "hauke", "brinkop", ] host = [ "googlemail", "com", ] [brinkop.homepages] [brodmann] name = "Paul-David Brodmann" [brodmann.emails] [brodmann.emails.brodmann_email] user = [ "p", "brodmann", ] host = [ "tu-berlin", "de", ] [brodmann.homepages] [brucker] name = "Achim D. Brucker" [brucker.emails] [brucker.emails.brucker_email] user = [ "a", "brucker", ] host = [ "exeter", "ac", "uk", ] [brucker.emails.brucker_email2] user = [ "adbrucker", ] host = [ "0x5f", "org", ] [brucker.homepages] brucker_homepage = "https://www.brucker.ch/" [bruegger] name = "Lukas Brügger" [bruegger.emails] [bruegger.emails.bruegger_email] user = [ "lukas", "a", "bruegger", ] host = [ "gmail", "com", ] [bruegger.homepages] [brun] name = "Matthias Brun" [brun.emails] [brun.emails.brun_email] user = [ "matthias", "brun", ] host = [ "inf", "ethz", "ch", ] [brun.homepages] [brunner] name = "Julian Brunner" [brunner.emails] [brunner.emails.brunner_email] user = [ "brunnerj", ] host = [ "in", "tum", "de", ] [brunner.homepages] brunner_homepage = "http://www21.in.tum.de/~brunnerj/" [bulwahn] name = "Lukas Bulwahn" [bulwahn.emails] [bulwahn.emails.bulwahn_email] user = [ "lukas", "bulwahn", ] host = [ "gmail", "com", ] [bulwahn.homepages] [buss] name = "Sebastián Buss" [buss.emails] [buss.emails.buss_email] user = [ "sbuss94", ] host = [ "gmail", "com", ] [buss.homepages] [butler] name = "David Butler" [butler.emails] [butler.emails.butler_email] user = [ "dbutler", ] host = [ "turing", "ac", "uk", ] [butler.homepages] butler_homepage = "https://www.turing.ac.uk/people/doctoral-students/david-butler" [buyse] name = "Maxime Buyse" [buyse.emails] [buyse.emails.buyse_email] user = [ "maxime", "buyse", ] host = [ "polytechnique", "edu", ] [buyse.homepages] [caballero] name = "José Manuel Rodríguez Caballero" [caballero.emails] [caballero.emails.caballero_email] user = [ "jose", "manuel", "rodriguez", "caballero", ] host = [ "ut", "ee", ] [caballero.homepages] caballero_homepage = "https://josephcmac.github.io/" [calk] name = "Cameron Calk" [calk.emails] [calk.homepages] [caminati] name = "Marco B. Caminati" [caminati.emails] [caminati.homepages] [campo] name = "Alejandro del Campo" [campo.emails] [campo.emails.campo_email] user = [ "alejandro", "del-campo", ] host = [ "alum", "unirioja", "es", ] [campo.homepages] [chaieb] name = "Amine Chaieb" [chaieb.emails] [chaieb.homepages] [chapman] name = "Peter Chapman" [chapman.emails] [chapman.emails.chapman_email] user = [ "pc", ] host = [ "cs", "st-andrews", "ac", "uk", ] [chapman.homepages] [chen] name = "L. Chen" [chen.emails] [chen.homepages] [chenj] name = "Jamie Chen" orcid = "0009-0008-5396-6059" [chenj.emails] [chenj.emails.chenj_email] user = [ "jamiechen", ] host = [ "tutanota", "com", ] [chenj.homepages] chenj_homepage = "https://gitlab.com/Jamie-Chen" [chevalier] name = "Loïc Chevalier" [chevalier.emails] [chevalier.homepages] [christfort] name = "Axel Christfort" [christfort.emails] [christfort.emails.christfort_email] user = [ "axel", ] host = [ "di", "ku", "dk", ] [christfort.homepages] [clouston] name = "Ranald Clouston" [clouston.emails] [clouston.emails.clouston_email] user = [ "ranald", "clouston", ] host = [ "cs", "au", "dk", ] [clouston.homepages] [cock] name = "David Cock" [cock.emails] [cock.emails.cock_email] user = [ "david", "cock", ] host = [ "nicta", "com", "au", ] [cock.homepages] [coghetto] name = "Roland Coghetto" [coghetto.emails] [coghetto.emails.coghetto_email] user = [ "roland_coghetto", ] host = [ "hotmail", "com", ] [coghetto.homepages] [coglio] name = "Alessandro Coglio" [coglio.emails] [coglio.emails.coglio_email] user = [ "coglio", ] host = [ "kestrel", "edu", ] [coglio.homepages] coglio_homepage = "http://www.kestrel.edu/~coglio" [cohen] name = "Ernie Cohen" [cohen.emails] [cohen.emails.cohen_email] user = [ "ecohen", ] host = [ "amazon", "com", ] [cohen.homepages] [cordwell] name = "Katherine Kosaian" [cordwell.emails] [cordwell.emails.cordwell_email] user = [ "kcordwel", ] host = [ "cs", "cmu", "edu", ] [cordwell.homepages] cordwell_homepage = "https://www.cs.cmu.edu/~kcordwel/" [cousin] name = "Marie Cousin" [cousin.emails] [cousin.emails.cousin_email] user = [ "marie", "cousin", ] host = [ "grenoble-inp", "org", ] [cousin.homepages] [cremer] name = "Nils Cremer" [cremer.emails] [cremer.emails.cremer_email] user = [ "nils", "cremer", ] host = [ "tum", "de", ] [cremer.homepages] [crighton] name = "Aaron Crighton" [crighton.emails] [crighton.emails.crighton_email] user = [ "crightoa", ] host = [ "mcmaster", "ca", ] [crighton.homepages] [dalvit] name = "Christian Dalvit" [dalvit.emails] [dalvit.emails.dalvit_email] user = [ "chris", "dalvit", ] host = [ "gmail", "com", ] [dalvit.homepages] [danilkin] name = "Anton Danilkin" [danilkin.emails] [danilkin.emails.danilkin_email] user = [ "anton", "danilkin", ] host = [ "ens", "psl", "eu", ] [danilkin.homepages] [dardinier] name = "Thibault Dardinier" [dardinier.emails] [dardinier.emails.dardinier_email] user = [ "thibault", "dardinier", ] host = [ "inf", "ethz", "ch", ] [dardinier.homepages] dardinier_homepage = "https://dardinier.me/" [david] name = "Marco David" [david.emails] [david.emails.david_email] user = [ "marco", "david", ] host = [ "hotmail", "de", ] [david.homepages] [debois] name = "Søren Debois" [debois.emails] [debois.homepages] [debrat] name = "Henri Debrat" [debrat.emails] [debrat.emails.debrat_email] user = [ "henri", "debrat", ] host = [ "loria", "fr", ] [debrat.homepages] [decova] name = "Sára Decova" [decova.emails] [decova.homepages] [delemazure] name = "Théo Delemazure" [delemazure.emails] [delemazure.homepages] delemazure_homepage = "https://theo.delemazure.fr/" [demeulemeester] name = "Tom Demeulemeester" [demeulemeester.emails] [demeulemeester.homepages] demeulemeester_homepage = "https://www.kuleuven.be/wieiswie/en/person/00131528" [derrick] name = "John Derrick" [derrick.emails] [derrick.emails.derrick_email] user = [ "j", "derrick", ] host = [ "sheffield", "ac", "uk", ] [derrick.homepages] [desharnais] name = "Martin Desharnais" [desharnais.emails] [desharnais.emails.desharnais_email] user = [ "martin", "desharnais", ] host = [ "unibw", "de", ] [desharnais.emails.desharnais_email1] user = [ "desharnais", ] host = [ "mpi-inf", "mpg", "de", ] [desharnais.homepages] desharnais_homepage = "https://martin.desharnais.me" [diaz] name = "Javier Díaz" [diaz.emails] [diaz.emails.diaz_email] user = [ "javier", "diaz", "manzi", ] host = [ "gmail", "com", ] [diaz.homepages] [diekmann] name = "Cornelius Diekmann" [diekmann.emails] [diekmann.emails.diekmann_email] user = [ "diekmann", ] host = [ "net", "in", "tum", "de", ] [diekmann.homepages] diekmann_homepage = "http://net.in.tum.de/~diekmann" [dirix] name = "Stefan Dirix" [dirix.emails] [dirix.homepages] [dittmann] name = "Christoph Dittmann" [dittmann.emails] [dittmann.emails.dittmann_email] user = [ "isabelle", ] host = [ "christoph-d", "de", ] [dittmann.homepages] dittmann_homepage = "http://logic.las.tu-berlin.de/Members/Dittmann/" [divason] name = "Jose Divasón" [divason.emails] [divason.emails.divason_email] user = [ "jose", "divason", ] host = [ "unirioja", "es", ] [divason.homepages] divason_homepage = "https://www.unirioja.es/cu/jodivaso/" [doczkal] name = "Christian Doczkal" [doczkal.emails] [doczkal.emails.doczkal_email] user = [ "doczkal", ] host = [ "ps", "uni-saarland", "de", ] [doczkal.homepages] [dongol] name = "Brijesh Dongol" [dongol.emails] [dongol.emails.dongol_email] user = [ "brijesh", "dongol", ] host = [ "brunel", "ac", "uk", ] [dongol.homepages] [doty] name = "Matthew Doty" [doty.emails] [doty.emails.doty_email] user = [ "matt", ] host = [ "w-d", "org", ] [doty.homepages] [dubut] name = "Jérémy Dubut" [dubut.emails] [dubut.emails.dubut_email] user = [ "dubut", ] host = [ "nii", "ac", "jp", ] [dubut.emails.dubut_email1] user = [ "jeremy", "dubut", ] host = [ "aist", "go", "jp", ] [dubut.homepages] dubut_homepage = "http://group-mmm.org/~dubut/" [dunaev] name = "Georgy Dunaev" [dunaev.emails] [dunaev.emails.dunaev_email] user = [ "georgedunaev", ] host = [ "gmail", "com", ] [dunaev.homepages] [dyckhoff] name = "Roy Dyckhoff" [dyckhoff.emails] [dyckhoff.homepages] dyckhoff_homepage = "https://rd.host.cs.st-andrews.ac.uk" [eberl] name = "Manuel Eberl" orcid = "0000-0002-4263-6571" [eberl.emails] [eberl.emails.eberl_email] user = [ "manuel", ] host = [ "pruvisto", "org", ] [eberl.emails.eberl_email1] user = [ "manuel", "eberl", ] host = [ "tum", "de", ] [eberl.emails.eberl_email2] user = [ "manuel", "eberl", ] host = [ "uibk", "ac", "at", ] [eberl.homepages] eberl_homepage = "https://pruvisto.org/" eberl_homepage2 = "https://www.in.tum.de/~eberlm" [echenim] name = "Mnacho Echenim" [echenim.emails] [echenim.emails.echenim_email] user = [ "mnacho", "echenim", ] host = [ "univ-grenoble-alpes", "fr", ] [echenim.homepages] echenim_homepage = "https://lig-membres.imag.fr/mechenim/" [edmonds] name = "Chelsea Edmonds" [edmonds.emails] [edmonds.emails.edmonds_email] user = [ "cle47", ] host = [ "cam", "ac", "uk", ] [edmonds.homepages] edmonds_homepage = "https://www.cst.cam.ac.uk/people/cle47" [engelhardt] name = "Kai Engelhardt" [engelhardt.emails] [engelhardt.homepages] [eriksson] name = "Lars-Henrik Eriksson" [eriksson.emails] [eriksson.emails.eriksson_email] user = [ "lhe", ] host = [ "it", "uu", "se", ] [eriksson.homepages] [esparza] name = "Javier Esparza" [esparza.emails] [esparza.homepages] esparza_homepage = "https://www7.in.tum.de/~esparza/" [essmann] name = "Robin Eßmann" [essmann.emails] [essmann.emails.essmann_email] user = [ "robin", "essmann", ] host = [ "tum", "de", ] [essmann.homepages] [felgenhauer] name = "Bertram Felgenhauer" [felgenhauer.emails] [felgenhauer.emails.felgenhauer_email] user = [ "bertram", "felgenhauer", ] host = [ "uibk", "ac", "at", ] [felgenhauer.emails.felgenhauer_email1] user = [ "int-e", ] host = [ "gmx", "de", ] [felgenhauer.homepages] [feliachi] name = "Abderrahmane Feliachi" [feliachi.emails] [feliachi.emails.feliachi_email] user = [ "abderrahmane", "feliachi", ] host = [ "lri", "fr", ] [feliachi.homepages] [fell] name = "Julian Fell" [fell.emails] [fell.emails.fell_email] user = [ "julian", "fell", ] host = [ "uq", "net", "au", ] [fell.homepages] [fernandez] name = "Matthew Fernandez" [fernandez.emails] [fernandez.homepages] [fiedler] name = "Ben Fiedler" [fiedler.emails] [fiedler.emails.fiedler_email] user = [ "ben", "fiedler", ] host = [ "inf", "ethz", "ch", ] [fiedler.homepages] [fleuriot] name = "Jacques D. Fleuriot" [fleuriot.emails] [fleuriot.emails.fleuriot_email] user = [ "Jacques", "Fleuriot", ] host = [ "ed", "ac", "uk", ] [fleuriot.emails.fleuriot_email1] user = [ "jdf", ] host = [ "ed", "ac", "uk", ] [fleuriot.homepages] fleuriot_homepage = "https://www.inf.ed.ac.uk/people/staff/Jacques_Fleuriot.html" [fleury] name = "Mathias Fleury" [fleury.emails] [fleury.emails.fleury_email] user = [ "fleury", ] host = [ "mpi-inf", "mpg", "de", ] [fleury.emails.fleury_email1] user = [ "mathias", "fleury", ] host = [ "jku", "at", ] [fleury.homepages] fleury_homepage = "http://fmv.jku.at/fleury" [foster] name = "Michael Foster" [foster.emails] [foster.emails.foster_email] user = [ "m", "foster", ] host = [ "sheffield", "ac", "uk", ] [foster.homepages] [fosterj] name = "J. Nathan Foster" [fosterj.emails] [fosterj.homepages] fosterj_homepage = "http://www.cs.cornell.edu/~jnfoster/" [fosters] name = "Simon Foster" [fosters.emails] [fosters.emails.fosters_email] user = [ "simon", "foster", ] host = [ "york", "ac", "uk", ] [fosters.homepages] fosters_homepage = "https://www-users.cs.york.ac.uk/~simonf/" [fouillard] name = "Valentin Fouillard" [fouillard.emails] [fouillard.emails.fouillard_email] user = [ "valentin", "fouillard", ] host = [ "limsi", "fr", ] [fouillard.homepages] [friedrich] name = "Stefan Friedrich" [friedrich.emails] [friedrich.homepages] [from] name = "Asta Halkjær From" [from.emails] [from.emails.from_email] user = [ "ahfrom", ] host = [ "dtu", "dk", ] [from.homepages] from_homepage = "https://people.compute.dtu.dk/ahfrom/" [fuenmayor] name = "David Fuenmayor" [fuenmayor.emails] [fuenmayor.emails.fuenmayor_email] user = [ "davfuenmayor", ] host = [ "gmail", "com", ] [fuenmayor.homepages] [furusawa] name = "Hitoshi Furusawa" [furusawa.emails] [furusawa.homepages] furusawa_homepage = "http://www.sci.kagoshima-u.ac.jp/~furusawa/" [gammie] name = "Peter Gammie" [gammie.emails] [gammie.emails.gammie_email] user = [ "peteg42", ] host = [ "gmail", "com", ] [gammie.homepages] gammie_homepage = "http://peteg.org" [gao] name = "Xin Gao" [gao.emails] [gao.homepages] [garvia] name = "Azucena Garvia" [garvia.emails] [garvia.emails.garvia_email] user = [ "zucegb", ] host = [ "gmail", "com", ] [garvia.homepages] [gaudel] name = "Marie-Claude Gaudel" [gaudel.emails] [gaudel.emails.gaudel_email] user = [ "mcg", ] host = [ "lri", "fr", ] [gaudel.homepages] [gay] name = "Richard Gay" [gay.emails] [gay.emails.gay_email] user = [ "gay", ] host = [ "mais", "informatik", "tu-darmstadt", "de", ] [gay.homepages] [georgescu] name = "George Georgescu" [georgescu.emails] [georgescu.homepages] [gheri] name = "Lorenzo Gheri" [gheri.emails] [gheri.emails.gheri_email] user = [ "lor", "gheri", ] host = [ "gmail", "com", ] [gheri.homepages] [ghourabi] name = "Fadoua Ghourabi" [ghourabi.emails] [ghourabi.emails.ghourabi_email] user = [ "fadouaghourabi", ] host = [ "gmail", "com", ] [ghourabi.homepages] [gioiosa] name = "Gianpaolo Gioiosa" [gioiosa.emails] [gioiosa.homepages] [glabbeek] name = "Rob van Glabbeek" [glabbeek.emails] [glabbeek.homepages] glabbeek_homepage = "http://theory.stanford.edu/~rvg/" [gomes] name = "Victor B. F. Gomes" [gomes.emails] [gomes.emails.gomes_email] user = [ "victor", "gomes", ] host = [ "cl", "cam", "ac", "uk", ] [gomes.emails.gomes_email2] user = [ "victorborgesfg", ] host = [ "gmail", "com", ] [gomes.emails.gomes_email4] user = [ "vborgesferreiragomes1", ] host = [ "sheffield", "ac", "uk", ] [gomes.homepages] gomes_homepage = "http://www.dcs.shef.ac.uk/~victor" [gonzalez] name = "Edgar Gonzàlez" orcid = "0000-0002-9169-0769" [gonzalez.emails] [gonzalez.emails.gonzalez_email] user = [ "edgargip", ] host = [ "google", "com", ] [gonzalez.homepages] [gore] name = "Rajeev Gore" [gore.emails] [gore.emails.gore_email] user = [ "rajeev", "gore", ] host = [ "anu", "edu", "au", ] [gore.homepages] [gouezel] name = "Sebastien Gouezel" [gouezel.emails] [gouezel.emails.gouezel_email] user = [ "sebastien", "gouezel", ] host = [ "univ-rennes1", "fr", ] [gouezel.homepages] gouezel_homepage = "http://www.math.sciences.univ-nantes.fr/~gouezel/" [grechuk] name = "Bogdan Grechuk" [grechuk.emails] [grechuk.emails.grechuk_email] user = [ "grechukbogdan", ] host = [ "yandex", "ru", ] [grechuk.homepages] [grewe] name = "Sylvia Grewe" [grewe.emails] [grewe.emails.grewe_email] user = [ "grewe", ] host = [ "cs", "tu-darmstadt", "de", ] [grewe.homepages] [griebel] name = "Simon Griebel" [griebel.emails] [griebel.emails.griebel_email] user = [ "s", "griebel", ] host = [ "tum", "de", ] [griebel.homepages] [grov] name = "Gudmund Grov" [grov.emails] [grov.emails.grov_email] user = [ "ggrov", ] host = [ "inf", "ed", "ac", "uk", ] [grov.homepages] grov_homepage = "http://homepages.inf.ed.ac.uk/ggrov" [guerraoui] name = "Rachid Guerraoui" [guerraoui.emails] [guerraoui.emails.guerraoui_email] user = [ "rachid", "guerraoui", ] host = [ "epfl", "ch", ] [guerraoui.homepages] [guiol] name = "Hervé Guiol" [guiol.emails] [guiol.emails.guiol_email] user = [ "herve", "guiol", ] host = [ "univ-grenoble-alpes", "fr", ] [guiol.homepages] [gunther] name = "Emmanuel Gunther" [gunther.emails] [gunther.emails.gunther_email] user = [ "gunther", ] host = [ "famaf", "unc", "edu", "ar", ] [gunther.homepages] [gutkovas] name = "Ramunas Gutkovas" [gutkovas.emails] [gutkovas.emails.gutkovas_email] user = [ "ramunas", "gutkovas", ] host = [ "it", "uu", "se", ] [gutkovas.homepages] [guttmann] name = "Walter Guttmann" [guttmann.emails] [guttmann.emails.guttmann_email] user = [ "walter", "guttmann", ] host = [ "canterbury", "ac", "nz", ] [guttmann.homepages] guttmann_homepage = "https://www.cosc.canterbury.ac.nz/walter.guttmann/" [guzman] name = "Laura P. Gamboa Guzman" [guzman.emails] [guzman.emails.guzman_email] user = [ "lpgamboa", ] host = [ "iastate", "edu", ] [guzman.homepages] guzman_homepage = "https://sites.google.com/view/lpgamboa/home" [haftmann] name = "Florian Haftmann" [haftmann.emails] [haftmann.emails.haftmann_email] user = [ "florian", "haftmann", ] host = [ "informatik", "tu-muenchen", "de", ] [haftmann.homepages] haftmann_homepage = "http://isabelle.in.tum.de/~haftmann" [haslbeck] name = "Max W. Haslbeck" [haslbeck.emails] [haslbeck.emails.haslbeck_email] user = [ "maximilian", "haslbeck", ] host = [ "uibk", "ac", "at", ] [haslbeck.emails.haslbeck_email1] user = [ "haslbecm", ] host = [ "in", "tum", "de", ] [haslbeck.emails.haslbeck_email2] user = [ "max", "haslbeck", ] host = [ "gmx", "de", ] [haslbeck.homepages] haslbeck_homepage = "http://cl-informatik.uibk.ac.at/users/mhaslbeck/" [haslbeckm] name = "Maximilian P. L. Haslbeck" [haslbeckm.emails] [haslbeckm.emails.haslbeckm_email] user = [ "haslbema", ] host = [ "in", "tum", "de", ] [haslbeckm.homepages] haslbeckm_homepage = "http://in.tum.de/~haslbema/" [havle] name = "Oto Havle" [havle.emails] [havle.emails.havle_email] user = [ "oha", ] host = [ "sysgo", "com", ] [havle.homepages] [hayes] name = "Ian J. Hayes" [hayes.emails] [hayes.emails.hayes_email] user = [ "ian", "hayes", ] host = [ "itee", "uq", "edu", "au", ] [hayes.homepages] [he] name = "Yijun He" [he.emails] [he.emails.he_email] user = [ "yh403", ] host = [ "cam", "ac", "uk", ] [he.homepages] [heimes] name = "Lukas Heimes" [heimes.emails] [heimes.emails.heimes_email] user = [ "heimesl", ] host = [ "student", "ethz", "ch", ] [heimes.homepages] [helke] name = "Steffen Helke" [helke.emails] [helke.emails.helke_email] user = [ "helke", ] host = [ "cs", "tu-berlin", "de", ] [helke.homepages] [hellauer] name = "Fabian Hellauer" [hellauer.emails] [hellauer.emails.hellauer_email] user = [ "hellauer", ] host = [ "in", "tum", "de", ] [hellauer.homepages] [heller] name = "Armin Heller" [heller.emails] [heller.homepages] [henrio] name = "Ludovic Henrio" [henrio.emails] [henrio.emails.henrio_email] user = [ "Ludovic", "Henrio", ] host = [ "sophia", "inria", "fr", ] [henrio.homepages] [herzberg] name = "Michael Herzberg" [herzberg.emails] [herzberg.emails.herzberg_email] user = [ "mail", ] host = [ "michael-herzberg", "de", ] [herzberg.homepages] herzberg_homepage = "http://www.dcs.shef.ac.uk/cgi-bin/makeperson?M.Herzberg" [hess] name = "Andreas V. Hess" [hess.emails] [hess.emails.hess_email] user = [ "avhe", ] host = [ "dtu", "dk", ] [hess.emails.hess_email1] user = [ "andreasvhess", ] host = [ "gmail", "com", ] [hess.homepages] [hetzl] name = "Stefan Hetzl" [hetzl.emails] [hetzl.emails.hetzl_email] user = [ "hetzl", ] host = [ "logic", "at", ] [hetzl.homepages] hetzl_homepage = "http://www.logic.at/people/hetzl/" [hibon] name = "Quentin Hibon" [hibon.emails] [hibon.emails.hibon_email] user = [ "qh225", ] host = [ "cl", "cam", "ac", "uk", ] [hibon.homepages] [higgins] name = "Edward Higgins" [higgins.emails] [higgins.homepages] [hirata] name = "Michikazu Hirata" [hirata.emails] [hirata.emails.hirata_email] user = [ "hirata", "m", "ac", ] host = [ "m", "titech", "ac", "jp", ] [hirata.homepages] [hoefner] name = "Peter Höfner" [hoefner.emails] [hoefner.emails.hoefner_email] user = [ "peter", ] host = [ "hoefner-online", "de", ] [hoefner.homepages] hoefner_homepage = "http://www.hoefner-online.de/" [hoelzl] name = "Johannes Hölzl" [hoelzl.emails] [hoelzl.emails.hoelzl_email] user = [ "hoelzl", ] host = [ "in", "tum", "de", ] [hoelzl.homepages] hoelzl_homepage = "http://home.in.tum.de/~hoelzl" [hofmann] name = "Martin Hofmann" [hofmann.emails] [hofmann.homepages] hofmann_homepage = "http://www.tcs.informatik.uni-muenchen.de/~mhofmann" [hofmeier] name = "Paul Hofmeier" [hofmeier.emails] [hofmeier.emails.hofmeier_email] user = [ "paul", "hofmeier", ] host = [ "tum", "de", ] [hofmeier.homepages] [holub] name = "Štěpán Holub" [holub.emails] [holub.emails.holub_email] user = [ "holub", ] host = [ "karlin", "mff", "cuni", "cz", ] [holub.homepages] holub_homepage = "https://www2.karlin.mff.cuni.cz/~holub/" [hosking] name = "Tony Hosking" [hosking.emails] [hosking.homepages] hosking_homepage = "https://www.cs.purdue.edu/homes/hosking/" [hou] name = "Zhe Hou" [hou.emails] [hou.emails.hou_email] user = [ "zhe", "hou", ] host = [ "ntu", "edu", "sg", ] [hou.homepages] [hu] name = "Shuwei Hu" [hu.emails] [hu.emails.hu_email] user = [ "shuwei", "hu", ] host = [ "tum", "de", ] [hu.homepages] [huffman] name = "Brian Huffman" [huffman.emails] [huffman.emails.huffman_email] user = [ "huffman", ] host = [ "in", "tum", "de", ] [huffman.emails.huffman_email1] user = [ "brianh", ] host = [ "cs", "pdx", "edu", ] [huffman.homepages] huffman_homepage = "http://cs.pdx.edu/~brianh/" [hupel] name = "Lars Hupel" [hupel.emails] [hupel.emails.hupel_email] user = [ "lars", ] host = [ "hupel", "info", ] [hupel.homepages] hupel_homepage = "https://lars.hupel.info/" [ijbema] name = "Mark Ijbema" [ijbema.emails] [ijbema.emails.ijbema_email] user = [ "ijbema", ] host = [ "fmf", "nl", ] [ijbema.homepages] [immler] name = "Fabian Immler" [immler.emails] [immler.emails.immler_email] user = [ "immler", ] host = [ "in", "tum", "de", ] [immler.emails.immler_email1] user = [ "fimmler", ] host = [ "cs", "cmu", "edu", ] [immler.homepages] immler_homepage = "https://home.in.tum.de/~immler/" [israel] name = "Jonas Israel" [israel.emails] [israel.homepages] israel_homepage = "https://www.algo.tu-berlin.de/menue/people/jonas_israel/" [ito] name = "Yosuke Ito" [ito.emails] [ito.emails.ito_email] user = [ "glacier345", ] host = [ "gmail", "com", ] [ito.homepages] [iwama] name = "Fumiya Iwama" [iwama.emails] [iwama.emails.iwama_email] user = [ "d1623001", ] host = [ "s", "konan-u", "ac", "jp", ] [iwama.homepages] [jacobsen] name = "Frederik Krogsdal Jacobsen" [jacobsen.emails] [jacobsen.emails.jacobsen_email] user = [ "fkjac", ] host = [ "dtu", "dk", ] [jacobsen.homepages] jacobsen_homepage = "http://people.compute.dtu.dk/fkjac/" [jaskelioff] name = "Mauro Jaskelioff" [jaskelioff.emails] [jaskelioff.homepages] jaskelioff_homepage = "http://www.fceia.unr.edu.ar/~mauro/" [jaskolka] name = "Jason Jaskolka" [jaskolka.emails] [jaskolka.emails.jaskolka_email] user = [ "jason", "jaskolka", ] host = [ "carleton", "ca", ] [jaskolka.homepages] jaskolka_homepage = "https://carleton.ca/jaskolka/" [jensen] name = "Alexander Birch Jensen" [jensen.emails] [jensen.emails.jensen_email] user = [ "aleje", ] host = [ "dtu", "dk", ] [jensen.homepages] jensen_homepage = "https://people.compute.dtu.dk/aleje/" [jiang] name = "Nan Jiang" [jiang.emails] [jiang.emails.jiang_email] user = [ "nanjiang", ] host = [ "whu", "edu", "cn", ] [jiang.homepages] [jiangd] name = "Dongchen Jiang" [jiangd.emails] [jiangd.emails.jiangd_email] user = [ "dongchenjiang", ] host = [ "googlemail", "com", ] [jiangd.homepages] [joosten] name = "Sebastiaan J. C. Joosten" [joosten.emails] [joosten.emails.joosten_email] user = [ "sebastiaan", "joosten", ] host = [ "uibk", "ac", "at", ] [joosten.emails.joosten_email1] user = [ "sjcjoosten", ] host = [ "gmail", "com", ] [joosten.emails.joosten_email2] user = [ "s", "j", "c", "joosten", ] host = [ "utwente", "nl", ] [joosten.homepages] joosten_homepage = "https://sjcjoosten.nl/" [jungnickel] name = "Tim Jungnickel" [jungnickel.emails] [jungnickel.emails.jungnickel_email] user = [ "tim", "jungnickel", ] host = [ "tu-berlin", "de", ] [jungnickel.homepages] [kadzioka] name = "Maya Kądziołka" [kadzioka.emails] [kadzioka.emails.kadzioka_email] user = [ "afp", ] host = [ "compilercrim", "es", ] [kadzioka.homepages] [kaliszyk] name = "Cezary Kaliszyk" [kaliszyk.emails] [kaliszyk.emails.kaliszyk_email] user = [ "cezary", "kaliszyk", ] host = [ "uibk", "ac", "at", ] [kaliszyk.homepages] kaliszyk_homepage = "http://cl-informatik.uibk.ac.at/users/cek/" [kammueller] name = "Florian Kammüller" [kammueller.emails] [kammueller.emails.kammueller_email] user = [ "flokam", ] host = [ "cs", "tu-berlin", "de", ] [kammueller.emails.kammueller_email1] user = [ "florian", "kammuller", ] host = [ "gmail", "com", ] [kammueller.homepages] kammueller_homepage = "http://www.cs.mdx.ac.uk/people/florian-kammueller/" [kappelmann] name = "Kevin Kappelmann" [kappelmann.emails] [kappelmann.emails.kappelmann_email] user = [ "kevin", "kappelmann", ] host = [ "tum", "de", ] [kappelmann.homepages] kappelmann_homepage = "https://www21.in.tum.de/team/kappelmk/" [karayel] name = "Emin Karayel" orcid = "0000-0003-3290-5034" [karayel.emails] [karayel.emails.karayel_email] user = [ "me", ] host = [ "eminkarayel", "de", ] [karayel.homepages] karayel_homepage = "https://orcid.org/0000-0003-3290-5034" [kastermans] name = "Bart Kastermans" [kastermans.emails] [kastermans.homepages] kastermans_homepage = "http://kasterma.net" [katovsky] name = "Alexander Katovsky" [katovsky.emails] [katovsky.emails.katovsky_email] user = [ "apk32", ] host = [ "cam", "ac", "uk", ] [katovsky.emails.katovsky_email1] user = [ "alexander", "katovsky", ] host = [ "cantab", "net", ] [katovsky.homepages] [kaufmann] name = "Daniela Kaufmann" [kaufmann.emails] [kaufmann.homepages] kaufmann_homepage = "http://fmv.jku.at/kaufmann" [keefe] name = "Greg O'Keefe" [keefe.emails] [keefe.homepages] keefe_homepage = "http://users.rsise.anu.edu.au/~okeefe/" [keinholz] name = "Jonas Keinholz" [keinholz.emails] [keinholz.homepages] [kerber] name = "Manfred Kerber" [kerber.emails] [kerber.emails.kerber_email] user = [ "mnfrd", "krbr", ] host = [ "gmail", "com", ] [kerber.homepages] kerber_homepage = "http://www.cs.bham.ac.uk/~mmk" [keskin] name = "Ata Keskin" orcid = "0000-0002-8296-1766" [keskin.emails] [keskin.emails.keskin_email] user = [ "ata", "keskin", ] host = [ "tum", "de", ] [keskin.homepages] [ketland] name = "Jeffrey Ketland" [ketland.emails] [ketland.emails.ketland_email] user = [ "jeffreyketland", ] host = [ "gmail", "com", ] [ketland.homepages] [kim] name = "Sunpill Kim" orcid = "0000-0002-7767-4084" [kim.emails] [kim.homepages] [kirchner] name = "Daniel Kirchner" [kirchner.emails] [kirchner.emails.kirchner_email] user = [ "daniel", ] host = [ "ekpyron", "org", ] [kirchner.homepages] [klein] name = "Gerwin Klein" [klein.emails] [klein.emails.klein_email] user = [ "kleing", ] host = [ "unsw", "edu", "au", ] [klein.homepages] klein_homepage = "http://www.cse.unsw.edu.au/~kleing/" [klenze] name = "Tobias Klenze" [klenze.emails] [klenze.emails.klenze_email] user = [ "tobias", "klenze", ] host = [ "inf", "ethz", "ch", ] [klenze.homepages] [kleppmann] name = "Martin Kleppmann" [kleppmann.emails] [kleppmann.emails.kleppmann_email] user = [ "martin", "kleppmann", ] host = [ "cl", "cam", "ac", "uk", ] [kleppmann.homepages] [kobayashi] name = "Hidetsune Kobayashi" [kobayashi.emails] [kobayashi.homepages] [koerner] name = "Stefan Körner" [koerner.emails] [koerner.emails.koerner_email] user = [ "s_koer03", ] host = [ "uni-muenster", "de", ] [koerner.homepages] [kolanski] name = "Rafal Kolanski" [kolanski.emails] [kolanski.emails.kolanski_email] user = [ "rafal", "kolanski", ] host = [ "nicta", "com", "au", ] [kolanski.homepages] [koller] name = "Lukas Koller" [koller.emails] [koller.emails.koller_email] user = [ "lukas", "koller", ] host = [ "tum", "de", ] [koller.homepages] [krauss] name = "Alexander Krauss" [krauss.emails] [krauss.emails.krauss_email] user = [ "krauss", ] host = [ "in", "tum", "de", ] [krauss.homepages] krauss_homepage = "http://www.in.tum.de/~krauss" [kreuzer] name = "Katharina Kreuzer" [kreuzer.emails] [kreuzer.emails.kreuzer_email] user = [ "kreuzerk", ] host = [ "in", "tum", "de", ] [kreuzer.emails.kreuzer_email1] user = [ "k", "kreuzer", ] host = [ "tum", "de", ] [kreuzer.homepages] kreuzer_homepage = "https://www21.in.tum.de/team/kreuzer/" [kuncak] name = "Viktor Kuncak" [kuncak.emails] [kuncak.homepages] kuncak_homepage = "http://lara.epfl.ch/~kuncak/" [kuncar] name = "Ondřej Kunčar" [kuncar.emails] [kuncar.homepages] kuncar_homepage = "http://www21.in.tum.de/~kuncar/" [kurz] name = "Friedrich Kurz" [kurz.emails] [kurz.emails.kurz_email] user = [ "friedrich", "kurz", ] host = [ "tum", "de", ] [kurz.homepages] [lachnitt] name = "Hanna Lachnitt" [lachnitt.emails] [lachnitt.emails.lachnitt_email] user = [ "lachnitt", ] host = [ "stanford", "edu", ] [lachnitt.homepages] [lallemand] name = "Joseph Lallemand" [lallemand.emails] [lallemand.emails.lallemand_email] user = [ "joseph", "lallemand", ] host = [ "loria", "fr", ] [lallemand.homepages] [lameris] name = "Cárolos Laméris" [lameris.emails] [lameris.emails.lameris_email] user = [ "carolos", "lameris", ] host = [ "ru", "nl", ] [lameris.homepages] [lammich] name = "Peter Lammich" [lammich.emails] [lammich.emails.lammich_email] user = [ "lammich", ] host = [ "in", "tum", "de", ] [lammich.emails.lammich_email1] user = [ "peter", "lammich", ] host = [ "uni-muenster", "de", ] [lammich.homepages] lammich_homepage = "http://www21.in.tum.de/~lammich" [lange] name = "Christoph Lange" [lange.emails] [lange.emails.lange_email] user = [ "math", "semantic", "web", ] host = [ "gmail", "com", ] [lange.homepages] [langenstein] name = "Bruno Langenstein" [langenstein.emails] [langenstein.emails.langenstein_email] user = [ "langenstein", ] host = [ "dfki", "de", ] [langenstein.homepages] [lattuada] name = "Andrea Lattuada" [lattuada.emails] [lattuada.homepages] lattuada_homepage = "https://andrea.lattuada.me" [lauermann] name = "Nils Lauermann" [lauermann.emails] [lauermann.emails.lauermann_email] user = [ "Nils", "Lauermann", ] host = [ "cl", "cam", "ac", "uk", ] [lauermann.homepages] [laursen] name = "Christian Pardillo-Laursen" [laursen.emails] [laursen.emails.laursen_email] user = [ "christian", "laursen", ] host = [ "york", "ac", "uk", ] [laursen.homepages] [lederer] name = "Patrick Lederer" [lederer.emails] [lederer.homepages] lederer_homepage = "https://www.cs.cit.tum.de/en/dss/members/patrick-lederer/" [lee] name = "Holden Lee" [lee.emails] [lee.emails.lee_email] user = [ "holdenl", ] host = [ "princeton", "edu", ] [lee.homepages] [leek] name = "Kevin Lee" [leek.emails] [leek.emails.leek_email] user = [ "kfkl2", ] host = [ "cam", "ac", "uk", ] [leek.homepages] [leustean] name = "Laurentiu Leustean" [leustean.emails] [leustean.homepages] [lewis] name = "Corey Lewis" [lewis.emails] [lewis.emails.lewis_email] user = [ "corey", "lewis", ] host = [ "data61", "csiro", "au", ] [lewis.homepages] [li] name = "Wenda Li" [li.emails] [li.emails.li_email] user = [ "wl302", ] host = [ "cam", "ac", "uk", ] [li.emails.li_email1] user = [ "liwenda1990", ] host = [ "hotmail", "com", ] [li.homepages] li_homepage = "https://www.cl.cam.ac.uk/~wl302/" [lim] name = "Japheth Lim" [lim.emails] [lim.homepages] [lindenberg] name = "Christina Lindenberg" [lindenberg.emails] [lindenberg.homepages] [linker] name = "Sven Linker" [linker.emails] [linker.emails.linker_email] user = [ "s", "linker", ] host = [ "liverpool", "ac", "uk", ] [linker.homepages] [liu] name = "Junyi Liu" [liu.emails] [liu.homepages] [liut] name = "Tao Liu" [liut.emails] [liut.homepages] [liuy] name = "Yang Liu" [liuy.emails] [liuy.emails.liuy_email] user = [ "yangliu", ] host = [ "ntu", "edu", "sg", ] [liuy.homepages] [liy] name = "Yangjia Li" [liy.emails] [liy.homepages] [lochbihler] name = "Andreas Lochbihler" [lochbihler.emails] [lochbihler.emails.lochbihler_email1] user = [ "mail", ] host = [ "andreas-lochbihler", "de", ] [lochbihler.homepages] lochbihler_homepage = "http://www.andreas-lochbihler.de/" [lochmann] name = "Alexander Lochmann" [lochmann.emails] [lochmann.emails.lochmann_email] user = [ "alexander", "lochmann", ] host = [ "uibk", "ac", "at", ] [lochmann.homepages] [lohner] name = "Denis Lohner" [lohner.emails] [lohner.emails.lohner_email] user = [ "denis", "lohner", ] host = [ "kit", "edu", ] [lohner.homepages] lohner_homepage = "http://pp.ipd.kit.edu/person.php?id=88" [loibl] name = "Matthias Loibl" [loibl.emails] [loibl.homepages] [londono] name = "Alejandro Gómez-Londoño" [londono.emails] [londono.emails.londono_email] user = [ "alejandro", "gomez", ] host = [ "chalmers", "se", ] [londono.homepages] [losa] name = "Giuliano Losa" [losa.emails] [losa.emails.losa_email] user = [ "giuliano", "losa", ] host = [ "epfl", "ch", ] [losa.emails.losa_email1] user = [ "giuliano", ] host = [ "galois", "com", ] [losa.emails.losa_email2] user = [ "giuliano", ] host = [ "losa", "fr", ] [losa.homepages] [lutz] name = "Bianca Lutz" [lutz.emails] [lutz.emails.lutz_email] user = [ "sowilo", ] host = [ "cs", "tu-berlin", "de", ] [lutz.homepages] [lux] name = "Alexander Lux" [lux.emails] [lux.emails.lux_email] user = [ "lux", ] host = [ "mais", "informatik", "tu-darmstadt", "de", ] [lux.homepages] [madarasz] name = "Judit Madarasz" [madarasz.emails] [madarasz.homepages] madarasz_homepage = "https://users.renyi.hu/~madarasz/" [makarios] name = "T. J. M. Makarios" [makarios.emails] [makarios.emails.makarios_email] user = [ "tjm1983", ] host = [ "gmail", "com", ] [makarios.homepages] [maletzky] name = "Alexander Maletzky" [maletzky.emails] [maletzky.emails.maletzky_email] user = [ "alexander", "maletzky", ] host = [ "risc", "jku", "at", ] [maletzky.emails.maletzky_email1] user = [ "alexander", "maletzky", ] host = [ "risc-software", "at", ] [maletzky.homepages] maletzky_homepage = "https://risc.jku.at/m/alexander-maletzky/" [mansky] name = "Susannah Mansky" [mansky.emails] [mansky.emails.mansky_email] user = [ "sjohnsn2", ] host = [ "illinois", "edu", ] [mansky.emails.mansky_email1] user = [ "susannahej", ] host = [ "gmail", "com", ] [mansky.homepages] [mantel] name = "Heiko Mantel" [mantel.emails] [mantel.emails.mantel_email] user = [ "mantel", ] host = [ "mais", "informatik", "tu-darmstadt", "de", ] [mantel.homepages] [margetson] name = "James Margetson" [margetson.emails] [margetson.homepages] [maric] name = "Ognjen Marić" [maric.emails] [maric.emails.maric_email] user = [ "ogi", "afp", ] host = [ "mynosefroze", "com", ] [maric.homepages] [maricf] name = "Filip Marić" [maricf.emails] [maricf.emails.maricf_email] user = [ "filip", ] host = [ "matf", "bg", "ac", "rs", ] [maricf.homepages] maricf_homepage = "http://www.matf.bg.ac.rs/~filip" [marmsoler] name = "Diego Marmsoler" [marmsoler.emails] [marmsoler.emails.marmsoler_email] user = [ "diego", "marmsoler", ] host = [ "tum", "de", ] [marmsoler.emails.marmsoler_email1] user = [ "d", "marmsoler", ] host = [ "exeter", "ac", "uk", ] [marmsoler.homepages] marmsoler_homepage = "http://marmsoler.com" [massacrier] name = "Tanguy Massacrier" [massacrier.emails] [massacrier.homepages] [matache] name = "Cristina Matache" [matache.emails] [matache.emails.matache_email] user = [ "cris", "matache", ] host = [ "gmail", "com", ] [matache.homepages] [mateo] name = "Adrián Doña Mateo" [mateo.emails] [mateo.emails.mateo_email] user = [ "adrian", "dona", ] host = [ "ed", "ac", "uk", ] [mateo.homepages] [matichuk] name = "Daniel Matichuk" [matichuk.emails] [matichuk.homepages] [matiyasevich] name = "Yuri Matiyasevich" [matiyasevich.emails] [matiyasevich.homepages] [maximova] name = "Alexandra Maximova" [maximova.emails] [maximova.emails.maximova_email] user = [ "amaximov", ] host = [ "student", "ethz", "ch", ] [maximova.homepages] [meis] name = "Rene Meis" [meis.emails] [meis.emails.meis_email] user = [ "rene", "meis", ] host = [ "uni-muenster", "de", ] [meis.emails.meis_email1] user = [ "rene", "meis", ] host = [ "uni-due", "de", ] [meis.homepages] [merz] name = "Stephan Merz" [merz.emails] [merz.emails.merz_email] user = [ "Stephan", "Merz", ] host = [ "loria", "fr", ] [merz.homepages] merz_homepage = "http://www.loria.fr/~merz" [messner] name = "Florian Messner" [messner.emails] [messner.emails.messner_email] user = [ "florian", "g", "messner", ] host = [ "uibk", "ac", "at", ] [messner.homepages] [mhalla] name = "Mehdi Mhalla" [mhalla.emails] [mhalla.emails.mhalla_email] user = [ "mhallam", ] host = [ "univ-grenoble-alpes", "fr", ] [mhalla.homepages] [michaelis] name = "Julius Michaelis" [michaelis.emails] [michaelis.emails.michaelis_email] user = [ "isabelleopenflow", ] host = [ "liftm", "de", ] [michaelis.emails.michaelis_email1] user = [ "maintainafpppt", ] host = [ "liftm", "de", ] [michaelis.emails.michaelis_email2] user = [ "bdd", ] host = [ "liftm", "de", ] [michaelis.emails.michaelis_email3] user = [ "afp", ] host = [ "liftm", "de", ] [michaelis.homepages] michaelis_homepage = "http://liftm.de/" [milehins] name = "Mihails Milehins" [milehins.emails] [milehins.emails.milehins_email] user = [ "mihailsmilehins", ] host = [ "gmail", "com", ] [milehins.homepages] [minamide] name = "Yasuhiko Minamide" [minamide.emails] [minamide.emails.minamide_email] user = [ "minamide", ] host = [ "is", "titech", "ac", "jp", ] [minamide.homepages] minamide_homepage = "https://sv.c.titech.ac.jp/minamide/index.en.html" [mitchell] name = "Neil Mitchell" [mitchell.emails] [mitchell.homepages] [mitsch] name = "Stefan Mitsch" [mitsch.emails] [mitsch.emails.mitsch_email] user = [ "smitsch", ] host = [ "cs", "cmu", "edu", ] [mitsch.homepages] [moedersheim] name = "Sebastian Mödersheim" [moedersheim.emails] [moedersheim.emails.moedersheim_email] user = [ "samo", ] host = [ "dtu", "dk", ] [moedersheim.homepages] moedersheim_homepage = "https://people.compute.dtu.dk/samo/" [moeller] name = "Bernhard Möller" [moeller.emails] [moeller.homepages] moeller_homepage = "https://www.informatik.uni-augsburg.de/en/chairs/dbis/pmi/staff/moeller/" [montanari] name = "Luisa Montanari" orcid = "0000-0002-5270-0290" [montanari.emails] [montanari.homepages] [mori] name = "Coraline Mori" [mori.emails] [mori.emails.mori_email] user = [ "coraline", "mori", ] host = [ "grenoble-inp", "org", ] [mori.homepages] [muendler] name = "Niels Mündler" [muendler.emails] [muendler.emails.muendler_email] user = [ "n", "muendler", ] host = [ "tum", "de", ] [muendler.homepages] [mulligan] name = "Dominic P. Mulligan" [mulligan.emails] [mulligan.emails.mulligan_email] user = [ "dominic", "p", "mulligan", ] host = [ "googlemail", "com", ] [mulligan.emails.mulligan_email1] user = [ "Dominic", "Mulligan", ] host = [ "arm", "com", ] [mulligan.homepages] [munive] name = "Jonathan Julian Huerta y Munive" [munive.emails] [munive.emails.munive_email] user = [ "jjhuertaymunive1", ] host = [ "sheffield", "ac", "uk", ] [munive.emails.munive_email1] user = [ "jonjulian23", ] host = [ "gmail", "com", ] [munive.homepages] [murao] name = "H. Murao" [murao.emails] [murao.homepages] [murray] name = "Toby Murray" [murray.emails] [murray.emails.murray_email] user = [ "toby", "murray", ] host = [ "unimelb", "edu", "au", ] [murray.homepages] murray_homepage = "https://people.eng.unimelb.edu.au/tobym/" [myreen] name = "Magnus O. Myreen" orcid = "0000-0002-9504-4107" [myreen.emails] [myreen.emails.myreen_email] user = [ "myreen", ] host = [ "chalmers", "se", ] [myreen.homepages] [nagashima] name = "Yutaka Nagashima" [nagashima.emails] [nagashima.emails.nagashima_email] user = [ "Yutaka", "Nagashima", ] host = [ "data61", "csiro", "au", ] [nagashima.homepages] [nagele] name = "Julian Nagele" [nagele.emails] [nagele.emails.nagele_email] user = [ "julian", "nagele", ] host = [ "uibk", "ac", "at", ] [nagele.homepages] [naraschewski] name = "Wolfgang Naraschewski" [naraschewski.emails] [naraschewski.homepages] [nedzelsky] name = "Michael Nedzelsky" [nedzelsky.emails] [nedzelsky.emails.nedzelsky_email] user = [ "MichaelNedzelsky", ] host = [ "yandex", "ru", ] [nedzelsky.homepages] [nemeti] name = "István Németi" [nemeti.emails] [nemeti.homepages] nemeti_homepage = "http://www.renyi.hu/~nemeti/" [nemouchi] name = "Yakoub Nemouchi" [nemouchi.emails] [nemouchi.emails.nemouchi_email] user = [ "nemouchi", ] host = [ "lri", "fr", ] [nemouchi.emails.nemouchi_email1] user = [ "yakoub", "nemouchi", ] host = [ "york", "ac", "uk", ] [nemouchi.homepages] [nestmann] name = "Uwe Nestmann" [nestmann.emails] [nestmann.homepages] nestmann_homepage = "https://www.mtv.tu-berlin.de/nestmann/" [neumann] name = "René Neumann" [neumann.emails] [neumann.emails.neumann_email] user = [ "rene", "neumann", ] host = [ "in", "tum", "de", ] [neumann.homepages] [nielsen] name = "Finn Nielsen" [nielsen.emails] [nielsen.emails.nielsen_email] user = [ "finn", "nielsen", ] host = [ "uni-muenster", "de", ] [nielsen.homepages] [nikiforov] name = "Denis Nikiforov" [nikiforov.emails] [nikiforov.emails.nikiforov_email] user = [ "denis", "nikif", ] host = [ "gmail", "com", ] [nikiforov.homepages] [nipkow] name = "Tobias Nipkow" orcid = "0000-0003-0730-515X" [nipkow.emails] [nipkow.emails.nipkow_email] user = [ "nipkow", ] host = [ "in", "tum", "de", ] [nipkow.homepages] nipkow_homepage = "https://www.in.tum.de/~nipkow/" [nishihara] name = "Toshiaki Nishihara" [nishihara.emails] [nishihara.homepages] [noce] name = "Pasquale Noce" [noce.emails] [noce.emails.noce_email] user = [ "pasquale", "noce", "lavoro", ] host = [ "gmail", "com", ] [noce.homepages] [nordhoff] name = "Benedikt Nordhoff" [nordhoff.emails] [nordhoff.emails.nordhoff_email] user = [ "b", "n", ] host = [ "wwu", "de", ] [nordhoff.emails.nordhoff_email1] user = [ "b_nord01", ] host = [ "uni-muenster", "de", ] [nordhoff.homepages] [noschinski] name = "Lars Noschinski" [noschinski.emails] [noschinski.emails.noschinski_email] user = [ "noschinl", ] host = [ "gmail", "com", ] [noschinski.homepages] noschinski_homepage = "http://www21.in.tum.de/~noschinl/" [obua] name = "Steven Obua" [obua.emails] [obua.emails.obua_email] user = [ "steven", ] host = [ "recursivemind", "com", ] [obua.homepages] [ogawa] name = "Mizuhito Ogawa" [ogawa.emails] [ogawa.homepages] [oldenburg] name = "Lennart Oldenburg" [oldenburg.emails] [oldenburg.homepages] [olm] name = "Markus Müller-Olm" [olm.emails] [olm.homepages] olm_homepage = "http://cs.uni-muenster.de/u/mmo/" [oosterhuis] name = "Roelof Oosterhuis" [oosterhuis.emails] [oosterhuis.emails.oosterhuis_email] user = [ "roelofoosterhuis", ] host = [ "gmail", "com", ] [oosterhuis.homepages] [oostrom] name = "Vincent van Oostrom" [oostrom.emails] [oostrom.homepages] [ortner] name = "Veronika Ortner" [ortner.emails] [ortner.homepages] [overbeek] name = "Roy Overbeek" [overbeek.emails] [overbeek.emails.overbeek_email] user = [ "Roy", "Overbeek", ] host = [ "cwi", "nl", ] [overbeek.homepages] [pagano] name = "Miguel Pagano" [pagano.emails] [pagano.emails.pagano_email] user = [ "miguel", "pagano", ] host = [ "unc", "edu", "ar", ] [pagano.homepages] pagano_homepage = "https://cs.famaf.unc.edu.ar/~mpagano/" [pal] name = "Abhik Pal" [pal.emails] [pal.homepages] [paleo] name = "Bruno Woltzenlogel Paleo" [paleo.emails] [paleo.homepages] paleo_homepage = "http://www.logic.at/staff/bruno/" [palmer] name = "Jake Palmer" [palmer.emails] [palmer.emails.palmer_email] user = [ "jake", "palmer", ] host = [ "ed", "ac", "uk", ] [palmer.homepages] [park] name = "Seung Hoon Park" orcid = "0000-0001-7165-6857" [park.emails] [park.emails.park_email] user = [ "seunghoon", "park", ] host = [ "cs", "ox", "ac", "uk", ] [park.homepages] park_homepage = "https://www.cs.ox.ac.uk/people/simon.park/" [parkinson] name = "Matthew Parkinson" [parkinson.emails] [parkinson.homepages] parkinson_homepage = "http://research.microsoft.com/people/mattpark/" [parrow] name = "Joachim Parrow" [parrow.emails] [parrow.emails.parrow_email] user = [ "joachim", "parrow", ] host = [ "it", "uu", "se", ] [parrow.homepages] [parsert] name = "Julian Parsert" [parsert.emails] [parsert.emails.parsert_email] user = [ "julian", "parsert", ] host = [ "gmail", "com", ] [parsert.emails.parsert_email1] user = [ "julian", "parsert", ] host = [ "uibk", "ac", "at", ] [parsert.homepages] parsert_homepage = "http://www.parsert.com/" [paulson] name = "Lawrence C. Paulson" [paulson.emails] [paulson.emails.paulson_email] user = [ "lp15", ] host = [ "cam", "ac", "uk", ] [paulson.homepages] paulson_homepage = "https://www.cl.cam.ac.uk/~lp15/" [peltier] name = "Nicolas Peltier" [peltier.emails] [peltier.emails.peltier_email] user = [ "Nicolas", "Peltier", ] host = [ "imag", "fr", ] [peltier.homepages] peltier_homepage = "http://membres-lig.imag.fr/peltier/" [peters] name = "Kirstin Peters" [peters.emails] [peters.emails.peters_email] user = [ "kirstin", "peters", ] host = [ "tu-berlin", "de", ] [peters.homepages] [petrovic] name = "Danijela Petrovic" [petrovic.emails] [petrovic.homepages] petrovic_homepage = "http://www.matf.bg.ac.rs/~danijela" [pierzchalski] name = "Edward Pierzchalski" [pierzchalski.emails] [pierzchalski.homepages] [platzer] name = "André Platzer" [platzer.emails] [platzer.emails.platzer_email] user = [ "aplatzer", ] host = [ "cs", "cmu", "edu", ] [platzer.homepages] platzer_homepage = "https://www.cs.cmu.edu/~aplatzer/" [pohjola] name = "Johannes Åman Pohjola" [pohjola.emails] [pohjola.emails.pohjola_email] user = [ "j", "amanpohjola", ] host = [ "unsw", "edu", "au", ] [pohjola.homepages] [pollak] name = "Florian Pollak" [pollak.emails] [pollak.emails.pollak_email] user = [ "florian", "pollak", ] host = [ "gmail", "com", ] [pollak.homepages] [popescu] name = "Andrei Popescu" [popescu.emails] [popescu.emails.popescu_email] user = [ "a", "popescu", ] host = [ "sheffield", "ac", "uk", ] [popescu.emails.popescu_email1] user = [ "uuomul", ] host = [ "yahoo", "com", ] [popescu.emails.popescu_email2] user = [ "a", "popescu", ] host = [ "mdx", "ac", "uk", ] [popescu.homepages] popescu_homepage = "https://www.andreipopescu.uk" [porter] name = "Benjamin Porter" [porter.emails] [porter.homepages] [prathamesh] name = "T.V.H. Prathamesh" [prathamesh.emails] [prathamesh.emails.prathamesh_email] user = [ "prathamesh", ] host = [ "imsc", "res", "in", ] [prathamesh.homepages] [preoteasa] name = "Viorel Preoteasa" [preoteasa.emails] [preoteasa.emails.preoteasa_email] user = [ "viorel", "preoteasa", ] host = [ "aalto", "fi", ] [preoteasa.homepages] preoteasa_homepage = "http://users.abo.fi/vpreotea/" [pusch] name = "Cornelia Pusch" [pusch.emails] [pusch.homepages] [qiu] name = "Qi Qiu" [qiu.emails] [qiu.emails.qiu_email] user = [ "qi", "qiu", ] host = [ "univ-lyon1", "fr", ] [qiu.homepages] [rabe] name = "Markus N. Rabe" [rabe.emails] [rabe.homepages] rabe_homepage = "http://www.react.uni-saarland.de/people/rabe.html" [rabing] name = "Mathias Schack Rabing" [rabing.emails] [rabing.emails.rabing_email] user = [ "mathiasrabing", ] host = [ "outlook", "com", ] [rabing.homepages] [raedle] name = "Jonas Rädle" [raedle.emails] [raedle.emails.raedle_email] user = [ "jonas", "raedle", ] host = [ "gmail", "com", ] [raedle.emails.raedle_email1] user = [ "jonas", "raedle", ] host = [ "tum", "de", ] [raedle.homepages] [raska] name = "Martin Raška" [raska.emails] [raska.homepages] [raszyk] name = "Martin Raszyk" [raszyk.emails] [raszyk.emails.raszyk_email] user = [ "martin", "raszyk", ] host = [ "inf", "ethz", "ch", ] [raszyk.emails.raszyk_email1] user = [ "m", "raszyk", ] host = [ "gmail", "com", ] [raszyk.homepages] [rau] name = "Martin Rau" [rau.emails] [rau.emails.rau_email] user = [ "martin", "rau", ] host = [ "tum", "de", ] [rau.emails.rau_email1] user = [ "mrtnrau", ] host = [ "googlemail", "com", ] [rau.homepages] [rauch] name = "Nicole Rauch" [rauch.emails] [rauch.emails.rauch_email] user = [ "rauch", ] host = [ "informatik", "uni-kl", "de", ] [rauch.homepages] [raumer] name = "Jakob von Raumer" [raumer.emails] [raumer.emails.raumer_email] user = [ "psxjv4", ] host = [ "nottingham", "ac", "uk", ] [raumer.homepages] [ravindran] name = "Binoy Ravindran" [ravindran.emails] [ravindran.homepages] [rawson] name = "Michael Rawson" [rawson.emails] [rawson.emails.rawson_email] user = [ "michaelrawson76", ] host = [ "gmail", "com", ] [rawson.homepages] [raya] name = "Rodrigo Raya" [raya.emails] [raya.emails.raya_email] user = [ "rodrigo", "raya", ] host = [ "epfl", "ch", ] [raya.homepages] raya_homepage = "https://people.epfl.ch/rodrigo.raya" [regensburger] name = "Franz Regensburger" [regensburger.emails] [regensburger.emails.regensburger_email] user = [ "Franz", "Regensburger", ] host = [ "thi", "de", ] [regensburger.homepages] regensburger_homepage = "https://www.thi.de/suche/mitarbeiter/prof-dr-rer-nat-franz-regensburger" [reiche] name = "Sebastian Reiche" [reiche.emails] [reiche.homepages] reiche_homepage = "https://www.linkedin.com/in/sebastian-reiche-0b2093178" [reiter] name = "Markus Reiter" [reiter.emails] [reiter.homepages] [reynaud] name = "Alban Reynaud" [reynaud.emails] [reynaud.homepages] [ribeiro] name = "Pedro Ribeiro" [ribeiro.emails] [ribeiro.homepages] [richter] name = "Stefan Richter" [richter.emails] [richter.emails.richter_email] user = [ "richter", ] host = [ "informatik", "rwth-aachen", "de", ] [richter.homepages] richter_homepage = "http://www-lti.informatik.rwth-aachen.de/~richter/" [rickmann] name = "Christina Rickmann" [rickmann.emails] [rickmann.emails.rickmann_email] user = [ "c", "rickmann", ] host = [ "tu-berlin", "de", ] [rickmann.homepages] [ridge] name = "Tom Ridge" [ridge.emails] [ridge.homepages] [rizaldi] name = "Albert Rizaldi" [rizaldi.emails] [rizaldi.emails.rizaldi_email] user = [ "albert", "rizaldi", ] host = [ "ntu", "edu", "sg", ] [rizaldi.homepages] [rizkallah] name = "Christine Rizkallah" [rizkallah.emails] [rizkallah.homepages] rizkallah_homepage = "https://www.mpi-inf.mpg.de/~crizkall/" [robillard] name = "Simon Robillard" [robillard.emails] [robillard.homepages] robillard_homepage = "https://simon-robillard.net/" [roessle] name = "Ian Roessle" [roessle.emails] [roessle.homepages] [romanos] name = "Ralph Romanos" [romanos.emails] [romanos.emails.romanos_email] user = [ "ralph", "romanos", ] host = [ "student", "ecp", "fr", ] [romanos.homepages] [rosskopf] name = "Simon Roßkopf" [rosskopf.emails] [rosskopf.emails.rosskopf_email] user = [ "rosskops", ] host = [ "in", "tum", "de", ] [rosskopf.homepages] rosskopf_homepage = "http://www21.in.tum.de/~rosskops" [rowat] name = "Colin Rowat" [rowat.emails] [rowat.emails.rowat_email] user = [ "c", "rowat", ] host = [ "bham", "ac", "uk", ] [rowat.homepages] [sabouret] name = "Nicolas Sabouret" [sabouret.emails] [sabouret.homepages] [sachtleben] name = "Robert Sachtleben" [sachtleben.emails] [sachtleben.emails.sachtleben_email] user = [ "rob_sac", ] host = [ "uni-bremen", "de", ] [sachtleben.homepages] [saile] name = "Christian Saile" [saile.emails] [saile.homepages] saile_homepage = "http://dss.in.tum.de/staff/christian-saile.html" [sanan] name = "David Sanan" [sanan.emails] [sanan.emails.sanan_email] user = [ "sanan", ] host = [ "ntu", "edu", "sg", ] [sanan.homepages] [sato] name = "Tetsuya Sato" [sato.emails] [sato.emails.sato_email] user = [ "tsato", ] host = [ "c", "titech", "ac", "jp", ] [sato.homepages] sato_homepage = "https://sites.google.com/view/tetsuyasato/" [sauer] name = "Jens Sauer" [sauer.emails] [sauer.emails.sauer_email] user = [ "sauer", ] host = [ "mais", "informatik", "tu-darmstadt", "de", ] [sauer.homepages] [schaeffeler] name = "Maximilian Schäffeler" [schaeffeler.emails] [schaeffeler.emails.schaeffeler_email] user = [ "schaeffm", ] host = [ "in", "tum", "de", ] [schaeffeler.homepages] [scharager] name = "Matias Scharager" [scharager.emails] [scharager.emails.scharager_email] user = [ "mscharag", ] host = [ "cs", "cmu", "edu", ] [scharager.homepages] [schimpf] name = "Alexander Schimpf" [schimpf.emails] [schimpf.emails.schimpf_email] user = [ "schimpfa", ] host = [ "informatik", "uni-freiburg", "de", ] [schimpf.homepages] [schirmer] name = "Norbert Schirmer" [schirmer.emails] [schirmer.emails.schirmer_email] user = [ "norbert", "schirmer", ] host = [ "web", "de", ] [schirmer.homepages] [schleicher] name = "Dierk Schleicher" [schleicher.emails] [schleicher.homepages] [schlichtkrull] name = "Anders Schlichtkrull" [schlichtkrull.emails] [schlichtkrull.emails.schlichtkrull_email] user = [ "andschl", ] host = [ "dtu", "dk", ] [schlichtkrull.homepages] schlichtkrull_homepage = "https://people.compute.dtu.dk/andschl/" [schmaltz] name = "Julien Schmaltz" [schmaltz.emails] [schmaltz.emails.schmaltz_email] user = [ "Julien", "Schmaltz", ] host = [ "ou", "nl", ] [schmaltz.homepages] [schmidinger] name = "Lukas Schmidinger" [schmidinger.emails] [schmidinger.homepages] [schmoetten] name = "Richard Schmoetten" [schmoetten.emails] [schmoetten.emails.schmoetten_email] user = [ "s1311325", ] host = [ "sms", "ed", "ac", "uk", ] [schmoetten.homepages] [schneider] name = "Joshua Schneider" [schneider.emails] [schneider.emails.schneider_email] user = [ "joshua", "schneider", ] host = [ "inf", "ethz", "ch", ] [schneider.homepages] [schoepe] name = "Daniel Schoepe" [schoepe.emails] [schoepe.emails.schoepe_email] user = [ "daniel", ] host = [ "schoepe", "org", ] [schoepe.homepages] [schoepf] name = "Jonas Schöpf" [schoepf.emails] [schoepf.emails.schoepf_email] user = [ "jonas", "schoepf", ] host = [ "uibk", "ac", "at", ] [schoepf.homepages] [schou] name = "Morten Konggaard Schou" orcid = "0000-0002-5970-4294" [schou.emails] [schou.emails.schou_email] user = [ "mksc", ] host = [ "cs", "aau", "dk", ] [schou.homepages] [schulz] name = "Jakob Schulz" [schulz.emails] [schulz.emails.schulz_email] user = [ "jakob", "schulz", ] host = [ "tum", "de", ] [schulz.homepages] [scott] name = "Dana Scott" [scott.emails] [scott.homepages] scott_homepage = "http://www.cs.cmu.edu/~scott/" [sefidgar] name = "S. Reza Sefidgar" [sefidgar.emails] [sefidgar.emails.sefidgar_email] user = [ "reza", "sefidgar", ] host = [ "inf", "ethz", "ch", ] [sefidgar.homepages] [seidl] name = "Benedikt Seidl" [seidl.emails] [seidl.emails.seidl_email] user = [ "benedikt", "seidl", ] host = [ "tum", "de", ] [seidl.homepages] [seidler] name = "Henning Seidler" [seidler.emails] [seidler.emails.seidler_email] user = [ "henning", "seidler", ] host = [ "mailbox", "tu-berlin", "de", ] [seidler.homepages] [sewell] name = "Thomas Sewell" [sewell.emails] [sewell.homepages] [sickert] name = "Salomon Sickert" [sickert.emails] [sickert.emails.sickert_email] user = [ "s", "sickert", ] host = [ "tum", "de", ] [sickert.homepages] sickert_homepage = "https://www7.in.tum.de/~sickert" [siek] name = "Jeremy Siek" [siek.emails] [siek.emails.siek_email] user = [ "jsiek", ] host = [ "indiana", "edu", ] [siek.homepages] siek_homepage = "http://homes.soic.indiana.edu/jsiek/" [simic] name = "Danijela Simić" [simic.emails] [simic.emails.simic_email] user = [ "danijela", ] host = [ "matf", "bg", "ac", "rs", ] [simic.homepages] simic_homepage = "http://poincare.matf.bg.ac.rs/~danijela" [sison] name = "Robert Sison" [sison.emails] [sison.homepages] [smaus] name = "Jan-Georg Smaus" [smaus.emails] [smaus.homepages] smaus_homepage = "http://www.irit.fr/~Jan-Georg.Smaus" [smola] name = "Filip Smola" [smola.emails] [smola.emails.smola_email] user = [ "f", "smola", ] host = [ "sms", "ed", "ac", "uk", ] [smola.homepages] [snelting] name = "Gregor Snelting" [snelting.emails] [snelting.homepages] snelting_homepage = "http://pp.info.uni-karlsruhe.de/personhp/gregor_snelting.php" [somaini] name = "Ivano Somaini" [somaini.emails] [somaini.homepages] [somogyi] name = "Dániel Somogyi" [somogyi.emails] [somogyi.homepages] [spasic] name = "Mirko Spasić" [spasic.emails] [spasic.emails.spasic_email] user = [ "mirko", ] host = [ "matf", "bg", "ac", "rs", ] [spasic.homepages] [spichkova] name = "Maria Spichkova" [spichkova.emails] [spichkova.emails.spichkova_email] user = [ "maria", "spichkova", ] host = [ "rmit", "edu", "au", ] [spichkova.homepages] [spitz] name = "Maximilian Spitz" [spitz.emails] [spitz.emails.spitz_email] user = [ "maximilian", "spitz", ] host = [ "tum", "de", ] [spitz.homepages] [sprenger] name = "Christoph Sprenger" [sprenger.emails] [sprenger.emails.sprenger_email] user = [ "sprenger", ] host = [ "inf", "ethz", "ch", ] [sprenger.homepages] [springsklee] name = "Valentin Springsklee" [springsklee.emails] [springsklee.emails.springsklee_email] user = [ "uidpn>", ] host = [ "student", "kit", "edu", ] [springsklee.homepages] [srba] name = "Jiří Srba" orcid = "0000-0001-5551-6547" [srba.emails] [srba.homepages] srba_homepage = "https://homes.cs.aau.dk/~srba/" [staats] name = "Charles Staats" [staats.emails] [staats.emails.staats_email] user = [ "cstaats", ] host = [ "google", "com", ] [staats.emails.staats_email1] user = [ "charles", "staats", "iii", ] host = [ "gmail", "com", ] [staats.homepages] [stannett] name = "Mike Stannett" [stannett.emails] [stannett.emails.stannett_email] user = [ "m", "stannett", ] host = [ "sheffield", "ac", "uk", ] [stannett.homepages] [stark] name = "Eugene W. Stark" [stark.emails] [stark.emails.stark_email] user = [ "stark", ] host = [ "cs", "stonybrook", "edu", ] [stark.homepages] [starosta] name = "Štěpán Starosta" [starosta.emails] [starosta.emails.starosta_email] user = [ "stepan", "starosta", ] host = [ "fit", "cvut", "cz", ] [starosta.homepages] starosta_homepage = "https://staroste.pages.fit/" [steen] name = "Alexander Steen" [steen.emails] [steen.homepages] [steinberg] name = "Matías Steinberg" [steinberg.emails] [steinberg.emails.steinberg_email] user = [ "matias", "steinberg", ] host = [ "mi", "unc", "edu", "ar", ] [steinberg.homepages] [stell] name = "Amy Stell" orcid = "0000-0003-0714-3269" [stell.emails] [stell.emails.stell_email] user = [ "as1343", ] host = [ "exeter", "ac", "uk", ] [stell.homepages] stell_homepage = "https://computerscience.exeter.ac.uk/staff/as1343?sm=as1343" [stephan] name = "Werner Stephan" [stephan.emails] [stephan.emails.stephan_email] user = [ "stephan", ] host = [ "dfki", "de", ] [stephan.homepages] [sternagel] name = "Christian Sternagel" [sternagel.emails] [sternagel.emails.sternagel_email] user = [ "c", "sternagel", ] host = [ "gmail", "com", ] [sternagel.emails.sternagel_email1] user = [ "christian", "sternagel", ] host = [ "uibk", "ac", "at", ] [sternagel.homepages] sternagel_homepage = "http://cl-informatik.uibk.ac.at/users/griff/" [sternagelt] name = "Thomas Sternagel" [sternagelt.emails] [sternagelt.homepages] [stevens] name = "Lukas Stevens" [stevens.emails] [stevens.emails.stevens_email] user = [ "lukas", "stevens", ] host = [ "in", "tum", "de", ] [stevens.homepages] stevens_homepage = "https://www21.in.tum.de/team/stevensl" [stock] name = "Benedikt Stock" [stock.emails] [stock.emails.stock_email] user = [ "benedikt1999", ] host = [ "freenet", "de", ] [stock.homepages] [stoeckl] name = "Bernhard Stöckl" [stoeckl.emails] [stoeckl.emails.stoeckl_email] user = [ "stoeckl", ] host = [ "in", "tum", "de", ] [stoeckl.homepages] [stricker] name = "Christian Stricker" [stricker.emails] [stricker.homepages] stricker_homepage = "http://dss.in.tum.de/staff/christian-stricker.html" [strnisa] name = "Rok Strniša" [strnisa.emails] [strnisa.emails.strnisa_email] user = [ "rok", ] host = [ "strnisa", "com", ] [strnisa.homepages] strnisa_homepage = "http://rok.strnisa.com/lj/" [struth] name = "Georg Struth" [struth.emails] [struth.emails.struth_email] user = [ "g", "struth", ] host = [ "sheffield", "ac", "uk", ] [struth.homepages] struth_homepage = "http://staffwww.dcs.shef.ac.uk/people/G.Struth/" [stueber] name = "Anke Stüber" [stueber.emails] [stueber.emails.stueber_email] user = [ "anke", "stueber", ] host = [ "campus", "tu-berlin", "de", ] [stueber.homepages] +[stuebinger] +name = "Terru Stübinger" +orcid = "0009-0006-7411-2533" + +[stuebinger.emails] + +[stuebinger.homepages] +stuebinger_homepage = "https://stuebinm.eu/" + [stuewe] name = "Daniel Stüwe" [stuewe.emails] [stuewe.homepages] [sudbrock] name = "Henning Sudbrock" [sudbrock.emails] [sudbrock.emails.sudbrock_email] user = [ "sudbrock", ] host = [ "mais", "informatik", "tu-darmstadt", "de", ] [sudbrock.homepages] [sudhof] name = "Henry Sudhof" [sudhof.emails] [sudhof.emails.sudhof_email] user = [ "hsudhof", ] host = [ "cs", "tu-berlin", "de", ] [sudhof.homepages] [sulejmani] name = "Ujkan Sulejmani" [sulejmani.emails] [sulejmani.emails.sulejmani_email] user = [ "ujkan", "sulejmani", ] host = [ "tum", "de", ] [sulejmani.emails.sulejmani_email1] user = [ "ujkan99", ] host = [ "gmail", "com", ] [sulejmani.homepages] [sutcliffe] name = "Geoff Sutcliffe" [sutcliffe.emails] [sutcliffe.homepages] [sylvestre] name = "Jeremy Sylvestre" [sylvestre.emails] [sylvestre.emails.sylvestre_email] user = [ "jeremy", "sylvestre", ] host = [ "ualberta", "ca", ] [sylvestre.emails.sylvestre_email1] user = [ "jsylvest", ] host = [ "ualberta", "ca", ] [sylvestre.homepages] sylvestre_homepage = "http://ualberta.ca/~jsylvest/" [szekely] name = "Gergely Szekely" [szekely.emails] [szekely.homepages] szekely_homepage = "https://users.renyi.hu/~turms/" [taha] name = "Safouan Taha" [taha.emails] [taha.emails.taha_email] user = [ "safouan", "taha", ] host = [ "lri", "fr", ] [taha.homepages] [tan] name = "Yong Kiam Tan" [tan.emails] [tan.emails.tan_email] user = [ "yongkiat", ] host = [ "cs", "cmu", "edu", ] [tan.homepages] tan_homepage = "https://www.cs.cmu.edu/~yongkiat/" [tanaka] name = "Miki Tanaka" [tanaka.emails] [tanaka.emails.tanaka_email] user = [ "miki", "tanaka", ] host = [ "unsw", "edu", "au", ] [tanaka.homepages] [tasch] name = "Markus Tasch" [tasch.emails] [tasch.emails.tasch_email] user = [ "tasch", ] host = [ "mais", "informatik", "tu-darmstadt", "de", ] [tasch.homepages] [taylor] name = "Ramsay G. Taylor" [taylor.emails] [taylor.emails.taylor_email] user = [ "r", "g", "taylor", ] host = [ "sheffield", "ac", "uk", ] [taylor.homepages] [terraf] name = "Pedro Sánchez Terraf" [terraf.emails] [terraf.emails.terraf_email] user = [ "psterraf", ] host = [ "unc", "edu", "ar", ] [terraf.homepages] terraf_homepage = "https://cs.famaf.unc.edu.ar/~pedro/home_en.html" [thiemann] name = "René Thiemann" [thiemann.emails] [thiemann.emails.thiemann_email] user = [ "rene", "thiemann", ] host = [ "uibk", "ac", "at", ] [thiemann.homepages] thiemann_homepage = "http://cl-informatik.uibk.ac.at/users/thiemann/" [thommes] name = "Joseph Thommes" [thommes.emails] [thommes.emails.thommes_email] user = [ "joseph-thommes", ] host = [ "gmx", "de", ] [thommes.homepages] [thomson] name = "Fox Thomson" [thomson.emails] [thomson.emails.thomson_email] user = [ "foxthomson0", ] host = [ "gmail", "com", ] [thomson.homepages] [tiu] name = "Alwen Tiu" [tiu.emails] [tiu.emails.tiu_email] user = [ "ATiu", ] host = [ "ntu", "edu", "sg", ] [tiu.homepages] tiu_homepage = "http://users.cecs.anu.edu.au/~tiu/" [toth] name = "Balazs Toth" [toth.emails] [toth.emails.toth_email] user = [ "balazs", "toth", ] host = [ "tum", "de", ] [toth.homepages] [tourret] name = "Sophie Tourret" [tourret.emails] [tourret.emails.tourret_email] user = [ "stourret", ] host = [ "mpi-inf", "mpg", "de", ] [tourret.homepages] tourret_homepage = "https://www.mpi-inf.mpg.de/departments/automation-of-logic/people/sophie-tourret/" [trachtenherz] name = "David Trachtenherz" [trachtenherz.emails] [trachtenherz.homepages] [traut] name = "Christoph Traut" [traut.emails] [traut.homepages] [traytel] name = "Dmitriy Traytel" [traytel.emails] [traytel.emails.traytel_email] user = [ "traytel", ] host = [ "in", "tum", "de", ] [traytel.emails.traytel_email1] user = [ "traytel", ] host = [ "inf", "ethz", "ch", ] [traytel.emails.traytel_email2] user = [ "traytel", ] host = [ "di", "ku", "dk", ] [traytel.homepages] traytel_homepage = "https://traytel.bitbucket.io/" [trelat] name = "Vincent Trélat" [trelat.emails] [trelat.emails.trelat_email] user = [ "vincent", "trelat", ] host = [ "depinfonancy", "net", ] [trelat.homepages] [tuerk] name = "Thomas Tuerk" [tuerk.emails] [tuerk.homepages] [tuong] name = "Frédéric Tuong" [tuong.emails] [tuong.emails.tuong_email] user = [ "tuong", ] host = [ "users", "gforge", "inria", "fr", ] [tuong.emails.tuong_email1] user = [ "ftuong", ] host = [ "lri", "fr", ] [tuong.homepages] tuong_homepage = "https://www.lri.fr/~ftuong/" [tuongj] name = "Joseph Tuong" [tuongj.emails] [tuongj.homepages] [tverdyshev] name = "Sergey Tverdyshev" [tverdyshev.emails] [tverdyshev.emails.tverdyshev_email] user = [ "stv", ] host = [ "sysgo", "com", ] [tverdyshev.homepages] [ullrich] name = "Sebastian Ullrich" [ullrich.emails] [ullrich.emails.ullrich_email] user = [ "sebasti", ] host = [ "nullri", "ch", ] [ullrich.homepages] [unruh] name = "Dominique Unruh" [unruh.emails] [unruh.emails.unruh_email] user = [ "unruh", ] host = [ "ut", "ee", ] [unruh.homepages] unruh_homepage = "https://www.ut.ee/~unruh/" [urban] name = "Christian Urban" [urban.emails] [urban.emails.urban_email] user = [ "christian", "urban", ] host = [ "kcl", "ac", "uk", ] [urban.homepages] urban_homepage = "https://nms.kcl.ac.uk/christian.urban/" [van] name = "Hai Nguyen Van" [van.emails] [van.emails.van_email] user = [ "hai", "nguyenvan", "phie", ] host = [ "gmail", "com", ] [van.homepages] [velykis] name = "Andrius Velykis" [velykis.emails] [velykis.homepages] velykis_homepage = "http://andrius.velykis.lt" [verbeek] name = "Freek Verbeek" [verbeek.emails] [verbeek.emails.verbeek_email] user = [ "Freek", "Verbeek", ] host = [ "ou", "nl", ] [verbeek.emails.verbeek_email1] user = [ "freek", ] host = [ "vt", "edu", ] [verbeek.homepages] [villadsen] name = "Jørgen Villadsen" [villadsen.emails] [villadsen.emails.villadsen_email] user = [ "jovi", ] host = [ "dtu", "dk", ] [villadsen.homepages] villadsen_homepage = "https://people.compute.dtu.dk/jovi/" [voisin] name = "Frederic Voisin" [voisin.emails] [voisin.homepages] [vytiniotis] name = "Dimitrios Vytiniotis" [vytiniotis.emails] [vytiniotis.homepages] vytiniotis_homepage = "http://research.microsoft.com/en-us/people/dimitris/" [wagner] name = "Max Wagner" [wagner.emails] [wagner.emails.wagner_email] user = [ "max", ] host = [ "trollbu", "de", ] [wagner.homepages] [waldmann] name = "Uwe Waldmann" [waldmann.emails] [waldmann.emails.waldmann_email] user = [ "waldmann", ] host = [ "mpi-inf", "mpg", "de", ] [waldmann.homepages] [wand] name = "Daniel Wand" [wand.emails] [wand.emails.wand_email] user = [ "dwand", ] host = [ "mpi-inf", "mpg", "de", ] [wand.homepages] [wang] name = "Shuling Wang" [wang.emails] [wang.homepages] [wassell] name = "Mark Wassell" [wassell.emails] [wassell.emails.wassell_email] user = [ "mpwassell", ] host = [ "gmail", "com", ] [wassell.homepages] [wasserrab] name = "Daniel Wasserrab" [wasserrab.emails] [wasserrab.homepages] wasserrab_homepage = "http://pp.info.uni-karlsruhe.de/personhp/daniel_wasserrab.php" [watt] name = "Conrad Watt" [watt.emails] [watt.emails.watt_email] user = [ "caw77", ] host = [ "cam", "ac", "uk", ] [watt.homepages] watt_homepage = "http://www.cl.cam.ac.uk/~caw77/" [weber] name = "Tjark Weber" [weber.emails] [weber.emails.weber_email] user = [ "tjark", "weber", ] host = [ "it", "uu", "se", ] [weber.homepages] weber_homepage = "http://user.it.uu.se/~tjawe125/" [weerwag] name = "Timmy Weerwag" [weerwag.emails] [weerwag.homepages] [weidner] name = "Arno Wilhelm-Weidner" [weidner.emails] [weidner.emails.weidner_email] user = [ "arno", "wilhelm-weidner", ] host = [ "tu-berlin", "de", ] [weidner.homepages] [wenninger] name = "Elias Wenninger" [wenninger.emails] [wenninger.homepages] [wenzel] name = "Makarius Wenzel" [wenzel.emails] [wenzel.emails.wenzel_email] user = [ "makarius", ] host = [ "sketis", "net", ] [wenzel.homepages] [whitley] name = "A Whitley" [whitley.emails] [whitley.emails.whitley_email] user = [ "awhitley", ] host = [ "gmail", "com", ] [whitley.homepages] [wickerson] name = "John Wickerson" [wickerson.emails] [wickerson.homepages] wickerson_homepage = "http://www.doc.ic.ac.uk/~jpw48" [willenbrink] name = "Sebastian Willenbrink" [willenbrink.emails] [willenbrink.emails.willenbrink_email] user = [ "sebastian", "willenbrink", ] host = [ "tum", "de", ] [willenbrink.homepages] [wimmer] name = "Simon Wimmer" [wimmer.emails] [wimmer.emails.wimmer_email] user = [ "simon", "wimmer", ] host = [ "tum", "de", ] [wimmer.homepages] wimmer_homepage = "http://home.in.tum.de/~wimmers/" [wirt] name = "Kai Wirt" [wirt.emails] [wirt.homepages] [wolff] name = "Burkhart Wolff" [wolff.emails] [wolff.emails.wolff_email] user = [ "burkhart", "wolff", ] host = [ "lri", "fr", ] [wolff.homepages] wolff_homepage = "https://www.lri.fr/~wolff/" [wu] name = "Chunhan Wu" [wu.emails] [wu.homepages] [xu] name = "Jian Xu" [xu.emails] [xu.homepages] [yamada] name = "Akihisa Yamada" [yamada.emails] [yamada.emails.yamada_email] user = [ "akihisa", "yamada", ] host = [ "uibk", "ac", "at", ] [yamada.emails.yamada_email1] user = [ "ayamada", ] host = [ "trs", "cm", "is", "nagoya-u", "ac", "jp", ] [yamada.emails.yamada_email2] user = [ "akihisa", "yamada", ] host = [ "aist", "go", "jp", ] [yamada.emails.yamada_email3] user = [ "akihisayamada", ] host = [ "nii", "ac", "jp", ] [yamada.homepages] yamada_homepage = "http://group-mmm.org/~ayamada/" +[yang] +name = "Jiong Yang" + +[yang.emails] + +[yang.emails.yang_email] +user = [ + "jiongyangcobe", +] +host = [ + "gmail", + "com", +] + +[yang.homepages] + [ye] name = "Lina Ye" [ye.emails] [ye.emails.ye_email] user = [ "lina", "ye", ] host = [ "lri", "fr", ] [ye.homepages] [yez] name = "Zhengkun Ye" [yez.emails] [yez.emails.yez_email] user = [ "zy307", ] host = [ "cam", "ac", "uk", ] [yez.homepages] [ying] name = "Shenggang Ying" [ying.emails] [ying.homepages] [yingm] name = "Mingsheng Ying" [yingm.emails] [yingm.homepages] [yu] name = "Lei Yu" [yu.emails] [yu.emails.yu_email] user = [ "yulei0603", ] host = [ "gmail", "com", ] [yu.homepages] [zankl] name = "Harald Zankl" [zankl.emails] [zankl.emails.zankl_email] user = [ "Harald", "Zankl", ] host = [ "uibk", "ac", "at", ] [zankl.homepages] zankl_homepage = "http://cl-informatik.uibk.ac.at/users/hzankl" [zee] name = "Karen Zee" [zee.emails] [zee.emails.zee_email] user = [ "kkz", ] host = [ "mit", "edu", ] [zee.homepages] zee_homepage = "http://www.mit.edu/~kkz/" [zeller] name = "Peter Zeller" [zeller.emails] [zeller.emails.zeller_email] user = [ "p_zeller", ] host = [ "cs", "uni-kl", "de", ] [zeller.homepages] [zeyda] name = "Frank Zeyda" [zeyda.emails] [zeyda.emails.zeyda_email] user = [ "frank", "zeyda", ] host = [ "york", "ac", "uk", ] [zeyda.homepages] [zhan] name = "Bohua Zhan" [zhan.emails] [zhan.emails.zhan_email] user = [ "bzhan", ] host = [ "ios", "ac", "cn", ] [zhan.homepages] zhan_homepage = "http://lcs.ios.ac.cn/~bzhan/" [zhang] name = "Yu Zhang" [zhang.emails] [zhang.homepages] [zhangx] name = "Xingyuan Zhang" [zhangx.emails] [zhangx.homepages] [zhann] name = "Naijun Zhan" [zhann.emails] [zhann.homepages] diff --git a/metadata/authors.toml.orig b/metadata/authors.toml.orig --- a/metadata/authors.toml.orig +++ b/metadata/authors.toml.orig @@ -1,7629 +1,7656 @@ [abdulaziz] name = "Mohammad Abdulaziz" [abdulaziz.emails] [abdulaziz.emails.abdulaziz_email] user = [ "mohammad", "abdulaziz", ] host = [ "in", "tum", "de", ] [abdulaziz.emails.abdulaziz_email1] user = [ "mohammad", "abdulaziz8", ] host = [ "gmail", "com", ] [abdulaziz.homepages] abdulaziz_homepage = "http://home.in.tum.de/~mansour/" [adelsberger] name = "Stephan Adelsberger" [adelsberger.emails] [adelsberger.emails.adelsberger_email] user = [ "stvienna", ] host = [ "gmail", "com", ] [adelsberger.homepages] adelsberger_homepage = "http://nm.wu.ac.at/nm/sadelsbe" [aehlig] name = "Klaus Aehlig" [aehlig.emails] [aehlig.homepages] aehlig_homepage = "http://www.linta.de/~aehlig/" [aissat] name = "Romain Aissat" [aissat.emails] [aissat.homepages] [amani] name = "Sidney Amani" [amani.emails] [amani.emails.amani_email] user = [ "sidney", "amani", ] host = [ "data61", "csiro", "au", ] [amani.homepages] [ammer] name = "Thomas Ammer" [ammer.emails] [ammer.emails.ammer_email] user = [ "thomas", "ammer", ] host = [ "tum", "de", ] [ammer.homepages] [andreka] name = "Hajnal Andreka" [andreka.emails] [andreka.homepages] andreka_homepage = "https://renyi.hu/en/researchers/hajnal-andreka" [andronick] name = "June Andronick" [andronick.emails] [andronick.homepages] [aransay] name = "Jesús Aransay" [aransay.emails] [aransay.emails.aransay_email] user = [ "jesus-maria", "aransay", ] host = [ "unirioja", "es", ] [aransay.homepages] aransay_homepage = "https://www.unirioja.es/cu/jearansa" [argyraki] name = "Angeliki Koutsoukou-Argyraki" [argyraki.emails] [argyraki.emails.argyraki_email] user = [ "ak2110", ] host = [ "cam", "ac", "uk", ] [argyraki.homepages] argyraki_homepage = "https://www.cl.cam.ac.uk/~ak2110/" argyraki_homepage2 = "https://www.cst.cam.ac.uk/people/ak2110" [armstrong] name = "Alasdair Armstrong" [armstrong.emails] [armstrong.homepages] [aspinall] name = "David Aspinall" [aspinall.emails] [aspinall.homepages] aspinall_homepage = "http://homepages.inf.ed.ac.uk/da/" [ausaf] name = "Fahad Ausaf" [ausaf.emails] [ausaf.homepages] ausaf_homepage = "http://kcl.academia.edu/FahadAusaf" [avigad] name = "Jeremy Avigad" [avigad.emails] [avigad.emails.avigad_email] user = [ "avigad", ] host = [ "cmu", "edu", ] [avigad.homepages] avigad_homepage = "http://www.andrew.cmu.edu/user/avigad/" [back] name = "Ralph-Johan Back" [back.emails] [back.homepages] back_homepage = "http://users.abo.fi/Ralph-Johan.Back/" [baksys] name = "Mantas Bakšys" [baksys.emails] [baksys.emails.baksys_email] user = [ "mb2412", ] host = [ "cam", "ac", "uk", ] [baksys.homepages] baksys_homepage = "https://github.com/MantasBaksys" [balbach] name = "Frank J. Balbach" [balbach.emails] [balbach.emails.balbach_email] user = [ "frank-balbach", ] host = [ "gmx", "de", ] [balbach.homepages] [ballarin] name = "Clemens Ballarin" [ballarin.emails] [ballarin.emails.ballarin_email] user = [ "ballarin", ] host = [ "in", "tum", "de", ] [ballarin.homepages] ballarin_homepage = "http://www21.in.tum.de/~ballarin/" [ballenghien] name = "Benoît Ballenghien" [ballenghien.emails] [ballenghien.emails.ballenghien_email] user = [ "benoit", "ballenghien", ] host = [ "universite-paris-saclay", "fr", ] [ballenghien.homepages] [barsotti] name = "Damián Barsotti" [barsotti.emails] [barsotti.homepages] barsotti_homepage = "http://www.cs.famaf.unc.edu.ar/~damian/" [bauer] name = "Gertrud Bauer" [bauer.emails] [bauer.homepages] [bauereiss] name = "Thomas Bauereiss" [bauereiss.emails] [bauereiss.emails.bauereiss_email] user = [ "thomas", ] host = [ "bauereiss", "name", ] [bauereiss.homepages] [bayer] name = "Jonas Bayer" [bayer.emails] [bayer.emails.bayer_email] user = [ "jonas", "bayer999", ] host = [ "gmail", "com", ] [bayer.homepages] [becker] name = "Heiko Becker" [becker.emails] [becker.emails.becker_email] user = [ "hbecker", ] host = [ "mpi-sws", "org", ] [becker.homepages] [beeren] name = "Joel Beeren" [beeren.emails] [beeren.homepages] [bella] name = "Giampaolo Bella" [bella.emails] [bella.emails.bella_email] user = [ "giamp", ] host = [ "dmi", "unict", "it", ] [bella.homepages] bella_homepage = "http://www.dmi.unict.it/~giamp/" [bengtson] name = "Jesper Bengtson" [bengtson.emails] [bengtson.homepages] bengtson_homepage = "http://www.itu.dk/people/jebe" [bentkamp] name = "Alexander Bentkamp" [bentkamp.emails] [bentkamp.emails.bentkamp_email] user = [ "bentkamp", ] host = [ "gmail", "com", ] [bentkamp.emails.bentkamp_email1] user = [ "a", "bentkamp", ] host = [ "vu", "nl", ] [bentkamp.homepages] bentkamp_homepage = "https://www.cs.vu.nl/~abp290/" [benzmueller] name = "Christoph Benzmüller" [benzmueller.emails] [benzmueller.emails.benzmueller_email] user = [ "c", "benzmueller", ] host = [ "gmail", "com", ] [benzmueller.emails.benzmueller_email1] user = [ "c", "benzmueller", ] host = [ "fu-berlin", "de", ] [benzmueller.homepages] benzmueller_homepage = "http://christoph-benzmueller.de" benzmueller_homepage1 = "http://page.mi.fu-berlin.de/cbenzmueller/" [beresford] name = "Alastair R. Beresford" [beresford.emails] [beresford.emails.beresford_email] user = [ "arb33", ] host = [ "cam", "ac", "uk", ] [beresford.homepages] [berghofer] name = "Stefan Berghofer" [berghofer.emails] [berghofer.emails.berghofer_email] user = [ "berghofe", ] host = [ "in", "tum", "de", ] [berghofer.homepages] berghofer_homepage = "http://www.in.tum.de/~berghofe" [bergstroem] name = "Axel Bergström" [bergstroem.emails] [bergstroem.emails.bergstroem_email] user = [ "axel", "bergstrom00", ] host = [ "gmail", "com", ] [bergstroem.homepages] [beringer] name = "Lennart Beringer" [beringer.emails] [beringer.emails.beringer_email] user = [ "lennart", "beringer", ] host = [ "ifi", "lmu", "de", ] [beringer.homepages] [bharadwaj] name = "Abhijith Bharadwaj" [bharadwaj.emails] [bharadwaj.homepages] [bhatt] name = "Bhargav Bhatt" [bhatt.emails] [bhatt.emails.bhatt_email] user = [ "bhargav", "bhatt", ] host = [ "inf", "ethz", "ch", ] [bhatt.homepages] [biendarra] name = "Julian Biendarra" [biendarra.emails] [biendarra.homepages] [bisping] name = "Benjamin Bisping" orcid = "0000-0002-0637-0171" [bisping.emails] [bisping.emails.bisping_email] user = [ "benjamin", "bisping", ] host = [ "tu-berlin", "de", ] [bisping.homepages] bisping_homepage = "https://bbisping.de" [blanchette] name = "Jasmin Christian Blanchette" [blanchette.emails] [blanchette.emails.blanchette_email] user = [ "jasmin", "blanchette", ] host = [ "gmail", "com", ] [blanchette.emails.blanchette_email1] user = [ "j", "c", "blanchette", ] host = [ "vu", "nl", ] [blanchette.homepages] blanchette_homepage = "http://www21.in.tum.de/~blanchet" blanchette_homepage1 = "https://www.cs.vu.nl/~jbe248/" [blasum] name = "Holger Blasum" [blasum.emails] [blasum.emails.blasum_email] user = [ "holger", "blasum", ] host = [ "sysgo", "com", ] [blasum.homepages] [blumson] name = "Ben Blumson" [blumson.emails] [blumson.emails.blumson_email] user = [ "benblumson", ] host = [ "gmail", "com", ] [blumson.homepages] blumson_homepage = "https://philpeople.org/profiles/ben-blumson" [bockenek] name = "Joshua Bockenek" [bockenek.emails] [bockenek.homepages] [boehme] name = "Sascha Böhme" [boehme.emails] [boehme.emails.boehme_email] user = [ "boehmes", ] host = [ "in", "tum", "de", ] [boehme.homepages] boehme_homepage = "http://www21.in.tum.de/~boehmes/" [bohrer] name = "Rose Bohrer" [bohrer.emails] [bohrer.emails.bohrer_email] user = [ "rose", "bohrer", "cs", ] host = [ "gmail", "com", ] [bohrer.homepages] [bootle] name = "Jonathan Bootle" [bootle.emails] [bootle.emails.bootle_email] user = [ "JBT", ] host = [ "zurich", "ibm", "com", ] [bootle.homepages] [bordg] name = "Anthony Bordg" [bordg.emails] [bordg.emails.bordg_email] user = [ "apdb3", ] host = [ "cam", "ac", "uk", ] [bordg.homepages] bordg_homepage = "https://sites.google.com/site/anthonybordg/" [borgstroem] name = "Johannes Borgström" [borgstroem.emails] [borgstroem.emails.borgstroem_email] user = [ "johannes", "borgstrom", ] host = [ "it", "uu", "se", ] [borgstroem.homepages] [bortin] name = "Maksym Bortin" [bortin.emails] [bortin.emails.bortin_email] user = [ "maksym", "bortin", ] host = [ "nicta", "com", "au", ] [bortin.emails.bortin_email1] user = [ "mbortin", ] host = [ "gmail", "com", ] [bortin.homepages] [bottesch] name = "Ralph Bottesch" [bottesch.emails] [bottesch.emails.bottesch_email] user = [ "ralph", "bottesch", ] host = [ "uibk", "ac", "at", ] [bottesch.homepages] bottesch_homepage = "http://cl-informatik.uibk.ac.at/users/bottesch/" [boulanger] name = "Frédéric Boulanger" [boulanger.emails] [boulanger.emails.boulanger_email] user = [ "frederic", "boulanger", ] host = [ "centralesupelec", "fr", ] [boulanger.homepages] [bourke] name = "Timothy Bourke" [bourke.emails] [bourke.emails.bourke_email] user = [ "tim", ] host = [ "tbrk", "org", ] [bourke.homepages] bourke_homepage = "http://www.tbrk.org" [boutry] name = "Pierre Boutry" [boutry.emails] [boutry.emails.boutry_email] user = [ "boutry", ] host = [ "unistra", "fr", ] [boutry.homepages] [boyton] name = "Andrew Boyton" [boyton.emails] [boyton.emails.boyton_email] user = [ "andrew", "boyton", ] host = [ "nicta", "com", "au", ] [boyton.homepages] [bracevac] name = "Oliver Bračevac" [bracevac.emails] [bracevac.emails.bracevac_email] user = [ "bracevac", ] host = [ "st", "informatik", "tu-darmstadt", "de", ] [bracevac.homepages] [brandt] name = "Felix Brandt" [brandt.emails] [brandt.homepages] brandt_homepage = "http://dss.in.tum.de/staff/brandt.html" [breitner] name = "Joachim Breitner" [breitner.emails] [breitner.emails.breitner_email] user = [ "mail", ] host = [ "joachim-breitner", "de", ] [breitner.emails.breitner_email1] user = [ "joachim", ] host = [ "cis", "upenn", "edu", ] [breitner.homepages] breitner_homepage = "http://pp.ipd.kit.edu/~breitner" [brien] name = "Nicolas Robinson-O'Brien" [brien.emails] [brien.homepages] [brinkop] name = "Hauke Brinkop" [brinkop.emails] [brinkop.emails.brinkop_email] user = [ "hauke", "brinkop", ] host = [ "googlemail", "com", ] [brinkop.homepages] [brodmann] name = "Paul-David Brodmann" [brodmann.emails] [brodmann.emails.brodmann_email] user = [ "p", "brodmann", ] host = [ "tu-berlin", "de", ] [brodmann.homepages] [brucker] name = "Achim D. Brucker" [brucker.emails] [brucker.emails.brucker_email] user = [ "a", "brucker", ] host = [ "exeter", "ac", "uk", ] [brucker.emails.brucker_email2] user = [ "adbrucker", ] host = [ "0x5f", "org", ] [brucker.homepages] brucker_homepage = "https://www.brucker.ch/" [bruegger] name = "Lukas Brügger" [bruegger.emails] [bruegger.emails.bruegger_email] user = [ "lukas", "a", "bruegger", ] host = [ "gmail", "com", ] [bruegger.homepages] [brun] name = "Matthias Brun" [brun.emails] [brun.emails.brun_email] user = [ "matthias", "brun", ] host = [ "inf", "ethz", "ch", ] [brun.homepages] [brunner] name = "Julian Brunner" [brunner.emails] [brunner.emails.brunner_email] user = [ "brunnerj", ] host = [ "in", "tum", "de", ] [brunner.homepages] brunner_homepage = "http://www21.in.tum.de/~brunnerj/" [bulwahn] name = "Lukas Bulwahn" [bulwahn.emails] [bulwahn.emails.bulwahn_email] user = [ "lukas", "bulwahn", ] host = [ "gmail", "com", ] [bulwahn.homepages] [buss] name = "Sebastián Buss" [buss.emails] [buss.emails.buss_email] user = [ "sbuss94", ] host = [ "gmail", "com", ] [buss.homepages] [butler] name = "David Butler" [butler.emails] [butler.emails.butler_email] user = [ "dbutler", ] host = [ "turing", "ac", "uk", ] [butler.homepages] butler_homepage = "https://www.turing.ac.uk/people/doctoral-students/david-butler" [buyse] name = "Maxime Buyse" [buyse.emails] [buyse.emails.buyse_email] user = [ "maxime", "buyse", ] host = [ "polytechnique", "edu", ] [buyse.homepages] [caballero] name = "José Manuel Rodríguez Caballero" [caballero.emails] [caballero.emails.caballero_email] user = [ "jose", "manuel", "rodriguez", "caballero", ] host = [ "ut", "ee", ] [caballero.homepages] caballero_homepage = "https://josephcmac.github.io/" [calk] name = "Cameron Calk" [calk.emails] [calk.homepages] [caminati] name = "Marco B. Caminati" [caminati.emails] [caminati.homepages] [campo] name = "Alejandro del Campo" [campo.emails] [campo.emails.campo_email] user = [ "alejandro", "del-campo", ] host = [ "alum", "unirioja", "es", ] [campo.homepages] [chaieb] name = "Amine Chaieb" [chaieb.emails] [chaieb.homepages] [chapman] name = "Peter Chapman" [chapman.emails] [chapman.emails.chapman_email] user = [ "pc", ] host = [ "cs", "st-andrews", "ac", "uk", ] [chapman.homepages] [chen] name = "L. Chen" [chen.emails] [chen.homepages] +[chenj] +name = "Jamie Chen" +orcid = "0009-0008-5396-6059" + +[chenj.emails] + +[chenj.emails.chenj_email] +user = [ + "jamiechen", +] +host = [ + "tutanota", + "com", +] + +[chenj.homepages] +chenj_homepage = "https://gitlab.com/Jamie-Chen" + [chevalier] name = "Loïc Chevalier" [chevalier.emails] [chevalier.homepages] [christfort] name = "Axel Christfort" [christfort.emails] [christfort.emails.christfort_email] user = [ "axel", ] host = [ "di", "ku", "dk", ] [christfort.homepages] [clouston] name = "Ranald Clouston" [clouston.emails] [clouston.emails.clouston_email] user = [ "ranald", "clouston", ] host = [ "cs", "au", "dk", ] [clouston.homepages] [cock] name = "David Cock" [cock.emails] [cock.emails.cock_email] user = [ "david", "cock", ] host = [ "nicta", "com", "au", ] [cock.homepages] [coghetto] name = "Roland Coghetto" [coghetto.emails] [coghetto.emails.coghetto_email] user = [ "roland_coghetto", ] host = [ "hotmail", "com", ] [coghetto.homepages] [coglio] name = "Alessandro Coglio" [coglio.emails] [coglio.emails.coglio_email] user = [ "coglio", ] host = [ "kestrel", "edu", ] [coglio.homepages] coglio_homepage = "http://www.kestrel.edu/~coglio" [cohen] name = "Ernie Cohen" [cohen.emails] [cohen.emails.cohen_email] user = [ "ecohen", ] host = [ "amazon", "com", ] [cohen.homepages] [cordwell] name = "Katherine Kosaian" [cordwell.emails] [cordwell.emails.cordwell_email] user = [ "kcordwel", ] host = [ "cs", "cmu", "edu", ] [cordwell.homepages] cordwell_homepage = "https://www.cs.cmu.edu/~kcordwel/" [cousin] name = "Marie Cousin" [cousin.emails] [cousin.emails.cousin_email] user = [ "marie", "cousin", ] host = [ "grenoble-inp", "org", ] [cousin.homepages] [cremer] name = "Nils Cremer" [cremer.emails] [cremer.emails.cremer_email] user = [ "nils", "cremer", ] host = [ "tum", "de", ] [cremer.homepages] [crighton] name = "Aaron Crighton" [crighton.emails] [crighton.emails.crighton_email] user = [ "crightoa", ] host = [ "mcmaster", "ca", ] [crighton.homepages] [dalvit] name = "Christian Dalvit" [dalvit.emails] [dalvit.emails.dalvit_email] user = [ "chris", "dalvit", ] host = [ "gmail", "com", ] [dalvit.homepages] [danilkin] name = "Anton Danilkin" [danilkin.emails] [danilkin.emails.danilkin_email] user = [ "anton", "danilkin", ] host = [ "ens", "psl", "eu", ] [danilkin.homepages] [dardinier] name = "Thibault Dardinier" [dardinier.emails] [dardinier.emails.dardinier_email] user = [ "thibault", "dardinier", ] host = [ "inf", "ethz", "ch", ] [dardinier.homepages] dardinier_homepage = "https://dardinier.me/" [david] name = "Marco David" [david.emails] [david.emails.david_email] user = [ "marco", "david", ] host = [ "hotmail", "de", ] [david.homepages] [debois] name = "Søren Debois" [debois.emails] [debois.homepages] [debrat] name = "Henri Debrat" [debrat.emails] [debrat.emails.debrat_email] user = [ "henri", "debrat", ] host = [ "loria", "fr", ] [debrat.homepages] [decova] name = "Sára Decova" [decova.emails] [decova.homepages] [delemazure] name = "Théo Delemazure" [delemazure.emails] [delemazure.homepages] delemazure_homepage = "https://theo.delemazure.fr/" [demeulemeester] name = "Tom Demeulemeester" [demeulemeester.emails] [demeulemeester.homepages] demeulemeester_homepage = "https://www.kuleuven.be/wieiswie/en/person/00131528" [derrick] name = "John Derrick" [derrick.emails] [derrick.emails.derrick_email] user = [ "j", "derrick", ] host = [ "sheffield", "ac", "uk", ] [derrick.homepages] [desharnais] name = "Martin Desharnais" [desharnais.emails] [desharnais.emails.desharnais_email] user = [ "martin", "desharnais", ] host = [ "unibw", "de", ] [desharnais.emails.desharnais_email1] user = [ "desharnais", ] host = [ "mpi-inf", "mpg", "de", ] [desharnais.homepages] desharnais_homepage = "https://martin.desharnais.me" [diaz] name = "Javier Díaz" [diaz.emails] [diaz.emails.diaz_email] user = [ "javier", "diaz", "manzi", ] host = [ "gmail", "com", ] [diaz.homepages] [diekmann] name = "Cornelius Diekmann" [diekmann.emails] [diekmann.emails.diekmann_email] user = [ "diekmann", ] host = [ "net", "in", "tum", "de", ] [diekmann.homepages] diekmann_homepage = "http://net.in.tum.de/~diekmann" [dirix] name = "Stefan Dirix" [dirix.emails] [dirix.homepages] [dittmann] name = "Christoph Dittmann" [dittmann.emails] [dittmann.emails.dittmann_email] user = [ "isabelle", ] host = [ "christoph-d", "de", ] [dittmann.homepages] dittmann_homepage = "http://logic.las.tu-berlin.de/Members/Dittmann/" [divason] name = "Jose Divasón" [divason.emails] [divason.emails.divason_email] user = [ "jose", "divason", ] host = [ "unirioja", "es", ] [divason.homepages] divason_homepage = "https://www.unirioja.es/cu/jodivaso/" [doczkal] name = "Christian Doczkal" [doczkal.emails] [doczkal.emails.doczkal_email] user = [ "doczkal", ] host = [ "ps", "uni-saarland", "de", ] [doczkal.homepages] [dongol] name = "Brijesh Dongol" [dongol.emails] [dongol.emails.dongol_email] user = [ "brijesh", "dongol", ] host = [ "brunel", "ac", "uk", ] [dongol.homepages] [doty] name = "Matthew Doty" [doty.emails] [doty.emails.doty_email] user = [ "matt", ] host = [ "w-d", "org", ] [doty.homepages] [dubut] name = "Jérémy Dubut" [dubut.emails] [dubut.emails.dubut_email] user = [ "dubut", ] host = [ "nii", "ac", "jp", ] [dubut.emails.dubut_email1] user = [ "jeremy", "dubut", ] host = [ "aist", "go", "jp", ] [dubut.homepages] dubut_homepage = "http://group-mmm.org/~dubut/" [dunaev] name = "Georgy Dunaev" [dunaev.emails] [dunaev.emails.dunaev_email] user = [ "georgedunaev", ] host = [ "gmail", "com", ] [dunaev.homepages] [dyckhoff] name = "Roy Dyckhoff" [dyckhoff.emails] [dyckhoff.homepages] dyckhoff_homepage = "https://rd.host.cs.st-andrews.ac.uk" [eberl] name = "Manuel Eberl" orcid = "0000-0002-4263-6571" [eberl.emails] [eberl.emails.eberl_email] user = [ "manuel", ] host = [ "pruvisto", "org", ] [eberl.emails.eberl_email1] user = [ "manuel", "eberl", ] host = [ "tum", "de", ] [eberl.emails.eberl_email2] user = [ "manuel", "eberl", ] host = [ "uibk", "ac", "at", ] [eberl.homepages] eberl_homepage = "https://pruvisto.org/" eberl_homepage2 = "https://www.in.tum.de/~eberlm" [echenim] name = "Mnacho Echenim" [echenim.emails] [echenim.emails.echenim_email] user = [ "mnacho", "echenim", ] host = [ "univ-grenoble-alpes", "fr", ] [echenim.homepages] echenim_homepage = "https://lig-membres.imag.fr/mechenim/" [edmonds] name = "Chelsea Edmonds" [edmonds.emails] [edmonds.emails.edmonds_email] user = [ "cle47", ] host = [ "cam", "ac", "uk", ] [edmonds.homepages] edmonds_homepage = "https://www.cst.cam.ac.uk/people/cle47" [engelhardt] name = "Kai Engelhardt" [engelhardt.emails] [engelhardt.homepages] [eriksson] name = "Lars-Henrik Eriksson" [eriksson.emails] [eriksson.emails.eriksson_email] user = [ "lhe", ] host = [ "it", "uu", "se", ] [eriksson.homepages] [esparza] name = "Javier Esparza" [esparza.emails] [esparza.homepages] esparza_homepage = "https://www7.in.tum.de/~esparza/" [essmann] name = "Robin Eßmann" [essmann.emails] [essmann.emails.essmann_email] user = [ "robin", "essmann", ] host = [ "tum", "de", ] [essmann.homepages] [felgenhauer] name = "Bertram Felgenhauer" [felgenhauer.emails] [felgenhauer.emails.felgenhauer_email] user = [ "bertram", "felgenhauer", ] host = [ "uibk", "ac", "at", ] [felgenhauer.emails.felgenhauer_email1] user = [ "int-e", ] host = [ "gmx", "de", ] [felgenhauer.homepages] [feliachi] name = "Abderrahmane Feliachi" [feliachi.emails] [feliachi.emails.feliachi_email] user = [ "abderrahmane", "feliachi", ] host = [ "lri", "fr", ] [feliachi.homepages] [fell] name = "Julian Fell" [fell.emails] [fell.emails.fell_email] user = [ "julian", "fell", ] host = [ "uq", "net", "au", ] [fell.homepages] [fernandez] name = "Matthew Fernandez" [fernandez.emails] [fernandez.homepages] [fiedler] name = "Ben Fiedler" [fiedler.emails] [fiedler.emails.fiedler_email] user = [ "ben", "fiedler", ] host = [ "inf", "ethz", "ch", ] [fiedler.homepages] [fleuriot] name = "Jacques D. Fleuriot" [fleuriot.emails] [fleuriot.emails.fleuriot_email] user = [ "Jacques", "Fleuriot", ] host = [ "ed", "ac", "uk", ] [fleuriot.emails.fleuriot_email1] user = [ "jdf", ] host = [ "ed", "ac", "uk", ] [fleuriot.homepages] fleuriot_homepage = "https://www.inf.ed.ac.uk/people/staff/Jacques_Fleuriot.html" [fleury] name = "Mathias Fleury" [fleury.emails] [fleury.emails.fleury_email] user = [ "fleury", ] host = [ "mpi-inf", "mpg", "de", ] [fleury.emails.fleury_email1] user = [ "mathias", "fleury", ] host = [ "jku", "at", ] [fleury.homepages] fleury_homepage = "http://fmv.jku.at/fleury" [foster] name = "Michael Foster" [foster.emails] [foster.emails.foster_email] user = [ "m", "foster", ] host = [ "sheffield", "ac", "uk", ] [foster.homepages] [fosterj] name = "J. Nathan Foster" [fosterj.emails] [fosterj.homepages] fosterj_homepage = "http://www.cs.cornell.edu/~jnfoster/" [fosters] name = "Simon Foster" [fosters.emails] [fosters.emails.fosters_email] user = [ "simon", "foster", ] host = [ "york", "ac", "uk", ] [fosters.homepages] fosters_homepage = "https://www-users.cs.york.ac.uk/~simonf/" [fouillard] name = "Valentin Fouillard" [fouillard.emails] [fouillard.emails.fouillard_email] user = [ "valentin", "fouillard", ] host = [ "limsi", "fr", ] [fouillard.homepages] [friedrich] name = "Stefan Friedrich" [friedrich.emails] [friedrich.homepages] [from] name = "Asta Halkjær From" [from.emails] [from.emails.from_email] user = [ "ahfrom", ] host = [ "dtu", "dk", ] [from.homepages] from_homepage = "https://people.compute.dtu.dk/ahfrom/" [fuenmayor] name = "David Fuenmayor" [fuenmayor.emails] [fuenmayor.emails.fuenmayor_email] user = [ "davfuenmayor", ] host = [ "gmail", "com", ] [fuenmayor.homepages] [furusawa] name = "Hitoshi Furusawa" [furusawa.emails] [furusawa.homepages] furusawa_homepage = "http://www.sci.kagoshima-u.ac.jp/~furusawa/" [gammie] name = "Peter Gammie" [gammie.emails] [gammie.emails.gammie_email] user = [ "peteg42", ] host = [ "gmail", "com", ] [gammie.homepages] gammie_homepage = "http://peteg.org" [gao] name = "Xin Gao" [gao.emails] [gao.homepages] [garvia] name = "Azucena Garvia" [garvia.emails] [garvia.emails.garvia_email] user = [ "zucegb", ] host = [ "gmail", "com", ] [garvia.homepages] [gaudel] name = "Marie-Claude Gaudel" [gaudel.emails] [gaudel.emails.gaudel_email] user = [ "mcg", ] host = [ "lri", "fr", ] [gaudel.homepages] [gay] name = "Richard Gay" [gay.emails] [gay.emails.gay_email] user = [ "gay", ] host = [ "mais", "informatik", "tu-darmstadt", "de", ] [gay.homepages] [georgescu] name = "George Georgescu" [georgescu.emails] [georgescu.homepages] [gheri] name = "Lorenzo Gheri" [gheri.emails] [gheri.emails.gheri_email] user = [ "lor", "gheri", ] host = [ "gmail", "com", ] [gheri.homepages] [ghourabi] name = "Fadoua Ghourabi" [ghourabi.emails] [ghourabi.emails.ghourabi_email] user = [ "fadouaghourabi", ] host = [ "gmail", "com", ] [ghourabi.homepages] [gioiosa] name = "Gianpaolo Gioiosa" [gioiosa.emails] [gioiosa.homepages] [glabbeek] name = "Rob van Glabbeek" [glabbeek.emails] [glabbeek.homepages] glabbeek_homepage = "http://theory.stanford.edu/~rvg/" [gomes] name = "Victor B. F. Gomes" [gomes.emails] [gomes.emails.gomes_email] user = [ "victor", "gomes", ] host = [ "cl", "cam", "ac", "uk", ] [gomes.emails.gomes_email2] user = [ "victorborgesfg", ] host = [ "gmail", "com", ] [gomes.emails.gomes_email4] user = [ "vborgesferreiragomes1", ] host = [ "sheffield", "ac", "uk", ] [gomes.homepages] gomes_homepage = "http://www.dcs.shef.ac.uk/~victor" [gonzalez] name = "Edgar Gonzàlez" orcid = "0000-0002-9169-0769" [gonzalez.emails] [gonzalez.emails.gonzalez_email] user = [ "edgargip", ] host = [ "google", "com", ] [gonzalez.homepages] [gore] name = "Rajeev Gore" [gore.emails] [gore.emails.gore_email] user = [ "rajeev", "gore", ] host = [ "anu", "edu", "au", ] [gore.homepages] [gouezel] name = "Sebastien Gouezel" [gouezel.emails] [gouezel.emails.gouezel_email] user = [ "sebastien", "gouezel", ] host = [ "univ-rennes1", "fr", ] [gouezel.homepages] gouezel_homepage = "http://www.math.sciences.univ-nantes.fr/~gouezel/" [grechuk] name = "Bogdan Grechuk" [grechuk.emails] [grechuk.emails.grechuk_email] user = [ "grechukbogdan", ] host = [ "yandex", "ru", ] [grechuk.homepages] [grewe] name = "Sylvia Grewe" [grewe.emails] [grewe.emails.grewe_email] user = [ "grewe", ] host = [ "cs", "tu-darmstadt", "de", ] [grewe.homepages] [griebel] name = "Simon Griebel" [griebel.emails] [griebel.emails.griebel_email] user = [ "s", "griebel", ] host = [ "tum", "de", ] [griebel.homepages] [grov] name = "Gudmund Grov" [grov.emails] [grov.emails.grov_email] user = [ "ggrov", ] host = [ "inf", "ed", "ac", "uk", ] [grov.homepages] grov_homepage = "http://homepages.inf.ed.ac.uk/ggrov" [guerraoui] name = "Rachid Guerraoui" [guerraoui.emails] [guerraoui.emails.guerraoui_email] user = [ "rachid", "guerraoui", ] host = [ "epfl", "ch", ] [guerraoui.homepages] [guiol] name = "Hervé Guiol" [guiol.emails] [guiol.emails.guiol_email] user = [ "herve", "guiol", ] host = [ "univ-grenoble-alpes", "fr", ] [guiol.homepages] [gunther] name = "Emmanuel Gunther" [gunther.emails] [gunther.emails.gunther_email] user = [ "gunther", ] host = [ "famaf", "unc", "edu", "ar", ] [gunther.homepages] [gutkovas] name = "Ramunas Gutkovas" [gutkovas.emails] [gutkovas.emails.gutkovas_email] user = [ "ramunas", "gutkovas", ] host = [ "it", "uu", "se", ] [gutkovas.homepages] [guttmann] name = "Walter Guttmann" [guttmann.emails] [guttmann.emails.guttmann_email] user = [ "walter", "guttmann", ] host = [ "canterbury", "ac", "nz", ] [guttmann.homepages] guttmann_homepage = "https://www.cosc.canterbury.ac.nz/walter.guttmann/" [guzman] name = "Laura P. Gamboa Guzman" [guzman.emails] [guzman.emails.guzman_email] user = [ "lpgamboa", ] host = [ "iastate", "edu", ] [guzman.homepages] guzman_homepage = "https://sites.google.com/view/lpgamboa/home" [haftmann] name = "Florian Haftmann" [haftmann.emails] [haftmann.emails.haftmann_email] user = [ "florian", "haftmann", ] host = [ "informatik", "tu-muenchen", "de", ] [haftmann.homepages] haftmann_homepage = "http://isabelle.in.tum.de/~haftmann" [haslbeck] name = "Max W. Haslbeck" [haslbeck.emails] [haslbeck.emails.haslbeck_email] user = [ "maximilian", "haslbeck", ] host = [ "uibk", "ac", "at", ] [haslbeck.emails.haslbeck_email1] user = [ "haslbecm", ] host = [ "in", "tum", "de", ] [haslbeck.emails.haslbeck_email2] user = [ "max", "haslbeck", ] host = [ "gmx", "de", ] [haslbeck.homepages] haslbeck_homepage = "http://cl-informatik.uibk.ac.at/users/mhaslbeck/" [haslbeckm] name = "Maximilian P. L. Haslbeck" [haslbeckm.emails] [haslbeckm.emails.haslbeckm_email] user = [ "haslbema", ] host = [ "in", "tum", "de", ] [haslbeckm.homepages] haslbeckm_homepage = "http://in.tum.de/~haslbema/" [havle] name = "Oto Havle" [havle.emails] [havle.emails.havle_email] user = [ "oha", ] host = [ "sysgo", "com", ] [havle.homepages] [hayes] name = "Ian J. Hayes" [hayes.emails] [hayes.emails.hayes_email] user = [ "ian", "hayes", ] host = [ "itee", "uq", "edu", "au", ] [hayes.homepages] [he] name = "Yijun He" [he.emails] [he.emails.he_email] user = [ "yh403", ] host = [ "cam", "ac", "uk", ] [he.homepages] [heimes] name = "Lukas Heimes" [heimes.emails] [heimes.emails.heimes_email] user = [ "heimesl", ] host = [ "student", "ethz", "ch", ] [heimes.homepages] [helke] name = "Steffen Helke" [helke.emails] [helke.emails.helke_email] user = [ "helke", ] host = [ "cs", "tu-berlin", "de", ] [helke.homepages] [hellauer] name = "Fabian Hellauer" [hellauer.emails] [hellauer.emails.hellauer_email] user = [ "hellauer", ] host = [ "in", "tum", "de", ] [hellauer.homepages] [heller] name = "Armin Heller" [heller.emails] [heller.homepages] [henrio] name = "Ludovic Henrio" [henrio.emails] [henrio.emails.henrio_email] user = [ "Ludovic", "Henrio", ] host = [ "sophia", "inria", "fr", ] [henrio.homepages] [herzberg] name = "Michael Herzberg" [herzberg.emails] [herzberg.emails.herzberg_email] user = [ "mail", ] host = [ "michael-herzberg", "de", ] [herzberg.homepages] herzberg_homepage = "http://www.dcs.shef.ac.uk/cgi-bin/makeperson?M.Herzberg" [hess] name = "Andreas V. Hess" [hess.emails] [hess.emails.hess_email] user = [ "avhe", ] host = [ "dtu", "dk", ] [hess.emails.hess_email1] user = [ "andreasvhess", ] host = [ "gmail", "com", ] [hess.homepages] [hetzl] name = "Stefan Hetzl" [hetzl.emails] [hetzl.emails.hetzl_email] user = [ "hetzl", ] host = [ "logic", "at", ] [hetzl.homepages] hetzl_homepage = "http://www.logic.at/people/hetzl/" [hibon] name = "Quentin Hibon" [hibon.emails] [hibon.emails.hibon_email] user = [ "qh225", ] host = [ "cl", "cam", "ac", "uk", ] [hibon.homepages] [higgins] name = "Edward Higgins" [higgins.emails] [higgins.homepages] [hirata] name = "Michikazu Hirata" [hirata.emails] [hirata.emails.hirata_email] user = [ "hirata", "m", "ac", ] host = [ "m", "titech", "ac", "jp", ] [hirata.homepages] [hoefner] name = "Peter Höfner" [hoefner.emails] [hoefner.emails.hoefner_email] user = [ "peter", ] host = [ "hoefner-online", "de", ] [hoefner.homepages] hoefner_homepage = "http://www.hoefner-online.de/" [hoelzl] name = "Johannes Hölzl" [hoelzl.emails] [hoelzl.emails.hoelzl_email] user = [ "hoelzl", ] host = [ "in", "tum", "de", ] [hoelzl.homepages] hoelzl_homepage = "http://home.in.tum.de/~hoelzl" [hofmann] name = "Martin Hofmann" [hofmann.emails] [hofmann.homepages] hofmann_homepage = "http://www.tcs.informatik.uni-muenchen.de/~mhofmann" [hofmeier] name = "Paul Hofmeier" [hofmeier.emails] [hofmeier.emails.hofmeier_email] user = [ "paul", "hofmeier", ] host = [ "tum", "de", ] [hofmeier.homepages] [holub] name = "Štěpán Holub" [holub.emails] [holub.emails.holub_email] user = [ "holub", ] host = [ "karlin", "mff", "cuni", "cz", ] [holub.homepages] holub_homepage = "https://www2.karlin.mff.cuni.cz/~holub/" [hosking] name = "Tony Hosking" [hosking.emails] [hosking.homepages] hosking_homepage = "https://www.cs.purdue.edu/homes/hosking/" [hou] name = "Zhe Hou" [hou.emails] [hou.emails.hou_email] user = [ "zhe", "hou", ] host = [ "ntu", "edu", "sg", ] [hou.homepages] [hu] name = "Shuwei Hu" [hu.emails] [hu.emails.hu_email] user = [ "shuwei", "hu", ] host = [ "tum", "de", ] [hu.homepages] [huffman] name = "Brian Huffman" [huffman.emails] [huffman.emails.huffman_email] user = [ "huffman", ] host = [ "in", "tum", "de", ] [huffman.emails.huffman_email1] user = [ "brianh", ] host = [ "cs", "pdx", "edu", ] [huffman.homepages] huffman_homepage = "http://cs.pdx.edu/~brianh/" [hupel] name = "Lars Hupel" [hupel.emails] [hupel.emails.hupel_email] user = [ "lars", ] host = [ "hupel", "info", ] [hupel.homepages] hupel_homepage = "https://lars.hupel.info/" [ijbema] name = "Mark Ijbema" [ijbema.emails] [ijbema.emails.ijbema_email] user = [ "ijbema", ] host = [ "fmf", "nl", ] [ijbema.homepages] [immler] name = "Fabian Immler" [immler.emails] [immler.emails.immler_email] user = [ "immler", ] host = [ "in", "tum", "de", ] [immler.emails.immler_email1] user = [ "fimmler", ] host = [ "cs", "cmu", "edu", ] [immler.homepages] immler_homepage = "https://home.in.tum.de/~immler/" [israel] name = "Jonas Israel" [israel.emails] [israel.homepages] israel_homepage = "https://www.algo.tu-berlin.de/menue/people/jonas_israel/" [ito] name = "Yosuke Ito" [ito.emails] [ito.emails.ito_email] user = [ "glacier345", ] host = [ "gmail", "com", ] [ito.homepages] [iwama] name = "Fumiya Iwama" [iwama.emails] [iwama.emails.iwama_email] user = [ "d1623001", ] host = [ "s", "konan-u", "ac", "jp", ] [iwama.homepages] [jacobsen] name = "Frederik Krogsdal Jacobsen" [jacobsen.emails] [jacobsen.emails.jacobsen_email] user = [ "fkjac", ] host = [ "dtu", "dk", ] [jacobsen.homepages] jacobsen_homepage = "http://people.compute.dtu.dk/fkjac/" [jaskelioff] name = "Mauro Jaskelioff" [jaskelioff.emails] [jaskelioff.homepages] jaskelioff_homepage = "http://www.fceia.unr.edu.ar/~mauro/" [jaskolka] name = "Jason Jaskolka" [jaskolka.emails] [jaskolka.emails.jaskolka_email] user = [ "jason", "jaskolka", ] host = [ "carleton", "ca", ] [jaskolka.homepages] jaskolka_homepage = "https://carleton.ca/jaskolka/" [jensen] name = "Alexander Birch Jensen" [jensen.emails] [jensen.emails.jensen_email] user = [ "aleje", ] host = [ "dtu", "dk", ] [jensen.homepages] jensen_homepage = "https://people.compute.dtu.dk/aleje/" [jiang] name = "Nan Jiang" [jiang.emails] [jiang.emails.jiang_email] user = [ "nanjiang", ] host = [ "whu", "edu", "cn", ] [jiang.homepages] [jiangd] name = "Dongchen Jiang" [jiangd.emails] [jiangd.emails.jiangd_email] user = [ "dongchenjiang", ] host = [ "googlemail", "com", ] [jiangd.homepages] [joosten] name = "Sebastiaan J. C. Joosten" [joosten.emails] [joosten.emails.joosten_email] user = [ "sebastiaan", "joosten", ] host = [ "uibk", "ac", "at", ] [joosten.emails.joosten_email1] user = [ "sjcjoosten", ] host = [ "gmail", "com", ] [joosten.emails.joosten_email2] user = [ "s", "j", "c", "joosten", ] host = [ "utwente", "nl", ] [joosten.homepages] joosten_homepage = "https://sjcjoosten.nl/" [jungnickel] name = "Tim Jungnickel" [jungnickel.emails] [jungnickel.emails.jungnickel_email] user = [ "tim", "jungnickel", ] host = [ "tu-berlin", "de", ] [jungnickel.homepages] [kadzioka] name = "Maya Kądziołka" [kadzioka.emails] [kadzioka.emails.kadzioka_email] user = [ "afp", ] host = [ "compilercrim", "es", ] [kadzioka.homepages] [kaliszyk] name = "Cezary Kaliszyk" [kaliszyk.emails] [kaliszyk.emails.kaliszyk_email] user = [ "cezary", "kaliszyk", ] host = [ "uibk", "ac", "at", ] [kaliszyk.homepages] kaliszyk_homepage = "http://cl-informatik.uibk.ac.at/users/cek/" [kammueller] name = "Florian Kammüller" [kammueller.emails] [kammueller.emails.kammueller_email] user = [ "flokam", ] host = [ "cs", "tu-berlin", "de", ] [kammueller.emails.kammueller_email1] user = [ "florian", "kammuller", ] host = [ "gmail", "com", ] [kammueller.homepages] kammueller_homepage = "http://www.cs.mdx.ac.uk/people/florian-kammueller/" [kappelmann] name = "Kevin Kappelmann" [kappelmann.emails] [kappelmann.emails.kappelmann_email] user = [ "kevin", "kappelmann", ] host = [ "tum", "de", ] [kappelmann.homepages] kappelmann_homepage = "https://www21.in.tum.de/team/kappelmk/" [karayel] name = "Emin Karayel" orcid = "0000-0003-3290-5034" [karayel.emails] [karayel.emails.karayel_email] user = [ "me", ] host = [ "eminkarayel", "de", ] [karayel.homepages] karayel_homepage = "https://orcid.org/0000-0003-3290-5034" [kastermans] name = "Bart Kastermans" [kastermans.emails] [kastermans.homepages] kastermans_homepage = "http://kasterma.net" [katovsky] name = "Alexander Katovsky" [katovsky.emails] [katovsky.emails.katovsky_email] user = [ "apk32", ] host = [ "cam", "ac", "uk", ] [katovsky.emails.katovsky_email1] user = [ "alexander", "katovsky", ] host = [ "cantab", "net", ] [katovsky.homepages] [kaufmann] name = "Daniela Kaufmann" [kaufmann.emails] [kaufmann.homepages] kaufmann_homepage = "http://fmv.jku.at/kaufmann" [keefe] name = "Greg O'Keefe" [keefe.emails] [keefe.homepages] keefe_homepage = "http://users.rsise.anu.edu.au/~okeefe/" [keinholz] name = "Jonas Keinholz" [keinholz.emails] [keinholz.homepages] [kerber] name = "Manfred Kerber" [kerber.emails] [kerber.emails.kerber_email] user = [ "mnfrd", "krbr", ] host = [ "gmail", "com", ] [kerber.homepages] kerber_homepage = "http://www.cs.bham.ac.uk/~mmk" [keskin] name = "Ata Keskin" orcid = "0000-0002-8296-1766" [keskin.emails] [keskin.emails.keskin_email] user = [ "ata", "keskin", ] host = [ "tum", "de", ] [keskin.homepages] [ketland] name = "Jeffrey Ketland" [ketland.emails] [ketland.emails.ketland_email] user = [ "jeffreyketland", ] host = [ "gmail", "com", ] [ketland.homepages] [kim] name = "Sunpill Kim" orcid = "0000-0002-7767-4084" [kim.emails] [kim.homepages] [kirchner] name = "Daniel Kirchner" [kirchner.emails] [kirchner.emails.kirchner_email] user = [ "daniel", ] host = [ "ekpyron", "org", ] [kirchner.homepages] [klein] name = "Gerwin Klein" [klein.emails] [klein.emails.klein_email] user = [ "kleing", ] host = [ "unsw", "edu", "au", ] [klein.homepages] klein_homepage = "http://www.cse.unsw.edu.au/~kleing/" [klenze] name = "Tobias Klenze" [klenze.emails] [klenze.emails.klenze_email] user = [ "tobias", "klenze", ] host = [ "inf", "ethz", "ch", ] [klenze.homepages] [kleppmann] name = "Martin Kleppmann" [kleppmann.emails] [kleppmann.emails.kleppmann_email] user = [ "martin", "kleppmann", ] host = [ "cl", "cam", "ac", "uk", ] [kleppmann.homepages] [kobayashi] name = "Hidetsune Kobayashi" [kobayashi.emails] [kobayashi.homepages] [koerner] name = "Stefan Körner" [koerner.emails] [koerner.emails.koerner_email] user = [ "s_koer03", ] host = [ "uni-muenster", "de", ] [koerner.homepages] [kolanski] name = "Rafal Kolanski" [kolanski.emails] [kolanski.emails.kolanski_email] user = [ "rafal", "kolanski", ] host = [ "nicta", "com", "au", ] [kolanski.homepages] [koller] name = "Lukas Koller" [koller.emails] [koller.emails.koller_email] user = [ "lukas", "koller", ] host = [ "tum", "de", ] [koller.homepages] [krauss] name = "Alexander Krauss" [krauss.emails] [krauss.emails.krauss_email] user = [ "krauss", ] host = [ "in", "tum", "de", ] [krauss.homepages] krauss_homepage = "http://www.in.tum.de/~krauss" [kreuzer] name = "Katharina Kreuzer" [kreuzer.emails] [kreuzer.emails.kreuzer_email] user = [ "kreuzerk", ] host = [ "in", "tum", "de", ] [kreuzer.emails.kreuzer_email1] user = [ "k", "kreuzer", ] host = [ "tum", "de", ] [kreuzer.homepages] kreuzer_homepage = "https://www21.in.tum.de/team/kreuzer/" [kuncak] name = "Viktor Kuncak" [kuncak.emails] [kuncak.homepages] kuncak_homepage = "http://lara.epfl.ch/~kuncak/" [kuncar] name = "Ondřej Kunčar" [kuncar.emails] [kuncar.homepages] kuncar_homepage = "http://www21.in.tum.de/~kuncar/" [kurz] name = "Friedrich Kurz" [kurz.emails] [kurz.emails.kurz_email] user = [ "friedrich", "kurz", ] host = [ "tum", "de", ] [kurz.homepages] [lachnitt] name = "Hanna Lachnitt" [lachnitt.emails] [lachnitt.emails.lachnitt_email] user = [ "lachnitt", ] host = [ "stanford", "edu", ] [lachnitt.homepages] [lallemand] name = "Joseph Lallemand" [lallemand.emails] [lallemand.emails.lallemand_email] user = [ "joseph", "lallemand", ] host = [ "loria", "fr", ] [lallemand.homepages] [lameris] name = "Cárolos Laméris" [lameris.emails] [lameris.emails.lameris_email] user = [ "carolos", "lameris", ] host = [ "ru", "nl", ] [lameris.homepages] [lammich] name = "Peter Lammich" [lammich.emails] [lammich.emails.lammich_email] user = [ "lammich", ] host = [ "in", "tum", "de", ] [lammich.emails.lammich_email1] user = [ "peter", "lammich", ] host = [ "uni-muenster", "de", ] [lammich.homepages] lammich_homepage = "http://www21.in.tum.de/~lammich" [lange] name = "Christoph Lange" [lange.emails] [lange.emails.lange_email] user = [ "math", "semantic", "web", ] host = [ "gmail", "com", ] [lange.homepages] [langenstein] name = "Bruno Langenstein" [langenstein.emails] [langenstein.emails.langenstein_email] user = [ "langenstein", ] host = [ "dfki", "de", ] [langenstein.homepages] [lattuada] name = "Andrea Lattuada" [lattuada.emails] [lattuada.homepages] lattuada_homepage = "https://andrea.lattuada.me" [lauermann] name = "Nils Lauermann" [lauermann.emails] [lauermann.emails.lauermann_email] user = [ "Nils", "Lauermann", ] host = [ "cl", "cam", "ac", "uk", ] [lauermann.homepages] [laursen] name = "Christian Pardillo-Laursen" [laursen.emails] [laursen.emails.laursen_email] user = [ "christian", "laursen", ] host = [ "york", "ac", "uk", ] [laursen.homepages] [lederer] name = "Patrick Lederer" [lederer.emails] [lederer.homepages] lederer_homepage = "https://www.cs.cit.tum.de/en/dss/members/patrick-lederer/" [lee] name = "Holden Lee" [lee.emails] [lee.emails.lee_email] user = [ "holdenl", ] host = [ "princeton", "edu", ] [lee.homepages] [leek] name = "Kevin Lee" [leek.emails] [leek.emails.leek_email] user = [ "kfkl2", ] host = [ "cam", "ac", "uk", ] [leek.homepages] [leustean] name = "Laurentiu Leustean" [leustean.emails] [leustean.homepages] [lewis] name = "Corey Lewis" [lewis.emails] [lewis.emails.lewis_email] user = [ "corey", "lewis", ] host = [ "data61", "csiro", "au", ] [lewis.homepages] [li] name = "Wenda Li" [li.emails] [li.emails.li_email] user = [ "wl302", ] host = [ "cam", "ac", "uk", ] [li.emails.li_email1] user = [ "liwenda1990", ] host = [ "hotmail", "com", ] [li.homepages] li_homepage = "https://www.cl.cam.ac.uk/~wl302/" [lim] name = "Japheth Lim" [lim.emails] [lim.homepages] [lindenberg] name = "Christina Lindenberg" [lindenberg.emails] [lindenberg.homepages] [linker] name = "Sven Linker" [linker.emails] [linker.emails.linker_email] user = [ "s", "linker", ] host = [ "liverpool", "ac", "uk", ] [linker.homepages] [liu] name = "Junyi Liu" [liu.emails] [liu.homepages] [liut] name = "Tao Liu" [liut.emails] [liut.homepages] [liuy] name = "Yang Liu" [liuy.emails] [liuy.emails.liuy_email] user = [ "yangliu", ] host = [ "ntu", "edu", "sg", ] [liuy.homepages] [liy] name = "Yangjia Li" [liy.emails] [liy.homepages] [lochbihler] name = "Andreas Lochbihler" [lochbihler.emails] [lochbihler.emails.lochbihler_email1] user = [ "mail", ] host = [ "andreas-lochbihler", "de", ] [lochbihler.homepages] lochbihler_homepage = "http://www.andreas-lochbihler.de/" [lochmann] name = "Alexander Lochmann" [lochmann.emails] [lochmann.emails.lochmann_email] user = [ "alexander", "lochmann", ] host = [ "uibk", "ac", "at", ] [lochmann.homepages] [lohner] name = "Denis Lohner" [lohner.emails] [lohner.emails.lohner_email] user = [ "denis", "lohner", ] host = [ "kit", "edu", ] [lohner.homepages] lohner_homepage = "http://pp.ipd.kit.edu/person.php?id=88" [loibl] name = "Matthias Loibl" [loibl.emails] [loibl.homepages] [londono] name = "Alejandro Gómez-Londoño" [londono.emails] [londono.emails.londono_email] user = [ "alejandro", "gomez", ] host = [ "chalmers", "se", ] [londono.homepages] [losa] name = "Giuliano Losa" [losa.emails] [losa.emails.losa_email] user = [ "giuliano", "losa", ] host = [ "epfl", "ch", ] [losa.emails.losa_email1] user = [ "giuliano", ] host = [ "galois", "com", ] [losa.emails.losa_email2] user = [ "giuliano", ] host = [ "losa", "fr", ] [losa.homepages] [lutz] name = "Bianca Lutz" [lutz.emails] [lutz.emails.lutz_email] user = [ "sowilo", ] host = [ "cs", "tu-berlin", "de", ] [lutz.homepages] [lux] name = "Alexander Lux" [lux.emails] [lux.emails.lux_email] user = [ "lux", ] host = [ "mais", "informatik", "tu-darmstadt", "de", ] [lux.homepages] [madarasz] name = "Judit Madarasz" [madarasz.emails] [madarasz.homepages] madarasz_homepage = "https://users.renyi.hu/~madarasz/" [makarios] name = "T. J. M. Makarios" [makarios.emails] [makarios.emails.makarios_email] user = [ "tjm1983", ] host = [ "gmail", "com", ] [makarios.homepages] [maletzky] name = "Alexander Maletzky" [maletzky.emails] [maletzky.emails.maletzky_email] user = [ "alexander", "maletzky", ] host = [ "risc", "jku", "at", ] [maletzky.emails.maletzky_email1] user = [ "alexander", "maletzky", ] host = [ "risc-software", "at", ] [maletzky.homepages] maletzky_homepage = "https://risc.jku.at/m/alexander-maletzky/" [mansky] name = "Susannah Mansky" [mansky.emails] [mansky.emails.mansky_email] user = [ "sjohnsn2", ] host = [ "illinois", "edu", ] [mansky.emails.mansky_email1] user = [ "susannahej", ] host = [ "gmail", "com", ] [mansky.homepages] [mantel] name = "Heiko Mantel" [mantel.emails] [mantel.emails.mantel_email] user = [ "mantel", ] host = [ "mais", "informatik", "tu-darmstadt", "de", ] [mantel.homepages] [margetson] name = "James Margetson" [margetson.emails] [margetson.homepages] [maric] name = "Ognjen Marić" [maric.emails] [maric.emails.maric_email] user = [ "ogi", "afp", ] host = [ "mynosefroze", "com", ] [maric.homepages] [maricf] name = "Filip Marić" [maricf.emails] [maricf.emails.maricf_email] user = [ "filip", ] host = [ "matf", "bg", "ac", "rs", ] [maricf.homepages] maricf_homepage = "http://www.matf.bg.ac.rs/~filip" [marmsoler] name = "Diego Marmsoler" [marmsoler.emails] [marmsoler.emails.marmsoler_email] user = [ "diego", "marmsoler", ] host = [ "tum", "de", ] [marmsoler.emails.marmsoler_email1] user = [ "d", "marmsoler", ] host = [ "exeter", "ac", "uk", ] [marmsoler.homepages] marmsoler_homepage = "http://marmsoler.com" [massacrier] name = "Tanguy Massacrier" [massacrier.emails] [massacrier.homepages] [matache] name = "Cristina Matache" [matache.emails] [matache.emails.matache_email] user = [ "cris", "matache", ] host = [ "gmail", "com", ] [matache.homepages] [mateo] name = "Adrián Doña Mateo" [mateo.emails] [mateo.emails.mateo_email] user = [ "adrian", "dona", ] host = [ "ed", "ac", "uk", ] [mateo.homepages] [matichuk] name = "Daniel Matichuk" [matichuk.emails] [matichuk.homepages] [matiyasevich] name = "Yuri Matiyasevich" [matiyasevich.emails] [matiyasevich.homepages] [maximova] name = "Alexandra Maximova" [maximova.emails] [maximova.emails.maximova_email] user = [ "amaximov", ] host = [ "student", "ethz", "ch", ] [maximova.homepages] [meis] name = "Rene Meis" [meis.emails] [meis.emails.meis_email] user = [ "rene", "meis", ] host = [ "uni-muenster", "de", ] [meis.emails.meis_email1] user = [ "rene", "meis", ] host = [ "uni-due", "de", ] [meis.homepages] [merz] name = "Stephan Merz" [merz.emails] [merz.emails.merz_email] user = [ "Stephan", "Merz", ] host = [ "loria", "fr", ] [merz.homepages] merz_homepage = "http://www.loria.fr/~merz" [messner] name = "Florian Messner" [messner.emails] [messner.emails.messner_email] user = [ "florian", "g", "messner", ] host = [ "uibk", "ac", "at", ] [messner.homepages] [mhalla] name = "Mehdi Mhalla" [mhalla.emails] [mhalla.emails.mhalla_email] user = [ "mhallam", ] host = [ "univ-grenoble-alpes", "fr", ] [mhalla.homepages] [michaelis] name = "Julius Michaelis" [michaelis.emails] [michaelis.emails.michaelis_email] user = [ "isabelleopenflow", ] host = [ "liftm", "de", ] [michaelis.emails.michaelis_email1] user = [ "maintainafpppt", ] host = [ "liftm", "de", ] [michaelis.emails.michaelis_email2] user = [ "bdd", ] host = [ "liftm", "de", ] [michaelis.emails.michaelis_email3] user = [ "afp", ] host = [ "liftm", "de", ] [michaelis.homepages] michaelis_homepage = "http://liftm.de/" [milehins] name = "Mihails Milehins" [milehins.emails] [milehins.emails.milehins_email] user = [ "mihailsmilehins", ] host = [ "gmail", "com", ] [milehins.homepages] [minamide] name = "Yasuhiko Minamide" [minamide.emails] [minamide.emails.minamide_email] user = [ "minamide", ] host = [ "is", "titech", "ac", "jp", ] [minamide.homepages] minamide_homepage = "https://sv.c.titech.ac.jp/minamide/index.en.html" [mitchell] name = "Neil Mitchell" [mitchell.emails] [mitchell.homepages] [mitsch] name = "Stefan Mitsch" [mitsch.emails] [mitsch.emails.mitsch_email] user = [ "smitsch", ] host = [ "cs", "cmu", "edu", ] [mitsch.homepages] [moedersheim] name = "Sebastian Mödersheim" [moedersheim.emails] [moedersheim.emails.moedersheim_email] user = [ "samo", ] host = [ "dtu", "dk", ] [moedersheim.homepages] moedersheim_homepage = "https://people.compute.dtu.dk/samo/" [moeller] name = "Bernhard Möller" [moeller.emails] [moeller.homepages] moeller_homepage = "https://www.informatik.uni-augsburg.de/en/chairs/dbis/pmi/staff/moeller/" [montanari] name = "Luisa Montanari" orcid = "0000-0002-5270-0290" [montanari.emails] [montanari.homepages] [mori] name = "Coraline Mori" [mori.emails] [mori.emails.mori_email] user = [ "coraline", "mori", ] host = [ "grenoble-inp", "org", ] [mori.homepages] [muendler] name = "Niels Mündler" [muendler.emails] [muendler.emails.muendler_email] user = [ "n", "muendler", ] host = [ "tum", "de", ] [muendler.homepages] [mulligan] name = "Dominic P. Mulligan" [mulligan.emails] [mulligan.emails.mulligan_email] user = [ "dominic", "p", "mulligan", ] host = [ "googlemail", "com", ] [mulligan.emails.mulligan_email1] user = [ "Dominic", "Mulligan", ] host = [ "arm", "com", ] [mulligan.homepages] [munive] name = "Jonathan Julian Huerta y Munive" [munive.emails] [munive.emails.munive_email] user = [ "jjhuertaymunive1", ] host = [ "sheffield", "ac", "uk", ] [munive.emails.munive_email1] user = [ "jonjulian23", ] host = [ "gmail", "com", ] [munive.homepages] [murao] name = "H. Murao" [murao.emails] [murao.homepages] [murray] name = "Toby Murray" [murray.emails] [murray.emails.murray_email] user = [ "toby", "murray", ] host = [ "unimelb", "edu", "au", ] [murray.homepages] murray_homepage = "https://people.eng.unimelb.edu.au/tobym/" [myreen] name = "Magnus O. Myreen" orcid = "0000-0002-9504-4107" [myreen.emails] [myreen.emails.myreen_email] user = [ "myreen", ] host = [ "chalmers", "se", ] [myreen.homepages] [nagashima] name = "Yutaka Nagashima" [nagashima.emails] [nagashima.emails.nagashima_email] user = [ "Yutaka", "Nagashima", ] host = [ "data61", "csiro", "au", ] [nagashima.homepages] [nagele] name = "Julian Nagele" [nagele.emails] [nagele.emails.nagele_email] user = [ "julian", "nagele", ] host = [ "uibk", "ac", "at", ] [nagele.homepages] [naraschewski] name = "Wolfgang Naraschewski" [naraschewski.emails] [naraschewski.homepages] [nedzelsky] name = "Michael Nedzelsky" [nedzelsky.emails] [nedzelsky.emails.nedzelsky_email] user = [ "MichaelNedzelsky", ] host = [ "yandex", "ru", ] [nedzelsky.homepages] [nemeti] name = "István Németi" [nemeti.emails] [nemeti.homepages] nemeti_homepage = "http://www.renyi.hu/~nemeti/" [nemouchi] name = "Yakoub Nemouchi" [nemouchi.emails] [nemouchi.emails.nemouchi_email] user = [ "nemouchi", ] host = [ "lri", "fr", ] [nemouchi.emails.nemouchi_email1] user = [ "yakoub", "nemouchi", ] host = [ "york", "ac", "uk", ] [nemouchi.homepages] [nestmann] name = "Uwe Nestmann" [nestmann.emails] [nestmann.homepages] nestmann_homepage = "https://www.mtv.tu-berlin.de/nestmann/" [neumann] name = "René Neumann" [neumann.emails] [neumann.emails.neumann_email] user = [ "rene", "neumann", ] host = [ "in", "tum", "de", ] [neumann.homepages] [nielsen] name = "Finn Nielsen" [nielsen.emails] [nielsen.emails.nielsen_email] user = [ "finn", "nielsen", ] host = [ "uni-muenster", "de", ] [nielsen.homepages] [nikiforov] name = "Denis Nikiforov" [nikiforov.emails] [nikiforov.emails.nikiforov_email] user = [ "denis", "nikif", ] host = [ "gmail", "com", ] [nikiforov.homepages] [nipkow] name = "Tobias Nipkow" orcid = "0000-0003-0730-515X" [nipkow.emails] [nipkow.emails.nipkow_email] user = [ "nipkow", ] host = [ "in", "tum", "de", ] [nipkow.homepages] nipkow_homepage = "https://www.in.tum.de/~nipkow/" [nishihara] name = "Toshiaki Nishihara" [nishihara.emails] [nishihara.homepages] [noce] name = "Pasquale Noce" [noce.emails] [noce.emails.noce_email] user = [ "pasquale", "noce", "lavoro", ] host = [ "gmail", "com", ] [noce.homepages] [nordhoff] name = "Benedikt Nordhoff" [nordhoff.emails] [nordhoff.emails.nordhoff_email] user = [ "b", "n", ] host = [ "wwu", "de", ] [nordhoff.emails.nordhoff_email1] user = [ "b_nord01", ] host = [ "uni-muenster", "de", ] [nordhoff.homepages] [noschinski] name = "Lars Noschinski" [noschinski.emails] [noschinski.emails.noschinski_email] user = [ "noschinl", ] host = [ "gmail", "com", ] [noschinski.homepages] noschinski_homepage = "http://www21.in.tum.de/~noschinl/" [obua] name = "Steven Obua" [obua.emails] [obua.emails.obua_email] user = [ "steven", ] host = [ "recursivemind", "com", ] [obua.homepages] [ogawa] name = "Mizuhito Ogawa" [ogawa.emails] [ogawa.homepages] [oldenburg] name = "Lennart Oldenburg" [oldenburg.emails] [oldenburg.homepages] [olm] name = "Markus Müller-Olm" [olm.emails] [olm.homepages] olm_homepage = "http://cs.uni-muenster.de/u/mmo/" [oosterhuis] name = "Roelof Oosterhuis" [oosterhuis.emails] [oosterhuis.emails.oosterhuis_email] user = [ "roelofoosterhuis", ] host = [ "gmail", "com", ] [oosterhuis.homepages] [oostrom] name = "Vincent van Oostrom" [oostrom.emails] [oostrom.homepages] [ortner] name = "Veronika Ortner" [ortner.emails] [ortner.homepages] [overbeek] name = "Roy Overbeek" [overbeek.emails] [overbeek.emails.overbeek_email] user = [ "Roy", "Overbeek", ] host = [ "cwi", "nl", ] [overbeek.homepages] [pagano] name = "Miguel Pagano" [pagano.emails] [pagano.emails.pagano_email] user = [ "miguel", "pagano", ] host = [ "unc", "edu", "ar", ] [pagano.homepages] pagano_homepage = "https://cs.famaf.unc.edu.ar/~mpagano/" [pal] name = "Abhik Pal" [pal.emails] [pal.homepages] [paleo] name = "Bruno Woltzenlogel Paleo" [paleo.emails] [paleo.homepages] paleo_homepage = "http://www.logic.at/staff/bruno/" [palmer] name = "Jake Palmer" [palmer.emails] [palmer.emails.palmer_email] user = [ "jake", "palmer", ] host = [ "ed", "ac", "uk", ] [palmer.homepages] [park] name = "Seung Hoon Park" orcid = "0000-0001-7165-6857" [park.emails] [park.emails.park_email] user = [ "seunghoon", "park", ] host = [ "cs", "ox", "ac", "uk", ] [park.homepages] park_homepage = "https://www.cs.ox.ac.uk/people/simon.park/" [parkinson] name = "Matthew Parkinson" [parkinson.emails] [parkinson.homepages] parkinson_homepage = "http://research.microsoft.com/people/mattpark/" [parrow] name = "Joachim Parrow" [parrow.emails] [parrow.emails.parrow_email] user = [ "joachim", "parrow", ] host = [ "it", "uu", "se", ] [parrow.homepages] [parsert] name = "Julian Parsert" [parsert.emails] [parsert.emails.parsert_email] user = [ "julian", "parsert", ] host = [ "gmail", "com", ] [parsert.emails.parsert_email1] user = [ "julian", "parsert", ] host = [ "uibk", "ac", "at", ] [parsert.homepages] parsert_homepage = "http://www.parsert.com/" [paulson] name = "Lawrence C. Paulson" [paulson.emails] [paulson.emails.paulson_email] user = [ "lp15", ] host = [ "cam", "ac", "uk", ] [paulson.homepages] paulson_homepage = "https://www.cl.cam.ac.uk/~lp15/" [peltier] name = "Nicolas Peltier" [peltier.emails] [peltier.emails.peltier_email] user = [ "Nicolas", "Peltier", ] host = [ "imag", "fr", ] [peltier.homepages] peltier_homepage = "http://membres-lig.imag.fr/peltier/" [peters] name = "Kirstin Peters" [peters.emails] [peters.emails.peters_email] user = [ "kirstin", "peters", ] host = [ "tu-berlin", "de", ] [peters.homepages] [petrovic] name = "Danijela Petrovic" [petrovic.emails] [petrovic.homepages] petrovic_homepage = "http://www.matf.bg.ac.rs/~danijela" [pierzchalski] name = "Edward Pierzchalski" [pierzchalski.emails] [pierzchalski.homepages] [platzer] name = "André Platzer" [platzer.emails] [platzer.emails.platzer_email] user = [ "aplatzer", ] host = [ "cs", "cmu", "edu", ] [platzer.homepages] platzer_homepage = "https://www.cs.cmu.edu/~aplatzer/" [pohjola] name = "Johannes Åman Pohjola" [pohjola.emails] [pohjola.emails.pohjola_email] user = [ "j", "amanpohjola", ] host = [ "unsw", "edu", "au", ] [pohjola.homepages] [pollak] name = "Florian Pollak" [pollak.emails] [pollak.emails.pollak_email] user = [ "florian", "pollak", ] host = [ "gmail", "com", ] [pollak.homepages] [popescu] name = "Andrei Popescu" [popescu.emails] [popescu.emails.popescu_email] user = [ "a", "popescu", ] host = [ "sheffield", "ac", "uk", ] [popescu.emails.popescu_email1] user = [ "uuomul", ] host = [ "yahoo", "com", ] [popescu.emails.popescu_email2] user = [ "a", "popescu", ] host = [ "mdx", "ac", "uk", ] [popescu.homepages] popescu_homepage = "https://www.andreipopescu.uk" [porter] name = "Benjamin Porter" [porter.emails] [porter.homepages] [prathamesh] name = "T.V.H. Prathamesh" [prathamesh.emails] [prathamesh.emails.prathamesh_email] user = [ "prathamesh", ] host = [ "imsc", "res", "in", ] [prathamesh.homepages] [preoteasa] name = "Viorel Preoteasa" [preoteasa.emails] [preoteasa.emails.preoteasa_email] user = [ "viorel", "preoteasa", ] host = [ "aalto", "fi", ] [preoteasa.homepages] preoteasa_homepage = "http://users.abo.fi/vpreotea/" [pusch] name = "Cornelia Pusch" [pusch.emails] [pusch.homepages] [qiu] name = "Qi Qiu" [qiu.emails] [qiu.emails.qiu_email] user = [ "qi", "qiu", ] host = [ "univ-lyon1", "fr", ] [qiu.homepages] [rabe] name = "Markus N. Rabe" [rabe.emails] [rabe.homepages] rabe_homepage = "http://www.react.uni-saarland.de/people/rabe.html" [rabing] name = "Mathias Schack Rabing" [rabing.emails] [rabing.emails.rabing_email] user = [ "mathiasrabing", ] host = [ "outlook", "com", ] [rabing.homepages] [raedle] name = "Jonas Rädle" [raedle.emails] [raedle.emails.raedle_email] user = [ "jonas", "raedle", ] host = [ "gmail", "com", ] [raedle.emails.raedle_email1] user = [ "jonas", "raedle", ] host = [ "tum", "de", ] [raedle.homepages] [raska] name = "Martin Raška" [raska.emails] [raska.homepages] [raszyk] name = "Martin Raszyk" [raszyk.emails] [raszyk.emails.raszyk_email] user = [ "martin", "raszyk", ] host = [ "inf", "ethz", "ch", ] [raszyk.emails.raszyk_email1] user = [ "m", "raszyk", ] host = [ "gmail", "com", ] [raszyk.homepages] [rau] name = "Martin Rau" [rau.emails] [rau.emails.rau_email] user = [ "martin", "rau", ] host = [ "tum", "de", ] [rau.emails.rau_email1] user = [ "mrtnrau", ] host = [ "googlemail", "com", ] [rau.homepages] [rauch] name = "Nicole Rauch" [rauch.emails] [rauch.emails.rauch_email] user = [ "rauch", ] host = [ "informatik", "uni-kl", "de", ] [rauch.homepages] [raumer] name = "Jakob von Raumer" [raumer.emails] [raumer.emails.raumer_email] user = [ "psxjv4", ] host = [ "nottingham", "ac", "uk", ] [raumer.homepages] [ravindran] name = "Binoy Ravindran" [ravindran.emails] [ravindran.homepages] [rawson] name = "Michael Rawson" [rawson.emails] [rawson.emails.rawson_email] user = [ "michaelrawson76", ] host = [ "gmail", "com", ] [rawson.homepages] [raya] name = "Rodrigo Raya" [raya.emails] [raya.emails.raya_email] user = [ "rodrigo", "raya", ] host = [ "epfl", "ch", ] [raya.homepages] raya_homepage = "https://people.epfl.ch/rodrigo.raya" [regensburger] name = "Franz Regensburger" [regensburger.emails] [regensburger.emails.regensburger_email] user = [ "Franz", "Regensburger", ] host = [ "thi", "de", ] [regensburger.homepages] regensburger_homepage = "https://www.thi.de/suche/mitarbeiter/prof-dr-rer-nat-franz-regensburger" [reiche] name = "Sebastian Reiche" [reiche.emails] [reiche.homepages] reiche_homepage = "https://www.linkedin.com/in/sebastian-reiche-0b2093178" [reiter] name = "Markus Reiter" [reiter.emails] [reiter.homepages] [reynaud] name = "Alban Reynaud" [reynaud.emails] [reynaud.homepages] [ribeiro] name = "Pedro Ribeiro" [ribeiro.emails] [ribeiro.homepages] [richter] name = "Stefan Richter" [richter.emails] [richter.emails.richter_email] user = [ "richter", ] host = [ "informatik", "rwth-aachen", "de", ] [richter.homepages] richter_homepage = "http://www-lti.informatik.rwth-aachen.de/~richter/" [rickmann] name = "Christina Rickmann" [rickmann.emails] [rickmann.emails.rickmann_email] user = [ "c", "rickmann", ] host = [ "tu-berlin", "de", ] [rickmann.homepages] [ridge] name = "Tom Ridge" [ridge.emails] [ridge.homepages] [rizaldi] name = "Albert Rizaldi" [rizaldi.emails] [rizaldi.emails.rizaldi_email] user = [ "albert", "rizaldi", ] host = [ "ntu", "edu", "sg", ] [rizaldi.homepages] [rizkallah] name = "Christine Rizkallah" [rizkallah.emails] [rizkallah.homepages] rizkallah_homepage = "https://www.mpi-inf.mpg.de/~crizkall/" [robillard] name = "Simon Robillard" [robillard.emails] [robillard.homepages] robillard_homepage = "https://simon-robillard.net/" [roessle] name = "Ian Roessle" [roessle.emails] [roessle.homepages] [romanos] name = "Ralph Romanos" [romanos.emails] [romanos.emails.romanos_email] user = [ "ralph", "romanos", ] host = [ "student", "ecp", "fr", ] [romanos.homepages] [rosskopf] name = "Simon Roßkopf" [rosskopf.emails] [rosskopf.emails.rosskopf_email] user = [ "rosskops", ] host = [ "in", "tum", "de", ] [rosskopf.homepages] rosskopf_homepage = "http://www21.in.tum.de/~rosskops" [rowat] name = "Colin Rowat" [rowat.emails] [rowat.emails.rowat_email] user = [ "c", "rowat", ] host = [ "bham", "ac", "uk", ] [rowat.homepages] [sabouret] name = "Nicolas Sabouret" [sabouret.emails] [sabouret.homepages] [sachtleben] name = "Robert Sachtleben" [sachtleben.emails] [sachtleben.emails.sachtleben_email] user = [ "rob_sac", ] host = [ "uni-bremen", "de", ] [sachtleben.homepages] [saile] name = "Christian Saile" [saile.emails] [saile.homepages] saile_homepage = "http://dss.in.tum.de/staff/christian-saile.html" [sanan] name = "David Sanan" [sanan.emails] [sanan.emails.sanan_email] user = [ "sanan", ] host = [ "ntu", "edu", "sg", ] [sanan.homepages] [sato] name = "Tetsuya Sato" [sato.emails] [sato.emails.sato_email] user = [ "tsato", ] host = [ "c", "titech", "ac", "jp", ] [sato.homepages] sato_homepage = "https://sites.google.com/view/tetsuyasato/" [sauer] name = "Jens Sauer" [sauer.emails] [sauer.emails.sauer_email] user = [ "sauer", ] host = [ "mais", "informatik", "tu-darmstadt", "de", ] [sauer.homepages] [schaeffeler] name = "Maximilian Schäffeler" [schaeffeler.emails] [schaeffeler.emails.schaeffeler_email] user = [ "schaeffm", ] host = [ "in", "tum", "de", ] [schaeffeler.homepages] [scharager] name = "Matias Scharager" [scharager.emails] [scharager.emails.scharager_email] user = [ "mscharag", ] host = [ "cs", "cmu", "edu", ] [scharager.homepages] [schimpf] name = "Alexander Schimpf" [schimpf.emails] [schimpf.emails.schimpf_email] user = [ "schimpfa", ] host = [ "informatik", "uni-freiburg", "de", ] [schimpf.homepages] [schirmer] name = "Norbert Schirmer" [schirmer.emails] [schirmer.emails.schirmer_email] user = [ "norbert", "schirmer", ] host = [ "web", "de", ] [schirmer.homepages] [schleicher] name = "Dierk Schleicher" [schleicher.emails] [schleicher.homepages] [schlichtkrull] name = "Anders Schlichtkrull" [schlichtkrull.emails] [schlichtkrull.emails.schlichtkrull_email] user = [ "andschl", ] host = [ "dtu", "dk", ] [schlichtkrull.homepages] schlichtkrull_homepage = "https://people.compute.dtu.dk/andschl/" [schmaltz] name = "Julien Schmaltz" [schmaltz.emails] [schmaltz.emails.schmaltz_email] user = [ "Julien", "Schmaltz", ] host = [ "ou", "nl", ] [schmaltz.homepages] [schmidinger] name = "Lukas Schmidinger" [schmidinger.emails] [schmidinger.homepages] [schmoetten] name = "Richard Schmoetten" [schmoetten.emails] [schmoetten.emails.schmoetten_email] user = [ "s1311325", ] host = [ "sms", "ed", "ac", "uk", ] [schmoetten.homepages] [schneider] name = "Joshua Schneider" [schneider.emails] [schneider.emails.schneider_email] user = [ "joshua", "schneider", ] host = [ "inf", "ethz", "ch", ] [schneider.homepages] [schoepe] name = "Daniel Schoepe" [schoepe.emails] [schoepe.emails.schoepe_email] user = [ "daniel", ] host = [ "schoepe", "org", ] [schoepe.homepages] [schoepf] name = "Jonas Schöpf" [schoepf.emails] [schoepf.emails.schoepf_email] user = [ "jonas", "schoepf", ] host = [ "uibk", "ac", "at", ] [schoepf.homepages] [schou] name = "Morten Konggaard Schou" orcid = "0000-0002-5970-4294" [schou.emails] [schou.emails.schou_email] user = [ "mksc", ] host = [ "cs", "aau", "dk", ] [schou.homepages] [schulz] name = "Jakob Schulz" [schulz.emails] [schulz.emails.schulz_email] user = [ "jakob", "schulz", ] host = [ "tum", "de", ] [schulz.homepages] [scott] name = "Dana Scott" [scott.emails] [scott.homepages] scott_homepage = "http://www.cs.cmu.edu/~scott/" [sefidgar] name = "S. Reza Sefidgar" [sefidgar.emails] [sefidgar.emails.sefidgar_email] user = [ "reza", "sefidgar", ] host = [ "inf", "ethz", "ch", ] [sefidgar.homepages] [seidl] name = "Benedikt Seidl" [seidl.emails] [seidl.emails.seidl_email] user = [ "benedikt", "seidl", ] host = [ "tum", "de", ] [seidl.homepages] [seidler] name = "Henning Seidler" [seidler.emails] [seidler.emails.seidler_email] user = [ "henning", "seidler", ] host = [ "mailbox", "tu-berlin", "de", ] [seidler.homepages] [sewell] name = "Thomas Sewell" [sewell.emails] [sewell.homepages] [sickert] name = "Salomon Sickert" [sickert.emails] [sickert.emails.sickert_email] user = [ "s", "sickert", ] host = [ "tum", "de", ] [sickert.homepages] sickert_homepage = "https://www7.in.tum.de/~sickert" [siek] name = "Jeremy Siek" [siek.emails] [siek.emails.siek_email] user = [ "jsiek", ] host = [ "indiana", "edu", ] [siek.homepages] siek_homepage = "http://homes.soic.indiana.edu/jsiek/" [simic] name = "Danijela Simić" [simic.emails] [simic.emails.simic_email] user = [ "danijela", ] host = [ "matf", "bg", "ac", "rs", ] [simic.homepages] simic_homepage = "http://poincare.matf.bg.ac.rs/~danijela" [sison] name = "Robert Sison" [sison.emails] [sison.homepages] [smaus] name = "Jan-Georg Smaus" [smaus.emails] [smaus.homepages] smaus_homepage = "http://www.irit.fr/~Jan-Georg.Smaus" [smola] name = "Filip Smola" [smola.emails] [smola.emails.smola_email] user = [ "f", "smola", ] host = [ "sms", "ed", "ac", "uk", ] [smola.homepages] [snelting] name = "Gregor Snelting" [snelting.emails] [snelting.homepages] snelting_homepage = "http://pp.info.uni-karlsruhe.de/personhp/gregor_snelting.php" [somaini] name = "Ivano Somaini" [somaini.emails] [somaini.homepages] [somogyi] name = "Dániel Somogyi" [somogyi.emails] [somogyi.homepages] [spasic] name = "Mirko Spasić" [spasic.emails] [spasic.emails.spasic_email] user = [ "mirko", ] host = [ "matf", "bg", "ac", "rs", ] [spasic.homepages] [spichkova] name = "Maria Spichkova" [spichkova.emails] [spichkova.emails.spichkova_email] user = [ "maria", "spichkova", ] host = [ "rmit", "edu", "au", ] [spichkova.homepages] [spitz] name = "Maximilian Spitz" [spitz.emails] [spitz.emails.spitz_email] user = [ "maximilian", "spitz", ] host = [ "tum", "de", ] [spitz.homepages] [sprenger] name = "Christoph Sprenger" [sprenger.emails] [sprenger.emails.sprenger_email] user = [ "sprenger", ] host = [ "inf", "ethz", "ch", ] [sprenger.homepages] [springsklee] name = "Valentin Springsklee" [springsklee.emails] [springsklee.emails.springsklee_email] user = [ "uidpn>", ] host = [ "student", "kit", "edu", ] [springsklee.homepages] [srba] name = "Jiří Srba" orcid = "0000-0001-5551-6547" [srba.emails] [srba.homepages] srba_homepage = "https://homes.cs.aau.dk/~srba/" [staats] name = "Charles Staats" [staats.emails] [staats.emails.staats_email] user = [ "cstaats", ] host = [ "google", "com", ] [staats.emails.staats_email1] user = [ "charles", "staats", "iii", ] host = [ "gmail", "com", ] [staats.homepages] [stannett] name = "Mike Stannett" [stannett.emails] [stannett.emails.stannett_email] user = [ "m", "stannett", ] host = [ "sheffield", "ac", "uk", ] [stannett.homepages] [stark] name = "Eugene W. Stark" [stark.emails] [stark.emails.stark_email] user = [ "stark", ] host = [ "cs", "stonybrook", "edu", ] [stark.homepages] [starosta] name = "Štěpán Starosta" [starosta.emails] [starosta.emails.starosta_email] user = [ "stepan", "starosta", ] host = [ "fit", "cvut", "cz", ] [starosta.homepages] starosta_homepage = "https://staroste.pages.fit/" [steen] name = "Alexander Steen" [steen.emails] [steen.homepages] [steinberg] name = "Matías Steinberg" [steinberg.emails] [steinberg.emails.steinberg_email] user = [ "matias", "steinberg", ] host = [ "mi", "unc", "edu", "ar", ] [steinberg.homepages] [stell] name = "Amy Stell" orcid = "0000-0003-0714-3269" [stell.emails] [stell.emails.stell_email] user = [ "as1343", ] host = [ "exeter", "ac", "uk", ] [stell.homepages] stell_homepage = "https://computerscience.exeter.ac.uk/staff/as1343?sm=as1343" [stephan] name = "Werner Stephan" [stephan.emails] [stephan.emails.stephan_email] user = [ "stephan", ] host = [ "dfki", "de", ] [stephan.homepages] [sternagel] name = "Christian Sternagel" [sternagel.emails] [sternagel.emails.sternagel_email] user = [ "c", "sternagel", ] host = [ "gmail", "com", ] [sternagel.emails.sternagel_email1] user = [ "christian", "sternagel", ] host = [ "uibk", "ac", "at", ] [sternagel.homepages] sternagel_homepage = "http://cl-informatik.uibk.ac.at/users/griff/" [sternagelt] name = "Thomas Sternagel" [sternagelt.emails] [sternagelt.homepages] [stevens] name = "Lukas Stevens" [stevens.emails] [stevens.emails.stevens_email] user = [ "lukas", "stevens", ] host = [ "in", "tum", "de", ] [stevens.homepages] stevens_homepage = "https://www21.in.tum.de/team/stevensl" [stock] name = "Benedikt Stock" [stock.emails] [stock.emails.stock_email] user = [ "benedikt1999", ] host = [ "freenet", "de", ] [stock.homepages] [stoeckl] name = "Bernhard Stöckl" [stoeckl.emails] [stoeckl.emails.stoeckl_email] user = [ "stoeckl", ] host = [ "in", "tum", "de", ] [stoeckl.homepages] [stricker] name = "Christian Stricker" [stricker.emails] [stricker.homepages] stricker_homepage = "http://dss.in.tum.de/staff/christian-stricker.html" [strnisa] name = "Rok Strniša" [strnisa.emails] [strnisa.emails.strnisa_email] user = [ "rok", ] host = [ "strnisa", "com", ] [strnisa.homepages] strnisa_homepage = "http://rok.strnisa.com/lj/" [struth] name = "Georg Struth" [struth.emails] [struth.emails.struth_email] user = [ "g", "struth", ] host = [ "sheffield", "ac", "uk", ] [struth.homepages] struth_homepage = "http://staffwww.dcs.shef.ac.uk/people/G.Struth/" [stueber] name = "Anke Stüber" [stueber.emails] [stueber.emails.stueber_email] user = [ "anke", "stueber", ] host = [ "campus", "tu-berlin", "de", ] [stueber.homepages] +[stuebinger] +name = "Terru Stübinger" +orcid = "0009-0006-7411-2533" + +[stuebinger.emails] + +[stuebinger.homepages] +stuebinger_homepage = "https://stuebinm.eu/" + [stuewe] name = "Daniel Stüwe" [stuewe.emails] [stuewe.homepages] [sudbrock] name = "Henning Sudbrock" [sudbrock.emails] [sudbrock.emails.sudbrock_email] user = [ "sudbrock", ] host = [ "mais", "informatik", "tu-darmstadt", "de", ] [sudbrock.homepages] [sudhof] name = "Henry Sudhof" [sudhof.emails] [sudhof.emails.sudhof_email] user = [ "hsudhof", ] host = [ "cs", "tu-berlin", "de", ] [sudhof.homepages] [sulejmani] name = "Ujkan Sulejmani" [sulejmani.emails] [sulejmani.emails.sulejmani_email] user = [ "ujkan", "sulejmani", ] host = [ "tum", "de", ] [sulejmani.emails.sulejmani_email1] user = [ "ujkan99", ] host = [ "gmail", "com", ] [sulejmani.homepages] [sutcliffe] name = "Geoff Sutcliffe" [sutcliffe.emails] [sutcliffe.homepages] [sylvestre] name = "Jeremy Sylvestre" [sylvestre.emails] [sylvestre.emails.sylvestre_email] user = [ "jeremy", "sylvestre", ] host = [ "ualberta", "ca", ] [sylvestre.emails.sylvestre_email1] user = [ "jsylvest", ] host = [ "ualberta", "ca", ] [sylvestre.homepages] sylvestre_homepage = "http://ualberta.ca/~jsylvest/" [szekely] name = "Gergely Szekely" [szekely.emails] [szekely.homepages] szekely_homepage = "https://users.renyi.hu/~turms/" [taha] name = "Safouan Taha" [taha.emails] [taha.emails.taha_email] user = [ "safouan", "taha", ] host = [ "lri", "fr", ] [taha.homepages] [tan] name = "Yong Kiam Tan" [tan.emails] [tan.emails.tan_email] user = [ "yongkiat", ] host = [ "cs", "cmu", "edu", ] [tan.homepages] tan_homepage = "https://www.cs.cmu.edu/~yongkiat/" [tanaka] name = "Miki Tanaka" [tanaka.emails] [tanaka.emails.tanaka_email] user = [ "miki", "tanaka", ] host = [ "unsw", "edu", "au", ] [tanaka.homepages] [tasch] name = "Markus Tasch" [tasch.emails] [tasch.emails.tasch_email] user = [ "tasch", ] host = [ "mais", "informatik", "tu-darmstadt", "de", ] [tasch.homepages] [taylor] name = "Ramsay G. Taylor" [taylor.emails] [taylor.emails.taylor_email] user = [ "r", "g", "taylor", ] host = [ "sheffield", "ac", "uk", ] [taylor.homepages] [terraf] name = "Pedro Sánchez Terraf" [terraf.emails] [terraf.emails.terraf_email] user = [ "psterraf", ] host = [ "unc", "edu", "ar", ] [terraf.homepages] terraf_homepage = "https://cs.famaf.unc.edu.ar/~pedro/home_en.html" [thiemann] name = "René Thiemann" [thiemann.emails] [thiemann.emails.thiemann_email] user = [ "rene", "thiemann", ] host = [ "uibk", "ac", "at", ] [thiemann.homepages] thiemann_homepage = "http://cl-informatik.uibk.ac.at/users/thiemann/" [thommes] name = "Joseph Thommes" [thommes.emails] [thommes.emails.thommes_email] user = [ "joseph-thommes", ] host = [ "gmx", "de", ] [thommes.homepages] [thomson] name = "Fox Thomson" [thomson.emails] [thomson.emails.thomson_email] user = [ "foxthomson0", ] host = [ "gmail", "com", ] [thomson.homepages] [tiu] name = "Alwen Tiu" [tiu.emails] [tiu.emails.tiu_email] user = [ "ATiu", ] host = [ "ntu", "edu", "sg", ] [tiu.homepages] tiu_homepage = "http://users.cecs.anu.edu.au/~tiu/" [toth] name = "Balazs Toth" [toth.emails] [toth.emails.toth_email] user = [ "balazs", "toth", ] host = [ "tum", "de", ] [toth.homepages] [tourret] name = "Sophie Tourret" [tourret.emails] [tourret.emails.tourret_email] user = [ "stourret", ] host = [ "mpi-inf", "mpg", "de", ] [tourret.homepages] tourret_homepage = "https://www.mpi-inf.mpg.de/departments/automation-of-logic/people/sophie-tourret/" [trachtenherz] name = "David Trachtenherz" [trachtenherz.emails] [trachtenherz.homepages] [traut] name = "Christoph Traut" [traut.emails] [traut.homepages] [traytel] name = "Dmitriy Traytel" [traytel.emails] [traytel.emails.traytel_email] user = [ "traytel", ] host = [ "in", "tum", "de", ] [traytel.emails.traytel_email1] user = [ "traytel", ] host = [ "inf", "ethz", "ch", ] [traytel.emails.traytel_email2] user = [ "traytel", ] host = [ "di", "ku", "dk", ] [traytel.homepages] traytel_homepage = "https://traytel.bitbucket.io/" [trelat] name = "Vincent Trélat" [trelat.emails] [trelat.emails.trelat_email] user = [ "vincent", "trelat", ] host = [ "depinfonancy", "net", ] [trelat.homepages] [tuerk] name = "Thomas Tuerk" [tuerk.emails] [tuerk.homepages] [tuong] name = "Frédéric Tuong" [tuong.emails] [tuong.emails.tuong_email] user = [ "tuong", ] host = [ "users", "gforge", "inria", "fr", ] [tuong.emails.tuong_email1] user = [ "ftuong", ] host = [ "lri", "fr", ] [tuong.homepages] tuong_homepage = "https://www.lri.fr/~ftuong/" [tuongj] name = "Joseph Tuong" [tuongj.emails] [tuongj.homepages] [tverdyshev] name = "Sergey Tverdyshev" [tverdyshev.emails] [tverdyshev.emails.tverdyshev_email] user = [ "stv", ] host = [ "sysgo", "com", ] [tverdyshev.homepages] [ullrich] name = "Sebastian Ullrich" [ullrich.emails] [ullrich.emails.ullrich_email] user = [ "sebasti", ] host = [ "nullri", "ch", ] [ullrich.homepages] [unruh] name = "Dominique Unruh" [unruh.emails] [unruh.emails.unruh_email] user = [ "unruh", ] host = [ "ut", "ee", ] [unruh.homepages] unruh_homepage = "https://www.ut.ee/~unruh/" [urban] name = "Christian Urban" [urban.emails] [urban.emails.urban_email] user = [ "christian", "urban", ] host = [ "kcl", "ac", "uk", ] [urban.homepages] urban_homepage = "https://nms.kcl.ac.uk/christian.urban/" [van] name = "Hai Nguyen Van" [van.emails] [van.emails.van_email] user = [ "hai", "nguyenvan", "phie", ] host = [ "gmail", "com", ] [van.homepages] [velykis] name = "Andrius Velykis" [velykis.emails] [velykis.homepages] velykis_homepage = "http://andrius.velykis.lt" [verbeek] name = "Freek Verbeek" [verbeek.emails] [verbeek.emails.verbeek_email] user = [ "Freek", "Verbeek", ] host = [ "ou", "nl", ] [verbeek.emails.verbeek_email1] user = [ "freek", ] host = [ "vt", "edu", ] [verbeek.homepages] [villadsen] name = "Jørgen Villadsen" [villadsen.emails] [villadsen.emails.villadsen_email] user = [ "jovi", ] host = [ "dtu", "dk", ] [villadsen.homepages] villadsen_homepage = "https://people.compute.dtu.dk/jovi/" [voisin] name = "Frederic Voisin" [voisin.emails] [voisin.homepages] [vytiniotis] name = "Dimitrios Vytiniotis" [vytiniotis.emails] [vytiniotis.homepages] vytiniotis_homepage = "http://research.microsoft.com/en-us/people/dimitris/" [wagner] name = "Max Wagner" [wagner.emails] [wagner.emails.wagner_email] user = [ "max", ] host = [ "trollbu", "de", ] [wagner.homepages] [waldmann] name = "Uwe Waldmann" [waldmann.emails] [waldmann.emails.waldmann_email] user = [ "waldmann", ] host = [ "mpi-inf", "mpg", "de", ] [waldmann.homepages] [wand] name = "Daniel Wand" [wand.emails] [wand.emails.wand_email] user = [ "dwand", ] host = [ "mpi-inf", "mpg", "de", ] [wand.homepages] [wang] name = "Shuling Wang" [wang.emails] [wang.homepages] [wassell] name = "Mark Wassell" [wassell.emails] [wassell.emails.wassell_email] user = [ "mpwassell", ] host = [ "gmail", "com", ] [wassell.homepages] [wasserrab] name = "Daniel Wasserrab" [wasserrab.emails] [wasserrab.homepages] wasserrab_homepage = "http://pp.info.uni-karlsruhe.de/personhp/daniel_wasserrab.php" [watt] name = "Conrad Watt" [watt.emails] [watt.emails.watt_email] user = [ "caw77", ] host = [ "cam", "ac", "uk", ] [watt.homepages] watt_homepage = "http://www.cl.cam.ac.uk/~caw77/" [weber] name = "Tjark Weber" [weber.emails] [weber.emails.weber_email] user = [ "tjark", "weber", ] host = [ "it", "uu", "se", ] [weber.homepages] weber_homepage = "http://user.it.uu.se/~tjawe125/" [weerwag] name = "Timmy Weerwag" [weerwag.emails] [weerwag.homepages] [weidner] name = "Arno Wilhelm-Weidner" [weidner.emails] [weidner.emails.weidner_email] user = [ "arno", "wilhelm-weidner", ] host = [ "tu-berlin", "de", ] [weidner.homepages] [wenninger] name = "Elias Wenninger" [wenninger.emails] [wenninger.homepages] [wenzel] name = "Makarius Wenzel" [wenzel.emails] [wenzel.emails.wenzel_email] user = [ "makarius", ] host = [ "sketis", "net", ] [wenzel.homepages] [whitley] name = "A Whitley" [whitley.emails] [whitley.emails.whitley_email] user = [ "awhitley", ] host = [ "gmail", "com", ] [whitley.homepages] [wickerson] name = "John Wickerson" [wickerson.emails] [wickerson.homepages] wickerson_homepage = "http://www.doc.ic.ac.uk/~jpw48" [willenbrink] name = "Sebastian Willenbrink" [willenbrink.emails] [willenbrink.emails.willenbrink_email] user = [ "sebastian", "willenbrink", ] host = [ "tum", "de", ] [willenbrink.homepages] [wimmer] name = "Simon Wimmer" [wimmer.emails] [wimmer.emails.wimmer_email] user = [ "simon", "wimmer", ] host = [ "tum", "de", ] [wimmer.homepages] wimmer_homepage = "http://home.in.tum.de/~wimmers/" [wirt] name = "Kai Wirt" [wirt.emails] [wirt.homepages] [wolff] name = "Burkhart Wolff" [wolff.emails] [wolff.emails.wolff_email] user = [ "burkhart", "wolff", ] host = [ "lri", "fr", ] [wolff.homepages] wolff_homepage = "https://www.lri.fr/~wolff/" [wu] name = "Chunhan Wu" [wu.emails] [wu.homepages] [xu] name = "Jian Xu" [xu.emails] [xu.homepages] [yamada] name = "Akihisa Yamada" [yamada.emails] [yamada.emails.yamada_email] user = [ "akihisa", "yamada", ] host = [ "uibk", "ac", "at", ] [yamada.emails.yamada_email1] user = [ "ayamada", ] host = [ "trs", "cm", "is", "nagoya-u", "ac", "jp", ] [yamada.emails.yamada_email2] user = [ "akihisa", "yamada", ] host = [ "aist", "go", "jp", ] [yamada.emails.yamada_email3] user = [ "akihisayamada", ] host = [ "nii", "ac", "jp", ] [yamada.homepages] yamada_homepage = "http://group-mmm.org/~ayamada/" [ye] name = "Lina Ye" [ye.emails] [ye.emails.ye_email] user = [ "lina", "ye", ] host = [ "lri", "fr", ] [ye.homepages] [yez] name = "Zhengkun Ye" [yez.emails] [yez.emails.yez_email] user = [ "zy307", ] host = [ "cam", "ac", "uk", ] [yez.homepages] [ying] name = "Shenggang Ying" [ying.emails] [ying.homepages] [yingm] name = "Mingsheng Ying" [yingm.emails] [yingm.homepages] [yu] name = "Lei Yu" [yu.emails] [yu.emails.yu_email] user = [ "yulei0603", ] host = [ "gmail", "com", ] [yu.homepages] [zankl] name = "Harald Zankl" [zankl.emails] [zankl.emails.zankl_email] user = [ "Harald", "Zankl", ] host = [ "uibk", "ac", "at", ] [zankl.homepages] zankl_homepage = "http://cl-informatik.uibk.ac.at/users/hzankl" [zee] name = "Karen Zee" [zee.emails] [zee.emails.zee_email] user = [ "kkz", ] host = [ "mit", "edu", ] [zee.homepages] zee_homepage = "http://www.mit.edu/~kkz/" [zeller] name = "Peter Zeller" [zeller.emails] [zeller.emails.zeller_email] user = [ "p_zeller", ] host = [ "cs", "uni-kl", "de", ] [zeller.homepages] [zeyda] name = "Frank Zeyda" [zeyda.emails] [zeyda.emails.zeyda_email] user = [ "frank", "zeyda", ] host = [ "york", "ac", "uk", ] [zeyda.homepages] [zhan] name = "Bohua Zhan" [zhan.emails] [zhan.emails.zhan_email] user = [ "bzhan", ] host = [ "ios", "ac", "cn", ] [zhan.homepages] zhan_homepage = "http://lcs.ios.ac.cn/~bzhan/" [zhang] name = "Yu Zhang" [zhang.emails] [zhang.homepages] [zhangx] name = "Xingyuan Zhang" [zhangx.emails] [zhangx.homepages] [zhann] name = "Naijun Zhan" [zhann.emails] [zhann.homepages] diff --git a/metadata/entries/Approximate_Model_Counting.toml b/metadata/entries/Approximate_Model_Counting.toml new file mode 100644 --- /dev/null +++ b/metadata/entries/Approximate_Model_Counting.toml @@ -0,0 +1,40 @@ +title = "Approximate Model Counting" +date = 2024-03-15 +topics = [ + "Computer science/Algorithms/Approximation", + "Computer science/Algorithms/Randomized", +] +abstract = """ +Approximate model counting is the task of approximating the number of solutions +to an input formula. This entry formalizes $\\mathsf{ApproxMC}$, an algorithm +due to Chakraborty et al. with a +probably approximately correct (PAC) guarantee, i.e., $\\mathsf{ApproxMC}$ +returns a multiplicative $(1+\\varepsilon)$-factor approximation of the model +count with probability at least $1 - \\delta$, where $\\varepsilon > 0$ and $0 < +\\delta \\leq 1$. The algorithmic specification is further refined to a verified +certificate checker that can be used to validate the results of untrusted +$\\mathsf{ApproxMC}$ implementations (assuming access to trusted randomness).""" +license = "bsd" +note = "" + +[authors] + +[authors.tan] +email = "tan_email" + +[authors.yang] +email = "yang_email" + +[contributors] + +[notify] +tan = "tan_email" +yang = "yang_email" + +[history] + +[extra] + +[related] +dois = [] +pubs = [] diff --git a/metadata/entries/Continued_Fractions.toml b/metadata/entries/Continued_Fractions.toml new file mode 100644 --- /dev/null +++ b/metadata/entries/Continued_Fractions.toml @@ -0,0 +1,41 @@ +title = "Continued Fractions" +date = 2024-03-20 +topics = [ + "Mathematics/Analysis", +] +abstract = """ +

This article provides a formalisation of continued fractions of real numbers and their basic properties. +It also contains a proof of the classic result that the irrational numbers with periodic continued + fraction expansions are precisely the quadratic irrationals, i.e. real numbers that fulfil a non-trivial quadratic equation $a x^2 + b x + c = 0$ with integer coefficients.

+

+Particular attention is given to the continued fraction expansion of $\\sqrt{D}$ for a non-square + natural number $D$. Basic results about the length and structure of its period are provided, + along with an executable algorithm to compute the period (and from it, the entire expansion).

+

+This is then also used to provide a fairly efficient, executable, and fully formalised algorithm to +compute solutions to Pell's equation $x^2 - D y^2 = 1$. The performance is sufficiently good to +find the solution to Archimedes's cattle problem in less than a second on a typical computer. +This involves the value $D = 410286423278424$, for which the solution has over 200000 decimals.

+

+Lastly, a derivation of the continued fraction expansions of Euler's number $e$ and an executable +function to compute continued fraction expansions using interval arithmetic is also provided.

""" +license = "bsd" +note = "" + +[authors] + +[authors.eberl] +email = "eberl_email" + +[contributors] + +[notify] +eberl = "eberl_email" + +[history] + +[extra] + +[related] +dois = [] +pubs = [] diff --git a/metadata/entries/Go.toml b/metadata/entries/Go.toml new file mode 100644 --- /dev/null +++ b/metadata/entries/Go.toml @@ -0,0 +1,35 @@ +title = "Go Code Generation for Isabelle" +date = 2024-01-22 +topics = [ + "Tools", +] +abstract = """ +This entry contains a standalone code generation target for the Go programming language. +Unlike the previous targets, Go is not a functional language and encourages code in an imperative style, thus many of the features of Isabelle's language (particularly data types, pattern matching, and type classes) have to be emulated using imperative language constructs in Go. +To generate Go code, users can simply import this entry, which makes the Go target available.""" +license = "bsd" +note = "" + +[authors] + +[authors.stuebinger] +homepage = "stuebinger_homepage" + +[authors.hupel] +homepage = "hupel_homepage" + +[contributors] + +[notify] +hupel = "hupel_email" + +[history] + +[extra] + +[related] +dois = [ + "10.48550/arXiv.2310.02704", + "10.5281/zenodo.8401392", +] +pubs = [] diff --git a/thys/Approximate_Model_Counting/ApproxMCAnalysis.thy b/thys/Approximate_Model_Counting/ApproxMCAnalysis.thy new file mode 100644 --- /dev/null +++ b/thys/Approximate_Model_Counting/ApproxMCAnalysis.thy @@ -0,0 +1,764 @@ +section \ ApproxMC definition and analysis \ + +text \ + This section puts together preceding results to formalize the + PAC guarantee of ApproxMC. +\ + +theory ApproxMCAnalysis imports + ApproxMCCoreAnalysis + RandomXORHashFamily + Median_Method.Median +begin + +lemma replicate_pmf_Pi_pmf: + assumes "distinct ls" + shows "replicate_pmf (length ls) P = + map_pmf (\f. map f ls) + (Pi_pmf (set ls) def (\_. P))" + using assms +proof (induction ls) + case Nil + then show ?case + by auto +next + case (Cons x xs) + then show ?case + by (auto intro!: bind_pmf_cong simp add: Pi_pmf_insert' map_bind_pmf bind_map_pmf) +qed + +lemma replicate_pmf_Pi_pmf': + assumes "finite V" + shows "replicate_pmf (card V) P = + map_pmf (\f. map f (sorted_list_of_set V)) + (Pi_pmf V def (\_. P))" +proof - + have *:"card V = length (sorted_list_of_set V)" + using assms by auto + show ?thesis + unfolding * + apply (subst replicate_pmf_Pi_pmf) + using assms by auto +qed + +definition map_of_default::"('a \ 'b) list \ 'b \ 'a \ 'b" +where "map_of_default ls def = + (let m = map_of ls in + (\x. case m x of None \ def | Some v \ v))" + +lemma Pi_pmf_replicate_pmf: + assumes "finite V" + shows + "(Pi_pmf V def (\_. p)) = + map_pmf (\bs. + map_of_default (zip (sorted_list_of_set V) bs) def) + (replicate_pmf (card V) p)" +proof - + show ?thesis + apply (subst replicate_pmf_Pi_pmf'[OF assms, where def="def"]) + unfolding map_pmf_comp + apply (intro map_pmf_idI[symmetric]) + unfolding map_of_default_def Let_def fun_eq_iff map_of_zip_map + by (smt (verit, del_insts) assms option.case(1) option.case(2) pmf_Pi pmf_eq_0_set_pmf sorted_list_of_set.set_sorted_key_list_of_set) +qed + +lemma proj_inter_neutral: + assumes "\w. w \ B \ restr S w \ C" + shows "proj S (A \ B) = proj S A \ C" + unfolding ApproxMCCore.proj_def + using assms by auto + +text \ + An abstract spec of ApproxMC for any Boolean theory. + This locale must be instantiated with a theory implementing the two + the functions below (and satisfying the assumption linking them). +\ +locale ApproxMC = + fixes sols :: "'fml \ ('a \ bool) set" + fixes enc_xor :: "'a set \ bool \ 'fml \ 'fml" + assumes sols_enc_xor: + "\F xor. finite (fst xor) \ + sols (enc_xor xor F) = + sols F \ {\. satisfies_xor xor {x. \ x}}" +begin + +definition compute_thresh :: "real \ nat" + where "compute_thresh \ = + nat \1 + 9.84 * (1 + \ / (1 + \)) * (1 + 1 / \)^2\" + +definition fix_t :: "real \ nat" + where "fix_t \ = + nat \ln (1 / \) /(2 * (0.5-0.36)^2)\" + +definition raw_median_bound :: "real \ nat \ real" + where "raw_median_bound \ t = + (\i = 0..t div 2. + (t choose i) * (1 / 2 + \) ^ i * (1 / 2 - \) ^ (t - i))" + +definition compute_t :: "real \ nat \ nat" + where "compute_t \ n = + (if raw_median_bound 0.14 n < \ then n + else fix_t \)" + +(* The size of the projected solution set after adding i XORs*) +definition size_xor ::" + 'fml \ 'a set \ + (nat \ ('a set \ bool) option) \ + nat \ nat" + where "size_xor F S xorsf i = ( + let xors = map (the \ xorsf) [0.. 'a set \ + nat \ + (nat \ ('a set \ bool) option) \ + nat \ bool" + where "check_xor F S thresh xorsf i = + (size_xor F S xorsf i < thresh)" + +definition approxcore_xors :: " + 'fml \ 'a set \ + nat \ + (nat \ ('a set \ bool) option) \ + nat" + where " + approxcore_xors F S thresh xorsf = + (case List.find + (check_xor F S thresh xorsf) [1.. 2 ^ card S + | Some m \ + (2 ^ m * size_xor F S xorsf m))" + +definition approxmccore :: "'fml \ 'a set \ nat \ nat pmf" +where "approxmccore F S thresh = + map_pmf (approxcore_xors F S thresh) (random_xors S (card S - 1))" + +definition approxmc :: "'fml \ 'a set \ real \ real \ nat \ nat pmf" + where "approxmc F S \ \ n = ( + let thresh = compute_thresh \ in + if card (proj S (sols F)) < thresh then + return_pmf (card (proj S (sols F))) + else + let t = compute_t \ n in + map_pmf (median t) + (prod_pmf {0..i. approxmccore F S thresh)) + )" + +lemma median_commute: + assumes "t \ 1" + shows "(real \ median t) = (\w::nat \ nat. median t (real \ w))" + unfolding median_def map_map[symmetric] + apply (subst Median.map_sort[where f = "\x. real x"]) + subgoal by (clarsimp simp add:mono_def) + apply (subst nth_map) + using assms by auto + +lemma median_default: + shows "median t y = median t (\x. if x < t then y x else def)" + unfolding median_def + by (auto intro!: arg_cong[where f = "\ls. sort ls ! (t div 2)"]) + +definition default_\::"'a set \ nat assg" + where "default_\ S i = (if i < card S - 1 then Some True else None)" + +lemma dom_default_\: + "dom (default_\ S) = {0.._def split: if_splits) + +lemma compute_thresh_bound_4: + assumes "\ > 0" + shows"4 < compute_thresh \" +proof - + have 1: "(1 + \ / (1 + \)) > 1" + using assms + by simp + have 2: "(1 + 1 / \)^2 > 1" + using assms by simp + + define a where "a = (1 + \ / (1 + \)) * (1 + 1 / \)\<^sup>2" + have "a > 1" unfolding a_def + using 1 2 + using less_1_mult by blast + then have "(984 / 10\<^sup>2) * a \ 4" + by auto + + thus ?thesis + unfolding compute_thresh_def + by (smt (verit) a_def arith_special(2) arithmetic_simps(1) more_arith_simps(11) nat_less_real_le numeral_Bit0 of_nat_numeral real_nat_ceiling_ge) +qed + +lemma satisfies_xor_with_domain: + assumes "fst x \ S" + shows "satisfies_xor x {x. w x} \ + satisfies_xor x ({x. w x} \ S)" + using assms + apply (cases x) + by (simp add: Int_assoc inf.absorb_iff2) + +(* The main step, where we instantiate the ApproxMCCore locale *) +lemma approxcore_xors_eq: + assumes thresh: + "thresh = compute_thresh \" + "thresh \ card (proj S (sols F))" + assumes \: "\ > (0::real)" "\ \ 1" + assumes S: "finite S" + shows "measure_pmf.prob (random_xors S (card S - 1)) + {xors. real (approxcore_xors F S thresh xors) \ + {real (card (proj S (sols F))) / (1 + \).. + (1 + \) * real (card (proj S (sols F)))}} \ 0.64" +proof - + + have "ApproxMCCore (sols F) S \ (default_\ S) thresh" + apply unfold_locales + subgoal using dom_default_\ by simp + subgoal using \ by simp + subgoal using thresh assms(3) compute_thresh_bound_4 by blast + using thresh S by auto + then interpret amc: ApproxMCCore "sols F" _ _ "(default_\ S)" . + + have " + m < card S \ + {0.. dom xors \ + (\i. i < m \ fst (the (xors i)) \ S) \ + (proj S + (sols (fold enc_xor (map (the \ xors) [0.. + {w. hslice m (\\. xor_hash \ xors) w = + aslice m (default_\ S)}" for m xors + proof (induction m) + case 0 + then show ?case + unfolding hslice_def aslice_def + by auto + next + case (Suc m) + have m: "m \ dom xors" + by (meson Set.basic_monos(7) Suc(3) atLeastLessThan_iff le0 lessI) + have sp: "fst (the (xors m)) \ S" + by (simp add: Suc(4)) + + then obtain xor where x: "xors m = Some xor" + using m by blast + + have eq: "{w. xor_hash w xors m = Some True} = + {\. satisfies_xor xor {x. \ x = Some True}}" + unfolding xor_hash_def + by (clarsimp simp add: x) + + have neut: "\w. + w \ {\. satisfies_xor xor {x. \ x}} \ + restr S w \ {\. satisfies_xor xor {x. \ x = Some True}}" + using sp unfolding restr_def + by (smt (verit, ccfv_SIG) Collect_cong Int_def mem_Collect_eq option.sel satisfies_xor_with_domain x) + + have lhs: " + proj S + (sols (fold enc_xor (map (the \ xors) [0.. xors) [0.. + {w. xor_hash w xors m = Some True}" + apply clarsimp + apply (subst sols_enc_xor) + subgoal using assms(5) rev_finite_subset sp by blast + apply (subst proj_inter_neutral) + using eq neut x by auto + + have rhs1:" hslice (Suc m) (\\. xor_hash \ xors) w = aslice (Suc m) (default_\ S) \ + hslice m (\\. xor_hash \ xors) w = aslice m (default_\ S)" for w + unfolding hslice_def aslice_def fun_eq_iff + by (auto simp add:lessThan_Suc restrict_map_def split: if_splits) + + have rhs2:"hslice (Suc m) (\\. xor_hash \ xors) w = aslice (Suc m) (default_\ S) \ + xor_hash w xors m = Some True" for w + unfolding hslice_def aslice_def fun_eq_iff + apply (clarsimp simp add:lessThan_Suc restrict_map_def ) + by (metis default_\_def domIff m xor_hash_eq_dom) + + have rhs3: "hslice m (\\. xor_hash \ xors) w = aslice m (default_\ S) \ + xor_hash w xors m = Some True \ + hslice (Suc m) (\\. xor_hash \ xors) w = aslice (Suc m) (default_\ S)" for w + unfolding hslice_def aslice_def fun_eq_iff + apply (clarsimp simp add:lessThan_Suc restrict_map_def ) + by (metis One_nat_def Suc.prems(1) Suc_lessD Suc_less_eq Suc_pred default_\_def gr_zeroI zero_less_diff) + + have rhs: "{w. hslice (Suc m) (\\. xor_hash \ xors) w = aslice (Suc m) (default_\ S)} = + {w. hslice m (\\. xor_hash \ xors) w = aslice m (default_\ S)} \ + {w. xor_hash w xors m = Some True}" + by (auto simp add: rhs1 rhs2 rhs3) + + have ih: "proj S (sols (fold enc_xor (map (the \ xors) [0.. + {w. hslice m (\\. xor_hash \ xors) w = aslice m (default_\ S)}" + apply (intro Suc(1)) + using Suc(2) Suc_lessD apply blast + using Suc(3) atLeast0_lessThan_Suc apply blast + using Suc(4) less_SucI by blast + + show ?case + unfolding lhs rhs + by (simp add: Int_ac(1) ih) + qed + then have *: " + m < card S \ + {0.. dom xors \ + (\i. i < m \ fst (the (xors i)) \ S) \ + size_xor F S xors m = + amc.card_slice (\\. xor_hash \ xors) m" for m xors + unfolding size_xor_def amc.card_slice_def + by auto + + have **: " + {0.. dom xors \ + (\i. i < card S - 1 \ fst (the (xors i)) \ S) \ + find (check_xor F S thresh xors) [1..i. (\\. xor_hash \ xors) \ amc.T i) [1.. dom xors \ + (\i. i < card S - 1 \ fst (the (xors i)) \ S) \ + approxcore_xors F S thresh xors = + (\(a,b). a*b) (amc.approxcore (\\. xor_hash \ xors))" for xors + apply (subst amc.approxcore_def) + unfolding approxcore_xors_def + apply (subst **) + subgoal by clarsimp + subgoal by clarsimp + apply (clarsimp split: option.split) + apply (subst *) + subgoal by (auto simp add: find_Some_iff domIff subset_iff) + subgoal by (auto simp add: find_Some_iff domIff subset_iff) + subgoal + using \\x2. \{0.. dom xors; \i. i < card S - Suc 0 \ fst (the (xors i)) \ S; find (\i. (\\. xor_hash \ xors) \ amc.T i) [Suc 0.. \ x2 < card S\ by auto + by auto + + from xor_hash_family_2_universal[OF S] + have univ:"prob_space.k_universal (measure_pmf (random_xors S (card S - 1))) 2 + xor_hash {\. dom \ = S} {\. dom \ = {0..s w. xor_hash w s) (random_xors S (card S - 1))) + amc.approxcore_fail \ 0.36" + apply (intro amc.analysis_3[OF _ _ univ]) + apply (smt (verit, ccfv_SIG) Groups.mult_ac(3) amc.pivot_def assms(1) compute_thresh_def more_arith_simps(11) real_nat_ceiling_ge) + using S finite_random_xors_set_pmf apply blast + using \ by auto + + then have b: "measure_pmf.prob + (random_xors S (card S - 1)) + {xors. + (real ((\(a,b). a*b) (amc.approxcore (\\. xor_hash \ xors)))) + \ + {real (card (proj S (sols F))) / (1 + \).. + (1 + \) * real (card (proj S (sols F)))}} \ 0.36" + unfolding amc.approxcore_fail_def + by (auto simp add: case_prod_unfold Let_def) + + have 1: "x \ set_pmf (random_xors S (card S - Suc 0)) \ + {0.. dom x" for x + by (auto simp add:random_xors_set_pmf[OF S]) + have 2: "x \ set_pmf (random_xors S (card S - Suc 0)) \ + (\i. i < card S - 1 \ fst (the (x i)) \ S)" for x + proof - + assume x: "x \ set_pmf (random_xors S (card S - Suc 0))" + moreover { + fix i + assume i: "i < card S - 1" + from random_xors_set_pmf[OF S] + have xx: "dom x = {..<(card S - Suc 0)}" "ran x \ Pow S \ UNIV" + using x by auto + obtain xi where xi: "x i = Some xi" + using xx i apply clarsimp + by (metis atLeast0LessThan atLeastLessThan_iff bot_nat_0.extremum domIff option.exhaust surj_pair) + then have "fst xi \ S" using xx(2) + unfolding ran_def apply (clarsimp simp add: subset_iff) + by (metis prod.collapse) + then have "fst (the (x i)) \ S" by (simp add: xi) + } + thus "(\i. i < card S - 1 \ fst (the (x i)) \ S)" by auto + qed + + have "measure_pmf.prob (random_xors S (card S - 1)) + {xors. real (approxcore_xors F S thresh xors) \ + {real (card (proj S (sols F))) / (1 + \).. + (1 + \) * real (card (proj S (sols F)))}} = + measure_pmf.prob + (random_xors S (card S - 1)) + {xors. + (real ((\(a,b). a*b) (amc.approxcore (\\. xor_hash \ xors)))) + \ + {real (card (proj S (sols F))) / (1 + \).. + (1 + \) * real (card (proj S (sols F)))}}" + apply (intro measure_pmf.measure_pmf_eq[where p = "(random_xors S (card S - 1))"]) + subgoal by auto + apply clarsimp + apply (frule 1) + apply (drule 2) + apply (frule rw) + by auto + + moreover have "... = + 1 - measure_pmf.prob + (random_xors S (card S - 1)) + {xors. + (real ((\(a,b). a*b) (amc.approxcore (\\. xor_hash \ xors)))) + \ + {real (card (proj S (sols F))) / (1 + \).. + (1 + \) * real (card (proj S (sols F)))}}" + apply (subst measure_pmf.prob_compl[symmetric]) + by (auto intro!: measure_pmf.measure_pmf_eq) + moreover have "... \ 0.64" + using b + by auto + ultimately show ?thesis by auto +qed + +lemma compute_t_ge1: + assumes "0 < \" "\ < 1" + shows"compute_t \ n \ 1" +proof - + have "ln (1 / \) > 0" + by (simp add: assms) + then have fix_t: "1 \ fix_t \" + unfolding fix_t_def + by (simp add: Suc_leI) + + show ?thesis + unfolding compute_t_def + using fix_t + apply (cases n) + unfolding raw_median_bound_def + using assms by auto +qed + +lemma success_arith_bound: + assumes "s \ (f ::nat)" + assumes "p \ (1::real)" "q \ p" "1 /2 \ q" + shows "p ^ s * (1 - p) ^ f \ q ^ s * (1 - q) ^ f" +proof - + have ple: "p * (1-p) \ q * (1-q)" + using assms(2-4) + by (sos "(((A<0 * R<1) + ((R<1 * (R<1 * [p + ~1*q]^2)) + ((A<=1 * (A<=2 * R<1)) * (R<2 * [1]^2)))))") + + have feq:"f = (f-s)+s" + using Nat.le_imp_diff_is_add assms(1) by blast + then have "(1-p)^f = (1-p)^s * (1-p)^(f-s)" + by (metis add.commute power_add) + then have "p ^ s * (1 - p) ^ f = + (p * (1-p)) ^ s * (1 - p) ^ (f-s)" + by (simp add: power_mult_distrib) + moreover have "... \ + (q * (1-q)) ^ s * (1 - p) ^ (f-s)" + by (smt (verit) assms(1) assms(2) assms(3) assms(4) diff_self_eq_0 divide_nonneg_nonneg mult_nonneg_nonneg mult_right_mono order_le_less ple power_0 power_eq_0_iff power_mono zero_less_diff zero_less_power) + moreover have "... \ + (q * (1-q)) ^ s * (1 - q) ^ (f-s)" + by (smt (verit, ccfv_SIG) assms(2) assms(3) assms(4) divide_eq_0_iff divide_nonneg_nonneg mult_left_mono mult_pos_pos power_mono zero_less_power) + moreover have "... = q ^ s * (1 - q) ^ f" + by (smt (verit) feq mult.assoc mult.commute power_add power_mult_distrib) + ultimately show ?thesis by auto +qed + +lemma prob_binomial_pmf_upto_mono: + assumes "1/2 \ q" "q \ p" "p \ 1" + shows " + measure_pmf.prob (binomial_pmf n p) {..n div 2} \ + measure_pmf.prob (binomial_pmf n q) {..n div 2}" +proof - + have i: "i \ n div 2 \ + p ^ i * (1 - p) ^ (n - i) \ q ^ i * (1 - q) ^ (n - i)" for i + using assms by(auto intro!: success_arith_bound) + + show ?thesis + apply (subst prob_binomial_pmf_upto) + subgoal using assms by auto + subgoal using assms by auto + apply (subst prob_binomial_pmf_upto) + subgoal using assms by auto + subgoal using assms by auto + by (auto intro!: sum_mono simp add: i ab_semigroup_mult_class.mult_ac(1) mult_left_mono) +qed + +(* The main result *) +theorem approxmc_sound: + assumes \: "\ > 0" "\ < 1" + assumes \: "\ > 0" "\ \ 1" + assumes S: "finite S" + shows "measure_pmf.prob (approxmc F S \ \ n) + {c. real c \ + {real (card (proj S (sols F))) / (1 + \).. + (1 + \) * real (card (proj S (sols F)))}} + \ 1 - \" +proof - + define thresh where "thresh = compute_thresh \" + define t where "t = compute_t \ n" + then have t1: "1 \ t" + using compute_t_ge1[OF \] by auto + + have "card (proj S (sols F)) < thresh \ + card (proj S (sols F)) \ thresh" by auto + moreover { + assume "card (proj S (sols F)) < thresh" + then have "approxmc F S \ \ n = + return_pmf (card (proj S (sols F)))" + unfolding approxmc_def Let_def thresh_def + by auto + then have "?thesis" + unfolding indicator_def of_bool_def + using assms \ + by (auto simp add: mult_le_cancel_left1 mult_le_cancel_right1 divide_le_eq) + } + moreover { + assume a: "card (proj S (sols F)) \ thresh" + define Xf where "Xf = (\(i::nat) xs. + approxcore_xors F S thresh (xs i))" + + then have *: "approxmc F S \ \ n = + map_pmf (median t) + (prod_pmf {0..i. approxmccore F S thresh))" + using a + unfolding approxmc_def Let_def thresh_def t_def + by auto + + have **: "map_pmf (real \ median t) + (Pi_pmf {0..i. approxmccore F S thresh)) = + map_pmf (\\. median t (\i. real (Xf i \))) + (prod_pmf {0..i. random_xors S (card S - 1)))" + apply (subst median_commute) + subgoal using t1 by simp + unfolding approxmccore_def + apply (subst Pi_pmf_map) + unfolding Xf_def by (auto simp add: pmf.map_comp o_def) + + define \ where "\ = (0.14 ::real)" + then have \: "\ > 0" by auto + + have indep:"prob_space.indep_vars + (measure_pmf + (prod_pmf {0..i. random_xors S (card S - 1)))) + (\_. borel) (\x xa. real (Xf x xa)) {0.. \ {0<..<1}" using \ by auto + + from approxcore_xors_eq[OF thresh_def a \ S] + have b1: "1 / 2 + \ \ + measure_pmf.prob (random_xors S (card S - 1)) + {xors. + real (approxcore_xors F S thresh xors) + \ {real (card (proj S (sols F))) / + (1 + \)..(1 + \) * real (card (proj S (sols F)))}}" + unfolding \_def by auto + then have b2: "i < t \ + 1 / 2 + \ \ + measure_pmf.prob + (prod_pmf {0..i. random_xors S (card S - 1))) + {\ \ space + (measure_pmf + (prod_pmf {0..i. random_xors S (card S - 1)))). + real (Xf i \) + \ {real (card (proj S (sols F))) /(1 + \).. + (1 + \) *real (card (proj S (sols F)))}}" for i + unfolding Xf_def apply clarsimp + apply (subst prob_prod_pmf_slice) + by auto + + have ***: "1 - \ + \ measure_pmf.prob (prod_pmf {0..i. random_xors S (card S - 1))) + {\. + median t (\i. real (Xf i \)) + \ {real (card (proj S (sols F))) / + (1 + \)..(1 + \) * real (card (proj S (sols F)))}}" + proof - + have "t = fix_t \ \ t = n \ raw_median_bound \ n < \" + unfolding t_def compute_t_def \_def by auto + moreover { + assume "t = fix_t \" + then have tb:"- ln \ / (2 * \\<^sup>2) \ real t" + unfolding fix_t_def \_def + apply clarsimp + by (metis assms(1) divide_minus_left inverse_eq_divide ln_inverse real_nat_ceiling_ge) + + from measure_pmf.median_bound_1[OF \ d indep tb] + have ?thesis using b2 by auto + } + moreover { + assume *: "t = n" "raw_median_bound \ n < \" + have s: "1 / 2 - \ = 1 - (1 /2 + \)" + by auto + + have d1: "0 < t" using t1 by linarith + have d2: "1 / 2 + \ \ 0" using \ by auto + have d3: "interval{x..y::real}" for x y + unfolding interval_def by auto + + from prob_space.median_bound_raw[OF _ d1 d2 d3 indep b2] + have "1 - + measure_pmf.prob (binomial_pmf t (1 / 2 + \)) {..t div 2} + \ measure_pmf.prob + (prod_pmf {0..i. random_xors S (card S - 1))) + {\. + median t (\i. real (Xf i \)) + \ {real (card (proj S (sols F))) / + (1 + \)..(1 + \) * real (card (proj S (sols F)))}}" + by (auto simp add: prob_space_measure_pmf) + + moreover have "measure_pmf.prob (binomial_pmf t (1 / 2 + \)) {..t div 2} \ \" + by (smt (verit, ccfv_SIG) * b1 d2 measure_pmf.prob_le_1 prob_binomial_pmf_upto raw_median_bound_def s sum.cong) + + ultimately have ?thesis by auto + } + ultimately show ?thesis by auto + qed + + have "measure_pmf.prob (approxmc F S \ \ n) + {c. real c + \ {real (card (proj S (sols F))) / + (1 + \)..(1 + \) * real (card (proj S (sols F)))}} = + measure_pmf.prob (map_pmf (real \ median t) + (prod_pmf {0..i. approxmccore F S thresh))) + {c. c \ {real (card (proj S (sols F))) / + (1 + \)..(1 + \) * real (card (proj S (sols F)))}}" + using * by auto + moreover have "... = + measure_pmf.prob (map_pmf (real \ median t) + (map_pmf (\f x. if x \ {0..i. approxmccore F S thresh)))) + {c. c \ {real (card (proj S (sols F))) / + (1 + \)..(1 + \) * real (card (proj S (sols F)))}}" + apply (subst Pi_pmf_default_swap) + by auto + moreover have "... = + measure_pmf.prob (map_pmf (real \ median t) + (Pi_pmf {0..i. approxmccore F S thresh))) + {c. c \ {real (card (proj S (sols F))) / + (1 + \)..(1 + \) * real (card (proj S (sols F)))}}" + by (clarsimp simp add: median_default[symmetric]) + moreover have "... \ 1 - \" + unfolding ** + using *** + by auto + ultimately have ?thesis by auto + } + ultimately show ?thesis by auto +qed + +text \ To simplify further analyses, we can remove the (required) upper bound on epsilon. \ + +definition mk_eps :: "real \ real" + where "mk_eps \ = (if \ > 1 then 1 else \)" + +definition approxmc'::" + 'fml \ 'a set \ + real \ real \ nat \ nat pmf" + where "approxmc' F S \ \ n = + approxmc F S (mk_eps \) \ n" + +corollary approxmc'_sound: + assumes \: "\ > 0" "\ < 1" + assumes \: "\ > 0" + assumes S: "finite S" + shows "prob_space.prob (approxmc' F S \ \ n) + {c. real c \ + {real (card (proj S (sols F))) / (1 + \).. + (1 + \) * real (card (proj S (sols F)))}} + \ 1 - \" +proof - + define \' where "\' = (if \ > 1 then 1 else \)" + have \': "0 < \'" "\' \ 1" + unfolding \'_def using \ by auto + + from approxmc_sound[OF \ \' S] + have *: "prob_space.prob (approxmc F S \' \ n) + {c. real c \ + {real (card (proj S (sols F))) / (1 + \').. + (1 + \') * real (card (proj S (sols F)))}} + \ 1 - \" . + + have **: " + {c. real c \ + {real (card (proj S (sols F))) / (1 + \').. + (1 + \') * real (card (proj S (sols F)))}} + \ + {c. real c \ + {real (card (proj S (sols F))) / (1 + \).. + (1 + \) * real (card (proj S (sols F)))}}" + unfolding \'_def + apply clarsimp + apply (rule conjI) + apply (smt (verit) field_sum_of_halves frac_less2 zero_less_divide_iff) + by (metis (no_types, opaque_lifting) add_le_cancel_left arith_special(3) dual_order.trans less_eq_real_def mult_right_mono of_nat_0_le_iff) + + show ?thesis + apply (intro order.trans[OF *]) + unfolding approxmc'_def \'_def mk_eps_def + apply (intro measure_pmf.finite_measure_mono) + using **[unfolded \'_def] + by auto +qed + +text \ This shows we can lift all randomness to the top-level (i.e., eagerly sample it). \ + +definition approxmc_map::" + 'fml \ 'a set \ + real \ real \ nat \ + (nat \ nat \ ('a set \ bool) option) \ + nat" + where "approxmc_map F S \ \ n xorsFs = ( + let \ = mk_eps \ in + let thresh = compute_thresh \ in + if card (proj S (sols F)) < thresh then + card (proj S (sols F)) + else + let t = compute_t \ n in + median t (approxcore_xors F S thresh \ xorsFs))" + +lemma approxmc_map_eq: + shows " + map_pmf (approxmc_map F S \ \ n) + (Pi_pmf {0.. n} def + (\i. random_xors S (card S - 1))) = + approxmc' F S \ \ n" +proof - + define def' where "def' = approxcore_xors F S (compute_thresh (mk_eps \)) def" + + have *: " + map_pmf (median (compute_t \ n)) + (prod_pmf {0.. n} + (\i. map_pmf + (approxcore_xors F S + (compute_thresh (mk_eps \))) + (random_xors S (card S - Suc 0)))) = + map_pmf (median (compute_t \ n)) + (Pi_pmf {0.. n} def' + (\i. map_pmf + (approxcore_xors F S + (compute_thresh (mk_eps \))) + (random_xors S (card S - Suc 0))))" + apply (subst Pi_pmf_default_swap[symmetric, where dflt ="undefined", where dflt'="def'"]) + by (auto simp add: map_pmf_comp median_default[symmetric]) + + show ?thesis + unfolding approxmc'_def approxmc_map_def approxmc_def Let_def approxmccore_def + using def'_def + by (auto simp add: map_pmf_comp Pi_pmf_map[of _ _ def] *) +qed + +end + +end diff --git a/thys/Approximate_Model_Counting/ApproxMCCore.thy b/thys/Approximate_Model_Counting/ApproxMCCore.thy new file mode 100644 --- /dev/null +++ b/thys/Approximate_Model_Counting/ApproxMCCore.thy @@ -0,0 +1,570 @@ +section \ ApproxMCCore definitions \ + +text \ + This section defines the ApproxMCCore locale and various failure events to be used in its probabilistic analysis. + The definitions closely follow Section 4.2 of Chakraborty et al.~\cite{DBLP:conf/ijcai/ChakrabortyMV16}. + Some non-probabilistic properties of the events are proved, most notably, the event inclusions of Lemma 3~\cite{DBLP:conf/ijcai/ChakrabortyMV16}. + Note that ``events'' here refer to subsets of hash functions. +\ + +theory ApproxMCCore imports + ApproxMCPreliminaries +begin + +(* An 'a assg is a finite map from 'a to bool + It is useful to think of 'a as the type of (projected) variables *) +type_synonym 'a assg = "'a \ bool" + +(* Restrict function to a domain (analogous to restrict_map) *) +definition restr :: "'a set \ ('a \ bool) \ 'a assg" + where "restr S w = (\x. if x \ S then Some (w x) else None)" + +lemma restrict_eq_mono: + assumes "x \ y" + assumes "f |` y = g |` y" + shows "f |` x = g |` x" + using assms + by (metis Map.restrict_restrict inf.absorb_iff2) + +(* Projection of a solution set W onto variables S *) +definition proj :: "'a set \ ('a \ bool) set \ 'a assg set" + where "proj S W = restr S ` W" + +lemma card_proj: + assumes "finite S" + shows "finite (proj S W)" "card (proj S W) \ 2 ^ card S" +proof - + have *: "proj S W \ {w. dom w = S}" + unfolding proj_def restr_def + by (auto split: if_splits) + also have 1: "{w. dom w = S} = {w. dom w = S \ ran w \ {True,False}}" + by auto + have f: "finite {w. dom w = S \ ran w \ {True,False}}" + by (simp add: assms finite_set_of_finite_maps) + thus "finite (proj S W)" + using * 1 + by (metis finite_subset) + + have 2:"card {w. dom w = S \ ran w \ {True,False}} = (card {True,False}) ^ card S" + apply (intro card_dom_ran) + using assms by auto + + show "card (proj S W) \ 2 ^ card S" + using * 1 2 + by (metis (no_types, lifting) f card.empty card_insert_disjoint card_mono finite.emptyI finite.insertI insert_absorb insert_not_empty numeral_2_eq_2 singleton_insert_inj_eq) +qed + +lemma proj_mono: + assumes "x \ y" + shows "proj w x \ proj w y" + unfolding proj_def + using assms by blast + +(* We can view nat assg as bit vectors, and take the i-th prefix slices *) +definition aslice :: "nat \ nat assg \ nat assg" + where "aslice i a = a |` {.. n" + assumes "dom a = {.. + ('a assg \ nat assg) \ ('a assg \ nat assg)" + where "hslice i h = aslice i \ h" + +(* Convenient grouping of assumptions and parameters *) +locale ApproxMCCore = + fixes W :: "('a \ bool) set" + fixes S :: "'a set" + fixes \ :: "real" + fixes \ :: "nat assg" + fixes thresh :: "nat" + assumes \: "dom \ = {0..: "\ > 0" + assumes thresh: + "thresh > 4" + "card (proj S W) \ thresh" + assumes S: "finite S" +begin + +lemma finite_proj_S: + shows "finite (proj S W)" + using S by (auto intro!: card_proj) + +definition \ :: "nat \ real" + where "\ i = card (proj S W) / 2 ^ i" + +(* A frequently used expression for the number of projected + witnesses w whose i-th slices match the target *) +definition card_slice ::" + ('a assg \ nat assg) \ + nat \ nat" + where "card_slice h i = + card (proj S W \ {w. hslice i h w = aslice i \})" + +lemma card_slice_anti_mono: + assumes "i \ j" + shows "card_slice h j \ card_slice h i" +proof - + have *: "{.. {..} + \ {w. hslice i h w = aslice i \}" + by (auto intro: restrict_eq_mono[OF *] simp add: hslice_def aslice_def) + thus ?thesis + unfolding card_slice_def + apply (intro card_mono) + subgoal using finite_proj_S by blast + by (auto intro!: proj_mono) +qed + +lemma hslice_eq: + assumes "n \ i" + assumes "\w. dom (h w) = {.. i" + assumes "\w. dom (h w) = {..<(card S - 1)}" + shows "card_slice h i = card_slice h (card S - 1)" + unfolding card_slice_def + apply(subst aslice_eq[OF assms(1)]) + subgoal using \ by auto + apply(subst hslice_eq[OF assms(1)]) + using assms by auto + +(* Defining the various events with respect to a fixed h *) +definition T :: "nat \ + ('a assg \ nat assg) set" + where "T i = {h. card_slice h i < thresh}" + +lemma T_mono: + assumes "i \ j" + shows "T i \ T j" + unfolding T_def + using card_slice_anti_mono[OF assms] + dual_order.strict_trans2 + of_nat_mono + by blast + +lemma \_anti_mono: + assumes "i \ j" + shows "\ i \ \ j" +proof - + have "2^ i \ (2::real) ^ j" + by (simp add: assms) + then show ?thesis unfolding \_def + by (simp add: frac_le) +qed + +lemma card_proj_witnesses: + "card (proj S W) > 0" + using thresh by linarith + +lemma \_strict_anti_mono: + assumes "i < j" + shows "\ i > \ j" +proof - + have "2^ i < (2::real) ^ j" + by (simp add: assms) + then show ?thesis unfolding \_def + using card_proj_witnesses + by (simp add: frac_less2) +qed + +lemma \_gt_zero: + shows "\ i > 0" + unfolding \_def + using card_proj_witnesses + by auto + +definition L :: "nat \ + ('a assg \ nat assg) set" + where " + L i = + {h. real (card_slice h i) < \ i / (1 + \)}" + +definition U :: "nat \ + ('a assg \ nat assg) set" + where " + U i = + {h. real (card_slice h i) \ \ i * (1 + \ / (1 + \))}" + +(* Model of ApproxMC core without random choice of h *) +definition approxcore :: " + ('a assg \ nat assg) \ + nat \ nat" + where " + approxcore h = + (case List.find + (\i. h \ T i) [1.. (2 ^ card S, 1) + | Some m \ + (2 ^ m, card_slice h m))" + +(* The failure event as a set over hashes *) +definition approxcore_fail :: " + ('a assg \ nat assg) set" + where "approxcore_fail = + {h. + let (cells,sols) = approxcore h in + cells * sols \ + { card (proj S W) / (1 + \) .. + (1 + \::real) * card (proj S W)} + }" + +(* This is a global assumption of the locale *) +lemma T0_empty: + shows "T 0 = {}" + unfolding T_def card_slice_def + hslice_def aslice_def + using thresh(2) by auto + +lemma L0_empty: + shows "L 0 = {}" +proof - + have "0 < \ \ + real (card (proj S W)) + < real (card (proj S W)) / (1 + \) \ + False" + by (smt (z3) card_proj_witnesses divide_minus1 frac_less2 nonzero_minus_divide_right of_nat_0_less_iff) + thus ?thesis + unfolding L_def card_slice_def + hslice_def aslice_def \_def + using \ by clarsimp +qed + +lemma U0_empty: + shows "U 0 = {}" +proof - + have *: "(1 + \ / (1 + \)) > 1" + using \ by auto + have **: "U 0 = {}" + unfolding U_def card_slice_def + hslice_def aslice_def \_def + using * + by (simp add: card_proj_witnesses) + thus ?thesis using ** by auto +qed + +lemma real_divide_pos_left: + assumes "(0::real) < a" + assumes "a * b < c" + shows "b < c / a" + using assms + by (simp add: mult.commute mult_imp_less_div_pos) + +lemma real_divide_pos_right: + assumes "a > (0::real)" + assumes "b < a * c" + shows "b / a < c" + using assms + by (simp add: mult.commute mult_imp_div_pos_less) + +(* The first inclusion used in the upper bound of Lemma 3 *) +lemma failure_imp: + shows "approxcore_fail \ + (\i\{1.. (L i \ U i)) \ + -T (card S - 1)" +proof standard + fix h + assume "h \ approxcore_fail" + then obtain cells sols where + h: "approxcore h = (cells, sols)" + "cells * sols \ + { card (proj S W) / (1 + \) .. + (1 + \::real) * card (proj S W)}" (is "_ \ {?lower..?upper}") + unfolding approxcore_fail_def + by auto + + have "List.find (\i. h \ T i) [1.. + List.find (\i. h \ T i) [1.. None" by auto + moreover { + assume "List.find (\i. h \ T i) [1.. T (card S - 1)" + unfolding find_None_iff + by (metis T0_empty atLeastLessThan_iff diff_is_0_eq' diff_less empty_iff gr_zeroI leI less_one not_less_zero set_upt) + } + moreover { + assume "List.find (\i. h \ T i) [1.. None" + then obtain m where + findm: "List.find (\i. h \ T i) [1.. m" "m < card S" + "h \ T m" + "\i. 1 \ i \ i < m \ h \ T i" + unfolding find_Some_iff + using less_Suc_eq_0_disj by auto + + then have 1: "h \ T (m - 1)" + by (metis T0_empty bot_nat_0.not_eq_extremum diff_is_0_eq diff_less empty_iff less_one) + + have "2 ^ m * card_slice h m < ?lower \ + 2 ^ m * card_slice h m > ?upper" + using h unfolding approxcore_def findm by auto + moreover { + assume "2 ^ m * card_slice h m < ?lower" + then have "card_slice h m < ?lower / 2 ^ m" + using real_divide_pos_left + by (metis numeral_power_eq_of_nat_cancel_iff of_nat_mult zero_less_numeral zero_less_power) + + then have "h \ L m" unfolding L_def + by (simp add: \_def mult.commute) + } + moreover { + assume *: "?upper < 2 ^ m * card_slice h m" + have "1 / (1 + \) < 1" + using \ divide_less_eq_1 by fastforce + then have "\ / (1 + \) < \" + using \ + by (metis (no_types, opaque_lifting) add_cancel_left_right div_by_1 divide_divide_eq_left divide_less_eq_1_pos mult.commute nonzero_divide_mult_cancel_left) + then have "card (proj S W) * (1 + \ / (1 + \)) \ ?upper" + using linorder_not_less not_less_iff_gr_or_eq by fastforce + then have "(card (proj S W) * (1 + \ / (1 + \))) / 2 ^ m < card_slice h m" + apply (intro real_divide_pos_right) + using * by auto + then have "h \ U m" unfolding U_def + by (simp add: \_def) + } + ultimately have "h \ L m \ h \ U m" by blast + then have "\m\{Suc 0.. T m \ + h \ T (m - Suc 0) \ + h \ L m \ h \ U m \ + h \ T (card S - Suc 0) \ False" + using m 1 by auto + } + ultimately show + "h \ (\i\{1.. (L i \ U i)) \ + - T (card S - 1)" + by auto +qed + +(* technically not smallest, but doesn't matter for our use *) +lemma smallest_nat_exists: + assumes "P i" "\P (0::nat)" + obtains m where "m \ i" "P m" "\P (m-1)" + using assms +proof (induction i) + case 0 + then show ?case by auto +next + case (Suc i) + then show ?case + by (metis diff_Suc_1 le_Suc_eq) +qed + +lemma mstar_non_zero: + shows "\ \ 0 * (1 + \ / (1 + \)) \ thresh" +proof - + have "\ 0 \ thresh" + unfolding \_def + by (auto simp add: thresh(2)) + thus ?thesis + by (smt (verit, best) \ \_gt_zero divide_pos_pos mult_le_cancel_left2) +qed + +lemma real_div_less: + assumes "c > 0" + assumes "a \ b * (c::nat)" + shows "real a / real c \ b" + by (metis assms(1) assms(2) divide_le_eq of_nat_0_less_iff of_nat_mono of_nat_mult) + +(* Instead of giving mstar explicitly, we'll select it implicitly by the properties below *) +lemma mstar_exists: + obtains m where + "\ (m - 1) * (1 + \ / (1 + \)) > thresh" + "\ m * (1 + \ / (1 + \)) \ thresh" + "m \ card S - 1" +proof - + have e1:"1 + \ / (1 + \) > 1" + by (simp add: \ add_nonneg_pos) + have e2:"1 + \ / (1 + \) < 2" + by (simp add: \ add_nonneg_pos) + have "thresh \ (4::real)" + using thresh(1) by linarith + then have up:"thresh / (1 + \ / (1 + \)) > 2" + by (smt (verit) e1 e2 field_sum_of_halves frac_less2) + + have "card (proj S W) \ 2 * 2 ^ (card S - Suc 0)" + by (metis One_nat_def S Suc_diff_Suc card.empty card_gt_0_iff card_proj(2) diff_zero less_one order_less_le_trans plus_1_eq_Suc power_0 power_Suc0_right power_add thresh(1) thresh(2) zero_neq_numeral) + + then have low:"\ (card S - 1) \ 2" + unfolding \_def + using real_div_less + by (smt (verit) Num.of_nat_simps(2) Num.of_nat_simps(4) Suc_1 nat_zero_less_power_iff numeral_nat(7) of_nat_power plus_1_eq_Suc pos2) + + have pi: "\ (card S - 1) * (1 + \ / (1 + \)) \ thresh" + using up low + by (smt (verit, ccfv_SIG) divide_le_eq e1) + + from smallest_nat_exists[OF pi mstar_non_zero] + show ?thesis + by (metis linorder_not_less that) +qed + +definition mstar :: "nat" + where "mstar = (@m. + \ (m - 1) * (1 + \ / (1 + \)) > thresh \ + \ m * (1 + \ / (1 + \)) \ thresh \ + m \ card S - 1)" + +(* The main inequalities we need from mstar *) +lemma mstar_prop: + shows + "\ (mstar - 1) * (1 + \ / (1 + \)) > thresh" + "\ mstar * (1 + \ / (1 + \)) \ thresh" + "mstar \ card S - 1" + unfolding mstar_def + by (smt (verit) some_eq_ex mstar_exists)+ + +lemma O1_lem: + assumes "i \ m" + shows "(T i - T (i-1)) \ (L i \ U i) \ T m" + using T_mono assms by blast + +lemma O1: + shows "(\i\{1..mstar-3}. + (T i - T (i-1)) \ (L i \ U i)) \ T (mstar-3)" + using T_mono by force + +lemma T_anti_mono_neg: + assumes "i \ j" + shows "- T j \ - T i" + by (simp add: Diff_mono T_mono assms) + +lemma O2_lem: + assumes "mstar < i" + shows "(T i - T (i-1)) \ (L i \ U i) \ -T mstar" +proof - + have "(T i - T (i-1)) \ (L i \ U i) \ -T (i-1)" + by blast + thus ?thesis + by (smt (verit) T_mono ApproxMCCore_axioms One_nat_def Suc_diff_Suc Suc_le_eq assms compl_mono diff_is_0_eq' diff_less_mono leI minus_nat.diff_0 subset_trans) +qed + +lemma O2: + shows "(\i\{mstar.. (L i \ U i)) \ + -T (card S - 1) \ L mstar \ U mstar" +proof - + have 0: "(\i\{mstar.. (L i \ U i)) \ + (T mstar - T (mstar-1)) \ (L mstar \ U mstar) \ + (\i\{mstar+1.. (L i \ U i))" + apply (intro subsetI) + apply clarsimp + by (metis Suc_le_eq atLeastLessThan_iff basic_trans_rules(18)) + + have 1: "(\i\{mstar+1.. (L i \ U i)) \ -T mstar" + apply clarsimp + by (metis (no_types, lifting) ApproxMCCore.T_mono ApproxMCCore_axioms One_nat_def diff_Suc_1 diff_le_mono subsetD) + + have 2: "-T (card S - 1) \ - T mstar" + using T_anti_mono_neg mstar_prop(3) by presburger + + (* Note that the strict inequality is needed here *) + have "thresh \ \ mstar * (1 + \ / (1 + \))" + using mstar_prop(2) thresh by linarith + + then have *: "- T mstar \ U mstar" + unfolding T_def U_def + by auto + + have "(\i\{mstar.. (L i \ U i)) \ + -T (card S - 1) \ + ((T mstar - T (mstar-1)) \ (L mstar \ U mstar)) \ -T mstar" + using 0 1 2 by (smt (z3) Un_iff subset_iff) + + moreover have "... \ L mstar \ U mstar" + using * + by blast + ultimately show ?thesis by auto +qed + +lemma O3: + assumes "i \ mstar - 1" + shows "(T i - T (i-1)) \ (L i \ U i) \ L i" +proof - + have *: "\ i * (1 + \ / (1 + \)) > thresh" + by (smt (verit, ccfv_SIG) \ \_anti_mono assms divide_nonneg_nonneg mstar_prop(1) mult_right_mono) + + have "x \ T i \ x \ U i \ False" for x + unfolding T_def U_def + using * by auto + thus ?thesis + by blast +qed + +lemma union_split_lem: + assumes x: "x \ (\i\{1.. (\i\{1..m-3}. P i) \ + P (m-2) \ + P (m-1) \ + (\i\{m.. {1.. P i" using x by auto + have "i \ {1..m-3} \ i = m-2 \ i = m-1 \ i \ {m..i\{1.. + (\i\{1..m-3}. P i) \ + P (m-2) \ + P (m-1) \ + (\i\{m.. + T (mstar-3) \ + L (mstar-2) \ + L (mstar-1) \ + (L mstar \ U mstar)" +proof - + + have *: "approxcore_fail \ + (\i\{1.. (L i \ U i)) \ -T (card S - 1)" (is "_ \ (\i\{1.. _") + using failure_imp . + + moreover have "... \ + (\i\{1..mstar - 3}. ?P i) \ + ?P (mstar - 2) \ + ?P (mstar - 1) \ + ((\i\{mstar.. -T (card S - 1))" + using + union_split[of "\i. ?P i" "card S" "mstar"] + by blast + moreover have "... \ + T (mstar - 3) \ + L (mstar - 2) \ + L (mstar - 1) \ + (L mstar \ U mstar) + " + using O1 O2 O3 + by (metis (no_types, lifting) One_nat_def Un_mono diff_Suc_eq_diff_pred diff_le_self nat_1_add_1 plus_1_eq_Suc) + ultimately show ?thesis + by (meson order_trans) +qed + +end + +end diff --git a/thys/Approximate_Model_Counting/ApproxMCCoreAnalysis.thy b/thys/Approximate_Model_Counting/ApproxMCCoreAnalysis.thy new file mode 100644 --- /dev/null +++ b/thys/Approximate_Model_Counting/ApproxMCCoreAnalysis.thy @@ -0,0 +1,1273 @@ +section \ ApproxMCCore analysis \ + +text \ + This section analyzes ApproxMCCore with respect to a universal hash family. + The proof follows Lemmas 1 and 2 from Chakraborty et al.~\cite{DBLP:conf/ijcai/ChakrabortyMV16}. + \ +theory ApproxMCCoreAnalysis imports + ApproxMCCore +begin + +(* Slicing after a family *) +definition Hslice :: "nat \ + ('a assg \ 'b \ nat assg) \ ('a assg \ 'b \ nat assg)" + where "Hslice i H = (\w s. aslice i (H w s))" + +context prob_space +begin + +lemma indep_vars_prefix: + assumes "indep_vars (\_. count_space UNIV) H J" + shows "indep_vars (\_. count_space UNIV) (Hslice i H) J" +proof - + have "indep_vars (\_. count_space UNIV) (\y. (\x. aslice i x) \ H y) J" + by (auto intro!: indep_vars_compose[OF assms(1)]) + thus ?thesis + unfolding o_def Hslice_def + by auto +qed + +lemma assg_nonempty_dom: + shows " + (\x. if x < i then Some True else None) \ + {\::nat assg. dom \ = {0..::nat assg. dom \ = {0..::nat assg. dom \ = {0.. ran w \ {True,False}}" + by auto + have "finite {0.. ran w \ {True,False}} = + card {True,False} ^ card {0.. n" + shows "card {\::nat assg. dom \ = {0..::nat assg. dom \ = {0.. n" + assumes "dom \ \ {0..::nat assg. dom \ = {0.. aslice i \ = \} = {}" +proof (intro equals0I) + fix x + assume "x \ {\. dom \ = {0.. aslice i \ = \}" + then have "dom \ = {0.. |` dom \ = \" + unfolding restrict_map_def fun_eq_iff + by (simp add: domIff) + +lemma aslice_refl: + assumes "dom \ = {.. = \" + unfolding aslice_def assms[symmetric] + using restrict_map_dom by auto + +lemma bij_betw_with_inverse: + assumes "f ` A \ B" + assumes "\x. x \ A \ g (f x) = x" + assumes "g ` B \ A" + assumes "\x. x \ B \ f (g x) = x" + shows "bij_betw f A B" +proof - + have "inj_on f A" + by (metis assms(2) inj_onI) + + thus ?thesis + unfolding bij_betw_def + using assms + by (metis image_subset_iff subsetI subset_antisym) +qed + +lemma card_nat_assg_slice: + assumes "i \ n" + assumes "dom \ = {0..::nat assg. dom \ = {0.. aslice i \ = \} = + 2 ^ (n-i)" +proof - + have "dom \ = {0.. aslice i \ = \ \ \ = \" for \ + using aslice_refl + by (metis assms(2) lessThan_atLeast0) + then have r2: + "{\::nat assg. dom \ = {0.. aslice i \ = \} = {\}" + by simp + + define f where "f = + (\(\::nat assg,\::nat assg) j. + if j < i then \ j else \ (j-i))" + let ?lhs = "({\. dom \ = {0.. + {\. dom \ = {0.. aslice i \ = \})" + let ?rhs = "{\::nat assg. dom \ = {0.. aslice i \ = \}" + + define finv where "finv = + (\fab::nat assg. + ((\j. fab (j + i)), + fab |` {..x. dom (f x) = {j. if j < i then j \ dom (snd x) else j - i \ dom (fst x)}" + unfolding f_def + by (auto simp add: fun_eq_iff split: if_splits) + have 1: " f ` ?lhs \ ?rhs" + proof standard + fix x + assume x: "x \ f ` ({\. dom \ = {0.. {\. dom \ = {0.. aslice i \ = \})" + obtain a b where ab: "dom a = {0.." + using x unfolding f_def + by (auto simp add: aslice_def restrict_map_def split: if_splits) + show " x \ {\. dom \ = {0.. aslice i \ = \}" + using 1 2 by blast + qed + + have " dom a = {0.. + dom b = {0.. + \x. aslice i b x = \ x \ + \ x < i \ None = b x" for a b :: "nat assg" and x + by (metis atLeastLessThan_iff domIff) + then have 2: "\x. x \ ?lhs \ finv (f x) = x" + unfolding finv_def f_def + by (clarsimp simp add: fun_eq_iff restrict_map_def) + + have 31: "\fab x y. + dom fab = {0.. + \ = aslice i fab \ + fab (x + i) = Some y \ + x < n - i" + by (metis atLeastLessThan_iff domI less_diff_conv) + also have "\fab x. + dom fab = {0.. + \ = aslice i fab \ + x < i \ \y. fab x = Some y" + by (metis assms(1) domD dual_order.trans lessThan_atLeast0 lessThan_iff linorder_not_less) + ultimately have 3: "finv ` ?rhs \ ?lhs" + unfolding finv_def + by (auto simp add: aslice_def split: if_splits) + + have 4: "\x. x \ ?rhs \ f (finv x) = x" + unfolding finv_def f_def + by (auto simp add: fun_eq_iff restrict_map_def) + + have "bij_betw f ?lhs ?rhs" + by (auto intro: bij_betw_with_inverse[OF 1 2 3 4]) + + from bij_betw_same_card[OF this] + have + "card {\::nat assg. dom \ = {0.. aslice i \ = \} = + card ({\::nat assg. dom \ = {0.. + {\::nat assg. dom \ = {0.. aslice i \ = \})" + by auto + moreover have "... = 2^(n-i)" + using r2 card_dom_ran_nat_assg + by (simp add: card_cartesian_product) + + ultimately show ?thesis by auto +qed + +lemma finite_dom: + assumes "finite V" + shows "finite {w :: 'a \ bool. dom w = V}" +proof - + have *: "{w :: 'a \ bool. dom w = V} = + {w. dom w = V \ ran w \ {True,False}}" + by auto + show ?thesis unfolding * + apply (intro finite_set_of_finite_maps) + using assms by auto +qed + +(* TODO: generalizable to any finite output alphabet instead of just booleans *) +lemma universal_prefix_family_from_hash: + assumes M: "M = measure_pmf p" + assumes kH: "k_universal k H D {\::nat assg. dom \ = {0.. n" + shows "k_universal k (Hslice i H) D {\. dom \ = {0.._. count_space UNIV) H D" + using kH unfolding k_universal_def + by auto + then have 1: "k_wise_indep_vars k (\_. count_space UNIV) (Hslice i H) D" + unfolding k_wise_indep_vars_def + using indep_vars_prefix + by auto + + have fdom: "finite {\::nat assg. dom \ = {0..::nat assg. dom \ = {0.. {}" + using assg_nonempty_dom + by (metis empty_iff) + have 2: "x \ D \ + uniform_on (Hslice i H x) {\. dom \ = {0.. D" + then have unif: "uniform_on (H x) {\. dom \ = {0... dom \ = {0.. + have *: "{\ \ space M. H x \ \ {\. aslice i \ = \}} = + {\. Hslice i H x \ = \}" + unfolding Hslice_def + by (auto simp add: M) + + have "{\::nat assg. dom \ = {0.. {\. aslice i \ = \} = + {\::nat assg. dom \ = {0.. aslice i \ = \}" + by auto + + then have "(card ({\::nat assg. dom \ = {0.. {\. aslice i \ = \})) + = (if dom \ = {0..::nat assg. dom \ = {0.. {\. aslice i \ = \})) + = indicat_real {\. dom \ = {0.. * 2^(n-i)" + by simp + + from uniform_onD[OF unif, of "{\. aslice i \ = \}"] + have "prob {\. Hslice i H x \ = \} = + real (card ({\. dom \ = {0.. {\. aslice i \ = \})) / + real (card {\::nat assg. dom \ = {0... dom \ = {0.. * 2^(n-i) / + real (card {\::nat assg. dom \ = {0... dom \ = {0.. * 2^(n-i) / 2^n" + by (simp add: card_dom_ran_nat_assg) + moreover have "... = indicat_real {\. dom \ = {0.. / 2^i" + by (simp add: i power_diff) + moreover have "... = indicat_real {\. dom \ = {0.. / real ((2^i)::nat)" by auto + moreover have "... = indicat_real {\. dom \ = {0.. / real (card {\::nat assg. dom \ = {0... Hslice i H x \ = \} = + indicat_real {\. dom \ = {0.. / + real (card {\::nat assg. dom \ = {0.. )^2" + +context + assumes thresh: "thresh \ (1 + \ / (1 + \)) * pivot" +begin + +lemma aux_1: + assumes fin:"finite (set_pmf p)" + assumes \: "\ > 0" + assumes exp: "\ i = measure_pmf.expectation p Y" + assumes var: "\^2 = measure_pmf.variance p Y" + assumes var_bound: "\^2 \ \ i" + shows " + measure_pmf.prob p {y. \ Y y - \ i \ \ \ / (1 + \) * \ i } + \ (1 + \)^2 / (\^2 * \ i) " +proof - + have pvar: "measure_pmf.variance p Y > 0" + using var \ + by (metis zero_less_power) + have kmu: "\ * (\ i) / ((1 + \) * \) > 0" + using \ pvar var var_bound + using \ by auto + have mupos: "\ i > 0" + using pvar var var_bound by linarith + from spec_chebyshev_inequality [OF fin pvar kmu] + have "measure_pmf.prob p + {y. (Y y - measure_pmf.expectation p Y)^2 \ + (\ * (\ i) / ((1 + \) * \))^2 * measure_pmf.variance p Y} \ 1 / (\ * (\ i) / ((1 + \) * \))^2" + by simp + then have ineq1:"measure_pmf.prob p + {y. (Y y - \ i)^2 \ + (\ * (\ i) / ((1 + \) * \))^2 * \^2} \ 1 / (\ * (\ i) / ((1 + \) * \))^2" + using exp var by simp + have "(\y. (Y y - \ i)^2 \ (\ * (\ i) / ((1 + \) * \))^2 * \^2) + = (\y. (Y y - \ i)^2 \ (\ * (\ i) / ((1 + \) * \) * \ )^2)" + by (metis power_mult_distrib) + moreover have "... = (\y. \ Y y - \ i \ \ \ * (\ i) / ((1 + \) * \) * \)" + proof - + have "0 \ \ * \ i / (1 + \)" + by (simp add: \ less_eq_real_def mupos zero_compare_simps(1)) + then show ?thesis + apply clarsimp + by (metis abs_le_square_iff abs_of_nonneg) + qed + moreover have "... = (\y. \ Y y - \ i \ \ \ * (\ i) / (1 + \))" + using \ by auto + ultimately have simp1:"(\y. (Y y - \ i)^2 \ (\ * (\ i) / ((1 + \) * \))^2 * \^2) + = (\y. \ Y y - \ i \ \ \ / (1 + \) * (\ i))" + by auto + + have "\^2/(\ i)^2 \ (\ i)/(\ i)^2" + using var_bound \_gt_zero + by (simp add: divide_right_mono) + moreover have "... = 1 / (\ i)" + by (simp add: power2_eq_square) + ultimately have simp2: "\^2/(\ i)^2 \ 1 / (\ i)" by auto + + have "measure_pmf.prob p {y. \ Y y - \ i \ \ \ / (1 + \) * (\ i)} + \ 1 / (\ * (\ i) / ((1 + \) * \))^2" + using ineq1 simp1 + by auto + moreover have "... = (1 + \)^2 / \^2 * \^2/(\ i)^2" + by (simp add: power_divide power_mult_distrib) + moreover have "... \ (1 + \)^2 / \^2 * (1 / (\ i))" + using simp2 + by (smt (verit, best) \ divide_pos_pos mult_left_mono times_divide_eq_right zero_less_power) + ultimately have "measure_pmf.prob p {y. \ Y y - \ i \ \ \ / (1 + \) * (\ i)} + \ (1 + \)^2 / (\^2 * (\ i))" + by auto + thus ?thesis by auto +qed + +(* Lem 1.1 in IJCAI'16 paper *) +lemma analysis_1_1: + assumes p: "finite (set_pmf p)" + assumes ind: "prob_space.k_universal (measure_pmf p) 2 H + {\::'a assg. dom \ = S} + {\::nat assg. dom \ = {0.. card S - 1" + shows " + measure_pmf.prob p + {s. \ card_slice ((\w. H w s)) i - \ i \ \ \ / (1 + \) * \ i} + \ (1 + \)^2 / (\^2 * \ i)" +proof - + + (* The variance for i-th slice *) + define var where "var = + (\i. measure_pmf.variance p + (\s. real (card (proj S W \ + {w. Hslice i H w s = aslice i \}))))" + + from prob_space.universal_prefix_family_from_hash[OF _ _ ind] + have hf: "prob_space.k_universal (measure_pmf p) 2 + (Hslice i H) {\::'a assg. dom \ = S} {\. dom \ = {0.. {\. dom \ = S}" + unfolding proj_def restr_def by (auto split:if_splits) + + have ain: "aslice i \ \ {\. dom \ = {0.. + unfolding aslice_def using i by auto + + from k_universal_expectation_eq[OF p hf finite_proj_S pSW ain] + have exp:"measure_pmf.expectation p + (\s. real (card (proj S W \ + {w. Hslice i H w s = aslice i \}))) = + real (card (proj S W)) / + real (card {\::nat assg. dom \ = {0..::nat assg. dom \ = {0.. i" + unfolding \_def + by (simp add: measure_pmf.card_dom_ran_nat_assg) + + have "proj S W \ + {w. Hslice i H w s = aslice i \} = + proj S W \ {w. hslice i (\w. H w s) w = aslice i \}" for s + unfolding proj_def Hslice_def hslice_def + by auto + then have extend_card_slice: + "\s. (card (proj S W \ {w. Hslice i H w s = aslice i \})) = + card_slice ((\w. H w s)) i" + unfolding card_slice_def by auto + + have mu_exp:" \ i = measure_pmf.expectation p + (\s. real (card (proj S W \ {w. Hslice i H w s = aslice i \})))" + using exp exp_mu by auto + + from two_universal_variance_bound[OF p hf finite_proj_S pSW ain] + have " + var i \ + measure_pmf.expectation p + (\s. real (card (proj S W \ + {w. Hslice i H w s = aslice i \})))" + unfolding var_def . + then have var_bound: "var i \ \ i" using exp exp_mu + by linarith + + have "var i \ 0" unfolding var_def by auto + then have "var i > 0 \ var i = 0" by auto + moreover { + assume "var i = 0" + + then have 1: " + measure_pmf.expectation p + (\s. (card_slice (\w. H w s) i - \ i)^2) = 0" + unfolding var_def extend_card_slice mu_exp by auto + + have 2: "measure_pmf.expectation p + (\s. (card_slice (\w. H w s) i - \ i)^2) = + sum (\s. (card_slice (\w. H w s) i - \ i)^2 * pmf p s) (set_pmf p)" + using assms by (auto intro!: integral_measure_pmf_real) + + have "\x \ set_pmf p. (card_slice (\w. H w x) i - \ i)^2 * pmf p x = 0" + apply (subst sum_nonneg_eq_0_iff[symmetric]) + using 1 2 p by auto + then have *: "\x. x \ set_pmf p \ (card_slice (\w. H w x) i - \ i)^2 = 0" + by (meson mult_eq_0_iff set_pmf_iff) + + have **: "(1 + \)^2 / (\^2 * \ i) > 0" + using \_gt_zero \ by auto + have "\ / (1 + \) * \ i > 0" + using \_gt_zero \ by auto + then have "\s. s \ set_pmf p \ \ card_slice ((\w. H w s)) i - \ i \ < \ / (1 + \) * \ i" + using * by auto + then have " + measure_pmf.prob p + {s. \ card_slice ((\w. H w s)) i - \ i \ \ \ / (1 + \) * \ i } = 0" + apply (subst measure_pmf_zero_iff) + using linorder_not_less by auto + then have " + measure_pmf.prob p + {s. \ card_slice ((\w. H w s)) i - \ i \ \ \ / (1 + \) * \ i } + \ (1 + \)^2 / (\^2 * \ i)" + using ** by auto + } + moreover { + define sigma where "sigma = sqrt(var i)" + assume "var i > 0" + + then have sigma_gt_0: "sigma > 0" + unfolding sigma_def by simp + + have extend_sigma: "sigma^2 = measure_pmf.variance p + (\s. real (card (proj S W \ + {w. Hslice i H w s = aslice i \})))" + unfolding sigma_def var_def + using less_eq_real_def local.var_def real_sqrt_pow2 sigma_def sigma_gt_0 + by fastforce + + have sigma_bound: "sigma^2 \ \ i" + using var_bound sigma_gt_0 + using sigma_def by force + + from aux_1[OF p sigma_gt_0 mu_exp extend_sigma sigma_bound] + have " + measure_pmf.prob p + {s. \ card_slice ((\w. H w s)) i - \ i \ \ \ / (1 + \) * \ i } + \ (1 + \)^2 / (\^2 * \ i)" + using extend_card_slice by auto + } + + ultimately show ?thesis by auto +qed + +(* Lem 1.2 in IJCAI'16 paper *) +lemma analysis_1_2: + assumes p: "finite (set_pmf p)" + assumes ind: "prob_space.k_universal (measure_pmf p) 2 H + {\::'a assg. dom \ = S} + {\::nat assg. dom \ = {0.. card S - 1" + assumes \: "\ \ 1" + shows "measure_pmf.prob p + {s. real(card_slice ((\w. H w s)) i) \ \ * \ i } + \ 1 / (1 + (1 - \)^2 * \ i)" +proof - + have *: "(\s. (0::real) \ card_slice ((\w. H w s)) i)" + by simp + from spec_paley_zygmund_inequality[OF p * \] + have paley_zigmund: + "(measure_pmf.variance p (\s. real(card_slice ((\w. H w s)) i) ) + + (1-\)^2 * (measure_pmf.expectation p (\s. card_slice ((\w. H w s)) i))^2) * + measure_pmf.prob p {s. real(card_slice ((\w. H w s)) i) > \ * measure_pmf.expectation p (\s. real(card_slice ((\w. H w s)) i) )} \ + (1-\)^2 * (measure_pmf.expectation p (\s. real(card_slice ((\w. H w s)) i) ))^2" + by auto + define var where "var = (\i. measure_pmf.variance p + (\s. real (card (proj S W \ + {w. Hslice i H w s = aslice i \}))))" + + from prob_space.universal_prefix_family_from_hash[OF _ _ ind] + have hf: "prob_space.k_universal (measure_pmf p) 2 + (Hslice i H) {\::'a assg. dom \ = S} {\. dom \ = {0.. {\. dom \ = S}" + unfolding proj_def restr_def + by (auto split:if_splits) + + have ain: "aslice i \ \ {\. dom \ = {0.. + unfolding aslice_def using i by auto + + from k_universal_expectation_eq[OF p hf finite_proj_S pSW ain] + have exp:"measure_pmf.expectation p + (\s. real (card (proj S W \ + {w. Hslice i H w s = aslice i \}))) = + real (card (proj S W)) / + real (card {\::nat assg. dom \ = {0..::nat assg. dom \ = {0.. i" + unfolding \_def + by (simp add: measure_pmf.card_dom_ran_nat_assg) + + have "proj S W \ + {w. Hslice i H w s = aslice i \} = + proj S W \ {w. hslice i (\w. H w s) w = aslice i \}" for s + unfolding proj_def Hslice_def hslice_def + by auto + + then have extend_card_slice:"\s. (card (proj S W \ + {w. Hslice i H w s = aslice i \})) = + card_slice ((\w. H w s)) i" + unfolding card_slice_def by auto + + have mu_exp:" \ i = measure_pmf.expectation p + (\s. real (card (proj S W \ + {w. Hslice i H w s = aslice i \})))" + using exp exp_mu by auto + + from two_universal_variance_bound[OF p hf finite_proj_S pSW ain] + have " + var i \ + measure_pmf.expectation p + (\s. real (card (proj S W \ + {w. Hslice i H w s = aslice i \})))" + unfolding var_def . + then have var_bound: "var i \ \ i" using exp exp_mu + by linarith + + have pos_mu: "\ i > 0" + unfolding \_def + by (simp add: card_proj_witnesses) + + have comp: "measure_pmf.prob p + {s. \ * \ i < real (card_slice (\w. H w s) i)} = + (1 - measure_pmf.prob p {s. real(card_slice ((\w. H w s)) i) \ \ * \ i})" + apply (subst measure_pmf.prob_compl[symmetric]) + by (auto intro!: arg_cong[where f = "measure_pmf.prob p"]) + + have extend_var_bound: "measure_pmf.variance p (\s. card_slice ((\w. H w s)) i) \ \ i" + using var_bound + unfolding var_def + by (simp add: extend_card_slice) + then have + "(measure_pmf.variance p (\s. real(card_slice ((\w. H w s)) i)) + + (1-\)^2 * (measure_pmf.expectation p (\s. real(card_slice ((\w. H w s)) i) ) )^2) + * measure_pmf.prob p {s. real(card_slice ((\w. H w s)) i) > \ * measure_pmf.expectation p (\s. real(card_slice ((\w. H w s)) i) )} \ + (\ i + (1-\)^2 * (measure_pmf.expectation p ( \s. real(card_slice ((\w. H w s)) i) ) )^2) + * measure_pmf.prob p + {s. real(card_slice ((\w. H w s)) i) > \ * measure_pmf.expectation p (\s. real(card_slice ((\w. H w s)) i) )}" + by (auto intro!: mult_right_mono) + moreover have + "... \ (\ i + (1-\)^2 * (measure_pmf.expectation p ( \s. real(card_slice ((\w. H w s)) i) ) )^2) + * measure_pmf.prob p + {s. real(card_slice ((\w. H w s)) i) > \ * measure_pmf.expectation p (\s. real(card_slice ((\w. H w s)) i) )}" + by fastforce + ultimately have + "(\ i + (1-\)^2 * (\ i)^2) * measure_pmf.prob p {s. real(card_slice ((\w. H w s)) i) > \ * \ i} \ (1-\)^2 * (\ i)^2" + unfolding mu_exp extend_card_slice + using paley_zigmund by linarith + then have + "(1 + (1-\)^2 * (\ i)) * (\ i) * measure_pmf.prob p {s. real(card_slice ((\w. H w s)) i) > \ * \ i} \ (1-\)^2 * (\ i) * (\ i)" + by (smt (verit) left_diff_distrib' more_arith_simps(11) mult_cancel_right mult_cancel_right2 power2_eq_square) + then have + "(1 + (1-\)^2 * (\ i)) * measure_pmf.prob p {s. real(card_slice ((\w. H w s)) i) > \ * \ i} \ (1-\)^2 * (\ i)" + using pos_mu by force + then have + "(1 + (1-\)^2 * (\ i)) * (1 - measure_pmf.prob p {s. real(card_slice ((\w. H w s)) i) \ \ * \ i}) \ (1-\)^2 * (\ i)" + using comp by auto + then have + "(1 + (1-\)^2 * (\ i)) - (1 + (1-\)^2 * (\ i)) * measure_pmf.prob p {s. real(card_slice ((\w. H w s)) i) \ \ * \ i} \ (1-\)^2 * (\ i)" + by (simp add: right_diff_distrib) + then have + "(1 + (1-\)^2 * (\ i)) * measure_pmf.prob p {s. real(card_slice ((\w. H w s)) i) \ \ * \ i} \ 1" + by simp + thus ?thesis by (smt (verit, best) mult_nonneg_nonneg nonzero_mult_div_cancel_left pos_mu real_divide_pos_left zero_le_power2) +qed + +lemma shift_\: + assumes "k \ i" + shows"\ i * 2^k = \ (i-k)" + unfolding \_def + by (auto simp add: assms power_diff) + +(* Lem 2.1 in IJCAI'16 paper *) +lemma analysis_2_1: + assumes p: "finite (set_pmf p)" + assumes ind: "prob_space.k_universal (measure_pmf p) 2 H + {\::'a assg. dom \ = S} + {\::nat assg. dom \ = {0.._up: "\ \ 1" + shows " + measure_pmf.prob (map_pmf (\s w. H w s) p) (T (mstar-3)) + \ 1 / 62.5" +proof - + have "1 + 1 / \ > 0" + by (simp add: \ pos_add_strict) + then have pos_pivot: "pivot > 0" + unfolding pivot_def + by simp + + have "mstar \ 4 \ mstar < 4" by auto + moreover { + assume "mstar < 4" + then have " measure_pmf.prob (map_pmf (\s w. H w s) p) (T (mstar-3)) + \ 1 / 62.5" + by (auto simp add: T0_empty) + } + moreover { + assume lo_mstar: "mstar \ 4" + + have extend_mu3: "\ (mstar-1) * 2^2 = \ (mstar-3)" + apply (subst shift_\) + subgoal using lo_mstar by linarith + using numeral_3_eq_3 + using Suc_1 diff_Suc_eq_diff_pred numeral_nat(7) by presburger + + have ******: "1 + \ / (1 + \) \ 3 / 2" + using \ assms(3) by auto + have mu_mstar_3_gt_zero: "\ (mstar - 3) / 4 > 0" + using \_gt_zero by simp + + from mstar_prop(1) + have "thresh < \ (mstar - 1) *2^2 / 4 * (1 + \ / (1 + \))" + by auto + also have "... = \ (mstar - 3) / 4 * (1 + \ / (1 + \))" + unfolding extend_mu3 by auto + also have "... \ \ (mstar - 3) / 4 * (3 / 2)" + apply (intro mult_left_mono) + using ****** mu_mstar_3_gt_zero by auto + also have "... = 3 / 8 * \ (mstar - 3)" + by auto + finally have thresh2mu: "thresh < 3 / 8 * \ (mstar - 3)" . + + have "1 + \ / (1 + \) > 0" + by (simp add: add_nonneg_pos \) + then have "\ (mstar-1) > pivot" (* pivot = thresh / (1 + \/(1+\)) *) + using mstar_prop(1) thresh + by (smt (verit) nonzero_mult_div_cancel_right real_divide_pos_left) + then have lo_mu_mstar_3: "\ (mstar-3) > 4*pivot" + using extend_mu3 + by simp + + have mstar_3: "mstar-3 \ card S - 1" + using lo_mstar + using diff_le_self dual_order.trans mstar_prop(3) by blast + + have *: "(5 / 8)^2 = ((25 / 64)::real)" + by (auto simp add: field_simps) + have **: " 1 + 25/64 * 4*pivot \ 1+ 25 / 64 * \ (mstar - 3) " + using lo_mu_mstar_3 + by auto + + have "1 + 1/\ \ 2" + by (simp add: \ assms(3)) + then have "(1 + 1/\)^2 \ 2^2" + by (smt (verit) power_mono) + then have ***: " 1 + 25/64 * 4 * 4*9.84 \ 1+ 25 / 64 * 4*pivot" + unfolding pivot_def + by auto + have ****: "1 + 25/64 * 4 * 4*9.84 > (0::real)" + by simp + + have "measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 3)) \ + 3 / 8 * \ (mstar - 3)} + \ 1 / (1 + (1 - 3 / 8)\<^sup>2 * \ (mstar - 3))" + apply(intro analysis_1_2[OF p ind mstar_3]) + by auto + also have "... = 1 / (1 + (5 / 8)^2 * \ (mstar-3))" + by simp + also have "... = 1 / (1 + 25 / 64 * \ (mstar-3))" + unfolding * by auto + also have "... \ 1 / (1+ 25/64 * 4*pivot)" + using ** + by (metis Groups.add_ac(2) add_sign_intros(3) divide_nonneg_nonneg frac_le mult_right_mono mult_zero_left of_nat_0_le_iff of_nat_numeral order_le_less pos_pivot zero_less_one) + also have "... \ 1 / (1+ 25/64 * 4 * 4*9.84)" + using *** **** + by (smt (verit) frac_le) + also have "... \ 1 / 62.5" + by simp + finally have *****: "measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 3)) \ 3 / 8 * \ (mstar - 3)} \ 1 / 62.5" + by auto + + have "measure_pmf.prob (map_pmf (\s w. H w s) p) (T (mstar-3)) + = measure_pmf.prob p {s. real (card_slice (\w. H w s) (mstar - 3)) < thresh}" + unfolding T_def + by auto + also have "... \ measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 3)) \ 3 / 8 * \ (mstar - 3)}" + using thresh2mu by (auto intro!: measure_pmf.finite_measure_mono) + also have "... \ 1 / 62.5" + using ***** + by auto + finally have "measure_pmf.prob (map_pmf (\s w. H w s) p) (T (mstar-3)) \ 1 / 62.5" . + } + + ultimately show ?thesis by auto +qed + +(* Alternative Lem 2.1 in IJCAI'16 paper without bound on epsilon *) +lemma analysis_2_1': + assumes p: "finite (set_pmf p)" + assumes ind: "prob_space.k_universal (measure_pmf p) 2 H + {\::'a assg. dom \ = S} + {\::nat assg. dom \ = {0..s w. H w s) p) (T (mstar-3)) + \ 1 / 10.84" +proof - + have "1 + 1 / \ > 0" + by (simp add: \ pos_add_strict) + then have pos_pivot: "pivot > 0" + unfolding pivot_def + by simp + + have "mstar \ 4 \ mstar < 4" by auto + moreover { + assume "mstar < 4" + then have " measure_pmf.prob (map_pmf (\s w. H w s) p) (T (mstar-3)) + \ 1 / 10.84" + by (auto simp add: T0_empty) + } + moreover { + assume lo_mstar: "mstar \ 4" + + have extend_mu3: "\ (mstar-1) * 2^2 = \ (mstar-3)" + apply (subst shift_\) + subgoal using lo_mstar semiring_norm(87) by linarith + using diff_Suc_eq_diff_pred eval_nat_numeral(3) by presburger + + have "\ / (1 + \) < 1" + using \ by auto + then have ******: "1 + \ / (1 + \) < 2" + using \ by auto + have mu_mstar_3_gt_zero: "\ (mstar - 3) / 4 > 0" + using \_gt_zero by simp + + from mstar_prop(1) + have "thresh < \ (mstar - 1) * (1 + \ / (1 + \))" + by auto + also have "... = \ (mstar - 1) *2^2 / 4 * (1 + \ / (1 + \))" + by auto + also have "... = \ (mstar - 3) / 4 * (1 + \ / (1 + \))" + unfolding extend_mu3 by auto + also have "... < \ (mstar - 3) / 4 * 2" + apply (intro mult_strict_left_mono) + using ****** mu_mstar_3_gt_zero by auto + also have "... = 1 / 2 * \ (mstar - 3)" + by auto + finally have thresh2mu: "thresh < 1 / 2 * \ (mstar - 3)" . + + have "1 + \ / (1 + \) > 0" + by (simp add: add_nonneg_pos \) + then have "\ (mstar-1) * 4 > 4*pivot" + using mstar_prop(1) thresh + by (smt (verit) nonzero_mult_div_cancel_right real_divide_pos_left) + then have lo_mu_mstar_3: "\ (mstar-3) > 4*pivot" + using extend_mu3 + by simp + + have mstar_3: "mstar-3 \ card S - 1" + using lo_mstar + using diff_le_self dual_order.trans mstar_prop(3) by blast + + have *: "(1 / 2)^2 = ((1 / 4)::real)" + by (auto simp add: field_simps) + have **: " 1 + 1/4 * 4*pivot \ 1+ 1/4 * \ (mstar - 3) " + using lo_mu_mstar_3 + by auto + + have "(1 + 1/\)^2 > 1^2" + by (simp add: \) + then have ***: " 1 + 1/4 * 4*9.84 \ 1+ 1/4 * 4 *pivot" + unfolding pivot_def by auto + have ****: "1 + 1/4 * 4 * 9.84 > (0::real)" + by simp + + have "measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 3)) \ + 1 / 2 * \ (mstar - 3)} + \ 1 / (1 + (1 - 1 / 2)\<^sup>2 * \ (mstar - 3))" + apply(intro analysis_1_2[OF p ind mstar_3]) + by auto + also have "... = 1 / (1 + 1 / 4 * \ (mstar-3))" + using * by force + also have "... \ 1 / (1+ 1/4 * 4*pivot)" + using ** + by (simp add: add_nonneg_pos frac_le pos_pivot) + also have "... \ 1 / (1+ 1/4 * 4 *9.84)" + using *** **** + by (smt (verit) frac_le) + also have "... \ 1 / 10.84" + by simp + finally have *****: "measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 3)) \ 1/2 * \ (mstar - 3)} \ 1 / 10.84" . + + have "measure_pmf.prob (map_pmf (\s w. H w s) p) (T (mstar-3)) + = measure_pmf.prob p {s. real (card_slice (\w. H w s) (mstar - 3)) < thresh}" + unfolding T_def + by auto + also have "... \ measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 3)) \ 1 / 2 * \ (mstar - 3)}" + using thresh2mu by (auto intro!: measure_pmf.finite_measure_mono) + also have "... \ 1 / 10.84" + using ***** + by auto + finally have "measure_pmf.prob (map_pmf (\s w. H w s) p) (T (mstar-3)) \ 1 / 10.84" . + } + + ultimately show ?thesis by auto +qed + +(* Lem 2.2 in IJCAI'16 paper *) +lemma analysis_2_2: + assumes p: "finite (set_pmf p)" + assumes ind: "prob_space.k_universal (measure_pmf p) 2 H + {\::'a assg. dom \ = S} + {\::nat assg. dom \ = {0..s w. H w s) p) (L (mstar-2)) \ 1 / 20.68" +proof - + have epos: "1 + 1 / \ > 0" + by (simp add: \ pos_add_strict) + then have pos_pivot: "pivot > 0" + unfolding pivot_def + by simp + + have "mstar \ 3 \ mstar < 3" by auto + moreover { + assume "mstar < 3" + then have " measure_pmf.prob (map_pmf (\s w. H w s) p) (L (mstar-2)) + \ 1 / 20.68" + by (auto simp add: L0_empty) + } + moreover { + assume lo_mstar: "mstar \ 3" + + have extend_mu2: "\ (mstar-1) * 2^1 = \ (mstar-2)" + apply (subst shift_\) + subgoal using lo_mstar by linarith + by (metis diff_diff_left one_add_one) + + have "1 + \ / (1 + \) > 0" + by (simp add: add_nonneg_pos \) + then have "\ (mstar-1) > pivot" + using mstar_prop(1) thresh + by (smt (verit) nonzero_mult_div_cancel_right real_divide_pos_left) + then have lo_mu_mstar_2: "\ (mstar-2) > 2*pivot" + using extend_mu2 + by simp + + have mstar_2: "mstar-2 \ card S - 1" + using lo_mstar + using diff_le_self dual_order.trans mstar_prop(3) by blast + + have beta:"1/(1+\) \ (1::real)" + using \ by auto + have pos: "(1 / (1 + 1/\))\<^sup>2 > 0" + using epos by auto + then have *: "1 + (1 / (1 + 1/\))\<^sup>2 * 2*pivot \ 1 + (1 / (1 + 1/\))\<^sup>2 * \ (mstar - 2)" + using lo_mu_mstar_2 + by auto + + have "1 - 1/(1+\) = 1 / (1 + 1/\)" + by (smt (verit, ccfv_threshold) \ conjugate_exponent_def conjugate_exponent_real(1)) + then have **: "(1 - 1/(1+\))^2 = (1 / (1 + 1/\))^2" + by simp + have ***: "1 + (1 / (1 + 1/\))\<^sup>2 * 2 * 9.84 * ( 1 + 1/\ )^2 + = 1 + (1 / (1 + 1/\))\<^sup>2 * ( 1 + 1/\ )^2 * 2 * 9.84" + by (simp add: mult.commute) + have ****: "(1 / (1 + 1/\))\<^sup>2 * ( 1 + 1/\ )^2 = 1" + using pos + by (simp add: power_one_over) + + from analysis_1_2[OF p ind mstar_2 beta] + have "measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 2)) \ 1/(1+\) * \ (mstar - 2)} + \ 1 / (1 + (1 - 1/(1+\))\<^sup>2 * \ (mstar - 2))" + by auto + also have "... = 1 / (1 + (1 / (1 + 1/\))\<^sup>2 * \ (mstar - 2))" + unfolding ** by auto + also have "... \ 1 / (1 + (1 / (1 + 1/\))\<^sup>2 * 2 * pivot)" + using * + by (smt (verit) epos divide_pos_pos frac_le pivot_def pos_prod_le zero_less_power) + also have "... = 1 / (1 + (1 / (1 + 1/\))\<^sup>2 * 2 * 9.84 * ( 1 + 1/\ )^2)" + unfolding pivot_def by auto + also have "... = 1 / 20.68" + unfolding *** **** by auto + finally have *****: "measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 2)) \ 1/(1+\) * \ (mstar - 2)} \ 1 / 20.68" . + + have "measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 2)) < 1/(1+\) * \ (mstar - 2)} + \ measure_pmf.prob p {s. real (card_slice (\w. H w s) (mstar - 2)) \ 1/(1+\) * \ (mstar - 2)}" + by (auto intro!: measure_pmf.finite_measure_mono) + then have ******: "measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 2)) < 1/(1+\) * \ (mstar - 2)} + \ 1 / 20.68" + using ***** by auto + + have "measure_pmf.prob (map_pmf (\s w. H w s) p) (L (mstar-2)) + = measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 2)) < 1/(1+\) * \ (mstar - 2)}" + unfolding L_def + by auto + also have "... \ 1 / 20.68" + using ****** by auto + finally have "measure_pmf.prob (map_pmf (\s w. H w s) p) (L (mstar-2)) \ 1 / 20.68" . + } + + ultimately show ?thesis by auto +qed + +(* Lem 2.3 in IJCAI'16 paper *) +lemma analysis_2_3: + assumes p: "finite (set_pmf p)" + assumes ind: "prob_space.k_universal (measure_pmf p) 2 H + {\::'a assg. dom \ = S} + {\::nat assg. dom \ = {0..s w. H w s) p) (L (mstar-1)) \ 1 / 10.84" +proof - + have epos: "1 + 1 / \ > 0" + by (simp add: \ pos_add_strict) + then have pos_pivot: "pivot > 0" + unfolding pivot_def + by simp + + have "mstar \ 2 \ mstar < 2" by auto + moreover { + assume "mstar < 2" + then have " measure_pmf.prob (map_pmf (\s w. H w s) p) (L (mstar-2)) + \ 1 / 10.84" + by (auto simp add: L0_empty) + } + moreover { + assume lo_mstar: "mstar \ 2" + + have "1 + \ / (1 + \) > 0" + by (simp add: add_nonneg_pos \) + then have lo_mu_mstar_1: "\ (mstar-1) > pivot" + using mstar_prop(1) using thresh + by (smt (verit) nonzero_mult_div_cancel_right real_divide_pos_left) + + have mstar_1: "mstar-1 \ card S - 1" + using lo_mstar diff_le_self dual_order.trans mstar_prop(3) by blast + + have beta: "1/(1+\) \ (1::real)" + using \ by auto + have "(1 / (1 + 1/\))\<^sup>2 > 0" + using epos by auto + then have *: "1 + (1 / (1 + 1/\))\<^sup>2 * pivot \ 1 + (1 / (1 + 1/\))\<^sup>2 * \ (mstar - 1)" + using lo_mu_mstar_1 + by auto + + have "1 - 1/(1+\) = 1 / (1 + 1/\)" + by (smt (verit, ccfv_threshold) \ conjugate_exponent_def conjugate_exponent_real(1)) + then have **: "(1 - 1/(1+\))^2 = (1 / (1 + 1/\))^2" + by simp + have ***: "1 + (1 / (1 + 1/\))\<^sup>2 * 9.84 * ( 1 + 1/\ )^2 + = 1 + (1 / (1 + 1/\))\<^sup>2 * ( 1 + 1/\ )^2 * 9.84" + by (simp add: mult.commute) + have ****: "(1 / (1 + 1/\))\<^sup>2 * ( 1 + 1/\ )^2 = 1" + by (metis (mono_tags, opaque_lifting) \0 < 1 + 1 / \\ div_by_1 divide_divide_eq_right divide_self_if less_irrefl mult.commute power_mult_distrib power_one) + + from analysis_1_2[OF p ind mstar_1 beta] + have "measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 1)) \ 1/(1+\) * \ (mstar - 1)} + \ 1 / (1 + (1 - 1/(1+\))\<^sup>2 * \ (mstar - 1))" + by auto + moreover have "... = 1 / (1 + (1 / (1 + 1/\))\<^sup>2 * \ (mstar - 1))" + unfolding ** by auto + moreover have "... \ 1 / (1 + (1 / (1 + 1/\))\<^sup>2 * pivot)" + using * + by (smt (verit) \0 < (1 / (1 + 1 / \))\<^sup>2\ frac_le pos_pivot zero_le_mult_iff) + moreover have "... = 1 / (1 + (1 / (1 + 1/\))\<^sup>2 * 9.84 * ( 1 + 1/\ )^2)" + unfolding pivot_def by auto + moreover have "... = 1 / (1 + (1 / (1 + 1/\))\<^sup>2 * ( 1 + 1/\ )^2 * 9.84)" + unfolding *** by auto + moreover have "... = 1 / (1 + 9.84)" + unfolding **** by auto + moreover have "... = 1 / 10.84" + by auto + ultimately have *****: "measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 1)) \ 1/(1+\) * \ (mstar - 1)} \ 1 / 10.84" + by linarith + have "measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 1)) < 1/(1+\) * \ (mstar - 1)} + \ measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 1)) \ 1/(1+\) * \ (mstar - 1)}" + by (auto intro!: measure_pmf.finite_measure_mono) + then have ******: "measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 1)) < 1/(1+\) * \ (mstar - 1)} + \ 1 / 10.84" + using ***** by auto + + have "measure_pmf.prob (map_pmf (\s w. H w s) p) (L (mstar-1)) + = measure_pmf.prob p + {s. real (card_slice (\w. H w s) (mstar - 1)) < 1/(1+\) * \ (mstar - 1)}" + unfolding L_def + by auto + moreover have "... \ 1 / 10.84" + using ****** by auto + ultimately have "measure_pmf.prob (map_pmf (\s w. H w s) p) (L (mstar-1)) \ 1 / 10.84" + by auto + } + + ultimately show ?thesis by auto +qed + +(* Lem 2.4 in IJCAI'16 paper *) +lemma analysis_2_4: + assumes p: "finite (set_pmf p)" + assumes ind: "prob_space.k_universal (measure_pmf p) 2 H + {\::'a assg. dom \ = S} + {\::nat assg. dom \ = {0..s w. H w s) p) (L mstar \ U mstar) \ 1 / 4.92" +proof - + have "1 + 1 / \ > 0" + by (simp add: \ pos_add_strict) + then have pos_pivot: "pivot > 0" + unfolding pivot_def + by simp + + have "mstar \ 1 \ mstar < 1" by auto + moreover { + assume "mstar < 1" + have LU0_empty: "L mstar \ U mstar = {}" + using L0_empty U0_empty + using \mstar < 1\ less_one by auto + then have "measure_pmf.prob (map_pmf (\s w. H w s) p) (L mstar \ U mstar) + \ 1 / 4.92" + by auto + } + moreover { + assume lo_mstar: "mstar \ 1" + have extend_mu: "\ mstar * 2^1 = \ (mstar-1)" + using lo_mstar + apply (subst shift_\) + by auto + + have "1 + \ / (1 + \) > 0" + by (simp add: add_nonneg_pos \) + then have "\ (mstar-1) > pivot" + using mstar_prop(1) thresh + by (smt (verit) nonzero_mult_div_cancel_right real_divide_pos_left) + then have lo_mu_star: "\ mstar > pivot / 2" + using extend_mu + by auto + + have mstar: "mstar \ card S - 1" + using lo_mstar + using diff_le_self dual_order.trans mstar_prop(3) by blast + + have "\*(1+1/\) = 1+\" + by (smt (verit) \ add_divide_eq_if_simps(1) divide_cancel_right divide_self_if nonzero_mult_div_cancel_left) + then have *: "9.84 * \^2*(1+1/\)^2 / 2 = 9.84 * (1+\)^2 / 2" + by (metis (mono_tags, opaque_lifting) more_arith_simps(11) power_mult_distrib) + + have "\^2 * \ mstar \ \^2 * pivot / 2" + using lo_mu_star + by (metis less_eq_real_def ordered_comm_semiring_class.comm_mult_left_mono times_divide_eq_right zero_le_power2) + then have **: "\^2 * \ mstar \ 9.84 * (1+\)^2 / 2" + unfolding pivot_def using * by auto + + from analysis_1_1[OF p ind mstar] + have "measure_pmf.prob p + {s. \ card_slice ((\w. H w s)) mstar - \ mstar \ \ \ / (1 + \) * \ mstar } + \ (1 + \)^2 / (\^2 * \ mstar)" + by auto + also have "... \ (1 + \)^2 / (9.84 * (1+\)^2 / 2)" + using ** + by (smt (verit) divide_cancel_left divide_le_0_iff frac_le pos_prod_le power2_less_0 zero_eq_power2) + also have "... = (1 + \)^2 / (4.92 * (1+\)^2)" + by simp + also have "... = 1 / 4.92" + using \ by simp + finally have *******: "measure_pmf.prob p + {s. \ card_slice ((\w. H w s)) mstar - \ mstar \ \ \ / (1 + \) * \ mstar } + \ 1 / 4.92" . + + have "\ mstar / (1 + \) - \ mstar = \ mstar * (1 / (1+\) - 1)" + by (simp add: right_diff_distrib') + also have "... = \ mstar * (- \ / (1+\))" + by (smt (verit) \ add_divide_distrib div_self minus_divide_left) + finally have ***: "\ mstar / (1 + \) - \ mstar = \ mstar * (- \ / (1+\))" . + + have "{h. real (card_slice h mstar) \ \ mstar / (1 + \)} + = {h. real (card_slice h mstar) - \ mstar \ \ mstar / (1 + \) - \ mstar}" + by auto + also have "... = {h. real (card_slice h mstar) - \ mstar \ \ mstar * (- \ / (1+\))}" + using *** by auto + finally have ****: " + {h. real (card_slice h mstar) \ \ mstar / (1 + \)} = + {h. real (card_slice h mstar) - \ mstar \ \ mstar * (- \ / (1+\))}" . + + have "L mstar + = {h. real (card_slice h mstar) < \ mstar / (1 + \)}" + unfolding L_def by auto + also have "...\ {h. real (card_slice h mstar) \ \ mstar / (1 + \)}" + by auto + also have "... = {h. real (card_slice h mstar) - \ mstar \ \ mstar * (- \ / (1+\))}" + unfolding **** by auto + finally have extend_L: "L mstar \ {h. real (card_slice h mstar) - \ mstar \ \ mstar * (- \ / (1+\))}" . + + have *****: "\ mstar * (1 + \ / (1+\)) - \ mstar = \ mstar * (\ / (1+\))" + by (metis (no_types, opaque_lifting) add.commute diff_add_cancel group_cancel.sub1 mult.right_neutral right_diff_distrib') + + have ******: "U mstar = {h. real (card_slice h mstar) \ \ mstar * (1 + \ / (1+\))}" + unfolding U_def by auto + have "{h. real (card_slice h mstar) \ \ mstar * (1 + \ / (1+\))} + = {h. real (card_slice h mstar) - \ mstar \ \ mstar * (1 + \ / (1+\)) - \ mstar}" + by auto + also have "... = {h. real (card_slice h mstar) - \ mstar \ \ mstar * (\ / (1+\))}" + unfolding ***** by auto + finally have extend_U: "U mstar = {h. real (card_slice h mstar) - \ mstar \ \ mstar * (\ / (1+\))}" + using ****** by auto + + have "L mstar \ U mstar \ + {h. real (card_slice h mstar) - \ mstar \ \ mstar * (- \ / (1+\))} + \ {h. real (card_slice h mstar) - \ mstar \ \ mstar * (\ / (1+\))}" + unfolding extend_U + using extend_L + by auto + also have "... = {h. \ real (card_slice h mstar) - \ mstar \ \ \ mstar * (\ / (1+\))}" + by auto + finally have extend_LU: "L mstar \ U mstar \ {h. \ real (card_slice h mstar) - \ mstar \ \ \ mstar * (\ / (1+\))}" . + + have "measure_pmf.prob (map_pmf (\s w. H w s) p) (L mstar \ U mstar) + \ measure_pmf.prob (map_pmf (\s w. H w s) p) {h. \ real (card_slice h mstar) - \ mstar \ \ \ mstar * (\ / (1+\))}" + using extend_LU + by (auto intro!: measure_pmf.finite_measure_mono) + also have "... = measure_pmf.prob p + {s. \ real (card_slice (\w. H w s) mstar) - \ mstar \ \ \ / (1 + \) * \ mstar }" + by (simp add: mult.commute) + also have "... \ 1 / 4.92" + using ******* by auto + finally have "measure_pmf.prob (map_pmf (\s w. H w s) p) (L mstar \ U mstar) \ 1 / 4.92" . + } + + ultimately show ?thesis by auto +qed + +(* Lem 3 in IJCAI'16 paper *) +lemma analysis_3: + assumes p: "finite (set_pmf p)" + assumes ind: "prob_space.k_universal (measure_pmf p) 2 H + {\::'a assg. dom \ = S} + {\::nat assg. dom \ = {0.._up: "\ \ 1" + shows " + measure_pmf.prob (map_pmf (\s w. H w s) p) + approxcore_fail \ 0.36" +proof - + have "measure_pmf.prob (map_pmf (\s w. H w s) p) approxcore_fail + \ measure_pmf.prob (map_pmf (\s w. H w s) p) + (T (mstar-3) \ + L (mstar-2) \ + L (mstar-1) \ + (L mstar \ U mstar))" + using failure_bound + by (auto intro!: measure_pmf.finite_measure_mono) + + moreover have "... \ + measure_pmf.prob (map_pmf (\s w. H w s) p) (T (mstar-3) \ L (mstar-2) \ L (mstar-1)) + + measure_pmf.prob (map_pmf (\s w. H w s) p) (L mstar \ U mstar)" + by (auto intro!: measure_pmf.finite_measure_subadditive) + moreover have "... \ + measure_pmf.prob (map_pmf (\s w. H w s) p) (T (mstar-3) \ L (mstar-2)) + + measure_pmf.prob (map_pmf (\s w. H w s) p) (L (mstar-1)) + + measure_pmf.prob (map_pmf (\s w. H w s) p) (L mstar \ U mstar)" + by (auto intro!: measure_pmf.finite_measure_subadditive) + moreover have "... \ + measure_pmf.prob (map_pmf (\s w. H w s) p) (T (mstar-3)) + + measure_pmf.prob (map_pmf (\s w. H w s) p) (L (mstar-2)) + + measure_pmf.prob (map_pmf (\s w. H w s) p) (L (mstar-1)) + + measure_pmf.prob (map_pmf (\s w. H w s) p) (L mstar \ U mstar)" + by (auto intro!: measure_pmf.finite_measure_subadditive) + moreover have "... \ 1/62.5 + 1/20.68 + 1/10.84 + 1/4.92" + using analysis_2_1[OF p ind \_up] + using analysis_2_2[OF p ind] + using analysis_2_3[OF p ind] + using analysis_2_4[OF p ind] + by auto + ultimately show ?thesis by force +qed + +(* Alternative Lem 3 in IJCAI'16 paper without bound on epsilon *) +lemma analysis_3': + assumes p: "finite (set_pmf p)" + assumes ind: "prob_space.k_universal (measure_pmf p) 2 H + {\::'a assg. dom \ = S} + {\::nat assg. dom \ = {0..s w. H w s) p) + approxcore_fail \ 0.44" +proof - + have "measure_pmf.prob (map_pmf (\s w. H w s) p) approxcore_fail + \ measure_pmf.prob (map_pmf (\s w. H w s) p) + (T (mstar-3) \ + L (mstar-2) \ + L (mstar-1) \ + (L mstar \ U mstar))" + using failure_bound + by (auto intro!: measure_pmf.finite_measure_mono) + + moreover have "... \ + measure_pmf.prob (map_pmf (\s w. H w s) p) (T (mstar-3) \ L (mstar-2) \ L (mstar-1)) + + measure_pmf.prob (map_pmf (\s w. H w s) p) (L mstar \ U mstar)" + by (auto intro!: measure_pmf.finite_measure_subadditive) + moreover have "... \ + measure_pmf.prob (map_pmf (\s w. H w s) p) (T (mstar-3) \ L (mstar-2)) + + measure_pmf.prob (map_pmf (\s w. H w s) p) (L (mstar-1)) + + measure_pmf.prob (map_pmf (\s w. H w s) p) (L mstar \ U mstar)" + by (auto intro!: measure_pmf.finite_measure_subadditive) + moreover have "... \ + measure_pmf.prob (map_pmf (\s w. H w s) p) (T (mstar-3)) + + measure_pmf.prob (map_pmf (\s w. H w s) p) (L (mstar-2)) + + measure_pmf.prob (map_pmf (\s w. H w s) p) (L (mstar-1)) + + measure_pmf.prob (map_pmf (\s w. H w s) p) (L mstar \ U mstar)" + by (auto intro!: measure_pmf.finite_measure_subadditive) + moreover have "... \ 1/10.84 + 1/20.68 + 1/10.84 + 1/4.92" + using analysis_2_1'[OF p ind] + using analysis_2_2[OF p ind] + using analysis_2_3[OF p ind] + using analysis_2_4[OF p ind] + by auto + ultimately show ?thesis by auto +qed +end + +end + +end diff --git a/thys/Approximate_Model_Counting/ApproxMCPreliminaries.thy b/thys/Approximate_Model_Counting/ApproxMCPreliminaries.thy new file mode 100644 --- /dev/null +++ b/thys/Approximate_Model_Counting/ApproxMCPreliminaries.thy @@ -0,0 +1,342 @@ +section \Preliminary probability/UHF lemmas\ + +text \ This section proves some simplified/specialized forms of lemmas + that will be used in the algorithm's analysis later. \ + +theory ApproxMCPreliminaries imports + Frequency_Moments.Probability_Ext + Concentration_Inequalities.Paley_Zygmund_Inequality +begin + +lemma card_inter_sum_indicat_real: + assumes "finite A" + shows "card (A \ B) = sum (indicat_real B) A" + by (simp add: assms indicator_def) + +(* Counting number of finite maps *) +lemma card_dom_ran: + assumes "finite D" + shows "card {w. dom w = D \ ran w \ R} = card R ^ card D" + using assms +proof (induct rule: finite_induct) + case empty + have "{w::'a \ 'b option. w = Map.empty \ ran w \ R} = {Map.empty}" + by auto + then show ?case + by auto +next + case (insert a A) + have 1: "inj_on (\(w, r). w(a \ r)) + ({w. dom w = A \ ran w \ R} \ R)" + unfolding inj_on_def + by (smt (verit, del_insts) CollectD SigmaE fun_upd_None_if_notin_dom local.insert(2) map_upd_eqD1 prod.simps(2) restrict_complement_singleton_eq restrict_upd_same) + have 21: "(\(w, r). w(a \ r)) ` + ({w. dom w = A \ ran w \ R} \ R) \ + {w. dom w = insert a A \ ran w \ R}" + unfolding image_def + using CollectD local.insert(2) by force + + have "\x. dom x = insert a A \ + ran x \ R \ + \xa. dom xa = A \ + ran xa \ R \ (\y\R. x = xa(a \ y))" + by (smt (verit, del_insts) Diff_insert_absorb domD dom_fun_upd fun_upd_triv fun_upd_upd insert.hyps(2) insertCI insert_subset ran_map_upd) + then have 22: " + {w. dom w = insert a A \ ran w \ R} \ + (\(w, r). w(a \ r)) ` + ({w. dom w = A \ ran w \ R} \ R)" + by (clarsimp simp add: image_def) + + have "bij_betw (\(w,r). w(a\r)) + ({w. dom w = A \ ran w \ R} \ R) + {w. dom w = insert a A \ ran w \ R} " + unfolding bij_betw_def + using 1 21 22 by clarsimp + + then have "card {w. dom w = insert a A \ ran w \ R} = card ({w. dom w = A \ ran w \ R} \ R)" + by (auto simp add: bij_betw_same_card 1 21 22) + + moreover have "... = card R ^ card A * card R" + by(subst card_cartesian_product) (use insert.hyps(3) in auto) + + ultimately show ?case + using insert.hyps by (auto simp add: card_insert_if) +qed + +lemma finite_set_pmf_expectation_sum: + fixes f :: "'a \ 'c \ 'b::{banach, second_countable_topology}" + assumes "finite (set_pmf A)" + shows "measure_pmf.expectation A (\x. sum (f x) T) = + (\i\T. measure_pmf.expectation A (\x. f x i))" + apply (intro Bochner_Integration.integral_sum integrable_measure_pmf_finite) + using assms by auto + +lemma (in prob_space) k_universal_prob_unif: + assumes "k_universal k H D R" + assumes "w \ D" "\ \ R" + shows "prob {s \ space M. H w s = \} = 1 / card R" +proof - + have "uniform_on (H w) R" + using assms unfolding k_universal_def + by auto + + from uniform_onD[OF this] + have "prob + {\ \ space M. H w \ \ {\}} = + real (card (R \ {\})) / real (card R)" . + + thus ?thesis + using assms by auto +qed + +(* For h: D \ R, k-universal, S \ D. + E( | {w \ S. h w = \} | ) = |S| / |R| *) +lemma k_universal_expectation_eq: + assumes p: "finite (set_pmf p)" + assumes ind: "prob_space.k_universal p k H D R" + assumes S: "finite S" "S \ D" + assumes a: "\ \ R" + shows + "prob_space.expectation p + (\s. real (card (S \ {w. H w s = \}))) = + real (card S) / card R" +proof - + have 1: "prob_space (measure_pmf p)" + by (simp add: prob_space_measure_pmf) + have 2: "space (measure_pmf p) = UNIV" by auto + from prob_space.k_universal_prob_unif[OF 1 ind _ a] + have *: "\w. w \ S \ + prob_space.prob p {s. H w s = \} = 1 / real (card R)" + using S(2) by auto + + have "measure_pmf.expectation p + (\s. real (card (S \ {w. H w s = \}))) = + measure_pmf.expectation p + (\s. sum (indicat_real {w. H w s = \}) S)" + unfolding card_inter_sum_indicat_real[OF S(1)] + by presburger + + moreover have "... = + (\i\S. + measure_pmf.expectation p + (indicat_real {s. H i s = \}))" + apply (subst finite_set_pmf_expectation_sum) + using assms unfolding indicator_def by auto + + moreover have " ... = + (\i\ S. + measure_pmf.prob p {s. H i s = \})" + by auto + + moreover have "... = (\i\S. 1 / card R)" + using * by auto + + ultimately show ?thesis by auto +qed + +lemma (in prob_space) two_universal_indep_var: + assumes "k_universal 2 H D R" + assumes "w \ D" "w' \ D" "w \ w'" + shows "indep_var + borel + (\x. indicat_real {w. H w x = \} w) + borel + (\x. indicat_real {w. H w x = \} w')" +proof - + have Y: "(\z. (of_bool (z = \))::real) \ (count_space UNIV) \\<^sub>M borel" + by auto + + have "k_wise_indep_vars 2 + (\_. count_space UNIV) + H D" + using assms + unfolding k_universal_def + by auto + + then have "indep_vars (\_. count_space UNIV) H {w, w'}" + unfolding k_wise_indep_vars_def + by (metis UNIV_bool assms(2) assms(3) card.empty card.insert card_UNIV_bool card_insert_le empty_iff empty_subsetI finite.emptyI finite.insertI insert_subset order.refl singletonD singleton_insert_inj_eq') + + from indep_var_from_indep_vars[OF assms(4) this] + have "indep_var + (count_space UNIV) (H w) + (count_space UNIV) (H w')" . + + from indep_var_compose[OF this Y Y] + show ?thesis + unfolding indicator_def + by (auto simp add: o_def) +qed + +(* For h: D \ R, 2-universal, S \ D. + V( | {w \ S. h w = \} | ) \ E( | {w \ S. h w = \} | ) *) +lemma two_universal_variance_bound: + assumes p: "finite (set_pmf p)" + assumes ind: "prob_space.k_universal (measure_pmf p) 2 H D R" + assumes S: "finite S" "S \ D" + assumes a: "\ \ R" + shows + "measure_pmf.variance p + (\s. real (card (S \ {w. H w s = \}))) \ + measure_pmf.expectation p + (\s. real (card (S \ {w. H w s = \})))" +proof - + have vb: "measure_pmf.variance p + (\x. (indicat_real {w. H w x = \} i)) \ + measure_pmf.expectation p + (\x. (indicat_real {w. H w x = \} i))" for i + proof - + have "measure_pmf.variance p + (\x. (indicat_real {w. H w x = \} i)) = + measure_pmf.expectation p + (\x. (indicat_real {w. H w x = \} i)\<^sup>2) - + (measure_pmf.expectation p + (\x. indicat_real {w. H w x = \} i))\<^sup>2" + apply (subst measure_pmf.variance_eq) + by (auto simp add: p integrable_measure_pmf_finite) + moreover have "... \ measure_pmf.expectation p + (\x. (indicat_real {w. H w x = \} i)\<^sup>2)" + by simp + moreover have "... = measure_pmf.expectation p + (\x. (indicat_real {w. H w x = \} i))" + by (metis (mono_tags, lifting) indicator_simps(1) indicator_simps(2) power2_eq_1_iff zero_eq_power2) + ultimately show ?thesis by linarith + qed + + have "measure_pmf.variance p + (\s. real (card (S \ {w. H w s = \}))) = + measure_pmf.variance p + (\s. sum (indicat_real {w. H w s = \}) S)" + unfolding card_inter_sum_indicat_real[OF S(1)] + by presburger + + then have "... = (\i\S. + measure_pmf.variance p + (\x. (indicat_real {w. H w x = \} i)))" + apply (subst measure_pmf.var_sum_pairwise_indep) + using S prob_space_measure_pmf + by (auto intro!: prob_space.two_universal_indep_var[OF _ ind] simp add: p integrable_measure_pmf_finite) + + moreover have "... \ (\i\S. + measure_pmf.expectation p + (\x. (indicat_real {w. H w x = \} i)))" + by (simp add: sum_mono vb) + moreover have "... = measure_pmf.expectation p + (\s. sum (indicat_real {w. H w s = \}) S)" + apply (subst finite_set_pmf_expectation_sum) + using assms by auto + ultimately show ?thesis + by (simp add: assms(3) card_inter_sum_indicat_real) +qed + +lemma (in prob_space) k_universal_mono: + assumes "k' \ k" + assumes"k_universal k H D R" + shows"k_universal k' H D R" + using assms + unfolding k_universal_def k_wise_indep_vars_def + by auto + +lemma finite_set_pmf_expectation_add: + assumes "finite (set_pmf S)" + shows "measure_pmf.expectation S (\x. ((f x)::real) + g x) = + measure_pmf.expectation S f + measure_pmf.expectation S g" + by (auto intro: Bochner_Integration.integral_add simp add: assms integrable_measure_pmf_finite) + +lemma finite_set_pmf_expectation_add_const: + assumes "finite (set_pmf S)" + shows "measure_pmf.expectation S (\x. ((f x)::real) + g) = + measure_pmf.expectation S f + g" +proof - + have "g = measure_pmf.expectation S (\x. g)" + by simp + thus ?thesis + by (simp add: assms finite_set_pmf_expectation_add) +qed + +lemma finite_set_pmf_expectation_diff: + assumes "finite (set_pmf S)" + shows "measure_pmf.expectation S (\x. ((f x)::real) - g x) = + measure_pmf.expectation S f - measure_pmf.expectation S g" + by (auto intro: Bochner_Integration.integral_diff simp add: assms integrable_measure_pmf_finite) + +(* convenient forms of library inequalities *) +lemma spec_paley_zygmund_inequality: + assumes fin: "finite (set_pmf p)" + assumes Zpos: "\z. Z z \ 0" + assumes t: "\ \ 1" + shows " + (measure_pmf.variance p Z + (1-\)^2 * (measure_pmf.expectation p Z)^2) * + measure_pmf.prob p {z. Z z > \ * measure_pmf.expectation p Z} \ + (1-\)^2 * (measure_pmf.expectation p Z)^2" +proof - + have "prob_space (measure_pmf p)" by (auto simp add: prob_space_measure_pmf) + + from prob_space.paley_zygmund_inequality[OF this _ integrable_measure_pmf_finite[OF fin] t] + show ?thesis + using Zpos by auto +qed + +lemma spec_chebyshev_inequality: + assumes fin: "finite (set_pmf p)" + assumes pvar: "measure_pmf.variance p Y > 0" + assumes k: "k > 0" + shows " + measure_pmf.prob p + {y. (Y y - measure_pmf.expectation p Y)^2 \ + k^2 * measure_pmf.variance p Y} \ 1 / k^2" +proof - + define f where + "f x = Y x / sqrt(measure_pmf.variance p Y)" for x + have 1: + "measure_pmf.random_variable p borel f" + by auto + have *: "(\x. (f x)\<^sup>2) = (\x. (Y x)\<^sup>2/ measure_pmf.variance p Y)" + unfolding f_def + by (simp add: power_divide) + have 2: + "integrable p (\x. (f x)\<^sup>2)" + unfolding * + by (intro integrable_measure_pmf_finite[OF fin]) + from + measure_pmf.Chebyshev_inequality[OF 1 2 k] + have ineq1:"measure_pmf.prob p + {x . k \ \f x - measure_pmf.expectation p f\} + \ measure_pmf.expectation p + (\x. (f x - measure_pmf.expectation p f)\<^sup>2) / k\<^sup>2" by auto + + have "(\x. (f x - measure_pmf.expectation p f)\<^sup>2) = + (\x. ((Y x - measure_pmf.expectation p Y) / sqrt(measure_pmf.variance p Y))\<^sup>2)" + unfolding f_def + by (simp add: diff_divide_distrib) + + moreover have "... = (\x. (Y x - measure_pmf.expectation p Y)^2 / (sqrt(measure_pmf.variance p Y))^2)" + by (simp add: power_divide) + moreover have "... = (\x. (Y x - measure_pmf.expectation p Y)^2 / measure_pmf.variance p Y)" + by simp + ultimately have unfold:"(\x. (f x - measure_pmf.expectation p f)\<^sup>2) + = (\x. (Y x - measure_pmf.expectation p Y)^2 / measure_pmf.variance p Y)" + by auto + then have "measure_pmf.expectation p (\x. (f x - measure_pmf.expectation p f)\<^sup>2) / k\<^sup>2 + = measure_pmf.expectation p (\x. (Y x - measure_pmf.expectation p Y)^2 / measure_pmf.variance p Y) / k\<^sup>2" + by auto + moreover have "... = measure_pmf.variance p Y / measure_pmf.variance p Y / k\<^sup>2" + by simp + moreover have "... = 1 / k\<^sup>2" + using pvar by force + ultimately have eq1:"measure_pmf.expectation p (\x. (f x - measure_pmf.expectation p f)\<^sup>2) / k\<^sup>2 = 1 / k\<^sup>2" + by auto + have "(\x. k \ \f x - measure_pmf.expectation p f\) = (\x. k\<^sup>2 \ (f x - measure_pmf.expectation p f)\<^sup>2)" + by (metis (no_types, opaque_lifting) abs_of_nonneg k less_le real_le_rsqrt real_sqrt_abs sqrt_ge_absD) + moreover have "... = (\x. k\<^sup>2 \ ((Y x - measure_pmf.expectation p Y)^2 / measure_pmf.variance p Y))" + by (metis unfold) + moreover have "... = (\x. (Y x - measure_pmf.expectation p Y)^2 \ k\<^sup>2 * measure_pmf.variance p Y)" + by (simp add: pos_le_divide_eq pvar) + ultimately have cond:"(\x. k \ \f x - measure_pmf.expectation p f\) + = (\x. (Y x - measure_pmf.expectation p Y)^2 \ k\<^sup>2 * measure_pmf.variance p Y)" + by auto + show "?thesis" using ineq1 cond eq1 + by auto +qed + +end diff --git a/thys/Approximate_Model_Counting/CertCheck.thy b/thys/Approximate_Model_Counting/CertCheck.thy new file mode 100644 --- /dev/null +++ b/thys/Approximate_Model_Counting/CertCheck.thy @@ -0,0 +1,1159 @@ +section \ Certificate-based ApproxMC \ + +text \ This turns the randomized algorithm into an + executable certificate checker \ + +theory CertCheck +imports ApproxMCAnalysis + +begin + +subsection \ ApproxMC with lists instead of sets \ + +type_synonym 'a xor = "'a list \ bool" + +definition satisfies_xorL :: "'a xor \ ('a \ bool) \ bool" + where "satisfies_xorL xb \ = + even (sum_list (map (of_bool \ \) (fst xb)) + + of_bool (snd xb)::nat)" + +(* Extract a sublist based on bits *) +definition sublist_bits::"'a list \ bool list \ 'a list" + where "sublist_bits ls bs = + map fst (filter snd (zip ls bs))" + +definition xor_from_bits:: + "'a list \ bool list \ bool \ 'a xor" + where "xor_from_bits V xsb = + (sublist_bits V (fst xsb), snd xsb)" + +locale ApproxMCL = + fixes sols :: "'fml \ ('a \ bool) set" + fixes enc_xor :: "'a xor \ 'fml \ 'fml" + assumes sols_enc_xor: + "\F xor. + sols (enc_xor xor F) = + sols F \ {\. satisfies_xorL xor \}" +begin + +definition list_of_set ::"'a set \ 'a list" +where "list_of_set x = (@ls. set ls = x \ distinct ls)" + +definition xor_conc :: "'a set \ bool \ 'a xor" + where "xor_conc xsb = (list_of_set (fst xsb), snd xsb)" + +definition enc_xor_conc :: "'a set \ bool \ 'fml \ 'fml" + where "enc_xor_conc = enc_xor \ xor_conc" + +lemma distinct_count_list: + assumes "distinct ls" + shows "count_list ls x = of_bool (x \ set ls)" + using assms + apply (induction ls) + by auto + +lemma list_of_set: + assumes "finite x" + shows "distinct (list_of_set x)" "set (list_of_set x) = x" + unfolding list_of_set_def + by (metis (mono_tags, lifting) assms finite_distinct_list someI_ex)+ + +lemma count_list_list_of_set: + assumes "finite x" + shows "count_list (list_of_set x) y = of_bool (y \ x)" + apply (subst distinct_count_list) + using list_of_set[OF assms] + by auto + +lemma satisfies_xorL_xor_conc: + assumes "finite x" + shows"satisfies_xorL (xor_conc (x,b)) \ \ satisfies_xor (x,b) {x. \ x}" + unfolding satisfies_xorL_def xor_conc_def + using list_of_set[OF assms] + by (auto simp add: sum_list_map_eq_sum_count count_list_list_of_set[OF assms] Int_ac(3) assms) + +sublocale appmc: ApproxMC sols enc_xor_conc + apply unfold_locales + unfolding enc_xor_conc_def o_def + apply (subst sols_enc_xor) + using satisfies_xorL_xor_conc by fastforce + +definition size_xorL ::" + 'fml \ 'a list \ + (nat \ bool list \ bool) \ + nat \ nat" + where "size_xorL F S xorsl i = ( + let xors = map (xor_from_bits S \ xorsl) [0.. 'a list \ + nat \ + (nat \ bool list \ bool) \ + nat \ bool" + where "check_xorL F S thresh xorsl i = + (size_xorL F S xorsl i < thresh)" + +definition approxcore_xorsL :: " + 'fml \ 'a list \ + nat \ + (nat \ (bool list \ bool)) \ + nat" + where " + approxcore_xorsL F S thresh xorsl = + (case List.find + (check_xorL F S thresh xorsl) [1.. 2 ^ length S + | Some m \ + (2 ^ m * size_xorL F S xorsl m))" + +definition xor_abs :: "'a xor \ 'a set \ bool" + where "xor_abs xsb = (set (fst xsb), snd xsb)" + +lemma sols_fold_enc_xor: + assumes "list_all2 (\x y. + \w. satisfies_xorL x w = satisfies_xorL y w) xs ys" + assumes "sols F = sols G" + shows "sols (fold enc_xor xs F) = sols (fold enc_xor ys G)" + using assms +proof (induction xs arbitrary: ys F G) + case Nil + then show ?case + by auto + next + case (Cons x xss) + then obtain y yss where ys: "ys = y#yss" + by (meson list_all2_Cons1) + have all2: "\w. satisfies_xorL x w = satisfies_xorL y w" + using Cons.prems(1) ys by blast + have *: "sols (enc_xor x F) = sols (enc_xor y G)" + apply (subst sols_enc_xor) + using all2 local.Cons(3) sols_enc_xor by presburger + then show ?case unfolding ys + using "*" Cons.IH Cons.prems(2) local.Cons(2) local.Cons(3) ys by auto +qed + +lemma satisfies_xor_xor_abs: + assumes "distinct x" + shows"satisfies_xor (xor_abs (x,b)) {x. \ x} \ satisfies_xorL (x,b) \" + unfolding satisfies_xorL_def xor_abs_def + apply (clarsimp simp add: sum_list_map_eq_sum_count) + by (smt (verit, ccfv_SIG) IntD1 Int_commute assms card_eq_sum distinct_count_list of_bool_eq(2) sum.cong) + +lemma xor_conc_xor_abs_rel: + assumes "distinct (fst x)" + shows"satisfies_xorL (xor_conc (xor_abs x)) w \ + satisfies_xorL x w" + unfolding xor_abs_def + apply (subst satisfies_xorL_xor_conc) + subgoal by (simp add: xor_abs_def[symmetric]) + using assms satisfies_xor_xor_abs xor_abs_def by auto + +lemma sorted_sublist_bits: + assumes "sorted V" + shows"sorted (sublist_bits V bs)" + unfolding sublist_bits_def + using assms + by (auto intro!: sorted_filter sorted_wrt_take simp add: map_fst_zip_take) + +lemma distinct_sublist_bits: + assumes "distinct V" + shows"distinct (sublist_bits V bs)" + unfolding sublist_bits_def + using assms + by (auto intro!: distinct_map_filter simp add: map_fst_zip_take) + +lemma distinct_fst_xor_from_bits: + assumes "distinct V" + shows"distinct (fst (xor_from_bits V bs))" + unfolding xor_from_bits_def + using distinct_sublist_bits[OF assms] + by auto + +lemma size_xorL: + assumes "\j. j < i \ + xorsf j = + Some (xor_abs (xor_from_bits S (xorsl j)))" + assumes "distinct S" + shows "size_xorL F S xorsl i = + appmc.size_xor F (set S) xorsf i" + unfolding appmc.size_xor_def size_xorL_def + apply (clarsimp simp add: enc_xor_conc_def fold_map[symmetric]) + apply (intro arg_cong[where f = "(\x. card (proj (set S) x))"]) + apply (intro sols_fold_enc_xor) + by (auto simp add: list_all2_map1 list_all2_map2 list_all2_same assms(1) assms(2) distinct_fst_xor_from_bits xor_conc_xor_abs_rel) + +lemma fold_enc_xor_more: + assumes "x \ sols (fold enc_xor (xs @ rev ys) F)" + shows "x \ sols (fold enc_xor xs F)" + using assms +proof (induction ys arbitrary: F) + case Nil + then show ?case + by auto +next + case ih: (Cons y ys) + show ?case + using ih by (auto simp add: ih.prems(1) sols_enc_xor) +qed + +lemma size_xorL_anti_mono: + assumes "x \ y" "distinct S" + shows "size_xorL F S xorsl x \ size_xorL F S xorsl y" +proof - + obtain ys where ys: "[0.. xorsl) ys))" + have *: "\y. y \ set rys \ distinct (fst y)" + unfolding rys_def + using assms(2) distinct_fst_xor_from_bits + by (metis (no_types, opaque_lifting) ex_map_conv o_apply set_rev) + + show ?thesis + unfolding size_xorL_def Let_def + apply (intro card_mono proj_mono) + subgoal using card_proj(1) by blast + unfolding ys + by (metis fold_enc_xor_more map_append rev_rev_ident subsetI) +qed + +lemma find_upto_SomeI: + assumes "\i. a \ i \ i < x \ \P i" + assumes "P x" "a \ x" "x < b" + shows "find P [a..j. j \ P ([a..j. j < i \ + xorsf j = + Some (xor_abs (xor_from_bits S (xorsl j)))" + assumes "distinct S" + shows "check_xorL F S thresh xorsl i = + appmc.check_xor F (set S) thresh xorsf i" + unfolding appmc.check_xor_def check_xorL_def + using size_xorL[OF assms] by presburger + +lemma approxcore_xorsL: + assumes "\j. j < length S - 1 \ + xorsf j = + Some (xor_abs (xor_from_bits S (xorsl j)))" + assumes S: "distinct S" + shows "approxcore_xorsL F S thresh xorsl = + appmc.approxcore_xors F (set S) thresh xorsf" +proof - + have c:"card (set S) = length S" using S + by (simp add: distinct_card) + + have *: "find (check_xorL F S thresh xorsl) [1.. + j < a \ + xorsf j = + Some + (xor_abs + (xor_from_bits S + (xorsl j)))" for a j + unfolding find_Some_iff + by (auto simp add: assms(1)) + show ?thesis + unfolding appmc.approxcore_xors_def approxcore_xorsL_def * c + apply (cases "find (appmc.check_xor F (set S) thresh xorsf) + [Suc 0.. 'a list \ + real \ real \ nat \ + (nat \ nat \ (bool list \ bool)) \ + nat" + where "approxmc_mapL F S \ \ n xorsLs = ( + let \ = appmc.mk_eps \ in + let thresh = appmc.compute_thresh \ in + if card (proj (set S) (sols F)) < thresh then + card (proj (set S) (sols F)) + else + let t = appmc.compute_t \ n in + median t (approxcore_xorsL F S thresh \ xorsLs))" + +definition random_xorB :: "nat \ (bool list \ bool) pmf" + where "random_xorB n = + pair_pmf + (replicate_pmf n (bernoulli_pmf (1/2))) + (bernoulli_pmf (1/2))" + +(* Actually, we can restrict i too *) +lemma approxmc_mapL: + assumes "\i j. j < length S - 1 \ + xorsFs i j = + Some (xor_abs (xor_from_bits S (xorsLs i j)))" + assumes S: "distinct S" + shows " + approxmc_mapL F S \ \ n xorsLs = + appmc.approxmc_map F (set S) \ \ n xorsFs" +proof - + show ?thesis + unfolding approxmc_mapL_def appmc.approxmc_map_def Let_def + using assms by (auto intro!: median_cong approxcore_xorsL) +qed + +lemma approxmc_mapL': + assumes S: "distinct S" + shows " + approxmc_mapL F S \ \ n xorsLs = + appmc.approxmc_map F (set S) \ \ n + (\i j. if j < length S - 1 + then Some (xor_abs (xor_from_bits S (xorsLs i j))) + else None)" + apply (intro approxmc_mapL) + using assms by auto + +lemma bits_to_random_xor: + assumes "distinct S" + shows "map_pmf + (\x. xor_abs (xor_from_bits S x)) + (random_xorB (length S)) = + random_xor (set S)" +proof - + have "xor_abs (xor_from_bits S (a,b)) = apfst (set \ sublist_bits S) (a,b)" for a b + using xor_abs_def by (auto simp add: xor_from_bits_def) + + then have *: "(\x. xor_abs (xor_from_bits S x)) = apfst (set \ sublist_bits S)" + by auto + + have "\x. x \ set S \ + z x \ + \b. (\n. S ! n = x \ + map z S ! n = b \ + n < length S) \ b" for z + by (metis assms distinct_Ex1 nth_map) + + then have " set (map fst + (filter snd + (zip S (map z S)))) = + {x \ set S. Some (z x) = Some True}" for z + by (auto elim: in_set_zipE simp add: in_set_zip image_def ) + + then have **: "map_pmf (set \ sublist_bits S) + (replicate_pmf (length S) (bernoulli_pmf (1 / 2))) = + map_pmf (\b. {x \ set S. b x = Some True}) + (Pi_pmf (set S) (Some undefined) + (\_. map_pmf Some (bernoulli_pmf (1 / 2))))" + apply (subst replicate_pmf_Pi_pmf[OF assms, where def = "undefined"]) + apply (subst Pi_pmf_map[of _ _ "undefined"]) + subgoal by (auto intro!: pmf.map_cong0 simp add: map_pmf_comp sublist_bits_def) + subgoal by (meson set_zip_leftD) + unfolding map_pmf_comp sublist_bits_def o_def + by (auto intro!: pmf.map_cong0) + + show ?thesis + unfolding random_xorB_def + apply (subst random_xor_from_bits) + by (auto simp add: * ** pair_map_pmf1[symmetric]) +qed + +lemma Pi_pmf_map_pmf_Some: + assumes "finite S" + shows "Pi_pmf S None (\_. map_pmf Some p) = + map_pmf (\f v. if v \ S then Some (f v) else None) + (Pi_pmf S def (\_. p))" +proof - + have *: "Pi_pmf S None (\_. map_pmf Some p) = + map_pmf (\f x. if x \ S then f x else None) + (Pi_pmf S (Some def) (\_. map_pmf Some p))" + apply (subst Pi_pmf_default_swap[OF assms]) + by auto + + show ?thesis unfolding * + apply (subst Pi_pmf_map[OF assms, of _ def]) + subgoal by simp + apply (simp add: map_pmf_comp o_def ) + by (metis comp_eq_dest_lhs) +qed + +lemma bits_to_random_xors: + assumes "distinct S" + shows " + map_pmf + (\f j. + if j < n + then Some (xor_abs (xor_from_bits S (f j))) + else None) + (Pi_pmf {..<(n::nat)} def (\_. random_xorB (length S))) = + random_xors (set S) n" + unfolding random_xors_def + apply (subst Pi_pmf_map_pmf_Some) + subgoal using assms by simp + apply (subst bits_to_random_xor[symmetric, OF assms]) + apply (subst Pi_pmf_map[where dflt = "def", where dflt'="xor_abs (xor_from_bits S def)"]) + subgoal by simp + subgoal by simp + apply (clarsimp simp add: map_pmf_comp o_def) + by (metis o_apply) + +lemma bits_to_all_random_xors: + assumes "distinct S" + assumes "(\j. if j < n + then Some (xor_abs (xor_from_bits S (def1 j))) + else None) = def" + shows " + map_pmf + ((\) (\f j. if j < n + then Some (xor_abs (xor_from_bits S (f j))) + else None)) + (Pi_pmf {0..<(m::nat)} def1 + (\_. + Pi_pmf {..<(n::nat)} def2 (\_. random_xorB (length S)))) = + Pi_pmf {0..i. random_xors (set S) n)" + apply (subst bits_to_random_xors[symmetric, OF assms(1), of _ "def2"]) + apply (subst Pi_pmf_map[OF _]) + using assms(2) by auto + +(* Sample t * (l-1) * l XORs *) +definition random_seed_xors::"nat \ nat \ (nat \ nat \ bool list \ bool) pmf" + where "random_seed_xors t l = + (prod_pmf {0.._. prod_pmf {.._. random_xorB l)))" + +lemma approxmcL_sound: + assumes \: "\ > 0" "\ < 1" + assumes \: "\ > 0" + assumes S: "distinct S" + shows " + prob_space.prob + (map_pmf (approxmc_mapL F S \ \ n) + (random_seed_xors (appmc.compute_t \ n) (length S))) + {c. real c \ + {real (card (proj (set S) (sols F))) / (1 + \).. + (1 + \) * real (card (proj (set S) (sols F)))}} + \ 1 - \" +proof - + define def where "def = + (\j. if j < degree S + then Some (xor_abs (xor_from_bits S (undefined j))) + else None)" + have *: "(map_pmf (approxmc_mapL F S \ \ n) + (Pi_pmf {0.. n} undefined + (\_. Pi_pmf {.._. random_xorB (length S))))) = + (map_pmf (appmc.approxmc_map F (set S) \ \ n) + (map_pmf ((\) (\f. + (\j. if j < length S - 1 + then Some (xor_abs (xor_from_bits S (f j))) + else None))) + (Pi_pmf {0.. n} undefined + (\_. Pi_pmf {.._. random_xorB (length S))))))" + unfolding approxmc_mapL'[OF S] + by (simp add: map_pmf_comp o_def) + have **: " + (map_pmf (approxmc_mapL F S \ \ n) + (Pi_pmf {0.. n} undefined + (\_. Pi_pmf {.._. random_xorB (length S))))) = + map_pmf (appmc.approxmc_map F (set S) \ \ n) + (Pi_pmf {0.. n} def + (\i. random_xors (set S) (card (set S) - 1)))" + unfolding * + apply (subst bits_to_all_random_xors[OF S]) + using def_def + by (auto simp add: assms(4) distinct_card) + show ?thesis + unfolding ** appmc.approxmc_map_eq random_seed_xors_def + using \(2) \ appmc.approxmc'_sound assms(1) by blast +qed + +(* This is more convenient for stating what happens when + certification returns the "wrong" result *) +lemma approxmcL_sound': + assumes \: "\ > 0" "\ < 1" + assumes \: "\ > 0" + assumes S: "distinct S" + shows " + prob_space.prob + (map_pmf (approxmc_mapL F S \ \ n) + (random_seed_xors (appmc.compute_t \ n) (length S))) + {c. real c \ + {real (card (proj (set S) (sols F))) / (1 + \).. + (1 + \) * real (card (proj (set S) (sols F)))}} \ \" +proof - + have "prob_space.prob + (map_pmf (approxmc_mapL F S \ \ n) + (Pi_pmf {0.. n} undefined + (\_. Pi_pmf {.._. random_xorB (length S))))) + {c. real c \ + {real (card (proj (set S) (sols F))) / (1 + \).. + (1 + \) * real (card (proj (set S) (sols F)))}} = + 1 - prob_space.prob + (map_pmf (approxmc_mapL F S \ \ n) + (Pi_pmf {0.. n} undefined + (\_. Pi_pmf {.._. random_xorB (length S))))) + {c. real c \ + {real (card (proj (set S) (sols F))) / (1 + \).. + (1 + \) * real (card (proj (set S) (sols F)))}}" + apply (subst measure_pmf.prob_compl[symmetric]) + by (auto simp add: vimage_def) + thus ?thesis using approxmcL_sound[OF assms, of "F" "n"] \ + unfolding random_seed_xors_def + by linarith +qed + +end + +subsection \ ApproxMC certificate checker \ + +(* Helper functions *) +definition str_of_bool :: "bool \ String.literal" + where "str_of_bool b = ( + if b then STR ''true'' else STR ''false'')" + +fun str_of_nat_aux :: "nat \ char list \ char list" + where "str_of_nat_aux n acc = ( + let c = char_of_integer (of_nat (48 + n mod 10)) in + if n < 10 then c # acc + else str_of_nat_aux (n div 10) (c # acc))" + +definition str_of_nat :: "nat \ String.literal" + where "str_of_nat n = String.implode (str_of_nat_aux n [])" + +type_synonym 'a sol = "('a \ bool) list" + +(* The canonical assignment specified by a list *) +definition canon_map_of :: "('a \ bool) list \ ('a \ bool)" + where "canon_map_of ls = + (let m = map_of ls in + (\x. case m x of None \ False | Some b \ b))" + +(* The canonical assignment specified by a list *) +lemma canon_map_of[code]: + shows "canon_map_of ls = + (let m = Mapping.of_alist ls in + Mapping.lookup_default False m)" + unfolding canon_map_of_def lookup_default_def + by (auto simp add: lookup_of_alist) + +definition proj_sol :: "'a list \ ('a \ bool) \ bool list" + where "proj_sol S w = map w S" + +text \ The following extended locale assumes + additional support for syntactically working with solutions \ +locale CertCheck = ApproxMCL sols enc_xor + for sols :: "'fml \ ('a \ bool) set" + and enc_xor :: "'a list \ bool \ 'fml \ 'fml" + + fixes check_sol :: "'fml \ ('a \ bool) \ bool" + fixes ban_sol :: "'a sol \ 'fml \ 'fml" + assumes sols_ban_sol: + "\F vs. + sols (ban_sol vs F) = + sols F \ {\. map \ (map fst vs) \ map snd vs}" + assumes check_sol: + "\F w. check_sol F w \ w \ sols F" +begin + +text \ Assuming parameter access to an UNSAT checking oracle \ +context + fixes check_unsat :: "'fml \ bool" +begin + +text \ Throughout this checker, INL indicates error, INR indicates success \ + +definition check_BSAT_sols::" + 'fml \ 'a list \ nat \ ('a \ bool) list \ String.literal + unit" +where "check_BSAT_sols F S thresh cms = ( + let ps = map (proj_sol S) cms in + let b1 = list_all (check_sol F) cms in + let b2 = distinct ps in + let b3 = + (length cms < thresh \ + check_unsat (fold ban_sol (map (zip S) ps) F)) in + if b1 \ b2 \ b3 then Inr () + else Inl (STR ''checks ---'' + + STR '' all valid sols: '' + str_of_bool b1 + + STR '', all distinct sols: '' + str_of_bool b2 + + STR '', unsat check (< thresh sols): '' + str_of_bool b3) + )" + +definition BSAT ::" + 'fml \ 'a list \ nat \ ('a \ bool) list \ String.literal + nat" +where "BSAT F S thresh xs = ( + case check_BSAT_sols F S thresh xs of + Inl err \ Inl err + | Inr _ \ Inr (length xs) +)" + +(* A size certificate is simply a list of solutions*) +definition size_xorL_cert :: " + 'fml \ 'a list \ nat \ + (nat \ (bool list \ bool)) \ nat \ + (('a \ bool) list) \ String.literal + nat" + where "size_xorL_cert F S thresh xorsl i xs = ( + let xors = map (xor_from_bits S \ xorsl) [0.. m \ |S|-1 *) +fun approxcore_xorsL_cert :: " + 'fml \ 'a list \ nat \ + nat \ ('a \ bool) list \ ('a \ bool) list \ + (nat \ (bool list \ bool)) + \ String.literal + nat" +where "approxcore_xorsL_cert F S thresh (m,cert1,cert2) xorsl = ( + if 1 \ m \ m \ length S + then + case size_xorL_cert F S thresh xorsl (m-1) cert1 of + Inl err \ Inl (STR ''cert1 '' + err) + | Inr n \ + if n \ thresh + then + if m = length S + then Inr (2 ^ length S) + else + case size_xorL_cert F S thresh xorsl m cert2 of + Inl err \ Inl (STR ''cert2 '' + err) + | Inr c \ + if c < thresh then Inr (2 ^ m * c) + else Inl (STR ''too many solutions at m added XORs'') + else Inl (STR ''too few solutions at m-1 added XORs'') + else + Inl (STR ''invalid value of m, need 1 <= m <= |S|''))" + +(* Compute the correct choice of n up to a bound arbitrarily set to 256 for now *) +definition find_t :: "real \ nat" +where "find_t \ = ( + case find (\i. appmc.raw_median_bound 0.14 i < \) [0..<256] of + Some m \ m + | None \ appmc.fix_t \ + )" + +fun fold_approxcore_xorsL_cert:: " + 'fml \ 'a list \ nat \ + nat \ nat \ + (nat \ (nat \ ('a \ bool) list \ ('a \ bool) list)) \ + (nat \ nat \ (bool list \ bool)) + \ String.literal + (nat list)" + where + "fold_approxcore_xorsL_cert F S thresh t 0 cs xorsLs = Inr []" +| "fold_approxcore_xorsL_cert F S thresh t (Suc i) cs xorsLs = ( + let it = t - Suc i in + case approxcore_xorsL_cert F S thresh (cs it) (xorsLs it) of + Inl err \ Inl (STR ''round '' + str_of_nat it + STR '' '' + err) + | Inr n \ + (case fold_approxcore_xorsL_cert F S thresh t i cs xorsLs of + Inl err \ Inl err + | Inr ns \ Inr (n # ns)))" + +definition calc_median::" + 'fml \ 'a list \ nat \ nat \ + (nat \ (nat \ ('a \ bool) list \ ('a \ bool) list)) \ + (nat \ nat \ (bool list \ bool)) \ + String.literal + nat" + where "calc_median F S thresh t ms xorsLs = ( + case fold_approxcore_xorsL_cert F S thresh t t ms xorsLs of + Inl err \ Inl err + | Inr ls \ Inr (sort ls ! (t div 2)) + )" + +fun certcheck::" + 'fml \ 'a list \ + real \ real \ + (('a \ bool) list \ + (nat \ (nat \ ('a \ bool) list \ ('a \ bool) list))) \ + (nat \ nat \ (bool list \ bool)) \ + String.literal + nat" + where "certcheck F S \ \ (m0,ms) xorsLs = ( + let \ = appmc.mk_eps \ in + let thresh = appmc.compute_thresh \ in + case BSAT F S thresh m0 of Inl err \ Inl err + | Inr Y \ + if Y < thresh then Inr Y + else + let t = find_t \ in + calc_median F S thresh t ms xorsLs)" + +(* The correctness property for BSAT oracle calls that + will be certified externally through proof logging *) +context + assumes check_unsat: "\F. check_unsat F \ sols F = {}" +begin + +lemma sols_fold_ban_sol: + shows"sols (fold ban_sol ls F) = + sols F \ {\. (\vs \ set ls. map \ (map fst vs) \ map snd vs)}" +proof (induction ls arbitrary: F) + case Nil + then show ?case by auto +next + case (Cons vs ls) + show ?case + using Cons(1) sols_ban_sol + by auto +qed + +lemma inter_cong_right: + assumes "\x. x \ A \ x \ B \ x \ C" + shows "A \ B = A \ C" + using assms by auto + +lemma proj_sol_canon_map_of: + assumes "distinct S" "length S = length w" + shows "proj_sol S (canon_map_of (zip S w)) = w" + using assms + unfolding proj_sol_def canon_map_of_def +proof (induction w arbitrary: S) + case Nil + then show ?case + by auto +next + case (Cons a w) + obtain s ss where ss: "S = s # ss" + by (metis Cons.prems(2) Suc_le_length_iff order.refl) + then show ?case + apply clarsimp + by (smt (z3) Cons.IH Cons.prems(2) add.right_neutral add_Suc_right distinct.simps(2) list.size(4) local.Cons(2) map_eq_conv nat.inject) +qed + +lemma proj_sol_cong: + assumes "restr (set S) A = restr (set S) B" + shows "proj_sol S A = proj_sol S B" + using assms + unfolding proj_sol_def restr_def map_eq_conv + by (metis option.simps(1)) + +lemma canon_map_of_map_of: + assumes "length S = length x" + assumes "canon_map_of (zip S x) \ A" + shows "map_of (zip S x) \ proj (set S) A" +proof - + define f where "f = (\xa. case map_of (zip S x) xa of + None \ False | Some b \ b)" + have "map_of (zip S x) = + (\y. if y \ set S then Some (f y) else None)" + unfolding f_def fun_eq_iff + using map_of_zip_is_Some[OF assms(1)] + by (metis option.case_eq_if option.distinct(1) option.exhaust option.sel) + thus ?thesis + using assms unfolding canon_map_of_def ApproxMCCore.proj_def restr_def image_def + using f_def by auto +qed + +lemma proj_proj_sol_map_of_zip_1: + assumes "distinct S" "length S = length w" + assumes w: "w \ rdb" + shows " + map_of (zip S w) \ + proj (set S) {\. proj_sol S \ \ rdb}" + apply (intro canon_map_of_map_of[OF assms(2)]) + using proj_sol_canon_map_of[OF assms(1-2)] w by auto + +lemma proj_proj_sol_map_of_zip_2: + assumes "\bs. bs \ rdb \ length bs = length S" + assumes w: "w \ proj (set S) {\. proj_sol S \ \ rdb}" + shows " + w \ (map_of \ zip S) ` rdb" +proof - + obtain ww where ww: "proj_sol S ww \ rdb" "w = restr (set S) ww" + using w unfolding ApproxMCCore.proj_def + by auto + + have "w = map_of (zip S (proj_sol S ww))" + unfolding ww restr_def proj_sol_def map_of_zip_map + by auto + + thus ?thesis using ww + by (auto simp add: image_def) +qed + +lemma proj_proj_sol_map_of_zip: + assumes "distinct S" + assumes "\bs. bs \ rdb \ length bs = length S" + shows " + proj (set S) {\. proj_sol S \ \ rdb} = + (map_of \ zip S) ` rdb" + apply (rule antisym) + subgoal + using proj_proj_sol_map_of_zip_2[OF assms(2)] + by blast + using assms(2) + by (auto intro!: proj_proj_sol_map_of_zip_1[OF assms(1)]) + +definition ban_proj_sol ::"'a list \ ('a \ bool) list \ 'fml \ 'fml" +where "ban_proj_sol S xs F = + fold ban_sol (map (zip S \ proj_sol S) xs) F" + +lemma check_sol_imp_proj: + assumes "w \ sols F" + shows "map_of (zip S (proj_sol S w)) \ proj (set S) (sols F)" + unfolding proj_sol_def map_of_zip_map ApproxMCCore.proj_def image_def restr_def + using assms by auto + +lemma checked_BSAT_lower: + assumes S: "distinct S" + assumes "check_BSAT_sols F S thresh xs = Inr ()" + shows "length xs \ card (proj (set S) (sols F))" + "length xs < thresh \ + card (proj (set S) (sols F)) = length xs" +proof - + define Sxs where "Sxs = map (proj_sol S) xs" + have dSxs: "distinct Sxs" + using assms unfolding Sxs_def check_BSAT_sols_def Let_def + by (auto split: if_splits) + + have lSxs: "\x. x \ set Sxs \ length x = length S" + unfolding Sxs_def proj_sol_def by auto + define SSxs where "SSxs = map (zip S) Sxs" + have dSSxs: "distinct (map map_of SSxs)" + unfolding SSxs_def + using dSxs unfolding inj_on_def distinct_map + by (smt (verit) assms(1) imageE lSxs list.set_map map_of_zip_inject) + + have *: "set (map map_of SSxs) \ proj (set S) (sols F)" + unfolding Sxs_def SSxs_def + using assms unfolding check_BSAT_sols_def Let_def + by (auto intro!: check_sol_imp_proj split: if_splits simp add: check_sol list_all_iff) + have "length xs = card (set (map map_of SSxs))" + by (metis SSxs_def Sxs_def dSSxs length_map length_remdups_card_conv remdups_id_iff_distinct) + + thus "length xs \ card (proj (set S) (sols F))" + by (metis * List.finite_set card_mono card_proj(1)) + + have frr1: "(\vs \ set SSxs. map \ (map fst vs) \ map snd vs) \ + (\vs \ set Sxs. proj_sol S \ \ vs)" for \ + apply (clarsimp simp add: proj_sol_def SSxs_def) + by (metis (mono_tags, lifting) in_set_zip nth_map) + have frr2: "(\vs \ set Sxs. proj_sol S \ \ vs) \ + (vs \ set SSxs \ map \ (map fst vs) \ map snd vs)" for vs \ + apply (clarsimp simp add: proj_sol_def SSxs_def) + by (smt (z3) Sxs_def assms(1) length_map length_map length_map map_eq_conv map_fst_zip map_of_zip_inject mem_Collect_eq nth_map nth_map nth_map proj_sol_def set_conv_nth set_conv_nth zip_map_fst_snd) + + have frr: "{\. (\vs \ set SSxs. map \ (map fst vs) \ map snd vs)} = + {\. (\vs \ set Sxs. proj_sol S \ \ vs)}" + using frr1 frr2 by auto + + moreover { + assume "length xs < thresh" + then have "sols (ban_proj_sol S xs F) = {}" + apply (intro check_unsat) + using assms(2) unfolding check_BSAT_sols_def Let_def + by (auto simp add:ban_proj_sol_def o_assoc split: if_splits) + + then have "sols F \ {\. (\vs \ set Sxs. proj_sol S \ \ vs)} = {}" + unfolding ban_proj_sol_def sols_fold_ban_sol + frr[symmetric] + by (auto simp add: SSxs_def Sxs_def) + then have 1:"proj (set S) (sols F) \ + proj (set S) + {\. \vs\set Sxs. proj_sol S \ \ vs} = {}" + unfolding ApproxMCCore.proj_def + using proj_sol_cong + by (smt (verit, del_insts) disjoint_iff_not_equal image_iff mem_Collect_eq) + + have 2: "proj (set S) (sols F) \ -proj (set S) {\. (\vs \ set Sxs. proj_sol S \ \ vs)} = + proj (set S) (sols F) \ proj (set S) {\. proj_sol S \ \ set Sxs}" + apply (intro inter_cong_right) + by (auto intro!: proj_sol_cong simp add: ApproxMCCore.proj_def ) + + have 3: "proj (set S) {\. proj_sol S \ \ set Sxs} = (map_of \ zip S) ` (set Sxs)" + apply (intro proj_proj_sol_map_of_zip[OF S]) + using lSxs by auto + + have 4: " proj (set S) (sols F) \ (map_of \ zip S) ` (set Sxs) = + (map_of \ zip S) ` (set Sxs)" + using "*" SSxs_def by auto + + have **:"proj (set S) (sols F) = + proj (set S) (sols F) \ proj (set S) {\. (\vs \ set Sxs. proj_sol S \ \ vs)} \ + proj (set S) (sols F) \ -proj (set S) {\. (\vs \ set Sxs. proj_sol S \ \ vs)}" + by auto + + have "card (proj (set S) (sols F)) = + card ((map_of \ zip S) ` (set Sxs))" + apply (subst **) + apply (subst card_Un_disjoint) + using 1 2 3 4 by (auto simp add: card_proj(1)) + + then have "card (proj (set S) (sols F)) = length xs" + by (simp add: SSxs_def \length xs = card (set (map map_of SSxs))\) + } + thus "length xs < thresh \ card (proj (set S) (sols F)) = length xs" + by auto +qed + +lemma good_BSAT: + assumes "distinct S" + assumes "BSAT F S thresh xs = Inr n" + shows "n \ card (proj (set S) (sols F))" + "n < thresh \ + card (proj (set S) (sols F)) = n" + using checked_BSAT_lower[OF assms(1)] assms(2) + by (auto simp add: BSAT_def split: if_splits sum.splits) + +lemma size_xorL_cert: + assumes "distinct S" + assumes "size_xorL_cert F S thresh xorsl i xs = Inr n" + shows + "size_xorL F S xorsl i \ n" + "n < thresh \ size_xorL F S xorsl i = n" + using assms unfolding size_xorL_def size_xorL_cert_def + using good_BSAT by auto + +lemma approxcore_xorsL_cert: + assumes S: "distinct S" + assumes "approxcore_xorsL_cert F S thresh mc xorsl = Inr n" + shows "approxcore_xorsL F S thresh xorsl = n" +proof - + obtain m cert1 cert2 where mc: "mc = (m,cert1,cert2)" + using prod_cases3 by blast + obtain nn1 where + nn1:"size_xorL_cert F S thresh xorsl (m-1) cert1 = Inr nn1" + using assms unfolding mc + by (auto split: if_splits sum.splits) + + from size_xorL_cert[OF S this] + have nn1l: + "nn1 \ size_xorL F S xorsl (m - 1)" + "nn1 < thresh \ size_xorL F S xorsl (m - 1) = nn1" by auto + + have m: "1 \ m" "m \ length S" + "nn1 \ thresh" and + ms: "m = length S \ n = 2 ^ length S \ + m < length S" + using nn1 assms unfolding mc + by (auto split: if_splits simp add: Let_def) + + have bnd: "\i. 1 \ i \ i \ m -1 \ + size_xorL F S xorsl i \ thresh" + using nn1l m(3) + by (meson assms(1) dual_order.trans size_xorL_anti_mono) + + note ms + moreover { + assume *: "m = length S" + then have "find (check_xorL F S thresh xorsl) [1.. t" + assumes "fold_approxcore_xorsL_cert F S thresh t i cs xorsLs = Inr ns" + shows "map (approxcore_xorsL F S thresh \ xorsLs) [t-i.. t" using c by auto + from c(1)[OF this *(2)] + have 2: "nss = + map (approxcore_xorsL F S thresh \ xorsLs) [t - i.. xorsLs) = n" + using assms + unfolding calc_median_def median_def + apply (clarsimp simp add: assms split: if_splits sum.splits) + using fold_approxcore_xorsL_cert[OF S] + by (metis diff_is_0_eq' dual_order.refl) + +lemma compute_t_find_t[simp]: + shows "appmc.compute_t \ (find_t \) = find_t \" + unfolding find_t_def appmc.compute_t_def + apply (clarsimp simp add: option.case_eq_if) + unfolding find_Some_iff + by auto + +lemma certcheck: + assumes "distinct S" + assumes "certcheck F S \ \ (m0,ms) xorsLs = Inr n" + shows "approxmc_mapL F S \ \ (find_t \) xorsLs = n" + using assms(2) + unfolding approxmc_mapL_def + using good_BSAT apply (clarsimp split: sum.splits if_splits simp add: Let_def) + subgoal using order_le_less_trans assms by blast + using assms order.strict_trans1 + by (meson assms(1) calc_median) + +lemma certcheck': + assumes "distinct S" + assumes "\isl (certcheck F S \ \ m xorsLs)" + shows "projr (certcheck F S \ \ m xorsLs) = + approxmc_mapL F S \ \ (find_t \) xorsLs" + by (metis certcheck assms(1) assms(2) sum.collapse(2) surj_pair) + +(* For any function f mapping randomness to certificates, + The probability that the certificate accepts (\isl) + With output c not in the interval is at most \ *) +lemma certcheck_sound: + assumes \: "\ > 0" "\ < 1" + assumes \: "\ > 0" + assumes S: "distinct S" + shows " + measure_pmf.prob + (map_pmf (\r. certcheck F S \ \ (f r) r) + (random_seed_xors (find_t \) (length S))) + {c. \isl c \ + real (projr c) \ + {real (card (proj (set S) (sols F))) / (1 + \).. + (1 + \) * real (card (proj (set S) (sols F)))}} \ \" +proof - + have "measure_pmf.prob + (map_pmf (\r. certcheck F S \ \ (f r) r) + (random_seed_xors (find_t \) (length S))) + {c. \isl c \ + real (projr c) \ + {real (card (proj (set S) (sols F))) / (1 + \).. + (1 + \) * real (card (proj (set S) (sols F)))}} \ + prob_space.prob + (map_pmf (approxmc_mapL F S \ \ (find_t \)) + (random_seed_xors (appmc.compute_t \ (find_t \)) (length S))) + {c. real c \ + {real (card (proj (set S) (sols F))) / (1 + \).. + (1 + \) * real (card (proj (set S) (sols F)))}}" + unfolding measure_map_pmf compute_t_find_t + by (auto intro!: measure_pmf.finite_measure_mono simp add: certcheck'[OF S]) + also have "... \ \" + by (intro approxmcL_sound'[OF assms]) + finally show ?thesis by auto +qed + +(* A completeness theorem for the checker in the face of probabilistic guarantees + It is stated with a "promise"-style guarantee: + For any function f mapping randomness to certificates, + If the checker accepts (\isl) the output of f on any randomness + Then the output c is in the interval with high probability (1 - \) *) +lemma certcheck_promise_complete: + assumes \: "\ > 0" "\ < 1" + assumes \: "\ > 0" + assumes S: "distinct S" + assumes r: "\r. + r \ set_pmf (random_seed_xors (find_t \) (length S)) \ + \isl (certcheck F S \ \ (f r) r)" + shows " + measure_pmf.prob + (map_pmf (\r. certcheck F S \ \ (f r) r) + (random_seed_xors (find_t \) (length S))) + {c. real (projr c) \ + {real (card (proj (set S) (sols F))) / (1 + \).. + (1 + \) * real (card (proj (set S) (sols F)))}} \ 1 - \" +proof - + have " + measure_pmf.prob + (map_pmf (\r. certcheck F S \ \ (f r) r) + (random_seed_xors (find_t \) (length S))) + {c. real (projr c) \ + {real (card (proj (set S) (sols F))) / (1 + \).. + (1 + \) * real (card (proj (set S) (sols F)))}} = + measure_pmf.prob + (map_pmf (approxmc_mapL F S \ \ (find_t \)) + (random_seed_xors (appmc.compute_t \ (find_t \)) (length S))) + {c. real c \ + {real (card (proj (set S) (sols F))) / (1 + \).. + (1 + \) * real (card (proj (set S) (sols F)))}}" + unfolding measure_map_pmf compute_t_find_t + by (auto intro!: measure_pmf.measure_pmf_eq simp add: certcheck'[OF S] r) + also have "... \ 1 - \" + by (intro approxmcL_sound[OF assms(1-4)]) + finally show ?thesis by auto +qed + +end + +lemma certcheck_code[code]: + "certcheck F S \ \ (m0,ms) xorsLs = ( + if \ > 0 \ \ < 1 \ \ > 0 \ distinct S then + (let \ = appmc.mk_eps \ in + let thresh = appmc.compute_thresh \ in + case BSAT F S thresh m0 of Inl err \ Inl err + | Inr Y \ + if Y < thresh then Inr Y + else + let t = find_t \ in + calc_median F S thresh t ms xorsLs) + else Code.abort (STR ''invalid inputs'') + (\_. certcheck F S \ \ (m0,ms) xorsLs))" + by auto + +end + +end + +end diff --git a/thys/Approximate_Model_Counting/CertCheck_CNF_XOR.thy b/thys/Approximate_Model_Counting/CertCheck_CNF_XOR.thy new file mode 100644 --- /dev/null +++ b/thys/Approximate_Model_Counting/CertCheck_CNF_XOR.thy @@ -0,0 +1,670 @@ +section \ ApproxMC certification for CNF-XOR \ + +text \ + This concretely instantiates the locales with a syntax and + semantics for CNF-XOR, giving us a certificate checker for + approximate counting in this theory. +\ + +theory CertCheck_CNF_XOR imports + ApproxMCAnalysis + CertCheck + HOL.String "HOL-Library.Code_Target_Numeral" + Show.Show_Real +begin + +text \ + This follows CryptoMiniSAT's CNF-XOR formula syntax. + A clause is a list of literals (one of which must be satisfied). + An XOR constraint has the form $l_1 + l_2 + \dots + l_n = 1$ where addition is taken over $F_2$. + Syntactically, they are specified by the list of LHS literals. + Variables are natural numbers (in practice, variable 0 is never used) +\ + +datatype lit = Pos nat | Neg nat +type_synonym clause = "lit list" +type_synonym cmsxor = "lit list" +type_synonym fml = "clause list \ cmsxor list" + +type_synonym assignment = "nat \ bool" + +definition sat_lit :: "assignment \ lit \ bool" where + "sat_lit w l = (case l of Pos x \ w x | Neg x \ \w x)" + +definition sat_clause :: "assignment \ clause \ bool" where + "sat_clause w C = (\l \ set C. sat_lit w l)" + +definition sat_cmsxor :: "assignment \ cmsxor \ bool" where + "sat_cmsxor w C = odd ((sum_list (map (of_bool \ (sat_lit w)) C))::nat)" + +definition sat_fml :: "assignment \ fml \ bool" + where + "sat_fml w f = ( + (\C \ set (fst f). sat_clause w C) \ + (\C \ set (snd f). sat_cmsxor w C))" + +(* The solution set *) +definition sols :: "fml \ assignment set" + where "sols f = {w. sat_fml w f}" + +lemma sat_fml_cons[simp]: + shows + "sat_fml w (FC, x # FX) \ + sat_fml w (FC,FX) \ sat_cmsxor w x" + "sat_fml w (c # FC, FX) \ + sat_fml w (FC,FX) \ sat_clause w c" + unfolding sat_fml_def by auto + +(* Construct clauses for a given XOR *) +fun enc_xor :: "nat xor \ fml \ fml" + where + "enc_xor (x,b) (FC,FX) = ( + if b then (FC, map Pos x # FX) + else + case x of + [] \ (FC,FX) + | (v#vs) \ (FC, (Neg v # map Pos vs) # FX))" + +lemma sols_enc_xor: + shows "sols (enc_xor (x,b) (FC,FX)) = + sols (FC,FX) \ {\. satisfies_xorL (x,b) \}" + unfolding sols_def + by (cases x; auto simp add: satisfies_xorL_def sat_cmsxor_def o_def sat_lit_def list.case_eq_if) + +(* Solution checking *) +definition check_sol :: "fml \ (nat \ bool) \ bool" + where "check_sol fml w = ( + list_all (list_ex (sat_lit w)) (fst fml) \ + list_all (sat_cmsxor w) (snd fml))" + +definition ban_sol :: "(nat \ bool) list \ fml \ fml" + where "ban_sol vs fml = + ((map (\(v,b). if b then Neg v else Pos v) vs)#fst fml, snd fml)" + +lemma check_sol_sol: + shows "w \ sols F \ + check_sol F w" + unfolding check_sol_def sols_def sat_fml_def + apply clarsimp + by (metis Ball_set_list_all Bex_set_list_ex sat_clause_def) + +lemma ban_sat_clause: + shows "sat_clause w (map (\(v, b). if b then Neg v else Pos v) vs) \ + map w (map fst vs) \ map snd vs" + unfolding sat_clause_def + by (force simp add: sat_lit_def split: if_splits) + +lemma sols_ban_sol: + shows"sols (ban_sol vs F) = + sols F \ + {\. map \ (map fst vs) \ map snd vs}" + unfolding ban_sol_def sols_def + by (auto simp add: ban_sat_clause) + +(* Globally interpret the ApproxMC locale to make + ApproxMC certification available for CNF-XOR *) +global_interpretation CertCheck_CNF_XOR : + CertCheck "sols" "enc_xor" "check_sol" "ban_sol" + defines + random_seed_xors = CertCheck_CNF_XOR.random_seed_xors and + fix_t = CertCheck_CNF_XOR.appmc.fix_t and + find_t = CertCheck_CNF_XOR.find_t and + BSAT = CertCheck_CNF_XOR.BSAT and + check_BSAT_sols = CertCheck_CNF_XOR.check_BSAT_sols and + size_xorL_cert = CertCheck_CNF_XOR.size_xorL_cert and + approxcore_xorsL = CertCheck_CNF_XOR.approxcore_xorsL and + fold_approxcore_xorsL_cert = CertCheck_CNF_XOR.fold_approxcore_xorsL_cert and + approxcore_xorsL_cert = CertCheck_CNF_XOR.approxcore_xorsL_cert and + calc_median = CertCheck_CNF_XOR.calc_median and + certcheck = CertCheck_CNF_XOR.certcheck + apply unfold_locales + subgoal by (metis sols_enc_xor surj_pair) + subgoal by (metis sols_ban_sol) + by (metis check_sol_sol) + +(* Note that we automatically get the associated theorems +thm CertCheck_CNF_XOR.certcheck_sound + +thm CertCheck_CNF_XOR.certcheck_promise_complete +*) + +subsection \ Blasting XOR constraints to CNF \ + +text \ + This formalizes the usual linear conversion from CNF-XOR into CNF. + It is not necessary to use this conversion for solvers that support + CNF-XOR formulas natively. +\ + +definition negate_lit :: "lit \ lit" + where "negate_lit l = (case l of Pos x \ Neg x | Neg x \ Pos x)" + +(* Naive direct encoding XOR *) +fun xor_clauses :: "cmsxor \ bool \ clause list" + where + "xor_clauses [] b = (if b then [[]] else [])" + | "xor_clauses (x#xs) b = + (let p_x = xor_clauses xs b in + let n_x = xor_clauses xs (\b) in + map (\c. x # c) p_x @ map (\c. negate_lit x # c) n_x)" + +lemma sat_cmsxor_nil[simp]: + shows"\ (sat_cmsxor w [])" + unfolding sat_cmsxor_def + by auto + +lemma sat_cmsxor_cons: + shows "sat_cmsxor w (x # xs) = + (if sat_lit w x then \ (sat_cmsxor w xs) else sat_cmsxor w xs)" + unfolding sat_cmsxor_def + by auto + +lemma sat_cmsxor_append: + shows "sat_cmsxor w (xs @ ys) = + (if sat_cmsxor w xs then \ (sat_cmsxor w ys) else sat_cmsxor w ys)" +proof (induction xs) + case Nil + then show ?case + by (auto simp add: sat_cmsxor_def) +next + case (Cons x xs) + then show ?case + by (auto simp add: sat_cmsxor_cons) +qed + +definition sat_clauses:: "assignment \ clause list \ bool" + where "sat_clauses w cs = (\c \ set cs. sat_clause w c)" + +lemma sat_clauses_append: + shows "sat_clauses w (xs @ ys) = + (sat_clauses w xs \ sat_clauses w ys)" + unfolding sat_clauses_def by auto + +lemma sat_clauses_map: + shows "sat_clauses w (map ((#) x) cs) = + (sat_lit w x \ sat_clauses w cs)" + unfolding sat_clauses_def sat_clause_def by auto + +lemma sat_lit_negate_lit[simp]: + "sat_lit w (negate_lit l) = (\sat_lit w l)" + apply (cases l) + by (auto simp add: negate_lit_def sat_lit_def) + +lemma sols_xor_clauses: + shows " + sat_clauses w (xor_clauses xs b) \ + (sat_cmsxor w xs = b)" +proof (induction xs arbitrary: b) + case Nil + then show ?case + by (auto simp add: sat_cmsxor_def sat_clauses_def sat_clause_def) +next + case (Cons x xs b) + have *: "(sat_cmsxor w (x # xs) = b) = + (if sat_lit w x + then (sat_cmsxor w xs = (\b)) + else (sat_cmsxor w xs = b))" unfolding sat_cmsxor_cons + by auto + + have "sat_clauses w (xor_clauses (x # xs) b) \ + ((sat_lit w x \ sat_clauses w (xor_clauses xs b)) \ + (\(sat_lit w x) \ sat_clauses w (xor_clauses xs (\ b))))" + unfolding xor_clauses.simps Let_def sat_clauses_append sat_clauses_map + by auto + moreover have "... = ( + (sat_lit w x \ (sat_cmsxor w xs = b)) \ + (\(sat_lit w x) \ (sat_cmsxor w xs = (\ b))))" + using Cons.IH by auto + moreover have "... = (sat_cmsxor w (x # xs) = b)" + unfolding * by auto + ultimately show ?case + by auto +qed + +(* This can be done more generally with freshness *) +definition var_lit :: "lit \ nat" + where "var_lit l = (case l of Pos x \ x | Neg x \ x)" + +definition var_lits :: "lit list \ nat" + where "var_lits ls = fold max (map var_lit ls) 0" + +lemma sat_lit_same: + assumes "\x. x \ var_lit l \ w x = w' x" + shows "sat_lit w l = sat_lit w' l" + using assms + apply (cases l) + by (auto simp add: sat_lit_def var_lit_def) + +lemma var_lits_eq: + "var_lits ls = Max (set (0 # map var_lit ls))" + unfolding var_lits_def Max.set_eq_fold + by auto + +lemma sat_lits_same: + assumes "\x. x \ var_lits c \ w x = w' x" + shows "sat_clause w c = sat_clause w' c" + using assms + unfolding sat_clause_def var_lits_eq sat_lit_same + by (smt (verit) List.finite_set Max_ge dual_order.trans image_subset_iff list.set_map sat_lit_same set_subset_Cons) + +lemma le_var_lits_in: + assumes "y \ set ys" "v \ var_lit y" + shows "v \ var_lits ys" + using assms unfolding var_lits_eq + by (metis List.finite_set Max_ge dual_order.trans imageI insertCI list.set(2) list.set_map) + +lemma sat_cmsxor_same: + assumes "\x. x \ var_lits xs \ w x = w' x" + shows "sat_cmsxor w xs = sat_cmsxor w' xs" + using assms +proof (induction xs) + case Nil + then show ?case + unfolding sat_cmsxor_def + by auto +next + case ih:(Cons x xs) + have 1: "sat_lit w x = sat_lit w' x" + apply (intro sat_lit_same) + using ih(2) + by (metis le_var_lits_in list.set_intros(1)) + have 2: "sat_cmsxor w xs = sat_cmsxor w' xs" + apply (intro ih(1)) + using ih(2) + by (smt (verit) List.finite_set Max_ge_iff empty_not_insert insert_iff list.set(2) list.simps(9) var_lits_eq) + show ?case + unfolding sat_cmsxor_cons + using 1 2 by presburger +qed + +(* linear *) +lemma sat_cmsxor_split: + assumes u: "var_lits xs < u" "var_lits ys < u" + assumes w': "w' = (\x. if x = u then \ sat_cmsxor w xs else w x)" + shows " + (sat_cmsxor w (xs @ ys) = + (sat_cmsxor w' (Pos u # xs) \ + sat_cmsxor w' (Neg u # ys)))" +proof - + have xs: "sat_cmsxor w' xs = sat_cmsxor w xs" + apply (intro sat_cmsxor_same) + using u unfolding w' by auto + have ys: "sat_cmsxor w' ys = sat_cmsxor w ys" + apply (intro sat_cmsxor_same) + using u unfolding w' by auto + + show ?thesis + unfolding sat_cmsxor_append sat_cmsxor_cons xs ys + unfolding w' by (auto simp add: sat_lit_def) +qed + +(* split an XOR constraint into chunks of at most k+3 literals *) +fun split_xor ::"nat \ cmsxor \ cmsxor list \ nat \ cmsxor list \ nat" + where "split_xor k xs (acc,u) = ( + if length xs \ k + 3 then (xs # acc, u) + else ( + let xs1 = take (k + 2) xs in + let xs2 = drop (k + 2) xs in + split_xor k (Neg u # xs2) ((Pos u # xs1) # acc, u+1) + ) + )" + +declare split_xor.simps[simp del] + +lemma split_xor_bound: + assumes "split_xor k xs (acc,u) = (acc',u')" + shows "u \ u'" + using assms +proof (induction "length xs" arbitrary: xs acc u acc' u' rule: less_induct) + case less + have " length xs \ k + 3 \ \ ( length xs \ k + 3)" by auto + moreover { + assume "length xs \ k + 3" + then have "u \ u'" + using less(2) split_xor.simps by auto + } + moreover { + assume s: "\ ( length xs \ k + 3)" + then have l: "length (Neg u # drop (Suc (Suc k)) xs) < length xs" + by auto + have "Suc u \ u'" + using s less(2) + unfolding split_xor.simps[of k xs] + using less(1)[OF l] by auto + then have "u \ u'" by auto + } + ultimately show ?case by auto +qed + +lemma var_lits_append: + shows "var_lits xs \ var_lits (xs @ ys)" + "var_lits ys \ var_lits (xs @ ys)" + unfolding var_lits_eq + by auto + +lemma fold_max_eq: + assumes "i \ u" + shows "fold max ls u = max u (fold max ls (i::nat))" + using assms + apply (induction ls arbitrary: i) + subgoal by clarsimp + apply clarsimp + by (smt (verit) List.finite_set Max.set_eq_fold Max_ge_iff empty_iff insert_iff list.set(2) max.orderI max_def pre_arith_simps(3)) + +(* We can be more precise here that the number of solutions + is preserved exactly, but for UNSAT this is not needed *) +lemma split_xor_sound: + assumes "sat_cmsxor w xs" "\x. x \ set acc \ sat_cmsxor w x" + assumes u: "var_lits xs < u" "\x. x \ set acc \ var_lits x < u" + assumes "split_xor k xs (acc,u) = (acc',u')" + obtains w' where + "\x. x < u \ w x = w' x" + "\x. x \ set acc' \ sat_cmsxor w' x" + "\x. x \ set acc' \ var_lits x < u'" + using assms +proof (induction "length xs" arbitrary: w xs acc u acc' u' thesis rule: less_induct) + case less + have " length xs \ k + 3 \ \ ( length xs \ k + 3)" by auto + moreover { + assume "length xs \ k + 3" + then have *: "acc' = xs # acc" + using less(7) split_xor.simps + by auto + then have + "\x. x < u \ w x = w x" + "\x. x \ set acc' \ sat_cmsxor w x" + "\x. x \ set acc' \ var_lits x < u'" + subgoal by meson + subgoal using less + by (metis * set_ConsD) + using less + by (metis "*" order_trans_rules(22) set_ConsD split_xor_bound) + } + moreover { + assume s: "\ (length xs \ k + 3)" + define xs1 where xs1:"xs1 = take (k + 2) xs" + define xs2 where xs2:"xs2 = drop (k + 2) xs" + have sp: "split_xor k (Neg u # xs2) ((Pos u # xs1) # acc, u+1) = (acc',u')" + by (metis less(7) s split_xor.simps xs1 xs2) + have l: "length (Neg u # xs2) < length xs" + using s xs2 by auto + + have xs: "xs = xs1 @ xs2" by (simp add: xs1 xs2) + + define w' where w': "w' = + (\x. if x = u then \ sat_cmsxor w xs1 else w x)" + + have vl: "var_lits xs1 < u" "var_lits xs2 < u" + apply (metis less(5) order_trans_rules(21) var_lits_append(1) xs) + by (metis less(5) order_trans_rules(21) var_lits_append(2) xs) + + from sat_cmsxor_split[OF this w'] + have satws1: "sat_cmsxor w' (Pos u # xs1)" + and satws2: "sat_cmsxor w' (Neg u # xs2)" + using less(3) xs by auto + + have satacc: "\x. x \ set ((Pos u # xs1) # acc) \ + sat_cmsxor w' x" + by (metis less(4) less(6) not_less sat_cmsxor_same satws1 set_ConsD w') + + have v1: "var_lits (Neg u # xs2) < u + 1" + unfolding var_lits_def + apply (simp add: var_lit_def) + using vl var_lits_def fold_max_eq + by (metis le_add2 le_add_same_cancel2 less_Suc_eq max.absorb3) + + have "fold max (map var_lit xs1) u < Suc u" + using vl var_lits_def + by (smt (verit, best) List.finite_set Max.set_eq_fold Max_ge_iff dual_order.trans empty_iff insert_iff lessI less_or_eq_imp_le list.set(2) not_less) + moreover have "\x. x \ set acc \ + fold max (map var_lit x) 0 < Suc u" + by (metis less(6) less_SucI var_lits_def) + ultimately have v2:"\x. x \ set ((Pos u # xs1) # acc) \ var_lits x < u + 1" + unfolding var_lits_def + by (auto simp add: var_lit_def) + + obtain w'' where + w'': "\x. x < u + 1 \ w' x = w'' x" + "\x. x \ set acc' \ sat_cmsxor w'' x" + "\x. x \ set acc' \ var_lits x < u'" + using less(1)[OF l _ satws2 satacc v1 v2 sp] + by auto + + have "\x. x < u \ w x = w'' x" + using w''(1) + unfolding w' + using less_Suc_eq by fastforce + + then have "\w''. ( + (\x. x < u \ w x = w'' x) \ + (\x. x \ set acc' \ sat_cmsxor w'' x) \ + (\x. x \ set acc' \ var_lits x < u'))" + using w''(2-3) by auto + } + ultimately show ?case + using less(2) + by (metis (mono_tags, lifting)) +qed + +definition split_xors ::"nat \ nat \ cmsxor list \ cmsxor list" +where "split_xors k u xs = fst (fold (split_xor k) xs ([],u))" + +lemma split_xors_sound: + assumes "\x. x \ set xs \ sat_cmsxor w x" + "\x. x \ set acc \ sat_cmsxor w x" + assumes u: "\x. x \ set xs \ var_lits x < u" + "\x. x \ set acc \ var_lits x < u" + assumes "fold (split_xor k) xs (acc,u) = (acc',u')" + obtains w' where + "\x. x < u \ w x = w' x" + "\x. x \ set acc' \ sat_cmsxor w' x" + "\x. x \ set acc' \ var_lits x < u'" + using assms +proof (induction xs arbitrary: w acc u acc' u') + case Nil + then show ?case + by auto +next + case ih:(Cons x xs) + obtain acc'' u'' where x: "split_xor k x (acc, u) = (acc'',u'')" + by fastforce + from split_xor_sound[OF _ _ _ _ this] + obtain w'' where + w'': "\x. x < u \ w x = w'' x" + "\x. x \ set acc'' \ sat_cmsxor w'' x" + "\x. x \ set acc'' \ var_lits x < u''" + by (smt (verit, del_insts) ih(4) ih(5) ih(6) ih.prems(2) list.set_intros(1)) + have rw: "fold (split_xor k) xs (acc'',u'') = (acc', u')" + using ih(7) x by auto + have 1: "\x. x \ set xs \sat_cmsxor w'' x" + by (metis basic_trans_rules(22) ih(3) ih(5) list.set_intros(2) not_less sat_cmsxor_same w''(1)) + have 2: "\x. x \ set xs \ var_lits x < u''" + by (meson ih(5) list.set_intros(2) order_trans_rules(22) split_xor_bound x) + show ?case + using ih(1)[OF _ 1 w''(2) 2 w''(3) rw] + by (smt (verit, best) basic_trans_rules(22) ih(2) split_xor_bound w''(1) x) +qed + +(* maximum variable occuring in the whole formula *) +definition var_fml :: "fml \ nat" + where "var_fml f = + max (fold max (map var_lits (fst f)) 0) + (fold max (map var_lits (snd f)) 0)" + +lemma var_fml_eq: + "var_fml f = + max (Max (set (0 # map var_lits (fst f)))) + (Max (set (0 # map var_lits (snd f))))" + unfolding var_fml_def Max.set_eq_fold + by auto + +definition split_fml ::" nat \ fml \ fml" + where "split_fml k f = ( + let u = var_fml f + 1 in + (fst f, (split_xors k u (snd f))) + )" + +lemma var_lits_var_fml: + shows "\x. x \ set (snd F) \ var_lits x \ var_fml F" + "\x. x \ set (fst F) \ var_lits x \ var_fml F" + unfolding var_fml_eq + subgoal + apply clarsimp + by (meson List.finite_set Max_ge finite_imageI finite_insert image_subset_iff max.coboundedI2 subset_insertI) + apply clarsimp + by (meson List.finite_set Max_ge finite_imageI finite_insert image_subset_iff max.coboundedI1 subset_insertI) + +lemma split_fml_satisfies: + assumes "sat_fml w F" + obtains w' where "sat_fml w' (split_fml k F)" +proof - + obtain acc' u' where + *: "fold (split_xor k) (snd F) ([], var_fml F + 1) = (acc',u')" + by fastforce + have 1:"\x. x \ set (snd F) \ sat_cmsxor w x" + using assms unfolding sat_fml_def by auto + have 2:"\x. x \ set (snd F) \ var_lits x < var_fml F + 1" + using var_lits_var_fml + by (meson less_add_one order_le_less_trans) + from split_xors_sound[OF 1 _ _ 2 *] + obtain w' where + w': "\x. x < var_fml F + 1 \ w x = w' x" + "\x. x \ set acc' \ sat_cmsxor w' x" + "\x. x \ set acc' \ var_lits x < u'" + using "2" by auto + have "\x. x \ set (fst F) \ sat_clause w' x" + by (metis assms less_add_one order_trans_rules(21) sat_fml_def sat_lits_same var_lits_var_fml(2) w'(1)) + + then have "sat_fml w' (split_fml k F)" + unfolding split_fml_def Let_def split_xors_def * + by (auto simp add: sat_fml_def w'(2)) + thus ?thesis + using that by auto +qed + +lemma split_fml_sols: + assumes "sols (split_fml k F) = {}" + shows "sols F = {}" + using assms + using split_fml_satisfies unfolding sols_def + by (metis Collect_empty_eq) + +definition blast_xors :: "cmsxor list \ clause list" + where "blast_xors xors = concat (map (\x. xor_clauses x True) xors)" + +definition blast_fml :: "fml \ clause list" + where "blast_fml f = + fst f @ blast_xors (snd f)" + +lemma sat_clauses_concat: + "sat_clauses w (concat xs) \ + (\x \ set xs. sat_clauses w x)" + unfolding sat_clauses_def + by auto + +lemma blast_xors_sound: + assumes "(\x. x \ set xors \ sat_cmsxor w x)" + shows "sat_clauses w (blast_xors xors)" + unfolding blast_xors_def sat_clauses_concat + by (auto simp add: assms sols_xor_clauses) + +lemma blast_fml_sound: + assumes "sat_fml w F" + shows "sat_fml w (blast_fml F,[])" + unfolding blast_fml_def sat_fml_def + apply clarsimp + using assms blast_xors_sound sat_clauses_def sat_fml_def by blast + +definition blast_split_fml :: "fml \ clause list" + where "blast_split_fml f = blast_fml (split_fml 1 f)" + +lemma blast_split_fml_sols: + assumes "sols (blast_split_fml F,[]) = {}" + shows "sols F = {}" + by (metis Collect_empty_eq assms blast_fml_sound blast_split_fml_def sols_def split_fml_sols) + +definition certcheck_blast::" + (clause list \ bool) \ + fml \ nat list \ + real \ real \ + ((nat \ bool) list \ + (nat \ (nat \ (nat \ bool) list \ (nat \ bool) list))) \ + (nat \ nat \ (bool list \ bool)) \ + String.literal + nat" + where "certcheck_blast check_unsat F S \ \ m0ms = + certcheck (check_unsat \ blast_split_fml) F S \ \ m0ms" + +(* Just for completeness, we re-state the main theorems *) +corollary certcheck_blast_sound: + assumes "\F. check_unsat F \ sols (F, []) = {}" + assumes "0 < \" "\ < 1" + assumes "0 < \" + assumes "distinct S" + shows " + measure_pmf.prob + (map_pmf (\r. certcheck_blast check_unsat F S \ \ (f r) r) + (random_seed_xors (find_t \) (length S))) + {c. \ isl c \ + real (projr c) \ + {real (card (proj (set S) (sols F))) / (1 + \).. + (1 + \) * real (card (proj (set S) (sols F)))}} \ \" + unfolding certcheck_blast_def + apply (intro CertCheck_CNF_XOR.certcheck_sound[OF _ assms(2-5)]) + using assms(1) unfolding Let_def + using blast_split_fml_sols by auto + +corollary certcheck_blast_promise_complete: + assumes "\F. check_unsat F \ sols (F, []) = {}" + assumes "0 < \" "\ < 1" + assumes "0 < \" + assumes "distinct S" + assumes r: "\r. + r \ set_pmf (random_seed_xors (find_t \) (length S)) \ + \isl (certcheck_blast check_unsat F S \ \ (f r) r)" + shows " + measure_pmf.prob + (map_pmf (\r. certcheck_blast check_unsat F S \ \ (f r) r) + (random_seed_xors (find_t \) (length S))) + {c. real (projr c) \ + {real (card (proj (set S) (sols F))) / (1 + \).. + (1 + \) * real (card (proj (set S) (sols F)))}} \ 1 - \" + unfolding certcheck_blast_def + apply (intro CertCheck_CNF_XOR.certcheck_promise_complete[OF _ assms(2-5)]) + using assms(1) unfolding Let_def + using blast_split_fml_sols assms(6) unfolding certcheck_blast_def by auto + +subsection \ Export code for a SML implementation. \ + +definition real_of_int :: "integer \ real" + where "real_of_int n = real (nat_of_integer n)" + +definition real_mult :: "real \ real \ real" + where "real_mult n m = n * m" + +definition real_div :: "real \ real \ real" + where "real_div n m = n / m" + +definition real_plus :: "real \ real \ real" + where "real_plus n m = n + m" + +definition real_minus :: "real \ real \ real" + where "real_minus n m = n - m" + +declare [[code abort: fix_t]] + +(* Sample code export. + Helper Isabelle converters, followed by exporting the actual code *) +export_code + length + nat_of_integer int_of_integer + integer_of_nat integer_of_int + real_of_int real_mult real_div real_plus real_minus + quotient_of + + Pos Neg + CertCheck_CNF_XOR.appmc.compute_thresh + find_t certcheck + certcheck_blast + in SML + +end diff --git a/thys/Approximate_Model_Counting/ROOT b/thys/Approximate_Model_Counting/ROOT new file mode 100644 --- /dev/null +++ b/thys/Approximate_Model_Counting/ROOT @@ -0,0 +1,18 @@ +chapter AFP + +session Approximate_Model_Counting = Frequency_Moments + + options [timeout = 600] + sessions + Concentration_Inequalities + Monad_Normalisation + theories + ApproxMCPreliminaries + RandomXOR + RandomXORHashFamily + ApproxMCCore + ApproxMCCoreAnalysis + CertCheck + CertCheck_CNF_XOR + document_files + "root.tex" + "root.bib" diff --git a/thys/Approximate_Model_Counting/RandomXOR.thy b/thys/Approximate_Model_Counting/RandomXOR.thy new file mode 100644 --- /dev/null +++ b/thys/Approximate_Model_Counting/RandomXOR.thy @@ -0,0 +1,1634 @@ +section \Random XORs\ + +text \The goal of this section is to prove that, + for a randomly sampled XOR $X$ from a set of variables $V$: + \begin{enumerate} + \item the probability of an assignment $w$ satisfying $X$ is $\frac{1}{2}$; + \item for any distinct assignments $w$, $w'$ the probability of both satisfying $X$ is equal to $\frac{1}{4}$ (2-wise independence); and + \item for any distinct assignments $w$, $w'$, $w''$ the probability of all three + satisfying $X$ is equal to $\frac{1}{8}$ (3-wise independence). + \end{enumerate} + \ + +theory RandomXOR imports + ApproxMCPreliminaries + Frequency_Moments.Product_PMF_Ext + Monad_Normalisation.Monad_Normalisation +begin + + +text \A random XOR constraint is modeled + as a random subset of variables and a randomly chosen RHS bit. \ +definition random_xor :: "'a set \ ('a set \ bool) pmf" + where "random_xor V = + pair_pmf (pmf_of_set (Pow V)) (bernoulli_pmf (1/2))" + +lemma pmf_of_set_Pow_fin_map: + assumes V:"finite V" + shows "pmf_of_set (Pow V) = + map_pmf (\b. {x \ V. b x = Some True}) + (Pi_pmf V def (\_. map_pmf Some (bernoulli_pmf (1 / 2))))" +proof - + have *: "Pi_pmf V def (\_. map_pmf Some (bernoulli_pmf (1 / 2))) = + map_pmf (\f x. if x \ V then f x else def) + (Pi_pmf V (Some False) (\_. map_pmf Some (bernoulli_pmf (1 / 2))))" + unfolding Pi_pmf_default_swap[OF V] by auto + + have **: "pmf_of_set (Pow V) = + map_pmf + (\x. {xa. (xa \ V \ x xa) \ xa \ V}) + (Pi_pmf V False (\_. bernoulli_pmf (1 / 2)))" + by (smt (verit, ccfv_SIG) Collect_cong pmf_of_set_Pow_conv_bernoulli V pmf.map_cong) + show ?thesis + unfolding * + apply (subst Pi_pmf_map[OF V, of _ "False"]) + using ** by (auto simp add: pmf.map_comp o_def) +qed + +(* A random XOR can also be sampled as a + map |V| \ bool + a coin flip *) +lemma random_xor_from_bits: + assumes V:"finite V" + shows "random_xor V = + pair_pmf + (map_pmf (\b. {x \ V. b x = Some True}) + (Pi_pmf V def (\_. map_pmf Some (bernoulli_pmf (1/2))))) + (bernoulli_pmf (1/2))" + unfolding random_xor_def + using V pmf_of_set_Pow_fin_map by fastforce + +(* An assignment is a subset \ of V + i.e., those variables assigned to true *) +fun satisfies_xor :: "('a set \ bool) \ 'a set \ bool" + where "satisfies_xor (x,b) \ = + even (card (\ \ x) + of_bool b) " + +(* +(* x_0 \ x_1 \ x_2 = 0 *) +value "satisfies_xor ({0,1,2},False) {0::nat}" +(* x_0 \ x_1 \ x_2 = 1 *) +value "satisfies_xor ({0,1,2},True) {0::nat}" +*) + +lemma satisfies_xor_inter: + shows "satisfies_xor ( \ \ x ,b) \ = satisfies_xor (x,b) \" + by (auto simp add: Int_commute) + +lemma prob_bernoulli_bind_pmf: + assumes "0 \ p" "p \ 1" + assumes "finite E" + shows "measure_pmf.prob + (bernoulli_pmf p \ x) E = + p * (measure_pmf.prob (x True) E) + + (1 - p) * (measure_pmf.prob (x False) E) " + using assms + by (auto simp add: pmf_bind measure_measure_pmf_finite[OF assms(3)] vector_space_over_itself.scale_sum_right comm_monoid_add_class.sum.distrib mult.commute) + +lemma set_pmf_random_xor: + assumes V: "finite V" + shows "set_pmf (random_xor V) = (Pow V) \ UNIV" + unfolding random_xor_def + using assms by (auto simp add: Pow_not_empty Set.basic_monos(7)) + +lemma pmf_of_set_prod: + assumes "P \ {}" "Q \ {}" + assumes "finite P" "finite Q" + shows "pmf_of_set (P \ Q) = pair_pmf (pmf_of_set P) (pmf_of_set Q)" + by (auto intro!: pmf_eqI simp add: indicator_def pmf_pair assms) + +lemma random_xor_pmf_of_set: + assumes V:"finite V" + shows "random_xor V = pmf_of_set ((Pow V) \ UNIV)" + unfolding random_xor_def + apply (subst pmf_of_set_prod) + using V bernoulli_pmf_half_conv_pmf_of_set by auto + +lemma prob_random_xor_with_set_pmf: + assumes V: "finite V" + shows "prob_space.prob (random_xor V) {c. P c} = + prob_space.prob (random_xor V) {c. fst c \ V \ P c}" + by (smt (verit, best) PowD assms measure_pmf.measure_pmf_eq mem_Collect_eq mem_Sigma_iff prod.collapse set_pmf_random_xor) + +lemma prob_set_parity: + assumes "measure_pmf.prob M + {c. P c} = q" + shows "measure_pmf.prob M + {c. P c = b} = (if b then q else 1 - q)" +proof - + { + assume b:"b" + have ?thesis using assms + using b by presburger + } + moreover { + assume b:"\b" + have "{c. P c} \ measure_pmf.events M" by auto + from measure_pmf.prob_compl[OF this] + have "1 - q = measure_pmf.prob M (UNIV - {c. P c})" + using assms by auto + moreover have " ... = + prob_space.prob M + {c. P c = b}" + by (simp add: b measure_pmf.measure_pmf_eq) + ultimately have ?thesis + using b by presburger + } + ultimately show ?thesis by auto +qed + +lemma satisfies_random_xor: + assumes V: "finite V" + shows "prob_space.prob (random_xor V) + {c. satisfies_xor c \} = 1 / 2" +proof - + have eq: "{(c::'a set \ bool). fst c \ V} = {c. c \ V} \ UNIV" + by auto + then have "finite {(c::'a set \ bool). fst c \ V}" + using assms by auto + + then have *: " + x \ V \ + measure_pmf.prob (bernoulli_pmf (1 / 2) \ (\y. return_pmf (x, y))) + {c. fst c \ V \ satisfies_xor c \} = 1 / 2" for x + apply (subst prob_bernoulli_bind_pmf) + by (auto simp add: indicator_def) + + have "prob_space.prob (random_xor V) {c. satisfies_xor c \} = + prob_space.prob (random_xor V) {c. fst c \ V \ satisfies_xor c \}" + using prob_random_xor_with_set_pmf[OF V] by auto + also have "... = + prob_space.expectation (random_xor V) + (indicat_real {c. fst c \ V \ satisfies_xor c \})" + by auto + also have "... = (\a\Pow V. + inverse (real (card (Pow V))) * + measure_pmf.prob + (bernoulli_pmf (1 / 2) \ + (\y. return_pmf (a, y))) + {c. fst c \ V \ satisfies_xor c \})" + unfolding random_xor_def pair_pmf_def + apply (subst pmf_expectation_bind_pmf_of_set) + using assms by auto + also have "... = (\a\Pow V. + inverse (real (card (Pow V))) * (1/2))" + by (simp add: *) + also have "... = + inverse (real (card (Pow V))) * (1/2) * (\a\Pow V. 1)" + using * by force + also have "... = 1/2" + by (metis One_nat_def Suc_leI assms card_Pow divide_real_def inverse_inverse_eq inverse_nonzero_iff_nonzero nat_one_le_power nonzero_mult_div_cancel_left not_one_le_zero of_nat_eq_0_iff pos2 real_of_card) + finally show ?thesis + by presburger +qed + +lemma satisfies_random_xor_parity: + assumes V: "finite V" + shows "prob_space.prob (random_xor V) + {c. satisfies_xor c \ = b} = 1 / 2" + using prob_set_parity[OF satisfies_random_xor[OF V]] + by auto + +subsection "Independence properties of random XORs" + +lemma pmf_of_set_powerset_split: + assumes "S \ V" "finite V" + shows " + map_pmf (\(x,y). x \ y) + (pmf_of_set (Pow S \ Pow (V - S))) = + pmf_of_set (Pow V)" +proof - + have spmfS: "set_pmf (pmf_of_set (Pow S)) = Pow S" + using assms + by (auto intro!: set_pmf_of_set simp add: rev_finite_subset) + have spmfVS: "set_pmf (pmf_of_set (Pow (V-S))) = Pow (V-S)" + using assms by (auto intro!: set_pmf_of_set) + + have xsub: "x \ V \ + \xa\Pow S. + \y\Pow (V - S). x = xa \ y" for x + by (metis Diff_subset_conv Pow_iff Un_Diff_Int basic_trans_rules(23) inf_le2 sup_commute) + + have inj: "inj_on (\(x, y). x \ y) + (Pow S \ Pow (V - S))" + unfolding inj_on_def + by auto + then have bij: "bij_betw (\(x, y). x \ y) + ((Pow S) \ Pow (V - S)) + (Pow V)" + unfolding bij_betw_def + using assms(1) xsub by (auto simp add: image_def) + + have "map_pmf (\(x, y). x \ y) + (pmf_of_set (Pow S \ Pow (V - S))) = + pmf_of_set (Pow V)" + apply (subst map_pmf_of_set_inj[OF inj]) + subgoal by (auto simp add: image_def) + subgoal using bij assms(2) bij_betw_finite by blast + apply (intro arg_cong[where f = "pmf_of_set"]) + using assms(1) xsub by (auto simp add: image_def) + + thus ?thesis + unfolding spmfS spmfVS + by auto +qed + +lemma pmf_of_set_Pow_sing: + shows"pmf_of_set (Pow {x}) = + bernoulli_pmf (1 / 2) \ + (\b. return_pmf (if b then {x} else {}))" + apply (intro pmf_eqI) + apply (subst pmf_of_set) + by (auto simp add: pmf_bind card_Pow indicator_def subset_singleton_iff) + +lemma pmf_of_set_sing_coin_flip: + assumes "finite V" + shows "pmf_of_set (Pow {x} \ Pow V) = + map_pmf (\(r,c). (if c then {x} else {}, r)) (random_xor V)" +proof - + have *: "pmf_of_set (Pow {x} \ Pow V) = + pair_pmf (pmf_of_set (Pow {x})) (pmf_of_set (Pow V))" + apply(intro pmf_of_set_prod) + using assms by auto + show ?thesis + unfolding * + apply (intro pmf_eqI) + including monad_normalisation + by (auto simp add: map_pmf_def pair_pmf_def random_xor_def pmf_of_set_Pow_sing) +qed + +(* TODO: there is a more general version below *) +lemma measure_pmf_prob_dependent_product_bound_eq: + assumes "countable A" "\i. countable (B i)" + assumes "\a. a \ A \ measure_pmf.prob N (B a) = r" + shows "measure_pmf.prob (pair_pmf M N) (Sigma A B) = + measure_pmf.prob M A * r" +proof - + have "measure_pmf.prob (pair_pmf M N) (Sigma A B) = + (\\<^sub>a(a, b) \ Sigma A B. pmf M a * pmf N b)" + by (auto intro!: infsetsum_cong simp add: measure_pmf_conv_infsetsum pmf_pair) + also have "... = (\\<^sub>aa\A. \\<^sub>ab\B a. pmf M a * pmf N b)" + apply (subst infsetsum_Sigma[OF assms(1-2)]) + subgoal by (metis (no_types, lifting) SigmaE abs_summable_on_cong case_prod_conv pmf_abs_summable pmf_pair) + by (auto simp add: assms case_prod_unfold) + + also have "... = (\\<^sub>aa\A. pmf M a * (measure_pmf.prob N (B a)))" + by (simp add: infsetsum_cmult_right measure_pmf_conv_infsetsum pmf_abs_summable) + also have "... = (\\<^sub>aa\A. pmf M a * r)" + using assms(3) by force + also have"... = measure_pmf.prob M A * r" + by (simp add: infsetsum_cmult_left pmf_abs_summable measure_pmf_conv_infsetsum) + finally show ?thesis + by linarith +qed + +(* TODO: duplicated in Schwartz_Zippel, but + we don't want to pull in the multivariate polynomials library *) +lemma measure_pmf_prob_dependent_product_bound_eq': + assumes "countable (A \ set_pmf M)" "\i. countable (B i \ set_pmf N)" + assumes "\a. a \ A \ set_pmf M \ measure_pmf.prob N (B a \ set_pmf N) = r" + shows "measure_pmf.prob (pair_pmf M N) (Sigma A B) = measure_pmf.prob M A * r" +proof - + have *: "Sigma A B \ (set_pmf M \ set_pmf N) = + Sigma (A \ set_pmf M) (\i. B i \ set_pmf N)" + by auto + + have "measure_pmf.prob (pair_pmf M N) (Sigma A B) = + measure_pmf.prob (pair_pmf M N) (Sigma (A \ set_pmf M) (\i. B i \ set_pmf N))" + by (metis * measure_Int_set_pmf set_pair_pmf) + moreover have "... = + measure_pmf.prob M (A \ set_pmf M) * r" + using measure_pmf_prob_dependent_product_bound_eq[OF assms(1-3)] + by auto + moreover have "... = measure_pmf.prob M A * r" + by (simp add: measure_Int_set_pmf) + ultimately show ?thesis by linarith +qed + +lemma single_var_parity_coin_flip: + assumes "x \ \" "finite \" + assumes "finite a" "x \ a" + shows "measure_pmf.prob (pmf_of_set (Pow {x})) + {y. even (card ((a \ y) \ \)) = b} = 1/2" +proof - + have "insert x a \ \ = insert x (a \ \)" + using assms by auto + then have *: "card (insert x a \ \) = 1 + card (a \ \)" + by (simp add: assms(2) assms(4)) + + have "measure_pmf.prob (pmf_of_set (Pow {x})) + {y. even (card ((a \ y) \ \)) = b} = + measure_pmf.prob (bernoulli_pmf (1/2)) + {odd (card (a \ \)) = b}" + unfolding pmf_of_set_Pow_sing map_pmf_def[symmetric] + by (auto intro!: measure_prob_cong_0 simp add:image_def * ) + moreover have "... = 1/2" + by (simp add: measure_pmf_single) + ultimately show ?thesis by auto +qed + +(* + Fix any event E that does not touch x + Then we can sample that event separately +*) +lemma prob_pmf_of_set_nonempty_parity: + assumes V: "finite V" + assumes "x \ \" "\ \ V" + assumes "\c. c \ E \ c - {x} \ E" + shows "prob_space.prob (pmf_of_set (Pow V)) + (E \ {c. even (card (c \ \)) = b}) = + 1 / 2 * prob_space.prob (pmf_of_set (Pow (V - {x}))) E" +proof - + have 1: "set_pmf (pmf_of_set (Pow {x})) = Pow {x}" + by (simp add: Pow_not_empty) + have 2: "set_pmf (pmf_of_set (Pow (V-{x}))) = Pow (V-{x})" + by (simp add: Pow_not_empty assms(1)) + have 3: "set_pmf (pmf_of_set (Pow {x} \ Pow (V - {x}))) = Pow {x} \ Pow (V - {x})" + by (simp add: Pow_not_empty assms(1)) + + have "{x} \ V" using assms by auto + from pmf_of_set_powerset_split[OF this assms(1)] + have e: "map_pmf (\(x, y). x \ y) + (pmf_of_set (Pow {x} \ Pow (V - {x}))) = + pmf_of_set (Pow V)" using 1 2 by auto + have "map_pmf (\(x, y). x \ y) + (pair_pmf (pmf_of_set (Pow {x})) + (pmf_of_set (Pow (V - {x})))) = + map_pmf (\(x, y). x \ y) + (pair_pmf (pmf_of_set (Pow (V - {x}))) + (pmf_of_set (Pow {x})))" + apply (subst pair_commute_pmf) + by (auto simp add: pmf.map_comp o_def case_prod_unfold Un_commute) + then have *: "pmf_of_set (Pow V) = + map_pmf (\(x, y). x \ y) + (pair_pmf (pmf_of_set (Pow (V - {x}))) (pmf_of_set (Pow {x})))" + unfolding e[symmetric] + apply (subst pmf_of_set_prod) + using V by auto + + have **: "((\(x, y). x \ y) -` (E \ S)) \ (Pow (V - {x}) \ Pow{x}) = + Sigma E (\x. {y. (x \ y) \ S}) \ (Pow (V - {x}) \ Pow{x})" for S + proof - + have 11: "\a b. a \ b \ E \ + a \ b \ S \ + a \ V - {x} \ + b \ {x} \ a \ E" + by (metis Diff_insert_absorb Un_insert_right assms(4) boolean_algebra_cancel.sup0 subset_Diff_insert subset_singleton_iff) + + have 21: " \a b. a \ E \ + a \ b \ S \ + a \ V - {x} \ + b \ {x} \ a \ b \ E" + by (metis Diff_cancel Un_Diff Un_empty_left assms(4) inf_sup_aci(5) subset_singletonD) + + have 1: " + \ab. ab \ ((\(x, y). x \ y) -` (E \ S)) \ (Pow (V - {x}) \ Pow{x}) \ + ab \ Sigma E (\x. {y. (x \ y) \ S}) \ (Pow (V - {x}) \ Pow{x})" + using 11 by clarsimp + + also have 2: " + \ab. ab \ Sigma E (\x. {y. (x \ y) \ S}) \ (Pow (V - {x}) \ Pow{x}) \ + ab \ ((\(x, y). x \ y) -` (E \ S)) \ (Pow (V - {x}) \ Pow{x})" + using 21 by clarsimp + ultimately show ?thesis + apply (intro antisym) + by (meson subsetI)+ + qed + + have eR: "\a. a \ E \ set_pmf (pmf_of_set (Pow (V - {x}))) \ + measure_pmf.prob (pmf_of_set (Pow {x})) + ({y. even (card ((a \ y) \ \)) = b} \ + set_pmf (pmf_of_set (Pow {x}))) = 1/2 " + apply (subst measure_Int_set_pmf) + apply (intro single_var_parity_coin_flip) + subgoal using assms by clarsimp + subgoal using assms rev_finite_subset by blast + subgoal by (metis 2 IntD2 PowD assms(1) finite_Diff rev_finite_subset) + using 2 by blast + + have " + prob_space.prob (pmf_of_set (Pow V)) + (E \ {c. even (card (c \ \)) = b}) = + prob_space.prob (map_pmf (\(x, y). x \ y) + (pair_pmf (pmf_of_set (Pow (V - {x}))) (pmf_of_set (Pow {x})))) + (E \ {c. even (card (c \ \)) = b})" unfolding * by auto + moreover have "... = + prob_space.prob (pair_pmf (pmf_of_set (Pow (V - {x}))) (pmf_of_set (Pow {x}))) + ((\(x, y). x \ y) -` (E \ {c. even (card (c \ \)) = b}))" + by auto + moreover have "... = + prob_space.prob (pair_pmf (pmf_of_set (Pow (V - {x}))) (pmf_of_set (Pow {x}))) + ((\(x, y). x \ y) -` (E \ {c. even (card (c \ \)) = b}) \ (Pow (V - {x}) \ Pow{x}))" + by (smt (verit) "1" "2" Int_iff Sigma_cong measure_pmf.measure_pmf_eq set_pair_pmf) + moreover have "... = + prob_space.prob (pair_pmf (pmf_of_set (Pow (V - {x}))) (pmf_of_set (Pow {x}))) + (Sigma E (\x. {y. even (card ((x \ y) \ \)) = b}) \ (Pow (V - {x}) \ Pow{x}))" + unfolding ** by auto + moreover have "... = + prob_space.prob (pair_pmf (pmf_of_set (Pow (V - {x}))) (pmf_of_set (Pow {x}))) + (Sigma E (\x. {y. even (card ((x \ y) \ \)) = b}))" + by (smt (verit, best) 1 2 Int_iff Sigma_cong measure_pmf.measure_pmf_eq set_pair_pmf) + moreover have "... = + measure_pmf.prob (pmf_of_set (Pow (V - {x}))) E * + (1 / 2)" + apply (subst measure_pmf_prob_dependent_product_bound_eq'[OF _ _ eR]) + by auto + ultimately show ?thesis by auto +qed + +lemma prob_random_xor_split: + assumes V: "finite V" + shows "prob_space.prob (random_xor V) E = + 1 / 2 * prob_space.prob (pmf_of_set (Pow V)) {e. (e,True) \ E} + + 1 / 2 * prob_space.prob (pmf_of_set (Pow V)) {e. (e,False) \ E}" +proof - + have fin: "finite (set_pmf (random_xor V))" + by (simp add: V set_pmf_random_xor) + + have fin2: "finite ((\(x, y). (y, x)) -` set_pmf (random_xor V))" + by(auto intro!: finite_vimageI[OF fin] simp add: inj_def) + + have rw: "{x. (x, b) \ E \ (x, b) \ set_pmf (random_xor V)} = + {x. (x,b) \ E} \ set_pmf (pmf_of_set (Pow V))" for b + by (auto simp add: V set_pmf_random_xor Pow_not_empty) + + have "prob_space.prob (random_xor V) E = + prob_space.prob (random_xor V) (E \ set_pmf (random_xor V))" + by (simp add: measure_Int_set_pmf) + + moreover have "... = + measure_pmf.prob + (pair_pmf (bernoulli_pmf (1 / 2)) + (pmf_of_set (Pow V))) + ((\(x, y). (y, x)) -` (E \ set_pmf (random_xor V)))" + unfolding random_xor_def + apply (subst pair_commute_pmf) + by simp + moreover have "... = + 1 / 2 * + measure_pmf.prob (pmf_of_set (Pow V)) {x. (x, True) \ E} + + 1 / 2 * + measure_pmf.prob (pmf_of_set (Pow V)) {x. (x, False) \ E}" + unfolding pair_pmf_def + apply (subst prob_bernoulli_bind_pmf) + using fin2 + unfolding map_pmf_def[symmetric] measure_map_pmf + by (auto simp add: vimage_def rw simp add: measure_Int_set_pmf) + ultimately show ?thesis by auto +qed + +lemma prob_random_xor_nonempty_parity: + assumes V: "finite V" + assumes \: "x \ \" "\ \ V" + assumes E: "\c. c \ E \ (fst c - {x},snd c) \ E" + shows "prob_space.prob (random_xor V) + (E \ {c. satisfies_xor c \ = b}) = + 1 / 2 * prob_space.prob (random_xor (V - {x})) E" +proof - + have *: "{e. (e, b') \ E \ {c. satisfies_xor c \ = b}} = + {e. (e, b') \ E} \ {c. even (card (c \ \)) = (b \ b')}" for b' + by (auto simp add: Int_commute) + + have "prob_space.prob (random_xor V) + (E \ {c. satisfies_xor c \ = b}) = + 1 / 2 * + measure_pmf.prob (pmf_of_set (Pow V)) + {e. (e, True) \ E \ {c. satisfies_xor c \ = b}} + + 1 / 2 * + measure_pmf.prob (pmf_of_set (Pow V)) + {e. (e, False) \ E \ {c. satisfies_xor c \ = b}}" + unfolding prob_random_xor_split[OF V] by auto + also have "... = + 1 / 2 * + measure_pmf.prob (pmf_of_set (Pow V)) + ({e. (e, True) \ E} \ {c. even (card (c \ \)) = (b \ True)}) + + 1 / 2 * + measure_pmf.prob (pmf_of_set (Pow V)) + ({e. (e, False) \ E} \ {c. even (card (c \ \)) = (b \ False)})" + unfolding * by auto + also have "... = + 1 / 2 * + (1 / 2 * + measure_pmf.prob (pmf_of_set (Pow (V - {x}))) + {e. (e, True) \ E} + + 1 / 2 * + measure_pmf.prob (pmf_of_set (Pow (V - {x}))) + {e. (e, False) \ E})" + apply (subst prob_pmf_of_set_nonempty_parity[OF V \]) + subgoal using E by clarsimp + apply (subst prob_pmf_of_set_nonempty_parity[OF V \]) + using E by auto + also have "... = + 1 / 2 * measure_pmf.prob (random_xor (V - {x})) E" + apply (subst prob_random_xor_split[symmetric]) + using V by auto + finally show ?thesis by auto +qed + +lemma pair_satisfies_random_xor_parity_1: + assumes V:"finite V" + assumes x: "x \ \" "x \ \'" + assumes \: "\ \ V" "\' \ V" + shows "prob_space.prob (random_xor V) + {c. satisfies_xor c \ = b \ satisfies_xor c \' = b'} = 1 / 4" +proof - + have wa: "\ \ (a - {x}) = \ \ a" for a + using x + by blast + have "prob_space.prob (random_xor V) + {c. satisfies_xor c \ = b \ satisfies_xor c \' = b'} = + prob_space.prob (random_xor V) + ({c. satisfies_xor c \ = b} \ {c. satisfies_xor c \' = b'})" + by (simp add: Collect_conj_eq) + also have "... = + 1 / 2 * + measure_pmf.prob (random_xor (V - {x})) {c. satisfies_xor c \ = b}" + apply (subst prob_random_xor_nonempty_parity[OF V x(2) \(2)]) + by (auto simp add: wa) + also have "... = 1/4" + apply (subst satisfies_random_xor_parity) + using V by auto + finally show ?thesis by auto +qed + +lemma pair_satisfies_random_xor_parity: + assumes V:"finite V" + assumes \: "\ \ \'" "\ \ V" "\' \ V" + shows "prob_space.prob (random_xor V) + {c. satisfies_xor c \ = b \ satisfies_xor c \' = b'} = 1 / 4" +proof - + obtain x where "x \ \ \ x \ \' \ x \ \' \ x \ \" + using \ + by blast + moreover { + assume x: "x \ \" "x \ \'" + have ?thesis using pair_satisfies_random_xor_parity_1[OF V x \(2-3)] + by blast + } + moreover { + assume x: "x \ \'" "x \ \" + then have ?thesis using pair_satisfies_random_xor_parity_1[OF V x \(3) \(2)] + by (simp add: Collect_conj_eq Int_commute) + } + ultimately show ?thesis by auto +qed + +lemma prob_pmf_of_set_nonempty_parity_UNIV: + assumes "finite V" + assumes "x \ \" "\ \ V" + shows "prob_space.prob (pmf_of_set (Pow V)) + {c. even (card (c \ \)) = b} = 1 / 2" + using prob_pmf_of_set_nonempty_parity[OF assms, of UNIV] + by auto + +lemma prob_Pow_split: + assumes "\ \ V" "finite V" + shows "prob_space.prob (pmf_of_set (Pow V)) + {x. P (\ \ x) \ Q ((V - \) \ x)} = + prob_space.prob (pmf_of_set (Pow \)) + {x. P x} * + prob_space.prob (pmf_of_set (Pow (V - \))) + {x. Q x}" +proof - + have 1: "set_pmf (pmf_of_set (Pow \)) = Pow \" + by (meson Pow_not_empty assms(1) assms(2) finite_Pow_iff finite_subset set_pmf_of_set) + have 2: "set_pmf + (pmf_of_set (Pow (V - \))) = Pow (V - \ )" + by (simp add: Pow_not_empty assms(2)) + + have *: "(pmf_of_set (Pow \ \ Pow (V - \))) = + (pair_pmf (pmf_of_set (Pow \)) (pmf_of_set (Pow (V - \))))" + unfolding 1 2 + apply (subst pmf_of_set_prod) + using assms rev_finite_subset by auto + have **: "(((\(x, y). x \ y) -` + {x. P (\ \ x) \ Q ((V - \) \ x)}) \ ((Pow \) \ (Pow (V - \)))) = + ({x. P x} \ Pow \) \ ({x. Q x} \ Pow (V - \))" + apply (rule antisym) + subgoal + apply clarsimp + by (smt (verit) Diff_disjoint Int_Un_eq(4) inf.orderE inf_commute inf_sup_distrib1 sup_bot.right_neutral sup_commute) + apply (intro subsetI) + apply clarsimp + by (smt (verit, ccfv_threshold) Diff_Int Diff_disjoint Diff_empty Diff_eq_empty_iff Un_Int_assoc_eq Un_commute sup_bot.left_neutral) + + have "prob_space.prob (pmf_of_set (Pow V)) + {x. P (\ \ x) \ Q ((V - \) \ x)} = + prob_space.prob (map_pmf (\(x,y). x \ y) + (pmf_of_set (Pow \ \ Pow (V - \)))) + {x. P (\ \ x) \ Q ((V - \) \ x)}" + apply (subst pmf_of_set_powerset_split[symmetric, OF assms(1-2)]) + by auto + moreover have "... = + measure_pmf.prob + (pair_pmf (pmf_of_set (Pow \)) (pmf_of_set (Pow (V - \)))) + ((\(x, y). x \ y) -` + {x. P (\ \ x) \ Q ((V - \) \ x)})" + unfolding measure_map_pmf + using * + by presburger + moreover have "... = + measure_pmf.prob + (pair_pmf (pmf_of_set (Pow \)) (pmf_of_set (Pow (V - \)))) + (((\(x, y). x \ y) -` + {x. P (\ \ x) \ Q ((V - \) \ x)}) \ ((Pow \) \ (Pow (V - \))))" + using 1 2 + by (smt (verit) Int_Collect Int_def Sigma_cong inf_idem measure_pmf.measure_pmf_eq set_pair_pmf) + moreover have "... = + measure_pmf.prob + (pair_pmf (pmf_of_set (Pow \)) (pmf_of_set (Pow (V - \)))) + (({x. P x} \ Pow \) \ ({x. Q x} \ Pow (V - \)))" + unfolding ** + by auto + moreover have "... = + measure_pmf.prob + (pmf_of_set (Pow \)) ({x. P x} \ Pow \) * + measure_pmf.prob + (pmf_of_set (Pow (V - \))) ({x. Q x} \ Pow (V - \))" + apply (intro measure_pmf_prob_product) + subgoal by (meson assms(1) assms(2) countable_finite finite_Int finite_Pow_iff rev_finite_subset) + by (simp add: assms(2) countable_finite) + moreover have "... = + measure_pmf.prob + (pmf_of_set (Pow \)) {x. P x} * + measure_pmf.prob + (pmf_of_set (Pow (V - \))) {x. Q x}" + by (metis "1" "2" measure_Int_set_pmf) + ultimately show ?thesis by auto +qed + +(* Split probability for two disjoint non-empty sets *) +lemma disjoint_prob_pmf_of_set_nonempty: + assumes \: "x \ \" "\ \ V" + assumes \': "x' \ \'" "\' \ V" + assumes "\ \ \' = {}" + assumes V: "finite V" + shows "prob_space.prob (pmf_of_set (Pow V)) + {c. even (card (\ \ c)) = b \ even (card (\' \ c)) = b'} = 1 / 4" +proof - + have "prob_space.prob (pmf_of_set (Pow V)) + {c. even (card (\ \ c)) = b \ even (card (\' \ c)) = b'} = + prob_space.prob (pmf_of_set (Pow V)) + {c. even (card (\ \ c)) = b \ even (card (((V - \) \ c) \ \')) = b'}" + by (smt (verit) Collect_cong Diff_Diff_Int Diff_eq_empty_iff Int_Diff Int_commute \'(2) assms(5) inf.orderE) + + moreover have "... = + measure_pmf.prob (pmf_of_set (Pow \)) + {x. even (card x) = b} * + measure_pmf.prob (pmf_of_set (Pow (V - \))) + {x. even (card (x \ \')) = b'}" + apply (subst prob_Pow_split) + using assms by auto + moreover have "... = + measure_pmf.prob (pmf_of_set (Pow \)) + {x. even (card (x \ \)) = b} * + measure_pmf.prob (pmf_of_set (Pow (V - \))) + {x. even (card (x \ \')) = b'} " + by (smt (verit, best) PowD Pow_not_empty \(2) assms(6) finite_Pow_iff inf.orderE measure_pmf.measure_pmf_eq mem_Collect_eq rev_finite_subset set_pmf_of_set) + + moreover have "... = 1/4" + apply (subst prob_pmf_of_set_nonempty_parity_UNIV[OF _ \(1)]) + subgoal using assms rev_finite_subset by blast + subgoal by simp + apply (subst prob_pmf_of_set_nonempty_parity_UNIV) + using assms by auto + ultimately show ?thesis by auto +qed + +lemma measure_pmf_prob_product_finite_set_pmf: + assumes "finite (set_pmf M)" "finite (set_pmf N)" + shows "measure_pmf.prob (pair_pmf M N) (A \ B) = + measure_pmf.prob M A * measure_pmf.prob N B" +proof - + have A: "measure_pmf.prob M A = measure_pmf.prob M (A \ set_pmf M)" + by (simp add: measure_Int_set_pmf) + have B: "measure_pmf.prob N B = measure_pmf.prob N (B \ set_pmf N)" + by (simp add: measure_Int_set_pmf) + have "measure_pmf.prob M A * measure_pmf.prob N B = + measure_pmf.prob M (A \ set_pmf M) * measure_pmf.prob N (B \ set_pmf N)" + using A B by auto + moreover have "... = measure_pmf.prob (pair_pmf M N) + ((A \ set_pmf M) \ (B \ set_pmf N))" + apply (subst measure_pmf_prob_product[symmetric]) + by auto + moreover have "... = measure_pmf.prob (pair_pmf M N) + ((A \ B) \ set_pmf (pair_pmf M N))" + by (simp add: Times_Int_Times) + moreover have "... = measure_pmf.prob (pair_pmf M N) + ((A \ B) )" + using measure_Int_set_pmf by blast + ultimately show ?thesis by auto +qed + +lemma prob_random_xor_split_space: + assumes "\ \ V" "finite V" + shows "prob_space.prob (random_xor V) + {(x,b). P (\ \ x) b \ Q ((V - \) \ x)} = + prob_space.prob (random_xor \) + {(x,b). P x b} * + prob_space.prob (pmf_of_set (Pow (V - \))) + {x. Q x}" +proof - + have d1: "set_pmf (random_xor \) = Pow \ \ UNIV" + by (metis assms(1) assms(2) infinite_super set_pmf_random_xor) + have d2: "set_pmf (pmf_of_set (Pow (V - \))) = Pow (V- \)" + by (simp add: Pow_not_empty assms(2)) + have rhs: "prob_space.prob (random_xor \) + {(x,b). P x b} * + prob_space.prob (pmf_of_set (Pow (V - \))) + {x. Q x} = + prob_space.prob (pair_pmf (random_xor \) (pmf_of_set (Pow (V - \)))) + ({(x,b). P x b} \ {x. Q x})" + apply (subst measure_pmf_prob_product_finite_set_pmf) + subgoal by (metis Pow_def assms(1) assms(2) finite_Collect_subsets finite_SigmaI finite_code rev_finite_subset set_pmf_random_xor) + using assms by (auto simp add: Pow_not_empty) + + from pmf_of_set_powerset_split[OF assms] + have *: "pmf_of_set (Pow V) = + map_pmf (\(x, y). x \ y) + (pair_pmf (pmf_of_set (Pow \)) (pmf_of_set (Pow (V - \))))" + by (metis Pow_not_empty assms(1) assms(2) finite_Diff finite_Pow_iff pmf_of_set_prod rev_finite_subset) + + have **: "random_xor V = + map_pmf (\((x,b),y). (x \ y,b)) (pair_pmf (random_xor \) (pmf_of_set (Pow (V - \))))" + unfolding random_xor_def * + including monad_normalisation + by (auto simp add: pair_pmf_def map_pmf_def case_prod_unfold) + + have "prob_space.prob (random_xor V) {(x,b). P (\ \ x) b \ Q ((V - \) \ x)} = + measure_pmf.prob + (pair_pmf (random_xor \) (pmf_of_set (Pow (V - \)))) + {y. P (\ \ (fst (fst y) \ snd y)) (snd (fst y)) \ + Q ((V - \) \ (fst (fst y) \ snd y))}" + unfolding ** + by (auto simp add:case_prod_unfold) + + moreover have "... = + prob_space.prob (pair_pmf (random_xor \) (pmf_of_set (Pow (V - \)))) + ({(x,b). P x b} \ {x. Q x})" + apply (intro measure_pmf.measure_pmf_eq[where p ="pair_pmf (random_xor \) + (pmf_of_set (Pow (V - \)))"]) + subgoal by simp + apply (clarsimp simp add: d1 d2) + by (smt (verit, del_insts) Diff_disjoint Int_Diff boolean_algebra_cancel.sup0 inf.orderE inf_commute inf_sup_distrib1 sup_bot.left_neutral) + ultimately show ?thesis using rhs + by simp +qed + +lemma three_disjoint_prob_random_xor_nonempty: + assumes \: "\ \ {}" "\ \ V" + assumes \': "\' \ {}" "\' \ V" + assumes I: "I \ V" + assumes int: "I \ \ = {}" "I \ \' = {}" "\ \ \' = {}" + assumes V: "finite V" + shows "prob_space.prob (random_xor V) + {c. satisfies_xor c I = b \ + even (card (\ \ fst c)) = b' \ + even (card (\' \ fst c)) = b''} = 1 / 8" +proof - + have finI: "finite I" + using V I + using rev_finite_subset by blast + have finVI: "finite (V - I)" + using V I + using rev_finite_subset by blast + obtain x x' where x: "x \ \" "x' \ \'" using \ \' + by blast + + have rw1:"\ \ ((V - I) \ xx) = \ \ xx " for xx + by (metis Diff_Int_distrib2 Diff_empty \(2) assms(6) inf.absorb_iff2 inf_assoc inf_left_commute) + + have rw2:"\' \ ((V - I) \ xx)= \' \ xx" for xx + by (metis Diff_Int_distrib2 Diff_empty \'(2) assms(7) inf.absorb_iff2 inf_assoc inf_left_commute) + + have "prob_space.prob (random_xor V) + {c. satisfies_xor c I = b \ + even (card ( \ \ fst c )) = b' \ + even (card (\' \ fst c )) = b''} = + prob_space.prob (random_xor V) + {(x,bb). satisfies_xor (I \ x, bb) I = b \ + even (card (\ \ ((V - I) \ x))) = b' \ + even (card ( \' \ ((V - I) \ x))) = b''}" + apply (intro arg_cong[where f = "prob_space.prob (random_xor V)"]) + unfolding rw1 rw2 satisfies_xor_inter + by (smt (verit) Collect_cong prod.collapse split_conv) + + moreover have "... = + measure_pmf.prob (random_xor I) + {c. satisfies_xor c I = b} * + measure_pmf.prob (pmf_of_set (Pow (V - I))) + {x. even (card (\ \ x)) = b' \ + even (card (\' \ x)) = b''}" + apply (subst prob_random_xor_split_space[OF I V]) + by (metis (no_types, lifting) Collect_cong case_prodE case_prodI2) + moreover have "... = 1 / 8" + apply (subst satisfies_random_xor_parity[OF finI]) + apply (subst disjoint_prob_pmf_of_set_nonempty) + using x \ \' int finVI by auto + ultimately show ?thesis by auto +qed + +(* Split probability for three disjoint non-empty sets *) +lemma three_disjoint_prob_pmf_of_set_nonempty: + assumes \: "x \ \" "\ \ V" + assumes \': "x' \ \'" "\' \ V" + assumes \'': "x'' \ \''" "\'' \ V" + assumes int: "\ \ \' = {}" "\' \ \'' = {}" "\'' \ \ = {}" + assumes V: "finite V" + shows "prob_space.prob (pmf_of_set (Pow V)) + {c. even (card (\ \ c)) = b \ even (card (\' \ c)) = b' \ even (card (\'' \ c)) = b''} = 1 / 8" +proof - + have "prob_space.prob (pmf_of_set (Pow V)) + {c. even (card (\ \ c)) = b \ even (card (\' \ c)) = b' \ even (card (\'' \ c)) = b''} = + prob_space.prob (pmf_of_set (Pow V)) + {c. even (card (\ \ c)) = b \ + even (card (((V - \) \ c) \ \')) = b' \ + even (card (((V - \) \ c) \ \'')) = b''}" + by (smt (verit,best) Collect_cong Diff_Diff_Int Diff_eq_empty_iff Int_Diff Int_commute \' \'' int inf.orderE) + + moreover have "... = + measure_pmf.prob (pmf_of_set (Pow \)) + {x. even (card x) = b} * + measure_pmf.prob (pmf_of_set (Pow (V - \))) + {x. even (card (\' \ x)) = b' \ even (card (\'' \ x)) = b''}" + apply (subst prob_Pow_split) + using assms by (auto simp add: inf.commute) + moreover have "... = + measure_pmf.prob (pmf_of_set (Pow \)) + {x. even (card (x \ \)) = b} * + measure_pmf.prob (pmf_of_set (Pow (V - \))) + {x. even (card (\' \ x)) = b'\ even (card (\'' \ x)) = b''} " + by (smt (verit, best) PowD Pow_not_empty \ V finite_Pow_iff inf.orderE measure_pmf.measure_pmf_eq mem_Collect_eq rev_finite_subset set_pmf_of_set) + + moreover have "... = 1/8" + apply (subst prob_pmf_of_set_nonempty_parity_UNIV[OF _ \(1)]) + subgoal using \(2) V rev_finite_subset by blast + subgoal by simp + apply (subst disjoint_prob_pmf_of_set_nonempty) + using assms by auto + ultimately show ?thesis by auto +qed + +lemma four_disjoint_prob_random_xor_nonempty: + assumes \: "\ \ {}" "\ \ V" + assumes \': "\' \ {}" "\' \ V" + assumes \'': "\'' \ {}" "\'' \ V" + assumes I: "I \ V" + assumes int: "I \ \ = {}" "I \ \' = {}" "I \ \'' = {}" + "\ \ \' = {}" "\' \ \'' = {}" "\'' \ \ = {}" + assumes V: "finite V" + shows "prob_space.prob (random_xor V) + {c. satisfies_xor c I = b0 \ + even (card (\ \ fst c)) = b \ + even (card (\' \ fst c)) = b' \ + even (card (\'' \ fst c)) = b''} = 1 / 16" +proof - + have finI: "finite I" + using V I + using rev_finite_subset by blast + have finVI: "finite (V - I)" + using V I + using rev_finite_subset by blast + obtain x x' x'' where x: "x \ \" "x' \ \'" "x'' \ \''" + using \ \' \'' + by blast + + have rw1:"\ \ ((V - I) \ xx) = \ \ xx " for xx + by (metis Diff_Int_distrib2 Diff_empty \(2) int(1) inf.absorb_iff2 inf_assoc inf_left_commute) + + have rw2:"\' \ ((V - I) \ xx)= \' \ xx" for xx + by (metis Diff_Int_distrib2 Diff_empty \'(2) int(2) inf.absorb_iff2 inf_assoc inf_left_commute) + + have rw3:"\'' \ ((V - I) \ xx)= \'' \ xx" for xx + by (metis Diff_Int_distrib2 Diff_empty \''(2) int(3) inf.absorb_iff2 inf_assoc inf_left_commute) + + have "prob_space.prob (random_xor V) + {c. satisfies_xor c I = b0 \ + even (card (\ \ fst c)) = b \ + even (card (\' \ fst c)) = b' \ + even (card (\'' \ fst c)) = b''} = + prob_space.prob (random_xor V) + {(x,bb). satisfies_xor (I \ x, bb) I = b0 \ + even (card (\ \ ((V - I) \ x))) = b \ + even (card (\' \ ((V - I) \ x))) = b' \ + even (card (\'' \ ((V - I) \ x))) = b''}" + apply (intro arg_cong[where f = "prob_space.prob (random_xor V)"]) + unfolding rw1 rw2 rw3 satisfies_xor_inter + by (smt (verit) Collect_cong prod.collapse split_conv) + + moreover have "... = + measure_pmf.prob (random_xor I) + {c. satisfies_xor c I = b0} * + measure_pmf.prob (pmf_of_set (Pow (V - I))) + {x. even (card (\ \ x)) = b \ + even (card (\' \ x)) = b' \ + even (card (\'' \ x)) = b''}" + apply (subst prob_random_xor_split_space[OF I V]) + by (metis (no_types, lifting) Collect_cong case_prodE case_prodI2) + moreover have "... = 1 / 16" + apply(subst satisfies_random_xor_parity[OF finI]) + apply (subst three_disjoint_prob_pmf_of_set_nonempty) + using x \ \' \'' int finVI by auto + ultimately show ?thesis by auto +qed + +lemma three_satisfies_random_xor_parity_1: + assumes V:"finite V" + assumes \: "\ \ V" "\' \ V" "\'' \ V" + assumes x: "x \ \" "x \ \'" "x \ \''" + assumes d: "\ \ \'" + shows "prob_space.prob (random_xor V) + {c. + satisfies_xor c \ = b \ + satisfies_xor c \' = b' \ + satisfies_xor c \'' = b''} = 1 / 8" +proof - + have wa: "\ \ (a - {x}) = \ \ a" for a + using x + by blast + have wa': "\' \ (a - {x}) = \' \ a" for a + using x + by blast + have "prob_space.prob (random_xor V) + {c. + satisfies_xor c \ = b \ satisfies_xor c \' = b' \ + satisfies_xor c \'' = b''} = + prob_space.prob (random_xor V) + ({c. satisfies_xor c \ = b \ satisfies_xor c \' = b'} \ + {c. satisfies_xor c \'' = b''})" + by (simp add: Collect_conj_eq inf_assoc) + moreover have "... = + 1 / 2 * + measure_pmf.prob (random_xor (V - {x})) + {c. satisfies_xor c \ = b \ satisfies_xor c \' = b'}" + apply (subst prob_random_xor_nonempty_parity[OF V x(3) \(3)]) + by (auto simp add: wa wa') + moreover have "... = 1/8" + apply (subst pair_satisfies_random_xor_parity) + using V \ x d by auto + ultimately show ?thesis by auto +qed + +lemma split_boolean_eq: + shows"(A \ B) = (b \ I) \ + (B \ C) = (b' \ I) \ + (C \ A) = (b'' \ I) + \ + I = odd(of_bool b + of_bool b' + of_bool b'') \ + (A = True \ + B = (b'=b'') \ + C = (b = b') \ + A = False \ + B = (b' \ b'') \ + C = (b \ b'))" + by auto + +lemma three_satisfies_random_xor_parity: + assumes V:"finite V" + assumes \: + "\ \ \'" "\ \ \''" "\' \ \''" + "\ \ V" "\' \ V" "\'' \ V" + shows "prob_space.prob (random_xor V) + {c. satisfies_xor c \ = b \ + satisfies_xor c \' = b' \ + satisfies_xor c \'' = b''} = 1 / 8" +proof - + have "(\x. + x \ \ \ x \ \' \ x \ \'' \ + x \ \' \ x \ \ \ x \ \'' \ + x \ \'' \ x \ \ \ x \ \') \ + \ - (\' \ \'') = {} \ + \' - (\ \ \'') = {} \ + \'' - (\ \ \') = {}" + by blast + moreover { + assume "(\x. + x \ \ \ x \ \' \ x \ \'' \ + x \ \' \ x \ \ \ x \ \'' \ + x \ \'' \ x \ \ \ x \ \')" + then obtain x where " + x \ \ \ x \ \' \ x \ \'' \ + x \ \' \ x \ \ \ x \ \'' \ + x \ \'' \ x \ \ \ x \ \'" by auto + moreover { + assume x: "x \ \'" "x \ \''" "x \ \" + have "measure_pmf.prob (random_xor V) + {c. satisfies_xor c \' = b' \ + satisfies_xor c \'' = b'' \ + satisfies_xor c \ = b} = 1 / 8" + apply (intro three_satisfies_random_xor_parity_1[OF V _ _ _ x]) + using \ by auto + then have ?thesis + by (smt (verit, ccfv_SIG) Collect_cong) + } + moreover { + assume x: "x \ \" "x \ \''" "x \ \'" + have "measure_pmf.prob (random_xor V) + {c. satisfies_xor c \ = b \ + satisfies_xor c \'' = b'' \ + satisfies_xor c \' = b'} = 1 / 8" + apply (intro three_satisfies_random_xor_parity_1[OF V _ _ _ x]) + using \ by auto + then have ?thesis + by (smt (verit, ccfv_SIG) Collect_cong) + } + moreover { + assume x: "x \ \" "x \ \'" "x \ \''" + have "measure_pmf.prob (random_xor V) + {c. satisfies_xor c \ = b \ + satisfies_xor c \' = b' \ + satisfies_xor c \'' = b''} = 1 / 8" + apply (intro three_satisfies_random_xor_parity_1[OF V _ _ _ x]) + using \ by auto + then have ?thesis + by (smt (verit, ccfv_SIG) Collect_cong) + } + ultimately have ?thesis by auto + } + moreover { + assume dis: "\ - (\' \ \'') = {} \ + \' - (\ \ \'') = {} \ + \'' - (\ \ \') = {}" + + define A where "A = (\ \ \'') - \'" + define B where "B = (\ \ \') - \''" + define C where "C = (\' \ \'') - \" + define I where "I = \ \ \' \ \''" + + have f: "finite A" "finite B" "finite C" "finite I" + unfolding A_def B_def C_def I_def + by (meson V \ finite_Diff finite_Int rev_finite_subset)+ + + have s: "A \ V" "B \ V" "C \ V" "I \ V" + unfolding A_def B_def C_def I_def + using \ by auto + + have i: "I \ A = {}" "I \ B = {}" "I \ C = {}" + "B \ C = {}" "C \ A = {}" "A \ B = {}" + unfolding A_def B_def C_def I_def + by blast + + + have s1: "\ = A \ B \ I" + unfolding A_def B_def I_def + using dis by auto + have sx1: "satisfies_xor (xx,bb) \ = b \ + even (card (A \ xx)) = even (card (B \ xx)) = (b \ satisfies_xor(xx,bb) I)" for xx bb + unfolding s1 satisfies_xor.simps Int_Un_distrib2 + apply (subst card_Un_disjoint) + subgoal using f by auto + subgoal using f by auto + subgoal using A_def B_def I_def by blast + apply (subst card_Un_disjoint) + subgoal using f by auto + subgoal using f by auto + subgoal using A_def B_def I_def by blast + by auto + + have s2: "\' = B \ C \ I" + unfolding B_def C_def I_def + using dis by auto + have sx2: "satisfies_xor (xx,bb) \' = b' \ + even (card (B \ xx)) = even (card (C \ xx)) = (b' \ satisfies_xor(xx,bb) I)" for xx bb + unfolding s2 satisfies_xor.simps Int_Un_distrib2 + apply (subst card_Un_disjoint) + subgoal using f by auto + subgoal using f by auto + subgoal using B_def C_def I_def by blast + apply (subst card_Un_disjoint) + subgoal using f by auto + subgoal using f by auto + subgoal using B_def C_def I_def by blast + by auto + + have s3: "\'' = A \ C \ I" + unfolding A_def C_def I_def + using dis by auto + have sx3: "satisfies_xor (xx,bb) \'' = b'' \ + even (card (C \ xx)) = even (card (A \ xx)) = (b'' \ satisfies_xor(xx,bb) I)" for xx bb + unfolding s3 satisfies_xor.simps Int_Un_distrib2 + apply (subst card_Un_disjoint) + subgoal using f by auto + subgoal using f by auto + subgoal using A_def B_def C_def I_def by blast + apply (subst card_Un_disjoint) + subgoal using f by auto + subgoal using f by auto + subgoal using A_def B_def C_def I_def by blast + by auto + + have "A = {} \ B \ {} \ C \ {} \ + A \ {} \ B = {} \ C \ {} \ + A \ {} \ B \ {} \ C = {} \ + A \ {} \ B \ {} \ C \ {}" + by (metis Un_commute \(1) \(2) \(3) s1 s2 s3) + + moreover { + assume as: "A = {}" "B \ {}" "C \ {}" + have "satisfies_xor (xx,bb) \ = b + \ satisfies_xor (xx,bb) \' = b' + \ satisfies_xor (xx,bb) \'' = b'' \ + (satisfies_xor (xx, bb) I = + odd (of_bool b + of_bool b' + of_bool b'') \ + (even (card (B \ xx)) = (b' = b'') \ + even (card (C \ xx)) = (b = b')))" for xx bb + unfolding sx1 sx2 sx3 + apply(subst split_boolean_eq) + using as by simp + then have *: "{c. satisfies_xor c \ = b + \ satisfies_xor c \' = b' + \ satisfies_xor c \'' = b''} = + {c. satisfies_xor c I = + odd (of_bool b + of_bool b' + of_bool b'') \ + even (card (B \ fst c)) = (b' = b'') \ + even (card (C \ fst c)) = (b = b')}" + by (smt (verit,best) Collect_cong prod.collapse) + have ?thesis + apply (subst *) + apply (intro three_disjoint_prob_random_xor_nonempty) + using as s i V by auto + } + + moreover { + assume as: "A \ {}" "B \ {}" "C = {}" + have "satisfies_xor (xx,bb) \'' = b'' + \ satisfies_xor (xx,bb) \ = b + \ satisfies_xor (xx,bb) \' = b' \ + (satisfies_xor (xx, bb) I = + odd (of_bool b'' + of_bool b + of_bool b') \ + (even (card (A \ xx)) = (b = b') \ + even (card (B \ xx)) = (b'' = b)))" for xx bb + unfolding sx1 sx2 sx3 + apply(subst split_boolean_eq) + using as by simp + then have *: "{c. satisfies_xor c \ = b + \ satisfies_xor c \' = b' + \ satisfies_xor c \'' = b''} = + {c. satisfies_xor c I = + odd (of_bool b'' + of_bool b + of_bool b') \ + (even (card (A \ fst c)) = (b = b') \ + even (card (B \ fst c)) = (b'' = b))}" + by (smt (verit,best) Collect_cong prod.collapse) + have ?thesis + apply (subst *) + apply (intro three_disjoint_prob_random_xor_nonempty) + using as s i V by auto + } + + moreover { + assume as: "A \ {}" "B = {}" "C \ {}" + have "satisfies_xor (xx,bb) \' = b' + \ satisfies_xor (xx,bb) \'' = b'' + \ satisfies_xor (xx,bb) \ = b \ + (satisfies_xor (xx, bb) I = + odd (of_bool b' + of_bool b'' + of_bool b) \ + (even (card (C \ xx)) = (b'' = b) \ + even (card (A \ xx)) = (b' = b'')))" for xx bb + unfolding sx1 sx2 sx3 + apply(subst split_boolean_eq) + using as by simp + then have *: "{c. satisfies_xor c \ = b + \ satisfies_xor c \' = b' + \ satisfies_xor c \'' = b''} = + {c. satisfies_xor c I = + odd (of_bool b' + of_bool b'' + of_bool b) \ + (even (card (C \ fst c)) = (b'' = b) \ + even (card (A \ fst c)) = (b' = b''))}" + by (smt (verit,best) Collect_cong prod.collapse) + have ?thesis + apply (subst *) + apply (intro three_disjoint_prob_random_xor_nonempty) + using as s i V by auto + } + + moreover { + assume as: "A \ {}" "B \ {}" "C \ {}" + have 1: "satisfies_xor (xx,bb) \ = b + \ satisfies_xor (xx,bb) \' = b' + \ satisfies_xor (xx,bb) \'' = b'' \ + (satisfies_xor (xx, bb) I = + odd (of_bool b + of_bool b' + of_bool b'') \ + even (card (A \ xx)) = True \ + even (card (B \ xx)) = (b' = b'') \ + even (card (C \ xx)) = (b = b') \ + satisfies_xor (xx, bb) I = + odd (of_bool b + of_bool b' + of_bool b'') \ + even (card (A \ xx)) = False \ + even (card (B \ xx)) = (b' \ b'') \ + even (card (C \ xx)) = (b \ b'))" for xx bb + unfolding sx1 sx2 sx3 + apply(subst split_boolean_eq) + by auto + have 2: "satisfies_xor c \ = b + \ satisfies_xor c \' = b' + \ satisfies_xor c \'' = b'' \ + (satisfies_xor c I = + odd (of_bool b + of_bool b' + of_bool b'') \ + even (card (A \ fst c)) = True \ + even (card (B \ fst c)) = (b' = b'') \ + even (card (C \ fst c)) = (b = b') \ + satisfies_xor c I = + odd (of_bool b + of_bool b' + of_bool b'') \ + even (card (A \ fst c)) = False \ + even (card (B \ fst c)) = (b' \ b'') \ + even (card (C \ fst c)) = (b \ b'))" for c + proof - + obtain xx bb where c:"c = (xx,bb)" by fastforce + show ?thesis unfolding c + apply (subst 1) + by auto + qed + have *: "{c. satisfies_xor c \ = b + \ satisfies_xor c \' = b' + \ satisfies_xor c \'' = b''} = + {c. satisfies_xor c I = + odd (of_bool b + of_bool b' + of_bool b'') \ + even (card (A \ fst c)) = True \ + even (card (B \ fst c)) = (b' = b'') \ + even (card (C \ fst c)) = (b = b')} \ + {c. satisfies_xor c I = + odd (of_bool b + of_bool b' + of_bool b'') \ + even (card (A \ fst c)) = False \ + even (card (B \ fst c)) = (b' \ b'') \ + even (card (C \ fst c)) = (b \ b')}" + apply (subst Un_def) + apply (intro Collect_cong) + apply (subst 2) + by simp + + have **: "1 / 16 + + measure_pmf.prob (random_xor V) + {c. satisfies_xor c I = + odd (of_bool b + of_bool b' + + of_bool b'') \ + even (card (A \ fst c)) = + False \ + even (card (B \ fst c)) = + (b' \ b'') \ + even (card (C \ fst c)) = + (b \ b')} = + 1 / 8" + apply (subst four_disjoint_prob_random_xor_nonempty) + using as s i V by auto + have ?thesis + apply (subst *) + apply (subst measure_pmf.finite_measure_Union) + subgoal by simp + subgoal by simp + subgoal by auto + apply (subst four_disjoint_prob_random_xor_nonempty) + using as s i V ** by auto + } + + ultimately have ?thesis by auto + } + ultimately show ?thesis by auto +qed + +subsection "Independence for repeated XORs" + +text \ We can lift the previous result to a list of independent sampled XORs. \ + +definition random_xors :: "'a set \ nat \ + (nat \ 'a set \ bool) pmf" + where "random_xors V n = + Pi_pmf {..<(n::nat)} None + (\_. map_pmf Some (random_xor V))" + +(* The set of random XORs expressed in various ways*) +lemma random_xors_set: + assumes V:"finite V" + shows + "PiE_dflt {.. (\_. map_pmf Some (random_xor V))) = + {xors. dom xors = {.. + ran xors \ (Pow V) \ UNIV}" (is "?lhs = ?rhs") +proof - + have "?lhs = + {f. dom f = {.. + (\x \ {.. Some ` (Pow V \ UNIV))}" + unfolding PiE_dflt_def o_def set_map_pmf set_pmf_random_xor[OF V] + by force + + also have "... = ?rhs" + apply (rule antisym) + subgoal + apply clarsimp + by (smt (z3) PowD domI image_iff mem_Collect_eq mem_Sigma_iff option.simps(1) ran_def subsetD) + apply clarsimp + by (smt (verit, ccfv_threshold) domD image_iff lessThan_iff ranI subsetD) + finally show ?thesis . +qed + +lemma random_xors_eq: + assumes V:"finite V" + shows"random_xors V n = + pmf_of_set + {xors. dom xors = {.. ran xors \ (Pow V) \ UNIV}" +proof - + have "pmf_of_set + {xors. dom xors = {.. + ran xors \ (Pow V) \ UNIV} = + pmf_of_set + (PiE_dflt {.. (\_. map_pmf Some (random_xor V))))" + unfolding random_xors_set[OF V] by auto + also have "... = + Pi_pmf {..x. pmf_of_set + ((set_pmf \ + (\_. map_pmf Some (random_xor V))) x))" + apply (subst Pi_pmf_of_set[symmetric]) + by (auto simp add:set_pmf_random_xor[OF V] V) + also have "... = random_xors V n" + unfolding random_xors_def o_def set_map_pmf + apply (subst map_pmf_of_set_inj[symmetric]) + subgoal by (auto simp add:set_pmf_random_xor[OF V] V) + subgoal by (auto simp add:set_pmf_random_xor[OF V] V) + subgoal by (auto simp add:set_pmf_random_xor[OF V] V) + by (metis V random_xor_pmf_of_set set_pmf_random_xor) + ultimately show ?thesis by auto +qed + +(* The XOR hash function from a mapping nat \ XOR *) +definition xor_hash :: + "('a \ bool) \ + (nat \ ('a set \ bool)) \ + (nat \ bool)" + where "xor_hash \ xors = + (map_option + (\xor. satisfies_xor xor {x. \ x = Some True}) \ xors)" + +lemma finite_map_set_nonempty: + assumes "R \ {}" + shows " + {xors. + dom xors = D \ ran xors \ R} \ {}" +proof - + obtain r where "r \ R" + using assms by blast + then have "(\x. if x \ D then Some r else None) \ + {xors. dom xors = D \ ran xors \ R}" + by (auto split:if_splits simp:ran_def) + thus ?thesis by auto +qed + +lemma random_xors_set_pmf: + assumes V: "finite V" + shows " + set_pmf (random_xors V n) = + {xors. dom xors = {.. + ran xors \ (Pow V) \ UNIV}" + unfolding random_xors_eq[OF V] + apply (intro set_pmf_of_set) + subgoal + apply (intro finite_map_set_nonempty) + by blast + apply (intro finite_set_of_finite_maps) + by (auto simp add: V) + +lemma finite_random_xors_set_pmf: + assumes V: "finite V" + shows " + finite (set_pmf (random_xors V n))" + unfolding random_xors_set_pmf[OF V] + by (auto intro!: finite_set_of_finite_maps simp add: V) + +lemma map_eq_1: + assumes "dom f = dom g" + assumes "\x. x \ dom f \ the (f x) = the (g x)" + shows "f = g" + by (metis assms(1) assms(2) domIff map_le_antisym map_le_def option.expand) + +lemma xor_hash_eq_iff: + assumes "dom \ = {.. x = \ \ + (dom x = {.. + (\i. i < n \ + (\xor. x i = Some xor \ + satisfies_xor xor {x. \ x = Some True} = the (\ i)) + ))" +proof - + have 1: "xor_hash \ x = \ \ + (dom (xor_hash \ x) = dom \) \ + (\i \ dom \. the (xor_hash \ x i) = the (\ i))" + using map_eq_1 by fastforce + have 2: "dom (xor_hash \ x) = dom x" + unfolding xor_hash_def + by auto + have 3: "\i. i \ dom x \ + xor_hash \ x i = Some (satisfies_xor (the (x i)) {x. \ x = Some True})" + unfolding xor_hash_def + by fastforce + show ?thesis + unfolding 1 assms 2 + using 3 + by (smt (verit, best) domD lessThan_iff option.sel) +qed + +lemma xor_hash_eq_PiE_dflt: + assumes "dom \ = {.. xors = \} = + PiE_dflt {..i. Some ` + {xor. satisfies_xor xor {x. \ x = Some True} = the (\ i)})" +proof - + have *: "\x xa a b. + (\ xa < n \ x xa = None) \ + x xa = Some (a, b) \ xa < n" + by (metis option.distinct(2)) + show ?thesis + unfolding PiE_dflt_def + unfolding xor_hash_eq_iff[OF assms] + by (auto intro: * simp del: satisfies_xor.simps) +qed + +lemma prob_random_xors_xor_hash: + assumes V: "finite V" + assumes \: "dom \ = {.. xors = \} = 1 / 2 ^ n" +proof - + have "measure_pmf.prob (random_xors V n) + {xors. xor_hash \ xors = \} = + measure_pmf.prob + (Pi_pmf {..<(n::nat)} None + (\_. map_pmf Some (random_xor V))) + (PiE_dflt {..i. Some ` {xor. satisfies_xor xor {x. \ x = Some True} = the (\ i)}))" + unfolding random_xors_def xor_hash_eq_PiE_dflt[OF \] + by auto + also have "... = + (\x x = Some True} = + the (\ x)}))" + by (subst measure_Pi_pmf_PiE_dflt) + (auto simp add: inj_vimage_image_eq) + also have "... = (\x PiE_dflt A dflt B' = + PiE_dflt A dflt (\b. B b \ B' b)" + unfolding PiE_dflt_def + by auto + +lemma random_xors_xor_hash_pair: + assumes V: "finite V" + assumes \: "dom \ = {..': "dom \' = {..: "dom \ = V" + assumes \': "dom \' = V" + assumes neq: "\ \ \'" + shows " + measure_pmf.prob (random_xors V n) + {xors. xor_hash \ xors = \ \ xor_hash \' xors = \'} = + 1 / 4 ^ n" +proof - + obtain y where "\ y \ \' y" + using neq + by blast + then have neq:"{x. \ x = Some True} \ {x. \' x = Some True}" + by (smt (verit, ccfv_threshold) assms(4) assms(5) domD domIff mem_Collect_eq) + have "measure_pmf.prob (random_xors V n) + {xors. + xor_hash \ xors = \ \ xor_hash \' xors = \'} = + measure_pmf.prob (random_xors V n) + ({xors. xor_hash \ xors = \} \ + {xors. xor_hash \' xors = \'})" + by (simp add: Collect_conj_eq) + also have "... = + measure_pmf.prob + (Pi_pmf {..<(n::nat)} None + (\_. map_pmf Some (random_xor V))) + (PiE_dflt {..i. Some ` {xor. satisfies_xor xor {x. \ x = Some True} = the (\ i)}) + \ + PiE_dflt {..i. Some ` {xor. satisfies_xor xor {x. \' x = Some True} = the (\' i)}))" + unfolding random_xors_def xor_hash_eq_PiE_dflt[OF \] xor_hash_eq_PiE_dflt[OF \'] + by auto + also have "... = + measure_pmf.prob + (Pi_pmf {..<(n::nat)} None + (\_. map_pmf Some (random_xor V))) + (PiE_dflt {..i. + Some ` {xor. + satisfies_xor xor {x. \ x = Some True} = the (\ i) \ + satisfies_xor xor {x. \' x = Some True} = the (\' i)}))" + unfolding PiE_dflt_inter + apply (subst image_Int[symmetric]) + by (auto simp add: Collect_conj_eq) + + also have "... = + (\x x = Some True} = the (\ x) \ + satisfies_xor xor {x. \' x = Some True} = the (\' x)}))" + by (subst measure_Pi_pmf_PiE_dflt) + (auto simp add: inj_vimage_image_eq) + also have "... = (\x: "dom \ = {..': "dom \' = {..'': "dom \'' = {..: "dom \ = V" + assumes \': "dom \' = V" + assumes \': "dom \'' = V" + assumes neq: "\ \ \'" "\' \ \''" "\'' \ \" + shows " + measure_pmf.prob (random_xors V n) + {xors. + xor_hash \ xors = \ + \ xor_hash \' xors = \' + \ xor_hash \'' xors = \''} = + 1 / 8 ^ n" +proof - + obtain x y z where "\ x \ \' x" "\' y \ \'' y" "\'' z \ \ z" + using neq + by blast + then have neq: + "{x. \ x = Some True} \ {x. \' x = Some True}" + "{x. \' x = Some True} \ {x. \'' x = Some True}" + "{x. \'' x = Some True} \ {x. \ x = Some True}" + by (smt (verit, ccfv_threshold) assms domD domIff mem_Collect_eq)+ + have "measure_pmf.prob (random_xors V n) + {xors. + xor_hash \ xors = \ \ xor_hash \' xors = \' \ xor_hash \'' xors = \''} = + measure_pmf.prob (random_xors V n) + ({xors. xor_hash \ xors = \} \ + {xors. xor_hash \' xors = \'} \ + {xors. xor_hash \'' xors = \''})" + by (simp add: measure_pmf.measure_pmf_eq) + moreover have "... = + measure_pmf.prob + (Pi_pmf {..<(n::nat)} None + (\_. map_pmf Some (random_xor V))) + (PiE_dflt {..i. Some ` {xor. satisfies_xor xor {x. \ x = Some True} = the (\ i)}) + \ + PiE_dflt {..i. Some ` {xor. satisfies_xor xor {x. \' x = Some True} = the (\' i)}) + \ + PiE_dflt {..i. Some ` {xor. satisfies_xor xor {x. \'' x = Some True} = the (\'' i)}))" + unfolding random_xors_def xor_hash_eq_PiE_dflt[OF \] xor_hash_eq_PiE_dflt[OF \'] xor_hash_eq_PiE_dflt[OF \''] + by auto + moreover have "... = + measure_pmf.prob + (Pi_pmf {..<(n::nat)} None + (\_. map_pmf Some (random_xor V))) + (PiE_dflt {..i. + Some ` {xor. + satisfies_xor xor {x. \ x = Some True} = the (\ i) \ + satisfies_xor xor {x. \' x = Some True} = the (\' i) \ + satisfies_xor xor {x. \'' x = Some True} = the (\'' i)})) + " + unfolding PiE_dflt_inter + apply (subst image_Int[symmetric]) + subgoal by simp + apply (intro arg_cong[where f="measure_pmf.prob + (Pi_pmf {.._. map_pmf Some (random_xor V)))"]) + apply (intro arg_cong[where f="PiE_dflt {..x x = Some True} = the (\ x) \ + satisfies_xor xor {x. \' x = Some True} = the (\' x)\ + satisfies_xor xor {x. \'' x = Some True} = the (\'' x)}))" + apply (subst measure_Pi_pmf_PiE_dflt) + by (auto simp add: inj_vimage_image_eq) + moreover have "... = (\xRandom XOR hash family\ + +text \This section defines a hash family based on random XORs and proves + that this hash family is 3-universal. \ + +theory RandomXORHashFamily imports + RandomXOR +begin + +lemma finite_dom: + assumes "finite V" + shows "finite {w :: 'a \ bool. dom w = V}" +proof - + have *: "{w :: 'a \ bool. dom w = V} = + {w. dom w = V \ ran w \ {True,False}}" + by auto + show ?thesis unfolding * + apply (intro finite_set_of_finite_maps) + using assms by auto +qed + +lemma xor_hash_eq_dom: + assumes "xor_hash \ xors = \" + shows "dom xors = dom \" + using assms unfolding xor_hash_def + by auto + +lemma prob_random_xors_xor_hash_indicat_real: + assumes V: "finite V" + shows" + measure_pmf.prob (random_xors V n) + {xors. xor_hash \ xors = \} = + indicat_real {\::nat \ bool. dom \ = {0.. / + real (card {\::nat \ bool. dom \ = {0..::nat \ bool. dom \ = {0... dom \ = {0.. ran \ \ {True, False}}" + by auto + have **: "card {\::nat \ bool. dom \ = {0.. = {.. dom \ \ {.. = {..dom \ = {.. atLeast0LessThan) + } + moreover { + assume *:"dom \ \ {.. set_pmf (random_xors V n) \ + \ \ xor_hash \ x" for x + by (metis (mono_tags, lifting) V mem_Collect_eq random_xors_set_pmf xor_hash_eq_dom) + then have "measure_pmf.prob (random_xors V n) + {xors. xor_hash \ xors = \} = 0" + apply (intro measure_pmf.measure_exclude[where A = "set_pmf ((random_xors V n))"]) + by (auto simp add: Sigma_Algebra.measure_def emeasure_pmf xor_hash_eq_dom) + then have ?thesis + by (simp add: * atLeast0LessThan) + } + ultimately show ?thesis + by auto +qed + +lemma xor_hash_family_uniform: + assumes V: "finite V" + assumes "dom \ = V" + shows "prob_space.uniform_on + (random_xors V n) + (xor_hash i) {\. dom \ = {0..: "dom \ = V" + assumes \': "dom \' = V" + assumes neq: "\ \ \'" + shows " + measure_pmf.prob (random_xors V n) + {xors. + xor_hash \ xors = \ \ xor_hash \' xors = \'} = + (measure_pmf.prob (random_xors V n) + {xors. + xor_hash \ xors = \} * + measure_pmf.prob (random_xors V n) + {xors. + xor_hash \' xors = \'})" +proof - + have "dom \ = {.. dom \' = {.. + \(dom \ = {.. dom \' = {.. = {..' = {.. xors = \ \ xor_hash \' xors = \'} = 1 / 4 ^n" + by (simp add: "*"(1) "*"(2) assms(1) assms(2) assms(3) assms(4) random_xors_xor_hash_pair) + moreover have " + measure_pmf.prob (random_xors V n) + {xors. xor_hash \ xors = \} = 1/2^n" + by (simp add: "*"(1) assms(1) prob_random_xors_xor_hash) + moreover have " + measure_pmf.prob (random_xors V n) + {xors. xor_hash \' xors = \'} = 1/2^n" + by (simp add: "*"(2) assms(1) prob_random_xors_xor_hash) + ultimately have ?thesis + by (metis (full_types) Groups.mult_ac(2) four_x_squared power2_eq_square power_mult power_one_over verit_prod_simplify(2)) + } + moreover { + assume *: "dom \ \ {.. dom \' \ {.. set_pmf (random_xors V n) \ + \ = xor_hash \ x \ + \' = xor_hash \' x \ False" for x + by (metis (mono_tags, lifting) CollectD assms(1) random_xors_set_pmf xor_hash_eq_dom) + have "measure_pmf.prob (random_xors V n) + {xors. + xor_hash \ xors = \} = 0 \ + measure_pmf.prob (random_xors V n) + {xors. + xor_hash \' xors = \'} = 0" + unfolding prob_random_xors_xor_hash_indicat_real[OF V] + by (metis (full_types) * atLeast0LessThan div_0 indicator_simps(2) mem_Collect_eq) + moreover have " + measure_pmf.prob (random_xors V n) + {xors. + xor_hash \ xors = \ \ xor_hash \' xors = \'} = 0" + apply (intro measure_pmf.measure_exclude[where A = "set_pmf ((random_xors V n))"]) + using ** by (auto simp add: Sigma_Algebra.measure_def emeasure_pmf) + ultimately have ?thesis by auto + } + ultimately show ?thesis by auto +qed + +lemma prod_3_expand: + assumes "a \ b" "b \ c" "c \ a" + shows"(\\\{a, b, c}. f \) = f a * (f b * f c)" + using assms by auto + +lemma random_xors_xor_hash_three_indicat: + assumes V: "finite V" + assumes \: "dom \ = V" + assumes \': "dom \' = V" + assumes \'': "dom \'' = V" + assumes neq: "\ \ \'" "\' \ \''" "\'' \ \" + shows " + measure_pmf.prob (random_xors V n) + {xors. + xor_hash \ xors = \ + \ xor_hash \' xors = \' + \ xor_hash \'' xors = \''} = + (measure_pmf.prob (random_xors V n) + {xors. + xor_hash \ xors = \} * + measure_pmf.prob (random_xors V n) + {xors. + xor_hash \' xors = \'} * + measure_pmf.prob (random_xors V n) + {xors. + xor_hash \'' xors = \''})" +proof - + have "dom \ = {.. dom \' = {.. dom \'' = {.. + \(dom \ = {.. dom \' = {.. dom \'' = {.. = {..' = {..'' = {.. xors = \ \ + xor_hash \' xors = \' \ + xor_hash \'' xors = \''} = 1 / 8 ^n" + apply (intro random_xors_xor_hash_three) + using V * \ \' \'' neq by auto + have 2:" + measure_pmf.prob (random_xors V n) + {xors. xor_hash \ xors = \} = 1/2^n" + by (simp add: "*"(1) assms(1) prob_random_xors_xor_hash) + have 3:" + measure_pmf.prob (random_xors V n) + {xors. xor_hash \' xors = \'} = 1/2^n" + by (simp add: "*"(2) assms(1) prob_random_xors_xor_hash) + have 4: " + measure_pmf.prob (random_xors V n) + {xors. xor_hash \'' xors = \''} = 1/2^n" + by (simp add: "*"(3) assms(1) prob_random_xors_xor_hash) + have ?thesis + unfolding 1 2 3 4 + by (metis (mono_tags, opaque_lifting) arith_simps(11) arith_simps(12) arith_simps(58) divide_divide_eq_left mult.right_neutral power_mult_distrib times_divide_eq_right) + } + moreover { + assume *: "dom \ \ {.. dom \' \ {.. dom \'' \ {.. set_pmf (random_xors V n) \ + \ = xor_hash \ x \ + \' = xor_hash \' x \ + \'' = xor_hash \'' x \ False" for x + by (metis (mono_tags, lifting) CollectD assms(1) random_xors_set_pmf xor_hash_eq_dom) + have "measure_pmf.prob (random_xors V n) + {xors. + xor_hash \ xors = \} = 0 \ + measure_pmf.prob (random_xors V n) + {xors. + xor_hash \' xors = \'} = 0 \ + measure_pmf.prob (random_xors V n) + {xors. + xor_hash \'' xors = \''} = 0" + unfolding prob_random_xors_xor_hash_indicat_real[OF V] + by (metis (full_types) * atLeast0LessThan div_0 indicator_simps(2) mem_Collect_eq) + moreover have " + measure_pmf.prob (random_xors V n) + {xors. + xor_hash \ xors = \ \ xor_hash \' xors = \' \ xor_hash \'' xors = \''} = 0" + apply (intro measure_pmf.measure_exclude[where A = "set_pmf ((random_xors V n))"]) + using ** by (auto simp add: Sigma_Algebra.measure_def emeasure_pmf) + ultimately have ?thesis by auto + } + ultimately show ?thesis + by fastforce +qed + +lemma xor_hash_3_indep: + assumes V: "finite V" + assumes J: "card J \ 3" "J \ {\. dom \ = V}" + shows " + measure_pmf.prob (random_xors V n) + {xors. \\\J. xor_hash \ xors = f \} = + (\\\J. + measure_pmf.prob (random_xors V n) + {xors. xor_hash \ xors = f \})" +proof - + have "card J = 0 \ card J = 1 \ card J = 2 \ card J = 3" + using assms by auto + moreover { + assume" card J = 0" + then have "J = {}" + by (meson assms(1) assms(3) card_eq_0_iff finite_dom finite_subset) + then have ?thesis + by clarsimp + } + moreover { + assume "card J = 1" + then obtain x where "J = {x}" + using card_1_singletonE by blast + then have ?thesis + by auto + } + moreover { + assume "card J = 2" + then obtain \ \' where J:"J = {\, \'}" and + \: "\ \ \'" "dom \ = V" "dom \' = V" + unfolding card_2_iff + using J + by force + have ?thesis unfolding J + by (auto simp add: random_xors_xor_hash_pair_indicat V \) + } + moreover { + assume "card J = 3" + then obtain \ \' \'' where J:"J = {\, \', \''}" and + \: "\ \ \'" "\' \ \''" "\'' \ \" + "dom \ = V" "dom \' = V" "dom \'' = V" + unfolding card_3_iff + using J + by force + have ?thesis unfolding J + by (auto simp add: random_xors_xor_hash_three_indicat V \ prod_3_expand[OF \(1-3)]) + } + ultimately show ?thesis by auto +qed + +lemma xor_hash_3_wise_indep: + assumes "finite V" + shows "prob_space.k_wise_indep_vars + (random_xors V n) 3 + (\_. Universal_Hash_Families_More_Independent_Families.discrete) xor_hash + {\. dom \ = V}" + apply (subst prob_space.k_wise_indep_vars_def) + by (auto intro!: measure_pmf.indep_vars_pmf xor_hash_3_indep simp add: measure_pmf.prob_space_axioms assms card_mono dual_order.trans) + +theorem xor_hash_family_3_universal: + assumes "finite V" + shows"prob_space.k_universal + (random_xors V n) 3 xor_hash + {\::'a \ bool. dom \ = V} + {\::nat \ bool. dom \ = {0..::'a \ bool. dom \ = V} + {\::nat \ bool. dom \ = {0.. 0$ and $0 < +\delta \leq 1$. The algorithmic specification is further refined to a verified +certificate checker that can be used to validate the results of untrusted +{$\mathsf{ApproxMC}$} implementations (assuming access to trusted randomness). +} + +\tableofcontents + +% sane default for proof documents +\parindent 0pt\parskip 0.5ex + +\input{session} + +\bibliographystyle{abbrv} +\bibliography{root} + +\end{document} diff --git a/thys/Continued_Fractions/Continued_Fraction_Approximation.thy b/thys/Continued_Fractions/Continued_Fraction_Approximation.thy new file mode 100644 --- /dev/null +++ b/thys/Continued_Fractions/Continued_Fraction_Approximation.thy @@ -0,0 +1,190 @@ +(* + File: Continued_Fractions/Continued_Fraction_Approximation.thy + Author: Manuel Eberl, University of Innsbruck +*) +section \Computing continued fraction expansions through interval arithmetic\ +theory Continued_Fraction_Approximation +imports + Complex_Main + "HOL-Decision_Procs.Approximation" + "Coinductive.Coinductive_List" + "HOL-Library.Code_Lazy" + "HOL-Library.Code_Target_Numeral" + Continued_Fractions +keywords "approximate_cfrac" :: diag +begin + +text \ + The approximation package allows us to compute an enclosing interval for a given + real constant. From this, we are able to compute an initial fragment of the continued + fraction expansion of the number. + + The algorithm essentially works by computing the continued fraction expansion of the lower + and upper bound simultaneously and stopping when the results start to diverge. + + This algorithm terminates because the lower and upper bounds, being rational numbers, have + a finite continued fraction expansion. +\ + +definition float_to_rat :: "float \ int \ int" where + "float_to_rat f = (if exponent f \ 0 then + (mantissa f * 2 ^ nat (exponent f), 1) else (mantissa f, 2 ^ nat (-exponent f)))" + +lemma float_to_rat: "fst (float_to_rat f) / snd (float_to_rat f) = real_of_float f" + by (auto simp: float_to_rat_def mantissa_exponent powr_int) + +lemma snd_float_to_rat_pos [simp]: "snd (float_to_rat f) > 0" + by (simp add: float_to_rat_def) + + +function cfrac_from_approx :: "int \ int \ int \ int \ int list" where + "cfrac_from_approx (nl, dl) (nu, du) = + (if nl = 0 \ nu = 0 \ dl = 0 \ du = 0 then [] + else let l = nl div dl; u = nu div du + in if l \ u then [] + else l # (let m = nl mod dl in if m = 0 then [] else + cfrac_from_approx (du, nu mod du) (dl, m)))" + by auto +termination proof (relation "measure (\((nl, dl), (nu, du)). nat (abs dl + abs du))", goal_cases) + case (2 nl dl nu du) + hence "\nl mod dl\ + \nu mod du\ < \dl\ + \du\" + by (intro add_strict_mono) (auto simp: abs_mod_less) + thus ?case using 2 by simp +qed auto + +lemmas [simp del] = cfrac_from_approx.simps + +lemma cfrac_from_approx_correct: + assumes "x \ {fst l / snd l..fst u / snd u}" and "snd l > 0" and "snd u > 0" + assumes "i < length (cfrac_from_approx l u)" + shows "cfrac_nth (cfrac_of_real x) i = cfrac_from_approx l u ! i" + using assms +proof (induction l u arbitrary: i x rule: cfrac_from_approx.induct) + case (1 nl dl nu du i x) + from "1.prems" have *: "nl div dl = nu div du" "nl \ 0" "nu \ 0" "dl > 0" "du > 0" + by (auto simp: cfrac_from_approx.simps Let_def split: if_splits) + have "\nl / dl\ \ \x\" "\x\ \ \nu / du\" + using "1.prems"(1) by (intro floor_mono; simp)+ + hence "nl div dl \ \x\" "\x\ \ nu div du" + by (simp_all add: floor_divide_of_int_eq) + with * have "\x\ = nu div du" + by linarith + + show ?case + proof (cases i) + case 0 + with 0 and \\x\ = _\ show ?thesis using "1.prems" + by (auto simp: Let_def cfrac_from_approx.simps) + next + case [simp]: (Suc i') + from "1.prems" * have "nl mod dl \ 0" + by (subst (asm) cfrac_from_approx.simps) (auto split: if_splits) + have frac_eq: "frac x = x - nu div du" + using \\x\ = _\ by (simp add: frac_def) + + have "frac x \ nl / dl - nl div dl" + using * "1.prems" by (simp add: frac_eq) + also have "nl / dl - nl div dl = (nl - dl * (nl div dl)) / dl" + using * by (simp add: field_simps) + also have "nl - dl * (nl div dl) = nl mod dl" + by (subst minus_div_mult_eq_mod [symmetric]) auto + finally have "frac x \ (nl mod dl) / dl" . + + have "nl mod dl \ 0" + using * by (intro pos_mod_sign) auto + with \nl mod dl \ 0\ have "nl mod dl > 0" + by linarith + hence "0 < (nl mod dl) / dl" + using * by (intro divide_pos_pos) auto + also have "\ \ frac x" + by fact + finally have "frac x > 0" . + + have "frac x \ nu / du - nu div du" + using * "1.prems" by (simp add: frac_eq) + also have "\ = (nu - du * (nu div du)) / du" + using * by (simp add: field_simps) + also have "nu - du * (nu div du) = nu mod du" + by (subst minus_div_mult_eq_mod [symmetric]) auto + finally have "frac x \ real_of_int (nu mod du) / real_of_int du" . + + have "0 < frac x" + by fact + also have "\ \ (nu mod du) / du" + by fact + finally have "nu mod du > 0" + using * by (auto simp: field_simps) + + have "cfrac_nth (cfrac_of_real x) i = cfrac_nth (cfrac_tl (cfrac_of_real x)) i'" + by simp + also have "cfrac_tl (cfrac_of_real x) = cfrac_of_real (1 / frac x)" + using \frac x > 0\ by (intro cfrac_tl_of_real) auto + also have "cfrac_nth (cfrac_of_real (1 / frac x)) i' = + cfrac_from_approx (du, nu mod du) (dl, nl mod dl) ! i'" + proof (rule "1.IH"[OF _ refl refl _ refl]) + show "\ (nl = 0 \ nu = 0 \ dl = 0 \ du = 0)" "\ nl div dl \ nu div du" + using "1.prems" by (auto split: if_splits simp: Let_def cfrac_from_approx.simps) + next + show "i' < length (cfrac_from_approx (du, nu mod du) (dl, nl mod dl))" using "1.prems" + by (subst (asm) cfrac_from_approx.simps) (auto split: if_splits simp: Let_def) + next + have "1 / frac x \ dl / (nl mod dl)" + using \frac x > 0\ and \nl mod dl > 0\ and \frac x \ (nl mod dl) / dl\ and * + by (auto simp: field_simps) + moreover have "1 / frac x \ du / (nu mod du)" + using \frac x > 0\ and \nu mod du > 0\ and \frac x \ (nu mod du) / du\ and * + by (auto simp: field_simps) + ultimately show + "1 / frac x \ {real_of_int (fst (du, nu mod du)) / real_of_int (snd (du, nu mod du)).. + real_of_int (fst (dl, nl mod dl)) / real_of_int (snd (dl, nl mod dl))}" + by simp + show "snd (du, nu mod du) > 0" "snd (dl, nl mod dl) > 0" and "nl mod dl \ 0" + using \nu mod du > 0\ and \nl mod dl > 0\ by simp_all + qed + also have "cfrac_from_approx (du, nu mod du) (dl, nl mod dl) ! i' = + cfrac_from_approx (nl, dl) (nu, du) ! i" + using "1.prems" * \nl mod dl \ 0\ by (subst (2) cfrac_from_approx.simps) auto + finally show ?thesis . + qed +qed + +definition cfrac_from_approx' :: "float \ float \ int list" where + "cfrac_from_approx' l u = cfrac_from_approx (float_to_rat l) (float_to_rat u)" + +lemma cfrac_from_approx'_correct: + assumes "x \ {real_of_float l..real_of_float u}" + assumes "i < length (cfrac_from_approx' l u)" + shows "cfrac_nth (cfrac_of_real x) i = cfrac_from_approx' l u ! i" + using assms unfolding cfrac_from_approx'_def + by (intro cfrac_from_approx_correct) (auto simp: float_to_rat cfrac_from_approx'_def) + +definition approx_cfrac :: "nat \ floatarith \ int list" where + "approx_cfrac prec e = + (case approx' prec e [] of + None \ [] + | Some ivl \ cfrac_from_approx' (lower ivl) (upper ivl))" + +ML_file \approximation_cfrac.ML\ + + +text \Now let us do some experiments:\ + +value "let prec = 34; c = cfrac_from_approx' (lb_pi prec) (ub_pi prec) in c" +value "let prec = 34; c = cfrac_from_approx' (lb_pi prec) (ub_pi prec) + in map (\n. (conv_num_fun ((!) c) n, conv_denom_fun ((!) c) n)) [0..Continued Fractions\ +theory Continued_Fractions +imports + Complex_Main + "Coinductive.Lazy_LList" + "Coinductive.Coinductive_Nat" + "HOL-Number_Theory.Fib" + "HOL-Library.BNF_Corec" + "Coinductive.Coinductive_Stream" +begin + +subsection \Auxiliary results\ + +(* TODO: Move? *) +coinductive linfinite :: "'a llist \ bool" where + "linfinite xs \ linfinite (LCons x xs)" + +lemma llength_llist_of_stream [simp]: "llength (llist_of_stream xs) = \" + by (simp add: not_lfinite_llength) + +lemma linfinite_conv_llength: "linfinite xs \ llength xs = \" +proof + assume "linfinite xs" + thus "llength xs = \" + proof (coinduction arbitrary: xs rule: enat_coinduct2) + fix xs :: "'a llist" + assume "llength xs \ 0" "linfinite xs" + thus "(\xs'::'a llist. epred (llength xs) = llength xs' \ epred \ = \ \ linfinite xs') \ + epred (llength xs) = epred \" + by (intro disjI1 exI[of _ "ltl xs"]) (auto simp: linfinite.simps[of xs]) + next + fix xs :: "'a llist" assume "linfinite xs"thus "(llength xs = 0) \ (\ = (0::enat))" + by (subst (asm) linfinite.simps) auto + qed +next + assume "llength xs = \" + thus "linfinite xs" + proof (coinduction arbitrary: xs) + case linfinite + thus "\xsa x. + xs = LCons x xsa \ + ((\xs. xsa = xs \ llength xs = \) \ + linfinite xsa)" + by (cases xs) (auto simp: eSuc_eq_infinity_iff) + qed +qed + +definition lnth_default :: "'a \ 'a llist \ nat \ 'a" where + "lnth_default dflt xs n = (if n < llength xs then lnth xs n else dflt)" + +lemma lnth_default_code [code]: + "lnth_default dflt xs n = + (if lnull xs then dflt else if n = 0 then lhd xs else lnth_default dflt (ltl xs) (n - 1))" +proof (induction n arbitrary: xs) + case 0 + thus ?case + by (cases xs) (auto simp: lnth_default_def simp flip: zero_enat_def) +next + case (Suc n) + show ?case + proof (cases xs) + case LNil + thus ?thesis + by (auto simp: lnth_default_def) + next + case (LCons x xs') + thus ?thesis + by (auto simp: lnth_default_def Suc_ile_eq) + qed +qed + +lemma enat_le_iff: + "enat n \ m \ m = \ \ (\m'. m = enat m' \ n \ m')" + by (cases m) auto + +lemma enat_less_iff: + "enat n < m \ m = \ \ (\m'. m = enat m' \ n < m')" + by (cases m) auto + +lemma real_of_int_divide_in_Ints_iff: + "real_of_int a / real_of_int b \ \ \ b dvd a \ b = 0" +proof safe + assume "real_of_int a / real_of_int b \ \" "b \ 0" + then obtain n where "real_of_int a / real_of_int b = real_of_int n" + by (auto simp: Ints_def) + hence "real_of_int b * real_of_int n = real_of_int a" + using \b \ 0\ by (auto simp: field_simps) + also have "real_of_int b * real_of_int n = real_of_int (b * n)" + by simp + finally have "b * n = a" + by linarith + thus "b dvd a" + by auto +qed auto + +lemma frac_add_of_nat: "frac (of_nat y + x) = frac x" + unfolding frac_def by simp + +lemma frac_add_of_int: "frac (of_int y + x) = frac x" + unfolding frac_def by simp + +lemma frac_fraction: "frac (real_of_int a / real_of_int b) = (a mod b) / b" +proof - + have "frac (a / b) = frac ((a mod b + b * (a div b)) / b)" + by (subst mod_mult_div_eq) auto + also have "(a mod b + b * (a div b)) / b = of_int (a div b) + a mod b / b" + unfolding of_int_add by (subst add_divide_distrib) auto + also have "frac \ = frac (a mod b / b)" + by (rule frac_add_of_int) + also have "\ = a mod b / b" + by (simp add: floor_divide_of_int_eq frac_def) + finally show ?thesis . +qed + +lemma Suc_fib_ge: "Suc (fib n) \ n" +proof (induction n rule: fib.induct) + case (3 n) + show ?case + proof (cases "n < 2") + case True + thus ?thesis by (cases n) auto + next + case False + hence "Suc (Suc (Suc n)) \ Suc n + n" by simp + also have "\ \ Suc (fib (Suc n)) + Suc (fib n)" + by (intro add_mono 3) + also have "\ = Suc (Suc (fib (Suc (Suc n))))" + by simp + finally show ?thesis by (simp only: Suc_le_eq) + qed +qed auto + +lemma fib_ge: "fib n \ n - 1" + using Suc_fib_ge[of n] by simp + +lemma frac_diff_of_nat_right [simp]: "frac (x - of_nat y) = frac x" + using floor_diff_of_int[of x "int y"] by (simp add: frac_def) + +lemma funpow_cycle: + assumes "m > 0" + assumes "(f ^^ m) x = x" + shows "(f ^^ k) x = (f ^^ (k mod m)) x" +proof (induction k rule: less_induct) + case (less k) + show ?case + proof (cases "k < m") + case True + thus ?thesis using \m > 0\ by simp + next + case False + hence "k = (k - m) + m" by simp + also have "(f ^^ \) x = (f ^^ (k - m)) ((f ^^ m) x)" + by (simp add: funpow_add) + also have "(f ^^ m) x = x" by fact + also have "(f ^^ (k - m)) x = (f ^^ (k mod m)) x" + using assms False by (subst less.IH) (auto simp: mod_geq) + finally show ?thesis . + qed +qed + +lemma of_nat_ge_1_iff: "of_nat n \ (1 :: 'a :: linordered_semidom) \ n > 0" + using of_nat_le_iff[of 1 n] unfolding of_nat_1 by auto + +lemma not_frac_less_0: "\frac x < 0" + by (simp add: frac_def not_less) + +lemma frac_le_1: "frac x \ 1" + unfolding frac_def by linarith + +lemma divide_in_Rats_iff1: + "(x::real) \ \ \ x \ 0 \ x / y \ \ \ y \ \" +proof safe + assume *: "x \ \" "x \ 0" "x / y \ \" + from *(1,3) have "x / (x / y) \ \" + by (rule Rats_divide) + also from * have "x / (x / y) = y" by simp + finally show "y \ \" . +qed (auto intro: Rats_divide) + +lemma divide_in_Rats_iff2: + "(y::real) \ \ \ y \ 0 \ x / y \ \ \ x \ \" +proof safe + assume *: "y \ \" "y \ 0" "x / y \ \" + from *(3,1) have "x / y * y \ \" + by (rule Rats_mult) + also from * have "x / y * y = x" by simp + finally show "x \ \" . +qed (auto intro: Rats_divide) + +lemma add_in_Rats_iff1: "x \ \ \ x + y \ \ \ y \ \" + using Rats_diff[of "x + y" x] by auto + +lemma add_in_Rats_iff2: "y \ \ \ x + y \ \ \ x \ \" + using Rats_diff[of "x + y" y] by auto + +lemma diff_in_Rats_iff1: "x \ \ \ x - y \ \ \ y \ \" + using Rats_diff[of x "x - y"] by auto + +lemma diff_in_Rats_iff2: "y \ \ \ x - y \ \ \ x \ \" + using Rats_add[of "x - y" y] by auto + +lemma frac_in_Rats_iff [simp]: "frac x \ \ \ x \ \" + by (simp add: frac_def diff_in_Rats_iff2) + +lemma filterlim_sequentially_shift: + "filterlim (\n. f (n + m)) F sequentially \ filterlim f F sequentially" +proof (induction m) + case (Suc m) + have "filterlim (\n. f (n + Suc m)) F at_top \ + filterlim (\n. f (Suc n + m)) F at_top" by simp + also have "\ \ filterlim (\n. f (n + m)) F at_top" + by (rule filterlim_sequentially_Suc) + also have "\ \ filterlim f F at_top" + by (rule Suc.IH) + finally show ?case . +qed simp_all + + +subsection \Bounds on alternating decreasing sums\ + +lemma alternating_decreasing_sum_bounds: + fixes f :: "nat \ 'a :: {linordered_ring, ring_1}" + assumes "m \ n" "\k. k \ {m..n} \ f k \ 0" + "\k. k \ {m.. f (Suc k) \ f k" + defines "S \ (\m. (\k=m..n. (-1) ^ k * f k))" + shows "if even m then S m \ {0..f m} else S m \ {-f m..0}" + using assms(1) +proof (induction rule: inc_induct) + case (step m') + have [simp]: "-a \ b \ a + b \ (0 :: 'a)" for a b + by (metis le_add_same_cancel1 minus_add_cancel) + have [simp]: "S m' = (-1) ^ m' * f m' + S (Suc m')" + using step.hyps unfolding S_def + by (subst sum.atLeast_Suc_atMost) simp_all + from step.hyps have nonneg: "f m' \ 0" + by (intro assms) auto + from step.hyps have mono: "f (Suc m') \ f m'" + by (intro assms) auto + show ?case + proof (cases "even m'") + case True + hence "0 \ f (Suc m') + S (Suc m')" + using step.IH by simp + also note mono + finally show ?thesis using True step.IH by auto + next + case False + with step.IH have "S (Suc m') \ f (Suc m')" + by simp + also note mono + finally show ?thesis using step.IH False by auto + qed +qed (insert assms, auto) + +lemma alternating_decreasing_sum_bounds': + fixes f :: "nat \ 'a :: {linordered_ring, ring_1}" + assumes "m < n" "\k. k \ {m..n-1} \ f k \ 0" + "\k. k \ {m.. f (Suc k) \ f k" + defines "S \ (\m. (\k=m.. {0..f m} else S m \ {-f m..0}" +proof (cases n) + case 0 + thus ?thesis using assms by auto +next + case (Suc n') + hence "if even m then (\k=m..n-1. (-1) ^ k * f k) \ {0..f m} + else (\k=m..n-1. (-1) ^ k * f k) \ {-f m..0}" + using assms by (intro alternating_decreasing_sum_bounds) auto + also have "(\k=m..n-1. (-1) ^ k * f k) = S m" + unfolding S_def by (intro sum.cong) (auto simp: Suc) + finally show ?thesis . +qed + +lemma alternating_decreasing_sum_upper_bound: + fixes f :: "nat \ 'a :: {linordered_ring, ring_1}" + assumes "m \ n" "\k. k \ {m..n} \ f k \ 0" + "\k. k \ {m.. f (Suc k) \ f k" + shows "(\k=m..n. (-1) ^ k * f k) \ f m" + using alternating_decreasing_sum_bounds[of m n f, OF assms] assms(1) + by (auto split: if_splits intro: order.trans[OF _ assms(2)]) + +lemma alternating_decreasing_sum_upper_bound': + fixes f :: "nat \ 'a :: {linordered_ring, ring_1}" + assumes "m < n" "\k. k \ {m..n-1} \ f k \ 0" + "\k. k \ {m.. f (Suc k) \ f k" + shows "(\k=m.. f m" + using alternating_decreasing_sum_bounds'[of m n f, OF assms] assms(1) + by (auto split: if_splits intro: order.trans[OF _ assms(2)]) + +lemma abs_alternating_decreasing_sum_upper_bound: + fixes f :: "nat \ 'a :: {linordered_ring, ring_1}" + assumes "m \ n" "\k. k \ {m..n} \ f k \ 0" + "\k. k \ {m.. f (Suc k) \ f k" + shows "\(\k=m..n. (-1) ^ k * f k)\ \ f m" (is "abs ?S \ _") + using alternating_decreasing_sum_bounds[of m n f, OF assms] + by (auto split: if_splits simp: minus_le_iff) + +lemma abs_alternating_decreasing_sum_upper_bound': + fixes f :: "nat \ 'a :: {linordered_ring, ring_1}" + assumes "m < n" "\k. k \ {m..n-1} \ f k \ 0" + "\k. k \ {m.. f (Suc k) \ f k" + shows "\(\k=m.. \ f m" + using alternating_decreasing_sum_bounds'[of m n f, OF assms] + by (auto split: if_splits simp: minus_le_iff) + +lemma abs_alternating_decreasing_sum_lower_bound: + fixes f :: "nat \ 'a :: {linordered_ring, ring_1}" + assumes "m < n" "\k. k \ {m..n} \ f k \ 0" + "\k. k \ {m.. f (Suc k) \ f k" + shows "\(\k=m..n. (-1) ^ k * f k)\ \ f m - f (Suc m)" +proof - + have "(\k=m..n. (-1) ^ k * f k) = (\k\insert m {m<..n}. (-1) ^ k * f k)" + using assms by (intro sum.cong) auto + also have "\ = (-1) ^ m * f m + (\k\{m<..n}. (-1) ^ k * f k)" + by auto + also have "(\k\{m<..n}. (-1) ^ k * f k) = (\k\{m..i. i - 1"]) auto + also have "(-1)^m * f m + \ = (-1)^m * f m - (\k\{m..\\ \ \(-1)^m * f m\ - \(\k\{m.." + by (rule abs_triangle_ineq2) + also have "\(-1)^m * f m\ = f m" + using assms by (cases "even m") auto + finally have "f m - \\k = m.. + \ \\k = m..n. (- 1) ^ k * f k\" . + moreover have "f m - \(\k\{m.. \ f m - f (Suc m)" + using assms by (intro diff_mono abs_alternating_decreasing_sum_upper_bound') auto + ultimately show ?thesis by (rule order.trans[rotated]) +qed + +lemma abs_alternating_decreasing_sum_lower_bound': + fixes f :: "nat \ 'a :: {linordered_ring, ring_1}" + assumes "m+1 < n" "\k. k \ {m..n} \ f k \ 0" + "\k. k \ {m.. f (Suc k) \ f k" + shows "\(\k=m.. \ f m - f (Suc m)" +proof (cases n) + case 0 + thus ?thesis using assms by auto +next + case (Suc n') + hence "\(\k=m..n-1. (-1) ^ k * f k)\ \ f m - f (Suc m)" + using assms by (intro abs_alternating_decreasing_sum_lower_bound) auto + also have "(\k=m..n-1. (-1) ^ k * f k) = (\k=m..k. f k \ (0 :: real)" "\k. f (Suc k) \ f k" + "f \ 0" + shows "(\k. (-1) ^ k * f k) \ {f 0 - f 1..f 0}" +proof - + have "summable (\k. (-1) ^ k * f k)" + by (intro summable_Leibniz' assms) + hence lim: "(\n. \k\n. (-1) ^ k * f k) \ (\k. (-1) ^ k * f k)" + by (auto dest: summable_LIMSEQ') + have bounds: "(\k=0..n. (- 1) ^ k * f k) \ {f 0 - f 1..f 0}" + if "n > 0" for n + using alternating_decreasing_sum_bounds[of 1 n f] assms that + by (subst sum.atLeast_Suc_atMost) auto + note [simp] = atLeast0AtMost + note [intro!] = eventually_mono[OF eventually_gt_at_top[of 0]] + + from lim have "(\k. (-1) ^ k * f k) \ f 0 - f 1" + by (rule tendsto_lowerbound) (insert bounds, auto) + moreover from lim have "(\k. (-1) ^ k * f k) \ f 0" + by (rule tendsto_upperbound) (use bounds in auto) + ultimately show ?thesis by simp +qed + +lemma + assumes "\k. k \ m \ f k \ (0 :: real)" + "\k. k \ m \ f (Suc k) \ f k" "f \ 0" + defines "S \ (\k. (-1) ^ (k + m) * f (k + m))" + shows summable_alternating_decreasing: "summable (\k. (-1) ^ (k + m) * f (k + m))" + and alternating_decreasing_suminf_bounds': + "if even m then S \ {f m - f (Suc m) .. f m} + else S \ {-f m..f (Suc m) - f m}" (is ?th1) + and abs_alternating_decreasing_suminf: + "abs S \ {f m - f (Suc m)..f m}" (is ?th2) +proof - + have summable: "summable (\k. (-1) ^ k * f (k + m))" + using assms by (intro summable_Leibniz') (auto simp: filterlim_sequentially_shift) + thus "summable (\k. (-1) ^ (k + m) * f (k + m))" + by (subst add.commute) (auto simp: power_add mult.assoc intro: summable_mult) + have "S = (\k. (-1) ^ m * ((-1) ^ k * f (k + m)))" + by (simp add: S_def power_add mult_ac) + also have "\ = (-1) ^ m * (\k. (-1) ^ k * f (k + m))" + using summable by (rule suminf_mult) + finally have "S = (- 1) ^ m * (\k. (- 1) ^ k * f (k + m))" . + moreover have "(\k. (-1) ^ k * f (k + m)) \ + {f (0 + m) - f (1 + m) .. f (0 + m)}" + using assms + by (intro alternating_decreasing_suminf_bounds) + (auto simp: filterlim_sequentially_shift) + ultimately show ?th1 by (auto split: if_splits) + thus ?th2 using assms(2)[of m] by (auto split: if_splits) +qed + +lemma + assumes "\k. k \ m \ f k \ (0 :: real)" + "\k. k \ m \ f (Suc k) < f k" "f \ 0" + defines "S \ (\k. (-1) ^ (k + m) * f (k + m))" + shows alternating_decreasing_suminf_bounds_strict': + "if even m then S \ {f m - f (Suc m)<.. {-f m<.. {f m - f (Suc m)<..k. (-1) ^ (k + Suc (Suc m)) * f (k + Suc (Suc m)))" + have "(\k. (-1) ^ (k + m) * f (k + m)) sums S" using assms unfolding S_def + by (intro summable_sums summable_Leibniz' summable_alternating_decreasing) + (auto simp: less_eq_real_def) + from sums_split_initial_segment[OF this, of 2] + have S': "S' = S - (-1) ^ m * (f m - f (Suc m))" + by (simp_all add: sums_iff S'_def algebra_simps lessThan_nat_numeral) + have "if even (Suc (Suc m)) then S' \ {f (Suc (Suc m)) - f (Suc (Suc (Suc m)))..f (Suc (Suc m))} + else S' \ {- f (Suc (Suc m))..f (Suc (Suc (Suc m))) - f (Suc (Suc m))}" unfolding S'_def + using assms by (intro alternating_decreasing_suminf_bounds') (auto simp: less_eq_real_def) + thus ?th1 using assms(2)[of "Suc m"] assms(2)[of "Suc (Suc m)"] + unfolding S' by (auto simp: algebra_simps) + thus ?th2 using assms(2)[of m] by (auto split: if_splits) +qed + + +datatype cfrac = CFrac int "nat llist" + +quickcheck_generator cfrac constructors: CFrac + +lemma type_definition_cfrac': + "type_definition (\x. case x of CFrac a b \ (a, b)) (\(x,y). CFrac x y) UNIV" + by (auto simp: type_definition_def split: cfrac.splits) + +setup_lifting type_definition_cfrac' + +lift_definition cfrac_of_int :: "int \ cfrac" is + "\n. (n, LNil)" . + +lemma cfrac_of_int_code [code]: "cfrac_of_int n = CFrac n LNil" + by (auto simp: cfrac_of_int_def) + +lift_definition cfrac_of_stream :: "int stream \ cfrac" is + "\xs. (shd xs, llist_of_stream (smap (\x. nat (x - 1)) (stl xs)))" . + +instantiation cfrac :: zero +begin +definition zero_cfrac where "0 = cfrac_of_int 0" +instance .. +end + +instantiation cfrac :: one +begin +definition one_cfrac where "1 = cfrac_of_int 1" +instance .. +end + +lift_definition cfrac_tl :: "cfrac \ cfrac" is + "\(_, bs) \ case bs of LNil \ (1, LNil) | LCons b bs' \ (int b + 1, bs')" . + +lemma cfrac_tl_code [code]: + "cfrac_tl (CFrac a bs) = + (case bs of LNil \ CFrac 1 LNil | LCons b bs' \ CFrac (int b + 1) bs')" + by (auto simp: cfrac_tl_def split: llist.splits) + +definition cfrac_drop :: "nat \ cfrac \ cfrac" where + "cfrac_drop n c = (cfrac_tl ^^ n) c" + +lemma cfrac_drop_Suc_right: "cfrac_drop (Suc n) c = cfrac_drop n (cfrac_tl c)" + by (simp add: cfrac_drop_def funpow_Suc_right del: funpow.simps) + +lemma cfrac_drop_Suc_left: "cfrac_drop (Suc n) c = cfrac_tl (cfrac_drop n c)" + by (simp add: cfrac_drop_def) + +lemma cfrac_drop_add: "cfrac_drop (m + n) c = cfrac_drop m (cfrac_drop n c)" + by (simp add: cfrac_drop_def funpow_add) + +lemma cfrac_drop_0 [simp]: "cfrac_drop 0 = (\x. x)" + by (simp add: fun_eq_iff cfrac_drop_def) + +lemma cfrac_drop_1 [simp]: "cfrac_drop 1 = cfrac_tl" + by (simp add: fun_eq_iff cfrac_drop_def) + +lift_definition cfrac_length :: "cfrac \ enat" is + "\(_, bs) \ llength bs" . + +lemma cfrac_length_code [code]: "cfrac_length (CFrac a bs) = llength bs" + by (simp add: cfrac_length_def) + +lemma cfrac_length_tl [simp]: "cfrac_length (cfrac_tl c) = cfrac_length c - 1" + by transfer (auto split: llist.splits) + +lemma enat_diff_Suc_right [simp]: "m - enat (Suc n) = m - n - 1" + by (auto simp: diff_enat_def enat_1_iff split: enat.splits) + +lemma cfrac_length_drop [simp]: "cfrac_length (cfrac_drop n c) = cfrac_length c - n" + by (induction n) (auto simp: cfrac_drop_def) + +lemma cfrac_length_of_stream [simp]: "cfrac_length (cfrac_of_stream xs) = \" + by transfer auto + +lift_definition cfrac_nth :: "cfrac \ nat \ int" is + "\(a :: int, bs :: nat llist). \(n :: nat). + if n = 0 then a + else if n \ llength bs then int (lnth bs (n - 1)) + 1 else 1" . + +lemma cfrac_nth_code [code]: + "cfrac_nth (CFrac a bs) n = (if n = 0 then a else lnth_default 0 bs (n - 1) + 1)" +proof - + have "n > 0 \ enat (n - Suc 0) < llength bs \ enat n \ llength bs" + by (metis Suc_ile_eq Suc_pred) + thus ?thesis by (auto simp: cfrac_nth_def lnth_default_def) +qed + +lemma cfrac_nth_nonneg [simp, intro]: "n > 0 \ cfrac_nth c n \ 0" + by transfer auto + +lemma cfrac_nth_nonzero [simp]: "n > 0 \ cfrac_nth c n \ 0" + by transfer (auto split: if_splits) + +lemma cfrac_nth_pos[simp, intro]: "n > 0 \ cfrac_nth c n > 0" + by transfer auto + +lemma cfrac_nth_ge_1[simp, intro]: "n > 0 \ cfrac_nth c n \ 1" + by transfer auto + +lemma cfrac_nth_not_less_1[simp, intro]: "n > 0 \ \cfrac_nth c n < 1" + by transfer (auto split: if_splits) + +lemma cfrac_nth_tl [simp]: "cfrac_nth (cfrac_tl c) n = cfrac_nth c (Suc n)" + apply transfer + apply (auto split: llist.splits nat.splits simp: Suc_ile_eq lnth_LCons enat_0_iff + simp flip: zero_enat_def) + done + +lemma cfrac_nth_drop [simp]: "cfrac_nth (cfrac_drop n c) m = cfrac_nth c (m + n)" + by (induction n arbitrary: m) (auto simp: cfrac_drop_def) + +lemma cfrac_nth_0_of_int [simp]: "cfrac_nth (cfrac_of_int n) 0 = n" + by transfer auto + +lemma cfrac_nth_gt0_of_int [simp]: "m > 0 \ cfrac_nth (cfrac_of_int n) m = 1" + by transfer (auto simp: enat_0_iff) + +lemma cfrac_nth_of_stream: + assumes "sset (stl xs) \ {0<..}" + shows "cfrac_nth (cfrac_of_stream xs) n = snth xs n" + using assms +proof (transfer', goal_cases) + case (1 xs n) + thus ?case + by (cases xs; cases n) (auto simp: subset_iff) +qed + + +lift_definition cfrac :: "(nat \ int) \ cfrac" is + "\f. (f 0, inf_llist (\n. nat (f (Suc n) - 1)))" . + +definition is_cfrac :: "(nat \ int) \ bool" where "is_cfrac f \ (\n>0. f n > 0)" + +lemma cfrac_nth_cfrac [simp]: + assumes "is_cfrac f" + shows "cfrac_nth (cfrac f) n = f n" + using assms unfolding is_cfrac_def by transfer auto + +lemma llength_eq_infty_lnth: "llength b = \ \ inf_llist (lnth b) = b" + by (simp add: llength_eq_infty_conv_lfinite) + +lemma cfrac_cfrac_nth [simp]: "cfrac_length c = \ \ cfrac (cfrac_nth c) = c" + by transfer (auto simp: llength_eq_infty_lnth) + +lemma cfrac_length_cfrac [simp]: "cfrac_length (cfrac f) = \" + by transfer auto + + +lift_definition cfrac_of_list :: "int list \ cfrac" is + "\xs. if xs = [] then (0, LNil) else (hd xs, llist_of (map (\n. nat n - 1) (tl xs)))" . + +lemma cfrac_length_of_list [simp]: "cfrac_length (cfrac_of_list xs) = length xs - 1" + by transfer (auto simp: zero_enat_def) + +lemma cfrac_of_list_Nil [simp]: "cfrac_of_list [] = 0" + unfolding zero_cfrac_def by transfer auto + +lemma cfrac_nth_of_list [simp]: + assumes "n < length xs" and "\i\{0<.. 0" + shows "cfrac_nth (cfrac_of_list xs) n = xs ! n" + using assms +proof (transfer, goal_cases) + case (1 n xs) + show ?case + proof (cases n) + case (Suc n') + with 1 have "xs ! n > 0" + using 1 by auto + hence "int (nat (tl xs ! n') - Suc 0) + 1 = xs ! Suc n'" + using 1(1) Suc by (auto simp: nth_tl of_nat_diff) + thus ?thesis + using Suc 1(1) by (auto simp: hd_conv_nth zero_enat_def) + qed (use 1 in \auto simp: hd_conv_nth\) +qed + + +primcorec cfrac_of_real_aux :: "real \ nat llist" where + "cfrac_of_real_aux x = + (if x \ {0<..<1} then LCons (nat \1/x\ - 1) (cfrac_of_real_aux (frac (1/x))) else LNil)" + +lemma cfrac_of_real_aux_code [code]: + "cfrac_of_real_aux x = + (if x > 0 \ x < 1 then LCons (nat \1/x\ - 1) (cfrac_of_real_aux (frac (1/x))) else LNil)" + by (subst cfrac_of_real_aux.code) auto + + +lemma cfrac_of_real_aux_LNil [simp]: "x \ {0<..<1} \ cfrac_of_real_aux x = LNil" + by (subst cfrac_of_real_aux.code) auto + +lemma cfrac_of_real_aux_0 [simp]: "cfrac_of_real_aux 0 = LNil" + by (subst cfrac_of_real_aux.code) auto + +lemma cfrac_of_real_aux_eq_LNil_iff [simp]: "cfrac_of_real_aux x = LNil \ x \ {0<..<1}" + by (subst cfrac_of_real_aux.code) auto + +lemma lnth_cfrac_of_real_aux: + assumes "n < llength (cfrac_of_real_aux x)" + shows "lnth (cfrac_of_real_aux x) (Suc n) = lnth (cfrac_of_real_aux (frac (1/x))) n" + using assms + apply (induction n arbitrary: x) + apply (subst cfrac_of_real_aux.code) + apply auto [] + apply (subst cfrac_of_real_aux.code) + apply (auto) + done + +lift_definition cfrac_of_real :: "real \ cfrac" is + "\x. (\x\, cfrac_of_real_aux (frac x))" . + +lemma cfrac_of_real_code [code]: "cfrac_of_real x = CFrac \x\ (cfrac_of_real_aux (frac x))" + by (simp add: cfrac_of_real_def) + +lemma eq_epred_iff: "m = epred n \ m = 0 \ n = 0 \ n = eSuc m" + by (cases m; cases n) (auto simp: enat_0_iff enat_eSuc_iff infinity_eq_eSuc_iff) + +lemma epred_eq_iff: "epred n = m \ m = 0 \ n = 0 \ n = eSuc m" + by (cases m; cases n) (auto simp: enat_0_iff enat_eSuc_iff infinity_eq_eSuc_iff) + +lemma epred_less: "n > 0 \ n \ \ \ epred n < n" + by (cases n) (auto simp: enat_0_iff) + +lemma cfrac_nth_of_real_0 [simp]: + "cfrac_nth (cfrac_of_real x) 0 = \x\" + by transfer auto + +lemma frac_eq_0 [simp]: "x \ \ \ frac x = 0" + by simp + +lemma cfrac_tl_of_real: + assumes "x \ \" + shows "cfrac_tl (cfrac_of_real x) = cfrac_of_real (1 / frac x)" + using assms +proof (transfer, goal_cases) + case (1 x) + hence "int (nat \1 / frac x\ - Suc 0) + 1 = \1 / frac x\" + by (subst of_nat_diff) (auto simp: le_nat_iff frac_le_1) + with \x \ \\ show ?case + by (subst cfrac_of_real_aux.code) (auto split: llist.splits simp: frac_lt_1) +qed + +lemma cfrac_nth_of_real_Suc: + assumes "x \ \" + shows "cfrac_nth (cfrac_of_real x) (Suc n) = cfrac_nth (cfrac_of_real (1 / frac x)) n" +proof - + have "cfrac_nth (cfrac_of_real x) (Suc n) = + cfrac_nth (cfrac_tl (cfrac_of_real x)) n" + by simp + also have "cfrac_tl (cfrac_of_real x) = cfrac_of_real (1 / frac x)" + by (simp add: cfrac_tl_of_real assms) + finally show ?thesis . +qed + + +fun conv :: "cfrac \ nat \ real" where + "conv c 0 = real_of_int (cfrac_nth c 0)" +| "conv c (Suc n) = real_of_int (cfrac_nth c 0) + 1 / conv (cfrac_tl c) n" + + +text \ + The numerator and denominator of a convergent: +\ +fun conv_num :: "cfrac \ nat \ int" where + "conv_num c 0 = cfrac_nth c 0" +| "conv_num c (Suc 0) = cfrac_nth c 1 * cfrac_nth c 0 + 1" +| "conv_num c (Suc (Suc n)) = cfrac_nth c (Suc (Suc n)) * conv_num c (Suc n) + conv_num c n" + +fun conv_denom :: "cfrac \ nat \ int" where + "conv_denom c 0 = 1" +| "conv_denom c (Suc 0) = cfrac_nth c 1" +| "conv_denom c (Suc (Suc n)) = cfrac_nth c (Suc (Suc n)) * conv_denom c (Suc n) + conv_denom c n" + +lemma conv_num_rec: + "n \ 2 \ conv_num c n = cfrac_nth c n * conv_num c (n - 1) + conv_num c (n - 2)" + by (cases n; cases "n - 1") auto + +lemma conv_denom_rec: + "n \ 2 \ conv_denom c n = cfrac_nth c n * conv_denom c (n - 1) + conv_denom c (n - 2)" + by (cases n; cases "n - 1") auto + + +fun conv' :: "cfrac \ nat \ real \ real" where + "conv' c 0 z = z" +| "conv' c (Suc n) z = conv' c n (real_of_int (cfrac_nth c n) + 1 / z)" + +text \ + Occasionally, it can be useful to extend the domain of @{const conv_num} and @{const conv_denom} + to \-1\ and \-2\. +\ +definition conv_num_int :: "cfrac \ int \ int" where + "conv_num_int c n = (if n = -1 then 1 else if n < 0 then 0 else conv_num c (nat n))" + +definition conv_denom_int :: "cfrac \ int \ int" where + "conv_denom_int c n = (if n = -2 then 1 else if n < 0 then 0 else conv_denom c (nat n))" + +lemma conv_num_int_rec: + assumes "n \ 0" + shows "conv_num_int c n = cfrac_nth c (nat n) * conv_num_int c (n - 1) + conv_num_int c (n - 2)" +proof (cases "n \ 2") + case True + define n' where "n' = nat (n - 2)" + have n: "n = int (Suc (Suc n'))" + using True by (simp add: n'_def) + show ?thesis + by (simp add: n conv_num_int_def nat_add_distrib) +qed (use assms in \auto simp: conv_num_int_def\) + +lemma conv_denom_int_rec: + assumes "n \ 0" + shows "conv_denom_int c n = cfrac_nth c (nat n) * conv_denom_int c (n - 1) + conv_denom_int c (n - 2)" +proof - + consider "n = 0" | "n = 1" | "n \ 2" + using assms by force + thus ?thesis + proof cases + assume "n \ 2" + define n' where "n' = nat (n - 2)" + have n: "n = int (Suc (Suc n'))" + using \n \ 2\ by (simp add: n'_def) + show ?thesis + by (simp add: n conv_denom_int_def nat_add_distrib) + qed (use assms in \auto simp: conv_denom_int_def\) +qed + +text \ + The number \[a\<^sub>0; a\<^sub>1, a\<^sub>2, \]\ that the infinite continued fraction converges to: +\ +definition cfrac_lim :: "cfrac \ real" where + "cfrac_lim c = + (case cfrac_length c of \ \ lim (conv c) | enat l \ conv c l)" + +lemma cfrac_lim_code [code]: + "cfrac_lim c = + (case cfrac_length c of enat l \ conv c l + | _ \ Code.abort (STR ''Cannot compute infinite continued fraction'') (\_. cfrac_lim c))" + by (simp add: cfrac_lim_def split: enat.splits) + +definition cfrac_remainder where "cfrac_remainder c n = cfrac_lim (cfrac_drop n c)" + +lemmas conv'_Suc_right = conv'.simps(2) + +lemma conv'_Suc_left: + assumes "z > 0" + shows "conv' c (Suc n) z = + real_of_int (cfrac_nth c 0) + 1 / conv' (cfrac_tl c) n z" + using assms +proof (induction n arbitrary: z) + case (Suc n z) + have "conv' c (Suc (Suc n)) z = + conv' c (Suc n) (real_of_int (cfrac_nth c (Suc n)) + 1 / z)" + by simp + also have "\ = cfrac_nth c 0 + 1 / conv' (cfrac_tl c) (Suc n) z" + using Suc.prems by (subst Suc.IH) (auto intro!: add_nonneg_pos cfrac_nth_nonneg) + finally show ?case . +qed simp_all + +lemmas [simp del] = conv'.simps(2) + +lemma conv'_left_induct: + assumes "\c. P c 0 z" "\c n. P (cfrac_tl c) n z \ P c (Suc n) z" + shows "P c n z" + using assms by (rule conv.induct) + +lemma enat_less_diff_conv [simp]: + assumes "a = \ \ b < \ \ c < \" + shows "a < c - (b :: enat) \ a + b < c" + using assms by (cases a; cases b; cases c) auto + +lemma conv_eq_conv': "conv c n = conv' c n (cfrac_nth c n)" +proof (cases "n = 0") + case False + hence "cfrac_nth c n > 0" by (auto intro!: cfrac_nth_pos) + thus ?thesis + by (induction c n rule: conv.induct) (simp_all add: conv'_Suc_left) +qed simp_all + +lemma conv_num_pos': + assumes "cfrac_nth c 0 > 0" + shows "conv_num c n > 0" + using assms by (induction n rule: fib.induct) (auto simp: intro!: add_pos_nonneg) + +lemma conv_num_nonneg: "cfrac_nth c 0 \ 0 \ conv_num c n \ 0" + by (induction c n rule: conv_num.induct) + (auto simp: intro!: mult_nonneg_nonneg add_nonneg_nonneg + intro: cfrac_nth_nonneg) + +lemma conv_num_pos: + "cfrac_nth c 0 \ 0 \ n > 0 \ conv_num c n > 0" + by (induction c n rule: conv_num.induct) + (auto intro!: mult_pos_pos mult_nonneg_nonneg add_pos_nonneg conv_num_nonneg cfrac_nth_pos + intro: cfrac_nth_nonneg simp: enat_le_iff) + +lemma conv_denom_pos [simp, intro]: "conv_denom c n > 0" + by (induction c n rule: conv_num.induct) + (auto intro!: add_nonneg_pos mult_nonneg_nonneg cfrac_nth_nonneg + simp: enat_le_iff) + +lemma conv_denom_not_nonpos [simp]: "\conv_denom c n \ 0" + using conv_denom_pos[of c n] by linarith + +lemma conv_denom_not_neg [simp]: "\conv_denom c n < 0" + using conv_denom_pos[of c n] by linarith + +lemma conv_denom_nonzero [simp]: "conv_denom c n \ 0" + using conv_denom_pos[of c n] by linarith + +lemma conv_denom_nonneg [simp, intro]: "conv_denom c n \ 0" + using conv_denom_pos[of c n] by linarith + +lemma conv_num_int_neg1 [simp]: "conv_num_int c (-1) = 1" + by (simp add: conv_num_int_def) + +lemma conv_num_int_neg [simp]: "n < 0 \ n \ -1 \ conv_num_int c n = 0" + by (simp add: conv_num_int_def) + +lemma conv_num_int_of_nat [simp]: "conv_num_int c (int n) = conv_num c n" + by (simp add: conv_num_int_def) + +lemma conv_num_int_nonneg [simp]: "n \ 0 \ conv_num_int c n = conv_num c (nat n)" + by (simp add: conv_num_int_def) + +lemma conv_denom_int_neg2 [simp]: "conv_denom_int c (-2) = 1" + by (simp add: conv_denom_int_def) + +lemma conv_denom_int_neg [simp]: "n < 0 \ n \ -2 \ conv_denom_int c n = 0" + by (simp add: conv_denom_int_def) + +lemma conv_denom_int_of_nat [simp]: "conv_denom_int c (int n) = conv_denom c n" + by (simp add: conv_denom_int_def) + +lemma conv_denom_int_nonneg [simp]: "n \ 0 \ conv_denom_int c n = conv_denom c (nat n)" + by (simp add: conv_denom_int_def) + +lemmas conv_Suc [simp del] = conv.simps(2) + + +lemma conv'_gt_1: + assumes "cfrac_nth c 0 > 0" "x > 1" + shows "conv' c n x > 1" + using assms +proof (induction n arbitrary: c x) + case (Suc n c x) + from Suc.prems have pos: "cfrac_nth c n > 0" using cfrac_nth_pos[of n c] + by (cases "n = 0") (auto simp: enat_le_iff) + have "1 < 1 + 1 / x" + using Suc.prems by simp + also have "\ \ cfrac_nth c n + 1 / x" using pos + by (intro add_right_mono) (auto simp: of_nat_ge_1_iff) + finally show ?case + by (subst conv'_Suc_right, intro Suc.IH) + (use Suc.prems in \auto simp: enat_le_iff\) +qed auto + +lemma enat_eq_iff: "a = enat b \ (\a'. a = enat a' \ a' = b)" + by (cases a) auto + +lemma eq_enat_iff: "enat a = b \ (\b'. b = enat b' \ a = b')" + by (cases b) auto + +lemma enat_diff_one [simp]: "enat a - 1 = enat (a - 1)" + by (cases "enat (a - 1)") (auto simp flip: idiff_enat_enat) + +lemma conv'_eqD: + assumes "conv' c n x = conv' c' n x" "x > 1" "m < n" + shows "cfrac_nth c m = cfrac_nth c' m" + using assms +proof (induction n arbitrary: m c c') + case (Suc n m c c') + have gt: "conv' (cfrac_tl c) n x > 1" "conv' (cfrac_tl c') n x > 1" + by (rule conv'_gt_1; + use Suc.prems in \force intro: cfrac_nth_pos simp: enat_le_iff\)+ + have eq: "cfrac_nth c 0 + 1 / conv' (cfrac_tl c) n x = + cfrac_nth c' 0 + 1 / conv' (cfrac_tl c') n x" + using Suc.prems by (subst (asm) (1 2) conv'_Suc_left) auto + hence "\cfrac_nth c 0 + 1 / conv' (cfrac_tl c) n x\ = + \cfrac_nth c' 0 + 1 / conv' (cfrac_tl c') n x\" + by (simp only: ) + also from gt have "floor (cfrac_nth c 0 + 1 / conv' (cfrac_tl c) n x) = cfrac_nth c 0" + by (intro floor_unique) auto + also from gt have "floor (cfrac_nth c' 0 + 1 / conv' (cfrac_tl c') n x) = cfrac_nth c' 0" + by (intro floor_unique) auto + finally have [simp]: "cfrac_nth c 0 = cfrac_nth c' 0" by simp + + show ?case + proof (cases m) + case (Suc m') + from eq and gt have "conv' (cfrac_tl c) n x = conv' (cfrac_tl c') n x" + by simp + hence "cfrac_nth (cfrac_tl c) m' = cfrac_nth (cfrac_tl c') m'" + using Suc.prems + by (intro Suc.IH[of "cfrac_tl c" "cfrac_tl c'"]) (auto simp: o_def Suc enat_le_iff) + with Suc show ?thesis by simp + qed simp_all +qed simp_all + +context + fixes c :: cfrac and h k + defines "h \ conv_num c" and "k \ conv_denom c" +begin + +lemma conv'_num_denom_aux: + assumes z: "z > 0" + shows "conv' c (Suc (Suc n)) z * (z * k (Suc n) + k n) = + (z * h (Suc n) + h n)" + using z +proof (induction n arbitrary: z) + case 0 + hence "1 + z * cfrac_nth c 1 > 0" + by (intro add_pos_nonneg) (auto simp: cfrac_nth_nonneg) + with 0 show ?case + by (auto simp add: h_def k_def field_simps conv'_Suc_right max_def not_le) +next + case (Suc n) + have [simp]: "h (Suc (Suc n)) = cfrac_nth c (n+2) * h (n+1) + h n" + by (simp add: h_def) + have [simp]: "k (Suc (Suc n)) = cfrac_nth c (n+2) * k (n+1) + k n" + by (simp add: k_def) + define z' where "z' = cfrac_nth c (n+2) + 1 / z" + from \z > 0\ have "z' > 0" + by (auto simp: z'_def intro!: add_nonneg_pos cfrac_nth_nonneg) + + have "z * real_of_int (h (Suc (Suc n))) + real_of_int (h (Suc n)) = + z * (z' * h (Suc n) + h n)" + using \z > 0\ by (simp add: algebra_simps z'_def) + also have "\ = z * (conv' c (Suc (Suc n)) z' * (z' * k (Suc n) + k n))" + using \z' > 0\ by (subst Suc.IH [symmetric]) auto + also have "\ = conv' c (Suc (Suc (Suc n))) z * + (z * k (Suc (Suc n)) + k (Suc n))" + unfolding z'_def using \z > 0\ + by (subst (2) conv'_Suc_right) (simp add: algebra_simps) + finally show ?case .. +qed + +lemma conv'_num_denom: + assumes "z > 0" + shows "conv' c (Suc (Suc n)) z = + (z * h (Suc n) + h n) / (z * k (Suc n) + k n)" +proof - + have "z * real_of_int (k (Suc n)) + real_of_int (k n) > 0" + using assms by (intro add_pos_nonneg mult_pos_pos) (auto simp: k_def) + with conv'_num_denom_aux[of z n] assms show ?thesis + by (simp add: divide_simps) +qed + +lemma conv_num_denom: "conv c n = h n / k n" +proof - + consider "n = 0" | "n = Suc 0" | m where "n = Suc (Suc m)" + using not0_implies_Suc by blast + thus ?thesis + proof cases + assume "n = Suc 0" + thus ?thesis + by (auto simp: h_def k_def field_simps max_def conv_Suc) + next + fix m assume [simp]: "n = Suc (Suc m)" + have "conv c n = conv' c (Suc (Suc m)) (cfrac_nth c (Suc (Suc m)))" + by (subst conv_eq_conv') simp_all + also have "\ = h n / k n" + by (subst conv'_num_denom) (simp_all add: h_def k_def) + finally show ?thesis . + qed (auto simp: h_def k_def) +qed + +lemma conv'_num_denom': + assumes "z > 0" and "n \ 2" + shows "conv' c n z = (z * h (n - 1) + h (n - 2)) / (z * k (n - 1) + k (n - 2))" + using assms conv'_num_denom[of z "n - 2"] + by (auto simp: eval_nat_numeral Suc_diff_Suc) + +lemma conv'_num_denom_int: + assumes "z > 0" + shows "conv' c n z = + (z * conv_num_int c (int n - 1) + conv_num_int c (int n - 2)) / + (z * conv_denom_int c (int n - 1) + conv_denom_int c (int n - 2))" +proof - + consider "n = 0" | "n = 1" | "n \ 2" by force + thus ?thesis + proof cases + case 1 + thus ?thesis using conv_num_int_neg1 by auto + next + case 2 + thus ?thesis using assms by (auto simp: conv'_Suc_right field_simps) + next + case 3 + thus ?thesis using conv'_num_denom'[OF assms(1), of "nat n"] + by (auto simp: nat_diff_distrib h_def k_def) + qed +qed + +lemma conv_nonneg: "cfrac_nth c 0 \ 0 \ conv c n \ 0" + by (subst conv_num_denom) + (auto intro!: divide_nonneg_nonneg conv_num_nonneg simp: h_def k_def) + +lemma conv_pos: + assumes "cfrac_nth c 0 > 0" + shows "conv c n > 0" +proof - + have "conv c n = h n / k n" + using assms by (intro conv_num_denom) + also from assms have "\ > 0" unfolding h_def k_def + by (intro divide_pos_pos) (auto intro!: conv_num_pos') + finally show ?thesis . +qed + +lemma conv_num_denom_prod_diff: + "k n * h (Suc n) - k (Suc n) * h n = (-1) ^ n" + by (induction c n rule: conv_num.induct) + (auto simp: k_def h_def algebra_simps) + +lemma conv_num_denom_prod_diff': + "k (Suc n) * h n - k n * h (Suc n) = (-1) ^ Suc n" + by (induction c n rule: conv_num.induct) + (auto simp: k_def h_def algebra_simps) + +lemma + fixes n :: int + assumes "n \ -2" + shows conv_num_denom_int_prod_diff: + "conv_denom_int c n * conv_num_int c (n + 1) - + conv_denom_int c (n + 1) * conv_num_int c n = (-1) ^ (nat (n + 2))" (is ?th1) + and conv_num_denom_int_prod_diff': + "conv_denom_int c (n + 1) * conv_num_int c n - + conv_denom_int c n * conv_num_int c (n + 1) = (-1) ^ (nat (n + 3))" (is ?th2) +proof - + from assms consider "n = -2" | "n = -1" | "n \ 0" by force + thus ?th1 using conv_num_denom_prod_diff[of "nat n"] + by cases (auto simp: h_def k_def nat_add_distrib) + moreover from assms have "nat (n + 3) = Suc (nat (n + 2))" by (simp add: nat_add_distrib) + ultimately show ?th2 by simp +qed + +lemma coprime_conv_num_denom: "coprime (h n) (k n)" +proof (cases n) + case [simp]: (Suc m) + { + fix d :: int + assume "d dvd h n" and "d dvd k n" + hence "abs d dvd abs (k n * h (Suc n) - k (Suc n) * h n)" + by simp + also have "\ = 1" + by (subst conv_num_denom_prod_diff) auto + finally have "is_unit d" by simp + } + thus ?thesis by (rule coprimeI) +qed (auto simp: h_def k_def) + +lemma coprime_conv_num_denom_int: + assumes "n \ -2" + shows "coprime (conv_num_int c n) (conv_denom_int c n)" +proof - + from assms consider "n = -2" | "n = -1" | "n \ 0" by force + thus ?thesis by cases (insert coprime_conv_num_denom[of "nat n"], auto simp: h_def k_def) +qed + +lemma mono_conv_num: + assumes "cfrac_nth c 0 \ 0" + shows "mono h" +proof (rule incseq_SucI) + show "h n \ h (Suc n)" for n + proof (cases n) + case 0 + have "1 * cfrac_nth c 0 + 1 \ cfrac_nth c (Suc 0) * cfrac_nth c 0 + 1" + using assms by (intro add_mono mult_right_mono) auto + thus ?thesis using assms by (simp add: le_Suc_eq Suc_le_eq h_def 0) + next + case (Suc m) + have "1 * h (Suc m) + 0 \ cfrac_nth c (Suc (Suc m)) * h (Suc m) + h m" + using assms + by (intro add_mono mult_right_mono) + (auto simp: Suc_le_eq h_def intro!: conv_num_nonneg) + with Suc show ?thesis by (simp add: h_def) + qed +qed + +lemma mono_conv_denom: "mono k" +proof (rule incseq_SucI) + show "k n \ k (Suc n)" for n + proof (cases n) + case 0 + thus ?thesis by (simp add: le_Suc_eq Suc_le_eq k_def) + next + case (Suc m) + have "1 * k (Suc m) + 0 \ cfrac_nth c (Suc (Suc m)) * k (Suc m) + k m" + by (intro add_mono mult_right_mono) (auto simp: Suc_le_eq k_def) + with Suc show ?thesis by (simp add: k_def) + qed +qed + +lemma conv_num_leI: "cfrac_nth c 0 \ 0 \ m \ n \ h m \ h n" + using mono_conv_num by (auto simp: mono_def) + +lemma conv_denom_leI: "m \ n \ k m \ k n" + using mono_conv_denom by (auto simp: mono_def) + +lemma conv_denom_lessI: + assumes "m < n" "1 < n" + shows "k m < k n" +proof (cases n) + case [simp]: (Suc n') + show ?thesis + proof (cases n') + case [simp]: (Suc n'') + from assms have "k m \ 1 * k n' + 0" + by (auto intro: conv_denom_leI simp: less_Suc_eq) + also have "\ \ cfrac_nth c n * k n' + 0" + using assms by (intro add_mono mult_mono) (auto simp: Suc_le_eq k_def) + also have "\ < cfrac_nth c n * k n' + k n''" unfolding k_def + by (intro add_strict_left_mono conv_denom_pos assms) + also have "\ = k n" by (simp add: k_def) + finally show ?thesis . + qed (insert assms, auto simp: k_def) +qed (insert assms, auto) + +lemma conv_num_lower_bound: + assumes "cfrac_nth c 0 \ 0" + shows "h n \ fib n" unfolding h_def + using assms +proof (induction c n rule: conv_denom.induct) + case (3 c n) + hence "conv_num c (Suc (Suc n)) \ 1 * int (fib (Suc n)) + int (fib n)" + using "3.prems" unfolding conv_num.simps + by (intro add_mono mult_mono "3.IH") auto + thus ?case by simp +qed auto + +lemma conv_denom_lower_bound: "k n \ fib (Suc n)" + unfolding k_def +proof (induction c n rule: conv_denom.induct) + case (3 c n) + hence "conv_denom c (Suc (Suc n)) \ 1 * int (fib (Suc (Suc n))) + int (fib (Suc n))" + using "3.prems" unfolding conv_denom.simps + by (intro add_mono mult_mono "3.IH") auto + thus ?case by simp +qed (auto simp: Suc_le_eq) + +lemma conv_diff_eq: "conv c (Suc n) - conv c n = (-1) ^ n / (k n * k (Suc n))" +proof - + have pos: "k n > 0" "k (Suc n) > 0" unfolding k_def + by (intro conv_denom_pos)+ + have "conv c (Suc n) - conv c n = + (k n * h (Suc n) - k (Suc n) * h n) / (k n * k (Suc n))" + using pos by (subst (1 2) conv_num_denom) (simp add: conv_num_denom field_simps) + also have "k n * h (Suc n) - k (Suc n) * h n = (-1) ^ n" + by (rule conv_num_denom_prod_diff) + finally show ?thesis by simp +qed + +lemma conv_telescope: + assumes "m \ n" + shows "conv c m + (\i=m..i=m..i=m.. = conv c n" + using assms by (induction rule: dec_induct) simp_all + finally show ?thesis . +qed + +lemma fib_at_top: "filterlim fib at_top at_top" +proof (rule filterlim_at_top_mono) + show "eventually (\n. fib n \ n - 1) at_top" + by (intro always_eventually fib_ge allI) + show "filterlim (\n::nat. n - 1) at_top at_top" + by (subst filterlim_sequentially_Suc [symmetric]) + (simp_all add: filterlim_ident) +qed + +lemma conv_denom_at_top: "filterlim k at_top at_top" +proof (rule filterlim_at_top_mono) + show "filterlim (\n. int (fib (Suc n))) at_top at_top" + by (rule filterlim_compose[OF filterlim_int_sequentially]) + (simp add: fib_at_top filterlim_sequentially_Suc) + show "eventually (\n. fib (Suc n) \ k n) at_top" + by (intro always_eventually conv_denom_lower_bound allI) +qed + +lemma + shows summable_conv_telescope: + "summable (\i. (-1) ^ i / (k i * k (Suc i)))" (is ?th1) + and cfrac_remainder_bounds: + "\(\i. (-1) ^ (i + m) / (k (i + m) * k (Suc i + m)))\ \ + {1/(k m * (k m + k (Suc m))) <..< 1 / (k m * k (Suc m))}" (is ?th2) +proof - + have [simp]: "k n > 0" "k n \ 0" "\k n = 0" for n + by (auto simp: k_def) + have k_rec: "k (Suc (Suc n)) = cfrac_nth c (Suc (Suc n)) * k (Suc n) + k n" for n + by (simp add: k_def) + have [simp]: "a + b = 0 \ a = 0 \ b = 0" if "a \ 0" "b \ 0" for a b :: real + using that by linarith + + define g where "g = (\i. inverse (real_of_int (k i * k (Suc i))))" + + { + fix m :: nat + have "filterlim (\n. k n) at_top at_top" and "filterlim (\n. k (Suc n)) at_top at_top" + by (force simp: filterlim_sequentially_Suc intro: conv_denom_at_top)+ + hence lim: "g \ 0" + unfolding g_def of_int_mult + by (intro tendsto_inverse_0_at_top filterlim_at_top_mult_at_top + filterlim_compose[OF filterlim_real_of_int_at_top]) + from lim have A: "summable (\n. (-1) ^ (n + m) * g (n + m))" unfolding g_def + by (intro summable_alternating_decreasing) + (auto intro!: conv_denom_leI mult_nonneg_nonneg) + + have "1 / (k m * (real_of_int (k (Suc m)) + k m / 1)) \ + 1 / (k m * (k (Suc m) + k m / cfrac_nth c (m+2)))" + by (intro divide_left_mono mult_left_mono add_left_mono mult_pos_pos add_pos_pos divide_pos_pos) + (auto simp: of_nat_ge_1_iff) + also have "\ = g m - g (Suc m)" + by (simp add: g_def k_rec field_simps add_pos_pos) + finally have le: "1 / (k m * (real_of_int (k (Suc m)) + k m / 1)) \ g m - g (Suc m)" by simp + have *: "\(\i. (-1) ^ (i + m) * g (i + m))\ \ {g m - g (Suc m) <..< g m}" + using lim unfolding g_def + by (intro abs_alternating_decreasing_suminf_strict) (auto intro!: conv_denom_lessI) + also from le have "\ \ {1 / (k m * (k (Suc m) + k m)) <..< g m}" + by (subst greaterThanLessThan_subseteq_greaterThanLessThan) auto + finally have B: "\\i. (- 1) ^ (i + m) * g (i + m)\ \ \" . + note A B + } note AB = this + + from AB(1)[of 0] show ?th1 by (simp add: field_simps g_def) + from AB(2)[of m] show ?th2 by (simp add: g_def divide_inverse add_ac) +qed + +lemma convergent_conv: "convergent (conv c)" +proof - + have "convergent (\n. conv c 0 + (\i = conv c" + by (rule ext, subst (2) conv_telescope [of 0, symmetric]) (simp_all add: atLeast0LessThan) + finally show ?thesis . +qed + +lemma LIMSEQ_cfrac_lim: "cfrac_length c = \ \ conv c \ cfrac_lim c" + using convergent_conv by (auto simp: convergent_LIMSEQ_iff cfrac_lim_def) + +lemma cfrac_lim_nonneg: + assumes "cfrac_nth c 0 \ 0" + shows "cfrac_lim c \ 0" +proof (cases "cfrac_length c") + case infinity + have "conv c \ cfrac_lim c" + by (rule LIMSEQ_cfrac_lim) fact + thus ?thesis + by (rule tendsto_lowerbound) + (auto intro!: conv_nonneg always_eventually assms) +next + case (enat l) + thus ?thesis using assms + by (auto simp: cfrac_lim_def conv_nonneg) +qed + +lemma sums_cfrac_lim_minus_conv: + assumes "cfrac_length c = \" + shows "(\i. (-1) ^ (i + m) / (k (i + m) * k (Suc i + m))) sums (cfrac_lim c - conv c m)" +proof - + have "(\n. conv c (n + m) - conv c m) \ cfrac_lim c - conv c m" + by (auto intro!: tendsto_diff LIMSEQ_cfrac_lim simp: filterlim_sequentially_shift assms) + also have "(\n. conv c (n + m) - conv c m) = + (\n. (\i=0 + m.. = (\n. (\i cfrac_length c" + shows "\cfrac_lim c - conv c m\ \ 1 / (k m * k (Suc m))" +proof (cases "cfrac_length c") + case infinity + have "cfrac_lim c - conv c m = (\i. (-1) ^ (i + m) / (k (i + m) * k (Suc i + m)))" + using sums_cfrac_lim_minus_conv infinity by (simp add: sums_iff) + also note cfrac_remainder_bounds[of m] + finally show ?thesis by simp +next + case [simp]: (enat l) + show ?thesis + proof (cases "l = m") + case True + thus ?thesis by (auto simp: cfrac_lim_def k_def) + next + case False + let ?S = "(\i=m.. 0" "k n > 0" for n + by (simp_all add: k_def) + hence "cfrac_lim c - conv c m = conv c l - conv c m" + by (simp add: cfrac_lim_def) + also have "\ = ?S" + using assms by (subst conv_telescope [symmetric, of m]) auto + finally have "cfrac_lim c - conv c m = ?S" . + moreover have "\?S\ \ 1 / real_of_int (k m * k (Suc m))" + unfolding of_int_mult using assms False + by (intro abs_alternating_decreasing_sum_upper_bound' divide_nonneg_nonneg frac_le mult_mono) + (simp_all add: conv_denom_leI del: conv_denom.simps) + ultimately show ?thesis by simp + qed +qed + +lemma cfrac_lim_minus_conv_lower_bound: + assumes "m < cfrac_length c" + shows "\cfrac_lim c - conv c m\ \ 1 / (k m * (k m + k (Suc m)))" +proof (cases "cfrac_length c") + case infinity + have "cfrac_lim c - conv c m = (\i. (-1) ^ (i + m) / (k (i + m) * k (Suc i + m)))" + using sums_cfrac_lim_minus_conv infinity by (simp add: sums_iff) + also note cfrac_remainder_bounds[of m] + finally show ?thesis by simp +next + case [simp]: (enat l) + let ?S = "(\i=m.. 0" "k n > 0" for n + by (simp_all add: k_def) + hence "cfrac_lim c - conv c m = conv c l - conv c m" + by (simp add: cfrac_lim_def) + also have "\ = ?S" + using assms by (subst conv_telescope [symmetric, of m]) (auto simp: split: enat.splits) + finally have "cfrac_lim c - conv c m = ?S" . + + moreover have "\?S\ \ 1 / (k m * (k m + k (Suc m)))" + proof (cases "m < cfrac_length c - 1") + case False + hence [simp]: "m = l - 1" and "l > 0" using assms + by (auto simp: not_less) + have "1 / (k m * (k m + k (Suc m))) \ 1 / (k m * k (Suc m))" + unfolding of_int_mult + by (intro divide_left_mono mult_mono mult_pos_pos) (auto intro!: add_pos_pos) + also from \l > 0\ have "{m..?S\" + by simp + finally show ?thesis . + next + case True + with assms have less: "m < l - 1" + by auto + have "k m + k (Suc m) > 0" + by (intro add_pos_pos) (auto simp: k_def) + hence "1 / (k m * (k m + k (Suc m))) \ 1 / (k m * k (Suc m)) - 1 / (k (Suc m) * k (Suc (Suc m)))" + by (simp add: divide_simps) (auto simp: k_def algebra_simps) + also have "\ \ \?S\" + unfolding of_int_mult using less + by (intro abs_alternating_decreasing_sum_lower_bound' divide_nonneg_nonneg frac_le mult_mono) + (simp_all add: conv_denom_leI del: conv_denom.simps) + finally show ?thesis . + qed + ultimately show ?thesis by simp +qed + +lemma cfrac_lim_minus_conv_bounds: + assumes "m < cfrac_length c" + shows "\cfrac_lim c - conv c m\ \ {1 / (k m * (k m + k (Suc m)))..1 / (k m * k (Suc m))}" + using cfrac_lim_minus_conv_lower_bound[of m] cfrac_lim_minus_conv_upper_bound[of m] assms + by auto + +end + + +lemma conv_pos': + assumes "n > 0" "cfrac_nth c 0 \ 0" + shows "conv c n > 0" + using assms by (cases n) (auto simp: conv_Suc intro!: add_nonneg_pos conv_pos) + +lemma conv_in_Rats [intro]: "conv c n \ \" + by (induction c n rule: conv.induct) (auto simp: conv_Suc o_def) + +lemma + assumes "0 < z1" "z1 \ z2" + shows conv'_even_mono: "even n \ conv' c n z1 \ conv' c n z2" + and conv'_odd_mono: "odd n \ conv' c n z1 \ conv' c n z2" +proof - + let ?P = "(\n (f::nat\real\real). + if even n then f n z1 \ f n z2 else f n z1 \ f n z2)" + have "?P n (conv' c)" using assms + proof (induction n arbitrary: z1 z2) + case (Suc n) + note z12 = Suc.prems + consider "n = 0" | "even n" "n > 0" | "odd n" by force + thus ?case + proof cases + assume "n = 0" + thus ?thesis using Suc by (simp add: conv'_Suc_right field_simps) + next + assume n: "even n" "n > 0" + with Suc.IH have IH: "conv' c n z1 \ conv' c n z2" + if "0 < z1" "z1 \ z2" for z1 z2 using that by auto + show ?thesis using Suc.prems n z12 + by (auto simp: conv'_Suc_right field_simps intro!: IH add_pos_nonneg mult_nonneg_nonneg) + next + assume n: "odd n" + hence [simp]: "n > 0" by (auto intro!: Nat.gr0I) + from n and Suc.IH have IH: "conv' c n z1 \ conv' c n z2" + if "0 < z1" "z1 \ z2" for z1 z2 using that by auto + show ?thesis using Suc.prems n + by (auto simp: conv'_Suc_right field_simps + intro!: IH add_pos_nonneg mult_nonneg_nonneg) + qed + qed auto + thus "even n \ conv' c n z1 \ conv' c n z2" + "odd n \ conv' c n z1 \ conv' c n z2" by auto +qed + +lemma + shows conv_even_mono: "even n \ n \ m \ conv c n \ conv c m" + and conv_odd_mono: "odd n \ n \ m \ conv c n \ conv c m" +proof - + assume "even n" + have A: "conv c n \ conv c (Suc (Suc n))" if "even n" for n + proof (cases "n = 0") + case False + with \even n\ show ?thesis + by (auto simp add: conv_eq_conv' conv'_Suc_right intro: conv'_even_mono) + qed (auto simp: conv_Suc) + + have B: "conv c n \ conv c (Suc n)" if "even n" for n + proof (cases "n = 0") + case False + with \even n\ show ?thesis + by (auto simp add: conv_eq_conv' conv'_Suc_right intro: conv'_even_mono) + qed (auto simp: conv_Suc) + + show "conv c n \ conv c m" if "n \ m" for m + using that + proof (induction m rule: less_induct) + case (less m) + from \n \ m\ consider "m = n" | "even m" "m > n" | "odd m" "m > n" + by force + thus ?case + proof cases + assume m: "even m" "m > n" + with \even n\ have m': "m - 2 \ n" by presburger + with m have "conv c n \ conv c (m - 2)" + by (intro less.IH) auto + also have "\ \ conv c (Suc (Suc (m - 2)))" + using m m' by (intro A) auto + also have "Suc (Suc (m - 2)) = m" + using m by presburger + finally show ?thesis . + next + assume m: "odd m" "m > n" + hence "conv c n \ conv c (m - 1)" + by (intro less.IH) auto + also have "\ \ conv c (Suc (m - 1))" + using m by (intro B) auto + also have "Suc (m - 1) = m" + using m by simp + finally show ?thesis . + qed simp_all + qed +next + assume "odd n" + have A: "conv c n \ conv c (Suc (Suc n))" if "odd n" for n + using that + by (auto simp add: conv_eq_conv' conv'_Suc_right odd_pos intro!: conv'_odd_mono) + have B: "conv c n \ conv c (Suc n)" if "odd n" for n using that + by (auto simp add: conv_eq_conv' conv'_Suc_right odd_pos intro!: conv'_odd_mono) + + show "conv c n \ conv c m" if "n \ m" for m + using that + proof (induction m rule: less_induct) + case (less m) + from \n \ m\ consider "m = n" | "even m" "m > n" | "odd m" "m > n" + by force + thus ?case + proof cases + assume m: "odd m" "m > n" + with \odd n\ have m': "m - 2 \ n" "m \ 2" by presburger+ + from m and \odd n\ have "m = Suc (Suc (m - 2))" by presburger + also have "conv c \ \ conv c (m - 2)" + using m m' by (intro A) auto + also have "\ \ conv c n" + using m m' by (intro less.IH) auto + finally show ?thesis . + next + assume m: "even m" "m > n" + from m have "m = Suc (m - 1)" by presburger + also have "conv c \ \ conv c (m - 1)" + using m by (intro B) auto + also have "\ \ conv c n" + using m by (intro less.IH) auto + finally show ?thesis . + qed simp_all + qed +qed + +lemma + assumes "m \ cfrac_length c" + shows conv_le_cfrac_lim: "even m \ conv c m \ cfrac_lim c" + and conv_ge_cfrac_lim: "odd m \ conv c m \ cfrac_lim c" +proof - + have "if even m then conv c m \ cfrac_lim c else conv c m \ cfrac_lim c" + proof (cases "cfrac_length c") + case [simp]: infinity + show ?thesis + proof (cases "even m") + case True + have "eventually (\i. conv c m \ conv c i) at_top" + using eventually_ge_at_top[of m] by eventually_elim (rule conv_even_mono[OF True]) + hence "conv c m \ cfrac_lim c" + by (intro tendsto_lowerbound[OF LIMSEQ_cfrac_lim]) auto + thus ?thesis using True by simp + next + case False + have "eventually (\i. conv c m \ conv c i) at_top" + using eventually_ge_at_top[of m] by eventually_elim (rule conv_odd_mono[OF False]) + hence "conv c m \ cfrac_lim c" + by (intro tendsto_upperbound[OF LIMSEQ_cfrac_lim]) auto + thus ?thesis using False by simp + qed + next + case [simp]: (enat l) + show ?thesis + using conv_even_mono[of m l c] conv_odd_mono[of m l c] assms + by (auto simp: cfrac_lim_def) + qed + thus "even m \ conv c m \ cfrac_lim c" and "odd m \ conv c m \ cfrac_lim c" + by auto +qed + +lemma cfrac_lim_ge_first: "cfrac_lim c \ cfrac_nth c 0" + using conv_le_cfrac_lim[of 0 c] by (auto simp: less_eq_enat_def split: enat.splits) + +lemma cfrac_lim_pos: "cfrac_nth c 0 > 0 \ cfrac_lim c > 0" + by (rule less_le_trans[OF _ cfrac_lim_ge_first]) auto + +lemma conv'_eq_iff: + assumes "0 \ z1 \ 0 \ z2" + shows "conv' c n z1 = conv' c n z2 \ z1 = z2" +proof + assume "conv' c n z1 = conv' c n z2" + thus "z1 = z2" using assms + proof (induction n arbitrary: z1 z2) + case (Suc n) + show ?case + proof (cases "n = 0") + case True + thus ?thesis using Suc by (auto simp: conv'_Suc_right) + next + case False + have "conv' c n (real_of_int (cfrac_nth c n) + 1 / z1) = + conv' c n (real_of_int (cfrac_nth c n) + 1 / z2)" using Suc.prems + by (simp add: conv'_Suc_right) + hence "real_of_int (cfrac_nth c n) + 1 / z1 = real_of_int (cfrac_nth c n) + 1 / z2" + by (rule Suc.IH) + (insert Suc.prems False, auto intro!: add_nonneg_pos add_nonneg_nonneg) + with Suc.prems show "z1 = z2" by simp + qed + qed auto +qed auto + +lemma conv_even_mono_strict: + assumes "even n" "n < m" + shows "conv c n < conv c m" +proof (cases "m = n + 1") + case [simp]: True + show ?thesis + proof (cases "n = 0") + case True + thus ?thesis using assms by (auto simp: conv_Suc) + next + case False + hence "conv' c n (real_of_int (cfrac_nth c n)) \ + conv' c n (real_of_int (cfrac_nth c n) + 1 / real_of_int (cfrac_nth c (Suc n)))" + by (subst conv'_eq_iff) auto + with assms have "conv c n \ conv c m" + by (auto simp: conv_eq_conv' conv'_eq_iff conv'_Suc_right field_simps) + moreover from assms have "conv c n \ conv c m" + by (intro conv_even_mono) auto + + ultimately show ?thesis by simp + qed +next + case False + show ?thesis + proof (cases "n = 0") + case True + thus ?thesis using assms + by (cases m) (auto simp: conv_Suc conv_pos) + next + case False + have "1 + real_of_int (cfrac_nth c (n+1)) * cfrac_nth c (n+2) > 0" + by (intro add_pos_nonneg) auto + with assms have "conv c n \ conv c (Suc (Suc n))" + unfolding conv_eq_conv' conv'_Suc_right using False + by (subst conv'_eq_iff) (auto simp: field_simps) + moreover from assms have "conv c n \ conv c (Suc (Suc n))" + by (intro conv_even_mono) auto + ultimately have "conv c n < conv c (Suc (Suc n))" by simp + also have "\ \ conv c m" using assms \m \ n + 1\ + by (intro conv_even_mono) auto + finally show ?thesis . + qed +qed + +lemma conv_odd_mono_strict: + assumes "odd n" "n < m" + shows "conv c n > conv c m" +proof (cases "m = n + 1") + case [simp]: True + from assms have "n > 0" by (intro Nat.gr0I) auto + hence "conv' c n (real_of_int (cfrac_nth c n)) \ + conv' c n (real_of_int (cfrac_nth c n) + 1 / real_of_int (cfrac_nth c (Suc n)))" + by (subst conv'_eq_iff) auto + hence "conv c n \ conv c m" + by (simp add: conv_eq_conv' conv'_Suc_right) + moreover from assms have "conv c n \ conv c m" + by (intro conv_odd_mono) auto + ultimately show ?thesis by simp +next + case False + from assms have "n > 0" by (intro Nat.gr0I) auto + have "1 + real_of_int (cfrac_nth c (n+1)) * cfrac_nth c (n+2) > 0" + by (intro add_pos_nonneg) auto + with assms \n > 0\ have "conv c n \ conv c (Suc (Suc n))" + unfolding conv_eq_conv' conv'_Suc_right + by (subst conv'_eq_iff) (auto simp: field_simps) + moreover from assms have "conv c n \ conv c (Suc (Suc n))" + by (intro conv_odd_mono) auto + ultimately have "conv c n > conv c (Suc (Suc n))" by simp + moreover have "conv c (Suc (Suc n)) \ conv c m" using assms False + by (intro conv_odd_mono) auto + ultimately show ?thesis by linarith +qed + +lemma conv_less_cfrac_lim: + assumes "even n" "n < cfrac_length c" + shows "conv c n < cfrac_lim c" +proof (cases "cfrac_length c") + case (enat l) + with assms show ?thesis by (auto simp: cfrac_lim_def conv_even_mono_strict) +next + case [simp]: infinity + from assms have "conv c n < conv c (n + 2)" + by (intro conv_even_mono_strict) auto + also from assms have "\ \ cfrac_lim c" + by (intro conv_le_cfrac_lim) auto + finally show ?thesis . +qed + +lemma conv_gt_cfrac_lim: + assumes "odd n" "n < cfrac_length c" + shows "conv c n > cfrac_lim c" +proof (cases "cfrac_length c") + case (enat l) + with assms show ?thesis by (auto simp: cfrac_lim_def conv_odd_mono_strict) +next + case [simp]: infinity + from assms have "cfrac_lim c \ conv c (n + 2)" + by (intro conv_ge_cfrac_lim) auto + also from assms have "\ < conv c n" + by (intro conv_odd_mono_strict) auto + finally show ?thesis . +qed + +lemma conv_neq_cfrac_lim: + assumes "n < cfrac_length c" + shows "conv c n \ cfrac_lim c" + using conv_gt_cfrac_lim[OF _ assms] conv_less_cfrac_lim[OF _ assms] + by (cases "even n") auto + +lemma conv_ge_first: "conv c n \ cfrac_nth c 0" + using conv_even_mono[of 0 n c] by simp + + +definition cfrac_is_zero :: "cfrac \ bool" where "cfrac_is_zero c \ c = 0" + +lemma cfrac_is_zero_code [code]: "cfrac_is_zero (CFrac n xs) \ lnull xs \ n = 0" + unfolding cfrac_is_zero_def lnull_def zero_cfrac_def cfrac_of_int_def + by (auto simp: cfrac_length_def) + + +definition cfrac_is_int where "cfrac_is_int c \ cfrac_length c = 0" + +lemma cfrac_is_int_code [code]: "cfrac_is_int (CFrac n xs) \ lnull xs" + unfolding cfrac_is_int_def lnull_def by (auto simp: cfrac_length_def) + +lemma cfrac_length_of_int [simp]: "cfrac_length (cfrac_of_int n) = 0" + by transfer auto + +lemma cfrac_is_int_of_int [simp, intro]: "cfrac_is_int (cfrac_of_int n)" + unfolding cfrac_is_int_def by simp + +lemma cfrac_is_int_iff: "cfrac_is_int c \ (\n. c = cfrac_of_int n)" +proof - + have "c = cfrac_of_int (cfrac_nth c 0)" if "cfrac_is_int c" + using that unfolding cfrac_is_int_def by transfer auto + thus ?thesis + by auto +qed + +lemma cfrac_lim_reduce: + assumes "\cfrac_is_int c" + shows "cfrac_lim c = cfrac_nth c 0 + 1 / cfrac_lim (cfrac_tl c)" +proof (cases "cfrac_length c") + case [simp]: infinity + have "0 < cfrac_nth (cfrac_tl c) 0" + by simp + also have "\ \ cfrac_lim (cfrac_tl c)" + by (rule cfrac_lim_ge_first) + finally have "(\n. real_of_int (cfrac_nth c 0) + 1 / conv (cfrac_tl c) n) \ + real_of_int (cfrac_nth c 0) + 1 / cfrac_lim (cfrac_tl c)" + by (intro tendsto_intros LIMSEQ_cfrac_lim) auto + also have "(\n. real_of_int (cfrac_nth c 0) + 1 / conv (cfrac_tl c) n) = conv c \ Suc" + by (simp add: o_def conv_Suc) + finally have *: "conv c \ real_of_int (cfrac_nth c 0) + 1 / cfrac_lim (cfrac_tl c)" + by (simp add: o_def filterlim_sequentially_Suc) + show ?thesis + by (rule tendsto_unique[OF _ LIMSEQ_cfrac_lim *]) auto +next + case [simp]: (enat l) + from assms obtain l' where [simp]: "l = Suc l'" + by (cases l) (auto simp: cfrac_is_int_def zero_enat_def) + thus ?thesis + by (auto simp: cfrac_lim_def conv_Suc) +qed + +lemma cfrac_lim_tl: + assumes "\cfrac_is_int c" + shows "cfrac_lim (cfrac_tl c) = 1 / (cfrac_lim c - cfrac_nth c 0)" + using cfrac_lim_reduce[OF assms] by simp + + + +lemma cfrac_remainder_Suc': + assumes "n < cfrac_length c" + shows "cfrac_remainder c (Suc n) * (cfrac_remainder c n - cfrac_nth c n) = 1" +proof - + have "0 < real_of_int (cfrac_nth c (Suc n))" by simp + also have "cfrac_nth c (Suc n) \ cfrac_remainder c (Suc n)" + using cfrac_lim_ge_first[of "cfrac_drop (Suc n) c"] + by (simp add: cfrac_remainder_def) + finally have "\ > 0" . + + have "cfrac_remainder c (Suc n) = cfrac_lim (cfrac_tl (cfrac_drop n c))" + by (simp add: o_def cfrac_remainder_def cfrac_drop_Suc_left) + also have "\ = 1 / (cfrac_remainder c n - cfrac_nth c n)" using assms + by (subst cfrac_lim_tl) (auto simp: cfrac_remainder_def cfrac_is_int_def enat_less_iff enat_0_iff) + finally show ?thesis + using \cfrac_remainder c (Suc n) > 0\ + by (auto simp add: cfrac_remainder_def field_simps) +qed + +lemma cfrac_remainder_Suc: + assumes "n < cfrac_length c" + shows "cfrac_remainder c (Suc n) = 1 / (cfrac_remainder c n - cfrac_nth c n)" +proof - + have "cfrac_remainder c (Suc n) = cfrac_lim (cfrac_tl (cfrac_drop n c))" + by (simp add: o_def cfrac_remainder_def cfrac_drop_Suc_left) + also have "\ = 1 / (cfrac_remainder c n - cfrac_nth c n)" using assms + by (subst cfrac_lim_tl) (auto simp: cfrac_remainder_def cfrac_is_int_def enat_less_iff enat_0_iff) + finally show ?thesis . +qed + +lemma cfrac_remainder_0 [simp]: "cfrac_remainder c 0 = cfrac_lim c" + by (simp add: cfrac_remainder_def) + +context + fixes c h k x + defines "h \ conv_num c" and "k \ conv_denom c" and "x \ cfrac_remainder c" +begin + +lemma cfrac_lim_eq_num_denom_remainder_aux: + assumes "Suc (Suc n) \ cfrac_length c" + shows "cfrac_lim c * (k (Suc n) * x (Suc (Suc n)) + k n) = h (Suc n) * x (Suc (Suc n)) + h n" + using assms +proof (induction n) + case 0 + have "cfrac_lim c \ cfrac_nth c 0" + using conv_neq_cfrac_lim[of 0 c] 0 by (auto simp: enat_le_iff) + moreover have "cfrac_nth c 1 * (cfrac_lim c - cfrac_nth c 0) \ 1" + using conv_neq_cfrac_lim[of 1 c] 0 + by (auto simp: enat_le_iff conv_Suc field_simps) + ultimately show ?case using assms + by (auto simp: cfrac_remainder_Suc divide_simps x_def h_def k_def enat_le_iff) + (auto simp: field_simps) +next + case (Suc n) + have less: "enat (Suc (Suc n)) < cfrac_length c" + using Suc.prems by (cases "cfrac_length c") auto + have *: "x (Suc (Suc n)) \ real_of_int (cfrac_nth c (Suc (Suc n)))" + using conv_neq_cfrac_lim[of 0 "cfrac_drop (n+2) c"] Suc.prems + by (cases "cfrac_length c") (auto simp: x_def cfrac_remainder_def) + hence "cfrac_lim c * (k (Suc (Suc n)) * x (Suc (Suc (Suc n))) + k (Suc n)) = + (cfrac_lim c * (k (Suc n) * x (Suc (Suc n)) + k n)) / (x (Suc (Suc n)) - cfrac_nth c (Suc (Suc n)))" + unfolding x_def k_def h_def using less + by (subst cfrac_remainder_Suc) (auto simp: field_simps) + also have "cfrac_lim c * (k (Suc n) * x (Suc (Suc n)) + k n) = + h (Suc n) * x (Suc (Suc n)) + h n" using less + by (intro Suc.IH) auto + also have "(h (Suc n) * x (Suc (Suc n)) + h n) / (x (Suc (Suc n)) - cfrac_nth c (Suc (Suc n))) = + h (Suc (Suc n)) * x (Suc (Suc (Suc n))) + h (Suc n)" using * + unfolding x_def k_def h_def using less + by (subst (3) cfrac_remainder_Suc) (auto simp: field_simps) + finally show ?case . +qed + +lemma cfrac_remainder_nonneg: "cfrac_nth c n \ 0 \ cfrac_remainder c n \ 0" + unfolding cfrac_remainder_def by (rule cfrac_lim_nonneg) auto + +lemma cfrac_remainder_pos: "cfrac_nth c n > 0 \ cfrac_remainder c n > 0" + unfolding cfrac_remainder_def by (rule cfrac_lim_pos) auto + +lemma cfrac_lim_eq_num_denom_remainder: + assumes "Suc (Suc n) < cfrac_length c" + shows "cfrac_lim c = (h (Suc n) * x (Suc (Suc n)) + h n) / (k (Suc n) * x (Suc (Suc n)) + k n)" +proof - + have "k (Suc n) * x (Suc (Suc n)) + k n > 0" + by (intro add_nonneg_pos mult_nonneg_nonneg) + (auto simp: k_def x_def intro!: conv_denom_pos cfrac_remainder_nonneg) + with cfrac_lim_eq_num_denom_remainder_aux[of n] assms show ?thesis + by (auto simp add: field_simps h_def k_def x_def) +qed + +lemma abs_diff_successive_convs: + shows "\conv c (Suc n) - conv c n\ = 1 / (k n * k (Suc n))" +proof - + have [simp]: "k n \ 0" for n :: nat + unfolding k_def using conv_denom_pos[of c n] by auto + have "conv c (Suc n) - conv c n = h (Suc n) / k (Suc n) - h n / k n" + by (simp add: conv_num_denom k_def h_def) + also have "\ = (k n * h (Suc n) - k (Suc n) * h n) / (k n * k (Suc n))" + by (simp add: field_simps) + also have "k n * h (Suc n) - k (Suc n) * h n = (-1) ^ n" + unfolding h_def k_def by (intro conv_num_denom_prod_diff) + finally show ?thesis by (simp add: k_def) +qed + +lemma conv_denom_plus2_ratio_ge: "k (Suc (Suc n)) \ 2 * k n" +proof - + have "1 * k n + k n \ cfrac_nth c (Suc (Suc n)) * k (Suc n) + k n" + by (intro add_mono mult_mono) + (auto simp: k_def Suc_le_eq intro!: conv_denom_leI) + thus ?thesis by (simp add: k_def) +qed + +end + +lemma conv'_cfrac_remainder: + assumes "n < cfrac_length c" + shows "conv' c n (cfrac_remainder c n) = cfrac_lim c" + using assms +proof (induction n arbitrary: c) + case (Suc n c) + have "conv' c (Suc n) (cfrac_remainder c (Suc n)) = + cfrac_nth c 0 + 1 / conv' (cfrac_tl c) n (cfrac_remainder c (Suc n))" + using Suc.prems + by (subst conv'_Suc_left) (auto intro!: cfrac_remainder_pos) + also have "cfrac_remainder c (Suc n) = cfrac_remainder (cfrac_tl c) n" + by (simp add: cfrac_remainder_def cfrac_drop_Suc_right) + also have "conv' (cfrac_tl c) n \ = cfrac_lim (cfrac_tl c)" + using Suc.prems by (subst Suc.IH) (auto simp: cfrac_remainder_def enat_less_iff) + also have "cfrac_nth c 0 + 1 / \ = cfrac_lim c" + using Suc.prems by (intro cfrac_lim_reduce [symmetric]) (auto simp: cfrac_is_int_def) + finally show ?case by (simp add: cfrac_remainder_def cfrac_drop_Suc_right) +qed auto + +lemma cfrac_lim_rational [intro]: + assumes "cfrac_length c < \" + shows "cfrac_lim c \ \" + using assms by (cases "cfrac_length c") (auto simp: cfrac_lim_def) + +lemma linfinite_cfrac_of_real_aux: + "x \ \ \ x \ {0<..<1} \ linfinite (cfrac_of_real_aux x)" +proof (coinduction arbitrary: x) + case (linfinite x) + hence "1 / x \ \" using Rats_divide[of 1 "1 / x"] by auto + thus ?case using linfinite Ints_subset_Rats + by (intro disjI1 exI[of _ "nat \1/x\ - 1"] exI[of _ "cfrac_of_real_aux (frac (1/x))"] + exI[of _ "frac (1/x)"] conjI) + (auto simp: cfrac_of_real_aux.code[of x] frac_lt_1) +qed + +lemma cfrac_length_of_real_irrational: + assumes "x \ \" + shows "cfrac_length (cfrac_of_real x) = \" +proof (insert assms, transfer, clarify) + fix x :: real assume "x \ \" + thus "llength (cfrac_of_real_aux (frac x)) = \" + using linfinite_cfrac_of_real_aux[of "frac x"] Ints_subset_Rats + by (auto simp: linfinite_conv_llength frac_lt_1) +qed + +lemma cfrac_length_of_real_reduce: + assumes "x \ \" + shows "cfrac_length (cfrac_of_real x) = eSuc (cfrac_length (cfrac_of_real (1 / frac x)))" + using assms + by (transfer, subst cfrac_of_real_aux.code) (auto simp: frac_lt_1) + +lemma cfrac_length_of_real_int [simp]: "x \ \ \ cfrac_length (cfrac_of_real x) = 0" + by transfer auto + +lemma conv_cfrac_of_real_le_ge: + assumes "n \ cfrac_length (cfrac_of_real x)" + shows "if even n then conv (cfrac_of_real x) n \ x else conv (cfrac_of_real x) n \ x" + using assms +proof (induction n arbitrary: x) + case (Suc n x) + hence [simp]: "x \ \" + using Suc by (auto simp: enat_0_iff) + let ?x' = "1 / frac x" + have "enat n \ cfrac_length (cfrac_of_real (1 / frac x))" + using Suc.prems by (auto simp: cfrac_length_of_real_reduce simp flip: eSuc_enat) + hence IH: "if even n then conv (cfrac_of_real ?x') n \ ?x' else ?x' \ conv (cfrac_of_real ?x') n" + using Suc.prems by (intro Suc.IH) auto + have remainder_pos: "conv (cfrac_of_real ?x') n > 0" + by (rule conv_pos) (auto simp: frac_le_1) + show ?case + proof (cases "even n") + case True + have "x \ real_of_int \x\ + frac x" + by (simp add: frac_def) + also have "frac x \ 1 / conv (cfrac_of_real ?x') n" + using IH True remainder_pos frac_gt_0_iff[of x] by (simp add: field_simps) + finally show ?thesis using True + by (auto simp: conv_Suc cfrac_tl_of_real) + next + case False + have "real_of_int \x\ + 1 / conv (cfrac_of_real ?x') n \ real_of_int \x\ + frac x" + using IH False remainder_pos frac_gt_0_iff[of x] by (simp add: field_simps) + also have "\ = x" + by (simp add: frac_def) + finally show ?thesis using False + by (auto simp: conv_Suc cfrac_tl_of_real) + qed +qed auto + +lemma cfrac_lim_of_real [simp]: "cfrac_lim (cfrac_of_real x) = x" +proof (cases "cfrac_length (cfrac_of_real x)") + case (enat l) + hence "conv (cfrac_of_real x) l = x" + proof (induction l arbitrary: x) + case 0 + hence "x \ \" + using cfrac_length_of_real_reduce zero_enat_def by fastforce + thus ?case by (auto elim: Ints_cases) + next + case (Suc l x) + hence [simp]: "x \ \" + by (auto simp: enat_0_iff) + have "eSuc (cfrac_length (cfrac_of_real (1 / frac x))) = enat (Suc l)" + using Suc.prems by (auto simp: cfrac_length_of_real_reduce) + hence "conv (cfrac_of_real (1 / frac x)) l = 1 / frac x" + by (intro Suc.IH) (auto simp flip: eSuc_enat) + thus ?case + by (simp add: conv_Suc cfrac_tl_of_real frac_def) + qed + thus ?thesis by (simp add: enat cfrac_lim_def) +next + case [simp]: infinity + have lim: "conv (cfrac_of_real x) \ cfrac_lim (cfrac_of_real x)" + by (simp add: LIMSEQ_cfrac_lim) + have "cfrac_lim (cfrac_of_real x) \ x" + proof (rule tendsto_upperbound) + show "(\n. conv (cfrac_of_real x) (n * 2)) \ cfrac_lim (cfrac_of_real x)" + by (intro filterlim_compose[OF lim] mult_nat_right_at_top) auto + show "eventually (\n. conv (cfrac_of_real x) (n * 2) \ x) at_top" + using conv_cfrac_of_real_le_ge[of "n * 2" x for n] by (intro always_eventually) auto + qed auto + moreover have "cfrac_lim (cfrac_of_real x) \ x" + proof (rule tendsto_lowerbound) + show "(\n. conv (cfrac_of_real x) (Suc (n * 2))) \ cfrac_lim (cfrac_of_real x)" + by (intro filterlim_compose[OF lim] filterlim_compose[OF filterlim_Suc] + mult_nat_right_at_top) auto + show "eventually (\n. conv (cfrac_of_real x) (Suc (n * 2)) \ x) at_top" + using conv_cfrac_of_real_le_ge[of "Suc (n * 2)" x for n] by (intro always_eventually) auto + qed auto + ultimately show ?thesis by (rule antisym) +qed + +lemma Ints_add_left_cancel: "x \ \ \ x + y \ \ \ y \ \" + using Ints_diff[of "x + y" x] by auto + +lemma Ints_add_right_cancel: "y \ \ \ x + y \ \ \ x \ \" + using Ints_diff[of "x + y" y] by auto + +lemma cfrac_of_real_conv': + fixes m n :: nat + assumes "x > 1" "m < n" + shows "cfrac_nth (cfrac_of_real (conv' c n x)) m = cfrac_nth c m" + using assms +proof (induction n arbitrary: c m) + case (Suc n c m) + from Suc.prems have gt_1: "1 < conv' (cfrac_tl c) n x" + by (intro conv'_gt_1) (auto simp: enat_le_iff intro: cfrac_nth_pos) + show ?case + proof (cases m) + case 0 + thus ?thesis using gt_1 Suc.prems + by (simp add: conv'_Suc_left nat_add_distrib floor_eq_iff) + next + case (Suc m') + from gt_1 have "1 / conv' (cfrac_tl c) n x \ {0<..<1}" + by auto + have "1 / conv' (cfrac_tl c) n x \ \" + proof + assume "1 / conv' (cfrac_tl c) n x \ \" + then obtain k :: int where k: "1 / conv' (cfrac_tl c) n x = of_int k" + by (elim Ints_cases) + have "real_of_int k \ {0<..<1}" + using gt_1 by (subst k [symmetric]) auto + thus False by auto + qed + hence not_int: "real_of_int (cfrac_nth c 0) + 1 / conv' (cfrac_tl c) n x \ \" + by (subst Ints_add_left_cancel) (auto simp: field_simps elim!: Ints_cases) + have "cfrac_nth (cfrac_of_real (conv' c (Suc n) x)) m = + cfrac_nth (cfrac_of_real (of_int (cfrac_nth c 0) + 1 / conv' (cfrac_tl c) n x)) (Suc m')" + using \x > 1\ by (subst conv'_Suc_left) (auto simp: Suc) + also have "\ = cfrac_nth (cfrac_of_real (1 / frac (1 / conv' (cfrac_tl c) n x))) m'" + using \x > 1\ Suc not_int by (subst cfrac_nth_of_real_Suc) (auto simp: frac_add_of_int) + also have "1 / conv' (cfrac_tl c) n x \ {0<..<1}" using gt_1 + by (auto simp: field_simps) + hence "frac (1 / conv' (cfrac_tl c) n x) = 1 / conv' (cfrac_tl c) n x" + by (subst frac_eq) auto + hence "1 / frac (1 / conv' (cfrac_tl c) n x) = conv' (cfrac_tl c) n x" + by simp + also have "cfrac_nth (cfrac_of_real \) m' = cfrac_nth c m" + using Suc.prems by (subst Suc.IH) (auto simp: Suc enat_le_iff) + finally show ?thesis . + qed +qed simp_all + +lemma cfrac_lim_irrational: + assumes [simp]: "cfrac_length c = \" + shows "cfrac_lim c \ \" +proof + assume "cfrac_lim c \ \" + then obtain a :: int and b :: nat where ab: "b > 0" "cfrac_lim c = a / b" + by (auto simp: Rats_eq_int_div_nat) + define h and k where "h = conv_num c" and "k = conv_denom c" + + have "filterlim (\m. conv_denom c (Suc m)) at_top at_top" + using conv_denom_at_top filterlim_Suc by (rule filterlim_compose) + then obtain m where m: "conv_denom c (Suc m) \ b + 1" + by (auto simp: filterlim_at_top eventually_at_top_linorder) + + have *: "(a * k m - b * h m) / (k m * b) = a / b - h m / k m" + using \b > 0\ by (simp add: field_simps k_def) + have "\cfrac_lim c - conv c m\ = \(a * k m - b * h m) / (k m * b)\" + by (subst *) (auto simp: ab h_def k_def conv_num_denom) + also have "\ = \a * k m - b * h m\ / (k m * b)" + by (simp add: k_def) + finally have eq: "\cfrac_lim c - conv c m\ = of_int \a * k m - b * h m\ / of_int (k m * b)" . + + have "\cfrac_lim c - conv c m\ * (k m * b) \ 0" + using conv_neq_cfrac_lim[of m c] \b > 0\ by (auto simp: k_def) + also have "\cfrac_lim c - conv c m\ * (k m * b) = of_int \a * k m - b * h m\" + using \b > 0\ by (subst eq) (auto simp: k_def) + finally have "\a * k m - b * h m\ \ 1" by linarith + hence "real_of_int \a * k m - b * h m\ \ 1" by linarith + hence "1 / of_int (k m * b) \ of_int \a * k m - b * h m\ / real_of_int (k m * b)" + using \b > 0\ by (intro divide_right_mono) (auto simp: k_def) + also have "\ = \cfrac_lim c - conv c m\" + by (rule eq [symmetric]) + also have "\ \ 1 / real_of_int (conv_denom c m * conv_denom c (Suc m))" + by (intro cfrac_lim_minus_conv_upper_bound) auto + also have "\ = 1 / (real_of_int (k m) * real_of_int (k (Suc m)))" + by (simp add: k_def) + also have "\ < 1 / (real_of_int (k m) * real b)" + using m \b > 0\ + by (intro divide_strict_left_mono mult_strict_left_mono) (auto simp: k_def) + finally show False by simp +qed + +lemma cfrac_infinite_iff: "cfrac_length c = \ \ cfrac_lim c \ \" + using cfrac_lim_irrational[of c] cfrac_lim_rational[of c] by auto + +lemma cfrac_lim_rational_iff: "cfrac_lim c \ \ \ cfrac_length c \ \" + using cfrac_lim_irrational[of c] cfrac_lim_rational[of c] by auto + +lemma cfrac_of_real_infinite_iff [simp]: "cfrac_length (cfrac_of_real x) = \ \ x \ \" + by (simp add: cfrac_infinite_iff) + +lemma cfrac_remainder_rational_iff [simp]: + "cfrac_remainder c n \ \ \ cfrac_length c < \" +proof - + have "cfrac_remainder c n \ \ \ cfrac_lim (cfrac_drop n c) \ \" + by (simp add: cfrac_remainder_def) + also have "\ \ cfrac_length c \ \" + by (cases "cfrac_length c") (auto simp add: cfrac_lim_rational_iff) + finally show ?thesis by simp +qed + +lift_definition cfrac_cons :: "int \ cfrac \ cfrac" is + "\a bs. case bs of (b, bs) \ if b \ 0 then (1, LNil) else (a, LCons (nat (b - 1)) bs)" . + +lemma cfrac_nth_cons: + assumes "cfrac_nth x 0 \ 1" + shows "cfrac_nth (cfrac_cons a x) n = (if n = 0 then a else cfrac_nth x (n - 1))" + using assms +proof (transfer, goal_cases) + case (1 x a n) + obtain b bs where [simp]: "x = (b, bs)" + by (cases x) + show ?case using 1 + by (cases "llength bs") (auto simp: lnth_LCons eSuc_enat le_imp_diff_is_add split: nat.splits) +qed + +lemma cfrac_length_cons [simp]: + assumes "cfrac_nth x 0 \ 1" + shows "cfrac_length (cfrac_cons a x) = eSuc (cfrac_length x)" + using assms by transfer auto + +lemma cfrac_tl_cons [simp]: + assumes "cfrac_nth x 0 \ 1" + shows "cfrac_tl (cfrac_cons a x) = x" + using assms by transfer auto + +lemma cfrac_cons_tl: + assumes "\cfrac_is_int x" + shows "cfrac_cons (cfrac_nth x 0) (cfrac_tl x) = x" + using assms unfolding cfrac_is_int_def + by transfer (auto split: llist.splits) + + +subsection \Non-canonical continued fractions\ + +text \ + As we will show later, every irrational number has a unique continued fraction + expansion. Every rational number \x\, however, has two different expansions: + The canonical one ends with some number \n\ (which is not equal to 1 unless \x = 1\) + and a non-canonical one which ends with $n-1, 1$. + + We now define this non-canonical expansion analogously to the canonical one before + and show its characteristic properties: + + \<^item> The length of the non-canonical expansion is one greater than that of the + canonical one. + + \<^item> If the expansion is infinite, the non-canonical and the canonical one coincide. + + \<^item> The coefficients of the expansions are all equal except for the last two. + The last coefficient of the non-canonical expansion is always 1, and the + second to last one is the last of the canonical one minus 1. +\ + +lift_definition cfrac_canonical :: "cfrac \ bool" is + "\(x, xs). \lfinite xs \ lnull xs \ llast xs \ 0" . + +lemma cfrac_canonical [code]: + "cfrac_canonical (CFrac x xs) \ lnull xs \ llast xs \ 0 \ \lfinite xs" + by (auto simp add: cfrac_canonical_def) + +lemma cfrac_canonical_iff: + "cfrac_canonical c \ + cfrac_length c \ {0, \} \ cfrac_nth c (the_enat (cfrac_length c)) \ 1" +proof (transfer, clarify, goal_cases) + case (1 x xs) + show ?case + by (cases "llength xs") + (auto simp: llast_def enat_0 lfinite_conv_llength_enat split: nat.splits) +qed + +lemma llast_cfrac_of_real_aux_nonzero: + assumes "lfinite (cfrac_of_real_aux x)" "\lnull (cfrac_of_real_aux x)" + shows "llast (cfrac_of_real_aux x) \ 0" + using assms +proof (induction "cfrac_of_real_aux x" arbitrary: x rule: lfinite_induct) + case (LCons x) + from LCons.prems have "x \ {0<..<1}" + by (subst (asm) cfrac_of_real_aux.code) (auto split: if_splits) + show ?case + proof (cases "1 / x \ \") + case False + thus ?thesis using LCons + by (auto simp: llast_LCons frac_lt_1 cfrac_of_real_aux.code[of x]) + next + case True + then obtain n where n: "1 / x = of_int n" + by (elim Ints_cases) + have "1 / x > 1" using \x \ _\ by auto + with n have "n > 1" by simp + from n have "x = 1 / of_int n" + using \n > 1\ \x \ _\ by (simp add: field_simps) + with \n > 1\ show ?thesis + using LCons cfrac_of_real_aux.code[of x] by (auto simp: llast_LCons frac_lt_1) + qed +qed auto + +lemma cfrac_canonical_of_real [intro]: "cfrac_canonical (cfrac_of_real x)" + by (transfer fixing: x) (use llast_cfrac_of_real_aux_nonzero[of "frac x"] in force) + +primcorec cfrac_of_real_alt_aux :: "real \ nat llist" where + "cfrac_of_real_alt_aux x = + (if x \ {0<..<1} then + if 1 / x \ \ then + LCons (nat \1/x\ - 2) (LCons 0 LNil) + else LCons (nat \1/x\ - 1) (cfrac_of_real_alt_aux (frac (1/x))) + else LNil)" + +lemma cfrac_of_real_aux_alt_LNil [simp]: "x \ {0<..<1} \ cfrac_of_real_alt_aux x = LNil" + by (subst cfrac_of_real_alt_aux.code) auto + +lemma cfrac_of_real_aux_alt_0 [simp]: "cfrac_of_real_alt_aux 0 = LNil" + by (subst cfrac_of_real_alt_aux.code) auto + +lemma cfrac_of_real_aux_alt_eq_LNil_iff [simp]: "cfrac_of_real_alt_aux x = LNil \ x \ {0<..<1}" + by (subst cfrac_of_real_alt_aux.code) auto + +lift_definition cfrac_of_real_alt :: "real \ cfrac" is + "\x. if x \ \ then (\x\ - 1, LCons 0 LNil) else (\x\, cfrac_of_real_alt_aux (frac x))" . + +lemma cfrac_tl_of_real_alt: + assumes "x \ \" + shows "cfrac_tl (cfrac_of_real_alt x) = cfrac_of_real_alt (1 / frac x)" + using assms +proof (transfer, goal_cases) + case (1 x) + show ?case + proof (cases "1 / frac x \ \") + case False + from 1 have "int (nat \1 / frac x\ - Suc 0) + 1 = \1 / frac x\" + by (subst of_nat_diff) (auto simp: le_nat_iff frac_le_1) + with False show ?thesis + using \x \ \\ + by (subst cfrac_of_real_alt_aux.code) (auto split: llist.splits simp: frac_lt_1) + next + case True + then obtain n where "1 / frac x = of_int n" + by (auto simp: Ints_def) + moreover have "1 / frac x > 1" + using 1 by (auto simp: divide_simps frac_lt_1) + ultimately have "1 / frac x \ 2" + by simp + hence "int (nat \1 / frac x\ - 2) + 2 = \1 / frac x\" + by (subst of_nat_diff) (auto simp: le_nat_iff frac_le_1) + thus ?thesis + using \x \ \\ + by (subst cfrac_of_real_alt_aux.code) (auto split: llist.splits simp: frac_lt_1) + qed +qed + +lemma cfrac_nth_of_real_alt_Suc: + assumes "x \ \" + shows "cfrac_nth (cfrac_of_real_alt x) (Suc n) = cfrac_nth (cfrac_of_real_alt (1 / frac x)) n" +proof - + have "cfrac_nth (cfrac_of_real_alt x) (Suc n) = + cfrac_nth (cfrac_tl (cfrac_of_real_alt x)) n" + by simp + also have "cfrac_tl (cfrac_of_real_alt x) = cfrac_of_real_alt (1 / frac x)" + by (simp add: cfrac_tl_of_real_alt assms) + finally show ?thesis . +qed + +lemma cfrac_nth_gt0_of_real_int [simp]: + "m > 0 \ cfrac_nth (cfrac_of_real (of_int n)) m = 1" + by transfer (auto simp: lnth_LCons eSuc_def enat_0_iff split: nat.splits) + +lemma cfrac_nth_0_of_real_alt_int [simp]: + "cfrac_nth (cfrac_of_real_alt (of_int n)) 0 = n - 1" + by transfer auto + +lemma cfrac_nth_gt0_of_real_alt_int [simp]: + "m > 0 \ cfrac_nth (cfrac_of_real_alt (of_int n)) m = 1" + by transfer (auto simp: lnth_LCons eSuc_def split: nat.splits) + +lemma llength_cfrac_of_real_alt_aux: + assumes "x \ {0<..<1}" + shows "llength (cfrac_of_real_alt_aux x) = eSuc (llength (cfrac_of_real_aux x))" + using assms +proof (coinduction arbitrary: x rule: enat_coinduct) + case (Eq_enat x) + show ?case + proof (cases "1 / x \ \") + case False + with Eq_enat have "frac (1 / x) \ {0<..<1}" + by (auto intro: frac_lt_1) + hence "\x'. llength (cfrac_of_real_alt_aux (frac (1 / x))) = + llength (cfrac_of_real_alt_aux x') \ + llength (cfrac_of_real_aux (frac (1 / x))) = llength (cfrac_of_real_aux x') \ + 0 < x' \ x' < 1" + by (intro exI[of _ "frac (1 / x)"]) auto + thus ?thesis using False Eq_enat + by (auto simp: cfrac_of_real_alt_aux.code[of x] cfrac_of_real_aux.code[of x]) + qed (use Eq_enat in \auto simp: cfrac_of_real_alt_aux.code[of x] cfrac_of_real_aux.code[of x]\) +qed + +lemma cfrac_length_of_real_alt: + "cfrac_length (cfrac_of_real_alt x) = eSuc (cfrac_length (cfrac_of_real x))" + by transfer (auto simp: llength_cfrac_of_real_alt_aux frac_lt_1) + +lemma cfrac_of_real_alt_aux_eq_regular: + assumes "x \ {0<..<1}" "llength (cfrac_of_real_aux x) = \" + shows "cfrac_of_real_alt_aux x = cfrac_of_real_aux x" + using assms +proof (coinduction arbitrary: x) + case (Eq_llist x) + hence "\x'. cfrac_of_real_aux (frac (1 / x)) = + cfrac_of_real_aux x' \ + cfrac_of_real_alt_aux (frac (1 / x)) = + cfrac_of_real_alt_aux x' \ 0 < x' \ x' < 1 \ llength (cfrac_of_real_aux x') = \" + by (intro exI[of _ "frac (1 / x)"]) + (auto simp: cfrac_of_real_aux.code[of x] cfrac_of_real_alt_aux.code[of x] + eSuc_eq_infinity_iff frac_lt_1) + with Eq_llist show ?case + by (auto simp: eSuc_eq_infinity_iff) +qed + +lemma cfrac_of_real_alt_irrational [simp]: + assumes "x \ \" + shows "cfrac_of_real_alt x = cfrac_of_real x" +proof - + from assms have "cfrac_length (cfrac_of_real x) = \" + using cfrac_length_of_real_irrational by blast + with assms show ?thesis + by transfer + (use Ints_subset_Rats in + \auto intro!: cfrac_of_real_alt_aux_eq_regular simp: frac_lt_1 llength_cfrac_of_real_alt_aux\) +qed + +lemma cfrac_nth_of_real_alt_0: + "cfrac_nth (cfrac_of_real_alt x) 0 = (if x \ \ then \x\ - 1 else \x\)" + by transfer auto + +lemma cfrac_nth_of_real_alt: + fixes n :: nat and x :: real + defines "c \ cfrac_of_real x" + defines "c' \ cfrac_of_real_alt x" + defines "l \ cfrac_length c" + shows "cfrac_nth c' n = + (if enat n = l then + cfrac_nth c n - 1 + else if enat n = l + 1 then + 1 + else + cfrac_nth c n)" + unfolding c_def c'_def l_def +proof (induction n arbitrary: x rule: less_induct) + case (less n) + consider "x \ \" | "x \ \" | "n = 0" "x \ \ - \" | n' where "n = Suc n'" "x \ \ - \" + by (cases n) auto + thus ?case + proof cases + assume "x \ \" + thus ?thesis + by (auto simp: cfrac_length_of_real_irrational) + next + assume "x \ \" + thus ?thesis + by (auto simp: Ints_def one_enat_def zero_enat_def) + next + assume *: "n = 0" "x \ \ - \" + have "enat 0 \ cfrac_length (cfrac_of_real x) + 1" + using zero_enat_def by auto + moreover have "enat 0 \ cfrac_length (cfrac_of_real x)" + using * cfrac_length_of_real_reduce zero_enat_def by auto + ultimately show ?thesis using * + by (auto simp: cfrac_nth_of_real_alt_0) + next + fix n' assume *: "n = Suc n'" "x \ \ - \" + from less.IH [of n' "1 / frac x"] and * show ?thesis + by (auto simp: cfrac_nth_of_real_Suc cfrac_nth_of_real_alt_Suc cfrac_length_of_real_reduce + eSuc_def one_enat_def enat_0_iff split: enat.splits) + qed +qed + +lemma cfrac_of_real_length_eq_0_iff: "cfrac_length (cfrac_of_real x) = 0 \ x \ \" + by transfer (auto simp: frac_lt_1) + +lemma conv'_cong: + assumes "(\k. k < n \ cfrac_nth c k = cfrac_nth c' k)" "n = n'" "x = y" + shows "conv' c n x = conv' c' n' y" + using assms(1) unfolding assms(2,3) [symmetric] + by (induction n arbitrary: x) (auto simp: conv'_Suc_right) + +lemma conv_cong: + assumes "(\k. k \ n \ cfrac_nth c k = cfrac_nth c' k)" "n = n'" + shows "conv c n = conv c' n'" + using assms(1) unfolding assms(2) [symmetric] + by (induction n arbitrary: c c') (auto simp: conv_Suc) + +lemma conv'_cfrac_of_real_alt: + assumes "enat n \ cfrac_length (cfrac_of_real x)" + shows "conv' (cfrac_of_real_alt x) n y = conv' (cfrac_of_real x) n y" +proof (cases "cfrac_length (cfrac_of_real x)") + case infinity + thus ?thesis by auto +next + case [simp]: (enat l') + with assms show ?thesis + by (intro conv'_cong refl; subst cfrac_nth_of_real_alt) (auto simp: one_enat_def) +qed + +lemma cfrac_lim_of_real_alt [simp]: "cfrac_lim (cfrac_of_real_alt x) = x" +proof (cases "cfrac_length (cfrac_of_real x)") + case infinity + thus ?thesis by auto +next + case (enat l) + thus ?thesis + proof (induction l arbitrary: x) + case 0 + hence "x \ \" + using cfrac_of_real_length_eq_0_iff zero_enat_def by auto + thus ?case + by (auto simp: Ints_def cfrac_lim_def cfrac_length_of_real_alt eSuc_def conv_Suc) + next + case (Suc l x) + hence *: "\cfrac_is_int (cfrac_of_real_alt x)" "x \ \" + by (auto simp: cfrac_is_int_def cfrac_length_of_real_alt Ints_def zero_enat_def eSuc_def) + hence "cfrac_lim (cfrac_of_real_alt x) = + of_int \x\ + 1 / cfrac_lim (cfrac_tl (cfrac_of_real_alt x))" + by (subst cfrac_lim_reduce) (auto simp: cfrac_nth_of_real_alt_0) + also have "cfrac_length (cfrac_of_real (1 / frac x)) = l" + using Suc.prems * by (metis cfrac_length_of_real_reduce eSuc_enat eSuc_inject) + hence "1 / cfrac_lim (cfrac_tl (cfrac_of_real_alt x)) = frac x" + by (subst cfrac_tl_of_real_alt[OF *(2)], subst Suc) (use Suc.prems * in auto) + also have "real_of_int \x\ + frac x = x" + by (simp add: frac_def) + finally show ?case . + qed +qed + +lemma cfrac_eqI: + assumes "cfrac_length c = cfrac_length c'" and "\n. cfrac_nth c n = cfrac_nth c' n" + shows "c = c'" +proof (use assms in transfer, safe, goal_cases) + case (1 a xs b ys) + from 1(2)[of 0] show ?case + by auto +next + case (2 a xs b ys) + define f where "f = (\xs n. if enat (Suc n) \ llength xs then int (lnth xs n) + 1 else 1)" + have "\n. f xs n = f ys n" + using 2(2)[of "Suc n" for n] by (auto simp: f_def cong: if_cong) + with 2(1) show "xs = ys" + proof (coinduction arbitrary: xs ys) + case (Eq_llist xs ys) + show ?case + proof (cases "lnull xs \ lnull ys") + case False + from False have *: "enat (Suc 0) \ llength ys" + using Suc_ile_eq zero_enat_def by auto + have "llength (ltl xs) = llength (ltl ys)" + using Eq_llist by (cases xs; cases ys) auto + moreover have "lhd xs = lhd ys" + using False * Eq_llist(1) spec[OF Eq_llist(2), of 0] + by (auto simp: f_def lnth_0_conv_lhd) + moreover have "f (ltl xs) n = f (ltl ys) n" for n + using Eq_llist(1) * spec[OF Eq_llist(2), of "Suc n"] + by (cases xs; cases ys) (auto simp: f_def Suc_ile_eq split: if_splits) + ultimately show ?thesis + using False by auto + next + case True + thus ?thesis + using Eq_llist(1) by auto + qed + qed +qed + +lemma cfrac_eq_0I: + assumes "cfrac_lim c = 0" "cfrac_nth c 0 \ 0" + shows "c = 0" +proof - + have *: "cfrac_is_int c" + proof (rule ccontr) + assume *: "\cfrac_is_int c" + from * have "conv c 0 < cfrac_lim c" + by (intro conv_less_cfrac_lim) (auto simp: cfrac_is_int_def simp flip: zero_enat_def) + hence "cfrac_nth c 0 < 0" + using assms by simp + thus False + using assms by simp + qed + from * assms have "cfrac_nth c 0 = 0" + by (auto simp: cfrac_lim_def cfrac_is_int_def) + from * and this show "c = 0" + unfolding zero_cfrac_def cfrac_is_int_def by transfer auto +qed + +lemma cfrac_eq_1I: + assumes "cfrac_lim c = 1" "cfrac_nth c 0 \ 0" + shows "c = 1" +proof - + have *: "cfrac_is_int c" + proof (rule ccontr) + assume *: "\cfrac_is_int c" + from * have "conv c 0 < cfrac_lim c" + by (intro conv_less_cfrac_lim) (auto simp: cfrac_is_int_def simp flip: zero_enat_def) + hence "cfrac_nth c 0 < 0" + using assms by simp + + have "cfrac_lim c = real_of_int (cfrac_nth c 0) + 1 / cfrac_lim (cfrac_tl c)" + using * by (subst cfrac_lim_reduce) auto + also have "real_of_int (cfrac_nth c 0) < 0" + using \cfrac_nth c 0 < 0\ by simp + also have "1 / cfrac_lim (cfrac_tl c) \ 1" + proof - + have "1 \ cfrac_nth (cfrac_tl c) 0" + by auto + also have "\ \ cfrac_lim (cfrac_tl c)" + by (rule cfrac_lim_ge_first) + finally show ?thesis by simp + qed + finally show False + using assms by simp + qed + + from * assms have "cfrac_nth c 0 = 1" + by (auto simp: cfrac_lim_def cfrac_is_int_def) + from * and this show "c = 1" + unfolding one_cfrac_def cfrac_is_int_def by transfer auto +qed + +lemma cfrac_coinduct [coinduct type: cfrac]: + assumes "R c1 c2" + assumes IH: "\c1 c2. R c1 c2 \ + cfrac_is_int c1 = cfrac_is_int c2 \ + cfrac_nth c1 0 = cfrac_nth c2 0 \ + (\cfrac_is_int c1 \ \cfrac_is_int c2 \ R (cfrac_tl c1) (cfrac_tl c2))" + shows "c1 = c2" +proof (rule cfrac_eqI) + show "cfrac_nth c1 n = cfrac_nth c2 n" for n + using assms(1) + proof (induction n arbitrary: c1 c2) + case 0 + from IH[OF this] show ?case + by auto + next + case (Suc n) + thus ?case + using IH by (metis cfrac_is_int_iff cfrac_nth_0_of_int cfrac_nth_tl) + qed +next + show "cfrac_length c1 = cfrac_length c2" + using assms(1) + proof (coinduction arbitrary: c1 c2 rule: enat_coinduct) + case (Eq_enat c1 c2) + show ?case + proof (cases "cfrac_is_int c1") + case True + thus ?thesis + using IH[OF Eq_enat(1)] by (auto simp: cfrac_is_int_def) + next + case False + with IH[OF Eq_enat(1)] have **: "\cfrac_is_int c1" "R (cfrac_tl c1) (cfrac_tl c2)" + by auto + have *: "(cfrac_length c1 = 0) = (cfrac_length c2 = 0)" + using IH[OF Eq_enat(1)] by (auto simp: cfrac_is_int_def) + show ?thesis + by (intro conjI impI disjI1 *, rule exI[of _ "cfrac_tl c1"], rule exI[of _ "cfrac_tl c2"]) + (use ** in \auto simp: epred_conv_minus\) + qed + qed +qed + +lemma cfrac_nth_0_cases: + "cfrac_nth c 0 = \cfrac_lim c\ \ cfrac_nth c 0 = \cfrac_lim c\ - 1 \ cfrac_tl c = 1" +proof (cases "cfrac_is_int c") + case True + hence "cfrac_nth c 0 = \cfrac_lim c\" + by (auto simp: cfrac_lim_def cfrac_is_int_def) + thus ?thesis by blast +next + case False + note not_int = this + have bounds: "1 / cfrac_lim (cfrac_tl c) \ 0 \ 1 / cfrac_lim (cfrac_tl c) \ 1" + proof - + have "1 \ cfrac_nth (cfrac_tl c) 0" + by simp + also have "\ \ cfrac_lim (cfrac_tl c)" + by (rule cfrac_lim_ge_first) + finally show ?thesis + using False by (auto simp: cfrac_lim_nonneg) + qed + + thus ?thesis + proof (cases "cfrac_lim (cfrac_tl c) = 1") + case False + have "\cfrac_lim c\ = cfrac_nth c 0 + \1 / cfrac_lim (cfrac_tl c)\" + using not_int by (subst cfrac_lim_reduce) auto + also have "1 / cfrac_lim (cfrac_tl c) \ 0 \ 1 / cfrac_lim (cfrac_tl c) < 1" + using bounds False by (auto simp: divide_simps) + hence "\1 / cfrac_lim (cfrac_tl c)\ = 0" + by linarith + finally show ?thesis by simp + next + case True + have "cfrac_nth c 0 = \cfrac_lim c\ - 1" + using not_int True by (subst cfrac_lim_reduce) auto + moreover have "cfrac_tl c = 1" + using True by (intro cfrac_eq_1I) auto + ultimately show ?thesis by blast + qed +qed + +lemma cfrac_length_1 [simp]: "cfrac_length 1 = 0" + unfolding one_cfrac_def by simp + +lemma cfrac_nth_1 [simp]: "cfrac_nth 1 m = 1" + unfolding one_cfrac_def by transfer (auto simp: enat_0_iff) + +lemma cfrac_lim_1 [simp]: "cfrac_lim 1 = 1" + by (auto simp: cfrac_lim_def) + + +lemma cfrac_nth_0_not_int: + assumes "cfrac_lim c \ \" + shows "cfrac_nth c 0 = \cfrac_lim c\" +proof - + have "cfrac_tl c \ 1" + proof + assume eq: "cfrac_tl c = 1" + have "\cfrac_is_int c" + using assms by (auto simp: cfrac_lim_def cfrac_is_int_def) + hence "cfrac_lim c = of_int \cfrac_nth c 0\ + 1" + using eq by (subst cfrac_lim_reduce) auto + hence "cfrac_lim c \ \" + by auto + with assms show False by auto + qed + with cfrac_nth_0_cases[of c] show ?thesis by auto +qed + +lemma cfrac_of_real_cfrac_lim_irrational: + assumes "cfrac_lim c \ \" + shows "cfrac_of_real (cfrac_lim c) = c" +proof (rule cfrac_eqI) + from assms show "cfrac_length (cfrac_of_real (cfrac_lim c)) = cfrac_length c" + using cfrac_lim_rational_iff by auto +next + fix n + show "cfrac_nth (cfrac_of_real (cfrac_lim c)) n = cfrac_nth c n" + using assms + proof (induction n arbitrary: c) + case (0 c) + thus ?case + using Ints_subset_Rats by (subst cfrac_nth_0_not_int) auto + next + case (Suc n c) + from Suc.prems have [simp]: "cfrac_lim c \ \" + using Ints_subset_Rats by blast + have "cfrac_nth (cfrac_of_real (cfrac_lim c)) (Suc n) = + cfrac_nth (cfrac_tl (cfrac_of_real (cfrac_lim c))) n" + by (simp flip: cfrac_nth_tl) + also have "cfrac_tl (cfrac_of_real (cfrac_lim c)) = cfrac_of_real (1 / frac (cfrac_lim c))" + using Suc.prems Ints_subset_Rats by (subst cfrac_tl_of_real) auto + also have "1 / frac (cfrac_lim c) = cfrac_lim (cfrac_tl c)" + using Suc.prems by (subst cfrac_lim_tl) (auto simp: frac_def cfrac_is_int_def cfrac_nth_0_not_int) + also have "cfrac_nth (cfrac_of_real (cfrac_lim (cfrac_tl c))) n = cfrac_nth c (Suc n)" + using Suc.prems by (subst Suc.IH) (auto simp: cfrac_lim_rational_iff) + finally show ?case . + qed +qed + +lemma cfrac_eqI_first: + assumes "\cfrac_is_int c" "\cfrac_is_int c'" + assumes "cfrac_nth c 0 = cfrac_nth c' 0" and "cfrac_tl c = cfrac_tl c'" + shows "c = c'" + using assms unfolding cfrac_is_int_def + by transfer (auto split: llist.splits) + +lemma cfrac_is_int_of_real_iff: "cfrac_is_int (cfrac_of_real x) \ x \ \" + unfolding cfrac_is_int_def by transfer (use frac_lt_1 in auto) + +lemma cfrac_not_is_int_of_real_alt: "\cfrac_is_int (cfrac_of_real_alt x)" + unfolding cfrac_is_int_def by transfer (auto simp: frac_lt_1) + +lemma cfrac_tl_of_real_alt_of_int [simp]: "cfrac_tl (cfrac_of_real_alt (of_int n)) = 1" + unfolding one_cfrac_def by transfer auto + +lemma cfrac_is_intI: + assumes "cfrac_nth c 0 \ \cfrac_lim c\" and "cfrac_lim c \ \" + shows "cfrac_is_int c" +proof (rule ccontr) + assume *: "\cfrac_is_int c" + from * have "conv c 0 < cfrac_lim c" + by (intro conv_less_cfrac_lim) (auto simp: cfrac_is_int_def simp flip: zero_enat_def) + with assms show False + by (auto simp: Ints_def) +qed + +lemma cfrac_eq_of_intI: + assumes "cfrac_nth c 0 \ \cfrac_lim c\" and "cfrac_lim c \ \" + shows "c = cfrac_of_int \cfrac_lim c\" +proof - + from assms have int: "cfrac_is_int c" + by (intro cfrac_is_intI) auto + have [simp]: "cfrac_lim c = cfrac_nth c 0" + using int by (simp add: cfrac_lim_def cfrac_is_int_def) + from int have "c = cfrac_of_int (cfrac_nth c 0)" + unfolding cfrac_is_int_def by transfer auto + also from assms have "cfrac_nth c 0 = \cfrac_lim c\" + using int by auto + finally show ?thesis . +qed + +lemma cfrac_lim_of_int [simp]: "cfrac_lim (cfrac_of_int n) = of_int n" + by (simp add: cfrac_lim_def) + +lemma cfrac_of_real_of_int [simp]: "cfrac_of_real (of_int n) = cfrac_of_int n" + by transfer auto + +lemma cfrac_of_real_of_nat [simp]: "cfrac_of_real (of_nat n) = cfrac_of_int (int n)" + by transfer auto + +lemma cfrac_int_cases: + assumes "cfrac_lim c = of_int n" + shows "c = cfrac_of_int n \ c = cfrac_of_real_alt (of_int n)" +proof - + from cfrac_nth_0_cases[of c] show ?thesis + proof (rule disj_forward) + assume eq: "cfrac_nth c 0 = \cfrac_lim c\" + have "c = cfrac_of_int \cfrac_lim c\" + using assms eq by (intro cfrac_eq_of_intI) auto + with assms eq show "c = cfrac_of_int n" + by simp + next + assume *: "cfrac_nth c 0 = \cfrac_lim c\ - 1 \ cfrac_tl c = 1" + have "\cfrac_is_int c" + using * by (auto simp: cfrac_is_int_def cfrac_lim_def) + hence "cfrac_length c = eSuc (cfrac_length (cfrac_tl c))" + by (subst cfrac_length_tl; cases "cfrac_length c") + (auto simp: cfrac_is_int_def eSuc_def enat_0_iff split: enat.splits) + also have "cfrac_tl c = 1" + using * by auto + finally have "cfrac_length c = 1" + by (simp add: eSuc_def one_enat_def) + show "c = cfrac_of_real_alt (of_int n)" + by (rule cfrac_eqI_first) + (use \\cfrac_is_int c\ * assms in \auto simp: cfrac_not_is_int_of_real_alt\) + qed +qed + +lemma cfrac_cases: + "c \ {cfrac_of_real (cfrac_lim c), cfrac_of_real_alt (cfrac_lim c)}" +proof (cases "cfrac_length c") + case infinity + hence "cfrac_lim c \ \" + by (simp add: cfrac_lim_irrational) + thus ?thesis + using cfrac_of_real_cfrac_lim_irrational by simp +next + case (enat l) + thus ?thesis + proof (induction l arbitrary: c) + case (0 c) + hence "c = cfrac_of_real (cfrac_nth c 0)" + by transfer (auto simp flip: zero_enat_def) + with 0 show ?case by (auto simp: cfrac_lim_def) + next + case (Suc l c) + show ?case + proof (cases "cfrac_lim c \ \") + case True + thus ?thesis + using cfrac_int_cases[of c] by (force simp: Ints_def) + next + case [simp]: False + have "\cfrac_is_int c" + using Suc.prems by (auto simp: cfrac_is_int_def enat_0_iff) + show ?thesis + using cfrac_nth_0_cases[of c] + proof (elim disjE conjE) + assume *: "cfrac_nth c 0 = \cfrac_lim c\ - 1" "cfrac_tl c = 1" + hence "cfrac_lim c \ \" + using \\cfrac_is_int c\ by (subst cfrac_lim_reduce) auto + thus ?thesis + by (auto simp: cfrac_int_cases) + next + assume eq: "cfrac_nth c 0 = \cfrac_lim c\" + have "cfrac_tl c = cfrac_of_real (cfrac_lim (cfrac_tl c)) \ + cfrac_tl c = cfrac_of_real_alt (cfrac_lim (cfrac_tl c))" + using Suc.IH[of "cfrac_tl c"] Suc.prems by auto + hence "c = cfrac_of_real (cfrac_lim c) \ + c = cfrac_of_real_alt (cfrac_lim c)" + proof (rule disj_forward) + assume eq': "cfrac_tl c = cfrac_of_real (cfrac_lim (cfrac_tl c))" + show "c = cfrac_of_real (cfrac_lim c)" + by (rule cfrac_eqI_first) + (use \\cfrac_is_int c\ eq eq' in + \auto simp: cfrac_is_int_of_real_iff cfrac_tl_of_real cfrac_lim_tl frac_def\) + next + assume eq': "cfrac_tl c = cfrac_of_real_alt (cfrac_lim (cfrac_tl c))" + have eq'': "cfrac_nth (cfrac_of_real_alt (cfrac_lim c)) 0 = \cfrac_lim c\" + using Suc.prems by (subst cfrac_nth_of_real_alt_0) auto + show "c = cfrac_of_real_alt (cfrac_lim c)" + by (rule cfrac_eqI_first) + (use \\cfrac_is_int c\ eq eq' eq'' in + \auto simp: cfrac_not_is_int_of_real_alt cfrac_tl_of_real_alt cfrac_lim_tl frac_def\) + qed + thus ?thesis by simp + qed + qed + qed +qed + +lemma cfrac_lim_eq_iff: + assumes "cfrac_length c = \ \ cfrac_length c' = \" + shows "cfrac_lim c = cfrac_lim c' \ c = c'" +proof + assume *: "cfrac_lim c = cfrac_lim c'" + hence "cfrac_of_real (cfrac_lim c) = cfrac_of_real (cfrac_lim c')" + by (simp only:) + thus "c = c'" + using assms * + by (subst (asm) (1 2) cfrac_of_real_cfrac_lim_irrational) + (auto simp: cfrac_infinite_iff) +qed auto + +lemma floor_cfrac_remainder: + assumes "cfrac_length c = \" + shows "\cfrac_remainder c n\ = cfrac_nth c n" + by (metis add.left_neutral assms cfrac_length_drop cfrac_lim_eq_iff idiff_infinity + cfrac_lim_of_real cfrac_nth_drop cfrac_nth_of_real_0 cfrac_remainder_def) + + +subsection \Approximation properties\ + +text \ + In this section, we will show that convergents of the continued fraction expansion of a + number \x\ are good approximations of \x\, and in a certain sense, the reverse holds as well. +\ + +lemma sgn_of_int: + "sgn (of_int x :: 'a :: {linordered_idom}) = of_int (sgn x)" + by (auto simp: sgn_if) + +lemma conv_ge_one: "cfrac_nth c 0 > 0 \ conv c n \ 1" + by (rule order.trans[OF _ conv_ge_first]) auto + +context + fixes c h k + defines "h \ conv_num c" and "k \ conv_denom c" +begin + +lemma abs_diff_le_abs_add: + fixes x y :: real + assumes "x \ 0 \ y \ 0 \ x \ 0 \ y \ 0" + shows "\x - y\ \ \x + y\" + using assms by linarith + +lemma abs_diff_less_abs_add: + fixes x y :: real + assumes "x > 0 \ y > 0 \ x < 0 \ y < 0" + shows "\x - y\ < \x + y\" + using assms by linarith + +lemma abs_diff_le_imp_same_sign: + assumes "\x - y\ \ d" "d < \y\" + shows "sgn x = sgn (y::real)" + using assms by (auto simp: sgn_if) + +lemma conv_nonpos: + assumes "cfrac_nth c 0 < 0" + shows "conv c n \ 0" +proof (cases n) + case 0 + thus ?thesis using assms by auto +next + case [simp]: (Suc n') + have "conv c n = real_of_int (cfrac_nth c 0) + 1 / conv (cfrac_tl c) n'" + by (simp add: conv_Suc) + also have "\ \ -1 + 1 / 1" + using assms by (intro add_mono divide_left_mono) (auto intro!: conv_pos conv_ge_one) + finally show ?thesis by simp +qed + +lemma cfrac_lim_nonpos: + assumes "cfrac_nth c 0 < 0" + shows "cfrac_lim c \ 0" +proof (cases "cfrac_length c") + case infinity + show ?thesis using LIMSEQ_cfrac_lim[OF infinity] + by (rule tendsto_upperbound) (use assms in \auto simp: conv_nonpos\) +next + case (enat l) + thus ?thesis by (auto simp: cfrac_lim_def conv_nonpos assms) +qed + +lemma conv_num_nonpos: + assumes "cfrac_nth c 0 < 0" + shows "h n \ 0" +proof (induction n rule: fib.induct) + case 2 + have "cfrac_nth c (Suc 0) * cfrac_nth c 0 \ 1 * cfrac_nth c 0" + using assms by (intro mult_right_mono_neg) auto + also have "\ + 1 \ 0" using assms by auto + finally show ?case by (auto simp: h_def) +next + case (3 n) + have "cfrac_nth c (Suc (Suc n)) * h (Suc n) \ 0" + using 3 by (simp add: mult_nonneg_nonpos) + also have "\ + h n \ 0" + using 3 by simp + finally show ?case + by (auto simp: h_def) +qed (use assms in \auto simp: h_def\) + +lemma conv_best_approximation_aux: + "cfrac_lim c \ 0 \ h n \ 0 \ cfrac_lim c \ 0 \ h n \ 0" +proof (cases "cfrac_nth c 0 \ 0") + case True + from True have "0 \ conv c 0" + by simp + also have "\ \ cfrac_lim c" + by (rule conv_le_cfrac_lim) (auto simp: enat_0) + finally have "cfrac_lim c \ 0" . + moreover from True have "h n \ 0" + unfolding h_def by (intro conv_num_nonneg) + ultimately show ?thesis by (simp add: sgn_if) +next + case False + thus ?thesis + using cfrac_lim_nonpos conv_num_nonpos[of n] by (auto simp: h_def) +qed + +lemma conv_best_approximation_ex: + fixes a b :: int and x :: real + assumes "n \ cfrac_length c" + assumes "0 < b" and "b \ k n" and "coprime a b" and "n > 0" + assumes "(a, b) \ (h n, k n)" + assumes "\(cfrac_length c = 1 \ n = 0)" + assumes "Suc n \ cfrac_length c \ cfrac_canonical c" + defines "x \ cfrac_lim c" + shows "\k n * x - h n\ < \b * x - a\" +proof (cases "\a\ = \h n\ \ b = k n") + case True + with assms have [simp]: "a = -h n" + by (auto simp: abs_if split: if_splits) + have "k n > 0" + by (auto simp: k_def) + show ?thesis + proof (cases "x = 0") + case True + hence "c = cfrac_of_real 0 \ c = cfrac_of_real_alt 0" + unfolding x_def by (metis cfrac_cases empty_iff insert_iff) + hence False + proof + assume "c = cfrac_of_real 0" + thus False + using assms by (auto simp: enat_0_iff h_def k_def) + next + assume [simp]: "c = cfrac_of_real_alt 0" + hence "n = 0 \ n = 1" + using assms by (auto simp: cfrac_length_of_real_alt enat_0_iff k_def h_def eSuc_def) + thus False + using assms True + by (elim disjE) (auto simp: cfrac_length_of_real_alt enat_0_iff k_def h_def eSuc_def + cfrac_nth_of_real_alt one_enat_def split: if_splits) + qed + thus ?thesis .. + next + case False + have "h n \ 0" + using True assms(6) h_def by auto + hence "x > 0 \ h n > 0 \ x < 0 \ h n < 0" + using \x \ 0\ conv_best_approximation_aux[of n] unfolding x_def by auto + hence "\real_of_int (k n) * x - real_of_int (h n)\ < \real_of_int (k n) * x + real_of_int (h n)\" + using \k n > 0\ + by (intro abs_diff_less_abs_add) (auto simp: not_le zero_less_mult_iff mult_less_0_iff) + thus ?thesis using True by auto + qed +next + case False + note * = this + show ?thesis + proof (cases "n = cfrac_length c") + case True + hence "x = conv c n" + by (auto simp: cfrac_lim_def x_def split: enat.splits) + also have "\ = h n / k n" + by (auto simp: h_def k_def conv_num_denom) + finally have x: "x = h n / k n" . + hence "\k n * x - h n\ = 0" + by (simp add: k_def) + also have "b * x \ a" + proof + assume "b * x = a" + hence "of_int (h n) * of_int b = of_int (k n) * (of_int a :: real)" + using assms True by (auto simp: field_simps k_def x) + hence "of_int (h n * b) = (of_int (k n * a) :: real)" + by (simp only: of_int_mult) + hence "h n * b = k n * a" + by linarith + hence "h n = a \ k n = b" + using assms by (subst (asm) coprime_crossproduct') + (auto simp: h_def k_def coprime_conv_num_denom) + thus False using True False by simp + qed + hence "0 < \b * x - a\" + by simp + finally show ?thesis . + next + case False + + define s where "s = (-1) ^ n * (a * k n - b * h n)" + define r where "r = (-1) ^ n * (b * h (Suc n) - a * k (Suc n))" + have "k n \ k (Suc n)" + unfolding k_def by (intro conv_denom_leI) auto + + have "r * h n + s * h (Suc n) = + (-1) ^ Suc n * a * (k (Suc n) * h n - k n * h (Suc n))" + by (simp add: s_def r_def algebra_simps h_def k_def) + also have "\ = a" using assms unfolding h_def k_def + by (subst conv_num_denom_prod_diff') (auto simp: algebra_simps) + finally have eq1: "r * h n + s * h (Suc n) = a" . + + have "r * k n + s * k (Suc n) = + (-1) ^ Suc n * b * (k (Suc n) * h n - k n * h (Suc n))" + by (simp add: s_def r_def algebra_simps h_def k_def) + also have "\ = b" using assms unfolding h_def k_def + by (subst conv_num_denom_prod_diff') (auto simp: algebra_simps) + finally have eq2: "r * k n + s * k (Suc n) = b" . + + have "k n < k (Suc n)" + using \n > 0\ by (auto simp: k_def intro: conv_denom_lessI) + + have "r \ 0" + proof + assume "r = 0" + hence "a * k (Suc n) = b * h (Suc n)" by (simp add: r_def) + hence "abs (a * k (Suc n)) = abs (h (Suc n) * b)" by (simp only: mult_ac) + hence *: "abs (h (Suc n)) = abs a \ k (Suc n) = b" + unfolding abs_mult h_def k_def using coprime_conv_num_denom assms + by (subst (asm) coprime_crossproduct_int) auto + with \k n < k (Suc n)\ and \b \ k n\ show False by auto + qed + + have "s \ 0" + proof + assume "s = 0" + hence "a * k n = b * h n" by (simp add: s_def) + hence "abs (a * k n) = abs (h n * b)" by (simp only: mult_ac) + hence "b = k n \ \a\ = \h n\" unfolding abs_mult h_def k_def using coprime_conv_num_denom assms + by (subst (asm) coprime_crossproduct_int) auto + with * show False by simp + qed + + have "r * k n + s * k (Suc n) = b" by fact + also have "\ \ {0<..k n < k (Suc n)\ by auto + finally have *: "r * k n + s * k (Suc n) \ \" . + + have opposite_signs1: "r > 0 \ s < 0 \ r < 0 \ s > 0" + proof (cases "r \ 0"; cases "s \ 0") + assume "r \ 0" "s \ 0" + hence "0 * (k n) + 1 * (k (Suc n)) \ r * k n + s * k (Suc n)" + using \s \ 0\ by (intro add_mono mult_mono) (auto simp: k_def) + with * show ?thesis by auto + next + assume "\(r \ 0)" "\(s \ 0)" + hence "r * k n + s * k (Suc n) \ 0" + by (intro add_nonpos_nonpos mult_nonpos_nonneg) (auto simp: k_def) + with * show ?thesis by auto + qed (insert \r \ 0\ \s \ 0\, auto) + + have "r \ 1" + proof + assume [simp]: "r = 1" + have "b = r * k n + s * k (Suc n)" + using \r * k n + s * k (Suc n) = b\ .. + also have "s * k (Suc n) \ (-1) * k (Suc n)" + using opposite_signs1 by (intro mult_right_mono) (auto simp: k_def) + also have "r * k n + (-1) * k (Suc n) = k n - k (Suc n)" + by simp + also have "\ \ 0" + unfolding k_def by (auto intro!: conv_denom_leI) + finally show False using \b > 0\ by simp + qed + + have "enat n \ cfrac_length c" "enat (Suc n) \ cfrac_length c" + using assms False by (cases "cfrac_length c"; simp)+ + hence "conv c n \ x \ conv c (Suc n) \ x \ conv c n \ x \ conv c (Suc n) \ x" + using conv_ge_cfrac_lim[of n c] conv_ge_cfrac_lim[of "Suc n" c] + conv_le_cfrac_lim[of n c] conv_le_cfrac_lim[of "Suc n" c] assms + by (cases "even n") auto + hence opposite_signs2: "k n * x - h n \ 0 \ k (Suc n) * x - h (Suc n) \ 0 \ + k n * x - h n \ 0 \ k (Suc n) * x - h (Suc n) \ 0" + using assms conv_denom_pos[of c n] conv_denom_pos[of c "Suc n"] + by (auto simp: k_def h_def conv_num_denom field_simps) + + from opposite_signs1 opposite_signs2 have same_signs: + "r * (k n * x - h n) \ 0 \ s * (k (Suc n) * x - h (Suc n)) \ 0 \ + r * (k n * x - h n) \ 0 \ s * (k (Suc n) * x - h (Suc n)) \ 0" + by (auto intro: mult_nonpos_nonneg mult_nonneg_nonpos mult_nonneg_nonneg mult_nonpos_nonpos) + + show ?thesis + proof (cases "Suc n = cfrac_length c") + case True + have x: "x = h (Suc n) / k (Suc n)" + using True[symmetric] by (auto simp: cfrac_lim_def h_def k_def conv_num_denom x_def) + have "r \ -1" + proof + assume [simp]: "r = -1" + have "r * k n + s * k (Suc n) = b" + by fact + also have "b < k (Suc n)" + using \b \ k n\ and \k n < k (Suc n)\ by simp + finally have "(s - 1) * k (Suc n) < k n" + by (simp add: algebra_simps) + also have "k n \ 1 * k (Suc n)" + by (simp add: k_def conv_denom_leI) + finally have "s < 2" + by (subst (asm) mult_less_cancel_right) (auto simp: k_def) + moreover from opposite_signs1 have "s > 0" by auto + ultimately have [simp]: "s = 1" by simp + + have "b = (cfrac_nth c (Suc n) - 1) * k n + k (n - 1)" + using eq2 \n > 0\ by (cases n) (auto simp: k_def algebra_simps) + also have "cfrac_nth c (Suc n) > 1" + proof - + have "cfrac_canonical c" + using assms True by auto + hence "cfrac_nth c (Suc n) \ 1" + using True[symmetric] by (auto simp: cfrac_canonical_iff enat_0_iff) + moreover have "cfrac_nth c (Suc n) > 0" + by auto + ultimately show "cfrac_nth c (Suc n) > 1" + by linarith + qed + hence "(cfrac_nth c (Suc n) - 1) * k n + k (n - 1) \ 1 * k n + k (n - 1)" + by (intro add_mono mult_right_mono) (auto simp: k_def) + finally have "b > k n" + using conv_denom_pos[of c "n - 1"] unfolding k_def by linarith + with assms show False by simp + qed + with \r \ 1\ \r \ 0\ have "\r\ > 1" + by auto + + from \s \ 0\ have "k n * x \ h n" + using conv_num_denom_prod_diff[of c n] + by (auto simp: x field_simps k_def h_def simp flip: of_int_mult) + hence "1 * \k n * x - h n\ < \r\ * \k n * x - h n\" + using \\r\ > 1\ by (intro mult_strict_right_mono) auto + also have "\ = \r\ * \k n * x - h n\ + 0" by simp + also have "\ \ \r * (k n * x - h n)\ + \s * (k (Suc n) * x - h (Suc n))\" + unfolding abs_mult of_int_abs using conv_denom_pos[of c "Suc n"] \s \ 0\ + by (intro add_left_mono mult_nonneg_nonneg) (auto simp: field_simps k_def) + also have "\ = \r * (k n * x - h n) + s * (k (Suc n) * x - h (Suc n))\" + using same_signs by auto + also have "\ = \(r * k n + s * k (Suc n)) * x - (r * h n + s * h (Suc n))\" + by (simp add: algebra_simps) + also have "\ = \b * x - a\" + unfolding eq1 eq2 by simp + finally show ?thesis by simp + next + case False + from assms have "Suc n < cfrac_length c" + using False \Suc n \ cfrac_length c\ by force + have "1 * \k n * x - h n\ \ \r\ * \k n * x - h n\" + using \r \ 0\ by (intro mult_right_mono) auto + also have "\ = \r\ * \k n * x - h n\ + 0" by simp + also have "x \ h (Suc n) / k (Suc n)" + using conv_neq_cfrac_lim[of "Suc n" c] \Suc n < cfrac_length c\ + by (auto simp: conv_num_denom h_def k_def x_def) + hence "\s * (k (Suc n) * x - h (Suc n))\ > 0" + using \s \ 0\ by (auto simp: field_simps k_def) + also have "\r\ * \k n * x - h n\ + \ \ + \r * (k n * x - h n)\ + \s * (k (Suc n) * x - h (Suc n))\" + unfolding abs_mult of_int_abs by (intro add_left_mono mult_nonneg_nonneg) auto + also have "\ = \r * (k n * x - h n) + s * (k (Suc n) * x - h (Suc n))\" + using same_signs by auto + also have "\ = \(r * k n + s * k (Suc n)) * x - (r * h n + s * h (Suc n))\" + by (simp add: algebra_simps) + also have "\ = \b * x - a\" + unfolding eq1 eq2 by simp + finally show ?thesis by simp + qed + qed +qed + +lemma conv_best_approximation_ex_weak: + fixes a b :: int and x :: real + assumes "n \ cfrac_length c" + assumes "0 < b" and "b < k (Suc n)" and "coprime a b" + defines "x \ cfrac_lim c" + shows "\k n * x - h n\ \ \b * x - a\" +proof (cases "\a\ = \h n\ \ b = k n") + case True + note * = this + show ?thesis + proof (cases "sgn a = sgn (h n)") + case True + with * have [simp]: "a = h n" + by (auto simp: abs_if split: if_splits) + thus ?thesis using * by auto + next + case False + with True have [simp]: "a = -h n" + by (auto simp: abs_if split: if_splits) + have "\real_of_int (k n) * x - real_of_int (h n)\ \ \real_of_int (k n) * x + real_of_int (h n)\" + unfolding x_def using conv_best_approximation_aux[of n] + by (intro abs_diff_le_abs_add) (auto simp: k_def not_le zero_less_mult_iff) + thus ?thesis using True by auto + qed +next + case False + note * = this + show ?thesis + proof (cases "n = cfrac_length c") + case True + hence "x = conv c n" + by (auto simp: cfrac_lim_def x_def split: enat.splits) + also have "\ = h n / k n" + by (auto simp: h_def k_def conv_num_denom) + finally show ?thesis by (auto simp: k_def) + next + case False + + define s where "s = (-1) ^ n * (a * k n - b * h n)" + define r where "r = (-1) ^ n * (b * h (Suc n) - a * k (Suc n))" + + have "r * h n + s * h (Suc n) = + (-1) ^ Suc n * a * (k (Suc n) * h n - k n * h (Suc n))" + by (simp add: s_def r_def algebra_simps h_def k_def) + also have "\ = a" using assms unfolding h_def k_def + by (subst conv_num_denom_prod_diff') (auto simp: algebra_simps) + finally have eq1: "r * h n + s * h (Suc n) = a" . + + have "r * k n + s * k (Suc n) = + (-1) ^ Suc n * b * (k (Suc n) * h n - k n * h (Suc n))" + by (simp add: s_def r_def algebra_simps h_def k_def) + also have "\ = b" using assms unfolding h_def k_def + by (subst conv_num_denom_prod_diff') (auto simp: algebra_simps) + finally have eq2: "r * k n + s * k (Suc n) = b" . + + have "r \ 0" + proof + assume "r = 0" + hence "a * k (Suc n) = b * h (Suc n)" by (simp add: r_def) + hence "abs (a * k (Suc n)) = abs (h (Suc n) * b)" by (simp only: mult_ac) + hence "b = k (Suc n)" unfolding abs_mult h_def k_def using coprime_conv_num_denom assms + by (subst (asm) coprime_crossproduct_int) auto + with assms show False by simp + qed + + have "s \ 0" + proof + assume "s = 0" + hence "a * k n = b * h n" by (simp add: s_def) + hence "abs (a * k n) = abs (h n * b)" by (simp only: mult_ac) + hence "b = k n \ \a\ = \h n\" unfolding abs_mult h_def k_def using coprime_conv_num_denom assms + by (subst (asm) coprime_crossproduct_int) auto + with * show False by simp + qed + + have "r * k n + s * k (Suc n) = b" by fact + also have "\ \ {0<.. \" . + + have opposite_signs1: "r > 0 \ s < 0 \ r < 0 \ s > 0" + proof (cases "r \ 0"; cases "s \ 0") + assume "r \ 0" "s \ 0" + hence "0 * (k n) + 1 * (k (Suc n)) \ r * k n + s * k (Suc n)" + using \s \ 0\ by (intro add_mono mult_mono) (auto simp: k_def) + with * show ?thesis by auto + next + assume "\(r \ 0)" "\(s \ 0)" + hence "r * k n + s * k (Suc n) \ 0" + by (intro add_nonpos_nonpos mult_nonpos_nonneg) (auto simp: k_def) + with * show ?thesis by auto + qed (insert \r \ 0\ \s \ 0\, auto) + + have "enat n \ cfrac_length c" "enat (Suc n) \ cfrac_length c" + using assms False by (cases "cfrac_length c"; simp)+ + hence "conv c n \ x \ conv c (Suc n) \ x \ conv c n \ x \ conv c (Suc n) \ x" + using conv_ge_cfrac_lim[of n c] conv_ge_cfrac_lim[of "Suc n" c] + conv_le_cfrac_lim[of n c] conv_le_cfrac_lim[of "Suc n" c] assms + by (cases "even n") auto + hence opposite_signs2: "k n * x - h n \ 0 \ k (Suc n) * x - h (Suc n) \ 0 \ + k n * x - h n \ 0 \ k (Suc n) * x - h (Suc n) \ 0" + using assms conv_denom_pos[of c n] conv_denom_pos[of c "Suc n"] + by (auto simp: k_def h_def conv_num_denom field_simps) + + from opposite_signs1 opposite_signs2 have same_signs: + "r * (k n * x - h n) \ 0 \ s * (k (Suc n) * x - h (Suc n)) \ 0 \ + r * (k n * x - h n) \ 0 \ s * (k (Suc n) * x - h (Suc n)) \ 0" + by (auto intro: mult_nonpos_nonneg mult_nonneg_nonpos mult_nonneg_nonneg mult_nonpos_nonpos) + + have "1 * \k n * x - h n\ \ \r\ * \k n * x - h n\" + using \r \ 0\ by (intro mult_right_mono) auto + also have "\ = \r\ * \k n * x - h n\ + 0" by simp + also have "\ \ \r * (k n * x - h n)\ + \s * (k (Suc n) * x - h (Suc n))\" + unfolding abs_mult of_int_abs using conv_denom_pos[of c "Suc n"] \s \ 0\ + by (intro add_left_mono mult_nonneg_nonneg) (auto simp: field_simps k_def) + also have "\ = \r * (k n * x - h n) + s * (k (Suc n) * x - h (Suc n))\" + using same_signs by auto + also have "\ = \(r * k n + s * k (Suc n)) * x - (r * h n + s * h (Suc n))\" + by (simp add: algebra_simps) + also have "\ = \b * x - a\" + unfolding eq1 eq2 by simp + finally show ?thesis by simp + qed +qed + +lemma cfrac_canonical_reduce: + "cfrac_canonical c \ + cfrac_is_int c \ \cfrac_is_int c \ cfrac_tl c \ 1 \ cfrac_canonical (cfrac_tl c)" + unfolding cfrac_is_int_def one_cfrac_def + by transfer (auto simp: cfrac_canonical_def llast_LCons split: if_splits split: llist.splits) + +lemma cfrac_nth_0_conv_floor: + assumes "cfrac_canonical c \ cfrac_length c \ 1" + shows "cfrac_nth c 0 = \cfrac_lim c\" +proof (cases "cfrac_is_int c") + case True + thus ?thesis + by (auto simp: cfrac_lim_def cfrac_is_int_def) +next + case False + show ?thesis + proof (cases "cfrac_length c = 1") + case True + hence "cfrac_canonical c" using assms by auto + hence "cfrac_tl c \ 1" using False + by (subst (asm) cfrac_canonical_reduce) auto + thus ?thesis + using cfrac_nth_0_cases[of c] by auto + next + case False + hence "cfrac_length c > 1" + using \\cfrac_is_int c\ + by (cases "cfrac_length c") (auto simp: cfrac_is_int_def one_enat_def zero_enat_def) + have "cfrac_tl c \ 1" + proof + assume "cfrac_tl c = 1" + have "0 < cfrac_length c - 1" + proof (cases "cfrac_length c") + case [simp]: (enat l) + have "cfrac_length c - 1 = enat (l - 1)" + by auto + also have "\ > enat 0" + using \cfrac_length c > 1\ by (simp add: one_enat_def) + finally show ?thesis by (simp add: zero_enat_def) + qed auto + also have "\ = cfrac_length (cfrac_tl c)" + by simp + also have "cfrac_tl c = 1" + by fact + finally show False by simp + qed + thus ?thesis using cfrac_nth_0_cases[of c] by auto + qed +qed + +lemma conv_best_approximation_ex_nat: + fixes a b :: nat and x :: real + assumes "n \ cfrac_length c" "0 < b" "b < k (Suc n)" "coprime a b" + shows "\k n * cfrac_lim c - h n\ \ \b * cfrac_lim c - a\" + using conv_best_approximation_ex_weak[OF assms(1), of b a] assms by auto + +lemma abs_mult_nonneg_left: + assumes "x \ (0 :: 'a :: {ordered_ab_group_add_abs, idom_abs_sgn})" + shows "x * \y\ = \x * y\" +proof - + from assms have "x = \x\" by simp + also have "\ * \y\ = \x * y\" by (simp add: abs_mult) + finally show ?thesis . +qed + +text \ + Any convergent of the continued fraction expansion of \x\ is a best approximation of \x\, + i.e. there is no other number with a smaller denominator that approximates it better. +\ +lemma conv_best_approximation: + fixes a b :: int and x :: real + assumes "n \ cfrac_length c" + assumes "0 < b" and "b < k n" and "coprime a b" + defines "x \ cfrac_lim c" + shows "\x - conv c n\ \ \x - a / b\" +proof - + have "b < k n" by fact + also have "k n \ k (Suc n)" + unfolding k_def by (intro conv_denom_leI) auto + finally have *: "b < k (Suc n)" by simp + have "\x - conv c n\ = \k n * x - h n\ / k n" + using conv_denom_pos[of c n] assms(1) + by (auto simp: conv_num_denom field_simps k_def h_def) + also have "\ \ \b * x - a\ / k n" unfolding x_def using assms * + by (intro divide_right_mono conv_best_approximation_ex_weak) auto + also from assms have "\ \ \b * x - a\ / b" + by (intro divide_left_mono) auto + also have "\ = \x - a / b\" using assms by (simp add: field_simps) + finally show ?thesis . +qed + +lemma conv_denom_partition: + assumes "y > 0" + shows "\!n. y \ {k n..n. k n \ y + 1" + by (auto simp: k_def filterlim_at_top eventually_at_top_linorder) + define n where "n = (LEAST n. k n \ y + 1)" + from LeastI_ex[OF *] have n: "k n > y" by (simp add: Suc_le_eq n_def) + from n and assms have "n > 0" by (intro Nat.gr0I) (auto simp: k_def) + + have "k (n - 1) \ y" + proof (rule ccontr) + assume "\k (n - 1) \ y" + hence "k (n - 1) \ y + 1" by auto + hence "n - 1 \ n" unfolding n_def by (rule Least_le) + with \n > 0\ show False by simp + qed + with n and \n > 0\ have "y \ {k (n - 1)..n. y \ {k n.. {k m.. {k n.. n" + with le have "k (Suc m) \ k n" + unfolding k_def by (intro conv_denom_leI assms) auto + with le show False by auto + qed + qed auto +qed + +text \ + A fraction that approximates a real number \x\ sufficiently well (in a certain sense) + is a convergent of its continued fraction expansion. +\ +lemma frac_is_convergentI: + fixes a b :: int and x :: real + defines "x \ cfrac_lim c" + assumes "b > 0" and "coprime a b" and "\x - a / b\ < 1 / (2 * b\<^sup>2)" + shows "\n. enat n \ cfrac_length c \ (a, b) = (h n, k n)" +proof (cases "a = 0") + case True + with assms have [simp]: "a = 0" "b = 1" + by auto + + show ?thesis + proof (cases x "0 :: real" rule: linorder_cases) + case greater + hence "0 < x" "x < 1/2" + using assms by auto + hence "x \ \" + by (auto simp: Ints_def) + hence "cfrac_nth c 0 = \x\" + using assms by (subst cfrac_nth_0_not_int) (auto simp: x_def) + also from \x > 0\ \x < 1/2\ have "\ = 0" + by linarith + finally have "(a, b) = (h 0, k 0)" + by (auto simp: h_def k_def) + thus ?thesis by (intro exI[of _ 0]) (auto simp flip: zero_enat_def) + next + case less + hence "x < 0" "x > -1/2" + using assms by auto + hence "x \ \" + by (auto simp: Ints_def) + hence not_int: "\cfrac_is_int c" + by (auto simp: cfrac_is_int_def x_def cfrac_lim_def) + have "cfrac_nth c 0 = \x\" + using \x \ \\ assms by (subst cfrac_nth_0_not_int) (auto simp: x_def) + also from \x < 0\ \x > -1/2\ have "\ = -1" + by linarith + finally have [simp]: "cfrac_nth c 0 = -1" . + have "cfrac_nth c (Suc 0) = cfrac_nth (cfrac_tl c) 0" + by simp + have "cfrac_lim (cfrac_tl c) = 1 / (x + 1)" + using not_int by (subst cfrac_lim_tl) (auto simp: x_def) + also from \x < 0\ \x > -1/2\ have "\ \ {1<..<2}" + by (auto simp: divide_simps) + finally have *: "cfrac_lim (cfrac_tl c) \ {1<..<2}" . + have "cfrac_nth (cfrac_tl c) 0 = \cfrac_lim (cfrac_tl c)\" + using * by (subst cfrac_nth_0_not_int) (auto simp: Ints_def) + also have "\ = 1" + using * by (simp, linarith?) + finally have "(a, b) = (h 1, k 1)" + by (auto simp: h_def k_def) + moreover have "cfrac_length c \ 1" + using not_int + by (cases "cfrac_length c") (auto simp: cfrac_is_int_def one_enat_def zero_enat_def) + ultimately show ?thesis by (intro exI[of _ 1]) (auto simp: one_enat_def) + next + case equal + show ?thesis + using cfrac_nth_0_cases[of c] + proof + assume "cfrac_nth c 0 = \cfrac_lim c\" + with equal have "(a, b) = (h 0, k 0)" + by (simp add: x_def h_def k_def) + thus ?thesis by (intro exI[of _ 0]) (auto simp flip: zero_enat_def) + next + assume *: "cfrac_nth c 0 = \cfrac_lim c\ - 1 \ cfrac_tl c = 1" + have [simp]: "cfrac_nth c 0 = -1" + using * equal by (auto simp: x_def) + from * have "\cfrac_is_int c" + by (auto simp: cfrac_is_int_def cfrac_lim_def floor_minus) + have "cfrac_nth c 1 = cfrac_nth (cfrac_tl c) 0" + by auto + also have "cfrac_tl c = 1" + using * by auto + finally have "cfrac_nth c 1 = 1" + by simp + hence "(a, b) = (h 1, k 1)" + by (auto simp: h_def k_def) + moreover from \\cfrac_is_int c\ have "cfrac_length c \ 1" + by (cases "cfrac_length c") (auto simp: one_enat_def zero_enat_def cfrac_is_int_def) + ultimately show ?thesis + by (intro exI[of _ 1]) (auto simp: one_enat_def) + qed + qed +next + case False + hence a_nz: "a \ 0" by auto + + have "x \ 0" + proof + assume [simp]: "x = 0" + hence "\a\ / b < 1 / (2 * b ^ 2)" + using assms by simp + hence "\a\ < 1 / (2 * b)" + using assms by (simp add: field_simps power2_eq_square) + also have "\ \ 1 / 2" + using assms by (intro divide_left_mono) auto + finally have "a = 0" by auto + with \a \ 0\ show False by simp + qed + + show ?thesis + proof (rule ccontr) + assume no_convergent: "\n. enat n \ cfrac_length c \ (a, b) = (h n, k n)" + from assms have "\!r. b \ {k r.. {k r.. 0" + using conv_denom_pos[of c r] assms by (auto simp: k_def) + + show False + proof (cases "enat r \ cfrac_length c") + case False + then obtain l where l: "cfrac_length c = enat l" + by (cases "cfrac_length c") auto + have "k l \ k r" + using False l unfolding k_def by (intro conv_denom_leI) auto + also have "\ \ b" + using r by simp + finally have "b \ k l" . + + have "x = conv c l" + by (auto simp: x_def cfrac_lim_def l) + hence x_eq: "x = h l / k l" + by (auto simp: conv_num_denom h_def k_def) + have "k l > 0" + by (simp add: k_def) + + have "b * k l * \h l / k l - a / b\ < k l / (2*b)" + using assms x_eq \k l > 0\ by (auto simp: field_simps power2_eq_square) + also have "b * k l * \h l / k l - a / b\ = \b * k l * (h l / k l - a / b)\" + using \b > 0\ \k l > 0\ by (subst abs_mult) auto + also have "\ = of_int \b * h l - a * k l\" + using \b > 0\ \k l > 0\ by (simp add: algebra_simps) + also have "k l / (2 * b) < 1" + using \b \ k l\ \b > 0\ by auto + finally have "a * k l = b * h l" + by linarith + moreover have "coprime (h l) (k l)" + unfolding h_def k_def by (simp add: coprime_conv_num_denom) + ultimately have "(a, b) = (h l, k l)" + using \coprime a b\ using a_nz \b > 0\ \k l > 0\ + by (subst (asm) coprime_crossproduct') (auto simp: coprime_commute) + with no_convergent and l show False + by auto + + next + + case True + have "k r * \x - h r / k r\ = \k r * x - h r\" + using \k r > 0\ by (simp add: field_simps) + also have "\k r * x - h r\ \ \b * x - a\" + using assms r True unfolding x_def by (intro conv_best_approximation_ex_weak) auto + also have "\ = b * \x - a / b\" + using \b > 0\ by (simp add: field_simps) + also have "\ < b * (1 / (2 * b\<^sup>2))" + using \b > 0\ by (intro mult_strict_left_mono assms) auto + finally have less: "\x - conv c r\ < 1 / (2 * b * k r)" + using \k r > 0\ and \b > 0\ and assms + by (simp add: field_simps power2_eq_square conv_num_denom h_def k_def) + + have "\x - a / b\ < 1 / (2 * b\<^sup>2)" by fact + also have "\ = 1 / (2 * b) * (1 / b)" + by (simp add: power2_eq_square) + also have "\ \ 1 / (2 * b) * (\a\ / b)" + using a_nz assms by (intro mult_left_mono divide_right_mono) auto + also have "\ < 1 / 1 * (\a\ / b)" + using a_nz assms + by (intro mult_strict_right_mono divide_left_mono divide_strict_left_mono) auto + also have "\ = \a / b\" using assms by simp + finally have "sgn x = sgn (a / b)" + by (auto simp: sgn_if split: if_splits) + hence "sgn x = sgn a" using assms by (auto simp: sgn_of_int) + hence "a \ 0 \ x \ 0 \ a \ 0 \ x \ 0" + by (auto simp: sgn_if split: if_splits) + moreover have "h r \ 0 \ x \ 0 \ h r \ 0 \ x \ 0" + using conv_best_approximation_aux[of r] by (auto simp: h_def x_def) + ultimately have signs: "h r \ 0 \ a \ 0 \ h r \ 0 \ a \ 0" + using \x \ 0\ by auto + + with no_convergent assms assms True have "\h r\ \ \a\ \ b \ k r" + by (auto simp: h_def k_def) + + hence "\h r\ * \b\ \ \a\ * \k r\" unfolding h_def k_def + using assms coprime_conv_num_denom[of c r] + by (subst coprime_crossproduct_int) auto + hence "\h r\ * b \ \a\ * k r" using assms by (simp add: k_def) + hence "k r * a - h r * b \ 0" + using signs by (auto simp: algebra_simps) + hence "\k r * a - h r * b\ \ 1" by presburger + hence "real_of_int 1 / (k r * b) \ \k r * a - h r * b\ / (k r * b)" + using assms + by (intro divide_right_mono, subst of_int_le_iff) (auto simp: k_def) + also have "\ = \(real_of_int (k r) * a - h r * b) / (k r * b)\" + using assms by (simp add: k_def) + also have "(real_of_int (k r) * a - h r * b) / (k r * b) = a / b - conv c r" + using assms \k r > 0\ by (simp add: h_def k_def conv_num_denom field_simps) + also have "\a / b - conv c r\ = \(x - conv c r) - (x - a / b)\" + by (simp add: algebra_simps) + also have "\ \ \x - conv c r\ + \x - a / b\" + by (rule abs_triangle_ineq4) + also have "\ < 1 / (2 * b * k r) + 1 / (2 * b\<^sup>2)" + by (intro add_strict_mono assms less) + finally have "k r > b" + using \b > 0\ and \k r > 0\ by (simp add: power2_eq_square field_simps) + with r show False by auto + qed + qed +qed + +end + + +subsection \Efficient code for convergents\ + + +function conv_gen :: "(nat \ int) \ int \ int \ nat \ nat \ int" where + "conv_gen c (a, b, n) N = + (if n > N then b else conv_gen c (b, b * c n + a, Suc n) N)" + by auto +termination by (relation "measure (\(_, (_, _, n), N). Suc N - n)") auto + +lemmas [simp del] = conv_gen.simps + +lemma conv_gen_aux_simps [simp]: + "n > N \ conv_gen c (a, b, n) N = b" + "n \ N \ conv_gen c (a, b, n) N = conv_gen c (b, b * c n + a, Suc n) N" + by (subst conv_gen.simps, simp)+ + +lemma conv_num_eq_conv_gen_aux: + "Suc n \ N \ conv_num c n = b * cfrac_nth c n + a \ + conv_num c (Suc n) = conv_num c n * cfrac_nth c (Suc n) + b \ + conv_num c N = conv_gen (cfrac_nth c) (a, b, n) N" +proof (induction "cfrac_nth c" "(a, b, n)" N arbitrary: c a b n rule: conv_gen.induct) + case (1 a b n N c) + show ?case + proof (cases "Suc (Suc n) \ N") + case True + thus ?thesis + by (subst 1) (insert "1.prems", auto) + next + case False + thus ?thesis using 1 + by (auto simp: not_le less_Suc_eq) + qed +qed + +lemma conv_denom_eq_conv_gen_aux: + "Suc n \ N \ conv_denom c n = b * cfrac_nth c n + a \ + conv_denom c (Suc n) = conv_denom c n * cfrac_nth c (Suc n) + b \ + conv_denom c N = conv_gen (cfrac_nth c) (a, b, n) N" +proof (induction "cfrac_nth c" "(a, b, n)" N arbitrary: c a b n rule: conv_gen.induct) + case (1 a b n N c) + show ?case + proof (cases "Suc (Suc n) \ N") + case True + thus ?thesis + by (subst 1) (insert "1.prems", auto) + next + case False + thus ?thesis using 1 + by (auto simp: not_le less_Suc_eq) + qed +qed + +lemma conv_num_code [code]: "conv_num c n = conv_gen (cfrac_nth c) (0, 1, 0) n" + using conv_num_eq_conv_gen_aux[of 0 n c 1 0] by (cases n) simp_all + +lemma conv_denom_code [code]: "conv_denom c n = conv_gen (cfrac_nth c) (1, 0, 0) n" + using conv_denom_eq_conv_gen_aux[of 0 n c 0 1] by (cases n) simp_all + +definition conv_num_fun where "conv_num_fun c = conv_gen c (0, 1, 0)" +definition conv_denom_fun where "conv_denom_fun c = conv_gen c (1, 0, 0)" + +lemma + assumes "is_cfrac c" + shows conv_num_fun_eq: "conv_num_fun c n = conv_num (cfrac c) n" + and conv_denom_fun_eq: "conv_denom_fun c n = conv_denom (cfrac c) n" +proof - + from assms have "cfrac_nth (cfrac c) = c" + by (intro ext) simp_all + thus "conv_num_fun c n = conv_num (cfrac c) n" and "conv_denom_fun c n = conv_denom (cfrac c) n" + by (simp_all add: conv_num_fun_def conv_num_code conv_denom_fun_def conv_denom_code) +qed + + +subsection \Computing the continued fraction expansion of a rational number\ + + +function cfrac_list_of_rat :: "int \ int \ int list" where + "cfrac_list_of_rat (a, b) = + (if b = 0 then [0] + else a div b # (if a mod b = 0 then [] else cfrac_list_of_rat (b, a mod b)))" + by auto +termination + by (relation "measure (\(a,b). nat (abs b))") (auto simp: abs_mod_less) + +lemmas [simp del] = cfrac_list_of_rat.simps + +lemma cfrac_list_of_rat_correct: + "(let xs = cfrac_list_of_rat (a, b); c = cfrac_of_real (a / b) + in length xs = cfrac_length c + 1 \ (\i (\i 0" + using l False cfrac_of_real_length_eq_0_iff[of "a / b"] \b \ 0\ + by (auto simp: c_def zero_enat_def real_of_int_divide_in_Ints_iff intro!: Nat.gr0I) + have c': "c' = cfrac_tl c" + using False \b \ 0\ unfolding c'_def c_def + by (subst cfrac_tl_of_real) (auto simp: real_of_int_divide_in_Ints_iff frac_fraction) + from 1 have "enat (length xs') = cfrac_length c' + 1" + and xs': "\ib \ 0\ \\b dvd a\ by (auto simp: Let_def xs'_def c'_def) + + have "enat (length xs') = cfrac_length c' + 1" + by fact + also have "\ = enat l - 1 + 1" + using c' l by simp + also have "\ = enat (l - 1 + 1)" + by (metis enat_diff_one one_enat_def plus_enat_simps(1)) + also have "l - 1 + 1 = l" + using \l \ 0\ by simp + finally have [simp]: "length xs' = l" + by simp + + from xs' show ?thesis + by (auto simp: xs_def nth_Cons c' split: nat.splits) + qed + thus ?thesis using l False + by (subst cfrac_list_of_rat.simps) (simp_all add: xs_def xs'_def c_def one_enat_def) + qed +qed + +lemma conv_num_cong: + assumes "(\k. k \ n \ cfrac_nth c k = cfrac_nth c' k)" "n = n'" + shows "conv_num c n = conv_num c' n" +proof - + have "conv_num c n = conv_num c' n" + using assms(1) + by (induction n arbitrary: rule: conv_num.induct) simp_all + thus ?thesis using assms(2) + by simp +qed + +lemma conv_denom_cong: + assumes "(\k. k \ n \ cfrac_nth c k = cfrac_nth c' k)" "n = n'" + shows "conv_denom c n = conv_denom c' n'" +proof - + have "conv_denom c n = conv_denom c' n" + using assms(1) + by (induction n arbitrary: rule: conv_denom.induct) simp_all + thus ?thesis using assms(2) + by simp +qed + +lemma cfrac_lim_diff_le: + assumes "\k\Suc n. cfrac_nth c1 k = cfrac_nth c2 k" + assumes "n \ cfrac_length c1" "n \ cfrac_length c2" + shows "\cfrac_lim c1 - cfrac_lim c2\ \ 2 / (conv_denom c1 n * conv_denom c1 (Suc n))" +proof - + define d where "d = (\k. conv_denom c1 k)" + have "\cfrac_lim c1 - cfrac_lim c2\ \ \cfrac_lim c1 - conv c1 n\ + \cfrac_lim c2 - conv c1 n\" + by linarith + also have "\cfrac_lim c1 - conv c1 n\ \ 1 / (d n * d (Suc n))" + unfolding d_def using assms + by (intro cfrac_lim_minus_conv_upper_bound) auto + also have "conv c1 n = conv c2 n" + using assms by (intro conv_cong) auto + also have "\cfrac_lim c2 - conv c2 n\ \ 1 / (conv_denom c2 n * conv_denom c2 (Suc n))" + using assms unfolding d_def by (intro cfrac_lim_minus_conv_upper_bound) auto + also have "conv_denom c2 n = d n" + unfolding d_def using assms by (intro conv_denom_cong) auto + also have "conv_denom c2 (Suc n) = d (Suc n)" + unfolding d_def using assms by (intro conv_denom_cong) auto + also have "1 / (d n * d (Suc n)) + 1 / (d n * d (Suc n)) = 2 / (d n * d (Suc n))" + by simp + finally show ?thesis + by (simp add: d_def) +qed + +lemma of_int_leI: "n \ m \ (of_int n :: 'a :: linordered_idom) \ of_int m" + by simp + +lemma cfrac_lim_diff_le': + assumes "\k\Suc n. cfrac_nth c1 k = cfrac_nth c2 k" + assumes "n \ cfrac_length c1" "n \ cfrac_length c2" + shows "\cfrac_lim c1 - cfrac_lim c2\ \ 2 / (fib (n+1) * fib (n+2))" +proof - + have "\cfrac_lim c1 - cfrac_lim c2\ \ 2 / (conv_denom c1 n * conv_denom c1 (Suc n))" + by (rule cfrac_lim_diff_le) (use assms in auto) + also have "\ \ 2 / (int (fib (Suc n)) * int (fib (Suc (Suc n))))" + unfolding of_nat_mult of_int_mult + by (intro divide_left_mono mult_mono mult_pos_pos of_int_leI conv_denom_lower_bound) + (auto intro!: fib_neq_0_nat simp del: fib.simps) + also have "\ = 2 / (fib (n+1) * fib (n+2))" + by simp + finally show ?thesis . +qed + +end \ No newline at end of file diff --git a/thys/Continued_Fractions/E_CFrac.thy b/thys/Continued_Fractions/E_CFrac.thy new file mode 100644 --- /dev/null +++ b/thys/Continued_Fractions/E_CFrac.thy @@ -0,0 +1,369 @@ +(* + File: Continued_Fractions/E_CFrac.thy + Author: Manuel Eberl, University of Innsbruck +*) +section \The continued fraction expansion of $e$\ +theory E_CFrac +imports + "HOL-Analysis.Analysis" + "Continued_Fractions" + "Quadratic_Irrationals" +begin + +lemma fact_real_at_top: "filterlim (fact :: nat \ real) at_top at_top" +proof (rule filterlim_at_top_mono) + have "real n \ real (fact n)" for n + unfolding of_nat_le_iff by (rule fact_ge_self) + thus "eventually (\n. real n \ fact n) at_top" by simp +qed (fact filterlim_real_sequentially) + +lemma filterlim_div_nat_at_top: + assumes "filterlim f at_top F" "m > 0" + shows "filterlim (\x. f x div m :: nat) at_top F" + unfolding filterlim_at_top +proof + fix C :: nat + from assms(1) have "eventually (\x. f x \ C * m) F" + by (auto simp: filterlim_at_top) + thus "eventually (\x. f x div m \ C) F" + proof eventually_elim + case (elim x) + hence "(C * m) div m \ f x div m" + by (intro div_le_mono) + thus ?case using \m > 0\ by simp + qed +qed + +text \ + The continued fraction expansion of $e$ has the form + $[2; 1, 2, 1, 1, 4, 1, 1, 6, 1, 1, 8, 1, \ldots]$: +\ +definition e_cfrac where + "e_cfrac = cfrac (\n. if n = 0 then 2 else if n mod 3 = 2 then 2 * (Suc n div 3) else 1)" + +lemma cfrac_nth_e: + "cfrac_nth e_cfrac n = (if n = 0 then 2 else if n mod 3 = 2 then 2 * (Suc n div 3) else 1)" + unfolding e_cfrac_def by (subst cfrac_nth_cfrac) (auto simp: is_cfrac_def) + +lemma cfrac_length_e [simp]: "cfrac_length e_cfrac = \" + by (simp add: e_cfrac_def) + + +text \ + The formalised proof follows the one from Proof Wiki~\cite{proofwiki}. +\ + +context + fixes A B C :: "nat \ real" and p q :: "nat \ int" and a :: "nat \ int" + defines "A \ (\n. integral {0..1} (\x. exp x * x ^ n * (x - 1) ^ n / fact n))" + and "B \ (\n. integral {0..1} (\x. exp x * x ^ Suc n * (x - 1) ^ n / fact n))" + and "C \ (\n. integral {0..1} (\x. exp x * x ^ n * (x - 1) ^ Suc n / fact n))" + and "p \ (\n. if n \ 1 then 1 else conv_num e_cfrac (n - 2))" + and "q \ (\n. if n = 0 then 1 else if n = 1 then 0 else conv_denom e_cfrac (n - 2))" + and "a \ (\n. if n mod 3 = 2 then 2 * (Suc n div 3) else 1)" +begin + +lemma + assumes "n \ 2" + shows p_rec: "p n = a (n - 2) * p (n - 1) + p (n - 2)" (is ?th1) + and q_rec: "q n = a (n - 2) * q (n - 1) + q (n - 2)" (is ?th2) +proof - + have n_minus_3: "n - 3 = n - Suc (Suc (Suc 0))" + by (simp add: numeral_3_eq_3) + consider "n = 2" | "n = 3" | "n \ 4" + using assms by force + hence "?th1 \ ?th2" + by cases (auto simp: p_def q_def cfrac_nth_e a_def conv_num_rec conv_denom_rec n_minus_3) + thus ?th1 ?th2 by blast+ +qed + +lemma + assumes "n \ 1" + shows p_rec0: "p (3 * n) = p (3 * n - 1) + p (3 * n - 2)" + and q_rec0: "q (3 * n) = q (3 * n - 1) + q (3 * n - 2)" +proof - + define n' where "n' = n - 1" + from assms have "(3 * n' + 1) mod 3 \ 2" + by presburger + also have "(3 * n' + 1) = 3 * n - 2" + using assms by (simp add: n'_def) + finally show "p (3 * n) = p (3 * n - 1) + p (3 * n - 2)" + "q (3 * n) = q (3 * n - 1) + q (3 * n - 2)" + using assms by (subst p_rec q_rec; simp add: a_def)+ +qed + +lemma + assumes "n \ 1" + shows p_rec1: "p (3 * n + 1) = 2 * int n * p (3 * n) + p (3 * n - 1)" + and q_rec1: "q (3 * n + 1) = 2 * int n * q (3 * n) + q (3 * n - 1)" +proof - + define n' where "n' = n - 1" + from assms have "(3 * n' + 2) mod 3 = 2" + by presburger + also have "(3 * n' + 2) = 3 * n - 1" + using assms by (simp add: n'_def) + finally show "p (3 * n + 1) = 2 * int n * p (3 * n) + p (3 * n - 1)" + "q (3 * n + 1) = 2 * int n * q (3 * n) + q (3 * n - 1)" + using assms by (subst p_rec q_rec; simp add: a_def)+ +qed + +lemma p_rec2: "p (3 * n + 2) = p (3 * n + 1) + p (3 * n)" + and q_rec2: "q (3 * n + 2) = q (3 * n + 1) + q (3 * n)" + by (subst p_rec q_rec; simp add: a_def nat_mult_distrib nat_add_distrib)+ + +lemma A_0: "A 0 = exp 1 - 1" and B_0: "B 0 = 1" and C_0: "C 0 = 2 - exp 1" +proof - + have "(exp has_integral (exp 1 - exp 0)) {0..1::real}" + by (intro fundamental_theorem_of_calculus) + (auto intro!: derivative_eq_intros + simp flip: has_real_derivative_iff_has_vector_derivative) + thus "A 0 = exp 1 - 1" by (simp add: A_def has_integral_iff) + + have "((\x. exp x * x) has_integral (exp 1 * (1 - 1) - exp 0 * (0 - 1))) {0..1::real}" + by (intro fundamental_theorem_of_calculus) + (auto intro!: derivative_eq_intros + simp flip: has_real_derivative_iff_has_vector_derivative simp: algebra_simps) + thus "B 0 = 1" by (simp add: B_def has_integral_iff) + + have "((\x. exp x * (x - 1)) has_integral (exp 1 * (1 - 2) - exp 0 * (0 - 2))) {0..1::real}" + by (intro fundamental_theorem_of_calculus) + (auto intro!: derivative_eq_intros + simp flip: has_real_derivative_iff_has_vector_derivative simp: algebra_simps) + thus "C 0 = 2 - exp 1" by (simp add: C_def has_integral_iff) +qed + +lemma A_bound: "norm (A n) \ exp 1 / fact n" +proof - + have "norm (exp t * t ^ n * (t - 1) ^ n / fact n) \ exp 1 * 1 ^ n * 1 ^ n / fact n" + if "t \ {0..1}" for t :: real using that unfolding norm_mult norm_divide norm_power norm_fact + by (intro mult_mono divide_right_mono power_mono) auto + hence "norm (A n) \ exp 1 / fact n * (1 - 0)" + unfolding A_def by (intro integral_bound) (auto intro!: continuous_intros) + thus ?thesis by simp +qed + +lemma B_bound: "norm (B n) \ exp 1 / fact n" +proof - + have "norm (exp t * t ^ Suc n * (t - 1) ^ n / fact n) \ exp 1 * 1 ^ Suc n * 1 ^ n / fact n" + if "t \ {0..1}" for t :: real using that unfolding norm_mult norm_divide norm_power norm_fact + by (intro mult_mono divide_right_mono power_mono) auto + hence "norm (B n) \ exp 1 / fact n * (1 - 0)" + unfolding B_def by (intro integral_bound) (auto intro!: continuous_intros) + thus ?thesis by simp +qed + +lemma C_bound: "norm (C n) \ exp 1 / fact n" +proof - + have "norm (exp t * t ^ n * (t - 1) ^ Suc n / fact n) \ exp 1 * 1 ^ n * 1 ^ Suc n / fact n" + if "t \ {0..1}" for t :: real using that unfolding norm_mult norm_divide norm_power norm_fact + by (intro mult_mono divide_right_mono power_mono) auto + hence "norm (C n) \ exp 1 / fact n * (1 - 0)" + unfolding C_def by (intro integral_bound) (auto intro!: continuous_intros) + thus ?thesis by simp +qed + +lemma A_Suc: "A (Suc n) = -B n - C n" +proof - + let ?g = "\x. x ^ Suc n * (x - 1) ^ Suc n * exp x / fact (Suc n)" + have pos: "fact n + real n * fact n > 0" by (intro add_pos_nonneg) auto + have "A (Suc n) + B n + C n = + integral {0..1} (\x. exp x * x ^ Suc n * (x - 1) ^ Suc n / fact (Suc n) + + exp x * x ^ Suc n * (x - 1) ^ n / fact n + exp x * x ^ n * (x - 1) ^ Suc n / fact n)" + unfolding A_def B_def C_def + apply (subst integral_add [symmetric]) + subgoal + by (auto intro!: integrable_continuous_real continuous_intros) + subgoal + by (auto intro!: integrable_continuous_real continuous_intros) + apply (subst integral_add [symmetric]) + apply (auto intro!: integrable_continuous_real continuous_intros) + done + also have "\ = integral {0..1} (\x. exp x / fact (Suc n) * + (x ^ Suc n * (x - 1) ^ Suc n + Suc n * x ^ Suc n * (x - 1) ^ n + + Suc n * x ^ n * (x - 1) ^ Suc n))" + (is "_ = integral _ ?f") + apply (simp add: divide_simps) + apply (simp add: field_simps)? + done + also have "(?f has_integral (?g 1 - ?g 0)) {0..1}" + apply (intro fundamental_theorem_of_calculus) + subgoal + by simp + unfolding has_real_derivative_iff_has_vector_derivative [symmetric] + apply (rule derivative_eq_intros refl | simp)+ + apply (simp add: algebra_simps)? + done + hence "integral {0..1} ?f = 0" + by (simp add: has_integral_iff) + finally show ?thesis by simp +qed + +lemma B_Suc: "B (Suc n) = -2 * Suc n * A (Suc n) + C n" +proof - + let ?g = "\x. x ^ Suc n * (x - 1) ^ (n+2) * exp x / fact (Suc n)" + have pos: "fact n + real n * fact n > 0" by (intro add_pos_nonneg) auto + have "B (Suc n) + 2 * Suc n * A (Suc n) - C n = + integral {0..1} (\x. exp x * x^(n+2) * (x - 1)^(n+1) / fact (Suc n) + 2 * Suc n * + exp x * x ^ Suc n * (x - 1) ^ Suc n / fact (Suc n) - exp x * x ^ n * (x - 1) ^ Suc n / fact n)" + unfolding A_def B_def C_def integral_mult_right [symmetric] + apply (subst integral_add [symmetric]) + subgoal + by (auto intro!: integrable_continuous_real continuous_intros) + subgoal + by (auto intro!: integrable_continuous_real continuous_intros) + apply (subst integral_diff [symmetric]) + apply (auto intro!: integrable_continuous_real continuous_intros simp: mult_ac) + done + also have "\ = integral {0..1} (\x. exp x / fact (Suc n) * + (x^(n+2) * (x - 1)^(n+1) + 2 * Suc n * x ^ Suc n * (x - 1) ^ Suc n - + Suc n * x ^ n * (x - 1) ^ Suc n))" + (is "_ = integral _ ?f") + apply (simp add: divide_simps) + apply (simp add: field_simps)? + done + also have "(?f has_integral (?g 1 - ?g 0)) {0..1}" + apply (intro fundamental_theorem_of_calculus) + apply (simp; fail) + unfolding has_real_derivative_iff_has_vector_derivative [symmetric] + apply (rule derivative_eq_intros refl | simp)+ + apply (simp add: algebra_simps)? + done + hence "integral {0..1} ?f = 0" + by (simp add: has_integral_iff) + finally show ?thesis by (simp add: algebra_simps) +qed + +lemma C_Suc: "C n = B n - A n" + unfolding A_def B_def C_def + by (subst integral_diff [symmetric]) + (auto intro!: integrable_continuous_real continuous_intros simp: field_simps) + +lemma unfold_add_numeral: "c * n + numeral b = Suc (c * n + pred_numeral b)" + by simp + +lemma ABC: + "A n = q (3 * n) * exp 1 - p (3 * n) \ + B n = p (Suc (3 * n)) - q (Suc (3 * n)) * exp 1 \ + C n = p (Suc (Suc (3 * n))) - q (Suc (Suc (3 * n))) * exp 1" +proof (induction n) + case 0 + thus ?case by (simp add: A_0 B_0 C_0 a_def p_def q_def cfrac_nth_e) +next + case (Suc n) + note [simp] = + conjunct1[OF Suc.IH] conjunct1[OF conjunct2[OF Suc.IH]] conjunct2[OF conjunct2[OF Suc.IH]] + have [simp]: "3 + m = Suc (Suc (Suc m))" for m by simp + + have A': "A (Suc n) = of_int (q (3 * Suc n)) * exp 1 - of_int (p (3 * Suc n))" + unfolding A_Suc + by (subst p_rec0 q_rec0, simp)+ (auto simp: algebra_simps) + have B': "B (Suc n) = of_int (p (3 * Suc n + 1)) - of_int (q (3 * Suc n + 1)) * exp 1" + unfolding B_Suc + by (subst p_rec1 q_rec1 p_rec0 q_rec0, simp)+ (auto simp: algebra_simps A_Suc) + have C': "C (Suc n) = of_int (p (3*Suc n+2)) - of_int (q (3*Suc n+2)) * exp 1" + unfolding A_Suc B_Suc C_Suc using p_rec2[of n] q_rec2[of n] + by ((subst p_rec2 q_rec2)+, (subst p_rec0 q_rec0 p_rec1 q_rec1, simp)+) + (auto simp: algebra_simps A_Suc B_Suc) + from A' B' C' show ?case by simp +qed + +lemma q_pos: "q n > 0" if "n \ 1" + using that by (auto simp: q_def) + +lemma conv_diff_exp_bound: "norm (exp 1 - p n / q n) \ exp 1 / fact (n div 3)" +proof (cases "n = 1") + case False + define n' where "n' = n div 3" + consider "n mod 3 = 0" | "n mod 3 = 1" | "n mod 3 = 2" + by force + hence diff [unfolded n'_def]: "q n * exp 1 - p n = + (if n mod 3 = 0 then A n' else if n mod 3 = 1 then -B n' else -C n')" + proof cases + assume "n mod 3 = 0" + hence "3 * n' = n" unfolding n'_def by presburger + with ABC[of n'] show ?thesis by auto + next + assume *: "n mod 3 = 1" + hence "Suc (3 * n') = n" unfolding n'_def by presburger + with * ABC[of n'] show ?thesis by auto + next + assume *: "n mod 3 = 2" + hence "Suc (Suc (3 * n')) = n" unfolding n'_def by presburger + with * ABC[of n'] show ?thesis by auto + qed + + note [[linarith_split_limit = 0]] + have "norm ((q n * exp 1 - p n) / q n) \ exp 1 / fact (n div 3) / 1" unfolding diff norm_divide + using A_bound[of "n div 3"] B_bound[of "n div 3"] C_bound[of "n div 3"] q_pos[OF \n \ 1\] + by (subst frac_le) (auto simp: of_nat_ge_1_iff) + also have "(q n * exp 1 - p n) / q n = exp 1 - p n / q n" + using q_pos[OF \n \ 1\] by (simp add: divide_simps) + finally show ?thesis by simp +qed (auto simp: p_def q_def) + +theorem e_cfrac: "cfrac_lim e_cfrac = exp 1" +proof - + have num: "conv_num e_cfrac n = p (n + 2)" + and denom: "conv_denom e_cfrac n = q (n + 2)" for n + by (simp_all add: p_def q_def) + + have "(\n. exp 1 - p n / q n) \ 0" + proof (rule Lim_null_comparison) + show "eventually (\n. norm (exp 1 - p n / q n) \ exp 1 / fact (n div 3)) at_top" + using conv_diff_exp_bound by (intro always_eventually) auto + show "(\n. exp 1 / fact (n div 3) :: real) \ 0" + by (rule real_tendsto_divide_at_top tendsto_const filterlim_div_nat_at_top + filterlim_ident filterlim_compose[OF fact_real_at_top])+ auto + qed + moreover have "eventually (\n. exp 1 - p n / q n = exp 1 - conv e_cfrac (n - 2)) at_top" + using eventually_ge_at_top[of 2] + proof eventually_elim + case (elim n) + with num[of "n - 2"] denom[of "n - 2"] wf show ?case + by (simp add: eval_nat_numeral Suc_diff_Suc conv_num_denom) + qed + ultimately have "(\n. exp 1 - conv e_cfrac (n - 2)) \ 0" + using Lim_transform_eventually by fast + hence "(\n. exp 1 - (exp 1 - conv e_cfrac (Suc (Suc n) - 2))) \ exp 1 - 0" + by (subst filterlim_sequentially_Suc)+ (intro tendsto_diff tendsto_const) + hence "conv e_cfrac \ exp 1" by simp + moreover have "conv e_cfrac \ cfrac_lim e_cfrac" + by (intro LIMSEQ_cfrac_lim wf) auto + ultimately have "exp 1 = cfrac_lim e_cfrac" + by (rule LIMSEQ_unique) + thus ?thesis .. +qed + +corollary e_cfrac_altdef: "e_cfrac = cfrac_of_real (exp 1)" + by (metis e_cfrac cfrac_infinite_iff cfrac_length_e cfrac_of_real_cfrac_lim_irrational) + +text \ + This also provides us with a nice proof that $e$ is not rational and not a quadratic irrational + either. +\ +corollary exp1_irrational: "(exp 1 :: real) \ \" + by (metis cfrac_length_e e_cfrac cfrac_infinite_iff) + +corollary exp1_not_quadratic_irrational: "\quadratic_irrational (exp 1 :: real)" +proof - + have "range (\n. 2 * (int n + 1)) \ range (cfrac_nth e_cfrac)" + proof safe + fix n :: nat + have "cfrac_nth e_cfrac (3*n+2) \ range (cfrac_nth e_cfrac)" + by blast + also have "(3 * n + 2) mod 3 = 2" + by presburger + hence "cfrac_nth e_cfrac (3*n+2) = 2 * (int n + 1)" + by (simp add: cfrac_nth_e) + finally show "2 * (int n + 1) \ range (cfrac_nth e_cfrac)" . + qed + moreover have "infinite (range (\n. 2 * (int n + 1)))" + by (subst finite_image_iff) (auto intro!: injI) + ultimately have "infinite (range (cfrac_nth e_cfrac))" + using finite_subset by blast + thus ?thesis using quadratic_irrational_cfrac_nth_range_finite[of e_cfrac] + by (auto simp: e_cfrac) +qed + +end +end \ No newline at end of file diff --git a/thys/Continued_Fractions/Pell_Continued_Fraction.thy b/thys/Continued_Fractions/Pell_Continued_Fraction.thy new file mode 100644 --- /dev/null +++ b/thys/Continued_Fractions/Pell_Continued_Fraction.thy @@ -0,0 +1,421 @@ +(* + File: Continued_Fractions/Pell_Continued_Fraction.thy + Author: Manuel Eberl, University of Innsbruck +*) +section \The Connection between the continued fraction expansion of square roots and Pell's equation\ +theory Pell_Continued_Fraction +imports + Sqrt_Nat_Cfrac + Pell.Pell_Algorithm + Polynomial_Factorization.Prime_Factorization + Pell_Lifting +begin + +lemma irrational_times_int_eq_intD: + assumes "p * real_of_int a = real_of_int b" + assumes "p \ \" + shows "a = 0 \ b = 0" +proof - + have "a = 0" + proof (rule ccontr) + assume "a \ 0" + with assms(1) have "p = b / a" by (auto simp: field_simps) + also have "\ \ \" by auto + finally show False using assms(2) by contradiction + qed + with assms show ?thesis by simp +qed + + +text \ + The solutions to Pell's equation for some non-square \D\ are linked to the continued + fraction expansion of $\sqrt{D}$, which we shall show here. +\ + +context + fixes D :: nat and c h k P Q l + assumes nonsquare: "\is_square D" + defines "c \ cfrac_of_real (sqrt D)" + defines "h \ conv_num c" and "k \ conv_denom c" + defines "P \ fst \ sqrt_remainder_surd D" and "Q \ snd \ sqrt_remainder_surd D" + defines "l \ sqrt_nat_period_length D" +begin + +interpretation pell D + by unfold_locales fact+ + +lemma cfrac_length_infinite [simp]: "cfrac_length c = \" +proof - + have "sqrt D \ \" + using nonsquare by (simp add: irrat_sqrt_nonsquare) + thus ?thesis + by (simp add: c_def) +qed + +lemma conv_num_denom_pell: + "h 0 ^ 2 - D * k 0 ^ 2 < 0" + "m > 0 \ h m ^ 2 - D * k m ^ 2 = (-1) ^ Suc m * Q m" +proof - + define D' where "D' = Discrete.sqrt D" + have "h 0 ^ 2 - D * k 0 ^ 2 = int (D' ^ 2) - int D" + by (simp_all add: h_def k_def c_def Discrete_sqrt_altdef D'_def) + also { + have "int (D' ^ 2) - int D \ 0" + using Discrete.sqrt_power2_le[of D] by (simp add: D'_def) + moreover have "D \ D' ^ 2" using nonsquare by auto + ultimately have "int (D' ^ 2) - int D < 0" by linarith + } + finally show "h 0 ^ 2 - D * k 0 ^ 2 < 0" . +next + assume "m > 0" + define n where "n = m - 1" + define \ where "\ = cfrac_remainder c" + define \' where "\' = sqrt_remainder_surd D" + have m: "m = Suc n" using \m > 0\ by (simp add: n_def) + from nonsquare have "D > 1" + by (cases D) (auto intro!: Nat.gr0I) + from nonsquare have irrat: "sqrt D \ \" + using irrat_sqrt_nonsquare by blast + have [simp]: "cfrac_lim c = sqrt D" + using irrat \D > 1\ by (simp add: c_def) + have \_pos: "\ n > 0" for n + unfolding \_def using wf \D > 1\ cfrac_remainder_pos[of c n] + by (cases "n = 0") auto + have \': "\' n = (P n, Q n)" for n by (simp add: \'_def P_def Q_def) + have Q_pos: "Q n > 0" for n + using snd_sqrt_remainder_surd_pos[OF nonsquare] by (simp add: Q_def) + have k_pos: "k n > 0" for n + by (auto simp: k_def intro!: conv_denom_pos) + have k_nonneg: "k n \ 0" for n + by (auto simp: k_def intro!: conv_denom_nonneg) + + let ?A = "(sqrt D + P (n + 1)) * h (n + 1) + Q (n + 1) * h n" + let ?B = "(sqrt D + P (n + 1)) * k (n + 1) + Q (n + 1) * k n" + have "?B > 0" using k_pos Q_pos k_nonneg + by (intro add_nonneg_pos mult_nonneg_nonneg add_nonneg_nonneg) auto + + have "sqrt D = conv' c (Suc (Suc n)) (\ (Suc (Suc n)))" + unfolding \_def by (subst conv'_cfrac_remainder) auto + also have "\ = (\ (n + 2) * h (n + 1) + h n) / (\ (n + 2) * k (n + 1) + k n)" + using wf \_pos by (subst conv'_num_denom) (simp_all add: h_def k_def) + also have "\ (n + 2) = surd_to_real D (\' (Suc n))" + using surd_to_real_sqrt_remainder_surd[OF nonsquare, of "Suc n"] + by (simp add: \'_def \_def c_def) + also have "\ = (sqrt D + P (Suc n)) / Q (Suc n)" (is "_ = ?\") + by (simp add: \' surd_to_real_def) + also have "?\ * h (n + 1) + h n = + 1 / Q (n + 1) * ((sqrt D + P (n + 1)) * h (n + 1) + Q (n + 1) * h n)" + using Q_pos by (simp add: field_simps) + also have "?\ * k (n + 1) + k n = + 1 / Q (n + 1) * ((sqrt D + P (n + 1)) * k (n + 1) + Q (n + 1) * k n)" + (is "_ = ?f k") using Q_pos by (simp add: field_simps) + also have "?f h / ?f k = ((sqrt D + P (n + 1)) * h (n + 1) + Q (n + 1) * h n) / + ((sqrt D + P (n + 1)) * k (n + 1) + Q (n + 1) * k n)" + (is "_ = ?A / ?B") using Q_pos by (intro mult_divide_mult_cancel_left) auto + finally have "sqrt D * ?B = ?A" + using \?B > 0\ by (simp add: divide_simps) + moreover have "sqrt D * sqrt D = D" by simp + ultimately have "sqrt D * (P (n + 1) * k (n + 1) + Q (n + 1) * k n - h (n + 1)) = + P (n + 1) * h (n + 1) + Q (n + 1) * h n - k (n + 1) * D" + unfolding of_int_add of_int_mult of_int_diff of_int_of_nat_eq of_nat_mult of_nat_add + by Groebner_Basis.algebra + from irrational_times_int_eq_intD[OF this] irrat + have 1: "h (Suc n) = P (Suc n) * k (Suc n) + Q (Suc n) * k n" + and 2: "D * k (Suc n) = P (Suc n) * h (Suc n) + Q (Suc n) * h n" + by (simp_all del: of_nat_add of_nat_mult) + + have "h (Suc n) * h (Suc n) - D * k (Suc n) * k (Suc n) = + Q (Suc n) * (k n * h (Suc n) - k (Suc n) * h n)" + by (subst 1, subst 2) (simp add: algebra_simps) + also have "k n * h (Suc n) - k (Suc n) * h n = (-1) ^ n" + unfolding h_def k_def by (rule conv_num_denom_prod_diff) + finally have "h (Suc n) ^ 2 - D * k (Suc n) ^ 2 = (-1) ^ n * Q (Suc n)" + by (simp add: power2_eq_square algebra_simps) + thus "h m ^ 2 - D * k m ^ 2 = (-1) ^ Suc m * Q m" + by (simp add: m) +qed + +text \ + Every non-trivial solution to Pell's equation is a convergent in the expansion of $\sqrt{D}$: +\ +theorem pell_solution_is_conv: + assumes "x\<^sup>2 = Suc (D * y\<^sup>2)" and "y > 0" + shows "(int x, int y) \ range (\n. (conv_num c n, conv_denom c n))" +proof - + have "\n. enat n \ cfrac_length c \ (int x, int y) = (conv_num c n, conv_denom c n)" + proof (rule frac_is_convergentI) + have "gcd (x\<^sup>2) (y\<^sup>2) = 1" unfolding assms(1) + using gcd_add_mult[of "y\<^sup>2" D 1] by (simp add: gcd.commute) + thus "coprime (int x) (int y)" + by (simp add: coprime_iff_gcd_eq_1) + next + from assms have "D > 1" + using nonsquare by (cases D) (auto intro!: Nat.gr0I) + hence pos: "x + y * sqrt D > 0" using assms + by (intro add_nonneg_pos) auto + + from assms have "real (x\<^sup>2) = real (Suc (D * y\<^sup>2))" + by (simp only: of_nat_eq_iff) + hence "1 = real x ^ 2 - D * real y ^ 2" + unfolding of_nat_power by simp + also have "\ = (x - y * sqrt D) * (x + y * sqrt D)" + by (simp add: field_simps power2_eq_square) + finally have *: "x - y * sqrt D = 1 / (x + y * sqrt D)" + using pos by (simp add: field_simps) + + from pos have "0 < 1 / (x + y * sqrt D)" + by (intro divide_pos_pos) auto + also have "\ = x - y * sqrt D" by (rule * [symmetric]) + finally have less: "y * sqrt D < x" by simp + + have "sqrt D - x / y = -((x - y * sqrt D) / y)" + using \y > 0\ by (simp add: field_simps) + also have "\\\ = (x - y * sqrt D) / y" + using less by simp + also have "(x - y * sqrt D) / y = 1 / (y * (x + y * sqrt D))" + using \y > 0\ by (subst *) auto + also have "\ \ 1 / (y * (y * sqrt D + y * sqrt D))" + using \y > 0\ \D > 1\ pos less + by (intro divide_left_mono mult_left_mono add_right_mono mult_pos_pos) auto + also have "\ = 1 / (2 * y\<^sup>2 * sqrt D)" + by (simp add: power2_eq_square) + also have "\ < 1 / (real (2 * y\<^sup>2) * 1)" using \y > 0\ \D > 1\ + by (intro divide_strict_left_mono mult_strict_left_mono mult_pos_pos) auto + finally show "\cfrac_lim c - int x / int y\ < 1 / (2 * int y ^ 2)" + unfolding c_def using irrat_sqrt_nonsquare[of D] \\is_square D\ by simp + qed (insert assms irrat_sqrt_nonsquare[of D], auto simp: c_def) + thus ?thesis by auto +qed + +text \ + Let \l\ be the length of the period in the continued fraction expansion of $\sqrt{D}$ and let + $h_i$ and $k_i$ be the numerator and denominator of the \i\-th convergent. + + Then the non-trivial solutions of Pell's equation are exactly the pairs of the form + $(h_{lm -1}, k_{lm-1})$ for any \m\ such that $lm$ is even. +\ +lemma nontriv_solution_iff_conv_num_denom: + "nontriv_solution (x, y) \ + (\m>0. int x = h (l * m - 1) \ int y = k (l * m - 1) \ even (l * m))" +proof safe + fix m assume xy: "x = h (l * m - 1)" "y = k (l * m - 1)" + and lm: "even (l * m)" and m: "m > 0" + have l: "l > 0" using period_nonempty[OF nonsquare] by (auto simp: l_def) + from lm have "l * m \ 1" by (intro notI) auto + with l m have lm': "l * m > 1" by (cases "l * m") auto + + have "(h (l * m - 1))\<^sup>2 - D * (k (l * m - 1))\<^sup>2 = + (- 1) ^ Suc (l * m - 1) * int (Q (l * m - 1))" + using lm' by (intro conv_num_denom_pell) auto + also have "(- 1) ^ Suc (l * m - 1) = (1 :: int)" + using lm l m by (subst neg_one_even_power) auto + also have "Q (l * m - 1) = Q ((l * m - 1) mod l)" + unfolding Q_def l_def o_def by (subst sqrt_remainder_surd_periodic[OF nonsquare]) simp + also { + have "l * m - 1 = (m - 1) * l + (l - 1)" + using m l lm' by (cases m) (auto simp: mult_ac) + also have "\ mod l = (l - 1) mod l" + by simp + also have "\ = l - 1" + using l by (intro mod_less) auto + also have "Q \ = 1" + using sqrt_remainder_surd_last[OF nonsquare] by (simp add: Q_def l_def) + finally have "Q ((l * m - 1) mod l) = 1" . + } + finally have "h (l * m - 1) ^ 2 = D * k (l * m - 1) ^ 2 + 1" + unfolding of_nat_Suc by (simp add: algebra_simps) + hence "h (l * m - 1) ^ 2 = D * k (l * m - 1) ^ 2 + 1" + by (simp only: of_nat_eq_iff) + moreover have "k (l * m - 1) > 0" + unfolding k_def by (intro conv_denom_pos) + ultimately have "nontriv_solution (int x, int y)" + using xy by (simp add: nontriv_solution_def) + thus "nontriv_solution (x, y)" + by simp +next + assume "nontriv_solution (x, y)" + hence asm: "x ^ 2 = Suc (D * y ^ 2)" "y > 0" + by (auto simp: nontriv_solution_def abs_square_eq_1 intro!: Nat.gr0I) + from asm have asm': "int x ^ 2 = int D * int y ^ 2 + 1" + by (metis add.commute of_nat_Suc of_nat_mult of_nat_power_eq_of_nat_cancel_iff) + have l: "l > 0" using period_nonempty[OF nonsquare] by (auto simp: l_def) + from pell_solution_is_conv[OF asm] obtain m where + xy: "h m = x" "k m = y" by (auto simp: c_def h_def k_def) + + have m: "m > 0" + using asm' conv_num_denom_pell(1) xy by (intro Nat.gr0I) auto + have "1 = h m ^ 2 - D * k m ^ 2" + using asm' xy by simp + also have "\ = (- 1) ^ Suc m * int (Q m)" + using conv_num_denom_pell(2)[OF m] . + finally have *: "(- 1) ^ Suc m * int (Q m) = 1" .. + from * have m': "odd m \ Q m = 1" + by (cases "even m") auto + + define n where "n = Suc m div l" + have "l dvd Suc m" + proof (rule ccontr) + assume *: "\(l dvd Suc m)" + have "Q m = Q (m mod l)" + unfolding Q_def l_def o_def by (subst sqrt_remainder_surd_periodic[OF nonsquare]) simp + also { + have "m mod l < l" using \l > 0\ by simp + moreover have "Suc (m mod l) \ l" using * l \m > 0\ + using mod_Suc[of m l] by auto + ultimately have "m mod l < l - 1" by simp + hence "Q (m mod l) > 1" unfolding Q_def o_def l_def + by (rule snd_sqrt_remainder_surd_gt_1[OF nonsquare]) + } + finally show False using m' by simp + qed + hence m_eq: "Suc m = n * l" "m = n * l - 1" + by (simp_all add: n_def) + hence "n > 0" by (auto intro!: Nat.gr0I) + thus "\n>0. int x = h (l * n - 1) \ int y = k (l * n - 1) \ even (l * n)" + using xy m_eq m' by (intro exI[of _ n]) (auto simp: mult_ac) +qed + +text \ + Consequently, the fundamental solution is $(h_n, k_n)$ where $n = l - 1$ + if \l\ is even and $n = 2l-1$ otherwise: +\ +lemma fund_sol_conv_num_denom: + defines "n \ if even l then l - 1 else 2 * l - 1" + shows "fund_sol = (nat (h n), nat (k n))" +proof (rule fund_sol_eq_sndI) + have [simp]: "h n \ 0" "k n \ 0" for n + by (auto simp: h_def k_def c_def intro!: conv_num_nonneg) + show "nontriv_solution (nat (h n), nat (k n))" + by (subst nontriv_solution_iff_conv_num_denom, rule exI[of _ "if even l then 1 else 2"]) + (simp_all add: n_def mult_ac) +next + fix x y :: nat assume "nontriv_solution (x, y)" + then obtain m where m: "m > 0" "x = h (l * m - 1)" "y = k (l * m - 1)" "even (l * m)" + by (subst (asm) nontriv_solution_iff_conv_num_denom) auto + have l: "l > 0" using period_nonempty[OF nonsquare] by (auto simp: l_def) + from m l have "Suc n \ l * m" by (auto simp: n_def) + hence "n \ l * m - 1" by simp + hence "k n \ k (l * m - 1)" + unfolding k_def c_def using irrat_sqrt_nonsquare[OF nonsquare] + by (intro conv_denom_leI) auto + with m show "nat (k n) \ y" by simp +qed + +end + + +text \ + The following algorithm computes the fundamental solution (or the dummy result \(0, 0)\ if + \D\ is a square) fairly quickly by computing the continued fraction expansion of $\sqrt{D}$ + and then computing the fundamental solution as the appropriate convergent. +\ +lemma find_fund_sol_code [code]: + "find_fund_sol D = + (let info = sqrt_cfrac_info_array D; + l = fst info + in if l = 0 then (0, 0) else + let + c = cfrac_sqrt_nth info; + n = if even l then l - 1 else 2 * l - 1 + in + (nat (conv_num_fun c n), nat (conv_denom_fun c n)))" +proof - + have *: "is_cfrac (cfrac_sqrt_nth (sqrt_cfrac_info_array D))" if "\is_square D" + using that cfrac_sqrt_nth[of D] unfolding is_cfrac_def + by (metis cfrac_nth_nonzero neq0_conv of_nat_0 of_nat_0_less_iff) + have **: "cfrac (\x. int (cfrac_sqrt_nth (sqrt_cfrac_info_array D) x)) = cfrac_of_real (sqrt D)" + if "\is_square D" + using that cfrac_sqrt_nth[of D] * by (intro cfrac_eqI) auto + show ?thesis using * ** + by (auto simp: square_test_correct find_fund_sol_correct conv_num_fun_eq conv_denom_fun_eq + Let_def cfrac_sqrt_nth fund_sol_conv_num_denom conv_num_nonneg) +qed + +lemma find_nth_solution_square [simp]: "is_square D \ find_nth_solution D n = (0, 0)" + by (simp add: find_nth_solution_def) + +lemma fst_find_fund_sol_eq_0_iff [simp]: "fst (find_fund_sol D) = 0 \ is_square D" +proof (cases "is_square D") + case False + then interpret pell D by unfold_locales + from False have "find_fund_sol D = fund_sol" by (simp add: find_fund_sol_correct) + moreover from fund_sol_is_nontriv_solution have "fst fund_sol > 0" + by (auto simp: nontriv_solution_def intro!: Nat.gr0I) + ultimately show ?thesis using False + by (simp add: find_fund_sol_def square_test_correct split: if_splits) +qed (auto simp: find_fund_sol_def square_test_correct) + +text \ + Arbitrary solutions can now be computed as powers of the fundamental solution. +\ +lemma find_nth_solution_code [code]: + "find_nth_solution D n = + (let xy = find_fund_sol D + in if fst xy = 0 then (0, 0) else efficient_pell_power D xy n)" +proof (cases "is_square D") + case False + then interpret pell D by unfold_locales + from fund_sol_is_nontriv_solution have "fst fund_sol > 0" + by (auto simp: nontriv_solution_def intro!: Nat.gr0I) + thus ?thesis using False + by (simp add: find_nth_solution_correct Let_def nth_solution_def pell_power_def + pell_mul_commutes[of _ "fund_sol"] find_fund_sol_correct) +qed auto + +lemma nth_solution_code [code]: + "pell.nth_solution D n = + (let info = sqrt_cfrac_info_array D; + l = fst info + in if l = 0 then + Code.abort (STR ''nth_solution is undefined for perfect square parameter.'') + (\_. pell.nth_solution D n) + else + let + c = cfrac_sqrt_nth info; + m = if even l then l - 1 else 2 * l - 1; + fund_sol = (nat (conv_num_fun c m), nat (conv_denom_fun c m)) + in + efficient_pell_power D fund_sol n)" +proof (cases "is_square D") + case False + then interpret pell by unfold_locales + have *: "is_cfrac (cfrac_sqrt_nth (sqrt_cfrac_info_array D))" + using False cfrac_sqrt_nth[of D] unfolding is_cfrac_def + by (metis cfrac_nth_nonzero neq0_conv of_nat_0 of_nat_0_less_iff) + have **: "cfrac (\x. int (cfrac_sqrt_nth (sqrt_cfrac_info_array D) x)) = cfrac_of_real (sqrt D)" + using False cfrac_sqrt_nth[of D] * by (intro cfrac_eqI) auto + + from False * ** show ?thesis + by (auto simp: Let_def cfrac_sqrt_nth fund_sol_conv_num_denom nth_solution_def + pell_power_def pell_mul_commutes[of _ "(_, _)"] + conv_num_fun_eq conv_denom_fun_eq conv_num_nonneg) +qed auto + +lemma fund_sol_code [code]: + "pell.fund_sol D = (let info = sqrt_cfrac_info_array D; + l = fst info + in if l = 0 then + Code.abort (STR ''fund_sol is undefined for perfect square parameter.'') + (\_. pell.fund_sol D) + else + let + c = cfrac_sqrt_nth info; + n = if even l then l - 1 else 2 * l - 1 + in + (nat (conv_num_fun c n), nat (conv_denom_fun c n)))" +proof (cases "is_square D") + case False + then interpret pell by unfold_locales + have *: "is_cfrac (cfrac_sqrt_nth (sqrt_cfrac_info_array D))" + using False cfrac_sqrt_nth[of D] unfolding is_cfrac_def + by (metis cfrac_nth_nonzero neq0_conv of_nat_0 of_nat_0_less_iff) + have **: "cfrac (\x. int (cfrac_sqrt_nth (sqrt_cfrac_info_array D) x)) = cfrac_of_real (sqrt D)" + using False cfrac_sqrt_nth[of D] * by (intro cfrac_eqI) auto + + from False * ** show ?thesis + by (auto simp: Let_def cfrac_sqrt_nth fund_sol_conv_num_denom nth_solution_def + pell_power_def pell_mul_commutes[of _ "(_, _)"] + conv_num_fun_eq conv_denom_fun_eq conv_num_nonneg) +qed auto + +end \ No newline at end of file diff --git a/thys/Continued_Fractions/Pell_Continued_Fraction_Tests.thy b/thys/Continued_Fractions/Pell_Continued_Fraction_Tests.thy new file mode 100644 --- /dev/null +++ b/thys/Continued_Fractions/Pell_Continued_Fraction_Tests.thy @@ -0,0 +1,98 @@ +(* + File: Continued_Fractions/Pell_Continued_Fraction_Tests.thy + Author: Manuel Eberl, University of Innsbruck +*) +section \Tests for Continued Fractions of Square Roots and Pell's Equation\ +theory Pell_Continued_Fraction_Tests +imports + Pell.Efficient_Discrete_Sqrt + "HOL-Library.Code_Lazy" + "HOL-Library.Code_Target_Numeral" + Pell_Continued_Fraction + Pell_Lifting +begin + +code_lazy_type stream + +(* TODO Move *) +lemma lnth_code [code]: + "lnth xs 0 = (if lnull xs then undefined (0 :: nat) else lhd xs)" + "lnth xs (Suc n) = (if lnull xs then undefined (Suc n) else lnth (ltl xs) n)" + by (auto simp: lnth.simps split: llist.splits) + +value "let c = sqrt_cfrac 1339 in map (cfrac_nth c) [0..<30]" + + +fun arg_max_list where + "arg_max_list _ [] = undefined" +| "arg_max_list f (x # xs) = + foldl (\(x, y) x'. let y' = f x' in if y' > y then (x', y') else (x, y)) (x, f x) xs" + + +value [code] "sqrt_cfrac_info 17" +value [code] "sqrt_cfrac_info 1339" +value [code] "sqrt_cfrac_info 121" +value [code] "sqrt_nat_period_length 410286423278424" + +text \ + For which number $D < 100000$ does $\sqrt{D}$ have the longest period? +\ +value [code] "arg_max_list sqrt_nat_period_length [0..<100000]" + + +subsection \Fundamental solutions of Pell's equation\ + +value [code] "pell.fund_sol 12" +value [code] "pell.fund_sol 13" +value [code] "pell.fund_sol 61" +value [code] "pell.fund_sol 661" +value [code] "pell.fund_sol 6661" +value [code] "pell.fund_sol 4729494" + +text \ + Project Euler problem \#66: + For which $D < 1000$ does Pell's equation have the largest fundamental solution? +\ + +value [code] "arg_max_list (fst \ find_fund_sol) [0..<1001]" + + +text \ + The same for $D < 100000$: +\ + +value [code] "arg_max_list (fst \ find_fund_sol) [0..<100000]" + + +text \ + The solution to the next example, which is at the core of Archimedes' cattle problem, + is so big that termifying the result takes extremely long. + Therefore, we simply compute the number of decimal digits in the result instead. +\ + +fun log10_aux :: "nat \ nat \ nat" where + "log10_aux acc n = + (if n \ 10000000000 then log10_aux (acc + 10) (n div 10000000000) + else if n = 0 then acc else log10_aux (Suc acc) (n div 10))" + +definition log10 where "log10 = log10_aux 0" + +value [code] "map_prod log10 log10 (pell.fund_sol 410286423278424)" + +text \ + Factoring out the square factor \9314\<^sup>2\ does yield a significant speed-up in this case: +\ +value [code] "map_prod log10 log10 (find_fund_sol_fast 410286423278424)" + + +subsection \Tests for other operations\ + +value [code] "pell.nth_solution 13 100" +value [code] "pell.nth_solution 4729494 3" + +value [code] "stake 10 (pell_solutions 13)" +value [code] "stake 10 (pell_solutions 61)" + +value [code] "pell.nth_solution 23 8" + +end \ No newline at end of file diff --git a/thys/Continued_Fractions/Pell_Lifting.thy b/thys/Continued_Fractions/Pell_Lifting.thy new file mode 100644 --- /dev/null +++ b/thys/Continued_Fractions/Pell_Lifting.thy @@ -0,0 +1,395 @@ +(* + File: Continued_Fractions/Pell_Lifting.thy + Author: Manuel Eberl, University of Innsbruck +*) +section \Lifting solutions of Pell's Equation\ +theory Pell_Lifting + imports Pell.Pell Pell.Pell_Algorithm +begin + +subsection \Auxiliary material\ + +(* TODO Move *) +lemma (in pell) snth_pell_solutions: "snth (pell_solutions D) n = nth_solution n" + by (simp add: pell_solutions_def Let_def find_fund_sol_correct nonsquare_D nth_solution_def + pell_power_def pell_mul_commutes[of _ fund_sol]) + +definition square_squarefree_part_nat :: "nat \ nat \ nat" where + "square_squarefree_part_nat n = (square_part n, squarefree_part n)" + +lemma prime_factorization_squarefree_part: + assumes "x \ 0" + shows "prime_factorization (squarefree_part x) = + mset_set {p \ prime_factors x. odd (multiplicity p x)}" (is "?lhs = ?rhs") +proof (rule multiset_eqI) + fix p show "count ?lhs p = count ?rhs p" + proof (cases "prime p") + case False + thus ?thesis by (auto simp: count_prime_factorization) + next + case True + have "finite (prime_factors x)" by simp + hence "finite {p. p dvd x \ prime p}" using assms + by (subst (asm) prime_factors_dvd) (auto simp: conj_commute) + hence "finite {p. p dvd x \ prime p \ odd (multiplicity p x)}" + by (rule finite_subset [rotated]) auto + moreover have "odd (n :: nat) \ n mod 2 = Suc 0" for n by presburger + ultimately show ?thesis using assms + by (cases "p dvd x"; cases "even (multiplicity p x)") + (auto simp: count_prime_factorization prime_multiplicity_squarefree_part + in_prime_factors_iff not_dvd_imp_multiplicity_0) + qed +qed + +lemma squarefree_part_nat: + "squarefree_part (n :: nat) = (\{p \ prime_factors n. odd (multiplicity p n)})" +proof (cases "n = 0") + case False + hence "(\{p \ prime_factors n. odd (multiplicity p n)}) = + prod_mset (prime_factorization (squarefree_part n))" + by (subst prime_factorization_squarefree_part) (auto simp: prod_unfold_prod_mset) + also have "\ = squarefree_part n" + by (intro prod_mset_prime_factorization_nat Nat.gr0I) auto + finally show ?thesis .. +qed auto + +lemma prime_factorization_square_part: + assumes "x \ 0" + shows "prime_factorization (square_part x) = + (\p \ prime_factors x. replicate_mset (multiplicity p x div 2) p)" (is "?lhs = ?rhs") +proof (rule multiset_eqI) + fix p show "count ?lhs p = count ?rhs p" + proof (cases "prime p \ p dvd x") + case False + thus ?thesis by (auto simp: count_prime_factorization count_sum + prime_multiplicity_square_part not_dvd_imp_multiplicity_0) + next + case True + thus ?thesis using assms + by (cases "p dvd x") + (auto simp: count_prime_factorization prime_multiplicity_squarefree_part + in_prime_factors_iff count_sum prime_multiplicity_square_part) + qed +qed + +lemma prod_mset_sum: "prod_mset (sum f A) = (\x\A. prod_mset (f x))" + by (induction A rule: infinite_finite_induct) auto + +lemma square_part_nat: + assumes "n > 0" + shows "square_part (n :: nat) = (\p \ prime_factors n. p ^ (multiplicity p n div 2))" +proof - + have "(\p \ prime_factors n. p ^ (multiplicity p n div 2)) = + prod_mset (prime_factorization (square_part n))" using assms + by (subst prime_factorization_square_part) (auto simp: prod_unfold_prod_mset prod_mset_sum) + also have "\ = square_part n" using assms + by (intro prod_mset_prime_factorization_nat Nat.gr0I) auto + finally show ?thesis .. +qed + +lemma square_squarefree_part_nat_code [code]: + "square_squarefree_part_nat n = (if n = 0 then (0, 1) + else let ps = prime_factorization n + in ((\p\set_mset ps. p ^ (count ps p div 2)), + \(Set.filter (\p. odd (count ps p)) (set_mset ps))))" + by (cases "n = 0") + (auto simp: Let_def square_squarefree_part_nat_def squarefree_part_nat Set.filter_def + count_prime_factorization square_part_nat intro!: prod.cong) + +lemma square_part_nat_code [code_unfold]: + "square_part (n :: nat) = (if n = 0 then 0 + else let ps = prime_factorization n in (\p\set_mset ps. p ^ (count ps p div 2)))" + using square_squarefree_part_nat_code[of n] + by (simp add: square_squarefree_part_nat_def Let_def split: if_splits) + +lemma squarefree_part_nat_code [code_unfold]: + "squarefree_part (n :: nat) = (if n = 0 then 1 + else let ps = prime_factorization n in (\(Set.filter (\p. odd (count ps p)) (set_mset ps))))" + using square_squarefree_part_nat_code[of n] + by (simp add: square_squarefree_part_nat_def Let_def split: if_splits) + +lemma is_nth_power_mult_nth_powerD: + assumes "is_nth_power n (a * b ^ n)" "b > 0" "n > 0" + shows "is_nth_power n (a::nat)" +proof - + from assms obtain k where k: "k ^ n = a * b ^ n" + by (auto elim: is_nth_powerE) + with assms(2,3) have "b dvd k" + by (metis dvd_triv_right pow_divides_pow_iff) + then obtain l where "k = b * l" + by auto + with k have "a = l ^ n" using assms(2) + by (simp add: power_mult_distrib) + thus ?thesis by auto +qed + +lemma (in pell) fund_sol_eq_fstI: + assumes "nontriv_solution (x, y)" + assumes "\x' y'. nontriv_solution (x', y') \ x \ x'" + shows "fund_sol = (x, y)" +proof - + have "x = fst fund_sol" + using fund_sol_is_nontriv_solution assms(1) fund_sol_minimal''[of "(x, y)"] + by (auto intro!: antisym assms(2)[of "fst fund_sol" "snd fund_sol"]) + moreover from this have "y = snd fund_sol" + using assms(1) solutions_linorder_strict[of x y "fst fund_sol" "snd fund_sol"] + fund_sol_is_nontriv_solution + by (auto simp: nontriv_solution_imp_solution prod_eq_iff) + ultimately show ?thesis by simp +qed + +lemma (in pell) fund_sol_eqI_fst': + assumes "nontriv_solution xy" + assumes "\x' y'. nontriv_solution (x', y') \ fst xy \ x'" + shows "fund_sol = xy" + using fund_sol_eq_fstI[of "fst xy" "snd xy"] assms by simp + +lemma (in pell) fund_sol_eq_sndI: + assumes "nontriv_solution (x, y)" + assumes "\x' y'. nontriv_solution (x', y') \ y \ y'" + shows "fund_sol = (x, y)" +proof - + have "y = snd fund_sol" + using fund_sol_is_nontriv_solution assms(1) fund_sol_minimal''[of "(x, y)"] + by (auto intro!: antisym assms(2)[of "fst fund_sol" "snd fund_sol"]) + moreover from this have "x = fst fund_sol" + using assms(1) solutions_linorder_strict[of x y "fst fund_sol" "snd fund_sol"] + fund_sol_is_nontriv_solution + by (auto simp: nontriv_solution_imp_solution prod_eq_iff) + ultimately show ?thesis by simp +qed + +lemma (in pell) fund_sol_eqI_snd': + assumes "nontriv_solution xy" + assumes "\x' y'. nontriv_solution (x', y') \ snd xy \ y'" + shows "fund_sol = xy" + using fund_sol_eq_sndI[of "fst xy" "snd xy"] assms by simp + + +subsection \The lifting mechanism\ + +text \ + The solutions of Pell's equations for parameters \D\ and \a\<^sup>2 D\ stand in correspondence to + one another: every solution \(x, y)\ for parameter \D\ can be lowered to a solution \(x, ay)\ + for \a\<^sup>2 D\, and every solution of the form \(x, ay)\ for parameter \a\<^sup>2 D\ can be lifted to a + solution \(x, y)\ for parameter \D\. +\ + +locale pell_lift = pell + + fixes a D' :: nat + assumes nz: "a > 0" + defines "D' \ D * a\<^sup>2" +begin + +lemma nonsquare_D': "\is_square D'" + using nonsquare_D is_nth_power_mult_nth_powerD[of 2 D a] nz by (auto simp: D'_def) + +definition lift_solution :: "nat \ nat \ nat \ nat" where + "lift_solution = (\(x, y). (x, y div a))" + +definition lower_solution :: "nat \ nat \ nat \ nat" where + "lower_solution = (\(x, y). (x, y * a))" + +definition liftable_solution :: "nat \ nat \ bool" where + "liftable_solution = (\(x, y). a dvd y)" + +sublocale lift: pell D' + by unfold_locales (fact nonsquare_D') + +lemma lift_solution_iff: "lift.solution xy \ solution (lower_solution xy)" + unfolding solution_def lift.solution_def + by (auto simp: lower_solution_def D'_def case_prod_unfold power_mult_distrib) + +lemma lift_solution: + assumes "solution xy" "liftable_solution xy" + shows "lift.solution (lift_solution xy)" + using assms unfolding solution_def lift.solution_def + by (auto simp: liftable_solution_def lift_solution_def D'_def case_prod_unfold power_mult_distrib + elim!: dvdE) + +text \ + In particular, the fundamental solution for \a\<^sup>2 D\ is the smallest liftable solution for \D\: +\ +lemma lift_fund_sol: + assumes "\n. 0 < n \ n < m \ \liftable_solution (nth_solution n)" + assumes "liftable_solution (nth_solution m)" "m > 0" + shows "lift.fund_sol = lift_solution (nth_solution m)" +proof (rule lift.fund_sol_eqI_fst') + from assms have "nontriv_solution (nth_solution m)" + by (intro nth_solution_sound') + hence "lift_solution (nth_solution m) \ (1, 0)" using nz assms(2) + by (auto simp: lift_solution_def case_prod_unfold nontriv_solution_def liftable_solution_def) + with assms show "lift.nontriv_solution (lift_solution (nth_solution m))" + by (auto simp: lift.nontriv_solution_altdef intro: lift_solution) +next + fix x' y' :: nat + assume *: "lift.nontriv_solution (x', y')" + hence nz': "x' \ 1" using nonsquare_D' + by (auto simp: lift.nontriv_solution_altdef lift.solution_def) + from * have "solution (lower_solution (x', y'))" + by (simp add: lift_solution_iff lift.nontriv_solution_altdef) + hence "lower_solution (x', y') \ range nth_solution" by (rule nth_solution_complete) + then obtain n where n: "nth_solution n = lower_solution (x', y')" by auto + with nz' have "n > 0" by (auto intro!: Nat.gr0I simp: nth_solution_def lower_solution_def) + with n have "liftable_solution (nth_solution n)" + by (auto simp: liftable_solution_def lower_solution_def) + with \n > 0\ and assms(1)[of n] have "n \ m" by (cases "n \ m") auto + hence "fst (nth_solution m) \ fst (nth_solution n)" + using strict_mono_less_eq[OF strict_mono_nth_solution(1)] by simp + thus "fst (lift_solution (nth_solution m)) \ x'" + by (simp add: lift_solution_def lower_solution_def n case_prod_unfold) +qed + +end + + +subsection \Accelerated computation of the fundamental solution for non-squarefree inputs\ + +text \ + Solving Pell's equation for some \D\ of the form \a\<^sup>2 D'\ can be done by solving + it for \D'\ and then lifting the solution. Thus, if \D\ is not squarefree, we can compute + its squarefree decomposition \a\<^sup>2 D'\ with \D'\ squarefree and thus speed up the computation + (since \D'\ is smaller than \D\). + + The squarefree decomposition can only be computed (according to current knowledge in mathematics) + through the prime decomposition. However, given how big the solutions are for even + moderate values of \D\, it is usually worth doing it if \D\ is not squarefree. +\ + +lemma squarefree_part_of_square [simp]: + assumes "is_square (x :: 'a :: {factorial_semiring, normalization_semidom_multiplicative})" + assumes "x \ 0" + shows "squarefree_part x = unit_factor x" +proof - + from assms obtain y where [simp]: "x = y ^ 2" + by (auto simp: is_nth_power_def) + have "unit_factor x * normalize x = squarefree_part x * square_part x ^ 2" + by (subst squarefree_decompose [symmetric]) auto + also have "\ = squarefree_part x * normalize x" + by (simp add: square_part_even_power normalize_power) + finally show ?thesis using assms + by (subst (asm) mult_cancel_right) auto +qed + +lemma squarefree_part_1_imp_square: + assumes "squarefree_part x = 1" + shows "is_square x" +proof - + have "is_square (square_part x ^ 2)" + by auto + also have "square_part x ^ 2 = squarefree_part x * square_part x ^ 2" + using assms by simp + also have "\ = x" + by (rule squarefree_decompose [symmetric]) + finally show ?thesis . +qed + + +definition find_fund_sol_fast where + "find_fund_sol_fast D = + (let (a, D') = square_squarefree_part_nat D + in + if D' = 0 \ D' = 1 then (0, 0) + else if a = 1 then pell.fund_sol D + else map_prod id (\y. y div a) + (shd (sdrop_while (\(_, y). y = 0 \ \a dvd y) (pell_solutions D'))))" + +lemma find_fund_sol_fast: "find_fund_sol D = find_fund_sol_fast D" +proof (cases "is_square D \ square_part D = 1") + case True + thus ?thesis + using squarefree_part_1_imp_square[of D] + by (cases "D = 0") + (auto simp: find_fund_sol_correct find_fund_sol_fast_def + square_squarefree_part_nat_def square_test_correct unit_factor_nat_def) +next + case False + define D' a where "D' = squarefree_part D" and "a = square_part D" + have "D > 0" + using False by (intro Nat.gr0I) auto + have "a > 0" + using \D > 0\ by (intro Nat.gr0I) (auto simp: a_def) + moreover have "\is_square D'" + unfolding D'_def + by (metis False is_nth_power_mult is_nth_power_nth_power squarefree_decompose) + ultimately interpret lift: pell_lift D' a D + using False \D > 0\ + by unfold_locales (auto simp: D'_def a_def squarefree_decompose [symmetric]) + + define i where "i = (LEAST i. case lift.nth_solution i of (_, y) \ y > 0 \ a dvd y)" + have ex: "\i. case lift.nth_solution i of (_, y) \ y > 0 \ a dvd y" + proof - + define sol where "sol = lift.lift.fund_sol" + have is_sol: "lift.solution (lift.lower_solution sol)" + unfolding sol_def using lift.lift.fund_sol_is_nontriv_solution lift.lift_solution_iff by blast + then obtain j where j: "lift.lower_solution sol = lift.nth_solution j" + using lift.solution_iff_nth_solution by blast + have "snd (lift.lower_solution sol) > 0" + proof (rule Nat.gr0I) + assume *: "snd (lift.lower_solution sol) = 0" + have "lift.solution (fst (lift.lower_solution sol), snd (lift.lower_solution sol))" + using is_sol by simp + hence "fst (lift.lower_solution sol) = 1" + by (subst (asm) *) simp + with * have "lift.lower_solution sol = (1, 0)" + by (cases "lift.lower_solution sol") auto + hence "fst sol = 1" + unfolding lift.lower_solution_def by (auto simp: lift.lower_solution_def case_prod_unfold) + thus False + unfolding sol_def + using lift.lift.fund_sol_is_nontriv_solution \D > 0\ + by (auto simp: lift.lift.nontriv_solution_def) + qed + moreover have "a dvd snd (lift.lower_solution sol)" + by (auto simp: lift.lower_solution_def case_prod_unfold) + ultimately show ?thesis + using j by (auto simp: case_prod_unfold) + qed + + define sol where "sol = lift.nth_solution i" + have sol: "snd sol > 0" "a dvd snd sol" + using LeastI_ex[OF ex] by (simp_all add: sol_def i_def case_prod_unfold) + have "i > 0" + using sol by (intro Nat.gr0I) (auto simp: sol_def lift.nth_solution_def) + + have "find_fund_sol_fast D = map_prod id (\y. y div a) + (shd (sdrop_while (\(_, y). y = 0 \ \a dvd y) (pell_solutions D')))" + unfolding D'_def a_def find_fund_sol_fast_def using False squarefree_part_1_imp_square[of D] + by (auto simp: square_squarefree_part_nat_def) + also have "sdrop_while (\(_, y). y = 0 \ \a dvd y) (pell_solutions D') = + sdrop_while (Not \ (\(_, y). y > 0 \ a dvd y)) (pell_solutions D')" + by (simp add: o_def case_prod_unfold) + also have "\ = sdrop i (pell_solutions D')" + using ex by (subst sdrop_while_sdrop_LEAST) (simp_all add: lift.snth_pell_solutions i_def) + also have "shd \ = sol" + by (simp add: lift.snth_pell_solutions sol_def) + finally have eq: "find_fund_sol_fast D = map_prod id (\y. y div a) sol" . + + have "lift.lift.fund_sol = lift.lift_solution sol" + unfolding sol_def + proof (rule lift.lift_fund_sol) + show "i > 0" by fact + show "lift.liftable_solution (lift.nth_solution i)" + using sol by (simp add: sol_def lift.liftable_solution_def case_prod_unfold) + next + fix j :: nat assume j: "j > 0" "j < i" + show "\lift.liftable_solution (lift.nth_solution j)" + proof + assume liftable: "lift.liftable_solution (lift.nth_solution j)" + have "snd (lift.nth_solution j) > 0" + using \j > 0\ by (metis gr0I lift.nontriv_solution_altdef lift.nth_solution_sound' + lift.solution_0_snd_nat_iff prod.collapse) + hence "case lift.nth_solution j of (_, y) \ y > 0 \ a dvd y" + using \j > 0\ liftable by (auto simp: lift.liftable_solution_def) + hence "i \ j" + unfolding i_def by (rule Least_le) + thus False using \j < i\ by simp + qed + qed + also have "\ = find_fund_sol_fast D" + by (simp add: eq lift.lift_solution_def case_prod_unfold map_prod_def) + finally show ?thesis + using \D > 0\ False by (simp add: find_fund_sol_correct) +qed + +end \ No newline at end of file diff --git a/thys/Continued_Fractions/Quadratic_Irrationals.thy b/thys/Continued_Fractions/Quadratic_Irrationals.thy new file mode 100644 --- /dev/null +++ b/thys/Continued_Fractions/Quadratic_Irrationals.thy @@ -0,0 +1,1018 @@ +(* + File: Continued_Fractions/Quadratic Irrationals.thy + Author: Manuel Eberl, University of Innsbruck +*) +section \Quadratic Irrationals\ +theory Quadratic_Irrationals +imports + Continued_Fractions + "HOL-Computational_Algebra.Computational_Algebra" + "HOL-Library.Discrete" + "Coinductive.Coinductive_Stream" +begin + +lemma snth_cycle: + assumes "xs \ []" + shows "snth (cycle xs) n = xs ! (n mod length xs)" +proof (induction n rule: less_induct) + case (less n) + have "snth (shift xs (cycle xs)) n = xs ! (n mod length xs)" + proof (cases "n < length xs") + case True + thus ?thesis + by (subst shift_snth_less) auto + next + case False + have "0 < length xs" + using assms by simp + also have "\ \ n" + using False by simp + finally have "n > 0" . + + from False have "snth (shift xs (cycle xs)) n = snth (cycle xs) (n - length xs)" + by (subst shift_snth_ge) auto + also have "\ = xs ! ((n - length xs) mod length xs)" + using assms \n > 0\ by (intro less) auto + also have "(n - length xs) mod length xs = n mod length xs" + using False by (simp add: mod_if) + finally show ?thesis . + qed + also have "shift xs (cycle xs) = cycle xs" + by (rule cycle_decomp [symmetric]) fact + finally show ?case . +qed + +subsection \Basic results on rationality of square roots\ + +lemma inverse_in_Rats_iff [simp]: "inverse (x :: real) \ \ \ x \ \" + by (auto simp: inverse_eq_divide divide_in_Rats_iff1) + +lemma nonneg_sqrt_nat_or_irrat: + assumes "x ^ 2 = real a" and "x \ 0" + shows "x \ \ \ x \ \" +proof safe + assume "x \ \" and "x \ \" + from Rats_abs_nat_div_natE[OF this(2)] + obtain p q :: nat where q_nz [simp]: "q \ 0" and "abs x = p / q" and coprime: "coprime p q" . + with \x \ 0\ have x: "x = p / q" + by simp + with assms have "real (q ^ 2) * real a = real (p ^ 2)" + by (simp add: field_simps) + also have "real (q ^ 2) * real a = real (q ^ 2 * a)" + by simp + finally have "p ^ 2 = q ^ 2 * a" + by (subst (asm) of_nat_eq_iff) auto + hence "q ^ 2 dvd p ^ 2" + by simp + hence "q dvd p" + by simp + with coprime have "q = 1" + by auto + with x and \x \ \\ show False + by simp +qed + +text \ + A square root of a natural number is either an integer or irrational. +\ +corollary sqrt_nat_or_irrat: + assumes "x ^ 2 = real a" + shows "x \ \ \ x \ \" +proof (cases "x \ 0") + case True + with nonneg_sqrt_nat_or_irrat[OF assms this] + show ?thesis by (auto simp: Nats_altdef2) +next + case False + from assms have "(-x) ^ 2 = real a" + by simp + moreover from False have "-x \ 0" + by simp + ultimately have "-x \ \ \ -x \ \" + by (rule nonneg_sqrt_nat_or_irrat) + thus ?thesis + by (auto simp: Nats_altdef2 minus_in_Ints_iff) +qed + +corollary sqrt_nat_or_irrat': + "sqrt (real a) \ \ \ sqrt (real a) \ \" + using nonneg_sqrt_nat_or_irrat[of "sqrt a" a] by auto + +text \ + The square root of a natural number \n\ is again a natural number iff \n is a perfect square.\ +\ +corollary sqrt_nat_iff_is_square: + "sqrt (real n) \ \ \ is_square n" +proof + assume "sqrt (real n) \ \" + then obtain k where "sqrt (real n) = real k" by (auto elim!: Nats_cases) + hence "sqrt (real n) ^ 2 = real (k ^ 2)" by (simp only: of_nat_power) + also have "sqrt (real n) ^ 2 = real n" by simp + finally have "n = k ^ 2" by (simp only: of_nat_eq_iff) + thus "is_square n" by blast +qed (auto elim!: is_nth_powerE) + +corollary irrat_sqrt_nonsquare: "\is_square n \ sqrt (real n) \ \" + using sqrt_nat_or_irrat'[of n] by (auto simp: sqrt_nat_iff_is_square) + +lemma sqrt_of_nat_in_Rats_iff: "sqrt (real n) \ \ \ is_square n" + using irrat_sqrt_nonsquare[of n] sqrt_nat_iff_is_square[of n] Nats_subset_Rats by blast + +lemma Discrete_sqrt_altdef: "Discrete.sqrt n = nat \sqrt n\" +proof - + have "real (Discrete.sqrt n ^ 2) \ sqrt n ^ 2" + by simp + hence "Discrete.sqrt n \ sqrt n" + unfolding of_nat_power by (rule power2_le_imp_le) auto + moreover have "real (Suc (Discrete.sqrt n) ^ 2) > real n" + unfolding of_nat_less_iff by (rule Suc_sqrt_power2_gt) + hence "real (Discrete.sqrt n + 1) ^ 2 > sqrt n ^ 2" + unfolding of_nat_power by simp + hence "real (Discrete.sqrt n + 1) > sqrt n" + by (rule power2_less_imp_less) auto + hence "Discrete.sqrt n + 1 > sqrt n" by simp + ultimately show ?thesis by linarith +qed + + +subsection \Definition of quadratic irrationals\ + +text \ + Irrational real numbers $x$ that satisfy a quadratic equation $a x^2 + b x + c = 0$ + with \a\, \b\, \c\ not all equal to 0 are called \<^emph>\quadratic irrationals\. These are of the form + $p + q \sqrt{d}$ for rational numbers \p\, \q\ and a positive integer \d\. +\ +inductive quadratic_irrational :: "real \ bool" where + "x \ \ \ real_of_int a * x ^ 2 + real_of_int b * x + real_of_int c = 0 \ + a \ 0 \ b \ 0 \ c \ 0 \ quadratic_irrational x" + +lemma quadratic_irrational_sqrt [intro]: + assumes "\is_square n" + shows "quadratic_irrational (sqrt (real n))" + using irrat_sqrt_nonsquare[OF assms] + by (intro quadratic_irrational.intros[of "sqrt n" 1 0 "-int n"]) auto + +lemma quadratic_irrational_uminus [intro]: + assumes "quadratic_irrational x" + shows "quadratic_irrational (-x)" + using assms +proof induction + case (1 x a b c) + thus ?case by (intro quadratic_irrational.intros[of "-x" a "-b" c]) auto +qed + +lemma quadratic_irrational_uminus_iff [simp]: + "quadratic_irrational (-x) \ quadratic_irrational x" + using quadratic_irrational_uminus[of x] quadratic_irrational_uminus[of "-x"] by auto + +lemma quadratic_irrational_plus_int [intro]: + assumes "quadratic_irrational x" + shows "quadratic_irrational (x + of_int n)" + using assms +proof induction + case (1 x a b c) + define x' where "x' = x + of_int n" + define a' b' c' where + "a' = a" and "b' = b - 2 * of_int n * a" and + "c' = a * of_int n ^ 2 - b * of_int n + c" + from 1 have "0 = a * (x' - of_int n) ^ 2 + b * (x' - of_int n) + c" + by (simp add: x'_def) + also have "\ = a' * x' ^ 2 + b' * x' + c'" + by (simp add: algebra_simps a'_def b'_def c'_def power2_eq_square) + finally have "\ = 0" .. + moreover have "x' \ \" + using 1 by (auto simp: x'_def add_in_Rats_iff2) + moreover have "a' \ 0 \ b' \ 0 \ c' \ 0" + using 1 by (auto simp: a'_def b'_def c'_def) + ultimately show ?case + by (intro quadratic_irrational.intros[of "x + of_int n" a' b' c']) (auto simp: x'_def) +qed + +lemma quadratic_irrational_plus_int_iff [simp]: + "quadratic_irrational (x + of_int n) \ quadratic_irrational x" + using quadratic_irrational_plus_int[of x n] + quadratic_irrational_plus_int[of "x + of_int n" "-n"] by auto + +lemma quadratic_irrational_minus_int_iff [simp]: + "quadratic_irrational (x - of_int n) \ quadratic_irrational x" + using quadratic_irrational_plus_int_iff[of x "-n"] + by (simp del: quadratic_irrational_plus_int_iff) + +lemma quadratic_irrational_plus_nat_iff [simp]: + "quadratic_irrational (x + of_nat n) \ quadratic_irrational x" + using quadratic_irrational_plus_int_iff[of x "int n"] + by (simp del: quadratic_irrational_plus_int_iff) + +lemma quadratic_irrational_minus_nat_iff [simp]: + "quadratic_irrational (x - of_nat n) \ quadratic_irrational x" + using quadratic_irrational_plus_int_iff[of x "-int n"] + by (simp del: quadratic_irrational_plus_int_iff) + +lemma quadratic_irrational_plus_1_iff [simp]: + "quadratic_irrational (x + 1) \ quadratic_irrational x" + using quadratic_irrational_plus_int_iff[of x 1] + by (simp del: quadratic_irrational_plus_int_iff) + +lemma quadratic_irrational_minus_1_iff [simp]: + "quadratic_irrational (x - 1) \ quadratic_irrational x" + using quadratic_irrational_plus_int_iff[of x "-1"] + by (simp del: quadratic_irrational_plus_int_iff) + +lemma quadratic_irrational_plus_numeral_iff [simp]: + "quadratic_irrational (x + numeral n) \ quadratic_irrational x" + using quadratic_irrational_plus_int_iff[of x "numeral n"] + by (simp del: quadratic_irrational_plus_int_iff) + +lemma quadratic_irrational_minus_numeral_iff [simp]: + "quadratic_irrational (x - numeral n) \ quadratic_irrational x" + using quadratic_irrational_plus_int_iff[of x "-numeral n"] + by (simp del: quadratic_irrational_plus_int_iff) + +lemma quadratic_irrational_inverse: + assumes "quadratic_irrational x" + shows "quadratic_irrational (inverse x)" + using assms +proof induction + case (1 x a b c) + from 1 have "x \ 0" by auto + have "0 = (real_of_int a * x\<^sup>2 + real_of_int b * x + real_of_int c) / x ^ 2" + by (subst 1) simp + also have "\ = real_of_int c * (inverse x) ^ 2 + real_of_int b * inverse x + real_of_int a" + using \x \ 0\ by (simp add: field_simps power2_eq_square) + finally have "\ = 0" .. + thus ?case using 1 + by (intro quadratic_irrational.intros[of "inverse x" c b a]) auto +qed + +lemma quadratic_irrational_inverse_iff [simp]: + "quadratic_irrational (inverse x) \ quadratic_irrational x" + using quadratic_irrational_inverse[of x] quadratic_irrational_inverse[of "inverse x"] + by (cases "x = 0") auto + +lemma quadratic_irrational_cfrac_remainder_iff: + "quadratic_irrational (cfrac_remainder c n) \ quadratic_irrational (cfrac_lim c)" +proof (cases "cfrac_length c = \") + case False + thus ?thesis + by (auto simp: quadratic_irrational.simps) +next + case [simp]: True + show ?thesis + proof (induction n) + case (Suc n) + from Suc.prems have "cfrac_remainder c (Suc n) = + inverse (cfrac_remainder c n - of_int (cfrac_nth c n))" + by (subst cfrac_remainder_Suc) (auto simp: field_simps) + also have "quadratic_irrational \ \ quadratic_irrational (cfrac_remainder c n)" + by simp + also have "\ \ quadratic_irrational (cfrac_lim c)" + by (rule Suc.IH) + finally show ?case . + qed auto +qed + +subsection \Real solutions of quadratic equations\ + +text \ + For the next result, we need some basic properties of real solutions to quadratic equations. +\ +lemma quadratic_equation_reals: + fixes a b c :: real + defines "f \ (\x. a * x ^ 2 + b * x + c)" + defines "discr \ (b^2 - 4 * a * c)" + shows "{x. f x = 0} = + (if a = 0 then + (if b = 0 then if c = 0 then UNIV else {} else {-c/b}) + else if discr \ 0 then {(-b + sqrt discr) / (2 * a), (-b - sqrt discr) / (2 * a)} + else {})" (is ?th1) +proof (cases "a = 0") + case [simp]: True + show ?th1 + proof (cases "b = 0") + case [simp]: True + hence "{x. f x = 0} = (if c = 0 then UNIV else {})" + by (auto simp: f_def) + thus ?th1 by simp + next + case False + hence "{x. f x = 0} = {-c / b}" by (auto simp: f_def field_simps) + thus ?th1 using False by simp + qed +next + case [simp]: False + show ?th1 + proof (cases "discr \ 0") + case True + { + fix x :: real + have "f x = a * (x - (-b + sqrt discr) / (2 * a)) * (x - (-b - sqrt discr) / (2 * a))" + using True by (simp add: f_def field_simps discr_def power2_eq_square) + also have "\ = 0 \ x \ {(-b + sqrt discr) / (2 * a), (-b - sqrt discr) / (2 * a)}" + by simp + finally have "f x = 0 \ \" . + } + hence "{x. f x = 0} = {(-b + sqrt discr) / (2 * a), (-b - sqrt discr) / (2 * a)}" + by blast + thus ?th1 using True by simp + next + case False + { + fix x :: real + assume x: "f x = 0" + have "0 \ (x + b / (2 * a)) ^ 2" by simp + also have "f x = a * ((x + b / (2 * a)) ^ 2 - b ^ 2 / (4 * a ^ 2) + c / a)" + by (simp add: field_simps power2_eq_square f_def) + with x have "(x + b / (2 * a)) ^ 2 - b ^ 2 / (4 * a ^ 2) + c / a = 0" + by simp + hence "(x + b / (2 * a)) ^ 2 = b ^ 2 / (4 * a ^ 2) - c / a" + by (simp add: algebra_simps) + finally have "0 \ (b\<^sup>2 / (4 * a\<^sup>2) - c / a) * (4 * a\<^sup>2)" + by (intro mult_nonneg_nonneg) auto + also have "\ = b\<^sup>2 - 4 * a * c" by (simp add: field_simps power2_eq_square) + also have "\ < 0" using False by (simp add: discr_def) + finally have False by simp + } + hence "{x. f x = 0} = {}" by auto + thus ?th1 using False by simp + qed +qed + +lemma finite_quadratic_equation_solutions_reals: + fixes a b c :: real + defines "discr \ (b^2 - 4 * a * c)" + shows "finite {x. a * x ^ 2 + b * x + c = 0} \ a \ 0 \ b \ 0 \ c \ 0" + by (subst quadratic_equation_reals) + (auto simp: discr_def card_eq_0_iff infinite_UNIV_char_0 split: if_split) + +lemma card_quadratic_equation_solutions_reals: + fixes a b c :: real + defines "discr \ (b^2 - 4 * a * c)" + shows "card {x. a * x ^ 2 + b * x + c = 0} = + (if a = 0 then + (if b = 0 then 0 else 1) + else if discr \ 0 then if discr = 0 then 1 else 2 else 0)" (is ?th1) + by (subst quadratic_equation_reals) + (auto simp: discr_def card_eq_0_iff infinite_UNIV_char_0 split: if_split) + +lemma card_quadratic_equation_solutions_reals_le_2: + "card {x :: real. a * x ^ 2 + b * x + c = 0} \ 2" + by (subst card_quadratic_equation_solutions_reals) auto + +lemma quadratic_equation_solution_rat_iff: + fixes a b c :: int and x y :: real + defines "f \ (\x::real. a * x ^ 2 + b * x + c)" + defines "discr \ nat (b ^ 2 - 4 * a * c)" + assumes "a \ 0" "f x = 0" + shows "x \ \ \ is_square discr" +proof - + define discr' where "discr' \ real_of_int (b ^ 2 - 4 * a * c)" + from assms have "x \ {x. f x = 0}" by simp + with \a \ 0\ have "discr' \ 0" unfolding discr'_def f_def of_nat_diff + by (subst (asm) quadratic_equation_reals) (auto simp: discr_def split: if_splits) + hence *: "sqrt (discr') = sqrt (real discr)" unfolding of_int_0_le_iff discr_def discr'_def + by (simp add: algebra_simps nat_diff_distrib) + from \x \ {x. f x = 0}\ have "x = (-b + sqrt discr) / (2 * a) \ x = (-b - sqrt discr) / (2 * a)" + using \a \ 0\ * unfolding discr'_def f_def + by (subst (asm) quadratic_equation_reals) (auto split: if_splits) + thus ?thesis using \a \ 0\ + by (auto simp: sqrt_of_nat_in_Rats_iff divide_in_Rats_iff2 diff_in_Rats_iff2 diff_in_Rats_iff1) +qed + + +subsection \Periodic continued fractions and quadratic irrationals\ + +text \ + We now show the main result: A positive irrational number has a periodic continued + fraction expansion iff it is a quadratic irrational. + + In principle, this statement naturally also holds for negative numbers, but the current + formalisation of continued fractions only supports non-negative numbers. It also holds for + rational numbers in some sense, since their continued fraction expansion is finite to begin with. +\ +theorem periodic_cfrac_imp_quadratic_irrational: + assumes [simp]: "cfrac_length c = \" + and period: "l > 0" "\k. k \ N \ cfrac_nth c (k + l) = cfrac_nth c k" + shows "quadratic_irrational (cfrac_lim c)" +proof - + define h' and k' where "h' = conv_num_int (cfrac_drop N c)" + and "k' = conv_denom_int (cfrac_drop N c)" + define x' where "x' = cfrac_remainder c N" + + have c_pos: "cfrac_nth c n > 0" if "n \ N" for n + proof - + from assms(1,2) have "cfrac_nth c (n + l) > 0" by auto + with assms(3)[OF that] show ?thesis by simp + qed + have k'_pos: "k' n > 0" if "n \ -1" "n \ -2" for n + using that by (auto simp: k'_def conv_denom_int_def intro!: conv_denom_pos) + have k'_nonneg: "k' n \ 0" if "n \ -2" for n + using that by (auto simp: k'_def conv_denom_int_def intro!: conv_denom_pos) + have "cfrac_nth c (n + (N + l)) = cfrac_nth c (n + N)" for n + using period(2)[of "n + N"] by (simp add: add_ac) + have "cfrac_drop (N + l) c = cfrac_drop N c" + by (rule cfrac_eqI) (use period(2)[of "n + N" for n] in \auto simp: algebra_simps\) + hence x'_altdef: "x' = cfrac_remainder c (N + l)" + by (simp add: x'_def cfrac_remainder_def) + have x'_pos: "x' > 0" unfolding x'_def + using c_pos by (intro cfrac_remainder_pos) auto + + define A where "A = (k' (int l - 1))" + define B where "B = k' (int l - 2) - h' (int l - 1)" + define C where "C = -(h' (int l - 2))" + + have pos: "(k' (int l - 1) * x' + k' (int l - 2)) > 0" + using x'_pos \l > 0\ + by (intro add_pos_nonneg mult_pos_pos) (auto intro!: k'_pos k'_nonneg) + have "cfrac_remainder c N = conv' (cfrac_drop N c) l (cfrac_remainder c (l + N))" + unfolding cfrac_remainder_def cfrac_drop_add + by (subst (2) cfrac_remainder_def [symmetric]) (auto simp: conv'_cfrac_remainder) + hence "x' = conv' (cfrac_drop N c) l x'" + by (subst (asm) add.commute) (simp only: x'_def [symmetric] x'_altdef [symmetric]) + also have "\ = (h' (int l - 1) * x' + h' (int l - 2)) / (k' (int l - 1) * x' + k' (int l - 2))" + using conv'_num_denom_int[OF x'_pos, of _ l] unfolding h'_def k'_def + by (simp add: mult_ac) + finally have "x' * (k' (int l - 1) * x' + k' (int l - 2)) = (h' (int l - 1) * x' + h' (int l - 2))" + using pos by (simp add: divide_simps) + hence quadratic: "A * x' ^ 2 + B * x' + C = 0" + by (simp add: algebra_simps power2_eq_square A_def B_def C_def) + moreover have "x' \ \" unfolding x'_def + by auto + moreover have "A > 0" using \l > 0\ by (auto simp: A_def intro!: k'_pos) + ultimately have "quadratic_irrational x'" using \x' \ \\ + by (intro quadratic_irrational.intros[of x' A B C]) simp_all + thus ?thesis + using assms by (simp add: x'_def quadratic_irrational_cfrac_remainder_iff) +qed + + +lift_definition pperiodic_cfrac :: "nat list \ cfrac" is + "\xs. if xs = [] then (0, LNil) else + (int (hd xs), llist_of_stream (cycle (map (\n. n- 1) (tl xs @ [hd xs]))))" . + +definition periodic_cfrac :: "int list \ int list \ cfrac" where + "periodic_cfrac xs ys = cfrac_of_stream (Stream.shift xs (Stream.cycle ys))" + +lemma periodic_cfrac_Nil [simp]: "pperiodic_cfrac [] = 0" + unfolding zero_cfrac_def by transfer auto + +lemma cfrac_length_pperiodic_cfrac [simp]: + "xs \ [] \ cfrac_length (pperiodic_cfrac xs) = \" + by transfer auto + +lemma cfrac_nth_pperiodic_cfrac: + assumes "xs \ []" and "0 \ set xs" + shows "cfrac_nth (pperiodic_cfrac xs) n = xs ! (n mod length xs)" + using assms +proof (transfer, goal_cases) + case (1 xs n) + show ?case + proof (cases n) + case (Suc n') + have "int (cycle (tl (map (\n. n - 1) xs) @ [hd (map (\n. n - 1) xs)]) !! n') + 1 = + int (stl (cycle (map (\n. n - 1) xs)) !! n') + 1" + by (subst cycle.sel(2) [symmetric]) (rule refl) + also have "\ = int (cycle (map (\n. n - 1) xs) !! n) + 1" + by (simp add: Suc del: cycle.sel) + also have "\ = int (xs ! (n mod length xs) - 1) + 1" + by (simp add: snth_cycle \xs \ []\) + also have "xs ! (n mod length xs) \ set xs" + using \xs \ []\ by (auto simp: set_conv_nth) + with 1 have "xs ! (n mod length xs) > 0" + by (intro Nat.gr0I) auto + hence "int (xs ! (n mod length xs) - 1) + 1 = int (xs ! (n mod length xs))" + by simp + finally show ?thesis + using Suc 1 by (simp add: hd_conv_nth map_tl) + qed (use 1 in \auto simp: hd_conv_nth\) +qed + +definition pperiodic_cfrac_info :: "nat list \ int \ int \ int"where + "pperiodic_cfrac_info xs = + (let l = length xs; + h = conv_num_fun (\n. xs ! n); + k = conv_denom_fun (\n. xs ! n); + A = k (l - 1); + B = h (l - 1) - (if l = 1 then 0 else k (l - 2)); + C = (if l = 1 then -1 else -h (l - 2)) + in (B^2-4*A*C, B, 2 * A))" + +lemma conv_gen_cong: + assumes "\k\{n..N}. f k = f' k" + shows "conv_gen f (a,b,n) N = conv_gen f' (a,b,n) N" + using assms +proof (induction "N - n" arbitrary: a b n N) + case (Suc d n N a b) + have "conv_gen f (b, b * f n + a, Suc n) N = conv_gen f' (b, b * f n + a, Suc n) N" + using Suc(2,3) by (intro Suc) auto + moreover have "f n = f' n" + using bspec[OF Suc.prems, of n] Suc(2) by auto + ultimately show ?case + by (subst (1 2) conv_gen.simps) auto +qed (auto simp: conv_gen.simps) + +lemma + assumes "\k\n. c k = cfrac_nth c' k" + shows conv_num_fun_eq': "conv_num_fun c n = conv_num c' n" + and conv_denom_fun_eq': "conv_denom_fun c n = conv_denom c' n" +proof - + have "conv_num c' n = conv_gen (cfrac_nth c') (0, 1, 0) n" + unfolding conv_num_code .. + also have "\ = conv_gen c (0, 1, 0) n" + unfolding conv_num_fun_def using assms by (intro conv_gen_cong) auto + finally show "conv_num_fun c n = conv_num c' n" + by (simp add: conv_num_fun_def) +next + have "conv_denom c' n = conv_gen (cfrac_nth c') (1, 0, 0) n" + unfolding conv_denom_code .. + also have "\ = conv_gen c (1, 0, 0) n" + unfolding conv_denom_fun_def using assms by (intro conv_gen_cong) auto + finally show "conv_denom_fun c n = conv_denom c' n" + by (simp add: conv_denom_fun_def) +qed + +lemma gcd_minus_commute_left: "gcd (a - b :: 'a :: ring_gcd) c = gcd (b - a) c" + by (metis gcd.commute gcd_neg2 minus_diff_eq) + +lemma gcd_minus_commute_right: "gcd c (a - b :: 'a :: ring_gcd) = gcd c (b - a)" + by (metis gcd_neg2 minus_diff_eq) + +lemma periodic_cfrac_info_aux: + fixes D E F :: int + assumes "pperiodic_cfrac_info xs = (D, E, F)" + assumes "xs \ []" "0 \ set xs" + shows "cfrac_lim (pperiodic_cfrac xs) = (sqrt D + E) / F" + and "D > 0" and "F > 0" +proof - + define c where "c = pperiodic_cfrac xs" + have [simp]: "cfrac_length c = \" + using assms by (simp add: c_def) + define h and k where "h = conv_num_int c" and "k = conv_denom_int c" + define x where "x = cfrac_lim c" + define l where "l = length xs" + + define A where "A = (k (int l - 1))" + define B where "B = k (int l - 2) - h (int l - 1)" + define C where "C = -(h (int l - 2))" + define discr where "discr = B ^ 2 - 4 * A * C" + + have "l > 0" + using assms by (simp add: l_def) + have c_pos: "cfrac_nth c n > 0" for n + using assms by (auto simp: c_def cfrac_nth_pperiodic_cfrac set_conv_nth) + have x_pos: "x > 0" + unfolding x_def by (intro cfrac_lim_pos c_pos) + have h_pos: "h n > 0" if "n > -2" for n + using that unfolding h_def by (auto simp: conv_num_int_def intro: conv_num_pos' c_pos) + have k_pos: "k n > 0" if "n > -1" for n + using that unfolding k_def by (auto simp: conv_denom_int_def) + have k_nonneg: "k n \ 0" for n + unfolding k_def by (auto simp: conv_denom_int_def) + + have pos: "(k (int l - 1) * x + k (int l - 2)) > 0" + using x_pos \l > 0\ + by (intro add_pos_nonneg mult_pos_pos) (auto intro!: k_pos k_nonneg) + have "cfrac_drop l c = c" + using assms by (intro cfrac_eqI) (auto simp: c_def cfrac_nth_pperiodic_cfrac l_def) + + have "x = conv' c l (cfrac_remainder c l)" + unfolding x_def by (rule conv'_cfrac_remainder[symmetric]) auto + also have "\ = conv' c l x" + unfolding cfrac_remainder_def \cfrac_drop l c = c\ x_def .. + finally have "x = conv' c l x" . + also have "\ = (h (int l - 1) * x + h (int l - 2)) / (k (int l - 1) * x + k (int l - 2))" + using conv'_num_denom_int[OF x_pos, of _ l] unfolding h_def k_def + by (simp add: mult_ac) + finally have "x * (k (int l - 1) * x + k (int l - 2)) = (h (int l - 1) * x + h (int l - 2))" + using pos by (simp add: divide_simps) + hence quadratic: "A * x ^ 2 + B * x + C = 0" + by (simp add: algebra_simps power2_eq_square A_def B_def C_def) + + have "A > 0" using \l > 0\ by (auto simp: A_def intro!: k_pos) + have discr_altdef: "discr = (k (int l-2) - h (int l-1)) ^ 2 + 4 * k (int l-1) * h (int l-2)" + by (simp add: discr_def A_def B_def C_def) + + have "0 < 0 + 4 * A * 1" + using \A > 0\ by simp + also have "0 + 4 * A * 1 \ discr" + unfolding discr_altdef A_def using h_pos[of "int l - 2"] \l > 0\ + by (intro add_mono mult_mono order.refl k_nonneg mult_nonneg_nonneg) auto + finally have "discr > 0" . + + have "x \ {x. A * x ^ 2 + B * x + C = 0}" + using quadratic by simp + hence x_cases: "x = (-B - sqrt discr) / (2 * A) \ x = (-B + sqrt discr) / (2 * A)" + unfolding quadratic_equation_reals of_int_diff using \A > 0\ + by (auto split: if_splits simp: discr_def) + + have "B ^ 2 < discr" + unfolding discr_def by (auto intro!: mult_pos_pos k_pos h_pos \l > 0\ simp: A_def C_def) + hence "\B\ < sqrt discr" + using \discr > 0\ by (simp add: real_less_rsqrt) + + have "x = (if x \ 0 then (sqrt discr - B) / (2 * A) else -(sqrt discr + B) / (2 * A))" + using x_cases + proof + assume x: "x = (-B - sqrt discr) / (2 * A)" + have "(-B - sqrt discr) / (2 * A) < 0" + using \\B\ < sqrt discr\ \A > 0\ by (intro divide_neg_pos) auto + also note x[symmetric] + finally show ?thesis using x by simp + next + assume x: "x = (-B + sqrt discr) / (2 * A)" + have "(-B + sqrt discr) / (2 * A) > 0" + using \\B\ < sqrt discr\ \A > 0\ by (intro divide_pos_pos) auto + also note x[symmetric] + finally show ?thesis using x by simp + qed + also have "x \ 0 \ floor x \ 0" + by auto + also have "floor x = floor (cfrac_lim c)" + by (simp add: x_def) + also have "\ = cfrac_nth c 0" + by (subst cfrac_nth_0_conv_floor) auto + also have "\ = int (hd xs)" + using assms unfolding c_def by (subst cfrac_nth_pperiodic_cfrac) (auto simp: hd_conv_nth) + finally have x_eq: "x = (sqrt discr - B) / (2 * A)" + by simp + + + define h' where "h' = conv_num_fun (\n. int (xs ! n))" + define k' where "k' = conv_denom_fun (\n. int (xs ! n))" + have num_eq: "h' i = h i" + if "i < l" for i using that assms unfolding h'_def h_def + by (subst conv_num_fun_eq'[where c' = c]) (auto simp: c_def l_def cfrac_nth_pperiodic_cfrac) + have denom_eq: "k' i = k i" + if "i < l" for i using that assms unfolding k'_def k_def + by (subst conv_denom_fun_eq'[where c' = c]) (auto simp: c_def l_def cfrac_nth_pperiodic_cfrac) + + have 1: "h (int l - 1) = h' (l - 1)" + by (subst num_eq) (use \l > 0\ in \auto simp: of_nat_diff\) + have 2: "k (int l - 1) = k' (l - 1)" + by (subst denom_eq) (use \l > 0\ in \auto simp: of_nat_diff\) + have 3: "h (int l - 2) = (if l = 1 then 1 else h' (l - 2))" + using \l > 0\ num_eq[of "l - 2"] by (auto simp: h_def nat_diff_distrib) + have 4: "k (int l - 2) = (if l = 1 then 0 else k' (l - 2))" + using \l > 0\ denom_eq[of "l - 2"] by (auto simp: k_def nat_diff_distrib) + + have "pperiodic_cfrac_info xs = + (let A = k (int l - 1); + B = h (int l - 1) - (if l = 1 then 0 else k (int l - 2)); + C = (if l = 1 then -1 else - h (int l - 2)) + in (B\<^sup>2 - 4 * A * C, B, 2 * A))" + unfolding pperiodic_cfrac_info_def Let_def using 1 2 3 4 \l > 0\ + by (auto simp: num_eq denom_eq h'_def k'_def l_def of_nat_diff) + also have "\ = (B\<^sup>2 - 4 * A * C, -B, 2 * A)" + by (simp add: Let_def A_def B_def C_def h_def k_def algebra_simps power2_commute) + finally have per_eq: "pperiodic_cfrac_info xs = (discr, -B, 2 * A)" + by (simp add: discr_def) + + show "x = (sqrt (real_of_int D) + real_of_int E) / real_of_int F" + using per_eq assms by (simp add: x_eq) + show "D > 0" "F > 0" + using assms per_eq \discr > 0\ \A > 0\ by auto +qed + +text \ + We can now compute surd representations for (purely) periodic continued fractions, e.g. + $[1, 1, 1, \ldots] = \frac{\sqrt{5} + 1}{2}$: +\ +value "pperiodic_cfrac_info [1]" + +text \ + We can now compute surd representations for periodic continued fractions, e.g. + $[\overline{1,1,1,1,6}] = \frac{\sqrt{13} + 3}{4}$: +\ +value "pperiodic_cfrac_info [1,1,1,1,6]" + + + +text \ + With a little bit of work, one could also easily derive from this a version for + non-purely periodic continued fraction. +\ + + +text \ + Next, we show that any quadratic irrational has a periodic continued fraction expansion. +\ +theorem quadratic_irrational_imp_periodic_cfrac: + assumes "quadratic_irrational (cfrac_lim e)" + obtains N l where "l > 0" and "\n m. n \ N \ cfrac_nth e (n + m * l) = cfrac_nth e n" + and "cfrac_remainder e (N + l) = cfrac_remainder e N" + and "cfrac_length e = \" +proof - + have [simp]: "cfrac_length e = \" + using assms by (auto simp: quadratic_irrational.simps) + note [intro] = assms(1) + define x where "x = cfrac_lim e" + from assms obtain a b c :: int where + nontrivial: "a \ 0 \ b \ 0 \ c \ 0" and + root: "a * x^2 + b * x + c = 0" (is "?f x = 0") + by (auto simp: quadratic_irrational.simps x_def) + + define f where "f = ?f" + define h and k where "h = conv_num e" and "k = conv_denom e" + define X where "X = cfrac_remainder e" + have [simp]: "k i > 0" "k i \ 0" for i + using conv_denom_pos[of e i] by (auto simp: k_def) + have k_leI: "k i \ k j" if "i \ j" for i j + by (auto simp: k_def intro!: conv_denom_leI that) + have k_nonneg: "k n \ 0" for n + by (auto simp: k_def) + have k_ge_1: "k n \ 1" for n + using k_leI[of 0 n] by (simp add: k_def) + + define R where "R = conv e" + define A where "A = (\n. a * h (n - 1) ^ 2 + b * h (n - 1) * k (n - 1) + c * k (n - 1) ^ 2)" + define B where "B = (\n. 2 * a * h (n - 1) * h (n - 2) + b * (h (n - 1) * k (n - 2) + h (n - 2) * k (n - 1)) + 2 * c * k (n - 1) * k (n - 2))" + define C where "C = (\n. a * h (n - 2) ^ 2 + b * h (n - 2) * k (n - 2) + c * k (n - 2) ^ 2)" + + define A' where "A' = nat \2 * \a\ * \x\ + \a\ + \b\\" + define B' where "B' = nat \(3 / 2) * (2 * \a\ * \x\ + \b\) + 9 / 4 * \a\\" + + have [simp]: "X n \ \" for n unfolding X_def + by simp + from this[of 0] have [simp]: "x \ \" + unfolding X_def by (simp add: x_def) + + have "a \ 0" + proof + assume "a = 0" + with root and nontrivial have "x = 0 \ x = -c / b" + by (auto simp: divide_simps add_eq_0_iff) + hence "x \ \" by (auto simp del: \x \ \\) + thus False by simp + qed + + have bounds: "(A n, B n, C n) \ {-A'..A'} \ {-B'..B'} \ {-A'..A'}" + and X_root: "A n * X n ^ 2 + B n * X n + C n = 0" if n: "n \ 2" for n + proof - + define n' where "n' = n - 2" + have n': "n = Suc (Suc n')" using \n \ 2\ unfolding n'_def by simp + have *: "of_int (k (n - Suc 0)) * X n + of_int (k (n - 2)) \ 0" + proof + assume "of_int (k (n - Suc 0)) * X n + of_int (k (n - 2)) = 0" + hence "X n = -k (n - 2) / k (n - 1)" by (auto simp: divide_simps mult_ac) + also have "\ \ \" by auto + finally show False by simp + qed + + let ?denom = "(k (n - 1) * X n + k (n - 2))" + have "0 = 0 * ?denom ^ 2" by simp + also have "0 * ?denom ^ 2 = (a * x ^ 2 + b * x + c) * ?denom ^ 2" using root by simp + also have "\ = a * (x * ?denom) ^ 2 + b * ?denom * (x * ?denom) + c * ?denom * ?denom" + by (simp add: algebra_simps power2_eq_square) + also have "x * ?denom = h (n - 1) * X n + h (n - 2)" + using cfrac_lim_eq_num_denom_remainder_aux[of "n - 2" e] \n \ 2\ + by (simp add: numeral_2_eq_2 Suc_diff_Suc x_def k_def h_def X_def) + also have "a * \ ^ 2 + b * ?denom * \ + c * ?denom * ?denom = A n * X n ^ 2 + B n * X n + C n" + by (simp add: A_def B_def C_def power2_eq_square algebra_simps) + finally show "A n * X n ^ 2 + B n * X n + C n = 0" .. + + have f_abs_bound: "\f (R n)\ \ (2 * \a\ * \x\ + \b\) * (1 / (k n * k (Suc n))) + + \a\ * (1 / (k n * k (Suc n))) ^ 2" for n + proof - + have "\f (R n)\ = \?f (R n) - ?f x\" by (simp add: root f_def) + also have "?f (R n) - ?f x = (R n - x) * (2 * a * x + b) + (R n - x) ^ 2 * a" + by (simp add: power2_eq_square algebra_simps) + also have "\\\ \ \(R n - x) * (2 * a * x + b)\ + \(R n - x) ^ 2 * a\" + by (rule abs_triangle_ineq) + also have "\ = \2 * a * x + b\ * \R n - x\ + \a\ * \R n - x\ ^ 2" + by (simp add: abs_mult) + also have "\ \ \2 * a * x + b\ * (1 / (k n * k (Suc n))) + \a\ * (1 / (k n * k (Suc n))) ^ 2" + unfolding x_def R_def using cfrac_lim_minus_conv_bounds[of n e] + by (intro add_mono mult_left_mono power_mono) (auto simp: k_def) + also have "\2 * a * x + b\ \ 2 * \a\ * \x\ + \b\" + by (rule order.trans[OF abs_triangle_ineq]) (auto simp: abs_mult) + hence "\2 * a * x + b\ * (1 / (k n * k (Suc n))) + \a\ * (1 / (k n * k (Suc n))) ^ 2 \ + \ * (1 / (k n * k (Suc n))) + \a\ * (1 / (k n * k (Suc n))) ^ 2" + by (intro add_mono mult_right_mono) (auto intro!: mult_nonneg_nonneg k_nonneg) + finally show "\f (R n)\ \ \" + by (simp add: mult_right_mono add_mono divide_left_mono) + qed + + have h_eq_conv_k: "h i = R i * k i" for i + using conv_denom_pos[of e i] unfolding R_def + by (subst conv_num_denom) (auto simp: h_def k_def) + + have "A n = k (n - 1) ^ 2 * f (R (n - 1))" for n + by (simp add: algebra_simps A_def n' k_def power2_eq_square h_eq_conv_k f_def) + have A_bound: "\A i\ \ A'" if "i > 0" for i + proof - + have "k i > 0" + by simp + hence "k i \ 1" + by linarith + have "A i = k (i - 1) ^ 2 * f (R (i - 1))" + by (simp add: algebra_simps A_def k_def power2_eq_square h_eq_conv_k f_def) + also have "\\\ = k (i - 1) ^ 2 * \f (R (i - 1))\" + by (simp add: abs_mult f_def) + also have "\ \ k (i - 1) ^ 2 * ((2 * \a\ * \x\ + \b\) * (1 / (k (i - 1) * k (Suc (i - 1)))) + + \a\ * (1 / (k (i - 1) * k (Suc (i - 1)))) ^ 2)" + by (intro mult_left_mono f_abs_bound) auto + also have "\ = k (i - 1) / k i * (2 * \a\ * \x\ + \b\) + \a\ / k i ^ 2" using \i > 0\ + by (simp add: power2_eq_square field_simps) + also have "\ \ 1 * (2 * \a\ * \x\ + \b\) + \a\ / 1" using \i > 0\ \k i \ 1\ + by (intro add_mono divide_left_mono mult_right_mono) + (auto intro!: k_leI one_le_power simp: of_nat_ge_1_iff) + also have "\ = 2 * \a\ * \x\ + \a\ + \b\" by simp + finally show ?thesis unfolding A'_def by linarith + qed + + have "C n = A (n - 1)" by (simp add: A_def C_def n') + hence C_bound: "\C n\ \ A'" using A_bound[of "n - 1"] n by simp + + have "B n = k (n - 1) * k (n - 2) * + (f (R (n - 1)) + f (R (n - 2)) - a * (R (n - 1) - R (n - 2)) ^ 2)" + by (simp add: B_def h_eq_conv_k algebra_simps power2_eq_square f_def) + also have "\\\ = k (n - 1) * k (n - 2) * + \f (R (n - 1)) + f (R (n - 2)) - a * (R (n - 1) - R (n - 2)) ^ 2\" + by (simp add: abs_mult k_nonneg) + also have "\ \ k (n - 1) * k (n - 2) * + (((2 * \a\ * \x\ + \b\) * (1 / (k (n - 1) * k (Suc (n - 1)))) + + \a\ * (1 / (k (n - 1) * k (Suc (n - 1)))) ^ 2) + + ((2 * \a\ * \x\ + \b\) * (1 / (k (n - 2) * k (Suc (n - 2)))) + + \a\ * (1 / (k (n - 2) * k (Suc (n - 2)))) ^ 2) + + \a\ * \R (Suc (n - 2)) - R (n - 2)\ ^ 2)" (is "_ \ _ * (?S1 + ?S2 + ?S3)") + by (intro mult_left_mono order.trans[OF abs_triangle_ineq4] order.trans[OF abs_triangle_ineq] + add_mono f_abs_bound order.refl) + (insert n, auto simp: abs_mult Suc_diff_Suc numeral_2_eq_2 k_nonneg) + also have "\R (Suc (n - 2)) - R (n - 2)\ = 1 / (k (n - 2) * k (Suc (n - 2)))" + unfolding R_def k_def by (rule abs_diff_successive_convs) + also have "of_int (k (n - 1) * k (n - 2)) * (?S1 + ?S2 + \a\ * \ ^ 2) = + (k (n - 2) / k n + 1) * (2 * \a\ * \x\ + \b\) + + \a\ * (k (n - 2) / (k (n - 1) * k n ^ 2) + 2 / (k (n - 1) * k (n - 2)))" + (is "_ = ?S") using n by (simp add: field_simps power2_eq_square numeral_2_eq_2 Suc_diff_Suc) + also { + have A: "2 * real_of_int (k (n - 2)) \ of_int (k n)" + using conv_denom_plus2_ratio_ge[of e "n - 2"] n + by (simp add: numeral_2_eq_2 Suc_diff_Suc k_def) + have "fib (Suc 2) \ k 2" unfolding k_def by (intro conv_denom_lower_bound) + also have "\ \ k n" by (intro k_leI n) + finally have "k n \ 2" by (simp add: numeral_3_eq_3) + hence B: "of_int (k (n - 2)) * 2 ^ 2 \ (of_int (k (n - 1)) * (of_int (k n))\<^sup>2 :: real)" + by (intro mult_mono power_mono) (auto intro: k_leI k_nonneg) + have C: "1 * 1 \ real_of_int (k (n - 1)) * of_int (k (n - 2))" using k_ge_1 + by (intro mult_mono) (auto simp: Suc_le_eq of_nat_ge_1_iff k_nonneg) + note A B C + } + hence "?S \ (1 / 2 + 1) * (2 * \a\ * \x\ + \b\) + \a\ * (1 / 4 + 2)" + by (intro add_mono mult_right_mono mult_left_mono) (auto simp: field_simps) + also have "\ = (3 / 2) * (2 * \a\ * \x\ + \b\) + 9 / 4 * \a\" by simp + finally have B_bound: "\B n\ \ B'" unfolding B'_def by linarith + from A_bound[of n] B_bound C_bound n + show "(A n, B n, C n) \ {-A'..A'} \ {-B'..B'} \ {-A'..A'}" by auto + qed + + have A_nz: "A n \ 0" if "n \ 1" for n + using that + proof (induction n rule: dec_induct) + case base + show ?case + proof + assume "A 1 = 0" + hence "real_of_int (A 1) = 0" by simp + also have "real_of_int (A 1) = + real_of_int a * of_int (cfrac_nth e 0) ^ 2 + + real_of_int b * cfrac_nth e 0 + real_of_int c" + by (simp add: A_def h_def k_def) + finally have root': "\ = 0" . + + have "cfrac_nth e 0 \ \" by auto + also from root' and \a \ 0\ have "?this \ is_square (nat (b\<^sup>2 - 4 * a * c))" + by (intro quadratic_equation_solution_rat_iff) auto + also from root and \a \ 0\ have "\ \ x \ \" + by (intro quadratic_equation_solution_rat_iff [symmetric]) auto + finally show False using \x \ \\ by contradiction + qed + next + case (step m) + hence nz: "C (Suc m) \ 0" by (simp add: C_def A_def) + show "A (Suc m) \ 0" + proof + assume [simp]: "A (Suc m) = 0" + have "X (Suc m) > 0" unfolding X_def + by (intro cfrac_remainder_pos) auto + with X_root[of "Suc m"] step.hyps nz have "X (Suc m) = -C (Suc m) / B (Suc m)" + by (auto simp: divide_simps mult_ac) + also have "\ \ \" by auto + finally show False by simp + qed + qed + + have "finite ({-A'..A'} \ {-B'..B'} \ {-A'..A'})" by auto + from this and bounds have "finite ((\n. (A n, B n, C n)) ` {2..})" + by (blast intro: finite_subset) + moreover have "infinite ({2..} :: nat set)" by (simp add: infinite_Ici) + ultimately have "\k1\{2..}. infinite {n \ {2..}. (A n, B n, C n) = (A k1, B k1, C k1)}" + by (intro pigeonhole_infinite) + then obtain k0 where k0: "k0 \ 2" "infinite {n \ {2..}. (A n, B n, C n) = (A k0, B k0, C k0)}" + by auto + from infinite_countable_subset[OF this(2)] obtain g :: "nat \ _" + where g: "inj g" "range g \ {n\{2..}. (A n, B n, C n) = (A k0, B k0, C k0)}" by blast + hence g_ge_2: "g k \ 2" for k by auto + from g have [simp]: "A (g k) = A k0" "B (g k) = B k0" "C (g k) = C k0" for k + by auto + + from g(1) have [simp]: "g k1 = g k2 \ k1 = k2" for k1 k2 by (auto simp: inj_def) + define z where "z = (A k0, B k0, C k0)" + let ?h = "\k. (A (g k), B (g k), C (g k))" + from g have g': "distinct [g 1, g 2, g 3]" "?h 0 = z" "?h 1 = z" "?h 2 = z" + by (auto simp: z_def) + have fin: "finite {x :: real. A k0 * x ^ 2 + B k0 * x + C k0 = 0}" using A_nz[of k0] k0(1) + by (subst finite_quadratic_equation_solutions_reals) auto + from X_root[of "g 0"] X_root[of "g 1"] X_root[of "g 2"] g_ge_2 g + have "(X \ g) ` {0, 1, 2} \ {x. A k0 * x ^ 2 + B k0 * x + C k0 = 0}" + by auto + hence "card ((X \ g) ` {0, 1, 2}) \ card \" + by (intro card_mono fin) auto + also have "\ \ 2" + by (rule card_quadratic_equation_solutions_reals_le_2) + also have "\ < card {0, 1, 2 :: nat}" by simp + finally have "\inj_on (X \ g) {0, 1, 2}" + by (rule pigeonhole) + then obtain m1 m2 where + m12: "m1 \ {0, 1, 2}" "m2 \ {0, 1, 2}" "X (g m1) = X (g m2)" "m1 \ m2" + unfolding inj_on_def o_def by blast + define n and l where "n = min (g m1) (g m2)" and "l = nat \int (g m1) - g m2\" + with m12 g' have l: "l > 0" "X (n + l) = X n" + by (auto simp: min_def nat_diff_distrib split: if_splits) + + from l have "cfrac_lim (cfrac_drop (n + l) e) = cfrac_lim (cfrac_drop n e)" + by (simp add: X_def cfrac_remainder_def) + hence "cfrac_drop (n + l) e = cfrac_drop n e" + by (simp add: cfrac_lim_eq_iff) + hence "cfrac_nth (cfrac_drop (n + l) e) = cfrac_nth (cfrac_drop n e)" + by (simp only:) + hence period: "cfrac_nth e (n + l + k) = cfrac_nth e (n + k)" for k + by (simp add: fun_eq_iff add_ac) + have period: "cfrac_nth e (k + l) = cfrac_nth e k" if "k \ n" for k + using period[of "k - n"] that by (simp add: add_ac) + have period: "cfrac_nth e (k + m * l) = cfrac_nth e k" if "k \ n" for k m + using that + proof (induction m) + case (Suc m) + have "cfrac_nth e (k + Suc m * l) = cfrac_nth e (k + m * l + l)" + by (simp add: algebra_simps) + also have "\ = cfrac_nth e (k + m * l)" + using Suc.prems by (intro period) auto + also have "\ = cfrac_nth e k" + using Suc.prems by (intro Suc.IH) auto + finally show ?case . + qed simp_all + + from this and l and that[of l n] show ?thesis by (simp add: X_def) +qed + +theorem periodic_cfrac_iff_quadratic_irrational: + assumes "x \ \" "x \ 0" + shows "quadratic_irrational x \ + (\N l. l > 0 \ (\n\N. cfrac_nth (cfrac_of_real x) (n + l) = + cfrac_nth (cfrac_of_real x) n))" +proof safe + assume *: "quadratic_irrational x" + with assms have **: "quadratic_irrational (cfrac_lim (cfrac_of_real x))" by auto + obtain N l where Nl: "l > 0" + "\n m. N \ n \ cfrac_nth (cfrac_of_real x) (n + m * l) = cfrac_nth (cfrac_of_real x) n" + "cfrac_remainder (cfrac_of_real x) (N + l) = cfrac_remainder (cfrac_of_real x) N" + "cfrac_length (cfrac_of_real x) = \" + using quadratic_irrational_imp_periodic_cfrac [OF **] by metis + show "\N l. l > 0 \ (\n\N. cfrac_nth (cfrac_of_real x) (n + l) = cfrac_nth (cfrac_of_real x) n)" + by (rule exI[of _ N], rule exI[of _ l]) (insert Nl(1) Nl(2)[of _ 1], auto) +next + fix N l assume "l > 0" "\n\N. cfrac_nth (cfrac_of_real x) (n + l) = cfrac_nth (cfrac_of_real x) n" + hence "quadratic_irrational (cfrac_lim (cfrac_of_real x))" using assms + by (intro periodic_cfrac_imp_quadratic_irrational[of _ l N]) auto + with assms show "quadratic_irrational x" + by simp +qed + +text \ + The following result can e.g. be used to show that a number is \<^emph>\not\ a quadratic + irrational. +\ +lemma quadratic_irrational_cfrac_nth_range_finite: + assumes "quadratic_irrational (cfrac_lim e)" + shows "finite (range (cfrac_nth e))" +proof - + from quadratic_irrational_imp_periodic_cfrac[OF assms] obtain l N + where period: "l > 0" "\m n. n \ N \ cfrac_nth e (n + m * l) = cfrac_nth e n" + by metis + have "cfrac_nth e k \ cfrac_nth e ` {.. cfrac_nth e ` {..l > 0\ by (intro imageI) (auto simp: n_def) + also have "cfrac_nth e n = cfrac_nth e (n + m * l)" + by (subst period) (auto simp: n_def) + also have "n + m * l = k" + using False by (simp add: n_def m_def) + finally show ?thesis . + qed auto + hence "range (cfrac_nth e) \ cfrac_nth e ` {..Continued fraction expansions for square roots of naturals\ +theory Sqrt_Nat_Cfrac +imports + Quadratic_Irrationals + "HOL-Library.While_Combinator" + "HOL-Library.IArray" +begin + +text \ + In this section, we shall explore the continued fraction expansion of $\sqrt{D}$, where $D$ + is a natural number. +\ + +lemma butlast_nth [simp]: "n < length xs - 1 \ butlast xs ! n = xs ! n" + by (induction xs arbitrary: n) (auto simp: nth_Cons split: nat.splits) + +text \ + The following is the length of the period in the continued fraction expansion of + $\sqrt{D}$ for a natural number $D$. +\ +definition sqrt_nat_period_length :: "nat \ nat" where + "sqrt_nat_period_length D = + (if is_square D then 0 + else (LEAST l. l > 0 \ (\n. cfrac_nth (cfrac_of_real (sqrt D)) (Suc n + l) = + cfrac_nth (cfrac_of_real (sqrt D)) (Suc n))))" + +text \ + Next, we define a more workable representation for the continued fraction expansion of + $\sqrt{D}$ consisting of the period length, the natural number $\lfloor\sqrt{D}\rfloor$, and + the content of the period. +\ +definition sqrt_cfrac_info :: "nat \ nat \ nat \ nat list" where + "sqrt_cfrac_info D = + (sqrt_nat_period_length D, Discrete.sqrt D, + map (\n. nat (cfrac_nth (cfrac_of_real (sqrt D)) (Suc n))) [0.. sqrt_nat_period_length D = 0" + by (auto simp: sqrt_nat_period_length_def) + +definition sqrt_cfrac :: "nat \ cfrac" + where "sqrt_cfrac D = cfrac_of_real (sqrt (real D))" + +context + fixes D D' :: nat + defines "D' \ nat \sqrt D\" +begin + +text \ + A number $\alpha = \frac{\sqrt D + p}{q}$ for \p, q \ \\ is called a \<^emph>\reduced quadratic surd\ + if $\alpha > 1$ and $bar\alpha \in (-1;0)$, where $\bar\alpha$ denotes the conjugate + $\frac{-\sqrt D + p}{q}$. + + It is furthermore called \<^emph>\associated\ to $D$ if \q\ divides \D - p\<^sup>2\. +\ +definition red_assoc :: "nat \ nat \ bool" where + "red_assoc = (\(p, q). + q > 0 \ q dvd (D - p\<^sup>2) \ (sqrt D + p) / q > 1 \ (-sqrt D + p) / q \ {-1<..<0})" + +text \ + The following two functions convert between a surd represented as a pair of natural numbers + and the actual real number and its conjugate: +\ +definition surd_to_real :: "nat \ nat \ real" + where "surd_to_real = (\(p, q). (sqrt D + p) / q)" + +definition surd_to_real_cnj :: "nat \ nat \ real" + where "surd_to_real_cnj = (\(p, q). (-sqrt D + p) / q)" + +text \ + The next function performs a single step in the continued fraction expansion of $\sqrt{D}$. +\ +definition sqrt_remainder_step :: "nat \ nat \ nat \ nat" where + "sqrt_remainder_step = (\(p, q). let X = (p + D') div q; p' = X * q - p in (p', (D - p'\<^sup>2) div q))" + +text \ + If we iterate this step function starting from the surd + $\frac{1}{\sqrt{D} - \lfloor\sqrt{D}\rfloor}$, we get the entire expansion. +\ +definition sqrt_remainder_surd :: "nat \ nat \ nat" + where "sqrt_remainder_surd = (\n. (sqrt_remainder_step ^^ n) (D', D - D'\<^sup>2))" + +context + fixes sqrt_cfrac_nth :: "nat \ nat" and l + assumes nonsquare: "\is_square D" + defines "sqrt_cfrac_nth \ (\n. case sqrt_remainder_surd n of (p, q) \ (D' + p) div q)" + defines "l \ sqrt_nat_period_length D" +begin + +lemma D'_pos: "D' > 0" + using nonsquare by (auto simp: D'_def of_nat_ge_1_iff intro: Nat.gr0I) + +lemma D'_sqr_less_D: "D'\<^sup>2 < D" +proof - + have "D' \ sqrt D" by (auto simp: D'_def) + hence "real D' ^ 2 \ sqrt D ^ 2" by (intro power_mono) auto + also have "\ = D" by simp + finally have "D'\<^sup>2 \ D" by simp + moreover from nonsquare have "D \ D'\<^sup>2" by auto + ultimately show ?thesis by simp +qed + +lemma red_assoc_imp_irrat: + assumes "red_assoc pq" + shows "surd_to_real pq \ \" +proof + assume rat: "surd_to_real pq \ \" + with assms rat show False using irrat_sqrt_nonsquare[OF nonsquare] + by (auto simp: field_simps red_assoc_def surd_to_real_def divide_in_Rats_iff2 add_in_Rats_iff1) +qed + +lemma surd_to_real_cnj_irrat: + assumes "red_assoc pq" + shows "surd_to_real_cnj pq \ \" +proof + assume rat: "surd_to_real_cnj pq \ \" + with assms rat show False using irrat_sqrt_nonsquare[OF nonsquare] + by (auto simp: field_simps red_assoc_def surd_to_real_cnj_def divide_in_Rats_iff2 diff_in_Rats_iff1) +qed + +lemma surd_to_real_nonneg [intro]: "surd_to_real pq \ 0" + by (auto simp: surd_to_real_def case_prod_unfold divide_simps intro!: divide_nonneg_nonneg) + +lemma surd_to_real_pos [intro]: "red_assoc pq \ surd_to_real pq > 0" + by (auto simp: surd_to_real_def case_prod_unfold divide_simps red_assoc_def + intro!: divide_nonneg_nonneg) + +lemma surd_to_real_nz [simp]: "red_assoc pq \ surd_to_real pq \ 0" + by (auto simp: surd_to_real_def case_prod_unfold divide_simps red_assoc_def + intro!: divide_nonneg_nonneg) + +lemma surd_to_real_cnj_nz [simp]: "red_assoc pq \ surd_to_real_cnj pq \ 0" + using surd_to_real_cnj_irrat[of pq] by auto + +lemma red_assoc_step: + assumes "red_assoc pq" + defines "X \ (D' + fst pq) div snd pq" + defines "pq' \ sqrt_remainder_step pq" + shows "red_assoc pq'" + "surd_to_real pq' = 1 / frac (surd_to_real pq)" + "surd_to_real_cnj pq' = 1 / (surd_to_real_cnj pq - X)" + "X > 0" "X * snd pq \ 2 * D'" "X = nat \surd_to_real pq\" + "X = nat \-1 / surd_to_real_cnj pq'\" +proof - + obtain p q where [simp]: "pq = (p, q)" by (cases pq) + obtain p' q' where [simp]: "pq' = (p', q')" by (cases pq') + define \ where "\ = (sqrt D + p) / q" + define \' where "\' = 1 / frac \" + define cnj_\' where "cnj_\' = (-sqrt D + (X * q - int p)) / ((D - (X * q - int p)\<^sup>2) div q)" + from assms(1) have "\ > 0" "q > 0" + by (auto simp: \_def red_assoc_def) + from assms(1) nonsquare have "\ \ \" + by (auto simp: \_def red_assoc_def divide_in_Rats_iff2 add_in_Rats_iff2 irrat_sqrt_nonsquare) + hence \'_pos: "frac \ > 0" using Ints_subset_Rats by auto + from \pq' = (p', q')\ have p'_def: "p' = X * q - p" and q'_def: "q' = (D - p'\<^sup>2) div q" + unfolding pq'_def sqrt_remainder_step_def X_def by (auto simp: Let_def add_ac) + + have "D' + p = \sqrt D + p\" + by (auto simp: D'_def) + also have "\ div int q = \(sqrt D + p) / q\" + by (subst floor_divide_real_eq_div [symmetric]) auto + finally have X_altdef: "X = nat \(sqrt D + p) / q\" + unfolding X_def zdiv_int [symmetric] by auto + + have nz: "sqrt (real D) + (X * q - real p) \ 0" + proof + assume "sqrt (real D) + (X * q - real p) = 0" + hence "sqrt (real D) = real p - X * q" by (simp add: algebra_simps) + also have "\ \ \" by auto + finally show False using irrat_sqrt_nonsquare nonsquare by blast + qed + + from assms(1) have "real (p ^ 2) \ sqrt D ^ 2" + unfolding of_nat_power by (intro power_mono) (auto simp: red_assoc_def field_simps) + also have "sqrt D ^ 2 = D" by simp + finally have "p\<^sup>2 \ D" by (subst (asm) of_nat_le_iff) + + have "frac \ = \ - X" + by (simp add: X_altdef frac_def \_def) + also have "\ = (sqrt D - (X * q - int p)) / q" + using \q > 0\ by (simp add: field_simps \_def) + finally have "1 / frac \ = q / (sqrt D - (X * q - int p))" + by simp + also have "\ = q * (sqrt D + (X * q - int p)) / + ((sqrt D - (X * q - int p)) * (sqrt D + (X * q - int p)))" (is "_ = ?A / ?B") + using nz by (subst mult_divide_mult_cancel_right) auto + also have "?B = real_of_int (D - int p ^ 2 + 2 * X * p * q - int X ^ 2 * q ^ 2)" + by (auto simp: algebra_simps power2_eq_square) + also have "q dvd (D - p ^ 2)" using assms(1) by (auto simp: red_assoc_def) + with \p\<^sup>2 \ D\ have "int q dvd (int D - int p ^ 2)" + unfolding of_nat_power [symmetric] by (subst of_nat_diff [symmetric]) auto + hence "D - int p ^ 2 + 2 * X * p * q - int X ^ 2 * q ^ 2 = q * ((D - (X * q - int p)\<^sup>2) div q)" + by (auto simp: power2_eq_square algebra_simps) + also have "?A / \ = (sqrt D + (X * q - int p)) / ((D - (X * q - int p)\<^sup>2) div q)" + unfolding of_int_mult of_int_of_nat_eq + by (rule mult_divide_mult_cancel_left) (insert \q > 0\, auto) + finally have \': "\' = \" by (simp add: \'_def) + + have dvd: "q dvd (D - (X * q - int p)\<^sup>2)" + using assms(1) \int q dvd (int D - int p ^ 2)\ + by (auto simp: power2_eq_square algebra_simps) + + have "X \ (sqrt D + p) / q" unfolding X_altdef by simp + moreover have "X \ (sqrt D + p) / q" + proof + assume "X = (sqrt D + p) / q" + hence "sqrt D = q * X - real p" using \q > 0\ by (auto simp: field_simps) + also have "\ \ \" by auto + finally show False using irrat_sqrt_nonsquare[OF nonsquare] by simp + qed + ultimately have "X < (sqrt D + p) / q" by simp + hence *: "(X * q - int p) < sqrt D" + using \q > 0\ by (simp add: field_simps) + moreover + have pos: "real_of_int (int D - (int X * int q - int p)\<^sup>2) > 0" + proof (cases "X * q \ p") + case True + hence "real p \ real X * real q" unfolding of_nat_mult [symmetric] of_nat_le_iff . + hence "real_of_int ((X * q - int p) ^ 2) < sqrt D ^ 2" using * + unfolding of_int_power by (intro power_strict_mono) auto + also have "\ = D" by simp + finally show ?thesis by simp + next + case False + hence less: "real X * real q < real p" + unfolding of_nat_mult [symmetric] of_nat_less_iff by auto + have "(real X * real q - real p)\<^sup>2 = (real p - real X * real q)\<^sup>2" + by (simp add: power2_eq_square algebra_simps) + also have "\ \ real p ^ 2" using less by (intro power_mono) auto + also have "\ < sqrt D ^ 2" + using \q > 0\ assms(1) unfolding of_int_power + by (intro power_strict_mono) (auto simp: red_assoc_def field_simps) + also have "\ = D" by simp + finally show ?thesis by simp + qed + hence pos': "int D - (int X * int q - int p)\<^sup>2 > 0" + by (subst (asm) of_int_0_less_iff) + from pos have "real_of_int ((int D - (int X * int q - int p)\<^sup>2) div q) > 0" + using \q > 0\ dvd by (subst real_of_int_div) (auto intro!: divide_pos_pos) + ultimately have cnj_neg: "cnj_\' < 0" unfolding cnj_\'_def using dvd + unfolding of_int_0_less_iff by (intro divide_neg_pos) auto + + have "(p - sqrt D) / q < 0" + using assms(1) by (auto simp: red_assoc_def X_altdef le_nat_iff) + also have "X \ 1" + using assms(1) by (auto simp: red_assoc_def X_altdef le_nat_iff) + hence "0 \ real X - 1" by simp + finally have "q < sqrt D + int q * X - p" + using \q > 0\ by (simp add: field_simps) + hence "q * (sqrt D - (int q * X - p)) < (sqrt D + (int q * X - p)) * (sqrt D - (int q * X - p))" + using * by (intro mult_strict_right_mono) (auto simp: red_assoc_def X_altdef field_simps) + also have "\ = D - (int q * X - p) ^ 2" + by (simp add: power2_eq_square algebra_simps) + finally have "cnj_\' > -1" + using dvd pos \q > 0\ by (simp add: real_of_int_div field_simps cnj_\'_def) + + from cnj_neg and this have "cnj_\' \ {-1<..<0}" by auto + have "\' > 1" using \frac \ > 0\ + by (auto simp: \'_def field_simps frac_lt_1) + + have "0 = 1 + (-1 :: real)" + by simp + also have "1 + -1 < \' + cnj_\'" + using \cnj_\' > -1\ and \\' > 1\ by (intro add_strict_mono) + also have "\' + cnj_\' = 2 * (real X * q - real p) / ((int D - (int X * q - int p)\<^sup>2) div int q)" + by (simp add: \' cnj_\'_def add_divide_distrib [symmetric]) + finally have "real X * q - real p > 0" using pos dvd \q > 0\ + by (subst (asm) zero_less_divide_iff, subst (asm) (1 2 3) real_of_int_div) + (auto simp: field_simps) + hence "real (X * q) > real p" unfolding of_nat_mult by simp + hence p_less_Xq: "p < X * q" by (simp only: of_nat_less_iff) + + from pos' and p_less_Xq have "int D > int ((X * q - p)\<^sup>2)" + by (subst of_nat_power) (auto simp: of_nat_diff) + hence pos'': "D > (X * q - p)\<^sup>2" unfolding of_nat_less_iff . + + from dvd have "int q dvd int (D - (X * q - p)\<^sup>2)" + using p_less_Xq pos'' by (subst of_nat_diff) (auto simp: of_nat_diff) + with dvd have dvd': "q dvd (D - (X * q - p)\<^sup>2)" + by simp + + have \'_altdef: "\' = (sqrt D + p') / q'" + using dvd dvd' pos'' p_less_Xq \' + by (simp add: real_of_int_div p'_def q'_def real_of_nat_div mult_ac of_nat_diff) + have cnj_\'_altdef: "cnj_\' = (-sqrt D + p') / q'" + using dvd dvd' pos'' p_less_Xq unfolding cnj_\'_def + by (simp add: real_of_int_div p'_def q'_def real_of_nat_div mult_ac of_nat_diff) + from dvd' have dvd'': "q' dvd (D - p'\<^sup>2)" + by (auto simp: mult_ac p'_def q'_def) + have "real ((D - p'\<^sup>2) div q) > 0" unfolding p'_def + by (subst real_of_nat_div[OF dvd'], rule divide_pos_pos) (insert \q > 0\ pos'', auto) + hence "q' > 0" unfolding q'_def of_nat_0_less_iff . + + show "red_assoc pq'" using \\' > 1\ and \cnj_\' \ _\ and dvd'' and \q' > 0\ + by (auto simp: red_assoc_def \'_altdef cnj_\'_altdef) + + from assms(1) have "real p < sqrt D" + by (auto simp add: field_simps red_assoc_def) + hence "p \ D'" unfolding D'_def by linarith + with * have "real (X * q) < sqrt (real D) + D'" + by simp + thus "X * snd pq \ 2 * D'" unfolding D'_def \pq = (p, q)\ snd_conv by linarith + + have "(sqrt D + p') / q' = \'" + by (rule \'_altdef [symmetric]) + also have "\' = 1 / frac ((sqrt D + p) / q)" + by (simp add: \'_def \_def) + finally show "surd_to_real pq' = 1 / frac (surd_to_real pq)" by (simp add: surd_to_real_def) + from \X \ 1\ show "X > 0" by simp + from X_altdef show "X = nat \surd_to_real pq\" by (simp add: surd_to_real_def) + + have "sqrt (real D) < real p + 1 * real q" + using assms(1) by (auto simp: red_assoc_def field_simps) + also have "\ \ real p + real X * real q" + using \X > 0\ by (intro add_left_mono mult_right_mono) (auto simp: of_nat_ge_1_iff) + finally have "sqrt (real D) < \" . + + have "real p < sqrt D" + using assms(1) by (auto simp add: field_simps red_assoc_def) + also have "\ \ sqrt D + q * X" + by linarith + finally have less: "real p < sqrt D + X * q" by (simp add: algebra_simps) + moreover have "D + p * p' + X * q * sqrt D = q * q' + p * sqrt D + p' * sqrt D + X * p' * q" + using dvd' pos'' p_less_Xq \q > 0\ unfolding p'_def q'_def of_nat_mult of_nat_add + by (simp add: power2_eq_square field_simps of_nat_diff real_of_nat_div) + ultimately show *: "surd_to_real_cnj pq' = 1 / (surd_to_real_cnj pq - X)" + using \q > 0\ \q' > 0\ by (auto simp: surd_to_real_cnj_def field_simps) + + have **: "a = nat \y\" if "x \ 0" "x < 1" "real a + x = y" for a :: nat and x y :: real + using that by linarith + from assms(1) have surd_to_real_cnj: "surd_to_real_cnj (p, q) \ {-1<..<0}" + by (auto simp: surd_to_real_cnj_def red_assoc_def) + have "surd_to_real_cnj (p, q) < X" + using assms(1) less by (auto simp: surd_to_real_cnj_def field_simps red_assoc_def) + hence "real X = surd_to_real_cnj (p, q) - 1 / surd_to_real_cnj (p', q')" using * + using surd_to_real_cnj_irrat assms(1) \red_assoc pq'\ by (auto simp: field_simps) + thus "X = nat \-1 / surd_to_real_cnj pq'\" using surd_to_real_cnj + by (intro **[of "-surd_to_real_cnj (p, q)"]) auto +qed + +lemma red_assoc_denom_2D: + assumes "red_assoc (p, q)" + defines "X \ (D' + p) div q" + assumes "X > D'" + shows "q = 1" +proof - + have "X * q \ 2 * D'" "X > 0" + using red_assoc_step(4,5)[OF assms(1)] by (simp_all add: X_def) + note this(1) + also have "2 * D' < 2 * X" + by (intro mult_strict_left_mono assms) auto + finally have "q < 2" using \X > 0\ by simp + moreover from assms(1) have "q > 0" by (auto simp: red_assoc_def) + ultimately show ?thesis by simp +qed + +lemma red_assoc_denom_1: + assumes "red_assoc (p, 1)" + shows "p = D'" +proof - + from assms have "sqrt D > p" "sqrt D < real p + 1" + by (auto simp: red_assoc_def) + thus "p = D'" unfolding D'_def + by linarith +qed + +lemma red_assoc_begin: + "red_assoc (D', D - D'\<^sup>2)" + "surd_to_real (D', D - D'\<^sup>2) = 1 / frac (sqrt D)" + "surd_to_real_cnj (D', D - D'\<^sup>2) = -1 / (sqrt D + D')" +proof - + have pos: "D > 0" "D' > 0" + using nonsquare by (auto simp: D'_def of_nat_ge_1_iff intro!: Nat.gr0I) + + have "sqrt D \ D'" + using irrat_sqrt_nonsquare[OF nonsquare] by auto + moreover have "sqrt D \ 0" by simp + hence "D' \ sqrt D" unfolding D'_def by linarith + ultimately have less: "D' < sqrt D" by simp + + have "sqrt D \ D' + 1" + using irrat_sqrt_nonsquare[OF nonsquare] by auto + moreover have "sqrt D \ 0" by simp + hence "D' \ sqrt D - 1" unfolding D'_def by linarith + ultimately have gt: "D' > sqrt D - 1" by simp + + from less have "real D' ^ 2 < sqrt D ^ 2" by (intro power_strict_mono) auto + also have "\ = D" by simp + finally have less': "D'\<^sup>2 < D" unfolding of_nat_power [symmetric] of_nat_less_iff . + + moreover have "real D' * (real D' - 1) < sqrt D * (sqrt D - 1)" + using less pos + by (intro mult_strict_mono diff_strict_right_mono) (auto simp: of_nat_ge_1_iff) + hence "D'\<^sup>2 + sqrt D < D' + D" + by (simp add: field_simps power2_eq_square) + moreover have "(sqrt D - 1) * sqrt D < real D' * (real D' + 1)" + using pos gt by (intro mult_strict_mono) auto + hence "D < sqrt D + D'\<^sup>2 + D'" by (simp add: power2_eq_square field_simps) + ultimately show "red_assoc (D', D - D'\<^sup>2)" + by (auto simp: red_assoc_def field_simps of_nat_diff less) + + have frac: "frac (sqrt D) = sqrt D - D'" unfolding frac_def D'_def + by auto + show "surd_to_real (D', D - D'\<^sup>2) = 1 / frac (sqrt D)" unfolding surd_to_real_def + using less less' pos by (subst frac) (auto simp: of_nat_diff power2_eq_square field_simps) + + have "surd_to_real_cnj (D', D - D'\<^sup>2) = -((sqrt D - D') / (D - D'\<^sup>2))" + using less less' pos by (auto simp: surd_to_real_cnj_def field_simps) + also have "real (D - D'\<^sup>2) = (sqrt D - D') * (sqrt D + D')" + using less' by (simp add: power2_eq_square algebra_simps of_nat_diff) + also have "(sqrt D - D') / \ = 1 / (sqrt D + D')" + using less by (subst nonzero_divide_mult_cancel_left) auto + finally show "surd_to_real_cnj (D', D - D'\<^sup>2) = -1 / (sqrt D + D')" by simp +qed + +lemma cfrac_remainder_surd_to_real: + assumes "red_assoc pq" + shows "cfrac_remainder (cfrac_of_real (surd_to_real pq)) n = + surd_to_real ((sqrt_remainder_step ^^ n) pq)" + using assms(1) +proof (induction n arbitrary: pq) + case 0 + hence "cfrac_lim (cfrac_of_real (surd_to_real pq)) = surd_to_real pq" + by (intro cfrac_lim_of_real red_assoc_imp_irrat 0) + thus ?case using 0 + by auto +next + case (Suc n) + obtain p q where [simp]: "pq = (p, q)" by (cases pq) + have "surd_to_real ((sqrt_remainder_step ^^ Suc n) pq) = + surd_to_real ((sqrt_remainder_step ^^ n) (sqrt_remainder_step (p, q)))" + by (subst funpow_Suc_right) auto + also have "\ = cfrac_remainder (cfrac_of_real (surd_to_real (sqrt_remainder_step (p, q)))) n" + using red_assoc_step(1)[of "(p, q)"] Suc.prems + by (intro Suc.IH [symmetric]) (auto simp: sqrt_remainder_step_def Let_def add_ac) + also have "surd_to_real (sqrt_remainder_step (p, q)) = 1 / frac (surd_to_real (p, q))" + using red_assoc_step(2)[of "(p, q)"] Suc.prems + by (auto simp: sqrt_remainder_step_def Let_def add_ac surd_to_real_def) + also have "cfrac_of_real \ = cfrac_tl (cfrac_of_real (surd_to_real (p, q)))" + using Suc.prems Ints_subset_Rats red_assoc_imp_irrat by (subst cfrac_tl_of_real) auto + also have "cfrac_remainder \ n = cfrac_remainder (cfrac_of_real (surd_to_real (p, q))) (Suc n)" + by (simp add: cfrac_drop_Suc_right cfrac_remainder_def) + finally show ?case by simp +qed + +lemma red_assoc_step' [intro]: "red_assoc pq \ red_assoc (sqrt_remainder_step pq)" + using red_assoc_step(1)[of pq] + by (simp add: sqrt_remainder_step_def case_prod_unfold add_ac Let_def) + +lemma red_assoc_steps [intro]: "red_assoc pq \ red_assoc ((sqrt_remainder_step ^^ n) pq)" + by (induction n) auto + +lemma floor_sqrt_less_sqrt: "D' < sqrt D" +proof - + have "D' \ sqrt D" unfolding D'_def by auto + moreover have "sqrt D \ D'" + using irrat_sqrt_nonsquare[OF nonsquare] by auto + ultimately show ?thesis by auto +qed + +lemma red_assoc_bounds: + assumes "red_assoc pq" + shows "pq \ (SIGMA p:{0<..D'}. {Suc D' - p..D' + p})" +proof - + obtain p q where [simp]: "pq = (p, q)" by (cases pq) + from assms have *: "p < sqrt D" + by (auto simp: red_assoc_def field_simps) + hence p: "p \ D'" unfolding D'_def by linarith + from assms have "p > 0" by (auto intro!: Nat.gr0I simp: red_assoc_def) + + have "q > sqrt D - p" "q < sqrt D + p" + using assms by (auto simp: red_assoc_def field_simps) + hence "q \ D' + 1 - p" "q \ D' + p" + unfolding D'_def by linarith+ + with p \p > 0\ show ?thesis by simp +qed + +lemma surd_to_real_cnj_eq_iff: + assumes "red_assoc pq" "red_assoc pq'" + shows "surd_to_real_cnj pq = surd_to_real_cnj pq' \ pq = pq'" +proof + assume eq: "surd_to_real_cnj pq = surd_to_real_cnj pq'" + from assms have pos: "snd pq > 0" "snd pq' > 0" by (auto simp: red_assoc_def) + have "snd pq = snd pq'" + proof (rule ccontr) + assume "snd pq \ snd pq'" + with eq have "sqrt D = (real (fst pq' * snd pq) - fst pq * snd pq') / (real (snd pq) - snd pq')" + using pos by (auto simp: field_simps surd_to_real_cnj_def case_prod_unfold) + also have "\ \ \" by auto + finally show False using irrat_sqrt_nonsquare[OF nonsquare] by auto + qed + moreover from this eq pos have "fst pq = fst pq'" + by (auto simp: surd_to_real_cnj_def case_prod_unfold) + ultimately show "pq = pq'" by (simp add: prod_eq_iff) +qed auto + +lemma red_assoc_sqrt_remainder_surd [intro]: "red_assoc (sqrt_remainder_surd n)" + by (auto simp: sqrt_remainder_surd_def intro!: red_assoc_begin) + +lemma surd_to_real_sqrt_remainder_surd: + "surd_to_real (sqrt_remainder_surd n) = cfrac_remainder (cfrac_of_real (sqrt D)) (Suc n)" +proof (induction n) + case 0 + from nonsquare have "D > 0" by (auto intro!: Nat.gr0I) + with red_assoc_begin show ?case using nonsquare irrat_sqrt_nonsquare[OF nonsquare] + using Ints_subset_Rats cfrac_drop_Suc_right cfrac_remainder_def cfrac_tl_of_real + sqrt_remainder_surd_def by fastforce +next + case (Suc n) + have "surd_to_real (sqrt_remainder_surd (Suc n)) = + surd_to_real (sqrt_remainder_step (sqrt_remainder_surd n))" + by (simp add: sqrt_remainder_surd_def) + also have "\ = 1 / frac (surd_to_real (sqrt_remainder_surd n))" + using red_assoc_step[OF red_assoc_sqrt_remainder_surd[of n]] by simp + also have "surd_to_real (sqrt_remainder_surd n) = + cfrac_remainder (cfrac_of_real (sqrt D)) (Suc n)" (is "_ = ?X") + by (rule Suc.IH) + also have "\cfrac_remainder (cfrac_of_real (sqrt (real D))) (Suc n)\ = + cfrac_nth (cfrac_of_real (sqrt (real D))) (Suc n)" + using irrat_sqrt_nonsquare[OF nonsquare] by (intro floor_cfrac_remainder) auto + hence "1 / frac ?X = cfrac_remainder (cfrac_of_real (sqrt D)) (Suc (Suc n))" + using irrat_sqrt_nonsquare[OF nonsquare] + by (subst cfrac_remainder_Suc[of "Suc n"]) + (simp_all add: frac_def cfrac_length_of_real_irrational) + finally show ?case . +qed + +lemma sqrt_cfrac: "sqrt_cfrac_nth n = cfrac_nth (cfrac_of_real (sqrt D)) (Suc n)" +proof - + have "cfrac_nth (cfrac_of_real (sqrt D)) (Suc n) = + \cfrac_remainder (cfrac_of_real (sqrt D)) (Suc n)\" + using irrat_sqrt_nonsquare[OF nonsquare] by (subst floor_cfrac_remainder) auto + also have "cfrac_remainder (cfrac_of_real (sqrt D)) (Suc n) = surd_to_real (sqrt_remainder_surd n)" + by (rule surd_to_real_sqrt_remainder_surd [symmetric]) + also have "nat \surd_to_real (sqrt_remainder_surd n)\ = sqrt_cfrac_nth n" + unfolding sqrt_cfrac_nth_def using red_assoc_step(6)[OF red_assoc_sqrt_remainder_surd[of n]] + by (simp add: case_prod_unfold) + finally show ?thesis + by (simp add: nat_eq_iff) +qed + +lemma sqrt_cfrac_pos: "sqrt_cfrac_nth k > 0" + using red_assoc_step(4)[OF red_assoc_sqrt_remainder_surd[of k]] + by (simp add: sqrt_cfrac_nth_def case_prod_unfold) + +lemma snd_sqrt_remainder_surd_pos: "snd (sqrt_remainder_surd n) > 0" + using red_assoc_sqrt_remainder_surd[of n] by (auto simp: red_assoc_def) + + +lemma + shows period_nonempty: "l > 0" + and period_length_le_aux: "l \ D' * (D' + 1)" + and sqrt_remainder_surd_periodic: "\n. sqrt_remainder_surd n = sqrt_remainder_surd (n mod l)" + and sqrt_cfrac_periodic: "\n. sqrt_cfrac_nth n = sqrt_cfrac_nth (n mod l)" + and sqrt_remainder_surd_smallest_period: + "\n. n \ {0<.. sqrt_remainder_surd n \ sqrt_remainder_surd 0" + and snd_sqrt_remainder_surd_gt_1: "\n. n < l - 1 \ snd (sqrt_remainder_surd n) > 1" + and sqrt_cfrac_le: "\n. n < l - 1 \ sqrt_cfrac_nth n \ D'" + and sqrt_remainder_surd_last: "sqrt_remainder_surd (l - 1) = (D', 1)" + and sqrt_cfrac_last: "sqrt_cfrac_nth (l - 1) = 2 * D'" + and sqrt_cfrac_palindrome: "\n. n < l - 1 \ sqrt_cfrac_nth (l - n - 2) = sqrt_cfrac_nth n" + and sqrt_cfrac_smallest_period: + "\l'. l' > 0 \ (\k. sqrt_cfrac_nth (k + l') = sqrt_cfrac_nth k) \ l' \ l" +proof - + note [simp] = sqrt_remainder_surd_def + define f where "f = sqrt_remainder_surd" + have *[intro]: "red_assoc (f n)" for n + unfolding f_def by (rule red_assoc_sqrt_remainder_surd) + + define S where "S = (SIGMA p:{0<..D'}. {Suc D' - p..D' + p})" + have [intro]: "finite S" by (simp add: S_def) + have "card S = (\p=1..D'. 2 * p)" unfolding S_def + by (subst card_SigmaI) (auto intro!: sum.cong) + also have "\ = D' * (D' + 1)" + by (induction D') (auto simp: power2_eq_square) + finally have [simp]: "card S = D' * (D' + 1)" . + + have "D' * (D' + 1) + 1 = card {..D' * (D' + 1)}" by simp + define k1 where + "k1 = (LEAST k1. k1 \ D' * (D' + 1) \ (\k2. k2 \ D' * (D' + 1) \ k1 \ k2 \ f k1 = f k2))" + define k2 where + "k2 = (LEAST k2. k2 \ D' * (D' + 1) \ k1 \ k2 \ f k1 = f k2)" + + have "f ` {..D' * (D' + 1)} \ S" unfolding S_def + using red_assoc_bounds[OF *] by blast + hence "card (f ` {..D' * (D' + 1)}) \ card S" + by (intro card_mono) auto + also have "card S = D' * (D' + 1)" by simp + also have "\ < card {..D' * (D' + 1)}" by simp + finally have "\inj_on f {..D' * (D' + 1)}" + by (rule pigeonhole) + hence "\k1. k1 \ D' * (D' + 1) \ (\k2. k2 \ D' * (D' + 1) \ k1 \ k2 \ f k1 = f k2)" + by (auto simp: inj_on_def) + from LeastI_ex[OF this, folded k1_def] + have "k1 \ D' * (D' + 1)" "\k2\D' * (D' + 1). k1 \ k2 \ f k1 = f k2" by auto + moreover from LeastI_ex[OF this(2), folded k2_def] + have "k2 \ D' * (D' + 1)" "k1 \ k2" "f k1 = f k2" by auto + moreover have "k1 \ k2" + proof (rule ccontr) + assume "\(k1 \ k2)" + hence "k2 \ D' * (D' + 1) \ (\k2'. k2' \ D' * (D' + 1) \ k2 \ k2' \ f k2 = f k2')" + using \k1 \ D' * (D' + 1)\ and \k1 \ k2\ and \f k1 = f k2\ by auto + hence "k1 \ k2" unfolding k1_def by (rule Least_le) + with \\(k1 \ k2)\ show False by simp + qed + ultimately have k12: "k1 < k2" "k2 \ D' * (D' + 1)" "f k1 = f k2" by auto + + have [simp]: "k1 = 0" + proof (cases k1) + case (Suc k1') + define k2' where "k2' = k2 - 1" + have Suc': "k2 = Suc k2'" using k12 by (simp add: k2'_def) + have nz: "surd_to_real_cnj (sqrt_remainder_step (f k1')) \ 0" + "surd_to_real_cnj (sqrt_remainder_step (f k2')) \ 0" + using surd_to_real_cnj_nz[OF *[of k2]] surd_to_real_cnj_nz[OF *[of k1]] + by (simp_all add: f_def Suc Suc') + + define a where "a = (D' + fst (f k1)) div snd (f k1)" + define a' where "a' = (D' + fst (f k1')) div snd (f k1')" + define a'' where "a'' = (D' + fst (f k2')) div snd (f k2')" + have "a' = nat \- 1 / surd_to_real_cnj (sqrt_remainder_step (f k1'))\" + using red_assoc_step[OF *[of k1']] by (simp add: a'_def) + also have "sqrt_remainder_step (f k1') = f k1" + by (simp add: Suc f_def) + also have "f k1 = f k2" by fact + also have "f k2 = sqrt_remainder_step (f k2')" by (simp add: Suc' f_def) + also have "nat \- 1 / surd_to_real_cnj (sqrt_remainder_step (f k2'))\ = a''" + using red_assoc_step[OF *[of k2']] by (simp add: a''_def) + finally have a'_a'': "a' = a''" . + + have "surd_to_real_cnj (f k2') \ a''" + using surd_to_real_cnj_irrat[OF *[of k2']] by auto + hence "surd_to_real_cnj (f k2') = 1 / surd_to_real_cnj (sqrt_remainder_step (f k2')) + a''" + using red_assoc_step(3)[OF *[of k2'], folded a''_def] nz + by (simp add: field_simps) + also have "\ = 1 / surd_to_real_cnj (sqrt_remainder_step (f k1')) + a'" + using k12 by (simp add: a'_a'' k12 Suc Suc' f_def) + also have nz': "surd_to_real_cnj (f k1') \ a'" + using surd_to_real_cnj_irrat[OF *[of k1']] by auto + hence "1 / surd_to_real_cnj (sqrt_remainder_step (f k1')) + a' = surd_to_real_cnj (f k1')" + using red_assoc_step(3)[OF *[of k1'], folded a'_def] nz nz' + by (simp add: field_simps) + finally have "f k1' = f k2'" + by (subst (asm) surd_to_real_cnj_eq_iff) auto + with k12 have "k1' \ D' * (D' + 1) \ (\k2\D' * (D' + 1). k1' \ k2 \ f k1' = f k2)" + by (auto simp: Suc Suc' intro!: exI[of _ k2']) + hence "k1 \ k1'" unfolding k1_def by (rule Least_le) + thus "k1 = 0" by (simp add: Suc) + qed auto + + have smallest_period: "f k \ f 0" if "k \ {0<.. D' * (D' + 1) \ k1 \ k \ f k1 = f k" + using k12 that by auto + hence "k2 \ k" unfolding k2_def by (rule Least_le) + with that show False by auto + qed + + have snd_f_gt_1: "snd (f k) > 1" if "k < k2 - 1" for k + proof - + have "snd (f k) \ 1" + proof + assume "snd (f k) = 1" + hence "f k = (D', 1)" using red_assoc_denom_1[of "fst (f k)"] *[of k] + by (cases "f k") auto + hence "sqrt_remainder_step (f k) = (D', D - D'\<^sup>2)" by (auto simp: sqrt_remainder_step_def) + hence "f (Suc k) = f 0" by (simp add: f_def) + moreover have "f (Suc k) \ f 0" + using that by (intro smallest_period) auto + ultimately show False by contradiction + qed + moreover have "snd (f k) > 0" using *[of k] by (auto simp: red_assoc_def) + ultimately show ?thesis by simp + qed + + have sqrt_cfrac_le: "sqrt_cfrac_nth k \ D'" if "k < k2 - 1" for k + proof - + define p and q where "p = fst (f k)" and "q = snd (f k)" + have "q \ 2" using snd_f_gt_1[of k] that by (auto simp: q_def) + also have "sqrt_cfrac_nth k * q \ D' * 2" + using red_assoc_step(5)[OF *[of k]] + by (simp add: sqrt_cfrac_nth_def p_def q_def case_prod_unfold f_def) + finally show ?thesis by simp + qed + + have last: "f (k2 - 1) = (D', 1)" + proof - + define p and q where "p = fst (f (k2 - 1))" and "q = snd (f (k2 - 1))" + have pq: "f (k2 - 1) = (p, q)" by (simp add: p_def q_def) + have "sqrt_remainder_step (f (k2 - 1)) = f (Suc (k2 - 1))" + by (simp add: f_def) + also from k12 have "Suc (k2 - 1) = k2" by simp + also have "f k2 = f 0" + using k12 by simp + also have "f 0 = (D', D - D'\<^sup>2)" by (simp add: f_def) + finally have eq: "sqrt_remainder_step (f (k2 - 1)) = (D', D - D'\<^sup>2)" . + + hence "(D - D'\<^sup>2) div q = D - D'\<^sup>2" unfolding sqrt_remainder_step_def Let_def pq + by auto + moreover have "q > 0" using *[of "k2 - 1"] + by (auto simp: red_assoc_def q_def) + ultimately have "q = 1" using D'_sqr_less_D + by (subst (asm) div_eq_dividend_iff) auto + hence "p = D'" + using red_assoc_denom_1[of p] *[of "k2 - 1"] unfolding pq by auto + with \q = 1\ show "f (k2 - 1) = (D', 1)" unfolding pq by simp + qed + + have period: "sqrt_remainder_surd n = sqrt_remainder_surd (n mod k2)" for n + unfolding sqrt_remainder_surd_def using k12 by (intro funpow_cycle) (auto simp: f_def) + have period': "sqrt_cfrac_nth k = sqrt_cfrac_nth (k mod k2)" for k + using period[of k] by (simp add: sqrt_cfrac_nth_def) + + have k2_le: "l \ k2" if "l > 0" "\k. sqrt_cfrac_nth (k + l) = sqrt_cfrac_nth k" for l + proof (rule ccontr) + assume *: "\(l \ k2)" + hence "sqrt_cfrac_nth (k2 - Suc l) = sqrt_cfrac_nth (k2 - 1)" + using that(2)[of "k2 - Suc l"] by simp + also have "\ = 2 * D'" + using last by (simp add: sqrt_cfrac_nth_def f_def) + finally have "2 * D' = sqrt_cfrac_nth (k2 - Suc l)" .. + also have "\ \ D'" using k12 that * + by (intro sqrt_cfrac_le diff_less_mono2) auto + finally show False using D'_pos by simp + qed + + have "l = (LEAST l. 0 < l \ (\n. int (sqrt_cfrac_nth (n + l)) = int (sqrt_cfrac_nth n)))" + using nonsquare unfolding sqrt_cfrac_def + by (simp add: l_def sqrt_nat_period_length_def sqrt_cfrac) + hence l_altdef: "l = (LEAST l. 0 < l \ (\n. sqrt_cfrac_nth (n + l) = sqrt_cfrac_nth n))" + by simp + + have [simp]: "D \ 0" using nonsquare by (auto intro!: Nat.gr0I) + have "\l. l > 0 \ (\k. sqrt_cfrac_nth (k + l) = sqrt_cfrac_nth k)" + proof (rule exI, safe) + fix k show "sqrt_cfrac_nth (k + k2) = sqrt_cfrac_nth k" + using period'[of k] period'[of "k + k2"] k12 by simp + qed (insert k12, auto) + from LeastI_ex[OF this, folded l_altdef] + have l: "l > 0" "\k. sqrt_cfrac_nth (k + l) = sqrt_cfrac_nth k" + by (simp_all add: sqrt_cfrac) + + have "l \ k2" unfolding l_altdef + by (rule Least_le) (subst (1 2) period', insert k12, auto) + moreover have "k2 \ l" using k2_le l by blast + ultimately have [simp]: "l = k2" by auto + + define x' where "x' = (\k. -1 / surd_to_real_cnj (f k))" + { + fix k :: nat + have nz: "surd_to_real_cnj (f k) \ 0" "surd_to_real_cnj (f (Suc k)) \ 0" + using surd_to_real_cnj_nz[OF *, of k] surd_to_real_cnj_nz[OF *, of "Suc k"] + by (simp_all add: f_def) + + have "surd_to_real_cnj (f k) \ sqrt_cfrac_nth k" + using surd_to_real_cnj_irrat[OF *[of k]] by auto + hence "x' (Suc k) = sqrt_cfrac_nth k + 1 / x' k" + using red_assoc_step(3)[OF *[of k]] nz + by (simp add: field_simps sqrt_cfrac_nth_def case_prod_unfold f_def x'_def) + } note x'_Suc = this + + have x'_nz: "x' k \ 0" for k + using surd_to_real_cnj_nz[OF *[of k]] by (auto simp: x'_def) + have x'_0: "x' 0 = real D' + sqrt D" + using red_assoc_begin by (simp add: x'_def f_def) + + define c' where "c' = cfrac (\n. sqrt_cfrac_nth (l - Suc n))" + define c'' where "c'' = cfrac (\n. if n = 0 then 2 * D' else sqrt_cfrac_nth (n - 1))" + have nth_c' [simp]: "cfrac_nth c' n = sqrt_cfrac_nth (l - Suc n)" for n + unfolding c'_def by (subst cfrac_nth_cfrac) (auto simp: is_cfrac_def intro!: sqrt_cfrac_pos) + have nth_c'' [simp]: "cfrac_nth c'' n = (if n = 0 then 2 * D' else sqrt_cfrac_nth (n - 1))" for n + unfolding c''_def by (subst cfrac_nth_cfrac) (auto simp: is_cfrac_def intro!: sqrt_cfrac_pos) + + have "conv' c' n (x' (l - n)) = x' l" if "n \ l" for n + using that + proof (induction n) + case (Suc n) + have "x' l = conv' c' n (x' (l - n))" + using Suc.prems by (intro Suc.IH [symmetric]) auto + also have "l - n = Suc (l - Suc n)" + using Suc.prems by simp + also have "x' \ = cfrac_nth c' n + 1 / x' (l - Suc n)" + by (subst x'_Suc) simp + also have "conv' c' n \ = conv' c' (Suc n) (x' (l - Suc n))" + by (simp add: conv'_Suc_right) + finally show ?case .. + qed simp_all + from this[of l] have conv'_x'_0: "conv' c' l (x' 0) = x' 0" + using k12 by (simp add: x'_def) + + have "cfrac_nth (cfrac_of_real (x' 0)) n = cfrac_nth c'' n" for n + proof (cases n) + case 0 + thus ?thesis by (simp add: x'_0 D'_def) + next + case (Suc n') + have "sqrt D \ \" + using red_assoc_begin(1) red_assoc_begin(2) by auto + hence "cfrac_nth (cfrac_of_real (real D' + sqrt (real D))) (Suc n') = + cfrac_nth (cfrac_of_real (sqrt (real D))) (Suc n')" + by (simp add: cfrac_tl_of_real frac_add_of_nat Ints_add_left_cancel flip: cfrac_nth_tl) + thus ?thesis using x'_nz[of 0] + by (simp add: x'_0 sqrt_cfrac Suc) + qed + + show "sqrt_cfrac_nth (l - n - 2) = sqrt_cfrac_nth n" if "n < l - 1" for n + proof - + have "D > 1" using nonsquare by (cases D) (auto intro!: Nat.gr0I) + hence "D' + sqrt D > 0 + 1" using D'_pos by (intro add_strict_mono) auto + hence "x' 0 > 1" by (auto simp: x'_0) + hence "cfrac_nth c' (Suc n) = cfrac_nth (cfrac_of_real (conv' c' l (x' 0))) (Suc n)" + using \n < l - 1\ using cfrac_of_real_conv' by auto + also have "\ = cfrac_nth (cfrac_of_real (x' 0)) (Suc n)" + by (subst conv'_x'_0) auto + also have "\ = cfrac_nth c'' (Suc n)" by fact + finally show "sqrt_cfrac_nth (l - n - 2) = sqrt_cfrac_nth n" + by simp + qed + + show "l > 0" "l \ D' * (D' + 1)" using k12 by simp_all + show "sqrt_remainder_surd n = sqrt_remainder_surd (n mod l)" + "sqrt_cfrac_nth n = sqrt_cfrac_nth (n mod l)" for n + using period[of n] period'[of n] by simp_all + show "sqrt_remainder_surd n \ sqrt_remainder_surd 0" if "n \ {0<.. 1" if "n < l - 1" for n + using that snd_f_gt_1[of n] by (simp add: f_def) + show "f (l - 1) = (D', 1)" and "sqrt_cfrac_nth (l - 1) = 2 * D'" + using last by (simp_all add: sqrt_cfrac_nth_def f_def) + show "sqrt_cfrac_nth k \ D'" if "k < l - 1" for k + using sqrt_cfrac_le[of k] that by simp + show "l' \ l" if "l' > 0" "\k. sqrt_cfrac_nth (k + l') = sqrt_cfrac_nth k" for l' + using k2_le[of l'] that by auto +qed + +theorem cfrac_sqrt_periodic: + "cfrac_nth (cfrac_of_real (sqrt D)) (Suc n) = + cfrac_nth (cfrac_of_real (sqrt D)) (Suc (n mod l))" + using sqrt_cfrac_periodic[of n] by (metis sqrt_cfrac) + +theorem cfrac_sqrt_le: "n \ {0<.. cfrac_nth (cfrac_of_real (sqrt D)) n \ D'" + using sqrt_cfrac_le[of "n - 1"] + by (metis Suc_less_eq Suc_pred add.right_neutral greaterThanLessThan_iff of_nat_mono + period_nonempty plus_1_eq_Suc sqrt_cfrac) + +theorem cfrac_sqrt_last: "cfrac_nth (cfrac_of_real (sqrt D)) l = 2 * D'" + using sqrt_cfrac_last by (metis One_nat_def Suc_pred period_nonempty sqrt_cfrac) + +theorem cfrac_sqrt_palindrome: + assumes "n \ {0<.. = sqrt_cfrac_nth (n - 1)" + using assms by (subst sqrt_cfrac_palindrome [symmetric]) auto + also have "\ = cfrac_nth (cfrac_of_real (sqrt D)) n" + using assms by (subst sqrt_cfrac) auto + finally show ?thesis . +qed + +lemma sqrt_cfrac_info_palindrome: + assumes "sqrt_cfrac_info D = (a, b, cs)" + shows "rev (butlast cs) = butlast cs" +proof (rule List.nth_equalityI; safe?) + fix i assume "i < length (rev (butlast cs))" + with period_nonempty have "Suc i < length cs" by simp + thus "rev (butlast cs) ! i = butlast cs ! i" + using assms cfrac_sqrt_palindrome[of "Suc i"] period_nonempty unfolding l_def + by (auto simp: sqrt_cfrac_info_def rev_nth algebra_simps Suc_diff_Suc simp del: cfrac.simps) +qed simp_all + +lemma sqrt_cfrac_info_last: + assumes "sqrt_cfrac_info D = (a, b, cs)" + shows "last cs = 2 * Discrete.sqrt D" +proof - + from assms show ?thesis using period_nonempty cfrac_sqrt_last + by (auto simp: sqrt_cfrac_info_def last_map l_def D'_def Discrete_sqrt_altdef) +qed + +text \ + The following lemmas allow us to compute the period of the expansion of the square root: +\ +lemma while_option_sqrt_cfrac: + defines "step' \ (\(as, pq). ((D' + fst pq) div snd pq # as, sqrt_remainder_step pq))" + defines "b \ (\(_, pq). snd pq \ 1)" + defines "initial \ ([] :: nat list, (D', D - D'\<^sup>2))" + shows "while_option b step' initial = + Some (rev (map sqrt_cfrac_nth [0..(as, pq). let n = length as + in n < l \ pq = sqrt_remainder_surd n \ as = rev (map sqrt_cfrac_nth [0.. :: "nat list \ (nat \ nat) \ nat" where "\ = (\(as, _). l - length as)" + have [simp]: "P initial" using period_nonempty + by (auto simp: initial_def P_def sqrt_remainder_surd_def) + have step': "P (step' s) \ Suc (length (fst s)) < l" if "P s" "b s" for s + proof (cases s) + case (fields as p q) + define n where "n = length as" + from that fields sqrt_remainder_surd_last have "Suc n \ l" + by (auto simp: b_def P_def Let_def n_def [symmetric]) + moreover from that fields sqrt_remainder_surd_last have "Suc n \ l" + by (auto simp: b_def P_def Let_def n_def [symmetric]) + ultimately have "Suc n < l" by auto + with that fields sqrt_remainder_surd_last show "P (step' s) \ Suc (length (fst s)) < l" + by (simp add: b_def P_def Let_def n_def step'_def sqrt_cfrac_nth_def + sqrt_remainder_surd_def case_prod_unfold) + qed + have [simp]: "length (fst (step' s)) = Suc (length (fst s))" for s + by (simp add: step'_def case_prod_unfold) + + have "\x. while_option b step' initial = Some x" + proof (rule measure_while_option_Some) + fix s assume *: "P s" "b s" + from step'[OF *] show "P (step' s) \ \ (step' s) < \ s" + by (auto simp: b_def \_def case_prod_unfold intro!: diff_less_mono2) + qed auto + then obtain x where x: "while_option b step' initial = Some x" .. + have "P x" by (rule while_option_rule[OF _ x]) (insert step', auto) + have "\b x" using while_option_stop[OF x] by auto + + obtain as p q where [simp]: "x = (as, (p, q))" by (cases x) + define n where "n = length as" + have [simp]: "q = 1" using \\b x\ by (auto simp: b_def) + have [simp]: "p = D'" using \P x\ + using red_assoc_denom_1[of p] by (auto simp: P_def Let_def) + have "n < l" "sqrt_remainder_surd (length as) = (D', Suc 0)" + and as: "as = rev (map sqrt_cfrac_nth [0..P x\ + by (auto simp: P_def Let_def n_def) + hence "\(n < l - 1)" + using snd_sqrt_remainder_surd_gt_1[of n] by (intro notI) auto + with \n < l\ have [simp]: "n = l - 1" by auto + show ?thesis by (simp add: as x) +qed + +lemma while_option_sqrt_cfrac_info: + defines "step' \ (\(as, pq). ((D' + fst pq) div snd pq # as, sqrt_remainder_step pq))" + defines "b \ (\(_, pq). snd pq \ 1)" + defines "initial \ ([], (D', D - D'\<^sup>2))" + shows "sqrt_cfrac_info D = + (case while_option b step' initial of + Some (as, _) \ (Suc (length as), D', rev ((2 * D') # as)))" +proof - + have "nat (cfrac_nth (cfrac_of_real (sqrt (real D))) (Suc k)) = sqrt_cfrac_nth k" for k + by (metis nat_int sqrt_cfrac) + thus ?thesis unfolding assms while_option_sqrt_cfrac + using period_nonempty sqrt_cfrac_last + by (cases l) (auto simp: sqrt_cfrac_info_def D'_def l_def Discrete_sqrt_altdef) +qed + +end +end + +lemma sqrt_nat_period_length_le: "sqrt_nat_period_length D \ nat \sqrt D\ * (nat \sqrt D\ + 1)" + by (cases "is_square D") (use period_length_le_aux[of D] in auto) + +lemma sqrt_nat_period_length_0_iff [simp]: + "sqrt_nat_period_length D = 0 \ is_square D" + using period_nonempty[of D] by (cases "is_square D") auto + +lemma sqrt_nat_period_length_pos_iff [simp]: + "sqrt_nat_period_length D > 0 \ \is_square D" + using period_nonempty[of D] by (cases "is_square D") auto + +lemma sqrt_cfrac_info_code [code]: + "sqrt_cfrac_info D = + (let D' = Discrete.sqrt D + in if D'\<^sup>2 = D then (0, D', []) + else + case while_option + (\(_, pq). snd pq \ 1) + (\(as, (p, q)). let X = (p + D') div q; p' = X * q - p + in (X # as, p', (D - p'\<^sup>2) div q)) + ([], D', D - D'\<^sup>2) + of Some (as, _) \ (Suc (length as), D', rev ((2 * D') # as)))" +proof - + define D' where "D' = Discrete.sqrt D" + show ?thesis + proof (cases "is_square D") + case True + hence "D' ^ 2 = D" by (auto simp: D'_def elim!: is_nth_powerE) + thus ?thesis using True + by (simp add: D'_def Let_def sqrt_cfrac_info_def sqrt_nat_period_length_def) + next + case False + hence "D' ^ 2 \ D" by (subst eq_commute) auto + thus ?thesis using while_option_sqrt_cfrac_info[OF False] + by (simp add: sqrt_cfrac_info_def D'_def Let_def + case_prod_unfold Discrete_sqrt_altdef add_ac sqrt_remainder_step_def) + qed +qed + +lemma sqrt_nat_period_length_code [code]: + "sqrt_nat_period_length D = fst (sqrt_cfrac_info D)" + by (simp add: sqrt_cfrac_info_def) + +text \ + For efficiency reasons, it is often better to use an array instead of a list: +\ +definition sqrt_cfrac_info_array where + "sqrt_cfrac_info_array D = (case sqrt_cfrac_info D of (a, b, c) \ (a, b, IArray c))" + +lemma fst_sqrt_cfrac_info_array [simp]: "fst (sqrt_cfrac_info_array D) = sqrt_nat_period_length D" + by (simp add: sqrt_cfrac_info_array_def sqrt_cfrac_info_def) + +lemma snd_sqrt_cfrac_info_array [simp]: "fst (snd (sqrt_cfrac_info_array D)) = Discrete.sqrt D" + by (simp add: sqrt_cfrac_info_array_def sqrt_cfrac_info_def) + + +definition cfrac_sqrt_nth :: "nat \ nat \ nat iarray \ nat \ nat" where + "cfrac_sqrt_nth info n = + (case info of (l, a0, as) \ if n = 0 then a0 else as !! ((n - 1) mod l))" + +lemma cfrac_sqrt_nth: + assumes "\is_square D" + shows "cfrac_nth (cfrac_of_real (sqrt D)) n = + int (cfrac_sqrt_nth (sqrt_cfrac_info_array D) n)" (is "?lhs = ?rhs") +proof (cases n) + case (Suc n') + define l where "l = sqrt_nat_period_length D" + from period_nonempty[OF assms] have "l > 0" by (simp add: l_def) + have "cfrac_nth (cfrac_of_real (sqrt D)) (Suc n') = + cfrac_nth (cfrac_of_real (sqrt D)) (Suc (n' mod l))" unfolding l_def + using cfrac_sqrt_periodic[OF assms, of n'] by simp + also have "\ = map (\n. nat (cfrac_nth (cfrac_of_real (sqrt D)) (Suc n))) [0..l > 0\ by (subst nth_map) auto + finally show ?thesis using Suc + by (simp add: sqrt_cfrac_info_array_def sqrt_cfrac_info_def l_def cfrac_sqrt_nth_def) +qed (simp_all add: sqrt_cfrac_info_def sqrt_cfrac_info_array_def + Discrete_sqrt_altdef cfrac_sqrt_nth_def) + +lemma sqrt_cfrac_code [code]: + "sqrt_cfrac D = + (let info = sqrt_cfrac_info_array D; + (l, a0, _) = info + in if l = 0 then cfrac_of_int (int a0) else cfrac (cfrac_sqrt_nth info))" +proof (cases "is_square D") + case True + hence "sqrt (real D) = of_int (Discrete.sqrt D)" + by (auto elim!: is_nth_powerE) + thus ?thesis using True + by (auto simp: Let_def sqrt_cfrac_info_array_def sqrt_cfrac_info_def sqrt_cfrac_def) +next + case False + have "cfrac_sqrt_nth (sqrt_cfrac_info_array D) n > 0" if "n > 0" for n + proof - + have "int (cfrac_sqrt_nth (sqrt_cfrac_info_array D) n) > 0" + using False that by (subst cfrac_sqrt_nth [symmetric]) auto + thus ?thesis by simp + qed + moreover have "sqrt D \ \" + using False irrat_sqrt_nonsquare by blast + ultimately have "sqrt_cfrac D = cfrac (cfrac_sqrt_nth (sqrt_cfrac_info_array D))" + using cfrac_sqrt_nth[OF False] + by (intro cfrac_eqI) (auto simp: sqrt_cfrac_def is_cfrac_def) + thus ?thesis + using False by (simp add: Let_def sqrt_cfrac_info_array_def sqrt_cfrac_info_def) +qed + +text \ + As a test, we determine the continued fraction expansion of $\sqrt{129}$, which is + $[11; \overline{2, 1, 3, 1, 6, 1, 3, 1, 2, 22}]$ (a period length of 10): +\ +value "let info = sqrt_cfrac_info_array 129 in info" +value "sqrt_nat_period_length 129" + +text \ + We can also compute convergents of $\sqrt{129}$ and observe that the difference between + the square of the convergents and 129 vanishes quickly:: +\ +value "map (conv (sqrt_cfrac 129)) [0..<10]" +value "map (\n. \conv (sqrt_cfrac 129) n ^ 2 - 129\) [0..<20]" + +end \ No newline at end of file diff --git a/thys/Continued_Fractions/approximation_cfrac.ML b/thys/Continued_Fractions/approximation_cfrac.ML new file mode 100644 --- /dev/null +++ b/thys/Continued_Fractions/approximation_cfrac.ML @@ -0,0 +1,80 @@ +val _ = \ \Trusting the oracle \@{oracle_name "holds_by_evaluation"} +signature CFRAC_APPROXIMATION_COMPUTATION = sig +val approx_cfrac: Proof.context -> term -> term +end + +structure Cfrac_Approximation_Computation : CFRAC_APPROXIMATION_COMPUTATION = struct + + + + val mk_int = HOLogic.mk_number \<^typ>\int\ o @{code integer_of_int}; + + val term_of_int_list = map mk_int #> HOLogic.mk_list HOLogic.intT + + val approx_cfrac = @{computation "int list" + terms: "0 :: nat" "1 :: nat" "2 :: nat" "3 :: nat" Suc + "(+)::nat\nat\nat" "(-)::nat\nat\nat" "(*)::nat\nat\nat" + "0 :: int" "1 :: int" "2 :: int" "3 :: int" "-1 :: int" + "(+)::int\int\int" "(-)::int\int\int" "(*)::int\int\int" "uminus::int\int" + approx_cfrac + datatypes: int integer "int list" num floatarith float} + (fn _ => fn x => case x of SOME lst => term_of_int_list lst + | NONE => error "Computation approx_cfrac failed.") + +end + + +signature CFRAC_APPROXIMATION = sig + val approx_cfrac : int -> Proof.context -> term -> term +end + + +structure Cfrac_Approximation : CFRAC_APPROXIMATION = struct + +local +open Approximation + +fun mk_approx_cfrac prec t = + \<^const>\approx_cfrac\ $ (HOLogic.mk_number HOLogic.natT prec) $ t + +in + +fun approx_cfrac prec ctxt t = + realify t + |> Thm.cterm_of ctxt + |> (preproc_form_conv ctxt then_conv reify_form_conv ctxt) + |> Thm.prop_of + |> Logic.dest_equals |> snd + |> dest_interpret |> fst + |> mk_approx_cfrac prec + |> Cfrac_Approximation_Computation.approx_cfrac ctxt +end + +fun approximate_cfrac_cmd prec modes raw_t state = + let + val ctxt = Toplevel.context_of state; + val t = + raw_t + |> Syntax.parse_term ctxt + |> Type.constraint \<^typ>\real\ + |> Syntax.check_term ctxt; + val t' = approx_cfrac prec ctxt t; + val ty' = Term.type_of t'; + val ctxt' = Proof_Context.augment t' ctxt; + in + Print_Mode.with_modes modes (fn () => + Pretty.block [Pretty.quote (Syntax.pretty_term ctxt' t'), Pretty.fbrk, + Pretty.str "::", Pretty.brk 1, Pretty.quote (Syntax.pretty_typ ctxt' ty')]) () + end |> Pretty.writeln; + +val opt_modes = + Scan.optional (Args.$$$ "prec" |-- Args.colon |-- Parse.nat) 100 -- + Scan.optional (\<^keyword>\(\ |-- Parse.!!! (Scan.repeat1 Parse.name --| \<^keyword>\)\)) []; + +val _ = + Outer_Syntax.command \<^command_keyword>\approximate_cfrac\ + "print initial fragment of continued fraction of a real number by approximation" + (opt_modes -- Parse.term + >> (fn ((prec, modes), t) => Toplevel.keep (approximate_cfrac_cmd prec modes t))); + +end \ No newline at end of file diff --git a/thys/Continued_Fractions/document/root.bib b/thys/Continued_Fractions/document/root.bib new file mode 100644 --- /dev/null +++ b/thys/Continued_Fractions/document/root.bib @@ -0,0 +1,14 @@ +@misc {proofwiki, + author="{Proof Wiki}", + url="https://proofwiki.org/wiki/Continued_Fraction_Expansion_of_Euler%27s_Number" +} + +@book{khinchin, + title={Continued Fractions}, + author={Khinchin, A.I.A. and Eagle, H.}, + isbn={9780486696300}, + lccn={97008056}, + series={Dover books on mathematics}, + year={1997}, + publisher={Dover Publications} +} \ No newline at end of file diff --git a/thys/Continued_Fractions/document/root.tex b/thys/Continued_Fractions/document/root.tex new file mode 100644 --- /dev/null +++ b/thys/Continued_Fractions/document/root.tex @@ -0,0 +1,54 @@ +\documentclass[11pt,a4paper]{article} +\usepackage{isabelle,isabellesym} +\usepackage{amsfonts, amsmath, amssymb} + +% this should be the last package used +\usepackage{pdfsetup} + +% urls in roman style, theory text in math-similar italics +\urlstyle{rm} +\isabellestyle{it} + + +\begin{document} + +\title{Continued Fractions} +\author{Manuel Eberl} +\maketitle + +\begin{abstract} +This article provides a formalisation of continued fractions of real numbers and their basic properties. +It also contains a proof of the classic result that the irrational numbers with periodic continued + fraction expansions are precisely the quadratic irrationals, i.\,e.\ real numbers that fulfil a non-trivial quadratic equation $a x^2 + b x + c = 0$ with integer coefficients. + +Particular attention is given to the continued fraction expansion of $\sqrt{D}$ for a non-square + natural number $D$. Basic results about the length and structure of its period are provided, + along with an executable algorithm to compute the period (and from it, the entire expansion). + +This is then also used to provide a fairly efficient, executable, and fully formalised algorithm to +compute solutions to Pell's equation $x^2 - D y^2 = 1$. The performance is sufficiently good to +find the solution to Archimedes's cattle problem in less than a second on a typical computer. +This involves the value $D = 410286423278424$, for which the solution has over 200000 decimals. + +Lastly, a derivation of the continued fraction expansions of Euler's number $e$ and an executable +function to compute continued fraction expansions using interval arithmetic is also provided. +\end{abstract} + +\newpage +\tableofcontents +\newpage +\parindent 0pt\parskip 0.5ex + +\input{session} + +\nocite{khinchin} + +\bibliographystyle{abbrv} +\bibliography{root} + +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: t +%%% End: diff --git a/thys/Go/Go_Setup.thy b/thys/Go/Go_Setup.thy new file mode 100644 --- /dev/null +++ b/thys/Go/Go_Setup.thy @@ -0,0 +1,149 @@ +theory Go_Setup + imports "Main" +begin + +ML_file \code_go.ML\ + +code_identifier + code_module Code_Target_Nat \ (Go) Arith +| code_module Code_Target_Int \ (Go) Arith +| code_module Code_Numeral \ (Go) Arith + +code_printing + constant Code.abort \ + (Go) "panic( _ )" + +(* Bools *) +code_printing + type_constructor bool \ (Go) "bool" +| constant "False::bool" \ (Go) "false" +| constant "True::bool" \ (Go) "true" + +code_printing + constant HOL.Not \ (Go) "'! _" +| constant HOL.conj \ (Go) infixl 1 "&&" +| constant HOL.disj \ (Go) infixl 0 "||" +| constant HOL.implies \ (Go) "!('!((_)) || (_))" +| constant "HOL.equal :: bool \ bool \ bool" \ (Go) infix 4 "==" + + +(* Strings *) + +(* definitions to make these functions available *) +definition "go_private_map_list" where + "go_private_map_list f a = map f a" +definition "go_private_fold_list" where + "go_private_fold_list f a b = fold f a b" + + +code_printing + type_constructor String.literal \ (Go) "string" +| constant "STR ''''" \ (Go) "\"\"" +| constant "Groups.plus_class.plus :: String.literal \ _ \ _" \ + (Go) infix 6 "+" +| constant "HOL.equal :: String.literal \ String.literal \ bool" \ + (Go) infix 4 "==" +| constant "(\) :: String.literal \ String.literal \ bool" \ + (Go) infix 4 "<=" +| constant "(<) :: String.literal \ String.literal \ bool" \ + (Go) infix 4 "<" + +setup \ + fold Literal.add_code ["Go"] +\ + + +(* Integers via big/math *) +code_printing + code_module "Bigint" \ (Go) \ +package Bigint + +import "math/big" + +type Int = big.Int; + +func MkInt(s string) Int { + var i Int; + _, e := i.SetString(s, 10); + if (e) { + return i; + } else { + panic("invalid integer literal") + } +} + +func Uminus(a Int) Int { + var b Int + b.Neg(&a) + return b +} + +func Minus(a, b Int) Int { + var c Int + c.Sub(&a, &b) + return c +} + +func Plus(a, b Int) Int { + var c Int + c.Add(&a, &b) + return c +} + +func Times (a, b Int) Int { + var c Int + c.Mul(&a, &b) + return c +} + +func Divmod_abs(a, b Int) (Int, Int) { + var div, mod Int + div.DivMod(&a, &b, &mod) + div.Abs(&div) + return div, mod +} + +func Equal(a, b Int) bool { + return a.Cmp(&b) == 0 +} + +func Less_eq(a, b Int) bool { + return a.Cmp(&b) != 1 +} + +func Less(a, b Int) bool { + return a.Cmp(&b) == -1 +} + +func Abs(a Int) Int { + var b Int + b.Abs(&a) + return b +} +\ for constant "uminus :: integer \ _" "minus :: integer \ _" "Code_Numeral.dup" "Code_Numeral.sub" + "(*) :: integer \ _" "(+) :: integer \ _" "Code_Numeral.divmod_abs" "HOL.equal :: integer \ _" + "less_eq :: integer \ _" "less :: integer \ _" "abs :: integer \ _" + "String.literal_of_asciis" "String.asciis_of_literal" + | type_constructor "integer" \ (Go) "Bigint.Int" + | constant "uminus :: integer \ integer" \ (Go) "Bigint.Uminus( _ )" + | constant "minus :: integer \ integer \ integer" \ (Go) "Bigint.Minus( _, _)" + | constant "Code_Numeral.dup" \ (Go) "!(Bigint.MkInt(\"2\") * _)" + | constant "Code_Numeral.sub" \ (Go) "panic(\"sub\")" + | constant "(+) :: integer \ _ " \ (Go) "Bigint.Plus( _, _)" + | constant "(*) :: integer \ _ \ _ " \ (Go) "Bigint.Times( _, _)" + | constant Code_Numeral.divmod_abs \ + (Go) "func () Prod[Bigint.Int, Bigint.Int] { a, b := Bigint.Divmod'_abs( _, _); return Prod[Bigint.Int, Bigint.Int]{a, b}; }()" + | constant "HOL.equal :: integer \ _" \ (Go) "Bigint.Equal( _, _)" + | constant "less_eq :: integer \ integer \ bool " \ (Go) "Bigint.Less'_eq( _, _)" + | constant "less :: integer \ _ " \ (Go) "Bigint.Less( _, _)" + | constant "abs :: integer \ _" \ (Go) "Bigint.Abs( _ )" + + +code_printing + constant "0::integer" \ (Go) "Bigint.MkInt(\"0\")" +setup \ +Numeral.add_code \<^const_name>\Code_Numeral.Pos\ I Code_Printer.literal_numeral "Go" +#> Numeral.add_code \<^const_name>\Code_Numeral.Neg\ (~) Code_Printer.literal_numeral "Go" +\ + +end \ No newline at end of file diff --git a/thys/Go/ROOT b/thys/Go/ROOT new file mode 100644 --- /dev/null +++ b/thys/Go/ROOT @@ -0,0 +1,32 @@ +chapter AFP + +session Go = HOL + + description "A Go frontend for the code generator." + options [timeout = 300] + theories + Go_Setup + document_files + "root.tex" + +session Go_Test_Quick in "test/quick" = Go + + description "Quick test session with BigInts and RBTs" + options [timeout = 300] + sessions + "HOL-Data_Structures" + theories [document = false] + RBT_Test + export_files [3] + "*:code/export1/**" + +session Go_Test_Slow in "test/slow" = "HOL-Library" + + description "Slow test session for (almost) the entire HOL-Library" + options [timeout = 1200] + sessions + Go + "HOL-Number_Theory" + "HOL-Data_Structures" + "HOL-Examples" + theories [document = false] + Candidates + Generate + Generate_Binary_Nat diff --git a/thys/Go/code_go.ML b/thys/Go/code_go.ML new file mode 100644 --- /dev/null +++ b/thys/Go/code_go.ML @@ -0,0 +1,752 @@ + +signature CODE_GO = +sig + val target: string +end; + +structure Code_Go : CODE_GO = +struct + +open Basic_Code_Symbol; +open Basic_Code_Thingol; +open Code_Printer; + +infixr 5 @@; +infixr 5 @|; + +val target = "Go"; + +fun map_terms_bottom_up f (t as IConst _) = f t + | map_terms_bottom_up f (t as IVar _) = f t + | map_terms_bottom_up f (t1 `$ t2) = f + (map_terms_bottom_up f t1 `$ map_terms_bottom_up f t2) + | map_terms_bottom_up f ((v, ty) `|=> (t, rty)) = f + ((v, ty) `|=> (map_terms_bottom_up f t, rty)) + | map_terms_bottom_up f (ICase { term = t, typ = ty, clauses = clauses, primitive = t0 }) = f + (ICase { term = map_terms_bottom_up f t, typ = ty, + clauses = (map o apply2) (map_terms_bottom_up f) clauses, + primitive = map_terms_bottom_up f t0 }); + +fun range_of_head t = + case fst (Code_Thingol.unfold_app t) of + IConst {range, ...} => range + +val print_go_string = + let + fun unicode i = "\\u" ^ align_right "0" 4 (Int.fmt StringCvt.HEX i) + fun char "\"" = "\\\"" + | char "\\" = "\\\\" + | char c = + let val i = ord c + in if i < 32 orelse i > 126 + then unicode i + else if i >= 128 + then error "non-ASCII byte in Go string literal" + else c + end; + in quote o translate_string char end; + + +fun block_enclose (prt1, prt2) prts = (* Pretty.block_enclose (prt1, prt2) prts*) + Pretty.chunks [Pretty.block (Pretty.fbreaks ((Pretty.unbreakable prt1) :: prts)), Pretty.unbreakable prt2]; + +fun print_go_numeral num = "Bigint.MkInt(\"" ^ signed_string_of_int num ^ "\")"; + +val literals = Literals { + literal_string = print_go_string, + literal_numeral = print_go_numeral, + literal_list = enum "," "[" "]", + infix_cons = (6, "") (* TODO: this will go wrong if ever used *) +}; + + + +(* the subset of thingol we actually need for Go *) +datatype go_stmt = Fun of typscheme * ((iterm list * iterm) * (thm option * bool)) list + | Datatype of vname list * ((string * vname list) * itype list) list + | Class of (vname * ((class * class) list * (string * itype) list)) + | Datatypecons of string + | Instance of { class: string, tyco: string, vs: (vname * sort) list, + superinsts: (class * (itype * dict list) list) list, + inst_params: ((string * (const * int)) * (thm * bool)) list, + superinst_params: ((string * (const * int)) * (thm * bool)) list }; + +fun print_go_stmt gen_stringer undefineds infinite_types tyco_syntax const_syntax reserved + args_num is_sum_type is_class_param is_constr (deresolve, deresolve_full) = + let + fun lookup_tyvar tyvars = lookup_var tyvars; + fun intro_tyvars vs = intro_vars (map fst vs); + val deresolve_const = deresolve o Constant; + val deresolve_class = deresolve o Type_Class; + val deresolve_classrel = deresolve o Class_Relation; + val deresolve_inst = deresolve o Class_Instance; + val deresolve_tyco = deresolve o Type_Constructor; + val oneline = Pretty.unbreakable o semicolon; + val block = Pretty.unbreakable o Pretty.block; + val spaced = Pretty.unbreakable o concat; + + fun mk_dest_name name = Long_Name.map_base_name (fn s => s^"_dest") name + fun applify_constraints _ head [] = head + | applify_constraints tyvars head vs = let + val anys = (block o commas o map (str o lookup_tyvar tyvars)) vs + in block [head, str "[", anys, Pretty.brk 1, str "any", str "]"] end + + fun print_go_typ tyvars (tyco `%% tys) = (case tyco_syntax tyco of + NONE => apply_constraints tyvars ((str o deresolve_tyco) tyco) tys + | SOME (_, print) => print (K (print_go_typ tyvars)) NOBR tys) + | print_go_typ tyvars (ITyVar v) = (str o lookup_tyvar tyvars) v + and apply_constraints tyvars head vs = + gen_applify false "[" "]" (print_go_typ tyvars) NOBR head vs + + (* uncurried types of functions in type classes are special-cased here *) + fun print_go_typ_uncurried_toplevel tyvars (typ as "fun" `%% _) = let + val (args, rtyp) = Code_Thingol.unfold_fun typ + val head = applify "(" ")" (print_go_typ tyvars) NOBR (str "func") args; + in concat [head, print_go_typ tyvars rtyp] end + | print_go_typ_uncurried_toplevel tyvars typ = + block [str "func () ", print_go_typ tyvars typ] + + (* wrap a statement into an immediately called function to make it an expression *) + fun wrap_into_lambda tyvars typ body = + block_enclose + (concat [str "func ()", print_go_typ tyvars typ, str "{"], str "}()") body + fun wrap_in_return t = oneline [str "return", t] + fun wrap_if true = wrap_in_return + | wrap_if false = I + + fun print_func head body = block_enclose + (block [str "func ", head, str " {"], str "}") + [body]; + fun print_func_head tyvars vars const tvs extras params tys rty = let + val args = params ~~ tys + |> map (fn (param, ty) => let + val name = case param of + NONE => "_" | SOME n => lookup_var vars n; + in Pretty.block [str name, Pretty.brk 1, print_go_typ tyvars ty] end) + |> (curry op @ extras) + |> enum "," "(" ")" + val sym = case const of + SOME name => (str o deresolve) name + | NONE => str "" + val func_head = concat (applify_constraints tyvars sym tvs :: [args, rty]); + in func_head + end; + + (* a definition of a datatype *) + fun print_go_typedef tyco vs cos reserved = let + val [p,m] = Name.invent (snd reserved) "p" 2 + val ctxt = Name.declare p (Name.declare m (snd reserved)) + val tyargs = map ITyVar vs + val self = tyco `%% tyargs + val tyvars = intro_tyvars (map (rpair []) vs) reserved; + val allowed_infinite = List.exists (fn n => n = tyco) infinite_types + + fun print_constructor m type_name ((name,_), tys) = let + val named_fields = Name.invent_names ctxt "A" tys + val fields = named_fields + |> map (fn (name, arg) => oneline [str name, print_go_typ tyvars arg]) + val head = applify_constraints tyvars (str name) vs + val typ = apply_constraints tyvars (str name) tyargs + val elim_body = if type_name = NONE + then let + val case_branch = block + [str "return ", (Pretty.block o commas) (map (fn (field,_) => str (p^"."^field)) named_fields)] + in (*Pretty.chunks + [oneline [str ((if null named_fields then "_ = " else m^" := ")^p^".("), typ , str ")"] + ,*) case_branch end + else Pretty.block [oneline [str "return ", (Pretty.block o commas) (map (fn (field,_) => str (p^"."^field)) named_fields)]] + val elim_name = mk_dest_name (case type_name of + NONE => name + | SOME name' => name') + val eliminator = if null tys then str "" else print_func + (applify "(" ")" I NOBR (Pretty.block [applify_constraints tyvars (str elim_name) vs, str ("("^p^" "), typ, str ")"]) (map (print_go_typ tyvars o snd) named_fields)) + elim_body + val pretty = name ^ "(" ^ (fold (curry (op ^)) (map (K "%v") fields) "") ^ ")" + val constr = oneline [block_enclose (concat [str "type", head, str "struct {"], str "}") + fields] + in (constr, eliminator) end + in if not allowed_infinite andalso length cos = 1 then case cos of + [((name,_),tys)] => let + val name = deresolve_const name + val tname = deresolve_tyco tyco + val (constr, dest) = print_constructor m (SOME name) ((tname, []), tys) + in Pretty.chunks [constr, dest] end + else let + val (constrs, destrs) = cos + |> map (fn ((name,_),tys) => ((deresolve_const name, []),tys)) + |> map (print_constructor m NONE) + |> split_list + val names = map (fn ((name,_),_) => (str o deresolve_const) name) cos + val comment = block (str "// sum type which can be " :: Pretty.commas names) + val any = oneline [str "type", applify_constraints tyvars ((str o deresolve_tyco) tyco) vs, str "any"] + in Pretty.chunks (comment :: any :: constrs @ destrs) end + end; + + + fun print_classrels [] ps = Pretty.block ps + | print_classrels rels ps = let + val postfix = rels + |> map (fn (self, super) => (Long_Name.base_name o deresolve_classrel) (self, super)) + |> rev + |> String.concatWith "." + in block (ps @ [str ".", str postfix]) end + fun print_dict tyvars (Dict (classrels, x)) = + print_classrels classrels (print_plain_dict tyvars x) + and print_plain_dict tyvars (Dict_Const (inst, args)) = let + val needs_mono = true (* not (length args = 0)*) + val (typargs, dss) = split_list args + val wrap = if needs_mono + then fn head => apply_constraints tyvars head typargs + else I + in wrap ((str o deresolve_inst) inst) + :: (if needs_mono then [((enum "," "(" ")") o map (print_dict tyvars) o flat) dss] else []) end + | print_plain_dict tyvars (Dict_Var { var, index, length, ... }) = + [str (if length = 1 then var ^ "_" + else var ^ string_of_int (index + 1) ^ "_")] + + fun wrap_new_scope term = + block_enclose (str "{", str "};") [term] + + fun type_of_primitive_pattern t = + let + val destructor = case fst (Code_Thingol.unfold_app t) of + IConst const => const + val extras = drop (args_num (#sym destructor)) (#dom destructor) + in extras `--> (#range destructor) + end + + fun print_app_expr const_syntax tyvars some_thm vars + (app as ({ sym, dicts, dom, range, typargs, ... }, ts)) = let + val k = length dom + val l = args_num sym + in if length ts = k then + let + val is_constr = is_constr sym + val is_sum_type = is_sum_type sym + val is_class_param = is_class_param sym + val dict_args = map (print_dict tyvars) (flat dicts) + val typ = case snd (Code_Thingol.unfold_fun range) of + name `%% _ => name | ITyVar name => name + val allowed_infinite = List.exists (fn n => n = typ) infinite_types + andalso is_constr + val _ = if is_class_param andalso not (length dict_args = 1) + then warning "bug in print_app" else () + val applify' = if is_constr + then gen_applify true "{" "}" + else gen_applify true "(" ")" + val (immediate, curried) = chop l ts + val symbol = if is_constr + then (if is_sum_type orelse allowed_infinite then sym else Type_Constructor typ) + else sym + val func_name = if is_class_param + then Pretty.block [hd dict_args, str ".", (str o deresolve) symbol] + else (str o deresolve) symbol + fun wrap_type_args s = if is_sum_type orelse allowed_infinite + then applify "(" ")" I APP (apply_constraints tyvars ((str o deresolve_tyco) typ) typargs) [s] + else s + fun wrap_type_conversion name = + let + val typargs = if is_constr + (* these typargs are always the same set as the outer ones, but sometimes in different order *) + then case range of _ `%% typargs => typargs | _ => [] + else typargs + in if is_class_param then name + else apply_constraints tyvars name typargs + end + val immediate_args = immediate + |> map (print_go_expr const_syntax tyvars some_thm vars BR) + val invocation = (if is_class_param orelse is_constr then immediate_args else dict_args @ immediate_args) + |> applify' I APP (wrap_type_conversion func_name) + |> wrap_type_args + val curried_args = curried + |> map (enclose "(" ")" o single o print_go_expr const_syntax tyvars some_thm vars NOBR) + in invocation :: curried_args + end + else + [print_go_expr const_syntax tyvars some_thm vars BR (Code_Thingol.saturated_application k app)] + end + and print_clause _ _ _ _ [] _ = + raise Fail "there's a bug in the pattern-match translator" + | print_clause tyvars some_thm vars p ((target, pattern) :: subps) term = + let + fun print_condition vars conds (constr, typargs, range, args) p q target body = let + val destructor = (mk_dest_name o deresolve) constr + val (tyco, typargs) = case snd (Code_Thingol.unfold_fun range) of + a `%% typargs => (a, typargs) + val is_boxed = is_sum_type constr orelse List.exists (fn n => n = tyco) infinite_types + val names = map (fn (SOME n) => (str o lookup_var vars) n | NONE => str "_") args + val any_names = exists is_some args + val checks = conds + |> map (fn (var,const) => concat [ + str var, + str "==", + enclose "(" ")" [print_app false const_syntax tyvars some_thm vars NOBR (const, [])] + ]) + |> separate (str "&&") + |> concat + in Pretty.chunks + ((if is_boxed then [oneline [(block o commas) [str (if any_names then q else "_"), str p], str ":=", + applify ".(" ")" I NOBR (str target) [apply_constraints tyvars ((str o deresolve) constr) typargs]]] + else [oneline [str "_ =", str target]]) + @ [(if is_boxed then block_enclose (spaced [str "if", str p, str "{"], str "}") else Pretty.chunks) + ((if any_names then [oneline ((Pretty.block o commas) names :: [str ":=", applify "(" ")" str NOBR (str destructor) [if is_boxed then q else target]])] + else []) + @ [(if null conds then Pretty.chunks else (block_enclose ((spaced [str "if", checks, str "{"]), str "}"))) + [body]])]) + end + in case pattern + of IConst c => + let + val checks = concat + [str target, str "==", enclose "(" ")" [print_app false const_syntax tyvars some_thm vars NOBR (c, [])]] + val body = (if subps = [] + then print_go_term const_syntax tyvars some_thm vars NOBR term + else print_clause tyvars some_thm vars p subps term) + in block_enclose ((spaced [str "if", checks, str "{"]), str "}") + [body] + end + | _ `$ _ => (case Code_Thingol.unfold_const_app pattern of + NONE => raise Fail "bad application in pattern match" + | SOME (constr, args) => let + val ((arg_names, subpatterns, conds), vars') = + fold_rev (fn term => fn ((ts, rs, cs), vars) => case term of + IConst c => let + val [name] = Name.invent (snd vars) "c" 1 + in ((SOME name :: ts, rs,(name,c) :: cs), intro_vars [name] vars) end + | IVar NONE => ((NONE :: ts, rs, cs), vars) + | IVar (SOME v) => ((SOME v :: ts, rs, cs), intro_vars [v] vars) + | _ `$ _ => let + val [name] = Name.invent (snd vars) "p" 1 + in ((SOME name :: ts, (name, term) :: rs, cs), intro_vars [name] vars) end) + args (([],[],[]), vars) + val [q] = Name.invent (snd vars) "q" 1 + val vars = intro_vars [q] vars + val wrapper = print_condition vars' conds (#sym constr, #typargs constr, #range constr, arg_names) p q target + val subpatterns' = subpatterns @ subps + in wrapper (if subpatterns' = [] + then print_go_term const_syntax tyvars some_thm vars' NOBR term + else print_clause tyvars some_thm vars' p subpatterns' term) + end) + | IVar v => let + val vars' = intro_vars (the_list v) vars + val name_printed = case v of + NONE => str "_" | SOME name => (str o lookup_var vars') name + val binding = oneline [name_printed, str ":=", str target] + val usage = case v of + SOME _ => oneline [str "_ =", name_printed] + | NONE => str "" + val body = if subps = [] + then print_go_term const_syntax tyvars some_thm vars' NOBR term + else print_clause tyvars some_thm vars' p subps term + in + Pretty.chunks [binding, body] + end + | _ => raise Fail "bad term in pattern" + end + and print_pattern_match is_stmt tyvars some_thm vars rtyp target clauses = + let + val [target_var] = Name.invent (snd vars) "target" 1 + val vars = intro_vars [target_var] vars + val [p] = Name.invent (snd vars) "m" 1 + val vars = intro_vars [p] vars + val target = print_go_expr const_syntax tyvars some_thm vars NOBR target + val assignment = oneline [str target_var, str ":=", target] + val body = assignment + :: map (fn (pattern,term) => + wrap_new_scope (print_clause tyvars some_thm vars p [(target_var, pattern)] term)) + clauses @ [oneline [str "panic(\"match failed\")"]] + in if is_stmt + then Pretty.chunks body + else wrap_into_lambda tyvars rtyp body + end + and print_app is_stmt const_syntax tyvars some_thm vars fxy (app as (const, args)) = + if List.exists (fn name => #sym const = Constant name) undefineds then + args + (* the arguments may use otherwise-unused variables, so just print somewhere to make Go happy *) + |> map (print_go_expr const_syntax tyvars some_thm vars fxy) + |> map (fn p => oneline [ str "_ = ", p]) + |> curry (op @) [ str ("panic(\"encountered undefined function: \" + "^print_go_string (Code_Symbol.default_base (#sym const))^")") ] + |> Pretty.chunks + else wrap_if is_stmt (gen_print_app (print_app_expr const_syntax tyvars) + (print_go_expr const_syntax tyvars) const_syntax some_thm vars fxy app) + (* go has a distinction between expressions and statements which Thingol doesn't, so we just + periodically have to wrap things into a lambda & return *) + and print_go_term const_syntax tyvars some_thm vars fxy iterm = + print_go_term_gen true const_syntax tyvars some_thm vars fxy iterm + and print_go_expr const_syntax tyvars some_thm vars fxy t = + print_go_term_gen false const_syntax tyvars some_thm vars fxy t + and print_go_term_gen is_stmt const_syntax tyvars some_thm vars fxy t = case t of + IConst (const as {sym,...}) => let + in (print_app is_stmt const_syntax tyvars some_thm vars fxy (const, [])) end + | t1 `$ t2 => (case Code_Thingol.unfold_const_app t of + SOME app => + (print_app is_stmt const_syntax tyvars some_thm vars fxy app) + | _ => wrap_if is_stmt + (applify "(" ")" (print_go_expr const_syntax tyvars some_thm vars NOBR) fxy + (print_go_expr const_syntax tyvars some_thm vars BR t1) [t2])) + | IVar NONE => raise Fail "can't return a variable with no name!" + | IVar (SOME v) => wrap_if is_stmt (str (lookup_var vars v)) + | (params, tys) `|=> (t, rty) => let + (* horrible workaround, please fix me upstream *) + val rty = case t of + ICase c => type_of_primitive_pattern (#primitive c) + | _ => rty + val vars' = intro_vars (map_filter I [params]) vars; + val func_head = print_func_head tyvars vars' NONE [] [] [params] [tys] (print_go_typ tyvars rty) + val body = print_go_term const_syntax tyvars some_thm vars' fxy t + in wrap_if is_stmt (print_func func_head body) end + | ICase { clauses = [], ... } => let + val _ = warning "empty case statement; generating call to panic() ..."; + in str "panic(\"empty case\");" end + (* this is a let-binding, represented as a case *) + | ICase (cases as { clauses = [_], ...}) => + let + val (binds, body) = Code_Thingol.unfold_let (ICase cases); + val does_not_pattern_match = List.all (Code_Thingol.is_IVar o fst o fst) binds + in if does_not_pattern_match then + let + fun print_call t vars = + (print_go_expr const_syntax tyvars some_thm vars fxy t, vars); + fun print_bind tyvars some_thm fxy p = + gen_print_bind (print_go_expr const_syntax tyvars) some_thm fxy p + fun print_assignment ((pat, _), t) vars = vars + |> print_bind tyvars some_thm BR pat + |>> (fn p => (oneline [p, str ":=", + fst (print_call t vars)])) + fun print_left ((IVar NONE, _), t) = + print_call t (* evaluate and discard the result; go does not allow declaring to blank *) + | print_left ((pat as IVar (SOME _), ty), t) = + print_assignment ((pat, ty), t) + val (seps_ps, vars') = + fold_map print_left binds vars; + val term = print_go_term const_syntax tyvars some_thm vars' fxy body + in if is_stmt then Pretty.chunks (seps_ps @ [term]) + else wrap_into_lambda tyvars (type_of_primitive_pattern (#primitive cases)) (seps_ps @ [term]) + end + else + print_pattern_match is_stmt tyvars some_thm vars + (type_of_primitive_pattern (#primitive cases)) (#term cases) (#clauses cases) + end + | ICase cases => print_pattern_match is_stmt tyvars some_thm vars + (type_of_primitive_pattern (#primitive cases)) (#term cases) (#clauses cases); + + fun print_dict_args tyvars vs = + let + fun print_single_arg length v (index, class) = + let + val name = if length = 1 then v^"_" else v ^ string_of_int (index + 1) ^ "_" + val ty = apply_constraints tyvars ((str o deresolve_class) class) [ITyVar v] + in concat [str name, ty] end + fun print_single_dict (v, sort) = let + val args = map_index (print_single_arg (length sort) v) sort + in args end + in (flat (map print_single_dict vs)) + end; + + + fun print_go_func const_syntax reserved const vs ty [] = + let + val (tys, ty') = Code_Thingol.unfold_fun ty; + val params = Name.invent (snd reserved) "a" (length tys); + val tyvars = intro_tyvars vs reserved; + val vars = intro_vars params tyvars; + val dict_args = print_dict_args tyvars vs + val head = print_func_head tyvars vars ((SOME o Constant) const) (map fst vs) dict_args (map SOME params) tys (print_go_typ tyvars ty'); + val _ = warning ("you appear to have defined a function "^const^" with no body; generating a call to panic() ...") + in + print_func head (oneline [str ("panic("^print_go_string const^")")]) + end + | print_go_func const_syntax reserved const vs ty eqs = + let + val tycos = build (fold (fn ((ts, t), _) => + fold Code_Thingol.add_tyconames (t :: ts)) eqs); + val tyvars = reserved + |> intro_base_names + (is_none o tyco_syntax) deresolve_tyco tycos + |> intro_tyvars vs; + val simple = case eqs + of [((ts, _), _)] => forall Code_Thingol.is_IVar ts + | _ => false; + val vars1 = reserved + |> intro_tyvars vs + |> intro_base_names_for (is_none o const_syntax) + deresolve (map (snd o fst) eqs); + val params = if simple + then (map (fn IVar x => x) o fst o fst o hd) eqs + else map SOME (aux_params vars1 (map (fst o fst) eqs)); + val vars2 = intro_vars (map_filter I params) vars1; + val (tys', ty') = Code_Thingol.unfold_fun_n (length params) ty; + fun print_rhs is_stmt vars' ((_, t), (some_thm, _)) = + print_go_term_gen is_stmt const_syntax tyvars some_thm vars' NOBR t; + val [p] = Name.invent (snd vars2) "m" 1 + val vars3 = intro_vars [p] vars2 + fun print_fun_clause ((targets, t), (some_thm, _)) = + let + val used = Code_Thingol.add_varnames t [] + val vars' = + intro_vars (build (fold Code_Thingol.add_varnames targets)) vars2; + fun remove_unused (IVar (SOME name)) = IVar + (if member (op =) used name then SOME name else NONE) + | remove_unused t = t + val clauses = params ~~ targets + |> map (apsnd (map_terms_bottom_up remove_unused)) + |> filter (fn (_, IVar NONE) => false | _ => true) + |> map_filter (fn (NONE, _) => NONE | (SOME v, t) => SOME (v,t)) + val clause = print_clause tyvars some_thm vars' p clauses t + in + wrap_new_scope clause + end; + val dict_args = print_dict_args tyvars vs + val head = print_func_head tyvars vars3 ((SOME o Constant) const) (map fst vs) dict_args params tys' (print_go_typ tyvars ty'); + in (*if null params andalso null vs then + print_var ((str o deresolve_const) const) (print_rhs false vars2 (hd eqs)) + else*) + if simple then + print_func head (print_rhs true vars2 (hd eqs)) + else + print_func head (Pretty.chunks + (map print_fun_clause eqs @ [oneline [str "panic(\"match failed\")"]])) + end; + fun print_typeclass tyvars sym ((target, (super, params))) = + let + val tyvars = intro_vars [target] tyvars + val super_fields = super + |> map (fn (self, super) => block [ + (str o Long_Name.base_name o deresolve_classrel) (self, super), + Pretty.brk 1, + apply_constraints tyvars ((str o deresolve_class) super) [ITyVar target] + ]) + val fields = params + |> map (fn (name,typ) => block [ + (str o deresolve_const) name, Pretty.brk 1, + print_go_typ_uncurried_toplevel tyvars typ + ]) + |> (curry op @) super_fields + val head = applify_constraints tyvars ((str o deresolve_class) sym) [target] + in block_enclose (concat [str "type", head, str "struct {"], str "}") fields + end; + fun print_instance tyvars (target, class) {vs, inst_params, superinsts, tyco, ...} = + let + val class_name = deresolve_class class + val tyvars = intro_tyvars vs tyvars + val tyargs = map fst vs + val class_head = apply_constraints tyvars (str class_name) [tyco `%% (map ITyVar tyargs)] + val sym = Class_Instance (target, class) + val instance_name = deresolve_inst (target, class) + val superinsts_fields = superinsts + |> map (fn (super, dicts) => block [ + (str o Long_Name.base_name o deresolve_classrel) (class, super), + str ":", Pretty.brk 1, + print_dict tyvars (Dict ([], Dict_Const ((tyco, super), dicts))), str "," + ]) + fun print_classparam_instance ((classparam, (const as { dom, ... }, dom_length)), (thm, _)) = + let + val aux_dom = Name.invent_names (snd reserved) "A" dom; + val auxs = map fst aux_dom; + val vars = intro_vars auxs tyvars; + val (aux_dom1, aux_dom2) = chop dom_length aux_dom; + fun abstract_using [] _ _ body = body + | abstract_using aux_dom should_wrap rty body = let + val params = aux_dom + |> map (fn (aux, ty) => + block [(str o lookup_var vars) aux, Pretty.brk 1, print_go_typ tyvars ty]) + val head = print_func_head tyvars vars NONE [] params [] [] + ((if should_wrap then print_go_typ_uncurried_toplevel else print_go_typ) tyvars rty) + in print_func head (wrap_if should_wrap body) end; + val aux_abstract = if not (null aux_dom1) andalso not (null aux_dom2) + then abstract_using aux_dom1 true (map snd aux_dom2 `--> #range const) o abstract_using aux_dom2 false (#range const) + else abstract_using aux_dom1 false (#range const) o abstract_using aux_dom2 false (#range const) + val wrap_in_func = if null aux_dom1 andalso null aux_dom2 + then print_func (print_func_head tyvars vars NONE [] [] [] [] (print_go_typ tyvars (#range const))) else I + val wrap_aux = case (null aux_dom1, null aux_dom2) of + (true, true) => print_func (print_func_head tyvars vars NONE [] [] [] [] (print_go_typ tyvars (#range const))) + | (false, false) => abstract_using aux_dom1 true (map snd aux_dom2 `--> #range const) o abstract_using aux_dom2 false (#range const) + | _ => abstract_using aux_dom1 false (#range const) o abstract_using aux_dom2 false (#range const) + in block [ + (str o Long_Name.base_name o deresolve_const) classparam, + str ":", Pretty.brk 1, + (wrap_aux o wrap_in_return o print_app false const_syntax tyvars (SOME thm) vars NOBR) + (const, map (IVar o SOME) auxs), + str "," + ] end; + in let + val body = block_enclose (concat [str "return", class_head, str "{"],str "}") + (superinsts_fields + @ map print_classparam_instance inst_params) + val head = print_func_head tyvars reserved (SOME sym) tyargs (print_dict_args tyvars vs) + [] [] class_head + in print_func head body end + end; + fun print_stmt (Constant const, (_, Fun ((vs, ty), raw_eqs))) = + print_go_func const_syntax reserved const vs ty (filter (snd o snd) raw_eqs) + | print_stmt (Type_Constructor tyco, (_, Datatype (vs, cos))) = + print_go_typedef tyco vs cos reserved + | print_stmt (Type_Class sym, (_, Class class)) = + print_typeclass reserved sym class + | print_stmt (Class_Instance sym, (_, Instance instance)) = + print_instance reserved sym instance + | print_stmt (_, _) = str "" (*raise Fail "whatever this is, it's not yet supported";*) + in print_stmt + end; + + + +fun variant_capitalize s ctxt = + let + val cs = Symbol.explode s; + val s_lower = case cs of + c :: cs => Symbol.to_ascii_upper c :: cs + in ctxt + |> Name.variant (implode s_lower) + end; + +fun go_program_of_program ctxt module_name reserved identifiers exports program = + let + val variant = variant_capitalize + fun namify_module name_fragment ((nsp_class, nsp_object), nsp_common) = + let + val declare = Name.declare name_fragment; + in (name_fragment, ((declare nsp_class, declare nsp_object), declare nsp_common)) end; + fun namify_common base ((nsp_class, nsp_object), nsp_common) = + let + val (base', nsp_common') = variant base nsp_common + in + (base', ((Name.declare base' nsp_class, Name.declare base' nsp_object), nsp_common')) + end; + fun namify_stmt (Code_Thingol.Fun _) = namify_common + | namify_stmt (Code_Thingol.Datatype _) = namify_common + | namify_stmt (Code_Thingol.Datatypecons _) = namify_common + | namify_stmt (Code_Thingol.Class _) = namify_common + | namify_stmt (Code_Thingol.Classrel _) = namify_common + | namify_stmt (Code_Thingol.Classparam _) = namify_common + | namify_stmt (Code_Thingol.Classinst _) = namify_common; + + fun modify_stmt (_, (_, Code_Thingol.Fun (_, SOME _))) = NONE + | modify_stmt (_, (export, Code_Thingol.Fun (x, _))) = SOME (export, Fun x) + | modify_stmt (_, (export, Code_Thingol.Datatype x)) = SOME (export, Datatype x) + | modify_stmt (_, (_, Code_Thingol.Datatypecons _)) = NONE + | modify_stmt (Type_Class class, (export, Code_Thingol.Class x)) = + SOME (export, Class x) + | modify_stmt (_, (_, Code_Thingol.Classrel x)) = NONE + | modify_stmt (_, (_, Code_Thingol.Classparam x)) = NONE + | modify_stmt (_, (export, Code_Thingol.Classinst inst)) = + SOME (export, Instance inst); + in + Code_Namespace.hierarchical_program ctxt + { module_name = module_name, reserved = reserved, identifiers = identifiers, + empty_nsp = ((reserved, reserved), reserved), namify_module = namify_module, + namify_stmt = namify_stmt, cyclic_modules = false, + class_transitive = true, class_relation_public = true, empty_data = (), + memorize_data = K I, modify_stmts = map modify_stmt } + exports program + end; + + + + +fun serialize_go gen_stringer go_module undefineds infinite_types ctxt { module_name, reserved_syms, + identifiers, includes, class_syntax, tyco_syntax, const_syntax } program exports = + let + (* build program *) + val { deresolver, hierarchical_program = go_program } = + go_program_of_program ctxt module_name (Name.make_context reserved_syms) + identifiers exports program; + + val go_module = if go_module = "" then "isabelle/exported" else go_module; + + (* helper functions that need access to the entire program *) + fun lookup_constr tyco constr = case Code_Symbol.Graph.get_node program (Type_Constructor tyco) + of Code_Thingol.Datatype (_, constrs) => + (AList.lookup (op = o apsnd fst) constrs constr) + | _ => NONE; + fun is_sum_type sym = case Code_Symbol.Graph.get_node program sym of + Code_Thingol.Datatypecons tyco => (case Code_Symbol.Graph.get_node program (Type_Constructor tyco) + of Code_Thingol.Datatype (_, []) => false + | Code_Thingol.Datatype (_, [_]) => false + | Code_Thingol.Datatype _ => true + | _ => false) + | _ => false; + + fun is_class_param (sym as Constant const) = case Code_Symbol.Graph.get_node program sym + of Code_Thingol.Classparam _ => true + | _ => false + fun classparams_of_class class = case Code_Symbol.Graph.get_node program (Type_Class class) + of Code_Thingol.Class (_, (_, classparams)) => classparams; + fun args_num (sym as Constant const) = case Code_Symbol.Graph.get_node program sym + of Code_Thingol.Fun (((_, ty), []), _) => + (length o fst o Code_Thingol.unfold_fun) ty + | Code_Thingol.Fun ((_, ((ts, _), _) :: _), _) => length ts + | Code_Thingol.Datatypecons tyco => length (the (lookup_constr tyco const)) + | Code_Thingol.Classparam class => + (length o fst o Code_Thingol.unfold_fun o the o AList.lookup (op =) + (classparams_of_class class)) const; + (* print the go code *) + fun print_stmt prefix_fragments b = ("", print_go_stmt gen_stringer undefineds infinite_types + tyco_syntax const_syntax (make_vars reserved_syms) args_num is_sum_type is_class_param + (Code_Thingol.is_constr program) (deresolver prefix_fragments, deresolver) b); + + fun get_imports module_name = Module module_name + |> Code_Symbol.Graph.immediate_succs go_program + |> map (fn (Module a) => a) + |> (curry op @) (map fst includes) + |> map (fn (a) => go_module ^ "/" ^ a) + + (* print modules *) + fun print_module _ base _ ps = (base, Pretty.chunks2 + (str ("package " ^ base) + :: block_enclose (str "import (", str ")") + (map (str o print_go_string) (get_imports base)) + :: (map snd ps) )) + + + (* serialization *) + val p = Code_Namespace.print_hierarchical { + print_module = print_module, print_stmt = print_stmt, + lift_markup = K I } go_program + |> curry (op @) includes + |> map (apfst (fn a => [a, "exported.go"])) + + val is_single_module = length p = 1 + in ( + if is_single_module + then Code_Target.Singleton ("go", snd (hd p)) + else Code_Target.Hierarchy ((["go.mod"], Pretty.chunks2 [ + concat [str "module",(str o print_go_string) go_module], + str "go 1.18" + ]) :: p), + try (deresolver []) + ) end; + + +val serializer : Code_Target.serializer = + Code_Target.parse_args ((Scan.optional (Args.$$$ "go_module" |-- Args.name) "" + -- Scan.optional (Args.$$$ "gen_stringer" >> K true) false + -- Scan.optional (Args.$$$ "panic_on" |-- (Scan.repeat Parse.term)) [] + -- Scan.optional (Args.$$$ "infinite_type" |-- (Scan.repeat Parse.term)) []) + >> (fn (((go_module, gen_stringer), undef_terms), infinite_types) => fn lthy => let + val undefineds = map (fst o dest_Const o Syntax.read_term lthy) undef_terms + val infinite_types = map (fst o dest_Type o Syntax.parse_typ lthy) infinite_types + in serialize_go gen_stringer go_module undefineds infinite_types lthy end)) + + +val _ = Theory.setup + (Code_Target.add_language + (target, { serializer = serializer, literals = literals, + check = { env_var = "ISABELLE_GO", + make_destination = fn p => p + Path.explode "export.go", + make_command = fn p => "test -d export.go && cd export.go && $ISABELLE_GO build ./"^p^" || $ISABELLE_GO build ./export.go"}, + evaluation_args = []}) + #> Code_Target.set_printings (Type_Constructor ("fun", + [(target, SOME (2, fn print_go_typ => fn fxy => fn [arg, rtyp] => let + val head = applify "(" ")" (print_go_typ fxy) NOBR (str "func") [arg]; + in concat [head, print_go_typ fxy rtyp] end) + )])) + #> fold (Code_Target.add_reserved target) [ + "any", "break", "default", "func", "interface", "select", "case", "defer", + "go", "map", "struct", "chan", "else", "goto", "package", "switch", + "const", "fallthrough", "if", "range", "type", "continue", "for", + "import", "return", "var" + ]); + + +end; (*struct*) diff --git a/thys/Go/document/root.tex b/thys/Go/document/root.tex new file mode 100644 --- /dev/null +++ b/thys/Go/document/root.tex @@ -0,0 +1,24 @@ +\documentclass[11pt,a4paper]{report} +\usepackage[T1]{fontenc} +\usepackage{isabelle,isabellesym} +\usepackage{pdfsetup} +\urlstyle{rm} +\isabellestyle{it} + +\begin{document} + +\title{Go Code Generation for Isabelle} +\author{Terru Stübinger, Lars Hupel} +\maketitle + +\begin{abstract} + This entry contains a standalone code generation target for the Go programming language. + Unlike the previous targets, Go is not a functional language and encourages code in an imperative style, thus many of the features of Isabelle's language (particularly data types, pattern matching, and type classes) have to be emulated using imperative language constructs in Go. + To generate Go code, users can simply import this entry, which makes the Go target available. +\end{abstract} + +\parindent 0pt\parskip 0.5ex + +\input{session} + +\end{document} diff --git a/thys/Go/test/quick/RBT_Test.thy b/thys/Go/test/quick/RBT_Test.thy new file mode 100644 --- /dev/null +++ b/thys/Go/test/quick/RBT_Test.thy @@ -0,0 +1,26 @@ +theory RBT_Test imports + "HOL-Data_Structures.RBT_Set" + "Go.Go_Setup" +begin + + + +definition t1 :: "integer rbt" where + "t1 = fold insert [1,2,3,4,5] empty" + +fun tree_from_list :: "'a::linorder list \ 'a rbt" where + "tree_from_list xs = fold insert xs empty" + +fun delete_list :: "'a::linorder list \ 'a rbt \ 'a rbt" where + "delete_list xs a = fold del xs a" + +fun trees_equal :: "'a::equal rbt \ 'a rbt \ bool" where + "trees_equal a b = (a = b)" + +export_code delete_list tree_from_list join invc trees_equal t1 in Go + module_name RbtTest + + +export_code delete_list tree_from_list join invc trees_equal t1 checking Go? + +end diff --git a/thys/Go/test/quick/export/Bigint/exported.go b/thys/Go/test/quick/export/Bigint/exported.go new file mode 100644 --- /dev/null +++ b/thys/Go/test/quick/export/Bigint/exported.go @@ -0,0 +1,66 @@ + +package Bigint + +import "math/big" + +type Int = big.Int; + +func MkInt(s string) Int { + var i Int; + _, e := i.SetString(s, 10); + if (e) { + return i; + } else { + panic("invalid integer literal") + } +} + +func Uminus(a Int) Int { + var b Int + b.Neg(&a) + return b +} + +func Minus(a, b Int) Int { + var c Int + c.Sub(&a, &b) + return c +} + +func Plus(a, b Int) Int { + var c Int + c.Add(&a, &b) + return c +} + +func Times (a, b Int) Int { + var c Int + c.Mul(&a, &b) + return c +} + +func Divmod_abs(a, b Int) (Int, Int) { + var div, mod Int + div.DivMod(&a, &b, &mod) + div.Abs(&div) + return div, mod +} + +func Equal(a, b Int) bool { + return a.Cmp(&b) == 0 +} + +func Less_eq(a, b Int) bool { + return a.Cmp(&b) != 1 +} + +func Less(a, b Int) bool { + return a.Cmp(&b) == -1 +} + +func Abs(a Int) Int { + var b Int + b.Abs(&a) + return b +} + diff --git a/thys/Go/test/quick/export/RbtTest/exported.go b/thys/Go/test/quick/export/RbtTest/exported.go new file mode 100644 --- /dev/null +++ b/thys/Go/test/quick/export/RbtTest/exported.go @@ -0,0 +1,1404 @@ +package RbtTest + +import ( + "isabelle/exported/Bigint" +) + +// sum type which can be Red, Black +type Color any; +type Red struct { }; +type Black struct { }; + + + +func Equal_colora (x0 Color, x1 Color) bool { + { + if x0 == (Color(Red{})) { + if x1 == (Color(Black{})) { + return false; + } + } + }; + { + if x0 == (Color(Black{})) { + if x1 == (Color(Red{})) { + return false; + } + } + }; + { + if x0 == (Color(Black{})) { + if x1 == (Color(Black{})) { + return true; + } + } + }; + { + if x0 == (Color(Red{})) { + if x1 == (Color(Red{})) { + return true; + } + } + }; + panic("match failed"); +} + +type Equal[a any] struct { + Equala func(a, a) bool +} + +func Equal_color () Equal[Color] { + return Equal[Color] { + Equala: func (A Color, Aa Color) bool { return Equal_colora(A, Aa); }, + } +} + +type Prod[a, b any] struct { A a; Aa b; }; +func Pair_dest[a, b any](p Prod[a, b])(a, b) { + return p.A, p.Aa; +} + +func Eq[a any] (a_ Equal[a], aa a, b a) bool { + return a_.Equala(aa, b); +} + +func Equal_proda[a, b any] (a_ Equal[a], b_ Equal[b], x0 Prod[a, b], x1 Prod[a, b]) bool { + { + _ = x0; + x1b, x2a := Pair_dest(x0); + _ = x1; + y1a, y2a := Pair_dest(x1); + return Eq[a](a_, x1b, y1a) && Eq[b](b_, x2a, y2a); + }; + panic("match failed"); +} + +func Equal_prod[a, b any] (a_ Equal[a], b_ Equal[b]) Equal[Prod[a, b]] { + return Equal[Prod[a, b]] { + Equala: func (A Prod[a, b], Aa Prod[a, b]) bool { return Equal_proda[a, b](a_, b_, A, Aa); }, + } +} + +func Equal_integer () Equal[Bigint.Int] { + return Equal[Bigint.Int] { + Equala: func (A Bigint.Int, Aa Bigint.Int) bool { return Bigint.Equal( A, Aa); }, + } +} + +type Ord[a any] struct { + Less_eq func(a, a) bool + Less func(a, a) bool +} + +func Ord_integer () Ord[Bigint.Int] { + return Ord[Bigint.Int] { + Less_eq: func (A Bigint.Int, Aa Bigint.Int) bool { return Bigint.Less_eq( A, Aa); }, + Less: func (A Bigint.Int, Aa Bigint.Int) bool { return Bigint.Less( A, Aa); }, + } +} + +type Preorder[a any] struct { + Ord_preorder Ord[a] +} + +type Order[a any] struct { + Preorder_order Preorder[a] +} + +func Preorder_integer () Preorder[Bigint.Int] { + return Preorder[Bigint.Int] { + Ord_preorder: Ord_integer(), + } +} + +func Order_integer () Order[Bigint.Int] { + return Order[Bigint.Int] { + Preorder_order: Preorder_integer(), + } +} + +type Linorder[a any] struct { + Order_linorder Order[a] +} + +func Linorder_integer () Linorder[Bigint.Int] { + return Linorder[Bigint.Int] { + Order_linorder: Order_integer(), + } +} + +// sum type which can be One, Bit0, Bit1 +type Num any; +type One struct { }; +type Bit0 struct { A Num; }; +type Bit1 struct { A Num; }; + +func Bit0_dest(p Bit0)(Num) { + return p.A +} +func Bit1_dest(p Bit1)(Num) { + return p.A +} + +// sum type which can be Nil, Cons +type List[a any] any; +type Nil[a any] struct { }; +type Cons[a any] struct { A a; Aa List[a]; }; + +func Cons_dest[a any](p Cons[a])(a, List[a]) { + return p.A, p.Aa +} + +// sum type which can be Leaf, Node +type Tree[a any] any; +type Leaf[a any] struct { }; +type Node[a any] struct { A Tree[a]; Aa a; Ab Tree[a]; }; + +func Node_dest[a any](p Node[a])(Tree[a], a, Tree[a]) { + return p.A, p.Aa, p.Ab +} + +// sum type which can be LT, EQ, GT +type Cmp_val any; +type LT struct { }; +type EQ struct { }; +type GT struct { }; + + + + +func Cmp[a any] (a1_ Equal[a], a2_ Linorder[a], x a, y a) Cmp_val { + target := a2_.Order_linorder.Preorder_order.Ord_preorder.Less(x, y); + { + if target == (true) { + return Cmp_val(LT{}); + } + }; + { + if target == (false) { + targeu := Eq[a](a1_, x, y); + { + if targeu == (true) { + return Cmp_val(EQ{}); + } + }; + { + if targeu == (false) { + return Cmp_val(GT{}); + } + }; + panic("match failed"); + } + }; + panic("match failed"); +} + +func Paint[a any] (c Color, x1 Tree[Prod[a, Color]]) Tree[Prod[a, Color]] { + { + if x1 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}); + } + }; + { + cb := c; + q, m := x1.(Node[Prod[a, Color]]); + if m { + la, p, ra := Node_dest(q); + _ = p; + ab, _ := Pair_dest(p); + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{la, Prod[a, Color]{ab, cb}, ra}); + } + }; + panic("match failed"); +} + +func BaliR[a any] (t1 Tree[Prod[a, Color]], aa a, x2 Tree[Prod[a, Color]]) Tree[Prod[a, Color]] { + { + t1b := t1; + ac := aa; + q, m := x2.(Node[Prod[a, Color]]); + if m { + t2a, q, p := Node_dest(q); + _ = q; + ba, d := Pair_dest(q); + if d == (Color(Red{})) { + r, m := p.(Node[Prod[a, Color]]); + if m { + t3a, r, t4a := Node_dest(r); + _ = r; + ca, e := Pair_dest(r); + if e == (Color(Red{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1b, Prod[a, Color]{ac, Color(Black{})}, t2a}), Prod[a, Color]{ba, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{t3a, Prod[a, Color]{ca, Color(Black{})}, t4a})}); + } + } + } + } + }; + { + t1b := t1; + ac := aa; + q, m := x2.(Node[Prod[a, Color]]); + if m { + q, p, d := Node_dest(q); + if d == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + r, m := q.(Node[Prod[a, Color]]); + if m { + t2a, r, t3a := Node_dest(r); + _ = r; + ba, e := Pair_dest(r); + if e == (Color(Red{})) { + _ = p; + ca, f := Pair_dest(p); + if f == (Color(Red{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1b, Prod[a, Color]{ac, Color(Black{})}, t2a}), Prod[a, Color]{ba, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{t3a, Prod[a, Color]{ca, Color(Black{})}, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})})}); + } + } + } + } + } + }; + { + t1b := t1; + ac := aa; + q, m := x2.(Node[Prod[a, Color]]); + if m { + r, q, p := Node_dest(q); + s, m := r.(Node[Prod[a, Color]]); + if m { + t2a, s, t3a := Node_dest(s); + _ = s; + ba, d := Pair_dest(s); + if d == (Color(Red{})) { + _ = q; + ca, e := Pair_dest(q); + if e == (Color(Red{})) { + t, m := p.(Node[Prod[a, Color]]); + if m { + va, t, vba := Node_dest(t); + _ = t; + vca, f := Pair_dest(t); + if f == (Color(Black{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1b, Prod[a, Color]{ac, Color(Black{})}, t2a}), Prod[a, Color]{ba, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{t3a, Prod[a, Color]{ca, Color(Black{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Black{})}, vba})})}); + } + } + } + } + } + } + }; + { + t1b := t1; + ac := aa; + if x2 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1b, Prod[a, Color]{ac, Color(Black{})}, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})}); + } + }; + { + t1b := t1; + ac := aa; + q, m := x2.(Node[Prod[a, Color]]); + if m { + va, p, vba := Node_dest(q); + _ = p; + vca, c := Pair_dest(p); + if c == (Color(Black{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1b, Prod[a, Color]{ac, Color(Black{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Black{})}, vba})}); + } + } + }; + { + t1b := t1; + ac := aa; + q, m := x2.(Node[Prod[a, Color]]); + if m { + d, vaa, c := Node_dest(q); + if d == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) && c == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1b, Prod[a, Color]{ac, Color(Black{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), vaa, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})})}); + } + } + }; + { + t1b := t1; + ac := aa; + q, m := x2.(Node[Prod[a, Color]]); + if m { + p, vaa, c := Node_dest(q); + if c == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + q, m := p.(Node[Prod[a, Color]]); + if m { + vba, q, vda := Node_dest(q); + _ = q; + vea, d := Pair_dest(q); + if d == (Color(Black{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1b, Prod[a, Color]{ac, Color(Black{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{vba, Prod[a, Color]{vea, Color(Black{})}, vda}), vaa, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})})}); + } + } + } + } + }; + { + t1b := t1; + ac := aa; + q, m := x2.(Node[Prod[a, Color]]); + if m { + c, vaa, p := Node_dest(q); + if c == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + q, m := p.(Node[Prod[a, Color]]); + if m { + vca, q, vea := Node_dest(q); + _ = q; + vfa, d := Pair_dest(q); + if d == (Color(Black{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1b, Prod[a, Color]{ac, Color(Black{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), vaa, Tree[Prod[a, Color]](Node[Prod[a, Color]]{vca, Prod[a, Color]{vfa, Color(Black{})}, vea})})}); + } + } + } + } + }; + { + t1b := t1; + ac := aa; + q, m := x2.(Node[Prod[a, Color]]); + if m { + q, vaa, p := Node_dest(q); + r, m := q.(Node[Prod[a, Color]]); + if m { + vba, r, vga := Node_dest(r); + _ = r; + vha, c := Pair_dest(r); + if c == (Color(Black{})) { + s, m := p.(Node[Prod[a, Color]]); + if m { + vca, s, vea := Node_dest(s); + _ = s; + vfa, d := Pair_dest(s); + if d == (Color(Black{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1b, Prod[a, Color]{ac, Color(Black{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{vba, Prod[a, Color]{vha, Color(Black{})}, vga}), vaa, Tree[Prod[a, Color]](Node[Prod[a, Color]]{vca, Prod[a, Color]{vfa, Color(Black{})}, vea})})}); + } + } + } + } + } + }; + panic("match failed"); +} + +func BaldL[a any] (x0 Tree[Prod[a, Color]], b a, t3 Tree[Prod[a, Color]]) Tree[Prod[a, Color]] { + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + t1a, p, t2a := Node_dest(q); + _ = p; + ab, c := Pair_dest(p); + if c == (Color(Red{})) { + bb := b; + t3b := t3; + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1a, Prod[a, Color]{ab, Color(Black{})}, t2a}), Prod[a, Color]{bb, Color(Red{})}, t3b}); + } + } + }; + { + if x0 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + ab := b; + q, m := t3.(Node[Prod[a, Color]]); + if m { + t2a, p, t3b := Node_dest(q); + _ = p; + bb, c := Pair_dest(p); + if c == (Color(Black{})) { + return BaliR[a](Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), ab, Tree[Prod[a, Color]](Node[Prod[a, Color]]{t2a, Prod[a, Color]{bb, Color(Red{})}, t3b})); + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + va, p, vba := Node_dest(q); + _ = p; + vca, c := Pair_dest(p); + if c == (Color(Black{})) { + ab := b; + q, m := t3.(Node[Prod[a, Color]]); + if m { + t2a, q, t3b := Node_dest(q); + _ = q; + bb, d := Pair_dest(q); + if d == (Color(Black{})) { + return BaliR[a](Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Black{})}, vba}), ab, Tree[Prod[a, Color]](Node[Prod[a, Color]]{t2a, Prod[a, Color]{bb, Color(Red{})}, t3b})); + } + } + } + } + }; + { + if x0 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + ab := b; + q, m := t3.(Node[Prod[a, Color]]); + if m { + q, p, t4a := Node_dest(q); + r, m := q.(Node[Prod[a, Color]]); + if m { + t2a, r, t3b := Node_dest(r); + _ = r; + bb, d := Pair_dest(r); + if d == (Color(Black{})) { + _ = p; + ca, e := Pair_dest(p); + if e == (Color(Red{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), Prod[a, Color]{ab, Color(Black{})}, t2a}), Prod[a, Color]{bb, Color(Red{})}, BaliR[a](t3b, ca, Paint[a](Color(Red{}), t4a))}); + } + } + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + va, p, vba := Node_dest(q); + _ = p; + vca, d := Pair_dest(p); + if d == (Color(Black{})) { + ab := b; + q, m := t3.(Node[Prod[a, Color]]); + if m { + r, q, t4a := Node_dest(q); + s, m := r.(Node[Prod[a, Color]]); + if m { + t2a, s, t3b := Node_dest(s); + _ = s; + bb, e := Pair_dest(s); + if e == (Color(Black{})) { + _ = q; + ca, f := Pair_dest(q); + if f == (Color(Red{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Black{})}, vba}), Prod[a, Color]{ab, Color(Black{})}, t2a}), Prod[a, Color]{bb, Color(Red{})}, BaliR[a](t3b, ca, Paint[a](Color(Red{}), t4a))}); + } + } + } + } + } + } + }; + { + if x0 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + ab := b; + if t3 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), Prod[a, Color]{ab, Color(Red{})}, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})}); + } + } + }; + { + if x0 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + ab := b; + q, m := t3.(Node[Prod[a, Color]]); + if m { + c, p, vba := Node_dest(q); + if c == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + _ = p; + vca, d := Pair_dest(p); + if d == (Color(Red{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), Prod[a, Color]{ab, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), Prod[a, Color]{vca, Color(Red{})}, vba})}); + } + } + } + } + }; + { + if x0 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + ab := b; + q, m := t3.(Node[Prod[a, Color]]); + if m { + q, p, vba := Node_dest(q); + r, m := q.(Node[Prod[a, Color]]); + if m { + vaa, r, vea := Node_dest(r); + _ = r; + vfa, c := Pair_dest(r); + if c == (Color(Red{})) { + _ = p; + vca, d := Pair_dest(p); + if d == (Color(Red{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), Prod[a, Color]{ab, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{vaa, Prod[a, Color]{vfa, Color(Red{})}, vea}), Prod[a, Color]{vca, Color(Red{})}, vba})}); + } + } + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + va, p, vba := Node_dest(q); + _ = p; + vca, c := Pair_dest(p); + if c == (Color(Black{})) { + ab := b; + if t3 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Black{})}, vba}), Prod[a, Color]{ab, Color(Red{})}, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})}); + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + va, p, vba := Node_dest(q); + _ = p; + vca, c := Pair_dest(p); + if c == (Color(Black{})) { + ab := b; + q, m := t3.(Node[Prod[a, Color]]); + if m { + d, q, vea := Node_dest(q); + if d == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + _ = q; + vfa, e := Pair_dest(q); + if e == (Color(Red{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Black{})}, vba}), Prod[a, Color]{ab, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), Prod[a, Color]{vfa, Color(Red{})}, vea})}); + } + } + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + va, p, vba := Node_dest(q); + _ = p; + vca, c := Pair_dest(p); + if c == (Color(Black{})) { + ab := b; + q, m := t3.(Node[Prod[a, Color]]); + if m { + r, q, vea := Node_dest(q); + s, m := r.(Node[Prod[a, Color]]); + if m { + vda, s, vha := Node_dest(s); + _ = s; + via, d := Pair_dest(s); + if d == (Color(Red{})) { + _ = q; + vfa, e := Pair_dest(q); + if e == (Color(Red{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Black{})}, vba}), Prod[a, Color]{ab, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{vda, Prod[a, Color]{via, Color(Red{})}, vha}), Prod[a, Color]{vfa, Color(Red{})}, vea})}); + } + } + } + } + } + } + }; + panic("match failed"); +} + +func Join[a any] (x0 Tree[Prod[a, Color]], t Tree[Prod[a, Color]]) Tree[Prod[a, Color]] { + { + if x0 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + tb := t; + return tb; + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + vc, vaa, vba := Node_dest(q); + if t == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{vc, vaa, vba}); + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + t1a, p, t2a := Node_dest(q); + _ = p; + ab, d := Pair_dest(p); + if d == (Color(Red{})) { + q, m := t.(Node[Prod[a, Color]]); + if m { + t3a, q, t4a := Node_dest(q); + _ = q; + ca, e := Pair_dest(q); + if e == (Color(Red{})) { + target := Join[a](t2a, t3a); + { + if target == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1a, Prod[a, Color]{ab, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), Prod[a, Color]{ca, Color(Red{})}, t4a})}); + } + }; + { + r, m := target.(Node[Prod[a, Color]]); + if m { + u2, r, u3 := Node_dest(r); + _ = r; + b, f := Pair_dest(r); + if f == (Color(Red{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1a, Prod[a, Color]{ab, Color(Red{})}, u2}), Prod[a, Color]{b, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{u3, Prod[a, Color]{ca, Color(Red{})}, t4a})}); + } + } + }; + { + r, m := target.(Node[Prod[a, Color]]); + if m { + u2, r, u3 := Node_dest(r); + _ = r; + b, f := Pair_dest(r); + if f == (Color(Black{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1a, Prod[a, Color]{ab, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{u2, Prod[a, Color]{b, Color(Black{})}, u3}), Prod[a, Color]{ca, Color(Red{})}, t4a})}); + } + } + }; + panic("match failed"); + } + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + t1a, p, t2a := Node_dest(q); + _ = p; + ab, d := Pair_dest(p); + if d == (Color(Black{})) { + q, m := t.(Node[Prod[a, Color]]); + if m { + t3a, q, t4a := Node_dest(q); + _ = q; + ca, e := Pair_dest(q); + if e == (Color(Black{})) { + target := Join[a](t2a, t3a); + { + if target == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return BaldL[a](t1a, ab, Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), Prod[a, Color]{ca, Color(Black{})}, t4a})); + } + }; + { + r, m := target.(Node[Prod[a, Color]]); + if m { + u2, r, u3 := Node_dest(r); + _ = r; + b, f := Pair_dest(r); + if f == (Color(Red{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1a, Prod[a, Color]{ab, Color(Black{})}, u2}), Prod[a, Color]{b, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{u3, Prod[a, Color]{ca, Color(Black{})}, t4a})}); + } + } + }; + { + r, m := target.(Node[Prod[a, Color]]); + if m { + u2, r, u3 := Node_dest(r); + _ = r; + b, f := Pair_dest(r); + if f == (Color(Black{})) { + return BaldL[a](t1a, ab, Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{u2, Prod[a, Color]{b, Color(Black{})}, u3}), Prod[a, Color]{ca, Color(Black{})}, t4a})); + } + } + }; + panic("match failed"); + } + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + va, p, vba := Node_dest(q); + _ = p; + vca, c := Pair_dest(p); + if c == (Color(Black{})) { + q, m := t.(Node[Prod[a, Color]]); + if m { + t2a, q, t3a := Node_dest(q); + _ = q; + ab, d := Pair_dest(q); + if d == (Color(Red{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Join[a](Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Black{})}, vba}), t2a), Prod[a, Color]{ab, Color(Red{})}, t3a}); + } + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + t1a, p, t2a := Node_dest(q); + _ = p; + ab, c := Pair_dest(p); + if c == (Color(Red{})) { + q, m := t.(Node[Prod[a, Color]]); + if m { + va, q, vba := Node_dest(q); + _ = q; + vca, d := Pair_dest(q); + if d == (Color(Black{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1a, Prod[a, Color]{ab, Color(Red{})}, Join[a](t2a, Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Black{})}, vba}))}); + } + } + } + } + }; + panic("match failed"); +} + +func Fold[a, b any] (f func(a) func(b) b, x1 List[a], s b) b { + { + fb := f; + q, m := x1.(Cons[a]); + if m { + xa, xsa := Cons_dest(q); + sb := s; + return Fold[a, b](fb, xsa, ((fb(xa))(sb))); + } + }; + { + if x1 == (List[a](Nil[a]{})) { + sb := s; + return sb; + } + }; + panic("match failed"); +} + +func BaliL[a any] (x0 Tree[Prod[a, Color]], c a, t4 Tree[Prod[a, Color]]) Tree[Prod[a, Color]] { + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + q, p, t3a := Node_dest(q); + r, m := q.(Node[Prod[a, Color]]); + if m { + t1a, r, t2a := Node_dest(r); + _ = r; + ab, d := Pair_dest(r); + if d == (Color(Red{})) { + _ = p; + ba, e := Pair_dest(p); + if e == (Color(Red{})) { + cb := c; + t4b := t4; + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1a, Prod[a, Color]{ab, Color(Black{})}, t2a}), Prod[a, Color]{ba, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{t3a, Prod[a, Color]{cb, Color(Black{})}, t4b})}); + } + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + d, q, p := Node_dest(q); + if d == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + _ = q; + ab, e := Pair_dest(q); + if e == (Color(Red{})) { + r, m := p.(Node[Prod[a, Color]]); + if m { + t2a, r, t3a := Node_dest(r); + _ = r; + ba, f := Pair_dest(r); + if f == (Color(Red{})) { + cb := c; + t4b := t4; + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), Prod[a, Color]{ab, Color(Black{})}, t2a}), Prod[a, Color]{ba, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{t3a, Prod[a, Color]{cb, Color(Black{})}, t4b})}); + } + } + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + r, q, p := Node_dest(q); + s, m := r.(Node[Prod[a, Color]]); + if m { + va, s, vba := Node_dest(s); + _ = s; + vca, d := Pair_dest(s); + if d == (Color(Black{})) { + _ = q; + ab, e := Pair_dest(q); + if e == (Color(Red{})) { + t, m := p.(Node[Prod[a, Color]]); + if m { + t2a, t, t3a := Node_dest(t); + _ = t; + ba, f := Pair_dest(t); + if f == (Color(Red{})) { + cb := c; + t4b := t4; + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Black{})}, vba}), Prod[a, Color]{ab, Color(Black{})}, t2a}), Prod[a, Color]{ba, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{t3a, Prod[a, Color]{cb, Color(Black{})}, t4b})}); + } + } + } + } + } + } + }; + { + if x0 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + ab := c; + t2a := t4; + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), Prod[a, Color]{ab, Color(Black{})}, t2a}); + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + d, p, vba := Node_dest(q); + if d == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + _ = p; + va, e := Pair_dest(p); + if e == (Color(Black{})) { + ab := c; + t2a := t4; + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), Prod[a, Color]{va, Color(Black{})}, vba}), Prod[a, Color]{ab, Color(Black{})}, t2a}); + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + e, vaa, d := Node_dest(q); + if e == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) && d == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + ab := c; + t2a := t4; + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), vaa, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})}), Prod[a, Color]{ab, Color(Black{})}, t2a}); + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + d, vaa, p := Node_dest(q); + if d == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + q, m := p.(Node[Prod[a, Color]]); + if m { + vb, q, vda := Node_dest(q); + _ = q; + vea, e := Pair_dest(q); + if e == (Color(Black{})) { + ab := c; + t2a := t4; + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), vaa, Tree[Prod[a, Color]](Node[Prod[a, Color]]{vb, Prod[a, Color]{vea, Color(Black{})}, vda})}), Prod[a, Color]{ab, Color(Black{})}, t2a}); + } + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + q, p, vba := Node_dest(q); + r, m := q.(Node[Prod[a, Color]]); + if m { + vca, r, vea := Node_dest(r); + _ = r; + vfa, d := Pair_dest(r); + if d == (Color(Black{})) { + _ = p; + va, e := Pair_dest(p); + if e == (Color(Black{})) { + ab := c; + t2a := t4; + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{vca, Prod[a, Color]{vfa, Color(Black{})}, vea}), Prod[a, Color]{va, Color(Black{})}, vba}), Prod[a, Color]{ab, Color(Black{})}, t2a}); + } + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + p, vaa, d := Node_dest(q); + if d == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + q, m := p.(Node[Prod[a, Color]]); + if m { + vca, q, vea := Node_dest(q); + _ = q; + vfa, e := Pair_dest(q); + if e == (Color(Black{})) { + ab := c; + t2a := t4; + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{vca, Prod[a, Color]{vfa, Color(Black{})}, vea}), vaa, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})}), Prod[a, Color]{ab, Color(Black{})}, t2a}); + } + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + q, vaa, p := Node_dest(q); + r, m := q.(Node[Prod[a, Color]]); + if m { + vca, r, vea := Node_dest(r); + _ = r; + vfa, d := Pair_dest(r); + if d == (Color(Black{})) { + s, m := p.(Node[Prod[a, Color]]); + if m { + vb, s, vga := Node_dest(s); + _ = s; + vha, e := Pair_dest(s); + if e == (Color(Black{})) { + ab := c; + t2a := t4; + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{vca, Prod[a, Color]{vfa, Color(Black{})}, vea}), vaa, Tree[Prod[a, Color]](Node[Prod[a, Color]]{vb, Prod[a, Color]{vha, Color(Black{})}, vga})}), Prod[a, Color]{ab, Color(Black{})}, t2a}); + } + } + } + } + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + va, p, vba := Node_dest(q); + _ = p; + vca, d := Pair_dest(p); + if d == (Color(Black{})) { + ab := c; + t2a := t4; + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Black{})}, vba}), Prod[a, Color]{ab, Color(Black{})}, t2a}); + } + } + }; + panic("match failed"); +} + +func BaldR[a any] (t1 Tree[Prod[a, Color]], aa a, x2 Tree[Prod[a, Color]]) Tree[Prod[a, Color]] { + { + t1b := t1; + ac := aa; + q, m := x2.(Node[Prod[a, Color]]); + if m { + t2a, p, t3a := Node_dest(q); + _ = p; + ba, c := Pair_dest(p); + if c == (Color(Red{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1b, Prod[a, Color]{ac, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{t2a, Prod[a, Color]{ba, Color(Black{})}, t3a})}); + } + } + }; + { + q, m := t1.(Node[Prod[a, Color]]); + if m { + t1b, p, t2a := Node_dest(q); + _ = p; + ac, c := Pair_dest(p); + if c == (Color(Black{})) { + ba := aa; + if x2 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return BaliL[a](Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1b, Prod[a, Color]{ac, Color(Red{})}, t2a}), ba, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})); + } + } + } + }; + { + q, m := t1.(Node[Prod[a, Color]]); + if m { + t1b, p, t2a := Node_dest(q); + _ = p; + ac, c := Pair_dest(p); + if c == (Color(Black{})) { + ba := aa; + q, m := x2.(Node[Prod[a, Color]]); + if m { + va, q, vba := Node_dest(q); + _ = q; + vca, d := Pair_dest(q); + if d == (Color(Black{})) { + return BaliL[a](Tree[Prod[a, Color]](Node[Prod[a, Color]]{t1b, Prod[a, Color]{ac, Color(Red{})}, t2a}), ba, Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Black{})}, vba})); + } + } + } + } + }; + { + q, m := t1.(Node[Prod[a, Color]]); + if m { + t1b, q, p := Node_dest(q); + _ = q; + ac, d := Pair_dest(q); + if d == (Color(Red{})) { + r, m := p.(Node[Prod[a, Color]]); + if m { + t2a, r, t3a := Node_dest(r); + _ = r; + ba, e := Pair_dest(r); + if e == (Color(Black{})) { + ca := aa; + if x2 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{BaliL[a](Paint[a](Color(Red{}), t1b), ac, t2a), Prod[a, Color]{ba, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{t3a, Prod[a, Color]{ca, Color(Black{})}, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})})}); + } + } + } + } + } + }; + { + q, m := t1.(Node[Prod[a, Color]]); + if m { + t1b, q, p := Node_dest(q); + _ = q; + ac, d := Pair_dest(q); + if d == (Color(Red{})) { + r, m := p.(Node[Prod[a, Color]]); + if m { + t2a, r, t3a := Node_dest(r); + _ = r; + ba, e := Pair_dest(r); + if e == (Color(Black{})) { + ca := aa; + s, m := x2.(Node[Prod[a, Color]]); + if m { + va, s, vba := Node_dest(s); + _ = s; + vca, f := Pair_dest(s); + if f == (Color(Black{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{BaliL[a](Paint[a](Color(Red{}), t1b), ac, t2a), Prod[a, Color]{ba, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{t3a, Prod[a, Color]{ca, Color(Black{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Black{})}, vba})})}); + } + } + } + } + } + } + }; + { + if t1 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + ac := aa; + if x2 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), Prod[a, Color]{ac, Color(Red{})}, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})}); + } + } + }; + { + q, m := t1.(Node[Prod[a, Color]]); + if m { + va, p, c := Node_dest(q); + if c == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + _ = p; + vca, d := Pair_dest(p); + if d == (Color(Red{})) { + ac := aa; + if x2 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Red{})}, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})}), Prod[a, Color]{ac, Color(Red{})}, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})}); + } + } + } + } + }; + { + q, m := t1.(Node[Prod[a, Color]]); + if m { + vb, q, p := Node_dest(q); + _ = q; + vca, c := Pair_dest(q); + if c == (Color(Red{})) { + r, m := p.(Node[Prod[a, Color]]); + if m { + vaa, r, vea := Node_dest(r); + _ = r; + vfa, d := Pair_dest(r); + if d == (Color(Red{})) { + ac := aa; + if x2 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{vb, Prod[a, Color]{vca, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{vaa, Prod[a, Color]{vfa, Color(Red{})}, vea})}), Prod[a, Color]{ac, Color(Red{})}, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})}); + } + } + } + } + } + }; + { + if t1 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + ac := aa; + q, m := x2.(Node[Prod[a, Color]]); + if m { + va, p, vba := Node_dest(q); + _ = p; + vca, c := Pair_dest(p); + if c == (Color(Black{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), Prod[a, Color]{ac, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{va, Prod[a, Color]{vca, Color(Black{})}, vba})}); + } + } + } + }; + { + q, m := t1.(Node[Prod[a, Color]]); + if m { + vaa, p, c := Node_dest(q); + if c == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + _ = p; + vfa, d := Pair_dest(p); + if d == (Color(Red{})) { + ac := aa; + q, m := x2.(Node[Prod[a, Color]]); + if m { + vd, q, vba := Node_dest(q); + _ = q; + vca, e := Pair_dest(q); + if e == (Color(Black{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{vaa, Prod[a, Color]{vfa, Color(Red{})}, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})}), Prod[a, Color]{ac, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{vd, Prod[a, Color]{vca, Color(Black{})}, vba})}); + } + } + } + } + } + }; + { + q, m := t1.(Node[Prod[a, Color]]); + if m { + vaa, q, p := Node_dest(q); + _ = q; + vfa, c := Pair_dest(q); + if c == (Color(Red{})) { + r, m := p.(Node[Prod[a, Color]]); + if m { + vda, r, vha := Node_dest(r); + _ = r; + via, d := Pair_dest(r); + if d == (Color(Red{})) { + ac := aa; + s, m := x2.(Node[Prod[a, Color]]); + if m { + ve, s, vba := Node_dest(s); + _ = s; + vca, e := Pair_dest(s); + if e == (Color(Black{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Node[Prod[a, Color]]{vaa, Prod[a, Color]{vfa, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{vda, Prod[a, Color]{via, Color(Red{})}, vha})}), Prod[a, Color]{ac, Color(Red{})}, Tree[Prod[a, Color]](Node[Prod[a, Color]]{ve, Prod[a, Color]{vca, Color(Black{})}, vba})}); + } + } + } + } + } + } + }; + panic("match failed"); +} + +func Equal_tree[a any] (a_ Equal[a], x0 Tree[a], x1 Tree[a]) bool { + { + if x0 == (Tree[a](Leaf[a]{})) { + _, m := x1.(Node[a]); + if m { + return false; + } + } + }; + { + _, m := x0.(Node[a]); + if m { + if x1 == (Tree[a](Leaf[a]{})) { + return false; + } + } + }; + { + q, m := x0.(Node[a]); + if m { + x21a, x22a, x23a := Node_dest(q); + q, m := x1.(Node[a]); + if m { + y21a, y22a, y23a := Node_dest(q); + return Equal_tree[a](a_, x21a, y21a) && (Eq[a](a_, x22a, y22a) && Equal_tree[a](a_, x23a, y23a)); + } + } + }; + { + if x0 == (Tree[a](Leaf[a]{})) { + if x1 == (Tree[a](Leaf[a]{})) { + return true; + } + } + }; + panic("match failed"); +} + +func Colora[a any] (x0 Tree[Prod[a, Color]]) Color { + { + if x0 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return Color(Black{}); + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + _, p, _ := Node_dest(q); + _ = p; + _, ca := Pair_dest(p); + return ca; + } + }; + panic("match failed"); +} + +func Del[a any] (a1_ Equal[a], a2_ Linorder[a], x a, xa1 Tree[Prod[a, Color]]) Tree[Prod[a, Color]] { + { + if xa1 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}); + } + }; + { + xb := x; + q, m := xa1.(Node[Prod[a, Color]]); + if m { + la, p, ra := Node_dest(q); + _ = p; + ab, _ := Pair_dest(p); + target := Cmp[a](a1_, a2_, xb, ab); + { + if target == (Cmp_val(LT{})) { + targeu := ! Equal_tree[Prod[a, Color]](Equal_prod[a, Color](a1_, Equal_color()), la, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) && Equal_colora(Colora[a](la), Color(Black{})); + { + if targeu == (true) { + return BaldL[a](Del[a](a1_, a2_, xb, la), ab, ra); + } + }; + { + if targeu == (false) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Del[a](a1_, a2_, xb, la), Prod[a, Color]{ab, Color(Red{})}, ra}); + } + }; + panic("match failed"); + } + }; + { + if target == (Cmp_val(EQ{})) { + return Join[a](la, ra); + } + }; + { + if target == (Cmp_val(GT{})) { + targeu := ! Equal_tree[Prod[a, Color]](Equal_prod[a, Color](a1_, Equal_color()), ra, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) && Equal_colora(Colora[a](ra), Color(Black{})); + { + if targeu == (true) { + return BaldR[a](la, ab, Del[a](a1_, a2_, xb, ra)); + } + }; + { + if targeu == (false) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{la, Prod[a, Color]{ab, Color(Red{})}, Del[a](a1_, a2_, xb, ra)}); + } + }; + panic("match failed"); + } + }; + panic("match failed"); + } + }; + panic("match failed"); +} + +func Ins[a any] (a1_ Equal[a], a2_ Linorder[a], x a, xa1 Tree[Prod[a, Color]]) Tree[Prod[a, Color]] { + { + xb := x; + if xa1 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}), Prod[a, Color]{xb, Color(Red{})}, Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})}); + } + }; + { + xb := x; + q, m := xa1.(Node[Prod[a, Color]]); + if m { + la, p, ra := Node_dest(q); + _ = p; + ab, c := Pair_dest(p); + if c == (Color(Black{})) { + target := Cmp[a](a1_, a2_, xb, ab); + { + if target == (Cmp_val(LT{})) { + return BaliL[a](Ins[a](a1_, a2_, xb, la), ab, ra); + } + }; + { + if target == (Cmp_val(EQ{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{la, Prod[a, Color]{ab, Color(Black{})}, ra}); + } + }; + { + if target == (Cmp_val(GT{})) { + return BaliR[a](la, ab, Ins[a](a1_, a2_, xb, ra)); + } + }; + panic("match failed"); + } + } + }; + { + xb := x; + q, m := xa1.(Node[Prod[a, Color]]); + if m { + la, p, ra := Node_dest(q); + _ = p; + ab, c := Pair_dest(p); + if c == (Color(Red{})) { + target := Cmp[a](a1_, a2_, xb, ab); + { + if target == (Cmp_val(LT{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{Ins[a](a1_, a2_, xb, la), Prod[a, Color]{ab, Color(Red{})}, ra}); + } + }; + { + if target == (Cmp_val(EQ{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{la, Prod[a, Color]{ab, Color(Red{})}, ra}); + } + }; + { + if target == (Cmp_val(GT{})) { + return Tree[Prod[a, Color]](Node[Prod[a, Color]]{la, Prod[a, Color]{ab, Color(Red{})}, Ins[a](a1_, a2_, xb, ra)}); + } + }; + panic("match failed"); + } + } + }; + panic("match failed"); +} + +func Insert[a any] (a1_ Equal[a], a2_ Linorder[a], x a, t Tree[Prod[a, Color]]) Tree[Prod[a, Color]] { + return Paint[a](Color(Black{}), Ins[a](a1_, a2_, x, t)); +} + +func Empty[a any] () Tree[Prod[a, Color]] { + return Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{}); +} + +func T1 () Tree[Prod[Bigint.Int, Color]] { + return Fold[Bigint.Int, Tree[Prod[Bigint.Int, Color]]](func (a Bigint.Int) func(Tree[Prod[Bigint.Int, Color]]) Tree[Prod[Bigint.Int, Color]] { return func (b Tree[Prod[Bigint.Int, Color]]) Tree[Prod[Bigint.Int, Color]] { return Insert[Bigint.Int](Equal_integer(), Linorder_integer(), a, b); }; }, List[Bigint.Int](Cons[Bigint.Int]{Bigint.MkInt("1"), List[Bigint.Int](Cons[Bigint.Int]{Bigint.MkInt("2"), List[Bigint.Int](Cons[Bigint.Int]{Bigint.MkInt("3"), List[Bigint.Int](Cons[Bigint.Int]{Bigint.MkInt("4"), List[Bigint.Int](Cons[Bigint.Int]{Bigint.MkInt("5"), List[Bigint.Int](Nil[Bigint.Int]{})})})})})}), Empty[Bigint.Int]()); +} + +func Invc[a any] (x0 Tree[Prod[a, Color]]) bool { + { + if x0 == (Tree[Prod[a, Color]](Leaf[Prod[a, Color]]{})) { + return true; + } + }; + { + q, m := x0.(Node[Prod[a, Color]]); + if m { + la, p, ra := Node_dest(q); + _ = p; + _, ca := Pair_dest(p); + return (!(Equal_colora(ca, Color(Red{}))) || Equal_colora(Colora[a](la), Color(Black{})) && Equal_colora(Colora[a](ra), Color(Black{}))) && (Invc[a](la) && Invc[a](ra)); + } + }; + panic("match failed"); +} + +func Delete_list[a any] (a1_ Equal[a], a2_ Linorder[a], xs List[a], aa Tree[Prod[a, Color]]) Tree[Prod[a, Color]] { + return Fold[a, Tree[Prod[a, Color]]](func (ab a) func(Tree[Prod[a, Color]]) Tree[Prod[a, Color]] { return func (b Tree[Prod[a, Color]]) Tree[Prod[a, Color]] { return Del[a](a1_, a2_, ab, b); }; }, xs, aa); +} + +func Trees_equal[a any] (a_ Equal[a], aa Tree[Prod[a, Color]], b Tree[Prod[a, Color]]) bool { + return Equal_tree[Prod[a, Color]](Equal_prod[a, Color](a_, Equal_color()), aa, b); +} + +func Tree_from_list[a any] (a1_ Equal[a], a2_ Linorder[a], xs List[a]) Tree[Prod[a, Color]] { + return Fold[a, Tree[Prod[a, Color]]](func (aa a) func(Tree[Prod[a, Color]]) Tree[Prod[a, Color]] { return func (b Tree[Prod[a, Color]]) Tree[Prod[a, Color]] { return Insert[a](a1_, a2_, aa, b); }; }, xs, Empty[a]()); +} diff --git a/thys/Go/test/quick/export/go.mod b/thys/Go/test/quick/export/go.mod new file mode 100644 --- /dev/null +++ b/thys/Go/test/quick/export/go.mod @@ -0,0 +1,3 @@ +module "isabelle/exported" + +go 1.18 diff --git a/thys/Go/test/quick/go/Bigint b/thys/Go/test/quick/go/Bigint new file mode 120000 --- /dev/null +++ b/thys/Go/test/quick/go/Bigint @@ -0,0 +1,1 @@ +../export/Bigint/ \ No newline at end of file diff --git a/thys/Go/test/quick/go/Interface/rbt.go b/thys/Go/test/quick/go/Interface/rbt.go new file mode 100644 --- /dev/null +++ b/thys/Go/test/quick/go/Interface/rbt.go @@ -0,0 +1,42 @@ +package rbt + +import "isabelle/exported/RbtTest" + +var T1 = RbtTest.T1() + +var LinorderInt = RbtTest.Linorder_integer() +var EqualInt = RbtTest.Equal_integer() + +func EmptyTree[a any]() RbtTest.Tree[RbtTest.Prod[a, RbtTest.Color]] { + return RbtTest.Empty[a]() +} + +func JoinAndCheck[a any](a_ RbtTest.Linorder[a], x, y RbtTest.Tree[RbtTest.Prod[a, RbtTest.Color]]) (RbtTest.Tree[RbtTest.Prod[a, RbtTest.Color]], bool) { + b := RbtTest.Join(x, y) + ok := RbtTest.Invc(b) + return b, ok +} + +func DelAndCheck[a any](eq RbtTest.Equal[a], lin RbtTest.Linorder[a], list RbtTest.List[a], x RbtTest.Tree[RbtTest.Prod[a, RbtTest.Color]]) (RbtTest.Tree[RbtTest.Prod[a, RbtTest.Color]], bool) { + b := RbtTest.Delete_list(eq, lin, list, x) + ok := RbtTest.Invc(b) + return b, ok +} + +func TreeFromList[a any](eq RbtTest.Equal[a], lin RbtTest.Linorder[a], xs RbtTest.List[a]) (RbtTest.Tree[RbtTest.Prod[a, RbtTest.Color]], bool) { + tree := RbtTest.Tree_from_list(eq, lin, xs) + ok := RbtTest.Invc(tree) + return tree, ok +} + +func MkList[a any](vec []a) RbtTest.List[a] { + list := RbtTest.List[a](RbtTest.Nil[a]{}) + for _, v := range vec { + list = RbtTest.List[a](RbtTest.Cons[a]{v, list}) + } + return list +} + +func TreesEqual[a any](eq RbtTest.Equal[a], x, y RbtTest.Tree[RbtTest.Prod[a, RbtTest.Color]]) bool { + return RbtTest.Trees_equal(eq, x, y) +} diff --git a/thys/Go/test/quick/go/Interface/rbt_test.go b/thys/Go/test/quick/go/Interface/rbt_test.go new file mode 100644 --- /dev/null +++ b/thys/Go/test/quick/go/Interface/rbt_test.go @@ -0,0 +1,90 @@ +package rbt + +import ( + "reflect" + "testing" + + "isabelle/exported/Bigint" + "isabelle/exported/RbtTest" +) + +type RBTBigInt = RbtTest.Prod[Bigint.Int, RbtTest.Color] + +func TestTreeFromList(t *testing.T) { + array := [5]Bigint.Int{Bigint.MkInt("1"), Bigint.MkInt("2"), Bigint.MkInt("3"), Bigint.MkInt("4"), Bigint.MkInt("5")} + elements := MkList(array[:]) + + got, ok := TreeFromList(EqualInt, LinorderInt, elements) + if !ok { + t.Fatal("new tree does not satisfy invariant") + } + + want := RbtTest.Node[RBTBigInt]{ + A: RbtTest.Node[RBTBigInt]{ + A: RbtTest.Node[RBTBigInt]{ + A: RbtTest.Leaf[RBTBigInt]{}, + Aa: RBTBigInt{A: Bigint.MkInt("1"), + Aa: RbtTest.Black{}, + }, + Ab: RbtTest.Leaf[RBTBigInt]{}, + }, + Aa: RBTBigInt{ + A: Bigint.MkInt("2"), + Aa: RbtTest.Red{}, + }, + Ab: RbtTest.Node[RBTBigInt]{ + A: RbtTest.Leaf[RBTBigInt]{}, + Aa: RBTBigInt{A: Bigint.MkInt("3"), + Aa: RbtTest.Black{}}, + Ab: RbtTest.Leaf[RBTBigInt]{}, + }, + }, + Aa: RBTBigInt{ + A: Bigint.MkInt("4"), + Aa: RbtTest.Black{}, + }, + Ab: RbtTest.Node[RBTBigInt]{ + A: RbtTest.Leaf[RBTBigInt]{}, + Aa: RBTBigInt{ + A: Bigint.MkInt("5"), + Aa: RbtTest.Black{}, + }, + Ab: RbtTest.Leaf[RBTBigInt]{}, + }, + } + + if !reflect.DeepEqual(got, want) { + t.Fatalf("got tree does not equal want tree") + } +} + +func TestJoinAndCheck(t *testing.T) { + list := MkList([]Bigint.Int{Bigint.MkInt("1"), Bigint.MkInt("2"), Bigint.MkInt("3"), Bigint.MkInt("4"), Bigint.MkInt("5")}) + + tree, ok := TreeFromList(EqualInt, LinorderInt, list) + if !ok { + t.Fatal("new tree does not satisfy invariant") + } + _, ok = JoinAndCheck(LinorderInt, tree, tree) + if !ok { + t.Fatal("joining trees violated invariant") + } +} + +func TestDelAndCheck(t *testing.T) { + list := MkList([]Bigint.Int{Bigint.MkInt("1"), Bigint.MkInt("2"), Bigint.MkInt("3"), Bigint.MkInt("4"), Bigint.MkInt("5")}) + + tree, ok := TreeFromList(EqualInt, LinorderInt, list) + if !ok { + t.Fatal("new tree does not satisfy invariant") + } + got, ok := DelAndCheck(EqualInt, LinorderInt, list, tree) + if !ok { + t.Fatal("deletion violated invariant") + } + want := EmptyTree[Bigint.Int]() + ok = TreesEqual(EqualInt, got, want) + if !ok { + t.Fatal("tree not empty after deletion") + } +} diff --git a/thys/Go/test/quick/go/RbtTest b/thys/Go/test/quick/go/RbtTest new file mode 120000 --- /dev/null +++ b/thys/Go/test/quick/go/RbtTest @@ -0,0 +1,1 @@ +../export/RbtTest \ No newline at end of file diff --git a/thys/Go/test/quick/go/go.mod b/thys/Go/test/quick/go/go.mod new file mode 100644 --- /dev/null +++ b/thys/Go/test/quick/go/go.mod @@ -0,0 +1,3 @@ +module "isabelle/exported" + +go 1.18 diff --git a/thys/Go/test/slow/Candidates.thy b/thys/Go/test/slow/Candidates.thy new file mode 100644 --- /dev/null +++ b/thys/Go/test/slow/Candidates.thy @@ -0,0 +1,82 @@ +(* Author: Florian Haftmann, TU Muenchen *) + +section \A huge collection of equations to generate code from\ + +theory Candidates +imports + Complex_Main + "HOL-Library.Library" + "HOL-Library.Sorting_Algorithms" + "HOL-Library.Subseq_Order" + "HOL-Library.RBT" + "HOL-Data_Structures.Tree_Map" + "HOL-Data_Structures.Tree_Set" + "HOL-Computational_Algebra.Computational_Algebra" + "HOL-Computational_Algebra.Polynomial_Factorial" + "HOL-Number_Theory.Eratosthenes" + "HOL-Examples.Records" + "HOL-Examples.Gauss_Numbers" +begin + +text \Drop technical stuff from \<^theory>\HOL.Quickcheck_Narrowing\ which is tailored towards Haskell\ + +setup \ +fn thy => +let + val tycos = Sign.logical_types thy; + val consts = map_filter (try (curry (Axclass.param_of_inst thy) + \<^const_name>\Quickcheck_Narrowing.partial_term_of\)) tycos; +in fold Code.declare_unimplemented_global consts thy end +\ + +text \Simple example for the predicate compiler.\ + +inductive sublist :: "'a list \ 'a list \ bool" +where + empty: "sublist [] xs" +| drop: "sublist ys xs \ sublist ys (x # xs)" +| take: "sublist ys xs \ sublist (x # ys) (x # xs)" + +code_pred sublist . + +text \Avoid popular infix.\ + +code_reserved SML upto + +text \Explicit check in \OCaml\ for correct precedence of let expressions in list expressions\ + +definition funny_list :: "bool list" +where + "funny_list = [let b = True in b, False]" + +definition funny_list' :: "bool list" +where + "funny_list' = funny_list" + +lemma [code]: + "funny_list' = [True, False]" + by (simp add: funny_list_def funny_list'_def) + +definition check_list :: unit +where + "check_list = (if funny_list = funny_list' then () else undefined)" + +text \Explicit check in \Scala\ for correct bracketing of abstractions\ + +definition funny_funs :: "(bool \ bool) list \ (bool \ bool) list" +where + "funny_funs fs = (\x. x \ True) # (\x. x \ False) # fs" + +(* +text \Explicit checks for strings etc.\ + +definition \hello = ''Hello, world!''\ + +definition \hello2 = String.explode (String.implode hello)\ + +definition \which_hello \ hello \ hello2\ +*) + +declare [[code abort: String.literal_of_asciis String.asciis_of_literal]] + +end diff --git a/thys/Go/test/slow/Generate.thy b/thys/Go/test/slow/Generate.thy new file mode 100644 --- /dev/null +++ b/thys/Go/test/slow/Generate.thy @@ -0,0 +1,21 @@ +(* Author: Florian Haftmann, TU Muenchen *) + +section \Pervasive test of code generator\ + +theory Generate +imports + "Candidates" + "HOL-Library.AList_Mapping" + "HOL-Library.Finite_Lattice" + "Go.Go_Setup" +begin + +text \ + If any of the checks fails, inspect the code generated + by a corresponding \export_code\ command. +\ + + +export_code _ checking Go? (infinite_type "stream") + +end diff --git a/thys/Go/test/slow/Generate_Binary_Nat.thy b/thys/Go/test/slow/Generate_Binary_Nat.thy new file mode 100644 --- /dev/null +++ b/thys/Go/test/slow/Generate_Binary_Nat.thy @@ -0,0 +1,14 @@ +theory Generate_Binary_Nat +imports + "Candidates" + "HOL-Library.AList_Mapping" + "HOL-Library.Finite_Lattice" + "HOL-Library.Code_Binary_Nat" + "Go.Go_Setup" +begin + + + +export_code _ checking Go? (infinite_type "stream") + +end diff --git a/thys/ROOTS b/thys/ROOTS --- a/thys/ROOTS +++ b/thys/ROOTS @@ -1,804 +1,807 @@ ABY3_Protocols ADS_Functor AI_Planning_Languages_Semantics AODV AOT AVL-Trees AWN Abortable_Linearizable_Modules Abs_Int_ITP2012 Abstract-Hoare-Logics Abstract-Rewriting Abstract_Completeness Abstract_Soundness Ackermanns_not_PR Actuarial_Mathematics Adaptive_State_Counting Affine_Arithmetic Aggregation_Algebras Akra_Bazzi Algebraic_Numbers Algebraic_VCs Allen_Calculus Amicable_Numbers Amortized_Complexity AnselmGod Applicative_Lifting +Approximate_Model_Counting Approximation_Algorithms Architectural_Design_Patterns Aristotles_Assertoric_Syllogistic Arith_Prog_Rel_Primes ArrowImpossibilityGS Attack_Trees Auto2_HOL Auto2_Imperative_HOL AutoFocus-Stream Automated_Stateful_Protocol_Verification Automatic_Refinement AxiomaticCategoryTheory BDD BD_Security_Compositional BNF_CC BNF_Operations BTree Balog_Szemeredi_Gowers Banach_Steinhaus Belief_Revision Bell_Numbers_Spivey BenOr_Kozen_Reif Berlekamp_Zassenhaus Bernoulli Bertrands_Postulate Bicategory BinarySearchTree Binary_Code_Imprimitive Binding_Syntax_Theory Binomial-Heaps Binomial-Queues BirdKMP Birkhoff_Finite_Distributive_Lattices Blue_Eyes Bondy Boolean_Expression_Checkers Boolos_Curious_Inference Boolos_Curious_Inference_Automated Bounded_Deducibility_Security Buchi_Complementation Budan_Fourier Buffons_Needle Buildings BytecodeLogicJmlTypes C2KA_DistributedSystems CAVA_Automata CAVA_LTL_Modelchecker CCS CHERI-C_Memory_Model CISC-Kernel Concentration_Inequalities CRDT CRYSTALS-Kyber CRYSTALS-Kyber_Security CSP_RefTK CVP_Hardness CYK CZH_Elementary_Categories CZH_Foundations CZH_Universal_Constructions CakeML CakeML_Codegen Call_Arity Card_Equiv_Relations Card_Multisets Card_Number_Partitions Card_Partitions Cardinality_Continuum Cartan_FP Case_Labeling Catalan_Numbers Category Category2 Category3 Catoids Cauchy Cayley_Hamilton Certification_Monads Ceva Chandy_Lamport Chebyshev_Polynomials Chord_Segments Circus Clean Clique_and_Monotone_Circuits ClockSynchInst Closest_Pair_Points CoCon CoSMeDis CoSMed CofGroups Coinductive Coinductive_Languages Collections Combinable_Wands Combinatorial_Enumeration_Algorithms Combinatorics_Words Combinatorics_Words_Graph_Lemma Combinatorics_Words_Lyndon CommCSL Commuting_Hermitian Comparison_Sort_Lower_Bound Compiling-Exceptions-Correctly Complete_Non_Orders Completeness Complex_Bounded_Operators Complex_Geometry Complx ComponentDependencies ConcurrentGC ConcurrentIMP Concurrent_Ref_Alg Concurrent_Revisions Conditional_Simplification Conditional_Transfer_Rule Consensus_Refined Constructive_Cryptography Constructive_Cryptography_CM Constructor_Funs Containers +Continued_Fractions Cook_Levin CoreC++ Core_DOM Core_SC_DOM Correctness_Algebras Cotangent_PFD_Formula Count_Complex_Roots Coupledsim_Contrasim CryptHOL CryptoBasedCompositionalProperties Crypto_Standards CubicalCategories Cubic_Quartic_Equations DCR-ExecutionEquivalence DFS_Framework DOM_Components DPRM_Theorem DPT-SAT-Solver DataRefinementIBP Datatype_Order_Generator Decl_Sem_Fun_PL Decreasing-Diagrams Decreasing-Diagrams-II Dedekind_Real Deep_Learning Delta_System_Lemma Density_Compiler Dependent_SIFUM_Refinement Dependent_SIFUM_Type_Systems Depth-First-Search Derangements Deriving Descartes_Sign_Rule Design_Theory Dict_Construction Differential_Dynamic_Logic Differential_Game_Logic DigitsInBase Digit_Expansions Dijkstra_Shortest_Path Diophantine_Eqns_Lin_Hom Directed_Sets Dirichlet_L Dirichlet_Series DiscretePricing Discrete_Summation Disintegration DiskPaxos Distributed_Distinct_Elements Dominance_CHK DynamicArchitectures Dynamic_Tables E_Transcendental Earley_Parser Echelon_Form EdmondsKarp_Maxflow Edwards_Elliptic_Curves_Group Efficient-Mergesort Efficient_Weighted_Path_Order Elimination_Of_Repeated_Factors Elliptic_Curves_Group_Law Encodability_Process_Calculi Epistemic_Logic Equivalence_Relation_Enumeration Ergodic_Theory Error_Function Euler_MacLaurin Euler_Partition Euler_Polyhedron_Formula Eudoxus_Reals Eval_FO Example-Submission Executable_Randomized_Algorithms Expander_Graphs Extended_Finite_State_Machine_Inference Extended_Finite_State_Machines FFT FLP FOL-Fitting FOL_Axiomatic FOL_Harrison FOL_Seq_Calc1 FOL_Seq_Calc2 FOL_Seq_Calc3 FO_Theory_Rewriting FSM_Tests Factor_Algebraic_Polynomial Factored_Transition_System_Bounding Falling_Factorial_Sum Farkas FeatherweightJava Featherweight_OCL Fermat3_4 FileRefinement FinFun Finger-Trees Finite-Map-Extras Finite_Automata_HF Finite_Fields Finitely_Generated_Abelian_Groups First_Order_Terms First_Welfare_Theorem Fishburn_Impossibility Fisher_Yates Fishers_Inequality Fixed_Length_Vector Flow_Networks Floyd_Warshall Flyspeck-Tame FocusStreamsCaseStudies Forcing Formal_Puiseux_Series Formal_SSA Formula_Derivatives Foundation_of_geometry Fourier Free-Boolean-Algebra Free-Groups Frequency_Moments Fresh_Identifiers FunWithFunctions FunWithTilings Functional-Automata Functional_Ordered_Resolution_Prover Furstenberg_Topology GPU_Kernel_PL Gabow_SCC GaleStewart_Games Gale_Shapley Game_Based_Crypto Gauss-Jordan-Elim-Fun Gauss_Jordan Gauss_Sums Gaussian_Integers GenClock General-Triangle Generalized_Counting_Sort Generic_Deriving Generic_Join GewirthPGCProof Girth_Chromatic Given_Clause_Loops +Go GoedelGod Goedel_HFSet_Semantic Goedel_HFSet_Semanticless Goedel_Incompleteness Goodstein_Lambda GraphMarkingIBP Graph_Saturation Graph_Theory Gray_Codes Green Groebner_Bases Groebner_Macaulay Gromov_Hyperbolicity Grothendieck_Schemes Group-Ring-Module HOL-CSP HOL-CSPM HOL-CSP_OpSem HOLCF-Prelude HRB-Slicing Hahn_Jordan_Decomposition Hales_Jewett Heard_Of Hello_World HereditarilyFinite Hermite Hermite_Lindemann Hidden_Markov_Models Higher_Order_Terms HoareForDivergence Hoare_Time Hood_Melville_Queue HotelKeyCards Huffman Hybrid_Logic Hybrid_Multi_Lane_Spatial_Logic Hybrid_Systems_VCs HyperCTL HyperHoareLogic Hyperdual Hypergraph_Basics Hypergraph_Colourings IEEE_Floating_Point IFC_Tracking IMAP-CRDT IMO2019 IMP2 IMP2_Binary_Heap IMP_Compiler IMP_Compiler_Reuse Interval_Analysis IO_Language_Conformance IP_Addresses Imperative_Insertion_Sort Implicational_Logic Impossible_Geometry IMP_Noninterference Incompleteness Incredible_Proof_Machine Independence_CH Inductive_Confidentiality Inductive_Inference InfPathElimination InformationFlowSlicing InformationFlowSlicing_Inter Integration Interpolation_Polynomials_HOL_Algebra Interpreter_Optimizations Interval_Arithmetic_Word32 Intro_Dest_Elim Involutions2Squares Iptables_Semantics Irrational_Series_Erdos_Straus Irrationality_J_Hancl Irrationals_From_THEBOOK IsaGeoCoq IsaNet Isabelle_C Isabelle_hoops Isabelle_Marries_Dirac Isabelle_Meta_Model Jacobson_Basic_Algebra Jinja JinjaDCI JinjaThreads JiveDataStoreModel Jordan_Hoelder Jordan_Normal_Form KAD Karatsuba KAT_and_DRA KBPs KD_Tree Key_Agreement_Strong_Adversaries Khovanskii_Theorem Kleene_Algebra Kneser_Cauchy_Davenport Knights_Tour Knot_Theory Knuth_Bendix_Order Knuth_Morris_Pratt KnuthMorrisPratt Koenigsberg_Friendship Kruskal Kuratowski_Closure_Complement LLL_Basis_Reduction LLL_Factorization LOFT LP_Duality LTL LTL_Master_Theorem LTL_Normal_Form LTL_to_DRA LTL_to_GBA Lam-ml-Normalization LambdaAuth LambdaMu Lambda_Free_EPO Lambda_Free_KBOs Lambda_Free_RPOs Lambert_Series Lambert_W Landau_Symbols Laplace_Transform Latin_Square LatticeProperties Launchbury Laws_of_Large_Numbers Lazy-Lists-II Lazy_Case Lehmer Lifting_Definition_Option Lifting_the_Exponent LightweightJava LinearQuantifierElim Linear_Inequalities Linear_Programming Linear_Recurrences Liouville_Numbers List-Index List-Infinite List_Interleaving List_Inversions List_Update LocalLexing Localization_Ring Locally-Nameless-Sigma Logging_Independent_Anonymity Lovasz_Local Lowe_Ontological_Argument Lower_Semicontinuous Lp Lucas_Theorem MDP-Algorithms MDP-Rewards MFMC_Countable MFODL_Monitor_Optimized MFOTL_Monitor MSO_Regex_Equivalence Markov_Models Marriage Martingales Mason_Stothers Matrices_for_ODEs Matrix Matrix_Tensor Matroids Max-Card-Matching Maximum_Segment_Sum Median_Method Median_Of_Medians_Selection Menger Mereology Mersenne_Primes Metalogic_ProofChecker MHComputation MiniML MiniSail Minimal_SSA Minkowskis_Theorem Minsky_Machines MLSS_Decision_Proc ML_Unification Modal_Logics_for_NTS Modular_Assembly_Kit_Security Modular_arithmetic_LLL_and_HNF_algorithms Monad_Memo_DP Monad_Normalisation MonoBoolTranAlgebra MonoidalCategory Monomorphic_Monad MuchAdoAboutTwo Multi_Party_Computation Multirelations Multirelations_Heterogeneous Multiset_Ordering_NPC Multitape_To_Singletape_TM Myhill-Nerode Name_Carrying_Type_Inference Nano_JSON Nash_Williams Nat-Interval-Logic Native_Word Nested_Multisets_Ordinals Network_Security_Policy_Verification Neumann_Morgenstern_Utility No_FTL_observers No_FTL_observers_Gen_Rel Nominal2 Nominal_Myhill_Nerode Noninterference_CSP Noninterference_Concurrent_Composition Noninterference_Generic_Unwinding Noninterference_Inductive_Unwinding Noninterference_Ipurge_Unwinding Noninterference_Sequential_Composition NormByEval Nullstellensatz Number_Theoretic_Transform Octonions OmegaCatoidsQuantales OpSets Open_Induction Optics Optimal_BST Orbit_Stabiliser Order_Lattice_Props Ordered_Resolution_Prover Ordinal Ordinal_Partitions Ordinals_and_Cardinals Ordinary_Differential_Equations PAC_Checker PAL PAPP_Impossibility PCF PLM POPLmark-deBruijn PSemigroupsConvolution Package_logic Padic_Field Padic_Ints Pairing_Heap Paraconsistency Parity_Game Partial_Function_MR Partial_Order_Reduction Password_Authentication_Protocol Pell Perfect_Fields Perfect-Number-Thm Perron_Frobenius Physical_Quantities Pi_Calculus Pi_Transcendental Planarity_Certificates Pluennecke_Ruzsa_Inequality Poincare_Bendixson Poincare_Disc Polygonal_Number_Theorem Polylog Polynomial_Crit_Geometry Polynomial_Factorization Polynomial_Interpolation Polynomials Pop_Refinement Posix-Lexing Possibilistic_Noninterference Power_Sum_Polynomials Pratt_Certificate Prefix_Free_Code_Combinators Presburger-Automata Prim_Dijkstra_Simple Prime_Distribution_Elementary Prime_Harmonic_Series Prime_Number_Theorem Priority_Queue_Braun Priority_Search_Trees Probabilistic_Noninterference Probabilistic_Prime_Tests Probabilistic_System_Zoo Probabilistic_Timed_Automata Probabilistic_While Probability_Inequality_Completeness Program-Conflict-Analysis Progress_Tracking Projective_Geometry Projective_Measurements Promela Proof_Strategy_Language PropResPI Propositional_Logic_Class Propositional_Proof_Systems Prpu_Maxflow PseudoHoops Psi_Calculi Ptolemys_Theorem Public_Announcement_Logic Q0_Metatheory Q0_Soundness QBF_Solver_Verification QHLProver QR_Decomposition Quantales Quantales_Converse Quantifier_Elimination_Hybrid Quasi_Borel_Spaces Quaternions Query_Optimization Quick_Sort_Cost RIPEMD-160-SPARK ROBDD RSAPSS Ramsey-Infinite Random_BSTs Random_Graph_Subgraph_Threshold Randomised_BSTs Randomised_Social_Choice Rank_Nullity_Theorem Real_Impl Real_Power Real_Time_Deque Recursion-Addition Recursion-Theory-I Refine_Imperative_HOL Refine_Monadic RefinementReactive Regex_Equivalence Region_Quadtrees Registers Regression_Test_Selection Regular-Sets Regular_Algebras Regular_Tree_Relations Relation_Algebra Relational-Incorrectness-Logic Relational_Cardinality Relational_Disjoint_Set_Forests Relational_Forests Relational_Method Relational_Minimum_Spanning_Trees Relational_Paths Rensets Rep_Fin_Groups ResiduatedTransitionSystem Residuated_Lattices Resolution_FOL Rewrite_Properties_Reduction Rewriting_Z Ribbon_Proofs Risk_Free_Lending Robbins-Conjecture Robinson_Arithmetic Root_Balanced_Tree Roth_Arithmetic_Progressions Routing Roy_Floyd_Warshall SATSolverVerification SCC_Bloemen_Sequential SC_DOM_Components SDS_Impossibility SIFPL SIFUM_Type_Systems SPARCv8 S_Finite_Measure_Monad Safe_Distance Safe_OCL Safe_Range_RC Saturation_Framework Saturation_Framework_Extensions Sauer_Shelah_Lemma Schutz_Spacetime Schwartz_Zippel Secondary_Sylow Security_Protocol_Refinement Selection_Heap_Sort SenSocialChoice Separata Separation_Algebra Separation_Logic_Imperative_HOL Separation_Logic_Unbounded SequentInvertibility Shadow_DOM Shadow_SC_DOM Shivers-CFA ShortestPath Show Sigma_Commit_Crypto Signature_Groebner Simpl Simple_Clause_Learning Simple_Firewall Simplex Simplicial_complexes_and_boolean_functions SimplifiedOntologicalArgument Skew_Heap Skip_Lists Slicing Sliding_Window_Algorithm Smith_Normal_Form Smooth_Manifolds Solidity Sophomores_Dream Sort_Encodings Source_Coding_Theorem SpecCheck Special_Function_Bounds Splay_Tree Sqrt_Babylonian Stable_Matching Stalnaker_Logic Standard_Borel_Spaces Statecharts Stateful_Protocol_Composition_and_Typing Stellar_Quorums Stern_Brocot Stewart_Apollonius Stirling_Formula Stochastic_Matrices Stone_Algebras Stone_Kleene_Relation_Algebras Stone_Relation_Algebras Store_Buffer_Reduction Stream-Fusion Stream_Fusion_Code StrictOmegaCategories Strong_Security Sturm_Sequences Sturm_Tarski Stuttering_Equivalence Subresultants Subset_Boolean_Algebras Sumcheck_Protocol SumSquares Sunflowers SuperCalc Suppes_Theorem Surprise_Paradox Symmetric_Polynomials Syntax_Independent_Logic Synthetic_Completeness Szemeredi_Regularity Szpilrajn TESL_Language TLA Tail_Recursive_Functions Tarskis_Geometry Taylor_Models Three_Circles Three_Squares Timed_Automata Topological_Semantics Topology TortoiseHare TsirelsonBound Transcendence_Series_Hancl_Rucki Transformer_Semantics Transition_Systems_and_Automata Transitive-Closure Transitive-Closure-II Transitive_Models Transport Treaps Tree-Automata Tree_Decomposition Tree_Enumeration Triangle Trie Turans_Graph_Theorem Twelvefold_Way Two_Generated_Word_Monoids_Intersection Tycon Types_Tableaus_and_Goedels_God Types_To_Sets_Extension UPF UPF_Firewall UTP Undirected_Graph_Theory Universal_Hash_Families Universal_Turing_Machine UpDown_Scheme VYDRA_MDL Valuation Van_Emde_Boas_Trees Van_der_Waerden VectorSpace VeriComp Verified-Prover Verified_SAT_Based_AI_Planning VerifyThis2018 VerifyThis2019 Vickrey_Clarke_Groves Virtual_Substitution VolpanoSmith WHATandWHERE_Security WOOT_Strong_Eventual_Consistency WebAssembly Weight_Balanced_Trees Weighted_Arithmetic_Geometric_Mean Weighted_Path_Order Well_Quasi_Orders Wetzels_Problem Wieferich_Kempner Winding_Number_Eval Word_Lib WorkerWrapper X86_Semantics XML Youngs_Inequality ZFC_in_HOL Zeckendorf Zeta_3_Irrational Zeta_Function pGCL Labeled_Transition_Systems Pushdown_Systems diff --git a/web/authors/eberl/index.html b/web/authors/eberl/index.html --- a/web/authors/eberl/index.html +++ b/web/authors/eberl/index.html @@ -1,976 +1,989 @@ Manuel Eberl - Archive of Formal Proofs

Manuel Eberl

ORCID logo 0000-0002-4263-6571

Homepages 🌐

E-Mails 📧

Entries

+

2024

+

2023

2022

2021

2020

2019

2018

2017

2016

2015

2014

\ No newline at end of file diff --git a/web/authors/eberl/index.xml b/web/authors/eberl/index.xml --- a/web/authors/eberl/index.xml +++ b/web/authors/eberl/index.xml @@ -1,493 +1,500 @@ eberl on Archive of Formal Proofs /authors/eberl/ Recent content in eberl on Archive of Formal Proofs Hugo -- gohugo.io en-gb - Fri, 24 Nov 2023 00:00:00 +0000 + Wed, 20 Mar 2024 00:00:00 +0000 + Continued Fractions + /entries/Continued_Fractions.html + Wed, 20 Mar 2024 00:00:00 +0000 + /entries/Continued_Fractions.html + + + Lambert Series /entries/Lambert_Series.html Fri, 24 Nov 2023 00:00:00 +0000 /entries/Lambert_Series.html The Cardinality of the Continuum /entries/Cardinality_Continuum.html Wed, 15 Nov 2023 00:00:00 +0000 /entries/Cardinality_Continuum.html The Polylogarithm Function /entries/Polylog.html Wed, 15 Nov 2023 00:00:00 +0000 /entries/Polylog.html Two theorems about the geometry of the critical points of a complex polynomial /entries/Polynomial_Crit_Geometry.html Tue, 14 Nov 2023 00:00:00 +0000 /entries/Polynomial_Crit_Geometry.html Chebyshev Polynomials /entries/Chebyshev_Polynomials.html Mon, 13 Nov 2023 00:00:00 +0000 /entries/Chebyshev_Polynomials.html Elimination of Repeated Factors Algorithm /entries/Elimination_Of_Repeated_Factors.html Mon, 06 Nov 2023 00:00:00 +0000 /entries/Elimination_Of_Repeated_Factors.html Perfect Fields /entries/Perfect_Fields.html Mon, 06 Nov 2023 00:00:00 +0000 /entries/Perfect_Fields.html Executable Randomized Algorithms /entries/Executable_Randomized_Algorithms.html Mon, 19 Jun 2023 00:00:00 +0000 /entries/Executable_Randomized_Algorithms.html The Incompatibility of Strategy-Proofness and Representation in Party-Approval Multi-Winner Elections /entries/PAPP_Impossibility.html Thu, 10 Nov 2022 00:00:00 +0000 /entries/PAPP_Impossibility.html The Hales–Jewett Theorem /entries/Hales_Jewett.html Fri, 02 Sep 2022 00:00:00 +0000 /entries/Hales_Jewett.html Pólya’s Proof of the Weighted Arithmetic–Geometric Mean Inequality /entries/Weighted_Arithmetic_Geometric_Mean.html Mon, 11 Jul 2022 00:00:00 +0000 /entries/Weighted_Arithmetic_Geometric_Mean.html The Sophomore's Dream /entries/Sophomores_Dream.html Sun, 10 Apr 2022 00:00:00 +0000 /entries/Sophomores_Dream.html A Proof from THE BOOK: The Partial Fraction Expansion of the Cotangent /entries/Cotangent_PFD_Formula.html Tue, 15 Mar 2022 00:00:00 +0000 /entries/Cotangent_PFD_Formula.html Factorization of Polynomials with Algebraic Coefficients /entries/Factor_Algebraic_Polynomial.html Mon, 08 Nov 2021 00:00:00 +0000 /entries/Factor_Algebraic_Polynomial.html Finitely Generated Abelian Groups /entries/Finitely_Generated_Abelian_Groups.html Wed, 07 Jul 2021 00:00:00 +0000 /entries/Finitely_Generated_Abelian_Groups.html Van der Waerden's Theorem /entries/Van_der_Waerden.html Tue, 22 Jun 2021 00:00:00 +0000 /entries/Van_der_Waerden.html The Hermite–Lindemann–Weierstraß Transcendence Theorem /entries/Hermite_Lindemann.html Wed, 03 Mar 2021 00:00:00 +0000 /entries/Hermite_Lindemann.html Formal Puiseux Series /entries/Formal_Puiseux_Series.html Wed, 17 Feb 2021 00:00:00 +0000 /entries/Formal_Puiseux_Series.html The Laws of Large Numbers /entries/Laws_of_Large_Numbers.html Wed, 10 Feb 2021 00:00:00 +0000 /entries/Laws_of_Large_Numbers.html Gaussian Integers /entries/Gaussian_Integers.html Fri, 24 Apr 2020 00:00:00 +0000 /entries/Gaussian_Integers.html Power Sum Polynomials /entries/Power_Sum_Polynomials.html Fri, 24 Apr 2020 00:00:00 +0000 /entries/Power_Sum_Polynomials.html The Lambert W Function on the Reals /entries/Lambert_W.html Fri, 24 Apr 2020 00:00:00 +0000 /entries/Lambert_W.html Furstenberg's topology and his proof of the infinitude of primes /entries/Furstenberg_Topology.html Sun, 22 Mar 2020 00:00:00 +0000 /entries/Furstenberg_Topology.html Mersenne primes and the Lucas–Lehmer test /entries/Mersenne_Primes.html Fri, 17 Jan 2020 00:00:00 +0000 /entries/Mersenne_Primes.html Skip Lists /entries/Skip_Lists.html Thu, 09 Jan 2020 00:00:00 +0000 /entries/Skip_Lists.html The Irrationality of ζ(3) /entries/Zeta_3_Irrational.html Fri, 27 Dec 2019 00:00:00 +0000 /entries/Zeta_3_Irrational.html Gauss Sums and the Pólya–Vinogradov Inequality /entries/Gauss_Sums.html Tue, 10 Dec 2019 00:00:00 +0000 /entries/Gauss_Sums.html Selected Problems from the International Mathematical Olympiad 2019 /entries/IMO2019.html Mon, 05 Aug 2019 00:00:00 +0000 /entries/IMO2019.html Elementary Facts About the Distribution of Primes /entries/Prime_Distribution_Elementary.html Thu, 21 Feb 2019 00:00:00 +0000 /entries/Prime_Distribution_Elementary.html Probabilistic Primality Testing /entries/Probabilistic_Prime_Tests.html Mon, 11 Feb 2019 00:00:00 +0000 /entries/Probabilistic_Prime_Tests.html The Inversions of a List /entries/List_Inversions.html Fri, 01 Feb 2019 00:00:00 +0000 /entries/List_Inversions.html Randomised Binary Search Trees /entries/Randomised_BSTs.html Fri, 19 Oct 2018 00:00:00 +0000 /entries/Randomised_BSTs.html The Transcendence of π /entries/Pi_Transcendental.html Fri, 28 Sep 2018 00:00:00 +0000 /entries/Pi_Transcendental.html Symmetric Polynomials /entries/Symmetric_Polynomials.html Tue, 25 Sep 2018 00:00:00 +0000 /entries/Symmetric_Polynomials.html The Prime Number Theorem /entries/Prime_Number_Theorem.html Wed, 19 Sep 2018 00:00:00 +0000 /entries/Prime_Number_Theorem.html Pell's Equation /entries/Pell.html Sat, 23 Jun 2018 00:00:00 +0000 /entries/Pell.html The Incompatibility of Fishburn-Strategyproofness and Pareto-Efficiency /entries/Fishburn_Impossibility.html Thu, 22 Mar 2018 00:00:00 +0000 /entries/Fishburn_Impossibility.html The Error Function /entries/Error_Function.html Tue, 06 Feb 2018 00:00:00 +0000 /entries/Error_Function.html Treaps /entries/Treaps.html Tue, 06 Feb 2018 00:00:00 +0000 /entries/Treaps.html Dirichlet L-Functions and Dirichlet's Theorem /entries/Dirichlet_L.html Thu, 21 Dec 2017 00:00:00 +0000 /entries/Dirichlet_L.html The Mason–Stothers Theorem /entries/Mason_Stothers.html Thu, 21 Dec 2017 00:00:00 +0000 /entries/Mason_Stothers.html The Median-of-Medians Selection Algorithm /entries/Median_Of_Medians_Selection.html Thu, 21 Dec 2017 00:00:00 +0000 /entries/Median_Of_Medians_Selection.html Dirichlet Series /entries/Dirichlet_Series.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Dirichlet_Series.html Linear Recurrences /entries/Linear_Recurrences.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Linear_Recurrences.html The Hurwitz and Riemann ζ Functions /entries/Zeta_Function.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Zeta_Function.html Minkowski's Theorem /entries/Minkowskis_Theorem.html Thu, 13 Jul 2017 00:00:00 +0000 /entries/Minkowskis_Theorem.html Buffon's Needle Problem /entries/Buffons_Needle.html Tue, 06 Jun 2017 00:00:00 +0000 /entries/Buffons_Needle.html Monad normalisation /entries/Monad_Normalisation.html Fri, 05 May 2017 00:00:00 +0000 /entries/Monad_Normalisation.html Expected Shape of Random Binary Search Trees /entries/Random_BSTs.html Tue, 04 Apr 2017 00:00:00 +0000 /entries/Random_BSTs.html Lower bound on comparison-based sorting algorithms /entries/Comparison_Sort_Lower_Bound.html Wed, 15 Mar 2017 00:00:00 +0000 /entries/Comparison_Sort_Lower_Bound.html The number of comparisons in QuickSort /entries/Quick_Sort_Cost.html Wed, 15 Mar 2017 00:00:00 +0000 /entries/Quick_Sort_Cost.html The Euler–MacLaurin Formula /entries/Euler_MacLaurin.html Fri, 10 Mar 2017 00:00:00 +0000 /entries/Euler_MacLaurin.html Bernoulli Numbers /entries/Bernoulli.html Tue, 24 Jan 2017 00:00:00 +0000 /entries/Bernoulli.html Bertrand's postulate /entries/Bertrands_Postulate.html Tue, 17 Jan 2017 00:00:00 +0000 /entries/Bertrands_Postulate.html The Transcendence of e /entries/E_Transcendental.html Thu, 12 Jan 2017 00:00:00 +0000 /entries/E_Transcendental.html Fisher–Yates shuffle /entries/Fisher_Yates.html Fri, 30 Sep 2016 00:00:00 +0000 /entries/Fisher_Yates.html Stirling's formula /entries/Stirling_Formula.html Thu, 01 Sep 2016 00:00:00 +0000 /entries/Stirling_Formula.html Catalan Numbers /entries/Catalan_Numbers.html Tue, 21 Jun 2016 00:00:00 +0000 /entries/Catalan_Numbers.html Randomised Social Choice Theory /entries/Randomised_Social_Choice.html Thu, 05 May 2016 00:00:00 +0000 /entries/Randomised_Social_Choice.html The Incompatibility of SD-Efficiency and SD-Strategy-Proofness /entries/SDS_Impossibility.html Wed, 04 May 2016 00:00:00 +0000 /entries/SDS_Impossibility.html Basic Geometric Properties of Triangles /entries/Triangle.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Triangle.html Descartes' Rule of Signs /entries/Descartes_Sign_Rule.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Descartes_Sign_Rule.html Liouville numbers /entries/Liouville_Numbers.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Liouville_Numbers.html The Divergence of the Prime Harmonic Series /entries/Prime_Harmonic_Series.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Prime_Harmonic_Series.html Landau Symbols /entries/Landau_Symbols.html Tue, 14 Jul 2015 00:00:00 +0000 /entries/Landau_Symbols.html The Akra-Bazzi theorem and the Master theorem /entries/Akra_Bazzi.html Tue, 14 Jul 2015 00:00:00 +0000 /entries/Akra_Bazzi.html A Verified Compiler for Probability Density Functions /entries/Density_Compiler.html Thu, 09 Oct 2014 00:00:00 +0000 /entries/Density_Compiler.html Sturm's Theorem /entries/Sturm_Sequences.html Sat, 11 Jan 2014 00:00:00 +0000 /entries/Sturm_Sequences.html diff --git a/web/authors/hupel/index.html b/web/authors/hupel/index.html --- a/web/authors/hupel/index.html +++ b/web/authors/hupel/index.html @@ -1,301 +1,314 @@ Lars Hupel - Archive of Formal Proofs \ No newline at end of file diff --git a/web/authors/hupel/index.xml b/web/authors/hupel/index.xml --- a/web/authors/hupel/index.xml +++ b/web/authors/hupel/index.xml @@ -1,108 +1,115 @@ hupel on Archive of Formal Proofs /authors/hupel/ Recent content in hupel on Archive of Formal Proofs Hugo -- gohugo.io en-gb - Mon, 14 Aug 2023 00:00:00 +0000 + Mon, 22 Jan 2024 00:00:00 +0000 + Go Code Generation for Isabelle + /entries/Go.html + Mon, 22 Jan 2024 00:00:00 +0000 + /entries/Go.html + + + Fixed-length vectors /entries/Fixed_Length_Vector.html Mon, 14 Aug 2023 00:00:00 +0000 /entries/Fixed_Length_Vector.html Hello World /entries/Hello_World.html Sat, 07 Mar 2020 00:00:00 +0000 /entries/Hello_World.html A Verified Code Generator from Isabelle/HOL to CakeML /entries/CakeML_Codegen.html Mon, 08 Jul 2019 00:00:00 +0000 /entries/CakeML_Codegen.html An Algebra for Higher-Order Terms /entries/Higher_Order_Terms.html Tue, 15 Jan 2019 00:00:00 +0000 /entries/Higher_Order_Terms.html Deriving generic class instances for datatypes /entries/Generic_Deriving.html Tue, 06 Nov 2018 00:00:00 +0000 /entries/Generic_Deriving.html CakeML /entries/CakeML.html Mon, 12 Mar 2018 00:00:00 +0000 /entries/CakeML.html Dictionary Construction /entries/Dict_Construction.html Wed, 24 May 2017 00:00:00 +0000 /entries/Dict_Construction.html Constructor Functions /entries/Constructor_Funs.html Wed, 19 Apr 2017 00:00:00 +0000 /entries/Constructor_Funs.html Lazifying case constants /entries/Lazy_Case.html Tue, 18 Apr 2017 00:00:00 +0000 /entries/Lazy_Case.html Iptables Semantics /entries/Iptables_Semantics.html Fri, 09 Sep 2016 00:00:00 +0000 /entries/Iptables_Semantics.html IP Addresses /entries/IP_Addresses.html Tue, 28 Jun 2016 00:00:00 +0000 /entries/IP_Addresses.html Algorithms for Reduced Ordered Binary Decision Diagrams /entries/ROBDD.html Wed, 27 Apr 2016 00:00:00 +0000 /entries/ROBDD.html Properties of Random Graphs -- Subgraph Containment /entries/Random_Graph_Subgraph_Threshold.html Thu, 13 Feb 2014 00:00:00 +0000 /entries/Random_Graph_Subgraph_Threshold.html diff --git a/web/authors/index.html b/web/authors/index.html --- a/web/authors/index.html +++ b/web/authors/index.html @@ -1,2049 +1,2057 @@ Archive of Formal Proofs

Authors

\ No newline at end of file diff --git a/web/authors/index.json b/web/authors/index.json --- a/web/authors/index.json +++ b/web/authors/index.json @@ -1,2397 +1,2407 @@ [ { "id": 0, "link": "/authors/abdulaziz/", "name": "Mohammad Abdulaziz" }, { "id": 1, "link": "/authors/adelsberger/", "name": "Stephan Adelsberger" }, { "id": 2, "link": "/authors/aehlig/", "name": "Klaus Aehlig" }, { "id": 3, "link": "/authors/aissat/", "name": "Romain Aissat" }, { "id": 4, "link": "/authors/amani/", "name": "Sidney Amani" }, { "id": 5, "link": "/authors/ammer/", "name": "Thomas Ammer" }, { "id": 6, "link": "/authors/andreka/", "name": "Hajnal Andreka" }, { "id": 7, "link": "/authors/andronick/", "name": "June Andronick" }, { "id": 8, "link": "/authors/aransay/", "name": "Jesús Aransay" }, { "id": 9, "link": "/authors/argyraki/", "name": "Angeliki Koutsoukou-Argyraki" }, { "id": 10, "link": "/authors/armstrong/", "name": "Alasdair Armstrong" }, { "id": 11, "link": "/authors/aspinall/", "name": "David Aspinall" }, { "id": 12, "link": "/authors/ausaf/", "name": "Fahad Ausaf" }, { "id": 13, "link": "/authors/avigad/", "name": "Jeremy Avigad" }, { "id": 14, "link": "/authors/back/", "name": "Ralph-Johan Back" }, { "id": 15, "link": "/authors/baksys/", "name": "Mantas Bakšys" }, { "id": 16, "link": "/authors/balbach/", "name": "Frank J. Balbach" }, { "id": 17, "link": "/authors/ballarin/", "name": "Clemens Ballarin" }, { "id": 18, "link": "/authors/ballenghien/", "name": "Benoît Ballenghien" }, { "id": 19, "link": "/authors/barsotti/", "name": "Damián Barsotti" }, { "id": 20, "link": "/authors/bauer/", "name": "Gertrud Bauer" }, { "id": 21, "link": "/authors/bauereiss/", "name": "Thomas Bauereiss" }, { "id": 22, "link": "/authors/bayer/", "name": "Jonas Bayer" }, { "id": 23, "link": "/authors/becker/", "name": "Heiko Becker" }, { "id": 24, "link": "/authors/beeren/", "name": "Joel Beeren" }, { "id": 25, "link": "/authors/bella/", "name": "Giampaolo Bella" }, { "id": 26, "link": "/authors/bengtson/", "name": "Jesper Bengtson" }, { "id": 27, "link": "/authors/bentkamp/", "name": "Alexander Bentkamp" }, { "id": 28, "link": "/authors/benzmueller/", "name": "Christoph Benzmüller" }, { "id": 29, "link": "/authors/beresford/", "name": "Alastair R. Beresford" }, { "id": 30, "link": "/authors/berghofer/", "name": "Stefan Berghofer" }, { "id": 31, "link": "/authors/bergstroem/", "name": "Axel Bergström" }, { "id": 32, "link": "/authors/beringer/", "name": "Lennart Beringer" }, { "id": 33, "link": "/authors/bharadwaj/", "name": "Abhijith Bharadwaj" }, { "id": 34, "link": "/authors/bhatt/", "name": "Bhargav Bhatt" }, { "id": 35, "link": "/authors/biendarra/", "name": "Julian Biendarra" }, { "id": 36, "link": "/authors/bisping/", "name": "Benjamin Bisping" }, { "id": 37, "link": "/authors/blanchette/", "name": "Jasmin Christian Blanchette" }, { "id": 38, "link": "/authors/blasum/", "name": "Holger Blasum" }, { "id": 39, "link": "/authors/blumson/", "name": "Ben Blumson" }, { "id": 40, "link": "/authors/bockenek/", "name": "Joshua Bockenek" }, { "id": 41, "link": "/authors/boehme/", "name": "Sascha Böhme" }, { "id": 42, "link": "/authors/bohrer/", "name": "Rose Bohrer" }, { "id": 43, "link": "/authors/bootle/", "name": "Jonathan Bootle" }, { "id": 44, "link": "/authors/bordg/", "name": "Anthony Bordg" }, { "id": 45, "link": "/authors/borgstroem/", "name": "Johannes Borgström" }, { "id": 46, "link": "/authors/bortin/", "name": "Maksym Bortin" }, { "id": 47, "link": "/authors/bottesch/", "name": "Ralph Bottesch" }, { "id": 48, "link": "/authors/boulanger/", "name": "Frédéric Boulanger" }, { "id": 49, "link": "/authors/bourke/", "name": "Timothy Bourke" }, { "id": 50, "link": "/authors/boutry/", "name": "Pierre Boutry" }, { "id": 51, "link": "/authors/boyton/", "name": "Andrew Boyton" }, { "id": 52, "link": "/authors/bracevac/", "name": "Oliver Bračevac" }, { "id": 53, "link": "/authors/brandt/", "name": "Felix Brandt" }, { "id": 54, "link": "/authors/breitner/", "name": "Joachim Breitner" }, { "id": 55, "link": "/authors/brien/", "name": "Nicolas Robinson-O'Brien" }, { "id": 56, "link": "/authors/brinkop/", "name": "Hauke Brinkop" }, { "id": 57, "link": "/authors/brodmann/", "name": "Paul-David Brodmann" }, { "id": 58, "link": "/authors/brucker/", "name": "Achim D. Brucker" }, { "id": 59, "link": "/authors/bruegger/", "name": "Lukas Brügger" }, { "id": 60, "link": "/authors/brun/", "name": "Matthias Brun" }, { "id": 61, "link": "/authors/brunner/", "name": "Julian Brunner" }, { "id": 62, "link": "/authors/bulwahn/", "name": "Lukas Bulwahn" }, { "id": 63, "link": "/authors/buss/", "name": "Sebastián Buss" }, { "id": 64, "link": "/authors/butler/", "name": "David Butler" }, { "id": 65, "link": "/authors/buyse/", "name": "Maxime Buyse" }, { "id": 66, "link": "/authors/caballero/", "name": "José Manuel Rodríguez Caballero" }, { "id": 67, "link": "/authors/calk/", "name": "Cameron Calk" }, { "id": 68, "link": "/authors/caminati/", "name": "Marco B. Caminati" }, { "id": 69, "link": "/authors/campo/", "name": "Alejandro del Campo" }, { "id": 70, "link": "/authors/chapman/", "name": "Peter Chapman" }, { "id": 71, "link": "/authors/chen/", "name": "L. Chen" }, { "id": 72, "link": "/authors/chenj/", "name": "Jamie Chen" }, { "id": 73, "link": "/authors/chevalier/", "name": "Loïc Chevalier" }, { "id": 74, "link": "/authors/christfort/", "name": "Axel Christfort" }, { "id": 75, "link": "/authors/clouston/", "name": "Ranald Clouston" }, { "id": 76, "link": "/authors/cock/", "name": "David Cock" }, { "id": 77, "link": "/authors/coghetto/", "name": "Roland Coghetto" }, { "id": 78, "link": "/authors/coglio/", "name": "Alessandro Coglio" }, { "id": 79, "link": "/authors/cohen/", "name": "Ernie Cohen" }, { "id": 80, "link": "/authors/cordwell/", "name": "Katherine Kosaian" }, { "id": 81, "link": "/authors/cousin/", "name": "Marie Cousin" }, { "id": 82, "link": "/authors/cremer/", "name": "Nils Cremer" }, { "id": 83, "link": "/authors/crighton/", "name": "Aaron Crighton" }, { "id": 84, "link": "/authors/dalvit/", "name": "Christian Dalvit" }, { "id": 85, "link": "/authors/danilkin/", "name": "Anton Danilkin" }, { "id": 86, "link": "/authors/dardinier/", "name": "Thibault Dardinier" }, { "id": 87, "link": "/authors/david/", "name": "Marco David" }, { "id": 88, "link": "/authors/debois/", "name": "Søren Debois" }, { "id": 89, "link": "/authors/debrat/", "name": "Henri Debrat" }, { "id": 90, "link": "/authors/decova/", "name": "Sára Decova" }, { "id": 91, "link": "/authors/delemazure/", "name": "Théo Delemazure" }, { "id": 92, "link": "/authors/demeulemeester/", "name": "Tom Demeulemeester" }, { "id": 93, "link": "/authors/derrick/", "name": "John Derrick" }, { "id": 94, "link": "/authors/desharnais/", "name": "Martin Desharnais" }, { "id": 95, "link": "/authors/diaz/", "name": "Javier Díaz" }, { "id": 96, "link": "/authors/diekmann/", "name": "Cornelius Diekmann" }, { "id": 97, "link": "/authors/dirix/", "name": "Stefan Dirix" }, { "id": 98, "link": "/authors/dittmann/", "name": "Christoph Dittmann" }, { "id": 99, "link": "/authors/divason/", "name": "Jose Divasón" }, { "id": 100, "link": "/authors/doczkal/", "name": "Christian Doczkal" }, { "id": 101, "link": "/authors/dongol/", "name": "Brijesh Dongol" }, { "id": 102, "link": "/authors/doty/", "name": "Matthew Doty" }, { "id": 103, "link": "/authors/dubut/", "name": "Jérémy Dubut" }, { "id": 104, "link": "/authors/dunaev/", "name": "Georgy Dunaev" }, { "id": 105, "link": "/authors/dyckhoff/", "name": "Roy Dyckhoff" }, { "id": 106, "link": "/authors/eberl/", "name": "Manuel Eberl" }, { "id": 107, "link": "/authors/echenim/", "name": "Mnacho Echenim" }, { "id": 108, "link": "/authors/edmonds/", "name": "Chelsea Edmonds" }, { "id": 109, "link": "/authors/engelhardt/", "name": "Kai Engelhardt" }, { "id": 110, "link": "/authors/eriksson/", "name": "Lars-Henrik Eriksson" }, { "id": 111, "link": "/authors/esparza/", "name": "Javier Esparza" }, { "id": 112, "link": "/authors/essmann/", "name": "Robin Eßmann" }, { "id": 113, "link": "/authors/felgenhauer/", "name": "Bertram Felgenhauer" }, { "id": 114, "link": "/authors/feliachi/", "name": "Abderrahmane Feliachi" }, { "id": 115, "link": "/authors/fell/", "name": "Julian Fell" }, { "id": 116, "link": "/authors/fernandez/", "name": "Matthew Fernandez" }, { "id": 117, "link": "/authors/fiedler/", "name": "Ben Fiedler" }, { "id": 118, "link": "/authors/fleuriot/", "name": "Jacques D. Fleuriot" }, { "id": 119, "link": "/authors/fleury/", "name": "Mathias Fleury" }, { "id": 120, "link": "/authors/foster/", "name": "Michael Foster" }, { "id": 121, "link": "/authors/fosterj/", "name": "J. Nathan Foster" }, { "id": 122, "link": "/authors/fosters/", "name": "Simon Foster" }, { "id": 123, "link": "/authors/fouillard/", "name": "Valentin Fouillard" }, { "id": 124, "link": "/authors/friedrich/", "name": "Stefan Friedrich" }, { "id": 125, "link": "/authors/from/", "name": "Asta Halkjær From" }, { "id": 126, "link": "/authors/fuenmayor/", "name": "David Fuenmayor" }, { "id": 127, "link": "/authors/furusawa/", "name": "Hitoshi Furusawa" }, { "id": 128, "link": "/authors/gammie/", "name": "Peter Gammie" }, { "id": 129, "link": "/authors/gao/", "name": "Xin Gao" }, { "id": 130, "link": "/authors/garvia/", "name": "Azucena Garvia" }, { "id": 131, "link": "/authors/gaudel/", "name": "Marie-Claude Gaudel" }, { "id": 132, "link": "/authors/gay/", "name": "Richard Gay" }, { "id": 133, "link": "/authors/georgescu/", "name": "George Georgescu" }, { "id": 134, "link": "/authors/gheri/", "name": "Lorenzo Gheri" }, { "id": 135, "link": "/authors/ghourabi/", "name": "Fadoua Ghourabi" }, { "id": 136, "link": "/authors/gioiosa/", "name": "Gianpaolo Gioiosa" }, { "id": 137, "link": "/authors/glabbeek/", "name": "Rob van Glabbeek" }, { "id": 138, "link": "/authors/gomes/", "name": "Victor B. F. Gomes" }, { "id": 139, "link": "/authors/gonzalez/", "name": "Edgar Gonzàlez" }, { "id": 140, "link": "/authors/gore/", "name": "Rajeev Gore" }, { "id": 141, "link": "/authors/gouezel/", "name": "Sebastien Gouezel" }, { "id": 142, "link": "/authors/grechuk/", "name": "Bogdan Grechuk" }, { "id": 143, "link": "/authors/grewe/", "name": "Sylvia Grewe" }, { "id": 144, "link": "/authors/griebel/", "name": "Simon Griebel" }, { "id": 145, "link": "/authors/grov/", "name": "Gudmund Grov" }, { "id": 146, "link": "/authors/guerraoui/", "name": "Rachid Guerraoui" }, { "id": 147, "link": "/authors/guiol/", "name": "Hervé Guiol" }, { "id": 148, "link": "/authors/gunther/", "name": "Emmanuel Gunther" }, { "id": 149, "link": "/authors/gutkovas/", "name": "Ramunas Gutkovas" }, { "id": 150, "link": "/authors/guttmann/", "name": "Walter Guttmann" }, { "id": 151, "link": "/authors/guzman/", "name": "Laura P. Gamboa Guzman" }, { "id": 152, "link": "/authors/haftmann/", "name": "Florian Haftmann" }, { "id": 153, "link": "/authors/haslbeck/", "name": "Max W. Haslbeck" }, { "id": 154, "link": "/authors/haslbeckm/", "name": "Maximilian P. L. Haslbeck" }, { "id": 155, "link": "/authors/havle/", "name": "Oto Havle" }, { "id": 156, "link": "/authors/hayes/", "name": "Ian J. Hayes" }, { "id": 157, "link": "/authors/he/", "name": "Yijun He" }, { "id": 158, "link": "/authors/heimes/", "name": "Lukas Heimes" }, { "id": 159, "link": "/authors/helke/", "name": "Steffen Helke" }, { "id": 160, "link": "/authors/hellauer/", "name": "Fabian Hellauer" }, { "id": 161, "link": "/authors/heller/", "name": "Armin Heller" }, { "id": 162, "link": "/authors/henrio/", "name": "Ludovic Henrio" }, { "id": 163, "link": "/authors/herzberg/", "name": "Michael Herzberg" }, { "id": 164, "link": "/authors/hess/", "name": "Andreas V. Hess" }, { "id": 165, "link": "/authors/hetzl/", "name": "Stefan Hetzl" }, { "id": 166, "link": "/authors/hibon/", "name": "Quentin Hibon" }, { "id": 167, "link": "/authors/higgins/", "name": "Edward Higgins" }, { "id": 168, "link": "/authors/hirata/", "name": "Michikazu Hirata" }, { "id": 169, "link": "/authors/hoefner/", "name": "Peter Höfner" }, { "id": 170, "link": "/authors/hoelzl/", "name": "Johannes Hölzl" }, { "id": 171, "link": "/authors/hofmann/", "name": "Martin Hofmann" }, { "id": 172, "link": "/authors/hofmeier/", "name": "Paul Hofmeier" }, { "id": 173, "link": "/authors/holub/", "name": "Štěpán Holub" }, { "id": 174, "link": "/authors/hosking/", "name": "Tony Hosking" }, { "id": 175, "link": "/authors/hou/", "name": "Zhe Hou" }, { "id": 176, "link": "/authors/hu/", "name": "Shuwei Hu" }, { "id": 177, "link": "/authors/huffman/", "name": "Brian Huffman" }, { "id": 178, "link": "/authors/hupel/", "name": "Lars Hupel" }, { "id": 179, "link": "/authors/ijbema/", "name": "Mark Ijbema" }, { "id": 180, "link": "/authors/immler/", "name": "Fabian Immler" }, { "id": 181, "link": "/authors/israel/", "name": "Jonas Israel" }, { "id": 182, "link": "/authors/ito/", "name": "Yosuke Ito" }, { "id": 183, "link": "/authors/iwama/", "name": "Fumiya Iwama" }, { "id": 184, "link": "/authors/jacobsen/", "name": "Frederik Krogsdal Jacobsen" }, { "id": 185, "link": "/authors/jaskelioff/", "name": "Mauro Jaskelioff" }, { "id": 186, "link": "/authors/jaskolka/", "name": "Jason Jaskolka" }, { "id": 187, "link": "/authors/jensen/", "name": "Alexander Birch Jensen" }, { "id": 188, "link": "/authors/jiang/", "name": "Nan Jiang" }, { "id": 189, "link": "/authors/jiangd/", "name": "Dongchen Jiang" }, { "id": 190, "link": "/authors/joosten/", "name": "Sebastiaan J. C. Joosten" }, { "id": 191, "link": "/authors/jungnickel/", "name": "Tim Jungnickel" }, { "id": 192, "link": "/authors/kadzioka/", "name": "Maya Kądziołka" }, { "id": 193, "link": "/authors/kaliszyk/", "name": "Cezary Kaliszyk" }, { "id": 194, "link": "/authors/kammueller/", "name": "Florian Kammüller" }, { "id": 195, "link": "/authors/kappelmann/", "name": "Kevin Kappelmann" }, { "id": 196, "link": "/authors/karayel/", "name": "Emin Karayel" }, { "id": 197, "link": "/authors/kastermans/", "name": "Bart Kastermans" }, { "id": 198, "link": "/authors/katovsky/", "name": "Alexander Katovsky" }, { "id": 199, "link": "/authors/kaufmann/", "name": "Daniela Kaufmann" }, { "id": 200, "link": "/authors/keefe/", "name": "Greg O'Keefe" }, { "id": 201, "link": "/authors/keinholz/", "name": "Jonas Keinholz" }, { "id": 202, "link": "/authors/kerber/", "name": "Manfred Kerber" }, { "id": 203, "link": "/authors/keskin/", "name": "Ata Keskin" }, { "id": 204, "link": "/authors/ketland/", "name": "Jeffrey Ketland" }, { "id": 205, "link": "/authors/kim/", "name": "Sunpill Kim" }, { "id": 206, "link": "/authors/kirchner/", "name": "Daniel Kirchner" }, { "id": 207, "link": "/authors/klein/", "name": "Gerwin Klein" }, { "id": 208, "link": "/authors/klenze/", "name": "Tobias Klenze" }, { "id": 209, "link": "/authors/kleppmann/", "name": "Martin Kleppmann" }, { "id": 210, "link": "/authors/kobayashi/", "name": "Hidetsune Kobayashi" }, { "id": 211, "link": "/authors/koerner/", "name": "Stefan Körner" }, { "id": 212, "link": "/authors/kolanski/", "name": "Rafal Kolanski" }, { "id": 213, "link": "/authors/koller/", "name": "Lukas Koller" }, { "id": 214, "link": "/authors/krauss/", "name": "Alexander Krauss" }, { "id": 215, "link": "/authors/kreuzer/", "name": "Katharina Kreuzer" }, { "id": 216, "link": "/authors/kuncak/", "name": "Viktor Kuncak" }, { "id": 217, "link": "/authors/kuncar/", "name": "Ondřej Kunčar" }, { "id": 218, "link": "/authors/kurz/", "name": "Friedrich Kurz" }, { "id": 219, "link": "/authors/lachnitt/", "name": "Hanna Lachnitt" }, { "id": 220, "link": "/authors/lallemand/", "name": "Joseph Lallemand" }, { "id": 221, "link": "/authors/lameris/", "name": "Cárolos Laméris" }, { "id": 222, "link": "/authors/lammich/", "name": "Peter Lammich" }, { "id": 223, "link": "/authors/lange/", "name": "Christoph Lange" }, { "id": 224, "link": "/authors/langenstein/", "name": "Bruno Langenstein" }, { "id": 225, "link": "/authors/lattuada/", "name": "Andrea Lattuada" }, { "id": 226, "link": "/authors/lauermann/", "name": "Nils Lauermann" }, { "id": 227, "link": "/authors/laursen/", "name": "Christian Pardillo-Laursen" }, { "id": 228, "link": "/authors/lederer/", "name": "Patrick Lederer" }, { "id": 229, "link": "/authors/lee/", "name": "Holden Lee" }, { "id": 230, "link": "/authors/leek/", "name": "Kevin Lee" }, { "id": 231, "link": "/authors/leustean/", "name": "Laurentiu Leustean" }, { "id": 232, "link": "/authors/lewis/", "name": "Corey Lewis" }, { "id": 233, "link": "/authors/li/", "name": "Wenda Li" }, { "id": 234, "link": "/authors/lim/", "name": "Japheth Lim" }, { "id": 235, "link": "/authors/lindenberg/", "name": "Christina Lindenberg" }, { "id": 236, "link": "/authors/linker/", "name": "Sven Linker" }, { "id": 237, "link": "/authors/liu/", "name": "Junyi Liu" }, { "id": 238, "link": "/authors/liut/", "name": "Tao Liu" }, { "id": 239, "link": "/authors/liuy/", "name": "Yang Liu" }, { "id": 240, "link": "/authors/liy/", "name": "Yangjia Li" }, { "id": 241, "link": "/authors/lochbihler/", "name": "Andreas Lochbihler" }, { "id": 242, "link": "/authors/lochmann/", "name": "Alexander Lochmann" }, { "id": 243, "link": "/authors/lohner/", "name": "Denis Lohner" }, { "id": 244, "link": "/authors/loibl/", "name": "Matthias Loibl" }, { "id": 245, "link": "/authors/londono/", "name": "Alejandro Gómez-Londoño" }, { "id": 246, "link": "/authors/losa/", "name": "Giuliano Losa" }, { "id": 247, "link": "/authors/lutz/", "name": "Bianca Lutz" }, { "id": 248, "link": "/authors/lux/", "name": "Alexander Lux" }, { "id": 249, "link": "/authors/madarasz/", "name": "Judit Madarasz" }, { "id": 250, "link": "/authors/makarios/", "name": "T. J. M. Makarios" }, { "id": 251, "link": "/authors/maletzky/", "name": "Alexander Maletzky" }, { "id": 252, "link": "/authors/mansky/", "name": "Susannah Mansky" }, { "id": 253, "link": "/authors/mantel/", "name": "Heiko Mantel" }, { "id": 254, "link": "/authors/margetson/", "name": "James Margetson" }, { "id": 255, "link": "/authors/maric/", "name": "Ognjen Marić" }, { "id": 256, "link": "/authors/maricf/", "name": "Filip Marić" }, { "id": 257, "link": "/authors/marmsoler/", "name": "Diego Marmsoler" }, { "id": 258, "link": "/authors/massacrier/", "name": "Tanguy Massacrier" }, { "id": 259, "link": "/authors/matache/", "name": "Cristina Matache" }, { "id": 260, "link": "/authors/mateo/", "name": "Adrián Doña Mateo" }, { "id": 261, "link": "/authors/matichuk/", "name": "Daniel Matichuk" }, { "id": 262, "link": "/authors/matiyasevich/", "name": "Yuri Matiyasevich" }, { "id": 263, "link": "/authors/maximova/", "name": "Alexandra Maximova" }, { "id": 264, "link": "/authors/meis/", "name": "Rene Meis" }, { "id": 265, "link": "/authors/merz/", "name": "Stephan Merz" }, { "id": 266, "link": "/authors/messner/", "name": "Florian Messner" }, { "id": 267, "link": "/authors/mhalla/", "name": "Mehdi Mhalla" }, { "id": 268, "link": "/authors/michaelis/", "name": "Julius Michaelis" }, { "id": 269, "link": "/authors/milehins/", "name": "Mihails Milehins" }, { "id": 270, "link": "/authors/minamide/", "name": "Yasuhiko Minamide" }, { "id": 271, "link": "/authors/mitchell/", "name": "Neil Mitchell" }, { "id": 272, "link": "/authors/mitsch/", "name": "Stefan Mitsch" }, { "id": 273, "link": "/authors/moedersheim/", "name": "Sebastian Mödersheim" }, { "id": 274, "link": "/authors/moeller/", "name": "Bernhard Möller" }, { "id": 275, "link": "/authors/montanari/", "name": "Luisa Montanari" }, { "id": 276, "link": "/authors/mori/", "name": "Coraline Mori" }, { "id": 277, "link": "/authors/muendler/", "name": "Niels Mündler" }, { "id": 278, "link": "/authors/mulligan/", "name": "Dominic P. Mulligan" }, { "id": 279, "link": "/authors/munive/", "name": "Jonathan Julian Huerta y Munive" }, { "id": 280, "link": "/authors/murao/", "name": "H. Murao" }, { "id": 281, "link": "/authors/murray/", "name": "Toby Murray" }, { "id": 282, "link": "/authors/myreen/", "name": "Magnus O. Myreen" }, { "id": 283, "link": "/authors/nagashima/", "name": "Yutaka Nagashima" }, { "id": 284, "link": "/authors/nagele/", "name": "Julian Nagele" }, { "id": 285, "link": "/authors/naraschewski/", "name": "Wolfgang Naraschewski" }, { "id": 286, "link": "/authors/nedzelsky/", "name": "Michael Nedzelsky" }, { "id": 287, "link": "/authors/nemeti/", "name": "István Németi" }, { "id": 288, "link": "/authors/nemouchi/", "name": "Yakoub Nemouchi" }, { "id": 289, "link": "/authors/nestmann/", "name": "Uwe Nestmann" }, { "id": 290, "link": "/authors/neumann/", "name": "René Neumann" }, { "id": 291, "link": "/authors/nielsen/", "name": "Finn Nielsen" }, { "id": 292, "link": "/authors/nikiforov/", "name": "Denis Nikiforov" }, { "id": 293, "link": "/authors/nipkow/", "name": "Tobias Nipkow" }, { "id": 294, "link": "/authors/nishihara/", "name": "Toshiaki Nishihara" }, { "id": 295, "link": "/authors/noce/", "name": "Pasquale Noce" }, { "id": 296, "link": "/authors/nordhoff/", "name": "Benedikt Nordhoff" }, { "id": 297, "link": "/authors/noschinski/", "name": "Lars Noschinski" }, { "id": 298, "link": "/authors/obua/", "name": "Steven Obua" }, { "id": 299, "link": "/authors/ogawa/", "name": "Mizuhito Ogawa" }, { "id": 300, "link": "/authors/oldenburg/", "name": "Lennart Oldenburg" }, { "id": 301, "link": "/authors/olm/", "name": "Markus Müller-Olm" }, { "id": 302, "link": "/authors/oosterhuis/", "name": "Roelof Oosterhuis" }, { "id": 303, "link": "/authors/oostrom/", "name": "Vincent van Oostrom" }, { "id": 304, "link": "/authors/ortner/", "name": "Veronika Ortner" }, { "id": 305, "link": "/authors/overbeek/", "name": "Roy Overbeek" }, { "id": 306, "link": "/authors/pagano/", "name": "Miguel Pagano" }, { "id": 307, "link": "/authors/pal/", "name": "Abhik Pal" }, { "id": 308, "link": "/authors/paleo/", "name": "Bruno Woltzenlogel Paleo" }, { "id": 309, "link": "/authors/palmer/", "name": "Jake Palmer" }, { "id": 310, "link": "/authors/park/", "name": "Seung Hoon Park" }, { "id": 311, "link": "/authors/parkinson/", "name": "Matthew Parkinson" }, { "id": 312, "link": "/authors/parrow/", "name": "Joachim Parrow" }, { "id": 313, "link": "/authors/parsert/", "name": "Julian Parsert" }, { "id": 314, "link": "/authors/paulson/", "name": "Lawrence C. Paulson" }, { "id": 315, "link": "/authors/peltier/", "name": "Nicolas Peltier" }, { "id": 316, "link": "/authors/peters/", "name": "Kirstin Peters" }, { "id": 317, "link": "/authors/petrovic/", "name": "Danijela Petrovic" }, { "id": 318, "link": "/authors/pierzchalski/", "name": "Edward Pierzchalski" }, { "id": 319, "link": "/authors/platzer/", "name": "André Platzer" }, { "id": 320, "link": "/authors/pohjola/", "name": "Johannes Åman Pohjola" }, { "id": 321, "link": "/authors/pollak/", "name": "Florian Pollak" }, { "id": 322, "link": "/authors/popescu/", "name": "Andrei Popescu" }, { "id": 323, "link": "/authors/porter/", "name": "Benjamin Porter" }, { "id": 324, "link": "/authors/prathamesh/", "name": "T.V.H. Prathamesh" }, { "id": 325, "link": "/authors/preoteasa/", "name": "Viorel Preoteasa" }, { "id": 326, "link": "/authors/pusch/", "name": "Cornelia Pusch" }, { "id": 327, "link": "/authors/qiu/", "name": "Qi Qiu" }, { "id": 328, "link": "/authors/rabe/", "name": "Markus N. Rabe" }, { "id": 329, "link": "/authors/rabing/", "name": "Mathias Schack Rabing" }, { "id": 330, "link": "/authors/raedle/", "name": "Jonas Rädle" }, { "id": 331, "link": "/authors/raska/", "name": "Martin Raška" }, { "id": 332, "link": "/authors/raszyk/", "name": "Martin Raszyk" }, { "id": 333, "link": "/authors/rau/", "name": "Martin Rau" }, { "id": 334, "link": "/authors/rauch/", "name": "Nicole Rauch" }, { "id": 335, "link": "/authors/raumer/", "name": "Jakob von Raumer" }, { "id": 336, "link": "/authors/ravindran/", "name": "Binoy Ravindran" }, { "id": 337, "link": "/authors/rawson/", "name": "Michael Rawson" }, { "id": 338, "link": "/authors/raya/", "name": "Rodrigo Raya" }, { "id": 339, "link": "/authors/regensburger/", "name": "Franz Regensburger" }, { "id": 340, "link": "/authors/reiche/", "name": "Sebastian Reiche" }, { "id": 341, "link": "/authors/reiter/", "name": "Markus Reiter" }, { "id": 342, "link": "/authors/reynaud/", "name": "Alban Reynaud" }, { "id": 343, "link": "/authors/ribeiro/", "name": "Pedro Ribeiro" }, { "id": 344, "link": "/authors/richter/", "name": "Stefan Richter" }, { "id": 345, "link": "/authors/rickmann/", "name": "Christina Rickmann" }, { "id": 346, "link": "/authors/ridge/", "name": "Tom Ridge" }, { "id": 347, "link": "/authors/rizaldi/", "name": "Albert Rizaldi" }, { "id": 348, "link": "/authors/rizkallah/", "name": "Christine Rizkallah" }, { "id": 349, "link": "/authors/robillard/", "name": "Simon Robillard" }, { "id": 350, "link": "/authors/roessle/", "name": "Ian Roessle" }, { "id": 351, "link": "/authors/romanos/", "name": "Ralph Romanos" }, { "id": 352, "link": "/authors/rosskopf/", "name": "Simon Roßkopf" }, { "id": 353, "link": "/authors/rowat/", "name": "Colin Rowat" }, { "id": 354, "link": "/authors/sabouret/", "name": "Nicolas Sabouret" }, { "id": 355, "link": "/authors/sachtleben/", "name": "Robert Sachtleben" }, { "id": 356, "link": "/authors/saile/", "name": "Christian Saile" }, { "id": 357, "link": "/authors/sanan/", "name": "David Sanan" }, { "id": 358, "link": "/authors/sato/", "name": "Tetsuya Sato" }, { "id": 359, "link": "/authors/sauer/", "name": "Jens Sauer" }, { "id": 360, "link": "/authors/schaeffeler/", "name": "Maximilian Schäffeler" }, { "id": 361, "link": "/authors/scharager/", "name": "Matias Scharager" }, { "id": 362, "link": "/authors/schimpf/", "name": "Alexander Schimpf" }, { "id": 363, "link": "/authors/schirmer/", "name": "Norbert Schirmer" }, { "id": 364, "link": "/authors/schleicher/", "name": "Dierk Schleicher" }, { "id": 365, "link": "/authors/schlichtkrull/", "name": "Anders Schlichtkrull" }, { "id": 366, "link": "/authors/schmaltz/", "name": "Julien Schmaltz" }, { "id": 367, "link": "/authors/schmidinger/", "name": "Lukas Schmidinger" }, { "id": 368, "link": "/authors/schmoetten/", "name": "Richard Schmoetten" }, { "id": 369, "link": "/authors/schneider/", "name": "Joshua Schneider" }, { "id": 370, "link": "/authors/schoepe/", "name": "Daniel Schoepe" }, { "id": 371, "link": "/authors/schoepf/", "name": "Jonas Schöpf" }, { "id": 372, "link": "/authors/schou/", "name": "Morten Konggaard Schou" }, { "id": 373, "link": "/authors/schulz/", "name": "Jakob Schulz" }, { "id": 374, "link": "/authors/scott/", "name": "Dana Scott" }, { "id": 375, "link": "/authors/sefidgar/", "name": "S. Reza Sefidgar" }, { "id": 376, "link": "/authors/seidl/", "name": "Benedikt Seidl" }, { "id": 377, "link": "/authors/seidler/", "name": "Henning Seidler" }, { "id": 378, "link": "/authors/sewell/", "name": "Thomas Sewell" }, { "id": 379, "link": "/authors/sickert/", "name": "Salomon Sickert" }, { "id": 380, "link": "/authors/siek/", "name": "Jeremy Siek" }, { "id": 381, "link": "/authors/simic/", "name": "Danijela Simić" }, { "id": 382, "link": "/authors/sison/", "name": "Robert Sison" }, { "id": 383, "link": "/authors/smaus/", "name": "Jan-Georg Smaus" }, { "id": 384, "link": "/authors/smola/", "name": "Filip Smola" }, { "id": 385, "link": "/authors/snelting/", "name": "Gregor Snelting" }, { "id": 386, "link": "/authors/somaini/", "name": "Ivano Somaini" }, { "id": 387, "link": "/authors/somogyi/", "name": "Dániel Somogyi" }, { "id": 388, "link": "/authors/spasic/", "name": "Mirko Spasić" }, { "id": 389, "link": "/authors/spichkova/", "name": "Maria Spichkova" }, { "id": 390, "link": "/authors/spitz/", "name": "Maximilian Spitz" }, { "id": 391, "link": "/authors/sprenger/", "name": "Christoph Sprenger" }, { "id": 392, "link": "/authors/srba/", "name": "Jiří Srba" }, { "id": 393, "link": "/authors/staats/", "name": "Charles Staats" }, { "id": 394, "link": "/authors/stannett/", "name": "Mike Stannett" }, { "id": 395, "link": "/authors/stark/", "name": "Eugene W. Stark" }, { "id": 396, "link": "/authors/starosta/", "name": "Štěpán Starosta" }, { "id": 397, "link": "/authors/steen/", "name": "Alexander Steen" }, { "id": 398, "link": "/authors/steinberg/", "name": "Matías Steinberg" }, { "id": 399, "link": "/authors/stell/", "name": "Amy Stell" }, { "id": 400, "link": "/authors/stephan/", "name": "Werner Stephan" }, { "id": 401, "link": "/authors/sternagel/", "name": "Christian Sternagel" }, { "id": 402, "link": "/authors/sternagelt/", "name": "Thomas Sternagel" }, { "id": 403, "link": "/authors/stevens/", "name": "Lukas Stevens" }, { "id": 404, "link": "/authors/stock/", "name": "Benedikt Stock" }, { "id": 405, "link": "/authors/stoeckl/", "name": "Bernhard Stöckl" }, { "id": 406, "link": "/authors/stricker/", "name": "Christian Stricker" }, { "id": 407, "link": "/authors/strnisa/", "name": "Rok Strniša" }, { "id": 408, "link": "/authors/struth/", "name": "Georg Struth" }, { "id": 409, "link": "/authors/stueber/", "name": "Anke Stüber" }, { "id": 410, - "link": "/authors/stuewe/", - "name": "Daniel Stüwe" + "link": "/authors/stuebinger/", + "name": "Terru Stübinger" }, { "id": 411, - "link": "/authors/sudbrock/", - "name": "Henning Sudbrock" + "link": "/authors/stuewe/", + "name": "Daniel Stüwe" }, { "id": 412, - "link": "/authors/sudhof/", - "name": "Henry Sudhof" + "link": "/authors/sudbrock/", + "name": "Henning Sudbrock" }, { "id": 413, - "link": "/authors/sulejmani/", - "name": "Ujkan Sulejmani" + "link": "/authors/sudhof/", + "name": "Henry Sudhof" }, { "id": 414, - "link": "/authors/sutcliffe/", - "name": "Geoff Sutcliffe" + "link": "/authors/sulejmani/", + "name": "Ujkan Sulejmani" }, { "id": 415, - "link": "/authors/sylvestre/", - "name": "Jeremy Sylvestre" + "link": "/authors/sutcliffe/", + "name": "Geoff Sutcliffe" }, { "id": 416, - "link": "/authors/szekely/", - "name": "Gergely Szekely" + "link": "/authors/sylvestre/", + "name": "Jeremy Sylvestre" }, { "id": 417, - "link": "/authors/taha/", - "name": "Safouan Taha" + "link": "/authors/szekely/", + "name": "Gergely Szekely" }, { "id": 418, - "link": "/authors/tan/", - "name": "Yong Kiam Tan" + "link": "/authors/taha/", + "name": "Safouan Taha" }, { "id": 419, - "link": "/authors/tanaka/", - "name": "Miki Tanaka" + "link": "/authors/tan/", + "name": "Yong Kiam Tan" }, { "id": 420, - "link": "/authors/tasch/", - "name": "Markus Tasch" + "link": "/authors/tanaka/", + "name": "Miki Tanaka" }, { "id": 421, - "link": "/authors/taylor/", - "name": "Ramsay G. Taylor" + "link": "/authors/tasch/", + "name": "Markus Tasch" }, { "id": 422, - "link": "/authors/terraf/", - "name": "Pedro Sánchez Terraf" + "link": "/authors/taylor/", + "name": "Ramsay G. Taylor" }, { "id": 423, - "link": "/authors/thiemann/", - "name": "René Thiemann" + "link": "/authors/terraf/", + "name": "Pedro Sánchez Terraf" }, { "id": 424, - "link": "/authors/thommes/", - "name": "Joseph Thommes" + "link": "/authors/thiemann/", + "name": "René Thiemann" }, { "id": 425, - "link": "/authors/thomson/", - "name": "Fox Thomson" + "link": "/authors/thommes/", + "name": "Joseph Thommes" }, { "id": 426, - "link": "/authors/tiu/", - "name": "Alwen Tiu" + "link": "/authors/thomson/", + "name": "Fox Thomson" }, { "id": 427, - "link": "/authors/toth/", - "name": "Balazs Toth" + "link": "/authors/tiu/", + "name": "Alwen Tiu" }, { "id": 428, - "link": "/authors/tourret/", - "name": "Sophie Tourret" + "link": "/authors/toth/", + "name": "Balazs Toth" }, { "id": 429, - "link": "/authors/trachtenherz/", - "name": "David Trachtenherz" + "link": "/authors/tourret/", + "name": "Sophie Tourret" }, { "id": 430, - "link": "/authors/traut/", - "name": "Christoph Traut" + "link": "/authors/trachtenherz/", + "name": "David Trachtenherz" }, { "id": 431, - "link": "/authors/traytel/", - "name": "Dmitriy Traytel" + "link": "/authors/traut/", + "name": "Christoph Traut" }, { "id": 432, - "link": "/authors/trelat/", - "name": "Vincent Trélat" + "link": "/authors/traytel/", + "name": "Dmitriy Traytel" }, { "id": 433, - "link": "/authors/tuong/", - "name": "Frédéric Tuong" + "link": "/authors/trelat/", + "name": "Vincent Trélat" }, { "id": 434, - "link": "/authors/tuongj/", - "name": "Joseph Tuong" + "link": "/authors/tuong/", + "name": "Frédéric Tuong" }, { "id": 435, - "link": "/authors/tverdyshev/", - "name": "Sergey Tverdyshev" + "link": "/authors/tuongj/", + "name": "Joseph Tuong" }, { "id": 436, - "link": "/authors/ullrich/", - "name": "Sebastian Ullrich" + "link": "/authors/tverdyshev/", + "name": "Sergey Tverdyshev" }, { "id": 437, - "link": "/authors/unruh/", - "name": "Dominique Unruh" + "link": "/authors/ullrich/", + "name": "Sebastian Ullrich" }, { "id": 438, - "link": "/authors/urban/", - "name": "Christian Urban" + "link": "/authors/unruh/", + "name": "Dominique Unruh" }, { "id": 439, - "link": "/authors/van/", - "name": "Hai Nguyen Van" + "link": "/authors/urban/", + "name": "Christian Urban" }, { "id": 440, - "link": "/authors/velykis/", - "name": "Andrius Velykis" + "link": "/authors/van/", + "name": "Hai Nguyen Van" }, { "id": 441, - "link": "/authors/verbeek/", - "name": "Freek Verbeek" + "link": "/authors/velykis/", + "name": "Andrius Velykis" }, { "id": 442, - "link": "/authors/villadsen/", - "name": "Jørgen Villadsen" + "link": "/authors/verbeek/", + "name": "Freek Verbeek" }, { "id": 443, - "link": "/authors/voisin/", - "name": "Frederic Voisin" + "link": "/authors/villadsen/", + "name": "Jørgen Villadsen" }, { "id": 444, - "link": "/authors/vytiniotis/", - "name": "Dimitrios Vytiniotis" + "link": "/authors/voisin/", + "name": "Frederic Voisin" }, { "id": 445, - "link": "/authors/wagner/", - "name": "Max Wagner" + "link": "/authors/vytiniotis/", + "name": "Dimitrios Vytiniotis" }, { "id": 446, - "link": "/authors/waldmann/", - "name": "Uwe Waldmann" + "link": "/authors/wagner/", + "name": "Max Wagner" }, { "id": 447, - "link": "/authors/wand/", - "name": "Daniel Wand" + "link": "/authors/waldmann/", + "name": "Uwe Waldmann" }, { "id": 448, - "link": "/authors/wang/", - "name": "Shuling Wang" + "link": "/authors/wand/", + "name": "Daniel Wand" }, { "id": 449, - "link": "/authors/wassell/", - "name": "Mark Wassell" + "link": "/authors/wang/", + "name": "Shuling Wang" }, { "id": 450, - "link": "/authors/wasserrab/", - "name": "Daniel Wasserrab" + "link": "/authors/wassell/", + "name": "Mark Wassell" }, { "id": 451, - "link": "/authors/watt/", - "name": "Conrad Watt" + "link": "/authors/wasserrab/", + "name": "Daniel Wasserrab" }, { "id": 452, - "link": "/authors/weber/", - "name": "Tjark Weber" + "link": "/authors/watt/", + "name": "Conrad Watt" }, { "id": 453, - "link": "/authors/weerwag/", - "name": "Timmy Weerwag" + "link": "/authors/weber/", + "name": "Tjark Weber" }, { "id": 454, - "link": "/authors/weidner/", - "name": "Arno Wilhelm-Weidner" + "link": "/authors/weerwag/", + "name": "Timmy Weerwag" }, { "id": 455, - "link": "/authors/wenninger/", - "name": "Elias Wenninger" + "link": "/authors/weidner/", + "name": "Arno Wilhelm-Weidner" }, { "id": 456, - "link": "/authors/wenzel/", - "name": "Makarius Wenzel" + "link": "/authors/wenninger/", + "name": "Elias Wenninger" }, { "id": 457, - "link": "/authors/whitley/", - "name": "A Whitley" + "link": "/authors/wenzel/", + "name": "Makarius Wenzel" }, { "id": 458, - "link": "/authors/wickerson/", - "name": "John Wickerson" + "link": "/authors/whitley/", + "name": "A Whitley" }, { "id": 459, - "link": "/authors/willenbrink/", - "name": "Sebastian Willenbrink" + "link": "/authors/wickerson/", + "name": "John Wickerson" }, { "id": 460, - "link": "/authors/wimmer/", - "name": "Simon Wimmer" + "link": "/authors/willenbrink/", + "name": "Sebastian Willenbrink" }, { "id": 461, - "link": "/authors/wirt/", - "name": "Kai Wirt" + "link": "/authors/wimmer/", + "name": "Simon Wimmer" }, { "id": 462, - "link": "/authors/wolff/", - "name": "Burkhart Wolff" + "link": "/authors/wirt/", + "name": "Kai Wirt" }, { "id": 463, - "link": "/authors/wu/", - "name": "Chunhan Wu" + "link": "/authors/wolff/", + "name": "Burkhart Wolff" }, { "id": 464, - "link": "/authors/xu/", - "name": "Jian Xu" + "link": "/authors/wu/", + "name": "Chunhan Wu" }, { "id": 465, - "link": "/authors/yamada/", - "name": "Akihisa Yamada" + "link": "/authors/xu/", + "name": "Jian Xu" }, { "id": 466, - "link": "/authors/ye/", - "name": "Lina Ye" + "link": "/authors/yamada/", + "name": "Akihisa Yamada" }, { "id": 467, - "link": "/authors/yez/", - "name": "Zhengkun Ye" + "link": "/authors/yang/", + "name": "Jiong Yang" }, { "id": 468, - "link": "/authors/ying/", - "name": "Shenggang Ying" + "link": "/authors/ye/", + "name": "Lina Ye" }, { "id": 469, - "link": "/authors/yingm/", - "name": "Mingsheng Ying" + "link": "/authors/yez/", + "name": "Zhengkun Ye" }, { "id": 470, - "link": "/authors/yu/", - "name": "Lei Yu" + "link": "/authors/ying/", + "name": "Shenggang Ying" }, { "id": 471, - "link": "/authors/zankl/", - "name": "Harald Zankl" + "link": "/authors/yingm/", + "name": "Mingsheng Ying" }, { "id": 472, - "link": "/authors/zee/", - "name": "Karen Zee" + "link": "/authors/yu/", + "name": "Lei Yu" }, { "id": 473, - "link": "/authors/zeller/", - "name": "Peter Zeller" + "link": "/authors/zankl/", + "name": "Harald Zankl" }, { "id": 474, - "link": "/authors/zeyda/", - "name": "Frank Zeyda" + "link": "/authors/zee/", + "name": "Karen Zee" }, { "id": 475, - "link": "/authors/zhan/", - "name": "Bohua Zhan" + "link": "/authors/zeller/", + "name": "Peter Zeller" }, { "id": 476, - "link": "/authors/zhang/", - "name": "Yu Zhang" + "link": "/authors/zeyda/", + "name": "Frank Zeyda" }, { "id": 477, - "link": "/authors/zhangx/", - "name": "Xingyuan Zhang" + "link": "/authors/zhan/", + "name": "Bohua Zhan" }, { "id": 478, + "link": "/authors/zhang/", + "name": "Yu Zhang" + }, + { + "id": 479, + "link": "/authors/zhangx/", + "name": "Xingyuan Zhang" + }, + { + "id": 480, "link": "/authors/zhann/", "name": "Naijun Zhan" } ] \ No newline at end of file diff --git a/web/authors/stuebinger/index.html b/web/authors/stuebinger/index.html new file mode 100644 --- /dev/null +++ b/web/authors/stuebinger/index.html @@ -0,0 +1,148 @@ + + + + + + + Terru Stübinger - Archive of Formal Proofs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+

+ Terru Stübinger + +

+
+
+
+
+ + + ORCID logo + 0009-0006-7411-2533 + +

Homepages 🌐

+ + +

Entries

+

2024

+ + +
+
+ + \ No newline at end of file diff --git a/web/authors/stuebinger/index.xml b/web/authors/stuebinger/index.xml new file mode 100644 --- /dev/null +++ b/web/authors/stuebinger/index.xml @@ -0,0 +1,24 @@ + + + + stuebinger on Archive of Formal Proofs + + /authors/stuebinger/ + + Recent content in stuebinger + on Archive of Formal Proofs + + Hugo -- gohugo.io + en-gb + + Mon, 22 Jan 2024 00:00:00 +0000 + + + Go Code Generation for Isabelle + /entries/Go.html + Mon, 22 Jan 2024 00:00:00 +0000 + /entries/Go.html + + + + diff --git a/web/authors/tan/index.html b/web/authors/tan/index.html --- a/web/authors/tan/index.html +++ b/web/authors/tan/index.html @@ -1,202 +1,215 @@ Yong Kiam Tan - Archive of Formal Proofs \ No newline at end of file diff --git a/web/authors/tan/index.xml b/web/authors/tan/index.xml --- a/web/authors/tan/index.xml +++ b/web/authors/tan/index.xml @@ -1,52 +1,59 @@ tan on Archive of Formal Proofs /authors/tan/ Recent content in tan on Archive of Formal Proofs Hugo -- gohugo.io en-gb - Mon, 13 Nov 2023 00:00:00 +0000 + Fri, 15 Mar 2024 00:00:00 +0000 + Approximate Model Counting + /entries/Approximate_Model_Counting.html + Fri, 15 Mar 2024 00:00:00 +0000 + /entries/Approximate_Model_Counting.html + + + Concentration Inequalities /entries/Concentration_Inequalities.html Mon, 13 Nov 2023 00:00:00 +0000 /entries/Concentration_Inequalities.html The Schwartz-Zippel Lemma /entries/Schwartz_Zippel.html Thu, 27 Apr 2023 00:00:00 +0000 /entries/Schwartz_Zippel.html A First Complete Algorithm for Real Quantifier Elimination in Isabelle/HOL /entries/Quantifier_Elimination_Hybrid.html Thu, 15 Dec 2022 00:00:00 +0000 /entries/Quantifier_Elimination_Hybrid.html The BKR Decision Procedure for Univariate Real Arithmetic /entries/BenOr_Kozen_Reif.html Sat, 24 Apr 2021 00:00:00 +0000 /entries/BenOr_Kozen_Reif.html The Poincaré-Bendixson Theorem /entries/Poincare_Bendixson.html Wed, 18 Dec 2019 00:00:00 +0000 /entries/Poincare_Bendixson.html diff --git a/web/authors/yang/index.html b/web/authors/yang/index.html new file mode 100644 --- /dev/null +++ b/web/authors/yang/index.html @@ -0,0 +1,148 @@ + + + + + + + Jiong Yang - Archive of Formal Proofs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+

+ Jiong Yang + +

+
+
+
+
+ +

E-Mails 📧

+ + +

Entries

+

2024

+ + +
+
+ + \ No newline at end of file diff --git a/web/authors/yang/index.xml b/web/authors/yang/index.xml new file mode 100644 --- /dev/null +++ b/web/authors/yang/index.xml @@ -0,0 +1,24 @@ + + + + yang on Archive of Formal Proofs + + /authors/yang/ + + Recent content in yang + on Archive of Formal Proofs + + Hugo -- gohugo.io + en-gb + + Fri, 15 Mar 2024 00:00:00 +0000 + + + Approximate Model Counting + /entries/Approximate_Model_Counting.html + Fri, 15 Mar 2024 00:00:00 +0000 + /entries/Approximate_Model_Counting.html + + + + diff --git a/web/data/keywords.json b/web/data/keywords.json --- a/web/data/keywords.json +++ b/web/data/keywords.json @@ -1,6577 +1,6604 @@ [{"keyword": "-automata states"}, {"keyword": "-dimensional cube"}, +{"keyword": "-factor approximation"}, {"keyword": "-free higher-order terms"}, {"keyword": "0-1-2-principle"}, {"keyword": "1 delta cdots delta"}, {"keyword": "1 infty"}, {"keyword": "1 infty frac"}, {"keyword": "1 infty left"}, {"keyword": "1 infty sigma_ alpha"}, {"keyword": "1 involving"}, {"keyword": "1 javier esparza"}, {"keyword": "1 n-1 frac b_"}, {"keyword": "1 polygonal numbers"}, {"keyword": "1007 978-3-030-90138-7_2"}, {"keyword": "1093 logcom exad013"}, {"keyword": "10th problem"}, {"keyword": "128bit words"}, {"keyword": "13 binary relations"}, {"keyword": "16th international symposium"}, {"keyword": "18th century"}, {"keyword": "19th century number theory"}, {"keyword": "19th international symposium"}, {"keyword": "2 rsa laboratories"}, {"keyword": "2 scalar product"}, {"keyword": "2-kleene algebras"}, {"keyword": "2022 lecture notes"}, {"keyword": "22nd formal methods"}, {"keyword": "253--269 cpp-2016 peter lammich"}, {"keyword": "2nd international workshop"}, {"keyword": "3-term arithmetic progressions"}, {"keyword": "32-bit signed word"}, {"keyword": "32bit machine words"}, {"keyword": "34th ifip international conference"}, {"keyword": "3rd edition"}, {"keyword": "45th theorem"}, {"keyword": "55th theorem"}, {"keyword": "5th postulate"}, {"keyword": "64-bit bases"}, {"keyword": "8th event"}, {"keyword": "9th international joint conference"}, {"keyword": "a-priori bound"}, {"keyword": "a-priori detect"}, {"keyword": "a_1 ldots a_n"}, {"keyword": "a_n leq tfrac 1"}, {"keyword": "ab leq int_0"}, {"keyword": "abc"}, {"keyword": "abductive reasoning"}, {"keyword": "abelian group"}, {"keyword": "abortable linearizable module automaton"}, {"keyword": "abrupt termination"}, {"keyword": "absolute positiveness"}, {"keyword": "abstract academic models"}, {"keyword": "abstract algebra"}, {"keyword": "abstract algebraic structure satisfying"}, {"keyword": "abstract algorithm working"}, {"keyword": "abstract algorithms closely"}, {"keyword": "abstract automata types"}, {"keyword": "abstract bnfccs similar"}, {"keyword": "abstract cfg"}, {"keyword": "abstract characterization"}, {"keyword": "abstract compiler working"}, {"keyword": "abstract completeness theories"}, {"keyword": "abstract convergence theorem"}, {"keyword": "abstract cryptography"}, {"keyword": "abstract data structures"}, {"keyword": "abstract data type"}, {"keyword": "abstract datatypes"}, {"keyword": "abstract execution model"}, {"keyword": "abstract file represented"}, {"keyword": "abstract first-order prover"}, {"keyword": "abstract formalization"}, {"keyword": "abstract functions modelled directly"}, {"keyword": "abstract hilbert-style"}, {"keyword": "abstract interface"}, {"keyword": "abstract interpreter operate"}, {"keyword": "abstract ledger supporting"}, {"keyword": "abstract level"}, {"keyword": "abstract objects"}, {"keyword": "abstract objects theory"}, {"keyword": "abstract perspective enables"}, {"keyword": "abstract program"}, {"keyword": "abstract proof"}, {"keyword": "abstract property"}, {"keyword": "abstract reasoning"}, {"keyword": "abstract reference specification"}, {"keyword": "abstract representation"}, {"keyword": "abstract results"}, {"keyword": "abstract rewrite system"}, {"keyword": "abstract rewriting"}, {"keyword": "abstract separation algebra"}, {"keyword": "abstract separation logic"}, {"keyword": "abstract simplicial complexes"}, {"keyword": "abstract soundness"}, {"keyword": "abstract space"}, {"keyword": "abstract specification"}, {"keyword": "abstract structures"}, {"keyword": "abstract syntax"}, {"keyword": "abstract syntax tree generated"}, {"keyword": "abstract theory"}, {"keyword": "abstract time domain"}, {"keyword": "abstract transition system context"}, {"keyword": "abstract type"}, {"keyword": "abstract version"}, {"keyword": "academic partners"}, {"keyword": "academic press"}, {"keyword": "acceptance rejection decisions"}, {"keyword": "accepted languages coincide"}, {"keyword": "access windows"}, {"keyword": "accessed independently"}, {"keyword": "accesses memory locations"}, {"keyword": "accessibility decisions affecting"}, {"keyword": "accommodates partial functions"}, {"keyword": "accommodating arbitrary nominal datatypes"}, {"keyword": "accompanying algebraic laws"}, {"keyword": "accompanying formalisation"}, {"keyword": "accompanying induction invariant rules"}, {"keyword": "accompanying paper"}, {"keyword": "accompanying paper 2"}, {"keyword": "achieve bottom-"}, {"keyword": "achieve compositionality"}, {"keyword": "achieve consensus"}, {"keyword": "achieve high expressiveness"}, {"keyword": "achieving linear time"}, {"keyword": "active domain"}, {"keyword": "active research topic"}, {"keyword": "actual executions"}, {"keyword": "actual sets"}, {"keyword": "actuarial mathematics"}, {"keyword": "ad-hoc approaches"}, {"keyword": "adam betts"}, {"keyword": "adam smith"}, {"keyword": "adapt ctl"}, {"keyword": "adapted deterministic"}, {"keyword": "adapted versions"}, {"keyword": "adapting larry paulson"}, {"keyword": "adaptive state counting"}, {"keyword": "adaptive state counting algorithm"}, {"keyword": "adaptive test cases"}, {"keyword": "added formalisations"}, {"keyword": "adding definitions"}, {"keyword": "adding knuth"}, {"keyword": "adding observation instants"}, {"keyword": "addition theorem"}, {"keyword": "additional assumptions needed"}, {"keyword": "additional control flow analysis"}, {"keyword": "additional convenience"}, {"keyword": "additional domain elements"}, {"keyword": "additional effort"}, {"keyword": "additional extensions"}, {"keyword": "additional indeterminate"}, {"keyword": "additional iteration laws"}, {"keyword": "additional non-deterministic choice command"}, {"keyword": "additional notions"}, {"keyword": "additional operations"}, {"keyword": "additional operations subject"}, {"keyword": "additional password"}, {"keyword": "additional properties related"}, {"keyword": "additional relations"}, {"keyword": "additional results"}, {"keyword": "additional theorems"}, {"keyword": "additional theory"}, {"keyword": "additive combinatorics"}, {"keyword": "additive combinatorics due"}, {"keyword": "additive secret sharing scheme"}, {"keyword": "additive subgroup"}, {"keyword": "additively idempotent semirings"}, {"keyword": "adequacy proof"}, {"keyword": "adjoint functors"}, {"keyword": "adjoint functors preserve limits"}, {"keyword": "adjunctions"}, {"keyword": "advanced algorithms"}, {"keyword": "advanced binding constructs"}, {"keyword": "advanced replacement"}, {"keyword": "advanced results"}, {"keyword": "advanced set-theoretic concepts"}, {"keyword": "affect execution time"}, {"keyword": "affine arithmetic"}, {"keyword": "affine scheme"}, {"keyword": "affine systems"}, {"keyword": "aforementioned consensus problem"}, {"keyword": "aforementioned mathematical structures"}, {"keyword": "aforesaid task"}, {"keyword": "afp"}, {"keyword": "afp article amortized complexity"}, {"keyword": "afp article monadification"}, {"keyword": "afp entries"}, {"keyword": "afp entries goedel_hfset_semantic"}, {"keyword": "afp entry"}, {"keyword": "afp entry abstract completeness"}, {"keyword": "afp entry accessible"}, {"keyword": "afp entry amortized complexity"}, {"keyword": "afp entry bnf operations"}, {"keyword": "afp entry category theory"}, {"keyword": "afp entry complex geometry"}, {"keyword": "afp entry core dom"}, {"keyword": "afp entry discrete summation"}, {"keyword": "afp entry dom_components"}, {"keyword": "afp entry dynamic architectures"}, {"keyword": "afp entry eval_fo"}, {"keyword": "afp entry focusstreamscasestudies-afp"}, {"keyword": "afp entry implements"}, {"keyword": "afp entry metatheory"}, {"keyword": "afp entry ordered_resultion_prover"}, {"keyword": "afp entry robinson_arithmetic"}, {"keyword": "afp entry saturation_framework"}, {"keyword": "afp entry simple_firewall"}, {"keyword": "afp package"}, {"keyword": "afp representation"}, {"keyword": "agm operators"}, {"keyword": "ahmed bouajjani"}, {"keyword": "aircraft cabin data network"}, {"keyword": "akra-bazzi method based"}, {"keyword": "akra-bazzi theorem"}, {"keyword": "alain aspect"}, {"keyword": "albeit translated"}, {"keyword": "alberto griggio"}, {"keyword": "alexander birch jensen"}, {"keyword": "alexander wenner"}, {"keyword": "algebra universalis"}, {"keyword": "algebraic"}, {"keyword": "algebraic approach"}, {"keyword": "algebraic closure"}, {"keyword": "algebraic confluence proofs"}, {"keyword": "algebraic formalization end"}, {"keyword": "algebraic framework"}, {"keyword": "algebraic geometry"}, {"keyword": "algebraic geometry culminating"}, {"keyword": "algebraic hierarchy"}, {"keyword": "algebraic laws"}, {"keyword": "algebraic manipulations"}, {"keyword": "algebraic number executable"}, {"keyword": "algebraic number implementation"}, {"keyword": "algebraic numbers"}, {"keyword": "algebraic numbers beta_1"}, {"keyword": "algebraic point"}, {"keyword": "algebraic proof"}, {"keyword": "algebraic semantics"}, {"keyword": "algebraic setting"}, {"keyword": "algebraic structure"}, {"keyword": "algebraic structures based"}, {"keyword": "algebraically closed"}, {"keyword": "algebraically closed field"}, {"keyword": "algebraically independent"}, {"keyword": "algebras based"}, {"keyword": "algorithm"}, {"keyword": "algorithm aims"}, {"keyword": "algorithm decodes correctly"}, {"keyword": "algorithm enumerates rooted"}, {"keyword": "algorithm enumerating"}, {"keyword": "algorithm factors polynomials"}, {"keyword": "algorithm generates posix"}, {"keyword": "algorithm meets schneider"}, {"keyword": "algorithm multiple times independently"}, {"keyword": "algorithm proceeds"}, {"keyword": "algorithm tolerates"}, {"keyword": "algorithm top-"}, +{"keyword": "algorithmic specification"}, {"keyword": "algorithms computing"}, {"keyword": "all-pairs shortest path problem"}, {"keyword": "all-pairs shortest paths problem"}, {"keyword": "allocation function allocates goods"}, {"keyword": "allowed accesses"}, {"keyword": "allowed nominals"}, {"keyword": "allowing formal reasoning"}, {"keyword": "alpern"}, {"keyword": "alpha"}, {"keyword": "alpha-equivalence classes"}, {"keyword": "alpha_1 ldots beta_n"}, {"keyword": "alphabet letters"}, {"keyword": "alphabetised relational calculus"}, {"keyword": "alternate binomial theorem statement"}, {"keyword": "alternating structure"}, {"keyword": "alternative definition"}, {"keyword": "alternative interface"}, {"keyword": "alternative interpretation"}, {"keyword": "alternative proof"}, {"keyword": "alternative version"}, {"keyword": "alternatives"}, {"keyword": "alwen tiu"}, {"keyword": "amicable numbers"}, {"keyword": "amir hossein parvardi"}, {"keyword": "amortized complexity"}, {"keyword": "amortized logarithmic complexity"}, {"keyword": "amortized time complexity"}, {"keyword": "ample set condition"}, {"keyword": "analogous languages"}, {"keyword": "analogous problem arises"}, {"keyword": "analyse system structure oriented"}, {"keyword": "analysing replication algorithms"}, {"keyword": "analytic combinatorics"}, {"keyword": "analytic completeness proof covers"}, {"keyword": "analytic continuation"}, {"keyword": "analytic dirichlet series"}, {"keyword": "analytic function"}, {"keyword": "analytic number theory"}, {"keyword": "analytic number theory rdquo"}, {"keyword": "analytic proof"}, {"keyword": "analytical arguments"}, {"keyword": "analyze similar algorithms"}, {"keyword": "analyze sufficient conditions"}, {"keyword": "analyzed firewall mdash"}, {"keyword": "ancient greek philosopher eudoxus"}, {"keyword": "anders schlichtkrull"}, {"keyword": "andr platzer"}, {"keyword": "andrei popescu"}, {"keyword": "andrei popescu propose"}, {"keyword": "angelic nondeterministic choices"}, {"keyword": "angles requires solving"}, {"keyword": "annotated commands"}, {"keyword": "anonymous social choice function"}, {"keyword": "appearing numbers"}, {"keyword": "application"}, {"keyword": "application areas"}, {"keyword": "application consumes potential"}, {"keyword": "application programming interface"}, {"keyword": "application scenarios"}, {"keyword": "applications ranging"}, {"keyword": "applications refer"}, {"keyword": "applicative expressions"}, {"keyword": "applicative functor"}, {"keyword": "applicative functors augment computations"}, {"keyword": "applied call-by-"}, {"keyword": "applied non-classical logics 2005"}, {"keyword": "applied relativization"}, {"keyword": "applies induction"}, {"keyword": "apply andy pitts"}, {"keyword": "apply data refinement"}, {"keyword": "apply expander graphs"}, {"keyword": "applying sturm"}, {"keyword": "approach"}, {"keyword": "approach decomposes ltl formulas"}, {"keyword": "approach demonstrates"}, {"keyword": "approach enables easy links"}, {"keyword": "approach preservers"}, {"keyword": "approach produced"}, {"keyword": "approach supports reachability goals"}, {"keyword": "approval ballots"}, {"keyword": "approve multiple parties"}, +{"keyword": "approximate model counting"}, {"keyword": "approximating real roots"}, {"keyword": "approximation algorithm"}, {"keyword": "approximation error"}, {"keyword": "approximation polynomial based"}, {"keyword": "approximation quality solely depends"}, {"keyword": "approximation ratio"}, {"keyword": "approximative version"}, {"keyword": "arbitrarily large girth"}, {"keyword": "arbitrary banach space"}, {"keyword": "arbitrary banach spaces equipped"}, {"keyword": "arbitrary classes"}, {"keyword": "arbitrary data"}, {"keyword": "arbitrary dimension"}, {"keyword": "arbitrary events"}, {"keyword": "arbitrary fields"}, {"keyword": "arbitrary higher-order contexts"}, {"keyword": "arbitrary infinite proofs"}, {"keyword": "arbitrary intervals"}, {"keyword": "arbitrary length"}, {"keyword": "arbitrary linear order"}, {"keyword": "arbitrary linearly-ordered integrity domains"}, {"keyword": "arbitrary natural sets"}, {"keyword": "arbitrary network topologies"}, {"keyword": "arbitrary nominal sets"}, {"keyword": "arbitrary number"}, {"keyword": "arbitrary rc query"}, {"keyword": "arbitrary ring"}, {"keyword": "arbitrary security lattices"}, {"keyword": "arbitrary sets"}, {"keyword": "arbitrary size"}, {"keyword": "arbitrary transition systems"}, {"keyword": "arbitrary uniform distributions"}, {"keyword": "arbitrary univariate polynomials"}, {"keyword": "arbitrary user"}, {"keyword": "arbitrary user-"}, {"keyword": "architectural design patterns"}, {"keyword": "architectural operators"}, {"keyword": "arctic interpretations"}, {"keyword": "arctic semirings satisfy"}, {"keyword": "argument"}, {"keyword": "argument functions"}, {"keyword": "arithmetic logical operations"}, {"keyword": "arithmetic progression"}, {"keyword": "arithmetic type class hierarchy"}, {"keyword": "arithmetize register machines"}, {"keyword": "array operations seamlessly integrate"}, {"keyword": "array shuffling protocol"}, {"keyword": "arrow composition --"}, {"keyword": "arrow-debreu model"}, {"keyword": "art formal verification methods"}, {"keyword": "article"}, {"keyword": "article added additional material"}, {"keyword": "article added material"}, {"keyword": "article attempts"}, {"keyword": "article barbin-le rest"}, {"keyword": "article builds"}, {"keyword": "article collects formalisations"}, {"keyword": "article knight"}, {"keyword": "article set-theoretical foundations"}, {"keyword": "article titled"}, {"keyword": "articles ai-communications aic764"}, {"keyword": "artificial general intelligence"}, {"keyword": "artificial intelligence"}, {"keyword": "ascending priority"}, {"keyword": "aspect obtained experimentally"}, {"keyword": "assembly-to-machine step"}, {"keyword": "assertion failure"}, {"keyword": "assertion semantics unifies semantic"}, {"keyword": "assertoric syllogistic"}, {"keyword": "assigned multiple seats"}, {"keyword": "association lists"}, {"keyword": "associative lists"}, {"keyword": "assorted fixed-point theorems"}, +{"keyword": "assuming access"}, {"keyword": "assuming soundness"}, {"keyword": "astronomically huge"}, {"keyword": "asymptotic approximation"}, {"keyword": "asymptotic bounds"}, {"keyword": "asymptotic expansions"}, {"keyword": "asymptotic growth approximation"}, {"keyword": "asymptotic relation"}, {"keyword": "asymptotically equivalent"}, {"keyword": "asymptotically matches"}, {"keyword": "asymptotically optimal space usage"}, {"keyword": "asynchronously communicating nodes"}, {"keyword": "atkinson lemma"}, {"keyword": "atomic elements"}, {"keyword": "atomic formulas"}, {"keyword": "atomic operations race"}, {"keyword": "atomic predicates"}, {"keyword": "attack tree validity"}, {"keyword": "atva2021 jss 21"}, {"keyword": "augustin louis cauchy"}, {"keyword": "austrian science fund"}, {"keyword": "authenticated data structures"}, {"keyword": "authentication mechanisms employed call"}, {"keyword": "author merz 1998"}, {"keyword": "author x27"}, {"keyword": "authorized path"}, {"keyword": "authors upcoming dissertation"}, {"keyword": "autocorres tool"}, {"keyword": "automata classes"}, {"keyword": "automata library"}, {"keyword": "automate canonical tasks"}, {"keyword": "automate transports"}, {"keyword": "automated circuit verification"}, {"keyword": "automated proof tactics"}, {"keyword": "automated proof techniques"}, {"keyword": "automated reasoning"}, {"keyword": "automated reasoning 52"}, {"keyword": "automated reasoning 66"}, {"keyword": "automated reasoning framework"}, {"keyword": "automated reasoning sch18"}, {"keyword": "automated reasoning tools"}, {"keyword": "automated tactic support"}, {"keyword": "automated theorem prover"}, {"keyword": "automated theorem proving"}, {"keyword": "automated-theorem-proving assistant"}, {"keyword": "automatic data refinement"}, {"keyword": "automatic differentiation"}, {"keyword": "automatic instantiation"}, {"keyword": "automatic methods"}, {"keyword": "automatic refinement framework"}, {"keyword": "automatic search"}, {"keyword": "automatic tactics"}, {"keyword": "automatic theorem prover"}, {"keyword": "automatically calculated"}, {"keyword": "automatically derive"}, {"keyword": "automatically derive restrictions"}, {"keyword": "automatically deriving instances"}, {"keyword": "automatically executed programs"}, {"keyword": "automatically extracted scala code"}, {"keyword": "automatically generate proofs"}, {"keyword": "automatically refines algorithms"}, {"keyword": "automatically transferable"}, {"keyword": "automation mechanisms"}, {"keyword": "automatize canonical tasks"}, {"keyword": "automotive-gateway system"}, {"keyword": "autonomous systems"}, {"keyword": "autonomous vehicle"}, {"keyword": "autonomous vehicle liable"}, {"keyword": "autonomous vehicle manufacturers"}, {"keyword": "autoref tool"}, {"keyword": "auxiliary labels"}, {"keyword": "auxiliary triangle inequality"}, {"keyword": "auxiliary type"}, {"keyword": "average case"}, {"keyword": "average number"}, {"keyword": "average-case cost"}, {"keyword": "averaging theorem"}, {"keyword": "avl trees"}, {"keyword": "avoid carrying"}, {"keyword": "avoid cascading linking"}, {"keyword": "avoid circular reasoning"}, {"keyword": "avoid correctness issues"}, {"keyword": "avoiding quantification"}, {"keyword": "awn models comprise"}, {"keyword": "awomir ko x0142"}, {"keyword": "axiom"}, {"keyword": "axiom class"}, {"keyword": "axiom system"}, {"keyword": "axiomatic characterization"}, {"keyword": "axiomatic constructor classes"}, {"keyword": "axiomatic definition"}, {"keyword": "axiomatic framework"}, {"keyword": "axiomatic network model"}, {"keyword": "axiomatic system"}, {"keyword": "axiomatic theory"}, {"keyword": "axiomatic type classes"}, {"keyword": "axiomatize term-for-variable substitution"}, {"keyword": "axioms constructed"}, {"keyword": "axioms proposed"}, {"keyword": "axioms set proposed"}, {"keyword": "axioms set suggested"}, {"keyword": "axioms systems"}, {"keyword": "b_n"}, {"keyword": "ba12 mordechai ben-ari"}, {"keyword": "babylonian method"}, {"keyword": "background theory"}, {"keyword": "background theory forall"}, {"keyword": "backward compatibility"}, {"keyword": "backward compatible"}, {"keyword": "backward simulations"}, {"keyword": "bad sequences"}, {"keyword": "balanced incomplete block designs"}, {"keyword": "balanced nature"}, {"keyword": "balog szemeredi gowers theorem"}, {"keyword": "banach space"}, {"keyword": "banach spaces volume"}, {"keyword": "base set"}, {"keyword": "base vectors"}, {"keyword": "basic algebra leading"}, {"keyword": "basic algebraic properties"}, {"keyword": "basic axioms"}, {"keyword": "basic blocks"}, {"keyword": "basic category theory set"}, {"keyword": "basic classical properties"}, {"keyword": "basic concepts"}, {"keyword": "basic concepts cartesian products"}, {"keyword": "basic definitions"}, {"keyword": "basic elements"}, {"keyword": "basic facts"}, {"keyword": "basic features"}, {"keyword": "basic file operations"}, {"keyword": "basic formal framework"}, {"keyword": "basic forward analysis operations"}, {"keyword": "basic framework"}, {"keyword": "basic geometric facts"}, {"keyword": "basic geometric properties"}, {"keyword": "basic graph algorithms"}, {"keyword": "basic graph theory definitions"}, {"keyword": "basic hypergraph hierarchy"}, {"keyword": "basic identities"}, {"keyword": "basic laws"}, {"keyword": "basic linear algebra"}, {"keyword": "basic material"}, {"keyword": "basic modal logics"}, {"keyword": "basic model"}, {"keyword": "basic notions"}, {"keyword": "basic number-theoretic functions related"}, {"keyword": "basic part"}, {"keyword": "basic path manipulation rules"}, {"keyword": "basic properties"}, {"keyword": "basic properties ndash"}, {"keyword": "basic randomised social choice"}, {"keyword": "basic result"}, {"keyword": "basic setting"}, {"keyword": "basic superposition calculus"}, {"keyword": "basic theory"}, {"keyword": "basic toolbox"}, {"keyword": "basic topological facts"}, {"keyword": "basic ugraph definition"}, {"keyword": "basis executable code"}, {"keyword": "basis reduction"}, {"keyword": "basis reduction algorithm"}, {"keyword": "bayes theorem"}, {"keyword": "bayesian regression presented"}, {"keyword": "beautiful result"}, {"keyword": "behavior trace assertions"}, {"keyword": "behavior traces"}, {"keyword": "behavioral aspects"}, {"keyword": "behaviorally correct learning"}, {"keyword": "behaviour structure"}, {"keyword": "behaviours"}, {"keyword": "belief change"}, {"keyword": "bell numbers"}, {"keyword": "bell state"}, {"keyword": "ben-ari ba12"}, {"keyword": "benchmark problems"}, {"keyword": "benchmark scripts"}, {"keyword": "bendix orders"}, {"keyword": "berlekamp-zassenhaus algorithm"}, {"keyword": "bernays-tarski axiom system"}, {"keyword": "bernoulli numbers"}, {"keyword": "beta"}, {"keyword": "beta_0 beta"}, {"keyword": "beta_1"}, {"keyword": "beta_n"}, {"keyword": "beth hintikka style"}, {"keyword": "beth hintikka-style completeness proofs"}, {"keyword": "beukers"}, {"keyword": "bicolano operational semantics"}, {"keyword": "big step semantics"}, {"keyword": "biggest part"}, {"keyword": "bigvee phi"}, {"keyword": "bilinear dominance"}, {"keyword": "binary case"}, {"keyword": "binary code"}, {"keyword": "binary decision diagram"}, {"keyword": "binary decision trees"}, {"keyword": "binary masking"}, {"keyword": "binary multirelations associate elements"}, {"keyword": "binary multirelations form"}, {"keyword": "binary numeral system"}, {"keyword": "binary operators"}, {"keyword": "binary orthogonality"}, {"keyword": "binary relations"}, {"keyword": "binary search tree operations"}, {"keyword": "binary search trees"}, {"keyword": "binary temporal operators"}, {"keyword": "binary tree"}, {"keyword": "binary trees fredman"}, {"keyword": "binding sequences"}, {"keyword": "binding signature"}, {"keyword": "binding structure"}, {"keyword": "bindings-aware induction"}, {"keyword": "binomial heaps"}, {"keyword": "bipartite graph"}, {"keyword": "bird tree"}, {"keyword": "birkhoff theorem"}, {"keyword": "bisection square root"}, {"keyword": "bisimilarity coincides"}, {"keyword": "bisimulation equivalence"}, {"keyword": "bisimulation variants"}, {"keyword": "bit ibn qurra"}, {"keyword": "bit manipulations"}, {"keyword": "bit simpler"}, {"keyword": "bius transformations"}, {"keyword": "bkr algorithm"}, {"keyword": "black-box traces"}, {"keyword": "blackboard pattern"}, {"keyword": "blockchain pattern"}, {"keyword": "bner bases"}, {"keyword": "bnf case"}, {"keyword": "bnf support"}, {"keyword": "bnf-based datatype package"}, {"keyword": "bnfcc structure"}, {"keyword": "bnfcc theory"}, {"keyword": "bnfccs preserve quotients"}, {"keyword": "bochner integration"}, {"keyword": "bohua zhan"}, {"keyword": "book"}, {"keyword": "book additive number theory"}, {"keyword": "book concrete semantics"}, {"keyword": "book consistency"}, {"keyword": "book dense sphere packings"}, {"keyword": "book first-order logic"}, {"keyword": "book graph theory"}, {"keyword": "book linear algebra"}, {"keyword": "book markov decision processes"}, {"keyword": "book proof theory"}, {"keyword": "boolean algebra"}, {"keyword": "boolean algebra type"}, {"keyword": "boolean algebras extended"}, {"keyword": "boolean algebras generalise"}, {"keyword": "boolean connectives"}, {"keyword": "boolean expressions"}, {"keyword": "boolean functions"}, {"keyword": "boolean lists"}, {"keyword": "boolean matrices"}, {"keyword": "boolos curious inference"}, {"keyword": "boolos gave"}, {"keyword": "bor vka"}, {"keyword": "borel-measurable random variables"}, {"keyword": "borrow terminology"}, {"keyword": "bound dependent"}, {"keyword": "bound depends"}, {"keyword": "bound occurrences"}, {"keyword": "bound variables"}, {"keyword": "bounded basic pseudo-hoops"}, {"keyword": "bounded linear functions"}, {"keyword": "bounded model checking"}, {"keyword": "bounded natural functors"}, {"keyword": "bounded number"}, {"keyword": "bounded operators"}, {"keyword": "bounded totally ordered hoops"}, {"keyword": "bounded wajsberg pseudo-hoops"}, {"keyword": "bounded-deducibility security"}, {"keyword": "bounded-length strings"}, {"keyword": "bounds due"}, {"keyword": "bracket polynomial"}, {"keyword": "branches guarded"}, {"keyword": "braun trees"}, {"keyword": "breeders"}, {"keyword": "brian huffman"}, {"keyword": "bridge definition"}, {"keyword": "british imperial system"}, {"keyword": "brookes failure-divergence semantics"}, {"keyword": "bst"}, {"keyword": "budan fourier theorem"}, {"keyword": "building"}, {"keyword": "building correct programs working"}, {"keyword": "building high-performance multiprocessor software"}, {"keyword": "butterfly scheme"}, {"keyword": "byte code"}, {"keyword": "byte-level little-endian memory model"}, {"keyword": "bytecode logic"}, {"keyword": "byzantine clock synchronization"}, {"keyword": "byzantine fault-tolerant clock synchronization"}, {"keyword": "c11 syntax deeply integrated"}, {"keyword": "cade 28 paper"}, {"keyword": "cade-27 paper"}, {"keyword": "cakeml abstract syntax trees"}, {"keyword": "cakeml project"}, {"keyword": "calculate sign variations"}, {"keyword": "calculating cauchy indices"}, {"keyword": "calculating operators"}, {"keyword": "calculus exhaustively"}, {"keyword": "calculus immediately implies"}, {"keyword": "calculus ls_ pasl"}, {"keyword": "call arity"}, {"keyword": "call arity analysis"}, {"keyword": "call merkle functors"}, {"keyword": "call path authorization"}, {"keyword": "call return"}, {"keyword": "call risk-free loans"}, {"keyword": "call root-balanced trees"}, {"keyword": "call- return behavior"}, {"keyword": "call-by-"}, {"keyword": "called check monad"}, {"keyword": "called complete sets"}, {"keyword": "called concurrent transition systems"}, {"keyword": "called eudoxus reals"}, {"keyword": "called galois fields"}, {"keyword": "called hol-csp 1"}, {"keyword": "called interval arithmetic"}, {"keyword": "called learnable"}, {"keyword": "called llist_topology"}, {"keyword": "called multi-level syllogistic"}, {"keyword": "called object constraint language"}, {"keyword": "called residuation"}, {"keyword": "called se_step"}, {"keyword": "called separating implication"}, {"keyword": "called substitutive sets"}, {"keyword": "cambridge lecture notes topics"}, {"keyword": "cambridge university press"}, {"keyword": "cambridge university press 2001"}, {"keyword": "cancellative separation algebra"}, {"keyword": "canonical isomorphism"}, {"keyword": "canonical matrix analogue"}, {"keyword": "canonical matrix form"}, {"keyword": "canonical set-theoretic constructions internalized"}, {"keyword": "canonical unification instances"}, {"keyword": "canton protocol"}, {"keyword": "cantor normal form"}, {"keyword": "cantor pairing function"}, {"keyword": "cap mathbb"}, {"keyword": "capture laws"}, {"keyword": "carath odory"}, {"keyword": "cardinal library"}, {"keyword": "cardinality"}, {"keyword": "cardinality facts relevant"}, {"keyword": "cardinality formula assuming"}, {"keyword": "cardinality formulae"}, {"keyword": "cardinality operation counts"}, {"keyword": "cardinality proofs"}, {"keyword": "careful presentation"}, {"keyword": "carefully crafted"}, {"keyword": "carmichael numbers"}, {"keyword": "carrier set"}, {"keyword": "cartesian categories"}, {"keyword": "cartesian category"}, {"keyword": "cartesian closed"}, {"keyword": "cartesian closed categories"}, {"keyword": "cartesian monoidal categories"}, {"keyword": "cartesian monoidal category"}, {"keyword": "cartesian powers"}, {"keyword": "cartesian product"}, {"keyword": "case"}, {"keyword": "case combinators"}, {"keyword": "case distinction"}, {"keyword": "case statements"}, {"keyword": "case studies"}, {"keyword": "case study"}, {"keyword": "case study revealed"}, {"keyword": "catalan numbers"}, {"keyword": "categorical predicate transformers implement"}, {"keyword": "categories based"}, {"keyword": "category"}, {"keyword": "category equipped"}, {"keyword": "category theory"}, {"keyword": "category theory written"}, +{"keyword": "cattle problem"}, {"keyword": "cauchy completion"}, {"keyword": "cauchy davenport theorem"}, {"keyword": "cauchy index"}, {"keyword": "cauchy sequence"}, {"keyword": "cava automata library"}, {"keyword": "cava model checker"}, {"keyword": "cayley-hamilton afp entries"}, {"keyword": "cayley-hamilton theorem based"}, {"keyword": "cc studies system classes"}, {"keyword": "celebrated theorem"}, {"keyword": "central meta theorem"}, {"keyword": "central requirements"}, {"keyword": "central result"}, {"keyword": "central security property"}, {"keyword": "certificate language"}, {"keyword": "certified complex root isolation"}, {"keyword": "certified declarative first-order prover"}, {"keyword": "certified dictionary translation"}, {"keyword": "certified factorization algorithm"}, {"keyword": "certified programs"}, {"keyword": "certify size-change termination proofs"}, {"keyword": "certify termination proofs"}, {"keyword": "certifying primes"}, {"keyword": "ceta system"}, {"keyword": "ch research verifythis"}, {"keyword": "chagu rand"}, {"keyword": "chamber complexes"}, {"keyword": "chandy--lamport algorithm"}, {"keyword": "change history"}, {"keyword": "channel protocols"}, {"keyword": "channel protocols communicating"}, {"keyword": "chapman formula"}, {"keyword": "chapters 7-9"}, {"keyword": "characteristic polynomials"}, {"keyword": "characterization theorem"}, {"keyword": "charly gries"}, {"keyword": "chebyshev nodes"}, {"keyword": "chebyshev polynomials"}, {"keyword": "check"}, {"keyword": "check high-level security goals"}, {"keyword": "checkers operate"}, {"keyword": "checking c1-information"}, {"keyword": "checks strong security"}, {"keyword": "chelsea edmonds"}, {"keyword": "cheri hardware"}, {"keyword": "chernoff bounds"}, {"keyword": "chi automata"}, {"keyword": "chinese remainder theorem"}, {"keyword": "chip authentication mapping"}, {"keyword": "choices"}, {"keyword": "chomsky normal form"}, {"keyword": "chords intersect"}, {"keyword": "chosen abstractions"}, {"keyword": "chosen memory model"}, {"keyword": "chosen plaintext"}, {"keyword": "chosen plaintext attack"}, {"keyword": "chosen uniformly"}, {"keyword": "christian urban"}, {"keyword": "christoph benzm uuml"}, {"keyword": "chromatic number exist"}, {"keyword": "chsh inequality"}, {"keyword": "church-encoded representation"}, {"keyword": "church-style simply-typed"}, {"keyword": "cidr notation"}, {"keyword": "ciphertext attacks"}, {"keyword": "circular intuition"}, {"keyword": "circus environment supports"}, {"keyword": "circus language"}, {"keyword": "circus processes"}, {"keyword": "cite swan"}, {"keyword": "cl73 chin-liang chang"}, {"keyword": "class hierarchies"}, {"keyword": "class models"}, {"keyword": "class type constructors"}, {"keyword": "class-collection-based rts algorithms run"}, {"keyword": "class-free constants"}, {"keyword": "class-preserving learning"}, {"keyword": "classes simply"}, {"keyword": "classic dynamic programming algorithm"}, {"keyword": "classic non-randomised quicksort"}, {"keyword": "classic notion"}, {"keyword": "classic proof"}, {"keyword": "classic quantifier elimination"}, +{"keyword": "classic result"}, {"keyword": "classic textbook theory"}, {"keyword": "classic unsolved problems"}, {"keyword": "classical ai planning"}, {"keyword": "classical algorithms"}, {"keyword": "classical bases"}, {"keyword": "classical church-rosser theorem"}, {"keyword": "classical definition"}, {"keyword": "classical dpll procedure"}, {"keyword": "classical extensional mereology"}, {"keyword": "classical geometric definitions"}, {"keyword": "classical higher-order logic"}, {"keyword": "classical higher-order logic equivalent"}, {"keyword": "classical hoare"}, {"keyword": "classical implicational logic"}, {"keyword": "classical logic"}, {"keyword": "classical method"}, {"keyword": "classical noninterference security"}, {"keyword": "classical propositional logic"}, {"keyword": "classical registers"}, {"keyword": "classical statements"}, {"keyword": "classical theorem"}, {"keyword": "classical theorem stating"}, {"keyword": "classical two-sided matching scenarios"}, {"keyword": "classical yun algorithm"}, {"keyword": "classifies topological spaces"}, {"keyword": "clausal consequences"}, {"keyword": "clausal form"}, {"keyword": "clause loop"}, {"keyword": "clause procedures"}, {"keyword": "clause procedures gc"}, {"keyword": "clause sets"}, {"keyword": "clean development"}, {"keyword": "clean offers conditionals"}, {"keyword": "clear formalisation"}, {"keyword": "client-side javascript programs"}, {"keyword": "client-side web applications"}, {"keyword": "clock synchronization"}, {"keyword": "clock synchronization algorithm"}, {"keyword": "close connection"}, {"keyword": "closed finite games"}, {"keyword": "closed formulas"}, {"keyword": "closed set"}, {"keyword": "closed starting"}, {"keyword": "closed-form formulae"}, {"keyword": "closely follow"}, {"keyword": "closely related"}, {"keyword": "closest vector problem"}, {"keyword": "closure properties"}, {"keyword": "closure property"}, {"keyword": "cnf based sat algorithms"}, {"keyword": "cnf formulae"}, {"keyword": "co-closure operators"}, {"keyword": "co-inductive lists"}, {"keyword": "coalgebraic decision procedure"}, {"keyword": "coalgebraic literature"}, {"keyword": "coarse-grained concurrency"}, {"keyword": "coarse-grained semantics"}, {"keyword": "code"}, {"keyword": "code accessing"}, {"keyword": "code based extractors"}, {"keyword": "code compilation"}, {"keyword": "code equation"}, {"keyword": "code generation"}, {"keyword": "code generation facility"}, {"keyword": "code generation feature"}, {"keyword": "code generation setup"}, {"keyword": "code generation support"}, {"keyword": "code generator"}, {"keyword": "code generator maps"}, {"keyword": "code generator performs"}, {"keyword": "code generator setup"}, {"keyword": "code output level"}, {"keyword": "code rate"}, {"keyword": "codomain nat option"}, {"keyword": "coefficient functions"}, {"keyword": "coefficients modulo"}, {"keyword": "coercion ord_of_nat"}, {"keyword": "cofinitary group"}, {"keyword": "cohen posets"}, {"keyword": "coherence theorem"}, {"keyword": "coinductive entry"}, {"keyword": "coinductive formalisations"}, {"keyword": "coinductive lists"}, {"keyword": "coinductive natural numbers"}, {"keyword": "coinductive terminated lists"}, {"keyword": "collaborative text editing"}, {"keyword": "collapse theorems"}, {"keyword": "collect information"}, {"keyword": "collecting semantics"}, {"keyword": "collection datastructures"}, {"keyword": "collection framework"}, {"keyword": "collection offer functionality"}, {"keyword": "collection semantics"}, {"keyword": "collections framework"}, {"keyword": "collectively referred"}, {"keyword": "colon-separated notation"}, {"keyword": "column space"}, {"keyword": "combinable iff"}, {"keyword": "combinable wand"}, {"keyword": "combinatorial argument"}, {"keyword": "combinatorial auction"}, {"keyword": "combinatorial design theory"}, {"keyword": "combinatorial design theory library"}, {"keyword": "combinatorial map"}, {"keyword": "combinatorial objects"}, {"keyword": "combinatorial optimisation"}, {"keyword": "combinatorial proof"}, {"keyword": "combinatorial proof requires construction"}, {"keyword": "combinatorial structures"}, {"keyword": "combinatorics"}, {"keyword": "combinatory logic"}, {"keyword": "combine classical reasoning"}, {"keyword": "combine multiple methods"}, {"keyword": "combine stepwise refinement"}, {"keyword": "combined factorization algorithm"}, {"keyword": "combined result"}, {"keyword": "command"}, {"keyword": "command mk_ide"}, {"keyword": "command mk_ide enables"}, {"keyword": "commitment schemes"}, {"keyword": "committee members"}, {"keyword": "common automata library"}, {"keyword": "common base clock"}, {"keyword": "common combinatorial objects"}, {"keyword": "common criteria full abstraction"}, {"keyword": "common factors"}, {"keyword": "common format"}, {"keyword": "common ground"}, {"keyword": "common identities"}, {"keyword": "common language features"}, {"keyword": "common set"}, {"keyword": "common special case"}, {"keyword": "common theme"}, {"keyword": "common-sense theory"}, {"keyword": "communicating concurrent kleene algebra"}, {"keyword": "communicating products"}, {"keyword": "communicating sequential processes"}, {"keyword": "communicating sequential processes requires"}, {"keyword": "communication channels"}, {"keyword": "commutative replicated data types"}, {"keyword": "commutative ring"}, {"keyword": "commuting conversion rule"}, {"keyword": "commuting observables"}, {"keyword": "compact intervals"}, {"keyword": "companion articles"}, {"keyword": "companion paper"}, {"keyword": "comparatively small subset"}, {"keyword": "compare complements"}, {"keyword": "compare encodability criteria"}, {"keyword": "compare process calculi"}, {"keyword": "comparing encodability criteria"}, {"keyword": "comparing relations"}, {"keyword": "comparison oracle"}, {"keyword": "comparison-based sorting algorithm"}, {"keyword": "comparisons performed"}, {"keyword": "compatible formalization"}, {"keyword": "compcertssa project"}, {"keyword": "competitive analysis"}, {"keyword": "compilation function"}, {"keyword": "compilation target"}, {"keyword": "compiled code"}, {"keyword": "compiled code execution"}, {"keyword": "compiled tactic code"}, {"keyword": "compiler composition"}, {"keyword": "compiler correctness"}, {"keyword": "compiler correctness proof"}, {"keyword": "compiler correctness proof shorter"}, {"keyword": "compiler optimization"}, {"keyword": "compiler rewrite rules"}, {"keyword": "compiler technology"}, {"keyword": "complement automaton"}, {"keyword": "complementary error function erfc"}, {"keyword": "complementary semigroups"}, {"keyword": "complementing previous encodings"}, {"keyword": "complete"}, {"keyword": "complete basis"}, {"keyword": "complete formal development"}, {"keyword": "complete formalisation"}, {"keyword": "complete formalization"}, {"keyword": "complete graphs"}, {"keyword": "complete independence bounds"}, {"keyword": "complete ipv4"}, {"keyword": "complete lattices"}, {"keyword": "complete multiple-conclusion calculus"}, {"keyword": "complete multivariate qe algorithm"}, {"keyword": "complete networks"}, {"keyword": "complete parse forest"}, {"keyword": "complete proof method"}, {"keyword": "complete semantic tableau calculus"}, {"keyword": "complete semantics"}, {"keyword": "complete tableau calculus"}, {"keyword": "complete test generation algorithms"}, {"keyword": "completed versions"}, {"keyword": "completely factorize real"}, {"keyword": "completely remove tedious proofs"}, {"keyword": "completely subsumes"}, {"keyword": "completely verified"}, {"keyword": "completely verified model checker"}, {"keyword": "completeness"}, {"keyword": "completeness conditions"}, {"keyword": "completeness proof"}, {"keyword": "completeness proof builds"}, {"keyword": "completeness proofs naturally suggest"}, {"keyword": "completeness result"}, {"keyword": "completeness theorems"}, {"keyword": "completeness threshold"}, {"keyword": "complex"}, {"keyword": "complex algebraic numbers"}, {"keyword": "complex analysis"}, {"keyword": "complex arguments"}, {"keyword": "complex case"}, {"keyword": "complex construction"}, {"keyword": "complex data structure"}, {"keyword": "complex library"}, {"keyword": "complex mathematical reasoning"}, {"keyword": "complex number"}, {"keyword": "complex plane"}, {"keyword": "complex plane extended"}, {"keyword": "complex polynomial"}, {"keyword": "complex polynomial lie inside"}, {"keyword": "complex predicates"}, {"keyword": "complex random system"}, {"keyword": "complex roots"}, {"keyword": "complex systems involves"}, {"keyword": "complex unknowns x1"}, {"keyword": "complex vector spaces"}, {"keyword": "complexity analysis"}, {"keyword": "complexity classes mathcal"}, {"keyword": "complexity low"}, {"keyword": "complexity proof certificates"}, {"keyword": "complicated derivatives"}, {"keyword": "complicated proofs"}, {"keyword": "complicated solution"}, {"keyword": "complicated translation layer"}, {"keyword": "complx language"}, {"keyword": "component behavior"}, {"keyword": "component-based development approach"}, {"keyword": "composable security statements"}, {"keyword": "composed protocol"}, {"keyword": "composite assertions"}, {"keyword": "composite objects"}, {"keyword": "composition properties wrt"}, {"keyword": "composition series"}, {"keyword": "compositional algorithm"}, {"keyword": "compositional algorithm exploits acyclicity"}, {"keyword": "compositional analysis"}, {"keyword": "compositional analysis methods"}, {"keyword": "compositional approach"}, {"keyword": "compositional invariant proofs"}, {"keyword": "compositional noninterference"}, {"keyword": "compositional statement"}, {"keyword": "compositional theory"}, {"keyword": "compositionality proofs"}, {"keyword": "compositionality results"}, {"keyword": "compositionally reasoning"}, {"keyword": "comprehension principle"}, {"keyword": "comprehensive framework"}, {"keyword": "computably enumerable sets"}, {"keyword": "computation based"}, {"keyword": "computation models"}, {"keyword": "computation traces"}, {"keyword": "computational complexity theory"}, {"keyword": "computational geometry"}, {"keyword": "computational metaphysics"}, {"keyword": "computational methods"}, {"keyword": "computational modeling"}, {"keyword": "computational models complicates comparisons"}, {"keyword": "compute arbitrary primitive recursive"}, {"keyword": "compute asymptotic expansions"}, +{"keyword": "compute continued fraction expansions"}, {"keyword": "compute fair prices"}, {"keyword": "compute roots"}, {"keyword": "compute short vectors"}, +{"keyword": "compute solutions"}, {"keyword": "computer algebra system maple"}, {"keyword": "computer programs"}, {"keyword": "computer science"}, {"keyword": "computer-aided design"}, {"keyword": "computer-assisted interpretive method"}, {"keyword": "computerized implementation"}, {"keyword": "computes density functions"}, {"keyword": "computing bernoulli numbers"}, {"keyword": "computing dominators"}, {"keyword": "computing dominators due"}, {"keyword": "computing enclosures"}, {"keyword": "computing gr bner bases"}, {"keyword": "computing optimal stable matches"}, {"keyword": "computing saturated sets"}, {"keyword": "computing weak similarity"}, {"keyword": "comte de buffon posed"}, {"keyword": "concentration inequalities"}, {"keyword": "concepts due"}, {"keyword": "concern geometry"}, {"keyword": "concerns infinite sets"}, {"keyword": "concise proof"}, {"keyword": "conclude wrong results"}, {"keyword": "concrete algorithms implementations"}, {"keyword": "concrete applicative functor"}, {"keyword": "concrete data structures"}, {"keyword": "concrete file represented"}, {"keyword": "concrete function"}, {"keyword": "concrete functors"}, {"keyword": "concrete input"}, {"keyword": "concrete laplace transforms"}, {"keyword": "concrete logics satisfying"}, {"keyword": "concrete lower bound"}, {"keyword": "concrete manifolds"}, {"keyword": "concrete mathematics"}, {"keyword": "concrete monad"}, {"keyword": "concrete program satisfies"}, {"keyword": "concrete programming language"}, {"keyword": "concrete protocols variants"}, {"keyword": "concrete prototypes"}, {"keyword": "concrete reachable states"}, {"keyword": "concrete representation"}, {"keyword": "concrete result"}, {"keyword": "concrete sigma-protocols"}, {"keyword": "concrete syntax"}, {"keyword": "concrete system"}, {"keyword": "concrete version"}, {"keyword": "concurrency control model"}, {"keyword": "concurrency primitives"}, {"keyword": "concurrency reasoning framework"}, {"keyword": "concurrency theory"}, {"keyword": "concurrent behaviour"}, {"keyword": "concurrent choice"}, {"keyword": "concurrent composition"}, {"keyword": "concurrent constraint pi-calculus"}, {"keyword": "concurrent dynamic logics"}, {"keyword": "concurrent kleene algebra"}, {"keyword": "concurrent operations"}, {"keyword": "concurrent programming"}, {"keyword": "concurrent programs"}, {"keyword": "concurrent programs attempt"}, {"keyword": "concurrent reads"}, {"keyword": "concurrent refinement algebra"}, {"keyword": "concurrent revisions"}, {"keyword": "concurrent revisions model"}, {"keyword": "concurrent sub-models"}, {"keyword": "concurrent systems"}, {"keyword": "concurrent value-dependent noninterference"}, {"keyword": "conditional equality operators"}, {"keyword": "conditional expectation"}, {"keyword": "conditional expressions"}, {"keyword": "conditional probability"}, {"keyword": "conditional transfer rules"}, {"keyword": "conditions"}, {"keyword": "conduct machine checkable proofs"}, {"keyword": "conducting completely formal proofs"}, {"keyword": "cone text arg"}, {"keyword": "conference certified programs"}, {"keyword": "conference interactive theorem proving"}, {"keyword": "confidential events"}, {"keyword": "confidentiality guarantees"}, {"keyword": "confidentiality properties"}, {"keyword": "confidentiality properties refer"}, {"keyword": "confidentiality verification"}, {"keyword": "configuration trace"}, {"keyword": "conflict-free replicated data types"}, {"keyword": "conflict-free replicated datatype"}, {"keyword": "conformance relations"}, {"keyword": "conformance testing"}, {"keyword": "congruence theorems"}, {"keyword": "conjectured relation"}, {"keyword": "conjunctive normal form"}, {"keyword": "connected open set"}, {"keyword": "connecting algebraic varieties"}, {"keyword": "cons"}, {"keyword": "consensus algorithms"}, {"keyword": "consensus problem"}, {"keyword": "considerably shorter"}, {"keyword": "consideration admits"}, {"keyword": "consistency problem"}, {"keyword": "consistent fol theories extending"}, {"keyword": "consistent learning"}, {"keyword": "consistent set"}, {"keyword": "consistent sign assignments"}, {"keyword": "consistently derivable"}, {"keyword": "constant functions"}, {"keyword": "constant intersect designs"}, {"keyword": "constant predicates stated"}, {"keyword": "constant time"}, {"keyword": "constant time findmin"}, {"keyword": "constant time queue"}, {"keyword": "constant upper bound"}, {"keyword": "constant-time findmin"}, {"keyword": "constraint-system-based program analysis"}, {"keyword": "construct complicated trees"}, {"keyword": "construct proper generic extensions"}, {"keyword": "construct real exponents"}, {"keyword": "constructing correct programs"}, {"keyword": "constructing rational numbers"}, {"keyword": "constructing sturm sequences efficiently"}, {"keyword": "construction theorem"}, {"keyword": "constructions based"}, {"keyword": "constructive cryptography"}, {"keyword": "constructive cryptography proofs"}, {"keyword": "constructive points"}, {"keyword": "constructive proof"}, {"keyword": "constructor applications"}, {"keyword": "constructor calls occuring"}, {"keyword": "contact gerwin"}, {"keyword": "container framework"}, {"keyword": "context relation"}, {"keyword": "context-free grammar"}, {"keyword": "context-free languages"}, {"keyword": "contextual equivalence"}, {"keyword": "contiguous segments"}, {"keyword": "continuation semantics"}, -{"keyword": "continued fraction expansions"}, +{"keyword": "continued fraction expansion"}, +{"keyword": "continued fractions"}, {"keyword": "continuous functions"}, {"keyword": "continuous lattices"}, {"keyword": "continuous linear operators"}, {"keyword": "continuum hypothesis"}, {"keyword": "contraction factors"}, {"keyword": "contradicts consensus"}, {"keyword": "contradicts validity"}, {"keyword": "contribution presents"}, {"keyword": "contribution reuses"}, {"keyword": "control dependencies"}, {"keyword": "control flow"}, {"keyword": "control flow graph"}, {"keyword": "control operators"}, {"keyword": "control-flow graphs"}, {"keyword": "control-flow operators"}, {"keyword": "controlled manner"}, {"keyword": "controller constraints"}, {"keyword": "convenient commands"}, {"keyword": "conventional definitions"}, {"keyword": "conventional single-clocking semantics"}, {"keyword": "convergence function"}, {"keyword": "convergence function applied"}, {"keyword": "convergence rate"}, {"keyword": "conversion functions"}, {"keyword": "conversion version"}, {"keyword": "convert ltl formulas"}, {"keyword": "convert natural number"}, {"keyword": "convert regular expressions"}, {"keyword": "convex hull"}, {"keyword": "convex polyhedron satisfied"}, {"keyword": "convex polytopes"}, {"keyword": "convolution theorem thereon"}, {"keyword": "conway semirings extended"}, {"keyword": "cook-levin theorem states"}, {"keyword": "coordination"}, {"keyword": "coprime polynomials"}, {"keyword": "coq proof assistant"}, {"keyword": "core dom"}, {"keyword": "core notion"}, {"keyword": "core operations"}, {"keyword": "core part"}, {"keyword": "core theorems"}, {"keyword": "coreutils sha256 implementation"}, {"keyword": "correct 2-3 finger trees"}, {"keyword": "correct binomial heaps"}, {"keyword": "correct construction"}, {"keyword": "correct optimized versions"}, {"keyword": "correct verification tools"}, {"keyword": "correctness"}, {"keyword": "correctness claims"}, {"keyword": "correctness policy"}, {"keyword": "correctness proof"}, {"keyword": "correctness properties"}, {"keyword": "correctness property"}, {"keyword": "correctness theorems"}, {"keyword": "correspondence theorem"}, {"keyword": "cosmed social media platform"}, {"keyword": "cotangent spaces"}, {"keyword": "counit natural transformations"}, {"keyword": "count distinct real roots"}, {"keyword": "count real roots"}, {"keyword": "countable chain condition"}, {"keyword": "countable discrete space"}, {"keyword": "countable networks"}, {"keyword": "countable ordinals"}, {"keyword": "countable transitive model"}, {"keyword": "countably infinite number"}, {"keyword": "counter-free automata"}, {"keyword": "counting functions"}, {"keyword": "counting partial equivalence relations"}, {"keyword": "counting sort"}, {"keyword": "counting sort making"}, {"keyword": "counts distinct real roots"}, {"keyword": "counts roots"}, {"keyword": "couple small"}, {"keyword": "coupled delay simulations"}, {"keyword": "coupled similarity"}, {"keyword": "coupled simulation"}, {"keyword": "coupled simulation preorder"}, {"keyword": "coupled simulation versus bisimulation"}, {"keyword": "cover monotonic security invariants"}, {"keyword": "cover quantitative"}, {"keyword": "cover records"}, {"keyword": "covering directed"}, {"keyword": "covers algebraic reasoning"}, {"keyword": "cpp-2015 paper"}, {"keyword": "cpp-2015 peter lammich"}, {"keyword": "create executable scala code"}, {"keyword": "creating custom induction"}, {"keyword": "critical points"}, {"keyword": "crowds protocol"}, {"keyword": "crowning achievements"}, {"keyword": "crucial ingredient"}, {"keyword": "crypthol library"}, {"keyword": "crypthol library crypthol"}, {"keyword": "cryptographic constructions"}, {"keyword": "cryptographic hash-function ripemd-160"}, {"keyword": "cryptographic operators"}, {"keyword": "cryptographic scheme crystals-kyber"}, {"keyword": "cryptographic validation fields"}, {"keyword": "cryptographically secure proof"}, {"keyword": "cryptography proof formalizations"}, {"keyword": "crytographic standards"}, {"keyword": "csp noninterference security"}, {"keyword": "csp noninterference security stated"}, {"keyword": "cubic equations"}, {"keyword": "cubic space"}, {"keyword": "current compression formats"}, {"keyword": "current element"}, {"keyword": "current formalization"}, {"keyword": "current monolithic protocols"}, {"keyword": "current state"}, {"keyword": "current symbolic state"}, {"keyword": "current version"}, {"keyword": "curve operations"}, {"keyword": "curves fips 198-1 nist"}, {"keyword": "custom hintikka sets based"}, {"keyword": "custom induction rules"}, {"keyword": "custom theorem proving environment"}, {"keyword": "custom-written ml code"}, {"keyword": "cut admissibility"}, {"keyword": "cute puzzles"}, {"keyword": "cutting truncating sets"}, {"keyword": "cycle matroid"}, {"keyword": "cyclic groups"}, {"keyword": "cyk decides"}, {"keyword": "dana scott"}, {"keyword": "daniel schoepe"}, {"keyword": "data complexity"}, {"keyword": "data dependencies"}, {"keyword": "data flow analyser"}, {"keyword": "data plane"}, {"keyword": "data plane protocols"}, {"keyword": "data refinement"}, {"keyword": "data refinement framework"}, {"keyword": "data refinement relations"}, {"keyword": "data refinement techniques"}, {"keyword": "data secrecy"}, {"keyword": "data spaces"}, {"keyword": "data state manipulations"}, {"keyword": "data stream"}, {"keyword": "data structure"}, {"keyword": "data structures depending"}, {"keyword": "data structures required"}, {"keyword": "data transmission"}, {"keyword": "data type"}, {"keyword": "data-dependent execution time"}, {"keyword": "data-refinement techniques"}, {"keyword": "data-type declarations"}, {"keyword": "database community"}, {"keyword": "dataflow paradigm"}, {"keyword": "datatype package"}, {"keyword": "datatypes generated"}, {"keyword": "datatypes similar"}, {"keyword": "dbm-based forward analysis"}, {"keyword": "de bruijn index-based syntax"}, {"keyword": "de bruijn indices"}, {"keyword": "de-bruijn terms"}, {"keyword": "debited loans cancel"}, {"keyword": "debugging purposes"}, {"keyword": "decidability result"}, {"keyword": "decides language emptiness"}, {"keyword": "deciding coupled similarity"}, {"keyword": "deciding relative safety"}, {"keyword": "decision"}, {"keyword": "decision problem"}, {"keyword": "decision problem clique"}, {"keyword": "decision problem mathtt sat"}, {"keyword": "decision procedure"}, {"keyword": "decision procedure due"}, {"keyword": "decision procedure toolkit"}, {"keyword": "decision type"}, {"keyword": "declarative database query language"}, {"keyword": "declarative first-order prover"}, {"keyword": "declaring nominal datatypes"}, {"keyword": "declassification bounds"}, {"keyword": "decrease efficiency"}, {"keyword": "decreasing diagrams"}, {"keyword": "decreasing diagrams showing"}, {"keyword": "dedekind cuts"}, {"keyword": "dedekind quantale"}, {"keyword": "dedekind-peano postulates"}, {"keyword": "dedicated encoding"}, {"keyword": "dedicated vertices"}, {"keyword": "deductive program verification"}, {"keyword": "deductive system"}, {"keyword": "deductive tools"}, {"keyword": "deep embedding approach"}, {"keyword": "deep learning"}, {"keyword": "deeply embedded target programs"}, {"keyword": "deeply integrated"}, {"keyword": "default instantiation"}, {"keyword": "default setup"}, {"keyword": "defensive jinja virtual machine"}, {"keyword": "defensive strategies"}, {"keyword": "defensive strategies exist"}, {"keyword": "definedness condition"}, {"keyword": "defining execution equivalent markings"}, {"keyword": "defining functions"}, {"keyword": "defining functors"}, {"keyword": "defining variants"}, {"keyword": "defining web components"}, {"keyword": "definite descriptions"}, {"keyword": "definite initialisation analysis"}, {"keyword": "definition remarkably simple"}, {"keyword": "definitional embedding"}, {"keyword": "deg"}, {"keyword": "degenerate deterministic case"}, {"keyword": "degree bounds"}, {"keyword": "del"}, {"keyword": "del numbers"}, {"keyword": "deletion condition"}, {"keyword": "deletion preserve weight-balance"}, {"keyword": "deliberately formulated"}, {"keyword": "deliberately restrict"}, {"keyword": "deliverable d31"}, {"keyword": "delta gamma holds"}, {"keyword": "delta phi"}, {"keyword": "delta system lemma sessions"}, {"keyword": "demonic refinement algebra"}, {"keyword": "demonstrator semantic backend"}, {"keyword": "denies access"}, {"keyword": "denotational semantics"}, {"keyword": "dense linear orders"}, {"keyword": "density matrices"}, {"keyword": "density matrix"}, {"keyword": "dependency graph approximations"}, {"keyword": "dependency graphs"}, {"keyword": "dependent choices"}, {"keyword": "dependent security type system"}, {"keyword": "dependent types"}, {"keyword": "depth information"}, {"keyword": "deque implementation"}, {"keyword": "derangements formula describes"}, {"keyword": "derivative formula frac"}, {"keyword": "derive"}, {"keyword": "derive class instances"}, {"keyword": "derive comparators"}, {"keyword": "derive mertens"}, {"keyword": "derive notions"}, {"keyword": "derive powerful induction rules"}, {"keyword": "derive proof rules"}, {"keyword": "derive proofs"}, {"keyword": "derived proof rules"}, {"keyword": "derives equality theorems"}, {"keyword": "derives main theorems"}, {"keyword": "deriving approximative safety properties"}, {"keyword": "deriving asymptotic estimates"}, {"keyword": "descartes rule"}, {"keyword": "descartes test based"}, {"keyword": "descartes test returns 0"}, {"keyword": "describe formalization"}, {"keyword": "design choices underlying"}, {"keyword": "design existence"}, {"keyword": "design isomorphisms"}, {"keyword": "design pattern"}, {"keyword": "designated root vertex"}, {"keyword": "designs"}, {"keyword": "desired interval"}, {"keyword": "desired precision"}, {"keyword": "desired subgraph"}, {"keyword": "destination ip space"}, {"keyword": "detailed apply scripts"}, {"keyword": "detailed calculations"}, {"keyword": "detailed description"}, {"keyword": "detailed presentation"}, {"keyword": "detailed proof steps"}, {"keyword": "detailed systematic study"}, {"keyword": "detecting rectangle intersection"}, {"keyword": "detects unsatisfiability"}, {"keyword": "deterministic list update algorithms"}, {"keyword": "deterministic minsky machine"}, {"keyword": "deterministic monad"}, {"keyword": "deterministic multi-tape turing machines"}, {"keyword": "deterministic processes"}, {"keyword": "deterministic state machine"}, {"keyword": "determinization procedure"}, {"keyword": "deutsch-schorr-waite graph marking algorithm"}, {"keyword": "developing aspects"}, {"keyword": "developing methods"}, {"keyword": "developing security protocols"}, {"keyword": "development accompanies"}, {"keyword": "development concludes"}, {"keyword": "development employs"}, {"keyword": "development establishes"}, {"keyword": "development forms"}, {"keyword": "development longer"}, {"keyword": "development relies"}, {"keyword": "devise notions"}, {"keyword": "devising correct speculative algorithms"}, {"keyword": "dfs algorithm"}, {"keyword": "dfs-based algorithms"}, {"keyword": "diagonal functors"}, {"keyword": "diagonal-free timed automata"}, {"keyword": "diagrammatic modeling language"}, {"keyword": "diagrammatic proof system"}, {"keyword": "diatonic sequence"}, {"keyword": "dictionary translation"}, {"keyword": "difference bound matrices"}, {"keyword": "difference sets"}, {"keyword": "difference vector"}, {"keyword": "differentiability"}, {"keyword": "differential dynamic logic"}, {"keyword": "differential dynamics logic"}, {"keyword": "differential game logic"}, {"keyword": "differential testing"}, {"keyword": "differential_dynamic_logic article"}, {"keyword": "differs slightly"}, {"keyword": "difficult"}, {"keyword": "difficulty arises"}, {"keyword": "diffie-hellman password-based authentication protocol"}, {"keyword": "digit expansions"}, {"keyword": "digit expansions builds"}, {"keyword": "digit shifts"}, {"keyword": "dijkstra"}, {"keyword": "dining philosopher problem"}, {"keyword": "diophantine approximations"}, {"keyword": "diophantine sets"}, {"keyword": "direct adaptation"}, {"keyword": "direct adequacy proof"}, {"keyword": "direct application"}, {"keyword": "direct arguments"}, {"keyword": "direct consequence"}, {"keyword": "direct corollaries"}, {"keyword": "direct execution"}, {"keyword": "direct formalisation"}, {"keyword": "direct mathematical model"}, {"keyword": "direct product"}, {"keyword": "direct recursion"}, {"keyword": "direct semantics"}, {"keyword": "direct subsumption"}, {"keyword": "direct subsumption relation"}, {"keyword": "directed graph"}, {"keyword": "directed graph library"}, {"keyword": "directed security policies"}, {"keyword": "directed set"}, {"keyword": "directly derive executable"}, {"keyword": "directly executable program"}, {"keyword": "directly follow"}, {"keyword": "directly implementable"}, {"keyword": "directly implies"}, {"keyword": "directly inspired"}, {"keyword": "directly relating agents"}, {"keyword": "dirichlet"}, {"keyword": "dirichlet characters"}, {"keyword": "dirichlet l-functions"}, {"keyword": "dirichlet products"}, {"keyword": "dirichlet series"}, {"keyword": "dirk pfl ger"}, {"keyword": "disconnected graph"}, {"keyword": "discounted infinite horizon mdps"}, {"keyword": "discrete"}, {"keyword": "discrete category"}, {"keyword": "discrete financial models"}, {"keyword": "discrete fourier transform"}, {"keyword": "discrete instants"}, {"keyword": "discrete probability distributions"}, {"keyword": "discrete stochastic dynamic programming"}, {"keyword": "discrete summation"}, {"keyword": "discrete-time markov chains"}, {"keyword": "discretised implementation approximates"}, {"keyword": "discuss generalizations"}, {"keyword": "discussion logs"}, {"keyword": "disintegration theorem"}, {"keyword": "disjoint sums"}, {"keyword": "display algebraic numbers"}, {"keyword": "disprove program properties"}, {"keyword": "disproving program"}, {"keyword": "disregard unrealizable behavior"}, {"keyword": "distinct algebraic numbers alpha_i"}, {"keyword": "distinct layers"}, {"keyword": "distinct network nodes"}, {"keyword": "distinct operators"}, {"keyword": "distinct prime factors"}, {"keyword": "distinctive feature"}, {"keyword": "distinguishing feature"}, {"keyword": "distribute sequential composition"}, {"keyword": "distributed computing"}, {"keyword": "distributed consensus"}, {"keyword": "distributed environment"}, {"keyword": "distributed ledgers"}, {"keyword": "distributed system"}, {"keyword": "distributed systems specification"}, {"keyword": "distributing interest"}, {"keyword": "divergence kleene algebras"}, {"keyword": "divergence reflection"}, {"keyword": "diverse fields"}, {"keyword": "divide conquer algorithms"}, {"keyword": "divide-and-conquer algorithm"}, {"keyword": "divided differences"}, {"keyword": "division algorithms"}, {"keyword": "division modulo"}, {"keyword": "divisor function"}, {"keyword": "divisor function sigma"}, {"keyword": "divisor sigma function"}, {"keyword": "dk andschl thesis"}, {"keyword": "dmitriy traytel"}, {"keyword": "dnf-based non-elementary algorithm"}, {"keyword": "doctoral thesis"}, {"keyword": "document class"}, {"keyword": "document corresponds"}, {"keyword": "document describes"}, {"keyword": "document object model"}, {"keyword": "document presents"}, {"keyword": "document root"}, {"keyword": "documents managed"}, {"keyword": "dogged previous mechanised proofs"}, {"keyword": "dom api"}, {"keyword": "dom respect component boundaries"}, {"keyword": "dom revealed numerous invariants"}, {"keyword": "dom standard"}, {"keyword": "domain elements"}, {"keyword": "domain operation"}, {"keyword": "domain theory"}, {"keyword": "domain-relation map satisfying"}, {"keyword": "domain-specific languages"}, {"keyword": "domain-theoretic fixpoint operator"}, {"keyword": "domain-theoretic semantics"}, {"keyword": "domain-theoretical aspects"}, {"keyword": "dominated terms"}, {"keyword": "dot-decimal notation"}, {"keyword": "dprm theorem"}, {"keyword": "dra targets similar applications"}, {"keyword": "draft paper"}, {"keyword": "drf guarantee"}, {"keyword": "drinks machine"}, {"keyword": "driving application"}, {"keyword": "drup proof output"}, {"keyword": "dual assertion"}, {"keyword": "dual incidence systems"}, {"keyword": "dual problem"}, {"keyword": "dual system relationships"}, {"keyword": "duggan-schwartz theorems"}, {"keyword": "dynamic architectures"}, {"keyword": "dynamic class initialization"}, {"keyword": "dynamic condition response"}, {"keyword": "dynamic context"}, {"keyword": "dynamic declassification triggers"}, {"keyword": "dynamic languages"}, {"keyword": "dynamic logics"}, {"keyword": "dynamic method invocation"}, {"keyword": "dynamic negation"}, {"keyword": "dynamic programming"}, {"keyword": "dynamic pushdown networks"}, {"keyword": "dynamic refutational completeness"}, {"keyword": "dynamic slicing"}, {"keyword": "dynamic tables parameterized"}, {"keyword": "dynamic thread creation"}, {"keyword": "dynamical systems"}, {"keyword": "dynamically typed programming languages"}, {"keyword": "earlier afp entry"}, {"keyword": "earlier joint work"}, {"keyword": "earlier paper"}, {"keyword": "earlier result"}, {"keyword": "earlier version"}, {"keyword": "early failure detection"}, {"keyword": "early result"}, {"keyword": "early stage"}, {"keyword": "earmark propositions"}, {"keyword": "easily adapt existing proofs"}, {"keyword": "easily adapted"}, {"keyword": "easily derive"}, {"keyword": "easily expandable"}, {"keyword": "easily generate elements"}, {"keyword": "easily justified"}, {"keyword": "easily obtained"}, {"keyword": "easily transfer theorems"}, {"keyword": "easily work"}, {"keyword": "easy reuse"}, {"keyword": "echelon form afp entry"}, {"keyword": "economic behavior"}, {"keyword": "edge labels"}, {"keyword": "edge weights"}, {"keyword": "edmonds theorem"}, {"keyword": "edmonds-karp algorithm"}, {"keyword": "educational setting due"}, {"keyword": "edward zalta"}, {"keyword": "edwards elliptic curves"}, {"keyword": "effect polymorphism"}, {"keyword": "effect specifications"}, {"keyword": "effectful computations"}, {"keyword": "effective mutual authentication service"}, {"keyword": "effective procedure"}, {"keyword": "effectively decide ideal membership"}, {"keyword": "effectively executable"}, {"keyword": "effectively executable algorithm"}, {"keyword": "efficient allocation"}, {"keyword": "efficient arrays"}, {"keyword": "efficient binary search"}, {"keyword": "efficient checking"}, {"keyword": "efficient computation"}, {"keyword": "efficient data structure combining"}, {"keyword": "efficient data structures"}, {"keyword": "efficient deterministic parsing"}, {"keyword": "efficient enumeration"}, {"keyword": "efficient executable algorithm"}, {"keyword": "efficient executable code"}, {"keyword": "efficient factorization algorithm"}, {"keyword": "efficient functional programs"}, {"keyword": "efficient imperative implementations"}, {"keyword": "efficient imperative version"}, {"keyword": "efficient implementation"}, {"keyword": "efficient monpoly monitoring tool"}, {"keyword": "efficient priority search trees"}, {"keyword": "efficient proof checking"}, {"keyword": "efficient root isolation"}, {"keyword": "efficient structures"}, {"keyword": "efficient union-find data structure"}, {"keyword": "efficient variable-length codes"}, {"keyword": "efficient verified implementation"}, {"keyword": "efficient version"}, {"keyword": "efficiently compute"}, {"keyword": "efficiently computed"}, {"keyword": "efficiently executable"}, {"keyword": "efficiently executable code"}, {"keyword": "efsm level"}, {"keyword": "efsms execute traces"}, {"keyword": "electronic proceedings"}, {"keyword": "elegant encoding"}, {"keyword": "elegant proof"}, {"keyword": "element codes"}, {"keyword": "element set"}, {"keyword": "elementary computational proof"}, {"keyword": "elementary divisor rings"}, {"keyword": "elementary facts"}, {"keyword": "elementary infrastructure"}, {"keyword": "elementary measure theory"}, {"keyword": "elementary methods"}, {"keyword": "elementary number theory"}, {"keyword": "elementary proof"}, {"keyword": "elementary proof exist"}, {"keyword": "elementary properties"}, {"keyword": "elementary results"}, {"keyword": "elementary row operations"}, {"keyword": "elementary symmetric polynomials"}, {"keyword": "elementary symmetric polynomials e1"}, {"keyword": "elementary symmetric polynomials sk"}, {"keyword": "elementary theory"}, {"keyword": "elements belong"}, {"keyword": "eliminates duplicate prime factors"}, {"keyword": "elimination contexts"}, {"keyword": "elliott mendelson"}, {"keyword": "elliptic curve"}, {"keyword": "elliptic curve cryptography"}, {"keyword": "embedded logic"}, {"keyword": "embedding path order"}, {"keyword": "emphasising local spatial properties"}, {"keyword": "empirical evaluation"}, {"keyword": "employ code equations"}, {"keyword": "employ messageless guard protocols"}, {"keyword": "employs formal models"}, {"keyword": "employs herbrand"}, {"keyword": "employs reasoning"}, {"keyword": "emptiness check"}, {"keyword": "empty bst"}, {"keyword": "empty rows"}, {"keyword": "enable easy integration"}, {"keyword": "enabled transitions"}, {"keyword": "enables users"}, {"keyword": "enabling concrete execution"}, {"keyword": "encoding"}, {"keyword": "encoding based"}, {"keyword": "encoding function"}, +{"keyword": "encourages code"}, {"keyword": "encryption schemes"}, {"keyword": "enforcing exclusive writes"}, {"keyword": "engineering safety"}, {"keyword": "enhanced confidence"}, {"keyword": "enhanced interleaves predicate turns"}, {"keyword": "ensuing instruction"}, {"keyword": "entailment- minimal"}, {"keyword": "entire cosmedis network"}, {"keyword": "entire development"}, +{"keyword": "entire expansion"}, {"keyword": "entire input sequence"}, {"keyword": "entire polynomial ring"}, {"keyword": "entire prover"}, {"keyword": "entry"}, {"keyword": "entry adapts stream fusion"}, {"keyword": "entry adds quickcheck setup"}, {"keyword": "entry builds"}, {"keyword": "entry collects"}, {"keyword": "entry establishes syntax"}, {"keyword": "entry formally"}, {"keyword": "entry genclock"}, {"keyword": "entry lies"}, {"keyword": "entry presents"}, {"keyword": "entry strong security"}, {"keyword": "entry vcg auctions"}, {"keyword": "entry works"}, {"keyword": "enumeration functions"}, {"keyword": "enumerative combinatorics"}, {"keyword": "epistemic logic"}, {"keyword": "epistemic logic theory"}, {"keyword": "eponym ijcar 2020 paper"}, {"keyword": "eponymous itp 2012 paper"}, {"keyword": "epsilon free top-"}, {"keyword": "equality holds"}, {"keyword": "equational axiomatisation"}, {"keyword": "equational axioms"}, {"keyword": "equational reasoning"}, {"keyword": "equiv 3 pmod 8"}, {"keyword": "equiv_ text"}, {"keyword": "equivalence checker"}, {"keyword": "equivalence classes"}, {"keyword": "equivalence kernels"}, {"keyword": "equivalence proofs"}, {"keyword": "equivalence relation"}, {"keyword": "equivalent characterisations"}, {"keyword": "equivalent conditions"}, {"keyword": "equivalent design theory concepts"}, {"keyword": "equivalent forms"}, {"keyword": "equivalent versions"}, {"keyword": "equivalently wajsberg"}, {"keyword": "erd odblac"}, {"keyword": "erf algorithm"}, {"keyword": "erf algorithm detects"}, {"keyword": "erf algorithm proceeds similarly"}, {"keyword": "ergodic theory"}, {"keyword": "error message"}, {"keyword": "esop 2016 paper"}, {"keyword": "essential parts"}, {"keyword": "essentially follow"}, {"keyword": "establish existence"}, {"keyword": "establish sound type-system-"}, {"keyword": "establishing set-based metric spaces"}, {"keyword": "establishing strong eventual consistency"}, {"keyword": "euclidean axiom"}, {"keyword": "euclidean domains"}, {"keyword": "euclidean space indexed"}, {"keyword": "eudoxus reals"}, {"keyword": "euler ndash"}, {"keyword": "euler stated"}, {"keyword": "euler trails"}, {"keyword": "euler-maclaurin formula relates"}, {"keyword": "eulerian polynomials"}, {"keyword": "eulerian trails"}, {"keyword": "euro-mils project http"}, {"keyword": "evaluating cauchy indices"}, {"keyword": "evaluation homomorphisms"}, {"keyword": "event lists varying"}, {"keyword": "event shared"}, {"keyword": "events"}, {"keyword": "eventual consistency"}, {"keyword": "eventual consistency property"}, {"keyword": "eventually achieve"}, {"keyword": "exact nature"}, {"keyword": "exceeds aleph_1"}, {"keyword": "exception compilation scheme"}, {"keyword": "exceptionally well-suited"}, {"keyword": "exchanging data"}, {"keyword": "exchanging data sets"}, {"keyword": "excluding cubic axioms"}, {"keyword": "excluding point sequences"}, {"keyword": "executable algorithms"}, {"keyword": "executable algorithms based"}, {"keyword": "executable automata"}, {"keyword": "executable characterisation"}, {"keyword": "executable code"}, {"keyword": "executable data structures"}, {"keyword": "executable decision procedure"}, {"keyword": "executable denotational semantics"}, {"keyword": "executable density compiler"}, {"keyword": "executable earley parser"}, {"keyword": "executable emulator"}, {"keyword": "executable equivalence checker"}, {"keyword": "executable formalisation"}, {"keyword": "executable framework"}, {"keyword": "executable function eval"}, {"keyword": "executable functional implementation"}, {"keyword": "executable functions"}, {"keyword": "executable implementation"}, {"keyword": "executable instantiations"}, {"keyword": "executable ml code"}, {"keyword": "executable monitor"}, {"keyword": "executable program"}, {"keyword": "executable proof checker"}, {"keyword": "executable query translation"}, {"keyword": "executable sequent calculus prover"}, {"keyword": "executable simplifier"}, {"keyword": "executable specification"}, {"keyword": "executable tool translating ltl"}, {"keyword": "executable type inference algorithm"}, {"keyword": "executable variant"}, {"keyword": "executable version"}, {"keyword": "execute programs"}, {"keyword": "execution equivalent markings"}, {"keyword": "execution involving integer matrices"}, {"keyword": "execution platform"}, {"keyword": "execution time"}, {"keyword": "execution time compares"}, {"keyword": "executions produce sequences"}, {"keyword": "exhibit awkward interleaving"}, {"keyword": "exhibit core features"}, {"keyword": "existence lemmas"}, {"keyword": "existing afp-entry"}, {"keyword": "existing approaches"}, {"keyword": "existing arguments"}, {"keyword": "existing cc results"}, {"keyword": "existing concepts"}, {"keyword": "existing formal developments"}, {"keyword": "existing formal power series"}, {"keyword": "existing formalization"}, {"keyword": "existing hoare logic"}, {"keyword": "existing implementation"}, {"keyword": "existing integration theory"}, {"keyword": "existing libraries"}, {"keyword": "existing multivariate polynomial libraries"}, {"keyword": "existing package algorithms"}, {"keyword": "existing pen-and-paper proof"}, {"keyword": "existing probability libraries"}, {"keyword": "existing proof"}, {"keyword": "existing proof format"}, {"keyword": "existing replication algorithm satisfies"}, {"keyword": "existing secav system"}, {"keyword": "existing solutions"}, {"keyword": "existing theories"}, {"keyword": "existing tools"}, {"keyword": "existing verification techniques"}, {"keyword": "exotic terms"}, {"keyword": "expand stone relation algebras"}, {"keyword": "expanding contracting intervals"}, {"keyword": "expansive formalisations"}, {"keyword": "expected accuracy"}, {"keyword": "expected height"}, {"keyword": "expected internal path length"}, {"keyword": "expected length"}, {"keyword": "expected number"}, {"keyword": "expected properties"}, {"keyword": "expected utility function"}, {"keyword": "expected utility theory"}, {"keyword": "experiment consisting"}, {"keyword": "experiment performs measures"}, {"keyword": "experimental data suggests"}, {"keyword": "experimental general-purpose proof methods"}, {"keyword": "experimental utilities"}, {"keyword": "experimentally tested"}, {"keyword": "explicit bottom element"}, {"keyword": "explicit construction"}, {"keyword": "explicit expression"}, {"keyword": "explicit formula"}, {"keyword": "explicit metric"}, {"keyword": "explicit syntactic form"}, {"keyword": "explicitly represented"}, {"keyword": "exploiting type classes"}, {"keyword": "exponential functions"}, {"keyword": "exponential generating function"}, {"keyword": "exponential golomb codes"}, {"keyword": "exponential nnf-based algorithms"}, {"keyword": "exponential reconstruction phase"}, {"keyword": "exponential runtime"}, {"keyword": "exponential series"}, {"keyword": "export code"}, {"keyword": "express arbitrary trace-"}, {"keyword": "express hyperproperties"}, {"keyword": "express nuances"}, {"keyword": "express well-"}, {"keyword": "expressing security properties"}, {"keyword": "expressing smart contracts"}, {"keyword": "expression typing rules"}, {"keyword": "expressions involving"}, {"keyword": "expressive extension"}, {"keyword": "expressive logic"}, {"keyword": "expressive power"}, {"keyword": "extended complex plane"}, {"keyword": "extended finite state machines"}, {"keyword": "extended interval analysis"}, {"keyword": "extended language"}, {"keyword": "extended previous"}, {"keyword": "extended real line"}, {"keyword": "extended real numbers"}, {"keyword": "extended real numbers form"}, {"keyword": "extended regular expressions"}, {"keyword": "extended version"}, {"keyword": "extending previous results applying"}, {"keyword": "extensible design permits"}, {"keyword": "extensible library"}, {"keyword": "extensible minimal imperative fragment"}, {"keyword": "extensible record package"}, {"keyword": "extension formally represents"}, {"keyword": "extension theorem employing terminology"}, {"keyword": "extensions written"}, {"keyword": "extensive paper proof"}, {"keyword": "extensively discussed"}, {"keyword": "extent differs"}, {"keyword": "extent required"}, {"keyword": "external communication clocking"}, {"keyword": "external source"}, {"keyword": "external tools"}, {"keyword": "extra assumptions"}, {"keyword": "extra background theory"}, {"keyword": "extra setup"}, {"keyword": "extra-history change history"}, {"keyword": "extract efficient code"}, {"keyword": "extract ocaml code"}, {"keyword": "extremal graph theory"}, {"keyword": "extremal set theory"}, {"keyword": "extreme simplicity"}, {"keyword": "eye color"}, {"keyword": "fabian immler"}, {"keyword": "facilitate formal verification"}, {"keyword": "facilitate integrating future optimizations"}, {"keyword": "facilitating developments"}, {"keyword": "factor polynomials"}, {"keyword": "factor ring"}, {"keyword": "factor square-free integer polynomials"}, {"keyword": "factored representation"}, {"keyword": "factoring algorithm"}, {"keyword": "factoring polynomials"}, {"keyword": "factoring square-free integer polynomials"}, {"keyword": "factorisation algorithm"}, {"keyword": "factorization algorithms"}, {"keyword": "facts involving algebraic laws"}, {"keyword": "failed proof"}, {"keyword": "failing test case"}, {"keyword": "failure assumptions"}, {"keyword": "failure divergence model"}, {"keyword": "failure-prone environments"}, {"keyword": "failures model"}, {"keyword": "failures-divergences pair"}, {"keyword": "fair coin flips"}, {"keyword": "fair prices"}, +{"keyword": "fairly efficient"}, {"keyword": "fairly extensive set"}, {"keyword": "fairly nice"}, {"keyword": "fairly obvious properties"}, {"keyword": "fairly rudimentary"}, {"keyword": "faithful embedding"}, {"keyword": "faithful formalization"}, {"keyword": "fall back"}, {"keyword": "false alarms"}, {"keyword": "falsely claims"}, {"keyword": "familiar first-order logic"}, {"keyword": "familiar real-"}, {"keyword": "famous abc conjecture"}, {"keyword": "famous invisible hand"}, {"keyword": "famous result"}, {"keyword": "far-reaching impossibility theorem"}, {"keyword": "fast iterative algorithm"}, {"keyword": "fast number theoretic transform"}, {"keyword": "fast sat solver"}, {"keyword": "faster pushdown reachability analysis"}, {"keyword": "faug egrave"}, {"keyword": "fault-tolerant midpoint algorithm"}, {"keyword": "faulty process"}, {"keyword": "feasible paths"}, {"keyword": "featherweight ocl"}, {"keyword": "featherweight ocl project"}, {"keyword": "feature dependent types"}, {"keyword": "feature nice mathematical properties"}, {"keyword": "features dynamic thread creation"}, {"keyword": "features exceptions"}, {"keyword": "features monadic types"}, {"keyword": "featuring program-level requirements"}, {"keyword": "fft algorithm"}, {"keyword": "fibonacci number"}, {"keyword": "field accesses"}, {"keyword": "field extensions"}, {"keyword": "field-theoretic nullstellensatz"}, {"keyword": "file read"}, {"keyword": "file write"}, {"keyword": "files"}, {"keyword": "files chap02"}, {"keyword": "filled rows"}, {"keyword": "filtered sets"}, {"keyword": "filtering behavior"}, {"keyword": "fin"}, {"keyword": "final implementation"}, {"keyword": "final states"}, {"keyword": "final theorem statement"}, {"keyword": "finality predicate"}, {"keyword": "finally wondering"}, {"keyword": "financial market"}, {"keyword": "financial products"}, {"keyword": "find definitions"}, {"keyword": "find operation"}, {"keyword": "finding proofs"}, {"keyword": "fine-grained concurrency"}, {"keyword": "finger tree"}, {"keyword": "finite automata"}, {"keyword": "finite boolean algebra"}, {"keyword": "finite carrier set"}, {"keyword": "finite closed semantic tree"}, {"keyword": "finite collection"}, {"keyword": "finite consistent extensions"}, {"keyword": "finite developments theorem"}, {"keyword": "finite dimensional setting"}, {"keyword": "finite dimensional vector space"}, {"keyword": "finite distributive lattice"}, {"keyword": "finite domain consisting"}, {"keyword": "finite field"}, {"keyword": "finite fourier series"}, {"keyword": "finite functions"}, {"keyword": "finite games"}, {"keyword": "finite group"}, {"keyword": "finite infinite lists"}, {"keyword": "finite iteration"}, {"keyword": "finite learning"}, {"keyword": "finite length"}, {"keyword": "finite limits"}, {"keyword": "finite lists"}, {"keyword": "finite maps"}, {"keyword": "finite measure preserving systems"}, {"keyword": "finite partitioning"}, {"keyword": "finite relations"}, {"keyword": "finite search space"}, {"keyword": "finite set"}, {"keyword": "finite sound extensions"}, {"keyword": "finite state machines"}, {"keyword": "finite state markov chains"}, {"keyword": "finite stuttering"}, {"keyword": "finite support"}, {"keyword": "finite symbolic execution graph"}, {"keyword": "finite trees"}, {"keyword": "finite types"}, {"keyword": "finite-dimensional vector spaces"}, {"keyword": "finitely additive probability inequalities"}, {"keyword": "finitely additive probability logic"}, {"keyword": "finitely generated polynomial ideals"}, {"keyword": "finitely supported"}, {"keyword": "finiteness assumptions"}, {"keyword": "fips 180-4 nist"}, {"keyword": "fips 186-4"}, {"keyword": "first-order clauses"}, {"keyword": "first-order functional language"}, {"keyword": "first-order logic"}, {"keyword": "first-order logic completeness theorem"}, {"keyword": "first-order logic metatheory"}, {"keyword": "first-order parameters"}, {"keyword": "first-order prover"}, {"keyword": "first-order quantification"}, {"keyword": "first-order query evaluation"}, {"keyword": "first-order real arithmetic"}, {"keyword": "first-order terms"}, {"keyword": "first-order theory"}, {"keyword": "first-order unification algorithm"}, {"keyword": "fisher yates algorithm"}, {"keyword": "fitting theory"}, {"keyword": "fixed access frequencies"}, {"keyword": "fixed arbitrary length"}, {"keyword": "fixed arguments"}, {"keyword": "fixed bound"}, {"keyword": "fixed choice"}, {"keyword": "fixed database"}, {"keyword": "fixed finite instance"}, {"keyword": "fixed finite set"}, {"keyword": "fixed fraction"}, {"keyword": "fixed lexicographical order"}, {"keyword": "fixed natural number"}, {"keyword": "fixed number"}, {"keyword": "fixed points"}, {"keyword": "fixed prime"}, {"keyword": "fixed probability"}, {"keyword": "fixed service"}, {"keyword": "fixed set"}, {"keyword": "fixed time-unit"}, {"keyword": "fixed upper bound"}, {"keyword": "fixed-point theorem"}, {"keyword": "fixed-width machine words"}, {"keyword": "fixpoint operations lfp"}, {"keyword": "fixpoint theorem"}, {"keyword": "flexible extension"}, {"keyword": "flexible set-based theorems"}, {"keyword": "flexray communication protocol"}, {"keyword": "floating-point arithmetic"}, {"keyword": "floating-point computation"}, {"keyword": "floating-point modulo function"}, {"keyword": "floating-point numbers"}, {"keyword": "floating-point operations"}, {"keyword": "floor divided"}, {"keyword": "floor randomly"}, {"keyword": "florian kammueller"}, {"keyword": "flow saturates"}, {"keyword": "flow-sensitive type system"}, {"keyword": "flowgraph-based program model"}, {"keyword": "flows model"}, {"keyword": "floyd-warshall algorithm"}, {"keyword": "floyd-warshall algorithm flo62"}, {"keyword": "flyspeck project"}, {"keyword": "fmcad2022 paper ssst22"}, {"keyword": "fntt running time"}, {"keyword": "fol theories extending"}, {"keyword": "fold build rule"}, {"keyword": "folder commonset"}, {"keyword": "folder listinf"}, {"keyword": "folklore results related"}, {"keyword": "follow stefan schwoon"}, {"keyword": "foreach combinators"}, {"keyword": "form bigwedge_"}, {"keyword": "form construction algorithm"}, {"keyword": "formal analysis"}, {"keyword": "formal correctness proofs"}, {"keyword": "formal cryptographic protocol verification"}, {"keyword": "formal definitions"}, {"keyword": "formal development"}, {"keyword": "formal differentiation"}, {"keyword": "formal framework"}, {"keyword": "formal guarantees"}, {"keyword": "formal implementation"}, {"keyword": "formal language"}, {"keyword": "formal laurent series"}, {"keyword": "formal linear algebraic techniques"}, {"keyword": "formal memory model"}, {"keyword": "formal methods"}, {"keyword": "formal model"}, {"keyword": "formal power series"}, {"keyword": "formal programming language semantics"}, {"keyword": "formal proof"}, {"keyword": "formal proof assistant"}, {"keyword": "formal proof closely"}, {"keyword": "formal proof technology"}, {"keyword": "formal protocol verification"}, {"keyword": "formal puiseux series"}, {"keyword": "formal reasoning"}, {"keyword": "formal refutational completeness proofs"}, {"keyword": "formal representations"}, {"keyword": "formal semantics"}, {"keyword": "formal semantics builds"}, {"keyword": "formal semantics complies"}, {"keyword": "formal semantics designed"}, {"keyword": "formal summation"}, {"keyword": "formal text lines"}, {"keyword": "formal theory"}, {"keyword": "formal verification"}, {"keyword": "formal version"}, {"keyword": "formal words"}, {"keyword": "formalisation"}, {"keyword": "formalisation accompanies"}, {"keyword": "formalisation continues"}, {"keyword": "formalisation hold"}, {"keyword": "formalisation presents"}, {"keyword": "formalisation underlying"}, {"keyword": "formalising baker"}, {"keyword": "formalising cryptographic arguments"}, {"keyword": "formalising single binder calculi"}, {"keyword": "formalising t-designs"}, {"keyword": "formalization"}, {"keyword": "formalization builds"}, {"keyword": "formalization consists"}, {"keyword": "formalization effort necessitated"}, {"keyword": "formalization reveals"}, {"keyword": "formalization techniques presented"}, {"keyword": "formalization uncovered"}, {"keyword": "formalizations differ mathematically"}, {"keyword": "formalizing compiler transformations"}, {"keyword": "formalizing game-based proofs"}, {"keyword": "formally connect"}, {"keyword": "formally establish properties"}, {"keyword": "formally reason"}, {"keyword": "formally verified"}, {"keyword": "formally verified abstract account"}, {"keyword": "formally verified checkers"}, {"keyword": "formally verified clrs algorithms"}, {"keyword": "formally verified implementation"}, {"keyword": "formally verified model"}, {"keyword": "formally verified oracle"}, {"keyword": "formally verified quantifier elimination"}, {"keyword": "formally verified security analysis"}, {"keyword": "formally verified solver"}, {"keyword": "formally verify gauss-seidel"}, {"keyword": "formula mdp ta pta"}, {"keyword": "formula represent propositional formulas"}, {"keyword": "formulas"}, {"keyword": "formulas assuming"}, {"keyword": "formulas obtained"}, {"keyword": "formulate classical propositional logic"}, {"keyword": "forthcoming paper"}, {"keyword": "forward algorithm"}, {"keyword": "forward data packets"}, {"keyword": "forward differentiation"}, {"keyword": "forward packets"}, {"keyword": "found cryptic"}, {"keyword": "foundation presented"}, {"keyword": "foundational assumptions"}, {"keyword": "foundational metaphysical theory"}, {"keyword": "foundational shared-variable concurrency method"}, {"keyword": "foundational structures"}, {"keyword": "foundations established"}, {"keyword": "fourier sequences"}, {"keyword": "fourier series"}, {"keyword": "fourteen lemmas"}, {"keyword": "fourth sylow theorems"}, {"keyword": "frac 1 p-1"}, {"keyword": "fractional assertions"}, {"keyword": "fractional permissions"}, {"keyword": "frame rule"}, {"keyword": "framed links"}, {"keyword": "framed links closely linked"}, {"keyword": "framework features"}, {"keyword": "framework supports semantic annotations"}, {"keyword": "framing conditions"}, {"keyword": "frank gray"}, {"keyword": "fredkin cacm 1960"}, {"keyword": "free"}, {"keyword": "free basis"}, {"keyword": "free boolean algebra"}, {"keyword": "free category"}, {"keyword": "free groups"}, {"keyword": "free logic"}, {"keyword": "free monoid"}, {"keyword": "free monoidal category"}, {"keyword": "free theorems"}, {"keyword": "free variables"}, {"keyword": "frequency moment"}, {"keyword": "friendship theorem"}, {"keyword": "frobenius endomorphism"}, {"keyword": "frobenius homomorphism"}, {"keyword": "frobenius reciprocity"}, {"keyword": "frobenius theorem"}, {"keyword": "frobenius theorem based"}, {"keyword": "fulfilling van der waerden"}, {"keyword": "full asymptotic expansion"}, {"keyword": "full automation"}, {"keyword": "full bridge rule"}, {"keyword": "full characterization"}, {"keyword": "full classical propositional logic"}, {"keyword": "full classification"}, {"keyword": "full details"}, {"keyword": "full extent"}, {"keyword": "full machinery"}, {"keyword": "full parametric solution"}, {"keyword": "full permission"}, {"keyword": "full proof"}, {"keyword": "full range"}, {"keyword": "full sequential fragment"}, {"keyword": "fully"}, {"keyword": "fully abstract"}, {"keyword": "fully automated"}, {"keyword": "fully automated methods"}, {"keyword": "fully automated translation"}, {"keyword": "fully automatic tools"}, {"keyword": "fully canceled words"}, {"keyword": "fully connected subgraph"}, {"keyword": "fully corrupted"}, {"keyword": "fully executable functional implementation"}, {"keyword": "fully executable solver"}, {"keyword": "fully formal"}, {"keyword": "fully formally verified"}, {"keyword": "fully json compliant"}, {"keyword": "fully structured"}, {"keyword": "fully verified"}, {"keyword": "fully-automated approach"}, {"keyword": "fully-featured compositional framework"}, {"keyword": "function"}, {"keyword": "function calls"}, {"keyword": "function checking"}, {"keyword": "function definitions"}, {"keyword": "function elts"}, {"keyword": "function eval"}, {"keyword": "function eval checking"}, {"keyword": "function eval solves capturability"}, {"keyword": "function interpolation"}, {"keyword": "function radical"}, {"keyword": "function satisfies"}, {"keyword": "function spaces"}, {"keyword": "function zeta"}, {"keyword": "functional algorithm"}, {"keyword": "functional arrays"}, {"keyword": "functional automata"}, {"keyword": "functional correctness"}, {"keyword": "functional data structures"}, {"keyword": "functional equation"}, {"keyword": "functional implementation"}, {"keyword": "functional implementation based"}, {"keyword": "functional languages"}, {"keyword": "functional logic"}, {"keyword": "functional modeling language hol"}, {"keyword": "functional program"}, {"keyword": "functional programming language"}, {"keyword": "functional recognizer modeling earley"}, {"keyword": "functional representation"}, {"keyword": "functional type theory"}, {"keyword": "functions approximating"}, {"keyword": "functions learnable"}, {"keyword": "functions thetasym"}, {"keyword": "functor category"}, {"keyword": "functor composition"}, {"keyword": "functorial operations"}, {"keyword": "fundamental banach spaces"}, {"keyword": "fundamental binary operations allowing"}, {"keyword": "fundamental building block"}, {"keyword": "fundamental closest pair"}, {"keyword": "fundamental interest"}, {"keyword": "fundamental metaphysical theory"}, {"keyword": "fundamental objects"}, {"keyword": "fundamental problems"}, {"keyword": "fundamental properties"}, {"keyword": "fundamental result"}, {"keyword": "fundamental solution"}, {"keyword": "fundamental subspaces"}, {"keyword": "fundamental theorem"}, {"keyword": "fusc function"}, {"keyword": "fusible list functions"}, {"keyword": "future articles"}, {"keyword": "future combinations"}, {"keyword": "future development"}, {"keyword": "future formalisations requiring"}, {"keyword": "future probabilistic proof systems"}, {"keyword": "future related mechanisation efforts"}, {"keyword": "future separation logic developments"}, {"keyword": "fwf"}, {"keyword": "gained experience"}, {"keyword": "gale stewart theorem"}, {"keyword": "gale-shapley stable matching"}, {"keyword": "galois connections"}, {"keyword": "galois theory"}, {"keyword": "game theoretic issues"}, {"keyword": "game theory"}, {"keyword": "game-based cryptographic security notions"}, {"keyword": "game-based definitions"}, {"keyword": "game-based proofs"}, {"keyword": "game-hopping style advocated"}, {"keyword": "gamma"}, {"keyword": "gamma finally"}, {"keyword": "gamma function"}, {"keyword": "gamma holds"}, {"keyword": "gamma quad text"}, {"keyword": "gau lucas theorem"}, {"keyword": "gauss-jordan algorithm"}, {"keyword": "gauss-jordan algorithm states"}, {"keyword": "gaussian integer formalisation"}, {"keyword": "gaussian integers"}, {"keyword": "gdpr compliance verification"}, {"keyword": "general attacker"}, {"keyword": "general balanced trees"}, {"keyword": "general banach spaces"}, {"keyword": "general case"}, {"keyword": "general cost functions"}, {"keyword": "general definition"}, {"keyword": "general directed graph library"}, {"keyword": "general form"}, {"keyword": "general formal proof techniques"}, {"keyword": "general formulation"}, {"keyword": "general framework"}, {"keyword": "general geometric facts"}, {"keyword": "general halting problem"}, {"keyword": "general infinite processes"}, {"keyword": "general lemma"}, {"keyword": "general library"}, {"keyword": "general models"}, {"keyword": "general notion"}, {"keyword": "general possibility theorem"}, {"keyword": "general predication"}, {"keyword": "general problem"}, {"keyword": "general properties"}, {"keyword": "general purpose data structure"}, {"keyword": "general recursion"}, {"keyword": "general relativity"}, {"keyword": "general result"}, {"keyword": "general scheme"}, {"keyword": "general sets"}, {"keyword": "general setting"}, {"keyword": "general simplex algorithm"}, {"keyword": "general solver"}, {"keyword": "general techniques"}, {"keyword": "general theorem"}, {"keyword": "general theory"}, {"keyword": "general triangle"}, {"keyword": "general version"}, {"keyword": "general-purpose coinductive data types"}, {"keyword": "generalisation bnfcc"}, {"keyword": "generalise relation algebras"}, {"keyword": "generalised binary modalities"}, {"keyword": "generalised binomial coefficients"}, {"keyword": "generalised form"}, {"keyword": "generalised rewriting"}, {"keyword": "generalising tla action formulas"}, {"keyword": "generalized intervals"}, {"keyword": "generalized multiset ordering"}, {"keyword": "generalized noninterference security"}, {"keyword": "generalized recurrence"}, {"keyword": "generalized recurrence relation"}, {"keyword": "generalized sumcheck protocol"}, {"keyword": "generalized sylvester matrices"}, {"keyword": "generalizes sutherland"}, {"keyword": "generally detectable"}, {"keyword": "generate"}, {"keyword": "generate code"}, {"keyword": "generate duplicates"}, {"keyword": "generate efficient code"}, {"keyword": "generate executable code"}, {"keyword": "generate executable imperative programs"}, {"keyword": "generate human-readable secav proofs"}, {"keyword": "generate reverse-symmetric claims"}, {"keyword": "generate theorem prover code"}, {"keyword": "generated code"}, {"keyword": "generated code implements"}, {"keyword": "generated document"}, {"keyword": "generated inputs"}, {"keyword": "generated test suite"}, {"keyword": "generating function equivalence proof"}, {"keyword": "generating function proof"}, {"keyword": "generating test cases"}, {"keyword": "generative probabilistic"}, {"keyword": "generic abstract interpreter"}, {"keyword": "generic algebraic middle-layer"}, {"keyword": "generic algorithm"}, {"keyword": "generic consistency ---"}, {"keyword": "generic construction"}, {"keyword": "generic dfs algorithm framework"}, {"keyword": "generic diamond lemma reduction"}, {"keyword": "generic fixed-width words"}, {"keyword": "generic framework"}, {"keyword": "generic framework semantics"}, {"keyword": "generic imperative algorithms"}, {"keyword": "generic imperative language embedded"}, {"keyword": "generic instantiation based"}, {"keyword": "generic join algorithm"}, {"keyword": "generic kind"}, {"keyword": "generic object model independent"}, {"keyword": "generic operations"}, {"keyword": "generic properties"}, {"keyword": "generic push-relabel algorithm"}, {"keyword": "generic results"}, {"keyword": "generic rules resulting"}, {"keyword": "generic tactics"}, {"keyword": "generic theory"}, {"keyword": "generic type class implementation"}, {"keyword": "generic type classes"}, {"keyword": "generic types"}, {"keyword": "generic unwinding theorem"}, {"keyword": "generic work-list algorithm"}, {"keyword": "generic worklist algorithm"}, {"keyword": "generic-deriving package"}, {"keyword": "geocoq library"}, {"keyword": "geodesic gromov-hyperbolic space"}, {"keyword": "geodesic metric space"}, {"keyword": "geodesic spaces"}, {"keyword": "geodesic triangles"}, {"keyword": "geometric folklore proof rigorous"}, {"keyword": "geometric interpretation"}, {"keyword": "geometric probability"}, {"keyword": "geometric proof"}, {"keyword": "geometric relation"}, {"keyword": "geometric sketches"}, {"keyword": "geometric theorems"}, {"keyword": "georg kreisel"}, {"keyword": "george boolos gave"}, {"keyword": "georges-louis leclerc"}, {"keyword": "georgia notes"}, {"keyword": "geq 1"}, {"keyword": "geq 108m"}, {"keyword": "geq 2 n-1"}, {"keyword": "geq 28m 3"}, {"keyword": "geq 3"}, {"keyword": "geq 324"}, {"keyword": "gewirth"}, {"keyword": "ghost operations"}, {"keyword": "gibbard-satterthwaite theorem"}, {"keyword": "girard newton theorem"}, {"keyword": "girard-tait style logical relation"}, {"keyword": "girth chromatic entry"}, {"keyword": "girth-chromatic number theorem"}, {"keyword": "glibc strlen function"}, {"keyword": "global context"}, {"keyword": "global context transformations"}, {"keyword": "global model"}, {"keyword": "global security guarantee"}, {"keyword": "global variables"}, {"keyword": "gmw protocol"}, {"keyword": "golden ratio"}, {"keyword": "good class"}, {"keyword": "good closure properties"}, {"keyword": "good lower bound"}, {"keyword": "goto rule"}, {"keyword": "gou zel"}, {"keyword": "gps receiver"}, {"keyword": "gps satellite"}, {"keyword": "gr bner bases"}, {"keyword": "gr bner basis"}, {"keyword": "graham jameson"}, {"keyword": "gram-schmidt process"}, {"keyword": "grammar based fuzzing"}, {"keyword": "graph colourings"}, {"keyword": "graph isomorphism"}, {"keyword": "graph lemma quantifies"}, {"keyword": "graph node"}, {"keyword": "graph operations"}, {"keyword": "graph properties expressed"}, {"keyword": "graph regularity"}, {"keyword": "graph representation"}, {"keyword": "graph saturation"}, {"keyword": "graph theorem states"}, {"keyword": "graph theoretic results"}, {"keyword": "graph theory"}, {"keyword": "graph- transformation based method"}, {"keyword": "graph-theoretic aspects"}, {"keyword": "grat format"}, {"keyword": "great body"}, {"keyword": "great mathematical interest"}, {"keyword": "greater computational cost"}, {"keyword": "greater detail"}, {"keyword": "greatest common divisor"}, {"keyword": "greatest fixed points"}, {"keyword": "greatest fixpoints"}, {"keyword": "greatly reducing"}, {"keyword": "greedy algorithms"}, {"keyword": "greibach normal form"}, {"keyword": "griffin observed"}, {"keyword": "gromov boundary"}, {"keyword": "gromov hyperbolic"}, {"keyword": "gromov hyperbolic spaces"}, {"keyword": "ground resolution"}, {"keyword": "ground terms induced"}, {"keyword": "ground totality"}, {"keyword": "ground tree transducers"}, {"keyword": "grounding sets"}, {"keyword": "group"}, {"keyword": "group action"}, {"keyword": "group divisible designs"}, {"keyword": "group generated"}, {"keyword": "group representation"}, {"keyword": "group ring"}, {"keyword": "group theory results"}, {"keyword": "group_add class"}, {"keyword": "growth rates"}, {"keyword": "guarantee condition"}, {"keyword": "guarantee information flow noninterference"}, {"keyword": "guarantee minimality"}, {"keyword": "guarantee safety"}, {"keyword": "guard protocols"}, {"keyword": "guarded recursive equations"}, {"keyword": "guided tour"}, {"keyword": "guiding proof search"}, {"keyword": "hadjicostas ndash"}, {"keyword": "hahn decomposition theorem"}, {"keyword": "hales jewett theorem"}, {"keyword": "hales jewett theorem presented"}, {"keyword": "halting problem"}, {"keyword": "hamiltonian path problem"}, {"keyword": "hancl asserting"}, {"keyword": "hand canonical notions"}, {"keyword": "hand waving"}, {"keyword": "hand-written theory files"}, {"keyword": "handle binding"}, {"keyword": "handle changing beliefs"}, {"keyword": "handle equality tests"}, {"keyword": "handle incidence relations"}, {"keyword": "handling inconsistency"}, {"keyword": "handling padding"}, {"keyword": "handling variable binding"}, {"keyword": "handwritten reference implementations"}, {"keyword": "hare cycle-finding algorithm ascribed"}, {"keyword": "harm security"}, {"keyword": "harmonic numbers"}, {"keyword": "hash families"}, {"keyword": "hash functions"}, {"keyword": "haskell"}, {"keyword": "haskell library"}, {"keyword": "haskell tool called fffuu"}, {"keyword": "healthcare iot system"}, {"keyword": "heap location"}, {"keyword": "heap operations"}, {"keyword": "heap property"}, {"keyword": "heap sort"}, {"keyword": "heavily depend"}, {"keyword": "hellip"}, {"keyword": "helper lemmas"}, {"keyword": "henkin style"}, {"keyword": "henkin witnesses"}, {"keyword": "herbrand universe"}, {"keyword": "hereditarily finite"}, {"keyword": "hereditarily finite set theory"}, {"keyword": "hereditarily finite sets"}, {"keyword": "hereditary base 2"}, {"keyword": "hereditary multisets"}, {"keyword": "herglotz"}, {"keyword": "hermite normal form"}, {"keyword": "hermite--lindemann--weierstra transcendence theorem"}, {"keyword": "hermite-lindemann-weierstra theorem"}, {"keyword": "hermitian matrix"}, {"keyword": "heterogeneous subsystems"}, {"keyword": "heuristics automatically pick"}, {"keyword": "hf set theory"}, {"keyword": "hidden markov models"}, {"keyword": "hierarchical automaton"}, {"keyword": "hierarchical logger"}, {"keyword": "hierarchical transactions"}, {"keyword": "high annotation overhead"}, {"keyword": "high edge probability"}, {"keyword": "high efficiency"}, {"keyword": "high level attacks"}, {"keyword": "high school"}, {"keyword": "high-level algorithm"}, {"keyword": "high-level proofs"}, {"keyword": "high-level security goals"}, {"keyword": "high-level specification language jml"}, {"keyword": "high-level style"}, {"keyword": "high-level type systems"}, {"keyword": "high-level view"}, {"keyword": "high-school student"}, {"keyword": "higher categories"}, {"keyword": "higher edge probability"}, {"keyword": "higher entity"}, {"keyword": "higher kleene algebras"}, {"keyword": "higher order logic"}, {"keyword": "higher rewriting"}, {"keyword": "higher-dimensional automata"}, {"keyword": "higher-dimensional rewriting"}, {"keyword": "higher-order frequency moments"}, {"keyword": "higher-order functions"}, {"keyword": "higher-order logic"}, {"keyword": "higher-order pattern e-unification"}, {"keyword": "higher-order pattern unification"}, {"keyword": "higher-order permutative rewrite rule"}, {"keyword": "higher-order probabilistic programming languages"}, {"keyword": "higher-order probabilistic programs"}, {"keyword": "higher-order superposition calculus"}, {"keyword": "higher-order term algebra"}, {"keyword": "higher-order terms"}, {"keyword": "highly informal"}, {"keyword": "highly modular"}, {"keyword": "highly non-elementary mathematical tools"}, {"keyword": "highly probable assumption"}, {"keyword": "highly recommend"}, {"keyword": "hilbert systems"}, {"keyword": "hilbert-style proof system"}, {"keyword": "hintikka set"}, {"keyword": "historical perspective"}, {"keyword": "hmac standard"}, {"keyword": "hoare logic"}, {"keyword": "hoare logic based"}, {"keyword": "hoare triples"}, {"keyword": "hoc fashion"}, {"keyword": "hoc network"}, {"keyword": "hoc on-demand distance vector"}, {"keyword": "hoelder inequalities"}, {"keyword": "hol"}, {"keyword": "hol code generation facilities"}, {"keyword": "hol code generator"}, {"keyword": "hol definitions"}, {"keyword": "hol experts"}, {"keyword": "hol formalization"}, {"keyword": "hol formalization builds"}, {"keyword": "hol formalization covers"}, {"keyword": "hol formalization refines"}, {"keyword": "hol function"}, {"keyword": "hol function definition"}, {"keyword": "hol library"}, {"keyword": "hol light"}, {"keyword": "hol light development"}, {"keyword": "hol light formalisation"}, {"keyword": "hol light formalization"}, {"keyword": "hol light version"}, {"keyword": "hol logic system"}, {"keyword": "hol multivariate analysis"}, {"keyword": "hol nominal"}, {"keyword": "hol overhead"}, {"keyword": "hol proof assistant"}, {"keyword": "hol set"}, {"keyword": "hol sources underlying"}, {"keyword": "hol standard library"}, {"keyword": "hol theorem"}, {"keyword": "hol theory listextras"}, {"keyword": "hol type system"}, {"keyword": "hol types"}, {"keyword": "hol users"}, {"keyword": "hol-algebra library"}, {"keyword": "hol-based afp entry"}, {"keyword": "hol-csp"}, {"keyword": "hol-csp improving"}, {"keyword": "hol-multivariate analysis library"}, {"keyword": "hol-multivariate-analysis session"}, {"keyword": "hol4 formalization"}, {"keyword": "holcf extension"}, {"keyword": "holcf package"}, {"keyword": "holds"}, {"keyword": "holomorphic automorphisms"}, {"keyword": "holzf theory"}, {"keyword": "hom embedding"}, {"keyword": "homogeneous linear diophantine equations"}, {"keyword": "homological argument"}, {"keyword": "homomorphic functions"}, {"keyword": "homotopy type theory"}, {"keyword": "hoops"}, {"keyword": "horn- renamable"}, {"keyword": "html documents"}, {"keyword": "human mortality"}, {"keyword": "human readable style"}, {"keyword": "human-readable fast-to-replay proof scripts"}, {"keyword": "hybrid game"}, {"keyword": "hybrid logic"}, {"keyword": "hybrid mixture"}, {"keyword": "hybrid programs"}, {"keyword": "hyper hoare logic"}, {"keyword": "hyper hoare logic subsumes"}, {"keyword": "hyperbolic geometry"}, {"keyword": "hyperdual extensions"}, {"keyword": "hyperdual numbers"}, {"keyword": "hypergraph decompositions"}, {"keyword": "hypergraph language"}, {"keyword": "hypergraph theory"}, {"keyword": "hypothesis stating"}, {"keyword": "ideal real simulation paradigm"}, {"keyword": "ideal showcase"}, {"keyword": "ideas borrowed"}, {"keyword": "identical sequence elements"}, {"keyword": "identified inconsistencies"}, {"keyword": "identifies posix"}, {"keyword": "identify bugs"}, {"keyword": "identify undesired information leaks"}, {"keyword": "identifying finite-dimensional operators"}, {"keyword": "ieee-754 floating-point arithmetic"}, {"keyword": "ifip networking 2016"}, {"keyword": "ijcar 2006 paper"}, {"keyword": "ijcar 2014 publication"}, {"keyword": "ijcar 2022 paper rensets"}, {"keyword": "ikkbz produces"}, {"keyword": "imaginary part"}, {"keyword": "immediately offer"}, {"keyword": "immensely helpful"}, {"keyword": "immutable arrays"}, {"keyword": "imp commands"}, {"keyword": "imp language"}, {"keyword": "impact"}, {"keyword": "imperative data structures"}, {"keyword": "imperative executable code"}, {"keyword": "imperative hol"}, {"keyword": "imperative hol heap monad"}, {"keyword": "imperative hol programs"}, {"keyword": "imperative implementation"}, {"keyword": "imperative language constructs"}, {"keyword": "imperative language imp"}, {"keyword": "imperative loop constructs"}, {"keyword": "imperative programming languages"}, {"keyword": "imperative programs"}, {"keyword": "imperative refinement framework"}, +{"keyword": "imperative style"}, {"keyword": "imperative target language"}, {"keyword": "implement probabilistic algorithms"}, {"keyword": "implement saturation calculi"}, {"keyword": "implement translation functions"}, {"keyword": "implementation"}, {"keyword": "implementation details"}, {"keyword": "implementation matches"}, {"keyword": "implementation mixes"}, {"keyword": "implementation relates pointer-based computation"}, {"keyword": "implementation runs"}, {"keyword": "implementation supports set membership"}, {"keyword": "implemented multi-"}, {"keyword": "implemented tactics"}, {"keyword": "implemented tail recursively"}, {"keyword": "implicit flows"}, {"keyword": "implicit reasoning steps"}, {"keyword": "implies confluence"}, {"keyword": "import-expert format"}, {"keyword": "important classes"}, {"keyword": "important concentration inequalities"}, {"keyword": "important concepts"}, {"keyword": "important consequences"}, {"keyword": "important correctness property"}, {"keyword": "important data structure"}, {"keyword": "important functions"}, {"keyword": "important introductory theorems"}, {"keyword": "important meta-theoretic results"}, {"keyword": "important models"}, {"keyword": "important problem"}, {"keyword": "important properties"}, {"keyword": "important result"}, {"keyword": "important role"}, {"keyword": "important specializations"}, {"keyword": "important theorem"}, {"keyword": "impossibility theorem due"}, {"keyword": "improvements compared"}, {"keyword": "imre lakatos"}, {"keyword": "in-place heapsort"}, {"keyword": "incidence matrix representation"}, {"keyword": "incidence set systems"}, {"keyword": "incidence system"}, {"keyword": "incidence system isomorphisms"}, {"keyword": "incidence system properties"}, {"keyword": "inclusion isotone"}, {"keyword": "incoming edges"}, {"keyword": "incoming edges equals"}, {"keyword": "incomparable results"}, {"keyword": "incompleteness theorem"}, {"keyword": "inconsistent bounds"}, {"keyword": "inconsistent theory"}, {"keyword": "incorporate smoothly"}, {"keyword": "incorrectly initialized contract"}, {"keyword": "incorrectness logic 8"}, {"keyword": "incorrectness logics"}, {"keyword": "increased demand"}, {"keyword": "increasing rational sequence r_n"}, {"keyword": "increasingly important"}, {"keyword": "incredible proof machine"}, {"keyword": "incremental verification"}, {"keyword": "incrementally check"}, {"keyword": "ind-cpa security proof"}, {"keyword": "indefinitely large set"}, {"keyword": "indefinitely long sequence"}, {"keyword": "independent authors"}, {"keyword": "independent axioms"}, {"keyword": "independent events"}, {"keyword": "independent families"}, {"keyword": "independent interest"}, {"keyword": "independent modules"}, {"keyword": "independent publication"}, {"keyword": "independent random variables"}, {"keyword": "independent runs"}, {"keyword": "indexing set"}, {"keyword": "indistinguishable security"}, {"keyword": "individual accepted"}, {"keyword": "individual components"}, {"keyword": "individual computing nodes"}, {"keyword": "individual program behaviours"}, {"keyword": "individual program executions"}, {"keyword": "individual theorems"}, {"keyword": "induced maps"}, {"keyword": "induction"}, {"keyword": "induction hypothesis"}, {"keyword": "induction principle"}, {"keyword": "induction rule"}, {"keyword": "induction schemes"}, {"keyword": "inductive definition"}, {"keyword": "inductive invariant proofs"}, {"keyword": "inductive method"}, {"keyword": "inductive predicates"}, {"keyword": "inductive sets"}, {"keyword": "inductive unwinding theorem"}, {"keyword": "industrial separation kernel"}, {"keyword": "industrial systems"}, {"keyword": "inefficient variant"}, {"keyword": "inequality involving expectations"}, {"keyword": "inequality states"}, {"keyword": "inertial observers"}, {"keyword": "inf-preserving predicate transformers"}, {"keyword": "inf-preserving transformers"}, {"keyword": "infer interleaves statements"}, {"keyword": "inference rules"}, {"keyword": "inference step"}, {"keyword": "inference system presented"}, {"keyword": "infinitary nominal data type"}, {"keyword": "infinitary version"}, {"keyword": "infinite"}, {"keyword": "infinite behavior traces"}, {"keyword": "infinite conjunctions"}, {"keyword": "infinite derivation trees"}, {"keyword": "infinite domain"}, {"keyword": "infinite element"}, {"keyword": "infinite execution"}, {"keyword": "infinite form"}, {"keyword": "infinite games"}, {"keyword": "infinite graphs"}, {"keyword": "infinite horizon mdps"}, {"keyword": "infinite iteration"}, {"keyword": "infinite key range"}, {"keyword": "infinite length"}, {"keyword": "infinite measure"}, {"keyword": "infinite message streams represented"}, {"keyword": "infinite paths"}, {"keyword": "infinite polynomial"}, {"keyword": "infinite ramsey theorem"}, {"keyword": "infinite sequence"}, {"keyword": "infinite series"}, {"keyword": "infinite series built"}, {"keyword": "infinite set"}, {"keyword": "infinite subset"}, {"keyword": "infinite trees branching"}, {"keyword": "infinite type"}, {"keyword": "infinite-dimensional vector spaces"}, {"keyword": "infinitely generated"}, {"keyword": "infinitesimal components"}, {"keyword": "influential works"}, {"keyword": "info 96638976x 34"}, {"keyword": "info research codegen"}, {"keyword": "informal description"}, {"keyword": "informal presentation"}, {"keyword": "informal proof"}, {"keyword": "information flow control"}, {"keyword": "information flow correctness"}, {"keyword": "information flow correctness notion"}, {"keyword": "information flow security"}, {"keyword": "information managed"}, {"keyword": "information observed"}, {"keyword": "information processing letters 29"}, {"keyword": "information required"}, {"keyword": "information whatsoever flows"}, {"keyword": "information-flow security aims"}, {"keyword": "information-flow security applicable"}, {"keyword": "infrastructure previously"}, {"keyword": "ingo van duijn"}, {"keyword": "inherently based"}, {"keyword": "initial conversion"}, {"keyword": "initial nonterminal"}, {"keyword": "initial proof"}, {"keyword": "initial segment"}, {"keyword": "initial segment condition"}, {"keyword": "initial specification"}, {"keyword": "initial states"}, {"keyword": "injection 2 mathbb"}, {"keyword": "inline caching optimization"}, {"keyword": "inlines function application"}, {"keyword": "input generators"}, {"keyword": "input infinite sequences"}, {"keyword": "input lists"}, {"keyword": "input output pairs"}, {"keyword": "input parameter"}, {"keyword": "input processes"}, {"keyword": "input programs"}, {"keyword": "input simultaneously"}, {"keyword": "insecure channel controlled"}, {"keyword": "insertion sort"}, {"keyword": "insertion sort algorithm"}, {"keyword": "instance---many-sorted fol"}, {"keyword": "instantiation boils"}, {"keyword": "instantiation draws heavily"}, {"keyword": "instantiation reuses"}, {"keyword": "instruction set architecture"}, {"keyword": "int_0 1"}, {"keyword": "int_0 infty b_n"}, {"keyword": "int_a kappa_x"}, {"keyword": "integer coefficients"}, {"keyword": "integer components"}, {"keyword": "integer hull"}, {"keyword": "integer keys"}, {"keyword": "integer lattice 8484"}, {"keyword": "integer parameter"}, {"keyword": "integer polynomial belongs"}, {"keyword": "integer polynomials"}, {"keyword": "integer ring modulo"}, {"keyword": "integer variables"}, {"keyword": "integer-indexed maps"}, {"keyword": "integers"}, {"keyword": "integers based"}, {"keyword": "integers hurwitz"}, {"keyword": "integers modulo"}, {"keyword": "integrable simple functions"}, {"keyword": "integral domains"}, {"keyword": "integrate interval analysis"}, {"keyword": "integrated memory models"}, {"keyword": "integrated pide document model"}, {"keyword": "integrating interval analysis"}, {"keyword": "integration technique employs lex"}, {"keyword": "intensional higher-order modal logic"}, {"keyword": "interactive automated relativization"}, {"keyword": "interactive convergence algorithm"}, {"keyword": "interactive program verification environment"}, {"keyword": "interactive proof"}, {"keyword": "interactive proof assistant"}, {"keyword": "interactive theorem prover"}, {"keyword": "interactive theorem proving"}, {"keyword": "interactive theorem proving sch16"}, {"keyword": "interactive visual theorem prover"}, {"keyword": "interactively find"}, {"keyword": "interdisciplinary project"}, {"keyword": "interest accrued"}, {"keyword": "interest distributed"}, {"keyword": "interest rate"}, {"keyword": "interesting case study"}, {"keyword": "interesting data structure"}, {"keyword": "interesting formalization exercise"}, {"keyword": "interesting format"}, {"keyword": "interesting proofs"}, {"keyword": "interesting property"}, {"keyword": "interesting syntactic subclass"}, {"keyword": "interleaves"}, {"keyword": "intermediate encoding"}, {"keyword": "intermediate relations"}, {"keyword": "intermediate results"}, {"keyword": "intermediate step"}, {"keyword": "internal direct product"}, {"keyword": "internal equivalences"}, {"keyword": "internal execution clocking"}, {"keyword": "internal path length"}, {"keyword": "internal path length relates"}, {"keyword": "internal representation"}, {"keyword": "internal timing channels"}, {"keyword": "internally vertex-disjoint paths"}, {"keyword": "international conference"}, {"keyword": "international mathematical olympiad 2019"}, {"keyword": "international system"}, {"keyword": "interpolation nodes"}, {"keyword": "interpreting intensional type systems"}, {"keyword": "intersecting chords theorem"}, {"keyword": "intersection numbers"}, {"keyword": "intersection type systems"}, {"keyword": "interval analysis"}, {"keyword": "interval arithmetic"}, {"keyword": "interval calculus"}, {"keyword": "interval logics"}, {"keyword": "interval temporal logics"}, {"keyword": "interval traversing results"}, {"keyword": "interval trees"}, {"keyword": "intervals"}, {"keyword": "intransitive interference relations"}, {"keyword": "intransitive noninterference policy"}, {"keyword": "intransitive policy"}, {"keyword": "intransitive purge function"}, {"keyword": "intraprocedural proof"}, {"keyword": "intricate cyclic program"}, {"keyword": "intricate distributed protocol"}, {"keyword": "intricate part"}, {"keyword": "intrinsic properties"}, {"keyword": "introducing constructor functions"}, {"keyword": "introductory sections"}, {"keyword": "intuitionistic logic"}, {"keyword": "intuitive arguments found"}, {"keyword": "intuitive combinatorial proof"}, {"keyword": "intuitive desired security policy"}, {"keyword": "intuitively secure programs"}, {"keyword": "invariance"}, {"keyword": "invariant based programming"}, {"keyword": "invariant based programs"}, {"keyword": "invariant factor decomposition"}, {"keyword": "invariant generation"}, {"keyword": "inventors vickrey"}, {"keyword": "inventory management"}, {"keyword": "inverse function"}, {"keyword": "inverse limit"}, {"keyword": "inverse operations"}, {"keyword": "inverse squares"}, {"keyword": "inverse transform ifntt"}, {"keyword": "inverse transform intt"}, {"keyword": "inversion rules"}, {"keyword": "inversions"}, {"keyword": "investigate mathematical structures"}, {"keyword": "involve polynomial interpretations"}, {"keyword": "involve regular expressions"}, {"keyword": "involved path"}, {"keyword": "involves extensive reasoning"}, {"keyword": "io monad"}, {"keyword": "ip address ranges"}, {"keyword": "ip-route command"}, {"keyword": "iptables match condition"}, {"keyword": "ipurge unwinding theorem"}, {"keyword": "ipv4 address allocation"}, {"keyword": "ipv4 addresses"}, {"keyword": "ipv6 address space"}, {"keyword": "ipv6 addresses"}, +{"keyword": "irrational numbers"}, {"keyword": "irrationality criteria"}, {"keyword": "irreducible cfgs"}, {"keyword": "irreducible polynomial"}, {"keyword": "irreducible representation"}, {"keyword": "isafol isafol authors"}, {"keyword": "isafol project isafol"}, {"keyword": "isafor ceta project"}, {"keyword": "isafor ceta-system"}, {"keyword": "isar conversion"}, {"keyword": "isar proof"}, {"keyword": "isomorphism classes"}, {"keyword": "isomorphism preserves order"}, {"keyword": "isomorphism theorem"}, {"keyword": "isomorphisms results"}, {"keyword": "isoscele triangles"}, {"keyword": "isosceles triangle theorem"}, {"keyword": "iteration operators"}, {"keyword": "iterative interpretive process"}, {"keyword": "iterative versions"}, {"keyword": "iteratively solve finite mdps"}, {"keyword": "itp 2011 paper"}, {"keyword": "itp 2015 publication"}, {"keyword": "itp 2017 paper"}, {"keyword": "itp-2015 peter lammich"}, {"keyword": "itp-2016 paper"}, {"keyword": "ivana vukotic"}, {"keyword": "j3202"}, {"keyword": "jacobi symbol"}, {"keyword": "james margetson"}, {"keyword": "jan kret nsk"}, {"keyword": "jan kretinsky proposed"}, {"keyword": "jasmin blanchette"}, {"keyword": "java interactive verification environment"}, {"keyword": "java language architecture"}, {"keyword": "java se 8 specification"}, {"keyword": "javascript object notation"}, {"keyword": "javascript world"}, {"keyword": "javier esparza"}, {"keyword": "jeroen ketema"}, {"keyword": "jinja source"}, {"keyword": "jinja source code semantics"}, {"keyword": "jir iacute"}, {"keyword": "joachim breitner"}, {"keyword": "johann bernoulli"}, {"keyword": "john bruntse larsen"}, {"keyword": "john harrison"}, {"keyword": "john wickerson"}, {"keyword": "join ordering algorithm ikkbz"}, {"keyword": "join trees"}, {"keyword": "join-irreducible elements"}, {"keyword": "jones polynomial"}, {"keyword": "jordan curve theorem"}, {"keyword": "jordan decomposition theorem"}, {"keyword": "jordan normal form"}, {"keyword": "jordan_normal_form afp entry"}, {"keyword": "json encoded data"}, {"keyword": "json objects"}, {"keyword": "json-encoded data"}, {"keyword": "julien narboux"}, {"keyword": "k-1 a_k"}, {"keyword": "k-universal hash family"}, {"keyword": "kan extensions"}, {"keyword": "karel hrbacek"}, {"keyword": "keeping track"}, {"keyword": "keith conrad"}, {"keyword": "kepler conjecture"}, {"keyword": "key agreement protocols"}, {"keyword": "key aspect"}, {"keyword": "key cards"}, {"keyword": "key component"}, {"keyword": "key composition property"}, {"keyword": "key concepts"}, {"keyword": "key confirmation"}, {"keyword": "key construction"}, {"keyword": "key contribution"}, {"keyword": "key encapsulation mechanism"}, {"keyword": "key establishment protocols"}, {"keyword": "key proofs"}, {"keyword": "key properties"}, {"keyword": "key range"}, {"keyword": "key resource assertions"}, {"keyword": "key result"}, {"keyword": "key undecidability result present"}, {"keyword": "key value-pairs"}, {"keyword": "keyed-hash message authentication code"}, {"keyword": "kind"}, {"keyword": "kind mapped"}, {"keyword": "kleene algebra"}, {"keyword": "kleene algebra hierarchy"}, {"keyword": "kleene algebras endowed"}, {"keyword": "kleene algebras remain"}, {"keyword": "kleene normal form"}, {"keyword": "kleene relation algebras"}, {"keyword": "kleene star"}, {"keyword": "kleene star arise"}, {"keyword": "kleene star operation"}, {"keyword": "klein nicta"}, {"keyword": "klein-beltrami model"}, {"keyword": "kleisli category"}, {"keyword": "kmp algorithm"}, {"keyword": "knaster tarski theorem"}, {"keyword": "knight"}, {"keyword": "knight visits"}, {"keyword": "knot theory"}, {"keyword": "knowledge"}, {"keyword": "knowledge compilation"}, {"keyword": "knowledge gained"}, {"keyword": "knuth bendix orders"}, {"keyword": "knuth morris pratt exploits"}, {"keyword": "knuth ndash"}, {"keyword": "knuth-morris-pratt algorithm"}, {"keyword": "konrad knopp"}, {"keyword": "kronecker tensor product"}, {"keyword": "kuratowski subgraphs"}, {"keyword": "kyber algorithms"}, {"keyword": "l-shaped tiles"}, {"keyword": "labeled transition system"}, {"keyword": "labeled trees"}, {"keyword": "labelled directed graphs"}, {"keyword": "labelled natural deduction system"}, {"keyword": "labour cost"}, {"keyword": "labour intensive"}, {"keyword": "lagrange interpolation"}, {"keyword": "lam09 peter lammich"}, {"keyword": "lambda -calculus"}, {"keyword": "lambda calculus"}, {"keyword": "lambda-calculus"}, {"keyword": "lambda-free recursive path orders"}, {"keyword": "lambert series"}, {"keyword": "landau expressions"}, {"keyword": "landau symbol"}, {"keyword": "landmark information flow property"}, {"keyword": "landmark theorem due"}, {"keyword": "landmark work collective choice"}, {"keyword": "language determinism"}, {"keyword": "language emptiness problem"}, {"keyword": "language features"}, {"keyword": "language features monadic sequencing"}, {"keyword": "language inclusion"}, {"keyword": "language primitives"}, {"keyword": "language processing"}, {"keyword": "language theory"}, {"keyword": "language-based non-interference property"}, {"keyword": "languages generated"}, {"keyword": "laplace transform"}, {"keyword": "large class"}, {"keyword": "large collection"}, {"keyword": "large computations"}, {"keyword": "large financial losses"}, {"keyword": "large formalization efforts"}, {"keyword": "large fragment"}, {"keyword": "large graphs"}, {"keyword": "large library"}, {"keyword": "large number"}, {"keyword": "large numbers states"}, {"keyword": "large part"}, {"keyword": "large real-world firewall"}, {"keyword": "large transitive closures"}, {"keyword": "large tree automata"}, {"keyword": "large-scale shared mutable content"}, {"keyword": "large-scale stream processing systems"}, {"keyword": "larger arrangements due"}, {"keyword": "larger cardinality"}, {"keyword": "larger memory"}, {"keyword": "larger rings"}, {"keyword": "largest power"}, {"keyword": "larry paulson"}, {"keyword": "latest version"}, {"keyword": "latin rectangle"}, {"keyword": "latin square"}, {"keyword": "lattice ordered groups"}, {"keyword": "lattice point"}, {"keyword": "lattice supremum providing"}, {"keyword": "lattice theory"}, {"keyword": "lattice vector"}, {"keyword": "lattice-based cryptography"}, {"keyword": "lattice-based post-quantum cryptography"}, {"keyword": "lattice-theoretic concepts"}, {"keyword": "laurent expansion"}, {"keyword": "law"}, {"keyword": "lawrence paulson"}, {"keyword": "lazy list"}, {"keyword": "lazy sequences"}, {"keyword": "leading coefficient"}, {"keyword": "leading power-product"}, {"keyword": "learned clauses"}, {"keyword": "lebesgue measure"}, {"keyword": "lebesgue-style integration plays"}, {"keyword": "lee cl73"}, {"keyword": "left part"}, {"keyword": "leftmost reduction"}, {"keyword": "leftmost reduction theorem"}, {"keyword": "lehmer"}, {"keyword": "lehmer presented criterions"}, {"keyword": "lehmer test"}, {"keyword": "lei97 alexander leitsch"}, {"keyword": "leitsch lei97"}, {"keyword": "lemma"}, {"keyword": "lemma based"}, {"keyword": "lemma statements"}, {"keyword": "lemmas required"}, {"keyword": "lend money"}, {"keyword": "lending funds"}, {"keyword": "length constraints"}, {"keyword": "lens algebra"}, {"keyword": "lens class"}, {"keyword": "lens classes"}, {"keyword": "lens laws"}, {"keyword": "leq alpha"}, {"keyword": "leq mathtt length"}, {"keyword": "level sequences"}, {"keyword": "level-based interference relation"}, {"keyword": "levi identities"}, {"keyword": "lexicographic algorithm incorporating"}, {"keyword": "lexicographic extensions"}, {"keyword": "liberal paradox"}, {"keyword": "library base"}, {"keyword": "lidl"}, {"keyword": "lies strictly"}, {"keyword": "life table"}, {"keyword": "lift larger classes"}, {"keyword": "lift universally quantified equations"}, {"keyword": "lift_definition command"}, {"keyword": "lifting"}, {"keyword": "lifting algebraic laws point-wise"}, {"keyword": "lifting function application"}, {"keyword": "lifting invariants"}, {"keyword": "lifting operation"}, {"keyword": "lifting package"}, {"keyword": "lifting step"}, {"keyword": "lifts resolution derivation steps"}, {"keyword": "light-weight type system"}, {"keyword": "lim"}, {"keyword": "limiting parallels axiom"}, {"keyword": "limits"}, {"keyword": "limits exist"}, {"keyword": "linear"}, {"keyword": "linear algebra"}, {"keyword": "linear algebra libraries"}, {"keyword": "linear algebraic techniques"}, {"keyword": "linear bound argument"}, {"keyword": "linear combination"}, {"keyword": "linear constraints"}, {"keyword": "linear equations"}, {"keyword": "linear independence"}, {"keyword": "linear inequalities"}, {"keyword": "linear inqualities"}, {"keyword": "linear integer polynomial"}, {"keyword": "linear logics"}, {"keyword": "linear map"}, {"keyword": "linear order"}, {"keyword": "linear ordered fields"}, {"keyword": "linear pass homomorphic application"}, {"keyword": "linear programs"}, {"keyword": "linear real arithmetic"}, {"keyword": "linear size"}, {"keyword": "linear temporal logic"}, {"keyword": "linear time"}, {"keyword": "linear transformations"}, {"keyword": "linear upper bound"}, {"keyword": "linear variable-separated rewrite systems"}, {"keyword": "linear-time temporal logic"}, {"keyword": "linearised looplessly"}, {"keyword": "linearly independent"}, {"keyword": "linearly ordered borel-spaces"}, {"keyword": "linearly ordered commutative semigroups"}, {"keyword": "linearly ordered group"}, {"keyword": "linearly ordered sets"}, {"keyword": "link tangle equivalence"}, {"keyword": "linux firewall iptables"}, {"keyword": "linux netfilter iptables firewall"}, {"keyword": "linux-based firewall"}, {"keyword": "linux-based router"}, {"keyword": "linux-style router"}, {"keyword": "liouville numbers"}, {"keyword": "lipschitz maps"}, {"keyword": "lipschitz-continuous interval isotone functions"}, {"keyword": "list"}, {"keyword": "list interleavings"}, {"keyword": "list lookup operation"}, {"keyword": "list module"}, {"keyword": "list operations"}, {"keyword": "list type"}, {"keyword": "list update algorithms"}, {"keyword": "list update problem"}, {"keyword": "lists representation"}, {"keyword": "litte theorem"}, {"keyword": "llists"}, {"keyword": "lll algorithm"}, {"keyword": "lll basis reduction algorithm"}, {"keyword": "lmw09 peter lammich"}, {"keyword": "local clock"}, {"keyword": "local hidden variable hypothesis"}, {"keyword": "local hidden variables"}, {"keyword": "local lexing"}, {"keyword": "local lexing semantics"}, {"keyword": "local parallel compositions"}, {"keyword": "local type definitions"}, {"keyword": "locale assumptions"}, {"keyword": "locale assumptions correspond"}, {"keyword": "locale eval lowbar"}, {"keyword": "locale fixing"}, {"keyword": "locale mechanism"}, {"keyword": "locale-centric approach"}, {"keyword": "locally control back-end settings"}, {"keyword": "locally finite"}, {"keyword": "locally nameless representation"}, {"keyword": "locally ringed space"}, {"keyword": "lock synchronisation"}, {"keyword": "lockstep models"}, {"keyword": "log levels"}, {"keyword": "log log"}, {"keyword": "log-gamma function"}, {"keyword": "logarithmic amortized complexity"}, {"keyword": "logarithmic expected time"}, {"keyword": "logarithmic time"}, {"keyword": "logarithmic upper bound"}, {"keyword": "logger configurations"}, {"keyword": "logging-dependent message anonymity"}, {"keyword": "logging-independent message anonymity"}, {"keyword": "logic"}, {"keyword": "logic due"}, {"keyword": "logic programming"}, {"keyword": "logic tla merz 1999"}, {"keyword": "logical approaches"}, {"keyword": "logical calculus"}, {"keyword": "logical connectives"}, {"keyword": "logical foundation"}, {"keyword": "logical reasoning"}, {"keyword": "logical systems"}, {"keyword": "logically equivalent"}, {"keyword": "logically equivalent quantifier-free formula"}, {"keyword": "logically exclusive"}, {"keyword": "logically safe"}, {"keyword": "logics denote regular languages"}, {"keyword": "logics feature recovery operators"}, {"keyword": "longer guaranteed"}, {"keyword": "longer periods"}, {"keyword": "longer valid"}, {"keyword": "longest lyndon suffix"}, {"keyword": "longest recognized substrings"}, {"keyword": "loop freedom"}, {"keyword": "lov aacutesz local lemma"}, {"keyword": "low edge probability"}, {"keyword": "low-degree polynomials"}, {"keyword": "lower bound"}, {"keyword": "lower semicontinuous"}, {"keyword": "lower semicontinuous hull"}, {"keyword": "lower-level language based"}, {"keyword": "lp spaces"}, {"keyword": "lsfa 2020 paper"}, {"keyword": "ltl formula"}, {"keyword": "ltl model checker"}, {"keyword": "ltl properties"}, {"keyword": "ltl yielding"}, {"keyword": "lu cleverly extended"}, {"keyword": "lucas ndash"}, {"keyword": "lyndon words"}, {"keyword": "lyndon-sch tzenberger theorem"}, {"keyword": "mac lane"}, {"keyword": "macaulay matrices"}, {"keyword": "macaulay matrix"}, {"keyword": "macaulay matrix constructed"}, {"keyword": "machine checked collections framework"}, {"keyword": "machine checked proofs"}, {"keyword": "machine configuration"}, {"keyword": "machine language"}, {"keyword": "machine learning"}, {"keyword": "machine words"}, {"keyword": "machine-assisted proof"}, {"keyword": "machine-checked correctness theorems"}, {"keyword": "machine-checked proofs"}, {"keyword": "machine-checked text annex"}, {"keyword": "machine-checked tree automata library"}, {"keyword": "machine-checked version"}, {"keyword": "machine-verifiable proof certificates"}, {"keyword": "maclaurin formula"}, {"keyword": "maclaurin series"}, {"keyword": "maclaurin summation formula"}, {"keyword": "magic wand"}, {"keyword": "magic wand assertion"}, {"keyword": "magic wand formula"}, {"keyword": "magic wand mathbin"}, {"keyword": "main advantage"}, {"keyword": "main concern"}, {"keyword": "main contribution"}, {"keyword": "main crypto_standards theory"}, {"keyword": "main difference"}, {"keyword": "main entry point"}, {"keyword": "main goal"}, {"keyword": "main motivation"}, {"keyword": "main novelty"}, {"keyword": "main operation"}, {"keyword": "main order fully coincides"}, {"keyword": "main premise"}, {"keyword": "main result"}, {"keyword": "main results verified"}, {"keyword": "main routing table"}, {"keyword": "main theorem"}, {"keyword": "main theorem relates"}, {"keyword": "main theorem states"}, {"keyword": "main thrust"}, {"keyword": "main topics"}, {"keyword": "mainstream structures"}, {"keyword": "maintain hidden state"}, {"keyword": "maintaining knowledge"}, {"keyword": "major case study"}, {"keyword": "major goal"}, {"keyword": "manipulating data types"}, {"keyword": "mansky"}, {"keyword": "manual alpha-conversions"}, {"keyword": "manual approach"}, {"keyword": "manual proofs"}, {"keyword": "many-sorted first-order logic"}, {"keyword": "many-sorted problem"}, {"keyword": "map lists"}, {"keyword": "mapping method"}, {"keyword": "mapping regular expressions"}, {"keyword": "mapsto sum_"}, {"keyword": "marginal measure"}, {"keyword": "margulis-gabber-galil graphs"}, {"keyword": "mark 1 machine"}, {"keyword": "marked regular expressions"}, {"keyword": "markov chains"}, {"keyword": "markov decision processes"}, {"keyword": "marriage theorem"}, {"keyword": "mason ndash"}, {"keyword": "master students"}, {"keyword": "master theorem"}, {"keyword": "master theorem based"}, {"keyword": "match expression"}, {"keyword": "matching"}, {"keyword": "material decribed"}, {"keyword": "mathbf sim gamma phi"}, {"keyword": "mathcal"}, {"keyword": "mathematical areas"}, {"keyword": "mathematical book written"}, {"keyword": "mathematical components"}, {"keyword": "mathematical development"}, {"keyword": "mathematical development presented"}, {"keyword": "mathematical formulation"}, {"keyword": "mathematical framework"}, {"keyword": "mathematical logic"}, {"keyword": "mathematical machinery"}, {"keyword": "mathematical sets"}, {"keyword": "mathematical structures"}, {"keyword": "mathematical text"}, {"keyword": "mathematical theories"}, {"keyword": "mathematical tools"}, {"keyword": "mathematical tripos taught"}, {"keyword": "mathematically precise theory"}, {"keyword": "mathematics stack exchange page"}, +{"keyword": "mathsf approxmc"}, +{"keyword": "mathsf approxmc returns"}, {"keyword": "mathtt length"}, {"keyword": "mathtt lists"}, {"keyword": "mathtt sat"}, {"keyword": "matrices represented"}, {"keyword": "matrix equation"}, {"keyword": "matrix rank"}, {"keyword": "matrix representation"}, {"keyword": "matrix theory"}, {"keyword": "matryoshka website"}, {"keyword": "matt devos"}, {"keyword": "max-flow min-cut theorem"}, {"keyword": "maximal consistent saturated sets"}, {"keyword": "maximal consistent set"}, {"keyword": "maximal load factors"}, {"keyword": "maximal normal subgroups"}, {"keyword": "maximally consistent"}, {"keyword": "maximally consistent sets"}, {"keyword": "maximize reuse"}, {"keyword": "maximum cardinality"}, {"keyword": "maximum cardinality matching"}, {"keyword": "maximum determination"}, {"keyword": "maximum element"}, {"keyword": "maximum flow"}, {"keyword": "maximum norm"}, {"keyword": "maximum reachability probabilities"}, {"keyword": "maximum segment sum problem"}, {"keyword": "maximum-flow minimal-cut theorem"}, {"keyword": "mcss based"}, {"keyword": "mdp model checking"}, {"keyword": "meaningless encodings"}, {"keyword": "measurable space"}, {"keyword": "measurable space generated"}, {"keyword": "measurable subset"}, {"keyword": "measure preserving transformations"}, {"keyword": "measure theoretic arguments"}, {"keyword": "measure theory"}, {"keyword": "measuring angles"}, {"keyword": "mechanical derivation"}, {"keyword": "mechanical theorem proving"}, {"keyword": "mechanically supported logic analysis"}, {"keyword": "mechanically verifying algorithms"}, {"keyword": "mechanised proofs"}, {"keyword": "mechanised proofs offermat"}, {"keyword": "mechanising proofs"}, {"keyword": "mechanized proof"}, {"keyword": "mechanized soundness proof"}, {"keyword": "mechanizing gauss"}, {"keyword": "meet schneider"}, {"keyword": "meeting point"}, {"keyword": "meld operations"}, {"keyword": "memory implementations"}, {"keyword": "memory model"}, {"keyword": "memory model theory"}, {"keyword": "memory resolve"}, {"keyword": "memory semantics"}, {"keyword": "mentioned algorithms"}, {"keyword": "mentioned logics"}, {"keyword": "mentioned properties"}, {"keyword": "mergesort algorithm"}, {"keyword": "merkle functors"}, {"keyword": "message"}, {"keyword": "message anonymity"}, {"keyword": "message confidentiality"}, {"keyword": "message filters"}, {"keyword": "metaphysical questions"}, {"keyword": "metaphysical theory"}, {"keyword": "metatheoretical observation"}, {"keyword": "metatheoretical properties"}, {"keyword": "method called separata"}, {"keyword": "method calls"}, {"keyword": "method exploits"}, {"keyword": "method normalises applicative expressions"}, {"keyword": "methodology chosen"}, {"keyword": "metric dynamic logic"}, {"keyword": "metric embeddings"}, {"keyword": "metric first-order dynamic logic"}, {"keyword": "metric first-order temporal logic"}, {"keyword": "metric space"}, {"keyword": "metric temporal logic"}, {"keyword": "mfodl supports real-time constraints"}, {"keyword": "microsoft research"}, {"keyword": "mid 80s"}, {"keyword": "mild condition attractivity"}, {"keyword": "miller ndash"}, {"keyword": "minimal complete sets"}, {"keyword": "minimal dfas"}, {"keyword": "minimal polynomial"}, {"keyword": "minimal set"}, {"keyword": "minimal space usage"}, {"keyword": "minimal ssa form"}, {"keyword": "minimal unsatisfiable cores"}, {"keyword": "minimisation"}, {"keyword": "minimization algorithm"}, {"keyword": "minimum weight basis"}, {"keyword": "minimum weighted path length"}, {"keyword": "minkowski inequalities"}, {"keyword": "minkowski space-time"}, {"keyword": "minkowski spacetime"}, {"keyword": "minor corrections"}, {"keyword": "minor technical issue"}, {"keyword": "minsky configurations"}, {"keyword": "minsky machines"}, {"keyword": "mirroring beringer"}, {"keyword": "mismatched character"}, {"keyword": "missing gaps"}, {"keyword": "mit press 1995"}, {"keyword": "mitigate rounding errors"}, {"keyword": "mixed-integer solutions"}, {"keyword": "mixed-product property"}, {"keyword": "mobile computing"}, {"keyword": "mobius base logic"}, {"keyword": "modal collapse"}, {"keyword": "modal kleene algebra"}, {"keyword": "modal logic"}, {"keyword": "modal operators"}, {"keyword": "modal powerset quantale"}, {"keyword": "modal quantales"}, {"keyword": "modal relational type theory"}, {"keyword": "model checker spin"}, {"keyword": "model checkers"}, {"keyword": "model checking"}, {"keyword": "model checking pushdown systems"}, {"keyword": "model compatibility"}, {"keyword": "model complex systems"}, +{"keyword": "model count"}, {"keyword": "model entire prover architectures"}, {"keyword": "model existence"}, {"keyword": "model existence theorem"}, {"keyword": "model formulas"}, {"keyword": "model partial correctness"}, {"keyword": "model reactive systems"}, {"keyword": "model refinement"}, {"keyword": "model satisfies"}, {"keyword": "model systems"}, {"keyword": "model total correctness"}, {"keyword": "model unweighted graphs"}, {"keyword": "model weighted graphs"}, {"keyword": "model-level og proof"}, {"keyword": "modeling application level protocols"}, {"keyword": "modeling firewall policies"}, {"keyword": "modeling languages"}, {"keyword": "modeling real-time systems"}, {"keyword": "modelling security"}, {"keyword": "models partial functions"}, {"keyword": "modern day politics"}, {"keyword": "modern environment"}, {"keyword": "modern multiprocessors depend"}, {"keyword": "modern sat solvers"}, {"keyword": "modern version"}, {"keyword": "modern web browser"}, {"keyword": "modified policy iteration"}, {"keyword": "modified version"}, {"keyword": "modify nodes"}, {"keyword": "modular arithmetic plays"}, {"keyword": "modular assembly kit"}, {"keyword": "modular exponentiation"}, {"keyword": "modular hierarchy"}, {"keyword": "module development"}, {"keyword": "modulo operation"}, {"keyword": "moments independence"}, {"keyword": "monad carries"}, {"keyword": "monad transformers"}, {"keyword": "monadic functions"}, {"keyword": "monadic interpreter"}, {"keyword": "monadic language"}, {"keyword": "monadic refinement framework"}, {"keyword": "monadic second-order logic"}, {"keyword": "monadified version"}, {"keyword": "monetary supply grows"}, {"keyword": "monic irreducible polynomials"}, {"keyword": "monic polynomial"}, {"keyword": "monitor supports aggregation operations"}, {"keyword": "monitoring algorithm"}, {"keyword": "monitoring tools"}, {"keyword": "mono de libre"}, {"keyword": "monochromatic line"}, {"keyword": "monoidal categories"}, {"keyword": "monoidal category"}, {"keyword": "monoidal category rel"}, {"keyword": "monoidal functor"}, {"keyword": "monoids generated"}, {"keyword": "monolithic structure"}, {"keyword": "monotone boolean functions"}, {"keyword": "monotone maps"}, {"keyword": "monotone predicate"}, {"keyword": "monotonic boolean transformers"}, {"keyword": "monotonic functions"}, {"keyword": "monotonic predicate transformers"}, {"keyword": "monotonic property transformers"}, {"keyword": "monotonically decreasing sequence"}, {"keyword": "morally questionable"}, {"keyword": "morris-pratt string matching algorithm"}, {"keyword": "morse lemma asserting"}, {"keyword": "morten konggaard schou"}, {"keyword": "moving forward"}, {"keyword": "msc thesis"}, {"keyword": "msc thesis sch15"}, {"keyword": "mso formulas correspond"}, {"keyword": "multi-head monitoring algorithm"}, {"keyword": "multi-head paradigm"}, {"keyword": "multi-node extension"}, {"keyword": "multi-party computation"}, {"keyword": "multi-stage compiler verifications"}, {"keyword": "multidimensional binary trees"}, {"keyword": "multiple algebraic structures"}, {"keyword": "multiple goods"}, {"keyword": "multiple oblivious transfer"}, {"keyword": "multiple positions"}, {"keyword": "multiple relational databases"}, {"keyword": "multiple-angle formulas"}, {"keyword": "multiplication"}, {"keyword": "multiplication protocol"}, {"keyword": "multiplication syntactically"}, {"keyword": "multiplicative constants"}, {"keyword": "multiplicative group"}, {"keyword": "multiplicative inverses"}, {"keyword": "multiplicative monoid"}, {"keyword": "multiplicative subset"}, {"keyword": "multiset-comparison problems"}, {"keyword": "multitape tm runs"}, {"keyword": "multitape tms"}, {"keyword": "multitape turing machines"}, {"keyword": "multithreaded case"}, {"keyword": "multivariate polynomial rings"}, {"keyword": "multivariate polynomials"}, {"keyword": "multivariate quantifier elimination"}, {"keyword": "multivariate taylor models"}, {"keyword": "mutable references"}, {"keyword": "mutating operations performed"}, {"keyword": "mutilated chess board"}, {"keyword": "mutual independence principle"}, {"keyword": "mutual independence principle proof"}, {"keyword": "mutually inverse"}, {"keyword": "mutually recursive functions"}, {"keyword": "mutually recursive procedures"}, {"keyword": "mutually-recursive definition"}, {"keyword": "myhill nerode theorem"}, {"keyword": "myhill-nerode equivalence relation"}, {"keyword": "myhill-nerode theorem"}, {"keyword": "n2m operation"}, {"keyword": "naive algorithm"}, {"keyword": "naive quantifier expansion"}, {"keyword": "naive union operation"}, {"keyword": "nash-williams discovered"}, {"keyword": "nat-bijection theory"}, {"keyword": "nathan chong"}, {"keyword": "native sequential consistency"}, {"keyword": "natural bijections"}, {"keyword": "natural deduction"}, {"keyword": "natural deduction proof calculus"}, {"keyword": "natural deduction system"}, {"keyword": "natural homomorphism"}, {"keyword": "natural language processing"}, {"keyword": "natural logarithm"}, {"keyword": "natural number"}, {"keyword": "natural number greater"}, {"keyword": "natural numbers 0"}, {"keyword": "natural question"}, {"keyword": "natural transformations"}, {"keyword": "natural transformations simply"}, {"keyword": "natural-language explanations"}, {"keyword": "nature allowing"}, {"keyword": "nearest lattice vector"}, {"keyword": "nearest neighbor algorithm"}, {"keyword": "nearest shadow root"}, {"keyword": "necessarily numbers"}, {"keyword": "negated subquery"}, {"keyword": "negative cycles"}, {"keyword": "negative diagonal entry"}, {"keyword": "negative integers"}, {"keyword": "negative real parts"}, {"keyword": "negative resolution"}, {"keyword": "negative solution"}, {"keyword": "neha rungta"}, {"keyword": "nested binary joins"}, {"keyword": "nested multiset datatype"}, {"keyword": "nested multiset order"}, {"keyword": "nested multisets"}, {"keyword": "network"}, {"keyword": "network model"}, {"keyword": "network protocols"}, {"keyword": "network security mechanisms"}, {"keyword": "networking protocols"}, {"keyword": "neutral absolute space"}, {"keyword": "neutral social decision scheme"}, {"keyword": "newly detected states"}, {"keyword": "newton interpolation"}, {"keyword": "newton puiseux theorem"}, {"keyword": "next-free ltl formula"}, {"keyword": "nicta l4v"}, {"keyword": "niederreiter"}, {"keyword": "nieto verification"}, {"keyword": "nigsberg bridge problem"}, {"keyword": "nist"}, {"keyword": "nist standarisation process"}, {"keyword": "nnf-based algorithms"}, {"keyword": "no-cloning theorem"}, {"keyword": "no-frills state-exception monad"}, {"keyword": "node labeled 1"}, {"keyword": "nodes"}, {"keyword": "nodes labeled"}, {"keyword": "nominal"}, {"keyword": "nominal datatype package"}, {"keyword": "nominal logic"}, {"keyword": "nominal logic formalism"}, {"keyword": "nominal sets"}, {"keyword": "nominal style"}, {"keyword": "nominal2 library"}, {"keyword": "nominal2 package"}, {"keyword": "non-adjacent distinct vertices"}, {"keyword": "non-atomic keys"}, {"keyword": "non-boolean gray code"}, {"keyword": "non-classical negations"}, {"keyword": "non-consecutive fibonacci numbers"}, {"keyword": "non-deterministic algorithm"}, {"keyword": "non-deterministic automata"}, {"keyword": "non-deterministic buechi-automaton"}, {"keyword": "non-deterministic finite state machine"}, {"keyword": "non-deterministic interpreter"}, {"keyword": "non-deterministic languages"}, {"keyword": "non-deterministic monad"}, {"keyword": "non-deterministic tms"}, {"keyword": "non-elementary worst-case blow-"}, {"keyword": "non-functional requirements"}, {"keyword": "non-negative cost function"}, {"keyword": "non-negative integer"}, {"keyword": "non-negative real"}, {"keyword": "non-negative real matrix"}, {"keyword": "non-negative real-"}, {"keyword": "non-negative reals a_1"}, {"keyword": "non-negative solutions"}, {"keyword": "non-negative weights w_1"}, {"keyword": "non-obvious closed form"}, {"keyword": "non-real critical point"}, {"keyword": "non-redundant clause learning"}, {"keyword": "non-relational reasoning"}, +{"keyword": "non-square natural number"}, {"keyword": "non-strict computations"}, {"keyword": "non-strict function abstractions"}, {"keyword": "non-terminating executions"}, {"keyword": "noncommuting words"}, {"keyword": "noncommuting words form"}, {"keyword": "nondeterminism monad"}, {"keyword": "nondeterministic branching"}, {"keyword": "nondeterministic programs"}, {"keyword": "noninterference proofs"}, {"keyword": "noninterference security"}, {"keyword": "noninterference security applying"}, {"keyword": "noninterference theorem"}, {"keyword": "nonnegative cubes"}, {"keyword": "nontrivial size"}, {"keyword": "nonzero rational number"}, {"keyword": "nora szasz"}, {"keyword": "normal filters"}, {"keyword": "normal form"}, {"keyword": "normal form --"}, {"keyword": "normal form property"}, {"keyword": "normal functions"}, {"keyword": "normal logarithm"}, {"keyword": "normal series"}, {"keyword": "normal strategy"}, {"keyword": "normal subgroups"}, {"keyword": "normalisation algorithm"}, {"keyword": "normalisation procedures"}, {"keyword": "normalise monadic hol terms"}, {"keyword": "normalises monadic expressions"}, {"keyword": "normalization equivalence"}, {"keyword": "normalizing strategy"}, {"keyword": "normed space"}, {"keyword": "notable result"}, {"keyword": "notably holcf"}, {"keyword": "notably poicar recurrence theorem"}, {"keyword": "notes"}, {"keyword": "notes introduction"}, {"keyword": "notions probabilistic noninterference"}, {"keyword": "np-complete optimization problems"}, {"keyword": "np-complete problem"}, {"keyword": "np-hard problem"}, {"keyword": "np-hardness proofs"}, {"keyword": "nu_x"}, {"keyword": "null space"}, {"keyword": "nullable types"}, {"keyword": "number"}, {"keyword": "number partitions"}, {"keyword": "number theoretic result"}, {"keyword": "number theoretic transform"}, {"keyword": "number theory"}, {"keyword": "number-theoretic foundations"}, {"keyword": "number-theoretic functions"}, {"keyword": "number-theoretic lemmas"}, {"keyword": "number-theoretic results"}, {"keyword": "numeral type"}, {"keyword": "numeric constants occurring"}, {"keyword": "numerical algorithms"}, {"keyword": "numerous applications"}, {"keyword": "numerous existing correctness"}, {"keyword": "numerous instances"}, {"keyword": "numerous misunderstandings"}, {"keyword": "numerous models"}, {"keyword": "o-automata framework"}, {"keyword": "object logic"}, {"keyword": "object logic chaudhuri"}, {"keyword": "object logic zfc"}, {"keyword": "object oriented design"}, {"keyword": "object-free style"}, {"keyword": "object-oriented data"}, {"keyword": "object-oriented data-type theories generated"}, {"keyword": "object-oriented programming"}, {"keyword": "objects based"}, {"keyword": "observation set"}, {"keyword": "observe execution times"}, {"keyword": "observed sequence"}, {"keyword": "obtain concrete upper bounds"}, {"keyword": "obtain dynamic programming algorithms"}, {"keyword": "obtain efficient certified algorithms"}, {"keyword": "obtain efficient code"}, {"keyword": "obtain executable code"}, {"keyword": "obtain executable versions"}, {"keyword": "obtain liouville numbers"}, {"keyword": "obtain maximally consistent sets"}, {"keyword": "ocaml executable instance"}, {"keyword": "occurrence counts"}, {"keyword": "ocl specification"}, {"keyword": "ocl standard"}, {"keyword": "ocl standard targeting"}, {"keyword": "ocl type system"}, {"keyword": "octet string"}, {"keyword": "october 17-21"}, {"keyword": "octonionic product"}, {"keyword": "odd bernoulli numbers"}, {"keyword": "odd natural numbers"}, {"keyword": "odd ranking"}, {"keyword": "odd-set cover"}, {"keyword": "odd-set cover osc"}, {"keyword": "oded maler"}, {"keyword": "ody x0144"}, {"keyword": "offers low-latency data-"}, {"keyword": "official standard"}, {"keyword": "okamoto sigma-protocols"}, {"keyword": "old_datatype command"}, {"keyword": "omega 1 alpha"}, {"keyword": "omega 1 alpha cdot"}, {"keyword": "omega omega"}, {"keyword": "omega operation"}, {"keyword": "omega-complete non-orders"}, {"keyword": "omnipresent foundational errors"}, {"keyword": "one-complete computably enumerable set"}, {"keyword": "one-dimensional case"}, {"keyword": "one-pass uniform substitutions"}, {"keyword": "one-sided sequent calculus"}, {"keyword": "one-time efforts benefit"}, {"keyword": "ongoing development"}, {"keyword": "ontological argument"}, {"keyword": "oopsla 2006 paper"}, {"keyword": "open induction schema based"}, {"keyword": "open problem"}, {"keyword": "open publishing association"}, {"keyword": "operating system"}, {"keyword": "operation results"}, {"keyword": "operational"}, {"keyword": "operational behavior derived"}, {"keyword": "operational constructs coincide"}, {"keyword": "operational correspondence"}, {"keyword": "operational properties"}, {"keyword": "operational rules"}, {"keyword": "operational semantics"}, {"keyword": "operations efficiently"}, {"keyword": "operations needed"}, {"keyword": "operations run"}, {"keyword": "operator applications"}, {"keyword": "operators"}, {"keyword": "operators combine"}, {"keyword": "opinion"}, {"keyword": "opposite case"}, {"keyword": "optimal binary search trees"}, {"keyword": "optimal running time"}, {"keyword": "optimal stationary deterministic solution"}, {"keyword": "optimality equations"}, {"keyword": "optimisations suggested"}, {"keyword": "optimizations heuristics"}, {"keyword": "optimized variant"}, {"keyword": "orbit finite"}, {"keyword": "orbit finite set"}, {"keyword": "orbit-stabiliser theorem"}, {"keyword": "order embedding"}, {"keyword": "order extension"}, {"keyword": "order logic"}, {"keyword": "order relation"}, {"keyword": "order relativity theory"}, {"keyword": "order theory specrel"}, {"keyword": "order types"}, {"keyword": "order-theoretic concepts"}, {"keyword": "ordered bdd"}, {"keyword": "ordered resolution"}, {"keyword": "ordered semirings"}, {"keyword": "ordering properties"}, {"keyword": "orders"}, {"keyword": "ordinal alpha"}, {"keyword": "ordinal arithmetic"}, {"keyword": "ordinal exponentiation"}, {"keyword": "ordinal sum"}, {"keyword": "ordinary assertional reasoning"}, {"keyword": "ordinary differential equations"}, {"keyword": "ordinary functions"}, {"keyword": "ordinary generating function"}, {"keyword": "ordinary transition systems"}, {"keyword": "org abs 1609"}, {"keyword": "org jasmin_blanchette isafol"}, {"keyword": "org vol-3002 paper7"}, {"keyword": "original afp entry"}, {"keyword": "original algorithm presented"}, {"keyword": "original article"}, {"keyword": "original compilation process"}, {"keyword": "original design"}, {"keyword": "original design based"}, {"keyword": "original expression"}, {"keyword": "original formula"}, {"keyword": "original functional sigma-calculus"}, {"keyword": "original functionality"}, {"keyword": "original gray code"}, {"keyword": "original imperative implementation"}, {"keyword": "original kyber algorithms"}, {"keyword": "original language"}, {"keyword": "original linear program"}, {"keyword": "original motivation"}, {"keyword": "original operational semantics"}, {"keyword": "original paper"}, {"keyword": "original parallel postulate"}, {"keyword": "original presentation"}, {"keyword": "original problem"}, {"keyword": "original proof"}, {"keyword": "original quantifier elimination algorithm"}, {"keyword": "original query"}, {"keyword": "original query evaluates"}, {"keyword": "original theorem statement"}, {"keyword": "original version"}, {"keyword": "originally expressed"}, {"keyword": "originally obtained"}, {"keyword": "originally reported"}, {"keyword": "orthogonal families"}, {"keyword": "orthogonal transformations"}, {"keyword": "orthogonal vectors"}, {"keyword": "osc"}, {"keyword": "outgoing edges"}, {"keyword": "output channels"}, {"keyword": "output consistency"}, {"keyword": "output infinite sequences"}, {"keyword": "output port"}, {"keyword": "output type"}, {"keyword": "outsourcing data storage"}, {"keyword": "outstanding work"}, {"keyword": "outwards-pointing normal vector"}, {"keyword": "over-approximate relational logics"}, {"keyword": "overriding principle"}, {"keyword": "p-adic fields"}, {"keyword": "pace authentication key"}, {"keyword": "pace secure channel"}, {"keyword": "package algorithms applicable"}, {"keyword": "package logic"}, {"keyword": "pages 170-186"}, {"keyword": "pages 20-34"}, {"keyword": "pages 369-379"}, {"keyword": "pages 525-539"}, {"keyword": "pairing heaps"}, {"keyword": "pairs consisting"}, {"keyword": "pairwise balanced designs"}, {"keyword": "pairwise commuting hermitian matrices"}, {"keyword": "pairwise commuting matrices"}, {"keyword": "pairwise comparison"}, {"keyword": "pairwise coprime square-free polynomials"}, {"keyword": "paper"}, {"keyword": "paper assumptions"}, {"keyword": "paper compositional verification"}, {"keyword": "paper describes"}, {"keyword": "paper describing"}, {"keyword": "paper detailing"}, {"keyword": "paper enriches hoare"}, {"keyword": "paper formalising fisher"}, {"keyword": "paper local lexing"}, {"keyword": "paper mechanising turing machines"}, {"keyword": "paper multi-head monitoring"}, {"keyword": "paper titled verified"}, {"keyword": "paper transport"}, {"keyword": "paper verified construction"}, {"keyword": "paracomplete logics"}, {"keyword": "paraconsistent engineering"}, {"keyword": "paraconsistent logic avoids"}, {"keyword": "paraconsistent logics"}, {"keyword": "paraconsistent many-"}, {"keyword": "parallel branches"}, {"keyword": "parallel composition"}, {"keyword": "parallel mode"}, {"keyword": "parallel postulates"}, {"keyword": "parallel prefix computations"}, {"keyword": "parallel substitution"}, {"keyword": "parameter set"}, {"keyword": "parameterised process architectures"}, {"keyword": "parameterized proofs"}, {"keyword": "parameterized verification framework"}, {"keyword": "parametric solution"}, {"keyword": "parametricity infrastructure"}, {"keyword": "parametrizable equality functions"}, {"keyword": "parent clauses"}, {"keyword": "parigots -calculus"}, {"keyword": "parity wallet bug"}, {"keyword": "parse trees"}, {"keyword": "parser monad built"}, {"keyword": "parser written"}, {"keyword": "parsing algorithm"}, {"keyword": "parsing concept"}, {"keyword": "part iii"}, {"keyword": "partial binary operation"}, {"keyword": "partial commutativity relationships"}, {"keyword": "partial composition"}, {"keyword": "partial correctness"}, {"keyword": "partial correctness setting"}, {"keyword": "partial data structures"}, {"keyword": "partial derivatives"}, {"keyword": "partial equivalence relations"}, {"keyword": "partial galois connections"}, {"keyword": "partial herbrand interpretations"}, {"keyword": "partial match"}, {"keyword": "partial meet contraction"}, {"keyword": "partial networks"}, {"keyword": "partial orders"}, {"keyword": "partial procedure"}, {"keyword": "partial recursive function"}, {"keyword": "partial semigroups"}, {"keyword": "partial sums"}, {"keyword": "partial synchrony"}, {"keyword": "partially filled"}, {"keyword": "partition function"}, {"keyword": "partition relations concerns generalisations"}, {"keyword": "partition theorem states"}, {"keyword": "partly commented"}, {"keyword": "partly recursive functions found"}, {"keyword": "party cryptographic primitives"}, {"keyword": "party-approval multi-winner elections"}, {"keyword": "party-approval multi-winner voting rules"}, {"keyword": "pascal schreck"}, {"keyword": "password authenticated connection establishment"}, {"keyword": "past experience"}, {"keyword": "past operators"}, {"keyword": "path"}, {"keyword": "path authorization"}, {"keyword": "path authorization mechanism"}, {"keyword": "path integrals"}, {"keyword": "path lengths"}, {"keyword": "path-aware internet architectures"}, {"keyword": "pattern matching"}, {"keyword": "pattern poses"}, {"keyword": "pattern specifications"}, {"keyword": "paul erd"}, {"keyword": "paul thomson"}, {"keyword": "paulson"}, {"keyword": "paulson semantics-based approach"}, {"keyword": "pay special attention"}, {"keyword": "pctl formulas"}, {"keyword": "pdf"}, {"keyword": "peano arithmetic"}, {"keyword": "peculiar mapping argument"}, {"keyword": "pen-and-paper analysis"}, {"keyword": "pen-and-paper counterpart"}, {"keyword": "pen-and-paper proof"}, {"keyword": "pentagonal numbers"}, {"keyword": "perfect field"}, {"keyword": "perfect forward secrecy"}, {"keyword": "perfect logicians"}, {"keyword": "perfect logicians forbidden"}, {"keyword": "perfect matchings"}, {"keyword": "perfect mathematical reals"}, {"keyword": "perfect number theorem"}, {"keyword": "perfect ordinary differential equations"}, {"keyword": "perfect square"}, {"keyword": "perform stream fusion"}, {"keyword": "perform update operations naively"}, {"keyword": "performs comparable"}, {"keyword": "periodic arithmetic functions"}, {"keyword": "periodic bernoulli polynomials"}, +{"keyword": "periodic continued fraction expansions"}, {"keyword": "periodic function"}, {"keyword": "periodically adjusting"}, {"keyword": "periodicity lemma"}, {"keyword": "permission amounts held"}, {"keyword": "permissions held"}, {"keyword": "permitting multiset comparisons"}, {"keyword": "perron ndash"}, {"keyword": "persisted size"}, {"keyword": "personal byzantine quorum systems"}, {"keyword": "peter lammich"}, {"keyword": "petersen aplas 2012"}, {"keyword": "phd thesis"}, {"keyword": "phd thesis sch02a"}, {"keyword": "phi functions"}, {"keyword": "phi holds"}, {"keyword": "philosophical justification"}, {"keyword": "philosphically grounded basis"}, {"keyword": "physical clocks"}, {"keyword": "physical quantities expressed"}, {"keyword": "pide development environment"}, {"keyword": "pide sub-system"}, {"keyword": "piecewise continuous functions"}, {"keyword": "pierre boutry"}, {"keyword": "pipeline-parallel stream processing"}, {"keyword": "places requirements"}, {"keyword": "planar dynamical systems"}, {"keyword": "planar systems"}, {"keyword": "plane geometry"}, {"keyword": "planetmath article"}, {"keyword": "planning domain definition language"}, {"keyword": "planning system fast-downward"}, {"keyword": "planning tasks language"}, {"keyword": "plas 2009 paper"}, {"keyword": "platonic forms"}, {"keyword": "playfair axiom"}, {"keyword": "pldi 2015 paper"}, {"keyword": "plotkin existential"}, {"keyword": "poincar -bendixson theorem"}, {"keyword": "poincar disc model"}, {"keyword": "poincar disc model development"}, {"keyword": "point-wise reasoning"}, {"keyword": "points constructible"}, {"keyword": "pointwise updates"}, {"keyword": "polar form transformation"}, {"keyword": "policy"}, {"keyword": "policy decision function"}, {"keyword": "policy decision point"}, {"keyword": "policy iteration algorithms"}, {"keyword": "polychronous systems"}, {"keyword": "polygonal number"}, {"keyword": "polygonal number theorems"}, {"keyword": "polylogarithm function"}, {"keyword": "polymorphic edge type"}, {"keyword": "polymorphic lambda-calculus extended"}, {"keyword": "polynomial"}, {"keyword": "polynomial analogue"}, {"keyword": "polynomial division"}, {"keyword": "polynomial factorisation algorithms ndash"}, {"keyword": "polynomial growth"}, {"keyword": "polynomial identity testing"}, {"keyword": "polynomial interpolation"}, {"keyword": "polynomial interpretations"}, {"keyword": "polynomial rings"}, {"keyword": "polynomial sequences"}, {"keyword": "polynomial time"}, {"keyword": "polynomial-time algorithm"}, {"keyword": "polynomial-time basis reduction algorithm"}, {"keyword": "polynomial-time turing machine"}, {"keyword": "polynomially bounded"}, {"keyword": "polynomials t_n"}, {"keyword": "polytimed systems"}, {"keyword": "pop-refinement enables"}, {"keyword": "poplmark challenge designed"}, {"keyword": "popular introduction"}, {"keyword": "popular notion"}, {"keyword": "popular theorems attributed"}, {"keyword": "port proofs"}, {"keyword": "posets preserves suprema"}, {"keyword": "positional determinacy"}, {"keyword": "positive fractions"}, {"keyword": "positive integer"}, {"keyword": "positive llists"}, {"keyword": "positive rationals"}, {"keyword": "positive real roots"}, {"keyword": "positive slopes"}, {"keyword": "posix matching"}, {"keyword": "possibilistic information-flow properties"}, {"keyword": "possibilistic information-flow security properties"}, {"keyword": "possibilistic noninterference afp entry"}, {"keyword": "postponing soundness-critical admissibility checks"}, {"keyword": "potential applications"}, {"keyword": "potential breaks"}, {"keyword": "potential negative cycles"}, {"keyword": "potentials due"}, {"keyword": "power allegories extended"}, {"keyword": "power series connections"}, {"keyword": "power series expansion"}, {"keyword": "power set relation algebras"}, {"keyword": "power sum polynomials"}, {"keyword": "powerful locale system"}, {"keyword": "powerful mathematical tools"}, {"keyword": "powerful result called"}, {"keyword": "powerset algebra"}, {"keyword": "powerset construction mapping nfas"}, {"keyword": "powerset extensions"}, {"keyword": "powerset monad"}, {"keyword": "practical algebraic calculus"}, {"keyword": "practical application"}, {"keyword": "practical calculations"}, {"keyword": "practical combinations"}, {"keyword": "practical interoperability protocol"}, {"keyword": "practical purposes"}, {"keyword": "practically successful method"}, {"keyword": "practically usable verification environment"}, {"keyword": "practically worse time complexity"}, {"keyword": "pragmatic interest"}, {"keyword": "pragmatic reasons"}, {"keyword": "precise algorithms"}, {"keyword": "precise effect"}, {"keyword": "precise proof"}, {"keyword": "precise region"}, {"keyword": "precisely compute roots"}, {"keyword": "precomputed table"}, {"keyword": "predecessor sets"}, {"keyword": "predicate"}, {"keyword": "predicate abstraction"}, {"keyword": "predicate identifies"}, {"keyword": "predicate satisfied"}, {"keyword": "predicate taking"}, {"keyword": "predicate transformer semantics"}, {"keyword": "predicate transformers"}, {"keyword": "predictable processes"}, {"keyword": "preexisting definitions coincide"}, {"keyword": "prefix length"}, {"keyword": "prefix match"}, {"keyword": "prefix order"}, {"keyword": "preliminaries chapter"}, {"keyword": "preliminary evaluations"}, {"keyword": "preorder relations"}, {"keyword": "presburger arithmetic"}, {"keyword": "present"}, {"keyword": "present article"}, {"keyword": "present development"}, {"keyword": "present formalisation formed"}, {"keyword": "present formalization"}, {"keyword": "present interpretations"}, {"keyword": "present polished"}, {"keyword": "present proof development represents"}, {"keyword": "present sufficient conditions"}, {"keyword": "present version hol-csp profits"}, {"keyword": "present work"}, {"keyword": "present work addresses"}, {"keyword": "presentation"}, {"keyword": "presented formalization"}, {"keyword": "presented theory"}, {"keyword": "presented variants increase"}, {"keyword": "presented work"}, {"keyword": "presents experimental results"}, {"keyword": "presents interesting results"}, {"keyword": "preservation lemmas"}, {"keyword": "preserve spectral properties"}, {"keyword": "preserves semantics"}, {"keyword": "preserves suprema"}, {"keyword": "pretty printers"}, {"keyword": "pretty printing"}, {"keyword": "previous afp article"}, {"keyword": "previous afp entry"}, {"keyword": "previous algorithms"}, {"keyword": "previous analogous"}, {"keyword": "previous axiomatic encoding"}, {"keyword": "previous berlekamp zassenhaus development"}, {"keyword": "previous cc formalization constructive_cryptography"}, {"keyword": "previous entry quasi-borel spaces"}, {"keyword": "previous formalisation"}, {"keyword": "previous theorem"}, {"keyword": "previous unifiers"}, {"keyword": "previous work"}, {"keyword": "previously break"}, {"keyword": "previously replaced term"}, {"keyword": "previously unknown paradox"}, {"keyword": "price determination"}, {"keyword": "price function"}, {"keyword": "price vickrey auction"}, {"keyword": "prim"}, {"keyword": "primal problem"}, {"keyword": "primarily based"}, {"keyword": "prime fields"}, {"keyword": "prime harmonic series"}, {"keyword": "prime iff"}, {"keyword": "prime ndash"}, {"keyword": "prime number"}, {"keyword": "prime number rdquo"}, {"keyword": "prime number theorem"}, {"keyword": "prime number theorem builds"}, {"keyword": "prime power"}, {"keyword": "prime-factorization algorithms"}, {"keyword": "primes"}, {"keyword": "primitive authentication construct"}, {"keyword": "primitive data types"}, {"keyword": "primitive list mathtt"}, {"keyword": "primitive pythagorean triples"}, {"keyword": "primitive recursive function"}, {"keyword": "primitively corecursive-"}, {"keyword": "primitives"}, {"keyword": "primitivity preserving"}, {"keyword": "principal ideal domains"}, {"keyword": "printing case expressions"}, {"keyword": "prior formalization attempt"}, {"keyword": "prior non-mechanized soundness proofs"}, {"keyword": "priority"}, {"keyword": "priority queue"}, {"keyword": "priority search tree"}, {"keyword": "privacy-preserving machine-learning framework based"}, {"keyword": "private information"}, {"keyword": "probabilistic arguments"}, {"keyword": "probabilistic behaviour"}, {"keyword": "probabilistic correctness theorems"}, {"keyword": "probabilistic data structure"}, {"keyword": "probabilistic functional language"}, {"keyword": "probabilistic functional programming language"}, {"keyword": "probabilistic functions"}, {"keyword": "probabilistic loop termination"}, {"keyword": "probabilistic method"}, {"keyword": "probabilistic model"}, {"keyword": "probabilistic model checking"}, {"keyword": "probabilistic noninterference"}, {"keyword": "probabilistic part"}, {"keyword": "probabilistic programs"}, {"keyword": "probabilistic proof systems"}, {"keyword": "probabilistic proofs"}, {"keyword": "probabilistic system types"}, {"keyword": "probabilistic systems"}, {"keyword": "probabilistic timed automata"}, {"keyword": "probabilistic variant"}, {"keyword": "probability kernel"}, {"keyword": "probability kernel kappa"}, {"keyword": "probability larger"}, {"keyword": "probability mass functions"}, {"keyword": "probability monad"}, {"keyword": "probability space"}, {"keyword": "probability theory"}, {"keyword": "probable hidden state sequence"}, {"keyword": "problem arithmetic progressions"}, {"keyword": "problem reduction"}, {"keyword": "problems"}, {"keyword": "process calculi encodings"}, {"keyword": "process control"}, {"keyword": "process crashes"}, {"keyword": "process invariant"}, {"keyword": "process trace"}, {"keyword": "processing components"}, {"keyword": "processor maintains"}, {"keyword": "prod limits_"}, {"keyword": "produce labeled subgoals"}, {"keyword": "produce observable outputs"}, {"keyword": "produce uniformly smaller automata"}, {"keyword": "product spaces"}, {"keyword": "product type"}, {"keyword": "profound formalism"}, {"keyword": "program -- addressed"}, {"keyword": "program analysis"}, {"keyword": "program compositions"}, {"keyword": "program construction"}, {"keyword": "program dependence graphs"}, {"keyword": "program execution"}, {"keyword": "program executions based"}, {"keyword": "program fulfilling"}, {"keyword": "program logic"}, {"keyword": "program logics similar"}, {"keyword": "program properties"}, {"keyword": "program refinement techniques"}, {"keyword": "program representation"}, {"keyword": "program trace semantics"}, {"keyword": "program traces"}, {"keyword": "program verification"}, {"keyword": "program verification competition"}, {"keyword": "program verification environment"}, {"keyword": "programming applications"}, {"keyword": "programming languages"}, {"keyword": "programming languages sml"}, {"keyword": "programming languages support working"}, {"keyword": "programs checking certificates"}, {"keyword": "programs written"}, {"keyword": "progress tracking protocol"}, {"keyword": "progressive measurability"}, {"keyword": "progressively measurable"}, {"keyword": "prohibited requests directly"}, {"keyword": "projection functions"}, {"keyword": "projective coordinates"}, {"keyword": "projective geometry"}, {"keyword": "projective plane geometry"}, {"keyword": "projective space geometry"}, {"keyword": "projective spaces"}, {"keyword": "promising increased tolerance"}, {"keyword": "promotes proof reuse"}, {"keyword": "pronounced lambda auth"}, {"keyword": "proof"}, {"keyword": "proof applies"}, {"keyword": "proof approach"}, {"keyword": "proof assistant"}, {"keyword": "proof assistant coq"}, {"keyword": "proof calculus"}, {"keyword": "proof closely"}, {"keyword": "proof details"}, {"keyword": "proof document supports"}, {"keyword": "proof due"}, {"keyword": "proof easily"}, {"keyword": "proof generalises euler"}, {"keyword": "proof involves removing"}, {"keyword": "proof language"}, {"keyword": "proof method"}, {"keyword": "proof method casify"}, {"keyword": "proof obligations automatically"}, {"keyword": "proof outlines"}, {"keyword": "proof principles"}, {"keyword": "proof relies"}, {"keyword": "proof reuses"}, {"keyword": "proof rules"}, {"keyword": "proof rules indexed"}, {"keyword": "proof search procedure"}, {"keyword": "proof significantly"}, {"keyword": "proof sketch"}, {"keyword": "proof sketches found"}, {"keyword": "proof step"}, {"keyword": "proof structure"}, {"keyword": "proof system"}, {"keyword": "proof techniques"}, {"keyword": "proof technology"}, {"keyword": "proof term checker embedded"}, {"keyword": "proof terms"}, {"keyword": "proof theory"}, {"keyword": "proof theory enables application"}, {"keyword": "proof tool"}, {"keyword": "proof-carrying-code style encoding"}, {"keyword": "proofs correct incompletenesses"}, {"keyword": "proofs involving independence"}, {"keyword": "proofs involving linear algebra"}, {"keyword": "proofs necessitate"}, {"keyword": "proofs remain manageable"}, {"keyword": "proofs require"}, {"keyword": "proper generic extension"}, {"keyword": "proper grounding"}, {"keyword": "properties"}, {"keyword": "properties related"}, {"keyword": "property"}, {"keyword": "proposed approach"}, {"keyword": "proposed under-approximate logics"}, {"keyword": "proposes axiom systems"}, {"keyword": "propositional abstract separation logic"}, {"keyword": "propositional calculus"}, {"keyword": "propositional calculus embeds"}, {"keyword": "propositional clauses"}, {"keyword": "propositional fragment"}, {"keyword": "propositional linear-time temporal logic"}, {"keyword": "propositional logic"}, {"keyword": "propositional predicate symbols"}, {"keyword": "propositional sequent calculus"}, {"keyword": "propositional tableau calculus"}, {"keyword": "protect paths"}, {"keyword": "protecting authorized paths"}, {"keyword": "protocol"}, {"keyword": "protocol abstracts"}, {"keyword": "protocol analysis"}, {"keyword": "protocol analysis tools"}, {"keyword": "protocol transcript"}, {"keyword": "protocol verification"}, {"keyword": "protocols secure"}, {"keyword": "protocols sharing common structure"}, {"keyword": "protocols supported"}, {"keyword": "provably demonstrate"}, {"keyword": "prover implementing"}, {"keyword": "providing formalizations"}, {"keyword": "providing sequential composition"}, {"keyword": "providing stronger guarantees"}, {"keyword": "proving correctness"}, {"keyword": "proving functional correctness"}, {"keyword": "proving information flow security"}, {"keyword": "proving open properties"}, {"keyword": "proving progress"}, {"keyword": "proving safety"}, {"keyword": "proving secure information flow"}, {"keyword": "proving termination"}, {"keyword": "pseudo-bl algebras"}, {"keyword": "pseudo-random functions"}, {"keyword": "pseudo-wajsberg algebras"}, {"keyword": "pseudonatural transformations"}, {"keyword": "pseudonymous identifiers output"}, {"keyword": "psi holds"}, {"keyword": "psi vdash phi"}, {"keyword": "public announcement logic"}, {"keyword": "public key cryptography"}, {"keyword": "public output ports"}, {"keyword": "public ports"}, {"keyword": "public-coin interactive proofs"}, {"keyword": "publication forthcoming"}, {"keyword": "publication tphols 2009"}, {"keyword": "publisher component"}, {"keyword": "publisher subscriber"}, {"keyword": "publisher subscriber pattern"}, {"keyword": "pure exchange economy"}, {"keyword": "pure mathematical subjects"}, {"keyword": "purely algebraic"}, {"keyword": "purely axiomatic manner"}, {"keyword": "purely denotational"}, {"keyword": "purely functional"}, {"keyword": "purely functional algorithms"}, {"keyword": "purely functional implementation based"}, {"keyword": "purely logical result yielding"}, {"keyword": "purely syntactic criteria"}, {"keyword": "purely syntactic normalisation procedure"}, {"keyword": "purposefully incomplete"}, {"keyword": "push-relabel algorithms"}, {"keyword": "pushdown reachability"}, {"keyword": "pushdown reachability algorithms post"}, {"keyword": "pushdown reachability called pdaaal"}, {"keyword": "pushdown systems"}, {"keyword": "putnam exam problems"}, {"keyword": "puzzle"}, {"keyword": "pythagoras law"}, {"keyword": "pythagorean triples"}, {"keyword": "q0 proof system"}, {"keyword": "qdimacs input format"}, {"keyword": "quad int_0 1"}, {"keyword": "quad left"}, {"keyword": "quad text"}, +{"keyword": "quadratic irrationals"}, {"keyword": "quadratic real arithmetic"}, {"keyword": "quadratic virtual substitution"}, {"keyword": "quadtrees"}, {"keyword": "qualitative applications"}, {"keyword": "qualitative temporal representation"}, {"keyword": "quality criteria"}, {"keyword": "quantalic structure"}, {"keyword": "quantic nuclei"}, {"keyword": "quantified boolean formula"}, {"keyword": "quantified formula"}, {"keyword": "quantified modal logic kb"}, {"keyword": "quantifier elimination procedures"}, {"keyword": "quantifier elimination theorem"}, {"keyword": "quantitative analysis"}, {"keyword": "quantitative temporal constraints"}, {"keyword": "quantities induces congruences"}, {"keyword": "quantum circuits"}, {"keyword": "quantum computing"}, {"keyword": "quantum hoare logic"}, {"keyword": "quantum information theory"}, {"keyword": "quantum measurements"}, {"keyword": "quantum mechanics"}, {"keyword": "quantum prisoner"}, {"keyword": "quantum programs"}, {"keyword": "quantum projective measurements"}, {"keyword": "quantum registers"}, {"keyword": "quantum setting"}, {"keyword": "quantum setting permits"}, {"keyword": "quantum state"}, {"keyword": "quantum teleportation"}, {"keyword": "quartic equation"}, {"keyword": "quasi-borel spaces"}, {"keyword": "quasi-fixed point"}, {"keyword": "quelques probl"}, {"keyword": "query evaluation"}, {"keyword": "query optimization consisting"}, {"keyword": "queue data structures"}, {"keyword": "quickly verified"}, {"keyword": "quickstart guide"}, {"keyword": "quotient construction"}, {"keyword": "rabin automata"}, {"keyword": "racing effects"}, {"keyword": "radical coordinates"}, {"keyword": "radical expressions"}, {"keyword": "radix sort"}, {"keyword": "rado"}, {"keyword": "ramanujan sums gauss sums"}, {"keyword": "ramsey"}, {"keyword": "ramsey theory"}, {"keyword": "randall munroe"}, {"keyword": "random"}, {"keyword": "random binary search trees"}, {"keyword": "random bst"}, {"keyword": "random coin flips"}, {"keyword": "random element"}, {"keyword": "random experiment"}, {"keyword": "random graph"}, {"keyword": "random monad"}, {"keyword": "random order"}, {"keyword": "random pivot choice"}, {"keyword": "random serial dictatorship"}, {"keyword": "random systems"}, {"keyword": "random variable"}, {"keyword": "random walks"}, {"keyword": "random-permutation random-function switching lemma"}, {"keyword": "randomised binary search trees"}, {"keyword": "randomised skip list"}, {"keyword": "randomised treaps"}, {"keyword": "randomized algorithms"}, {"keyword": "randomized approximation algorithms"}, {"keyword": "randomized comb algorithm"}, {"keyword": "randomized list update algorithm"}, {"keyword": "randomly chosen inputs"}, {"keyword": "randomly generated inputs"}, {"keyword": "range queries"}, {"keyword": "range search algorithm"}, {"keyword": "rank nullity theorem entry"}, {"keyword": "rank-nullity theorem"}, {"keyword": "rank-nullity theorem generalises"}, {"keyword": "rank-nullity theorem roughly follow"}, {"keyword": "rapid prototyping"}, {"keyword": "rapidly growing literature"}, {"keyword": "rational actors"}, {"keyword": "rational exponents"}, {"keyword": "rational number"}, {"keyword": "rational polynomials"}, {"keyword": "rational root test"}, {"keyword": "rational roots"}, {"keyword": "re-usable dfs-based algorithms"}, {"keyword": "reachability analysis"}, {"keyword": "reachability relation"}, {"keyword": "reachable nodes"}, {"keyword": "reachable states"}, {"keyword": "reactive systems"}, {"keyword": "reading heads asynchronously"}, {"keyword": "real analysis"}, {"keyword": "real arithmetic"}, {"keyword": "real case"}, {"keyword": "real closed field"}, {"keyword": "real coefficients"}, {"keyword": "real component"}, {"keyword": "real eigenvalue"}, {"keyword": "real error function erf"}, {"keyword": "real exponents"}, {"keyword": "real gamma function gamma"}, {"keyword": "real ideal world paradigm"}, {"keyword": "real matrix"}, {"keyword": "real normed division algebras"}, {"keyword": "real numbers"}, {"keyword": "real polynomial"}, {"keyword": "real polynomial lies inside"}, {"keyword": "real roots"}, {"keyword": "real vector ordering"}, {"keyword": "real vectors spaces"}, {"keyword": "real world"}, {"keyword": "real world distributed systems"}, {"keyword": "real-normed fields"}, {"keyword": "real-time constraints"}, {"keyword": "real-word firewall errors"}, {"keyword": "real-world computer networks"}, {"keyword": "real-world imperative programming languages"}, {"keyword": "real-world programming languages"}, {"keyword": "real-world protocol"}, {"keyword": "realistic virtual machine"}, {"keyword": "reasonable efficiency"}, {"keyword": "reasoning stays"}, {"keyword": "recently proposed framework"}, {"keyword": "recovering structure"}, {"keyword": "recovery operators"}, {"keyword": "recurrence equations"}, {"keyword": "recurrence relation"}, {"keyword": "recursion combinator"}, {"keyword": "recursion principle"}, {"keyword": "recursion theorems"}, {"keyword": "recursion theory --- definitions"}, {"keyword": "recursive block matrices"}, {"keyword": "recursive datatype"}, {"keyword": "recursive enumerability"}, {"keyword": "recursive fashion"}, {"keyword": "recursive fast fourier transform"}, {"keyword": "recursive formalization"}, {"keyword": "recursive function operates"}, {"keyword": "recursive functions"}, {"keyword": "recursive functions heavily inspired"}, {"keyword": "recursive inseparability"}, {"keyword": "recursive path order"}, {"keyword": "recursive procedures"}, {"keyword": "recursive programs based"}, {"keyword": "recursively enumerable set"}, {"keyword": "recursively expressed"}, {"keyword": "recursively inseparable"}, {"keyword": "red-black trees"}, {"keyword": "reduced echelon form"}, {"keyword": "reduced row echelon form"}, {"keyword": "reduces proof obligations"}, {"keyword": "reducible control flow graph"}, {"keyword": "reduction conformance relations"}, {"keyword": "reduction path"}, {"keyword": "reduction step"}, {"keyword": "reduction theorem"}, {"keyword": "reference implementation"}, {"keyword": "reference point"}, {"keyword": "refine system specifications"}, {"keyword": "refined version"}, {"keyword": "refinement approach scales"}, {"keyword": "refinement based verification"}, {"keyword": "refinement calculus literature"}, {"keyword": "refinement framework"}, {"keyword": "refinement kleene algebra"}, {"keyword": "refinement orders"}, {"keyword": "refinement proof"}, {"keyword": "refinement relations"}, {"keyword": "refinement steps"}, {"keyword": "refinement techniques"}, {"keyword": "refinement theorem"}, {"keyword": "refinement theory"}, {"keyword": "refinement type systems"}, {"keyword": "refinement-based theorem proving approach"}, {"keyword": "reflected binary code"}, {"keyword": "reflection formula"}, {"keyword": "reflection-based decision procedure"}, {"keyword": "reflective quantifier elimination procedures"}, {"keyword": "reflexive transitive closure"}, {"keyword": "reflexive transitive closure operation"}, {"keyword": "reflexive-transitive closures"}, {"keyword": "refused events"}, {"keyword": "refutational completeness"}, {"keyword": "refutational theorem proving"}, {"keyword": "refutationally complete"}, {"keyword": "regain sequential consistency"}, {"keyword": "region boundaries explicitly"}, {"keyword": "region quadtrees"}, {"keyword": "register aliasing"}, {"keyword": "register refers"}, {"keyword": "registering applicative functors"}, {"keyword": "registering automatic methods"}, {"keyword": "regular algebra hierarchy"}, {"keyword": "regular algebras"}, {"keyword": "regular algebras axiomatise"}, {"keyword": "regular arithmetic geometric"}, {"keyword": "regular expression"}, {"keyword": "regular expression equivalence"}, {"keyword": "regular expression matches"}, {"keyword": "regular expressions extended"}, {"keyword": "regular expressions needed"}, {"keyword": "regular identities"}, {"keyword": "regular language identity"}, {"keyword": "regular languages"}, {"keyword": "regular operations"}, {"keyword": "regular sets"}, {"keyword": "regular structures"}, {"keyword": "regularity lemma"}, {"keyword": "reifies property patterns"}, {"keyword": "reify property patterns"}, {"keyword": "reimposing upper bounds"}, {"keyword": "relabelling function"}, {"keyword": "related concepts"}, {"keyword": "related equation"}, {"keyword": "related formalizations"}, {"keyword": "related recurrence relations"}, {"keyword": "related rewrite rules"}, {"keyword": "related splay heaps"}, {"keyword": "related structures"}, {"keyword": "related theorem"}, {"keyword": "relation algebra"}, {"keyword": "relation algebras equipped"}, {"keyword": "relation algebras extended"}, {"keyword": "relation composition"}, {"keyword": "relation constraints"}, {"keyword": "relation reduces"}, {"keyword": "relation-algebraic concepts"}, {"keyword": "relational concurrent separation logic"}, {"keyword": "relational constructors"}, {"keyword": "relational core"}, {"keyword": "relational language based"}, {"keyword": "relational model"}, {"keyword": "relational monoids"}, {"keyword": "relational parametricity"}, {"keyword": "relational parametricity due"}, {"keyword": "relational program logics"}, {"keyword": "relational tt-lifting"}, {"keyword": "relative safety"}, {"keyword": "relative soundness results"}, {"keyword": "relativised concepts"}, {"keyword": "relativize paulson"}, {"keyword": "relativized general knowledge"}, {"keyword": "release ownership"}, {"keyword": "relevant definitions"}, {"keyword": "relevant material"}, {"keyword": "relevant proof methods"}, {"keyword": "relevant standard"}, {"keyword": "rely condition generalised"}, {"keyword": "rely guarantee reasoning"}, {"keyword": "rely quotient"}, {"keyword": "rely-guarantee-style reasoning"}, {"keyword": "remain anonymous"}, {"keyword": "remainder sequences"}, {"keyword": "remainder terms"}, {"keyword": "remaining computation"}, {"keyword": "remaining rules"}, {"keyword": "removes exception handler entries"}, {"keyword": "removes syntactic sugar"}, {"keyword": "removing intermediate list structures"}, {"keyword": "renaming-enriched sets"}, {"keyword": "repeated factors"}, {"keyword": "repeated opening"}, {"keyword": "replacement rule"}, {"keyword": "replacement theorem"}, {"keyword": "replicated data"}, {"keyword": "replicated databases"}, {"keyword": "replicated datatypes"}, {"keyword": "replicated growable array"}, {"keyword": "represent objects"}, {"keyword": "represent physical quantities"}, {"keyword": "represent quantum states"}, {"keyword": "represent recursively enumerable sets"}, {"keyword": "represent two-dimensional images"}, {"keyword": "representable bounds"}, {"keyword": "representation executable"}, {"keyword": "representation function"}, {"keyword": "representation independence"}, {"keyword": "representation theorem"}, {"keyword": "representative dynamic programming problems"}, {"keyword": "representing algorithms"}, {"keyword": "representing documents"}, {"keyword": "representing legal agreements"}, {"keyword": "represents dominators"}, {"keyword": "reproduce faithfully"}, {"keyword": "reproduced faithfully"}, {"keyword": "requested computation"}, {"keyword": "require"}, {"keyword": "require eventual consistency"}, {"keyword": "require guardedness up-"}, {"keyword": "require intermediate operational semantics"}, {"keyword": "required induction rule"}, {"keyword": "required truth lemma"}, {"keyword": "requirements"}, {"keyword": "requires precise statements"}, {"keyword": "research project"}, {"keyword": "research started"}, {"keyword": "residuated boolean algebra"}, {"keyword": "residuated functions"}, {"keyword": "residuated lattices"}, {"keyword": "residuated transition system"}, {"keyword": "residuation operation"}, {"keyword": "residue classes"}, {"keyword": "resolution calculus"}, {"keyword": "resolution rule"}, {"keyword": "resolution theorem proving chapter"}, {"keyword": "resolvable designs"}, {"keyword": "resource bound"}, {"keyword": "resp"}, {"keyword": "respect stream equivalence"}, {"keyword": "respective frameworks"}, {"keyword": "respective fundamental homomorphism theorems"}, {"keyword": "respective properties"}, {"keyword": "restricted definition"}, {"keyword": "restricted growth functions"}, {"keyword": "restricted identification"}, {"keyword": "restricted schedules"}, {"keyword": "restricted solution space"}, {"keyword": "restricted type"}, {"keyword": "restrictive definition"}, {"keyword": "result due"}, {"keyword": "resulting automata"}, {"keyword": "resulting automaton"}, {"keyword": "resulting bst"}, {"keyword": "resulting code"}, {"keyword": "resulting framework"}, {"keyword": "resulting generalized counting sort"}, {"keyword": "resulting hierarchy"}, {"keyword": "resulting logic"}, {"keyword": "resulting proof system"}, {"keyword": "resulting recursion induction rules"}, {"keyword": "resulting set"}, {"keyword": "resulting system"}, {"keyword": "resulting tree"}, {"keyword": "results"}, {"keyword": "results hold"}, {"keyword": "results presented"}, {"keyword": "resuting proofs"}, {"keyword": "retain key properties"}, {"keyword": "reusable building blocks"}, {"keyword": "reusable libraries"}, {"keyword": "reusable modelling"}, {"keyword": "reusable probability space framework"}, {"keyword": "reusable proof components"}, {"keyword": "reusable reasoning infrastructure"}, {"keyword": "reusing facts"}, {"keyword": "reverse post order number"}, {"keyword": "reversed morphisms"}, {"keyword": "revision 6081d5be8d08"}, {"keyword": "revision functions launches"}, {"keyword": "rewrite equivalent definitions"}, {"keyword": "rewrite rules"}, {"keyword": "rewriting tactics"}, {"keyword": "rgen villadsen"}, {"keyword": "ribbon proofs"}, {"keyword": "ribbon proofs emphasise"}, {"keyword": "rich expression typing rules"}, {"keyword": "richard char-tung lee"}, {"keyword": "riemann integral"}, {"keyword": "riemann roch"}, {"keyword": "riemann zeta"}, {"keyword": "riemann zeta function"}, {"keyword": "right-hand side"}, {"keyword": "rigorous numerical algorithms"}, {"keyword": "rigorous polynomial approximation"}, {"keyword": "ring theory development"}, {"keyword": "ringed spaces"}, {"keyword": "risk-free lending protocol"}, {"keyword": "rivest commitment schemes"}, {"keyword": "road traffic"}, {"keyword": "rob arthan"}, {"keyword": "robbins conjecture"}, {"keyword": "robin smith"}, {"keyword": "robust supporting theory"}, {"keyword": "roger lipsett"}, {"keyword": "root-balanced trees"}, {"keyword": "roots"}, {"keyword": "rose bohrer"}, {"keyword": "routh-hurwitz stability criterion"}, {"keyword": "routing policies"}, {"keyword": "routing table"}, {"keyword": "routing table entry"}, {"keyword": "rsa cryptography standard"}, {"keyword": "rsa keys"}, {"keyword": "rts algorithm"}, {"keyword": "rts algorithms select"}, {"keyword": "rts definition mandates safety"}, {"keyword": "rule induction"}, {"keyword": "rule modus ponens"}, {"keyword": "rules applying"}, {"keyword": "rules controls"}, {"keyword": "run construction rules"}, {"keyword": "runge-kutta methods"}, {"keyword": "running average"}, {"keyword": "running time"}, {"keyword": "running time bounds"}, {"keyword": "runtime bounds"}, {"keyword": "runtime faults"}, {"keyword": "runtime monitoring"}, {"keyword": "runtime verification tool"}, {"keyword": "ruzsa triangle inequality"}, {"keyword": "s-finite measure monad"}, {"keyword": "safe approximation"}, {"keyword": "safe distance"}, {"keyword": "safe distance rule"}, {"keyword": "safe navigation operations"}, {"keyword": "safe ocl distincts nullable"}, {"keyword": "safe ocl typing rules"}, {"keyword": "safe regression test selection"}, {"keyword": "safe-range queries evaluate"}, {"keyword": "safe-range query"}, {"keyword": "safely composable"}, {"keyword": "safely composable dom"}, {"keyword": "safely composable web components"}, {"keyword": "safety policy"}, {"keyword": "safety properties"}, {"keyword": "safety violations"}, {"keyword": "salomon sickert"}, {"keyword": "sample authentication protocol"}, {"keyword": "sample computations"}, {"keyword": "sample main"}, {"keyword": "sat solver"}, {"keyword": "sat solver correctness proofs"}, {"keyword": "sat solver descriptions"}, {"keyword": "sat solver installs"}, {"keyword": "sat solver written"}, {"keyword": "satisfaction relation"}, {"keyword": "satisfying assignment"}, {"keyword": "satisfying model"}, {"keyword": "satisfying tuples"}, {"keyword": "saturated mcss"}, {"keyword": "saturation theorem proving"}, {"keyword": "saturation-based heuristic prover"}, {"keyword": "sauer-shelah lemma"}, {"keyword": "scalar multiplication"}, {"keyword": "sch02a stefan schwoon"}, {"keyword": "sch15 anders schlichtkrull"}, {"keyword": "sch16 anders schlichtkrull"}, {"keyword": "sch18 anders schlichtkrull"}, {"keyword": "scheduling activity"}, {"keyword": "schneider"}, {"keyword": "schultz refers"}, {"keyword": "schur decomposition"}, {"keyword": "schwartz-zippel lemma"}, {"keyword": "scl backtrack rule"}, {"keyword": "score admits 2"}, {"keyword": "scott-continuous monad morphism"}, {"keyword": "sd-strategy- proofness"}, {"keyword": "sdss random dictatorship"}, {"keyword": "search algorithms"}, {"keyword": "search path"}, {"keyword": "search tree"}, {"keyword": "search trees based"}, {"keyword": "search-time information"}, {"keyword": "search-tree property"}, {"keyword": "second-countable topology"}, {"keyword": "second-order derivation"}, {"keyword": "second-order logic"}, {"keyword": "second-order properties"}, {"keyword": "secret data"}, {"keyword": "secret data manipulated"}, {"keyword": "secure auto-completion"}, {"keyword": "secure hash standard"}, {"keyword": "secure information flow"}, {"keyword": "secure messaging channel established"}, {"keyword": "secure multiple case studies"}, {"keyword": "secure network configurations"}, {"keyword": "secure process"}, {"keyword": "secure stateful implementation"}, {"keyword": "security concepts"}, {"keyword": "security configuration actual firewall"}, {"keyword": "security definition"}, {"keyword": "security expressed"}, {"keyword": "security guarantees"}, {"keyword": "security invariant theory"}, {"keyword": "security invariants"}, {"keyword": "security invariants hold"}, {"keyword": "security policy"}, {"keyword": "security proof"}, {"keyword": "security properties"}, {"keyword": "security properties turn"}, {"keyword": "security property"}, {"keyword": "security protocols based"}, {"keyword": "security requirements expressed"}, {"keyword": "security statements"}, {"keyword": "security systems"}, {"keyword": "security type system"}, {"keyword": "security unwinding technique"}, {"keyword": "security violations"}, {"keyword": "selection functions"}, {"keyword": "selection sort"}, {"keyword": "self-adjusting binary search trees"}, {"keyword": "self-contained certifier"}, {"keyword": "self-contained specification"}, {"keyword": "self-referential implementation"}, {"keyword": "seligman-style tableau system"}, {"keyword": "semantic annotations"}, {"keyword": "semantic arguments"}, {"keyword": "semantic back-ends"}, {"keyword": "semantic definitions"}, {"keyword": "semantic domain"}, {"keyword": "semantic embedding"}, {"keyword": "semantic engine"}, {"keyword": "semantic information directly embedded"}, {"keyword": "semantic interpretation"}, {"keyword": "semantic model"}, {"keyword": "semantic resolution"}, {"keyword": "semantic side conditions"}, {"keyword": "semantic trees"}, {"keyword": "semantic type soundness"}, {"keyword": "semantical representation"}, {"keyword": "semi-honest security setting"}, {"keyword": "seminal paper natural semantics"}, {"keyword": "sending end host selects"}, {"keyword": "sends pairs"}, {"keyword": "separable characters induced moduli"}, {"keyword": "separate afp entries goedel_hfset_semantic"}, {"keyword": "separate afp entry"}, {"keyword": "separating conjunction"}, {"keyword": "separation algebra"}, {"keyword": "separation kernels"}, {"keyword": "separation logic"}, {"keyword": "separation logic assertion"}, {"keyword": "separation logic connective"}, {"keyword": "separation logic formulae"}, {"keyword": "separation logic framework"}, {"keyword": "separation logic theory"}, {"keyword": "separation logic utilities"}, {"keyword": "separation-logic based correctness proofs"}, {"keyword": "separator smaller"}, {"keyword": "sepref tool"}, {"keyword": "sequence preserves fairness"}, {"keyword": "sequent calculus"}, {"keyword": "sequent calculus prover"}, {"keyword": "sequential compactness"}, {"keyword": "sequential composition"}, {"keyword": "sequential consistency"}, {"keyword": "sequential imperative programming language"}, {"keyword": "sequential java bytecode"}, {"keyword": "sequential semantics"}, {"keyword": "sequentially consistent"}, {"keyword": "serge lang"}, {"keyword": "series consisting"}, {"keyword": "session hol-csp"}, {"keyword": "session keys"}, {"keyword": "set"}, {"keyword": "set based representation"}, {"keyword": "set categories"}, {"keyword": "set category"}, {"keyword": "set category locale"}, {"keyword": "set construction"}, {"keyword": "set mapping"}, {"keyword": "set monad notation"}, {"keyword": "set operations"}, {"keyword": "set partitions"}, {"keyword": "set theoretic formulation"}, {"keyword": "set theory"}, {"keyword": "set theory framework"}, {"keyword": "setup required"}, {"keyword": "severe limitation"}, {"keyword": "shadow dom"}, {"keyword": "shadow root"}, {"keyword": "shadow tree"}, {"keyword": "shallow embedding"}, {"keyword": "shallow embedding manner"}, {"keyword": "shallow learning"}, {"keyword": "shallow semantic embeddings"}, {"keyword": "shallow semantical embeddings"}, {"keyword": "shallowly embed"}, {"keyword": "shannon decomposition"}, {"keyword": "shapeless library"}, {"keyword": "share common algorithmic ideas"}, {"keyword": "shared bdd"}, {"keyword": "shared data"}, {"keyword": "shared data commute"}, {"keyword": "shared environments"}, {"keyword": "shared resources"}, {"keyword": "shaz qadeer"}, {"keyword": "sheldon axler"}, {"keyword": "shifting intervals"}, {"keyword": "short applications"}, {"keyword": "short derivation"}, {"keyword": "short entry"}, {"keyword": "short explanation"}, {"keyword": "short outline"}, {"keyword": "short proof"}, {"keyword": "short sketch"}, {"keyword": "shorter refinement proofs"}, {"keyword": "shortest non-"}, {"keyword": "shortest path"}, {"keyword": "shortest vector problem"}, {"keyword": "showcase haskell"}, {"keyword": "showing termination based"}, {"keyword": "side conditions"}, {"keyword": "side effects"}, {"keyword": "side product"}, {"keyword": "sifum_type_systems afp entry"}, {"keyword": "sigma -finite"}, {"keyword": "sigma -finite measure"}, {"keyword": "sigma function"}, {"keyword": "signed diffie-hellman"}, {"keyword": "signed measure"}, {"keyword": "signed words"}, {"keyword": "significant bit"}, {"keyword": "significant confidentiality theorems"}, {"keyword": "significant contribution"}, {"keyword": "significant extensions"}, {"keyword": "significant gain"}, {"keyword": "significant generalization"}, {"keyword": "significant piece"}, {"keyword": "significantly differ"}, {"keyword": "significantly expands"}, {"keyword": "significantly larger"}, {"keyword": "significantly reduce"}, {"keyword": "significantly worse"}, {"keyword": "sim gamma"}, {"keyword": "sim phi"}, {"keyword": "sim sqrt 2 pi"}, {"keyword": "simd extensions"}, {"keyword": "similar cegar-"}, {"keyword": "similar construction"}, {"keyword": "similar documentation"}, {"keyword": "similar level"}, {"keyword": "similar normal form"}, {"keyword": "similar preferences"}, {"keyword": "similar proof"}, {"keyword": "similar systems"}, {"keyword": "simon robillard"}, {"keyword": "simple"}, {"keyword": "simple algebraic basis"}, {"keyword": "simple clause learning"}, {"keyword": "simple compilation function"}, {"keyword": "simple executable algorithms"}, {"keyword": "simple exercises"}, {"keyword": "simple firewall model"}, {"keyword": "simple formalization covering"}, {"keyword": "simple functions"}, {"keyword": "simple graph"}, {"keyword": "simple hops"}, {"keyword": "simple hybrid programs"}, {"keyword": "simple imperative language"}, {"keyword": "simple imperative language imp"}, {"keyword": "simple inductive proof"}, {"keyword": "simple interactive proof assistant"}, {"keyword": "simple language"}, {"keyword": "simple model"}, {"keyword": "simple object calculus"}, {"keyword": "simple paper proof"}, {"keyword": "simple procedure call mechanism"}, {"keyword": "simple programming language"}, {"keyword": "simple proofs"}, {"keyword": "simple qbf solvers"}, {"keyword": "simple relation-algebraic semantics"}, {"keyword": "simple solution"}, {"keyword": "simple specification"}, {"keyword": "simple subformula conditions"}, {"keyword": "simple summation conversion"}, {"keyword": "simple techniques"}, {"keyword": "simple theory"}, {"keyword": "simple type system"}, {"keyword": "simple type theory"}, {"keyword": "simple verification conditions"}, {"keyword": "simple verified token"}, {"keyword": "simple while-language"}, {"keyword": "simpler operations"}, {"keyword": "simpler problem"}, {"keyword": "simpler pseudo-random construction avoiding"}, {"keyword": "simpler secure processes"}, {"keyword": "simpler sigma-calculus based"}, {"keyword": "simpler versions"}, {"keyword": "simplex algorithm"}, {"keyword": "simplicial complex"}, {"keyword": "simplicial complexes"}, {"keyword": "simplifier integration"}, {"keyword": "simplify complex iptables rulests"}, {"keyword": "simplify program verification"}, {"keyword": "simplify protocol verification"}, {"keyword": "simply hermite-lindemann"}, +{"keyword": "simply import"}, {"keyword": "simply strengthen"}, {"keyword": "simply transforms"}, {"keyword": "simply-typed lambda terms"}, {"keyword": "simulate minsky machines"}, {"keyword": "simulation code generation"}, {"keyword": "simulation preorders"}, {"keyword": "simulation relation"}, {"keyword": "simulation-based proofs"}, {"keyword": "simulation-based security paradigms"}, {"keyword": "simultaneously empowering end hosts"}, {"keyword": "simultaneously reason"}, {"keyword": "simultaneously solving"}, {"keyword": "sin nx u_n"}, {"keyword": "sin state"}, {"keyword": "single binders"}, {"keyword": "single component"}, {"keyword": "single element"}, {"keyword": "single event list varying"}, {"keyword": "single exponential blow-"}, {"keyword": "single infinite point"}, {"keyword": "single nodes"}, {"keyword": "single parse tree"}, {"keyword": "single partial binary operation"}, {"keyword": "single partial composition operation"}, {"keyword": "single permanent failure"}, {"keyword": "single setting"}, {"keyword": "single strip"}, {"keyword": "single triangle"}, {"keyword": "single unit"}, {"keyword": "single variable ranging"}, {"keyword": "single-set axiomatisation"}, {"keyword": "single-set categories"}, {"keyword": "single-source shortest path function"}, {"keyword": "single-source shortest path problem"}, {"keyword": "sizeable family"}, {"keyword": "sk sum"}, {"keyword": "sketches found"}, {"keyword": "skew binomial heaps"}, {"keyword": "skew heaps"}, {"keyword": "skew links"}, {"keyword": "skew product"}, {"keyword": "skip blocks"}, {"keyword": "skip lists"}, {"keyword": "skip lists consists"}, {"keyword": "sliced graph"}, {"keyword": "slicing based"}, {"keyword": "slide operation"}, {"keyword": "sliding window algorithm"}, {"keyword": "slightly advanced properties"}, {"keyword": "slightly extended"}, {"keyword": "slightly mars"}, {"keyword": "slightly modified"}, {"keyword": "slightly stronger hypothesis"}, {"keyword": "small abstract subsystems"}, {"keyword": "small classes"}, {"keyword": "small imperative language imp"}, {"keyword": "small predicate"}, {"keyword": "small set"}, {"keyword": "small step operational semantics"}, {"keyword": "small step program refinement"}, {"keyword": "small step semantics"}, {"keyword": "small-step operational semantics"}, {"keyword": "small-step semantics akin"}, {"keyword": "small-step semantics instrumented"}, {"keyword": "smaller fixed fraction returned"}, {"keyword": "smaller set"}, {"keyword": "smallest disc"}, {"keyword": "smallest number n_"}, {"keyword": "smith normal form"}, {"keyword": "sml parser"}, {"keyword": "smt"}, {"keyword": "smt proof"}, {"keyword": "snyder found"}, {"keyword": "so-called desargues"}, {"keyword": "so-called hessenberg"}, {"keyword": "so-called hyperproperties"}, {"keyword": "so-called key equalities"}, {"keyword": "so-called sturm sequences"}, {"keyword": "so-called trace properties"}, {"keyword": "social decision schemes"}, {"keyword": "social welfare"}, {"keyword": "software framework"}, {"keyword": "software framework incorporates"}, {"keyword": "software security"}, {"keyword": "software tool"}, {"keyword": "software tool authors"}, {"keyword": "solid polyhedra"}, {"keyword": "solomon feferman"}, {"keyword": "solovay ndash"}, {"keyword": "solution"}, {"keyword": "solution obtained"}, {"keyword": "solutions based"}, {"keyword": "solve automatically"}, {"keyword": "solve clique"}, {"keyword": "solve mdps"}, {"keyword": "solved deterministically"}, {"keyword": "solved explicitly"}, {"keyword": "solver based"}, {"keyword": "solving equational systems"}, {"keyword": "solving equations"}, {"keyword": "solving linear programs"}, {"keyword": "solving markov decision processes"}, {"keyword": "sophie tourret"}, {"keyword": "sophisticated languages"}, {"keyword": "sophisticated object-oriented bytecode language"}, {"keyword": "sorted linked lists"}, {"keyword": "sorted linked lists enhanced"}, {"keyword": "sorted monadic equational logic"}, {"keyword": "sorting algorithm"}, {"keyword": "sorts objects"}, {"keyword": "sound"}, {"keyword": "sound syntactic criteria"}, {"keyword": "soundness proof"}, {"keyword": "source code"}, {"keyword": "source coding theorem"}, {"keyword": "source type"}, {"keyword": "source-to-assembly step matching"}, {"keyword": "space complexity"}, {"keyword": "space complexity guarantees"}, {"keyword": "space usage"}, {"keyword": "spacetime location"}, {"keyword": "spanning basic algorithms"}, {"keyword": "spanning subhypergraphs"}, {"keyword": "sparcv8 architecture"}, {"keyword": "sparcv8 cpu"}, {"keyword": "sparcv8 cpu simulator"}, {"keyword": "sparcv8 instruction set architecture"}, {"keyword": "spark certify"}, {"keyword": "sparse grid"}, {"keyword": "sparse relations"}, {"keyword": "spatially-separated views"}, {"keyword": "spatio-temporal multi-modal logic"}, {"keyword": "special attention"}, {"keyword": "special care"}, {"keyword": "special case"}, {"keyword": "special combination"}, {"keyword": "special form"}, {"keyword": "special functions"}, {"keyword": "special halting problem"}, {"keyword": "special issue"}, {"keyword": "specialized sliding window algorithm"}, {"keyword": "specially well-"}, {"keyword": "specific conflict analysis algorithm"}, {"keyword": "specific instantiations"}, {"keyword": "specific integer polynomial"}, {"keyword": "specific isomorphism expressing"}, {"keyword": "specific operations"}, {"keyword": "specific parameterization"}, {"keyword": "specific part"}, {"keyword": "specific series fulfilling"}, {"keyword": "specific tactic support"}, {"keyword": "specific variants"}, {"keyword": "specification decomposition principles"}, {"keyword": "specification holds"}, {"keyword": "specification language"}, {"keyword": "specification language statecharts"}, {"keyword": "specification language tla"}, {"keyword": "specification mechanism"}, {"keyword": "specifies compilation"}, {"keyword": "spectral gap"}, {"keyword": "spectral radius"}, {"keyword": "spectral radius theory"}, {"keyword": "spectral theorem states"}, {"keyword": "speculative linearizability framework"}, {"keyword": "splay heaps"}, {"keyword": "splay trees"}, {"keyword": "splitting compilation"}, {"keyword": "sqrt sin"}, {"keyword": "square complex matrix"}, {"keyword": "square integrable functions"}, {"keyword": "square matrices form"}, {"keyword": "square roots"}, {"keyword": "square-free factorization algorithm"}, {"keyword": "square-free part"}, {"keyword": "squarefree integers"}, {"keyword": "squares"}, {"keyword": "squares euclid"}, {"keyword": "squares problem"}, {"keyword": "squares theorem"}, {"keyword": "ssa"}, {"keyword": "ssst22 anders schlichtkrull"}, {"keyword": "stability"}, {"keyword": "stable configuration"}, {"keyword": "stable property detection"}, +{"keyword": "standalone code generation target"}, {"keyword": "standard"}, {"keyword": "standard algorithms textbooks"}, {"keyword": "standard approach"}, {"keyword": "standard arithmetic"}, {"keyword": "standard axiomatisation"}, {"keyword": "standard boolean algebra operations"}, {"keyword": "standard borel space"}, {"keyword": "standard compliant formalization"}, {"keyword": "standard construction"}, {"keyword": "standard definitions"}, {"keyword": "standard disassembly tool objdump"}, {"keyword": "standard dolev-yao"}, {"keyword": "standard estimations"}, {"keyword": "standard finite_map theory"}, {"keyword": "standard laws"}, {"keyword": "standard logistic function"}, {"keyword": "standard models"}, {"keyword": "standard operators"}, {"keyword": "standard prelude"}, {"keyword": "standard proof methods"}, {"keyword": "standard protocol descriptions based"}, {"keyword": "standard real cartesian model"}, {"keyword": "standard reduction path"}, {"keyword": "standard redundancy criterion"}, {"keyword": "standard restrictions"}, {"keyword": "standard security protocols"}, {"keyword": "standard semantics"}, {"keyword": "standard semirings"}, {"keyword": "standard signature algorithm"}, {"keyword": "standard superposition calculus corresponds"}, {"keyword": "standard system"}, {"keyword": "standard textbook proof"}, {"keyword": "standard textbook version"}, {"keyword": "standard theorems"}, {"keyword": "standard total-correctness hoare logic"}, {"keyword": "standard transfinite kbo"}, {"keyword": "standard two-phase slicer"}, {"keyword": "standard types"}, {"keyword": "standard verification technology"}, {"keyword": "standard versions"}, {"keyword": "standardization theorem"}, {"keyword": "standards operate"}, {"keyword": "stanford encyclopedia"}, {"keyword": "star-free regular expressions"}, {"keyword": "starting point"}, {"keyword": "state monad"}, {"keyword": "state proofs"}, {"keyword": "state sigma iff"}, {"keyword": "state sigma_a"}, {"keyword": "state space"}, {"keyword": "state transformers"}, {"keyword": "state-based non-deterministic sequential computations"}, {"keyword": "state-based semantics based"}, {"keyword": "state-merging technique"}, {"keyword": "state-normalisation allowing"}, {"keyword": "state-of-the-art automated protocol verifiers"}, {"keyword": "state-of-the-art sat-based planner"}, {"keyword": "state-of-the-art smt solvers"}, {"keyword": "state-space construction"}, {"keyword": "stateful connection semantics"}, {"keyword": "stateful intransitive noninterference"}, {"keyword": "stateful network implementation"}, {"keyword": "statement"}, {"keyword": "statement applies"}, {"keyword": "statement boundaries"}, {"keyword": "states"}, {"keyword": "states common definitions"}, {"keyword": "static analysis"}, {"keyword": "static fields"}, {"keyword": "static interprocedural slicing"}, {"keyword": "static intraprocedural slicing"}, {"keyword": "static intraprocedural slicing based"}, {"keyword": "static openflow rules"}, {"keyword": "static program analysis"}, {"keyword": "static refutational completeness"}, {"keyword": "static security type systems"}, {"keyword": "static single assignment"}, {"keyword": "static single assignment form"}, {"keyword": "static type system"}, {"keyword": "stationary distributions"}, {"keyword": "steam boiler system"}, {"keyword": "stefan schmid"}, {"keyword": "stein"}, {"keyword": "stellar quorum systems"}, {"keyword": "step functions"}, {"keyword": "step-wise refinement based"}, {"keyword": "stephanie bell"}, {"keyword": "stephen schanuel"}, {"keyword": "stepping stone"}, {"keyword": "stepwise inductive definition"}, {"keyword": "stepwise manner"}, {"keyword": "stepwise program refinement"}, {"keyword": "stepwise program refinement techniques"}, {"keyword": "stepwise refinement"}, {"keyword": "stepwise refinement based approach"}, {"keyword": "stepwise refinement techniques"}, {"keyword": "stieltjes constants"}, {"keyword": "stiffness matrix"}, {"keyword": "stiffness matrix represents"}, {"keyword": "stimulus structure"}, {"keyword": "stochastic dominance"}, {"keyword": "stochastic matrices"}, {"keyword": "stochastic matrix"}, {"keyword": "stochastic processes"}, {"keyword": "stone algebra"}, {"keyword": "stone relation algebras"}, {"keyword": "stone-kleene relation algebras"}, {"keyword": "store buffer"}, {"keyword": "store buffer forwarding"}, {"keyword": "store buffering"}, {"keyword": "stores key information"}, {"keyword": "stothers theorem"}, {"keyword": "straightforward analytic proof"}, {"keyword": "stream fusion"}, {"keyword": "stream fusion library"}, {"keyword": "stream fusion transformation"}, {"keyword": "stream processing components"}, {"keyword": "stream processing functions"}, {"keyword": "stream types"}, {"keyword": "stream versions"}, {"keyword": "streaming algorithm presented"}, {"keyword": "streamlining formal definitions"}, {"keyword": "strengthen mertens"}, {"keyword": "strict omega -categories"}, {"keyword": "strict omega -category"}, {"keyword": "strict partial orders"}, {"keyword": "strict preferences"}, {"keyword": "strict standard compliance formalization"}, {"keyword": "strict version"}, {"keyword": "stricter bound"}, {"keyword": "stricter safety guarantess"}, {"keyword": "strictly dominated"}, {"keyword": "strictly increasing"}, {"keyword": "strictly larger"}, {"keyword": "strictness theorem"}, {"keyword": "strips fragment"}, {"keyword": "strips soundness meta-theory"}, {"keyword": "strong duality theorem"}, {"keyword": "strong eventual consistency"}, {"keyword": "strong eventual consistency guarantees"}, {"keyword": "strong law"}, {"keyword": "strong local confluence"}, {"keyword": "strong normalization"}, {"keyword": "strong nullstellensatz"}, {"keyword": "strong properties"}, {"keyword": "strong security"}, {"keyword": "strong soundness"}, {"keyword": "strong ties"}, {"keyword": "strong versions"}, {"keyword": "stronger notion"}, {"keyword": "stronger safety guarantees"}, {"keyword": "stronger version"}, {"keyword": "strongest postconditions based"}, {"keyword": "strongly connected components"}, {"keyword": "strongly explicit construction"}, {"keyword": "strongly normalizing"}, {"keyword": "structurally recursive approach"}, {"keyword": "structure abstractly"}, {"keyword": "structure proofs"}, {"keyword": "structured isar proofs"}, {"keyword": "structured proof techniques"}, {"keyword": "structures"}, {"keyword": "structures play"}, {"keyword": "stuart rankin"}, {"keyword": "study filters based"}, {"keyword": "study models"}, {"keyword": "study second-order formalisations"}, {"keyword": "studying system-level properties"}, {"keyword": "sturm proof method"}, {"keyword": "sturm-tarksi theorem forms"}, {"keyword": "stuttering"}, {"keyword": "stuttering equivalence"}, {"keyword": "stuttering equivalence afp-entry"}, {"keyword": "stuttering equivalent"}, {"keyword": "stuttering equivalent runs"}, {"keyword": "stuttering invariance central"}, {"keyword": "stuttering sampling functions"}, {"keyword": "style presented"}, {"keyword": "sub-probability mass functions"}, {"keyword": "subject reduction property"}, {"keyword": "sublists alternately extracted"}, {"keyword": "submission"}, {"keyword": "subresultant polynomial remainder sequence"}, {"keyword": "subsequent article smooth manifolds"}, {"keyword": "subsequent formalisation"}, {"keyword": "subset relation"}, {"keyword": "subset sum"}, {"keyword": "subseteq alpha"}, {"keyword": "subseteq alpha order-isomorphic"}, {"keyword": "substantial background"}, {"keyword": "substantial performance penalty"}, {"keyword": "substantial set"}, {"keyword": "substantially optimizing"}, {"keyword": "substitute hybrid games"}, {"keyword": "substructural logics"}, {"keyword": "subsumes lexicographic path orders"}, {"keyword": "subsumption order"}, {"keyword": "subsystems"}, {"keyword": "subsystems involves causality"}, {"keyword": "subterm coefficient functions"}, {"keyword": "subterm property"}, {"keyword": "subtle algorithmic mechanisms"}, {"keyword": "subtle behaviors"}, {"keyword": "subtypes inherit"}, {"keyword": "success probability"}, {"keyword": "success probability grows exponentially"}, {"keyword": "success sensitiveness"}, {"keyword": "successful model checkers"}, {"keyword": "successful termination"}, {"keyword": "successfully analyzed threads satisfies"}, {"keyword": "successfully formalising"}, {"keyword": "successively extending"}, {"keyword": "successor function"}, {"keyword": "successor search"}, {"keyword": "sufficient condition"}, {"keyword": "sufficient criterion"}, {"keyword": "sufficiently efficient"}, +{"keyword": "sufficiently good"}, {"keyword": "sufficiently large"}, {"keyword": "sufficiently large group"}, {"keyword": "sufficiently large inputs"}, {"keyword": "sufficiently nice sdss"}, {"keyword": "sufficiently rich"}, {"keyword": "suffix"}, {"keyword": "suffix comparability"}, {"keyword": "suitable choice"}, {"keyword": "suitable denotational model"}, {"keyword": "suitable distributed system model"}, {"keyword": "suitable inductive predicate"}, {"keyword": "suitable invariants"}, {"keyword": "suitable limits"}, {"keyword": "suitable locale definitions"}, {"keyword": "suitable representative"}, {"keyword": "suitable setup"}, {"keyword": "suitable shorthand notation"}, {"keyword": "suitably extending paulson"}, {"keyword": "sum"}, {"keyword": "sum composition"}, {"keyword": "sum phi leftarrow phi"}, {"keyword": "sum psi leftarrow psi"}, {"keyword": "sum type"}, {"keyword": "sumcheck instances based"}, {"keyword": "sumcheck protocol"}, {"keyword": "summary edges"}, {"keyword": "summation bounds grow"}, {"keyword": "sunflower lemma"}, {"keyword": "superposition calculus"}, {"keyword": "superposition rules"}, {"keyword": "support"}, {"keyword": "support arbitrary nesting"}, {"keyword": "support epsilon transitions"}, {"keyword": "support negative joins"}, {"keyword": "support tostring functions"}, {"keyword": "supported unicode characters"}, {"keyword": "supporting automatic refinement"}, {"keyword": "supports low-effort security proofs"}, {"keyword": "supports mutual recursion"}, {"keyword": "supports operation"}, {"keyword": "supports range queries"}, {"keyword": "surely produce"}, {"keyword": "surjective function"}, {"keyword": "surprise hanging"}, {"keyword": "surprisingly complex proof"}, {"keyword": "survey papers monographs"}, {"keyword": "survival model"}, {"keyword": "swierczkowski ndash"}, {"keyword": "switching conveniently"}, {"keyword": "sylow p-subgroups"}, {"keyword": "sylow theorem"}, {"keyword": "symbolic computations"}, {"keyword": "symbolic execution"}, {"keyword": "symbolic execution engines"}, {"keyword": "symbolic execution step"}, {"keyword": "symbolic states"}, {"keyword": "symbolic transitions systems"}, {"keyword": "symmetric cases"}, {"keyword": "symmetric directed graphs"}, {"keyword": "symmetric multivariate polynomials"}, {"keyword": "symmetric polynomial"}, {"keyword": "symmetric polynomial combination"}, {"keyword": "symmetric range"}, {"keyword": "symmetry arguments"}, {"keyword": "symmetry properties"}, {"keyword": "symmetry property"}, {"keyword": "synchronous step semantics"}, {"keyword": "syntactic approximations"}, {"keyword": "syntactic approximations imply"}, {"keyword": "syntactic bisimulation"}, {"keyword": "syntactic context"}, {"keyword": "syntactic formula"}, {"keyword": "syntactic multiplication"}, {"keyword": "syntactic rewrite rules"}, {"keyword": "syntax syntax"}, {"keyword": "syntax tree"}, {"keyword": "syntax-independent logic infrastructure"}, {"keyword": "synthesize imperative programs"}, {"keyword": "synthetic approach"}, {"keyword": "synthetic method"}, {"keyword": "system"}, {"keyword": "system describes"}, {"keyword": "system enters"}, {"keyword": "system implies"}, {"keyword": "system types"}, {"keyword": "system verification"}, {"keyword": "systematic development"}, {"keyword": "systems communication"}, {"keyword": "systems communication patterns"}, {"keyword": "systems communication plays"}, {"keyword": "szl kalm"}, {"keyword": "tableau blocks"}, {"keyword": "tableau systems"}, {"keyword": "tactic code"}, {"keyword": "tail bounds"}, {"keyword": "tail-recursive function"}, {"keyword": "tail-recursive function definitions"}, {"keyword": "tail-recursive generalization"}, {"keyword": "tail-recursive implementation"}, {"keyword": "taking advantage"}, {"keyword": "talking explicitly"}, {"keyword": "tame plane graphs"}, {"keyword": "target concurrent operating systems"}, {"keyword": "target imperative hol"}, {"keyword": "target language"}, {"keyword": "target language features"}, {"keyword": "target logic"}, {"keyword": "target terms"}, {"keyword": "target theory"}, {"keyword": "target-language expression"}, {"keyword": "targeted security property"}, {"keyword": "tarski-seidenberg theorem established"}, {"keyword": "tauberian theorem"}, {"keyword": "tautology elimination"}, {"keyword": "taylor expansions"}, {"keyword": "taylor models"}, {"keyword": "taylor series expansions"}, {"keyword": "teaching purposes"}, {"keyword": "technical challenge"}, {"keyword": "technical problems"}, {"keyword": "technical university"}, {"keyword": "technical university munich"}, {"keyword": "technique"}, {"keyword": "technique widely applicable"}, {"keyword": "technische universit"}, {"keyword": "tedious proofs"}, {"keyword": "temporal intervals"}, {"keyword": "temporal logic"}, {"keyword": "temporal logic operators"}, {"keyword": "temporal operators"}, {"keyword": "temporal order"}, {"keyword": "temporal specification technique"}, {"keyword": "ten lemmas"}, {"keyword": "tensor analysis"}, {"keyword": "tensor product"}, {"keyword": "term focus"}, {"keyword": "term occurring"}, {"keyword": "term rewrite systems"}, {"keyword": "term rewriting"}, {"keyword": "term shallow-style embedding"}, {"keyword": "terminated successfully"}, {"keyword": "termination techniques"}, {"keyword": "termination-sensitive information flow correctness"}, {"keyword": "termination-sensitive information flow security"}, {"keyword": "terms"}, {"keyword": "terms algebraically"}, {"keyword": "terms relevant"}, {"keyword": "ternary fractions"}, {"keyword": "ternary kripke frames"}, {"keyword": "ternary relation"}, {"keyword": "test check"}, {"keyword": "test decides primality"}, {"keyword": "test output formats"}, {"keyword": "test strategies"}, {"keyword": "test suite"}, {"keyword": "test vectors"}, {"keyword": "test-case generators"}, {"keyword": "test-generation techniques"}, {"keyword": "tetrahedral group"}, {"keyword": "text"}, {"keyword": "text book level"}, {"keyword": "text introduction"}, {"keyword": "text li _ s-1"}, {"keyword": "textbook computational complexity"}, {"keyword": "textbook first-order logic"}, {"keyword": "textbook modal logic"}, {"keyword": "textbook presentation"}, {"keyword": "textbook proof"}, {"keyword": "textbook ramsey theory"}, {"keyword": "textbook reasoning"}, {"keyword": "textbook types"}, {"keyword": "textual language"}, {"keyword": "tfrac 1 2 log"}, {"keyword": "thematic section"}, {"keyword": "theology"}, {"keyword": "theorem"}, {"keyword": "theorem 2"}, {"keyword": "theorem applying"}, {"keyword": "theorem due"}, {"keyword": "theorem implies combinatorial planarity"}, {"keyword": "theorem prover"}, {"keyword": "theorem prover based"}, {"keyword": "theorem prover ehdm"}, {"keyword": "theorem relates"}, {"keyword": "theorem statement"}, {"keyword": "theorem states"}, {"keyword": "theorems hold"}, {"keyword": "theorems related"}, {"keyword": "theorems state"}, {"keyword": "theorems state propositions"}, {"keyword": "theorems stated"}, {"keyword": "theoretical computer science"}, {"keyword": "theoretical evidence"}, {"keyword": "theoretical framework"}, {"keyword": "theoretical insights"}, {"keyword": "theoretically incomparable"}, {"keyword": "theories list"}, {"keyword": "theories listinf"}, {"keyword": "theories presented"}, {"keyword": "theories presents"}, {"keyword": "theories reasoning"}, {"keyword": "theory"}, {"keyword": "theory builds"}, {"keyword": "theory change"}, {"keyword": "theory dpt_sat_solver"}, {"keyword": "theory fair-stream"}, {"keyword": "theory file"}, {"keyword": "theory generates"}, {"keyword": "theory listinf list2"}, {"keyword": "therories describe hoare logics"}, {"keyword": "thesis linked"}, {"keyword": "thesis presents"}, {"keyword": "thick chamber complexes endowed"}, {"keyword": "thomas jech"}, {"keyword": "thread creation"}, {"keyword": "threat models"}, {"keyword": "three-party computation framework"}, {"keyword": "threshold probability"}, {"keyword": "thy -files"}, {"keyword": "thy files"}, {"keyword": "tight upper bound"}, {"keyword": "tim gowers"}, {"keyword": "time"}, {"keyword": "time bounds"}, {"keyword": "time complexity"}, {"keyword": "time complexity bound"}, {"keyword": "time domain"}, {"keyword": "time events"}, {"keyword": "time frames"}, {"keyword": "time monad"}, {"keyword": "time polynomial"}, {"keyword": "time real exponents"}, {"keyword": "time sufficient properties"}, {"keyword": "timed automata"}, {"keyword": "timed automata carries"}, {"keyword": "timed coordination"}, {"keyword": "timely dataflow"}, {"keyword": "timing functions"}, {"keyword": "timing information"}, {"keyword": "timothy gowers"}, {"keyword": "timothy gowers introduction"}, {"keyword": "title formal verification"}, {"keyword": "tla axioms"}, {"keyword": "tla specifications"}, {"keyword": "tlc model checker"}, {"keyword": "to-string functions"}, {"keyword": "tolerate faults"}, {"keyword": "tom ridge"}, {"keyword": "tool box allowing"}, {"keyword": "tool implementors"}, {"keyword": "top 100 mathematical theorems"}, {"keyword": "top 100 theorems list"}, {"keyword": "topological boolean algebras"}, {"keyword": "topological curiosity discovered"}, {"keyword": "topological nature"}, {"keyword": "topological proof"}, {"keyword": "topological space generated"}, {"keyword": "torino group"}, {"keyword": "total"}, {"keyword": "total correctness"}, {"keyword": "total correctness based"}, {"keyword": "total correctness proof"}, {"keyword": "total learning"}, {"keyword": "total order relation"}, {"keyword": "total recursive functions"}, {"keyword": "total store order"}, {"keyword": "total supremum function"}, {"keyword": "totally ordered hoop"}, {"keyword": "totient function phi"}, {"keyword": "tour revisited"}, {"keyword": "tphols 2008 paper"}, {"keyword": "trace based"}, {"keyword": "trace inclusion checking"}, {"keyword": "trace set"}, {"keyword": "trace set inclusion"}, {"keyword": "trace set process"}, {"keyword": "trace set processes"}, {"keyword": "traceback properties"}, {"keyword": "track counter-party obligations"}, {"keyword": "traditional approach"}, {"keyword": "traditional formalisations"}, {"keyword": "traditional hoare logics"}, {"keyword": "traditional pen-and-paper-based reasoning"}, {"keyword": "traditional proof outlines"}, {"keyword": "traditional query languages"}, {"keyword": "traditional query plan optimizations"}, {"keyword": "transactional memory"}, {"keyword": "transcendence"}, {"keyword": "transcendence criteria"}, {"keyword": "transcendental numbers"}, {"keyword": "transfer package"}, {"keyword": "transferring lifted properties back"}, {"keyword": "transfinite cardinalities"}, {"keyword": "transfinite induction"}, {"keyword": "transfinite recursion"}, {"keyword": "transfinite version"}, {"keyword": "transformations"}, {"keyword": "transforming xml trees"}, {"keyword": "transition execution function"}, {"keyword": "transition function relation"}, {"keyword": "transition paths"}, {"keyword": "transition system"}, {"keyword": "transitive class"}, {"keyword": "transitive closure"}, {"keyword": "transitive closure bypasses matrices"}, {"keyword": "transitive noninterference policies"}, {"keyword": "translate mathematical contest problems"}, {"keyword": "transparent exchange"}, {"keyword": "transport programs"}, {"keyword": "transport theorems"}, {"keyword": "transposition theorem"}, {"keyword": "travel faster"}, {"keyword": "traversing sets"}, {"keyword": "treat binding sequences"}, {"keyword": "treated abstractly"}, {"keyword": "treated implicitly"}, {"keyword": "tree automata"}, {"keyword": "tree automata apf-entry"}, {"keyword": "tree automata technique"}, {"keyword": "tree boundaries set"}, {"keyword": "tree decomposition"}, {"keyword": "tree theorem"}, {"keyword": "tree width"}, {"keyword": "tree-regular constraints"}, {"keyword": "tree-regular languages"}, {"keyword": "triangle"}, {"keyword": "triangle constructed"}, {"keyword": "triangle counting lemma"}, {"keyword": "triangle removal lemma"}, {"keyword": "triangular numbers"}, {"keyword": "trick"}, {"keyword": "trie data structure invented"}, {"keyword": "trigger events"}, {"keyword": "trivially unsatisfiable inequality"}, {"keyword": "true preferences"}, {"keyword": "trusted base"}, {"keyword": "trusted external trusted components"}, +{"keyword": "trusted randomness"}, {"keyword": "trusted reference implementation"}, {"keyword": "trustworthy procedure"}, {"keyword": "truth lemma"}, {"keyword": "tsinakis conditions"}, {"keyword": "tuples satisfying"}, {"keyword": "turing computability"}, {"keyword": "turing decidability"}, {"keyword": "turing machines"}, {"keyword": "turing machines arose"}, {"keyword": "turing reducibility"}, {"keyword": "turn outputs descriptions"}, {"keyword": "turn required"}, {"keyword": "twelve bijections"}, {"keyword": "two-argument partition function"}, {"keyword": "two-element security lattice"}, {"keyword": "two-tape oblivious turing machine"}, {"keyword": "type"}, {"keyword": "type checker"}, {"keyword": "type checking phase"}, {"keyword": "type class"}, {"keyword": "type class functions"}, {"keyword": "type class hierarchy"}, {"keyword": "type class laws"}, {"keyword": "type class real_algebra_1"}, {"keyword": "type class system"}, {"keyword": "type classes"}, {"keyword": "type classes connected"}, {"keyword": "type constructor"}, {"keyword": "type constructor representing"}, {"keyword": "type definitions"}, {"keyword": "type inference algorithm"}, {"keyword": "type inference rules"}, {"keyword": "type information"}, {"keyword": "type preservation"}, {"keyword": "type safety"}, {"keyword": "type safety proof"}, {"keyword": "type synonym"}, {"keyword": "type system"}, {"keyword": "type system restrictions"}, {"keyword": "type theory"}, {"keyword": "type theory presented"}, {"keyword": "type-class based structures"}, {"keyword": "type-safe conversions"}, {"keyword": "typed model"}, {"keyword": "types int"}, {"keyword": "types-to-sets mechanism"}, +{"keyword": "typical computer"}, {"keyword": "typing rules"}, {"keyword": "uiuc"}, {"keyword": "ultimately culminating"}, {"keyword": "ultimately refutational completeness"}, {"keyword": "uml class diagrams"}, {"keyword": "unbounded nondeterminism"}, {"keyword": "unbounded sequences"}, {"keyword": "unbounded version"}, {"keyword": "unboundedly long path"}, {"keyword": "unboxing optimization"}, {"keyword": "unchanged results"}, {"keyword": "uncountable transfinite sequences"}, {"keyword": "under-approximate hoare logic"}, {"keyword": "under-approximate relational logic"}, {"keyword": "undergraduate dissertation"}, {"keyword": "underlying algebra"}, {"keyword": "underlying algorithmic mechanisms"}, {"keyword": "underlying boolean algebra structure"}, {"keyword": "underlying calculus"}, {"keyword": "underlying category"}, {"keyword": "underlying commented theories"}, {"keyword": "underlying concepts"}, {"keyword": "underlying decision procedure"}, {"keyword": "underlying disambiguation strategy"}, {"keyword": "underlying graph"}, {"keyword": "underlying ideas"}, {"keyword": "underlying libraries"}, {"keyword": "underlying local hidden-variable theory"}, {"keyword": "underlying mathematical structure"}, {"keyword": "underlying routing protocol"}, {"keyword": "underlying theorem"}, {"keyword": "underlying theory"}, {"keyword": "underlying transition system"}, {"keyword": "understood problem"}, {"keyword": "undesirable side-effect"}, {"keyword": "undesired information leak"}, {"keyword": "undirected graph theory"}, {"keyword": "undirected graphs"}, {"keyword": "unexecutable specification"}, {"keyword": "ungeneralised counterparts"}, {"keyword": "unification algorithm"}, {"keyword": "unification problem"}, {"keyword": "unified approximation order"}, {"keyword": "unified manner"}, {"keyword": "unified modeling language"}, {"keyword": "unified policy framework"}, {"keyword": "unified translation"}, {"keyword": "unified translation approach"}, {"keyword": "unified view"}, {"keyword": "unifies previous formalisations"}, {"keyword": "uniform boundedness principle"}, {"keyword": "uniform framework"}, {"keyword": "uniform global clock"}, {"keyword": "uniform proof"}, {"keyword": "uniform semantic substrate"}, {"keyword": "uniform substitution calculus"}, {"keyword": "uniform substitution principle"}, {"keyword": "uniform substitutions"}, {"keyword": "uniform substitutions substitute"}, {"keyword": "uniformly bounded"}, {"keyword": "uniformly coxeter"}, {"keyword": "unify computation models"}, {"keyword": "unify correctness statements"}, {"keyword": "unifying theories"}, {"keyword": "uninterpreted functions"}, {"keyword": "union concatenation"}, {"keyword": "unique decomposition"}, {"keyword": "unique factorization domain"}, {"keyword": "unique factorization domain form"}, {"keyword": "unique irreducible factors"}, {"keyword": "unique normal forms"}, {"keyword": "unique nu_x -"}, {"keyword": "unique program"}, {"keyword": "unique solutions"}, {"keyword": "unique squarefree decomposition"}, {"keyword": "uniquely determined polynomial combination"}, {"keyword": "uniquely determined product"}, {"keyword": "uniquely distinguish quantum states"}, {"keyword": "uniquely represented"}, {"keyword": "unit propagation"}, {"keyword": "unit resolution"}, {"keyword": "unit vector"}, {"keyword": "univariate monic polynomial"}, {"keyword": "univariate polynomial"}, {"keyword": "universal composability framework"}, {"keyword": "universal logical reasoning"}, {"keyword": "universal partial recursive function"}, {"keyword": "universal properties"}, {"keyword": "universal property"}, {"keyword": "universal tool"}, {"keyword": "universal turing machine"}, {"keyword": "universal turing machine entry"}, {"keyword": "universally quantified uninterpreted terms"}, {"keyword": "universit paris vii"}, {"keyword": "university-level computer science curriculum"}, {"keyword": "unlabeled trees"}, {"keyword": "unlike dedekind cuts"}, {"keyword": "unlike traditional decision procedures"}, {"keyword": "unlike treaps"}, {"keyword": "unnamed initial segment"}, {"keyword": "unordered pairs"}, {"keyword": "unprecedented time"}, {"keyword": "unpublished specialized algorithms"}, {"keyword": "unrelated times"}, {"keyword": "unrestricted resolution rule"}, {"keyword": "unrestricted rules"}, {"keyword": "unsolvable system"}, {"keyword": "unsorted first-order logic"}, {"keyword": "unsorted list deterministically"}, +{"keyword": "untrusted mathsf approxmc implementations"}, {"keyword": "unverified checkers"}, {"keyword": "unverified reference implementation"}, {"keyword": "unverified ssa construction algorithm"}, {"keyword": "unverified tools"}, {"keyword": "unverified translation"}, {"keyword": "unwanted subtleties"}, {"keyword": "unwinding results"}, {"keyword": "unwinding theorem"}, {"keyword": "up-closed sets"}, {"keyword": "upcoming entry iptables semantics"}, {"keyword": "upcoming work principia logico-metaphysica"}, {"keyword": "update constant pattern"}, {"keyword": "update functions"}, {"keyword": "updated july 8th"}, {"keyword": "updated version"}, {"keyword": "updown scheme"}, {"keyword": "upf emphasizes"}, {"keyword": "upper bound"}, {"keyword": "upper semicontinuous"}, {"keyword": "upper triangular"}, {"keyword": "upper-bound remains valid"}, {"keyword": "usable framework"}, {"keyword": "useless zero-reductions"}, {"keyword": "user command"}, {"keyword": "usual definitions"}, {"keyword": "usual monad laws"}, {"keyword": "usual redundancy criteria based"}, {"keyword": "usual redundancy elimination rules"}, {"keyword": "usual semantics"}, {"keyword": "usual set operations union"}, {"keyword": "utility functions"}, {"keyword": "utility functions form"}, {"keyword": "utilizing modern proof assistants"}, {"keyword": "uwe waldmann"}, {"keyword": "valid completeness threshold"}, {"keyword": "valid formula"}, {"keyword": "valid octet quot"}, {"keyword": "valid parameters"}, {"keyword": "validate termination"}, {"keyword": "value-dependent noninterference property"}, {"keyword": "van der waerden"}, {"keyword": "van der waerden number"}, {"keyword": "van emde boas tree"}, {"keyword": "van oostrom"}, {"keyword": "vandermonde identity"}, {"keyword": "vandermonde matrices"}, {"keyword": "varepsilon 0"}, {"keyword": "variable assignment"}, {"keyword": "variable convention"}, {"keyword": "variable-for-variable substitution"}, {"keyword": "variants"}, {"keyword": "varphi_i vee mathbf"}, {"keyword": "varying numbers"}, {"keyword": "vcg auction"}, {"keyword": "vdash psi"}, {"keyword": "vdash varphi longrightarrow"}, {"keyword": "vdm-reminiscent partial-correctness specifications"}, {"keyword": "veblen hierarchies"}, {"keyword": "vector cross product"}, {"keyword": "vector fields"}, {"keyword": "vector space"}, {"keyword": "verification back-ends"}, {"keyword": "verification components"}, {"keyword": "verification condition generation"}, {"keyword": "verification condition generator"}, {"keyword": "verification condition generators producing"}, {"keyword": "verification conditions"}, {"keyword": "verification conditions generated"}, {"keyword": "verification operation"}, {"keyword": "verification techniques"}, {"keyword": "verification tools"}, {"keyword": "verified"}, {"keyword": "verified algorithms"}, {"keyword": "verified approach"}, +{"keyword": "verified certificate checker"}, {"keyword": "verified checker past"}, {"keyword": "verified code"}, {"keyword": "verified compilation toolchain"}, {"keyword": "verified compiler"}, {"keyword": "verified construction"}, {"keyword": "verified decision procedures"}, {"keyword": "verified functional skew heaps"}, {"keyword": "verified functional splay trees"}, {"keyword": "verified heap functions"}, {"keyword": "verified implementation"}, {"keyword": "verified iptables firewall analysis"}, {"keyword": "verified monitor"}, {"keyword": "verified monitor implements"}, {"keyword": "verified programs"}, {"keyword": "verified refinement step"}, {"keyword": "verified runtime bounds"}, {"keyword": "verified ssa construction"}, {"keyword": "verified tool"}, {"keyword": "verified translation"}, {"keyword": "verified type checker"}, {"keyword": "verified virtual machines"}, {"keyword": "verifies infinite families"}, {"keyword": "verify algorithms"}, {"keyword": "verify axioms"}, {"keyword": "verify basic algorithms"}, {"keyword": "verify first-order relativity theory"}, {"keyword": "verify properties"}, {"keyword": "verify purely functional"}, {"keyword": "verify spoofing protection"}, {"keyword": "verify theorems"}, {"keyword": "verify truth tables"}, {"keyword": "verify-- philosophical arguments"}, {"keyword": "verifying depth-"}, {"keyword": "verifying dynamic"}, {"keyword": "verifying functional"}, {"keyword": "verifying functional programs"}, {"keyword": "verifying network security policies"}, {"keyword": "verifying practical algorithms"}, {"keyword": "verifying program correctness"}, {"keyword": "verifying safety properties"}, {"keyword": "verifying security policies"}, {"keyword": "verifying stateful security protocols"}, {"keyword": "verifying techniques"}, {"keyword": "verifying uri nodelman"}, {"keyword": "verifythis competition series"}, {"keyword": "version due"}, {"keyword": "version states"}, {"keyword": "vertex set"}, {"keyword": "vertical composite"}, {"keyword": "vincent bloemen"}, {"keyword": "vincent rahli"}, {"keyword": "violate sortedness"}, {"keyword": "virtual methods"}, {"keyword": "visualizing class models"}, {"keyword": "vital part"}, {"keyword": "viterbi algorithm"}, {"keyword": "volpano smith system"}, {"keyword": "volpano smith-style noninterference notions"}, {"keyword": "volume greater"}, {"keyword": "volume proofs"}, {"keyword": "von lindemann"}, {"keyword": "von neumann hierarchy"}, {"keyword": "von neumann measurements"}, {"keyword": "von wright"}, {"keyword": "von zur gathen"}, {"keyword": "von-neumann-morgenstern utility theorem"}, {"keyword": "vstte paper"}, {"keyword": "w_1 ldots w_n 1"}, {"keyword": "w_i a_i"}, {"keyword": "weak bi-quantales"}, {"keyword": "weak bisimilarity"}, {"keyword": "weak conjunction"}, {"keyword": "weak conjunction operator"}, {"keyword": "weak conjunction operator coincides"}, {"keyword": "weak duality theorem"}, {"keyword": "weak form"}, {"keyword": "weak law"}, {"keyword": "weak nullstellensatz"}, {"keyword": "weak preferences"}, {"keyword": "weak simulation"}, {"keyword": "weaker statement contained"}, {"keyword": "weaker variants"}, {"keyword": "weakest precondition component"}, {"keyword": "weakest-precondition entailment"}, {"keyword": "web community"}, {"keyword": "web components"}, {"keyword": "web standards"}, {"keyword": "webassembly language"}, {"keyword": "weight-balanced trees"}, {"keyword": "weighted arithmetic geometric"}, {"keyword": "weighted graphs"}, {"keyword": "weighted path order"}, {"keyword": "welfare economics holds"}, {"keyword": "well-formedness properties"}, {"keyword": "well-order relation"}, {"keyword": "well-ordered type"}, {"keyword": "well-typed attacks"}, {"keyword": "well-typed programs"}, {"keyword": "well-understood low-level behavior"}, {"keyword": "wide design space"}, {"keyword": "wide range"}, {"keyword": "wide variety"}, {"keyword": "widely applicable"}, {"keyword": "widely studied topic"}, {"keyword": "widening operation"}, {"keyword": "wider scope"}, {"keyword": "wieferich kempner theorem"}, {"keyword": "wikipedia articles"}, {"keyword": "wilf theorem"}, {"keyword": "wim20 simon wimmer"}, {"keyword": "wimmer wim20"}, {"keyword": "wimmers archive-of-graph-formalizations"}, {"keyword": "winding number"}, {"keyword": "winding number measures"}, {"keyword": "wireless mesh network"}, {"keyword": "wireless networks"}, {"keyword": "witnessing diamonds"}, {"keyword": "wolfram engine"}, {"keyword": "woots strong eventual consistency"}, {"keyword": "word count program"}, {"keyword": "word equations"}, {"keyword": "word iff"}, {"keyword": "word inside"}, {"keyword": "word numerals"}, {"keyword": "word power"}, {"keyword": "word problem"}, {"keyword": "words lexicographically minimal"}, {"keyword": "work comprises proofs"}, {"keyword": "work focuses"}, {"keyword": "work implements"}, {"keyword": "work presents"}, {"keyword": "work revealed minor"}, {"keyword": "worker wrapper transformation"}, {"keyword": "working backwards"}, {"keyword": "working mathematician"}, {"keyword": "works based"}, {"keyword": "world code"}, {"keyword": "worst case"}, {"keyword": "worst-case optimal multiway-join algorithms"}, {"keyword": "worst-case time"}, {"keyword": "worst-time complexity"}, {"keyword": "wpo subsumes kbo"}, {"keyword": "write access"}, {"keyword": "write alpha"}, {"keyword": "write operations"}, {"keyword": "write poof strategies"}, {"keyword": "write specifications"}, {"keyword": "written standard"}, {"keyword": "x1j hellip"}, {"keyword": "x1n hellip"}, {"keyword": "x86-64 assembly instructions"}, {"keyword": "x_1"}, {"keyword": "x_1 exists"}, {"keyword": "x_1 varepsilon"}, {"keyword": "xml trees"}, {"keyword": "yacc style grammars"}, {"keyword": "yamada 2"}, {"keyword": "years formal verification"}, {"keyword": "yielding dynamic programming algorithms"}, {"keyword": "yielding significant state-space reduction"}, {"keyword": "yoneda embedding preserves limits"}, {"keyword": "yoneda functor"}, {"keyword": "yoneda lemma"}, {"keyword": "yosuke-ito-345 actuary"}, {"keyword": "yufei zhao"}, {"keyword": "zermelo-fraenkel set theory"}, {"keyword": "zeroth frequency moment"}, {"keyword": "zf set theory"}, {"keyword": "zfc set theory"}, {"keyword": "zout domains"}] \ No newline at end of file diff --git a/web/dependencies/coinductive/index.html b/web/dependencies/coinductive/index.html --- a/web/dependencies/coinductive/index.html +++ b/web/dependencies/coinductive/index.html @@ -1,248 +1,258 @@ Coinductive - Archive of Formal Proofs \ No newline at end of file diff --git a/web/dependencies/coinductive/index.xml b/web/dependencies/coinductive/index.xml --- a/web/dependencies/coinductive/index.xml +++ b/web/dependencies/coinductive/index.xml @@ -1,108 +1,115 @@ Coinductive on Archive of Formal Proofs /dependencies/coinductive/ Recent content in Coinductive on Archive of Formal Proofs Hugo -- gohugo.io en-gb - Fri, 20 Jan 2023 00:00:00 +0000 + Wed, 20 Mar 2024 00:00:00 +0000 + Continued Fractions + /entries/Continued_Fractions.html + Wed, 20 Mar 2024 00:00:00 +0000 + /entries/Continued_Fractions.html + + + A Hoare Logic for Diverging Programs /entries/HoareForDivergence.html Fri, 20 Jan 2023 00:00:00 +0000 /entries/HoareForDivergence.html Partial Order Reduction /entries/Partial_Order_Reduction.html Tue, 05 Jun 2018 00:00:00 +0000 /entries/Partial_Order_Reduction.html CakeML /entries/CakeML.html Mon, 12 Mar 2018 00:00:00 +0000 /entries/CakeML.html Formalization of Bachmair and Ganzinger's Ordered Resolution Prover /entries/Ordered_Resolution_Prover.html Thu, 18 Jan 2018 00:00:00 +0000 /entries/Ordered_Resolution_Prover.html Dynamic Architectures /entries/DynamicArchitectures.html Fri, 28 Jul 2017 00:00:00 +0000 /entries/DynamicArchitectures.html CryptHOL /entries/CryptHOL.html Fri, 05 May 2017 00:00:00 +0000 /entries/CryptHOL.html Positional Determinacy of Parity Games /entries/Parity_Game.html Mon, 02 Nov 2015 00:00:00 +0000 /entries/Parity_Game.html Stream Fusion in HOL with Code Generation /entries/Stream_Fusion_Code.html Fri, 10 Oct 2014 00:00:00 +0000 /entries/Stream_Fusion_Code.html Probabilistic Noninterference /entries/Probabilistic_Noninterference.html Tue, 11 Mar 2014 00:00:00 +0000 /entries/Probabilistic_Noninterference.html Markov Models /entries/Markov_Models.html Tue, 03 Jan 2012 00:00:00 +0000 /entries/Markov_Models.html Jinja with Threads /entries/JinjaThreads.html Mon, 03 Dec 2007 00:00:00 +0000 /entries/JinjaThreads.html Lazy Lists II /entries/Lazy-Lists-II.html Mon, 26 Apr 2004 00:00:00 +0000 /entries/Lazy-Lists-II.html Topology /entries/Topology.html Mon, 26 Apr 2004 00:00:00 +0000 /entries/Topology.html diff --git a/web/dependencies/frequency_moments/index.html b/web/dependencies/frequency_moments/index.html --- a/web/dependencies/frequency_moments/index.html +++ b/web/dependencies/frequency_moments/index.html @@ -1,133 +1,143 @@ Frequency_Moments - Archive of Formal Proofs

Frequency_Moments Dependents

+

2024

+

2023

\ No newline at end of file diff --git a/web/dependencies/monad_normalisation/index.html b/web/dependencies/monad_normalisation/index.html --- a/web/dependencies/monad_normalisation/index.html +++ b/web/dependencies/monad_normalisation/index.html @@ -1,153 +1,163 @@ Monad_Normalisation - Archive of Formal Proofs

Monad_Normalisation Dependents

\ No newline at end of file diff --git a/web/dependencies/monad_normalisation/index.xml b/web/dependencies/monad_normalisation/index.xml --- a/web/dependencies/monad_normalisation/index.xml +++ b/web/dependencies/monad_normalisation/index.xml @@ -1,38 +1,45 @@ Monad_Normalisation on Archive of Formal Proofs /dependencies/monad_normalisation/ Recent content in Monad_Normalisation on Archive of Formal Proofs Hugo -- gohugo.io en-gb - Thu, 09 Jan 2020 00:00:00 +0000 + Fri, 15 Mar 2024 00:00:00 +0000 + Approximate Model Counting + /entries/Approximate_Model_Counting.html + Fri, 15 Mar 2024 00:00:00 +0000 + /entries/Approximate_Model_Counting.html + + + Skip Lists /entries/Skip_Lists.html Thu, 09 Jan 2020 00:00:00 +0000 /entries/Skip_Lists.html Randomised Binary Search Trees /entries/Randomised_BSTs.html Fri, 19 Oct 2018 00:00:00 +0000 /entries/Randomised_BSTs.html CryptHOL /entries/CryptHOL.html Fri, 05 May 2017 00:00:00 +0000 /entries/CryptHOL.html diff --git a/web/dependencies/pell/index.html b/web/dependencies/pell/index.html --- a/web/dependencies/pell/index.html +++ b/web/dependencies/pell/index.html @@ -1,133 +1,143 @@ Pell - Archive of Formal Proofs

Pell Dependents

\ No newline at end of file diff --git a/web/dependencies/pell/index.xml b/web/dependencies/pell/index.xml --- a/web/dependencies/pell/index.xml +++ b/web/dependencies/pell/index.xml @@ -1,24 +1,31 @@ Pell on Archive of Formal Proofs /dependencies/pell/ Recent content in Pell on Archive of Formal Proofs Hugo -- gohugo.io en-gb - Fri, 17 Jan 2020 00:00:00 +0000 + Wed, 20 Mar 2024 00:00:00 +0000 + Continued Fractions + /entries/Continued_Fractions.html + Wed, 20 Mar 2024 00:00:00 +0000 + /entries/Continued_Fractions.html + + + Mersenne primes and the Lucas–Lehmer test /entries/Mersenne_Primes.html Fri, 17 Jan 2020 00:00:00 +0000 /entries/Mersenne_Primes.html diff --git a/web/dependencies/polynomial_factorization/index.html b/web/dependencies/polynomial_factorization/index.html --- a/web/dependencies/polynomial_factorization/index.html +++ b/web/dependencies/polynomial_factorization/index.html @@ -1,237 +1,247 @@ Polynomial_Factorization - Archive of Formal Proofs \ No newline at end of file diff --git a/web/dependencies/polynomial_factorization/index.xml b/web/dependencies/polynomial_factorization/index.xml --- a/web/dependencies/polynomial_factorization/index.xml +++ b/web/dependencies/polynomial_factorization/index.xml @@ -1,101 +1,108 @@ Polynomial_Factorization on Archive of Formal Proofs /dependencies/polynomial_factorization/ Recent content in Polynomial_Factorization on Archive of Formal Proofs Hugo -- gohugo.io en-gb - Thu, 21 Apr 2022 00:00:00 +0000 + Wed, 20 Mar 2024 00:00:00 +0000 + Continued Fractions + /entries/Continued_Fractions.html + Wed, 20 Mar 2024 00:00:00 +0000 + /entries/Continued_Fractions.html + + + Fisher's Inequality: Linear Algebraic Proof Techniques for Combinatorics /entries/Fishers_Inequality.html Thu, 21 Apr 2022 00:00:00 +0000 /entries/Fishers_Inequality.html Amicable Numbers /entries/Amicable_Numbers.html Tue, 04 Aug 2020 00:00:00 +0000 /entries/Amicable_Numbers.html A Formalization of Knuth–Bendix Orders /entries/Knuth_Bendix_Order.html Wed, 13 May 2020 00:00:00 +0000 /entries/Knuth_Bendix_Order.html Gaussian Integers /entries/Gaussian_Integers.html Fri, 24 Apr 2020 00:00:00 +0000 /entries/Gaussian_Integers.html Power Sum Polynomials /entries/Power_Sum_Polynomials.html Fri, 24 Apr 2020 00:00:00 +0000 /entries/Power_Sum_Polynomials.html A Verified Functional Implementation of Bachmair and Ganzinger's Ordered Resolution Prover /entries/Functional_Ordered_Resolution_Prover.html Fri, 23 Nov 2018 00:00:00 +0000 /entries/Functional_Ordered_Resolution_Prover.html Dirichlet Series /entries/Dirichlet_Series.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Dirichlet_Series.html Linear Recurrences /entries/Linear_Recurrences.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Linear_Recurrences.html Subresultants /entries/Subresultants.html Thu, 06 Apr 2017 00:00:00 +0000 /entries/Subresultants.html The Factorization Algorithm of Berlekamp and Zassenhaus /entries/Berlekamp_Zassenhaus.html Fri, 14 Oct 2016 00:00:00 +0000 /entries/Berlekamp_Zassenhaus.html Perron-Frobenius Theorem for Spectral Radius Analysis /entries/Perron_Frobenius.html Fri, 20 May 2016 00:00:00 +0000 /entries/Perron_Frobenius.html Matrices, Jordan Normal Forms, and Spectral Radius Theory /entries/Jordan_Normal_Form.html Fri, 21 Aug 2015 00:00:00 +0000 /entries/Jordan_Normal_Form.html diff --git a/web/entries/Approximate_Model_Counting.html b/web/entries/Approximate_Model_Counting.html new file mode 100644 --- /dev/null +++ b/web/entries/Approximate_Model_Counting.html @@ -0,0 +1,231 @@ + + + + + + + Approximate Model Counting - Archive of Formal Proofs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+

+ Approximate Model Counting + +

+
+

+ Yong Kiam Tan 📧 and Jiong Yang 📧 + +

+

March 15, 2024

+
+
+
+ +
+

Abstract

+ +
Approximate model counting is the task of approximating the number of solutions +to an input formula. This entry formalizes $\mathsf{ApproxMC}$, an algorithm +due to Chakraborty et al. with a +probably approximately correct (PAC) guarantee, i.e., $\mathsf{ApproxMC}$ +returns a multiplicative $(1+\varepsilon)$-factor approximation of the model +count with probability at least $1 - \delta$, where $\varepsilon > 0$ and $0 < +\delta \leq 1$. The algorithmic specification is further refined to a verified +certificate checker that can be used to validate the results of untrusted +$\mathsf{ApproxMC}$ implementations (assuming access to trusted randomness).
+ +

License

+ +

Topics

+ +

Session Approximate_Model_Counting

+ + + + +
+ + + +
+ + +
+ +
+ + +
+ +
+
+ + \ No newline at end of file diff --git a/web/entries/Catoids.html b/web/entries/Catoids.html --- a/web/entries/Catoids.html +++ b/web/entries/Catoids.html @@ -1,276 +1,276 @@ Catoids, Categories, Groupoids - Archive of Formal Proofs

Catoids, Categories, Groupoids

Georg Struth 📧

August 14, 2023

Abstract

This AFP entry formalises catoids, which are generalisations of single-set categories, and groupoids. More specifically, in catoids, the partial composition of arrows in a category is generalised to a multioperation, which sends pairs of elements to sets of elements, and the definedness condition of arrow composition -- two arrows can be composed if and only the target of the first matches the source of the second -- is relaxed. Beyond a library of basic laws for catoids, single-set categories and groupoids, I formalise the facts that every catoid can be lifted to a modal powerset quantale, that every groupoid can be lifted to a Dedekind quantale and to power set relation algebras, a special case of a famous result of Jónsson and Tarski. Finally, I show that single-set categories are equivalent to a standard axiomatisation of categories based on a set of objects and a set of arrows, and compare catoids with related structures such as multimonoid and relational monoids (monoids in the monoidal category Rel).

License

Topics

Related publications

  • Cranch, J., Doherty, S., & Struth, G. (2020). Convolution and Concurrency (Version 1). arXiv. https://doi.org/10.48550/ARXIV.2002.02321
  • Calk, C., Fahrenberg, U., Johansen, C., Struth, G., & Ziemiański, K. (2021). $$\ell r$$-Multisemigroups, Modal Quantales and the Origin of Locality. Lecture Notes in Computer Science, 90–107. https://doi.org/10.1007/978-3-030-88701-8_6
  • Fahrenberg, U., Johansen, C., Struth, G., & Ziemiański, K. (2023). Catoids and modal convolution algebras. Algebra Universalis, 84(2). https://doi.org/10.1007/s00012-023-00805-9
  • -
  • Calk, C., Malbos, P., Pous, D., & Struth, G. (2023). Higher Catoids, Higher Quantales and their Correspondences (Version 2). arXiv. https://doi.org/10.48550/ARXIV.2307.09253 +
  • Calk, C., Malbos, P., Pous, D., & Struth, G. (2023). Higher Catoids, Higher Quantales and their Correspondences (Version 1). arXiv. https://doi.org/10.48550/ARXIV.2307.09253

Session Catoids

\ No newline at end of file diff --git a/web/entries/Coinductive.html b/web/entries/Coinductive.html --- a/web/entries/Coinductive.html +++ b/web/entries/Coinductive.html @@ -1,452 +1,455 @@ Coinductive - Archive of Formal Proofs

Coinductive

Andreas Lochbihler 🌐 with contributions from Johannes Hölzl 📧

February 12, 2010

Abstract

This article collects formalisations of general-purpose coinductive data types and sets. Currently, it contains coinductive natural numbers, coinductive lists, i.e. lazy lists or streams, infinite streams, coinductive terminated lists, coinductive resumptions, a library of operations on coinductive lists, and a version of König's lemma as an application for coinductive lists.
The initial theory was contributed by Paulson and Wenzel. Extensions and other coinductive formalisations of general interest are welcome.

License

History

April 3, 2014
ccpo structure on codatatypes used to define ldrop, ldropWhile, lfilter, lconcat as least fixpoint; ccpo topology on coinductive lists contributed by Johannes Hölzl; added examples (revision 23cd8156bd42)
September 20, 2013
stream theory uses type and operations from HOL/BNF/Examples/Stream (revision 692809b2b262)
March 13, 2013
construct codatatypes with the BNF package and adjust the definitions and proofs, setup for lifting and transfer packages (revision f593eda5b2c0)
June 27, 2012
new codatatype stream with operations (with contributions by Peter Gammie) (revision dd789a56473c)
July 20, 2011
new codatatype resumption (revision 811364c776c7)
February 1, 2011
lazy implementation of coinductive (terminated) lists for the code generator (revision 6034973dce83)
August 17, 2010
Koenig's lemma as an example application for coinductive lists (revision f81ce373fa96)
August 4, 2010
terminated lazy lists: setup for quotient package; more lemmas (revision 6ead626f1d01)
June 28, 2010
new codatatype terminated lazy lists (revision e12de475c558)
June 10, 2010
coinductive lists: setup for quotient package (revision 015574f3bf3c)

Topics

Session Coinductive

\ No newline at end of file diff --git a/web/entries/Combinatorics_Words.html b/web/entries/Combinatorics_Words.html --- a/web/entries/Combinatorics_Words.html +++ b/web/entries/Combinatorics_Words.html @@ -1,288 +1,288 @@ Combinatorics on Words Basics - Archive of Formal Proofs

Combinatorics on Words Basics

Abstract

We formalize basics of Combinatorics on Words. This is an extension of existing theories on lists. We provide additional properties related to prefix, suffix, factor, length and rotation. The topics include prefix and suffix comparability, mismatch, word power, total and reversed morphisms, border, periods, primitivity and roots. We also formalize basic, mostly folklore results related to word equations: equidivisibility, commutation and conjugation. Slightly advanced properties include the Periodicity lemma (often cited as the Fine and Wilf theorem) and the variant of the Lyndon-Schützenberger theorem for words, including its full parametric solution. We support the algebraic point of view which sees words as generators of submonoids of a free monoid. This leads to the concepts of the (free) hull, the (free) basis (or code). We also provide relevant proof methods and a tool to generate reverse-symmetric claims.

License

History

August 17, 2023
Updated to version v1.10.1.
August 24, 2022
Many updates and additions. New theories: Border_Array, Morphisms, Equations_Basic, and Binary_Code_Morphisms.

Topics

Related publications

Session Combinatorics_Words

\ No newline at end of file diff --git a/web/entries/Continued_Fractions.html b/web/entries/Continued_Fractions.html new file mode 100644 --- /dev/null +++ b/web/entries/Continued_Fractions.html @@ -0,0 +1,243 @@ + + + + + + + Continued Fractions - Archive of Formal Proofs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+

+ Continued Fractions + +

+
+

+ Manuel Eberl 📧 + +

+

March 20, 2024

+
+
+
+ +
+

Abstract

+ +

This article provides a formalisation of continued fractions of real numbers and their basic properties. +It also contains a proof of the classic result that the irrational numbers with periodic continued + fraction expansions are precisely the quadratic irrationals, i.e. real numbers that fulfil a non-trivial quadratic equation $a x^2 + b x + c = 0$ with integer coefficients.

+

+Particular attention is given to the continued fraction expansion of $\sqrt{D}$ for a non-square + natural number $D$. Basic results about the length and structure of its period are provided, + along with an executable algorithm to compute the period (and from it, the entire expansion).

+

+This is then also used to provide a fairly efficient, executable, and fully formalised algorithm to +compute solutions to Pell's equation $x^2 - D y^2 = 1$. The performance is sufficiently good to +find the solution to Archimedes's cattle problem in less than a second on a typical computer. +This involves the value $D = 410286423278424$, for which the solution has over 200000 decimals.

+

+Lastly, a derivation of the continued fraction expansions of Euler's number $e$ and an executable +function to compute continued fraction expansions using interval arithmetic is also provided.

+ +

License

+ +

Topics

+ +

Session Continued_Fractions

+ + + + +
+ + + +
+ + +
+ +
+ + +
+ +
+
+ + \ No newline at end of file diff --git a/web/entries/Efficient_Weighted_Path_Order.html b/web/entries/Efficient_Weighted_Path_Order.html --- a/web/entries/Efficient_Weighted_Path_Order.html +++ b/web/entries/Efficient_Weighted_Path_Order.html @@ -1,249 +1,249 @@ A Verified Efficient Implementation of the Weighted Path Order - Archive of Formal Proofs

A Verified Efficient Implementation of the Weighted Path Order

Abstract

The Weighted Path Order (WPO) of Yamada is a powerful technique for proving termination. In a previous AFP entry, the WPO was defined and properties of WPO have been formally verified. However, the implementation of WPO was naive, leading to an exponential runtime in the worst case.

Therefore, in this AFP entry we provide a poly-time implementation of WPO. The implementation is based on memoization. Since WPO generalizes the recursive path order (RPO), we also easily derive an efficient implementation of RPO.

License

Topics

Related publications

    -
  • Thiemann, R., Schöpf, J., Sternagel, C., & Yamada, A. (2020). Certifying the Weighted Path Order (Invited Talk). Schloss Dagstuhl – Leibniz-Zentrum für Informatik. https://doi.org/10.4230/LIPICS.FSCD.2020.4 +
  • Thiemann, R., Schöpf, J., Sternagel, C., & Yamada, A. (2020). Certifying the Weighted Path Order (Invited Talk). Schloss Dagstuhl - Leibniz-Zentrum Für Informatik. https://doi.org/10.4230/LIPICS.FSCD.2020.4
  • Yamada, A., Kusakari, K., & Sakabe, T. (2015). A unified ordering for termination proving. Science of Computer Programming, 111, 110–134. https://doi.org/10.1016/j.scico.2014.07.009

Session Efficient_Weighted_Path_Order

\ No newline at end of file diff --git a/web/entries/Go.html b/web/entries/Go.html new file mode 100644 --- /dev/null +++ b/web/entries/Go.html @@ -0,0 +1,227 @@ + + + + + + + Go Code Generation for Isabelle - Archive of Formal Proofs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+

+ Go Code Generation for Isabelle + +

+
+

+ Terru Stübinger 🌐 and Lars Hupel 🌐 + +

+

January 22, 2024

+
+
+
+ +
+

Abstract

+ +
This entry contains a standalone code generation target for the Go programming language. +Unlike the previous targets, Go is not a functional language and encourages code in an imperative style, thus many of the features of Isabelle's language (particularly data types, pattern matching, and type classes) have to be emulated using imperative language constructs in Go. +To generate Go code, users can simply import this entry, which makes the Go target available.
+ +

License

+ +

Topics

+ +

Related publications

+
    +
  • Stübinger, T., & Hupel, L. (2023). Extending Isabelle/HOL's Code Generator with support for the Go programming language (Version 1). arXiv. https://doi.org/10.48550/ARXIV.2310.02704 +
  • +
  • Lars Hupel, & terru. (2024). isabelle-prover/isabelle-go-codegen: v0.2.1 (Version v0.2.1) [Computer software]. Zenodo. https://doi.org/10.5281/ZENODO.8401392 +
  • +
+

Session Go

+ +

Session Go_Test_Quick

+ +

Session Go_Test_Slow

+ + +
+
+ +
+ + + +
+ + +
+ +
+ + +
+ +
+
+ + \ No newline at end of file diff --git a/web/entries/HoareForDivergence.html b/web/entries/HoareForDivergence.html --- a/web/entries/HoareForDivergence.html +++ b/web/entries/HoareForDivergence.html @@ -1,247 +1,247 @@ A Hoare Logic for Diverging Programs - Archive of Formal Proofs

A Hoare Logic for Diverging Programs

Abstract

This submission contains:
  1. a formalisation of a small While language with support for output;
  2. a standard total-correctness Hoare logic that has been proved sound and complete; and
  3. a new Hoare logic for proofs about programs that diverge: this new logic has also been proved sound and complete.

License

Topics

Related publications

    -
  • Åman Pohjola, J., Rostedt, H., & Myreen, M. O. (2019). Characteristic Formulae for Liveness Properties of Non-Terminating CakeML Programs (Version 1.0). Schloss Dagstuhl – Leibniz-Zentrum für Informatik. https://doi.org/10.4230/LIPICS.ITP.2019.32 +
  • Åman Pohjola, J., Rostedt, H., & Myreen, M. O. (2019). Characteristic Formulae for Liveness Properties of Non-Terminating CakeML Programs. Schloss Dagstuhl - Leibniz-Zentrum Fuer Informatik GmbH, Wadern/Saarbruecken, Germany. https://doi.org/10.4230/LIPICS.ITP.2019.32

Session HoareForDivergence

Depends on

\ No newline at end of file diff --git a/web/entries/HyperHoareLogic.html b/web/entries/HyperHoareLogic.html --- a/web/entries/HyperHoareLogic.html +++ b/web/entries/HyperHoareLogic.html @@ -1,232 +1,232 @@ Formalization of Hyper Hoare Logic: A Logic to (Dis-)Prove Program Hyperproperties - Archive of Formal Proofs

Formalization of Hyper Hoare Logic: A Logic to (Dis-)Prove Program Hyperproperties

Thibault Dardinier 📧

April 3, 2023

Abstract

Hoare logics are proof systems that allow one to formally establish properties of computer programs. Traditional Hoare logics prove properties of individual program executions (so-called trace properties, such as functional correctness). On the one hand, Hoare logic has been generalized to prove properties of multiple executions of a program (so-called hyperproperties, such as determinism or non-interference). These program logics prove the absence of (bad combinations of) executions. On the other hand, program logics similar to Hoare logic have been proposed to disprove program properties (e.g., Incorrectness Logic [8]), by proving the existence of (bad combinations of) executions. All of these logics have in common that they specify program properties using assertions over a fixed number of states, for instance, a single pre- and post-state for functional properties or pairs of pre- and post-states for non-interference. In this entry, we formalize Hyper Hoare Logic, a generalization of Hoare logic that lifts assertions to properties of arbitrary sets of states. The resulting logic is simple yet expressive: its judgments can express arbitrary trace- and hyperproperties over the terminating executions of a program. By allowing assertions to reason about sets of states, Hyper Hoare Logic can reason about both the absence and the existence of (combinations of) executions, and, thereby, supports both proving and disproving program (hyper-)properties within the same logic. In fact, we prove that Hyper Hoare Logic subsumes the properties handled by numerous existing correctness and incorrectness logics, and can express hyperproperties that no existing Hoare logic can. We also prove that Hyper Hoare Logic is sound and complete.

License

Topics

Related publications

    -
  • Dardinier, T., & Müller, P. (2023). Hyper Hoare Logic: (Dis-)Proving Program Hyperproperties (extended version) (Version 3). arXiv. https://doi.org/10.48550/ARXIV.2301.10037 +
  • Dardinier, T., & Müller, P. (2023). Hyper Hoare Logic: (Dis-)Proving Program Hyperproperties (extended version) (Version 2). arXiv. https://doi.org/10.48550/ARXIV.2301.10037

Session HyperHoareLogic

\ No newline at end of file diff --git a/web/entries/Hypergraph_Colourings.html b/web/entries/Hypergraph_Colourings.html --- a/web/entries/Hypergraph_Colourings.html +++ b/web/entries/Hypergraph_Colourings.html @@ -1,230 +1,230 @@ Hypergraph Colouring Bounds - Archive of Formal Proofs

Hypergraph Colouring Bounds

Chelsea Edmonds 📧 and Lawrence C. Paulson 📧

September 23, 2023

Abstract

This library includes several example applications of the probabilistic method for combinatorics to establish bounds for hypergraph colourings. This focuses on Property B - the existence of a two-colouring of the vertex set of a hypergraph. A stricter bound was formalised using the Lovász local lemma, which in turn required a surprisingly complex proof of the mutual independence principle for hypergraph edges that is often omitted on paper. The formalisation uncovered several interesting examples of circular intuition on proofs involving independence on paper. The formalisation is based on the textbook proofs from Alon and Spencer's famous textbook, The Probabilistic Method, further supported by notes by Zhao. The mutual independence principle proof is inspired by the less precise proof provided in Molloy and Reed's textbook on graph colourings, as it was omitted in all other sources. Additionally, this library demonstrates how locales can be used to establish a reusable probability space framework, thus minimizing the setup required for future formalisations requiring a probability space on numerous possible properties around an incidence system's vertex set.

License

Topics

Related publications

    -
  • Molloy, M., & Reed, B. (2002). Graph Colouring and the Probabilistic Method. In Algorithms and Combinatorics. Springer Berlin Heidelberg. https://doi.org/10.1007/978-3-642-04016-0 +
  • Molloy, M., & Reed, B. (2002). Graph Colouring and the Probabilistic Method. Algorithms and Combinatorics. https://doi.org/10.1007/978-3-642-04016-0
  • https://dl.acm.org/doi/book/10.5555/3002498
  • https://yufeizhao.com/pm/probmethod_notes.pdf

Session Hypergraph_Colourings

\ No newline at end of file diff --git a/web/entries/List_Update.html b/web/entries/List_Update.html --- a/web/entries/List_Update.html +++ b/web/entries/List_Update.html @@ -1,320 +1,320 @@ Analysis of List Update Algorithms - Archive of Formal Proofs

Analysis of List Update Algorithms

Abstract

These theories formalize the quantitative analysis of a number of classical algorithms for the list update problem: 2-competitiveness of move-to-front, the lower bound of 2 for the competitiveness of deterministic list update algorithms and 1.6-competitiveness of the randomized COMB algorithm, the best randomized list update algorithm known to date. The material is based on the first two chapters of Online Computation and Competitive Analysis by Borodin and El-Yaniv.

For an informal description see the FSTTCS 2016 publication Verified Analysis of List Update Algorithms by Haslbeck and Nipkow.

License

Topics

Related publications

    -
  • Haslbeck, M. P. L., & Nipkow, T. (2016). Verified Analysis of List Update Algorithms. Schloss Dagstuhl – Leibniz-Zentrum für Informatik. https://doi.org/10.4230/LIPICS.FSTTCS.2016.49 +
  • Haslbeck, M. P. L., & Nipkow, T. (2016). Verified Analysis of List Update Algorithms. Schloss Dagstuhl - Leibniz-Zentrum Fuer Informatik GmbH, Wadern/Saarbruecken, Germany. https://doi.org/10.4230/LIPICS.FSTTCS.2016.49

Session List_Update

\ No newline at end of file diff --git a/web/entries/Monad_Normalisation.html b/web/entries/Monad_Normalisation.html --- a/web/entries/Monad_Normalisation.html +++ b/web/entries/Monad_Normalisation.html @@ -1,289 +1,292 @@ Monad normalisation - Archive of Formal Proofs

Monad normalisation

Abstract

The usual monad laws can directly be used as rewrite rules for Isabelle’s simplifier to normalise monadic HOL terms and decide equivalences. In a commutative monad, however, the commutativity law is a higher-order permutative rewrite rule that makes the simplifier loop. This AFP entry implements a simproc that normalises monadic expressions in commutative monads using ordered rewriting. The simproc can also permute computations across control operators like if and case.

License

Topics

Session Monad_Normalisation

\ No newline at end of file diff --git a/web/entries/Pell.html b/web/entries/Pell.html --- a/web/entries/Pell.html +++ b/web/entries/Pell.html @@ -1,295 +1,298 @@ Pell's Equation - Archive of Formal Proofs

Pell's Equation

Manuel Eberl 🌐

June 23, 2018

Abstract

This article gives the basic theory of Pell's equation x2 = 1 + Dy2, where D ∈ ℕ is a parameter and x, y are integer variables.

The main result that is proven is the following: If D is not a perfect square, then there exists a fundamental solution (x0, y0) that is not the trivial solution (1, 0) and which generates all other solutions (x, y) in the sense that there exists some n ∈ ℕ such that |x| + |y| √D = (x0 + y0 √D)n. This also implies that the set of solutions is infinite, and it gives us an explicit and executable characterisation of all the solutions.

Based on this, simple executable algorithms for computing the fundamental solution and the infinite sequence of all non-negative solutions are also provided.

License

Topics

Session Pell

\ No newline at end of file diff --git a/web/entries/Polygonal_Number_Theorem.html b/web/entries/Polygonal_Number_Theorem.html --- a/web/entries/Polygonal_Number_Theorem.html +++ b/web/entries/Polygonal_Number_Theorem.html @@ -1,245 +1,245 @@ Polygonal Number Theorem - Archive of Formal Proofs

Polygonal Number Theorem

Abstract

We formalize the proofs of Cauchy's and Legendre's Polygonal Number Theorems given in Melvyn B. Nathanson's book "Additive Number Theory: The Classical Bases".

For $m \geq 1$, the $k$-th polygonal number of order $m+2$ is defined to be $p_m(k)=\frac{mk(k-1)}{2}+k$. The theorems state that:

1. If $m \ge 4$ and $N \geq 108m$, then $N$ can be written as the sum of $m+1$ polygonal numbers of order $m+2$, at most four of which are different from $0$ or $1$. If $N \geq 324$, then $N$ can be written as the sum of five pentagonal numbers, at least one of which is $0$ or $1$.

2. Let $m \geq 3$ and $N \geq 28m^3$. If $m$ is odd, then $N$ is the sum of four polygonal numbers of order $m+2$. If $m$ is even, then $N$ is the sum of five polygonal numbers of order $m+2$, at least one of which is $0$ or $1$.

We also formalize the proof of Gauss's theorem which states that every non-negative integer is the sum of three triangular numbers.

License

Topics

Related publications

Session Polygonal_Number_Theorem

\ No newline at end of file diff --git a/web/entries/Polynomial_Factorization.html b/web/entries/Polynomial_Factorization.html --- a/web/entries/Polynomial_Factorization.html +++ b/web/entries/Polynomial_Factorization.html @@ -1,352 +1,355 @@ Polynomial Factorization - Archive of Formal Proofs

Polynomial Factorization

René Thiemann 📧 and Akihisa Yamada 📧

January 29, 2016

Abstract

Based on existing libraries for polynomial interpolation and matrices, we formalized several factorization algorithms for polynomials, including Kronecker's algorithm for integer polynomials, Yun's square-free factorization algorithm for field polynomials, and Berlekamp's algorithm for polynomials over finite fields. By combining the last one with Hensel's lifting, we derive an efficient factorization algorithm for the integer polynomials, which is then lifted for rational polynomials by mechanizing Gauss' lemma. Finally, we assembled a combined factorization algorithm for rational polynomials, which combines all the mentioned algorithms and additionally uses the explicit formula for roots of quadratic polynomials and a rational root test.

As side products, we developed division algorithms for polynomials over integral domains, as well as primality-testing and prime-factorization algorithms for integers.

License

Topics

Session Polynomial_Factorization

\ No newline at end of file diff --git a/web/entries/Prim_Dijkstra_Simple.html b/web/entries/Prim_Dijkstra_Simple.html --- a/web/entries/Prim_Dijkstra_Simple.html +++ b/web/entries/Prim_Dijkstra_Simple.html @@ -1,273 +1,273 @@ Purely Functional, Simple, and Efficient Implementation of Prim and Dijkstra - Archive of Formal Proofs

Purely Functional, Simple, and Efficient Implementation of Prim and Dijkstra

Peter Lammich 🌐 and Tobias Nipkow 🌐

June 25, 2019

Abstract

We verify purely functional, simple and efficient implementations of Prim's and Dijkstra's algorithms. This constitutes the first verification of an executable and even efficient version of Prim's algorithm. This entry formalizes the second part of our ITP-2019 proof pearl Purely Functional, Simple and Efficient Priority Search Trees and Applications to Prim and Dijkstra.

License

Topics

Related publications

    -
  • Lammich, P., & Nipkow, T. (2019). Proof Pearl: Purely Functional, Simple and Efficient Priority Search Trees and Applications to Prim and Dijkstra (Version 1.0). Schloss Dagstuhl – Leibniz-Zentrum für Informatik. https://doi.org/10.4230/LIPICS.ITP.2019.23 +
  • Lammich, P., & Nipkow, T. (2019). Proof Pearl: Purely Functional, Simple and Efficient Priority Search Trees and Applications to Prim and Dijkstra. Schloss Dagstuhl - Leibniz-Zentrum Fuer Informatik GmbH, Wadern/Saarbruecken, Germany. https://doi.org/10.4230/LIPICS.ITP.2019.23

Session Prim_Dijkstra_Simple

\ No newline at end of file diff --git a/web/entries/Propositional_Proof_Systems.html b/web/entries/Propositional_Proof_Systems.html --- a/web/entries/Propositional_Proof_Systems.html +++ b/web/entries/Propositional_Proof_Systems.html @@ -1,332 +1,332 @@ Propositional Proof Systems - Archive of Formal Proofs

Propositional Proof Systems

Abstract

We formalize a range of proof systems for classical propositional logic (sequent calculus, natural deduction, Hilbert systems, resolution) and prove the most important meta-theoretic results about semantics and proofs: compactness, soundness, completeness, translations between proof systems, cut-elimination, interpolation and model existence.

License

Topics

Related publications

    -
  • Michaelis, J., & Nipkow, T. (2019). Formalized Proof Systems for Propositional Logic (Version 1.0). Schloss Dagstuhl – Leibniz-Zentrum für Informatik. https://doi.org/10.4230/LIPICS.TYPES.2017.5 +
  • Michaelis, J., & Nipkow, T. (2018). Formalized Proof Systems for Propositional Logic. Schloss Dagstuhl - Leibniz-Zentrum Fuer Informatik GmbH, Wadern/Saarbruecken, Germany. https://doi.org/10.4230/LIPICS.TYPES.2017.5

Session Propositional_Proof_Systems

\ No newline at end of file diff --git a/web/entries/Quantales_Converse.html b/web/entries/Quantales_Converse.html --- a/web/entries/Quantales_Converse.html +++ b/web/entries/Quantales_Converse.html @@ -1,261 +1,261 @@ Modal quantales, involutive quantales, Dedekind Quantales - Archive of Formal Proofs

Modal quantales, involutive quantales, Dedekind Quantales

Georg Struth 📧 and Cameron Calk

July 25, 2023

Abstract

This AFP entry provides mathematical components for modal quantales, involutive quantales and Dedekind quantales. Modal quantales are simple extensions of modal Kleene algebras useful for the verification of recursive programs. Involutive quantales appear in the study of C*-algebras. Dedekind quantales are relatives of Tarski's relation algebras, hence relevant to program verification and beyond that to higher rewriting. We also provide components for weaker variants such as Kleene algebras with converse and modal Kleene algebras with converse.

License

Topics

Related publications

  • Fahrenberg, U., Johansen, C., Struth, G., & Ziemiański, K. (2023). Catoids and modal convolution algebras. Algebra Universalis, 84(2). https://doi.org/10.1007/s00012-023-00805-9
  • -
  • Calk, C., Malbos, P., Pous, D., & Struth, G. (2023). Higher Catoids, Higher Quantales and their Correspondences (Version 2). arXiv. https://doi.org/10.48550/ARXIV.2307.09253 +
  • Calk, C., Malbos, P., Pous, D., & Struth, G. (2023). Higher Catoids, Higher Quantales and their Correspondences (Version 1). arXiv. https://doi.org/10.48550/ARXIV.2307.09253

Session Quantales_Converse

\ No newline at end of file diff --git a/web/entries/S_Finite_Measure_Monad.html b/web/entries/S_Finite_Measure_Monad.html --- a/web/entries/S_Finite_Measure_Monad.html +++ b/web/entries/S_Finite_Measure_Monad.html @@ -1,235 +1,235 @@ S-Finite Measure Monad on Quasi-Borel Spaces - Archive of Formal Proofs

S-Finite Measure Monad on Quasi-Borel Spaces

Abstract

The s-finite measure monad on quasi-Borel spaces provides a suitable denotational model for higher-order probabilistic programs with conditioning. This entry is a formalization of the s-finite measure monad and related notions, including s-finite measures, s-finite kernels, and a proof automation for quasi-Borel spaces which is an extension of our previous entry Quasi-Borel Spaces. We also implement several examples of probabilistic programs in previous works and prove their property. This work is a part of the work by Hirata, Minamide, and Sato, Semantic Foundations of Higher-Order Probabilistic Programs in Isabelle/HOL presented at the 14th Conference on Interactive Theorem Proving (ITP2023).

License

Topics

Related publications

    -
  • Hirata, M., Minamide, Y., & Sato, T. (2023). Semantic Foundations of Higher-Order Probabilistic Programs in Isabelle/HOL. Schloss Dagstuhl – Leibniz-Zentrum für Informatik. https://doi.org/10.4230/LIPICS.ITP.2023.18 +
  • Hirata, M., Minamide, Y., & Sato, T. (2023). Semantic Foundations of Higher-Order Probabilistic Programs in Isabelle/HOL. Schloss Dagstuhl - Leibniz-Zentrum Für Informatik. https://doi.org/10.4230/LIPICS.ITP.2023.18

Session S_Finite_Measure_Monad

\ No newline at end of file diff --git a/web/entries/Special_Function_Bounds.html b/web/entries/Special_Function_Bounds.html --- a/web/entries/Special_Function_Bounds.html +++ b/web/entries/Special_Function_Bounds.html @@ -1,298 +1,304 @@ Real-Valued Special Functions: Upper and Lower Bounds - Archive of Formal Proofs

Real-Valued Special Functions: Upper and Lower Bounds

Lawrence C. Paulson 🌐

August 29, 2014

Abstract

This development proves upper and lower bounds for several familiar real-valued functions. For sin, cos, exp and sqrt, it defines and verifies infinite families of upper and lower bounds, mostly based on Taylor series expansions. For arctan, ln and exp, it verifies a finite collection of upper and lower bounds, originally obtained from the functions' continued fraction expansions using the computer algebra system Maple. A common theme in these proofs is to take the difference between a function and its approximation, which should be zero at one point, and then consider the sign of the derivative. The immediate purpose of this development is to verify axioms used by MetiTarski, an automatic theorem prover for real-valued special functions. Crucial to MetiTarski's operation is the provision of upper and lower bounds for each function of interest.

License

Topics

Session Special_Function_Bounds

Depends on

+
+

Auto-related entries

+ +
\ No newline at end of file diff --git a/web/entries/Standard_Borel_Spaces.html b/web/entries/Standard_Borel_Spaces.html --- a/web/entries/Standard_Borel_Spaces.html +++ b/web/entries/Standard_Borel_Spaces.html @@ -1,233 +1,233 @@ Standard Borel Spaces - Archive of Formal Proofs

Standard Borel Spaces

Michikazu Hirata 📧

August 8, 2023

Abstract

This entry includes a formalization of standard Borel spaces and (a variant of) the Borel isomorphism theorem. A separable complete metrizable topological space is called a polish space and a measurable space generated from a polish space is called a standard Borel space. We formalize the notion of standard Borel spaces by establishing set-based metric spaces, and then prove (a variant of) the Borel isomorphism theorem. The theorem states that a standard Borel spaces is either a countable discrete space or isomorphic to $\mathbb{R}$.

License

History

October 26, 2023
adjust theories to the set-based metric space library in Isabelle2023

Topics

Related publications

    -
  • Hirata, M., Minamide, Y., & Sato, T. (2023). Semantic Foundations of Higher-Order Probabilistic Programs in Isabelle/HOL. Schloss Dagstuhl – Leibniz-Zentrum für Informatik. https://doi.org/10.4230/LIPICS.ITP.2023.18 +
  • Hirata, M., Minamide, Y., & Sato, T. (2023). Semantic Foundations of Higher-Order Probabilistic Programs in Isabelle/HOL. Schloss Dagstuhl - Leibniz-Zentrum Für Informatik. https://doi.org/10.4230/LIPICS.ITP.2023.18

Session Standard_Borel_Spaces

\ No newline at end of file diff --git a/web/entries/Transport.html b/web/entries/Transport.html --- a/web/entries/Transport.html +++ b/web/entries/Transport.html @@ -1,340 +1,340 @@ Transport via Partial Galois Connections and Equivalences - Archive of Formal Proofs

Transport via Partial Galois Connections and Equivalences

Kevin Kappelmann 📧

October 11, 2023

Abstract

This entry contains the accompanying formalisation of the paper "Transport via Partial Galois Connections and Equivalences" (APLAS 2023). It contains a theoretical framework to transport programs via equivalences, subsuming the theory of Isabelle's Lifting package. It also contains a prototype to automate transports using this framework in Isabelle/HOL, but this prototype is not yet ready for production. Finally, it contains a library on top of Isabelle/HOL's axioms, including various relativised concepts on orders, functions, binary relations, and Galois connections and equivalences.

License

Topics

Related publications

    -
  • Kappelmann, K. (2023). Transport via Partial Galois Connections and Equivalences. ArXiv. https://doi.org/10.48550/ARXIV.2303.05244 +
  • Kappelmann, K. (2023). Transport via Partial Galois Connections and Equivalences (Version 4). arXiv. https://doi.org/10.48550/ARXIV.2303.05244

Session Transport

\ No newline at end of file diff --git a/web/entries/Wieferich_Kempner.html b/web/entries/Wieferich_Kempner.html --- a/web/entries/Wieferich_Kempner.html +++ b/web/entries/Wieferich_Kempner.html @@ -1,218 +1,218 @@ Wieferich–Kempner Theorem - Archive of Formal Proofs

Wieferich–Kempner Theorem

Jamie Chen 🌐

March 6, 2024

Abstract

This document presents a formalised proof of the Wieferich–Kempner Theorem, stating that all nonnegative integers can be expressed as the sum of nine nonnegative cubes. The source of the proof is the book "Additive Number Theory: The Classical Bases" by Melvyn B. Nathanson.

License

Topics

Related publications

Session Wieferich_Kempner

\ No newline at end of file diff --git a/web/entries/index.html b/web/entries/index.html --- a/web/entries/index.html +++ b/web/entries/index.html @@ -1,7385 +1,7412 @@ Archive of Formal Proofs

Entries

2024

+ + +

2023

2022

2021

2020

2019

2018

2017

2016

2015

2014

2013

2012

2011

2010

2009

2008

2007

2006

2005

2004

\ No newline at end of file diff --git a/web/entries/index.xml b/web/entries/index.xml --- a/web/entries/index.xml +++ b/web/entries/index.xml @@ -1,5638 +1,5659 @@ Entries on Archive of Formal Proofs /entries/ Recent content in Entries on Archive of Formal Proofs Hugo -- gohugo.io en-gb - Wed, 06 Mar 2024 00:00:00 +0000 + Wed, 20 Mar 2024 00:00:00 +0000 + Continued Fractions + /entries/Continued_Fractions.html + Wed, 20 Mar 2024 00:00:00 +0000 + /entries/Continued_Fractions.html + + + + Approximate Model Counting + /entries/Approximate_Model_Counting.html + Fri, 15 Mar 2024 00:00:00 +0000 + /entries/Approximate_Model_Counting.html + + + Verified QBF Solving /entries/QBF_Solver_Verification.html Wed, 06 Mar 2024 00:00:00 +0000 /entries/QBF_Solver_Verification.html Wieferich–Kempner Theorem /entries/Wieferich_Kempner.html Wed, 06 Mar 2024 00:00:00 +0000 /entries/Wieferich_Kempner.html Karatsuba Multiplication on Integers /entries/Karatsuba.html Mon, 19 Feb 2024 00:00:00 +0000 /entries/Karatsuba.html Information Flow Control via Stateful Intransitive Noninterference in Language IMP /entries/IMP_Noninterference.html Mon, 12 Feb 2024 00:00:00 +0000 /entries/IMP_Noninterference.html The Sumcheck Protocol /entries/Sumcheck_Protocol.html Fri, 02 Feb 2024 00:00:00 +0000 /entries/Sumcheck_Protocol.html Region Quadtrees /entries/Region_Quadtrees.html Fri, 26 Jan 2024 00:00:00 +0000 /entries/Region_Quadtrees.html Cubical Categories /entries/CubicalCategories.html Wed, 24 Jan 2024 00:00:00 +0000 /entries/CubicalCategories.html Higher Globular Catoids and Quantales /entries/OmegaCatoidsQuantales.html Wed, 24 Jan 2024 00:00:00 +0000 /entries/OmegaCatoidsQuantales.html Decomposition of totally ordered hoops /entries/Isabelle_hoops.html Mon, 22 Jan 2024 00:00:00 +0000 /entries/Isabelle_hoops.html + Go Code Generation for Isabelle + /entries/Go.html + Mon, 22 Jan 2024 00:00:00 +0000 + /entries/Go.html + + + (Extended) Interval Analysis /entries/Interval_Analysis.html Sun, 21 Jan 2024 00:00:00 +0000 /entries/Interval_Analysis.html Operational Semantics formally proven in HOL-CSP /entries/HOL-CSP_OpSem.html Sun, 24 Dec 2023 00:00:00 +0000 /entries/HOL-CSP_OpSem.html CRYSTALS-Kyber_Security /entries/CRYSTALS-Kyber_Security.html Mon, 18 Dec 2023 00:00:00 +0000 /entries/CRYSTALS-Kyber_Security.html HOL-CSPM - Architectural operators for HOL-CSP /entries/HOL-CSPM.html Tue, 05 Dec 2023 00:00:00 +0000 /entries/HOL-CSPM.html Knuth–Morris–Pratt String Search /entries/KnuthMorrisPratt.html Mon, 27 Nov 2023 00:00:00 +0000 /entries/KnuthMorrisPratt.html Lambert Series /entries/Lambert_Series.html Fri, 24 Nov 2023 00:00:00 +0000 /entries/Lambert_Series.html Martingales /entries/Martingales.html Tue, 21 Nov 2023 00:00:00 +0000 /entries/Martingales.html Soundness of the Q0 proof system for higher-order logic /entries/Q0_Soundness.html Mon, 20 Nov 2023 00:00:00 +0000 /entries/Q0_Soundness.html The Cardinality of the Continuum /entries/Cardinality_Continuum.html Wed, 15 Nov 2023 00:00:00 +0000 /entries/Cardinality_Continuum.html The Polylogarithm Function /entries/Polylog.html Wed, 15 Nov 2023 00:00:00 +0000 /entries/Polylog.html Two theorems about the geometry of the critical points of a complex polynomial /entries/Polynomial_Crit_Geometry.html Tue, 14 Nov 2023 00:00:00 +0000 /entries/Polynomial_Crit_Geometry.html Chebyshev Polynomials /entries/Chebyshev_Polynomials.html Mon, 13 Nov 2023 00:00:00 +0000 /entries/Chebyshev_Polynomials.html Concentration Inequalities /entries/Concentration_Inequalities.html Mon, 13 Nov 2023 00:00:00 +0000 /entries/Concentration_Inequalities.html Myhill-Nerode Theorem for Nominal G-Automata /entries/Nominal_Myhill_Nerode.html Fri, 10 Nov 2023 00:00:00 +0000 /entries/Nominal_Myhill_Nerode.html Elimination of Repeated Factors Algorithm /entries/Elimination_Of_Repeated_Factors.html Mon, 06 Nov 2023 00:00:00 +0000 /entries/Elimination_Of_Repeated_Factors.html Perfect Fields /entries/Perfect_Fields.html Mon, 06 Nov 2023 00:00:00 +0000 /entries/Perfect_Fields.html Metatheory of Q0 /entries/Q0_Metatheory.html Sat, 04 Nov 2023 00:00:00 +0000 /entries/Q0_Metatheory.html Disintegration Theorem /entries/Disintegration.html Thu, 02 Nov 2023 00:00:00 +0000 /entries/Disintegration.html Labeled Transition Systems /entries/Labeled_Transition_Systems.html Tue, 31 Oct 2023 00:00:00 +0000 /entries/Labeled_Transition_Systems.html Pushdown Systems /entries/Pushdown_Systems.html Tue, 31 Oct 2023 00:00:00 +0000 /entries/Pushdown_Systems.html Eudoxus Reals /entries/Eudoxus_Reals.html Sun, 29 Oct 2023 00:00:00 +0000 /entries/Eudoxus_Reals.html Transport via Partial Galois Connections and Equivalences /entries/Transport.html Wed, 11 Oct 2023 00:00:00 +0000 /entries/Transport.html Hypergraph Colouring Bounds /entries/Hypergraph_Colourings.html Sat, 23 Sep 2023 00:00:00 +0000 /entries/Hypergraph_Colourings.html Cardinality and Representation of Stone Relation Algebras /entries/Relational_Cardinality.html Fri, 22 Sep 2023 00:00:00 +0000 /entries/Relational_Cardinality.html General Probabilistic Techniques for Combinatorics and the Lovasz Local Lemma /entries/Lovasz_Local.html Wed, 20 Sep 2023 00:00:00 +0000 /entries/Lovasz_Local.html Hypergraphs /entries/Hypergraph_Basics.html Wed, 20 Sep 2023 00:00:00 +0000 /entries/Hypergraph_Basics.html Unification Utilities for Isabelle/ML /entries/ML_Unification.html Tue, 19 Sep 2023 00:00:00 +0000 /entries/ML_Unification.html Euler's Polyhedron Formula /entries/Euler_Polyhedron_Formula.html Sat, 16 Sep 2023 00:00:00 +0000 /entries/Euler_Polyhedron_Formula.html Conformance Relations between Input/Output Languages /entries/IO_Language_Conformance.html Fri, 01 Sep 2023 00:00:00 +0000 /entries/IO_Language_Conformance.html Coupled Similarity and Contrasimilarity, and How to Compute Them /entries/Coupledsim_Contrasim.html Fri, 18 Aug 2023 00:00:00 +0000 /entries/Coupledsim_Contrasim.html Ceva's Theorem /entries/Ceva.html Wed, 16 Aug 2023 00:00:00 +0000 /entries/Ceva.html Catoids, Categories, Groupoids /entries/Catoids.html Mon, 14 Aug 2023 00:00:00 +0000 /entries/Catoids.html Fixed-length vectors /entries/Fixed_Length_Vector.html Mon, 14 Aug 2023 00:00:00 +0000 /entries/Fixed_Length_Vector.html Polygonal Number Theorem /entries/Polygonal_Number_Theorem.html Thu, 10 Aug 2023 00:00:00 +0000 /entries/Polygonal_Number_Theorem.html S-Finite Measure Monad on Quasi-Borel Spaces /entries/S_Finite_Measure_Monad.html Tue, 08 Aug 2023 00:00:00 +0000 /entries/S_Finite_Measure_Monad.html Standard Borel Spaces /entries/Standard_Borel_Spaces.html Tue, 08 Aug 2023 00:00:00 +0000 /entries/Standard_Borel_Spaces.html Modal quantales, involutive quantales, Dedekind Quantales /entries/Quantales_Converse.html Tue, 25 Jul 2023 00:00:00 +0000 /entries/Quantales_Converse.html Earley Parser /entries/Earley_Parser.html Sun, 16 Jul 2023 00:00:00 +0000 /entries/Earley_Parser.html Gray Codes for Arbitrary Numeral Systems /entries/Gray_Codes.html Tue, 11 Jul 2023 00:00:00 +0000 /entries/Gray_Codes.html Executable Randomized Algorithms /entries/Executable_Randomized_Algorithms.html Mon, 19 Jun 2023 00:00:00 +0000 /entries/Executable_Randomized_Algorithms.html DCR Syntax and Execution Equivalent Markings /entries/DCR-ExecutionEquivalence.html Fri, 16 Jun 2023 00:00:00 +0000 /entries/DCR-ExecutionEquivalence.html Zeckendorf’s Theorem /entries/Zeckendorf.html Mon, 12 Jun 2023 00:00:00 +0000 /entries/Zeckendorf.html Cryptographic Standards /entries/Crypto_Standards.html Tue, 06 Jun 2023 00:00:00 +0000 /entries/Crypto_Standards.html A Verified Efficient Implementation of the Weighted Path Order /entries/Efficient_Weighted_Path_Order.html Thu, 01 Jun 2023 00:00:00 +0000 /entries/Efficient_Weighted_Path_Order.html Formalizing Results on Directed Sets /entries/Directed_Sets.html Wed, 24 May 2023 00:00:00 +0000 /entries/Directed_Sets.html Inner Structure, Determinism and Modal Algebra of Multirelations /entries/Multirelations_Heterogeneous.html Mon, 22 May 2023 00:00:00 +0000 /entries/Multirelations_Heterogeneous.html Tree Enumeration /entries/Tree_Enumeration.html Tue, 09 May 2023 00:00:00 +0000 /entries/Tree_Enumeration.html MLSS Decision Procedure /entries/MLSS_Decision_Proc.html Fri, 05 May 2023 00:00:00 +0000 /entries/MLSS_Decision_Proc.html Three Squares Theorem /entries/Three_Squares.html Wed, 03 May 2023 00:00:00 +0000 /entries/Three_Squares.html The Halting Problem is Soluble in Malament-Hogarth Spacetimes /entries/MHComputation.html Sat, 29 Apr 2023 00:00:00 +0000 /entries/MHComputation.html The Schwartz-Zippel Lemma /entries/Schwartz_Zippel.html Thu, 27 Apr 2023 00:00:00 +0000 /entries/Schwartz_Zippel.html A Formalization of the SCL(FOL) Calculus: Simple Clause Learning for First-Order Logic /entries/Simple_Clause_Learning.html Thu, 20 Apr 2023 00:00:00 +0000 /entries/Simple_Clause_Learning.html The CHSH inequality: Tsirelson's upper-bound and other results /entries/TsirelsonBound.html Tue, 18 Apr 2023 00:00:00 +0000 /entries/TsirelsonBound.html Distributed Distinct Elements /entries/Distributed_Distinct_Elements.html Mon, 03 Apr 2023 00:00:00 +0000 /entries/Distributed_Distinct_Elements.html Formalization of Hyper Hoare Logic: A Logic to (Dis-)Prove Program Hyperproperties /entries/HyperHoareLogic.html Mon, 03 Apr 2023 00:00:00 +0000 /entries/HyperHoareLogic.html Positional Notation for Natural Numbers in an Arbitrary Base /entries/DigitsInBase.html Mon, 03 Apr 2023 00:00:00 +0000 /entries/DigitsInBase.html Formalization of CommCSL: A Relational Concurrent Separation Logic for Proving Information Flow Security in Concurrent Programs /entries/CommCSL.html Wed, 15 Mar 2023 00:00:00 +0000 /entries/CommCSL.html No Faster-Than-Light Observers (GenRel) /entries/No_FTL_observers_Gen_Rel.html Sun, 05 Mar 2023 00:00:00 +0000 /entries/No_FTL_observers_Gen_Rel.html Expander Graphs /entries/Expander_Graphs.html Fri, 03 Mar 2023 00:00:00 +0000 /entries/Expander_Graphs.html Renaming-Enriched Sets (Rensets) and Renaming-Based Recursion /entries/Rensets.html Tue, 28 Feb 2023 00:00:00 +0000 /entries/Rensets.html A Sound and Complete Calculus for Probability Inequalities /entries/Probability_Inequality_Completeness.html Mon, 20 Feb 2023 00:00:00 +0000 /entries/Probability_Inequality_Completeness.html Group Law of Edwards Elliptic Curves /entries/Edwards_Elliptic_Curves_Group.html Thu, 16 Feb 2023 00:00:00 +0000 /entries/Edwards_Elliptic_Curves_Group.html Hardness of Lattice Problems /entries/CVP_Hardness.html Thu, 02 Feb 2023 00:00:00 +0000 /entries/CVP_Hardness.html ABY3 Multiplication and Array Shuffling /entries/ABY3_Protocols.html Fri, 27 Jan 2023 00:00:00 +0000 /entries/ABY3_Protocols.html Given Clause Loops /entries/Given_Clause_Loops.html Wed, 25 Jan 2023 00:00:00 +0000 /entries/Given_Clause_Loops.html Suppes' Theorem For Probability Logic /entries/Suppes_Theorem.html Sun, 22 Jan 2023 00:00:00 +0000 /entries/Suppes_Theorem.html A Hoare Logic for Diverging Programs /entries/HoareForDivergence.html Fri, 20 Jan 2023 00:00:00 +0000 /entries/HoareForDivergence.html Strict Omega Categories /entries/StrictOmegaCategories.html Sat, 14 Jan 2023 00:00:00 +0000 /entries/StrictOmegaCategories.html Synthetic Completeness /entries/Synthetic_Completeness.html Mon, 09 Jan 2023 00:00:00 +0000 /entries/Synthetic_Completeness.html The Cook-Levin theorem /entries/Cook_Levin.html Sun, 08 Jan 2023 00:00:00 +0000 /entries/Cook_Levin.html Binary codes that do not preserve primitivity /entries/Binary_Code_Imprimitive.html Tue, 03 Jan 2023 00:00:00 +0000 /entries/Binary_Code_Imprimitive.html Intersection of two monoids generated by two element codes /entries/Two_Generated_Word_Monoids_Intersection.html Tue, 03 Jan 2023 00:00:00 +0000 /entries/Two_Generated_Word_Monoids_Intersection.html A First Complete Algorithm for Real Quantifier Elimination in Isabelle/HOL /entries/Quantifier_Elimination_Hybrid.html Thu, 15 Dec 2022 00:00:00 +0000 /entries/Quantifier_Elimination_Hybrid.html Class-based Classical Propositional Logic /entries/Propositional_Logic_Class.html Thu, 15 Dec 2022 00:00:00 +0000 /entries/Propositional_Logic_Class.html Birkhoff's Representation Theorem For Finite Distributive Lattices /entries/Birkhoff_Finite_Distributive_Lattices.html Tue, 06 Dec 2022 00:00:00 +0000 /entries/Birkhoff_Finite_Distributive_Lattices.html Automation of Boolos' Curious Inference in Isabelle/HOL /entries/Boolos_Curious_Inference_Automated.html Mon, 05 Dec 2022 00:00:00 +0000 /entries/Boolos_Curious_Inference_Automated.html A Verified Translation of Multitape Turing Machines into Singletape Turing Machines /entries/Multitape_To_Singletape_TM.html Wed, 30 Nov 2022 00:00:00 +0000 /entries/Multitape_To_Singletape_TM.html Abstract Object Theory /entries/AOT.html Mon, 28 Nov 2022 00:00:00 +0000 /entries/AOT.html A Formal CHERI-C Memory Model /entries/CHERI-C_Memory_Model.html Fri, 25 Nov 2022 00:00:00 +0000 /entries/CHERI-C_Memory_Model.html Sauer-Shelah Lemma /entries/Sauer_Shelah_Lemma.html Thu, 24 Nov 2022 00:00:00 +0000 /entries/Sauer_Shelah_Lemma.html Kneser's Theorem and the Cauchy–Davenport Theorem /entries/Kneser_Cauchy_Davenport.html Mon, 21 Nov 2022 00:00:00 +0000 /entries/Kneser_Cauchy_Davenport.html Turán's Graph Theorem /entries/Turans_Graph_Theorem.html Mon, 14 Nov 2022 00:00:00 +0000 /entries/Turans_Graph_Theorem.html Combinatorial Enumeration Algorithms /entries/Combinatorial_Enumeration_Algorithms.html Fri, 11 Nov 2022 00:00:00 +0000 /entries/Combinatorial_Enumeration_Algorithms.html The Balog–Szemerédi–Gowers Theorem /entries/Balog_Szemeredi_Gowers.html Fri, 11 Nov 2022 00:00:00 +0000 /entries/Balog_Szemeredi_Gowers.html The Incompatibility of Strategy-Proofness and Representation in Party-Approval Multi-Winner Elections /entries/PAPP_Impossibility.html Thu, 10 Nov 2022 00:00:00 +0000 /entries/PAPP_Impossibility.html Verification of Query Optimization Algorithms /entries/Query_Optimization.html Tue, 04 Oct 2022 00:00:00 +0000 /entries/Query_Optimization.html Maximum Segment Sum /entries/Maximum_Segment_Sum.html Thu, 29 Sep 2022 00:00:00 +0000 /entries/Maximum_Segment_Sum.html Undirected Graph Theory /entries/Undirected_Graph_Theory.html Thu, 29 Sep 2022 00:00:00 +0000 /entries/Undirected_Graph_Theory.html Making Arbitrary Relational Calculus Queries Safe-Range /entries/Safe_Range_RC.html Wed, 28 Sep 2022 00:00:00 +0000 /entries/Safe_Range_RC.html Stalnaker's Epistemic Logic /entries/Stalnaker_Logic.html Fri, 23 Sep 2022 00:00:00 +0000 /entries/Stalnaker_Logic.html p-adic Fields and p-adic Semialgebraic Sets /entries/Padic_Field.html Thu, 22 Sep 2022 00:00:00 +0000 /entries/Padic_Field.html Risk-Free Lending /entries/Risk_Free_Lending.html Sun, 18 Sep 2022 00:00:00 +0000 /entries/Risk_Free_Lending.html Soundness and Completeness of Implicational Logic /entries/Implicational_Logic.html Tue, 13 Sep 2022 00:00:00 +0000 /entries/Implicational_Logic.html CRYSTALS-Kyber /entries/CRYSTALS-Kyber.html Thu, 08 Sep 2022 00:00:00 +0000 /entries/CRYSTALS-Kyber.html Unbounded Separation Logic /entries/Separation_Logic_Unbounded.html Mon, 05 Sep 2022 00:00:00 +0000 /entries/Separation_Logic_Unbounded.html Khovanskii&#x27;s Theorem /entries/Khovanskii_Theorem.html Fri, 02 Sep 2022 00:00:00 +0000 /entries/Khovanskii_Theorem.html The Hales–Jewett Theorem /entries/Hales_Jewett.html Fri, 02 Sep 2022 00:00:00 +0000 /entries/Hales_Jewett.html Number Theoretic Transform /entries/Number_Theoretic_Transform.html Thu, 18 Aug 2022 00:00:00 +0000 /entries/Number_Theoretic_Transform.html Correctness of a Set-based Algorithm for Computing Strongly Connected Components of a Graph /entries/SCC_Bloemen_Sequential.html Wed, 17 Aug 2022 00:00:00 +0000 /entries/SCC_Bloemen_Sequential.html From THE BOOK: Two Squares via Involutions /entries/Involutions2Squares.html Mon, 15 Aug 2022 00:00:00 +0000 /entries/Involutions2Squares.html Verified Complete Test Strategies for Finite State Machines /entries/FSM_Tests.html Tue, 09 Aug 2022 00:00:00 +0000 /entries/FSM_Tests.html Nano JSON: Working with JSON formatted data in Isabelle/HOL and Isabelle/ML /entries/Nano_JSON.html Fri, 29 Jul 2022 00:00:00 +0000 /entries/Nano_JSON.html Isabelle/Solidity: A deep Embedding of Solidity in Isabelle/HOL /entries/Solidity.html Mon, 18 Jul 2022 00:00:00 +0000 /entries/Solidity.html Simultaneous diagonalization of pairwise commuting Hermitian matrices /entries/Commuting_Hermitian.html Mon, 18 Jul 2022 00:00:00 +0000 /entries/Commuting_Hermitian.html Pólya’s Proof of the Weighted Arithmetic–Geometric Mean Inequality /entries/Weighted_Arithmetic_Geometric_Mean.html Mon, 11 Jul 2022 00:00:00 +0000 /entries/Weighted_Arithmetic_Geometric_Mean.html A Reuse-Based Multi-Stage Compiler Verification for Language IMP /entries/IMP_Compiler_Reuse.html Sun, 10 Jul 2022 00:00:00 +0000 /entries/IMP_Compiler_Reuse.html Real-Time Double-Ended Queue /entries/Real_Time_Deque.html Thu, 23 Jun 2022 00:00:00 +0000 /entries/Real_Time_Deque.html Boolos's Curious Inference in Isabelle/HOL /entries/Boolos_Curious_Inference.html Mon, 20 Jun 2022 00:00:00 +0000 /entries/Boolos_Curious_Inference.html Finite Fields /entries/Finite_Fields.html Wed, 08 Jun 2022 00:00:00 +0000 /entries/Finite_Fields.html IsaNet: Formalization of a Verification Framework for Secure Data Plane Protocols /entries/IsaNet.html Wed, 08 Jun 2022 00:00:00 +0000 /entries/IsaNet.html Diophantine Equations and the DPRM Theorem /entries/DPRM_Theorem.html Mon, 06 Jun 2022 00:00:00 +0000 /entries/DPRM_Theorem.html Reducing Rewrite Properties to Properties on Ground Terms /entries/Rewrite_Properties_Reduction.html Thu, 02 Jun 2022 00:00:00 +0000 /entries/Rewrite_Properties_Reduction.html A Restricted Definition of the Magic Wand to Soundly Combine Fractions of a Wand /entries/Combinable_Wands.html Mon, 30 May 2022 00:00:00 +0000 /entries/Combinable_Wands.html The Plünnecke-Ruzsa Inequality /entries/Pluennecke_Ruzsa_Inequality.html Thu, 26 May 2022 00:00:00 +0000 /entries/Pluennecke_Ruzsa_Inequality.html Formalization of a Framework for the Sound Automation of Magic Wands /entries/Package_logic.html Wed, 18 May 2022 00:00:00 +0000 /entries/Package_logic.html Clique is not solvable by monotone circuits of polynomial size /entries/Clique_and_Monotone_Circuits.html Sun, 08 May 2022 00:00:00 +0000 /entries/Clique_and_Monotone_Circuits.html Fisher's Inequality: Linear Algebraic Proof Techniques for Combinatorics /entries/Fishers_Inequality.html Thu, 21 Apr 2022 00:00:00 +0000 /entries/Fishers_Inequality.html Digit Expansions /entries/Digit_Expansions.html Wed, 20 Apr 2022 00:00:00 +0000 /entries/Digit_Expansions.html The Generalized Multiset Ordering is NP-Complete /entries/Multiset_Ordering_NPC.html Wed, 20 Apr 2022 00:00:00 +0000 /entries/Multiset_Ordering_NPC.html The Sophomore's Dream /entries/Sophomores_Dream.html Sun, 10 Apr 2022 00:00:00 +0000 /entries/Sophomores_Dream.html A Combinator Library for Prefix-Free Codes /entries/Prefix_Free_Code_Combinators.html Fri, 08 Apr 2022 00:00:00 +0000 /entries/Prefix_Free_Code_Combinators.html Formalization of Randomized Approximation Algorithms for Frequency Moments /entries/Frequency_Moments.html Fri, 08 Apr 2022 00:00:00 +0000 /entries/Frequency_Moments.html Constructing the Reals as Dedekind Cuts of Rationals /entries/Dedekind_Real.html Thu, 24 Mar 2022 00:00:00 +0000 /entries/Dedekind_Real.html Ackermann's Function Is Not Primitive Recursive /entries/Ackermanns_not_PR.html Wed, 23 Mar 2022 00:00:00 +0000 /entries/Ackermanns_not_PR.html A Naive Prover for First-Order Logic /entries/FOL_Seq_Calc3.html Tue, 22 Mar 2022 00:00:00 +0000 /entries/FOL_Seq_Calc3.html A Proof from THE BOOK: The Partial Fraction Expansion of the Cotangent /entries/Cotangent_PFD_Formula.html Tue, 15 Mar 2022 00:00:00 +0000 /entries/Cotangent_PFD_Formula.html The Independence of the Continuum Hypothesis in Isabelle/ZF /entries/Independence_CH.html Sun, 06 Mar 2022 00:00:00 +0000 /entries/Independence_CH.html Transitive Models of Fragments of ZFC /entries/Transitive_Models.html Thu, 03 Mar 2022 00:00:00 +0000 /entries/Transitive_Models.html Residuated Transition Systems /entries/ResiduatedTransitionSystem.html Mon, 28 Feb 2022 00:00:00 +0000 /entries/ResiduatedTransitionSystem.html Universal Hash Families /entries/Universal_Hash_Families.html Sun, 20 Feb 2022 00:00:00 +0000 /entries/Universal_Hash_Families.html Wetzel's Problem and the Continuum Hypothesis /entries/Wetzels_Problem.html Fri, 18 Feb 2022 00:00:00 +0000 /entries/Wetzels_Problem.html First-Order Query Evaluation /entries/Eval_FO.html Tue, 15 Feb 2022 00:00:00 +0000 /entries/Eval_FO.html Multi-Head Monitoring of Metric Dynamic Logic /entries/VYDRA_MDL.html Sun, 13 Feb 2022 00:00:00 +0000 /entries/VYDRA_MDL.html Enumeration of Equivalence Relations /entries/Equivalence_Relation_Enumeration.html Fri, 04 Feb 2022 00:00:00 +0000 /entries/Equivalence_Relation_Enumeration.html Duality of Linear Programming /entries/LP_Duality.html Thu, 03 Feb 2022 00:00:00 +0000 /entries/LP_Duality.html Quasi-Borel Spaces /entries/Quasi_Borel_Spaces.html Thu, 03 Feb 2022 00:00:00 +0000 /entries/Quasi_Borel_Spaces.html First-Order Theory of Rewriting /entries/FO_Theory_Rewriting.html Wed, 02 Feb 2022 00:00:00 +0000 /entries/FO_Theory_Rewriting.html A Sequent Calculus Prover for First-Order Logic with Functions /entries/FOL_Seq_Calc2.html Mon, 31 Jan 2022 00:00:00 +0000 /entries/FOL_Seq_Calc2.html Young's Inequality for Increasing Functions /entries/Youngs_Inequality.html Mon, 31 Jan 2022 00:00:00 +0000 /entries/Youngs_Inequality.html Interpolation Polynomials (in HOL-Algebra) /entries/Interpolation_Polynomials_HOL_Algebra.html Sat, 29 Jan 2022 00:00:00 +0000 /entries/Interpolation_Polynomials_HOL_Algebra.html Median Method /entries/Median_Method.html Tue, 25 Jan 2022 00:00:00 +0000 /entries/Median_Method.html Actuarial Mathematics /entries/Actuarial_Mathematics.html Sun, 23 Jan 2022 00:00:00 +0000 /entries/Actuarial_Mathematics.html Irrational numbers from THE BOOK /entries/Irrationals_From_THEBOOK.html Sat, 08 Jan 2022 00:00:00 +0000 /entries/Irrationals_From_THEBOOK.html Knight's Tour Revisited Revisited /entries/Knights_Tour.html Tue, 04 Jan 2022 00:00:00 +0000 /entries/Knights_Tour.html Hyperdual Numbers and Forward Differentiation /entries/Hyperdual.html Fri, 31 Dec 2021 00:00:00 +0000 /entries/Hyperdual.html Gale-Shapley Algorithm /entries/Gale_Shapley.html Wed, 29 Dec 2021 00:00:00 +0000 /entries/Gale_Shapley.html Roth's Theorem on Arithmetic Progressions /entries/Roth_Arithmetic_Progressions.html Tue, 28 Dec 2021 00:00:00 +0000 /entries/Roth_Arithmetic_Progressions.html Markov Decision Processes with Rewards /entries/MDP-Rewards.html Thu, 16 Dec 2021 00:00:00 +0000 /entries/MDP-Rewards.html Verified Algorithms for Solving Markov Decision Processes /entries/MDP-Algorithms.html Thu, 16 Dec 2021 00:00:00 +0000 /entries/MDP-Algorithms.html Regular Tree Relations /entries/Regular_Tree_Relations.html Wed, 15 Dec 2021 00:00:00 +0000 /entries/Regular_Tree_Relations.html Simplicial Complexes and Boolean functions /entries/Simplicial_complexes_and_boolean_functions.html Mon, 29 Nov 2021 00:00:00 +0000 /entries/Simplicial_complexes_and_boolean_functions.html van Emde Boas Trees /entries/Van_Emde_Boas_Trees.html Tue, 23 Nov 2021 00:00:00 +0000 /entries/Van_Emde_Boas_Trees.html Foundation of geometry in planes, and some complements: Excluding the parallel axioms /entries/Foundation_of_geometry.html Mon, 22 Nov 2021 00:00:00 +0000 /entries/Foundation_of_geometry.html The Hahn and Jordan Decomposition Theorems /entries/Hahn_Jordan_Decomposition.html Fri, 19 Nov 2021 00:00:00 +0000 /entries/Hahn_Jordan_Decomposition.html Automating Public Announcement Logic and the Wise Men Puzzle in Isabelle/HOL /entries/PAL.html Mon, 08 Nov 2021 00:00:00 +0000 /entries/PAL.html Exploring Simplified Variants of Gödel’s Ontological Argument in Isabelle/HOL /entries/SimplifiedOntologicalArgument.html Mon, 08 Nov 2021 00:00:00 +0000 /entries/SimplifiedOntologicalArgument.html Factorization of Polynomials with Algebraic Coefficients /entries/Factor_Algebraic_Polynomial.html Mon, 08 Nov 2021 00:00:00 +0000 /entries/Factor_Algebraic_Polynomial.html Real Exponents as the Limits of Sequences of Rational Exponents /entries/Real_Power.html Mon, 08 Nov 2021 00:00:00 +0000 /entries/Real_Power.html Szemerédi's Regularity Lemma /entries/Szemeredi_Regularity.html Fri, 05 Nov 2021 00:00:00 +0000 /entries/Szemeredi_Regularity.html Quantum and Classical Registers /entries/Registers.html Thu, 28 Oct 2021 00:00:00 +0000 /entries/Registers.html Belief Revision Theory /entries/Belief_Revision.html Tue, 19 Oct 2021 00:00:00 +0000 /entries/Belief_Revision.html X86 instruction semantics and basic block symbolic execution /entries/X86_Semantics.html Wed, 13 Oct 2021 00:00:00 +0000 /entries/X86_Semantics.html Algebras for Iteration, Infinite Executions and Correctness of Sequential Computations /entries/Correctness_Algebras.html Tue, 12 Oct 2021 00:00:00 +0000 /entries/Correctness_Algebras.html Verified Quadratic Virtual Substitution for Real Arithmetic /entries/Virtual_Substitution.html Sat, 02 Oct 2021 00:00:00 +0000 /entries/Virtual_Substitution.html Soundness and Completeness of an Axiomatic System for First-Order Logic /entries/FOL_Axiomatic.html Fri, 24 Sep 2021 00:00:00 +0000 /entries/FOL_Axiomatic.html Complex Bounded Operators /entries/Complex_Bounded_Operators.html Sat, 18 Sep 2021 00:00:00 +0000 /entries/Complex_Bounded_Operators.html A Formalization of Weighted Path Orders and Recursive Path Orders /entries/Weighted_Path_Order.html Thu, 16 Sep 2021 00:00:00 +0000 /entries/Weighted_Path_Order.html Category Theory for ZFC in HOL I: Foundations: Design Patterns, Set Theory, Digraphs, Semicategories /entries/CZH_Foundations.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/CZH_Foundations.html Category Theory for ZFC in HOL II: Elementary Theory of 1-Categories /entries/CZH_Elementary_Categories.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/CZH_Elementary_Categories.html Category Theory for ZFC in HOL III: Universal Constructions /entries/CZH_Universal_Constructions.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/CZH_Universal_Constructions.html Conditional Simplification /entries/Conditional_Simplification.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/Conditional_Simplification.html Conditional Transfer Rule /entries/Conditional_Transfer_Rule.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/Conditional_Transfer_Rule.html Extension of Types-To-Sets /entries/Types_To_Sets_Extension.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/Types_To_Sets_Extension.html IDE: Introduction, Destruction, Elimination /entries/Intro_Dest_Elim.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/Intro_Dest_Elim.html A data flow analysis algorithm for computing dominators /entries/Dominance_CHK.html Sun, 05 Sep 2021 00:00:00 +0000 /entries/Dominance_CHK.html Solving Cubic and Quartic Equations /entries/Cubic_Quartic_Equations.html Fri, 03 Sep 2021 00:00:00 +0000 /entries/Cubic_Quartic_Equations.html Logging-independent Message Anonymity in the Relational Method /entries/Logging_Independent_Anonymity.html Thu, 26 Aug 2021 00:00:00 +0000 /entries/Logging_Independent_Anonymity.html The Theorem of Three Circles /entries/Three_Circles.html Sat, 21 Aug 2021 00:00:00 +0000 /entries/Three_Circles.html CoCon: A Confidentiality-Verified Conference Management System /entries/CoCon.html Mon, 16 Aug 2021 00:00:00 +0000 /entries/CoCon.html Compositional BD Security /entries/BD_Security_Compositional.html Mon, 16 Aug 2021 00:00:00 +0000 /entries/BD_Security_Compositional.html CoSMed: A confidentiality-verified social media platform /entries/CoSMed.html Mon, 16 Aug 2021 00:00:00 +0000 /entries/CoSMed.html CoSMeDis: A confidentiality-verified distributed social media platform /entries/CoSMeDis.html Mon, 16 Aug 2021 00:00:00 +0000 /entries/CoSMeDis.html Fresh identifiers /entries/Fresh_Identifiers.html Mon, 16 Aug 2021 00:00:00 +0000 /entries/Fresh_Identifiers.html Combinatorial Design Theory /entries/Design_Theory.html Fri, 13 Aug 2021 00:00:00 +0000 /entries/Design_Theory.html Relational Forests /entries/Relational_Forests.html Tue, 03 Aug 2021 00:00:00 +0000 /entries/Relational_Forests.html Schutz' Independent Axioms for Minkowski Spacetime /entries/Schutz_Spacetime.html Tue, 27 Jul 2021 00:00:00 +0000 /entries/Schutz_Spacetime.html Finitely Generated Abelian Groups /entries/Finitely_Generated_Abelian_Groups.html Wed, 07 Jul 2021 00:00:00 +0000 /entries/Finitely_Generated_Abelian_Groups.html SpecCheck - Specification-Based Testing for Isabelle/ML /entries/SpecCheck.html Thu, 01 Jul 2021 00:00:00 +0000 /entries/SpecCheck.html Van der Waerden's Theorem /entries/Van_der_Waerden.html Tue, 22 Jun 2021 00:00:00 +0000 /entries/Van_der_Waerden.html MiniSail - A kernel language for the ISA specification language SAIL /entries/MiniSail.html Fri, 18 Jun 2021 00:00:00 +0000 /entries/MiniSail.html Public Announcement Logic /entries/Public_Announcement_Logic.html Thu, 17 Jun 2021 00:00:00 +0000 /entries/Public_Announcement_Logic.html A Shorter Compiler Correctness Proof for Language IMP /entries/IMP_Compiler.html Fri, 04 Jun 2021 00:00:00 +0000 /entries/IMP_Compiler.html Combinatorics on Words Basics /entries/Combinatorics_Words.html Mon, 24 May 2021 00:00:00 +0000 /entries/Combinatorics_Words.html Graph Lemma /entries/Combinatorics_Words_Graph_Lemma.html Mon, 24 May 2021 00:00:00 +0000 /entries/Combinatorics_Words_Graph_Lemma.html Lyndon words /entries/Combinatorics_Words_Lyndon.html Mon, 24 May 2021 00:00:00 +0000 /entries/Combinatorics_Words_Lyndon.html Regression Test Selection /entries/Regression_Test_Selection.html Fri, 30 Apr 2021 00:00:00 +0000 /entries/Regression_Test_Selection.html Isabelle's Metalogic: Formalization and Proof Checker /entries/Metalogic_ProofChecker.html Tue, 27 Apr 2021 00:00:00 +0000 /entries/Metalogic_ProofChecker.html Lifting the Exponent /entries/Lifting_the_Exponent.html Tue, 27 Apr 2021 00:00:00 +0000 /entries/Lifting_the_Exponent.html The BKR Decision Procedure for Univariate Real Arithmetic /entries/BenOr_Kozen_Reif.html Sat, 24 Apr 2021 00:00:00 +0000 /entries/BenOr_Kozen_Reif.html Gale-Stewart Games /entries/GaleStewart_Games.html Fri, 23 Apr 2021 00:00:00 +0000 /entries/GaleStewart_Games.html Formalization of Timely Dataflow's Progress Tracking Protocol /entries/Progress_Tracking.html Tue, 13 Apr 2021 00:00:00 +0000 /entries/Progress_Tracking.html Information Flow Control via Dependency Tracking /entries/IFC_Tracking.html Thu, 01 Apr 2021 00:00:00 +0000 /entries/IFC_Tracking.html Grothendieck's Schemes in Algebraic Geometry /entries/Grothendieck_Schemes.html Mon, 29 Mar 2021 00:00:00 +0000 /entries/Grothendieck_Schemes.html Hensel's Lemma for the p-adic Integers /entries/Padic_Ints.html Tue, 23 Mar 2021 00:00:00 +0000 /entries/Padic_Ints.html Constructive Cryptography in HOL: the Communication Modeling Aspect /entries/Constructive_Cryptography_CM.html Wed, 17 Mar 2021 00:00:00 +0000 /entries/Constructive_Cryptography_CM.html Two algorithms based on modular arithmetic: lattice basis reduction and Hermite normal form computation /entries/Modular_arithmetic_LLL_and_HNF_algorithms.html Fri, 12 Mar 2021 00:00:00 +0000 /entries/Modular_arithmetic_LLL_and_HNF_algorithms.html Quantum projective measurements and the CHSH inequality /entries/Projective_Measurements.html Wed, 03 Mar 2021 00:00:00 +0000 /entries/Projective_Measurements.html The Hermite–Lindemann–Weierstraß Transcendence Theorem /entries/Hermite_Lindemann.html Wed, 03 Mar 2021 00:00:00 +0000 /entries/Hermite_Lindemann.html Mereology /entries/Mereology.html Mon, 01 Mar 2021 00:00:00 +0000 /entries/Mereology.html The Sunflower Lemma of Erdős and Rado /entries/Sunflowers.html Thu, 25 Feb 2021 00:00:00 +0000 /entries/Sunflowers.html A Verified Imperative Implementation of B-Trees /entries/BTree.html Wed, 24 Feb 2021 00:00:00 +0000 /entries/BTree.html Formal Puiseux Series /entries/Formal_Puiseux_Series.html Wed, 17 Feb 2021 00:00:00 +0000 /entries/Formal_Puiseux_Series.html The Laws of Large Numbers /entries/Laws_of_Large_Numbers.html Wed, 10 Feb 2021 00:00:00 +0000 /entries/Laws_of_Large_Numbers.html Tarski's Parallel Postulate implies the 5th Postulate of Euclid, the Postulate of Playfair and the original Parallel Postulate of Euclid /entries/IsaGeoCoq.html Sun, 31 Jan 2021 00:00:00 +0000 /entries/IsaGeoCoq.html Solution to the xkcd Blue Eyes puzzle /entries/Blue_Eyes.html Sat, 30 Jan 2021 00:00:00 +0000 /entries/Blue_Eyes.html Hood-Melville Queue /entries/Hood_Melville_Queue.html Mon, 18 Jan 2021 00:00:00 +0000 /entries/Hood_Melville_Queue.html JinjaDCI: a Java semantics with dynamic class initialization /entries/JinjaDCI.html Mon, 11 Jan 2021 00:00:00 +0000 /entries/JinjaDCI.html Cofinality and the Delta System Lemma /entries/Delta_System_Lemma.html Sun, 27 Dec 2020 00:00:00 +0000 /entries/Delta_System_Lemma.html Topological semantics for paraconsistent and paracomplete logics /entries/Topological_Semantics.html Thu, 17 Dec 2020 00:00:00 +0000 /entries/Topological_Semantics.html Relational Minimum Spanning Tree Algorithms /entries/Relational_Minimum_Spanning_Trees.html Tue, 08 Dec 2020 00:00:00 +0000 /entries/Relational_Minimum_Spanning_Trees.html Inline Caching and Unboxing Optimization for Interpreters /entries/Interpreter_Optimizations.html Mon, 07 Dec 2020 00:00:00 +0000 /entries/Interpreter_Optimizations.html The Relational Method with Message Anonymity for the Verification of Cryptographic Protocols /entries/Relational_Method.html Sat, 05 Dec 2020 00:00:00 +0000 /entries/Relational_Method.html Isabelle Marries Dirac: a Library for Quantum Computation and Quantum Information /entries/Isabelle_Marries_Dirac.html Sun, 22 Nov 2020 00:00:00 +0000 /entries/Isabelle_Marries_Dirac.html The HOL-CSP Refinement Toolkit /entries/CSP_RefTK.html Thu, 19 Nov 2020 00:00:00 +0000 /entries/CSP_RefTK.html AI Planning Languages Semantics /entries/AI_Planning_Languages_Semantics.html Thu, 29 Oct 2020 00:00:00 +0000 /entries/AI_Planning_Languages_Semantics.html Verified SAT-Based AI Planning /entries/Verified_SAT_Based_AI_Planning.html Thu, 29 Oct 2020 00:00:00 +0000 /entries/Verified_SAT_Based_AI_Planning.html A Sound Type System for Physical Quantities, Units, and Measurements /entries/Physical_Quantities.html Tue, 20 Oct 2020 00:00:00 +0000 /entries/Physical_Quantities.html Finite Map Extras /entries/Finite-Map-Extras.html Mon, 12 Oct 2020 00:00:00 +0000 /entries/Finite-Map-Extras.html A Formal Model of the Document Object Model with Shadow Roots /entries/Shadow_DOM.html Mon, 28 Sep 2020 00:00:00 +0000 /entries/Shadow_DOM.html A Formal Model of the Safely Composable Document Object Model with Shadow Roots /entries/Shadow_SC_DOM.html Mon, 28 Sep 2020 00:00:00 +0000 /entries/Shadow_SC_DOM.html A Formalization of Safely Composable Web Components /entries/SC_DOM_Components.html Mon, 28 Sep 2020 00:00:00 +0000 /entries/SC_DOM_Components.html A Formalization of Web Components /entries/DOM_Components.html Mon, 28 Sep 2020 00:00:00 +0000 /entries/DOM_Components.html The Safely Composable DOM /entries/Core_SC_DOM.html Mon, 28 Sep 2020 00:00:00 +0000 /entries/Core_SC_DOM.html An Abstract Formalization of G&ouml;del's Incompleteness Theorems /entries/Goedel_Incompleteness.html Wed, 16 Sep 2020 00:00:00 +0000 /entries/Goedel_Incompleteness.html From Abstract to Concrete G&ouml;del's Incompleteness Theorems&mdash;Part I /entries/Goedel_HFSet_Semantic.html Wed, 16 Sep 2020 00:00:00 +0000 /entries/Goedel_HFSet_Semantic.html From Abstract to Concrete G&ouml;del's Incompleteness Theorems&mdash;Part II /entries/Goedel_HFSet_Semanticless.html Wed, 16 Sep 2020 00:00:00 +0000 /entries/Goedel_HFSet_Semanticless.html Robinson Arithmetic /entries/Robinson_Arithmetic.html Wed, 16 Sep 2020 00:00:00 +0000 /entries/Robinson_Arithmetic.html Syntax-Independent Logic Infrastructure /entries/Syntax_Independent_Logic.html Wed, 16 Sep 2020 00:00:00 +0000 /entries/Syntax_Independent_Logic.html A Formal Model of Extended Finite State Machines /entries/Extended_Finite_State_Machines.html Mon, 07 Sep 2020 00:00:00 +0000 /entries/Extended_Finite_State_Machines.html Inference of Extended Finite State Machines /entries/Extended_Finite_State_Machine_Inference.html Mon, 07 Sep 2020 00:00:00 +0000 /entries/Extended_Finite_State_Machine_Inference.html Practical Algebraic Calculus Checker /entries/PAC_Checker.html Mon, 31 Aug 2020 00:00:00 +0000 /entries/PAC_Checker.html Some classical results in inductive inference of recursive functions /entries/Inductive_Inference.html Mon, 31 Aug 2020 00:00:00 +0000 /entries/Inductive_Inference.html Relational Disjoint-Set Forests /entries/Relational_Disjoint_Set_Forests.html Wed, 26 Aug 2020 00:00:00 +0000 /entries/Relational_Disjoint_Set_Forests.html Extensions to the Comprehensive Framework for Saturation Theorem Proving /entries/Saturation_Framework_Extensions.html Tue, 25 Aug 2020 00:00:00 +0000 /entries/Saturation_Framework_Extensions.html Putting the `K' into Bird's derivation of Knuth-Morris-Pratt string matching /entries/BirdKMP.html Tue, 25 Aug 2020 00:00:00 +0000 /entries/BirdKMP.html Amicable Numbers /entries/Amicable_Numbers.html Tue, 04 Aug 2020 00:00:00 +0000 /entries/Amicable_Numbers.html Ordinal Partitions /entries/Ordinal_Partitions.html Mon, 03 Aug 2020 00:00:00 +0000 /entries/Ordinal_Partitions.html A Formal Proof of The Chandy--Lamport Distributed Snapshot Algorithm /entries/Chandy_Lamport.html Tue, 21 Jul 2020 00:00:00 +0000 /entries/Chandy_Lamport.html Relational Characterisations of Paths /entries/Relational_Paths.html Mon, 13 Jul 2020 00:00:00 +0000 /entries/Relational_Paths.html A Formally Verified Checker of the Safe Distance Traffic Rules for Autonomous Vehicles /entries/Safe_Distance.html Mon, 01 Jun 2020 00:00:00 +0000 /entries/Safe_Distance.html A verified algorithm for computing the Smith normal form of a matrix /entries/Smith_Normal_Form.html Sat, 23 May 2020 00:00:00 +0000 /entries/Smith_Normal_Form.html The Nash-Williams Partition Theorem /entries/Nash_Williams.html Sat, 16 May 2020 00:00:00 +0000 /entries/Nash_Williams.html A Formalization of Knuth–Bendix Orders /entries/Knuth_Bendix_Order.html Wed, 13 May 2020 00:00:00 +0000 /entries/Knuth_Bendix_Order.html Irrationality Criteria for Series by Erdős and Straus /entries/Irrational_Series_Erdos_Straus.html Tue, 12 May 2020 00:00:00 +0000 /entries/Irrational_Series_Erdos_Straus.html Recursion Theorem in ZF /entries/Recursion-Addition.html Mon, 11 May 2020 00:00:00 +0000 /entries/Recursion-Addition.html An Efficient Normalisation Procedure for Linear Temporal Logic: Isabelle/HOL Formalisation /entries/LTL_Normal_Form.html Fri, 08 May 2020 00:00:00 +0000 /entries/LTL_Normal_Form.html Formalization of Forcing in Isabelle/ZF /entries/Forcing.html Wed, 06 May 2020 00:00:00 +0000 /entries/Forcing.html Banach-Steinhaus Theorem /entries/Banach_Steinhaus.html Sat, 02 May 2020 00:00:00 +0000 /entries/Banach_Steinhaus.html Attack Trees in Isabelle for GDPR compliance of IoT healthcare systems /entries/Attack_Trees.html Mon, 27 Apr 2020 00:00:00 +0000 /entries/Attack_Trees.html Gaussian Integers /entries/Gaussian_Integers.html Fri, 24 Apr 2020 00:00:00 +0000 /entries/Gaussian_Integers.html Power Sum Polynomials /entries/Power_Sum_Polynomials.html Fri, 24 Apr 2020 00:00:00 +0000 /entries/Power_Sum_Polynomials.html The Lambert W Function on the Reals /entries/Lambert_W.html Fri, 24 Apr 2020 00:00:00 +0000 /entries/Lambert_W.html Matrices for ODEs /entries/Matrices_for_ODEs.html Sun, 19 Apr 2020 00:00:00 +0000 /entries/Matrices_for_ODEs.html Authenticated Data Structures As Functors /entries/ADS_Functor.html Thu, 16 Apr 2020 00:00:00 +0000 /entries/ADS_Functor.html Formalization of an Algorithm for Greedily Computing Associative Aggregations on Sliding Windows /entries/Sliding_Window_Algorithm.html Fri, 10 Apr 2020 00:00:00 +0000 /entries/Sliding_Window_Algorithm.html A Comprehensive Framework for Saturation Theorem Proving /entries/Saturation_Framework.html Thu, 09 Apr 2020 00:00:00 +0000 /entries/Saturation_Framework.html Formalization of an Optimized Monitoring Algorithm for Metric First-Order Dynamic Logic with Aggregations /entries/MFODL_Monitor_Optimized.html Thu, 09 Apr 2020 00:00:00 +0000 /entries/MFODL_Monitor_Optimized.html Automated Stateful Protocol Verification /entries/Automated_Stateful_Protocol_Verification.html Wed, 08 Apr 2020 00:00:00 +0000 /entries/Automated_Stateful_Protocol_Verification.html Stateful Protocol Composition and Typing /entries/Stateful_Protocol_Composition_and_Typing.html Wed, 08 Apr 2020 00:00:00 +0000 /entries/Stateful_Protocol_Composition_and_Typing.html Lucas's Theorem /entries/Lucas_Theorem.html Tue, 07 Apr 2020 00:00:00 +0000 /entries/Lucas_Theorem.html Strong Eventual Consistency of the Collaborative Editing Framework WOOT /entries/WOOT_Strong_Eventual_Consistency.html Wed, 25 Mar 2020 00:00:00 +0000 /entries/WOOT_Strong_Eventual_Consistency.html Furstenberg's topology and his proof of the infinitude of primes /entries/Furstenberg_Topology.html Sun, 22 Mar 2020 00:00:00 +0000 /entries/Furstenberg_Topology.html An Under-Approximate Relational Logic /entries/Relational-Incorrectness-Logic.html Thu, 12 Mar 2020 00:00:00 +0000 /entries/Relational-Incorrectness-Logic.html Hello World /entries/Hello_World.html Sat, 07 Mar 2020 00:00:00 +0000 /entries/Hello_World.html Implementing the Goodstein Function in &lambda;-Calculus /entries/Goodstein_Lambda.html Fri, 21 Feb 2020 00:00:00 +0000 /entries/Goodstein_Lambda.html A Generic Framework for Verified Compilers /entries/VeriComp.html Mon, 10 Feb 2020 00:00:00 +0000 /entries/VeriComp.html Arithmetic progressions and relative primes /entries/Arith_Prog_Rel_Primes.html Sat, 01 Feb 2020 00:00:00 +0000 /entries/Arith_Prog_Rel_Primes.html A Hierarchy of Algebras for Boolean Subsets /entries/Subset_Boolean_Algebras.html Fri, 31 Jan 2020 00:00:00 +0000 /entries/Subset_Boolean_Algebras.html Mersenne primes and the Lucas–Lehmer test /entries/Mersenne_Primes.html Fri, 17 Jan 2020 00:00:00 +0000 /entries/Mersenne_Primes.html Verified Approximation Algorithms /entries/Approximation_Algorithms.html Thu, 16 Jan 2020 00:00:00 +0000 /entries/Approximation_Algorithms.html Closest Pair of Points Algorithms /entries/Closest_Pair_Points.html Mon, 13 Jan 2020 00:00:00 +0000 /entries/Closest_Pair_Points.html Skip Lists /entries/Skip_Lists.html Thu, 09 Jan 2020 00:00:00 +0000 /entries/Skip_Lists.html Bicategories /entries/Bicategory.html Mon, 06 Jan 2020 00:00:00 +0000 /entries/Bicategory.html The Irrationality of ζ(3) /entries/Zeta_3_Irrational.html Fri, 27 Dec 2019 00:00:00 +0000 /entries/Zeta_3_Irrational.html Formalizing a Seligman-Style Tableau System for Hybrid Logic /entries/Hybrid_Logic.html Fri, 20 Dec 2019 00:00:00 +0000 /entries/Hybrid_Logic.html The Poincaré-Bendixson Theorem /entries/Poincare_Bendixson.html Wed, 18 Dec 2019 00:00:00 +0000 /entries/Poincare_Bendixson.html Complex Geometry /entries/Complex_Geometry.html Mon, 16 Dec 2019 00:00:00 +0000 /entries/Complex_Geometry.html Poincaré Disc Model /entries/Poincare_Disc.html Mon, 16 Dec 2019 00:00:00 +0000 /entries/Poincare_Disc.html Gauss Sums and the Pólya–Vinogradov Inequality /entries/Gauss_Sums.html Tue, 10 Dec 2019 00:00:00 +0000 /entries/Gauss_Sums.html An Efficient Generalization of Counting Sort for Large, possibly Infinite Key Ranges /entries/Generalized_Counting_Sort.html Wed, 04 Dec 2019 00:00:00 +0000 /entries/Generalized_Counting_Sort.html Interval Arithmetic on 32-bit Words /entries/Interval_Arithmetic_Word32.html Wed, 27 Nov 2019 00:00:00 +0000 /entries/Interval_Arithmetic_Word32.html Zermelo Fraenkel Set Theory in Higher-Order Logic /entries/ZFC_in_HOL.html Thu, 24 Oct 2019 00:00:00 +0000 /entries/ZFC_in_HOL.html Isabelle/C /entries/Isabelle_C.html Tue, 22 Oct 2019 00:00:00 +0000 /entries/Isabelle_C.html VerifyThis 2019 -- Polished Isabelle Solutions /entries/VerifyThis2019.html Wed, 16 Oct 2019 00:00:00 +0000 /entries/VerifyThis2019.html Aristotle's Assertoric Syllogistic /entries/Aristotles_Assertoric_Syllogistic.html Tue, 08 Oct 2019 00:00:00 +0000 /entries/Aristotles_Assertoric_Syllogistic.html Sigma Protocols and Commitment Schemes /entries/Sigma_Commit_Crypto.html Mon, 07 Oct 2019 00:00:00 +0000 /entries/Sigma_Commit_Crypto.html Clean - An Abstract Imperative Programming Language and its Theory /entries/Clean.html Fri, 04 Oct 2019 00:00:00 +0000 /entries/Clean.html Formalization of Multiway-Join Algorithms /entries/Generic_Join.html Mon, 16 Sep 2019 00:00:00 +0000 /entries/Generic_Join.html Verification Components for Hybrid Systems /entries/Hybrid_Systems_VCs.html Tue, 10 Sep 2019 00:00:00 +0000 /entries/Hybrid_Systems_VCs.html Fourier Series /entries/Fourier.html Fri, 06 Sep 2019 00:00:00 +0000 /entries/Fourier.html A Case Study in Basic Algebra /entries/Jacobson_Basic_Algebra.html Fri, 30 Aug 2019 00:00:00 +0000 /entries/Jacobson_Basic_Algebra.html Formalisation of an Adaptive State Counting Algorithm /entries/Adaptive_State_Counting.html Fri, 16 Aug 2019 00:00:00 +0000 /entries/Adaptive_State_Counting.html Laplace Transform /entries/Laplace_Transform.html Wed, 14 Aug 2019 00:00:00 +0000 /entries/Laplace_Transform.html Communicating Concurrent Kleene Algebra for Distributed Systems Specification /entries/C2KA_DistributedSystems.html Tue, 06 Aug 2019 00:00:00 +0000 /entries/C2KA_DistributedSystems.html Linear Programming /entries/Linear_Programming.html Tue, 06 Aug 2019 00:00:00 +0000 /entries/Linear_Programming.html Selected Problems from the International Mathematical Olympiad 2019 /entries/IMO2019.html Mon, 05 Aug 2019 00:00:00 +0000 /entries/IMO2019.html Stellar Quorum Systems /entries/Stellar_Quorums.html Thu, 01 Aug 2019 00:00:00 +0000 /entries/Stellar_Quorums.html A Formal Development of a Polychronous Polytimed Coordination Language /entries/TESL_Language.html Tue, 30 Jul 2019 00:00:00 +0000 /entries/TESL_Language.html Order Extension and Szpilrajn's Extension Theorem /entries/Szpilrajn.html Sat, 27 Jul 2019 00:00:00 +0000 /entries/Szpilrajn.html A Sequent Calculus for First-Order Logic /entries/FOL_Seq_Calc1.html Thu, 18 Jul 2019 00:00:00 +0000 /entries/FOL_Seq_Calc1.html A Verified Code Generator from Isabelle/HOL to CakeML /entries/CakeML_Codegen.html Mon, 08 Jul 2019 00:00:00 +0000 /entries/CakeML_Codegen.html Formalization of a Monitoring Algorithm for Metric First-Order Temporal Logic /entries/MFOTL_Monitor.html Thu, 04 Jul 2019 00:00:00 +0000 /entries/MFOTL_Monitor.html Complete Non-Orders and Fixed Points /entries/Complete_Non_Orders.html Thu, 27 Jun 2019 00:00:00 +0000 /entries/Complete_Non_Orders.html Priority Search Trees /entries/Priority_Search_Trees.html Tue, 25 Jun 2019 00:00:00 +0000 /entries/Priority_Search_Trees.html Purely Functional, Simple, and Efficient Implementation of Prim and Dijkstra /entries/Prim_Dijkstra_Simple.html Tue, 25 Jun 2019 00:00:00 +0000 /entries/Prim_Dijkstra_Simple.html Linear Inequalities /entries/Linear_Inequalities.html Fri, 21 Jun 2019 00:00:00 +0000 /entries/Linear_Inequalities.html Hilbert's Nullstellensatz /entries/Nullstellensatz.html Sun, 16 Jun 2019 00:00:00 +0000 /entries/Nullstellensatz.html Gröbner Bases, Macaulay Matrices and Dubé's Degree Bounds /entries/Groebner_Macaulay.html Sat, 15 Jun 2019 00:00:00 +0000 /entries/Groebner_Macaulay.html Binary Heaps for IMP2 /entries/IMP2_Binary_Heap.html Thu, 13 Jun 2019 00:00:00 +0000 /entries/IMP2_Binary_Heap.html Differential Game Logic /entries/Differential_Game_Logic.html Mon, 03 Jun 2019 00:00:00 +0000 /entries/Differential_Game_Logic.html Multidimensional Binary Search Trees /entries/KD_Tree.html Thu, 30 May 2019 00:00:00 +0000 /entries/KD_Tree.html Formalization of Generic Authenticated Data Structures /entries/LambdaAuth.html Tue, 14 May 2019 00:00:00 +0000 /entries/LambdaAuth.html Multi-Party Computation /entries/Multi_Party_Computation.html Thu, 09 May 2019 00:00:00 +0000 /entries/Multi_Party_Computation.html HOL-CSP Version 2.0 /entries/HOL-CSP.html Fri, 26 Apr 2019 00:00:00 +0000 /entries/HOL-CSP.html A Compositional and Unified Translation of LTL into ω-Automata /entries/LTL_Master_Theorem.html Tue, 16 Apr 2019 00:00:00 +0000 /entries/LTL_Master_Theorem.html A General Theory of Syntax with Bindings /entries/Binding_Syntax_Theory.html Sat, 06 Apr 2019 00:00:00 +0000 /entries/Binding_Syntax_Theory.html The Transcendence of Certain Infinite Series /entries/Transcendence_Series_Hancl_Rucki.html Wed, 27 Mar 2019 00:00:00 +0000 /entries/Transcendence_Series_Hancl_Rucki.html Quantum Hoare Logic /entries/QHLProver.html Sun, 24 Mar 2019 00:00:00 +0000 /entries/QHLProver.html Safe OCL /entries/Safe_OCL.html Sat, 09 Mar 2019 00:00:00 +0000 /entries/Safe_OCL.html Elementary Facts About the Distribution of Primes /entries/Prime_Distribution_Elementary.html Thu, 21 Feb 2019 00:00:00 +0000 /entries/Prime_Distribution_Elementary.html Kruskal's Algorithm for Minimum Spanning Forest /entries/Kruskal.html Thu, 14 Feb 2019 00:00:00 +0000 /entries/Kruskal.html Probabilistic Primality Testing /entries/Probabilistic_Prime_Tests.html Mon, 11 Feb 2019 00:00:00 +0000 /entries/Probabilistic_Prime_Tests.html Universal Turing Machine /entries/Universal_Turing_Machine.html Fri, 08 Feb 2019 00:00:00 +0000 /entries/Universal_Turing_Machine.html Isabelle/UTP: Mechanised Theory Engineering for Unifying Theories of Programming /entries/UTP.html Fri, 01 Feb 2019 00:00:00 +0000 /entries/UTP.html The Inversions of a List /entries/List_Inversions.html Fri, 01 Feb 2019 00:00:00 +0000 /entries/List_Inversions.html Farkas' Lemma and Motzkin's Transposition Theorem /entries/Farkas.html Thu, 17 Jan 2019 00:00:00 +0000 /entries/Farkas.html An Algebra for Higher-Order Terms /entries/Higher_Order_Terms.html Tue, 15 Jan 2019 00:00:00 +0000 /entries/Higher_Order_Terms.html IMP2 – Simple Program Verification in Isabelle/HOL /entries/IMP2.html Tue, 15 Jan 2019 00:00:00 +0000 /entries/IMP2.html A Reduction Theorem for Store Buffers /entries/Store_Buffer_Reduction.html Mon, 07 Jan 2019 00:00:00 +0000 /entries/Store_Buffer_Reduction.html A Formal Model of the Document Object Model /entries/Core_DOM.html Wed, 26 Dec 2018 00:00:00 +0000 /entries/Core_DOM.html Formalization of Concurrent Revisions /entries/Concurrent_Revisions.html Tue, 25 Dec 2018 00:00:00 +0000 /entries/Concurrent_Revisions.html Verifying Imperative Programs using Auto2 /entries/Auto2_Imperative_HOL.html Fri, 21 Dec 2018 00:00:00 +0000 /entries/Auto2_Imperative_HOL.html Constructive Cryptography in HOL /entries/Constructive_Cryptography.html Mon, 17 Dec 2018 00:00:00 +0000 /entries/Constructive_Cryptography.html Properties of Orderings and Lattices /entries/Order_Lattice_Props.html Tue, 11 Dec 2018 00:00:00 +0000 /entries/Order_Lattice_Props.html Quantales /entries/Quantales.html Tue, 11 Dec 2018 00:00:00 +0000 /entries/Quantales.html Transformer Semantics /entries/Transformer_Semantics.html Tue, 11 Dec 2018 00:00:00 +0000 /entries/Transformer_Semantics.html A Verified Functional Implementation of Bachmair and Ganzinger's Ordered Resolution Prover /entries/Functional_Ordered_Resolution_Prover.html Fri, 23 Nov 2018 00:00:00 +0000 /entries/Functional_Ordered_Resolution_Prover.html Graph Saturation /entries/Graph_Saturation.html Fri, 23 Nov 2018 00:00:00 +0000 /entries/Graph_Saturation.html Auto2 Prover /entries/Auto2_HOL.html Tue, 20 Nov 2018 00:00:00 +0000 /entries/Auto2_HOL.html Matroids /entries/Matroids.html Fri, 16 Nov 2018 00:00:00 +0000 /entries/Matroids.html Deriving generic class instances for datatypes /entries/Generic_Deriving.html Tue, 06 Nov 2018 00:00:00 +0000 /entries/Generic_Deriving.html Formalisation and Evaluation of Alan Gewirth's Proof for the Principle of Generic Consistency in Isabelle/HOL /entries/GewirthPGCProof.html Tue, 30 Oct 2018 00:00:00 +0000 /entries/GewirthPGCProof.html Epistemic Logic: Completeness of Modal Logics /entries/Epistemic_Logic.html Mon, 29 Oct 2018 00:00:00 +0000 /entries/Epistemic_Logic.html Smooth Manifolds /entries/Smooth_Manifolds.html Mon, 22 Oct 2018 00:00:00 +0000 /entries/Smooth_Manifolds.html Formalization of the Embedding Path Order for Lambda-Free Higher-Order Terms /entries/Lambda_Free_EPO.html Fri, 19 Oct 2018 00:00:00 +0000 /entries/Lambda_Free_EPO.html Randomised Binary Search Trees /entries/Randomised_BSTs.html Fri, 19 Oct 2018 00:00:00 +0000 /entries/Randomised_BSTs.html Upper Bounding Diameters of State Spaces of Factored Transition Systems /entries/Factored_Transition_System_Bounding.html Fri, 12 Oct 2018 00:00:00 +0000 /entries/Factored_Transition_System_Bounding.html The Transcendence of π /entries/Pi_Transcendental.html Fri, 28 Sep 2018 00:00:00 +0000 /entries/Pi_Transcendental.html Symmetric Polynomials /entries/Symmetric_Polynomials.html Tue, 25 Sep 2018 00:00:00 +0000 /entries/Symmetric_Polynomials.html Signature-Based Gröbner Basis Algorithms /entries/Signature_Groebner.html Thu, 20 Sep 2018 00:00:00 +0000 /entries/Signature_Groebner.html The Prime Number Theorem /entries/Prime_Number_Theorem.html Wed, 19 Sep 2018 00:00:00 +0000 /entries/Prime_Number_Theorem.html Aggregation Algebras /entries/Aggregation_Algebras.html Sat, 15 Sep 2018 00:00:00 +0000 /entries/Aggregation_Algebras.html Octonions /entries/Octonions.html Fri, 14 Sep 2018 00:00:00 +0000 /entries/Octonions.html Quaternions /entries/Quaternions.html Wed, 05 Sep 2018 00:00:00 +0000 /entries/Quaternions.html The Budan–Fourier Theorem and Counting Real Roots with Multiplicity /entries/Budan_Fourier.html Sun, 02 Sep 2018 00:00:00 +0000 /entries/Budan_Fourier.html An Incremental Simplex Algorithm with Unsatisfiable Core Generation /entries/Simplex.html Fri, 24 Aug 2018 00:00:00 +0000 /entries/Simplex.html Minsky Machines /entries/Minsky_Machines.html Tue, 14 Aug 2018 00:00:00 +0000 /entries/Minsky_Machines.html Pricing in discrete financial models /entries/DiscretePricing.html Mon, 16 Jul 2018 00:00:00 +0000 /entries/DiscretePricing.html Von-Neumann-Morgenstern Utility Theorem /entries/Neumann_Morgenstern_Utility.html Wed, 04 Jul 2018 00:00:00 +0000 /entries/Neumann_Morgenstern_Utility.html Pell's Equation /entries/Pell.html Sat, 23 Jun 2018 00:00:00 +0000 /entries/Pell.html Projective Geometry /entries/Projective_Geometry.html Thu, 14 Jun 2018 00:00:00 +0000 /entries/Projective_Geometry.html The Localization of a Commutative Ring /entries/Localization_Ring.html Thu, 14 Jun 2018 00:00:00 +0000 /entries/Localization_Ring.html Partial Order Reduction /entries/Partial_Order_Reduction.html Tue, 05 Jun 2018 00:00:00 +0000 /entries/Partial_Order_Reduction.html Optimal Binary Search Trees /entries/Optimal_BST.html Sun, 27 May 2018 00:00:00 +0000 /entries/Optimal_BST.html Hidden Markov Models /entries/Hidden_Markov_Models.html Fri, 25 May 2018 00:00:00 +0000 /entries/Hidden_Markov_Models.html Probabilistic Timed Automata /entries/Probabilistic_Timed_Automata.html Thu, 24 May 2018 00:00:00 +0000 /entries/Probabilistic_Timed_Automata.html Axiom Systems for Category Theory in Free Logic /entries/AxiomaticCategoryTheory.html Wed, 23 May 2018 00:00:00 +0000 /entries/AxiomaticCategoryTheory.html Irrational Rapidly Convergent Series /entries/Irrationality_J_Hancl.html Wed, 23 May 2018 00:00:00 +0000 /entries/Irrationality_J_Hancl.html Monadification, Memoization and Dynamic Programming /entries/Monad_Memo_DP.html Tue, 22 May 2018 00:00:00 +0000 /entries/Monad_Memo_DP.html OpSets: Sequential Specifications for Replicated Datatypes /entries/OpSets.html Thu, 10 May 2018 00:00:00 +0000 /entries/OpSets.html An Isabelle/HOL Formalization of the Modular Assembly Kit for Security Properties /entries/Modular_Assembly_Kit_Security.html Mon, 07 May 2018 00:00:00 +0000 /entries/Modular_Assembly_Kit_Security.html WebAssembly /entries/WebAssembly.html Sun, 29 Apr 2018 00:00:00 +0000 /entries/WebAssembly.html VerifyThis 2018 - Polished Isabelle Solutions /entries/VerifyThis2018.html Fri, 27 Apr 2018 00:00:00 +0000 /entries/VerifyThis2018.html Bounded Natural Functors with Covariance and Contravariance /entries/BNF_CC.html Tue, 24 Apr 2018 00:00:00 +0000 /entries/BNF_CC.html The Incompatibility of Fishburn-Strategyproofness and Pareto-Efficiency /entries/Fishburn_Impossibility.html Thu, 22 Mar 2018 00:00:00 +0000 /entries/Fishburn_Impossibility.html Weight-Balanced Trees /entries/Weight_Balanced_Trees.html Tue, 13 Mar 2018 00:00:00 +0000 /entries/Weight_Balanced_Trees.html CakeML /entries/CakeML.html Mon, 12 Mar 2018 00:00:00 +0000 /entries/CakeML.html A Theory of Architectural Design Patterns /entries/Architectural_Design_Patterns.html Thu, 01 Mar 2018 00:00:00 +0000 /entries/Architectural_Design_Patterns.html Hoare Logics for Time Bounds /entries/Hoare_Time.html Mon, 26 Feb 2018 00:00:00 +0000 /entries/Hoare_Time.html A verified factorization algorithm for integer polynomials with polynomial complexity /entries/LLL_Factorization.html Tue, 06 Feb 2018 00:00:00 +0000 /entries/LLL_Factorization.html First-Order Terms /entries/First_Order_Terms.html Tue, 06 Feb 2018 00:00:00 +0000 /entries/First_Order_Terms.html The Error Function /entries/Error_Function.html Tue, 06 Feb 2018 00:00:00 +0000 /entries/Error_Function.html Treaps /entries/Treaps.html Tue, 06 Feb 2018 00:00:00 +0000 /entries/Treaps.html A verified LLL algorithm /entries/LLL_Basis_Reduction.html Fri, 02 Feb 2018 00:00:00 +0000 /entries/LLL_Basis_Reduction.html Formalization of Bachmair and Ganzinger's Ordered Resolution Prover /entries/Ordered_Resolution_Prover.html Thu, 18 Jan 2018 00:00:00 +0000 /entries/Ordered_Resolution_Prover.html Gromov Hyperbolicity /entries/Gromov_Hyperbolicity.html Tue, 16 Jan 2018 00:00:00 +0000 /entries/Gromov_Hyperbolicity.html An Isabelle/HOL formalisation of Green's Theorem /entries/Green.html Thu, 11 Jan 2018 00:00:00 +0000 /entries/Green.html Taylor Models /entries/Taylor_Models.html Mon, 08 Jan 2018 00:00:00 +0000 /entries/Taylor_Models.html The Falling Factorial of a Sum /entries/Falling_Factorial_Sum.html Fri, 22 Dec 2017 00:00:00 +0000 /entries/Falling_Factorial_Sum.html Dirichlet L-Functions and Dirichlet's Theorem /entries/Dirichlet_L.html Thu, 21 Dec 2017 00:00:00 +0000 /entries/Dirichlet_L.html The Mason–Stothers Theorem /entries/Mason_Stothers.html Thu, 21 Dec 2017 00:00:00 +0000 /entries/Mason_Stothers.html The Median-of-Medians Selection Algorithm /entries/Median_Of_Medians_Selection.html Thu, 21 Dec 2017 00:00:00 +0000 /entries/Median_Of_Medians_Selection.html Operations on Bounded Natural Functors /entries/BNF_Operations.html Tue, 19 Dec 2017 00:00:00 +0000 /entries/BNF_Operations.html The string search algorithm by Knuth, Morris and Pratt /entries/Knuth_Morris_Pratt.html Mon, 18 Dec 2017 00:00:00 +0000 /entries/Knuth_Morris_Pratt.html Stochastic Matrices and the Perron-Frobenius Theorem /entries/Stochastic_Matrices.html Wed, 22 Nov 2017 00:00:00 +0000 /entries/Stochastic_Matrices.html The IMAP CmRDT /entries/IMAP-CRDT.html Thu, 09 Nov 2017 00:00:00 +0000 /entries/IMAP-CRDT.html Hybrid Multi-Lane Spatial Logic /entries/Hybrid_Multi_Lane_Spatial_Logic.html Mon, 06 Nov 2017 00:00:00 +0000 /entries/Hybrid_Multi_Lane_Spatial_Logic.html The Kuratowski Closure-Complement Theorem /entries/Kuratowski_Closure_Complement.html Thu, 26 Oct 2017 00:00:00 +0000 /entries/Kuratowski_Closure_Complement.html Büchi Complementation /entries/Buchi_Complementation.html Thu, 19 Oct 2017 00:00:00 +0000 /entries/Buchi_Complementation.html Transition Systems and Automata /entries/Transition_Systems_and_Automata.html Thu, 19 Oct 2017 00:00:00 +0000 /entries/Transition_Systems_and_Automata.html Count the Number of Complex Roots /entries/Count_Complex_Roots.html Tue, 17 Oct 2017 00:00:00 +0000 /entries/Count_Complex_Roots.html Evaluate Winding Numbers through Cauchy Indices /entries/Winding_Number_Eval.html Tue, 17 Oct 2017 00:00:00 +0000 /entries/Winding_Number_Eval.html Homogeneous Linear Diophantine Equations /entries/Diophantine_Eqns_Lin_Hom.html Sat, 14 Oct 2017 00:00:00 +0000 /entries/Diophantine_Eqns_Lin_Hom.html Dirichlet Series /entries/Dirichlet_Series.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Dirichlet_Series.html Linear Recurrences /entries/Linear_Recurrences.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Linear_Recurrences.html The Hurwitz and Riemann ζ Functions /entries/Zeta_Function.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Zeta_Function.html Computer-assisted Reconstruction and Assessment of E. J. Lowe's Modal Ontological Argument /entries/Lowe_Ontological_Argument.html Thu, 21 Sep 2017 00:00:00 +0000 /entries/Lowe_Ontological_Argument.html Representation and Partial Automation of the Principia Logico-Metaphysica in Isabelle/HOL /entries/PLM.html Sun, 17 Sep 2017 00:00:00 +0000 /entries/PLM.html Anselm's God in Isabelle/HOL /entries/AnselmGod.html Wed, 06 Sep 2017 00:00:00 +0000 /entries/AnselmGod.html Microeconomics and the First Welfare Theorem /entries/First_Welfare_Theorem.html Fri, 01 Sep 2017 00:00:00 +0000 /entries/First_Welfare_Theorem.html Orbit-Stabiliser Theorem with Application to Rotational Symmetries /entries/Orbit_Stabiliser.html Sun, 20 Aug 2017 00:00:00 +0000 /entries/Orbit_Stabiliser.html Root-Balanced Tree /entries/Root_Balanced_Tree.html Sun, 20 Aug 2017 00:00:00 +0000 /entries/Root_Balanced_Tree.html The LambdaMu-calculus /entries/LambdaMu.html Wed, 16 Aug 2017 00:00:00 +0000 /entries/LambdaMu.html Stewart's Theorem and Apollonius' Theorem /entries/Stewart_Apollonius.html Mon, 31 Jul 2017 00:00:00 +0000 /entries/Stewart_Apollonius.html Dynamic Architectures /entries/DynamicArchitectures.html Fri, 28 Jul 2017 00:00:00 +0000 /entries/DynamicArchitectures.html Declarative Semantics for Functional Languages /entries/Decl_Sem_Fun_PL.html Fri, 21 Jul 2017 00:00:00 +0000 /entries/Decl_Sem_Fun_PL.html HOLCF-Prelude /entries/HOLCF-Prelude.html Sat, 15 Jul 2017 00:00:00 +0000 /entries/HOLCF-Prelude.html Minkowski's Theorem /entries/Minkowskis_Theorem.html Thu, 13 Jul 2017 00:00:00 +0000 /entries/Minkowskis_Theorem.html Verified Metatheory and Type Inference for a Name-Carrying Simply-Typed Lambda Calculus /entries/Name_Carrying_Type_Inference.html Sun, 09 Jul 2017 00:00:00 +0000 /entries/Name_Carrying_Type_Inference.html A framework for establishing Strong Eventual Consistency for Conflict-free Replicated Datatypes /entries/CRDT.html Fri, 07 Jul 2017 00:00:00 +0000 /entries/CRDT.html Stone-Kleene Relation Algebras /entries/Stone_Kleene_Relation_Algebras.html Thu, 06 Jul 2017 00:00:00 +0000 /entries/Stone_Kleene_Relation_Algebras.html Propositional Proof Systems /entries/Propositional_Proof_Systems.html Wed, 21 Jun 2017 00:00:00 +0000 /entries/Propositional_Proof_Systems.html Partial Semigroups and Convolution Algebras /entries/PSemigroupsConvolution.html Tue, 13 Jun 2017 00:00:00 +0000 /entries/PSemigroupsConvolution.html Buffon's Needle Problem /entries/Buffons_Needle.html Tue, 06 Jun 2017 00:00:00 +0000 /entries/Buffons_Needle.html Flow Networks and the Min-Cut-Max-Flow Theorem /entries/Flow_Networks.html Thu, 01 Jun 2017 00:00:00 +0000 /entries/Flow_Networks.html Formalizing Push-Relabel Algorithms /entries/Prpu_Maxflow.html Thu, 01 Jun 2017 00:00:00 +0000 /entries/Prpu_Maxflow.html Optics /entries/Optics.html Thu, 25 May 2017 00:00:00 +0000 /entries/Optics.html Developing Security Protocols by Refinement /entries/Security_Protocol_Refinement.html Wed, 24 May 2017 00:00:00 +0000 /entries/Security_Protocol_Refinement.html Dictionary Construction /entries/Dict_Construction.html Wed, 24 May 2017 00:00:00 +0000 /entries/Dict_Construction.html The Floyd-Warshall Algorithm for Shortest Paths /entries/Floyd_Warshall.html Mon, 08 May 2017 00:00:00 +0000 /entries/Floyd_Warshall.html CryptHOL /entries/CryptHOL.html Fri, 05 May 2017 00:00:00 +0000 /entries/CryptHOL.html Effect polymorphism in higher-order logic /entries/Monomorphic_Monad.html Fri, 05 May 2017 00:00:00 +0000 /entries/Monomorphic_Monad.html Game-based cryptography in HOL /entries/Game_Based_Crypto.html Fri, 05 May 2017 00:00:00 +0000 /entries/Game_Based_Crypto.html Monad normalisation /entries/Monad_Normalisation.html Fri, 05 May 2017 00:00:00 +0000 /entries/Monad_Normalisation.html Probabilistic while loop /entries/Probabilistic_While.html Fri, 05 May 2017 00:00:00 +0000 /entries/Probabilistic_While.html Monoidal Categories /entries/MonoidalCategory.html Thu, 04 May 2017 00:00:00 +0000 /entries/MonoidalCategory.html Types, Tableaus and Gödel’s God in Isabelle/HOL /entries/Types_Tableaus_and_Goedels_God.html Mon, 01 May 2017 00:00:00 +0000 /entries/Types_Tableaus_and_Goedels_God.html Local Lexing /entries/LocalLexing.html Fri, 28 Apr 2017 00:00:00 +0000 /entries/LocalLexing.html Constructor Functions /entries/Constructor_Funs.html Wed, 19 Apr 2017 00:00:00 +0000 /entries/Constructor_Funs.html Lazifying case constants /entries/Lazy_Case.html Tue, 18 Apr 2017 00:00:00 +0000 /entries/Lazy_Case.html Subresultants /entries/Subresultants.html Thu, 06 Apr 2017 00:00:00 +0000 /entries/Subresultants.html Expected Shape of Random Binary Search Trees /entries/Random_BSTs.html Tue, 04 Apr 2017 00:00:00 +0000 /entries/Random_BSTs.html Lower bound on comparison-based sorting algorithms /entries/Comparison_Sort_Lower_Bound.html Wed, 15 Mar 2017 00:00:00 +0000 /entries/Comparison_Sort_Lower_Bound.html The number of comparisons in QuickSort /entries/Quick_Sort_Cost.html Wed, 15 Mar 2017 00:00:00 +0000 /entries/Quick_Sort_Cost.html The Euler–MacLaurin Formula /entries/Euler_MacLaurin.html Fri, 10 Mar 2017 00:00:00 +0000 /entries/Euler_MacLaurin.html The Group Law for Elliptic Curves /entries/Elliptic_Curves_Group_Law.html Tue, 28 Feb 2017 00:00:00 +0000 /entries/Elliptic_Curves_Group_Law.html Menger's Theorem /entries/Menger.html Sun, 26 Feb 2017 00:00:00 +0000 /entries/Menger.html Differential Dynamic Logic /entries/Differential_Dynamic_Logic.html Mon, 13 Feb 2017 00:00:00 +0000 /entries/Differential_Dynamic_Logic.html Abstract Soundness /entries/Abstract_Soundness.html Fri, 10 Feb 2017 00:00:00 +0000 /entries/Abstract_Soundness.html Stone Relation Algebras /entries/Stone_Relation_Algebras.html Tue, 07 Feb 2017 00:00:00 +0000 /entries/Stone_Relation_Algebras.html Refining Authenticated Key Agreement with Strong Adversaries /entries/Key_Agreement_Strong_Adversaries.html Tue, 31 Jan 2017 00:00:00 +0000 /entries/Key_Agreement_Strong_Adversaries.html Bernoulli Numbers /entries/Bernoulli.html Tue, 24 Jan 2017 00:00:00 +0000 /entries/Bernoulli.html Bertrand's postulate /entries/Bertrands_Postulate.html Tue, 17 Jan 2017 00:00:00 +0000 /entries/Bertrands_Postulate.html Minimal Static Single Assignment Form /entries/Minimal_SSA.html Tue, 17 Jan 2017 00:00:00 +0000 /entries/Minimal_SSA.html The Transcendence of e /entries/E_Transcendental.html Thu, 12 Jan 2017 00:00:00 +0000 /entries/E_Transcendental.html Formal Network Models and Their Application to Firewall Policies /entries/UPF_Firewall.html Sun, 08 Jan 2017 00:00:00 +0000 /entries/UPF_Firewall.html Verification of a Diffie-Hellman Password-based Authentication Protocol by Extending the Inductive Method /entries/Password_Authentication_Protocol.html Tue, 03 Jan 2017 00:00:00 +0000 /entries/Password_Authentication_Protocol.html First-Order Logic According to Harrison /entries/FOL_Harrison.html Sun, 01 Jan 2017 00:00:00 +0000 /entries/FOL_Harrison.html Concurrent Refinement Algebra and Rely Quotients /entries/Concurrent_Ref_Alg.html Fri, 30 Dec 2016 00:00:00 +0000 /entries/Concurrent_Ref_Alg.html The Twelvefold Way /entries/Twelvefold_Way.html Thu, 29 Dec 2016 00:00:00 +0000 /entries/Twelvefold_Way.html Proof Strategy Language /entries/Proof_Strategy_Language.html Tue, 20 Dec 2016 00:00:00 +0000 /entries/Proof_Strategy_Language.html Paraconsistency /entries/Paraconsistency.html Wed, 07 Dec 2016 00:00:00 +0000 /entries/Paraconsistency.html COMPLX: A Verification Framework for Concurrent Imperative Programs /entries/Complx.html Tue, 29 Nov 2016 00:00:00 +0000 /entries/Complx.html Abstract Interpretation of Annotated Commands /entries/Abs_Int_ITP2012.html Wed, 23 Nov 2016 00:00:00 +0000 /entries/Abs_Int_ITP2012.html Separata: Isabelle tactics for Separation Algebra /entries/Separata.html Wed, 16 Nov 2016 00:00:00 +0000 /entries/Separata.html Formalization of Knuth–Bendix Orders for Lambda-Free Higher-Order Terms /entries/Lambda_Free_KBOs.html Sat, 12 Nov 2016 00:00:00 +0000 /entries/Lambda_Free_KBOs.html Formalization of Nested Multisets, Hereditary Multisets, and Syntactic Ordinals /entries/Nested_Multisets_Ordinals.html Sat, 12 Nov 2016 00:00:00 +0000 /entries/Nested_Multisets_Ordinals.html Expressiveness of Deep Learning /entries/Deep_Learning.html Thu, 10 Nov 2016 00:00:00 +0000 /entries/Deep_Learning.html Modal Logics for Nominal Transition Systems /entries/Modal_Logics_for_NTS.html Tue, 25 Oct 2016 00:00:00 +0000 /entries/Modal_Logics_for_NTS.html Stable Matching /entries/Stable_Matching.html Mon, 24 Oct 2016 00:00:00 +0000 /entries/Stable_Matching.html LOFT — Verified Migration of Linux Firewalls to SDN /entries/LOFT.html Fri, 21 Oct 2016 00:00:00 +0000 /entries/LOFT.html A formal model for the SPARCv8 ISA and a proof of non-interference for the LEON3 processor /entries/SPARCv8.html Wed, 19 Oct 2016 00:00:00 +0000 /entries/SPARCv8.html Source Coding Theorem /entries/Source_Coding_Theorem.html Wed, 19 Oct 2016 00:00:00 +0000 /entries/Source_Coding_Theorem.html The Factorization Algorithm of Berlekamp and Zassenhaus /entries/Berlekamp_Zassenhaus.html Fri, 14 Oct 2016 00:00:00 +0000 /entries/Berlekamp_Zassenhaus.html Intersecting Chords Theorem /entries/Chord_Segments.html Tue, 11 Oct 2016 00:00:00 +0000 /entries/Chord_Segments.html Lp spaces /entries/Lp.html Wed, 05 Oct 2016 00:00:00 +0000 /entries/Lp.html Fisher–Yates shuffle /entries/Fisher_Yates.html Fri, 30 Sep 2016 00:00:00 +0000 /entries/Fisher_Yates.html Allen's Interval Calculus /entries/Allen_Calculus.html Thu, 29 Sep 2016 00:00:00 +0000 /entries/Allen_Calculus.html Formalization of Recursive Path Orders for Lambda-Free Higher-Order Terms /entries/Lambda_Free_RPOs.html Fri, 23 Sep 2016 00:00:00 +0000 /entries/Lambda_Free_RPOs.html Iptables Semantics /entries/Iptables_Semantics.html Fri, 09 Sep 2016 00:00:00 +0000 /entries/Iptables_Semantics.html A Variant of the Superposition Calculus /entries/SuperCalc.html Tue, 06 Sep 2016 00:00:00 +0000 /entries/SuperCalc.html Stone Algebras /entries/Stone_Algebras.html Tue, 06 Sep 2016 00:00:00 +0000 /entries/Stone_Algebras.html Stirling's formula /entries/Stirling_Formula.html Thu, 01 Sep 2016 00:00:00 +0000 /entries/Stirling_Formula.html Routing /entries/Routing.html Wed, 31 Aug 2016 00:00:00 +0000 /entries/Routing.html Simple Firewall /entries/Simple_Firewall.html Wed, 24 Aug 2016 00:00:00 +0000 /entries/Simple_Firewall.html Infeasible Paths Elimination by Symbolic Execution Techniques: Proof of Correctness and Preservation of Paths /entries/InfPathElimination.html Thu, 18 Aug 2016 00:00:00 +0000 /entries/InfPathElimination.html Formalizing the Edmonds-Karp Algorithm /entries/EdmondsKarp_Maxflow.html Fri, 12 Aug 2016 00:00:00 +0000 /entries/EdmondsKarp_Maxflow.html The Imperative Refinement Framework /entries/Refine_Imperative_HOL.html Mon, 08 Aug 2016 00:00:00 +0000 /entries/Refine_Imperative_HOL.html Ptolemy's Theorem /entries/Ptolemys_Theorem.html Sun, 07 Aug 2016 00:00:00 +0000 /entries/Ptolemys_Theorem.html Surprise Paradox /entries/Surprise_Paradox.html Sun, 17 Jul 2016 00:00:00 +0000 /entries/Surprise_Paradox.html Pairing Heap /entries/Pairing_Heap.html Thu, 14 Jul 2016 00:00:00 +0000 /entries/Pairing_Heap.html A Framework for Verifying Depth-First Search Algorithms /entries/DFS_Framework.html Tue, 05 Jul 2016 00:00:00 +0000 /entries/DFS_Framework.html Chamber Complexes, Coxeter Systems, and Buildings /entries/Buildings.html Fri, 01 Jul 2016 00:00:00 +0000 /entries/Buildings.html The Resolution Calculus for First-Order Logic /entries/Resolution_FOL.html Thu, 30 Jun 2016 00:00:00 +0000 /entries/Resolution_FOL.html The Z Property /entries/Rewriting_Z.html Thu, 30 Jun 2016 00:00:00 +0000 /entries/Rewriting_Z.html Compositional Security-Preserving Refinement for Concurrent Imperative Programs /entries/Dependent_SIFUM_Refinement.html Tue, 28 Jun 2016 00:00:00 +0000 /entries/Dependent_SIFUM_Refinement.html IP Addresses /entries/IP_Addresses.html Tue, 28 Jun 2016 00:00:00 +0000 /entries/IP_Addresses.html Cardinality of Multisets /entries/Card_Multisets.html Sun, 26 Jun 2016 00:00:00 +0000 /entries/Card_Multisets.html Category Theory with Adjunctions and Limits /entries/Category3.html Sun, 26 Jun 2016 00:00:00 +0000 /entries/Category3.html A Dependent Security Type System for Concurrent Imperative Programs /entries/Dependent_SIFUM_Type_Systems.html Sat, 25 Jun 2016 00:00:00 +0000 /entries/Dependent_SIFUM_Type_Systems.html Catalan Numbers /entries/Catalan_Numbers.html Tue, 21 Jun 2016 00:00:00 +0000 /entries/Catalan_Numbers.html Program Construction and Verification Components Based on Kleene Algebra /entries/Algebraic_VCs.html Sat, 18 Jun 2016 00:00:00 +0000 /entries/Algebraic_VCs.html Conservation of CSP Noninterference Security under Concurrent Composition /entries/Noninterference_Concurrent_Composition.html Mon, 13 Jun 2016 00:00:00 +0000 /entries/Noninterference_Concurrent_Composition.html Finite Machine Word Library /entries/Word_Lib.html Thu, 09 Jun 2016 00:00:00 +0000 /entries/Word_Lib.html Tree Decomposition /entries/Tree_Decomposition.html Tue, 31 May 2016 00:00:00 +0000 /entries/Tree_Decomposition.html Cardinality of Equivalence Relations /entries/Card_Equiv_Relations.html Tue, 24 May 2016 00:00:00 +0000 /entries/Card_Equiv_Relations.html POSIX Lexing with Derivatives of Regular Expressions /entries/Posix-Lexing.html Tue, 24 May 2016 00:00:00 +0000 /entries/Posix-Lexing.html Perron-Frobenius Theorem for Spectral Radius Analysis /entries/Perron_Frobenius.html Fri, 20 May 2016 00:00:00 +0000 /entries/Perron_Frobenius.html The meta theory of the Incredible Proof Machine /entries/Incredible_Proof_Machine.html Fri, 20 May 2016 00:00:00 +0000 /entries/Incredible_Proof_Machine.html A Constructive Proof for FLP /entries/FLP.html Wed, 18 May 2016 00:00:00 +0000 /entries/FLP.html A Formal Proof of the Max-Flow Min-Cut Theorem for Countable Networks /entries/MFMC_Countable.html Mon, 09 May 2016 00:00:00 +0000 /entries/MFMC_Countable.html Randomised Social Choice Theory /entries/Randomised_Social_Choice.html Thu, 05 May 2016 00:00:00 +0000 /entries/Randomised_Social_Choice.html Spivey's Generalized Recurrence for Bell Numbers /entries/Bell_Numbers_Spivey.html Wed, 04 May 2016 00:00:00 +0000 /entries/Bell_Numbers_Spivey.html The Incompatibility of SD-Efficiency and SD-Strategy-Proofness /entries/SDS_Impossibility.html Wed, 04 May 2016 00:00:00 +0000 /entries/SDS_Impossibility.html Gröbner Bases Theory /entries/Groebner_Bases.html Mon, 02 May 2016 00:00:00 +0000 /entries/Groebner_Bases.html No Faster-Than-Light Observers /entries/No_FTL_observers.html Thu, 28 Apr 2016 00:00:00 +0000 /entries/No_FTL_observers.html A formalisation of the Cocke-Younger-Kasami algorithm /entries/CYK.html Wed, 27 Apr 2016 00:00:00 +0000 /entries/CYK.html Algorithms for Reduced Ordered Binary Decision Diagrams /entries/ROBDD.html Wed, 27 Apr 2016 00:00:00 +0000 /entries/ROBDD.html Conservation of CSP Noninterference Security under Sequential Composition /entries/Noninterference_Sequential_Composition.html Tue, 26 Apr 2016 00:00:00 +0000 /entries/Noninterference_Sequential_Composition.html Kleene Algebras with Domain /entries/KAD.html Tue, 12 Apr 2016 00:00:00 +0000 /entries/KAD.html Propositional Resolution and Prime Implicates Generation /entries/PropResPI.html Fri, 11 Mar 2016 00:00:00 +0000 /entries/PropResPI.html The Cartan Fixed Point Theorems /entries/Cartan_FP.html Tue, 08 Mar 2016 00:00:00 +0000 /entries/Cartan_FP.html Timed Automata /entries/Timed_Automata.html Tue, 08 Mar 2016 00:00:00 +0000 /entries/Timed_Automata.html Linear Temporal Logic /entries/LTL.html Tue, 01 Mar 2016 00:00:00 +0000 /entries/LTL.html Analysis of List Update Algorithms /entries/List_Update.html Wed, 17 Feb 2016 00:00:00 +0000 /entries/List_Update.html Verified Construction of Static Single Assignment Form /entries/Formal_SSA.html Fri, 05 Feb 2016 00:00:00 +0000 /entries/Formal_SSA.html Polynomial Factorization /entries/Polynomial_Factorization.html Fri, 29 Jan 2016 00:00:00 +0000 /entries/Polynomial_Factorization.html Polynomial Interpolation /entries/Polynomial_Interpolation.html Fri, 29 Jan 2016 00:00:00 +0000 /entries/Polynomial_Interpolation.html Knot Theory /entries/Knot_Theory.html Wed, 20 Jan 2016 00:00:00 +0000 /entries/Knot_Theory.html Tensor Product of Matrices /entries/Matrix_Tensor.html Mon, 18 Jan 2016 00:00:00 +0000 /entries/Matrix_Tensor.html Cardinality of Number Partitions /entries/Card_Number_Partitions.html Thu, 14 Jan 2016 00:00:00 +0000 /entries/Card_Number_Partitions.html Basic Geometric Properties of Triangles /entries/Triangle.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Triangle.html Descartes' Rule of Signs /entries/Descartes_Sign_Rule.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Descartes_Sign_Rule.html Liouville numbers /entries/Liouville_Numbers.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Liouville_Numbers.html The Divergence of the Prime Harmonic Series /entries/Prime_Harmonic_Series.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Prime_Harmonic_Series.html Algebraic Numbers in Isabelle/HOL /entries/Algebraic_Numbers.html Tue, 22 Dec 2015 00:00:00 +0000 /entries/Algebraic_Numbers.html Applicative Lifting /entries/Applicative_Lifting.html Tue, 22 Dec 2015 00:00:00 +0000 /entries/Applicative_Lifting.html The Stern-Brocot Tree /entries/Stern_Brocot.html Tue, 22 Dec 2015 00:00:00 +0000 /entries/Stern_Brocot.html Cardinality of Set Partitions /entries/Card_Partitions.html Sat, 12 Dec 2015 00:00:00 +0000 /entries/Card_Partitions.html Latin Square /entries/Latin_Square.html Wed, 02 Dec 2015 00:00:00 +0000 /entries/Latin_Square.html Ergodic Theory /entries/Ergodic_Theory.html Tue, 01 Dec 2015 00:00:00 +0000 /entries/Ergodic_Theory.html Euler's Partition Theorem /entries/Euler_Partition.html Thu, 19 Nov 2015 00:00:00 +0000 /entries/Euler_Partition.html The Tortoise and Hare Algorithm /entries/TortoiseHare.html Wed, 18 Nov 2015 00:00:00 +0000 /entries/TortoiseHare.html Planarity Certificates /entries/Planarity_Certificates.html Wed, 11 Nov 2015 00:00:00 +0000 /entries/Planarity_Certificates.html Positional Determinacy of Parity Games /entries/Parity_Game.html Mon, 02 Nov 2015 00:00:00 +0000 /entries/Parity_Game.html A Meta-Model for the Isabelle API /entries/Isabelle_Meta_Model.html Wed, 16 Sep 2015 00:00:00 +0000 /entries/Isabelle_Meta_Model.html Converting Linear Temporal Logic to Deterministic (Generalized) Rabin Automata /entries/LTL_to_DRA.html Fri, 04 Sep 2015 00:00:00 +0000 /entries/LTL_to_DRA.html Matrices, Jordan Normal Forms, and Spectral Radius Theory /entries/Jordan_Normal_Form.html Fri, 21 Aug 2015 00:00:00 +0000 /entries/Jordan_Normal_Form.html Decreasing Diagrams II /entries/Decreasing-Diagrams-II.html Thu, 20 Aug 2015 00:00:00 +0000 /entries/Decreasing-Diagrams-II.html The Inductive Unwinding Theorem for CSP Noninterference Security /entries/Noninterference_Inductive_Unwinding.html Tue, 18 Aug 2015 00:00:00 +0000 /entries/Noninterference_Inductive_Unwinding.html Representations of Finite Groups /entries/Rep_Fin_Groups.html Wed, 12 Aug 2015 00:00:00 +0000 /entries/Rep_Fin_Groups.html Analysing and Comparing Encodability Criteria for Process Calculi /entries/Encodability_Process_Calculi.html Mon, 10 Aug 2015 00:00:00 +0000 /entries/Encodability_Process_Calculi.html Generating Cases from Labeled Subgoals /entries/Case_Labeling.html Tue, 21 Jul 2015 00:00:00 +0000 /entries/Case_Labeling.html Landau Symbols /entries/Landau_Symbols.html Tue, 14 Jul 2015 00:00:00 +0000 /entries/Landau_Symbols.html The Akra-Bazzi theorem and the Master theorem /entries/Akra_Bazzi.html Tue, 14 Jul 2015 00:00:00 +0000 /entries/Akra_Bazzi.html Hermite Normal Form /entries/Hermite.html Tue, 07 Jul 2015 00:00:00 +0000 /entries/Hermite.html Derangements Formula /entries/Derangements.html Sat, 27 Jun 2015 00:00:00 +0000 /entries/Derangements.html Binary Multirelations /entries/Multirelations.html Thu, 11 Jun 2015 00:00:00 +0000 /entries/Multirelations.html Reasoning about Lists via List Interleaving /entries/List_Interleaving.html Thu, 11 Jun 2015 00:00:00 +0000 /entries/List_Interleaving.html The Generic Unwinding Theorem for CSP Noninterference Security /entries/Noninterference_Generic_Unwinding.html Thu, 11 Jun 2015 00:00:00 +0000 /entries/Noninterference_Generic_Unwinding.html The Ipurge Unwinding Theorem for CSP Noninterference Security /entries/Noninterference_Ipurge_Unwinding.html Thu, 11 Jun 2015 00:00:00 +0000 /entries/Noninterference_Ipurge_Unwinding.html Parameterized Dynamic Tables /entries/Dynamic_Tables.html Sun, 07 Jun 2015 00:00:00 +0000 /entries/Dynamic_Tables.html Derivatives of Logical Formulas /entries/Formula_Derivatives.html Thu, 28 May 2015 00:00:00 +0000 /entries/Formula_Derivatives.html A Zoo of Probabilistic Systems /entries/Probabilistic_System_Zoo.html Wed, 27 May 2015 00:00:00 +0000 /entries/Probabilistic_System_Zoo.html VCG - Combinatorial Vickrey-Clarke-Groves Auctions /entries/Vickrey_Clarke_Groves.html Thu, 30 Apr 2015 00:00:00 +0000 /entries/Vickrey_Clarke_Groves.html Residuated Lattices /entries/Residuated_Lattices.html Wed, 15 Apr 2015 00:00:00 +0000 /entries/Residuated_Lattices.html Concurrent IMP /entries/ConcurrentIMP.html Mon, 13 Apr 2015 00:00:00 +0000 /entries/ConcurrentIMP.html Relaxing Safely: Verified On-the-Fly Garbage Collection for x86-TSO /entries/ConcurrentGC.html Mon, 13 Apr 2015 00:00:00 +0000 /entries/ConcurrentGC.html Trie /entries/Trie.html Mon, 30 Mar 2015 00:00:00 +0000 /entries/Trie.html Consensus Refined /entries/Consensus_Refined.html Wed, 18 Mar 2015 00:00:00 +0000 /entries/Consensus_Refined.html Deriving class instances for datatypes /entries/Deriving.html Wed, 11 Mar 2015 00:00:00 +0000 /entries/Deriving.html The Safety of Call Arity /entries/Call_Arity.html Fri, 20 Feb 2015 00:00:00 +0000 /entries/Call_Arity.html Echelon Form /entries/Echelon_Form.html Thu, 12 Feb 2015 00:00:00 +0000 /entries/Echelon_Form.html QR Decomposition /entries/QR_Decomposition.html Thu, 12 Feb 2015 00:00:00 +0000 /entries/QR_Decomposition.html Finite Automata in Hereditarily Finite Set Theory /entries/Finite_Automata_HF.html Thu, 05 Feb 2015 00:00:00 +0000 /entries/Finite_Automata_HF.html Verification of the UpDown Scheme /entries/UpDown_Scheme.html Wed, 28 Jan 2015 00:00:00 +0000 /entries/UpDown_Scheme.html The Unified Policy Framework (UPF) /entries/UPF.html Fri, 28 Nov 2014 00:00:00 +0000 /entries/UPF.html Loop freedom of the (untimed) AODV routing protocol /entries/AODV.html Thu, 23 Oct 2014 00:00:00 +0000 /entries/AODV.html Lifting Definition Option /entries/Lifting_Definition_Option.html Mon, 13 Oct 2014 00:00:00 +0000 /entries/Lifting_Definition_Option.html Stream Fusion in HOL with Code Generation /entries/Stream_Fusion_Code.html Fri, 10 Oct 2014 00:00:00 +0000 /entries/Stream_Fusion_Code.html A Verified Compiler for Probability Density Functions /entries/Density_Compiler.html Thu, 09 Oct 2014 00:00:00 +0000 /entries/Density_Compiler.html Formalization of Refinement Calculus for Reactive Systems /entries/RefinementReactive.html Wed, 08 Oct 2014 00:00:00 +0000 /entries/RefinementReactive.html Certification Monads /entries/Certification_Monads.html Fri, 03 Oct 2014 00:00:00 +0000 /entries/Certification_Monads.html XML /entries/XML.html Fri, 03 Oct 2014 00:00:00 +0000 /entries/XML.html Imperative Insertion Sort /entries/Imperative_Insertion_Sort.html Thu, 25 Sep 2014 00:00:00 +0000 /entries/Imperative_Insertion_Sort.html The Sturm–Tarski Theorem /entries/Sturm_Tarski.html Fri, 19 Sep 2014 00:00:00 +0000 /entries/Sturm_Tarski.html The Cayley-Hamilton Theorem /entries/Cayley_Hamilton.html Mon, 15 Sep 2014 00:00:00 +0000 /entries/Cayley_Hamilton.html The Jordan-Hölder Theorem /entries/Jordan_Hoelder.html Tue, 09 Sep 2014 00:00:00 +0000 /entries/Jordan_Hoelder.html Priority Queues Based on Braun Trees /entries/Priority_Queue_Braun.html Thu, 04 Sep 2014 00:00:00 +0000 /entries/Priority_Queue_Braun.html Gauss-Jordan Algorithm and Its Applications /entries/Gauss_Jordan.html Wed, 03 Sep 2014 00:00:00 +0000 /entries/Gauss_Jordan.html Real-Valued Special Functions: Upper and Lower Bounds /entries/Special_Function_Bounds.html Fri, 29 Aug 2014 00:00:00 +0000 /entries/Special_Function_Bounds.html Vector Spaces /entries/VectorSpace.html Fri, 29 Aug 2014 00:00:00 +0000 /entries/VectorSpace.html Skew Heap /entries/Skew_Heap.html Wed, 13 Aug 2014 00:00:00 +0000 /entries/Skew_Heap.html Splay Tree /entries/Splay_Tree.html Tue, 12 Aug 2014 00:00:00 +0000 /entries/Splay_Tree.html Haskell's Show Class in Isabelle/HOL /entries/Show.html Tue, 29 Jul 2014 00:00:00 +0000 /entries/Show.html Formal Specification of a Generic Separation Kernel /entries/CISC-Kernel.html Fri, 18 Jul 2014 00:00:00 +0000 /entries/CISC-Kernel.html pGCL for Isabelle /entries/pGCL.html Sun, 13 Jul 2014 00:00:00 +0000 /entries/pGCL.html Amortized Complexity Verified /entries/Amortized_Complexity.html Mon, 07 Jul 2014 00:00:00 +0000 /entries/Amortized_Complexity.html Network Security Policy Verification /entries/Network_Security_Policy_Verification.html Fri, 04 Jul 2014 00:00:00 +0000 /entries/Network_Security_Policy_Verification.html Pop-Refinement /entries/Pop_Refinement.html Thu, 03 Jul 2014 00:00:00 +0000 /entries/Pop_Refinement.html Decision Procedures for MSO on Words Based on Derivatives of Regular Expressions /entries/MSO_Regex_Equivalence.html Thu, 12 Jun 2014 00:00:00 +0000 /entries/MSO_Regex_Equivalence.html Boolean Expression Checkers /entries/Boolean_Expression_Checkers.html Sun, 08 Jun 2014 00:00:00 +0000 /entries/Boolean_Expression_Checkers.html A Fully Verified Executable LTL Model Checker /entries/CAVA_LTL_Modelchecker.html Wed, 28 May 2014 00:00:00 +0000 /entries/CAVA_LTL_Modelchecker.html Converting Linear-Time Temporal Logic to Generalized Büchi Automata /entries/LTL_to_GBA.html Wed, 28 May 2014 00:00:00 +0000 /entries/LTL_to_GBA.html Promela Formalization /entries/Promela.html Wed, 28 May 2014 00:00:00 +0000 /entries/Promela.html The CAVA Automata Library /entries/CAVA_Automata.html Wed, 28 May 2014 00:00:00 +0000 /entries/CAVA_Automata.html Verified Efficient Implementation of Gabow's Strongly Connected Components Algorithm /entries/Gabow_SCC.html Wed, 28 May 2014 00:00:00 +0000 /entries/Gabow_SCC.html Noninterference Security in Communicating Sequential Processes /entries/Noninterference_CSP.html Fri, 23 May 2014 00:00:00 +0000 /entries/Noninterference_CSP.html Transitive closure according to Roy-Floyd-Warshall /entries/Roy_Floyd_Warshall.html Fri, 23 May 2014 00:00:00 +0000 /entries/Roy_Floyd_Warshall.html Regular Algebras /entries/Regular_Algebras.html Wed, 21 May 2014 00:00:00 +0000 /entries/Regular_Algebras.html Formalisation and Analysis of Component Dependencies /entries/ComponentDependencies.html Mon, 28 Apr 2014 00:00:00 +0000 /entries/ComponentDependencies.html A Formalization of Assumptions and Guarantees for Compositional Noninterference /entries/SIFUM_Type_Systems.html Wed, 23 Apr 2014 00:00:00 +0000 /entries/SIFUM_Type_Systems.html A Formalization of Declassification with WHAT-and-WHERE-Security /entries/WHATandWHERE_Security.html Wed, 23 Apr 2014 00:00:00 +0000 /entries/WHATandWHERE_Security.html A Formalization of Strong Security /entries/Strong_Security.html Wed, 23 Apr 2014 00:00:00 +0000 /entries/Strong_Security.html Bounded-Deducibility Security /entries/Bounded_Deducibility_Security.html Tue, 22 Apr 2014 00:00:00 +0000 /entries/Bounded_Deducibility_Security.html A shallow embedding of HyperCTL* /entries/HyperCTL.html Wed, 16 Apr 2014 00:00:00 +0000 /entries/HyperCTL.html Abstract Completeness /entries/Abstract_Completeness.html Wed, 16 Apr 2014 00:00:00 +0000 /entries/Abstract_Completeness.html Discrete Summation /entries/Discrete_Summation.html Sun, 13 Apr 2014 00:00:00 +0000 /entries/Discrete_Summation.html Syntax and semantics of a GPU kernel programming language /entries/GPU_Kernel_PL.html Thu, 03 Apr 2014 00:00:00 +0000 /entries/GPU_Kernel_PL.html Probabilistic Noninterference /entries/Probabilistic_Noninterference.html Tue, 11 Mar 2014 00:00:00 +0000 /entries/Probabilistic_Noninterference.html Mechanization of the Algebra for Wireless Networks (AWN) /entries/AWN.html Sat, 08 Mar 2014 00:00:00 +0000 /entries/AWN.html Mutually Recursive Partial Functions /entries/Partial_Function_MR.html Tue, 18 Feb 2014 00:00:00 +0000 /entries/Partial_Function_MR.html Properties of Random Graphs -- Subgraph Containment /entries/Random_Graph_Subgraph_Threshold.html Thu, 13 Feb 2014 00:00:00 +0000 /entries/Random_Graph_Subgraph_Threshold.html Verification of Selection and Heap Sort Using Locales /entries/Selection_Heap_Sort.html Tue, 11 Feb 2014 00:00:00 +0000 /entries/Selection_Heap_Sort.html Affine Arithmetic /entries/Affine_Arithmetic.html Fri, 07 Feb 2014 00:00:00 +0000 /entries/Affine_Arithmetic.html Implementing field extensions of the form Q[sqrt(b)] /entries/Real_Impl.html Thu, 06 Feb 2014 00:00:00 +0000 /entries/Real_Impl.html Unified Decision Procedures for Regular Expression Equivalence /entries/Regex_Equivalence.html Thu, 30 Jan 2014 00:00:00 +0000 /entries/Regex_Equivalence.html Secondary Sylow Theorems /entries/Secondary_Sylow.html Tue, 28 Jan 2014 00:00:00 +0000 /entries/Secondary_Sylow.html Relation Algebra /entries/Relation_Algebra.html Sat, 25 Jan 2014 00:00:00 +0000 /entries/Relation_Algebra.html Kleene Algebra with Tests and Demonic Refinement Algebras /entries/KAT_and_DRA.html Thu, 23 Jan 2014 00:00:00 +0000 /entries/KAT_and_DRA.html Featherweight OCL: A Proposal for a Machine-Checked Formal Semantics for OCL 2.5 /entries/Featherweight_OCL.html Thu, 16 Jan 2014 00:00:00 +0000 /entries/Featherweight_OCL.html Compositional Properties of Crypto-Based Components /entries/CryptoBasedCompositionalProperties.html Sat, 11 Jan 2014 00:00:00 +0000 /entries/CryptoBasedCompositionalProperties.html Sturm's Theorem /entries/Sturm_Sequences.html Sat, 11 Jan 2014 00:00:00 +0000 /entries/Sturm_Sequences.html A General Method for the Proof of Theorems on Tail-recursive Functions /entries/Tail_Recursive_Functions.html Sun, 01 Dec 2013 00:00:00 +0000 /entries/Tail_Recursive_Functions.html Gödel's Incompleteness Theorems /entries/Incompleteness.html Sun, 17 Nov 2013 00:00:00 +0000 /entries/Incompleteness.html The Hereditarily Finite Sets /entries/HereditarilyFinite.html Sun, 17 Nov 2013 00:00:00 +0000 /entries/HereditarilyFinite.html A Codatatype of Formal Languages /entries/Coinductive_Languages.html Fri, 15 Nov 2013 00:00:00 +0000 /entries/Coinductive_Languages.html Stream Processing Components: Isabelle/HOL Formalisation and Case Studies /entries/FocusStreamsCaseStudies.html Thu, 14 Nov 2013 00:00:00 +0000 /entries/FocusStreamsCaseStudies.html Gödel's God in Isabelle/HOL /entries/GoedelGod.html Tue, 12 Nov 2013 00:00:00 +0000 /entries/GoedelGod.html Decreasing Diagrams /entries/Decreasing-Diagrams.html Fri, 01 Nov 2013 00:00:00 +0000 /entries/Decreasing-Diagrams.html Automatic Data Refinement /entries/Automatic_Refinement.html Wed, 02 Oct 2013 00:00:00 +0000 /entries/Automatic_Refinement.html Native Word /entries/Native_Word.html Tue, 17 Sep 2013 00:00:00 +0000 /entries/Native_Word.html A Formal Model of IEEE Floating Point Arithmetic /entries/IEEE_Floating_Point.html Sat, 27 Jul 2013 00:00:00 +0000 /entries/IEEE_Floating_Point.html Lehmer's Theorem /entries/Lehmer.html Mon, 22 Jul 2013 00:00:00 +0000 /entries/Lehmer.html Pratt's Primality Certificates /entries/Pratt_Certificate.html Mon, 22 Jul 2013 00:00:00 +0000 /entries/Pratt_Certificate.html The Königsberg Bridge Problem and the Friendship Theorem /entries/Koenigsberg_Friendship.html Fri, 19 Jul 2013 00:00:00 +0000 /entries/Koenigsberg_Friendship.html Sound and Complete Sort Encodings for First-Order Logic /entries/Sort_Encodings.html Thu, 27 Jun 2013 00:00:00 +0000 /entries/Sort_Encodings.html An Axiomatic Characterization of the Single-Source Shortest Path Problem /entries/ShortestPath.html Wed, 22 May 2013 00:00:00 +0000 /entries/ShortestPath.html Graph Theory /entries/Graph_Theory.html Sun, 28 Apr 2013 00:00:00 +0000 /entries/Graph_Theory.html Light-weight Containers /entries/Containers.html Mon, 15 Apr 2013 00:00:00 +0000 /entries/Containers.html Nominal 2 /entries/Nominal2.html Thu, 21 Feb 2013 00:00:00 +0000 /entries/Nominal2.html The Correctness of Launchbury's Natural Semantics for Lazy Evaluation /entries/Launchbury.html Thu, 31 Jan 2013 00:00:00 +0000 /entries/Launchbury.html Ribbon Proofs /entries/Ribbon_Proofs.html Sat, 19 Jan 2013 00:00:00 +0000 /entries/Ribbon_Proofs.html Rank-Nullity Theorem in Linear Algebra /entries/Rank_Nullity_Theorem.html Wed, 16 Jan 2013 00:00:00 +0000 /entries/Rank_Nullity_Theorem.html Kleene Algebra /entries/Kleene_Algebra.html Tue, 15 Jan 2013 00:00:00 +0000 /entries/Kleene_Algebra.html Computing N-th Roots using the Babylonian Method /entries/Sqrt_Babylonian.html Thu, 03 Jan 2013 00:00:00 +0000 /entries/Sqrt_Babylonian.html A Separation Logic Framework for Imperative HOL /entries/Separation_Logic_Imperative_HOL.html Wed, 14 Nov 2012 00:00:00 +0000 /entries/Separation_Logic_Imperative_HOL.html Open Induction /entries/Open_Induction.html Fri, 02 Nov 2012 00:00:00 +0000 /entries/Open_Induction.html The independence of Tarski's Euclidean axiom /entries/Tarskis_Geometry.html Tue, 30 Oct 2012 00:00:00 +0000 /entries/Tarskis_Geometry.html Bondy's Theorem /entries/Bondy.html Sat, 27 Oct 2012 00:00:00 +0000 /entries/Bondy.html Possibilistic Noninterference /entries/Possibilistic_Noninterference.html Mon, 10 Sep 2012 00:00:00 +0000 /entries/Possibilistic_Noninterference.html Generating linear orders for datatypes /entries/Datatype_Order_Generator.html Tue, 07 Aug 2012 00:00:00 +0000 /entries/Datatype_Order_Generator.html Proving the Impossibility of Trisecting an Angle and Doubling the Cube /entries/Impossible_Geometry.html Sun, 05 Aug 2012 00:00:00 +0000 /entries/Impossible_Geometry.html Verifying Fault-Tolerant Distributed Algorithms in the Heard-Of Model /entries/Heard_Of.html Fri, 27 Jul 2012 00:00:00 +0000 /entries/Heard_Of.html Logical Relations for PCF /entries/PCF.html Sun, 01 Jul 2012 00:00:00 +0000 /entries/PCF.html Type Constructor Classes and Monad Transformers /entries/Tycon.html Tue, 26 Jun 2012 00:00:00 +0000 /entries/Tycon.html CCS in nominal logic /entries/CCS.html Tue, 29 May 2012 00:00:00 +0000 /entries/CCS.html Psi-calculi in Isabelle /entries/Psi_Calculi.html Tue, 29 May 2012 00:00:00 +0000 /entries/Psi_Calculi.html The pi-calculus in nominal logic /entries/Pi_Calculus.html Tue, 29 May 2012 00:00:00 +0000 /entries/Pi_Calculus.html Isabelle/Circus /entries/Circus.html Sun, 27 May 2012 00:00:00 +0000 /entries/Circus.html Separation Algebra /entries/Separation_Algebra.html Fri, 11 May 2012 00:00:00 +0000 /entries/Separation_Algebra.html Stuttering Equivalence /entries/Stuttering_Equivalence.html Mon, 07 May 2012 00:00:00 +0000 /entries/Stuttering_Equivalence.html Inductive Study of Confidentiality /entries/Inductive_Confidentiality.html Wed, 02 May 2012 00:00:00 +0000 /entries/Inductive_Confidentiality.html Ordinary Differential Equations /entries/Ordinary_Differential_Equations.html Thu, 26 Apr 2012 00:00:00 +0000 /entries/Ordinary_Differential_Equations.html Well-Quasi-Orders /entries/Well_Quasi_Orders.html Fri, 13 Apr 2012 00:00:00 +0000 /entries/Well_Quasi_Orders.html Abortable Linearizable Modules /entries/Abortable_Linearizable_Modules.html Thu, 01 Mar 2012 00:00:00 +0000 /entries/Abortable_Linearizable_Modules.html Executable Transitive Closures /entries/Transitive-Closure-II.html Wed, 29 Feb 2012 00:00:00 +0000 /entries/Transitive-Closure-II.html A Probabilistic Proof of the Girth-Chromatic Number Theorem /entries/Girth_Chromatic.html Mon, 06 Feb 2012 00:00:00 +0000 /entries/Girth_Chromatic.html Dijkstra's Shortest Path Algorithm /entries/Dijkstra_Shortest_Path.html Mon, 30 Jan 2012 00:00:00 +0000 /entries/Dijkstra_Shortest_Path.html Refinement for Monadic Programs /entries/Refine_Monadic.html Mon, 30 Jan 2012 00:00:00 +0000 /entries/Refine_Monadic.html Markov Models /entries/Markov_Models.html Tue, 03 Jan 2012 00:00:00 +0000 /entries/Markov_Models.html A Definitional Encoding of TLA* in Isabelle/HOL /entries/TLA.html Sat, 19 Nov 2011 00:00:00 +0000 /entries/TLA.html Efficient Mergesort /entries/Efficient-Mergesort.html Wed, 09 Nov 2011 00:00:00 +0000 /entries/Efficient-Mergesort.html Algebra of Monotonic Boolean Transformers /entries/MonoBoolTranAlgebra.html Thu, 22 Sep 2011 00:00:00 +0000 /entries/MonoBoolTranAlgebra.html Lattice Properties /entries/LatticeProperties.html Thu, 22 Sep 2011 00:00:00 +0000 /entries/LatticeProperties.html Pseudo Hoops /entries/PseudoHoops.html Thu, 22 Sep 2011 00:00:00 +0000 /entries/PseudoHoops.html The Myhill-Nerode Theorem Based on Regular Expressions /entries/Myhill-Nerode.html Fri, 26 Aug 2011 00:00:00 +0000 /entries/Myhill-Nerode.html Gauss-Jordan Elimination for Matrices Represented as Functions /entries/Gauss-Jordan-Elim-Fun.html Fri, 19 Aug 2011 00:00:00 +0000 /entries/Gauss-Jordan-Elim-Fun.html Maximum Cardinality Matching /entries/Max-Card-Matching.html Thu, 21 Jul 2011 00:00:00 +0000 /entries/Max-Card-Matching.html Knowledge-based programs /entries/KBPs.html Tue, 17 May 2011 00:00:00 +0000 /entries/KBPs.html The General Triangle Is Unique /entries/General-Triangle.html Fri, 01 Apr 2011 00:00:00 +0000 /entries/General-Triangle.html Executable Transitive Closures of Finite Relations /entries/Transitive-Closure.html Mon, 14 Mar 2011 00:00:00 +0000 /entries/Transitive-Closure.html AutoFocus Stream Processing for Single-Clocking and Multi-Clocking Semantics /entries/AutoFocus-Stream.html Wed, 23 Feb 2011 00:00:00 +0000 /entries/AutoFocus-Stream.html Infinite Lists /entries/List-Infinite.html Wed, 23 Feb 2011 00:00:00 +0000 /entries/List-Infinite.html Interval Temporal Logic on Natural Numbers /entries/Nat-Interval-Logic.html Wed, 23 Feb 2011 00:00:00 +0000 /entries/Nat-Interval-Logic.html Lightweight Java /entries/LightweightJava.html Mon, 07 Feb 2011 00:00:00 +0000 /entries/LightweightJava.html RIPEMD-160 /entries/RIPEMD-160-SPARK.html Mon, 10 Jan 2011 00:00:00 +0000 /entries/RIPEMD-160-SPARK.html Lower Semicontinuous Functions /entries/Lower_Semicontinuous.html Sat, 08 Jan 2011 00:00:00 +0000 /entries/Lower_Semicontinuous.html Hall's Marriage Theorem /entries/Marriage.html Fri, 17 Dec 2010 00:00:00 +0000 /entries/Marriage.html Shivers' Control Flow Analysis /entries/Shivers-CFA.html Tue, 16 Nov 2010 00:00:00 +0000 /entries/Shivers-CFA.html Binomial Heaps and Skew Binomial Heaps /entries/Binomial-Heaps.html Thu, 28 Oct 2010 00:00:00 +0000 /entries/Binomial-Heaps.html Finger Trees /entries/Finger-Trees.html Thu, 28 Oct 2010 00:00:00 +0000 /entries/Finger-Trees.html Functional Binomial Queues /entries/Binomial-Queues.html Thu, 28 Oct 2010 00:00:00 +0000 /entries/Binomial-Queues.html Strong Normalization of Moggis's Computational Metalanguage /entries/Lam-ml-Normalization.html Sun, 29 Aug 2010 00:00:00 +0000 /entries/Lam-ml-Normalization.html Executable Multivariate Polynomials /entries/Polynomials.html Tue, 10 Aug 2010 00:00:00 +0000 /entries/Polynomials.html Formalizing Statecharts using Hierarchical Automata /entries/Statecharts.html Sun, 08 Aug 2010 00:00:00 +0000 /entries/Statecharts.html Free Groups /entries/Free-Groups.html Thu, 24 Jun 2010 00:00:00 +0000 /entries/Free-Groups.html Category Theory /entries/Category2.html Sun, 20 Jun 2010 00:00:00 +0000 /entries/Category2.html Executable Matrix Operations on Matrices of Arbitrary Dimensions /entries/Matrix.html Thu, 17 Jun 2010 00:00:00 +0000 /entries/Matrix.html Abstract Rewriting /entries/Abstract-Rewriting.html Mon, 14 Jun 2010 00:00:00 +0000 /entries/Abstract-Rewriting.html Semantics and Data Refinement of Invariant Based Programs /entries/DataRefinementIBP.html Fri, 28 May 2010 00:00:00 +0000 /entries/DataRefinementIBP.html Verification of the Deutsch-Schorr-Waite Graph Marking Algorithm using Data Refinement /entries/GraphMarkingIBP.html Fri, 28 May 2010 00:00:00 +0000 /entries/GraphMarkingIBP.html A Complete Proof of the Robbins Conjecture /entries/Robbins-Conjecture.html Sat, 22 May 2010 00:00:00 +0000 /entries/Robbins-Conjecture.html Regular Sets and Expressions /entries/Regular-Sets.html Wed, 12 May 2010 00:00:00 +0000 /entries/Regular-Sets.html Locally Nameless Sigma Calculus /entries/Locally-Nameless-Sigma.html Fri, 30 Apr 2010 00:00:00 +0000 /entries/Locally-Nameless-Sigma.html Free Boolean Algebra /entries/Free-Boolean-Algebra.html Mon, 29 Mar 2010 00:00:00 +0000 /entries/Free-Boolean-Algebra.html Information Flow Noninterference via Slicing /entries/InformationFlowSlicing.html Tue, 23 Mar 2010 00:00:00 +0000 /entries/InformationFlowSlicing.html Inter-Procedural Information Flow Noninterference via Slicing /entries/InformationFlowSlicing_Inter.html Tue, 23 Mar 2010 00:00:00 +0000 /entries/InformationFlowSlicing_Inter.html List Index /entries/List-Index.html Sat, 20 Feb 2010 00:00:00 +0000 /entries/List-Index.html Coinductive /entries/Coinductive.html Fri, 12 Feb 2010 00:00:00 +0000 /entries/Coinductive.html A Fast SAT Solver for Isabelle in Standard ML /entries/DPT-SAT-Solver.html Wed, 09 Dec 2009 00:00:00 +0000 /entries/DPT-SAT-Solver.html Formalizing the Logic-Automaton Connection /entries/Presburger-Automata.html Thu, 03 Dec 2009 00:00:00 +0000 /entries/Presburger-Automata.html Collections Framework /entries/Collections.html Wed, 25 Nov 2009 00:00:00 +0000 /entries/Collections.html Tree Automata /entries/Tree-Automata.html Wed, 25 Nov 2009 00:00:00 +0000 /entries/Tree-Automata.html Perfect Number Theorem /entries/Perfect-Number-Thm.html Sun, 22 Nov 2009 00:00:00 +0000 /entries/Perfect-Number-Thm.html Backing up Slicing: Verifying the Interprocedural Two-Phase Horwitz-Reps-Binkley Slicer /entries/HRB-Slicing.html Fri, 13 Nov 2009 00:00:00 +0000 /entries/HRB-Slicing.html The Worker/Wrapper Transformation /entries/WorkerWrapper.html Fri, 30 Oct 2009 00:00:00 +0000 /entries/WorkerWrapper.html Ordinals and Cardinals /entries/Ordinals_and_Cardinals.html Tue, 01 Sep 2009 00:00:00 +0000 /entries/Ordinals_and_Cardinals.html Invertibility in Sequent Calculi /entries/SequentInvertibility.html Fri, 28 Aug 2009 00:00:00 +0000 /entries/SequentInvertibility.html An Example of a Cofinitary Group in Isabelle/HOL /entries/CofGroups.html Tue, 04 Aug 2009 00:00:00 +0000 /entries/CofGroups.html Code Generation for Functions as Data /entries/FinFun.html Wed, 06 May 2009 00:00:00 +0000 /entries/FinFun.html Stream Fusion /entries/Stream-Fusion.html Wed, 29 Apr 2009 00:00:00 +0000 /entries/Stream-Fusion.html A Bytecode Logic for JML and Types /entries/BytecodeLogicJmlTypes.html Fri, 12 Dec 2008 00:00:00 +0000 /entries/BytecodeLogicJmlTypes.html Secure information flow and program logics /entries/SIFPL.html Mon, 10 Nov 2008 00:00:00 +0000 /entries/SIFPL.html Some classical results in Social Choice Theory /entries/SenSocialChoice.html Sun, 09 Nov 2008 00:00:00 +0000 /entries/SenSocialChoice.html Fun With Tilings /entries/FunWithTilings.html Fri, 07 Nov 2008 00:00:00 +0000 /entries/FunWithTilings.html The Textbook Proof of Huffman's Algorithm /entries/Huffman.html Wed, 15 Oct 2008 00:00:00 +0000 /entries/Huffman.html Towards Certified Slicing /entries/Slicing.html Tue, 16 Sep 2008 00:00:00 +0000 /entries/Slicing.html A Correctness Proof for the Volpano/Smith Security Typing System /entries/VolpanoSmith.html Tue, 02 Sep 2008 00:00:00 +0000 /entries/VolpanoSmith.html Arrow and Gibbard-Satterthwaite /entries/ArrowImpossibilityGS.html Mon, 01 Sep 2008 00:00:00 +0000 /entries/ArrowImpossibilityGS.html Fun With Functions /entries/FunWithFunctions.html Tue, 26 Aug 2008 00:00:00 +0000 /entries/FunWithFunctions.html Formal Verification of Modern SAT Solvers /entries/SATSolverVerification.html Wed, 23 Jul 2008 00:00:00 +0000 /entries/SATSolverVerification.html Recursion Theory I /entries/Recursion-Theory-I.html Sat, 05 Apr 2008 00:00:00 +0000 /entries/Recursion-Theory-I.html A Sequential Imperative Programming Language Syntax, Semantics, Hoare Logics and Verification Environment /entries/Simpl.html Fri, 29 Feb 2008 00:00:00 +0000 /entries/Simpl.html BDD Normalisation /entries/BDD.html Fri, 29 Feb 2008 00:00:00 +0000 /entries/BDD.html Normalization by Evaluation /entries/NormByEval.html Mon, 18 Feb 2008 00:00:00 +0000 /entries/NormByEval.html Quantifier Elimination for Linear Arithmetic /entries/LinearQuantifierElim.html Fri, 11 Jan 2008 00:00:00 +0000 /entries/LinearQuantifierElim.html Formalization of Conflict Analysis of Programs with Procedures, Thread Creation, and Monitors /entries/Program-Conflict-Analysis.html Fri, 14 Dec 2007 00:00:00 +0000 /entries/Program-Conflict-Analysis.html Jinja with Threads /entries/JinjaThreads.html Mon, 03 Dec 2007 00:00:00 +0000 /entries/JinjaThreads.html Much Ado About Two /entries/MuchAdoAboutTwo.html Tue, 06 Nov 2007 00:00:00 +0000 /entries/MuchAdoAboutTwo.html Fermat's Last Theorem for Exponents 3 and 4 and the Parametrisation of Pythagorean Triples /entries/Fermat3_4.html Sun, 12 Aug 2007 00:00:00 +0000 /entries/Fermat3_4.html Sums of Two and Four Squares /entries/SumSquares.html Sun, 12 Aug 2007 00:00:00 +0000 /entries/SumSquares.html Fundamental Properties of Valuation Theory and Hensel's Lemma /entries/Valuation.html Wed, 08 Aug 2007 00:00:00 +0000 /entries/Valuation.html First-Order Logic According to Fitting /entries/FOL-Fitting.html Thu, 02 Aug 2007 00:00:00 +0000 /entries/FOL-Fitting.html POPLmark Challenge Via de Bruijn Indices /entries/POPLmark-deBruijn.html Thu, 02 Aug 2007 00:00:00 +0000 /entries/POPLmark-deBruijn.html Hotel Key Card System /entries/HotelKeyCards.html Sat, 09 Sep 2006 00:00:00 +0000 /entries/HotelKeyCards.html Abstract Hoare Logics /entries/Abstract-Hoare-Logics.html Tue, 08 Aug 2006 00:00:00 +0000 /entries/Abstract-Hoare-Logics.html Flyspeck I: Tame Graphs /entries/Flyspeck-Tame.html Mon, 22 May 2006 00:00:00 +0000 /entries/Flyspeck-Tame.html CoreC++ /entries/CoreC++.html Mon, 15 May 2006 00:00:00 +0000 /entries/CoreC++.html A Theory of Featherweight Java in Isabelle/HOL /entries/FeatherweightJava.html Fri, 31 Mar 2006 00:00:00 +0000 /entries/FeatherweightJava.html Instances of Schneider's generalized protocol of clock synchronization /entries/ClockSynchInst.html Wed, 15 Mar 2006 00:00:00 +0000 /entries/ClockSynchInst.html Cauchy's Mean Theorem and the Cauchy-Schwarz Inequality /entries/Cauchy.html Tue, 14 Mar 2006 00:00:00 +0000 /entries/Cauchy.html Countable Ordinals /entries/Ordinal.html Fri, 11 Nov 2005 00:00:00 +0000 /entries/Ordinal.html Fast Fourier Transform /entries/FFT.html Wed, 12 Oct 2005 00:00:00 +0000 /entries/FFT.html Formalization of a Generalized Protocol for Clock Synchronization /entries/GenClock.html Fri, 24 Jun 2005 00:00:00 +0000 /entries/GenClock.html Proving the Correctness of Disk Paxos /entries/DiskPaxos.html Wed, 22 Jun 2005 00:00:00 +0000 /entries/DiskPaxos.html Jive Data and Store Model /entries/JiveDataStoreModel.html Mon, 20 Jun 2005 00:00:00 +0000 /entries/JiveDataStoreModel.html Jinja is not Java /entries/Jinja.html Wed, 01 Jun 2005 00:00:00 +0000 /entries/Jinja.html SHA1, RSA, PSS and more /entries/RSAPSS.html Mon, 02 May 2005 00:00:00 +0000 /entries/RSAPSS.html Category Theory to Yoneda's Lemma /entries/Category.html Thu, 21 Apr 2005 00:00:00 +0000 /entries/Category.html File Refinement /entries/FileRefinement.html Thu, 09 Dec 2004 00:00:00 +0000 /entries/FileRefinement.html Integration theory and random variables /entries/Integration.html Fri, 19 Nov 2004 00:00:00 +0000 /entries/Integration.html A Mechanically Verified, Efficient, Sound and Complete Theorem Prover For First Order Logic /entries/Verified-Prover.html Tue, 28 Sep 2004 00:00:00 +0000 /entries/Verified-Prover.html Completeness theorem /entries/Completeness.html Mon, 20 Sep 2004 00:00:00 +0000 /entries/Completeness.html Ramsey's theorem, infinitary version /entries/Ramsey-Infinite.html Mon, 20 Sep 2004 00:00:00 +0000 /entries/Ramsey-Infinite.html Compiling Exceptions Correctly /entries/Compiling-Exceptions-Correctly.html Fri, 09 Jul 2004 00:00:00 +0000 /entries/Compiling-Exceptions-Correctly.html Depth First Search /entries/Depth-First-Search.html Thu, 24 Jun 2004 00:00:00 +0000 /entries/Depth-First-Search.html Groups, Rings and Modules /entries/Group-Ring-Module.html Tue, 18 May 2004 00:00:00 +0000 /entries/Group-Ring-Module.html Lazy Lists II /entries/Lazy-Lists-II.html Mon, 26 Apr 2004 00:00:00 +0000 /entries/Lazy-Lists-II.html Topology /entries/Topology.html Mon, 26 Apr 2004 00:00:00 +0000 /entries/Topology.html Binary Search Trees /entries/BinarySearchTree.html Mon, 05 Apr 2004 00:00:00 +0000 /entries/BinarySearchTree.html Functional Automata /entries/Functional-Automata.html Tue, 30 Mar 2004 00:00:00 +0000 /entries/Functional-Automata.html AVL Trees /entries/AVL-Trees.html Fri, 19 Mar 2004 00:00:00 +0000 /entries/AVL-Trees.html Mini ML /entries/MiniML.html Fri, 19 Mar 2004 00:00:00 +0000 /entries/MiniML.html diff --git a/web/index.html b/web/index.html --- a/web/index.html +++ b/web/index.html @@ -1,9033 +1,9066 @@ Archive of Formal Proofs

Archive of Formal Proofs

The Archive of Formal Proofs is a collection of proof libraries, examples, and larger scientific developments, mechanically checked in the theorem prover Isabelle. It is organized in the way of a scientific journal, is indexed by dblp and has an ISSN: 2150-914x. Submissions are refereed and we encourage companion AFP submissions to conference and journal publications. To cite an entry, please use the preferred citation style.

A development version of the archive is available as well.

2024

+ + +

2023

2022

2021

2020

2019

2018

2017

2016

2015

2014

2013

2012

2011

2010

2008

2004

\ No newline at end of file diff --git a/web/index.xml b/web/index.xml --- a/web/index.xml +++ b/web/index.xml @@ -1,11434 +1,11490 @@ Archive of Formal Proofs / Recent content on Archive of Formal Proofs Hugo -- gohugo.io en-gb - Wed, 06 Mar 2024 00:00:00 +0000 + Wed, 20 Mar 2024 00:00:00 +0000 + Continued Fractions + /entries/Continued_Fractions.html + Wed, 20 Mar 2024 00:00:00 +0000 + /entries/Continued_Fractions.html + + + + Approximate Model Counting + /entries/Approximate_Model_Counting.html + Fri, 15 Mar 2024 00:00:00 +0000 + /entries/Approximate_Model_Counting.html + + + Verified QBF Solving /entries/QBF_Solver_Verification.html Wed, 06 Mar 2024 00:00:00 +0000 /entries/QBF_Solver_Verification.html Wieferich–Kempner Theorem /entries/Wieferich_Kempner.html Wed, 06 Mar 2024 00:00:00 +0000 /entries/Wieferich_Kempner.html Karatsuba Multiplication on Integers /entries/Karatsuba.html Mon, 19 Feb 2024 00:00:00 +0000 /entries/Karatsuba.html Information Flow Control via Stateful Intransitive Noninterference in Language IMP /entries/IMP_Noninterference.html Mon, 12 Feb 2024 00:00:00 +0000 /entries/IMP_Noninterference.html The Sumcheck Protocol /entries/Sumcheck_Protocol.html Fri, 02 Feb 2024 00:00:00 +0000 /entries/Sumcheck_Protocol.html Region Quadtrees /entries/Region_Quadtrees.html Fri, 26 Jan 2024 00:00:00 +0000 /entries/Region_Quadtrees.html Cubical Categories /entries/CubicalCategories.html Wed, 24 Jan 2024 00:00:00 +0000 /entries/CubicalCategories.html Higher Globular Catoids and Quantales /entries/OmegaCatoidsQuantales.html Wed, 24 Jan 2024 00:00:00 +0000 /entries/OmegaCatoidsQuantales.html Decomposition of totally ordered hoops /entries/Isabelle_hoops.html Mon, 22 Jan 2024 00:00:00 +0000 /entries/Isabelle_hoops.html + Go Code Generation for Isabelle + /entries/Go.html + Mon, 22 Jan 2024 00:00:00 +0000 + /entries/Go.html + + + (Extended) Interval Analysis /entries/Interval_Analysis.html Sun, 21 Jan 2024 00:00:00 +0000 /entries/Interval_Analysis.html Operational Semantics formally proven in HOL-CSP /entries/HOL-CSP_OpSem.html Sun, 24 Dec 2023 00:00:00 +0000 /entries/HOL-CSP_OpSem.html CRYSTALS-Kyber_Security /entries/CRYSTALS-Kyber_Security.html Mon, 18 Dec 2023 00:00:00 +0000 /entries/CRYSTALS-Kyber_Security.html HOL-CSPM - Architectural operators for HOL-CSP /entries/HOL-CSPM.html Tue, 05 Dec 2023 00:00:00 +0000 /entries/HOL-CSPM.html Knuth–Morris–Pratt String Search /entries/KnuthMorrisPratt.html Mon, 27 Nov 2023 00:00:00 +0000 /entries/KnuthMorrisPratt.html Lambert Series /entries/Lambert_Series.html Fri, 24 Nov 2023 00:00:00 +0000 /entries/Lambert_Series.html Martingales /entries/Martingales.html Tue, 21 Nov 2023 00:00:00 +0000 /entries/Martingales.html Soundness of the Q0 proof system for higher-order logic /entries/Q0_Soundness.html Mon, 20 Nov 2023 00:00:00 +0000 /entries/Q0_Soundness.html The Cardinality of the Continuum /entries/Cardinality_Continuum.html Wed, 15 Nov 2023 00:00:00 +0000 /entries/Cardinality_Continuum.html The Polylogarithm Function /entries/Polylog.html Wed, 15 Nov 2023 00:00:00 +0000 /entries/Polylog.html Two theorems about the geometry of the critical points of a complex polynomial /entries/Polynomial_Crit_Geometry.html Tue, 14 Nov 2023 00:00:00 +0000 /entries/Polynomial_Crit_Geometry.html Chebyshev Polynomials /entries/Chebyshev_Polynomials.html Mon, 13 Nov 2023 00:00:00 +0000 /entries/Chebyshev_Polynomials.html Concentration Inequalities /entries/Concentration_Inequalities.html Mon, 13 Nov 2023 00:00:00 +0000 /entries/Concentration_Inequalities.html Myhill-Nerode Theorem for Nominal G-Automata /entries/Nominal_Myhill_Nerode.html Fri, 10 Nov 2023 00:00:00 +0000 /entries/Nominal_Myhill_Nerode.html Elimination of Repeated Factors Algorithm /entries/Elimination_Of_Repeated_Factors.html Mon, 06 Nov 2023 00:00:00 +0000 /entries/Elimination_Of_Repeated_Factors.html Perfect Fields /entries/Perfect_Fields.html Mon, 06 Nov 2023 00:00:00 +0000 /entries/Perfect_Fields.html Metatheory of Q0 /entries/Q0_Metatheory.html Sat, 04 Nov 2023 00:00:00 +0000 /entries/Q0_Metatheory.html Disintegration Theorem /entries/Disintegration.html Thu, 02 Nov 2023 00:00:00 +0000 /entries/Disintegration.html Labeled Transition Systems /entries/Labeled_Transition_Systems.html Tue, 31 Oct 2023 00:00:00 +0000 /entries/Labeled_Transition_Systems.html Pushdown Systems /entries/Pushdown_Systems.html Tue, 31 Oct 2023 00:00:00 +0000 /entries/Pushdown_Systems.html Eudoxus Reals /entries/Eudoxus_Reals.html Sun, 29 Oct 2023 00:00:00 +0000 /entries/Eudoxus_Reals.html Transport via Partial Galois Connections and Equivalences /entries/Transport.html Wed, 11 Oct 2023 00:00:00 +0000 /entries/Transport.html Hypergraph Colouring Bounds /entries/Hypergraph_Colourings.html Sat, 23 Sep 2023 00:00:00 +0000 /entries/Hypergraph_Colourings.html Cardinality and Representation of Stone Relation Algebras /entries/Relational_Cardinality.html Fri, 22 Sep 2023 00:00:00 +0000 /entries/Relational_Cardinality.html General Probabilistic Techniques for Combinatorics and the Lovasz Local Lemma /entries/Lovasz_Local.html Wed, 20 Sep 2023 00:00:00 +0000 /entries/Lovasz_Local.html Hypergraphs /entries/Hypergraph_Basics.html Wed, 20 Sep 2023 00:00:00 +0000 /entries/Hypergraph_Basics.html Unification Utilities for Isabelle/ML /entries/ML_Unification.html Tue, 19 Sep 2023 00:00:00 +0000 /entries/ML_Unification.html Euler's Polyhedron Formula /entries/Euler_Polyhedron_Formula.html Sat, 16 Sep 2023 00:00:00 +0000 /entries/Euler_Polyhedron_Formula.html Conformance Relations between Input/Output Languages /entries/IO_Language_Conformance.html Fri, 01 Sep 2023 00:00:00 +0000 /entries/IO_Language_Conformance.html Coupled Similarity and Contrasimilarity, and How to Compute Them /entries/Coupledsim_Contrasim.html Fri, 18 Aug 2023 00:00:00 +0000 /entries/Coupledsim_Contrasim.html Ceva's Theorem /entries/Ceva.html Wed, 16 Aug 2023 00:00:00 +0000 /entries/Ceva.html Catoids, Categories, Groupoids /entries/Catoids.html Mon, 14 Aug 2023 00:00:00 +0000 /entries/Catoids.html Fixed-length vectors /entries/Fixed_Length_Vector.html Mon, 14 Aug 2023 00:00:00 +0000 /entries/Fixed_Length_Vector.html Polygonal Number Theorem /entries/Polygonal_Number_Theorem.html Thu, 10 Aug 2023 00:00:00 +0000 /entries/Polygonal_Number_Theorem.html S-Finite Measure Monad on Quasi-Borel Spaces /entries/S_Finite_Measure_Monad.html Tue, 08 Aug 2023 00:00:00 +0000 /entries/S_Finite_Measure_Monad.html Standard Borel Spaces /entries/Standard_Borel_Spaces.html Tue, 08 Aug 2023 00:00:00 +0000 /entries/Standard_Borel_Spaces.html Modal quantales, involutive quantales, Dedekind Quantales /entries/Quantales_Converse.html Tue, 25 Jul 2023 00:00:00 +0000 /entries/Quantales_Converse.html Earley Parser /entries/Earley_Parser.html Sun, 16 Jul 2023 00:00:00 +0000 /entries/Earley_Parser.html Gray Codes for Arbitrary Numeral Systems /entries/Gray_Codes.html Tue, 11 Jul 2023 00:00:00 +0000 /entries/Gray_Codes.html Executable Randomized Algorithms /entries/Executable_Randomized_Algorithms.html Mon, 19 Jun 2023 00:00:00 +0000 /entries/Executable_Randomized_Algorithms.html DCR Syntax and Execution Equivalent Markings /entries/DCR-ExecutionEquivalence.html Fri, 16 Jun 2023 00:00:00 +0000 /entries/DCR-ExecutionEquivalence.html Zeckendorf’s Theorem /entries/Zeckendorf.html Mon, 12 Jun 2023 00:00:00 +0000 /entries/Zeckendorf.html Cryptographic Standards /entries/Crypto_Standards.html Tue, 06 Jun 2023 00:00:00 +0000 /entries/Crypto_Standards.html A Verified Efficient Implementation of the Weighted Path Order /entries/Efficient_Weighted_Path_Order.html Thu, 01 Jun 2023 00:00:00 +0000 /entries/Efficient_Weighted_Path_Order.html Formalizing Results on Directed Sets /entries/Directed_Sets.html Wed, 24 May 2023 00:00:00 +0000 /entries/Directed_Sets.html Inner Structure, Determinism and Modal Algebra of Multirelations /entries/Multirelations_Heterogeneous.html Mon, 22 May 2023 00:00:00 +0000 /entries/Multirelations_Heterogeneous.html Tree Enumeration /entries/Tree_Enumeration.html Tue, 09 May 2023 00:00:00 +0000 /entries/Tree_Enumeration.html MLSS Decision Procedure /entries/MLSS_Decision_Proc.html Fri, 05 May 2023 00:00:00 +0000 /entries/MLSS_Decision_Proc.html Three Squares Theorem /entries/Three_Squares.html Wed, 03 May 2023 00:00:00 +0000 /entries/Three_Squares.html The Halting Problem is Soluble in Malament-Hogarth Spacetimes /entries/MHComputation.html Sat, 29 Apr 2023 00:00:00 +0000 /entries/MHComputation.html The Schwartz-Zippel Lemma /entries/Schwartz_Zippel.html Thu, 27 Apr 2023 00:00:00 +0000 /entries/Schwartz_Zippel.html A Formalization of the SCL(FOL) Calculus: Simple Clause Learning for First-Order Logic /entries/Simple_Clause_Learning.html Thu, 20 Apr 2023 00:00:00 +0000 /entries/Simple_Clause_Learning.html The CHSH inequality: Tsirelson's upper-bound and other results /entries/TsirelsonBound.html Tue, 18 Apr 2023 00:00:00 +0000 /entries/TsirelsonBound.html Distributed Distinct Elements /entries/Distributed_Distinct_Elements.html Mon, 03 Apr 2023 00:00:00 +0000 /entries/Distributed_Distinct_Elements.html Formalization of Hyper Hoare Logic: A Logic to (Dis-)Prove Program Hyperproperties /entries/HyperHoareLogic.html Mon, 03 Apr 2023 00:00:00 +0000 /entries/HyperHoareLogic.html Positional Notation for Natural Numbers in an Arbitrary Base /entries/DigitsInBase.html Mon, 03 Apr 2023 00:00:00 +0000 /entries/DigitsInBase.html Formalization of CommCSL: A Relational Concurrent Separation Logic for Proving Information Flow Security in Concurrent Programs /entries/CommCSL.html Wed, 15 Mar 2023 00:00:00 +0000 /entries/CommCSL.html No Faster-Than-Light Observers (GenRel) /entries/No_FTL_observers_Gen_Rel.html Sun, 05 Mar 2023 00:00:00 +0000 /entries/No_FTL_observers_Gen_Rel.html Expander Graphs /entries/Expander_Graphs.html Fri, 03 Mar 2023 00:00:00 +0000 /entries/Expander_Graphs.html Renaming-Enriched Sets (Rensets) and Renaming-Based Recursion /entries/Rensets.html Tue, 28 Feb 2023 00:00:00 +0000 /entries/Rensets.html A Sound and Complete Calculus for Probability Inequalities /entries/Probability_Inequality_Completeness.html Mon, 20 Feb 2023 00:00:00 +0000 /entries/Probability_Inequality_Completeness.html Group Law of Edwards Elliptic Curves /entries/Edwards_Elliptic_Curves_Group.html Thu, 16 Feb 2023 00:00:00 +0000 /entries/Edwards_Elliptic_Curves_Group.html Hardness of Lattice Problems /entries/CVP_Hardness.html Thu, 02 Feb 2023 00:00:00 +0000 /entries/CVP_Hardness.html ABY3 Multiplication and Array Shuffling /entries/ABY3_Protocols.html Fri, 27 Jan 2023 00:00:00 +0000 /entries/ABY3_Protocols.html Given Clause Loops /entries/Given_Clause_Loops.html Wed, 25 Jan 2023 00:00:00 +0000 /entries/Given_Clause_Loops.html Suppes' Theorem For Probability Logic /entries/Suppes_Theorem.html Sun, 22 Jan 2023 00:00:00 +0000 /entries/Suppes_Theorem.html A Hoare Logic for Diverging Programs /entries/HoareForDivergence.html Fri, 20 Jan 2023 00:00:00 +0000 /entries/HoareForDivergence.html Strict Omega Categories /entries/StrictOmegaCategories.html Sat, 14 Jan 2023 00:00:00 +0000 /entries/StrictOmegaCategories.html Synthetic Completeness /entries/Synthetic_Completeness.html Mon, 09 Jan 2023 00:00:00 +0000 /entries/Synthetic_Completeness.html The Cook-Levin theorem /entries/Cook_Levin.html Sun, 08 Jan 2023 00:00:00 +0000 /entries/Cook_Levin.html Binary codes that do not preserve primitivity /entries/Binary_Code_Imprimitive.html Tue, 03 Jan 2023 00:00:00 +0000 /entries/Binary_Code_Imprimitive.html Intersection of two monoids generated by two element codes /entries/Two_Generated_Word_Monoids_Intersection.html Tue, 03 Jan 2023 00:00:00 +0000 /entries/Two_Generated_Word_Monoids_Intersection.html A First Complete Algorithm for Real Quantifier Elimination in Isabelle/HOL /entries/Quantifier_Elimination_Hybrid.html Thu, 15 Dec 2022 00:00:00 +0000 /entries/Quantifier_Elimination_Hybrid.html Class-based Classical Propositional Logic /entries/Propositional_Logic_Class.html Thu, 15 Dec 2022 00:00:00 +0000 /entries/Propositional_Logic_Class.html Birkhoff's Representation Theorem For Finite Distributive Lattices /entries/Birkhoff_Finite_Distributive_Lattices.html Tue, 06 Dec 2022 00:00:00 +0000 /entries/Birkhoff_Finite_Distributive_Lattices.html Automation of Boolos' Curious Inference in Isabelle/HOL /entries/Boolos_Curious_Inference_Automated.html Mon, 05 Dec 2022 00:00:00 +0000 /entries/Boolos_Curious_Inference_Automated.html A Verified Translation of Multitape Turing Machines into Singletape Turing Machines /entries/Multitape_To_Singletape_TM.html Wed, 30 Nov 2022 00:00:00 +0000 /entries/Multitape_To_Singletape_TM.html Abstract Object Theory /entries/AOT.html Mon, 28 Nov 2022 00:00:00 +0000 /entries/AOT.html A Formal CHERI-C Memory Model /entries/CHERI-C_Memory_Model.html Fri, 25 Nov 2022 00:00:00 +0000 /entries/CHERI-C_Memory_Model.html Sauer-Shelah Lemma /entries/Sauer_Shelah_Lemma.html Thu, 24 Nov 2022 00:00:00 +0000 /entries/Sauer_Shelah_Lemma.html Kneser's Theorem and the Cauchy–Davenport Theorem /entries/Kneser_Cauchy_Davenport.html Mon, 21 Nov 2022 00:00:00 +0000 /entries/Kneser_Cauchy_Davenport.html Turán's Graph Theorem /entries/Turans_Graph_Theorem.html Mon, 14 Nov 2022 00:00:00 +0000 /entries/Turans_Graph_Theorem.html Combinatorial Enumeration Algorithms /entries/Combinatorial_Enumeration_Algorithms.html Fri, 11 Nov 2022 00:00:00 +0000 /entries/Combinatorial_Enumeration_Algorithms.html The Balog–Szemerédi–Gowers Theorem /entries/Balog_Szemeredi_Gowers.html Fri, 11 Nov 2022 00:00:00 +0000 /entries/Balog_Szemeredi_Gowers.html The Incompatibility of Strategy-Proofness and Representation in Party-Approval Multi-Winner Elections /entries/PAPP_Impossibility.html Thu, 10 Nov 2022 00:00:00 +0000 /entries/PAPP_Impossibility.html Verification of Query Optimization Algorithms /entries/Query_Optimization.html Tue, 04 Oct 2022 00:00:00 +0000 /entries/Query_Optimization.html Maximum Segment Sum /entries/Maximum_Segment_Sum.html Thu, 29 Sep 2022 00:00:00 +0000 /entries/Maximum_Segment_Sum.html Undirected Graph Theory /entries/Undirected_Graph_Theory.html Thu, 29 Sep 2022 00:00:00 +0000 /entries/Undirected_Graph_Theory.html Making Arbitrary Relational Calculus Queries Safe-Range /entries/Safe_Range_RC.html Wed, 28 Sep 2022 00:00:00 +0000 /entries/Safe_Range_RC.html Stalnaker's Epistemic Logic /entries/Stalnaker_Logic.html Fri, 23 Sep 2022 00:00:00 +0000 /entries/Stalnaker_Logic.html p-adic Fields and p-adic Semialgebraic Sets /entries/Padic_Field.html Thu, 22 Sep 2022 00:00:00 +0000 /entries/Padic_Field.html Risk-Free Lending /entries/Risk_Free_Lending.html Sun, 18 Sep 2022 00:00:00 +0000 /entries/Risk_Free_Lending.html Soundness and Completeness of Implicational Logic /entries/Implicational_Logic.html Tue, 13 Sep 2022 00:00:00 +0000 /entries/Implicational_Logic.html CRYSTALS-Kyber /entries/CRYSTALS-Kyber.html Thu, 08 Sep 2022 00:00:00 +0000 /entries/CRYSTALS-Kyber.html Unbounded Separation Logic /entries/Separation_Logic_Unbounded.html Mon, 05 Sep 2022 00:00:00 +0000 /entries/Separation_Logic_Unbounded.html Khovanskii&#x27;s Theorem /entries/Khovanskii_Theorem.html Fri, 02 Sep 2022 00:00:00 +0000 /entries/Khovanskii_Theorem.html The Hales–Jewett Theorem /entries/Hales_Jewett.html Fri, 02 Sep 2022 00:00:00 +0000 /entries/Hales_Jewett.html Number Theoretic Transform /entries/Number_Theoretic_Transform.html Thu, 18 Aug 2022 00:00:00 +0000 /entries/Number_Theoretic_Transform.html Correctness of a Set-based Algorithm for Computing Strongly Connected Components of a Graph /entries/SCC_Bloemen_Sequential.html Wed, 17 Aug 2022 00:00:00 +0000 /entries/SCC_Bloemen_Sequential.html From THE BOOK: Two Squares via Involutions /entries/Involutions2Squares.html Mon, 15 Aug 2022 00:00:00 +0000 /entries/Involutions2Squares.html Verified Complete Test Strategies for Finite State Machines /entries/FSM_Tests.html Tue, 09 Aug 2022 00:00:00 +0000 /entries/FSM_Tests.html Nano JSON: Working with JSON formatted data in Isabelle/HOL and Isabelle/ML /entries/Nano_JSON.html Fri, 29 Jul 2022 00:00:00 +0000 /entries/Nano_JSON.html Isabelle/Solidity: A deep Embedding of Solidity in Isabelle/HOL /entries/Solidity.html Mon, 18 Jul 2022 00:00:00 +0000 /entries/Solidity.html Simultaneous diagonalization of pairwise commuting Hermitian matrices /entries/Commuting_Hermitian.html Mon, 18 Jul 2022 00:00:00 +0000 /entries/Commuting_Hermitian.html Pólya’s Proof of the Weighted Arithmetic–Geometric Mean Inequality /entries/Weighted_Arithmetic_Geometric_Mean.html Mon, 11 Jul 2022 00:00:00 +0000 /entries/Weighted_Arithmetic_Geometric_Mean.html A Reuse-Based Multi-Stage Compiler Verification for Language IMP /entries/IMP_Compiler_Reuse.html Sun, 10 Jul 2022 00:00:00 +0000 /entries/IMP_Compiler_Reuse.html Real-Time Double-Ended Queue /entries/Real_Time_Deque.html Thu, 23 Jun 2022 00:00:00 +0000 /entries/Real_Time_Deque.html Boolos's Curious Inference in Isabelle/HOL /entries/Boolos_Curious_Inference.html Mon, 20 Jun 2022 00:00:00 +0000 /entries/Boolos_Curious_Inference.html Finite Fields /entries/Finite_Fields.html Wed, 08 Jun 2022 00:00:00 +0000 /entries/Finite_Fields.html IsaNet: Formalization of a Verification Framework for Secure Data Plane Protocols /entries/IsaNet.html Wed, 08 Jun 2022 00:00:00 +0000 /entries/IsaNet.html Diophantine Equations and the DPRM Theorem /entries/DPRM_Theorem.html Mon, 06 Jun 2022 00:00:00 +0000 /entries/DPRM_Theorem.html Reducing Rewrite Properties to Properties on Ground Terms /entries/Rewrite_Properties_Reduction.html Thu, 02 Jun 2022 00:00:00 +0000 /entries/Rewrite_Properties_Reduction.html A Restricted Definition of the Magic Wand to Soundly Combine Fractions of a Wand /entries/Combinable_Wands.html Mon, 30 May 2022 00:00:00 +0000 /entries/Combinable_Wands.html The Plünnecke-Ruzsa Inequality /entries/Pluennecke_Ruzsa_Inequality.html Thu, 26 May 2022 00:00:00 +0000 /entries/Pluennecke_Ruzsa_Inequality.html Formalization of a Framework for the Sound Automation of Magic Wands /entries/Package_logic.html Wed, 18 May 2022 00:00:00 +0000 /entries/Package_logic.html Clique is not solvable by monotone circuits of polynomial size /entries/Clique_and_Monotone_Circuits.html Sun, 08 May 2022 00:00:00 +0000 /entries/Clique_and_Monotone_Circuits.html Fisher's Inequality: Linear Algebraic Proof Techniques for Combinatorics /entries/Fishers_Inequality.html Thu, 21 Apr 2022 00:00:00 +0000 /entries/Fishers_Inequality.html Digit Expansions /entries/Digit_Expansions.html Wed, 20 Apr 2022 00:00:00 +0000 /entries/Digit_Expansions.html The Generalized Multiset Ordering is NP-Complete /entries/Multiset_Ordering_NPC.html Wed, 20 Apr 2022 00:00:00 +0000 /entries/Multiset_Ordering_NPC.html The Sophomore's Dream /entries/Sophomores_Dream.html Sun, 10 Apr 2022 00:00:00 +0000 /entries/Sophomores_Dream.html A Combinator Library for Prefix-Free Codes /entries/Prefix_Free_Code_Combinators.html Fri, 08 Apr 2022 00:00:00 +0000 /entries/Prefix_Free_Code_Combinators.html Formalization of Randomized Approximation Algorithms for Frequency Moments /entries/Frequency_Moments.html Fri, 08 Apr 2022 00:00:00 +0000 /entries/Frequency_Moments.html Constructing the Reals as Dedekind Cuts of Rationals /entries/Dedekind_Real.html Thu, 24 Mar 2022 00:00:00 +0000 /entries/Dedekind_Real.html Ackermann's Function Is Not Primitive Recursive /entries/Ackermanns_not_PR.html Wed, 23 Mar 2022 00:00:00 +0000 /entries/Ackermanns_not_PR.html A Naive Prover for First-Order Logic /entries/FOL_Seq_Calc3.html Tue, 22 Mar 2022 00:00:00 +0000 /entries/FOL_Seq_Calc3.html A Proof from THE BOOK: The Partial Fraction Expansion of the Cotangent /entries/Cotangent_PFD_Formula.html Tue, 15 Mar 2022 00:00:00 +0000 /entries/Cotangent_PFD_Formula.html The Independence of the Continuum Hypothesis in Isabelle/ZF /entries/Independence_CH.html Sun, 06 Mar 2022 00:00:00 +0000 /entries/Independence_CH.html Transitive Models of Fragments of ZFC /entries/Transitive_Models.html Thu, 03 Mar 2022 00:00:00 +0000 /entries/Transitive_Models.html Residuated Transition Systems /entries/ResiduatedTransitionSystem.html Mon, 28 Feb 2022 00:00:00 +0000 /entries/ResiduatedTransitionSystem.html Universal Hash Families /entries/Universal_Hash_Families.html Sun, 20 Feb 2022 00:00:00 +0000 /entries/Universal_Hash_Families.html Wetzel's Problem and the Continuum Hypothesis /entries/Wetzels_Problem.html Fri, 18 Feb 2022 00:00:00 +0000 /entries/Wetzels_Problem.html First-Order Query Evaluation /entries/Eval_FO.html Tue, 15 Feb 2022 00:00:00 +0000 /entries/Eval_FO.html Multi-Head Monitoring of Metric Dynamic Logic /entries/VYDRA_MDL.html Sun, 13 Feb 2022 00:00:00 +0000 /entries/VYDRA_MDL.html Enumeration of Equivalence Relations /entries/Equivalence_Relation_Enumeration.html Fri, 04 Feb 2022 00:00:00 +0000 /entries/Equivalence_Relation_Enumeration.html Duality of Linear Programming /entries/LP_Duality.html Thu, 03 Feb 2022 00:00:00 +0000 /entries/LP_Duality.html Quasi-Borel Spaces /entries/Quasi_Borel_Spaces.html Thu, 03 Feb 2022 00:00:00 +0000 /entries/Quasi_Borel_Spaces.html First-Order Theory of Rewriting /entries/FO_Theory_Rewriting.html Wed, 02 Feb 2022 00:00:00 +0000 /entries/FO_Theory_Rewriting.html A Sequent Calculus Prover for First-Order Logic with Functions /entries/FOL_Seq_Calc2.html Mon, 31 Jan 2022 00:00:00 +0000 /entries/FOL_Seq_Calc2.html Young's Inequality for Increasing Functions /entries/Youngs_Inequality.html Mon, 31 Jan 2022 00:00:00 +0000 /entries/Youngs_Inequality.html Interpolation Polynomials (in HOL-Algebra) /entries/Interpolation_Polynomials_HOL_Algebra.html Sat, 29 Jan 2022 00:00:00 +0000 /entries/Interpolation_Polynomials_HOL_Algebra.html Median Method /entries/Median_Method.html Tue, 25 Jan 2022 00:00:00 +0000 /entries/Median_Method.html Actuarial Mathematics /entries/Actuarial_Mathematics.html Sun, 23 Jan 2022 00:00:00 +0000 /entries/Actuarial_Mathematics.html Irrational numbers from THE BOOK /entries/Irrationals_From_THEBOOK.html Sat, 08 Jan 2022 00:00:00 +0000 /entries/Irrationals_From_THEBOOK.html Knight's Tour Revisited Revisited /entries/Knights_Tour.html Tue, 04 Jan 2022 00:00:00 +0000 /entries/Knights_Tour.html Hyperdual Numbers and Forward Differentiation /entries/Hyperdual.html Fri, 31 Dec 2021 00:00:00 +0000 /entries/Hyperdual.html Gale-Shapley Algorithm /entries/Gale_Shapley.html Wed, 29 Dec 2021 00:00:00 +0000 /entries/Gale_Shapley.html Roth's Theorem on Arithmetic Progressions /entries/Roth_Arithmetic_Progressions.html Tue, 28 Dec 2021 00:00:00 +0000 /entries/Roth_Arithmetic_Progressions.html Markov Decision Processes with Rewards /entries/MDP-Rewards.html Thu, 16 Dec 2021 00:00:00 +0000 /entries/MDP-Rewards.html Verified Algorithms for Solving Markov Decision Processes /entries/MDP-Algorithms.html Thu, 16 Dec 2021 00:00:00 +0000 /entries/MDP-Algorithms.html Regular Tree Relations /entries/Regular_Tree_Relations.html Wed, 15 Dec 2021 00:00:00 +0000 /entries/Regular_Tree_Relations.html Simplicial Complexes and Boolean functions /entries/Simplicial_complexes_and_boolean_functions.html Mon, 29 Nov 2021 00:00:00 +0000 /entries/Simplicial_complexes_and_boolean_functions.html van Emde Boas Trees /entries/Van_Emde_Boas_Trees.html Tue, 23 Nov 2021 00:00:00 +0000 /entries/Van_Emde_Boas_Trees.html Foundation of geometry in planes, and some complements: Excluding the parallel axioms /entries/Foundation_of_geometry.html Mon, 22 Nov 2021 00:00:00 +0000 /entries/Foundation_of_geometry.html The Hahn and Jordan Decomposition Theorems /entries/Hahn_Jordan_Decomposition.html Fri, 19 Nov 2021 00:00:00 +0000 /entries/Hahn_Jordan_Decomposition.html Automating Public Announcement Logic and the Wise Men Puzzle in Isabelle/HOL /entries/PAL.html Mon, 08 Nov 2021 00:00:00 +0000 /entries/PAL.html Exploring Simplified Variants of Gödel’s Ontological Argument in Isabelle/HOL /entries/SimplifiedOntologicalArgument.html Mon, 08 Nov 2021 00:00:00 +0000 /entries/SimplifiedOntologicalArgument.html Factorization of Polynomials with Algebraic Coefficients /entries/Factor_Algebraic_Polynomial.html Mon, 08 Nov 2021 00:00:00 +0000 /entries/Factor_Algebraic_Polynomial.html Real Exponents as the Limits of Sequences of Rational Exponents /entries/Real_Power.html Mon, 08 Nov 2021 00:00:00 +0000 /entries/Real_Power.html Szemerédi's Regularity Lemma /entries/Szemeredi_Regularity.html Fri, 05 Nov 2021 00:00:00 +0000 /entries/Szemeredi_Regularity.html Quantum and Classical Registers /entries/Registers.html Thu, 28 Oct 2021 00:00:00 +0000 /entries/Registers.html Belief Revision Theory /entries/Belief_Revision.html Tue, 19 Oct 2021 00:00:00 +0000 /entries/Belief_Revision.html X86 instruction semantics and basic block symbolic execution /entries/X86_Semantics.html Wed, 13 Oct 2021 00:00:00 +0000 /entries/X86_Semantics.html Algebras for Iteration, Infinite Executions and Correctness of Sequential Computations /entries/Correctness_Algebras.html Tue, 12 Oct 2021 00:00:00 +0000 /entries/Correctness_Algebras.html Verified Quadratic Virtual Substitution for Real Arithmetic /entries/Virtual_Substitution.html Sat, 02 Oct 2021 00:00:00 +0000 /entries/Virtual_Substitution.html Soundness and Completeness of an Axiomatic System for First-Order Logic /entries/FOL_Axiomatic.html Fri, 24 Sep 2021 00:00:00 +0000 /entries/FOL_Axiomatic.html Complex Bounded Operators /entries/Complex_Bounded_Operators.html Sat, 18 Sep 2021 00:00:00 +0000 /entries/Complex_Bounded_Operators.html A Formalization of Weighted Path Orders and Recursive Path Orders /entries/Weighted_Path_Order.html Thu, 16 Sep 2021 00:00:00 +0000 /entries/Weighted_Path_Order.html Category Theory for ZFC in HOL I: Foundations: Design Patterns, Set Theory, Digraphs, Semicategories /entries/CZH_Foundations.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/CZH_Foundations.html Category Theory for ZFC in HOL II: Elementary Theory of 1-Categories /entries/CZH_Elementary_Categories.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/CZH_Elementary_Categories.html Category Theory for ZFC in HOL III: Universal Constructions /entries/CZH_Universal_Constructions.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/CZH_Universal_Constructions.html Conditional Simplification /entries/Conditional_Simplification.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/Conditional_Simplification.html Conditional Transfer Rule /entries/Conditional_Transfer_Rule.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/Conditional_Transfer_Rule.html Extension of Types-To-Sets /entries/Types_To_Sets_Extension.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/Types_To_Sets_Extension.html IDE: Introduction, Destruction, Elimination /entries/Intro_Dest_Elim.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/Intro_Dest_Elim.html A data flow analysis algorithm for computing dominators /entries/Dominance_CHK.html Sun, 05 Sep 2021 00:00:00 +0000 /entries/Dominance_CHK.html Solving Cubic and Quartic Equations /entries/Cubic_Quartic_Equations.html Fri, 03 Sep 2021 00:00:00 +0000 /entries/Cubic_Quartic_Equations.html Logging-independent Message Anonymity in the Relational Method /entries/Logging_Independent_Anonymity.html Thu, 26 Aug 2021 00:00:00 +0000 /entries/Logging_Independent_Anonymity.html The Theorem of Three Circles /entries/Three_Circles.html Sat, 21 Aug 2021 00:00:00 +0000 /entries/Three_Circles.html CoCon: A Confidentiality-Verified Conference Management System /entries/CoCon.html Mon, 16 Aug 2021 00:00:00 +0000 /entries/CoCon.html Compositional BD Security /entries/BD_Security_Compositional.html Mon, 16 Aug 2021 00:00:00 +0000 /entries/BD_Security_Compositional.html CoSMed: A confidentiality-verified social media platform /entries/CoSMed.html Mon, 16 Aug 2021 00:00:00 +0000 /entries/CoSMed.html CoSMeDis: A confidentiality-verified distributed social media platform /entries/CoSMeDis.html Mon, 16 Aug 2021 00:00:00 +0000 /entries/CoSMeDis.html Fresh identifiers /entries/Fresh_Identifiers.html Mon, 16 Aug 2021 00:00:00 +0000 /entries/Fresh_Identifiers.html Combinatorial Design Theory /entries/Design_Theory.html Fri, 13 Aug 2021 00:00:00 +0000 /entries/Design_Theory.html Relational Forests /entries/Relational_Forests.html Tue, 03 Aug 2021 00:00:00 +0000 /entries/Relational_Forests.html Schutz' Independent Axioms for Minkowski Spacetime /entries/Schutz_Spacetime.html Tue, 27 Jul 2021 00:00:00 +0000 /entries/Schutz_Spacetime.html Finitely Generated Abelian Groups /entries/Finitely_Generated_Abelian_Groups.html Wed, 07 Jul 2021 00:00:00 +0000 /entries/Finitely_Generated_Abelian_Groups.html SpecCheck - Specification-Based Testing for Isabelle/ML /entries/SpecCheck.html Thu, 01 Jul 2021 00:00:00 +0000 /entries/SpecCheck.html Van der Waerden's Theorem /entries/Van_der_Waerden.html Tue, 22 Jun 2021 00:00:00 +0000 /entries/Van_der_Waerden.html MiniSail - A kernel language for the ISA specification language SAIL /entries/MiniSail.html Fri, 18 Jun 2021 00:00:00 +0000 /entries/MiniSail.html Public Announcement Logic /entries/Public_Announcement_Logic.html Thu, 17 Jun 2021 00:00:00 +0000 /entries/Public_Announcement_Logic.html A Shorter Compiler Correctness Proof for Language IMP /entries/IMP_Compiler.html Fri, 04 Jun 2021 00:00:00 +0000 /entries/IMP_Compiler.html Combinatorics on Words Basics /entries/Combinatorics_Words.html Mon, 24 May 2021 00:00:00 +0000 /entries/Combinatorics_Words.html Graph Lemma /entries/Combinatorics_Words_Graph_Lemma.html Mon, 24 May 2021 00:00:00 +0000 /entries/Combinatorics_Words_Graph_Lemma.html Lyndon words /entries/Combinatorics_Words_Lyndon.html Mon, 24 May 2021 00:00:00 +0000 /entries/Combinatorics_Words_Lyndon.html Regression Test Selection /entries/Regression_Test_Selection.html Fri, 30 Apr 2021 00:00:00 +0000 /entries/Regression_Test_Selection.html Isabelle's Metalogic: Formalization and Proof Checker /entries/Metalogic_ProofChecker.html Tue, 27 Apr 2021 00:00:00 +0000 /entries/Metalogic_ProofChecker.html Lifting the Exponent /entries/Lifting_the_Exponent.html Tue, 27 Apr 2021 00:00:00 +0000 /entries/Lifting_the_Exponent.html The BKR Decision Procedure for Univariate Real Arithmetic /entries/BenOr_Kozen_Reif.html Sat, 24 Apr 2021 00:00:00 +0000 /entries/BenOr_Kozen_Reif.html Gale-Stewart Games /entries/GaleStewart_Games.html Fri, 23 Apr 2021 00:00:00 +0000 /entries/GaleStewart_Games.html Formalization of Timely Dataflow's Progress Tracking Protocol /entries/Progress_Tracking.html Tue, 13 Apr 2021 00:00:00 +0000 /entries/Progress_Tracking.html Information Flow Control via Dependency Tracking /entries/IFC_Tracking.html Thu, 01 Apr 2021 00:00:00 +0000 /entries/IFC_Tracking.html Grothendieck's Schemes in Algebraic Geometry /entries/Grothendieck_Schemes.html Mon, 29 Mar 2021 00:00:00 +0000 /entries/Grothendieck_Schemes.html Hensel's Lemma for the p-adic Integers /entries/Padic_Ints.html Tue, 23 Mar 2021 00:00:00 +0000 /entries/Padic_Ints.html Constructive Cryptography in HOL: the Communication Modeling Aspect /entries/Constructive_Cryptography_CM.html Wed, 17 Mar 2021 00:00:00 +0000 /entries/Constructive_Cryptography_CM.html Two algorithms based on modular arithmetic: lattice basis reduction and Hermite normal form computation /entries/Modular_arithmetic_LLL_and_HNF_algorithms.html Fri, 12 Mar 2021 00:00:00 +0000 /entries/Modular_arithmetic_LLL_and_HNF_algorithms.html Quantum projective measurements and the CHSH inequality /entries/Projective_Measurements.html Wed, 03 Mar 2021 00:00:00 +0000 /entries/Projective_Measurements.html The Hermite–Lindemann–Weierstraß Transcendence Theorem /entries/Hermite_Lindemann.html Wed, 03 Mar 2021 00:00:00 +0000 /entries/Hermite_Lindemann.html Mereology /entries/Mereology.html Mon, 01 Mar 2021 00:00:00 +0000 /entries/Mereology.html The Sunflower Lemma of Erdős and Rado /entries/Sunflowers.html Thu, 25 Feb 2021 00:00:00 +0000 /entries/Sunflowers.html A Verified Imperative Implementation of B-Trees /entries/BTree.html Wed, 24 Feb 2021 00:00:00 +0000 /entries/BTree.html Formal Puiseux Series /entries/Formal_Puiseux_Series.html Wed, 17 Feb 2021 00:00:00 +0000 /entries/Formal_Puiseux_Series.html The Laws of Large Numbers /entries/Laws_of_Large_Numbers.html Wed, 10 Feb 2021 00:00:00 +0000 /entries/Laws_of_Large_Numbers.html Tarski's Parallel Postulate implies the 5th Postulate of Euclid, the Postulate of Playfair and the original Parallel Postulate of Euclid /entries/IsaGeoCoq.html Sun, 31 Jan 2021 00:00:00 +0000 /entries/IsaGeoCoq.html Solution to the xkcd Blue Eyes puzzle /entries/Blue_Eyes.html Sat, 30 Jan 2021 00:00:00 +0000 /entries/Blue_Eyes.html Hood-Melville Queue /entries/Hood_Melville_Queue.html Mon, 18 Jan 2021 00:00:00 +0000 /entries/Hood_Melville_Queue.html JinjaDCI: a Java semantics with dynamic class initialization /entries/JinjaDCI.html Mon, 11 Jan 2021 00:00:00 +0000 /entries/JinjaDCI.html Cofinality and the Delta System Lemma /entries/Delta_System_Lemma.html Sun, 27 Dec 2020 00:00:00 +0000 /entries/Delta_System_Lemma.html Topological semantics for paraconsistent and paracomplete logics /entries/Topological_Semantics.html Thu, 17 Dec 2020 00:00:00 +0000 /entries/Topological_Semantics.html Relational Minimum Spanning Tree Algorithms /entries/Relational_Minimum_Spanning_Trees.html Tue, 08 Dec 2020 00:00:00 +0000 /entries/Relational_Minimum_Spanning_Trees.html Inline Caching and Unboxing Optimization for Interpreters /entries/Interpreter_Optimizations.html Mon, 07 Dec 2020 00:00:00 +0000 /entries/Interpreter_Optimizations.html The Relational Method with Message Anonymity for the Verification of Cryptographic Protocols /entries/Relational_Method.html Sat, 05 Dec 2020 00:00:00 +0000 /entries/Relational_Method.html Isabelle Marries Dirac: a Library for Quantum Computation and Quantum Information /entries/Isabelle_Marries_Dirac.html Sun, 22 Nov 2020 00:00:00 +0000 /entries/Isabelle_Marries_Dirac.html The HOL-CSP Refinement Toolkit /entries/CSP_RefTK.html Thu, 19 Nov 2020 00:00:00 +0000 /entries/CSP_RefTK.html AI Planning Languages Semantics /entries/AI_Planning_Languages_Semantics.html Thu, 29 Oct 2020 00:00:00 +0000 /entries/AI_Planning_Languages_Semantics.html Verified SAT-Based AI Planning /entries/Verified_SAT_Based_AI_Planning.html Thu, 29 Oct 2020 00:00:00 +0000 /entries/Verified_SAT_Based_AI_Planning.html A Sound Type System for Physical Quantities, Units, and Measurements /entries/Physical_Quantities.html Tue, 20 Oct 2020 00:00:00 +0000 /entries/Physical_Quantities.html Finite Map Extras /entries/Finite-Map-Extras.html Mon, 12 Oct 2020 00:00:00 +0000 /entries/Finite-Map-Extras.html A Formal Model of the Document Object Model with Shadow Roots /entries/Shadow_DOM.html Mon, 28 Sep 2020 00:00:00 +0000 /entries/Shadow_DOM.html A Formal Model of the Safely Composable Document Object Model with Shadow Roots /entries/Shadow_SC_DOM.html Mon, 28 Sep 2020 00:00:00 +0000 /entries/Shadow_SC_DOM.html A Formalization of Safely Composable Web Components /entries/SC_DOM_Components.html Mon, 28 Sep 2020 00:00:00 +0000 /entries/SC_DOM_Components.html A Formalization of Web Components /entries/DOM_Components.html Mon, 28 Sep 2020 00:00:00 +0000 /entries/DOM_Components.html The Safely Composable DOM /entries/Core_SC_DOM.html Mon, 28 Sep 2020 00:00:00 +0000 /entries/Core_SC_DOM.html An Abstract Formalization of G&ouml;del's Incompleteness Theorems /entries/Goedel_Incompleteness.html Wed, 16 Sep 2020 00:00:00 +0000 /entries/Goedel_Incompleteness.html From Abstract to Concrete G&ouml;del's Incompleteness Theorems&mdash;Part I /entries/Goedel_HFSet_Semantic.html Wed, 16 Sep 2020 00:00:00 +0000 /entries/Goedel_HFSet_Semantic.html From Abstract to Concrete G&ouml;del's Incompleteness Theorems&mdash;Part II /entries/Goedel_HFSet_Semanticless.html Wed, 16 Sep 2020 00:00:00 +0000 /entries/Goedel_HFSet_Semanticless.html Robinson Arithmetic /entries/Robinson_Arithmetic.html Wed, 16 Sep 2020 00:00:00 +0000 /entries/Robinson_Arithmetic.html Syntax-Independent Logic Infrastructure /entries/Syntax_Independent_Logic.html Wed, 16 Sep 2020 00:00:00 +0000 /entries/Syntax_Independent_Logic.html A Formal Model of Extended Finite State Machines /entries/Extended_Finite_State_Machines.html Mon, 07 Sep 2020 00:00:00 +0000 /entries/Extended_Finite_State_Machines.html Inference of Extended Finite State Machines /entries/Extended_Finite_State_Machine_Inference.html Mon, 07 Sep 2020 00:00:00 +0000 /entries/Extended_Finite_State_Machine_Inference.html Practical Algebraic Calculus Checker /entries/PAC_Checker.html Mon, 31 Aug 2020 00:00:00 +0000 /entries/PAC_Checker.html Some classical results in inductive inference of recursive functions /entries/Inductive_Inference.html Mon, 31 Aug 2020 00:00:00 +0000 /entries/Inductive_Inference.html Relational Disjoint-Set Forests /entries/Relational_Disjoint_Set_Forests.html Wed, 26 Aug 2020 00:00:00 +0000 /entries/Relational_Disjoint_Set_Forests.html Extensions to the Comprehensive Framework for Saturation Theorem Proving /entries/Saturation_Framework_Extensions.html Tue, 25 Aug 2020 00:00:00 +0000 /entries/Saturation_Framework_Extensions.html Putting the `K' into Bird's derivation of Knuth-Morris-Pratt string matching /entries/BirdKMP.html Tue, 25 Aug 2020 00:00:00 +0000 /entries/BirdKMP.html Amicable Numbers /entries/Amicable_Numbers.html Tue, 04 Aug 2020 00:00:00 +0000 /entries/Amicable_Numbers.html Ordinal Partitions /entries/Ordinal_Partitions.html Mon, 03 Aug 2020 00:00:00 +0000 /entries/Ordinal_Partitions.html A Formal Proof of The Chandy--Lamport Distributed Snapshot Algorithm /entries/Chandy_Lamport.html Tue, 21 Jul 2020 00:00:00 +0000 /entries/Chandy_Lamport.html Relational Characterisations of Paths /entries/Relational_Paths.html Mon, 13 Jul 2020 00:00:00 +0000 /entries/Relational_Paths.html A Formally Verified Checker of the Safe Distance Traffic Rules for Autonomous Vehicles /entries/Safe_Distance.html Mon, 01 Jun 2020 00:00:00 +0000 /entries/Safe_Distance.html A verified algorithm for computing the Smith normal form of a matrix /entries/Smith_Normal_Form.html Sat, 23 May 2020 00:00:00 +0000 /entries/Smith_Normal_Form.html The Nash-Williams Partition Theorem /entries/Nash_Williams.html Sat, 16 May 2020 00:00:00 +0000 /entries/Nash_Williams.html A Formalization of Knuth–Bendix Orders /entries/Knuth_Bendix_Order.html Wed, 13 May 2020 00:00:00 +0000 /entries/Knuth_Bendix_Order.html Irrationality Criteria for Series by Erdős and Straus /entries/Irrational_Series_Erdos_Straus.html Tue, 12 May 2020 00:00:00 +0000 /entries/Irrational_Series_Erdos_Straus.html Recursion Theorem in ZF /entries/Recursion-Addition.html Mon, 11 May 2020 00:00:00 +0000 /entries/Recursion-Addition.html An Efficient Normalisation Procedure for Linear Temporal Logic: Isabelle/HOL Formalisation /entries/LTL_Normal_Form.html Fri, 08 May 2020 00:00:00 +0000 /entries/LTL_Normal_Form.html Formalization of Forcing in Isabelle/ZF /entries/Forcing.html Wed, 06 May 2020 00:00:00 +0000 /entries/Forcing.html Banach-Steinhaus Theorem /entries/Banach_Steinhaus.html Sat, 02 May 2020 00:00:00 +0000 /entries/Banach_Steinhaus.html Attack Trees in Isabelle for GDPR compliance of IoT healthcare systems /entries/Attack_Trees.html Mon, 27 Apr 2020 00:00:00 +0000 /entries/Attack_Trees.html Gaussian Integers /entries/Gaussian_Integers.html Fri, 24 Apr 2020 00:00:00 +0000 /entries/Gaussian_Integers.html Power Sum Polynomials /entries/Power_Sum_Polynomials.html Fri, 24 Apr 2020 00:00:00 +0000 /entries/Power_Sum_Polynomials.html The Lambert W Function on the Reals /entries/Lambert_W.html Fri, 24 Apr 2020 00:00:00 +0000 /entries/Lambert_W.html Matrices for ODEs /entries/Matrices_for_ODEs.html Sun, 19 Apr 2020 00:00:00 +0000 /entries/Matrices_for_ODEs.html Authenticated Data Structures As Functors /entries/ADS_Functor.html Thu, 16 Apr 2020 00:00:00 +0000 /entries/ADS_Functor.html Formalization of an Algorithm for Greedily Computing Associative Aggregations on Sliding Windows /entries/Sliding_Window_Algorithm.html Fri, 10 Apr 2020 00:00:00 +0000 /entries/Sliding_Window_Algorithm.html A Comprehensive Framework for Saturation Theorem Proving /entries/Saturation_Framework.html Thu, 09 Apr 2020 00:00:00 +0000 /entries/Saturation_Framework.html Formalization of an Optimized Monitoring Algorithm for Metric First-Order Dynamic Logic with Aggregations /entries/MFODL_Monitor_Optimized.html Thu, 09 Apr 2020 00:00:00 +0000 /entries/MFODL_Monitor_Optimized.html Automated Stateful Protocol Verification /entries/Automated_Stateful_Protocol_Verification.html Wed, 08 Apr 2020 00:00:00 +0000 /entries/Automated_Stateful_Protocol_Verification.html Stateful Protocol Composition and Typing /entries/Stateful_Protocol_Composition_and_Typing.html Wed, 08 Apr 2020 00:00:00 +0000 /entries/Stateful_Protocol_Composition_and_Typing.html Lucas's Theorem /entries/Lucas_Theorem.html Tue, 07 Apr 2020 00:00:00 +0000 /entries/Lucas_Theorem.html Strong Eventual Consistency of the Collaborative Editing Framework WOOT /entries/WOOT_Strong_Eventual_Consistency.html Wed, 25 Mar 2020 00:00:00 +0000 /entries/WOOT_Strong_Eventual_Consistency.html Furstenberg's topology and his proof of the infinitude of primes /entries/Furstenberg_Topology.html Sun, 22 Mar 2020 00:00:00 +0000 /entries/Furstenberg_Topology.html An Under-Approximate Relational Logic /entries/Relational-Incorrectness-Logic.html Thu, 12 Mar 2020 00:00:00 +0000 /entries/Relational-Incorrectness-Logic.html Hello World /entries/Hello_World.html Sat, 07 Mar 2020 00:00:00 +0000 /entries/Hello_World.html Implementing the Goodstein Function in &lambda;-Calculus /entries/Goodstein_Lambda.html Fri, 21 Feb 2020 00:00:00 +0000 /entries/Goodstein_Lambda.html A Generic Framework for Verified Compilers /entries/VeriComp.html Mon, 10 Feb 2020 00:00:00 +0000 /entries/VeriComp.html Arithmetic progressions and relative primes /entries/Arith_Prog_Rel_Primes.html Sat, 01 Feb 2020 00:00:00 +0000 /entries/Arith_Prog_Rel_Primes.html A Hierarchy of Algebras for Boolean Subsets /entries/Subset_Boolean_Algebras.html Fri, 31 Jan 2020 00:00:00 +0000 /entries/Subset_Boolean_Algebras.html Mersenne primes and the Lucas–Lehmer test /entries/Mersenne_Primes.html Fri, 17 Jan 2020 00:00:00 +0000 /entries/Mersenne_Primes.html Verified Approximation Algorithms /entries/Approximation_Algorithms.html Thu, 16 Jan 2020 00:00:00 +0000 /entries/Approximation_Algorithms.html Closest Pair of Points Algorithms /entries/Closest_Pair_Points.html Mon, 13 Jan 2020 00:00:00 +0000 /entries/Closest_Pair_Points.html Skip Lists /entries/Skip_Lists.html Thu, 09 Jan 2020 00:00:00 +0000 /entries/Skip_Lists.html Bicategories /entries/Bicategory.html Mon, 06 Jan 2020 00:00:00 +0000 /entries/Bicategory.html The Irrationality of ζ(3) /entries/Zeta_3_Irrational.html Fri, 27 Dec 2019 00:00:00 +0000 /entries/Zeta_3_Irrational.html Formalizing a Seligman-Style Tableau System for Hybrid Logic /entries/Hybrid_Logic.html Fri, 20 Dec 2019 00:00:00 +0000 /entries/Hybrid_Logic.html The Poincaré-Bendixson Theorem /entries/Poincare_Bendixson.html Wed, 18 Dec 2019 00:00:00 +0000 /entries/Poincare_Bendixson.html Complex Geometry /entries/Complex_Geometry.html Mon, 16 Dec 2019 00:00:00 +0000 /entries/Complex_Geometry.html Poincaré Disc Model /entries/Poincare_Disc.html Mon, 16 Dec 2019 00:00:00 +0000 /entries/Poincare_Disc.html Gauss Sums and the Pólya–Vinogradov Inequality /entries/Gauss_Sums.html Tue, 10 Dec 2019 00:00:00 +0000 /entries/Gauss_Sums.html An Efficient Generalization of Counting Sort for Large, possibly Infinite Key Ranges /entries/Generalized_Counting_Sort.html Wed, 04 Dec 2019 00:00:00 +0000 /entries/Generalized_Counting_Sort.html Interval Arithmetic on 32-bit Words /entries/Interval_Arithmetic_Word32.html Wed, 27 Nov 2019 00:00:00 +0000 /entries/Interval_Arithmetic_Word32.html Zermelo Fraenkel Set Theory in Higher-Order Logic /entries/ZFC_in_HOL.html Thu, 24 Oct 2019 00:00:00 +0000 /entries/ZFC_in_HOL.html Isabelle/C /entries/Isabelle_C.html Tue, 22 Oct 2019 00:00:00 +0000 /entries/Isabelle_C.html VerifyThis 2019 -- Polished Isabelle Solutions /entries/VerifyThis2019.html Wed, 16 Oct 2019 00:00:00 +0000 /entries/VerifyThis2019.html Aristotle's Assertoric Syllogistic /entries/Aristotles_Assertoric_Syllogistic.html Tue, 08 Oct 2019 00:00:00 +0000 /entries/Aristotles_Assertoric_Syllogistic.html Sigma Protocols and Commitment Schemes /entries/Sigma_Commit_Crypto.html Mon, 07 Oct 2019 00:00:00 +0000 /entries/Sigma_Commit_Crypto.html Clean - An Abstract Imperative Programming Language and its Theory /entries/Clean.html Fri, 04 Oct 2019 00:00:00 +0000 /entries/Clean.html Formalization of Multiway-Join Algorithms /entries/Generic_Join.html Mon, 16 Sep 2019 00:00:00 +0000 /entries/Generic_Join.html Verification Components for Hybrid Systems /entries/Hybrid_Systems_VCs.html Tue, 10 Sep 2019 00:00:00 +0000 /entries/Hybrid_Systems_VCs.html Fourier Series /entries/Fourier.html Fri, 06 Sep 2019 00:00:00 +0000 /entries/Fourier.html A Case Study in Basic Algebra /entries/Jacobson_Basic_Algebra.html Fri, 30 Aug 2019 00:00:00 +0000 /entries/Jacobson_Basic_Algebra.html Formalisation of an Adaptive State Counting Algorithm /entries/Adaptive_State_Counting.html Fri, 16 Aug 2019 00:00:00 +0000 /entries/Adaptive_State_Counting.html Laplace Transform /entries/Laplace_Transform.html Wed, 14 Aug 2019 00:00:00 +0000 /entries/Laplace_Transform.html Communicating Concurrent Kleene Algebra for Distributed Systems Specification /entries/C2KA_DistributedSystems.html Tue, 06 Aug 2019 00:00:00 +0000 /entries/C2KA_DistributedSystems.html Linear Programming /entries/Linear_Programming.html Tue, 06 Aug 2019 00:00:00 +0000 /entries/Linear_Programming.html Selected Problems from the International Mathematical Olympiad 2019 /entries/IMO2019.html Mon, 05 Aug 2019 00:00:00 +0000 /entries/IMO2019.html Stellar Quorum Systems /entries/Stellar_Quorums.html Thu, 01 Aug 2019 00:00:00 +0000 /entries/Stellar_Quorums.html A Formal Development of a Polychronous Polytimed Coordination Language /entries/TESL_Language.html Tue, 30 Jul 2019 00:00:00 +0000 /entries/TESL_Language.html Order Extension and Szpilrajn's Extension Theorem /entries/Szpilrajn.html Sat, 27 Jul 2019 00:00:00 +0000 /entries/Szpilrajn.html A Sequent Calculus for First-Order Logic /entries/FOL_Seq_Calc1.html Thu, 18 Jul 2019 00:00:00 +0000 /entries/FOL_Seq_Calc1.html A Verified Code Generator from Isabelle/HOL to CakeML /entries/CakeML_Codegen.html Mon, 08 Jul 2019 00:00:00 +0000 /entries/CakeML_Codegen.html Formalization of a Monitoring Algorithm for Metric First-Order Temporal Logic /entries/MFOTL_Monitor.html Thu, 04 Jul 2019 00:00:00 +0000 /entries/MFOTL_Monitor.html Complete Non-Orders and Fixed Points /entries/Complete_Non_Orders.html Thu, 27 Jun 2019 00:00:00 +0000 /entries/Complete_Non_Orders.html Priority Search Trees /entries/Priority_Search_Trees.html Tue, 25 Jun 2019 00:00:00 +0000 /entries/Priority_Search_Trees.html Purely Functional, Simple, and Efficient Implementation of Prim and Dijkstra /entries/Prim_Dijkstra_Simple.html Tue, 25 Jun 2019 00:00:00 +0000 /entries/Prim_Dijkstra_Simple.html Linear Inequalities /entries/Linear_Inequalities.html Fri, 21 Jun 2019 00:00:00 +0000 /entries/Linear_Inequalities.html Hilbert's Nullstellensatz /entries/Nullstellensatz.html Sun, 16 Jun 2019 00:00:00 +0000 /entries/Nullstellensatz.html Gröbner Bases, Macaulay Matrices and Dubé's Degree Bounds /entries/Groebner_Macaulay.html Sat, 15 Jun 2019 00:00:00 +0000 /entries/Groebner_Macaulay.html Binary Heaps for IMP2 /entries/IMP2_Binary_Heap.html Thu, 13 Jun 2019 00:00:00 +0000 /entries/IMP2_Binary_Heap.html Differential Game Logic /entries/Differential_Game_Logic.html Mon, 03 Jun 2019 00:00:00 +0000 /entries/Differential_Game_Logic.html Multidimensional Binary Search Trees /entries/KD_Tree.html Thu, 30 May 2019 00:00:00 +0000 /entries/KD_Tree.html Formalization of Generic Authenticated Data Structures /entries/LambdaAuth.html Tue, 14 May 2019 00:00:00 +0000 /entries/LambdaAuth.html Multi-Party Computation /entries/Multi_Party_Computation.html Thu, 09 May 2019 00:00:00 +0000 /entries/Multi_Party_Computation.html HOL-CSP Version 2.0 /entries/HOL-CSP.html Fri, 26 Apr 2019 00:00:00 +0000 /entries/HOL-CSP.html A Compositional and Unified Translation of LTL into ω-Automata /entries/LTL_Master_Theorem.html Tue, 16 Apr 2019 00:00:00 +0000 /entries/LTL_Master_Theorem.html A General Theory of Syntax with Bindings /entries/Binding_Syntax_Theory.html Sat, 06 Apr 2019 00:00:00 +0000 /entries/Binding_Syntax_Theory.html The Transcendence of Certain Infinite Series /entries/Transcendence_Series_Hancl_Rucki.html Wed, 27 Mar 2019 00:00:00 +0000 /entries/Transcendence_Series_Hancl_Rucki.html Quantum Hoare Logic /entries/QHLProver.html Sun, 24 Mar 2019 00:00:00 +0000 /entries/QHLProver.html Safe OCL /entries/Safe_OCL.html Sat, 09 Mar 2019 00:00:00 +0000 /entries/Safe_OCL.html Elementary Facts About the Distribution of Primes /entries/Prime_Distribution_Elementary.html Thu, 21 Feb 2019 00:00:00 +0000 /entries/Prime_Distribution_Elementary.html Kruskal's Algorithm for Minimum Spanning Forest /entries/Kruskal.html Thu, 14 Feb 2019 00:00:00 +0000 /entries/Kruskal.html Probabilistic Primality Testing /entries/Probabilistic_Prime_Tests.html Mon, 11 Feb 2019 00:00:00 +0000 /entries/Probabilistic_Prime_Tests.html Universal Turing Machine /entries/Universal_Turing_Machine.html Fri, 08 Feb 2019 00:00:00 +0000 /entries/Universal_Turing_Machine.html Isabelle/UTP: Mechanised Theory Engineering for Unifying Theories of Programming /entries/UTP.html Fri, 01 Feb 2019 00:00:00 +0000 /entries/UTP.html The Inversions of a List /entries/List_Inversions.html Fri, 01 Feb 2019 00:00:00 +0000 /entries/List_Inversions.html Farkas' Lemma and Motzkin's Transposition Theorem /entries/Farkas.html Thu, 17 Jan 2019 00:00:00 +0000 /entries/Farkas.html An Algebra for Higher-Order Terms /entries/Higher_Order_Terms.html Tue, 15 Jan 2019 00:00:00 +0000 /entries/Higher_Order_Terms.html IMP2 – Simple Program Verification in Isabelle/HOL /entries/IMP2.html Tue, 15 Jan 2019 00:00:00 +0000 /entries/IMP2.html A Reduction Theorem for Store Buffers /entries/Store_Buffer_Reduction.html Mon, 07 Jan 2019 00:00:00 +0000 /entries/Store_Buffer_Reduction.html A Formal Model of the Document Object Model /entries/Core_DOM.html Wed, 26 Dec 2018 00:00:00 +0000 /entries/Core_DOM.html Formalization of Concurrent Revisions /entries/Concurrent_Revisions.html Tue, 25 Dec 2018 00:00:00 +0000 /entries/Concurrent_Revisions.html Verifying Imperative Programs using Auto2 /entries/Auto2_Imperative_HOL.html Fri, 21 Dec 2018 00:00:00 +0000 /entries/Auto2_Imperative_HOL.html Constructive Cryptography in HOL /entries/Constructive_Cryptography.html Mon, 17 Dec 2018 00:00:00 +0000 /entries/Constructive_Cryptography.html Properties of Orderings and Lattices /entries/Order_Lattice_Props.html Tue, 11 Dec 2018 00:00:00 +0000 /entries/Order_Lattice_Props.html Quantales /entries/Quantales.html Tue, 11 Dec 2018 00:00:00 +0000 /entries/Quantales.html Transformer Semantics /entries/Transformer_Semantics.html Tue, 11 Dec 2018 00:00:00 +0000 /entries/Transformer_Semantics.html A Verified Functional Implementation of Bachmair and Ganzinger's Ordered Resolution Prover /entries/Functional_Ordered_Resolution_Prover.html Fri, 23 Nov 2018 00:00:00 +0000 /entries/Functional_Ordered_Resolution_Prover.html Graph Saturation /entries/Graph_Saturation.html Fri, 23 Nov 2018 00:00:00 +0000 /entries/Graph_Saturation.html Auto2 Prover /entries/Auto2_HOL.html Tue, 20 Nov 2018 00:00:00 +0000 /entries/Auto2_HOL.html Matroids /entries/Matroids.html Fri, 16 Nov 2018 00:00:00 +0000 /entries/Matroids.html Deriving generic class instances for datatypes /entries/Generic_Deriving.html Tue, 06 Nov 2018 00:00:00 +0000 /entries/Generic_Deriving.html Formalisation and Evaluation of Alan Gewirth's Proof for the Principle of Generic Consistency in Isabelle/HOL /entries/GewirthPGCProof.html Tue, 30 Oct 2018 00:00:00 +0000 /entries/GewirthPGCProof.html Epistemic Logic: Completeness of Modal Logics /entries/Epistemic_Logic.html Mon, 29 Oct 2018 00:00:00 +0000 /entries/Epistemic_Logic.html Smooth Manifolds /entries/Smooth_Manifolds.html Mon, 22 Oct 2018 00:00:00 +0000 /entries/Smooth_Manifolds.html Formalization of the Embedding Path Order for Lambda-Free Higher-Order Terms /entries/Lambda_Free_EPO.html Fri, 19 Oct 2018 00:00:00 +0000 /entries/Lambda_Free_EPO.html Randomised Binary Search Trees /entries/Randomised_BSTs.html Fri, 19 Oct 2018 00:00:00 +0000 /entries/Randomised_BSTs.html Upper Bounding Diameters of State Spaces of Factored Transition Systems /entries/Factored_Transition_System_Bounding.html Fri, 12 Oct 2018 00:00:00 +0000 /entries/Factored_Transition_System_Bounding.html The Transcendence of π /entries/Pi_Transcendental.html Fri, 28 Sep 2018 00:00:00 +0000 /entries/Pi_Transcendental.html Symmetric Polynomials /entries/Symmetric_Polynomials.html Tue, 25 Sep 2018 00:00:00 +0000 /entries/Symmetric_Polynomials.html Signature-Based Gröbner Basis Algorithms /entries/Signature_Groebner.html Thu, 20 Sep 2018 00:00:00 +0000 /entries/Signature_Groebner.html The Prime Number Theorem /entries/Prime_Number_Theorem.html Wed, 19 Sep 2018 00:00:00 +0000 /entries/Prime_Number_Theorem.html Aggregation Algebras /entries/Aggregation_Algebras.html Sat, 15 Sep 2018 00:00:00 +0000 /entries/Aggregation_Algebras.html Octonions /entries/Octonions.html Fri, 14 Sep 2018 00:00:00 +0000 /entries/Octonions.html Quaternions /entries/Quaternions.html Wed, 05 Sep 2018 00:00:00 +0000 /entries/Quaternions.html The Budan–Fourier Theorem and Counting Real Roots with Multiplicity /entries/Budan_Fourier.html Sun, 02 Sep 2018 00:00:00 +0000 /entries/Budan_Fourier.html An Incremental Simplex Algorithm with Unsatisfiable Core Generation /entries/Simplex.html Fri, 24 Aug 2018 00:00:00 +0000 /entries/Simplex.html Minsky Machines /entries/Minsky_Machines.html Tue, 14 Aug 2018 00:00:00 +0000 /entries/Minsky_Machines.html Pricing in discrete financial models /entries/DiscretePricing.html Mon, 16 Jul 2018 00:00:00 +0000 /entries/DiscretePricing.html Von-Neumann-Morgenstern Utility Theorem /entries/Neumann_Morgenstern_Utility.html Wed, 04 Jul 2018 00:00:00 +0000 /entries/Neumann_Morgenstern_Utility.html Pell's Equation /entries/Pell.html Sat, 23 Jun 2018 00:00:00 +0000 /entries/Pell.html Projective Geometry /entries/Projective_Geometry.html Thu, 14 Jun 2018 00:00:00 +0000 /entries/Projective_Geometry.html The Localization of a Commutative Ring /entries/Localization_Ring.html Thu, 14 Jun 2018 00:00:00 +0000 /entries/Localization_Ring.html Partial Order Reduction /entries/Partial_Order_Reduction.html Tue, 05 Jun 2018 00:00:00 +0000 /entries/Partial_Order_Reduction.html Optimal Binary Search Trees /entries/Optimal_BST.html Sun, 27 May 2018 00:00:00 +0000 /entries/Optimal_BST.html Hidden Markov Models /entries/Hidden_Markov_Models.html Fri, 25 May 2018 00:00:00 +0000 /entries/Hidden_Markov_Models.html Probabilistic Timed Automata /entries/Probabilistic_Timed_Automata.html Thu, 24 May 2018 00:00:00 +0000 /entries/Probabilistic_Timed_Automata.html Axiom Systems for Category Theory in Free Logic /entries/AxiomaticCategoryTheory.html Wed, 23 May 2018 00:00:00 +0000 /entries/AxiomaticCategoryTheory.html Irrational Rapidly Convergent Series /entries/Irrationality_J_Hancl.html Wed, 23 May 2018 00:00:00 +0000 /entries/Irrationality_J_Hancl.html Monadification, Memoization and Dynamic Programming /entries/Monad_Memo_DP.html Tue, 22 May 2018 00:00:00 +0000 /entries/Monad_Memo_DP.html OpSets: Sequential Specifications for Replicated Datatypes /entries/OpSets.html Thu, 10 May 2018 00:00:00 +0000 /entries/OpSets.html An Isabelle/HOL Formalization of the Modular Assembly Kit for Security Properties /entries/Modular_Assembly_Kit_Security.html Mon, 07 May 2018 00:00:00 +0000 /entries/Modular_Assembly_Kit_Security.html WebAssembly /entries/WebAssembly.html Sun, 29 Apr 2018 00:00:00 +0000 /entries/WebAssembly.html VerifyThis 2018 - Polished Isabelle Solutions /entries/VerifyThis2018.html Fri, 27 Apr 2018 00:00:00 +0000 /entries/VerifyThis2018.html Bounded Natural Functors with Covariance and Contravariance /entries/BNF_CC.html Tue, 24 Apr 2018 00:00:00 +0000 /entries/BNF_CC.html The Incompatibility of Fishburn-Strategyproofness and Pareto-Efficiency /entries/Fishburn_Impossibility.html Thu, 22 Mar 2018 00:00:00 +0000 /entries/Fishburn_Impossibility.html Weight-Balanced Trees /entries/Weight_Balanced_Trees.html Tue, 13 Mar 2018 00:00:00 +0000 /entries/Weight_Balanced_Trees.html CakeML /entries/CakeML.html Mon, 12 Mar 2018 00:00:00 +0000 /entries/CakeML.html A Theory of Architectural Design Patterns /entries/Architectural_Design_Patterns.html Thu, 01 Mar 2018 00:00:00 +0000 /entries/Architectural_Design_Patterns.html Hoare Logics for Time Bounds /entries/Hoare_Time.html Mon, 26 Feb 2018 00:00:00 +0000 /entries/Hoare_Time.html A verified factorization algorithm for integer polynomials with polynomial complexity /entries/LLL_Factorization.html Tue, 06 Feb 2018 00:00:00 +0000 /entries/LLL_Factorization.html First-Order Terms /entries/First_Order_Terms.html Tue, 06 Feb 2018 00:00:00 +0000 /entries/First_Order_Terms.html The Error Function /entries/Error_Function.html Tue, 06 Feb 2018 00:00:00 +0000 /entries/Error_Function.html Treaps /entries/Treaps.html Tue, 06 Feb 2018 00:00:00 +0000 /entries/Treaps.html A verified LLL algorithm /entries/LLL_Basis_Reduction.html Fri, 02 Feb 2018 00:00:00 +0000 /entries/LLL_Basis_Reduction.html Formalization of Bachmair and Ganzinger's Ordered Resolution Prover /entries/Ordered_Resolution_Prover.html Thu, 18 Jan 2018 00:00:00 +0000 /entries/Ordered_Resolution_Prover.html Gromov Hyperbolicity /entries/Gromov_Hyperbolicity.html Tue, 16 Jan 2018 00:00:00 +0000 /entries/Gromov_Hyperbolicity.html An Isabelle/HOL formalisation of Green's Theorem /entries/Green.html Thu, 11 Jan 2018 00:00:00 +0000 /entries/Green.html Taylor Models /entries/Taylor_Models.html Mon, 08 Jan 2018 00:00:00 +0000 /entries/Taylor_Models.html The Falling Factorial of a Sum /entries/Falling_Factorial_Sum.html Fri, 22 Dec 2017 00:00:00 +0000 /entries/Falling_Factorial_Sum.html Dirichlet L-Functions and Dirichlet's Theorem /entries/Dirichlet_L.html Thu, 21 Dec 2017 00:00:00 +0000 /entries/Dirichlet_L.html The Mason–Stothers Theorem /entries/Mason_Stothers.html Thu, 21 Dec 2017 00:00:00 +0000 /entries/Mason_Stothers.html The Median-of-Medians Selection Algorithm /entries/Median_Of_Medians_Selection.html Thu, 21 Dec 2017 00:00:00 +0000 /entries/Median_Of_Medians_Selection.html Operations on Bounded Natural Functors /entries/BNF_Operations.html Tue, 19 Dec 2017 00:00:00 +0000 /entries/BNF_Operations.html The string search algorithm by Knuth, Morris and Pratt /entries/Knuth_Morris_Pratt.html Mon, 18 Dec 2017 00:00:00 +0000 /entries/Knuth_Morris_Pratt.html Stochastic Matrices and the Perron-Frobenius Theorem /entries/Stochastic_Matrices.html Wed, 22 Nov 2017 00:00:00 +0000 /entries/Stochastic_Matrices.html The IMAP CmRDT /entries/IMAP-CRDT.html Thu, 09 Nov 2017 00:00:00 +0000 /entries/IMAP-CRDT.html Hybrid Multi-Lane Spatial Logic /entries/Hybrid_Multi_Lane_Spatial_Logic.html Mon, 06 Nov 2017 00:00:00 +0000 /entries/Hybrid_Multi_Lane_Spatial_Logic.html The Kuratowski Closure-Complement Theorem /entries/Kuratowski_Closure_Complement.html Thu, 26 Oct 2017 00:00:00 +0000 /entries/Kuratowski_Closure_Complement.html Büchi Complementation /entries/Buchi_Complementation.html Thu, 19 Oct 2017 00:00:00 +0000 /entries/Buchi_Complementation.html Transition Systems and Automata /entries/Transition_Systems_and_Automata.html Thu, 19 Oct 2017 00:00:00 +0000 /entries/Transition_Systems_and_Automata.html Count the Number of Complex Roots /entries/Count_Complex_Roots.html Tue, 17 Oct 2017 00:00:00 +0000 /entries/Count_Complex_Roots.html Evaluate Winding Numbers through Cauchy Indices /entries/Winding_Number_Eval.html Tue, 17 Oct 2017 00:00:00 +0000 /entries/Winding_Number_Eval.html Homogeneous Linear Diophantine Equations /entries/Diophantine_Eqns_Lin_Hom.html Sat, 14 Oct 2017 00:00:00 +0000 /entries/Diophantine_Eqns_Lin_Hom.html Dirichlet Series /entries/Dirichlet_Series.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Dirichlet_Series.html Linear Recurrences /entries/Linear_Recurrences.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Linear_Recurrences.html The Hurwitz and Riemann ζ Functions /entries/Zeta_Function.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Zeta_Function.html Computer-assisted Reconstruction and Assessment of E. J. Lowe's Modal Ontological Argument /entries/Lowe_Ontological_Argument.html Thu, 21 Sep 2017 00:00:00 +0000 /entries/Lowe_Ontological_Argument.html Representation and Partial Automation of the Principia Logico-Metaphysica in Isabelle/HOL /entries/PLM.html Sun, 17 Sep 2017 00:00:00 +0000 /entries/PLM.html Anselm's God in Isabelle/HOL /entries/AnselmGod.html Wed, 06 Sep 2017 00:00:00 +0000 /entries/AnselmGod.html Microeconomics and the First Welfare Theorem /entries/First_Welfare_Theorem.html Fri, 01 Sep 2017 00:00:00 +0000 /entries/First_Welfare_Theorem.html Orbit-Stabiliser Theorem with Application to Rotational Symmetries /entries/Orbit_Stabiliser.html Sun, 20 Aug 2017 00:00:00 +0000 /entries/Orbit_Stabiliser.html Root-Balanced Tree /entries/Root_Balanced_Tree.html Sun, 20 Aug 2017 00:00:00 +0000 /entries/Root_Balanced_Tree.html The LambdaMu-calculus /entries/LambdaMu.html Wed, 16 Aug 2017 00:00:00 +0000 /entries/LambdaMu.html Stewart's Theorem and Apollonius' Theorem /entries/Stewart_Apollonius.html Mon, 31 Jul 2017 00:00:00 +0000 /entries/Stewart_Apollonius.html Dynamic Architectures /entries/DynamicArchitectures.html Fri, 28 Jul 2017 00:00:00 +0000 /entries/DynamicArchitectures.html Declarative Semantics for Functional Languages /entries/Decl_Sem_Fun_PL.html Fri, 21 Jul 2017 00:00:00 +0000 /entries/Decl_Sem_Fun_PL.html HOLCF-Prelude /entries/HOLCF-Prelude.html Sat, 15 Jul 2017 00:00:00 +0000 /entries/HOLCF-Prelude.html Minkowski's Theorem /entries/Minkowskis_Theorem.html Thu, 13 Jul 2017 00:00:00 +0000 /entries/Minkowskis_Theorem.html Verified Metatheory and Type Inference for a Name-Carrying Simply-Typed Lambda Calculus /entries/Name_Carrying_Type_Inference.html Sun, 09 Jul 2017 00:00:00 +0000 /entries/Name_Carrying_Type_Inference.html A framework for establishing Strong Eventual Consistency for Conflict-free Replicated Datatypes /entries/CRDT.html Fri, 07 Jul 2017 00:00:00 +0000 /entries/CRDT.html Stone-Kleene Relation Algebras /entries/Stone_Kleene_Relation_Algebras.html Thu, 06 Jul 2017 00:00:00 +0000 /entries/Stone_Kleene_Relation_Algebras.html Propositional Proof Systems /entries/Propositional_Proof_Systems.html Wed, 21 Jun 2017 00:00:00 +0000 /entries/Propositional_Proof_Systems.html Partial Semigroups and Convolution Algebras /entries/PSemigroupsConvolution.html Tue, 13 Jun 2017 00:00:00 +0000 /entries/PSemigroupsConvolution.html Buffon's Needle Problem /entries/Buffons_Needle.html Tue, 06 Jun 2017 00:00:00 +0000 /entries/Buffons_Needle.html Flow Networks and the Min-Cut-Max-Flow Theorem /entries/Flow_Networks.html Thu, 01 Jun 2017 00:00:00 +0000 /entries/Flow_Networks.html Formalizing Push-Relabel Algorithms /entries/Prpu_Maxflow.html Thu, 01 Jun 2017 00:00:00 +0000 /entries/Prpu_Maxflow.html Optics /entries/Optics.html Thu, 25 May 2017 00:00:00 +0000 /entries/Optics.html Developing Security Protocols by Refinement /entries/Security_Protocol_Refinement.html Wed, 24 May 2017 00:00:00 +0000 /entries/Security_Protocol_Refinement.html Dictionary Construction /entries/Dict_Construction.html Wed, 24 May 2017 00:00:00 +0000 /entries/Dict_Construction.html The Floyd-Warshall Algorithm for Shortest Paths /entries/Floyd_Warshall.html Mon, 08 May 2017 00:00:00 +0000 /entries/Floyd_Warshall.html CryptHOL /entries/CryptHOL.html Fri, 05 May 2017 00:00:00 +0000 /entries/CryptHOL.html Effect polymorphism in higher-order logic /entries/Monomorphic_Monad.html Fri, 05 May 2017 00:00:00 +0000 /entries/Monomorphic_Monad.html Game-based cryptography in HOL /entries/Game_Based_Crypto.html Fri, 05 May 2017 00:00:00 +0000 /entries/Game_Based_Crypto.html Monad normalisation /entries/Monad_Normalisation.html Fri, 05 May 2017 00:00:00 +0000 /entries/Monad_Normalisation.html Probabilistic while loop /entries/Probabilistic_While.html Fri, 05 May 2017 00:00:00 +0000 /entries/Probabilistic_While.html Monoidal Categories /entries/MonoidalCategory.html Thu, 04 May 2017 00:00:00 +0000 /entries/MonoidalCategory.html Types, Tableaus and Gödel’s God in Isabelle/HOL /entries/Types_Tableaus_and_Goedels_God.html Mon, 01 May 2017 00:00:00 +0000 /entries/Types_Tableaus_and_Goedels_God.html Local Lexing /entries/LocalLexing.html Fri, 28 Apr 2017 00:00:00 +0000 /entries/LocalLexing.html Constructor Functions /entries/Constructor_Funs.html Wed, 19 Apr 2017 00:00:00 +0000 /entries/Constructor_Funs.html Lazifying case constants /entries/Lazy_Case.html Tue, 18 Apr 2017 00:00:00 +0000 /entries/Lazy_Case.html Subresultants /entries/Subresultants.html Thu, 06 Apr 2017 00:00:00 +0000 /entries/Subresultants.html Expected Shape of Random Binary Search Trees /entries/Random_BSTs.html Tue, 04 Apr 2017 00:00:00 +0000 /entries/Random_BSTs.html Lower bound on comparison-based sorting algorithms /entries/Comparison_Sort_Lower_Bound.html Wed, 15 Mar 2017 00:00:00 +0000 /entries/Comparison_Sort_Lower_Bound.html The number of comparisons in QuickSort /entries/Quick_Sort_Cost.html Wed, 15 Mar 2017 00:00:00 +0000 /entries/Quick_Sort_Cost.html The Euler–MacLaurin Formula /entries/Euler_MacLaurin.html Fri, 10 Mar 2017 00:00:00 +0000 /entries/Euler_MacLaurin.html The Group Law for Elliptic Curves /entries/Elliptic_Curves_Group_Law.html Tue, 28 Feb 2017 00:00:00 +0000 /entries/Elliptic_Curves_Group_Law.html Menger's Theorem /entries/Menger.html Sun, 26 Feb 2017 00:00:00 +0000 /entries/Menger.html Differential Dynamic Logic /entries/Differential_Dynamic_Logic.html Mon, 13 Feb 2017 00:00:00 +0000 /entries/Differential_Dynamic_Logic.html Abstract Soundness /entries/Abstract_Soundness.html Fri, 10 Feb 2017 00:00:00 +0000 /entries/Abstract_Soundness.html Stone Relation Algebras /entries/Stone_Relation_Algebras.html Tue, 07 Feb 2017 00:00:00 +0000 /entries/Stone_Relation_Algebras.html Refining Authenticated Key Agreement with Strong Adversaries /entries/Key_Agreement_Strong_Adversaries.html Tue, 31 Jan 2017 00:00:00 +0000 /entries/Key_Agreement_Strong_Adversaries.html Bernoulli Numbers /entries/Bernoulli.html Tue, 24 Jan 2017 00:00:00 +0000 /entries/Bernoulli.html Bertrand's postulate /entries/Bertrands_Postulate.html Tue, 17 Jan 2017 00:00:00 +0000 /entries/Bertrands_Postulate.html Minimal Static Single Assignment Form /entries/Minimal_SSA.html Tue, 17 Jan 2017 00:00:00 +0000 /entries/Minimal_SSA.html The Transcendence of e /entries/E_Transcendental.html Thu, 12 Jan 2017 00:00:00 +0000 /entries/E_Transcendental.html Formal Network Models and Their Application to Firewall Policies /entries/UPF_Firewall.html Sun, 08 Jan 2017 00:00:00 +0000 /entries/UPF_Firewall.html Verification of a Diffie-Hellman Password-based Authentication Protocol by Extending the Inductive Method /entries/Password_Authentication_Protocol.html Tue, 03 Jan 2017 00:00:00 +0000 /entries/Password_Authentication_Protocol.html First-Order Logic According to Harrison /entries/FOL_Harrison.html Sun, 01 Jan 2017 00:00:00 +0000 /entries/FOL_Harrison.html Concurrent Refinement Algebra and Rely Quotients /entries/Concurrent_Ref_Alg.html Fri, 30 Dec 2016 00:00:00 +0000 /entries/Concurrent_Ref_Alg.html The Twelvefold Way /entries/Twelvefold_Way.html Thu, 29 Dec 2016 00:00:00 +0000 /entries/Twelvefold_Way.html Proof Strategy Language /entries/Proof_Strategy_Language.html Tue, 20 Dec 2016 00:00:00 +0000 /entries/Proof_Strategy_Language.html Paraconsistency /entries/Paraconsistency.html Wed, 07 Dec 2016 00:00:00 +0000 /entries/Paraconsistency.html COMPLX: A Verification Framework for Concurrent Imperative Programs /entries/Complx.html Tue, 29 Nov 2016 00:00:00 +0000 /entries/Complx.html Abstract Interpretation of Annotated Commands /entries/Abs_Int_ITP2012.html Wed, 23 Nov 2016 00:00:00 +0000 /entries/Abs_Int_ITP2012.html Separata: Isabelle tactics for Separation Algebra /entries/Separata.html Wed, 16 Nov 2016 00:00:00 +0000 /entries/Separata.html Formalization of Knuth–Bendix Orders for Lambda-Free Higher-Order Terms /entries/Lambda_Free_KBOs.html Sat, 12 Nov 2016 00:00:00 +0000 /entries/Lambda_Free_KBOs.html Formalization of Nested Multisets, Hereditary Multisets, and Syntactic Ordinals /entries/Nested_Multisets_Ordinals.html Sat, 12 Nov 2016 00:00:00 +0000 /entries/Nested_Multisets_Ordinals.html Expressiveness of Deep Learning /entries/Deep_Learning.html Thu, 10 Nov 2016 00:00:00 +0000 /entries/Deep_Learning.html Modal Logics for Nominal Transition Systems /entries/Modal_Logics_for_NTS.html Tue, 25 Oct 2016 00:00:00 +0000 /entries/Modal_Logics_for_NTS.html Stable Matching /entries/Stable_Matching.html Mon, 24 Oct 2016 00:00:00 +0000 /entries/Stable_Matching.html LOFT — Verified Migration of Linux Firewalls to SDN /entries/LOFT.html Fri, 21 Oct 2016 00:00:00 +0000 /entries/LOFT.html A formal model for the SPARCv8 ISA and a proof of non-interference for the LEON3 processor /entries/SPARCv8.html Wed, 19 Oct 2016 00:00:00 +0000 /entries/SPARCv8.html Source Coding Theorem /entries/Source_Coding_Theorem.html Wed, 19 Oct 2016 00:00:00 +0000 /entries/Source_Coding_Theorem.html The Factorization Algorithm of Berlekamp and Zassenhaus /entries/Berlekamp_Zassenhaus.html Fri, 14 Oct 2016 00:00:00 +0000 /entries/Berlekamp_Zassenhaus.html Intersecting Chords Theorem /entries/Chord_Segments.html Tue, 11 Oct 2016 00:00:00 +0000 /entries/Chord_Segments.html Lp spaces /entries/Lp.html Wed, 05 Oct 2016 00:00:00 +0000 /entries/Lp.html Fisher–Yates shuffle /entries/Fisher_Yates.html Fri, 30 Sep 2016 00:00:00 +0000 /entries/Fisher_Yates.html Allen's Interval Calculus /entries/Allen_Calculus.html Thu, 29 Sep 2016 00:00:00 +0000 /entries/Allen_Calculus.html Formalization of Recursive Path Orders for Lambda-Free Higher-Order Terms /entries/Lambda_Free_RPOs.html Fri, 23 Sep 2016 00:00:00 +0000 /entries/Lambda_Free_RPOs.html Iptables Semantics /entries/Iptables_Semantics.html Fri, 09 Sep 2016 00:00:00 +0000 /entries/Iptables_Semantics.html A Variant of the Superposition Calculus /entries/SuperCalc.html Tue, 06 Sep 2016 00:00:00 +0000 /entries/SuperCalc.html Stone Algebras /entries/Stone_Algebras.html Tue, 06 Sep 2016 00:00:00 +0000 /entries/Stone_Algebras.html Stirling's formula /entries/Stirling_Formula.html Thu, 01 Sep 2016 00:00:00 +0000 /entries/Stirling_Formula.html Routing /entries/Routing.html Wed, 31 Aug 2016 00:00:00 +0000 /entries/Routing.html Simple Firewall /entries/Simple_Firewall.html Wed, 24 Aug 2016 00:00:00 +0000 /entries/Simple_Firewall.html Infeasible Paths Elimination by Symbolic Execution Techniques: Proof of Correctness and Preservation of Paths /entries/InfPathElimination.html Thu, 18 Aug 2016 00:00:00 +0000 /entries/InfPathElimination.html Formalizing the Edmonds-Karp Algorithm /entries/EdmondsKarp_Maxflow.html Fri, 12 Aug 2016 00:00:00 +0000 /entries/EdmondsKarp_Maxflow.html The Imperative Refinement Framework /entries/Refine_Imperative_HOL.html Mon, 08 Aug 2016 00:00:00 +0000 /entries/Refine_Imperative_HOL.html Ptolemy's Theorem /entries/Ptolemys_Theorem.html Sun, 07 Aug 2016 00:00:00 +0000 /entries/Ptolemys_Theorem.html Surprise Paradox /entries/Surprise_Paradox.html Sun, 17 Jul 2016 00:00:00 +0000 /entries/Surprise_Paradox.html Pairing Heap /entries/Pairing_Heap.html Thu, 14 Jul 2016 00:00:00 +0000 /entries/Pairing_Heap.html A Framework for Verifying Depth-First Search Algorithms /entries/DFS_Framework.html Tue, 05 Jul 2016 00:00:00 +0000 /entries/DFS_Framework.html Chamber Complexes, Coxeter Systems, and Buildings /entries/Buildings.html Fri, 01 Jul 2016 00:00:00 +0000 /entries/Buildings.html The Resolution Calculus for First-Order Logic /entries/Resolution_FOL.html Thu, 30 Jun 2016 00:00:00 +0000 /entries/Resolution_FOL.html The Z Property /entries/Rewriting_Z.html Thu, 30 Jun 2016 00:00:00 +0000 /entries/Rewriting_Z.html Compositional Security-Preserving Refinement for Concurrent Imperative Programs /entries/Dependent_SIFUM_Refinement.html Tue, 28 Jun 2016 00:00:00 +0000 /entries/Dependent_SIFUM_Refinement.html IP Addresses /entries/IP_Addresses.html Tue, 28 Jun 2016 00:00:00 +0000 /entries/IP_Addresses.html Cardinality of Multisets /entries/Card_Multisets.html Sun, 26 Jun 2016 00:00:00 +0000 /entries/Card_Multisets.html Category Theory with Adjunctions and Limits /entries/Category3.html Sun, 26 Jun 2016 00:00:00 +0000 /entries/Category3.html A Dependent Security Type System for Concurrent Imperative Programs /entries/Dependent_SIFUM_Type_Systems.html Sat, 25 Jun 2016 00:00:00 +0000 /entries/Dependent_SIFUM_Type_Systems.html Catalan Numbers /entries/Catalan_Numbers.html Tue, 21 Jun 2016 00:00:00 +0000 /entries/Catalan_Numbers.html Program Construction and Verification Components Based on Kleene Algebra /entries/Algebraic_VCs.html Sat, 18 Jun 2016 00:00:00 +0000 /entries/Algebraic_VCs.html Conservation of CSP Noninterference Security under Concurrent Composition /entries/Noninterference_Concurrent_Composition.html Mon, 13 Jun 2016 00:00:00 +0000 /entries/Noninterference_Concurrent_Composition.html Finite Machine Word Library /entries/Word_Lib.html Thu, 09 Jun 2016 00:00:00 +0000 /entries/Word_Lib.html Tree Decomposition /entries/Tree_Decomposition.html Tue, 31 May 2016 00:00:00 +0000 /entries/Tree_Decomposition.html Cardinality of Equivalence Relations /entries/Card_Equiv_Relations.html Tue, 24 May 2016 00:00:00 +0000 /entries/Card_Equiv_Relations.html POSIX Lexing with Derivatives of Regular Expressions /entries/Posix-Lexing.html Tue, 24 May 2016 00:00:00 +0000 /entries/Posix-Lexing.html Perron-Frobenius Theorem for Spectral Radius Analysis /entries/Perron_Frobenius.html Fri, 20 May 2016 00:00:00 +0000 /entries/Perron_Frobenius.html The meta theory of the Incredible Proof Machine /entries/Incredible_Proof_Machine.html Fri, 20 May 2016 00:00:00 +0000 /entries/Incredible_Proof_Machine.html A Constructive Proof for FLP /entries/FLP.html Wed, 18 May 2016 00:00:00 +0000 /entries/FLP.html A Formal Proof of the Max-Flow Min-Cut Theorem for Countable Networks /entries/MFMC_Countable.html Mon, 09 May 2016 00:00:00 +0000 /entries/MFMC_Countable.html Randomised Social Choice Theory /entries/Randomised_Social_Choice.html Thu, 05 May 2016 00:00:00 +0000 /entries/Randomised_Social_Choice.html Spivey's Generalized Recurrence for Bell Numbers /entries/Bell_Numbers_Spivey.html Wed, 04 May 2016 00:00:00 +0000 /entries/Bell_Numbers_Spivey.html The Incompatibility of SD-Efficiency and SD-Strategy-Proofness /entries/SDS_Impossibility.html Wed, 04 May 2016 00:00:00 +0000 /entries/SDS_Impossibility.html Gröbner Bases Theory /entries/Groebner_Bases.html Mon, 02 May 2016 00:00:00 +0000 /entries/Groebner_Bases.html No Faster-Than-Light Observers /entries/No_FTL_observers.html Thu, 28 Apr 2016 00:00:00 +0000 /entries/No_FTL_observers.html A formalisation of the Cocke-Younger-Kasami algorithm /entries/CYK.html Wed, 27 Apr 2016 00:00:00 +0000 /entries/CYK.html Algorithms for Reduced Ordered Binary Decision Diagrams /entries/ROBDD.html Wed, 27 Apr 2016 00:00:00 +0000 /entries/ROBDD.html Conservation of CSP Noninterference Security under Sequential Composition /entries/Noninterference_Sequential_Composition.html Tue, 26 Apr 2016 00:00:00 +0000 /entries/Noninterference_Sequential_Composition.html Kleene Algebras with Domain /entries/KAD.html Tue, 12 Apr 2016 00:00:00 +0000 /entries/KAD.html Propositional Resolution and Prime Implicates Generation /entries/PropResPI.html Fri, 11 Mar 2016 00:00:00 +0000 /entries/PropResPI.html The Cartan Fixed Point Theorems /entries/Cartan_FP.html Tue, 08 Mar 2016 00:00:00 +0000 /entries/Cartan_FP.html Timed Automata /entries/Timed_Automata.html Tue, 08 Mar 2016 00:00:00 +0000 /entries/Timed_Automata.html Linear Temporal Logic /entries/LTL.html Tue, 01 Mar 2016 00:00:00 +0000 /entries/LTL.html Analysis of List Update Algorithms /entries/List_Update.html Wed, 17 Feb 2016 00:00:00 +0000 /entries/List_Update.html Verified Construction of Static Single Assignment Form /entries/Formal_SSA.html Fri, 05 Feb 2016 00:00:00 +0000 /entries/Formal_SSA.html Polynomial Factorization /entries/Polynomial_Factorization.html Fri, 29 Jan 2016 00:00:00 +0000 /entries/Polynomial_Factorization.html Polynomial Interpolation /entries/Polynomial_Interpolation.html Fri, 29 Jan 2016 00:00:00 +0000 /entries/Polynomial_Interpolation.html Knot Theory /entries/Knot_Theory.html Wed, 20 Jan 2016 00:00:00 +0000 /entries/Knot_Theory.html Tensor Product of Matrices /entries/Matrix_Tensor.html Mon, 18 Jan 2016 00:00:00 +0000 /entries/Matrix_Tensor.html Cardinality of Number Partitions /entries/Card_Number_Partitions.html Thu, 14 Jan 2016 00:00:00 +0000 /entries/Card_Number_Partitions.html Basic Geometric Properties of Triangles /entries/Triangle.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Triangle.html Descartes' Rule of Signs /entries/Descartes_Sign_Rule.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Descartes_Sign_Rule.html Liouville numbers /entries/Liouville_Numbers.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Liouville_Numbers.html The Divergence of the Prime Harmonic Series /entries/Prime_Harmonic_Series.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Prime_Harmonic_Series.html Algebraic Numbers in Isabelle/HOL /entries/Algebraic_Numbers.html Tue, 22 Dec 2015 00:00:00 +0000 /entries/Algebraic_Numbers.html Applicative Lifting /entries/Applicative_Lifting.html Tue, 22 Dec 2015 00:00:00 +0000 /entries/Applicative_Lifting.html The Stern-Brocot Tree /entries/Stern_Brocot.html Tue, 22 Dec 2015 00:00:00 +0000 /entries/Stern_Brocot.html Cardinality of Set Partitions /entries/Card_Partitions.html Sat, 12 Dec 2015 00:00:00 +0000 /entries/Card_Partitions.html Latin Square /entries/Latin_Square.html Wed, 02 Dec 2015 00:00:00 +0000 /entries/Latin_Square.html Ergodic Theory /entries/Ergodic_Theory.html Tue, 01 Dec 2015 00:00:00 +0000 /entries/Ergodic_Theory.html Euler's Partition Theorem /entries/Euler_Partition.html Thu, 19 Nov 2015 00:00:00 +0000 /entries/Euler_Partition.html The Tortoise and Hare Algorithm /entries/TortoiseHare.html Wed, 18 Nov 2015 00:00:00 +0000 /entries/TortoiseHare.html Planarity Certificates /entries/Planarity_Certificates.html Wed, 11 Nov 2015 00:00:00 +0000 /entries/Planarity_Certificates.html Positional Determinacy of Parity Games /entries/Parity_Game.html Mon, 02 Nov 2015 00:00:00 +0000 /entries/Parity_Game.html A Meta-Model for the Isabelle API /entries/Isabelle_Meta_Model.html Wed, 16 Sep 2015 00:00:00 +0000 /entries/Isabelle_Meta_Model.html Converting Linear Temporal Logic to Deterministic (Generalized) Rabin Automata /entries/LTL_to_DRA.html Fri, 04 Sep 2015 00:00:00 +0000 /entries/LTL_to_DRA.html Matrices, Jordan Normal Forms, and Spectral Radius Theory /entries/Jordan_Normal_Form.html Fri, 21 Aug 2015 00:00:00 +0000 /entries/Jordan_Normal_Form.html Decreasing Diagrams II /entries/Decreasing-Diagrams-II.html Thu, 20 Aug 2015 00:00:00 +0000 /entries/Decreasing-Diagrams-II.html The Inductive Unwinding Theorem for CSP Noninterference Security /entries/Noninterference_Inductive_Unwinding.html Tue, 18 Aug 2015 00:00:00 +0000 /entries/Noninterference_Inductive_Unwinding.html Representations of Finite Groups /entries/Rep_Fin_Groups.html Wed, 12 Aug 2015 00:00:00 +0000 /entries/Rep_Fin_Groups.html Analysing and Comparing Encodability Criteria for Process Calculi /entries/Encodability_Process_Calculi.html Mon, 10 Aug 2015 00:00:00 +0000 /entries/Encodability_Process_Calculi.html Generating Cases from Labeled Subgoals /entries/Case_Labeling.html Tue, 21 Jul 2015 00:00:00 +0000 /entries/Case_Labeling.html Landau Symbols /entries/Landau_Symbols.html Tue, 14 Jul 2015 00:00:00 +0000 /entries/Landau_Symbols.html The Akra-Bazzi theorem and the Master theorem /entries/Akra_Bazzi.html Tue, 14 Jul 2015 00:00:00 +0000 /entries/Akra_Bazzi.html Hermite Normal Form /entries/Hermite.html Tue, 07 Jul 2015 00:00:00 +0000 /entries/Hermite.html Derangements Formula /entries/Derangements.html Sat, 27 Jun 2015 00:00:00 +0000 /entries/Derangements.html Binary Multirelations /entries/Multirelations.html Thu, 11 Jun 2015 00:00:00 +0000 /entries/Multirelations.html Reasoning about Lists via List Interleaving /entries/List_Interleaving.html Thu, 11 Jun 2015 00:00:00 +0000 /entries/List_Interleaving.html The Generic Unwinding Theorem for CSP Noninterference Security /entries/Noninterference_Generic_Unwinding.html Thu, 11 Jun 2015 00:00:00 +0000 /entries/Noninterference_Generic_Unwinding.html The Ipurge Unwinding Theorem for CSP Noninterference Security /entries/Noninterference_Ipurge_Unwinding.html Thu, 11 Jun 2015 00:00:00 +0000 /entries/Noninterference_Ipurge_Unwinding.html Parameterized Dynamic Tables /entries/Dynamic_Tables.html Sun, 07 Jun 2015 00:00:00 +0000 /entries/Dynamic_Tables.html Derivatives of Logical Formulas /entries/Formula_Derivatives.html Thu, 28 May 2015 00:00:00 +0000 /entries/Formula_Derivatives.html A Zoo of Probabilistic Systems /entries/Probabilistic_System_Zoo.html Wed, 27 May 2015 00:00:00 +0000 /entries/Probabilistic_System_Zoo.html VCG - Combinatorial Vickrey-Clarke-Groves Auctions /entries/Vickrey_Clarke_Groves.html Thu, 30 Apr 2015 00:00:00 +0000 /entries/Vickrey_Clarke_Groves.html Residuated Lattices /entries/Residuated_Lattices.html Wed, 15 Apr 2015 00:00:00 +0000 /entries/Residuated_Lattices.html Concurrent IMP /entries/ConcurrentIMP.html Mon, 13 Apr 2015 00:00:00 +0000 /entries/ConcurrentIMP.html Relaxing Safely: Verified On-the-Fly Garbage Collection for x86-TSO /entries/ConcurrentGC.html Mon, 13 Apr 2015 00:00:00 +0000 /entries/ConcurrentGC.html Trie /entries/Trie.html Mon, 30 Mar 2015 00:00:00 +0000 /entries/Trie.html Consensus Refined /entries/Consensus_Refined.html Wed, 18 Mar 2015 00:00:00 +0000 /entries/Consensus_Refined.html Deriving class instances for datatypes /entries/Deriving.html Wed, 11 Mar 2015 00:00:00 +0000 /entries/Deriving.html The Safety of Call Arity /entries/Call_Arity.html Fri, 20 Feb 2015 00:00:00 +0000 /entries/Call_Arity.html Echelon Form /entries/Echelon_Form.html Thu, 12 Feb 2015 00:00:00 +0000 /entries/Echelon_Form.html QR Decomposition /entries/QR_Decomposition.html Thu, 12 Feb 2015 00:00:00 +0000 /entries/QR_Decomposition.html Finite Automata in Hereditarily Finite Set Theory /entries/Finite_Automata_HF.html Thu, 05 Feb 2015 00:00:00 +0000 /entries/Finite_Automata_HF.html Verification of the UpDown Scheme /entries/UpDown_Scheme.html Wed, 28 Jan 2015 00:00:00 +0000 /entries/UpDown_Scheme.html The Unified Policy Framework (UPF) /entries/UPF.html Fri, 28 Nov 2014 00:00:00 +0000 /entries/UPF.html Loop freedom of the (untimed) AODV routing protocol /entries/AODV.html Thu, 23 Oct 2014 00:00:00 +0000 /entries/AODV.html Lifting Definition Option /entries/Lifting_Definition_Option.html Mon, 13 Oct 2014 00:00:00 +0000 /entries/Lifting_Definition_Option.html Stream Fusion in HOL with Code Generation /entries/Stream_Fusion_Code.html Fri, 10 Oct 2014 00:00:00 +0000 /entries/Stream_Fusion_Code.html A Verified Compiler for Probability Density Functions /entries/Density_Compiler.html Thu, 09 Oct 2014 00:00:00 +0000 /entries/Density_Compiler.html Formalization of Refinement Calculus for Reactive Systems /entries/RefinementReactive.html Wed, 08 Oct 2014 00:00:00 +0000 /entries/RefinementReactive.html Certification Monads /entries/Certification_Monads.html Fri, 03 Oct 2014 00:00:00 +0000 /entries/Certification_Monads.html XML /entries/XML.html Fri, 03 Oct 2014 00:00:00 +0000 /entries/XML.html Imperative Insertion Sort /entries/Imperative_Insertion_Sort.html Thu, 25 Sep 2014 00:00:00 +0000 /entries/Imperative_Insertion_Sort.html The Sturm–Tarski Theorem /entries/Sturm_Tarski.html Fri, 19 Sep 2014 00:00:00 +0000 /entries/Sturm_Tarski.html The Cayley-Hamilton Theorem /entries/Cayley_Hamilton.html Mon, 15 Sep 2014 00:00:00 +0000 /entries/Cayley_Hamilton.html The Jordan-Hölder Theorem /entries/Jordan_Hoelder.html Tue, 09 Sep 2014 00:00:00 +0000 /entries/Jordan_Hoelder.html Priority Queues Based on Braun Trees /entries/Priority_Queue_Braun.html Thu, 04 Sep 2014 00:00:00 +0000 /entries/Priority_Queue_Braun.html Gauss-Jordan Algorithm and Its Applications /entries/Gauss_Jordan.html Wed, 03 Sep 2014 00:00:00 +0000 /entries/Gauss_Jordan.html Real-Valued Special Functions: Upper and Lower Bounds /entries/Special_Function_Bounds.html Fri, 29 Aug 2014 00:00:00 +0000 /entries/Special_Function_Bounds.html Vector Spaces /entries/VectorSpace.html Fri, 29 Aug 2014 00:00:00 +0000 /entries/VectorSpace.html Skew Heap /entries/Skew_Heap.html Wed, 13 Aug 2014 00:00:00 +0000 /entries/Skew_Heap.html Splay Tree /entries/Splay_Tree.html Tue, 12 Aug 2014 00:00:00 +0000 /entries/Splay_Tree.html Haskell's Show Class in Isabelle/HOL /entries/Show.html Tue, 29 Jul 2014 00:00:00 +0000 /entries/Show.html Formal Specification of a Generic Separation Kernel /entries/CISC-Kernel.html Fri, 18 Jul 2014 00:00:00 +0000 /entries/CISC-Kernel.html pGCL for Isabelle /entries/pGCL.html Sun, 13 Jul 2014 00:00:00 +0000 /entries/pGCL.html Amortized Complexity Verified /entries/Amortized_Complexity.html Mon, 07 Jul 2014 00:00:00 +0000 /entries/Amortized_Complexity.html Network Security Policy Verification /entries/Network_Security_Policy_Verification.html Fri, 04 Jul 2014 00:00:00 +0000 /entries/Network_Security_Policy_Verification.html Pop-Refinement /entries/Pop_Refinement.html Thu, 03 Jul 2014 00:00:00 +0000 /entries/Pop_Refinement.html Decision Procedures for MSO on Words Based on Derivatives of Regular Expressions /entries/MSO_Regex_Equivalence.html Thu, 12 Jun 2014 00:00:00 +0000 /entries/MSO_Regex_Equivalence.html Boolean Expression Checkers /entries/Boolean_Expression_Checkers.html Sun, 08 Jun 2014 00:00:00 +0000 /entries/Boolean_Expression_Checkers.html A Fully Verified Executable LTL Model Checker /entries/CAVA_LTL_Modelchecker.html Wed, 28 May 2014 00:00:00 +0000 /entries/CAVA_LTL_Modelchecker.html Converting Linear-Time Temporal Logic to Generalized Büchi Automata /entries/LTL_to_GBA.html Wed, 28 May 2014 00:00:00 +0000 /entries/LTL_to_GBA.html Promela Formalization /entries/Promela.html Wed, 28 May 2014 00:00:00 +0000 /entries/Promela.html The CAVA Automata Library /entries/CAVA_Automata.html Wed, 28 May 2014 00:00:00 +0000 /entries/CAVA_Automata.html Verified Efficient Implementation of Gabow's Strongly Connected Components Algorithm /entries/Gabow_SCC.html Wed, 28 May 2014 00:00:00 +0000 /entries/Gabow_SCC.html Noninterference Security in Communicating Sequential Processes /entries/Noninterference_CSP.html Fri, 23 May 2014 00:00:00 +0000 /entries/Noninterference_CSP.html Transitive closure according to Roy-Floyd-Warshall /entries/Roy_Floyd_Warshall.html Fri, 23 May 2014 00:00:00 +0000 /entries/Roy_Floyd_Warshall.html Regular Algebras /entries/Regular_Algebras.html Wed, 21 May 2014 00:00:00 +0000 /entries/Regular_Algebras.html Formalisation and Analysis of Component Dependencies /entries/ComponentDependencies.html Mon, 28 Apr 2014 00:00:00 +0000 /entries/ComponentDependencies.html A Formalization of Assumptions and Guarantees for Compositional Noninterference /entries/SIFUM_Type_Systems.html Wed, 23 Apr 2014 00:00:00 +0000 /entries/SIFUM_Type_Systems.html A Formalization of Declassification with WHAT-and-WHERE-Security /entries/WHATandWHERE_Security.html Wed, 23 Apr 2014 00:00:00 +0000 /entries/WHATandWHERE_Security.html A Formalization of Strong Security /entries/Strong_Security.html Wed, 23 Apr 2014 00:00:00 +0000 /entries/Strong_Security.html Bounded-Deducibility Security /entries/Bounded_Deducibility_Security.html Tue, 22 Apr 2014 00:00:00 +0000 /entries/Bounded_Deducibility_Security.html A shallow embedding of HyperCTL* /entries/HyperCTL.html Wed, 16 Apr 2014 00:00:00 +0000 /entries/HyperCTL.html Abstract Completeness /entries/Abstract_Completeness.html Wed, 16 Apr 2014 00:00:00 +0000 /entries/Abstract_Completeness.html Discrete Summation /entries/Discrete_Summation.html Sun, 13 Apr 2014 00:00:00 +0000 /entries/Discrete_Summation.html Syntax and semantics of a GPU kernel programming language /entries/GPU_Kernel_PL.html Thu, 03 Apr 2014 00:00:00 +0000 /entries/GPU_Kernel_PL.html Probabilistic Noninterference /entries/Probabilistic_Noninterference.html Tue, 11 Mar 2014 00:00:00 +0000 /entries/Probabilistic_Noninterference.html Mechanization of the Algebra for Wireless Networks (AWN) /entries/AWN.html Sat, 08 Mar 2014 00:00:00 +0000 /entries/AWN.html Mutually Recursive Partial Functions /entries/Partial_Function_MR.html Tue, 18 Feb 2014 00:00:00 +0000 /entries/Partial_Function_MR.html Properties of Random Graphs -- Subgraph Containment /entries/Random_Graph_Subgraph_Threshold.html Thu, 13 Feb 2014 00:00:00 +0000 /entries/Random_Graph_Subgraph_Threshold.html Verification of Selection and Heap Sort Using Locales /entries/Selection_Heap_Sort.html Tue, 11 Feb 2014 00:00:00 +0000 /entries/Selection_Heap_Sort.html Affine Arithmetic /entries/Affine_Arithmetic.html Fri, 07 Feb 2014 00:00:00 +0000 /entries/Affine_Arithmetic.html Implementing field extensions of the form Q[sqrt(b)] /entries/Real_Impl.html Thu, 06 Feb 2014 00:00:00 +0000 /entries/Real_Impl.html Unified Decision Procedures for Regular Expression Equivalence /entries/Regex_Equivalence.html Thu, 30 Jan 2014 00:00:00 +0000 /entries/Regex_Equivalence.html Secondary Sylow Theorems /entries/Secondary_Sylow.html Tue, 28 Jan 2014 00:00:00 +0000 /entries/Secondary_Sylow.html Relation Algebra /entries/Relation_Algebra.html Sat, 25 Jan 2014 00:00:00 +0000 /entries/Relation_Algebra.html Kleene Algebra with Tests and Demonic Refinement Algebras /entries/KAT_and_DRA.html Thu, 23 Jan 2014 00:00:00 +0000 /entries/KAT_and_DRA.html Featherweight OCL: A Proposal for a Machine-Checked Formal Semantics for OCL 2.5 /entries/Featherweight_OCL.html Thu, 16 Jan 2014 00:00:00 +0000 /entries/Featherweight_OCL.html Compositional Properties of Crypto-Based Components /entries/CryptoBasedCompositionalProperties.html Sat, 11 Jan 2014 00:00:00 +0000 /entries/CryptoBasedCompositionalProperties.html Sturm's Theorem /entries/Sturm_Sequences.html Sat, 11 Jan 2014 00:00:00 +0000 /entries/Sturm_Sequences.html A General Method for the Proof of Theorems on Tail-recursive Functions /entries/Tail_Recursive_Functions.html Sun, 01 Dec 2013 00:00:00 +0000 /entries/Tail_Recursive_Functions.html Gödel's Incompleteness Theorems /entries/Incompleteness.html Sun, 17 Nov 2013 00:00:00 +0000 /entries/Incompleteness.html The Hereditarily Finite Sets /entries/HereditarilyFinite.html Sun, 17 Nov 2013 00:00:00 +0000 /entries/HereditarilyFinite.html A Codatatype of Formal Languages /entries/Coinductive_Languages.html Fri, 15 Nov 2013 00:00:00 +0000 /entries/Coinductive_Languages.html Stream Processing Components: Isabelle/HOL Formalisation and Case Studies /entries/FocusStreamsCaseStudies.html Thu, 14 Nov 2013 00:00:00 +0000 /entries/FocusStreamsCaseStudies.html Gödel's God in Isabelle/HOL /entries/GoedelGod.html Tue, 12 Nov 2013 00:00:00 +0000 /entries/GoedelGod.html Decreasing Diagrams /entries/Decreasing-Diagrams.html Fri, 01 Nov 2013 00:00:00 +0000 /entries/Decreasing-Diagrams.html Automatic Data Refinement /entries/Automatic_Refinement.html Wed, 02 Oct 2013 00:00:00 +0000 /entries/Automatic_Refinement.html Native Word /entries/Native_Word.html Tue, 17 Sep 2013 00:00:00 +0000 /entries/Native_Word.html A Formal Model of IEEE Floating Point Arithmetic /entries/IEEE_Floating_Point.html Sat, 27 Jul 2013 00:00:00 +0000 /entries/IEEE_Floating_Point.html Lehmer's Theorem /entries/Lehmer.html Mon, 22 Jul 2013 00:00:00 +0000 /entries/Lehmer.html Pratt's Primality Certificates /entries/Pratt_Certificate.html Mon, 22 Jul 2013 00:00:00 +0000 /entries/Pratt_Certificate.html The Königsberg Bridge Problem and the Friendship Theorem /entries/Koenigsberg_Friendship.html Fri, 19 Jul 2013 00:00:00 +0000 /entries/Koenigsberg_Friendship.html Sound and Complete Sort Encodings for First-Order Logic /entries/Sort_Encodings.html Thu, 27 Jun 2013 00:00:00 +0000 /entries/Sort_Encodings.html An Axiomatic Characterization of the Single-Source Shortest Path Problem /entries/ShortestPath.html Wed, 22 May 2013 00:00:00 +0000 /entries/ShortestPath.html Graph Theory /entries/Graph_Theory.html Sun, 28 Apr 2013 00:00:00 +0000 /entries/Graph_Theory.html Light-weight Containers /entries/Containers.html Mon, 15 Apr 2013 00:00:00 +0000 /entries/Containers.html Nominal 2 /entries/Nominal2.html Thu, 21 Feb 2013 00:00:00 +0000 /entries/Nominal2.html The Correctness of Launchbury's Natural Semantics for Lazy Evaluation /entries/Launchbury.html Thu, 31 Jan 2013 00:00:00 +0000 /entries/Launchbury.html Ribbon Proofs /entries/Ribbon_Proofs.html Sat, 19 Jan 2013 00:00:00 +0000 /entries/Ribbon_Proofs.html Rank-Nullity Theorem in Linear Algebra /entries/Rank_Nullity_Theorem.html Wed, 16 Jan 2013 00:00:00 +0000 /entries/Rank_Nullity_Theorem.html Kleene Algebra /entries/Kleene_Algebra.html Tue, 15 Jan 2013 00:00:00 +0000 /entries/Kleene_Algebra.html Computing N-th Roots using the Babylonian Method /entries/Sqrt_Babylonian.html Thu, 03 Jan 2013 00:00:00 +0000 /entries/Sqrt_Babylonian.html A Separation Logic Framework for Imperative HOL /entries/Separation_Logic_Imperative_HOL.html Wed, 14 Nov 2012 00:00:00 +0000 /entries/Separation_Logic_Imperative_HOL.html Open Induction /entries/Open_Induction.html Fri, 02 Nov 2012 00:00:00 +0000 /entries/Open_Induction.html The independence of Tarski's Euclidean axiom /entries/Tarskis_Geometry.html Tue, 30 Oct 2012 00:00:00 +0000 /entries/Tarskis_Geometry.html Bondy's Theorem /entries/Bondy.html Sat, 27 Oct 2012 00:00:00 +0000 /entries/Bondy.html Possibilistic Noninterference /entries/Possibilistic_Noninterference.html Mon, 10 Sep 2012 00:00:00 +0000 /entries/Possibilistic_Noninterference.html Generating linear orders for datatypes /entries/Datatype_Order_Generator.html Tue, 07 Aug 2012 00:00:00 +0000 /entries/Datatype_Order_Generator.html Proving the Impossibility of Trisecting an Angle and Doubling the Cube /entries/Impossible_Geometry.html Sun, 05 Aug 2012 00:00:00 +0000 /entries/Impossible_Geometry.html Verifying Fault-Tolerant Distributed Algorithms in the Heard-Of Model /entries/Heard_Of.html Fri, 27 Jul 2012 00:00:00 +0000 /entries/Heard_Of.html Logical Relations for PCF /entries/PCF.html Sun, 01 Jul 2012 00:00:00 +0000 /entries/PCF.html Type Constructor Classes and Monad Transformers /entries/Tycon.html Tue, 26 Jun 2012 00:00:00 +0000 /entries/Tycon.html CCS in nominal logic /entries/CCS.html Tue, 29 May 2012 00:00:00 +0000 /entries/CCS.html Psi-calculi in Isabelle /entries/Psi_Calculi.html Tue, 29 May 2012 00:00:00 +0000 /entries/Psi_Calculi.html The pi-calculus in nominal logic /entries/Pi_Calculus.html Tue, 29 May 2012 00:00:00 +0000 /entries/Pi_Calculus.html Isabelle/Circus /entries/Circus.html Sun, 27 May 2012 00:00:00 +0000 /entries/Circus.html Separation Algebra /entries/Separation_Algebra.html Fri, 11 May 2012 00:00:00 +0000 /entries/Separation_Algebra.html Stuttering Equivalence /entries/Stuttering_Equivalence.html Mon, 07 May 2012 00:00:00 +0000 /entries/Stuttering_Equivalence.html Inductive Study of Confidentiality /entries/Inductive_Confidentiality.html Wed, 02 May 2012 00:00:00 +0000 /entries/Inductive_Confidentiality.html Ordinary Differential Equations /entries/Ordinary_Differential_Equations.html Thu, 26 Apr 2012 00:00:00 +0000 /entries/Ordinary_Differential_Equations.html Well-Quasi-Orders /entries/Well_Quasi_Orders.html Fri, 13 Apr 2012 00:00:00 +0000 /entries/Well_Quasi_Orders.html Abortable Linearizable Modules /entries/Abortable_Linearizable_Modules.html Thu, 01 Mar 2012 00:00:00 +0000 /entries/Abortable_Linearizable_Modules.html Executable Transitive Closures /entries/Transitive-Closure-II.html Wed, 29 Feb 2012 00:00:00 +0000 /entries/Transitive-Closure-II.html A Probabilistic Proof of the Girth-Chromatic Number Theorem /entries/Girth_Chromatic.html Mon, 06 Feb 2012 00:00:00 +0000 /entries/Girth_Chromatic.html Dijkstra's Shortest Path Algorithm /entries/Dijkstra_Shortest_Path.html Mon, 30 Jan 2012 00:00:00 +0000 /entries/Dijkstra_Shortest_Path.html Refinement for Monadic Programs /entries/Refine_Monadic.html Mon, 30 Jan 2012 00:00:00 +0000 /entries/Refine_Monadic.html Markov Models /entries/Markov_Models.html Tue, 03 Jan 2012 00:00:00 +0000 /entries/Markov_Models.html A Definitional Encoding of TLA* in Isabelle/HOL /entries/TLA.html Sat, 19 Nov 2011 00:00:00 +0000 /entries/TLA.html Efficient Mergesort /entries/Efficient-Mergesort.html Wed, 09 Nov 2011 00:00:00 +0000 /entries/Efficient-Mergesort.html Algebra of Monotonic Boolean Transformers /entries/MonoBoolTranAlgebra.html Thu, 22 Sep 2011 00:00:00 +0000 /entries/MonoBoolTranAlgebra.html Lattice Properties /entries/LatticeProperties.html Thu, 22 Sep 2011 00:00:00 +0000 /entries/LatticeProperties.html Pseudo Hoops /entries/PseudoHoops.html Thu, 22 Sep 2011 00:00:00 +0000 /entries/PseudoHoops.html The Myhill-Nerode Theorem Based on Regular Expressions /entries/Myhill-Nerode.html Fri, 26 Aug 2011 00:00:00 +0000 /entries/Myhill-Nerode.html Gauss-Jordan Elimination for Matrices Represented as Functions /entries/Gauss-Jordan-Elim-Fun.html Fri, 19 Aug 2011 00:00:00 +0000 /entries/Gauss-Jordan-Elim-Fun.html Maximum Cardinality Matching /entries/Max-Card-Matching.html Thu, 21 Jul 2011 00:00:00 +0000 /entries/Max-Card-Matching.html Knowledge-based programs /entries/KBPs.html Tue, 17 May 2011 00:00:00 +0000 /entries/KBPs.html The General Triangle Is Unique /entries/General-Triangle.html Fri, 01 Apr 2011 00:00:00 +0000 /entries/General-Triangle.html Executable Transitive Closures of Finite Relations /entries/Transitive-Closure.html Mon, 14 Mar 2011 00:00:00 +0000 /entries/Transitive-Closure.html AutoFocus Stream Processing for Single-Clocking and Multi-Clocking Semantics /entries/AutoFocus-Stream.html Wed, 23 Feb 2011 00:00:00 +0000 /entries/AutoFocus-Stream.html Infinite Lists /entries/List-Infinite.html Wed, 23 Feb 2011 00:00:00 +0000 /entries/List-Infinite.html Interval Temporal Logic on Natural Numbers /entries/Nat-Interval-Logic.html Wed, 23 Feb 2011 00:00:00 +0000 /entries/Nat-Interval-Logic.html Lightweight Java /entries/LightweightJava.html Mon, 07 Feb 2011 00:00:00 +0000 /entries/LightweightJava.html RIPEMD-160 /entries/RIPEMD-160-SPARK.html Mon, 10 Jan 2011 00:00:00 +0000 /entries/RIPEMD-160-SPARK.html Lower Semicontinuous Functions /entries/Lower_Semicontinuous.html Sat, 08 Jan 2011 00:00:00 +0000 /entries/Lower_Semicontinuous.html Hall's Marriage Theorem /entries/Marriage.html Fri, 17 Dec 2010 00:00:00 +0000 /entries/Marriage.html Shivers' Control Flow Analysis /entries/Shivers-CFA.html Tue, 16 Nov 2010 00:00:00 +0000 /entries/Shivers-CFA.html Binomial Heaps and Skew Binomial Heaps /entries/Binomial-Heaps.html Thu, 28 Oct 2010 00:00:00 +0000 /entries/Binomial-Heaps.html Finger Trees /entries/Finger-Trees.html Thu, 28 Oct 2010 00:00:00 +0000 /entries/Finger-Trees.html Functional Binomial Queues /entries/Binomial-Queues.html Thu, 28 Oct 2010 00:00:00 +0000 /entries/Binomial-Queues.html Strong Normalization of Moggis's Computational Metalanguage /entries/Lam-ml-Normalization.html Sun, 29 Aug 2010 00:00:00 +0000 /entries/Lam-ml-Normalization.html Executable Multivariate Polynomials /entries/Polynomials.html Tue, 10 Aug 2010 00:00:00 +0000 /entries/Polynomials.html Formalizing Statecharts using Hierarchical Automata /entries/Statecharts.html Sun, 08 Aug 2010 00:00:00 +0000 /entries/Statecharts.html Free Groups /entries/Free-Groups.html Thu, 24 Jun 2010 00:00:00 +0000 /entries/Free-Groups.html Category Theory /entries/Category2.html Sun, 20 Jun 2010 00:00:00 +0000 /entries/Category2.html Executable Matrix Operations on Matrices of Arbitrary Dimensions /entries/Matrix.html Thu, 17 Jun 2010 00:00:00 +0000 /entries/Matrix.html Abstract Rewriting /entries/Abstract-Rewriting.html Mon, 14 Jun 2010 00:00:00 +0000 /entries/Abstract-Rewriting.html Semantics and Data Refinement of Invariant Based Programs /entries/DataRefinementIBP.html Fri, 28 May 2010 00:00:00 +0000 /entries/DataRefinementIBP.html Verification of the Deutsch-Schorr-Waite Graph Marking Algorithm using Data Refinement /entries/GraphMarkingIBP.html Fri, 28 May 2010 00:00:00 +0000 /entries/GraphMarkingIBP.html A Complete Proof of the Robbins Conjecture /entries/Robbins-Conjecture.html Sat, 22 May 2010 00:00:00 +0000 /entries/Robbins-Conjecture.html Regular Sets and Expressions /entries/Regular-Sets.html Wed, 12 May 2010 00:00:00 +0000 /entries/Regular-Sets.html Locally Nameless Sigma Calculus /entries/Locally-Nameless-Sigma.html Fri, 30 Apr 2010 00:00:00 +0000 /entries/Locally-Nameless-Sigma.html Free Boolean Algebra /entries/Free-Boolean-Algebra.html Mon, 29 Mar 2010 00:00:00 +0000 /entries/Free-Boolean-Algebra.html Information Flow Noninterference via Slicing /entries/InformationFlowSlicing.html Tue, 23 Mar 2010 00:00:00 +0000 /entries/InformationFlowSlicing.html Inter-Procedural Information Flow Noninterference via Slicing /entries/InformationFlowSlicing_Inter.html Tue, 23 Mar 2010 00:00:00 +0000 /entries/InformationFlowSlicing_Inter.html List Index /entries/List-Index.html Sat, 20 Feb 2010 00:00:00 +0000 /entries/List-Index.html Coinductive /entries/Coinductive.html Fri, 12 Feb 2010 00:00:00 +0000 /entries/Coinductive.html A Fast SAT Solver for Isabelle in Standard ML /entries/DPT-SAT-Solver.html Wed, 09 Dec 2009 00:00:00 +0000 /entries/DPT-SAT-Solver.html Formalizing the Logic-Automaton Connection /entries/Presburger-Automata.html Thu, 03 Dec 2009 00:00:00 +0000 /entries/Presburger-Automata.html Collections Framework /entries/Collections.html Wed, 25 Nov 2009 00:00:00 +0000 /entries/Collections.html Tree Automata /entries/Tree-Automata.html Wed, 25 Nov 2009 00:00:00 +0000 /entries/Tree-Automata.html Perfect Number Theorem /entries/Perfect-Number-Thm.html Sun, 22 Nov 2009 00:00:00 +0000 /entries/Perfect-Number-Thm.html Backing up Slicing: Verifying the Interprocedural Two-Phase Horwitz-Reps-Binkley Slicer /entries/HRB-Slicing.html Fri, 13 Nov 2009 00:00:00 +0000 /entries/HRB-Slicing.html The Worker/Wrapper Transformation /entries/WorkerWrapper.html Fri, 30 Oct 2009 00:00:00 +0000 /entries/WorkerWrapper.html Ordinals and Cardinals /entries/Ordinals_and_Cardinals.html Tue, 01 Sep 2009 00:00:00 +0000 /entries/Ordinals_and_Cardinals.html Invertibility in Sequent Calculi /entries/SequentInvertibility.html Fri, 28 Aug 2009 00:00:00 +0000 /entries/SequentInvertibility.html An Example of a Cofinitary Group in Isabelle/HOL /entries/CofGroups.html Tue, 04 Aug 2009 00:00:00 +0000 /entries/CofGroups.html Code Generation for Functions as Data /entries/FinFun.html Wed, 06 May 2009 00:00:00 +0000 /entries/FinFun.html Stream Fusion /entries/Stream-Fusion.html Wed, 29 Apr 2009 00:00:00 +0000 /entries/Stream-Fusion.html A Bytecode Logic for JML and Types /entries/BytecodeLogicJmlTypes.html Fri, 12 Dec 2008 00:00:00 +0000 /entries/BytecodeLogicJmlTypes.html Secure information flow and program logics /entries/SIFPL.html Mon, 10 Nov 2008 00:00:00 +0000 /entries/SIFPL.html Some classical results in Social Choice Theory /entries/SenSocialChoice.html Sun, 09 Nov 2008 00:00:00 +0000 /entries/SenSocialChoice.html Fun With Tilings /entries/FunWithTilings.html Fri, 07 Nov 2008 00:00:00 +0000 /entries/FunWithTilings.html The Textbook Proof of Huffman's Algorithm /entries/Huffman.html Wed, 15 Oct 2008 00:00:00 +0000 /entries/Huffman.html Towards Certified Slicing /entries/Slicing.html Tue, 16 Sep 2008 00:00:00 +0000 /entries/Slicing.html A Correctness Proof for the Volpano/Smith Security Typing System /entries/VolpanoSmith.html Tue, 02 Sep 2008 00:00:00 +0000 /entries/VolpanoSmith.html Arrow and Gibbard-Satterthwaite /entries/ArrowImpossibilityGS.html Mon, 01 Sep 2008 00:00:00 +0000 /entries/ArrowImpossibilityGS.html Fun With Functions /entries/FunWithFunctions.html Tue, 26 Aug 2008 00:00:00 +0000 /entries/FunWithFunctions.html Formal Verification of Modern SAT Solvers /entries/SATSolverVerification.html Wed, 23 Jul 2008 00:00:00 +0000 /entries/SATSolverVerification.html Recursion Theory I /entries/Recursion-Theory-I.html Sat, 05 Apr 2008 00:00:00 +0000 /entries/Recursion-Theory-I.html A Sequential Imperative Programming Language Syntax, Semantics, Hoare Logics and Verification Environment /entries/Simpl.html Fri, 29 Feb 2008 00:00:00 +0000 /entries/Simpl.html BDD Normalisation /entries/BDD.html Fri, 29 Feb 2008 00:00:00 +0000 /entries/BDD.html Normalization by Evaluation /entries/NormByEval.html Mon, 18 Feb 2008 00:00:00 +0000 /entries/NormByEval.html Quantifier Elimination for Linear Arithmetic /entries/LinearQuantifierElim.html Fri, 11 Jan 2008 00:00:00 +0000 /entries/LinearQuantifierElim.html Formalization of Conflict Analysis of Programs with Procedures, Thread Creation, and Monitors /entries/Program-Conflict-Analysis.html Fri, 14 Dec 2007 00:00:00 +0000 /entries/Program-Conflict-Analysis.html Jinja with Threads /entries/JinjaThreads.html Mon, 03 Dec 2007 00:00:00 +0000 /entries/JinjaThreads.html Much Ado About Two /entries/MuchAdoAboutTwo.html Tue, 06 Nov 2007 00:00:00 +0000 /entries/MuchAdoAboutTwo.html Fermat's Last Theorem for Exponents 3 and 4 and the Parametrisation of Pythagorean Triples /entries/Fermat3_4.html Sun, 12 Aug 2007 00:00:00 +0000 /entries/Fermat3_4.html Sums of Two and Four Squares /entries/SumSquares.html Sun, 12 Aug 2007 00:00:00 +0000 /entries/SumSquares.html Fundamental Properties of Valuation Theory and Hensel's Lemma /entries/Valuation.html Wed, 08 Aug 2007 00:00:00 +0000 /entries/Valuation.html First-Order Logic According to Fitting /entries/FOL-Fitting.html Thu, 02 Aug 2007 00:00:00 +0000 /entries/FOL-Fitting.html POPLmark Challenge Via de Bruijn Indices /entries/POPLmark-deBruijn.html Thu, 02 Aug 2007 00:00:00 +0000 /entries/POPLmark-deBruijn.html Hotel Key Card System /entries/HotelKeyCards.html Sat, 09 Sep 2006 00:00:00 +0000 /entries/HotelKeyCards.html Abstract Hoare Logics /entries/Abstract-Hoare-Logics.html Tue, 08 Aug 2006 00:00:00 +0000 /entries/Abstract-Hoare-Logics.html Flyspeck I: Tame Graphs /entries/Flyspeck-Tame.html Mon, 22 May 2006 00:00:00 +0000 /entries/Flyspeck-Tame.html CoreC++ /entries/CoreC++.html Mon, 15 May 2006 00:00:00 +0000 /entries/CoreC++.html A Theory of Featherweight Java in Isabelle/HOL /entries/FeatherweightJava.html Fri, 31 Mar 2006 00:00:00 +0000 /entries/FeatherweightJava.html Instances of Schneider's generalized protocol of clock synchronization /entries/ClockSynchInst.html Wed, 15 Mar 2006 00:00:00 +0000 /entries/ClockSynchInst.html Cauchy's Mean Theorem and the Cauchy-Schwarz Inequality /entries/Cauchy.html Tue, 14 Mar 2006 00:00:00 +0000 /entries/Cauchy.html Countable Ordinals /entries/Ordinal.html Fri, 11 Nov 2005 00:00:00 +0000 /entries/Ordinal.html Fast Fourier Transform /entries/FFT.html Wed, 12 Oct 2005 00:00:00 +0000 /entries/FFT.html Formalization of a Generalized Protocol for Clock Synchronization /entries/GenClock.html Fri, 24 Jun 2005 00:00:00 +0000 /entries/GenClock.html Proving the Correctness of Disk Paxos /entries/DiskPaxos.html Wed, 22 Jun 2005 00:00:00 +0000 /entries/DiskPaxos.html Jive Data and Store Model /entries/JiveDataStoreModel.html Mon, 20 Jun 2005 00:00:00 +0000 /entries/JiveDataStoreModel.html Jinja is not Java /entries/Jinja.html Wed, 01 Jun 2005 00:00:00 +0000 /entries/Jinja.html SHA1, RSA, PSS and more /entries/RSAPSS.html Mon, 02 May 2005 00:00:00 +0000 /entries/RSAPSS.html Category Theory to Yoneda's Lemma /entries/Category.html Thu, 21 Apr 2005 00:00:00 +0000 /entries/Category.html File Refinement /entries/FileRefinement.html Thu, 09 Dec 2004 00:00:00 +0000 /entries/FileRefinement.html Integration theory and random variables /entries/Integration.html Fri, 19 Nov 2004 00:00:00 +0000 /entries/Integration.html A Mechanically Verified, Efficient, Sound and Complete Theorem Prover For First Order Logic /entries/Verified-Prover.html Tue, 28 Sep 2004 00:00:00 +0000 /entries/Verified-Prover.html Completeness theorem /entries/Completeness.html Mon, 20 Sep 2004 00:00:00 +0000 /entries/Completeness.html Ramsey's theorem, infinitary version /entries/Ramsey-Infinite.html Mon, 20 Sep 2004 00:00:00 +0000 /entries/Ramsey-Infinite.html Compiling Exceptions Correctly /entries/Compiling-Exceptions-Correctly.html Fri, 09 Jul 2004 00:00:00 +0000 /entries/Compiling-Exceptions-Correctly.html Depth First Search /entries/Depth-First-Search.html Thu, 24 Jun 2004 00:00:00 +0000 /entries/Depth-First-Search.html Groups, Rings and Modules /entries/Group-Ring-Module.html Tue, 18 May 2004 00:00:00 +0000 /entries/Group-Ring-Module.html Lazy Lists II /entries/Lazy-Lists-II.html Mon, 26 Apr 2004 00:00:00 +0000 /entries/Lazy-Lists-II.html Topology /entries/Topology.html Mon, 26 Apr 2004 00:00:00 +0000 /entries/Topology.html Binary Search Trees /entries/BinarySearchTree.html Mon, 05 Apr 2004 00:00:00 +0000 /entries/BinarySearchTree.html Functional Automata /entries/Functional-Automata.html Tue, 30 Mar 2004 00:00:00 +0000 /entries/Functional-Automata.html AVL Trees /entries/AVL-Trees.html Fri, 19 Mar 2004 00:00:00 +0000 /entries/AVL-Trees.html Mini ML /entries/MiniML.html Fri, 19 Mar 2004 00:00:00 +0000 /entries/MiniML.html Abortable_Linearizable_Modules /sessions/abortable_linearizable_modules/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/abortable_linearizable_modules/ Abs_Int_ITP2012 /sessions/abs_int_itp2012/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/abs_int_itp2012/ Abstract_Completeness /sessions/abstract_completeness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/abstract_completeness/ Abstract_Soundness /sessions/abstract_soundness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/abstract_soundness/ Abstract-Hoare-Logics /sessions/abstract-hoare-logics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/abstract-hoare-logics/ Abstract-Rewriting /sessions/abstract-rewriting/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/abstract-rewriting/ ABY3_Protocols /sessions/aby3_protocols/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/aby3_protocols/ Ackermanns_not_PR /sessions/ackermanns_not_pr/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ackermanns_not_pr/ Actuarial_Mathematics /sessions/actuarial_mathematics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/actuarial_mathematics/ Adaptive_State_Counting /sessions/adaptive_state_counting/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/adaptive_state_counting/ ADS_Functor /sessions/ads_functor/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ads_functor/ Affine_Arithmetic /sessions/affine_arithmetic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/affine_arithmetic/ Aggregation_Algebras /sessions/aggregation_algebras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/aggregation_algebras/ AI_Planning_Languages_Semantics /sessions/ai_planning_languages_semantics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ai_planning_languages_semantics/ Akra_Bazzi /sessions/akra_bazzi/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/akra_bazzi/ Algebraic_Numbers /sessions/algebraic_numbers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/algebraic_numbers/ Algebraic_VCs /sessions/algebraic_vcs/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/algebraic_vcs/ Allen_Calculus /sessions/allen_calculus/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/allen_calculus/ Amicable_Numbers /sessions/amicable_numbers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/amicable_numbers/ Amortized_Complexity /sessions/amortized_complexity/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/amortized_complexity/ AnselmGod /sessions/anselmgod/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/anselmgod/ AODV /sessions/aodv/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/aodv/ AOT /sessions/aot/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/aot/ Applicative_Lifting /sessions/applicative_lifting/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/applicative_lifting/ + Approximate_Model_Counting + /sessions/approximate_model_counting/ + Mon, 01 Jan 0001 00:00:00 +0000 + /sessions/approximate_model_counting/ + + + Approximation_Algorithms /sessions/approximation_algorithms/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/approximation_algorithms/ Architectural_Design_Patterns /sessions/architectural_design_patterns/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/architectural_design_patterns/ Aristotles_Assertoric_Syllogistic /sessions/aristotles_assertoric_syllogistic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/aristotles_assertoric_syllogistic/ Arith_Prog_Rel_Primes /sessions/arith_prog_rel_primes/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/arith_prog_rel_primes/ ArrowImpossibilityGS /sessions/arrowimpossibilitygs/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/arrowimpossibilitygs/ Attack_Trees /sessions/attack_trees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/attack_trees/ Auto2_HOL /sessions/auto2_hol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/auto2_hol/ Auto2_Imperative_HOL /sessions/auto2_imperative_hol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/auto2_imperative_hol/ AutoFocus-Stream /sessions/autofocus-stream/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/autofocus-stream/ Automated_Stateful_Protocol_Verification /sessions/automated_stateful_protocol_verification/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/automated_stateful_protocol_verification/ Automatic_Refinement /sessions/automatic_refinement/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/automatic_refinement/ AVL-Trees /sessions/avl-trees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/avl-trees/ AWN /sessions/awn/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/awn/ AxiomaticCategoryTheory /sessions/axiomaticcategorytheory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/axiomaticcategorytheory/ Balog_Szemeredi_Gowers /sessions/balog_szemeredi_gowers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/balog_szemeredi_gowers/ Banach_Steinhaus /sessions/banach_steinhaus/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/banach_steinhaus/ BD_Security_Compositional /sessions/bd_security_compositional/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bd_security_compositional/ BDD /sessions/bdd/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bdd/ Belief_Revision /sessions/belief_revision/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/belief_revision/ Bell_Numbers_Spivey /sessions/bell_numbers_spivey/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bell_numbers_spivey/ BenOr_Kozen_Reif /sessions/benor_kozen_reif/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/benor_kozen_reif/ Berlekamp_Zassenhaus /sessions/berlekamp_zassenhaus/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/berlekamp_zassenhaus/ Bernoulli /sessions/bernoulli/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bernoulli/ Bertrands_Postulate /sessions/bertrands_postulate/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bertrands_postulate/ Bicategory /sessions/bicategory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bicategory/ Binary_Code_Imprimitive /sessions/binary_code_imprimitive/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/binary_code_imprimitive/ BinarySearchTree /sessions/binarysearchtree/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/binarysearchtree/ Binding_Syntax_Theory /sessions/binding_syntax_theory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/binding_syntax_theory/ Binomial-Heaps /sessions/binomial-heaps/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/binomial-heaps/ Binomial-Queues /sessions/binomial-queues/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/binomial-queues/ BirdKMP /sessions/birdkmp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/birdkmp/ Birkhoff_Finite_Distributive_Lattices /sessions/birkhoff_finite_distributive_lattices/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/birkhoff_finite_distributive_lattices/ Blue_Eyes /sessions/blue_eyes/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/blue_eyes/ BNF_CC /sessions/bnf_cc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bnf_cc/ BNF_Operations /sessions/bnf_operations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bnf_operations/ Bondy /sessions/bondy/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bondy/ Boolean_Expression_Checkers /sessions/boolean_expression_checkers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/boolean_expression_checkers/ Boolos_Curious_Inference /sessions/boolos_curious_inference/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/boolos_curious_inference/ Boolos_Curious_Inference_Automated /sessions/boolos_curious_inference_automated/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/boolos_curious_inference_automated/ Bounded_Deducibility_Security /sessions/bounded_deducibility_security/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bounded_deducibility_security/ BTree /sessions/btree/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/btree/ Buchi_Complementation /sessions/buchi_complementation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/buchi_complementation/ Budan_Fourier /sessions/budan_fourier/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/budan_fourier/ Buffons_Needle /sessions/buffons_needle/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/buffons_needle/ Buildings /sessions/buildings/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/buildings/ BytecodeLogicJmlTypes /sessions/bytecodelogicjmltypes/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bytecodelogicjmltypes/ C2KA_DistributedSystems /sessions/c2ka_distributedsystems/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/c2ka_distributedsystems/ CakeML /sessions/cakeml/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cakeml/ CakeML_Codegen /sessions/cakeml_codegen/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cakeml_codegen/ Call_Arity /sessions/call_arity/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/call_arity/ Card_Equiv_Relations /sessions/card_equiv_relations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/card_equiv_relations/ Card_Multisets /sessions/card_multisets/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/card_multisets/ Card_Number_Partitions /sessions/card_number_partitions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/card_number_partitions/ Card_Partitions /sessions/card_partitions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/card_partitions/ Cardinality_Continuum /sessions/cardinality_continuum/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cardinality_continuum/ Cartan_FP /sessions/cartan_fp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cartan_fp/ Case_Labeling /sessions/case_labeling/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/case_labeling/ Catalan_Numbers /sessions/catalan_numbers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/catalan_numbers/ Category /sessions/category/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/category/ Category2 /sessions/category2/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/category2/ Category3 /sessions/category3/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/category3/ Catoids /sessions/catoids/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/catoids/ Cauchy /sessions/cauchy/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cauchy/ CAVA_Automata /sessions/cava_automata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cava_automata/ CAVA_Base /sessions/cava_base/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cava_base/ CAVA_LTL_Modelchecker /sessions/cava_ltl_modelchecker/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cava_ltl_modelchecker/ CAVA_Setup /sessions/cava_setup/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cava_setup/ Cayley_Hamilton /sessions/cayley_hamilton/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cayley_hamilton/ CCS /sessions/ccs/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ccs/ Certification_Monads /sessions/certification_monads/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/certification_monads/ Ceva /sessions/ceva/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ceva/ Chandy_Lamport /sessions/chandy_lamport/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/chandy_lamport/ Chebyshev_Polynomials /sessions/chebyshev_polynomials/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/chebyshev_polynomials/ CHERI-C_Memory_Model /sessions/cheri-c_memory_model/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cheri-c_memory_model/ Chord_Segments /sessions/chord_segments/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/chord_segments/ Circus /sessions/circus/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/circus/ CISC-Kernel /sessions/cisc-kernel/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cisc-kernel/ Clean /sessions/clean/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/clean/ Clique_and_Monotone_Circuits /sessions/clique_and_monotone_circuits/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/clique_and_monotone_circuits/ ClockSynchInst /sessions/clocksynchinst/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/clocksynchinst/ Closest_Pair_Points /sessions/closest_pair_points/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/closest_pair_points/ CoCon /sessions/cocon/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cocon/ CofGroups /sessions/cofgroups/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cofgroups/ Coinductive /sessions/coinductive/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/coinductive/ Coinductive_Languages /sessions/coinductive_languages/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/coinductive_languages/ Collections /sessions/collections/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/collections/ Collections_Examples /sessions/collections_examples/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/collections_examples/ Combinable_Wands /sessions/combinable_wands/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/combinable_wands/ Combinatorial_Enumeration_Algorithms /sessions/combinatorial_enumeration_algorithms/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/combinatorial_enumeration_algorithms/ Combinatorics_Words /sessions/combinatorics_words/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/combinatorics_words/ Combinatorics_Words_Graph_Lemma /sessions/combinatorics_words_graph_lemma/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/combinatorics_words_graph_lemma/ Combinatorics_Words_Lyndon /sessions/combinatorics_words_lyndon/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/combinatorics_words_lyndon/ CommCSL /sessions/commcsl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/commcsl/ Commuting_Hermitian /sessions/commuting_hermitian/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/commuting_hermitian/ Comparison_Sort_Lower_Bound /sessions/comparison_sort_lower_bound/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/comparison_sort_lower_bound/ Compiling-Exceptions-Correctly /sessions/compiling-exceptions-correctly/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/compiling-exceptions-correctly/ Complete_Non_Orders /sessions/complete_non_orders/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/complete_non_orders/ Completeness /sessions/completeness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/completeness/ Complex_Bounded_Operators /sessions/complex_bounded_operators/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/complex_bounded_operators/ Complex_Bounded_Operators_Dependencies /sessions/complex_bounded_operators_dependencies/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/complex_bounded_operators_dependencies/ Complex_Geometry /sessions/complex_geometry/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/complex_geometry/ Complx /sessions/complx/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/complx/ ComponentDependencies /sessions/componentdependencies/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/componentdependencies/ Concentration_Inequalities /sessions/concentration_inequalities/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/concentration_inequalities/ Concurrent_Ref_Alg /sessions/concurrent_ref_alg/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/concurrent_ref_alg/ Concurrent_Revisions /sessions/concurrent_revisions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/concurrent_revisions/ ConcurrentGC /sessions/concurrentgc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/concurrentgc/ ConcurrentIMP /sessions/concurrentimp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/concurrentimp/ Conditional_Simplification /sessions/conditional_simplification/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/conditional_simplification/ Conditional_Transfer_Rule /sessions/conditional_transfer_rule/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/conditional_transfer_rule/ Consensus_Refined /sessions/consensus_refined/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/consensus_refined/ Constructive_Cryptography /sessions/constructive_cryptography/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/constructive_cryptography/ Constructive_Cryptography_CM /sessions/constructive_cryptography_cm/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/constructive_cryptography_cm/ Constructor_Funs /sessions/constructor_funs/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/constructor_funs/ Containers /sessions/containers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/containers/ Containers-Benchmarks /sessions/containers-benchmarks/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/containers-benchmarks/ + Continued_Fractions + /sessions/continued_fractions/ + Mon, 01 Jan 0001 00:00:00 +0000 + /sessions/continued_fractions/ + + + Cook_Levin /sessions/cook_levin/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cook_levin/ Core_DOM /sessions/core_dom/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/core_dom/ Core_SC_DOM /sessions/core_sc_dom/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/core_sc_dom/ CoreC++ /sessions/corec++/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/corec++/ Correctness_Algebras /sessions/correctness_algebras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/correctness_algebras/ CoSMed /sessions/cosmed/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cosmed/ CoSMeDis /sessions/cosmedis/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cosmedis/ Cotangent_PFD_Formula /sessions/cotangent_pfd_formula/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cotangent_pfd_formula/ Count_Complex_Roots /sessions/count_complex_roots/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/count_complex_roots/ Coupledsim_Contrasim /sessions/coupledsim_contrasim/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/coupledsim_contrasim/ CRDT /sessions/crdt/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/crdt/ CryptHOL /sessions/crypthol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/crypthol/ Crypto_Standards /sessions/crypto_standards/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/crypto_standards/ CryptoBasedCompositionalProperties /sessions/cryptobasedcompositionalproperties/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cryptobasedcompositionalproperties/ CRYSTALS-Kyber /sessions/crystals-kyber/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/crystals-kyber/ CRYSTALS-Kyber_Security /sessions/crystals-kyber_security/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/crystals-kyber_security/ CSP_RefTK /sessions/csp_reftk/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/csp_reftk/ Cubic_Quartic_Equations /sessions/cubic_quartic_equations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cubic_quartic_equations/ CubicalCategories /sessions/cubicalcategories/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cubicalcategories/ CVP_Hardness /sessions/cvp_hardness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cvp_hardness/ CYK /sessions/cyk/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cyk/ CZH_Elementary_Categories /sessions/czh_elementary_categories/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/czh_elementary_categories/ CZH_Foundations /sessions/czh_foundations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/czh_foundations/ CZH_Universal_Constructions /sessions/czh_universal_constructions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/czh_universal_constructions/ DataRefinementIBP /sessions/datarefinementibp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/datarefinementibp/ Datatype_Order_Generator /sessions/datatype_order_generator/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/datatype_order_generator/ DCR-ExecutionEquivalence /sessions/dcr-executionequivalence/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dcr-executionequivalence/ Decl_Sem_Fun_PL /sessions/decl_sem_fun_pl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/decl_sem_fun_pl/ Decreasing-Diagrams /sessions/decreasing-diagrams/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/decreasing-diagrams/ Decreasing-Diagrams-II /sessions/decreasing-diagrams-ii/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/decreasing-diagrams-ii/ Dedekind_Real /sessions/dedekind_real/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dedekind_real/ Deep_Learning /sessions/deep_learning/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/deep_learning/ Delta_System_Lemma /sessions/delta_system_lemma/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/delta_system_lemma/ Density_Compiler /sessions/density_compiler/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/density_compiler/ Dependent_SIFUM_Refinement /sessions/dependent_sifum_refinement/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dependent_sifum_refinement/ Dependent_SIFUM_Type_Systems /sessions/dependent_sifum_type_systems/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dependent_sifum_type_systems/ Depth-First-Search /sessions/depth-first-search/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/depth-first-search/ Derangements /sessions/derangements/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/derangements/ Deriving /sessions/deriving/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/deriving/ Descartes_Sign_Rule /sessions/descartes_sign_rule/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/descartes_sign_rule/ Design_Theory /sessions/design_theory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/design_theory/ DFS_Framework /sessions/dfs_framework/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dfs_framework/ Dict_Construction /sessions/dict_construction/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dict_construction/ Differential_Dynamic_Logic /sessions/differential_dynamic_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/differential_dynamic_logic/ Differential_Game_Logic /sessions/differential_game_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/differential_game_logic/ Digit_Expansions /sessions/digit_expansions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/digit_expansions/ DigitsInBase /sessions/digitsinbase/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/digitsinbase/ Dijkstra_Shortest_Path /sessions/dijkstra_shortest_path/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dijkstra_shortest_path/ Diophantine_Eqns_Lin_Hom /sessions/diophantine_eqns_lin_hom/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/diophantine_eqns_lin_hom/ Directed_Sets /sessions/directed_sets/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/directed_sets/ Dirichlet_L /sessions/dirichlet_l/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dirichlet_l/ Dirichlet_Series /sessions/dirichlet_series/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dirichlet_series/ Discrete_Summation /sessions/discrete_summation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/discrete_summation/ DiscretePricing /sessions/discretepricing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/discretepricing/ Disintegration /sessions/disintegration/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/disintegration/ DiskPaxos /sessions/diskpaxos/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/diskpaxos/ Distributed_Distinct_Elements /sessions/distributed_distinct_elements/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/distributed_distinct_elements/ DOM_Components /sessions/dom_components/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dom_components/ Dominance_CHK /sessions/dominance_chk/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dominance_chk/ DPRM_Theorem /sessions/dprm_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dprm_theorem/ DPT-SAT-Solver /sessions/dpt-sat-solver/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dpt-sat-solver/ Dynamic_Tables /sessions/dynamic_tables/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dynamic_tables/ DynamicArchitectures /sessions/dynamicarchitectures/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dynamicarchitectures/ E_Transcendental /sessions/e_transcendental/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/e_transcendental/ Earley_Parser /sessions/earley_parser/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/earley_parser/ Echelon_Form /sessions/echelon_form/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/echelon_form/ EdmondsKarp_Maxflow /sessions/edmondskarp_maxflow/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/edmondskarp_maxflow/ Edwards_Elliptic_Curves_Group /sessions/edwards_elliptic_curves_group/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/edwards_elliptic_curves_group/ Efficient_Weighted_Path_Order /sessions/efficient_weighted_path_order/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/efficient_weighted_path_order/ Efficient-Mergesort /sessions/efficient-mergesort/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/efficient-mergesort/ Elimination_Of_Repeated_Factors /sessions/elimination_of_repeated_factors/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/elimination_of_repeated_factors/ Elliptic_Curves_Group_Law /sessions/elliptic_curves_group_law/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/elliptic_curves_group_law/ Encodability_Process_Calculi /sessions/encodability_process_calculi/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/encodability_process_calculi/ Epistemic_Logic /sessions/epistemic_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/epistemic_logic/ Equivalence_Relation_Enumeration /sessions/equivalence_relation_enumeration/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/equivalence_relation_enumeration/ Ergodic_Theory /sessions/ergodic_theory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ergodic_theory/ Error_Function /sessions/error_function/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/error_function/ Eudoxus_Reals /sessions/eudoxus_reals/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/eudoxus_reals/ Euler_MacLaurin /sessions/euler_maclaurin/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/euler_maclaurin/ Euler_Partition /sessions/euler_partition/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/euler_partition/ Euler_Polyhedron_Formula /sessions/euler_polyhedron_formula/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/euler_polyhedron_formula/ Eval_FO /sessions/eval_fo/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/eval_fo/ Example-Submission /sessions/example-submission/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/example-submission/ Executable_Randomized_Algorithms /sessions/executable_randomized_algorithms/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/executable_randomized_algorithms/ Expander_Graphs /sessions/expander_graphs/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/expander_graphs/ Extended_Finite_State_Machine_Inference /sessions/extended_finite_state_machine_inference/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/extended_finite_state_machine_inference/ Extended_Finite_State_Machines /sessions/extended_finite_state_machines/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/extended_finite_state_machines/ Factor_Algebraic_Polynomial /sessions/factor_algebraic_polynomial/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/factor_algebraic_polynomial/ Factored_Transition_System_Bounding /sessions/factored_transition_system_bounding/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/factored_transition_system_bounding/ Falling_Factorial_Sum /sessions/falling_factorial_sum/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/falling_factorial_sum/ Farkas /sessions/farkas/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/farkas/ Featherweight_OCL /sessions/featherweight_ocl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/featherweight_ocl/ FeatherweightJava /sessions/featherweightjava/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/featherweightjava/ Fermat3_4 /sessions/fermat3_4/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fermat3_4/ FFT /sessions/fft/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fft/ FileRefinement /sessions/filerefinement/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/filerefinement/ FinFun /sessions/finfun/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/finfun/ Finger-Trees /sessions/finger-trees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/finger-trees/ Finite_Automata_HF /sessions/finite_automata_hf/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/finite_automata_hf/ Finite_Fields /sessions/finite_fields/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/finite_fields/ Finite-Map-Extras /sessions/finite-map-extras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/finite-map-extras/ Finitely_Generated_Abelian_Groups /sessions/finitely_generated_abelian_groups/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/finitely_generated_abelian_groups/ First_Order_Terms /sessions/first_order_terms/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/first_order_terms/ First_Welfare_Theorem /sessions/first_welfare_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/first_welfare_theorem/ Fishburn_Impossibility /sessions/fishburn_impossibility/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fishburn_impossibility/ Fisher_Yates /sessions/fisher_yates/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fisher_yates/ Fishers_Inequality /sessions/fishers_inequality/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fishers_inequality/ Fixed_Length_Vector /sessions/fixed_length_vector/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fixed_length_vector/ Flow_Networks /sessions/flow_networks/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/flow_networks/ Floyd_Warshall /sessions/floyd_warshall/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/floyd_warshall/ FLP /sessions/flp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/flp/ Flyspeck-Tame /sessions/flyspeck-tame/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/flyspeck-tame/ Flyspeck-Tame-Computation /sessions/flyspeck-tame-computation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/flyspeck-tame-computation/ FO_Theory_Rewriting /sessions/fo_theory_rewriting/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fo_theory_rewriting/ FocusStreamsCaseStudies /sessions/focusstreamscasestudies/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/focusstreamscasestudies/ FOL_Axiomatic /sessions/fol_axiomatic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fol_axiomatic/ FOL_Harrison /sessions/fol_harrison/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fol_harrison/ FOL_Seq_Calc1 /sessions/fol_seq_calc1/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fol_seq_calc1/ FOL_Seq_Calc2 /sessions/fol_seq_calc2/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fol_seq_calc2/ FOL_Seq_Calc3 /sessions/fol_seq_calc3/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fol_seq_calc3/ FOL-Fitting /sessions/fol-fitting/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fol-fitting/ Forcing /sessions/forcing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/forcing/ Formal_Puiseux_Series /sessions/formal_puiseux_series/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/formal_puiseux_series/ Formal_SSA /sessions/formal_ssa/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/formal_ssa/ Formula_Derivatives /sessions/formula_derivatives/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/formula_derivatives/ Formula_Derivatives-Examples /sessions/formula_derivatives-examples/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/formula_derivatives-examples/ Foundation_of_geometry /sessions/foundation_of_geometry/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/foundation_of_geometry/ Fourier /sessions/fourier/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fourier/ Free-Boolean-Algebra /sessions/free-boolean-algebra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/free-boolean-algebra/ Free-Groups /sessions/free-groups/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/free-groups/ Frequency_Moments /sessions/frequency_moments/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/frequency_moments/ Fresh_Identifiers /sessions/fresh_identifiers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fresh_identifiers/ FSM_Tests /sessions/fsm_tests/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fsm_tests/ Functional_Ordered_Resolution_Prover /sessions/functional_ordered_resolution_prover/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/functional_ordered_resolution_prover/ Functional-Automata /sessions/functional-automata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/functional-automata/ FunWithFunctions /sessions/funwithfunctions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/funwithfunctions/ FunWithTilings /sessions/funwithtilings/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/funwithtilings/ Furstenberg_Topology /sessions/furstenberg_topology/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/furstenberg_topology/ Gabow_SCC /sessions/gabow_scc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gabow_scc/ Gale_Shapley /sessions/gale_shapley/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gale_shapley/ GaleStewart_Games /sessions/galestewart_games/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/galestewart_games/ Game_Based_Crypto /sessions/game_based_crypto/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/game_based_crypto/ Gauss_Jordan /sessions/gauss_jordan/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gauss_jordan/ Gauss_Sums /sessions/gauss_sums/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gauss_sums/ Gauss-Jordan-Elim-Fun /sessions/gauss-jordan-elim-fun/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gauss-jordan-elim-fun/ Gaussian_Integers /sessions/gaussian_integers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gaussian_integers/ GenClock /sessions/genclock/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/genclock/ General-Triangle /sessions/general-triangle/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/general-triangle/ Generalized_Counting_Sort /sessions/generalized_counting_sort/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/generalized_counting_sort/ Generic_Deriving /sessions/generic_deriving/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/generic_deriving/ Generic_Join /sessions/generic_join/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/generic_join/ GewirthPGCProof /sessions/gewirthpgcproof/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gewirthpgcproof/ Girth_Chromatic /sessions/girth_chromatic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/girth_chromatic/ Given_Clause_Loops /sessions/given_clause_loops/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/given_clause_loops/ + Go + /sessions/go/ + Mon, 01 Jan 0001 00:00:00 +0000 + /sessions/go/ + + + + Go_Test_Quick + /sessions/go_test_quick/ + Mon, 01 Jan 0001 00:00:00 +0000 + /sessions/go_test_quick/ + + + + Go_Test_Slow + /sessions/go_test_slow/ + Mon, 01 Jan 0001 00:00:00 +0000 + /sessions/go_test_slow/ + + + Goedel_HFSet_Semantic /sessions/goedel_hfset_semantic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/goedel_hfset_semantic/ Goedel_HFSet_Semanticless /sessions/goedel_hfset_semanticless/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/goedel_hfset_semanticless/ Goedel_Incompleteness /sessions/goedel_incompleteness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/goedel_incompleteness/ GoedelGod /sessions/goedelgod/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/goedelgod/ Goodstein_Lambda /sessions/goodstein_lambda/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/goodstein_lambda/ GPU_Kernel_PL /sessions/gpu_kernel_pl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gpu_kernel_pl/ Graph_Saturation /sessions/graph_saturation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/graph_saturation/ Graph_Theory /sessions/graph_theory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/graph_theory/ GraphMarkingIBP /sessions/graphmarkingibp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/graphmarkingibp/ Gray_Codes /sessions/gray_codes/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gray_codes/ Green /sessions/green/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/green/ Groebner_Bases /sessions/groebner_bases/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/groebner_bases/ Groebner_Macaulay /sessions/groebner_macaulay/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/groebner_macaulay/ Gromov_Hyperbolicity /sessions/gromov_hyperbolicity/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gromov_hyperbolicity/ Grothendieck_Schemes /sessions/grothendieck_schemes/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/grothendieck_schemes/ Group-Ring-Module /sessions/group-ring-module/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/group-ring-module/ Hahn_Jordan_Decomposition /sessions/hahn_jordan_decomposition/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hahn_jordan_decomposition/ Hales_Jewett /sessions/hales_jewett/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hales_jewett/ Heard_Of /sessions/heard_of/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/heard_of/ Hello_World /sessions/hello_world/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hello_world/ HereditarilyFinite /sessions/hereditarilyfinite/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hereditarilyfinite/ Hermite /sessions/hermite/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hermite/ Hermite_Lindemann /sessions/hermite_lindemann/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hermite_lindemann/ Hidden_Markov_Models /sessions/hidden_markov_models/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hidden_markov_models/ Higher_Order_Terms /sessions/higher_order_terms/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/higher_order_terms/ Hoare_Time /sessions/hoare_time/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hoare_time/ HoareForDivergence /sessions/hoarefordivergence/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hoarefordivergence/ HOL-CSP /sessions/hol-csp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hol-csp/ HOL-CSP_OpSem /sessions/hol-csp_opsem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hol-csp_opsem/ HOL-CSPM /sessions/hol-cspm/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hol-cspm/ HOL-ODE-ARCH-COMP /sessions/hol-ode-arch-comp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hol-ode-arch-comp/ HOL-ODE-Examples /sessions/hol-ode-examples/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hol-ode-examples/ HOL-ODE-Numerics /sessions/hol-ode-numerics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hol-ode-numerics/ HOLCF-Prelude /sessions/holcf-prelude/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/holcf-prelude/ Hood_Melville_Queue /sessions/hood_melville_queue/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hood_melville_queue/ HotelKeyCards /sessions/hotelkeycards/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hotelkeycards/ HRB-Slicing /sessions/hrb-slicing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hrb-slicing/ Huffman /sessions/huffman/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/huffman/ Hybrid_Logic /sessions/hybrid_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hybrid_logic/ Hybrid_Multi_Lane_Spatial_Logic /sessions/hybrid_multi_lane_spatial_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hybrid_multi_lane_spatial_logic/ Hybrid_Systems_VCs /sessions/hybrid_systems_vcs/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hybrid_systems_vcs/ HyperCTL /sessions/hyperctl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hyperctl/ Hyperdual /sessions/hyperdual/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hyperdual/ Hypergraph_Basics /sessions/hypergraph_basics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hypergraph_basics/ Hypergraph_Colourings /sessions/hypergraph_colourings/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hypergraph_colourings/ HyperHoareLogic /sessions/hyperhoarelogic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hyperhoarelogic/ IEEE_Floating_Point /sessions/ieee_floating_point/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ieee_floating_point/ IFC_Tracking /sessions/ifc_tracking/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ifc_tracking/ IMAP-CRDT /sessions/imap-crdt/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imap-crdt/ IMO2019 /sessions/imo2019/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imo2019/ IMP_Compiler /sessions/imp_compiler/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imp_compiler/ IMP_Compiler_Reuse /sessions/imp_compiler_reuse/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imp_compiler_reuse/ IMP_Noninterference /sessions/imp_noninterference/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imp_noninterference/ IMP2 /sessions/imp2/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imp2/ IMP2_Binary_Heap /sessions/imp2_binary_heap/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imp2_binary_heap/ Imperative_Insertion_Sort /sessions/imperative_insertion_sort/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imperative_insertion_sort/ Implicational_Logic /sessions/implicational_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/implicational_logic/ Impossible_Geometry /sessions/impossible_geometry/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/impossible_geometry/ Incompleteness /sessions/incompleteness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/incompleteness/ Incredible_Proof_Machine /sessions/incredible_proof_machine/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/incredible_proof_machine/ Independence_CH /sessions/independence_ch/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/independence_ch/ Inductive_Confidentiality /sessions/inductive_confidentiality/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/inductive_confidentiality/ Inductive_Inference /sessions/inductive_inference/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/inductive_inference/ InformationFlowSlicing /sessions/informationflowslicing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/informationflowslicing/ InformationFlowSlicing_Inter /sessions/informationflowslicing_inter/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/informationflowslicing_inter/ InfPathElimination /sessions/infpathelimination/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/infpathelimination/ Integration /sessions/integration/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/integration/ Interpolation_Polynomials_HOL_Algebra /sessions/interpolation_polynomials_hol_algebra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/interpolation_polynomials_hol_algebra/ Interpreter_Optimizations /sessions/interpreter_optimizations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/interpreter_optimizations/ Interval_Analysis /sessions/interval_analysis/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/interval_analysis/ Interval_Arithmetic_Word32 /sessions/interval_arithmetic_word32/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/interval_arithmetic_word32/ Intro_Dest_Elim /sessions/intro_dest_elim/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/intro_dest_elim/ Involutions2Squares /sessions/involutions2squares/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/involutions2squares/ IO_Language_Conformance /sessions/io_language_conformance/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/io_language_conformance/ IP_Addresses /sessions/ip_addresses/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ip_addresses/ Iptables_Semantics /sessions/iptables_semantics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/iptables_semantics/ Iptables_Semantics_Examples /sessions/iptables_semantics_examples/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/iptables_semantics_examples/ Iptables_Semantics_Examples_Big /sessions/iptables_semantics_examples_big/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/iptables_semantics_examples_big/ Irrational_Series_Erdos_Straus /sessions/irrational_series_erdos_straus/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/irrational_series_erdos_straus/ Irrationality_J_Hancl /sessions/irrationality_j_hancl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/irrationality_j_hancl/ Irrationals_From_THEBOOK /sessions/irrationals_from_thebook/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/irrationals_from_thebook/ Isabelle_C /sessions/isabelle_c/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/isabelle_c/ Isabelle_hoops /sessions/isabelle_hoops/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/isabelle_hoops/ Isabelle_Marries_Dirac /sessions/isabelle_marries_dirac/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/isabelle_marries_dirac/ Isabelle_Meta_Model /sessions/isabelle_meta_model/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/isabelle_meta_model/ IsaGeoCoq /sessions/isageocoq/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/isageocoq/ IsaNet /sessions/isanet/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/isanet/ Jacobson_Basic_Algebra /sessions/jacobson_basic_algebra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/jacobson_basic_algebra/ Jinja /sessions/jinja/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/jinja/ JinjaDCI /sessions/jinjadci/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/jinjadci/ JinjaThreads /sessions/jinjathreads/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/jinjathreads/ JiveDataStoreModel /sessions/jivedatastoremodel/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/jivedatastoremodel/ Jordan_Hoelder /sessions/jordan_hoelder/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/jordan_hoelder/ Jordan_Normal_Form /sessions/jordan_normal_form/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/jordan_normal_form/ KAD /sessions/kad/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kad/ Karatsuba /sessions/karatsuba/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/karatsuba/ KAT_and_DRA /sessions/kat_and_dra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kat_and_dra/ KBPs /sessions/kbps/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kbps/ KD_Tree /sessions/kd_tree/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kd_tree/ Key_Agreement_Strong_Adversaries /sessions/key_agreement_strong_adversaries/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/key_agreement_strong_adversaries/ Khovanskii_Theorem /sessions/khovanskii_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/khovanskii_theorem/ Kleene_Algebra /sessions/kleene_algebra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kleene_algebra/ Kneser_Cauchy_Davenport /sessions/kneser_cauchy_davenport/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kneser_cauchy_davenport/ Knights_Tour /sessions/knights_tour/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/knights_tour/ Knot_Theory /sessions/knot_theory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/knot_theory/ Knuth_Bendix_Order /sessions/knuth_bendix_order/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/knuth_bendix_order/ Knuth_Morris_Pratt /sessions/knuth_morris_pratt/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/knuth_morris_pratt/ KnuthMorrisPratt /sessions/knuthmorrispratt/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/knuthmorrispratt/ Koenigsberg_Friendship /sessions/koenigsberg_friendship/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/koenigsberg_friendship/ Kruskal /sessions/kruskal/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kruskal/ Kuratowski_Closure_Complement /sessions/kuratowski_closure_complement/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kuratowski_closure_complement/ Labeled_Transition_Systems /sessions/labeled_transition_systems/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/labeled_transition_systems/ Lam-ml-Normalization /sessions/lam-ml-normalization/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lam-ml-normalization/ Lambda_Free_EPO /sessions/lambda_free_epo/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lambda_free_epo/ Lambda_Free_KBOs /sessions/lambda_free_kbos/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lambda_free_kbos/ Lambda_Free_RPOs /sessions/lambda_free_rpos/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lambda_free_rpos/ LambdaAuth /sessions/lambdaauth/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lambdaauth/ LambdaMu /sessions/lambdamu/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lambdamu/ Lambert_Series /sessions/lambert_series/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lambert_series/ Lambert_W /sessions/lambert_w/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lambert_w/ Landau_Symbols /sessions/landau_symbols/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/landau_symbols/ Laplace_Transform /sessions/laplace_transform/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/laplace_transform/ Latin_Square /sessions/latin_square/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/latin_square/ LatticeProperties /sessions/latticeproperties/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/latticeproperties/ Launchbury /sessions/launchbury/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/launchbury/ Laws_of_Large_Numbers /sessions/laws_of_large_numbers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/laws_of_large_numbers/ Lazy_Case /sessions/lazy_case/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lazy_case/ Lazy-Lists-II /sessions/lazy-lists-ii/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lazy-lists-ii/ Lehmer /sessions/lehmer/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lehmer/ LEM /sessions/lem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lem/ Lifting_Definition_Option /sessions/lifting_definition_option/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lifting_definition_option/ Lifting_the_Exponent /sessions/lifting_the_exponent/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lifting_the_exponent/ LightweightJava /sessions/lightweightjava/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lightweightjava/ Linear_Inequalities /sessions/linear_inequalities/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/linear_inequalities/ Linear_Programming /sessions/linear_programming/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/linear_programming/ Linear_Recurrences /sessions/linear_recurrences/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/linear_recurrences/ Linear_Recurrences_Solver /sessions/linear_recurrences_solver/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/linear_recurrences_solver/ LinearQuantifierElim /sessions/linearquantifierelim/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/linearquantifierelim/ Liouville_Numbers /sessions/liouville_numbers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/liouville_numbers/ List_Interleaving /sessions/list_interleaving/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/list_interleaving/ List_Inversions /sessions/list_inversions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/list_inversions/ List_Update /sessions/list_update/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/list_update/ List-Index /sessions/list-index/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/list-index/ List-Infinite /sessions/list-infinite/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/list-infinite/ LLL_Basis_Reduction /sessions/lll_basis_reduction/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lll_basis_reduction/ LLL_Factorization /sessions/lll_factorization/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lll_factorization/ Localization_Ring /sessions/localization_ring/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/localization_ring/ LocalLexing /sessions/locallexing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/locallexing/ Locally-Nameless-Sigma /sessions/locally-nameless-sigma/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/locally-nameless-sigma/ LOFT /sessions/loft/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/loft/ Logging_Independent_Anonymity /sessions/logging_independent_anonymity/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/logging_independent_anonymity/ Lorenz_Approximation /sessions/lorenz_approximation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lorenz_approximation/ Lorenz_C0 /sessions/lorenz_c0/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lorenz_c0/ Lorenz_C1 /sessions/lorenz_c1/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lorenz_c1/ Lovasz_Local /sessions/lovasz_local/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lovasz_local/ Lowe_Ontological_Argument /sessions/lowe_ontological_argument/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lowe_ontological_argument/ Lower_Semicontinuous /sessions/lower_semicontinuous/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lower_semicontinuous/ Lp /sessions/lp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lp/ LP_Duality /sessions/lp_duality/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lp_duality/ LTL /sessions/ltl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ltl/ LTL_Master_Theorem /sessions/ltl_master_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ltl_master_theorem/ LTL_Normal_Form /sessions/ltl_normal_form/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ltl_normal_form/ LTL_to_DRA /sessions/ltl_to_dra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ltl_to_dra/ LTL_to_GBA /sessions/ltl_to_gba/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ltl_to_gba/ Lucas_Theorem /sessions/lucas_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lucas_theorem/ Markov_Models /sessions/markov_models/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/markov_models/ Marriage /sessions/marriage/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/marriage/ Martingales /sessions/martingales/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/martingales/ Mason_Stothers /sessions/mason_stothers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mason_stothers/ Matrices_for_ODEs /sessions/matrices_for_odes/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/matrices_for_odes/ Matrix /sessions/matrix/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/matrix/ Matrix_Tensor /sessions/matrix_tensor/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/matrix_tensor/ Matroids /sessions/matroids/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/matroids/ Max-Card-Matching /sessions/max-card-matching/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/max-card-matching/ Maximum_Segment_Sum /sessions/maximum_segment_sum/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/maximum_segment_sum/ MDP-Algorithms /sessions/mdp-algorithms/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mdp-algorithms/ MDP-Rewards /sessions/mdp-rewards/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mdp-rewards/ Median_Method /sessions/median_method/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/median_method/ Median_Of_Medians_Selection /sessions/median_of_medians_selection/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/median_of_medians_selection/ Menger /sessions/menger/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/menger/ Mereology /sessions/mereology/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mereology/ Mersenne_Primes /sessions/mersenne_primes/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mersenne_primes/ Metalogic_ProofChecker /sessions/metalogic_proofchecker/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/metalogic_proofchecker/ MFMC_Countable /sessions/mfmc_countable/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mfmc_countable/ MFODL_Monitor_Optimized /sessions/mfodl_monitor_optimized/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mfodl_monitor_optimized/ MFOTL_Monitor /sessions/mfotl_monitor/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mfotl_monitor/ MHComputation /sessions/mhcomputation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mhcomputation/ Minimal_SSA /sessions/minimal_ssa/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/minimal_ssa/ MiniML /sessions/miniml/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/miniml/ MiniSail /sessions/minisail/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/minisail/ Minkowskis_Theorem /sessions/minkowskis_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/minkowskis_theorem/ Minsky_Machines /sessions/minsky_machines/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/minsky_machines/ ML_Unification /sessions/ml_unification/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ml_unification/ MLSS_Decision_Proc /sessions/mlss_decision_proc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mlss_decision_proc/ Modal_Logics_for_NTS /sessions/modal_logics_for_nts/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/modal_logics_for_nts/ Modular_arithmetic_LLL_and_HNF_algorithms /sessions/modular_arithmetic_lll_and_hnf_algorithms/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/modular_arithmetic_lll_and_hnf_algorithms/ Modular_Assembly_Kit_Security /sessions/modular_assembly_kit_security/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/modular_assembly_kit_security/ Monad_Memo_DP /sessions/monad_memo_dp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/monad_memo_dp/ Monad_Normalisation /sessions/monad_normalisation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/monad_normalisation/ MonoBoolTranAlgebra /sessions/monobooltranalgebra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/monobooltranalgebra/ MonoidalCategory /sessions/monoidalcategory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/monoidalcategory/ Monomorphic_Monad /sessions/monomorphic_monad/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/monomorphic_monad/ MSO_Regex_Equivalence /sessions/mso_regex_equivalence/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mso_regex_equivalence/ MuchAdoAboutTwo /sessions/muchadoabouttwo/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/muchadoabouttwo/ Multi_Party_Computation /sessions/multi_party_computation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/multi_party_computation/ Multirelations /sessions/multirelations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/multirelations/ Multirelations_Heterogeneous /sessions/multirelations_heterogeneous/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/multirelations_heterogeneous/ Multiset_Ordering_NPC /sessions/multiset_ordering_npc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/multiset_ordering_npc/ Multitape_To_Singletape_TM /sessions/multitape_to_singletape_tm/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/multitape_to_singletape_tm/ Myhill-Nerode /sessions/myhill-nerode/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/myhill-nerode/ Name_Carrying_Type_Inference /sessions/name_carrying_type_inference/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/name_carrying_type_inference/ Nano_JSON /sessions/nano_json/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/nano_json/ Nash_Williams /sessions/nash_williams/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/nash_williams/ Nat-Interval-Logic /sessions/nat-interval-logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/nat-interval-logic/ Native_Word /sessions/native_word/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/native_word/ Nested_Multisets_Ordinals /sessions/nested_multisets_ordinals/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/nested_multisets_ordinals/ Network_Security_Policy_Verification /sessions/network_security_policy_verification/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/network_security_policy_verification/ Neumann_Morgenstern_Utility /sessions/neumann_morgenstern_utility/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/neumann_morgenstern_utility/ No_FTL_observers /sessions/no_ftl_observers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/no_ftl_observers/ No_FTL_observers_Gen_Rel /sessions/no_ftl_observers_gen_rel/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/no_ftl_observers_gen_rel/ Nominal_Myhill_Nerode /sessions/nominal_myhill_nerode/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/nominal_myhill_nerode/ Nominal2 /sessions/nominal2/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/nominal2/ Noninterference_Concurrent_Composition /sessions/noninterference_concurrent_composition/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/noninterference_concurrent_composition/ Noninterference_CSP /sessions/noninterference_csp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/noninterference_csp/ Noninterference_Generic_Unwinding /sessions/noninterference_generic_unwinding/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/noninterference_generic_unwinding/ Noninterference_Inductive_Unwinding /sessions/noninterference_inductive_unwinding/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/noninterference_inductive_unwinding/ Noninterference_Ipurge_Unwinding /sessions/noninterference_ipurge_unwinding/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/noninterference_ipurge_unwinding/ Noninterference_Sequential_Composition /sessions/noninterference_sequential_composition/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/noninterference_sequential_composition/ NormByEval /sessions/normbyeval/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/normbyeval/ Nullstellensatz /sessions/nullstellensatz/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/nullstellensatz/ Number_Theoretic_Transform /sessions/number_theoretic_transform/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/number_theoretic_transform/ Octonions /sessions/octonions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/octonions/ Old_Datatype_Show /sessions/old_datatype_show/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/old_datatype_show/ OmegaCatoidsQuantales /sessions/omegacatoidsquantales/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/omegacatoidsquantales/ Open_Induction /sessions/open_induction/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/open_induction/ OpSets /sessions/opsets/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/opsets/ Optics /sessions/optics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/optics/ Optimal_BST /sessions/optimal_bst/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/optimal_bst/ Orbit_Stabiliser /sessions/orbit_stabiliser/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/orbit_stabiliser/ Order_Lattice_Props /sessions/order_lattice_props/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/order_lattice_props/ Ordered_Resolution_Prover /sessions/ordered_resolution_prover/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ordered_resolution_prover/ Ordinal /sessions/ordinal/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ordinal/ Ordinal_Partitions /sessions/ordinal_partitions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ordinal_partitions/ Ordinals_and_Cardinals /sessions/ordinals_and_cardinals/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ordinals_and_cardinals/ Ordinary_Differential_Equations /sessions/ordinary_differential_equations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ordinary_differential_equations/ PAC_Checker /sessions/pac_checker/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pac_checker/ Package_logic /sessions/package_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/package_logic/ Padic_Field /sessions/padic_field/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/padic_field/ Padic_Ints /sessions/padic_ints/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/padic_ints/ Pairing_Heap /sessions/pairing_heap/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pairing_heap/ PAL /sessions/pal/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pal/ PAPP_Impossibility /sessions/papp_impossibility/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/papp_impossibility/ Paraconsistency /sessions/paraconsistency/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/paraconsistency/ Parity_Game /sessions/parity_game/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/parity_game/ Partial_Function_MR /sessions/partial_function_mr/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/partial_function_mr/ Partial_Order_Reduction /sessions/partial_order_reduction/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/partial_order_reduction/ Password_Authentication_Protocol /sessions/password_authentication_protocol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/password_authentication_protocol/ PCF /sessions/pcf/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pcf/ Pell /sessions/pell/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pell/ Perfect_Fields /sessions/perfect_fields/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/perfect_fields/ Perfect-Number-Thm /sessions/perfect-number-thm/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/perfect-number-thm/ Perron_Frobenius /sessions/perron_frobenius/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/perron_frobenius/ pGCL /sessions/pgcl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pgcl/ Physical_Quantities /sessions/physical_quantities/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/physical_quantities/ Pi_Calculus /sessions/pi_calculus/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pi_calculus/ Pi_Transcendental /sessions/pi_transcendental/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pi_transcendental/ Planarity_Certificates /sessions/planarity_certificates/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/planarity_certificates/ PLM /sessions/plm/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/plm/ Pluennecke_Ruzsa_Inequality /sessions/pluennecke_ruzsa_inequality/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pluennecke_ruzsa_inequality/ Poincare_Bendixson /sessions/poincare_bendixson/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/poincare_bendixson/ Poincare_Disc /sessions/poincare_disc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/poincare_disc/ Polygonal_Number_Theorem /sessions/polygonal_number_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/polygonal_number_theorem/ Polylog /sessions/polylog/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/polylog/ Polynomial_Crit_Geometry /sessions/polynomial_crit_geometry/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/polynomial_crit_geometry/ Polynomial_Factorization /sessions/polynomial_factorization/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/polynomial_factorization/ Polynomial_Interpolation /sessions/polynomial_interpolation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/polynomial_interpolation/ Polynomials /sessions/polynomials/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/polynomials/ Pop_Refinement /sessions/pop_refinement/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pop_refinement/ POPLmark-deBruijn /sessions/poplmark-debruijn/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/poplmark-debruijn/ Posix-Lexing /sessions/posix-lexing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/posix-lexing/ Possibilistic_Noninterference /sessions/possibilistic_noninterference/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/possibilistic_noninterference/ Power_Sum_Polynomials /sessions/power_sum_polynomials/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/power_sum_polynomials/ Pratt_Certificate /sessions/pratt_certificate/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pratt_certificate/ Prefix_Free_Code_Combinators /sessions/prefix_free_code_combinators/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/prefix_free_code_combinators/ Presburger-Automata /sessions/presburger-automata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/presburger-automata/ Prim_Dijkstra_Simple /sessions/prim_dijkstra_simple/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/prim_dijkstra_simple/ Prime_Distribution_Elementary /sessions/prime_distribution_elementary/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/prime_distribution_elementary/ Prime_Harmonic_Series /sessions/prime_harmonic_series/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/prime_harmonic_series/ Prime_Number_Theorem /sessions/prime_number_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/prime_number_theorem/ Priority_Queue_Braun /sessions/priority_queue_braun/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/priority_queue_braun/ Priority_Search_Trees /sessions/priority_search_trees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/priority_search_trees/ Probabilistic_Noninterference /sessions/probabilistic_noninterference/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/probabilistic_noninterference/ Probabilistic_Prime_Tests /sessions/probabilistic_prime_tests/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/probabilistic_prime_tests/ Probabilistic_System_Zoo /sessions/probabilistic_system_zoo/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/probabilistic_system_zoo/ Probabilistic_Timed_Automata /sessions/probabilistic_timed_automata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/probabilistic_timed_automata/ Probabilistic_While /sessions/probabilistic_while/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/probabilistic_while/ Probability_Inequality_Completeness /sessions/probability_inequality_completeness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/probability_inequality_completeness/ Program-Conflict-Analysis /sessions/program-conflict-analysis/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/program-conflict-analysis/ Progress_Tracking /sessions/progress_tracking/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/progress_tracking/ Projective_Geometry /sessions/projective_geometry/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/projective_geometry/ Projective_Measurements /sessions/projective_measurements/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/projective_measurements/ Promela /sessions/promela/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/promela/ Proof_Strategy_Language /sessions/proof_strategy_language/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/proof_strategy_language/ Propositional_Logic_Class /sessions/propositional_logic_class/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/propositional_logic_class/ Propositional_Proof_Systems /sessions/propositional_proof_systems/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/propositional_proof_systems/ PropResPI /sessions/proprespi/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/proprespi/ Prpu_Maxflow /sessions/prpu_maxflow/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/prpu_maxflow/ PSemigroupsConvolution /sessions/psemigroupsconvolution/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/psemigroupsconvolution/ PseudoHoops /sessions/pseudohoops/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pseudohoops/ Psi_Calculi /sessions/psi_calculi/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/psi_calculi/ Ptolemys_Theorem /sessions/ptolemys_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ptolemys_theorem/ Public_Announcement_Logic /sessions/public_announcement_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/public_announcement_logic/ Pushdown_Systems /sessions/pushdown_systems/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pushdown_systems/ Q0_Metatheory /sessions/q0_metatheory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/q0_metatheory/ Q0_Soundness /sessions/q0_soundness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/q0_soundness/ QBF_Solver_Verification /sessions/qbf_solver_verification/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/qbf_solver_verification/ QHLProver /sessions/qhlprover/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/qhlprover/ QR_Decomposition /sessions/qr_decomposition/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/qr_decomposition/ Quantales /sessions/quantales/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/quantales/ Quantales_Converse /sessions/quantales_converse/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/quantales_converse/ Quantifier_Elimination_Hybrid /sessions/quantifier_elimination_hybrid/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/quantifier_elimination_hybrid/ Quasi_Borel_Spaces /sessions/quasi_borel_spaces/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/quasi_borel_spaces/ Quaternions /sessions/quaternions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/quaternions/ Query_Optimization /sessions/query_optimization/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/query_optimization/ Quick_Sort_Cost /sessions/quick_sort_cost/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/quick_sort_cost/ Ramsey-Infinite /sessions/ramsey-infinite/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ramsey-infinite/ Random_BSTs /sessions/random_bsts/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/random_bsts/ Random_Graph_Subgraph_Threshold /sessions/random_graph_subgraph_threshold/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/random_graph_subgraph_threshold/ Randomised_BSTs /sessions/randomised_bsts/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/randomised_bsts/ Randomised_Social_Choice /sessions/randomised_social_choice/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/randomised_social_choice/ Rank_Nullity_Theorem /sessions/rank_nullity_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/rank_nullity_theorem/ Real_Impl /sessions/real_impl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/real_impl/ Real_Power /sessions/real_power/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/real_power/ Real_Time_Deque /sessions/real_time_deque/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/real_time_deque/ Recursion-Addition /sessions/recursion-addition/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/recursion-addition/ Recursion-Theory-I /sessions/recursion-theory-i/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/recursion-theory-i/ Refine_Imperative_HOL /sessions/refine_imperative_hol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/refine_imperative_hol/ Refine_Monadic /sessions/refine_monadic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/refine_monadic/ RefinementReactive /sessions/refinementreactive/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/refinementreactive/ Regex_Equivalence /sessions/regex_equivalence/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/regex_equivalence/ Region_Quadtrees /sessions/region_quadtrees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/region_quadtrees/ Registers /sessions/registers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/registers/ Regression_Test_Selection /sessions/regression_test_selection/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/regression_test_selection/ Regular_Algebras /sessions/regular_algebras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/regular_algebras/ Regular_Tree_Relations /sessions/regular_tree_relations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/regular_tree_relations/ Regular-Sets /sessions/regular-sets/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/regular-sets/ Relation_Algebra /sessions/relation_algebra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relation_algebra/ Relational_Cardinality /sessions/relational_cardinality/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relational_cardinality/ Relational_Disjoint_Set_Forests /sessions/relational_disjoint_set_forests/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relational_disjoint_set_forests/ Relational_Forests /sessions/relational_forests/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relational_forests/ Relational_Method /sessions/relational_method/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relational_method/ Relational_Minimum_Spanning_Trees /sessions/relational_minimum_spanning_trees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relational_minimum_spanning_trees/ Relational_Paths /sessions/relational_paths/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relational_paths/ Relational-Incorrectness-Logic /sessions/relational-incorrectness-logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relational-incorrectness-logic/ Rensets /sessions/rensets/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/rensets/ Rep_Fin_Groups /sessions/rep_fin_groups/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/rep_fin_groups/ Residuated_Lattices /sessions/residuated_lattices/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/residuated_lattices/ ResiduatedTransitionSystem /sessions/residuatedtransitionsystem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/residuatedtransitionsystem/ Resolution_FOL /sessions/resolution_fol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/resolution_fol/ Rewrite_Properties_Reduction /sessions/rewrite_properties_reduction/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/rewrite_properties_reduction/ Rewriting_Z /sessions/rewriting_z/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/rewriting_z/ Ribbon_Proofs /sessions/ribbon_proofs/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ribbon_proofs/ RIPEMD-160-SPARK /sessions/ripemd-160-spark/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ripemd-160-spark/ Risk_Free_Lending /sessions/risk_free_lending/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/risk_free_lending/ Robbins-Conjecture /sessions/robbins-conjecture/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/robbins-conjecture/ ROBDD /sessions/robdd/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/robdd/ Robinson_Arithmetic /sessions/robinson_arithmetic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/robinson_arithmetic/ Root_Balanced_Tree /sessions/root_balanced_tree/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/root_balanced_tree/ Roth_Arithmetic_Progressions /sessions/roth_arithmetic_progressions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/roth_arithmetic_progressions/ Routing /sessions/routing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/routing/ Roy_Floyd_Warshall /sessions/roy_floyd_warshall/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/roy_floyd_warshall/ RSAPSS /sessions/rsapss/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/rsapss/ S_Finite_Measure_Monad /sessions/s_finite_measure_monad/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/s_finite_measure_monad/ Safe_Distance /sessions/safe_distance/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/safe_distance/ Safe_OCL /sessions/safe_ocl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/safe_ocl/ Safe_Range_RC /sessions/safe_range_rc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/safe_range_rc/ SATSolverVerification /sessions/satsolververification/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/satsolververification/ Saturation_Framework /sessions/saturation_framework/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/saturation_framework/ Saturation_Framework_Extensions /sessions/saturation_framework_extensions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/saturation_framework_extensions/ Sauer_Shelah_Lemma /sessions/sauer_shelah_lemma/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sauer_shelah_lemma/ SC_DOM_Components /sessions/sc_dom_components/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sc_dom_components/ SCC_Bloemen_Sequential /sessions/scc_bloemen_sequential/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/scc_bloemen_sequential/ Schutz_Spacetime /sessions/schutz_spacetime/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/schutz_spacetime/ Schwartz_Zippel /sessions/schwartz_zippel/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/schwartz_zippel/ SDS_Impossibility /sessions/sds_impossibility/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sds_impossibility/ Secondary_Sylow /sessions/secondary_sylow/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/secondary_sylow/ Security_Protocol_Refinement /sessions/security_protocol_refinement/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/security_protocol_refinement/ Selection_Heap_Sort /sessions/selection_heap_sort/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/selection_heap_sort/ SenSocialChoice /sessions/sensocialchoice/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sensocialchoice/ Separata /sessions/separata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/separata/ Separation_Algebra /sessions/separation_algebra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/separation_algebra/ Separation_Logic_Imperative_HOL /sessions/separation_logic_imperative_hol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/separation_logic_imperative_hol/ Separation_Logic_Unbounded /sessions/separation_logic_unbounded/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/separation_logic_unbounded/ Sepref_Basic /sessions/sepref_basic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sepref_basic/ Sepref_IICF /sessions/sepref_iicf/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sepref_iicf/ Sepref_Prereq /sessions/sepref_prereq/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sepref_prereq/ SequentInvertibility /sessions/sequentinvertibility/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sequentinvertibility/ Shadow_DOM /sessions/shadow_dom/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/shadow_dom/ Shadow_SC_DOM /sessions/shadow_sc_dom/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/shadow_sc_dom/ Shivers-CFA /sessions/shivers-cfa/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/shivers-cfa/ ShortestPath /sessions/shortestpath/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/shortestpath/ Show /sessions/show/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/show/ SIFPL /sessions/sifpl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sifpl/ SIFUM_Type_Systems /sessions/sifum_type_systems/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sifum_type_systems/ Sigma_Commit_Crypto /sessions/sigma_commit_crypto/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sigma_commit_crypto/ Signature_Groebner /sessions/signature_groebner/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/signature_groebner/ Simpl /sessions/simpl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/simpl/ Simple_Clause_Learning /sessions/simple_clause_learning/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/simple_clause_learning/ Simple_Firewall /sessions/simple_firewall/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/simple_firewall/ Simplex /sessions/simplex/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/simplex/ Simplicial_complexes_and_boolean_functions /sessions/simplicial_complexes_and_boolean_functions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/simplicial_complexes_and_boolean_functions/ SimplifiedOntologicalArgument /sessions/simplifiedontologicalargument/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/simplifiedontologicalargument/ Skew_Heap /sessions/skew_heap/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/skew_heap/ Skip_Lists /sessions/skip_lists/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/skip_lists/ Slicing /sessions/slicing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/slicing/ Sliding_Window_Algorithm /sessions/sliding_window_algorithm/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sliding_window_algorithm/ SM /sessions/sm/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sm/ SM_Base /sessions/sm_base/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sm_base/ Smith_Normal_Form /sessions/smith_normal_form/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/smith_normal_form/ Smooth_Manifolds /sessions/smooth_manifolds/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/smooth_manifolds/ Solidity /sessions/solidity/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/solidity/ Sophomores_Dream /sessions/sophomores_dream/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sophomores_dream/ Sort_Encodings /sessions/sort_encodings/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sort_encodings/ Source_Coding_Theorem /sessions/source_coding_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/source_coding_theorem/ SPARCv8 /sessions/sparcv8/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sparcv8/ SpecCheck /sessions/speccheck/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/speccheck/ Special_Function_Bounds /sessions/special_function_bounds/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/special_function_bounds/ Splay_Tree /sessions/splay_tree/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/splay_tree/ Sqrt_Babylonian /sessions/sqrt_babylonian/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sqrt_babylonian/ Stable_Matching /sessions/stable_matching/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stable_matching/ Stalnaker_Logic /sessions/stalnaker_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stalnaker_logic/ Standard_Borel_Spaces /sessions/standard_borel_spaces/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/standard_borel_spaces/ Statecharts /sessions/statecharts/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/statecharts/ Stateful_Protocol_Composition_and_Typing /sessions/stateful_protocol_composition_and_typing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stateful_protocol_composition_and_typing/ Stellar_Quorums /sessions/stellar_quorums/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stellar_quorums/ Stern_Brocot /sessions/stern_brocot/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stern_brocot/ Stewart_Apollonius /sessions/stewart_apollonius/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stewart_apollonius/ Stirling_Formula /sessions/stirling_formula/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stirling_formula/ Stochastic_Matrices /sessions/stochastic_matrices/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stochastic_matrices/ Stone_Algebras /sessions/stone_algebras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stone_algebras/ Stone_Kleene_Relation_Algebras /sessions/stone_kleene_relation_algebras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stone_kleene_relation_algebras/ Stone_Relation_Algebras /sessions/stone_relation_algebras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stone_relation_algebras/ Store_Buffer_Reduction /sessions/store_buffer_reduction/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/store_buffer_reduction/ Stream_Fusion_Code /sessions/stream_fusion_code/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stream_fusion_code/ Stream-Fusion /sessions/stream-fusion/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stream-fusion/ StrictOmegaCategories /sessions/strictomegacategories/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/strictomegacategories/ Strong_Security /sessions/strong_security/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/strong_security/ Sturm_Sequences /sessions/sturm_sequences/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sturm_sequences/ Sturm_Tarski /sessions/sturm_tarski/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sturm_tarski/ Stuttering_Equivalence /sessions/stuttering_equivalence/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stuttering_equivalence/ Subresultants /sessions/subresultants/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/subresultants/ Subset_Boolean_Algebras /sessions/subset_boolean_algebras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/subset_boolean_algebras/ Sumcheck_Protocol /sessions/sumcheck_protocol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sumcheck_protocol/ SumSquares /sessions/sumsquares/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sumsquares/ Sunflowers /sessions/sunflowers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sunflowers/ SuperCalc /sessions/supercalc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/supercalc/ Suppes_Theorem /sessions/suppes_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/suppes_theorem/ Surprise_Paradox /sessions/surprise_paradox/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/surprise_paradox/ Symmetric_Polynomials /sessions/symmetric_polynomials/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/symmetric_polynomials/ Syntax_Independent_Logic /sessions/syntax_independent_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/syntax_independent_logic/ Synthetic_Completeness /sessions/synthetic_completeness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/synthetic_completeness/ Szemeredi_Regularity /sessions/szemeredi_regularity/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/szemeredi_regularity/ Szpilrajn /sessions/szpilrajn/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/szpilrajn/ Tail_Recursive_Functions /sessions/tail_recursive_functions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tail_recursive_functions/ Tarskis_Geometry /sessions/tarskis_geometry/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tarskis_geometry/ Taylor_Models /sessions/taylor_models/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/taylor_models/ TESL_Language /sessions/tesl_language/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tesl_language/ Three_Circles /sessions/three_circles/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/three_circles/ Three_Squares /sessions/three_squares/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/three_squares/ Timed_Automata /sessions/timed_automata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/timed_automata/ TLA /sessions/tla/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tla/ Topological_Semantics /sessions/topological_semantics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/topological_semantics/ Topology /sessions/topology/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/topology/ TortoiseHare /sessions/tortoisehare/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tortoisehare/ Transcendence_Series_Hancl_Rucki /sessions/transcendence_series_hancl_rucki/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/transcendence_series_hancl_rucki/ Transformer_Semantics /sessions/transformer_semantics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/transformer_semantics/ Transition_Systems_and_Automata /sessions/transition_systems_and_automata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/transition_systems_and_automata/ Transitive_Models /sessions/transitive_models/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/transitive_models/ Transitive-Closure /sessions/transitive-closure/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/transitive-closure/ Transitive-Closure-II /sessions/transitive-closure-ii/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/transitive-closure-ii/ Transport /sessions/transport/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/transport/ Treaps /sessions/treaps/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/treaps/ Tree_Decomposition /sessions/tree_decomposition/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tree_decomposition/ Tree_Enumeration /sessions/tree_enumeration/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tree_enumeration/ Tree-Automata /sessions/tree-automata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tree-automata/ Triangle /sessions/triangle/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/triangle/ Trie /sessions/trie/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/trie/ TsirelsonBound /sessions/tsirelsonbound/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tsirelsonbound/ Turans_Graph_Theorem /sessions/turans_graph_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/turans_graph_theorem/ Twelvefold_Way /sessions/twelvefold_way/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/twelvefold_way/ Two_Generated_Word_Monoids_Intersection /sessions/two_generated_word_monoids_intersection/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/two_generated_word_monoids_intersection/ Tycon /sessions/tycon/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tycon/ Types_Tableaus_and_Goedels_God /sessions/types_tableaus_and_goedels_god/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/types_tableaus_and_goedels_god/ Types_To_Sets_Extension /sessions/types_to_sets_extension/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/types_to_sets_extension/ Undirected_Graph_Theory /sessions/undirected_graph_theory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/undirected_graph_theory/ Universal_Hash_Families /sessions/universal_hash_families/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/universal_hash_families/ Universal_Turing_Machine /sessions/universal_turing_machine/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/universal_turing_machine/ UpDown_Scheme /sessions/updown_scheme/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/updown_scheme/ UPF /sessions/upf/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/upf/ UPF_Firewall /sessions/upf_firewall/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/upf_firewall/ UTP /sessions/utp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/utp/ UTP-Toolkit /sessions/utp-toolkit/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/utp-toolkit/ Valuation /sessions/valuation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/valuation/ Van_der_Waerden /sessions/van_der_waerden/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/van_der_waerden/ Van_Emde_Boas_Trees /sessions/van_emde_boas_trees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/van_emde_boas_trees/ VectorSpace /sessions/vectorspace/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/vectorspace/ VeriComp /sessions/vericomp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/vericomp/ Verified_SAT_Based_AI_Planning /sessions/verified_sat_based_ai_planning/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/verified_sat_based_ai_planning/ Verified-Prover /sessions/verified-prover/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/verified-prover/ VerifyThis2018 /sessions/verifythis2018/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/verifythis2018/ VerifyThis2019 /sessions/verifythis2019/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/verifythis2019/ Vickrey_Clarke_Groves /sessions/vickrey_clarke_groves/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/vickrey_clarke_groves/ Virtual_Substitution /sessions/virtual_substitution/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/virtual_substitution/ VolpanoSmith /sessions/volpanosmith/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/volpanosmith/ VYDRA_MDL /sessions/vydra_mdl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/vydra_mdl/ WebAssembly /sessions/webassembly/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/webassembly/ Weight_Balanced_Trees /sessions/weight_balanced_trees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/weight_balanced_trees/ Weighted_Arithmetic_Geometric_Mean /sessions/weighted_arithmetic_geometric_mean/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/weighted_arithmetic_geometric_mean/ Weighted_Path_Order /sessions/weighted_path_order/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/weighted_path_order/ Well_Quasi_Orders /sessions/well_quasi_orders/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/well_quasi_orders/ Wetzels_Problem /sessions/wetzels_problem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/wetzels_problem/ WHATandWHERE_Security /sessions/whatandwhere_security/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/whatandwhere_security/ Wieferich_Kempner /sessions/wieferich_kempner/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/wieferich_kempner/ Winding_Number_Eval /sessions/winding_number_eval/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/winding_number_eval/ WOOT_Strong_Eventual_Consistency /sessions/woot_strong_eventual_consistency/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/woot_strong_eventual_consistency/ Word_Lib /sessions/word_lib/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/word_lib/ WorkerWrapper /sessions/workerwrapper/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/workerwrapper/ X86_Semantics /sessions/x86_semantics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/x86_semantics/ XML /sessions/xml/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/xml/ Youngs_Inequality /sessions/youngs_inequality/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/youngs_inequality/ Zeckendorf /sessions/zeckendorf/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/zeckendorf/ Zeta_3_Irrational /sessions/zeta_3_irrational/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/zeta_3_irrational/ Zeta_Function /sessions/zeta_function/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/zeta_function/ ZFC_in_HOL /sessions/zfc_in_hol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/zfc_in_hol/ diff --git a/web/sessions/approximate_model_counting/index.html b/web/sessions/approximate_model_counting/index.html new file mode 100644 --- /dev/null +++ b/web/sessions/approximate_model_counting/index.html @@ -0,0 +1,105 @@ + + + + + + + Approximate_Model_Counting - Archive of Formal Proofs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+

+ Approximate_Model_Counting + +

+
+
+
+ +
+ + \ No newline at end of file diff --git a/web/sessions/continued_fractions/index.html b/web/sessions/continued_fractions/index.html new file mode 100644 --- /dev/null +++ b/web/sessions/continued_fractions/index.html @@ -0,0 +1,105 @@ + + + + + + + Continued_Fractions - Archive of Formal Proofs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/sessions/go/index.html b/web/sessions/go/index.html new file mode 100644 --- /dev/null +++ b/web/sessions/go/index.html @@ -0,0 +1,98 @@ + + + + + + + Go - Archive of Formal Proofs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+

+ Go + +

+
+
+
+
+ +
+

Go_Setup

+
+ +
+
+ + \ No newline at end of file diff --git a/web/sessions/go_test_quick/index.html b/web/sessions/go_test_quick/index.html new file mode 100644 --- /dev/null +++ b/web/sessions/go_test_quick/index.html @@ -0,0 +1,98 @@ + + + + + + + Go_Test_Quick - Archive of Formal Proofs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+

+ Go_Test_Quick + +

+
+
+
+
+ +
+

RBT_Test

+
+ +
+
+ + \ No newline at end of file diff --git a/web/sessions/go_test_slow/index.html b/web/sessions/go_test_slow/index.html new file mode 100644 --- /dev/null +++ b/web/sessions/go_test_slow/index.html @@ -0,0 +1,100 @@ + + + + + + + Go_Test_Slow - Archive of Formal Proofs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + +
+
+

+ Go_Test_Slow + +

+
+
+
+ +
+ + \ No newline at end of file diff --git a/web/sessions/index.xml b/web/sessions/index.xml --- a/web/sessions/index.xml +++ b/web/sessions/index.xml @@ -1,5812 +1,5847 @@ Sessions on Archive of Formal Proofs /sessions/ Recent content in Sessions on Archive of Formal Proofs Hugo -- gohugo.io en-gb Abortable_Linearizable_Modules /sessions/abortable_linearizable_modules/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/abortable_linearizable_modules/ Abs_Int_ITP2012 /sessions/abs_int_itp2012/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/abs_int_itp2012/ Abstract_Completeness /sessions/abstract_completeness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/abstract_completeness/ Abstract_Soundness /sessions/abstract_soundness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/abstract_soundness/ Abstract-Hoare-Logics /sessions/abstract-hoare-logics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/abstract-hoare-logics/ Abstract-Rewriting /sessions/abstract-rewriting/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/abstract-rewriting/ ABY3_Protocols /sessions/aby3_protocols/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/aby3_protocols/ Ackermanns_not_PR /sessions/ackermanns_not_pr/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ackermanns_not_pr/ Actuarial_Mathematics /sessions/actuarial_mathematics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/actuarial_mathematics/ Adaptive_State_Counting /sessions/adaptive_state_counting/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/adaptive_state_counting/ ADS_Functor /sessions/ads_functor/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ads_functor/ Affine_Arithmetic /sessions/affine_arithmetic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/affine_arithmetic/ Aggregation_Algebras /sessions/aggregation_algebras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/aggregation_algebras/ AI_Planning_Languages_Semantics /sessions/ai_planning_languages_semantics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ai_planning_languages_semantics/ Akra_Bazzi /sessions/akra_bazzi/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/akra_bazzi/ Algebraic_Numbers /sessions/algebraic_numbers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/algebraic_numbers/ Algebraic_VCs /sessions/algebraic_vcs/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/algebraic_vcs/ Allen_Calculus /sessions/allen_calculus/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/allen_calculus/ Amicable_Numbers /sessions/amicable_numbers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/amicable_numbers/ Amortized_Complexity /sessions/amortized_complexity/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/amortized_complexity/ AnselmGod /sessions/anselmgod/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/anselmgod/ AODV /sessions/aodv/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/aodv/ AOT /sessions/aot/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/aot/ Applicative_Lifting /sessions/applicative_lifting/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/applicative_lifting/ + Approximate_Model_Counting + /sessions/approximate_model_counting/ + Mon, 01 Jan 0001 00:00:00 +0000 + /sessions/approximate_model_counting/ + + + Approximation_Algorithms /sessions/approximation_algorithms/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/approximation_algorithms/ Architectural_Design_Patterns /sessions/architectural_design_patterns/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/architectural_design_patterns/ Aristotles_Assertoric_Syllogistic /sessions/aristotles_assertoric_syllogistic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/aristotles_assertoric_syllogistic/ Arith_Prog_Rel_Primes /sessions/arith_prog_rel_primes/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/arith_prog_rel_primes/ ArrowImpossibilityGS /sessions/arrowimpossibilitygs/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/arrowimpossibilitygs/ Attack_Trees /sessions/attack_trees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/attack_trees/ Auto2_HOL /sessions/auto2_hol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/auto2_hol/ Auto2_Imperative_HOL /sessions/auto2_imperative_hol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/auto2_imperative_hol/ AutoFocus-Stream /sessions/autofocus-stream/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/autofocus-stream/ Automated_Stateful_Protocol_Verification /sessions/automated_stateful_protocol_verification/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/automated_stateful_protocol_verification/ Automatic_Refinement /sessions/automatic_refinement/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/automatic_refinement/ AVL-Trees /sessions/avl-trees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/avl-trees/ AWN /sessions/awn/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/awn/ AxiomaticCategoryTheory /sessions/axiomaticcategorytheory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/axiomaticcategorytheory/ Balog_Szemeredi_Gowers /sessions/balog_szemeredi_gowers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/balog_szemeredi_gowers/ Banach_Steinhaus /sessions/banach_steinhaus/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/banach_steinhaus/ BD_Security_Compositional /sessions/bd_security_compositional/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bd_security_compositional/ BDD /sessions/bdd/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bdd/ Belief_Revision /sessions/belief_revision/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/belief_revision/ Bell_Numbers_Spivey /sessions/bell_numbers_spivey/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bell_numbers_spivey/ BenOr_Kozen_Reif /sessions/benor_kozen_reif/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/benor_kozen_reif/ Berlekamp_Zassenhaus /sessions/berlekamp_zassenhaus/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/berlekamp_zassenhaus/ Bernoulli /sessions/bernoulli/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bernoulli/ Bertrands_Postulate /sessions/bertrands_postulate/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bertrands_postulate/ Bicategory /sessions/bicategory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bicategory/ Binary_Code_Imprimitive /sessions/binary_code_imprimitive/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/binary_code_imprimitive/ BinarySearchTree /sessions/binarysearchtree/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/binarysearchtree/ Binding_Syntax_Theory /sessions/binding_syntax_theory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/binding_syntax_theory/ Binomial-Heaps /sessions/binomial-heaps/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/binomial-heaps/ Binomial-Queues /sessions/binomial-queues/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/binomial-queues/ BirdKMP /sessions/birdkmp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/birdkmp/ Birkhoff_Finite_Distributive_Lattices /sessions/birkhoff_finite_distributive_lattices/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/birkhoff_finite_distributive_lattices/ Blue_Eyes /sessions/blue_eyes/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/blue_eyes/ BNF_CC /sessions/bnf_cc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bnf_cc/ BNF_Operations /sessions/bnf_operations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bnf_operations/ Bondy /sessions/bondy/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bondy/ Boolean_Expression_Checkers /sessions/boolean_expression_checkers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/boolean_expression_checkers/ Boolos_Curious_Inference /sessions/boolos_curious_inference/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/boolos_curious_inference/ Boolos_Curious_Inference_Automated /sessions/boolos_curious_inference_automated/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/boolos_curious_inference_automated/ Bounded_Deducibility_Security /sessions/bounded_deducibility_security/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bounded_deducibility_security/ BTree /sessions/btree/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/btree/ Buchi_Complementation /sessions/buchi_complementation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/buchi_complementation/ Budan_Fourier /sessions/budan_fourier/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/budan_fourier/ Buffons_Needle /sessions/buffons_needle/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/buffons_needle/ Buildings /sessions/buildings/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/buildings/ BytecodeLogicJmlTypes /sessions/bytecodelogicjmltypes/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/bytecodelogicjmltypes/ C2KA_DistributedSystems /sessions/c2ka_distributedsystems/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/c2ka_distributedsystems/ CakeML /sessions/cakeml/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cakeml/ CakeML_Codegen /sessions/cakeml_codegen/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cakeml_codegen/ Call_Arity /sessions/call_arity/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/call_arity/ Card_Equiv_Relations /sessions/card_equiv_relations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/card_equiv_relations/ Card_Multisets /sessions/card_multisets/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/card_multisets/ Card_Number_Partitions /sessions/card_number_partitions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/card_number_partitions/ Card_Partitions /sessions/card_partitions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/card_partitions/ Cardinality_Continuum /sessions/cardinality_continuum/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cardinality_continuum/ Cartan_FP /sessions/cartan_fp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cartan_fp/ Case_Labeling /sessions/case_labeling/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/case_labeling/ Catalan_Numbers /sessions/catalan_numbers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/catalan_numbers/ Category /sessions/category/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/category/ Category2 /sessions/category2/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/category2/ Category3 /sessions/category3/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/category3/ Catoids /sessions/catoids/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/catoids/ Cauchy /sessions/cauchy/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cauchy/ CAVA_Automata /sessions/cava_automata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cava_automata/ CAVA_Base /sessions/cava_base/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cava_base/ CAVA_LTL_Modelchecker /sessions/cava_ltl_modelchecker/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cava_ltl_modelchecker/ CAVA_Setup /sessions/cava_setup/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cava_setup/ Cayley_Hamilton /sessions/cayley_hamilton/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cayley_hamilton/ CCS /sessions/ccs/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ccs/ Certification_Monads /sessions/certification_monads/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/certification_monads/ Ceva /sessions/ceva/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ceva/ Chandy_Lamport /sessions/chandy_lamport/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/chandy_lamport/ Chebyshev_Polynomials /sessions/chebyshev_polynomials/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/chebyshev_polynomials/ CHERI-C_Memory_Model /sessions/cheri-c_memory_model/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cheri-c_memory_model/ Chord_Segments /sessions/chord_segments/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/chord_segments/ Circus /sessions/circus/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/circus/ CISC-Kernel /sessions/cisc-kernel/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cisc-kernel/ Clean /sessions/clean/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/clean/ Clique_and_Monotone_Circuits /sessions/clique_and_monotone_circuits/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/clique_and_monotone_circuits/ ClockSynchInst /sessions/clocksynchinst/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/clocksynchinst/ Closest_Pair_Points /sessions/closest_pair_points/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/closest_pair_points/ CoCon /sessions/cocon/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cocon/ CofGroups /sessions/cofgroups/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cofgroups/ Coinductive /sessions/coinductive/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/coinductive/ Coinductive_Languages /sessions/coinductive_languages/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/coinductive_languages/ Collections /sessions/collections/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/collections/ Collections_Examples /sessions/collections_examples/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/collections_examples/ Combinable_Wands /sessions/combinable_wands/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/combinable_wands/ Combinatorial_Enumeration_Algorithms /sessions/combinatorial_enumeration_algorithms/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/combinatorial_enumeration_algorithms/ Combinatorics_Words /sessions/combinatorics_words/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/combinatorics_words/ Combinatorics_Words_Graph_Lemma /sessions/combinatorics_words_graph_lemma/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/combinatorics_words_graph_lemma/ Combinatorics_Words_Lyndon /sessions/combinatorics_words_lyndon/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/combinatorics_words_lyndon/ CommCSL /sessions/commcsl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/commcsl/ Commuting_Hermitian /sessions/commuting_hermitian/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/commuting_hermitian/ Comparison_Sort_Lower_Bound /sessions/comparison_sort_lower_bound/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/comparison_sort_lower_bound/ Compiling-Exceptions-Correctly /sessions/compiling-exceptions-correctly/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/compiling-exceptions-correctly/ Complete_Non_Orders /sessions/complete_non_orders/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/complete_non_orders/ Completeness /sessions/completeness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/completeness/ Complex_Bounded_Operators /sessions/complex_bounded_operators/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/complex_bounded_operators/ Complex_Bounded_Operators_Dependencies /sessions/complex_bounded_operators_dependencies/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/complex_bounded_operators_dependencies/ Complex_Geometry /sessions/complex_geometry/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/complex_geometry/ Complx /sessions/complx/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/complx/ ComponentDependencies /sessions/componentdependencies/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/componentdependencies/ Concentration_Inequalities /sessions/concentration_inequalities/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/concentration_inequalities/ Concurrent_Ref_Alg /sessions/concurrent_ref_alg/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/concurrent_ref_alg/ Concurrent_Revisions /sessions/concurrent_revisions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/concurrent_revisions/ ConcurrentGC /sessions/concurrentgc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/concurrentgc/ ConcurrentIMP /sessions/concurrentimp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/concurrentimp/ Conditional_Simplification /sessions/conditional_simplification/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/conditional_simplification/ Conditional_Transfer_Rule /sessions/conditional_transfer_rule/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/conditional_transfer_rule/ Consensus_Refined /sessions/consensus_refined/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/consensus_refined/ Constructive_Cryptography /sessions/constructive_cryptography/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/constructive_cryptography/ Constructive_Cryptography_CM /sessions/constructive_cryptography_cm/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/constructive_cryptography_cm/ Constructor_Funs /sessions/constructor_funs/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/constructor_funs/ Containers /sessions/containers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/containers/ Containers-Benchmarks /sessions/containers-benchmarks/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/containers-benchmarks/ + Continued_Fractions + /sessions/continued_fractions/ + Mon, 01 Jan 0001 00:00:00 +0000 + /sessions/continued_fractions/ + + + Cook_Levin /sessions/cook_levin/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cook_levin/ Core_DOM /sessions/core_dom/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/core_dom/ Core_SC_DOM /sessions/core_sc_dom/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/core_sc_dom/ CoreC++ /sessions/corec++/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/corec++/ Correctness_Algebras /sessions/correctness_algebras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/correctness_algebras/ CoSMed /sessions/cosmed/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cosmed/ CoSMeDis /sessions/cosmedis/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cosmedis/ Cotangent_PFD_Formula /sessions/cotangent_pfd_formula/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cotangent_pfd_formula/ Count_Complex_Roots /sessions/count_complex_roots/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/count_complex_roots/ Coupledsim_Contrasim /sessions/coupledsim_contrasim/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/coupledsim_contrasim/ CRDT /sessions/crdt/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/crdt/ CryptHOL /sessions/crypthol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/crypthol/ Crypto_Standards /sessions/crypto_standards/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/crypto_standards/ CryptoBasedCompositionalProperties /sessions/cryptobasedcompositionalproperties/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cryptobasedcompositionalproperties/ CRYSTALS-Kyber /sessions/crystals-kyber/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/crystals-kyber/ CRYSTALS-Kyber_Security /sessions/crystals-kyber_security/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/crystals-kyber_security/ CSP_RefTK /sessions/csp_reftk/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/csp_reftk/ Cubic_Quartic_Equations /sessions/cubic_quartic_equations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cubic_quartic_equations/ CubicalCategories /sessions/cubicalcategories/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cubicalcategories/ CVP_Hardness /sessions/cvp_hardness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cvp_hardness/ CYK /sessions/cyk/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/cyk/ CZH_Elementary_Categories /sessions/czh_elementary_categories/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/czh_elementary_categories/ CZH_Foundations /sessions/czh_foundations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/czh_foundations/ CZH_Universal_Constructions /sessions/czh_universal_constructions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/czh_universal_constructions/ DataRefinementIBP /sessions/datarefinementibp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/datarefinementibp/ Datatype_Order_Generator /sessions/datatype_order_generator/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/datatype_order_generator/ DCR-ExecutionEquivalence /sessions/dcr-executionequivalence/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dcr-executionequivalence/ Decl_Sem_Fun_PL /sessions/decl_sem_fun_pl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/decl_sem_fun_pl/ Decreasing-Diagrams /sessions/decreasing-diagrams/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/decreasing-diagrams/ Decreasing-Diagrams-II /sessions/decreasing-diagrams-ii/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/decreasing-diagrams-ii/ Dedekind_Real /sessions/dedekind_real/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dedekind_real/ Deep_Learning /sessions/deep_learning/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/deep_learning/ Delta_System_Lemma /sessions/delta_system_lemma/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/delta_system_lemma/ Density_Compiler /sessions/density_compiler/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/density_compiler/ Dependent_SIFUM_Refinement /sessions/dependent_sifum_refinement/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dependent_sifum_refinement/ Dependent_SIFUM_Type_Systems /sessions/dependent_sifum_type_systems/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dependent_sifum_type_systems/ Depth-First-Search /sessions/depth-first-search/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/depth-first-search/ Derangements /sessions/derangements/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/derangements/ Deriving /sessions/deriving/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/deriving/ Descartes_Sign_Rule /sessions/descartes_sign_rule/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/descartes_sign_rule/ Design_Theory /sessions/design_theory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/design_theory/ DFS_Framework /sessions/dfs_framework/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dfs_framework/ Dict_Construction /sessions/dict_construction/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dict_construction/ Differential_Dynamic_Logic /sessions/differential_dynamic_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/differential_dynamic_logic/ Differential_Game_Logic /sessions/differential_game_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/differential_game_logic/ Digit_Expansions /sessions/digit_expansions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/digit_expansions/ DigitsInBase /sessions/digitsinbase/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/digitsinbase/ Dijkstra_Shortest_Path /sessions/dijkstra_shortest_path/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dijkstra_shortest_path/ Diophantine_Eqns_Lin_Hom /sessions/diophantine_eqns_lin_hom/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/diophantine_eqns_lin_hom/ Directed_Sets /sessions/directed_sets/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/directed_sets/ Dirichlet_L /sessions/dirichlet_l/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dirichlet_l/ Dirichlet_Series /sessions/dirichlet_series/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dirichlet_series/ Discrete_Summation /sessions/discrete_summation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/discrete_summation/ DiscretePricing /sessions/discretepricing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/discretepricing/ Disintegration /sessions/disintegration/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/disintegration/ DiskPaxos /sessions/diskpaxos/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/diskpaxos/ Distributed_Distinct_Elements /sessions/distributed_distinct_elements/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/distributed_distinct_elements/ DOM_Components /sessions/dom_components/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dom_components/ Dominance_CHK /sessions/dominance_chk/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dominance_chk/ DPRM_Theorem /sessions/dprm_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dprm_theorem/ DPT-SAT-Solver /sessions/dpt-sat-solver/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dpt-sat-solver/ Dynamic_Tables /sessions/dynamic_tables/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dynamic_tables/ DynamicArchitectures /sessions/dynamicarchitectures/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/dynamicarchitectures/ E_Transcendental /sessions/e_transcendental/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/e_transcendental/ Earley_Parser /sessions/earley_parser/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/earley_parser/ Echelon_Form /sessions/echelon_form/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/echelon_form/ EdmondsKarp_Maxflow /sessions/edmondskarp_maxflow/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/edmondskarp_maxflow/ Edwards_Elliptic_Curves_Group /sessions/edwards_elliptic_curves_group/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/edwards_elliptic_curves_group/ Efficient_Weighted_Path_Order /sessions/efficient_weighted_path_order/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/efficient_weighted_path_order/ Efficient-Mergesort /sessions/efficient-mergesort/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/efficient-mergesort/ Elimination_Of_Repeated_Factors /sessions/elimination_of_repeated_factors/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/elimination_of_repeated_factors/ Elliptic_Curves_Group_Law /sessions/elliptic_curves_group_law/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/elliptic_curves_group_law/ Encodability_Process_Calculi /sessions/encodability_process_calculi/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/encodability_process_calculi/ Epistemic_Logic /sessions/epistemic_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/epistemic_logic/ Equivalence_Relation_Enumeration /sessions/equivalence_relation_enumeration/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/equivalence_relation_enumeration/ Ergodic_Theory /sessions/ergodic_theory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ergodic_theory/ Error_Function /sessions/error_function/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/error_function/ Eudoxus_Reals /sessions/eudoxus_reals/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/eudoxus_reals/ Euler_MacLaurin /sessions/euler_maclaurin/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/euler_maclaurin/ Euler_Partition /sessions/euler_partition/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/euler_partition/ Euler_Polyhedron_Formula /sessions/euler_polyhedron_formula/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/euler_polyhedron_formula/ Eval_FO /sessions/eval_fo/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/eval_fo/ Example-Submission /sessions/example-submission/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/example-submission/ Executable_Randomized_Algorithms /sessions/executable_randomized_algorithms/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/executable_randomized_algorithms/ Expander_Graphs /sessions/expander_graphs/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/expander_graphs/ Extended_Finite_State_Machine_Inference /sessions/extended_finite_state_machine_inference/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/extended_finite_state_machine_inference/ Extended_Finite_State_Machines /sessions/extended_finite_state_machines/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/extended_finite_state_machines/ Factor_Algebraic_Polynomial /sessions/factor_algebraic_polynomial/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/factor_algebraic_polynomial/ Factored_Transition_System_Bounding /sessions/factored_transition_system_bounding/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/factored_transition_system_bounding/ Falling_Factorial_Sum /sessions/falling_factorial_sum/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/falling_factorial_sum/ Farkas /sessions/farkas/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/farkas/ Featherweight_OCL /sessions/featherweight_ocl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/featherweight_ocl/ FeatherweightJava /sessions/featherweightjava/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/featherweightjava/ Fermat3_4 /sessions/fermat3_4/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fermat3_4/ FFT /sessions/fft/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fft/ FileRefinement /sessions/filerefinement/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/filerefinement/ FinFun /sessions/finfun/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/finfun/ Finger-Trees /sessions/finger-trees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/finger-trees/ Finite_Automata_HF /sessions/finite_automata_hf/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/finite_automata_hf/ Finite_Fields /sessions/finite_fields/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/finite_fields/ Finite-Map-Extras /sessions/finite-map-extras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/finite-map-extras/ Finitely_Generated_Abelian_Groups /sessions/finitely_generated_abelian_groups/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/finitely_generated_abelian_groups/ First_Order_Terms /sessions/first_order_terms/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/first_order_terms/ First_Welfare_Theorem /sessions/first_welfare_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/first_welfare_theorem/ Fishburn_Impossibility /sessions/fishburn_impossibility/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fishburn_impossibility/ Fisher_Yates /sessions/fisher_yates/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fisher_yates/ Fishers_Inequality /sessions/fishers_inequality/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fishers_inequality/ Fixed_Length_Vector /sessions/fixed_length_vector/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fixed_length_vector/ Flow_Networks /sessions/flow_networks/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/flow_networks/ Floyd_Warshall /sessions/floyd_warshall/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/floyd_warshall/ FLP /sessions/flp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/flp/ Flyspeck-Tame /sessions/flyspeck-tame/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/flyspeck-tame/ Flyspeck-Tame-Computation /sessions/flyspeck-tame-computation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/flyspeck-tame-computation/ FO_Theory_Rewriting /sessions/fo_theory_rewriting/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fo_theory_rewriting/ FocusStreamsCaseStudies /sessions/focusstreamscasestudies/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/focusstreamscasestudies/ FOL_Axiomatic /sessions/fol_axiomatic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fol_axiomatic/ FOL_Harrison /sessions/fol_harrison/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fol_harrison/ FOL_Seq_Calc1 /sessions/fol_seq_calc1/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fol_seq_calc1/ FOL_Seq_Calc2 /sessions/fol_seq_calc2/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fol_seq_calc2/ FOL_Seq_Calc3 /sessions/fol_seq_calc3/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fol_seq_calc3/ FOL-Fitting /sessions/fol-fitting/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fol-fitting/ Forcing /sessions/forcing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/forcing/ Formal_Puiseux_Series /sessions/formal_puiseux_series/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/formal_puiseux_series/ Formal_SSA /sessions/formal_ssa/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/formal_ssa/ Formula_Derivatives /sessions/formula_derivatives/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/formula_derivatives/ Formula_Derivatives-Examples /sessions/formula_derivatives-examples/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/formula_derivatives-examples/ Foundation_of_geometry /sessions/foundation_of_geometry/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/foundation_of_geometry/ Fourier /sessions/fourier/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fourier/ Free-Boolean-Algebra /sessions/free-boolean-algebra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/free-boolean-algebra/ Free-Groups /sessions/free-groups/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/free-groups/ Frequency_Moments /sessions/frequency_moments/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/frequency_moments/ Fresh_Identifiers /sessions/fresh_identifiers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fresh_identifiers/ FSM_Tests /sessions/fsm_tests/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/fsm_tests/ Functional_Ordered_Resolution_Prover /sessions/functional_ordered_resolution_prover/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/functional_ordered_resolution_prover/ Functional-Automata /sessions/functional-automata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/functional-automata/ FunWithFunctions /sessions/funwithfunctions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/funwithfunctions/ FunWithTilings /sessions/funwithtilings/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/funwithtilings/ Furstenberg_Topology /sessions/furstenberg_topology/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/furstenberg_topology/ Gabow_SCC /sessions/gabow_scc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gabow_scc/ Gale_Shapley /sessions/gale_shapley/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gale_shapley/ GaleStewart_Games /sessions/galestewart_games/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/galestewart_games/ Game_Based_Crypto /sessions/game_based_crypto/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/game_based_crypto/ Gauss_Jordan /sessions/gauss_jordan/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gauss_jordan/ Gauss_Sums /sessions/gauss_sums/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gauss_sums/ Gauss-Jordan-Elim-Fun /sessions/gauss-jordan-elim-fun/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gauss-jordan-elim-fun/ Gaussian_Integers /sessions/gaussian_integers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gaussian_integers/ GenClock /sessions/genclock/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/genclock/ General-Triangle /sessions/general-triangle/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/general-triangle/ Generalized_Counting_Sort /sessions/generalized_counting_sort/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/generalized_counting_sort/ Generic_Deriving /sessions/generic_deriving/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/generic_deriving/ Generic_Join /sessions/generic_join/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/generic_join/ GewirthPGCProof /sessions/gewirthpgcproof/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gewirthpgcproof/ Girth_Chromatic /sessions/girth_chromatic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/girth_chromatic/ Given_Clause_Loops /sessions/given_clause_loops/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/given_clause_loops/ + Go + /sessions/go/ + Mon, 01 Jan 0001 00:00:00 +0000 + /sessions/go/ + + + + Go_Test_Quick + /sessions/go_test_quick/ + Mon, 01 Jan 0001 00:00:00 +0000 + /sessions/go_test_quick/ + + + + Go_Test_Slow + /sessions/go_test_slow/ + Mon, 01 Jan 0001 00:00:00 +0000 + /sessions/go_test_slow/ + + + Goedel_HFSet_Semantic /sessions/goedel_hfset_semantic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/goedel_hfset_semantic/ Goedel_HFSet_Semanticless /sessions/goedel_hfset_semanticless/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/goedel_hfset_semanticless/ Goedel_Incompleteness /sessions/goedel_incompleteness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/goedel_incompleteness/ GoedelGod /sessions/goedelgod/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/goedelgod/ Goodstein_Lambda /sessions/goodstein_lambda/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/goodstein_lambda/ GPU_Kernel_PL /sessions/gpu_kernel_pl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gpu_kernel_pl/ Graph_Saturation /sessions/graph_saturation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/graph_saturation/ Graph_Theory /sessions/graph_theory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/graph_theory/ GraphMarkingIBP /sessions/graphmarkingibp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/graphmarkingibp/ Gray_Codes /sessions/gray_codes/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gray_codes/ Green /sessions/green/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/green/ Groebner_Bases /sessions/groebner_bases/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/groebner_bases/ Groebner_Macaulay /sessions/groebner_macaulay/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/groebner_macaulay/ Gromov_Hyperbolicity /sessions/gromov_hyperbolicity/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/gromov_hyperbolicity/ Grothendieck_Schemes /sessions/grothendieck_schemes/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/grothendieck_schemes/ Group-Ring-Module /sessions/group-ring-module/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/group-ring-module/ Hahn_Jordan_Decomposition /sessions/hahn_jordan_decomposition/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hahn_jordan_decomposition/ Hales_Jewett /sessions/hales_jewett/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hales_jewett/ Heard_Of /sessions/heard_of/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/heard_of/ Hello_World /sessions/hello_world/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hello_world/ HereditarilyFinite /sessions/hereditarilyfinite/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hereditarilyfinite/ Hermite /sessions/hermite/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hermite/ Hermite_Lindemann /sessions/hermite_lindemann/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hermite_lindemann/ Hidden_Markov_Models /sessions/hidden_markov_models/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hidden_markov_models/ Higher_Order_Terms /sessions/higher_order_terms/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/higher_order_terms/ Hoare_Time /sessions/hoare_time/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hoare_time/ HoareForDivergence /sessions/hoarefordivergence/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hoarefordivergence/ HOL-CSP /sessions/hol-csp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hol-csp/ HOL-CSP_OpSem /sessions/hol-csp_opsem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hol-csp_opsem/ HOL-CSPM /sessions/hol-cspm/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hol-cspm/ HOL-ODE-ARCH-COMP /sessions/hol-ode-arch-comp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hol-ode-arch-comp/ HOL-ODE-Examples /sessions/hol-ode-examples/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hol-ode-examples/ HOL-ODE-Numerics /sessions/hol-ode-numerics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hol-ode-numerics/ HOLCF-Prelude /sessions/holcf-prelude/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/holcf-prelude/ Hood_Melville_Queue /sessions/hood_melville_queue/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hood_melville_queue/ HotelKeyCards /sessions/hotelkeycards/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hotelkeycards/ HRB-Slicing /sessions/hrb-slicing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hrb-slicing/ Huffman /sessions/huffman/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/huffman/ Hybrid_Logic /sessions/hybrid_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hybrid_logic/ Hybrid_Multi_Lane_Spatial_Logic /sessions/hybrid_multi_lane_spatial_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hybrid_multi_lane_spatial_logic/ Hybrid_Systems_VCs /sessions/hybrid_systems_vcs/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hybrid_systems_vcs/ HyperCTL /sessions/hyperctl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hyperctl/ Hyperdual /sessions/hyperdual/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hyperdual/ Hypergraph_Basics /sessions/hypergraph_basics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hypergraph_basics/ Hypergraph_Colourings /sessions/hypergraph_colourings/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hypergraph_colourings/ HyperHoareLogic /sessions/hyperhoarelogic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/hyperhoarelogic/ IEEE_Floating_Point /sessions/ieee_floating_point/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ieee_floating_point/ IFC_Tracking /sessions/ifc_tracking/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ifc_tracking/ IMAP-CRDT /sessions/imap-crdt/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imap-crdt/ IMO2019 /sessions/imo2019/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imo2019/ IMP_Compiler /sessions/imp_compiler/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imp_compiler/ IMP_Compiler_Reuse /sessions/imp_compiler_reuse/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imp_compiler_reuse/ IMP_Noninterference /sessions/imp_noninterference/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imp_noninterference/ IMP2 /sessions/imp2/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imp2/ IMP2_Binary_Heap /sessions/imp2_binary_heap/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imp2_binary_heap/ Imperative_Insertion_Sort /sessions/imperative_insertion_sort/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/imperative_insertion_sort/ Implicational_Logic /sessions/implicational_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/implicational_logic/ Impossible_Geometry /sessions/impossible_geometry/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/impossible_geometry/ Incompleteness /sessions/incompleteness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/incompleteness/ Incredible_Proof_Machine /sessions/incredible_proof_machine/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/incredible_proof_machine/ Independence_CH /sessions/independence_ch/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/independence_ch/ Inductive_Confidentiality /sessions/inductive_confidentiality/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/inductive_confidentiality/ Inductive_Inference /sessions/inductive_inference/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/inductive_inference/ InformationFlowSlicing /sessions/informationflowslicing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/informationflowslicing/ InformationFlowSlicing_Inter /sessions/informationflowslicing_inter/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/informationflowslicing_inter/ InfPathElimination /sessions/infpathelimination/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/infpathelimination/ Integration /sessions/integration/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/integration/ Interpolation_Polynomials_HOL_Algebra /sessions/interpolation_polynomials_hol_algebra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/interpolation_polynomials_hol_algebra/ Interpreter_Optimizations /sessions/interpreter_optimizations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/interpreter_optimizations/ Interval_Analysis /sessions/interval_analysis/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/interval_analysis/ Interval_Arithmetic_Word32 /sessions/interval_arithmetic_word32/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/interval_arithmetic_word32/ Intro_Dest_Elim /sessions/intro_dest_elim/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/intro_dest_elim/ Involutions2Squares /sessions/involutions2squares/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/involutions2squares/ IO_Language_Conformance /sessions/io_language_conformance/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/io_language_conformance/ IP_Addresses /sessions/ip_addresses/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ip_addresses/ Iptables_Semantics /sessions/iptables_semantics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/iptables_semantics/ Iptables_Semantics_Examples /sessions/iptables_semantics_examples/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/iptables_semantics_examples/ Iptables_Semantics_Examples_Big /sessions/iptables_semantics_examples_big/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/iptables_semantics_examples_big/ Irrational_Series_Erdos_Straus /sessions/irrational_series_erdos_straus/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/irrational_series_erdos_straus/ Irrationality_J_Hancl /sessions/irrationality_j_hancl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/irrationality_j_hancl/ Irrationals_From_THEBOOK /sessions/irrationals_from_thebook/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/irrationals_from_thebook/ Isabelle_C /sessions/isabelle_c/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/isabelle_c/ Isabelle_hoops /sessions/isabelle_hoops/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/isabelle_hoops/ Isabelle_Marries_Dirac /sessions/isabelle_marries_dirac/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/isabelle_marries_dirac/ Isabelle_Meta_Model /sessions/isabelle_meta_model/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/isabelle_meta_model/ IsaGeoCoq /sessions/isageocoq/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/isageocoq/ IsaNet /sessions/isanet/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/isanet/ Jacobson_Basic_Algebra /sessions/jacobson_basic_algebra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/jacobson_basic_algebra/ Jinja /sessions/jinja/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/jinja/ JinjaDCI /sessions/jinjadci/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/jinjadci/ JinjaThreads /sessions/jinjathreads/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/jinjathreads/ JiveDataStoreModel /sessions/jivedatastoremodel/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/jivedatastoremodel/ Jordan_Hoelder /sessions/jordan_hoelder/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/jordan_hoelder/ Jordan_Normal_Form /sessions/jordan_normal_form/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/jordan_normal_form/ KAD /sessions/kad/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kad/ Karatsuba /sessions/karatsuba/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/karatsuba/ KAT_and_DRA /sessions/kat_and_dra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kat_and_dra/ KBPs /sessions/kbps/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kbps/ KD_Tree /sessions/kd_tree/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kd_tree/ Key_Agreement_Strong_Adversaries /sessions/key_agreement_strong_adversaries/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/key_agreement_strong_adversaries/ Khovanskii_Theorem /sessions/khovanskii_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/khovanskii_theorem/ Kleene_Algebra /sessions/kleene_algebra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kleene_algebra/ Kneser_Cauchy_Davenport /sessions/kneser_cauchy_davenport/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kneser_cauchy_davenport/ Knights_Tour /sessions/knights_tour/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/knights_tour/ Knot_Theory /sessions/knot_theory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/knot_theory/ Knuth_Bendix_Order /sessions/knuth_bendix_order/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/knuth_bendix_order/ Knuth_Morris_Pratt /sessions/knuth_morris_pratt/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/knuth_morris_pratt/ KnuthMorrisPratt /sessions/knuthmorrispratt/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/knuthmorrispratt/ Koenigsberg_Friendship /sessions/koenigsberg_friendship/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/koenigsberg_friendship/ Kruskal /sessions/kruskal/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kruskal/ Kuratowski_Closure_Complement /sessions/kuratowski_closure_complement/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/kuratowski_closure_complement/ Labeled_Transition_Systems /sessions/labeled_transition_systems/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/labeled_transition_systems/ Lam-ml-Normalization /sessions/lam-ml-normalization/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lam-ml-normalization/ Lambda_Free_EPO /sessions/lambda_free_epo/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lambda_free_epo/ Lambda_Free_KBOs /sessions/lambda_free_kbos/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lambda_free_kbos/ Lambda_Free_RPOs /sessions/lambda_free_rpos/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lambda_free_rpos/ LambdaAuth /sessions/lambdaauth/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lambdaauth/ LambdaMu /sessions/lambdamu/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lambdamu/ Lambert_Series /sessions/lambert_series/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lambert_series/ Lambert_W /sessions/lambert_w/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lambert_w/ Landau_Symbols /sessions/landau_symbols/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/landau_symbols/ Laplace_Transform /sessions/laplace_transform/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/laplace_transform/ Latin_Square /sessions/latin_square/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/latin_square/ LatticeProperties /sessions/latticeproperties/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/latticeproperties/ Launchbury /sessions/launchbury/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/launchbury/ Laws_of_Large_Numbers /sessions/laws_of_large_numbers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/laws_of_large_numbers/ Lazy_Case /sessions/lazy_case/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lazy_case/ Lazy-Lists-II /sessions/lazy-lists-ii/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lazy-lists-ii/ Lehmer /sessions/lehmer/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lehmer/ LEM /sessions/lem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lem/ Lifting_Definition_Option /sessions/lifting_definition_option/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lifting_definition_option/ Lifting_the_Exponent /sessions/lifting_the_exponent/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lifting_the_exponent/ LightweightJava /sessions/lightweightjava/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lightweightjava/ Linear_Inequalities /sessions/linear_inequalities/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/linear_inequalities/ Linear_Programming /sessions/linear_programming/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/linear_programming/ Linear_Recurrences /sessions/linear_recurrences/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/linear_recurrences/ Linear_Recurrences_Solver /sessions/linear_recurrences_solver/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/linear_recurrences_solver/ LinearQuantifierElim /sessions/linearquantifierelim/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/linearquantifierelim/ Liouville_Numbers /sessions/liouville_numbers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/liouville_numbers/ List_Interleaving /sessions/list_interleaving/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/list_interleaving/ List_Inversions /sessions/list_inversions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/list_inversions/ List_Update /sessions/list_update/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/list_update/ List-Index /sessions/list-index/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/list-index/ List-Infinite /sessions/list-infinite/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/list-infinite/ LLL_Basis_Reduction /sessions/lll_basis_reduction/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lll_basis_reduction/ LLL_Factorization /sessions/lll_factorization/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lll_factorization/ Localization_Ring /sessions/localization_ring/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/localization_ring/ LocalLexing /sessions/locallexing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/locallexing/ Locally-Nameless-Sigma /sessions/locally-nameless-sigma/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/locally-nameless-sigma/ LOFT /sessions/loft/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/loft/ Logging_Independent_Anonymity /sessions/logging_independent_anonymity/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/logging_independent_anonymity/ Lorenz_Approximation /sessions/lorenz_approximation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lorenz_approximation/ Lorenz_C0 /sessions/lorenz_c0/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lorenz_c0/ Lorenz_C1 /sessions/lorenz_c1/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lorenz_c1/ Lovasz_Local /sessions/lovasz_local/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lovasz_local/ Lowe_Ontological_Argument /sessions/lowe_ontological_argument/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lowe_ontological_argument/ Lower_Semicontinuous /sessions/lower_semicontinuous/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lower_semicontinuous/ Lp /sessions/lp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lp/ LP_Duality /sessions/lp_duality/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lp_duality/ LTL /sessions/ltl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ltl/ LTL_Master_Theorem /sessions/ltl_master_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ltl_master_theorem/ LTL_Normal_Form /sessions/ltl_normal_form/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ltl_normal_form/ LTL_to_DRA /sessions/ltl_to_dra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ltl_to_dra/ LTL_to_GBA /sessions/ltl_to_gba/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ltl_to_gba/ Lucas_Theorem /sessions/lucas_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/lucas_theorem/ Markov_Models /sessions/markov_models/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/markov_models/ Marriage /sessions/marriage/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/marriage/ Martingales /sessions/martingales/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/martingales/ Mason_Stothers /sessions/mason_stothers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mason_stothers/ Matrices_for_ODEs /sessions/matrices_for_odes/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/matrices_for_odes/ Matrix /sessions/matrix/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/matrix/ Matrix_Tensor /sessions/matrix_tensor/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/matrix_tensor/ Matroids /sessions/matroids/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/matroids/ Max-Card-Matching /sessions/max-card-matching/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/max-card-matching/ Maximum_Segment_Sum /sessions/maximum_segment_sum/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/maximum_segment_sum/ MDP-Algorithms /sessions/mdp-algorithms/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mdp-algorithms/ MDP-Rewards /sessions/mdp-rewards/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mdp-rewards/ Median_Method /sessions/median_method/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/median_method/ Median_Of_Medians_Selection /sessions/median_of_medians_selection/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/median_of_medians_selection/ Menger /sessions/menger/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/menger/ Mereology /sessions/mereology/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mereology/ Mersenne_Primes /sessions/mersenne_primes/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mersenne_primes/ Metalogic_ProofChecker /sessions/metalogic_proofchecker/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/metalogic_proofchecker/ MFMC_Countable /sessions/mfmc_countable/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mfmc_countable/ MFODL_Monitor_Optimized /sessions/mfodl_monitor_optimized/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mfodl_monitor_optimized/ MFOTL_Monitor /sessions/mfotl_monitor/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mfotl_monitor/ MHComputation /sessions/mhcomputation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mhcomputation/ Minimal_SSA /sessions/minimal_ssa/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/minimal_ssa/ MiniML /sessions/miniml/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/miniml/ MiniSail /sessions/minisail/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/minisail/ Minkowskis_Theorem /sessions/minkowskis_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/minkowskis_theorem/ Minsky_Machines /sessions/minsky_machines/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/minsky_machines/ ML_Unification /sessions/ml_unification/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ml_unification/ MLSS_Decision_Proc /sessions/mlss_decision_proc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mlss_decision_proc/ Modal_Logics_for_NTS /sessions/modal_logics_for_nts/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/modal_logics_for_nts/ Modular_arithmetic_LLL_and_HNF_algorithms /sessions/modular_arithmetic_lll_and_hnf_algorithms/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/modular_arithmetic_lll_and_hnf_algorithms/ Modular_Assembly_Kit_Security /sessions/modular_assembly_kit_security/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/modular_assembly_kit_security/ Monad_Memo_DP /sessions/monad_memo_dp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/monad_memo_dp/ Monad_Normalisation /sessions/monad_normalisation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/monad_normalisation/ MonoBoolTranAlgebra /sessions/monobooltranalgebra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/monobooltranalgebra/ MonoidalCategory /sessions/monoidalcategory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/monoidalcategory/ Monomorphic_Monad /sessions/monomorphic_monad/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/monomorphic_monad/ MSO_Regex_Equivalence /sessions/mso_regex_equivalence/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/mso_regex_equivalence/ MuchAdoAboutTwo /sessions/muchadoabouttwo/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/muchadoabouttwo/ Multi_Party_Computation /sessions/multi_party_computation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/multi_party_computation/ Multirelations /sessions/multirelations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/multirelations/ Multirelations_Heterogeneous /sessions/multirelations_heterogeneous/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/multirelations_heterogeneous/ Multiset_Ordering_NPC /sessions/multiset_ordering_npc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/multiset_ordering_npc/ Multitape_To_Singletape_TM /sessions/multitape_to_singletape_tm/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/multitape_to_singletape_tm/ Myhill-Nerode /sessions/myhill-nerode/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/myhill-nerode/ Name_Carrying_Type_Inference /sessions/name_carrying_type_inference/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/name_carrying_type_inference/ Nano_JSON /sessions/nano_json/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/nano_json/ Nash_Williams /sessions/nash_williams/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/nash_williams/ Nat-Interval-Logic /sessions/nat-interval-logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/nat-interval-logic/ Native_Word /sessions/native_word/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/native_word/ Nested_Multisets_Ordinals /sessions/nested_multisets_ordinals/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/nested_multisets_ordinals/ Network_Security_Policy_Verification /sessions/network_security_policy_verification/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/network_security_policy_verification/ Neumann_Morgenstern_Utility /sessions/neumann_morgenstern_utility/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/neumann_morgenstern_utility/ No_FTL_observers /sessions/no_ftl_observers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/no_ftl_observers/ No_FTL_observers_Gen_Rel /sessions/no_ftl_observers_gen_rel/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/no_ftl_observers_gen_rel/ Nominal_Myhill_Nerode /sessions/nominal_myhill_nerode/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/nominal_myhill_nerode/ Nominal2 /sessions/nominal2/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/nominal2/ Noninterference_Concurrent_Composition /sessions/noninterference_concurrent_composition/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/noninterference_concurrent_composition/ Noninterference_CSP /sessions/noninterference_csp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/noninterference_csp/ Noninterference_Generic_Unwinding /sessions/noninterference_generic_unwinding/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/noninterference_generic_unwinding/ Noninterference_Inductive_Unwinding /sessions/noninterference_inductive_unwinding/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/noninterference_inductive_unwinding/ Noninterference_Ipurge_Unwinding /sessions/noninterference_ipurge_unwinding/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/noninterference_ipurge_unwinding/ Noninterference_Sequential_Composition /sessions/noninterference_sequential_composition/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/noninterference_sequential_composition/ NormByEval /sessions/normbyeval/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/normbyeval/ Nullstellensatz /sessions/nullstellensatz/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/nullstellensatz/ Number_Theoretic_Transform /sessions/number_theoretic_transform/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/number_theoretic_transform/ Octonions /sessions/octonions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/octonions/ Old_Datatype_Show /sessions/old_datatype_show/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/old_datatype_show/ OmegaCatoidsQuantales /sessions/omegacatoidsquantales/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/omegacatoidsquantales/ Open_Induction /sessions/open_induction/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/open_induction/ OpSets /sessions/opsets/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/opsets/ Optics /sessions/optics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/optics/ Optimal_BST /sessions/optimal_bst/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/optimal_bst/ Orbit_Stabiliser /sessions/orbit_stabiliser/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/orbit_stabiliser/ Order_Lattice_Props /sessions/order_lattice_props/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/order_lattice_props/ Ordered_Resolution_Prover /sessions/ordered_resolution_prover/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ordered_resolution_prover/ Ordinal /sessions/ordinal/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ordinal/ Ordinal_Partitions /sessions/ordinal_partitions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ordinal_partitions/ Ordinals_and_Cardinals /sessions/ordinals_and_cardinals/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ordinals_and_cardinals/ Ordinary_Differential_Equations /sessions/ordinary_differential_equations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ordinary_differential_equations/ PAC_Checker /sessions/pac_checker/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pac_checker/ Package_logic /sessions/package_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/package_logic/ Padic_Field /sessions/padic_field/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/padic_field/ Padic_Ints /sessions/padic_ints/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/padic_ints/ Pairing_Heap /sessions/pairing_heap/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pairing_heap/ PAL /sessions/pal/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pal/ PAPP_Impossibility /sessions/papp_impossibility/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/papp_impossibility/ Paraconsistency /sessions/paraconsistency/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/paraconsistency/ Parity_Game /sessions/parity_game/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/parity_game/ Partial_Function_MR /sessions/partial_function_mr/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/partial_function_mr/ Partial_Order_Reduction /sessions/partial_order_reduction/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/partial_order_reduction/ Password_Authentication_Protocol /sessions/password_authentication_protocol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/password_authentication_protocol/ PCF /sessions/pcf/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pcf/ Pell /sessions/pell/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pell/ Perfect_Fields /sessions/perfect_fields/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/perfect_fields/ Perfect-Number-Thm /sessions/perfect-number-thm/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/perfect-number-thm/ Perron_Frobenius /sessions/perron_frobenius/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/perron_frobenius/ pGCL /sessions/pgcl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pgcl/ Physical_Quantities /sessions/physical_quantities/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/physical_quantities/ Pi_Calculus /sessions/pi_calculus/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pi_calculus/ Pi_Transcendental /sessions/pi_transcendental/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pi_transcendental/ Planarity_Certificates /sessions/planarity_certificates/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/planarity_certificates/ PLM /sessions/plm/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/plm/ Pluennecke_Ruzsa_Inequality /sessions/pluennecke_ruzsa_inequality/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pluennecke_ruzsa_inequality/ Poincare_Bendixson /sessions/poincare_bendixson/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/poincare_bendixson/ Poincare_Disc /sessions/poincare_disc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/poincare_disc/ Polygonal_Number_Theorem /sessions/polygonal_number_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/polygonal_number_theorem/ Polylog /sessions/polylog/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/polylog/ Polynomial_Crit_Geometry /sessions/polynomial_crit_geometry/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/polynomial_crit_geometry/ Polynomial_Factorization /sessions/polynomial_factorization/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/polynomial_factorization/ Polynomial_Interpolation /sessions/polynomial_interpolation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/polynomial_interpolation/ Polynomials /sessions/polynomials/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/polynomials/ Pop_Refinement /sessions/pop_refinement/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pop_refinement/ POPLmark-deBruijn /sessions/poplmark-debruijn/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/poplmark-debruijn/ Posix-Lexing /sessions/posix-lexing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/posix-lexing/ Possibilistic_Noninterference /sessions/possibilistic_noninterference/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/possibilistic_noninterference/ Power_Sum_Polynomials /sessions/power_sum_polynomials/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/power_sum_polynomials/ Pratt_Certificate /sessions/pratt_certificate/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pratt_certificate/ Prefix_Free_Code_Combinators /sessions/prefix_free_code_combinators/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/prefix_free_code_combinators/ Presburger-Automata /sessions/presburger-automata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/presburger-automata/ Prim_Dijkstra_Simple /sessions/prim_dijkstra_simple/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/prim_dijkstra_simple/ Prime_Distribution_Elementary /sessions/prime_distribution_elementary/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/prime_distribution_elementary/ Prime_Harmonic_Series /sessions/prime_harmonic_series/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/prime_harmonic_series/ Prime_Number_Theorem /sessions/prime_number_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/prime_number_theorem/ Priority_Queue_Braun /sessions/priority_queue_braun/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/priority_queue_braun/ Priority_Search_Trees /sessions/priority_search_trees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/priority_search_trees/ Probabilistic_Noninterference /sessions/probabilistic_noninterference/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/probabilistic_noninterference/ Probabilistic_Prime_Tests /sessions/probabilistic_prime_tests/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/probabilistic_prime_tests/ Probabilistic_System_Zoo /sessions/probabilistic_system_zoo/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/probabilistic_system_zoo/ Probabilistic_Timed_Automata /sessions/probabilistic_timed_automata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/probabilistic_timed_automata/ Probabilistic_While /sessions/probabilistic_while/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/probabilistic_while/ Probability_Inequality_Completeness /sessions/probability_inequality_completeness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/probability_inequality_completeness/ Program-Conflict-Analysis /sessions/program-conflict-analysis/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/program-conflict-analysis/ Progress_Tracking /sessions/progress_tracking/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/progress_tracking/ Projective_Geometry /sessions/projective_geometry/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/projective_geometry/ Projective_Measurements /sessions/projective_measurements/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/projective_measurements/ Promela /sessions/promela/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/promela/ Proof_Strategy_Language /sessions/proof_strategy_language/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/proof_strategy_language/ Propositional_Logic_Class /sessions/propositional_logic_class/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/propositional_logic_class/ Propositional_Proof_Systems /sessions/propositional_proof_systems/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/propositional_proof_systems/ PropResPI /sessions/proprespi/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/proprespi/ Prpu_Maxflow /sessions/prpu_maxflow/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/prpu_maxflow/ PSemigroupsConvolution /sessions/psemigroupsconvolution/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/psemigroupsconvolution/ PseudoHoops /sessions/pseudohoops/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pseudohoops/ Psi_Calculi /sessions/psi_calculi/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/psi_calculi/ Ptolemys_Theorem /sessions/ptolemys_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ptolemys_theorem/ Public_Announcement_Logic /sessions/public_announcement_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/public_announcement_logic/ Pushdown_Systems /sessions/pushdown_systems/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/pushdown_systems/ Q0_Metatheory /sessions/q0_metatheory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/q0_metatheory/ Q0_Soundness /sessions/q0_soundness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/q0_soundness/ QBF_Solver_Verification /sessions/qbf_solver_verification/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/qbf_solver_verification/ QHLProver /sessions/qhlprover/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/qhlprover/ QR_Decomposition /sessions/qr_decomposition/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/qr_decomposition/ Quantales /sessions/quantales/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/quantales/ Quantales_Converse /sessions/quantales_converse/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/quantales_converse/ Quantifier_Elimination_Hybrid /sessions/quantifier_elimination_hybrid/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/quantifier_elimination_hybrid/ Quasi_Borel_Spaces /sessions/quasi_borel_spaces/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/quasi_borel_spaces/ Quaternions /sessions/quaternions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/quaternions/ Query_Optimization /sessions/query_optimization/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/query_optimization/ Quick_Sort_Cost /sessions/quick_sort_cost/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/quick_sort_cost/ Ramsey-Infinite /sessions/ramsey-infinite/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ramsey-infinite/ Random_BSTs /sessions/random_bsts/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/random_bsts/ Random_Graph_Subgraph_Threshold /sessions/random_graph_subgraph_threshold/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/random_graph_subgraph_threshold/ Randomised_BSTs /sessions/randomised_bsts/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/randomised_bsts/ Randomised_Social_Choice /sessions/randomised_social_choice/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/randomised_social_choice/ Rank_Nullity_Theorem /sessions/rank_nullity_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/rank_nullity_theorem/ Real_Impl /sessions/real_impl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/real_impl/ Real_Power /sessions/real_power/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/real_power/ Real_Time_Deque /sessions/real_time_deque/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/real_time_deque/ Recursion-Addition /sessions/recursion-addition/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/recursion-addition/ Recursion-Theory-I /sessions/recursion-theory-i/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/recursion-theory-i/ Refine_Imperative_HOL /sessions/refine_imperative_hol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/refine_imperative_hol/ Refine_Monadic /sessions/refine_monadic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/refine_monadic/ RefinementReactive /sessions/refinementreactive/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/refinementreactive/ Regex_Equivalence /sessions/regex_equivalence/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/regex_equivalence/ Region_Quadtrees /sessions/region_quadtrees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/region_quadtrees/ Registers /sessions/registers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/registers/ Regression_Test_Selection /sessions/regression_test_selection/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/regression_test_selection/ Regular_Algebras /sessions/regular_algebras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/regular_algebras/ Regular_Tree_Relations /sessions/regular_tree_relations/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/regular_tree_relations/ Regular-Sets /sessions/regular-sets/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/regular-sets/ Relation_Algebra /sessions/relation_algebra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relation_algebra/ Relational_Cardinality /sessions/relational_cardinality/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relational_cardinality/ Relational_Disjoint_Set_Forests /sessions/relational_disjoint_set_forests/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relational_disjoint_set_forests/ Relational_Forests /sessions/relational_forests/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relational_forests/ Relational_Method /sessions/relational_method/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relational_method/ Relational_Minimum_Spanning_Trees /sessions/relational_minimum_spanning_trees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relational_minimum_spanning_trees/ Relational_Paths /sessions/relational_paths/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relational_paths/ Relational-Incorrectness-Logic /sessions/relational-incorrectness-logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/relational-incorrectness-logic/ Rensets /sessions/rensets/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/rensets/ Rep_Fin_Groups /sessions/rep_fin_groups/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/rep_fin_groups/ Residuated_Lattices /sessions/residuated_lattices/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/residuated_lattices/ ResiduatedTransitionSystem /sessions/residuatedtransitionsystem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/residuatedtransitionsystem/ Resolution_FOL /sessions/resolution_fol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/resolution_fol/ Rewrite_Properties_Reduction /sessions/rewrite_properties_reduction/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/rewrite_properties_reduction/ Rewriting_Z /sessions/rewriting_z/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/rewriting_z/ Ribbon_Proofs /sessions/ribbon_proofs/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ribbon_proofs/ RIPEMD-160-SPARK /sessions/ripemd-160-spark/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/ripemd-160-spark/ Risk_Free_Lending /sessions/risk_free_lending/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/risk_free_lending/ Robbins-Conjecture /sessions/robbins-conjecture/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/robbins-conjecture/ ROBDD /sessions/robdd/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/robdd/ Robinson_Arithmetic /sessions/robinson_arithmetic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/robinson_arithmetic/ Root_Balanced_Tree /sessions/root_balanced_tree/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/root_balanced_tree/ Roth_Arithmetic_Progressions /sessions/roth_arithmetic_progressions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/roth_arithmetic_progressions/ Routing /sessions/routing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/routing/ Roy_Floyd_Warshall /sessions/roy_floyd_warshall/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/roy_floyd_warshall/ RSAPSS /sessions/rsapss/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/rsapss/ S_Finite_Measure_Monad /sessions/s_finite_measure_monad/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/s_finite_measure_monad/ Safe_Distance /sessions/safe_distance/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/safe_distance/ Safe_OCL /sessions/safe_ocl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/safe_ocl/ Safe_Range_RC /sessions/safe_range_rc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/safe_range_rc/ SATSolverVerification /sessions/satsolververification/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/satsolververification/ Saturation_Framework /sessions/saturation_framework/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/saturation_framework/ Saturation_Framework_Extensions /sessions/saturation_framework_extensions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/saturation_framework_extensions/ Sauer_Shelah_Lemma /sessions/sauer_shelah_lemma/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sauer_shelah_lemma/ SC_DOM_Components /sessions/sc_dom_components/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sc_dom_components/ SCC_Bloemen_Sequential /sessions/scc_bloemen_sequential/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/scc_bloemen_sequential/ Schutz_Spacetime /sessions/schutz_spacetime/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/schutz_spacetime/ Schwartz_Zippel /sessions/schwartz_zippel/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/schwartz_zippel/ SDS_Impossibility /sessions/sds_impossibility/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sds_impossibility/ Secondary_Sylow /sessions/secondary_sylow/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/secondary_sylow/ Security_Protocol_Refinement /sessions/security_protocol_refinement/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/security_protocol_refinement/ Selection_Heap_Sort /sessions/selection_heap_sort/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/selection_heap_sort/ SenSocialChoice /sessions/sensocialchoice/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sensocialchoice/ Separata /sessions/separata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/separata/ Separation_Algebra /sessions/separation_algebra/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/separation_algebra/ Separation_Logic_Imperative_HOL /sessions/separation_logic_imperative_hol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/separation_logic_imperative_hol/ Separation_Logic_Unbounded /sessions/separation_logic_unbounded/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/separation_logic_unbounded/ Sepref_Basic /sessions/sepref_basic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sepref_basic/ Sepref_IICF /sessions/sepref_iicf/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sepref_iicf/ Sepref_Prereq /sessions/sepref_prereq/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sepref_prereq/ SequentInvertibility /sessions/sequentinvertibility/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sequentinvertibility/ Shadow_DOM /sessions/shadow_dom/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/shadow_dom/ Shadow_SC_DOM /sessions/shadow_sc_dom/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/shadow_sc_dom/ Shivers-CFA /sessions/shivers-cfa/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/shivers-cfa/ ShortestPath /sessions/shortestpath/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/shortestpath/ Show /sessions/show/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/show/ SIFPL /sessions/sifpl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sifpl/ SIFUM_Type_Systems /sessions/sifum_type_systems/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sifum_type_systems/ Sigma_Commit_Crypto /sessions/sigma_commit_crypto/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sigma_commit_crypto/ Signature_Groebner /sessions/signature_groebner/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/signature_groebner/ Simpl /sessions/simpl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/simpl/ Simple_Clause_Learning /sessions/simple_clause_learning/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/simple_clause_learning/ Simple_Firewall /sessions/simple_firewall/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/simple_firewall/ Simplex /sessions/simplex/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/simplex/ Simplicial_complexes_and_boolean_functions /sessions/simplicial_complexes_and_boolean_functions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/simplicial_complexes_and_boolean_functions/ SimplifiedOntologicalArgument /sessions/simplifiedontologicalargument/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/simplifiedontologicalargument/ Skew_Heap /sessions/skew_heap/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/skew_heap/ Skip_Lists /sessions/skip_lists/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/skip_lists/ Slicing /sessions/slicing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/slicing/ Sliding_Window_Algorithm /sessions/sliding_window_algorithm/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sliding_window_algorithm/ SM /sessions/sm/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sm/ SM_Base /sessions/sm_base/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sm_base/ Smith_Normal_Form /sessions/smith_normal_form/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/smith_normal_form/ Smooth_Manifolds /sessions/smooth_manifolds/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/smooth_manifolds/ Solidity /sessions/solidity/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/solidity/ Sophomores_Dream /sessions/sophomores_dream/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sophomores_dream/ Sort_Encodings /sessions/sort_encodings/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sort_encodings/ Source_Coding_Theorem /sessions/source_coding_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/source_coding_theorem/ SPARCv8 /sessions/sparcv8/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sparcv8/ SpecCheck /sessions/speccheck/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/speccheck/ Special_Function_Bounds /sessions/special_function_bounds/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/special_function_bounds/ Splay_Tree /sessions/splay_tree/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/splay_tree/ Sqrt_Babylonian /sessions/sqrt_babylonian/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sqrt_babylonian/ Stable_Matching /sessions/stable_matching/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stable_matching/ Stalnaker_Logic /sessions/stalnaker_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stalnaker_logic/ Standard_Borel_Spaces /sessions/standard_borel_spaces/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/standard_borel_spaces/ Statecharts /sessions/statecharts/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/statecharts/ Stateful_Protocol_Composition_and_Typing /sessions/stateful_protocol_composition_and_typing/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stateful_protocol_composition_and_typing/ Stellar_Quorums /sessions/stellar_quorums/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stellar_quorums/ Stern_Brocot /sessions/stern_brocot/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stern_brocot/ Stewart_Apollonius /sessions/stewart_apollonius/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stewart_apollonius/ Stirling_Formula /sessions/stirling_formula/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stirling_formula/ Stochastic_Matrices /sessions/stochastic_matrices/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stochastic_matrices/ Stone_Algebras /sessions/stone_algebras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stone_algebras/ Stone_Kleene_Relation_Algebras /sessions/stone_kleene_relation_algebras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stone_kleene_relation_algebras/ Stone_Relation_Algebras /sessions/stone_relation_algebras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stone_relation_algebras/ Store_Buffer_Reduction /sessions/store_buffer_reduction/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/store_buffer_reduction/ Stream_Fusion_Code /sessions/stream_fusion_code/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stream_fusion_code/ Stream-Fusion /sessions/stream-fusion/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stream-fusion/ StrictOmegaCategories /sessions/strictomegacategories/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/strictomegacategories/ Strong_Security /sessions/strong_security/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/strong_security/ Sturm_Sequences /sessions/sturm_sequences/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sturm_sequences/ Sturm_Tarski /sessions/sturm_tarski/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sturm_tarski/ Stuttering_Equivalence /sessions/stuttering_equivalence/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/stuttering_equivalence/ Subresultants /sessions/subresultants/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/subresultants/ Subset_Boolean_Algebras /sessions/subset_boolean_algebras/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/subset_boolean_algebras/ Sumcheck_Protocol /sessions/sumcheck_protocol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sumcheck_protocol/ SumSquares /sessions/sumsquares/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sumsquares/ Sunflowers /sessions/sunflowers/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/sunflowers/ SuperCalc /sessions/supercalc/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/supercalc/ Suppes_Theorem /sessions/suppes_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/suppes_theorem/ Surprise_Paradox /sessions/surprise_paradox/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/surprise_paradox/ Symmetric_Polynomials /sessions/symmetric_polynomials/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/symmetric_polynomials/ Syntax_Independent_Logic /sessions/syntax_independent_logic/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/syntax_independent_logic/ Synthetic_Completeness /sessions/synthetic_completeness/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/synthetic_completeness/ Szemeredi_Regularity /sessions/szemeredi_regularity/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/szemeredi_regularity/ Szpilrajn /sessions/szpilrajn/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/szpilrajn/ Tail_Recursive_Functions /sessions/tail_recursive_functions/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tail_recursive_functions/ Tarskis_Geometry /sessions/tarskis_geometry/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tarskis_geometry/ Taylor_Models /sessions/taylor_models/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/taylor_models/ TESL_Language /sessions/tesl_language/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tesl_language/ Three_Circles /sessions/three_circles/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/three_circles/ Three_Squares /sessions/three_squares/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/three_squares/ Timed_Automata /sessions/timed_automata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/timed_automata/ TLA /sessions/tla/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tla/ Topological_Semantics /sessions/topological_semantics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/topological_semantics/ Topology /sessions/topology/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/topology/ TortoiseHare /sessions/tortoisehare/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tortoisehare/ Transcendence_Series_Hancl_Rucki /sessions/transcendence_series_hancl_rucki/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/transcendence_series_hancl_rucki/ Transformer_Semantics /sessions/transformer_semantics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/transformer_semantics/ Transition_Systems_and_Automata /sessions/transition_systems_and_automata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/transition_systems_and_automata/ Transitive_Models /sessions/transitive_models/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/transitive_models/ Transitive-Closure /sessions/transitive-closure/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/transitive-closure/ Transitive-Closure-II /sessions/transitive-closure-ii/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/transitive-closure-ii/ Transport /sessions/transport/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/transport/ Treaps /sessions/treaps/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/treaps/ Tree_Decomposition /sessions/tree_decomposition/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tree_decomposition/ Tree_Enumeration /sessions/tree_enumeration/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tree_enumeration/ Tree-Automata /sessions/tree-automata/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tree-automata/ Triangle /sessions/triangle/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/triangle/ Trie /sessions/trie/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/trie/ TsirelsonBound /sessions/tsirelsonbound/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tsirelsonbound/ Turans_Graph_Theorem /sessions/turans_graph_theorem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/turans_graph_theorem/ Twelvefold_Way /sessions/twelvefold_way/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/twelvefold_way/ Two_Generated_Word_Monoids_Intersection /sessions/two_generated_word_monoids_intersection/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/two_generated_word_monoids_intersection/ Tycon /sessions/tycon/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/tycon/ Types_Tableaus_and_Goedels_God /sessions/types_tableaus_and_goedels_god/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/types_tableaus_and_goedels_god/ Types_To_Sets_Extension /sessions/types_to_sets_extension/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/types_to_sets_extension/ Undirected_Graph_Theory /sessions/undirected_graph_theory/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/undirected_graph_theory/ Universal_Hash_Families /sessions/universal_hash_families/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/universal_hash_families/ Universal_Turing_Machine /sessions/universal_turing_machine/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/universal_turing_machine/ UpDown_Scheme /sessions/updown_scheme/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/updown_scheme/ UPF /sessions/upf/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/upf/ UPF_Firewall /sessions/upf_firewall/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/upf_firewall/ UTP /sessions/utp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/utp/ UTP-Toolkit /sessions/utp-toolkit/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/utp-toolkit/ Valuation /sessions/valuation/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/valuation/ Van_der_Waerden /sessions/van_der_waerden/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/van_der_waerden/ Van_Emde_Boas_Trees /sessions/van_emde_boas_trees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/van_emde_boas_trees/ VectorSpace /sessions/vectorspace/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/vectorspace/ VeriComp /sessions/vericomp/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/vericomp/ Verified_SAT_Based_AI_Planning /sessions/verified_sat_based_ai_planning/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/verified_sat_based_ai_planning/ Verified-Prover /sessions/verified-prover/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/verified-prover/ VerifyThis2018 /sessions/verifythis2018/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/verifythis2018/ VerifyThis2019 /sessions/verifythis2019/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/verifythis2019/ Vickrey_Clarke_Groves /sessions/vickrey_clarke_groves/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/vickrey_clarke_groves/ Virtual_Substitution /sessions/virtual_substitution/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/virtual_substitution/ VolpanoSmith /sessions/volpanosmith/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/volpanosmith/ VYDRA_MDL /sessions/vydra_mdl/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/vydra_mdl/ WebAssembly /sessions/webassembly/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/webassembly/ Weight_Balanced_Trees /sessions/weight_balanced_trees/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/weight_balanced_trees/ Weighted_Arithmetic_Geometric_Mean /sessions/weighted_arithmetic_geometric_mean/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/weighted_arithmetic_geometric_mean/ Weighted_Path_Order /sessions/weighted_path_order/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/weighted_path_order/ Well_Quasi_Orders /sessions/well_quasi_orders/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/well_quasi_orders/ Wetzels_Problem /sessions/wetzels_problem/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/wetzels_problem/ WHATandWHERE_Security /sessions/whatandwhere_security/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/whatandwhere_security/ Wieferich_Kempner /sessions/wieferich_kempner/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/wieferich_kempner/ Winding_Number_Eval /sessions/winding_number_eval/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/winding_number_eval/ WOOT_Strong_Eventual_Consistency /sessions/woot_strong_eventual_consistency/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/woot_strong_eventual_consistency/ Word_Lib /sessions/word_lib/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/word_lib/ WorkerWrapper /sessions/workerwrapper/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/workerwrapper/ X86_Semantics /sessions/x86_semantics/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/x86_semantics/ XML /sessions/xml/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/xml/ Youngs_Inequality /sessions/youngs_inequality/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/youngs_inequality/ Zeckendorf /sessions/zeckendorf/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/zeckendorf/ Zeta_3_Irrational /sessions/zeta_3_irrational/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/zeta_3_irrational/ Zeta_Function /sessions/zeta_function/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/zeta_function/ ZFC_in_HOL /sessions/zfc_in_hol/ Mon, 01 Jan 0001 00:00:00 +0000 /sessions/zfc_in_hol/ diff --git a/web/topics/computer-science/algorithms/approximation/index.html b/web/topics/computer-science/algorithms/approximation/index.html --- a/web/topics/computer-science/algorithms/approximation/index.html +++ b/web/topics/computer-science/algorithms/approximation/index.html @@ -1,156 +1,166 @@ Computer science/Algorithms/Approximation - Archive of Formal Proofs \ No newline at end of file diff --git a/web/topics/computer-science/algorithms/approximation/index.xml b/web/topics/computer-science/algorithms/approximation/index.xml --- a/web/topics/computer-science/algorithms/approximation/index.xml +++ b/web/topics/computer-science/algorithms/approximation/index.xml @@ -1,79 +1,86 @@ Computer science/Algorithms/Approximation on Archive of Formal Proofs /topics/computer-science/algorithms/approximation/ Recent content in Computer science/Algorithms/Approximation on Archive of Formal Proofs Hugo -- gohugo.io en-gb + Approximate Model Counting + /entries/Approximate_Model_Counting.html + Fri, 15 Mar 2024 00:00:00 +0000 + /entries/Approximate_Model_Counting.html + + + Distributed Distinct Elements /entries/Distributed_Distinct_Elements.html Mon, 03 Apr 2023 00:00:00 +0000 /entries/Distributed_Distinct_Elements.html Distributed Distinct Elements /entries/Distributed_Distinct_Elements.html Mon, 03 Apr 2023 00:00:00 +0000 /entries/Distributed_Distinct_Elements.html Distributed Distinct Elements /entries/Distributed_Distinct_Elements.html Mon, 03 Apr 2023 00:00:00 +0000 /entries/Distributed_Distinct_Elements.html Formalization of Randomized Approximation Algorithms for Frequency Moments /entries/Frequency_Moments.html Fri, 08 Apr 2022 00:00:00 +0000 /entries/Frequency_Moments.html Formalization of Randomized Approximation Algorithms for Frequency Moments /entries/Frequency_Moments.html Fri, 08 Apr 2022 00:00:00 +0000 /entries/Frequency_Moments.html Formalization of Randomized Approximation Algorithms for Frequency Moments /entries/Frequency_Moments.html Fri, 08 Apr 2022 00:00:00 +0000 /entries/Frequency_Moments.html Verified Approximation Algorithms /entries/Approximation_Algorithms.html Thu, 16 Jan 2020 00:00:00 +0000 /entries/Approximation_Algorithms.html Verified Approximation Algorithms /entries/Approximation_Algorithms.html Thu, 16 Jan 2020 00:00:00 +0000 /entries/Approximation_Algorithms.html Verified Approximation Algorithms /entries/Approximation_Algorithms.html Thu, 16 Jan 2020 00:00:00 +0000 /entries/Approximation_Algorithms.html diff --git a/web/topics/computer-science/algorithms/index.xml b/web/topics/computer-science/algorithms/index.xml --- a/web/topics/computer-science/algorithms/index.xml +++ b/web/topics/computer-science/algorithms/index.xml @@ -1,618 +1,632 @@ Computer science/Algorithms on Archive of Formal Proofs /topics/computer-science/algorithms/ Recent content in Computer science/Algorithms on Archive of Formal Proofs Hugo -- gohugo.io en-gb + Approximate Model Counting + /entries/Approximate_Model_Counting.html + Fri, 15 Mar 2024 00:00:00 +0000 + /entries/Approximate_Model_Counting.html + + + + Approximate Model Counting + /entries/Approximate_Model_Counting.html + Fri, 15 Mar 2024 00:00:00 +0000 + /entries/Approximate_Model_Counting.html + + + Verified QBF Solving /entries/QBF_Solver_Verification.html Wed, 06 Mar 2024 00:00:00 +0000 /entries/QBF_Solver_Verification.html Verified QBF Solving /entries/QBF_Solver_Verification.html Wed, 06 Mar 2024 00:00:00 +0000 /entries/QBF_Solver_Verification.html Karatsuba Multiplication on Integers /entries/Karatsuba.html Mon, 19 Feb 2024 00:00:00 +0000 /entries/Karatsuba.html Karatsuba Multiplication on Integers /entries/Karatsuba.html Mon, 19 Feb 2024 00:00:00 +0000 /entries/Karatsuba.html Knuth–Morris–Pratt String Search /entries/KnuthMorrisPratt.html Mon, 27 Nov 2023 00:00:00 +0000 /entries/KnuthMorrisPratt.html Knuth–Morris–Pratt String Search /entries/KnuthMorrisPratt.html Mon, 27 Nov 2023 00:00:00 +0000 /entries/KnuthMorrisPratt.html Earley Parser /entries/Earley_Parser.html Sun, 16 Jul 2023 00:00:00 +0000 /entries/Earley_Parser.html Earley Parser /entries/Earley_Parser.html Sun, 16 Jul 2023 00:00:00 +0000 /entries/Earley_Parser.html A Verified Efficient Implementation of the Weighted Path Order /entries/Efficient_Weighted_Path_Order.html Thu, 01 Jun 2023 00:00:00 +0000 /entries/Efficient_Weighted_Path_Order.html A Verified Efficient Implementation of the Weighted Path Order /entries/Efficient_Weighted_Path_Order.html Thu, 01 Jun 2023 00:00:00 +0000 /entries/Efficient_Weighted_Path_Order.html Combinatorial Enumeration Algorithms /entries/Combinatorial_Enumeration_Algorithms.html Fri, 11 Nov 2022 00:00:00 +0000 /entries/Combinatorial_Enumeration_Algorithms.html Combinatorial Enumeration Algorithms /entries/Combinatorial_Enumeration_Algorithms.html Fri, 11 Nov 2022 00:00:00 +0000 /entries/Combinatorial_Enumeration_Algorithms.html Maximum Segment Sum /entries/Maximum_Segment_Sum.html Thu, 29 Sep 2022 00:00:00 +0000 /entries/Maximum_Segment_Sum.html Maximum Segment Sum /entries/Maximum_Segment_Sum.html Thu, 29 Sep 2022 00:00:00 +0000 /entries/Maximum_Segment_Sum.html Verified Complete Test Strategies for Finite State Machines /entries/FSM_Tests.html Tue, 09 Aug 2022 00:00:00 +0000 /entries/FSM_Tests.html Verified Complete Test Strategies for Finite State Machines /entries/FSM_Tests.html Tue, 09 Aug 2022 00:00:00 +0000 /entries/FSM_Tests.html A Combinator Library for Prefix-Free Codes /entries/Prefix_Free_Code_Combinators.html Fri, 08 Apr 2022 00:00:00 +0000 /entries/Prefix_Free_Code_Combinators.html A Combinator Library for Prefix-Free Codes /entries/Prefix_Free_Code_Combinators.html Fri, 08 Apr 2022 00:00:00 +0000 /entries/Prefix_Free_Code_Combinators.html Multi-Head Monitoring of Metric Dynamic Logic /entries/VYDRA_MDL.html Sun, 13 Feb 2022 00:00:00 +0000 /entries/VYDRA_MDL.html Multi-Head Monitoring of Metric Dynamic Logic /entries/VYDRA_MDL.html Sun, 13 Feb 2022 00:00:00 +0000 /entries/VYDRA_MDL.html Gale-Shapley Algorithm /entries/Gale_Shapley.html Wed, 29 Dec 2021 00:00:00 +0000 /entries/Gale_Shapley.html Gale-Shapley Algorithm /entries/Gale_Shapley.html Wed, 29 Dec 2021 00:00:00 +0000 /entries/Gale_Shapley.html Verified Algorithms for Solving Markov Decision Processes /entries/MDP-Algorithms.html Thu, 16 Dec 2021 00:00:00 +0000 /entries/MDP-Algorithms.html Verified Algorithms for Solving Markov Decision Processes /entries/MDP-Algorithms.html Thu, 16 Dec 2021 00:00:00 +0000 /entries/MDP-Algorithms.html Regression Test Selection /entries/Regression_Test_Selection.html Fri, 30 Apr 2021 00:00:00 +0000 /entries/Regression_Test_Selection.html Regression Test Selection /entries/Regression_Test_Selection.html Fri, 30 Apr 2021 00:00:00 +0000 /entries/Regression_Test_Selection.html Practical Algebraic Calculus Checker /entries/PAC_Checker.html Mon, 31 Aug 2020 00:00:00 +0000 /entries/PAC_Checker.html Practical Algebraic Calculus Checker /entries/PAC_Checker.html Mon, 31 Aug 2020 00:00:00 +0000 /entries/PAC_Checker.html Formalization of an Algorithm for Greedily Computing Associative Aggregations on Sliding Windows /entries/Sliding_Window_Algorithm.html Fri, 10 Apr 2020 00:00:00 +0000 /entries/Sliding_Window_Algorithm.html Formalization of an Algorithm for Greedily Computing Associative Aggregations on Sliding Windows /entries/Sliding_Window_Algorithm.html Fri, 10 Apr 2020 00:00:00 +0000 /entries/Sliding_Window_Algorithm.html Formalization of an Optimized Monitoring Algorithm for Metric First-Order Dynamic Logic with Aggregations /entries/MFODL_Monitor_Optimized.html Thu, 09 Apr 2020 00:00:00 +0000 /entries/MFODL_Monitor_Optimized.html Formalization of an Optimized Monitoring Algorithm for Metric First-Order Dynamic Logic with Aggregations /entries/MFODL_Monitor_Optimized.html Thu, 09 Apr 2020 00:00:00 +0000 /entries/MFODL_Monitor_Optimized.html An Efficient Generalization of Counting Sort for Large, possibly Infinite Key Ranges /entries/Generalized_Counting_Sort.html Wed, 04 Dec 2019 00:00:00 +0000 /entries/Generalized_Counting_Sort.html An Efficient Generalization of Counting Sort for Large, possibly Infinite Key Ranges /entries/Generalized_Counting_Sort.html Wed, 04 Dec 2019 00:00:00 +0000 /entries/Generalized_Counting_Sort.html VerifyThis 2019 -- Polished Isabelle Solutions /entries/VerifyThis2019.html Wed, 16 Oct 2019 00:00:00 +0000 /entries/VerifyThis2019.html VerifyThis 2019 -- Polished Isabelle Solutions /entries/VerifyThis2019.html Wed, 16 Oct 2019 00:00:00 +0000 /entries/VerifyThis2019.html Formalization of Multiway-Join Algorithms /entries/Generic_Join.html Mon, 16 Sep 2019 00:00:00 +0000 /entries/Generic_Join.html Formalization of Multiway-Join Algorithms /entries/Generic_Join.html Mon, 16 Sep 2019 00:00:00 +0000 /entries/Generic_Join.html Formalisation of an Adaptive State Counting Algorithm /entries/Adaptive_State_Counting.html Fri, 16 Aug 2019 00:00:00 +0000 /entries/Adaptive_State_Counting.html Formalisation of an Adaptive State Counting Algorithm /entries/Adaptive_State_Counting.html Fri, 16 Aug 2019 00:00:00 +0000 /entries/Adaptive_State_Counting.html Formalization of a Monitoring Algorithm for Metric First-Order Temporal Logic /entries/MFOTL_Monitor.html Thu, 04 Jul 2019 00:00:00 +0000 /entries/MFOTL_Monitor.html Formalization of a Monitoring Algorithm for Metric First-Order Temporal Logic /entries/MFOTL_Monitor.html Thu, 04 Jul 2019 00:00:00 +0000 /entries/MFOTL_Monitor.html Binary Heaps for IMP2 /entries/IMP2_Binary_Heap.html Thu, 13 Jun 2019 00:00:00 +0000 /entries/IMP2_Binary_Heap.html Binary Heaps for IMP2 /entries/IMP2_Binary_Heap.html Thu, 13 Jun 2019 00:00:00 +0000 /entries/IMP2_Binary_Heap.html The Inversions of a List /entries/List_Inversions.html Fri, 01 Feb 2019 00:00:00 +0000 /entries/List_Inversions.html The Inversions of a List /entries/List_Inversions.html Fri, 01 Feb 2019 00:00:00 +0000 /entries/List_Inversions.html IMP2 – Simple Program Verification in Isabelle/HOL /entries/IMP2.html Tue, 15 Jan 2019 00:00:00 +0000 /entries/IMP2.html IMP2 – Simple Program Verification in Isabelle/HOL /entries/IMP2.html Tue, 15 Jan 2019 00:00:00 +0000 /entries/IMP2.html Verifying Imperative Programs using Auto2 /entries/Auto2_Imperative_HOL.html Fri, 21 Dec 2018 00:00:00 +0000 /entries/Auto2_Imperative_HOL.html Verifying Imperative Programs using Auto2 /entries/Auto2_Imperative_HOL.html Fri, 21 Dec 2018 00:00:00 +0000 /entries/Auto2_Imperative_HOL.html Optimal Binary Search Trees /entries/Optimal_BST.html Sun, 27 May 2018 00:00:00 +0000 /entries/Optimal_BST.html Optimal Binary Search Trees /entries/Optimal_BST.html Sun, 27 May 2018 00:00:00 +0000 /entries/Optimal_BST.html Hidden Markov Models /entries/Hidden_Markov_Models.html Fri, 25 May 2018 00:00:00 +0000 /entries/Hidden_Markov_Models.html Hidden Markov Models /entries/Hidden_Markov_Models.html Fri, 25 May 2018 00:00:00 +0000 /entries/Hidden_Markov_Models.html Monadification, Memoization and Dynamic Programming /entries/Monad_Memo_DP.html Tue, 22 May 2018 00:00:00 +0000 /entries/Monad_Memo_DP.html Monadification, Memoization and Dynamic Programming /entries/Monad_Memo_DP.html Tue, 22 May 2018 00:00:00 +0000 /entries/Monad_Memo_DP.html VerifyThis 2018 - Polished Isabelle Solutions /entries/VerifyThis2018.html Fri, 27 Apr 2018 00:00:00 +0000 /entries/VerifyThis2018.html VerifyThis 2018 - Polished Isabelle Solutions /entries/VerifyThis2018.html Fri, 27 Apr 2018 00:00:00 +0000 /entries/VerifyThis2018.html First-Order Terms /entries/First_Order_Terms.html Tue, 06 Feb 2018 00:00:00 +0000 /entries/First_Order_Terms.html First-Order Terms /entries/First_Order_Terms.html Tue, 06 Feb 2018 00:00:00 +0000 /entries/First_Order_Terms.html The Median-of-Medians Selection Algorithm /entries/Median_Of_Medians_Selection.html Thu, 21 Dec 2017 00:00:00 +0000 /entries/Median_Of_Medians_Selection.html The Median-of-Medians Selection Algorithm /entries/Median_Of_Medians_Selection.html Thu, 21 Dec 2017 00:00:00 +0000 /entries/Median_Of_Medians_Selection.html The string search algorithm by Knuth, Morris and Pratt /entries/Knuth_Morris_Pratt.html Mon, 18 Dec 2017 00:00:00 +0000 /entries/Knuth_Morris_Pratt.html The string search algorithm by Knuth, Morris and Pratt /entries/Knuth_Morris_Pratt.html Mon, 18 Dec 2017 00:00:00 +0000 /entries/Knuth_Morris_Pratt.html Lower bound on comparison-based sorting algorithms /entries/Comparison_Sort_Lower_Bound.html Wed, 15 Mar 2017 00:00:00 +0000 /entries/Comparison_Sort_Lower_Bound.html Lower bound on comparison-based sorting algorithms /entries/Comparison_Sort_Lower_Bound.html Wed, 15 Mar 2017 00:00:00 +0000 /entries/Comparison_Sort_Lower_Bound.html The number of comparisons in QuickSort /entries/Quick_Sort_Cost.html Wed, 15 Mar 2017 00:00:00 +0000 /entries/Quick_Sort_Cost.html The number of comparisons in QuickSort /entries/Quick_Sort_Cost.html Wed, 15 Mar 2017 00:00:00 +0000 /entries/Quick_Sort_Cost.html A formalisation of the Cocke-Younger-Kasami algorithm /entries/CYK.html Wed, 27 Apr 2016 00:00:00 +0000 /entries/CYK.html A formalisation of the Cocke-Younger-Kasami algorithm /entries/CYK.html Wed, 27 Apr 2016 00:00:00 +0000 /entries/CYK.html Algorithms for Reduced Ordered Binary Decision Diagrams /entries/ROBDD.html Wed, 27 Apr 2016 00:00:00 +0000 /entries/ROBDD.html Algorithms for Reduced Ordered Binary Decision Diagrams /entries/ROBDD.html Wed, 27 Apr 2016 00:00:00 +0000 /entries/ROBDD.html The Tortoise and Hare Algorithm /entries/TortoiseHare.html Wed, 18 Nov 2015 00:00:00 +0000 /entries/TortoiseHare.html The Tortoise and Hare Algorithm /entries/TortoiseHare.html Wed, 18 Nov 2015 00:00:00 +0000 /entries/TortoiseHare.html Imperative Insertion Sort /entries/Imperative_Insertion_Sort.html Thu, 25 Sep 2014 00:00:00 +0000 /entries/Imperative_Insertion_Sort.html Imperative Insertion Sort /entries/Imperative_Insertion_Sort.html Thu, 25 Sep 2014 00:00:00 +0000 /entries/Imperative_Insertion_Sort.html Boolean Expression Checkers /entries/Boolean_Expression_Checkers.html Sun, 08 Jun 2014 00:00:00 +0000 /entries/Boolean_Expression_Checkers.html Boolean Expression Checkers /entries/Boolean_Expression_Checkers.html Sun, 08 Jun 2014 00:00:00 +0000 /entries/Boolean_Expression_Checkers.html Verification of Selection and Heap Sort Using Locales /entries/Selection_Heap_Sort.html Tue, 11 Feb 2014 00:00:00 +0000 /entries/Selection_Heap_Sort.html Verification of Selection and Heap Sort Using Locales /entries/Selection_Heap_Sort.html Tue, 11 Feb 2014 00:00:00 +0000 /entries/Selection_Heap_Sort.html Efficient Mergesort /entries/Efficient-Mergesort.html Wed, 09 Nov 2011 00:00:00 +0000 /entries/Efficient-Mergesort.html Efficient Mergesort /entries/Efficient-Mergesort.html Wed, 09 Nov 2011 00:00:00 +0000 /entries/Efficient-Mergesort.html Formal Verification of Modern SAT Solvers /entries/SATSolverVerification.html Wed, 23 Jul 2008 00:00:00 +0000 /entries/SATSolverVerification.html Formal Verification of Modern SAT Solvers /entries/SATSolverVerification.html Wed, 23 Jul 2008 00:00:00 +0000 /entries/SATSolverVerification.html Much Ado About Two /entries/MuchAdoAboutTwo.html Tue, 06 Nov 2007 00:00:00 +0000 /entries/MuchAdoAboutTwo.html Much Ado About Two /entries/MuchAdoAboutTwo.html Tue, 06 Nov 2007 00:00:00 +0000 /entries/MuchAdoAboutTwo.html diff --git a/web/topics/computer-science/algorithms/randomized/index.html b/web/topics/computer-science/algorithms/randomized/index.html --- a/web/topics/computer-science/algorithms/randomized/index.html +++ b/web/topics/computer-science/algorithms/randomized/index.html @@ -1,278 +1,287 @@ Computer science/Algorithms/Randomized - Archive of Formal Proofs \ No newline at end of file diff --git a/web/topics/computer-science/algorithms/randomized/index.xml b/web/topics/computer-science/algorithms/randomized/index.xml --- a/web/topics/computer-science/algorithms/randomized/index.xml +++ b/web/topics/computer-science/algorithms/randomized/index.xml @@ -1,352 +1,359 @@ Computer science/Algorithms/Randomized on Archive of Formal Proofs /topics/computer-science/algorithms/randomized/ Recent content in Computer science/Algorithms/Randomized on Archive of Formal Proofs Hugo -- gohugo.io en-gb + Approximate Model Counting + /entries/Approximate_Model_Counting.html + Fri, 15 Mar 2024 00:00:00 +0000 + /entries/Approximate_Model_Counting.html + + + The Sumcheck Protocol /entries/Sumcheck_Protocol.html Fri, 02 Feb 2024 00:00:00 +0000 /entries/Sumcheck_Protocol.html The Sumcheck Protocol /entries/Sumcheck_Protocol.html Fri, 02 Feb 2024 00:00:00 +0000 /entries/Sumcheck_Protocol.html The Sumcheck Protocol /entries/Sumcheck_Protocol.html Fri, 02 Feb 2024 00:00:00 +0000 /entries/Sumcheck_Protocol.html Executable Randomized Algorithms /entries/Executable_Randomized_Algorithms.html Mon, 19 Jun 2023 00:00:00 +0000 /entries/Executable_Randomized_Algorithms.html Executable Randomized Algorithms /entries/Executable_Randomized_Algorithms.html Mon, 19 Jun 2023 00:00:00 +0000 /entries/Executable_Randomized_Algorithms.html Executable Randomized Algorithms /entries/Executable_Randomized_Algorithms.html Mon, 19 Jun 2023 00:00:00 +0000 /entries/Executable_Randomized_Algorithms.html The Schwartz-Zippel Lemma /entries/Schwartz_Zippel.html Thu, 27 Apr 2023 00:00:00 +0000 /entries/Schwartz_Zippel.html The Schwartz-Zippel Lemma /entries/Schwartz_Zippel.html Thu, 27 Apr 2023 00:00:00 +0000 /entries/Schwartz_Zippel.html The Schwartz-Zippel Lemma /entries/Schwartz_Zippel.html Thu, 27 Apr 2023 00:00:00 +0000 /entries/Schwartz_Zippel.html Distributed Distinct Elements /entries/Distributed_Distinct_Elements.html Mon, 03 Apr 2023 00:00:00 +0000 /entries/Distributed_Distinct_Elements.html Distributed Distinct Elements /entries/Distributed_Distinct_Elements.html Mon, 03 Apr 2023 00:00:00 +0000 /entries/Distributed_Distinct_Elements.html Distributed Distinct Elements /entries/Distributed_Distinct_Elements.html Mon, 03 Apr 2023 00:00:00 +0000 /entries/Distributed_Distinct_Elements.html Expander Graphs /entries/Expander_Graphs.html Fri, 03 Mar 2023 00:00:00 +0000 /entries/Expander_Graphs.html Expander Graphs /entries/Expander_Graphs.html Fri, 03 Mar 2023 00:00:00 +0000 /entries/Expander_Graphs.html Expander Graphs /entries/Expander_Graphs.html Fri, 03 Mar 2023 00:00:00 +0000 /entries/Expander_Graphs.html Formalization of Randomized Approximation Algorithms for Frequency Moments /entries/Frequency_Moments.html Fri, 08 Apr 2022 00:00:00 +0000 /entries/Frequency_Moments.html Formalization of Randomized Approximation Algorithms for Frequency Moments /entries/Frequency_Moments.html Fri, 08 Apr 2022 00:00:00 +0000 /entries/Frequency_Moments.html Formalization of Randomized Approximation Algorithms for Frequency Moments /entries/Frequency_Moments.html Fri, 08 Apr 2022 00:00:00 +0000 /entries/Frequency_Moments.html Universal Hash Families /entries/Universal_Hash_Families.html Sun, 20 Feb 2022 00:00:00 +0000 /entries/Universal_Hash_Families.html Universal Hash Families /entries/Universal_Hash_Families.html Sun, 20 Feb 2022 00:00:00 +0000 /entries/Universal_Hash_Families.html Universal Hash Families /entries/Universal_Hash_Families.html Sun, 20 Feb 2022 00:00:00 +0000 /entries/Universal_Hash_Families.html Median Method /entries/Median_Method.html Tue, 25 Jan 2022 00:00:00 +0000 /entries/Median_Method.html Median Method /entries/Median_Method.html Tue, 25 Jan 2022 00:00:00 +0000 /entries/Median_Method.html Median Method /entries/Median_Method.html Tue, 25 Jan 2022 00:00:00 +0000 /entries/Median_Method.html Skip Lists /entries/Skip_Lists.html Thu, 09 Jan 2020 00:00:00 +0000 /entries/Skip_Lists.html Skip Lists /entries/Skip_Lists.html Thu, 09 Jan 2020 00:00:00 +0000 /entries/Skip_Lists.html Skip Lists /entries/Skip_Lists.html Thu, 09 Jan 2020 00:00:00 +0000 /entries/Skip_Lists.html Probabilistic Primality Testing /entries/Probabilistic_Prime_Tests.html Mon, 11 Feb 2019 00:00:00 +0000 /entries/Probabilistic_Prime_Tests.html Probabilistic Primality Testing /entries/Probabilistic_Prime_Tests.html Mon, 11 Feb 2019 00:00:00 +0000 /entries/Probabilistic_Prime_Tests.html Probabilistic Primality Testing /entries/Probabilistic_Prime_Tests.html Mon, 11 Feb 2019 00:00:00 +0000 /entries/Probabilistic_Prime_Tests.html Randomised Binary Search Trees /entries/Randomised_BSTs.html Fri, 19 Oct 2018 00:00:00 +0000 /entries/Randomised_BSTs.html Randomised Binary Search Trees /entries/Randomised_BSTs.html Fri, 19 Oct 2018 00:00:00 +0000 /entries/Randomised_BSTs.html Randomised Binary Search Trees /entries/Randomised_BSTs.html Fri, 19 Oct 2018 00:00:00 +0000 /entries/Randomised_BSTs.html Probabilistic while loop /entries/Probabilistic_While.html Fri, 05 May 2017 00:00:00 +0000 /entries/Probabilistic_While.html Probabilistic while loop /entries/Probabilistic_While.html Fri, 05 May 2017 00:00:00 +0000 /entries/Probabilistic_While.html Probabilistic while loop /entries/Probabilistic_While.html Fri, 05 May 2017 00:00:00 +0000 /entries/Probabilistic_While.html Expected Shape of Random Binary Search Trees /entries/Random_BSTs.html Tue, 04 Apr 2017 00:00:00 +0000 /entries/Random_BSTs.html Expected Shape of Random Binary Search Trees /entries/Random_BSTs.html Tue, 04 Apr 2017 00:00:00 +0000 /entries/Random_BSTs.html Expected Shape of Random Binary Search Trees /entries/Random_BSTs.html Tue, 04 Apr 2017 00:00:00 +0000 /entries/Random_BSTs.html The number of comparisons in QuickSort /entries/Quick_Sort_Cost.html Wed, 15 Mar 2017 00:00:00 +0000 /entries/Quick_Sort_Cost.html The number of comparisons in QuickSort /entries/Quick_Sort_Cost.html Wed, 15 Mar 2017 00:00:00 +0000 /entries/Quick_Sort_Cost.html The number of comparisons in QuickSort /entries/Quick_Sort_Cost.html Wed, 15 Mar 2017 00:00:00 +0000 /entries/Quick_Sort_Cost.html Fisher–Yates shuffle /entries/Fisher_Yates.html Fri, 30 Sep 2016 00:00:00 +0000 /entries/Fisher_Yates.html Fisher–Yates shuffle /entries/Fisher_Yates.html Fri, 30 Sep 2016 00:00:00 +0000 /entries/Fisher_Yates.html Fisher–Yates shuffle /entries/Fisher_Yates.html Fri, 30 Sep 2016 00:00:00 +0000 /entries/Fisher_Yates.html Analysis of List Update Algorithms /entries/List_Update.html Wed, 17 Feb 2016 00:00:00 +0000 /entries/List_Update.html Analysis of List Update Algorithms /entries/List_Update.html Wed, 17 Feb 2016 00:00:00 +0000 /entries/List_Update.html Analysis of List Update Algorithms /entries/List_Update.html Wed, 17 Feb 2016 00:00:00 +0000 /entries/List_Update.html diff --git a/web/topics/index.html b/web/topics/index.html --- a/web/topics/index.html +++ b/web/topics/index.html @@ -1,397 +1,397 @@ Archive of Formal Proofs \ No newline at end of file diff --git a/web/topics/mathematics/analysis/index.html b/web/topics/mathematics/analysis/index.html --- a/web/topics/mathematics/analysis/index.html +++ b/web/topics/mathematics/analysis/index.html @@ -1,655 +1,664 @@ Mathematics/Analysis - Archive of Formal Proofs

Mathematics/Analysis

Subject Classification

ACM: Mathematics of computing~Mathematical analysis

2024

+

2023

2022

2021

2020

2019

2018

2017

2016

2015

2014

2013

2012

2011

2010

2006

2004

\ No newline at end of file diff --git a/web/topics/mathematics/analysis/index.xml b/web/topics/mathematics/analysis/index.xml --- a/web/topics/mathematics/analysis/index.xml +++ b/web/topics/mathematics/analysis/index.xml @@ -1,814 +1,821 @@ Mathematics/Analysis on Archive of Formal Proofs /topics/mathematics/analysis/ Recent content in Mathematics/Analysis on Archive of Formal Proofs Hugo -- gohugo.io en-gb + Continued Fractions + /entries/Continued_Fractions.html + Wed, 20 Mar 2024 00:00:00 +0000 + /entries/Continued_Fractions.html + + + (Extended) Interval Analysis /entries/Interval_Analysis.html Sun, 21 Jan 2024 00:00:00 +0000 /entries/Interval_Analysis.html (Extended) Interval Analysis /entries/Interval_Analysis.html Sun, 21 Jan 2024 00:00:00 +0000 /entries/Interval_Analysis.html Lambert Series /entries/Lambert_Series.html Fri, 24 Nov 2023 00:00:00 +0000 /entries/Lambert_Series.html Lambert Series /entries/Lambert_Series.html Fri, 24 Nov 2023 00:00:00 +0000 /entries/Lambert_Series.html The Polylogarithm Function /entries/Polylog.html Wed, 15 Nov 2023 00:00:00 +0000 /entries/Polylog.html The Polylogarithm Function /entries/Polylog.html Wed, 15 Nov 2023 00:00:00 +0000 /entries/Polylog.html Eudoxus Reals /entries/Eudoxus_Reals.html Sun, 29 Oct 2023 00:00:00 +0000 /entries/Eudoxus_Reals.html Eudoxus Reals /entries/Eudoxus_Reals.html Sun, 29 Oct 2023 00:00:00 +0000 /entries/Eudoxus_Reals.html Standard Borel Spaces /entries/Standard_Borel_Spaces.html Tue, 08 Aug 2023 00:00:00 +0000 /entries/Standard_Borel_Spaces.html Standard Borel Spaces /entries/Standard_Borel_Spaces.html Tue, 08 Aug 2023 00:00:00 +0000 /entries/Standard_Borel_Spaces.html Pólya’s Proof of the Weighted Arithmetic–Geometric Mean Inequality /entries/Weighted_Arithmetic_Geometric_Mean.html Mon, 11 Jul 2022 00:00:00 +0000 /entries/Weighted_Arithmetic_Geometric_Mean.html Pólya’s Proof of the Weighted Arithmetic–Geometric Mean Inequality /entries/Weighted_Arithmetic_Geometric_Mean.html Mon, 11 Jul 2022 00:00:00 +0000 /entries/Weighted_Arithmetic_Geometric_Mean.html The Sophomore's Dream /entries/Sophomores_Dream.html Sun, 10 Apr 2022 00:00:00 +0000 /entries/Sophomores_Dream.html The Sophomore's Dream /entries/Sophomores_Dream.html Sun, 10 Apr 2022 00:00:00 +0000 /entries/Sophomores_Dream.html Constructing the Reals as Dedekind Cuts of Rationals /entries/Dedekind_Real.html Thu, 24 Mar 2022 00:00:00 +0000 /entries/Dedekind_Real.html Constructing the Reals as Dedekind Cuts of Rationals /entries/Dedekind_Real.html Thu, 24 Mar 2022 00:00:00 +0000 /entries/Dedekind_Real.html A Proof from THE BOOK: The Partial Fraction Expansion of the Cotangent /entries/Cotangent_PFD_Formula.html Tue, 15 Mar 2022 00:00:00 +0000 /entries/Cotangent_PFD_Formula.html A Proof from THE BOOK: The Partial Fraction Expansion of the Cotangent /entries/Cotangent_PFD_Formula.html Tue, 15 Mar 2022 00:00:00 +0000 /entries/Cotangent_PFD_Formula.html Wetzel's Problem and the Continuum Hypothesis /entries/Wetzels_Problem.html Fri, 18 Feb 2022 00:00:00 +0000 /entries/Wetzels_Problem.html Wetzel's Problem and the Continuum Hypothesis /entries/Wetzels_Problem.html Fri, 18 Feb 2022 00:00:00 +0000 /entries/Wetzels_Problem.html Young's Inequality for Increasing Functions /entries/Youngs_Inequality.html Mon, 31 Jan 2022 00:00:00 +0000 /entries/Youngs_Inequality.html Young's Inequality for Increasing Functions /entries/Youngs_Inequality.html Mon, 31 Jan 2022 00:00:00 +0000 /entries/Youngs_Inequality.html Hyperdual Numbers and Forward Differentiation /entries/Hyperdual.html Fri, 31 Dec 2021 00:00:00 +0000 /entries/Hyperdual.html Hyperdual Numbers and Forward Differentiation /entries/Hyperdual.html Fri, 31 Dec 2021 00:00:00 +0000 /entries/Hyperdual.html Real Exponents as the Limits of Sequences of Rational Exponents /entries/Real_Power.html Mon, 08 Nov 2021 00:00:00 +0000 /entries/Real_Power.html Real Exponents as the Limits of Sequences of Rational Exponents /entries/Real_Power.html Mon, 08 Nov 2021 00:00:00 +0000 /entries/Real_Power.html Complex Bounded Operators /entries/Complex_Bounded_Operators.html Sat, 18 Sep 2021 00:00:00 +0000 /entries/Complex_Bounded_Operators.html Complex Bounded Operators /entries/Complex_Bounded_Operators.html Sat, 18 Sep 2021 00:00:00 +0000 /entries/Complex_Bounded_Operators.html Solving Cubic and Quartic Equations /entries/Cubic_Quartic_Equations.html Fri, 03 Sep 2021 00:00:00 +0000 /entries/Cubic_Quartic_Equations.html Solving Cubic and Quartic Equations /entries/Cubic_Quartic_Equations.html Fri, 03 Sep 2021 00:00:00 +0000 /entries/Cubic_Quartic_Equations.html The Theorem of Three Circles /entries/Three_Circles.html Sat, 21 Aug 2021 00:00:00 +0000 /entries/Three_Circles.html The Theorem of Three Circles /entries/Three_Circles.html Sat, 21 Aug 2021 00:00:00 +0000 /entries/Three_Circles.html Irrationality Criteria for Series by Erdős and Straus /entries/Irrational_Series_Erdos_Straus.html Tue, 12 May 2020 00:00:00 +0000 /entries/Irrational_Series_Erdos_Straus.html Irrationality Criteria for Series by Erdős and Straus /entries/Irrational_Series_Erdos_Straus.html Tue, 12 May 2020 00:00:00 +0000 /entries/Irrational_Series_Erdos_Straus.html Banach-Steinhaus Theorem /entries/Banach_Steinhaus.html Sat, 02 May 2020 00:00:00 +0000 /entries/Banach_Steinhaus.html Banach-Steinhaus Theorem /entries/Banach_Steinhaus.html Sat, 02 May 2020 00:00:00 +0000 /entries/Banach_Steinhaus.html The Lambert W Function on the Reals /entries/Lambert_W.html Fri, 24 Apr 2020 00:00:00 +0000 /entries/Lambert_W.html The Lambert W Function on the Reals /entries/Lambert_W.html Fri, 24 Apr 2020 00:00:00 +0000 /entries/Lambert_W.html Matrices for ODEs /entries/Matrices_for_ODEs.html Sun, 19 Apr 2020 00:00:00 +0000 /entries/Matrices_for_ODEs.html Matrices for ODEs /entries/Matrices_for_ODEs.html Sun, 19 Apr 2020 00:00:00 +0000 /entries/Matrices_for_ODEs.html The Poincaré-Bendixson Theorem /entries/Poincare_Bendixson.html Wed, 18 Dec 2019 00:00:00 +0000 /entries/Poincare_Bendixson.html The Poincaré-Bendixson Theorem /entries/Poincare_Bendixson.html Wed, 18 Dec 2019 00:00:00 +0000 /entries/Poincare_Bendixson.html Verification Components for Hybrid Systems /entries/Hybrid_Systems_VCs.html Tue, 10 Sep 2019 00:00:00 +0000 /entries/Hybrid_Systems_VCs.html Verification Components for Hybrid Systems /entries/Hybrid_Systems_VCs.html Tue, 10 Sep 2019 00:00:00 +0000 /entries/Hybrid_Systems_VCs.html Fourier Series /entries/Fourier.html Fri, 06 Sep 2019 00:00:00 +0000 /entries/Fourier.html Fourier Series /entries/Fourier.html Fri, 06 Sep 2019 00:00:00 +0000 /entries/Fourier.html Laplace Transform /entries/Laplace_Transform.html Wed, 14 Aug 2019 00:00:00 +0000 /entries/Laplace_Transform.html Laplace Transform /entries/Laplace_Transform.html Wed, 14 Aug 2019 00:00:00 +0000 /entries/Laplace_Transform.html The Transcendence of Certain Infinite Series /entries/Transcendence_Series_Hancl_Rucki.html Wed, 27 Mar 2019 00:00:00 +0000 /entries/Transcendence_Series_Hancl_Rucki.html The Transcendence of Certain Infinite Series /entries/Transcendence_Series_Hancl_Rucki.html Wed, 27 Mar 2019 00:00:00 +0000 /entries/Transcendence_Series_Hancl_Rucki.html Smooth Manifolds /entries/Smooth_Manifolds.html Mon, 22 Oct 2018 00:00:00 +0000 /entries/Smooth_Manifolds.html Smooth Manifolds /entries/Smooth_Manifolds.html Mon, 22 Oct 2018 00:00:00 +0000 /entries/Smooth_Manifolds.html The Budan–Fourier Theorem and Counting Real Roots with Multiplicity /entries/Budan_Fourier.html Sun, 02 Sep 2018 00:00:00 +0000 /entries/Budan_Fourier.html The Budan–Fourier Theorem and Counting Real Roots with Multiplicity /entries/Budan_Fourier.html Sun, 02 Sep 2018 00:00:00 +0000 /entries/Budan_Fourier.html Irrational Rapidly Convergent Series /entries/Irrationality_J_Hancl.html Wed, 23 May 2018 00:00:00 +0000 /entries/Irrationality_J_Hancl.html Irrational Rapidly Convergent Series /entries/Irrationality_J_Hancl.html Wed, 23 May 2018 00:00:00 +0000 /entries/Irrationality_J_Hancl.html The Error Function /entries/Error_Function.html Tue, 06 Feb 2018 00:00:00 +0000 /entries/Error_Function.html The Error Function /entries/Error_Function.html Tue, 06 Feb 2018 00:00:00 +0000 /entries/Error_Function.html An Isabelle/HOL formalisation of Green's Theorem /entries/Green.html Thu, 11 Jan 2018 00:00:00 +0000 /entries/Green.html An Isabelle/HOL formalisation of Green's Theorem /entries/Green.html Thu, 11 Jan 2018 00:00:00 +0000 /entries/Green.html Taylor Models /entries/Taylor_Models.html Mon, 08 Jan 2018 00:00:00 +0000 /entries/Taylor_Models.html Taylor Models /entries/Taylor_Models.html Mon, 08 Jan 2018 00:00:00 +0000 /entries/Taylor_Models.html Count the Number of Complex Roots /entries/Count_Complex_Roots.html Tue, 17 Oct 2017 00:00:00 +0000 /entries/Count_Complex_Roots.html Count the Number of Complex Roots /entries/Count_Complex_Roots.html Tue, 17 Oct 2017 00:00:00 +0000 /entries/Count_Complex_Roots.html Evaluate Winding Numbers through Cauchy Indices /entries/Winding_Number_Eval.html Tue, 17 Oct 2017 00:00:00 +0000 /entries/Winding_Number_Eval.html Evaluate Winding Numbers through Cauchy Indices /entries/Winding_Number_Eval.html Tue, 17 Oct 2017 00:00:00 +0000 /entries/Winding_Number_Eval.html Linear Recurrences /entries/Linear_Recurrences.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Linear_Recurrences.html Linear Recurrences /entries/Linear_Recurrences.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Linear_Recurrences.html The Hurwitz and Riemann ζ Functions /entries/Zeta_Function.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Zeta_Function.html The Hurwitz and Riemann ζ Functions /entries/Zeta_Function.html Thu, 12 Oct 2017 00:00:00 +0000 /entries/Zeta_Function.html The Euler–MacLaurin Formula /entries/Euler_MacLaurin.html Fri, 10 Mar 2017 00:00:00 +0000 /entries/Euler_MacLaurin.html The Euler–MacLaurin Formula /entries/Euler_MacLaurin.html Fri, 10 Mar 2017 00:00:00 +0000 /entries/Euler_MacLaurin.html Bernoulli Numbers /entries/Bernoulli.html Tue, 24 Jan 2017 00:00:00 +0000 /entries/Bernoulli.html Bernoulli Numbers /entries/Bernoulli.html Tue, 24 Jan 2017 00:00:00 +0000 /entries/Bernoulli.html The Transcendence of e /entries/E_Transcendental.html Thu, 12 Jan 2017 00:00:00 +0000 /entries/E_Transcendental.html The Transcendence of e /entries/E_Transcendental.html Thu, 12 Jan 2017 00:00:00 +0000 /entries/E_Transcendental.html Expressiveness of Deep Learning /entries/Deep_Learning.html Thu, 10 Nov 2016 00:00:00 +0000 /entries/Deep_Learning.html Expressiveness of Deep Learning /entries/Deep_Learning.html Thu, 10 Nov 2016 00:00:00 +0000 /entries/Deep_Learning.html Lp spaces /entries/Lp.html Wed, 05 Oct 2016 00:00:00 +0000 /entries/Lp.html Lp spaces /entries/Lp.html Wed, 05 Oct 2016 00:00:00 +0000 /entries/Lp.html Stirling's formula /entries/Stirling_Formula.html Thu, 01 Sep 2016 00:00:00 +0000 /entries/Stirling_Formula.html Stirling's formula /entries/Stirling_Formula.html Thu, 01 Sep 2016 00:00:00 +0000 /entries/Stirling_Formula.html The Cartan Fixed Point Theorems /entries/Cartan_FP.html Tue, 08 Mar 2016 00:00:00 +0000 /entries/Cartan_FP.html The Cartan Fixed Point Theorems /entries/Cartan_FP.html Tue, 08 Mar 2016 00:00:00 +0000 /entries/Cartan_FP.html Descartes' Rule of Signs /entries/Descartes_Sign_Rule.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Descartes_Sign_Rule.html Descartes' Rule of Signs /entries/Descartes_Sign_Rule.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Descartes_Sign_Rule.html Liouville numbers /entries/Liouville_Numbers.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Liouville_Numbers.html Liouville numbers /entries/Liouville_Numbers.html Mon, 28 Dec 2015 00:00:00 +0000 /entries/Liouville_Numbers.html Landau Symbols /entries/Landau_Symbols.html Tue, 14 Jul 2015 00:00:00 +0000 /entries/Landau_Symbols.html Landau Symbols /entries/Landau_Symbols.html Tue, 14 Jul 2015 00:00:00 +0000 /entries/Landau_Symbols.html The Akra-Bazzi theorem and the Master theorem /entries/Akra_Bazzi.html Tue, 14 Jul 2015 00:00:00 +0000 /entries/Akra_Bazzi.html The Akra-Bazzi theorem and the Master theorem /entries/Akra_Bazzi.html Tue, 14 Jul 2015 00:00:00 +0000 /entries/Akra_Bazzi.html The Sturm–Tarski Theorem /entries/Sturm_Tarski.html Fri, 19 Sep 2014 00:00:00 +0000 /entries/Sturm_Tarski.html The Sturm–Tarski Theorem /entries/Sturm_Tarski.html Fri, 19 Sep 2014 00:00:00 +0000 /entries/Sturm_Tarski.html Real-Valued Special Functions: Upper and Lower Bounds /entries/Special_Function_Bounds.html Fri, 29 Aug 2014 00:00:00 +0000 /entries/Special_Function_Bounds.html Real-Valued Special Functions: Upper and Lower Bounds /entries/Special_Function_Bounds.html Fri, 29 Aug 2014 00:00:00 +0000 /entries/Special_Function_Bounds.html Affine Arithmetic /entries/Affine_Arithmetic.html Fri, 07 Feb 2014 00:00:00 +0000 /entries/Affine_Arithmetic.html Affine Arithmetic /entries/Affine_Arithmetic.html Fri, 07 Feb 2014 00:00:00 +0000 /entries/Affine_Arithmetic.html Implementing field extensions of the form Q[sqrt(b)] /entries/Real_Impl.html Thu, 06 Feb 2014 00:00:00 +0000 /entries/Real_Impl.html Implementing field extensions of the form Q[sqrt(b)] /entries/Real_Impl.html Thu, 06 Feb 2014 00:00:00 +0000 /entries/Real_Impl.html Sturm's Theorem /entries/Sturm_Sequences.html Sat, 11 Jan 2014 00:00:00 +0000 /entries/Sturm_Sequences.html Sturm's Theorem /entries/Sturm_Sequences.html Sat, 11 Jan 2014 00:00:00 +0000 /entries/Sturm_Sequences.html Computing N-th Roots using the Babylonian Method /entries/Sqrt_Babylonian.html Thu, 03 Jan 2013 00:00:00 +0000 /entries/Sqrt_Babylonian.html Computing N-th Roots using the Babylonian Method /entries/Sqrt_Babylonian.html Thu, 03 Jan 2013 00:00:00 +0000 /entries/Sqrt_Babylonian.html Ordinary Differential Equations /entries/Ordinary_Differential_Equations.html Thu, 26 Apr 2012 00:00:00 +0000 /entries/Ordinary_Differential_Equations.html Ordinary Differential Equations /entries/Ordinary_Differential_Equations.html Thu, 26 Apr 2012 00:00:00 +0000 /entries/Ordinary_Differential_Equations.html Lower Semicontinuous Functions /entries/Lower_Semicontinuous.html Sat, 08 Jan 2011 00:00:00 +0000 /entries/Lower_Semicontinuous.html Lower Semicontinuous Functions /entries/Lower_Semicontinuous.html Sat, 08 Jan 2011 00:00:00 +0000 /entries/Lower_Semicontinuous.html Executable Multivariate Polynomials /entries/Polynomials.html Tue, 10 Aug 2010 00:00:00 +0000 /entries/Polynomials.html Executable Multivariate Polynomials /entries/Polynomials.html Tue, 10 Aug 2010 00:00:00 +0000 /entries/Polynomials.html Cauchy's Mean Theorem and the Cauchy-Schwarz Inequality /entries/Cauchy.html Tue, 14 Mar 2006 00:00:00 +0000 /entries/Cauchy.html Cauchy's Mean Theorem and the Cauchy-Schwarz Inequality /entries/Cauchy.html Tue, 14 Mar 2006 00:00:00 +0000 /entries/Cauchy.html Integration theory and random variables /entries/Integration.html Fri, 19 Nov 2004 00:00:00 +0000 /entries/Integration.html Integration theory and random variables /entries/Integration.html Fri, 19 Nov 2004 00:00:00 +0000 /entries/Integration.html diff --git a/web/topics/tools/index.html b/web/topics/tools/index.html --- a/web/topics/tools/index.html +++ b/web/topics/tools/index.html @@ -1,341 +1,351 @@ Tools - Archive of Formal Proofs

Tools

+

2024

+

2023

2022

2021

2020

2019

2018

2017

2016

2015

2013

2009

\ No newline at end of file diff --git a/web/topics/tools/index.xml b/web/topics/tools/index.xml --- a/web/topics/tools/index.xml +++ b/web/topics/tools/index.xml @@ -1,178 +1,185 @@ Tools on Archive of Formal Proofs /topics/tools/ Recent content in Tools on Archive of Formal Proofs Hugo -- gohugo.io en-gb - Tue, 19 Sep 2023 00:00:00 +0000 + Mon, 22 Jan 2024 00:00:00 +0000 + Go Code Generation for Isabelle + /entries/Go.html + Mon, 22 Jan 2024 00:00:00 +0000 + /entries/Go.html + + + Unification Utilities for Isabelle/ML /entries/ML_Unification.html Tue, 19 Sep 2023 00:00:00 +0000 /entries/ML_Unification.html Automation of Boolos' Curious Inference in Isabelle/HOL /entries/Boolos_Curious_Inference_Automated.html Mon, 05 Dec 2022 00:00:00 +0000 /entries/Boolos_Curious_Inference_Automated.html Nano JSON: Working with JSON formatted data in Isabelle/HOL and Isabelle/ML /entries/Nano_JSON.html Fri, 29 Jul 2022 00:00:00 +0000 /entries/Nano_JSON.html Conditional Simplification /entries/Conditional_Simplification.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/Conditional_Simplification.html Conditional Transfer Rule /entries/Conditional_Transfer_Rule.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/Conditional_Transfer_Rule.html Extension of Types-To-Sets /entries/Types_To_Sets_Extension.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/Types_To_Sets_Extension.html IDE: Introduction, Destruction, Elimination /entries/Intro_Dest_Elim.html Mon, 06 Sep 2021 00:00:00 +0000 /entries/Intro_Dest_Elim.html SpecCheck - Specification-Based Testing for Isabelle/ML /entries/SpecCheck.html Thu, 01 Jul 2021 00:00:00 +0000 /entries/SpecCheck.html Automated Stateful Protocol Verification /entries/Automated_Stateful_Protocol_Verification.html Wed, 08 Apr 2020 00:00:00 +0000 /entries/Automated_Stateful_Protocol_Verification.html Isabelle/C /entries/Isabelle_C.html Tue, 22 Oct 2019 00:00:00 +0000 /entries/Isabelle_C.html Auto2 Prover /entries/Auto2_HOL.html Tue, 20 Nov 2018 00:00:00 +0000 /entries/Auto2_HOL.html Bounded Natural Functors with Covariance and Contravariance /entries/BNF_CC.html Tue, 24 Apr 2018 00:00:00 +0000 /entries/BNF_CC.html Operations on Bounded Natural Functors /entries/BNF_Operations.html Tue, 19 Dec 2017 00:00:00 +0000 /entries/BNF_Operations.html Homogeneous Linear Diophantine Equations /entries/Diophantine_Eqns_Lin_Hom.html Sat, 14 Oct 2017 00:00:00 +0000 /entries/Diophantine_Eqns_Lin_Hom.html Dictionary Construction /entries/Dict_Construction.html Wed, 24 May 2017 00:00:00 +0000 /entries/Dict_Construction.html Monad normalisation /entries/Monad_Normalisation.html Fri, 05 May 2017 00:00:00 +0000 /entries/Monad_Normalisation.html Constructor Functions /entries/Constructor_Funs.html Wed, 19 Apr 2017 00:00:00 +0000 /entries/Constructor_Funs.html Lazifying case constants /entries/Lazy_Case.html Tue, 18 Apr 2017 00:00:00 +0000 /entries/Lazy_Case.html Proof Strategy Language /entries/Proof_Strategy_Language.html Tue, 20 Dec 2016 00:00:00 +0000 /entries/Proof_Strategy_Language.html Separata: Isabelle tactics for Separation Algebra /entries/Separata.html Wed, 16 Nov 2016 00:00:00 +0000 /entries/Separata.html Generating Cases from Labeled Subgoals /entries/Case_Labeling.html Tue, 21 Jul 2015 00:00:00 +0000 /entries/Case_Labeling.html Nominal 2 /entries/Nominal2.html Thu, 21 Feb 2013 00:00:00 +0000 /entries/Nominal2.html A Fast SAT Solver for Isabelle in Standard ML /entries/DPT-SAT-Solver.html Wed, 09 Dec 2009 00:00:00 +0000 /entries/DPT-SAT-Solver.html