diff --git a/metadata/authors.toml b/metadata/authors.toml --- a/metadata/authors.toml +++ b/metadata/authors.toml @@ -1,6932 +1,6948 @@ [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] [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/" [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/" [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" [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" [bisping.emails] [bisping.emails.bisping_email] user = [ "benjamin", "bisping", ] host = [ "campus", "tu-berlin", "de", ] [bisping.homepages] [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] [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_email1] user = [ "brucker", ] host = [ "spamfence", "net", ] [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] [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/" [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] [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 Cordwell" [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] [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] [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] [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.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.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] [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] [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" [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/" [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" [ketland] name = "Jeffrey Ketland" [ketland.emails] [ketland.emails.ketland_email] user = [ "jeffreyketland", ] host = [ "gmail", "com", ] [ketland.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] [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] +[laursen] +name = "Christian Pardillo-Laursen" + +[laursen.emails] + +[laursen.emails.laursen_email] +user = [ + "christian", + "laursen", +] +host = [ + "york", + "ac", + "uk", +] + [lattuada] name = "Andrea Lattuada" [lattuada.emails] [lattuada.homepages] lattuada_homepage = "https://andrea.lattuada.me" [lee] name = "Holden Lee" [lee.emails] [lee.emails.lee_email] user = [ "holdenl", ] host = [ "princeton", "edu", ] [lee.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_email] user = [ "andreas", "lochbihler", ] host = [ "digitalasset", "com", ] [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] [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" [matache] name = "Cristina Matache" [matache.emails] [matache.emails.matache_email] user = [ "cris", "matache", ] host = [ "gmail", "com", ] [matache.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] [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/" [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/" [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] [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.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] [rabe] name = "Markus N. Rabe" [rabe.emails] [rabe.homepages] rabe_homepage = "http://www.react.uni-saarland.de/people/rabe.html" [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.emails.rawson_email1] user = [ "mr644", ] host = [ "cam", "ac", "uk", ] [rawson.homepages] [raya] name = "Rodrigo Raya" [raya.emails] [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] [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] [sprenger] name = "Christoph Sprenger" [sprenger.emails] [sprenger.emails.sprenger_email] user = [ "sprenger", ] host = [ "inf", "ethz", "ch", ] [sprenger.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://users.fit.cvut.cz/~staroste/" [steinberg] name = "Matías Steinberg" [steinberg.emails] [steinberg.emails.steinberg_email] user = [ "matias", "steinberg", ] host = [ "mi", "unc", "edu", "ar", ] [steinberg.homepages] [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] [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] [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/" [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/" [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] [wenzel] name = "Makarius Wenzel" [wenzel.emails] [wenzel.emails.wenzel_email] user = [ "makarius", ] host = [ "sketis", "net", ] [wenzel.homepages] wenzel_homepage = "https://sketis.net" [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] [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 = [ "ly271", ] host = [ "cam", "ac", "uk", ] [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/Optics.toml b/metadata/entries/Optics.toml --- a/metadata/entries/Optics.toml +++ b/metadata/entries/Optics.toml @@ -1,48 +1,73 @@ title = "Optics" date = 2017-05-25 topics = [ "Computer science/Functional programming", "Mathematics/Algebra", ] abstract = """ Lenses provide an abstract interface for manipulating data types through spatially-separated views. They are defined abstractly in terms of two functions, get, the return a value from the source type, and put that updates the value. We mechanise the underlying theory of lenses, in terms of an algebraic hierarchy of lenses, including well-behaved and very well-behaved lenses, each lens class being characterised by a set of lens laws. We also mechanise a lens algebra in Isabelle that enables their composition and comparison, so as to allow construction of complex lenses. This is accompanied by a large library of algebraic laws. Moreover we also show how the lens classes can be applied by instantiating them with a number of Isabelle data types.""" license = "bsd" note = "" [authors] [authors.fosters] email = "fosters_email" +[authors.laursen] +email = "laursen_email" + [authors.zeyda] email = "zeyda_email" [contributors] [notify] fosters = "fosters_email" [history] +2022-10-05 = """ +Added Scene Spaces, which are used to model variable sets algebraically. +Improvements to the alphabet command, including additional theorems. +Additional prisms and associated laws.
+""" + +2021-11-15 = """ +Improvement of alphabet and chantype commands to support code generation. +Addition of a tactic rename_alpha_vars that removes the subscript vs in proof goals. +Bug fixes and improvements to alphabet command ML implementation. +Additional laws for scenes. (revisions 9f8bcd71c121 and c061bf9f46f3)
+""" + +2021-01-27 = """ +Addition of new theorems throughout, particularly for prisms. +New chantype command allows the definition of an algebraic datatype with generated prisms. +New dataspace command allows the definition of a local-based state space, including lenses and prisms. +Addition of various examples for the above. +(revision 89cf045a)
+""" + 2020-03-02 = """ Added partial bijective and symmetric lenses. Improved alphabet command generating additional lenses and results. Several additional lens relations, including observational equivalence. Additional theorems throughout. Adaptations for Isabelle 2020. (revision 44e2e5c)
""" + [extra] [related] diff --git a/metadata/releases.toml b/metadata/releases.toml --- a/metadata/releases.toml +++ b/metadata/releases.toml @@ -1,7078 +1,7079 @@ [ADS_Functor] 2020-04-27 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [AI_Planning_Languages_Semantics] 2020-10-30 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [AODV] 2014-11-01 = "2014" 2014-11-03 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [AVL-Trees] 2004-03-19 = "2003" 2004-04-20 = "2004" 2004-05-21 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [AWN] 2014-03-15 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Abortable_Linearizable_Modules] 2012-03-02 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Abs_Int_ITP2012] 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Abstract-Hoare-Logics] 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Abstract-Rewriting] 2010-06-17 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Abstract_Completeness] 2014-04-16 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Abstract_Soundness] 2017-02-13 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Adaptive_State_Counting] 2019-08-19 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Affine_Arithmetic] 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Aggregation_Algebras] 2018-09-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Akra_Bazzi] 2015-07-15 = "2015" 2015-07-24 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Algebraic_Numbers] 2015-12-22 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Algebraic_VCs] 2016-06-18 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Allen_Calculus] 2016-09-29 = "2016" 2016-10-05 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2019-06-28 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Amicable_Numbers] 2020-08-15 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Amortized_Complexity] 2014-08-28 = "2014" 2015-05-19 = "2014" 2015-05-27 = "2015" 2015-05-28 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [AnselmGod] 2017-09-08 = "2016-1" 2017-09-11 = "2016-1" 2017-09-18 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Applicative_Lifting] 2015-12-22 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Approximation_Algorithms] 2020-01-16 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Architectural_Design_Patterns] 2018-03-01 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Aristotles_Assertoric_Syllogistic] 2019-10-17 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Arith_Prog_Rel_Primes] 2020-02-10 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [ArrowImpossibilityGS] 2009-04-29 = "2009" 2009-09-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Attack_Trees] 2021-02-23 = "2021" 2021-12-14 = "2021" [Auto2_HOL] 2018-11-29 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Auto2_Imperative_HOL] 2019-01-22 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [AutoFocus-Stream] 2011-02-24 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-08 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Automated_Stateful_Protocol_Verification] 2020-05-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Automatic_Refinement] 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [AxiomaticCategoryTheory] 2018-05-23 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [BDD] 2008-03-07 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [BD_Security_Compositional] 2021-12-14 = "2021" [BNF_CC] 2018-04-25 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [BNF_Operations] 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [BTree] 2021-02-26 = "2021" 2021-12-14 = "2021" [Banach_Steinhaus] 2020-05-06 = "2020" 2020-05-11 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Belief_Revision] 2021-10-22 = "2021" 2021-12-14 = "2021" [Bell_Numbers_Spivey] 2016-05-04 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [BenOr_Kozen_Reif] 2021-04-25 = "2021" 2021-12-14 = "2021" [Berlekamp_Zassenhaus] 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2018-09-07 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Bernoulli] 2017-01-24 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Bertrands_Postulate] 2017-01-18 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Bicategory] 2020-01-09 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [BinarySearchTree] 2004-04-20 = "2004" 2004-04-21 = "2004" 2004-09-21 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Binding_Syntax_Theory] 2019-04-08 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Binomial-Heaps] 2010-10-28 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Binomial-Queues] 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [BirdKMP] 2020-09-02 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Blue_Eyes] 2021-02-01 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Bondy] 2012-10-27 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Boolean_Expression_Checkers] 2014-06-08 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Bounded_Deducibility_Security] 2014-04-24 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Buchi_Complementation] 2017-10-27 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Budan_Fourier] 2018-09-04 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Buffons_Needle] 2017-06-06 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Buildings] 2016-07-01 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [BytecodeLogicJmlTypes] 2008-12-22 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [C2KA_DistributedSystems] 2019-08-06 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [CAVA_Automata] 2014-05-29 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [CAVA_LTL_Modelchecker] 2014-05-29 = "2013-2" 2014-05-30 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [CCS] 2012-06-14 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [CISC-Kernel] 2014-07-18 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [CRDT] 2017-07-07 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [CSP_RefTK] 2021-01-12 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [CYK] 2016-04-27 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [CZH_Elementary_Categories] 2021-09-14 = "2021" 2021-10-05 = "2021" 2021-12-14 = "2021" [CZH_Foundations] 2021-09-14 = "2021" 2021-10-05 = "2021" 2021-12-14 = "2021" [CZH_Universal_Constructions] 2021-09-14 = "2021" 2021-10-05 = "2021" 2021-12-14 = "2021" [CakeML] 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [CakeML_Codegen] 2019-07-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Call_Arity] 2015-02-20 = "2014" 2015-02-21 = "2014" 2015-05-11 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Card_Equiv_Relations] 2016-05-24 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Card_Multisets] 2016-06-26 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Card_Number_Partitions] 2016-01-14 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Card_Partitions] 2015-12-13 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Cartan_FP] 2016-03-09 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Case_Labeling] 2015-07-24 = "2015" 2015-07-27 = "2015" 2015-08-17 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Catalan_Numbers] 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Category] 2005-04-21 = "2004" 2005-05-01 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Category2] 2010-06-21 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Category3] 2016-06-26 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Cauchy] 2006-03-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Cayley_Hamilton] 2014-09-16 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Certification_Monads] 2014-10-08 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Chandy_Lamport] 2020-08-04 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Chord_Segments] 2016-10-11 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Circus] 2012-05-29 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Clean] 2019-10-16 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [ClockSynchInst] 2006-03-15 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Closest_Pair_Points] 2020-01-14 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [CoCon] 2021-12-14 = "2021" [CoSMeDis] 2021-12-14 = "2021" [CoSMed] 2021-12-14 = "2021" [CofGroups] 2009-08-09 = "2009" 2009-09-05 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Coinductive] 2010-02-14 = "2009-1" 2010-02-15 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Coinductive_Languages] 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Collections] 2009-11-29 = "2009" 2009-12-12 = "2009-1" 2009-12-13 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2011-10-12 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Combinatorics_Words] 2021-05-26 = "2021" 2021-12-14 = "2021" [Combinatorics_Words_Graph_Lemma] 2021-05-26 = "2021" 2021-12-14 = "2021" [Combinatorics_Words_Lyndon] 2021-05-26 = "2021" 2021-12-14 = "2021" [Comparison_Sort_Lower_Bound] 2017-03-16 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Compiling-Exceptions-Correctly] 2004-07-09 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Complete_Non_Orders] 2019-06-28 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Completeness] 2004-09-20 = "2004" 2004-09-21 = "2004" 2005-07-22 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Complex_Bounded_Operators] 2021-09-20 = "2021" 2021-12-14 = "2021" [Complex_Geometry] 2020-01-17 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Complx] 2016-11-29 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [ComponentDependencies] 2014-04-29 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [ConcurrentGC] 2015-04-15 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [ConcurrentIMP] 2015-04-15 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Concurrent_Ref_Alg] 2017-01-04 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Concurrent_Revisions] 2019-01-03 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Conditional_Simplification] 2021-09-14 = "2021" 2021-10-05 = "2021" 2021-12-14 = "2021" [Conditional_Transfer_Rule] 2021-09-14 = "2021" 2021-10-13 = "2021" 2021-12-14 = "2021" [Consensus_Refined] 2015-03-19 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Constructive_Cryptography] 2018-12-19 = "2018" 2018-12-20 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Constructive_Cryptography_CM] 2021-03-18 = "2021" 2021-12-14 = "2021" [Constructor_Funs] 2017-04-20 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Containers] 2013-04-23 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" ["CoreC++"] 2006-05-16 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Core_DOM] 2019-01-07 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Core_SC_DOM] 2020-11-26 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Correctness_Algebras] 2021-10-20 = "2021" 2021-12-14 = "2021" [Count_Complex_Roots] 2017-10-18 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [CryptHOL] 2017-05-11 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [CryptoBasedCompositionalProperties] 2014-01-11 = "2013-2" 2014-01-14 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Cubic_Quartic_Equations] 2021-09-03 = "2021" 2021-12-14 = "2021" [DFS_Framework] 2016-07-05 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-01-14 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [DOM_Components] 2021-02-23 = "2021" 2021-12-14 = "2021" [DPT-SAT-Solver] 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2015-07-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [DataRefinementIBP] 2010-05-28 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Datatype_Order_Generator] 2012-08-07 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Decl_Sem_Fun_PL] 2017-07-24 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Decreasing-Diagrams] 2013-11-18 = "2013-1" 2013-12-02 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Decreasing-Diagrams-II] 2015-08-21 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Deep_Learning] 2016-11-10 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Delta_System_Lemma] 2020-12-28 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Density_Compiler] 2014-10-09 = "2014" 2014-12-22 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Dependent_SIFUM_Refinement] 2016-06-28 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Dependent_SIFUM_Type_Systems] 2016-06-25 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Depth-First-Search] 2004-06-24 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Derangements] 2015-06-28 = "2015" 2015-11-20 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Deriving] 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Descartes_Sign_Rule] 2016-01-05 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Design_Theory] 2021-09-02 = "2021" 2021-12-14 = "2021" [Dict_Construction] 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Differential_Dynamic_Logic] 2017-02-14 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Differential_Game_Logic] 2019-06-24 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Dijkstra_Shortest_Path] 2012-02-10 = "2011-1" 2012-03-15 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-08 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Diophantine_Eqns_Lin_Hom] 2017-10-15 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Dirichlet_L] 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Dirichlet_Series] 2017-10-16 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [DiscretePricing] 2018-07-18 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Discrete_Summation] 2014-04-13 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [DiskPaxos] 2005-06-22 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Dominance_CHK] 2021-09-07 = "2021" 2021-12-14 = "2021" [DynamicArchitectures] 2017-07-31 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Dynamic_Tables] 2015-06-07 = "2015" 2015-06-08 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [E_Transcendental] 2017-01-13 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Echelon_Form] 2015-02-12 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [EdmondsKarp_Maxflow] 2016-08-12 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Efficient-Mergesort] 2011-11-10 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Elliptic_Curves_Group_Law] 2017-03-01 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Encodability_Process_Calculi] 2015-08-11 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Epistemic_Logic] 2018-10-29 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Ergodic_Theory] 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Error_Function] 2018-02-07 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Euler_MacLaurin] 2017-03-14 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Euler_Partition] 2015-11-20 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Extended_Finite_State_Machine_Inference] 2020-09-19 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Extended_Finite_State_Machines] 2020-09-19 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [FFT] 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [FLP] 2016-05-18 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [FOL-Fitting] 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [FOL_Axiomatic] 2021-10-05 = "2021" 2021-12-14 = "2021" [FOL_Harrison] 2017-01-04 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [FOL_Seq_Calc1] 2019-07-18 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Factor_Algebraic_Polynomial] 2021-11-14 = "2021" 2021-12-14 = "2021" [Factored_Transition_System_Bounding] 2018-10-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Falling_Factorial_Sum] 2017-12-30 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Farkas] 2019-01-21 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [FeatherweightJava] 2006-04-05 = "2005" 2006-04-06 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Featherweight_OCL] 2014-01-16 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Fermat3_4] 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [FileRefinement] 2004-12-15 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [FinFun] 2009-05-25 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Finger-Trees] 2010-10-28 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Finite-Map-Extras] 2020-12-02 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Finite_Automata_HF] 2015-02-05 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Finitely_Generated_Abelian_Groups] 2021-07-13 = "2021" 2021-12-14 = "2021" [First_Order_Terms] 2018-02-06 = "2017" 2018-02-07 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [First_Welfare_Theorem] 2017-09-04 = "2016-1" 2017-09-05 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Fishburn_Impossibility] 2018-03-23 = "2017" 2018-06-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Fisher_Yates] 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Flow_Networks] 2017-06-02 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-01-14 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Floyd_Warshall] 2017-05-09 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Flyspeck-Tame] 2007-11-27 = "2007" 2008-01-04 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-25 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-17 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [FocusStreamsCaseStudies] 2013-11-18 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Forcing] 2020-05-06 = "2020" 2020-05-07 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Formal_Puiseux_Series] 2021-02-24 = "2021" 2021-12-14 = "2021" [Formal_SSA] 2016-02-08 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Formula_Derivatives] 2015-05-28 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Foundation_of_geometry] 2021-12-13 = "2021" 2021-12-14 = "2021" [Fourier] 2019-09-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Free-Boolean-Algebra] 2010-03-29 = "2009-1" 2010-06-30 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Free-Groups] 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Fresh_Identifiers] 2021-08-18 = "2021" 2021-12-14 = "2021" [FunWithFunctions] 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [FunWithTilings] 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Functional-Automata] 2004-03-30 = "2003" 2004-04-20 = "2004" 2004-05-21 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Functional_Ordered_Resolution_Prover] 2018-11-29 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Furstenberg_Topology] 2020-03-27 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [GPU_Kernel_PL] 2014-04-06 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Gabow_SCC] 2014-05-29 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [GaleStewart_Games] 2021-04-28 = "2021" 2021-12-14 = "2021" [Game_Based_Crypto] 2017-05-11 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Gauss-Jordan-Elim-Fun] 2011-08-19 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-01-14 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Gauss_Jordan] 2014-09-03 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Gauss_Sums] 2020-01-10 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Gaussian_Integers] 2020-04-30 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [GenClock] 2005-06-24 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [General-Triangle] 2011-04-01 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Generalized_Counting_Sort] 2019-12-09 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Generic_Deriving] 2018-11-21 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Generic_Join] 2019-09-18 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [GewirthPGCProof] 2018-10-31 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Girth_Chromatic] 2012-02-06 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [GoedelGod] 2013-11-18 = "2013-1" 2013-11-19 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Goedel_HFSet_Semantic] 2020-09-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Goedel_HFSet_Semanticless] 2020-09-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Goedel_Incompleteness] 2020-09-18 = "2020" 2020-09-19 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Goodstein_Lambda] 2020-02-24 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [GraphMarkingIBP] 2010-05-28 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-03-15 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Graph_Saturation] 2018-11-28 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Graph_Theory] 2013-05-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Green] 2018-01-12 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Groebner_Bases] 2016-05-02 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Groebner_Macaulay] 2019-06-17 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Gromov_Hyperbolicity] 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Grothendieck_Schemes] 2021-04-09 = "2021" 2021-04-18 = "2021" 2021-12-14 = "2021" [Group-Ring-Module] 2004-05-19 = "2004" 2004-05-20 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-04-30 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [HOL-CSP] 2019-04-29 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [HOLCF-Prelude] 2017-07-15 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [HRB-Slicing] 2009-11-19 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Hahn_Jordan_Decomposition] 2021-11-26 = "2021" 2021-12-14 = "2021" [Heard_Of] 2012-07-30 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Hello_World] 2020-03-23 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [HereditarilyFinite] 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Hermite] 2015-07-07 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Hermite_Lindemann] 2021-03-12 = "2021" 2021-12-14 = "2021" [Hidden_Markov_Models] 2018-05-25 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Higher_Order_Terms] 2019-01-15 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Hoare_Time] 2018-02-26 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Hood_Melville_Queue] 2021-02-23 = "2021" 2021-12-14 = "2021" [HotelKeyCards] 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Huffman] 2008-10-15 = "2008" 2008-10-21 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Hybrid_Logic] 2020-01-07 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Hybrid_Multi_Lane_Spatial_Logic] 2017-11-09 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Hybrid_Systems_VCs] 2019-09-10 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [HyperCTL] 2014-04-16 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [IEEE_Floating_Point] 2013-07-28 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [IFC_Tracking] 2021-04-01 = "2021" 2021-12-14 = "2021" [IMAP-CRDT] 2017-11-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-01-14 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [IMO2019] 2019-08-06 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [IMP2] 2019-01-15 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [IMP2_Binary_Heap] 2019-06-13 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [IMP_Compiler] 2021-06-21 = "2021" 2021-12-14 = "2021" [IP_Addresses] 2016-06-28 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Imperative_Insertion_Sort] 2014-09-25 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Impossible_Geometry] 2012-08-06 = "2012" 2012-08-07 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Incompleteness] 2013-11-17 = "2013-1" 2013-12-02 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Incredible_Proof_Machine] 2016-05-20 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Inductive_Confidentiality] 2012-05-02 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Inductive_Inference] 2020-09-02 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [InfPathElimination] 2016-08-18 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [InformationFlowSlicing] 2010-03-23 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [InformationFlowSlicing_Inter] 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Integration] 2004-11-22 = "2004" 2004-11-23 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Interpreter_Optimizations] 2021-02-23 = "2021" 2021-12-14 = "2021" [Interval_Arithmetic_Word32] 2019-11-28 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Intro_Dest_Elim] 2021-09-14 = "2021" 2021-10-05 = "2021" 2021-12-14 = "2021" [Iptables_Semantics] 2016-09-09 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Irrational_Series_Erdos_Straus] 2020-05-13 = "2020" 2020-05-14 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Irrationality_J_Hancl] 2018-05-26 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [IsaGeoCoq] 2021-02-01 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Isabelle_C] 2019-12-19 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Isabelle_Marries_Dirac] 2020-11-30 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Isabelle_Meta_Model] 2015-09-25 = "2015" 2015-09-28 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Jacobson_Basic_Algebra] 2019-09-01 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Jinja] 2005-10-14 = "2005" 2006-08-08 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [JinjaDCI] 2021-01-13 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [JinjaThreads] 2007-12-03 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-04-30 = "2009" 2009-12-12 = "2009-1" 2010-07-02 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2011-10-12 = "2011-1" 2012-05-26 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-17 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [JiveDataStoreModel] 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Jordan_Hoelder] 2014-09-11 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Jordan_Normal_Form] 2015-08-23 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [KAD] 2016-04-12 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [KAT_and_DRA] 2014-01-29 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [KBPs] 2011-05-19 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [KD_Tree] 2019-06-04 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Key_Agreement_Strong_Adversaries] 2017-02-03 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Kleene_Algebra] 2013-01-16 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Knot_Theory] 2016-01-20 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Knuth_Bendix_Order] 2020-05-15 = "2020" 2020-05-16 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Knuth_Morris_Pratt] 2017-12-18 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Koenigsberg_Friendship] 2013-07-26 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Kruskal] 2019-02-19 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Kuratowski_Closure_Complement] 2017-10-27 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [LLL_Basis_Reduction] 2018-02-03 = "2017" 2018-08-16 = "2018" 2018-09-07 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [LLL_Factorization] 2018-02-07 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [LOFT] 2016-10-21 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [LTL] 2016-03-02 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [LTL_Master_Theorem] 2019-04-17 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [LTL_Normal_Form] 2020-05-09 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [LTL_to_DRA] 2015-09-04 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [LTL_to_GBA] 2014-05-29 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Lam-ml-Normalization] 2010-09-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [LambdaAuth] 2019-05-15 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [LambdaMu] 2017-08-21 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Lambda_Free_EPO] 2018-10-21 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Lambda_Free_KBOs] 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Lambda_Free_RPOs] 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Lambert_W] 2020-04-29 = "2020" 2020-05-12 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Landau_Symbols] 2015-07-15 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Laplace_Transform] 2019-08-16 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Latin_Square] 2015-12-03 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [LatticeProperties] 2011-09-27 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2019-06-28 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Launchbury] 2013-02-24 = "2013" 2013-02-25 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-05-24 = "2013-2" 2014-05-25 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Laws_of_Large_Numbers] 2021-02-11 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Lazy-Lists-II] 2004-04-27 = "2004" 2004-05-21 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Lazy_Case] 2017-04-20 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Lehmer] 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Lifting_Definition_Option] 2014-10-15 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Lifting_the_Exponent] 2021-05-31 = "2021" 2021-12-14 = "2021" [LightweightJava] 2011-03-02 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [LinearQuantifierElim] 2008-01-11 = "2007" 2008-01-24 = "2007" 2008-02-12 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Linear_Inequalities] 2019-06-24 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Linear_Programming] 2019-09-23 = "2019" 2020-04-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Linear_Recurrences] 2017-10-17 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Liouville_Numbers] 2016-01-05 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [List-Index] 2010-02-20 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [List-Infinite] 2011-02-24 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [List_Interleaving] 2015-06-13 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [List_Inversions] 2019-02-21 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [List_Update] 2016-02-22 = "2016" 2016-02-23 = "2016" 2016-10-15 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [LocalLexing] 2017-04-28 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Localization_Ring] 2018-06-17 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Locally-Nameless-Sigma] 2010-05-03 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Logging_Independent_Anonymity] 2021-09-05 = "2021" 2021-12-14 = "2021" [Lowe_Ontological_Argument] 2017-10-16 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Lower_Semicontinuous] 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Lp] 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Lucas_Theorem] 2020-04-21 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [MFMC_Countable] 2016-05-09 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [MFODL_Monitor_Optimized] 2020-04-11 = "2019" 2020-04-12 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [MFOTL_Monitor] 2019-07-05 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [MSO_Regex_Equivalence] 2014-06-12 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Markov_Models] 2012-01-05 = "2011-1" 2012-01-08 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Marriage] 2010-12-17 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Mason_Stothers] 2017-12-22 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Matrices_for_ODEs] 2020-05-09 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Matrix] 2010-06-17 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Matrix_Tensor] 2016-01-18 = "2015" 2016-01-19 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Matroids] 2018-11-20 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Max-Card-Matching] 2011-08-15 = "2011" 2011-08-19 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Median_Of_Medians_Selection] 2017-12-22 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Menger] 2017-02-27 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Mereology] 2021-03-05 = "2021" 2021-12-14 = "2021" [Mersenne_Primes] 2020-01-20 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Metalogic_ProofChecker] 2021-04-28 = "2021" 2021-12-14 = "2021" [MiniML] 2004-03-23 = "2003" 2004-04-20 = "2004" 2004-05-21 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-04-18 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2020-05-06 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [MiniSail] 2021-06-25 = "2021" 2021-12-14 = "2021" [Minimal_SSA] 2017-01-19 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Minkowskis_Theorem] 2017-07-15 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Minsky_Machines] 2018-08-14 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Modal_Logics_for_NTS] 2016-10-25 = "2016" 2016-10-27 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Modular_Assembly_Kit_Security] 2018-05-09 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Modular_arithmetic_LLL_and_HNF_algorithms] 2021-03-14 = "2021" 2021-12-14 = "2021" [Monad_Memo_DP] 2018-05-23 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Monad_Normalisation] 2017-05-11 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [MonoBoolTranAlgebra] 2011-09-27 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [MonoidalCategory] 2017-05-05 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Monomorphic_Monad] 2017-05-11 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [MuchAdoAboutTwo] 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Multi_Party_Computation] 2019-05-10 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Multirelations] 2015-06-13 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Myhill-Nerode] 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Name_Carrying_Type_Inference] 2017-07-15 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Nash_Williams] 2020-06-02 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Nat-Interval-Logic] 2011-02-24 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Native_Word] 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Nested_Multisets_Ordinals] 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Network_Security_Policy_Verification] 2014-07-09 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Neumann_Morgenstern_Utility] 2018-07-04 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [No_FTL_observers] 2016-04-28 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Nominal2] 2013-02-24 = "2013" 2013-11-17 = "2013-1" 2016-04-24 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Noninterference_CSP] 2014-05-24 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2015-06-13 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Noninterference_Concurrent_Composition] 2016-06-13 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Noninterference_Generic_Unwinding] 2015-06-13 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Noninterference_Inductive_Unwinding] 2015-08-19 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Noninterference_Ipurge_Unwinding] 2015-06-13 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Noninterference_Sequential_Composition] 2016-04-26 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [NormByEval] 2008-02-18 = "2007" 2008-02-22 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Nullstellensatz] 2019-06-17 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Octonions] 2018-09-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [OpSets] 2018-05-25 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Open_Induction] 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Optics] 2017-06-01 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" +2022-10-05 = "2021" [Optimal_BST] 2018-05-29 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Orbit_Stabiliser] 2017-08-23 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Order_Lattice_Props] 2018-12-19 = "2018" 2019-06-11 = "2019" 2019-06-28 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Ordered_Resolution_Prover] 2018-01-22 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Ordinal] 2005-11-16 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Ordinal_Partitions] 2020-08-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Ordinals_and_Cardinals] 2009-09-07 = "2009" 2009-09-09 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Ordinary_Differential_Equations] 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [PAC_Checker] 2020-08-31 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [PAL] 2021-11-14 = "2021" 2021-12-14 = "2021" [PCF] 2012-07-03 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [PLM] 2017-09-19 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [POPLmark-deBruijn] 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [PSemigroupsConvolution] 2017-06-13 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Padic_Ints] 2021-05-14 = "2021" 2021-12-14 = "2021" [Pairing_Heap] 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Paraconsistency] 2016-12-08 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Parity_Game] 2015-11-02 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Partial_Function_MR] 2014-02-19 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Partial_Order_Reduction] 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Password_Authentication_Protocol] 2017-01-06 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Pell] 2018-06-25 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Perfect-Number-Thm] 2009-11-24 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Perron_Frobenius] 2016-05-20 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2017-10-18 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Physical_Quantities] 2020-10-28 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Pi_Calculus] 2012-06-14 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Pi_Transcendental] 2018-10-02 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Planarity_Certificates] 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Poincare_Bendixson] 2019-12-18 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Poincare_Disc] 2020-01-17 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Polynomial_Factorization] 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Polynomial_Interpolation] 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Polynomials] 2010-08-11 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-01-14 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Pop_Refinement] 2014-07-03 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Posix-Lexing] 2016-05-24 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Possibilistic_Noninterference] 2012-09-10 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Power_Sum_Polynomials] 2020-04-30 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Pratt_Certificate] 2013-07-29 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Presburger-Automata] 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Prim_Dijkstra_Simple] 2019-06-29 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Prime_Distribution_Elementary] 2019-02-22 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Prime_Harmonic_Series] 2016-01-05 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Prime_Number_Theorem] 2018-09-20 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Priority_Queue_Braun] 2014-09-04 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Priority_Search_Trees] 2019-06-29 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Probabilistic_Noninterference] 2014-03-16 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Probabilistic_Prime_Tests] 2019-02-15 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Probabilistic_System_Zoo] 2015-05-28 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Probabilistic_Timed_Automata] 2018-05-25 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Probabilistic_While] 2017-05-11 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Program-Conflict-Analysis] 2007-12-20 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Progress_Tracking] 2021-04-16 = "2021" 2021-12-14 = "2021" [Projective_Geometry] 2018-06-15 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Projective_Measurements] 2021-03-09 = "2021" 2021-12-14 = "2021" [Promela] 2014-05-29 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Proof_Strategy_Language] 2016-12-21 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [PropResPI] 2016-03-11 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Propositional_Proof_Systems] 2017-06-22 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Prpu_Maxflow] 2017-06-02 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-01-14 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [PseudoHoops] 2011-09-27 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Psi_Calculi] 2012-06-14 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Ptolemys_Theorem] 2016-08-08 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Public_Announcement_Logic] 2021-06-25 = "2021" 2021-12-14 = "2021" [QHLProver] 2019-03-25 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [QR_Decomposition] 2015-02-13 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Quantales] 2018-12-19 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Quaternions] 2018-09-07 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Quick_Sort_Cost] 2017-03-16 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [RIPEMD-160-SPARK] 2011-01-19 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [ROBDD] 2016-04-27 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [RSAPSS] 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Ramsey-Infinite] 2004-09-20 = "2004" 2004-09-21 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Random_BSTs] 2017-04-04 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Random_Graph_Subgraph_Threshold] 2014-02-14 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Randomised_BSTs] 2018-10-19 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Randomised_Social_Choice] 2016-05-05 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Rank_Nullity_Theorem] 2013-01-16 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Real_Impl] 2014-02-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Real_Power] 2021-11-09 = "2021" 2021-12-14 = "2021" [Recursion-Addition] 2020-05-13 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Recursion-Theory-I] 2008-04-11 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Refine_Imperative_HOL] 2016-08-08 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Refine_Monadic] 2012-02-10 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [RefinementReactive] 2014-10-08 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Regex_Equivalence] 2014-01-30 = "2013-2" 2014-08-28 = "2014" 2014-11-30 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Registers] 2021-11-07 = "2021" 2021-12-14 = "2021" [Regression_Test_Selection] 2021-05-03 = "2021" 2021-12-14 = "2021" [Regular-Sets] 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Regular_Algebras] 2014-05-22 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Relation_Algebra] 2014-01-25 = "2013-2" 2014-01-31 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Relational-Incorrectness-Logic] 2020-03-26 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Relational_Disjoint_Set_Forests] 2020-08-26 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Relational_Forests] 2021-08-08 = "2021" 2021-12-14 = "2021" [Relational_Method] 2020-12-07 = "2020" 2020-12-08 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Relational_Minimum_Spanning_Trees] 2020-12-08 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Relational_Paths] 2020-07-28 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Rep_Fin_Groups] 2015-08-12 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Residuated_Lattices] 2015-04-16 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2019-06-28 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Resolution_FOL] 2016-06-30 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Rewriting_Z] 2016-06-30 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Ribbon_Proofs] 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Robbins-Conjecture] 2010-05-27 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Robinson_Arithmetic] 2020-09-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Root_Balanced_Tree] 2017-08-20 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Routing] 2016-08-31 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Roy_Floyd_Warshall] 2014-05-24 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-01-14 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [SATSolverVerification] 2008-07-27 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [SC_DOM_Components] 2020-11-27 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [SDS_Impossibility] 2016-05-05 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [SIFPL] 2008-11-13 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [SIFUM_Type_Systems] 2014-04-24 = "2013-2" 2014-04-25 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [SPARCv8] 2016-10-19 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Safe_Distance] 2020-06-03 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Safe_OCL] 2019-03-14 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Saturation_Framework] 2020-04-10 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Saturation_Framework_Extensions] 2021-02-23 = "2021" 2021-12-14 = "2021" [Schutz_Spacetime] 2021-09-06 = "2021" 2021-12-14 = "2021" [Secondary_Sylow] 2014-01-29 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Security_Protocol_Refinement] 2017-05-25 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Selection_Heap_Sort] 2014-02-18 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [SenSocialChoice] 2008-11-17 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-03-15 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Separata] 2016-11-17 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Separation_Algebra] 2012-05-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Separation_Logic_Imperative_HOL] 2012-11-15 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [SequentInvertibility] 2009-09-01 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Shadow_DOM] 2021-02-23 = "2021" 2021-12-14 = "2021" [Shadow_SC_DOM] 2020-11-26 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Shivers-CFA] 2010-11-17 = "2009-2" 2010-11-18 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [ShortestPath] 2013-05-30 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Show] 2014-08-28 = "2014" 2014-08-29 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Sigma_Commit_Crypto] 2019-10-08 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Signature_Groebner] 2018-09-20 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Simpl] 2008-03-07 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-09-12 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Simple_Firewall] 2016-08-24 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Simplex] 2018-08-27 = "2018" 2019-06-11 = "2019" 2020-01-14 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Simplicial_complexes_and_boolean_functions] 2021-12-13 = "2021" 2021-12-14 = "2021" [SimplifiedOntologicalArgument] 2021-11-26 = "2021" 2021-12-14 = "2021" [Skew_Heap] 2014-08-28 = "2014" 2014-08-29 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Skip_Lists] 2020-01-10 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Slicing] 2008-09-22 = "2008" 2009-04-29 = "2009" 2009-04-30 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Sliding_Window_Algorithm] 2020-04-12 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Smith_Normal_Form] 2020-05-25 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Smooth_Manifolds] 2018-10-23 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Sort_Encodings] 2013-07-01 = "2013" 2013-07-04 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Source_Coding_Theorem] 2016-10-19 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [SpecCheck] 2021-07-08 = "2021" 2021-12-14 = "2021" [Special_Function_Bounds] 2014-08-29 = "2014" 2014-09-05 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Splay_Tree] 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Sqrt_Babylonian] 2013-01-04 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Stable_Matching] 2016-10-24 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Statecharts] 2010-08-18 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Stateful_Protocol_Composition_and_Typing] 2020-05-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Stellar_Quorums] 2019-08-03 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Stern_Brocot] 2015-12-22 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Stewart_Apollonius] 2017-08-01 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Stirling_Formula] 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Stochastic_Matrices] 2017-11-23 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Stone_Algebras] 2016-09-06 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2019-06-28 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Stone_Kleene_Relation_Algebras] 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Stone_Relation_Algebras] 2017-02-09 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Store_Buffer_Reduction] 2019-01-11 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Stream-Fusion] 2009-05-11 = "2009" 2009-05-13 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Stream_Fusion_Code] 2014-10-10 = "2014" 2014-10-13 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Strong_Security] 2014-04-24 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Sturm_Sequences] 2014-01-12 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Sturm_Tarski] 2014-09-20 = "2014" 2014-12-05 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Stuttering_Equivalence] 2012-05-08 = "2011-1" 2012-05-24 = "2012" 2013-02-02 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Subresultants] 2017-04-07 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Subset_Boolean_Algebras] 2020-01-31 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [SumSquares] 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Sunflowers] 2021-03-01 = "2021" 2021-12-14 = "2021" [SuperCalc] 2016-09-06 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Surprise_Paradox] 2016-07-17 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Symmetric_Polynomials] 2018-09-26 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Syntax_Independent_Logic] 2020-09-18 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Szemeredi_Regularity] 2021-11-07 = "2021" 2021-12-14 = "2021" [Szpilrajn] 2019-07-28 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [TESL_Language] 2019-07-31 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [TLA] 2011-11-27 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Tail_Recursive_Functions] 2013-12-02 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2015-06-13 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Tarskis_Geometry] 2012-11-08 = "2012" 2012-11-09 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Taylor_Models] 2018-01-08 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Three_Circles] 2021-09-01 = "2021" 2021-12-14 = "2021" [Timed_Automata] 2016-03-11 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Topological_Semantics] 2020-12-22 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Topology] 2004-04-27 = "2004" 2004-05-21 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [TortoiseHare] 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Transcendence_Series_Hancl_Rucki] 2019-03-28 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Transformer_Semantics] 2018-12-19 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Transition_Systems_and_Automata] 2017-10-27 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Transitive-Closure] 2011-03-14 = "2011" 2011-10-11 = "2011-1" 2011-10-12 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Transitive-Closure-II] 2012-02-29 = "2011-1" 2012-03-15 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Treaps] 2018-02-06 = "2017" 2018-02-07 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Tree-Automata] 2009-11-29 = "2009" 2009-12-12 = "2009-1" 2009-12-13 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2011-10-12 = "2011-1" 2012-03-15 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Tree_Decomposition] 2016-05-31 = "2016" 2016-06-01 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Triangle] 2016-01-05 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Trie] 2015-03-30 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Twelvefold_Way] 2016-12-30 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Tycon] 2012-06-28 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Types_Tableaus_and_Goedels_God] 2017-05-02 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Types_To_Sets_Extension] 2021-09-14 = "2021" 2021-10-05 = "2021" 2021-12-14 = "2021" [UPF] 2014-11-30 = "2014" 2015-01-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [UPF_Firewall] 2017-01-11 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [UTP] 2019-02-06 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Universal_Turing_Machine] 2019-02-12 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [UpDown_Scheme] 2015-01-30 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Valuation] 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-04-30 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-08 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Van_Emde_Boas_Trees] 2021-11-26 = "2021" 2021-12-14 = "2021" [Van_der_Waerden] 2021-06-23 = "2021" 2021-12-14 = "2021" [VectorSpace] 2014-08-29 = "2014" 2014-08-31 = "2014" 2014-09-07 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [VeriComp] 2020-02-25 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Verified-Prover] 2004-09-28 = "2004" 2005-10-14 = "2005" 2007-11-27 = "2007" 2008-06-10 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-03-02 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Verified_SAT_Based_AI_Planning] 2020-11-03 = "2020" 2020-11-13 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [VerifyThis2018] 2018-04-30 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [VerifyThis2019] 2019-10-25 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Vickrey_Clarke_Groves] 2015-04-30 = "2014" 2015-05-09 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Virtual_Substitution] 2021-10-19 = "2021" 2021-12-14 = "2021" [VolpanoSmith] 2008-09-05 = "2008" 2009-04-29 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [WHATandWHERE_Security] 2014-04-24 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [WOOT_Strong_Eventual_Consistency] 2020-03-26 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [WebAssembly] 2018-04-29 = "2017" 2018-04-30 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Weight_Balanced_Trees] 2018-03-13 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Weighted_Path_Order] 2021-09-26 = "2021" 2021-12-14 = "2021" [Well_Quasi_Orders] 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Winding_Number_Eval] 2017-10-18 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Word_Lib] 2016-06-09 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [WorkerWrapper] 2009-10-30 = "2009" 2009-10-31 = "2009" 2009-12-12 = "2009-1" 2010-07-01 = "2009-2" 2011-02-11 = "2011" 2011-10-11 = "2011-1" 2012-05-24 = "2012" 2013-02-16 = "2013" 2013-11-17 = "2013-1" 2013-12-11 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [X86_Semantics] 2021-10-31 = "2021" 2021-12-14 = "2021" [XML] 2014-10-08 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [ZFC_in_HOL] 2019-11-04 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Zeta_3_Irrational] 2019-12-28 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [Zeta_Function] 2017-10-16 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" [pGCL] 2014-07-13 = "2013-2" 2014-08-28 = "2014" 2015-05-27 = "2015" 2016-02-22 = "2016" 2016-12-17 = "2016-1" 2017-10-10 = "2017" 2018-08-16 = "2018" 2019-06-11 = "2019" 2020-04-20 = "2020" 2021-02-23 = "2021" 2021-12-14 = "2021" diff --git a/thys/Optics/Lens_Algebra.thy b/thys/Optics/Lens_Algebra.thy --- a/thys/Optics/Lens_Algebra.thy +++ b/thys/Optics/Lens_Algebra.thy @@ -1,418 +1,419 @@ section \Lens Algebraic Operators\ theory Lens_Algebra imports Lens_Laws begin subsection \Lens Composition, Plus, Unit, and Identity\ text \ \begin{figure} \begin{center} \includegraphics[width=7cm]{figures/Composition} \end{center} \vspace{-5ex} \caption{Lens Composition} \label{fig:Comp} \end{figure} We introduce the algebraic lens operators; for more information please see our paper~\cite{Foster16a}. Lens composition, illustrated in Figure~\ref{fig:Comp}, constructs a lens by composing the source of one lens with the view of another.\ definition lens_comp :: "('a \ 'b) \ ('b \ 'c) \ ('a \ 'c)" (infixl ";\<^sub>L" 80) where [lens_defs]: "lens_comp Y X = \ lens_get = get\<^bsub>Y\<^esub> \ lens_get X , lens_put = (\ \ v. lens_put X \ (lens_put Y (lens_get X \) v)) \" text \ \begin{figure} \begin{center} \includegraphics[width=7cm]{figures/Sum} \end{center} \vspace{-5ex} \caption{Lens Sum} \label{fig:Sum} \end{figure} Lens plus, as illustrated in Figure~\ref{fig:Sum} parallel composes two independent lenses, resulting in a lens whose view is the product of the two underlying lens views.\ definition lens_plus :: "('a \ 'c) \ ('b \ 'c) \ 'a \ 'b \ 'c" (infixr "+\<^sub>L" 75) where [lens_defs]: "X +\<^sub>L Y = \ lens_get = (\ \. (lens_get X \, lens_get Y \)) , lens_put = (\ \ (u, v). lens_put X (lens_put Y \ v) u) \" text \The product functor lens similarly parallel composes two lenses, but in this case the lenses have different sources and so the resulting source is also a product.\ definition lens_prod :: "('a \ 'c) \ ('b \ 'd) \ ('a \ 'b \ 'c \ 'd)" (infixr "\\<^sub>L" 85) where [lens_defs]: "lens_prod X Y = \ lens_get = map_prod get\<^bsub>X\<^esub> get\<^bsub>Y\<^esub> , lens_put = \ (u, v) (x, y). (put\<^bsub>X\<^esub> u x, put\<^bsub>Y\<^esub> v y) \" text \The $\lfst$ and $\lsnd$ lenses project the first and second elements, respectively, of a product source type.\ definition fst_lens :: "'a \ 'a \ 'b" ("fst\<^sub>L") where [lens_defs]: "fst\<^sub>L = \ lens_get = fst, lens_put = (\ (\, \) u. (u, \)) \" definition snd_lens :: "'b \ 'a \ 'b" ("snd\<^sub>L") where [lens_defs]: "snd\<^sub>L = \ lens_get = snd, lens_put = (\ (\, \) u. (\, u)) \" lemma get_fst_lens [simp]: "get\<^bsub>fst\<^sub>L\<^esub> (x, y) = x" by (simp add: fst_lens_def) lemma get_snd_lens [simp]: "get\<^bsub>snd\<^sub>L\<^esub> (x, y) = y" by (simp add: snd_lens_def) text \The swap lens is a bijective lens which swaps over the elements of the product source type.\ abbreviation swap_lens :: "'a \ 'b \ 'b \ 'a" ("swap\<^sub>L") where "swap\<^sub>L \ snd\<^sub>L +\<^sub>L fst\<^sub>L" text \The zero lens is an ineffectual lens whose view is a unit type. This means the zero lens cannot distinguish or change the source type.\ definition zero_lens :: "unit \ 'a" ("0\<^sub>L") where [lens_defs]: "0\<^sub>L = \ lens_get = (\ _. ()), lens_put = (\ \ x. \) \" text \The identity lens is a bijective lens where the source and view type are the same.\ definition id_lens :: "'a \ 'a" ("1\<^sub>L") where [lens_defs]: "1\<^sub>L = \ lens_get = id, lens_put = (\ _. id) \" text \The quotient operator $X \lquot Y$ shortens lens $X$ by cutting off $Y$ from the end. It is thus the dual of the composition operator.\ definition lens_quotient :: "('a \ 'c) \ ('b \ 'c) \ 'a \ 'b" (infixr "'/\<^sub>L" 90) where [lens_defs]: "X /\<^sub>L Y = \ lens_get = \ \. get\<^bsub>X\<^esub> (create\<^bsub>Y\<^esub> \) , lens_put = \ \ v. get\<^bsub>Y\<^esub> (put\<^bsub>X\<^esub> (create\<^bsub>Y\<^esub> \) v) \" text \Lens inverse take a bijective lens and swaps the source and view types.\ definition lens_inv :: "('a \ 'b) \ ('b \ 'a)" ("inv\<^sub>L") where [lens_defs]: "lens_inv x = \ lens_get = create\<^bsub>x\<^esub>, lens_put = \ \. get\<^bsub>x\<^esub> \" subsection \Closure Poperties\ text \We show that the core lenses combinators defined above are closed under the key lens classes.\ lemma id_wb_lens: "wb_lens 1\<^sub>L" by (unfold_locales, simp_all add: id_lens_def) lemma source_id_lens: "\\<^bsub>1\<^sub>L\<^esub> = UNIV" by (simp add: id_lens_def lens_source_def) lemma unit_wb_lens: "wb_lens 0\<^sub>L" by (unfold_locales, simp_all add: zero_lens_def) lemma source_zero_lens: "\\<^bsub>0\<^sub>L\<^esub> = UNIV" by (simp_all add: zero_lens_def lens_source_def) lemma comp_weak_lens: "\ weak_lens x; weak_lens y \ \ weak_lens (x ;\<^sub>L y)" by (unfold_locales, simp_all add: lens_comp_def) lemma comp_wb_lens: "\ wb_lens x; wb_lens y \ \ wb_lens (x ;\<^sub>L y)" by (unfold_locales, auto simp add: lens_comp_def wb_lens_def weak_lens.put_closure) lemma comp_mwb_lens: "\ mwb_lens x; mwb_lens y \ \ mwb_lens (x ;\<^sub>L y)" by (unfold_locales, auto simp add: lens_comp_def mwb_lens_def weak_lens.put_closure) lemma source_lens_comp: "\ mwb_lens x; mwb_lens y \ \ \\<^bsub>x ;\<^sub>L y\<^esub> = {s \ \\<^bsub>y\<^esub>. get\<^bsub>y\<^esub> s \ \\<^bsub>x\<^esub>}" by (auto simp add: lens_comp_def lens_source_def, blast, metis mwb_lens.put_put mwb_lens_def weak_lens.put_get) lemma id_vwb_lens [simp]: "vwb_lens 1\<^sub>L" by (unfold_locales, simp_all add: id_lens_def) lemma unit_vwb_lens [simp]: "vwb_lens 0\<^sub>L" by (unfold_locales, simp_all add: zero_lens_def) lemma comp_vwb_lens: "\ vwb_lens x; vwb_lens y \ \ vwb_lens (x ;\<^sub>L y)" by (unfold_locales, simp_all add: lens_comp_def weak_lens.put_closure) lemma unit_ief_lens: "ief_lens 0\<^sub>L" by (unfold_locales, simp_all add: zero_lens_def) text \Lens plus requires that the lenses be independent to show closure.\ lemma plus_mwb_lens: assumes "mwb_lens x" "mwb_lens y" "x \ y" shows "mwb_lens (x +\<^sub>L y)" using assms apply (unfold_locales) apply (simp_all add: lens_plus_def prod.case_eq_if lens_indep_sym) apply (simp add: lens_indep_comm) done lemma plus_wb_lens: assumes "wb_lens x" "wb_lens y" "x \ y" shows "wb_lens (x +\<^sub>L y)" using assms apply (unfold_locales, simp_all add: lens_plus_def) apply (simp add: lens_indep_sym prod.case_eq_if) done lemma plus_vwb_lens [simp]: assumes "vwb_lens x" "vwb_lens y" "x \ y" shows "vwb_lens (x +\<^sub>L y)" using assms apply (unfold_locales, simp_all add: lens_plus_def) apply (simp add: lens_indep_sym prod.case_eq_if) apply (simp add: lens_indep_comm prod.case_eq_if) done lemma source_plus_lens: assumes "mwb_lens x" "mwb_lens y" "x \ y" shows "\\<^bsub>x +\<^sub>L y\<^esub> = \\<^bsub>x\<^esub> \ \\<^bsub>y\<^esub>" apply (auto simp add: lens_source_def lens_plus_def) apply (meson assms(3) lens_indep_comm) apply (metis assms(1) mwb_lens.weak_get_put mwb_lens_weak weak_lens.put_closure) done lemma prod_mwb_lens: "\ mwb_lens X; mwb_lens Y \ \ mwb_lens (X \\<^sub>L Y)" by (unfold_locales, simp_all add: lens_prod_def prod.case_eq_if) lemma prod_wb_lens: "\ wb_lens X; wb_lens Y \ \ wb_lens (X \\<^sub>L Y)" by (unfold_locales, simp_all add: lens_prod_def prod.case_eq_if) lemma prod_vwb_lens: "\ vwb_lens X; vwb_lens Y \ \ vwb_lens (X \\<^sub>L Y)" by (unfold_locales, simp_all add: lens_prod_def prod.case_eq_if) lemma prod_bij_lens: "\ bij_lens X; bij_lens Y \ \ bij_lens (X \\<^sub>L Y)" by (unfold_locales, simp_all add: lens_prod_def prod.case_eq_if) lemma fst_vwb_lens: "vwb_lens fst\<^sub>L" by (unfold_locales, simp_all add: fst_lens_def prod.case_eq_if) lemma snd_vwb_lens: "vwb_lens snd\<^sub>L" by (unfold_locales, simp_all add: snd_lens_def prod.case_eq_if) lemma id_bij_lens: "bij_lens 1\<^sub>L" by (unfold_locales, simp_all add: id_lens_def) lemma inv_id_lens: "inv\<^sub>L 1\<^sub>L = 1\<^sub>L" by (auto simp add: lens_inv_def id_lens_def lens_create_def) lemma inv_inv_lens: "bij_lens X \ inv\<^sub>L (inv\<^sub>L X) = X" apply (cases X) apply (auto simp add: lens_defs fun_eq_iff) apply (metis (no_types) bij_lens.strong_get_put bij_lens_def select_convs(2) weak_lens.put_get) done lemma lens_inv_bij: "bij_lens X \ bij_lens (inv\<^sub>L X)" by (unfold_locales, simp_all add: lens_inv_def lens_create_def) lemma swap_bij_lens: "bij_lens swap\<^sub>L" by (unfold_locales, simp_all add: lens_plus_def prod.case_eq_if fst_lens_def snd_lens_def) subsection \Composition Laws\ text \Lens composition is monoidal, with unit @{term "1\<^sub>L"}, as the following theorems demonstrate. It also has @{term "0\<^sub>L"} as a right annihilator. \ lemma lens_comp_assoc: "X ;\<^sub>L (Y ;\<^sub>L Z) = (X ;\<^sub>L Y) ;\<^sub>L Z" by (auto simp add: lens_comp_def) lemma lens_comp_left_id [simp]: "1\<^sub>L ;\<^sub>L X = X" by (simp add: id_lens_def lens_comp_def) lemma lens_comp_right_id [simp]: "X ;\<^sub>L 1\<^sub>L = X" by (simp add: id_lens_def lens_comp_def) lemma lens_comp_anhil [simp]: "wb_lens X \ 0\<^sub>L ;\<^sub>L X = 0\<^sub>L" by (simp add: zero_lens_def lens_comp_def comp_def) lemma lens_comp_anhil_right [simp]: "wb_lens X \ X ;\<^sub>L 0\<^sub>L = 0\<^sub>L" by (simp add: zero_lens_def lens_comp_def comp_def) subsection \Independence Laws\ text \The zero lens @{term "0\<^sub>L"} is independent of any lens. This is because nothing can be observed or changed using @{term "0\<^sub>L"}. \ lemma zero_lens_indep [simp]: "0\<^sub>L \ X" by (auto simp add: zero_lens_def lens_indep_def) lemma zero_lens_indep' [simp]: "X \ 0\<^sub>L" by (auto simp add: zero_lens_def lens_indep_def) text \Lens independence is irreflexive, but only for effectual lenses as otherwise nothing can be observed.\ lemma lens_indep_quasi_irrefl: "\ wb_lens x; eff_lens x \ \ \ (x \ x)" - by (auto simp add: lens_indep_def ief_lens_def ief_lens_axioms_def, metis (full_types) wb_lens.get_put) + unfolding lens_indep_def ief_lens_def ief_lens_axioms_def + by (simp, metis (full_types) wb_lens.get_put) text \Lens independence is a congruence with respect to composition, as the following properties demonstrate.\ lemma lens_indep_left_comp [simp]: "\ mwb_lens z; x \ y \ \ (x ;\<^sub>L z) \ (y ;\<^sub>L z)" apply (rule lens_indepI) apply (auto simp add: lens_comp_def) apply (simp add: lens_indep_comm) apply (simp add: lens_indep_sym) done lemma lens_indep_right_comp: "y \ z \ (x ;\<^sub>L y) \ (x ;\<^sub>L z)" apply (auto intro!: lens_indepI simp add: lens_comp_def) using lens_indep_comm lens_indep_sym apply fastforce apply (simp add: lens_indep_sym) done lemma lens_indep_left_ext [intro]: "y \ z \ (x ;\<^sub>L y) \ z" apply (auto intro!: lens_indepI simp add: lens_comp_def) apply (simp add: lens_indep_comm) apply (simp add: lens_indep_sym) done lemma lens_indep_right_ext [intro]: "x \ z \ x \ (y ;\<^sub>L z)" by (simp add: lens_indep_left_ext lens_indep_sym) lemma lens_comp_indep_cong_left: "\ mwb_lens Z; X ;\<^sub>L Z \ Y ;\<^sub>L Z \ \ X \ Y" apply (rule lens_indepI) apply (rename_tac u v \) apply (drule_tac u=u and v=v and \="create\<^bsub>Z\<^esub> \" in lens_indep_comm) apply (simp add: lens_comp_def) apply (meson mwb_lens_weak weak_lens.view_determination) apply (rename_tac v \) apply (drule_tac v=v and \="create\<^bsub>Z\<^esub> \" in lens_indep_get) apply (simp add: lens_comp_def) apply (drule lens_indep_sym) apply (rename_tac u \) apply (drule_tac v=u and \="create\<^bsub>Z\<^esub> \" in lens_indep_get) apply (simp add: lens_comp_def) done lemma lens_comp_indep_cong: "mwb_lens Z \ (X ;\<^sub>L Z) \ (Y ;\<^sub>L Z) \ X \ Y" using lens_comp_indep_cong_left lens_indep_left_comp by blast text \The first and second lenses are independent since the view different parts of a product source.\ lemma fst_snd_lens_indep [simp]: "fst\<^sub>L \ snd\<^sub>L" by (simp add: lens_indep_def fst_lens_def snd_lens_def) lemma snd_fst_lens_indep [simp]: "snd\<^sub>L \ fst\<^sub>L" by (simp add: lens_indep_def fst_lens_def snd_lens_def) lemma split_prod_lens_indep: assumes "mwb_lens X" shows "(fst\<^sub>L ;\<^sub>L X) \ (snd\<^sub>L ;\<^sub>L X)" using assms fst_snd_lens_indep lens_indep_left_comp vwb_lens_mwb by blast text \Lens independence is preserved by summation.\ lemma plus_pres_lens_indep [simp]: "\ X \ Z; Y \ Z \ \ (X +\<^sub>L Y) \ Z" apply (rule lens_indepI) apply (simp_all add: lens_plus_def prod.case_eq_if) apply (simp add: lens_indep_comm) apply (simp add: lens_indep_sym) done lemma plus_pres_lens_indep' [simp]: "\ X \ Y; X \ Z \ \ X \ Y +\<^sub>L Z" by (auto intro: lens_indep_sym plus_pres_lens_indep) text \Lens independence is preserved by product.\ lemma lens_indep_prod: "\ X\<^sub>1 \ X\<^sub>2; Y\<^sub>1 \ Y\<^sub>2 \ \ X\<^sub>1 \\<^sub>L Y\<^sub>1 \ X\<^sub>2 \\<^sub>L Y\<^sub>2" apply (rule lens_indepI) apply (auto simp add: lens_prod_def prod.case_eq_if lens_indep_comm map_prod_def) apply (simp_all add: lens_indep_sym) done subsection \ Compatibility Laws \ lemma zero_lens_compat [simp]: "0\<^sub>L ##\<^sub>L X" by (auto simp add: zero_lens_def lens_override_def lens_compat_def) lemma id_lens_compat [simp]: "vwb_lens X \ 1\<^sub>L ##\<^sub>L X" by (auto simp add: id_lens_def lens_override_def lens_compat_def) subsection \Algebraic Laws\ text \Lens plus distributes to the right through composition.\ lemma plus_lens_distr: "mwb_lens Z \ (X +\<^sub>L Y) ;\<^sub>L Z = (X ;\<^sub>L Z) +\<^sub>L (Y ;\<^sub>L Z)" by (auto simp add: lens_comp_def lens_plus_def comp_def) text \The first lens projects the first part of a summation.\ lemma fst_lens_plus: "wb_lens y \ fst\<^sub>L ;\<^sub>L (x +\<^sub>L y) = x" by (simp add: fst_lens_def lens_plus_def lens_comp_def comp_def) text \The second law requires independence as we have to apply x first, before y\ lemma snd_lens_plus: "\ wb_lens x; x \ y \ \ snd\<^sub>L ;\<^sub>L (x +\<^sub>L y) = y" apply (simp add: snd_lens_def lens_plus_def lens_comp_def comp_def) apply (subst lens_indep_comm) apply (simp_all) done text \The swap lens switches over a summation.\ lemma lens_plus_swap: "X \ Y \ swap\<^sub>L ;\<^sub>L (X +\<^sub>L Y) = (Y +\<^sub>L X)" by (auto simp add: lens_plus_def fst_lens_def snd_lens_def id_lens_def lens_comp_def lens_indep_comm) text \The first, second, and swap lenses are all closely related.\ lemma fst_snd_id_lens: "fst\<^sub>L +\<^sub>L snd\<^sub>L = 1\<^sub>L" by (auto simp add: lens_plus_def fst_lens_def snd_lens_def id_lens_def) lemma swap_lens_idem: "swap\<^sub>L ;\<^sub>L swap\<^sub>L = 1\<^sub>L" by (simp add: fst_snd_id_lens lens_indep_sym lens_plus_swap) lemma swap_lens_fst: "fst\<^sub>L ;\<^sub>L swap\<^sub>L = snd\<^sub>L" by (simp add: fst_lens_plus fst_vwb_lens) lemma swap_lens_snd: "snd\<^sub>L ;\<^sub>L swap\<^sub>L = fst\<^sub>L" by (simp add: lens_indep_sym snd_lens_plus snd_vwb_lens) text \The product lens can be rewritten as a sum lens.\ lemma prod_as_plus: "X \\<^sub>L Y = X ;\<^sub>L fst\<^sub>L +\<^sub>L Y ;\<^sub>L snd\<^sub>L" by (auto simp add: lens_prod_def fst_lens_def snd_lens_def lens_comp_def lens_plus_def) lemma prod_lens_id_equiv: "1\<^sub>L \\<^sub>L 1\<^sub>L = 1\<^sub>L" by (auto simp add: lens_prod_def id_lens_def) lemma prod_lens_comp_plus: "X\<^sub>2 \ Y\<^sub>2 \ ((X\<^sub>1 \\<^sub>L Y\<^sub>1) ;\<^sub>L (X\<^sub>2 +\<^sub>L Y\<^sub>2)) = (X\<^sub>1 ;\<^sub>L X\<^sub>2) +\<^sub>L (Y\<^sub>1 ;\<^sub>L Y\<^sub>2)" by (auto simp add: lens_comp_def lens_plus_def lens_prod_def prod.case_eq_if fun_eq_iff) text \The following laws about quotient are similar to their arithmetic analogues. Lens quotient reverse the effect of a composition.\ lemma lens_comp_quotient: "weak_lens Y \ (X ;\<^sub>L Y) /\<^sub>L Y = X" by (simp add: lens_quotient_def lens_comp_def) lemma lens_quotient_id [simp]: "weak_lens X \ (X /\<^sub>L X) = 1\<^sub>L" by (force simp add: lens_quotient_def id_lens_def) lemma lens_quotient_id_denom: "X /\<^sub>L 1\<^sub>L = X" by (simp add: lens_quotient_def id_lens_def lens_create_def) lemma lens_quotient_unit: "weak_lens X \ (0\<^sub>L /\<^sub>L X) = 0\<^sub>L" by (simp add: lens_quotient_def zero_lens_def) lemma lens_obs_eq_zero: "s\<^sub>1 \\<^bsub>0\<^sub>L\<^esub> s\<^sub>2 = (s\<^sub>1 = s\<^sub>2)" by (simp add: lens_defs) lemma lens_obs_eq_one: "s\<^sub>1 \\<^bsub>1\<^sub>L\<^esub> s\<^sub>2" by (simp add: lens_defs) lemma lens_obs_eq_as_override: "vwb_lens X \ s\<^sub>1 \\<^bsub>X\<^esub> s\<^sub>2 \ (s\<^sub>2 = s\<^sub>1 \\<^sub>L s\<^sub>2 on X)" by (auto simp add: lens_defs; metis vwb_lens.put_eq) end \ No newline at end of file diff --git a/thys/Optics/Lens_Instances.thy b/thys/Optics/Lens_Instances.thy --- a/thys/Optics/Lens_Instances.thy +++ b/thys/Optics/Lens_Instances.thy @@ -1,373 +1,414 @@ section \Lens Instances\ theory Lens_Instances - imports Lens_Order Lens_Symmetric "HOL-Eisbach.Eisbach" + imports Lens_Order Lens_Symmetric Scene_Spaces "HOL-Eisbach.Eisbach" "HOL-Library.Stream" keywords "alphabet" "statespace" :: "thy_defn" begin text \In this section we define a number of concrete instantiations of the lens locales, including functions lenses, list lenses, and record lenses.\ subsection \Function Lens\ text \A function lens views the valuation associated with a particular domain element @{typ "'a"}. We require that range type of a lens function has cardinality of at least 2; this ensures that properties of independence are provable.\ definition fun_lens :: "'a \ ('b::two \ ('a \ 'b))" where [lens_defs]: "fun_lens x = \ lens_get = (\ f. f x), lens_put = (\ f u. f(x := u)) \" lemma fun_vwb_lens: "vwb_lens (fun_lens x)" by (unfold_locales, simp_all add: fun_lens_def) text \Two function lenses are independent if and only if the domain elements are different.\ lemma fun_lens_indep: "fun_lens x \ fun_lens y \ x \ y" proof - obtain u v :: "'a::two" where "u \ v" using two_diff by auto thus ?thesis by (auto simp add: fun_lens_def lens_indep_def) qed subsection \Function Range Lens\ text \The function range lens allows us to focus on a particular region of a function's range.\ definition fun_ran_lens :: "('c \ 'b) \ (('a \ 'b) \ '\) \ (('a \ 'c) \ '\)" where [lens_defs]: "fun_ran_lens X Y = \ lens_get = \ s. get\<^bsub>X\<^esub> \ get\<^bsub>Y\<^esub> s , lens_put = \ s v. put\<^bsub>Y\<^esub> s (\ x::'a. put\<^bsub>X\<^esub> (get\<^bsub>Y\<^esub> s x) (v x)) \" lemma fun_ran_mwb_lens: "\ mwb_lens X; mwb_lens Y \ \ mwb_lens (fun_ran_lens X Y)" by (unfold_locales, auto simp add: fun_ran_lens_def) lemma fun_ran_wb_lens: "\ wb_lens X; wb_lens Y \ \ wb_lens (fun_ran_lens X Y)" by (unfold_locales, auto simp add: fun_ran_lens_def) lemma fun_ran_vwb_lens: "\ vwb_lens X; vwb_lens Y \ \ vwb_lens (fun_ran_lens X Y)" by (unfold_locales, auto simp add: fun_ran_lens_def) subsection \Map Lens\ text \The map lens allows us to focus on a particular region of a partial function's range. It is only a mainly well-behaved lens because it does not satisfy the PutGet law when the view is not in the domain.\ definition map_lens :: "'a \ ('b \ ('a \ 'b))" where [lens_defs]: "map_lens x = \ lens_get = (\ f. the (f x)), lens_put = (\ f u. f(x \ u)) \" lemma map_mwb_lens: "mwb_lens (map_lens x)" by (unfold_locales, simp_all add: map_lens_def) lemma source_map_lens: "\\<^bsub>map_lens x\<^esub> = {f. x \ dom(f)}" by (force simp add: map_lens_def lens_source_def) +lemma pget_map_lens: "pget\<^bsub>map_lens k\<^esub> f = f k" + by (auto simp add: lens_partial_get_def source_map_lens) + (auto simp add: map_lens_def, metis not_Some_eq) + subsection \List Lens\ text \The list lens allows us to view a particular element of a list. In order to show it is mainly well-behaved we need to define to additional list functions. The following function adds a number undefined elements to the end of a list.\ definition list_pad_out :: "'a list \ nat \ 'a list" where "list_pad_out xs k = xs @ replicate (k + 1 - length xs) undefined" text \The following function is like @{term "list_update"} but it adds additional elements to the list if the list isn't long enough first.\ definition list_augment :: "'a list \ nat \ 'a \ 'a list" where "list_augment xs k v = (list_pad_out xs k)[k := v]" text \The following function is like @{term nth} but it expressly returns @{term undefined} when the list isn't long enough.\ definition nth' :: "'a list \ nat \ 'a" where "nth' xs i = (if (length xs > i) then xs ! i else undefined)" text \We can prove some additional laws about list update and append.\ lemma list_update_append_lemma1: "i < length xs \ xs[i := v] @ ys = (xs @ ys)[i := v]" by (simp add: list_update_append) lemma list_update_append_lemma2: "i < length ys \ xs @ ys[i := v] = (xs @ ys)[i + length xs := v]" by (simp add: list_update_append) text \We can also prove some laws about our new operators.\ lemma nth'_0 [simp]: "nth' (x # xs) 0 = x" by (simp add: nth'_def) lemma nth'_Suc [simp]: "nth' (x # xs) (Suc n) = nth' xs n" by (simp add: nth'_def) lemma list_augment_0 [simp]: "list_augment (x # xs) 0 y = y # xs" by (simp add: list_augment_def list_pad_out_def) lemma list_augment_Suc [simp]: "list_augment (x # xs) (Suc n) y = x # list_augment xs n y" by (simp add: list_augment_def list_pad_out_def) lemma list_augment_twice: "list_augment (list_augment xs i u) j v = (list_pad_out xs (max i j))[i:=u, j:=v]" apply (auto simp add: list_augment_def list_pad_out_def list_update_append_lemma1 replicate_add[THEN sym] max_def) apply (metis Suc_le_mono add.commute diff_diff_add diff_le_mono le_add_diff_inverse2) done lemma list_augment_last [simp]: "list_augment (xs @ [y]) (length xs) z = xs @ [z]" by (induct xs, simp_all) lemma list_augment_idem [simp]: "i < length xs \ list_augment xs i (xs ! i) = xs" by (simp add: list_augment_def list_pad_out_def) text \We can now prove that @{term list_augment} is commutative for different (arbitrary) indices.\ lemma list_augment_commute: "i \ j \ list_augment (list_augment \ j v) i u = list_augment (list_augment \ i u) j v" by (simp add: list_augment_twice list_update_swap max.commute) text \We can also prove that we can always retrieve an element we have added to the list, since @{term list_augment} extends the list when necessary. This isn't true of @{term list_update}. \ lemma nth_list_augment: "list_augment xs k v ! k = v" by (simp add: list_augment_def list_pad_out_def) lemma nth'_list_augment: "nth' (list_augment xs k v) k = v" by (auto simp add: nth'_def nth_list_augment list_augment_def list_pad_out_def) text \ The length is expanded if not already long enough, or otherwise left as it is. \ lemma length_list_augment_1: "k \ length xs \ length (list_augment xs k v) = Suc k" by (simp add: list_augment_def list_pad_out_def) lemma length_list_augment_2: "k < length xs \ length (list_augment xs k v) = length xs" by (simp add: list_augment_def list_pad_out_def) text \We also have it that @{term list_augment} cancels itself.\ lemma list_augment_same_twice: "list_augment (list_augment xs k u) k v = list_augment xs k v" by (simp add: list_augment_def list_pad_out_def) lemma nth'_list_augment_diff: "i \ j \ nth' (list_augment \ i v) j = nth' \ j" by (auto simp add: list_augment_def list_pad_out_def nth_append nth'_def) text \The definition of @{const list_augment} is not good for code generation, since it produces undefined values even when padding out is not required. Here, we defined a code equation that avoids this.\ lemma list_augment_code [code]: "list_augment xs k v = (if (k < length xs) then list_update xs k v else list_update (list_pad_out xs k) k v)" by (simp add:list_pad_out_def list_augment_def) text \Finally we can create the list lenses, of which there are three varieties. One that allows us to view an index, one that allows us to view the head, and one that allows us to view the tail. They are all mainly well-behaved lenses.\ definition list_lens :: "nat \ ('a::two \ 'a list)" where [lens_defs]: "list_lens i = \ lens_get = (\ xs. nth' xs i) , lens_put = (\ xs x. list_augment xs i x) \" abbreviation hd_lens ("hd\<^sub>L") where "hd_lens \ list_lens 0" definition tl_lens :: "'a list \ 'a list" ("tl\<^sub>L") where [lens_defs]: "tl_lens = \ lens_get = (\ xs. tl xs) , lens_put = (\ xs xs'. hd xs # xs') \" lemma list_mwb_lens: "mwb_lens (list_lens x)" by (unfold_locales, simp_all add: list_lens_def nth'_list_augment list_augment_same_twice) text \ The set of constructible sources is precisely those where the length is greater than the given index. \ lemma source_list_lens: "\\<^bsub>list_lens i\<^esub> = {xs. length xs > i}" apply (auto simp add: lens_source_def list_lens_def) apply (metis length_list_augment_1 length_list_augment_2 lessI not_less) apply (metis list_augment_idem) done lemma tail_lens_mwb: "mwb_lens tl\<^sub>L" by (unfold_locales, simp_all add: tl_lens_def) lemma source_tail_lens: "\\<^bsub>tl\<^sub>L\<^esub> = {xs. xs \ []}" using list.exhaust_sel by (auto simp add: tl_lens_def lens_source_def) text \Independence of list lenses follows when the two indices are different.\ lemma list_lens_indep: "i \ j \ list_lens i \ list_lens j" by (simp add: list_lens_def lens_indep_def list_augment_commute nth'_list_augment_diff) lemma hd_tl_lens_indep [simp]: "hd\<^sub>L \ tl\<^sub>L" apply (rule lens_indepI) apply (simp_all add: list_lens_def tl_lens_def) apply (metis hd_conv_nth hd_def length_greater_0_conv list.case(1) nth'_def nth'_list_augment) apply (metis (full_types) hd_conv_nth hd_def length_greater_0_conv list.case(1) nth'_def) apply (metis One_nat_def diff_Suc_Suc diff_zero length_0_conv length_list_augment_1 length_tl linorder_not_less list.exhaust list.sel(2) list.sel(3) list_augment_0 not_less_zero) done lemma hd_tl_lens_pbij: "pbij_lens (hd\<^sub>L +\<^sub>L tl\<^sub>L)" by (unfold_locales, auto simp add: lens_defs) +subsection \Stream Lenses\ + +primrec stream_update :: "'a stream \ nat \ 'a \ 'a stream" where +"stream_update xs 0 a = a##(stl xs)" | +"stream_update xs (Suc n) a = shd xs ## (stream_update (stl xs) n a)" + +lemma stream_update_snth: "(stream_update xs n a) !! n = a" +proof (induction n arbitrary: xs a) + case 0 + then show ?case by simp +next + case (Suc n) + then show ?case by simp +qed + +lemma stream_update_unchanged: "i \ j \ (stream_update xs i a) !! j = xs !! j" + using gr0_conv_Suc by (induct i j arbitrary: xs rule: diff_induct; fastforce) + +lemma stream_update_override: "stream_update (stream_update xs n a) n b = stream_update xs n b" + by (induction n arbitrary: xs a; simp) + +lemma stream_update_nth: "stream_update \ i (\ !! i) = \" + by (metis stream.map_cong stream_smap_nats stream_update_snth stream_update_unchanged) + +definition stream_lens :: "nat \ ('a::two \ 'a stream)" where +[lens_defs]: "stream_lens i = \ lens_get = (\ xs. snth xs i) + , lens_put = (\ xs x. stream_update xs i x)\" + +lemma stream_vwb_lens: "vwb_lens (stream_lens i)" + apply (unfold_locales; simp add: stream_lens_def) + apply (rule stream_update_snth) + apply (rule stream_update_nth) + apply (rule stream_update_override) + done + subsection \Record Field Lenses\ text \We also add support for record lenses. Every record created can yield a lens for each field. These cannot be created generically and thus must be defined case by case as new records are created. We thus create a new Isabelle outer syntax command \textbf{alphabet} which enables this. We first create syntax that allows us to obtain a lens from a given field using the internal record syntax translations.\ abbreviation (input) "fld_put f \ (\ \ u. f (\_. u) \)" syntax "_FLDLENS" :: "id \ logic" ("FLDLENS _") translations "FLDLENS x" => "\ lens_get = x, lens_put = CONST fld_put (_update_name x) \" text \ We also allow the extraction of the "base lens", which characterises all the fields added by a record without the extension. \ syntax "_BASELENS" :: "id \ logic" ("BASELENS _") abbreviation (input) "base_lens t e m \ \ lens_get = t, lens_put = \ s v. e v (m s) \" ML \ fun baselens_tr [Free (name, _)] = let val extend = Free (name ^ ".extend", dummyT); val truncate = Free (name ^ ".truncate", dummyT); val more = Free (name ^ ".more", dummyT); in Const (@{const_syntax "base_lens"}, dummyT) $ truncate $ extend $ more end | baselens_tr _ = raise Match; \ parse_translation \[(@{syntax_const "_BASELENS"}, K baselens_tr)]\ text \We also introduce the \textbf{alphabet} command that creates a record with lenses for each field. For each field a lens is created together with a proof that it is very well-behaved, and for each pair of lenses an independence theorem is generated. Alphabets can also be extended which yields sublens proofs between the extension field lens and record extension lenses. \ +named_theorems lens + ML_file \Lens_Lib.ML\ ML_file \Lens_Record.ML\ text \The following theorem attribute stores splitting theorems for alphabet types which which is useful for proof automation.\ named_theorems alpha_splits text \ We supply a helpful tactic to remove the subscripted v characters from subgoals. These exist because the internal names of record fields have them. \ method rename_alpha_vars = tactic \ Lens_Utils.rename_alpha_vars \ subsection \Locale State Spaces \ text \ Alternative to the alphabet command, we also introduce the statespace command, which implements Schirmer and Wenzel's locale-based approach to state space modelling~\cite{Schirmer2009}. It has the advantage of allowing multiple inheritance of state spaces, and also variable names are fully internalised with the locales. The approach is also far simpler than record-based state spaces. It has the disadvantage that variables may not be fully polymorphic, unlike for the alphabet command. This makes it in general unsuitable for UTP theory alphabets. \ ML_file \Lens_Statespace.ML\ subsection \Type Definition Lens\ text \ Every type defined by a \<^bold>\typedef\ command induces a partial bijective lens constructed using the abstraction and representation functions. \ context type_definition begin definition typedef_lens :: "'b \ 'a" ("typedef\<^sub>L") where [lens_defs]: "typedef\<^sub>L = \ lens_get = Abs, lens_put = (\ s. Rep) \" lemma pbij_typedef_lens [simp]: "pbij_lens typedef\<^sub>L" by (unfold_locales, simp_all add: lens_defs Rep_inverse) lemma source_typedef_lens: "\\<^bsub>typedef\<^sub>L\<^esub> = A" using Rep_cases by (auto simp add: lens_source_def lens_defs Rep) lemma bij_typedef_lens_UNIV: "A = UNIV \ bij_lens typedef\<^sub>L" by (auto intro: pbij_vwb_is_bij_lens simp add: mwb_UNIV_src_is_vwb_lens source_typedef_lens) end subsection \Mapper Lenses\ definition lmap_lens :: "(('\ \ '\) \ ('\ \ '\)) \ (('\ \ '\) \ '\ \ '\) \ ('\ \ '\) \ ('\ \ '\) \ ('\ \ '\)" where [lens_defs]: "lmap_lens f g h l = \ lens_get = f (get\<^bsub>l\<^esub>), lens_put = g o (put\<^bsub>l\<^esub>) o h \" text \ The parse translation below yields a heterogeneous mapping lens for any record type. This achieved through the utility function above that constructs a functorial lens. This takes as input a heterogeneous mapping function that lifts a function on a record's extension type to an update on the entire record, and also the record's ``more'' function. The first input is given twice as it has different polymorphic types, being effectively a type functor construction which are not explicitly supported by HOL. We note that the \more_update\ function does something similar to the extension lifting, but is not precisely suitable here since it only considers homogeneous functions, namely of type \'a \ 'a\ rather than \'a \ 'b\. \ syntax "_lmap" :: "id \ logic" ("lmap[_]") ML \ fun lmap_tr [Free (name, _)] = let val extend = Free (name ^ ".extend", dummyT); val truncate = Free (name ^ ".truncate", dummyT); val more = Free (name ^ ".more", dummyT); val map_ext = Abs ("f", dummyT, Abs ("r", dummyT, extend $ (truncate $ Bound 0) $ (Bound 1 $ (more $ (Bound 0))))) in Const (@{const_syntax "lmap_lens"}, dummyT) $ map_ext $ map_ext $ more end | lmap_tr _ = raise Match; \ parse_translation \[(@{syntax_const "_lmap"}, K lmap_tr)]\ subsection \Lens Interpretation\ named_theorems lens_interp_laws locale lens_interp = interp begin declare meta_interp_law [lens_interp_laws] declare all_interp_law [lens_interp_laws] declare exists_interp_law [lens_interp_laws] end subsection \ Tactic \ text \ A simple tactic for simplifying lens expressions \ declare split_paired_all [alpha_splits] method lens_simp = (simp add: alpha_splits lens_defs prod.case_eq_if) end diff --git a/thys/Optics/Lens_Laws.thy b/thys/Optics/Lens_Laws.thy --- a/thys/Optics/Lens_Laws.thy +++ b/thys/Optics/Lens_Laws.thy @@ -1,461 +1,485 @@ section \Core Lens Laws\ theory Lens_Laws imports Two Interp begin subsection \Lens Signature\ text \This theory introduces the signature of lenses and indentifies the core algebraic hierarchy of lens classes, including laws for well-behaved, very well-behaved, and bijective lenses~\cite{Foster07,Fischer2015,Gibbons17}.\ record ('a, 'b) lens = lens_get :: "'b \ 'a" ("get\") lens_put :: "'b \ 'a \ 'b" ("put\") type_notation lens (infixr "\" 0) text \ Alternative parameters ordering, inspired by Back and von Wright's refinement calculus~\cite{Back1998}, which similarly uses two functions to characterise updates to variables. \ abbreviation (input) lens_set :: "('a \ 'b) \ 'a \ 'b \ 'b" ("lset\") where "lens_set \ (\ X v s. put\<^bsub>X\<^esub> s v)" text \ \begin{figure} \begin{center} \includegraphics[width=6cm]{figures/Lens} \end{center} \vspace{-5ex} \caption{Visualisation of a simple lens} \label{fig:Lens} \end{figure} A lens $X : \view \lto \src$, for source type $\src$ and view type $\view$, identifies $\view$ with a subregion of $\src$~\cite{Foster07,Foster09}, as illustrated in Figure~\ref{fig:Lens}. The arrow denotes $X$ and the hatched area denotes the subregion $\view$ it characterises. Transformations on $\view$ can be performed without affecting the parts of $\src$ outside the hatched area. The lens signature consists of a pair of functions $\lget_X : \src \Rightarrow \view$ that extracts a view from a source, and $\lput_X : \src \Rightarrow \view \Rightarrow \src$ that updates a view within a given source. \ named_theorems lens_defs text \ @{text lens_source} gives the set of constructible sources; that is those that can be built by putting a value into an arbitrary source. \ definition lens_source :: "('a \ 'b) \ 'b set" ("\\") where "lens_source X = {s. \ v s'. s = put\<^bsub>X\<^esub> s' v}" +text \ A partial version of @{const lens_get}, which can be useful for partial lenses. \ + +definition lens_partial_get :: "('a \ 'b) \ 'b \ 'a option" ("pget\") where +"lens_partial_get x s = (if s \ \\<^bsub>x\<^esub> then Some (get\<^bsub>x\<^esub> s) else None)" + abbreviation some_source :: "('a \ 'b) \ 'b" ("src\") where "some_source X \ (SOME s. s \ \\<^bsub>X\<^esub>)" definition lens_create :: "('a \ 'b) \ 'a \ 'b" ("create\") where [lens_defs]: "create\<^bsub>X\<^esub> v = put\<^bsub>X\<^esub> (src\<^bsub>X\<^esub>) v" text \ Function $\lcreate_X~v$ creates an instance of the source type of $X$ by injecting $v$ as the view, and leaving the remaining context arbitrary. \ definition lens_update :: "('a \ 'b) \ ('a \ 'a) \ ('b \ 'b)" ("update\") where [lens_defs]: "lens_update X f \ = put\<^bsub>X\<^esub> \ (f (get\<^bsub>X\<^esub> \))" text \ The update function is analogous to the record update function which lifts a function on a view type to one on the source type. \ definition lens_obs_eq :: "('b \ 'a) \ 'a \ 'a \ bool" (infix "\\" 50) where [lens_defs]: "s\<^sub>1 \\<^bsub>X\<^esub> s\<^sub>2 = (s\<^sub>1 = put\<^bsub>X\<^esub> s\<^sub>2 (get\<^bsub>X\<^esub> s\<^sub>1))" text \ This relation states that two sources are equivalent outside of the region characterised by lens $X$. \ definition lens_override :: "('b \ 'a) \ 'a \ 'a \ 'a" (infixl "\\" 95) where [lens_defs]: "S\<^sub>1 \\<^bsub>X\<^esub> S\<^sub>2 = put\<^bsub>X\<^esub> S\<^sub>1 (get\<^bsub>X\<^esub> S\<^sub>2)" abbreviation (input) lens_override' :: "'a \ 'a \ ('b \ 'a) \ 'a" ("_ \\<^sub>L _ on _" [95,0,96] 95) where "S\<^sub>1 \\<^sub>L S\<^sub>2 on X \ S\<^sub>1 \\<^bsub>X\<^esub> S\<^sub>2" text \Lens override uses a lens to replace part of a source type with a given value for the corresponding view.\ subsection \Weak Lenses\ text \ Weak lenses are the least constrained class of lenses in our algebraic hierarchy. They simply require that the PutGet law~\cite{Foster09,Fischer2015} is satisfied, meaning that $\lget$ is the inverse of $\lput$. \ locale weak_lens = fixes x :: "'a \ 'b" (structure) assumes put_get: "get (put \ v) = v" begin lemma source_nonempty: "\ s. s \ \" by (auto simp add: lens_source_def) lemma put_closure: "put \ v \ \" by (auto simp add: lens_source_def) lemma create_closure: "create v \ \" by (simp add: lens_create_def put_closure) lemma src_source [simp]: "src \ \" using some_in_eq source_nonempty by auto lemma create_get: "get (create v) = v" by (simp add: lens_create_def put_get) lemma create_inj: "inj create" by (metis create_get injI) lemma get_update: "get (update f \) = f (get \)" by (simp add: put_get lens_update_def) lemma view_determination: assumes "put \ u = put \ v" shows "u = v" by (metis assms put_get) lemma put_inj: "inj (put \)" by (simp add: injI view_determination) end declare weak_lens.put_get [simp] declare weak_lens.create_get [simp] +lemma dom_pget: "dom pget\<^bsub>x\<^esub> = \\<^bsub>x\<^esub>" + by (simp add: lens_partial_get_def dom_def) + subsection \Well-behaved Lenses\ text \ Well-behaved lenses add to weak lenses that requirement that the GetPut law~\cite{Foster09,Fischer2015} is satisfied, meaning that $\lput$ is the inverse of $\lget$. \ locale wb_lens = weak_lens + assumes get_put: "put \ (get \) = \" begin lemma put_twice: "put (put \ v) v = put \ v" by (metis get_put put_get) lemma put_surjectivity: "\ \ v. put \ v = \" using get_put by blast lemma source_stability: "\ v. put \ v = \" using get_put by auto lemma source_UNIV [simp]: "\ = UNIV" by (metis UNIV_eq_I put_closure wb_lens.source_stability wb_lens_axioms) end declare wb_lens.get_put [simp] lemma wb_lens_weak [simp]: "wb_lens x \ weak_lens x" by (simp add: wb_lens_def) subsection \ Mainly Well-behaved Lenses \ text \ Mainly well-behaved lenses extend weak lenses with the PutPut law that shows how one put override a previous one. \ locale mwb_lens = weak_lens + assumes put_put: "put (put \ v) u = put \ u" begin lemma update_comp: "update f (update g \) = update (f \ g) \" by (simp add: put_get put_put lens_update_def) text \ Mainly well-behaved lenses give rise to a weakened version of the $get-put$ law, where the source must be within the set of constructible sources. \ lemma weak_get_put: "\ \ \ \ put \ (get \) = \" by (auto simp add: lens_source_def put_get put_put) lemma weak_source_determination: assumes "\ \ \" "\ \ \" "get \ = get \" "put \ v = put \ v" shows "\ = \" by (metis assms put_put weak_get_put) lemma weak_put_eq: assumes "\ \ \" "get \ = k" "put \ u = put \ v" shows "put \ k = \" by (metis assms put_put weak_get_put) text \ Provides $s$ is constructible, then @{term get} can be uniquely determined from @{term put} \ lemma weak_get_via_put: "s \ \ \ get s = (THE v. put s v = s)" by (rule sym, auto intro!: the_equality weak_get_put, metis put_get) end abbreviation (input) "partial_lens \ mwb_lens" declare mwb_lens.put_put [simp] declare mwb_lens.weak_get_put [simp] lemma mwb_lens_weak [simp]: "mwb_lens x \ weak_lens x" by (simp add: mwb_lens.axioms(1)) subsection \Very Well-behaved Lenses\ text \Very well-behaved lenses combine all three laws, as in the literature~\cite{Foster09,Fischer2015}. The same set of axioms can be found in Back and von Wright's refinement calculus~\cite{Back1998}, though with different names for the functions. \ locale vwb_lens = wb_lens + mwb_lens begin lemma source_determination: assumes "get \ = get \" "put \ v = put \ v" shows "\ = \" by (metis assms get_put put_put) lemma put_eq: assumes "get \ = k" "put \ u = put \ v" shows "put \ k = \" using assms weak_put_eq[of \ k u \ v] by (simp) text \ @{term get} can be uniquely determined from @{term put} \ lemma get_via_put: "get s = (THE v. put s v = s)" by (simp add: weak_get_via_put) lemma get_surj: "surj get" by (metis put_get surjI) text \ Observation equivalence is an equivalence relation. \ lemma lens_obs_equiv: "equivp (\)" proof (rule equivpI) show "reflp (\)" by (rule reflpI, simp add: lens_obs_eq_def get_put) show "symp (\)" by (rule sympI, simp add: lens_obs_eq_def, metis get_put put_put) show "transp (\)" by (rule transpI, simp add: lens_obs_eq_def, metis put_put) qed end abbreviation (input) "total_lens \ vwb_lens" lemma vwb_lens_wb [simp]: "vwb_lens x \ wb_lens x" by (simp add: vwb_lens_def) lemma vwb_lens_mwb [simp]: "vwb_lens x \ mwb_lens x" using vwb_lens_def by auto lemma mwb_UNIV_src_is_vwb_lens: "\ mwb_lens X; \\<^bsub>X\<^esub> = UNIV \ \ vwb_lens X" using vwb_lens_def wb_lens_axioms_def wb_lens_def by fastforce text \ Alternative characterisation: a very well-behaved (i.e. total) lens is a mainly well-behaved (i.e. partial) lens whose source is the universe set. \ lemma vwb_lens_iff_mwb_UNIV_src: "vwb_lens X \ (mwb_lens X \ \\<^bsub>X\<^esub> = UNIV)" by (meson mwb_UNIV_src_is_vwb_lens vwb_lens_def wb_lens.source_UNIV) subsection \ Ineffectual Lenses \ text \Ineffectual lenses can have no effect on the view type -- application of the $\lput$ function always yields the same source. They are thus, trivially, very well-behaved lenses.\ locale ief_lens = weak_lens + assumes put_inef: "put \ v = \" begin -sublocale vwb_lens +lemma ief_then_vwb: "vwb_lens x" proof fix \ v u show "put \ (get \) = \" by (simp add: put_inef) show "put (put \ v) u = put \ u" by (simp add: put_inef) qed +sublocale vwb_lens by (fact ief_then_vwb) + lemma ineffectual_const_get: "\ v. \ \\\. get \ = v" using put_get put_inef by auto end +declare ief_lens.ief_then_vwb [simp] + +text \ There is no ineffectual lens when the view type has two or more elements. \ + +lemma no_ief_two_view: + assumes "ief_lens (x :: 'a::two \ 's)" + shows "False" +proof - + obtain x y :: "'a::two" where "x \ y" + using two_diff by auto + with assms show ?thesis + by (metis (full_types) ief_lens.axioms(1) ief_lens.put_inef weak_lens.put_get) +qed + abbreviation "eff_lens X \ (weak_lens X \ (\ ief_lens X))" subsection \ Partially Bijective Lenses \ locale pbij_lens = weak_lens + assumes put_det: "put \ v = put \ v" begin sublocale mwb_lens proof fix \ v u show "put (put \ v) u = put \ u" using put_det by blast qed lemma put_is_create: "put \ v = create v" by (simp add: lens_create_def put_det) lemma partial_get_put: "\ \ \ \ put \ (get \) = \" by (metis put_det weak_get_put) end lemma pbij_lens_weak [simp]: "pbij_lens x \ weak_lens x" by (simp_all add: pbij_lens_def) lemma pbij_lens_mwb [simp]: "pbij_lens x \ mwb_lens x" by (simp add: mwb_lens_axioms.intro mwb_lens_def pbij_lens.put_is_create) lemma pbij_alt_intro: "\ weak_lens X; \ s. s \ \\<^bsub>X\<^esub> \ create\<^bsub>X\<^esub> (get\<^bsub>X\<^esub> s) = s \ \ pbij_lens X" by (metis pbij_lens_axioms_def pbij_lens_def weak_lens.put_closure weak_lens.put_get) subsection \ Bijective Lenses \ text \Bijective lenses characterise the situation where the source and view type are equivalent: in other words the view type full characterises the whole source type. It is often useful when the view type and source type are syntactically different, but nevertheless correspond precisely in terms of what they observe. Bijective lenses are formulates using the strong GetPut law~\cite{Foster09,Fischer2015}.\ locale bij_lens = weak_lens + assumes strong_get_put: "put \ (get \) = \" begin sublocale pbij_lens proof fix \ v \ show "put \ v = put \ v" by (metis put_get strong_get_put) qed sublocale vwb_lens proof fix \ v u show "put \ (get \) = \" by (simp add: strong_get_put) qed lemma put_bij: "bij_betw (put \) UNIV UNIV" by (metis bijI put_inj strong_get_put surj_def) lemma get_create: "create (get \) = \" by (simp add: lens_create_def strong_get_put) end declare bij_lens.strong_get_put [simp] declare bij_lens.get_create [simp] lemma bij_lens_weak [simp]: "bij_lens x \ weak_lens x" by (simp_all add: bij_lens_def) lemma bij_lens_pbij [simp]: "bij_lens x \ pbij_lens x" by (metis bij_lens.get_create bij_lens_def pbij_lens_axioms.intro pbij_lens_def weak_lens.put_get) lemma bij_lens_vwb [simp]: "bij_lens x \ vwb_lens x" by (metis bij_lens.strong_get_put bij_lens_weak mwb_lens.intro mwb_lens_axioms.intro vwb_lens_def wb_lens.intro wb_lens_axioms.intro weak_lens.put_get) text \ Alternative characterisation: a bijective lens is a partial bijective lens that is also very well-behaved (i.e. total). \ lemma pbij_vwb_is_bij_lens: "\ pbij_lens X; vwb_lens X \ \ bij_lens X" by (unfold_locales, simp_all, meson pbij_lens.put_det vwb_lens.put_eq) lemma bij_lens_iff_pbij_vwb: "bij_lens X \ (pbij_lens X \ vwb_lens X)" using pbij_vwb_is_bij_lens by auto subsection \Lens Independence\ text \ \begin{figure} \begin{center} \includegraphics[width=6cm]{figures/Independence} \end{center} \vspace{-5ex} \caption{Lens Independence} \label{fig:Indep} \end{figure} Lens independence shows when two lenses $X$ and $Y$ characterise disjoint regions of the source type, as illustrated in Figure~\ref{fig:Indep}. We specify this by requiring that the $\lput$ functions of the two lenses commute, and that the $\lget$ function of each lens is unaffected by application of $\lput$ from the corresponding lens. \ locale lens_indep = fixes X :: "'a \ 'c" and Y :: "'b \ 'c" assumes lens_put_comm: "put\<^bsub>X\<^esub> (put\<^bsub>Y\<^esub> \ v) u = put\<^bsub>Y\<^esub> (put\<^bsub>X\<^esub> \ u) v" and lens_put_irr1: "get\<^bsub>X\<^esub> (put\<^bsub>Y\<^esub> \ v) = get\<^bsub>X\<^esub> \" and lens_put_irr2: "get\<^bsub>Y\<^esub> (put\<^bsub>X\<^esub> \ u) = get\<^bsub>Y\<^esub> \" notation lens_indep (infix "\" 50) lemma lens_indepI: "\ \ u v \. put\<^bsub>x\<^esub> (put\<^bsub>y\<^esub> \ v) u = put\<^bsub>y\<^esub> (put\<^bsub>x\<^esub> \ u) v; \ v \. get\<^bsub>x\<^esub> (put\<^bsub>y\<^esub> \ v) = get\<^bsub>x\<^esub> \; \ u \. get\<^bsub>y\<^esub> (put\<^bsub>x\<^esub> \ u) = get\<^bsub>y\<^esub> \ \ \ x \ y" by (simp add: lens_indep_def) text \Lens independence is symmetric.\ lemma lens_indep_sym: "x \ y \ y \ x" by (simp add: lens_indep_def) lemma lens_indep_comm: "x \ y \ put\<^bsub>x\<^esub> (put\<^bsub>y\<^esub> \ v) u = put\<^bsub>y\<^esub> (put\<^bsub>x\<^esub> \ u) v" by (simp add: lens_indep_def) lemma lens_indep_get [simp]: assumes "x \ y" shows "get\<^bsub>x\<^esub> (put\<^bsub>y\<^esub> \ v) = get\<^bsub>x\<^esub> \" using assms lens_indep_def by fastforce text \ Characterisation of independence for two very well-behaved lenses \ lemma lens_indep_vwb_iff: assumes "vwb_lens x" "vwb_lens y" shows "x \ y \ (\ u v \. put\<^bsub>x\<^esub> (put\<^bsub>y\<^esub> \ v) u = put\<^bsub>y\<^esub> (put\<^bsub>x\<^esub> \ u) v)" proof assume "x \ y" thus "\ u v \. put\<^bsub>x\<^esub> (put\<^bsub>y\<^esub> \ v) u = put\<^bsub>y\<^esub> (put\<^bsub>x\<^esub> \ u) v" by (simp add: lens_indep_comm) next assume a: "\ u v \. put\<^bsub>x\<^esub> (put\<^bsub>y\<^esub> \ v) u = put\<^bsub>y\<^esub> (put\<^bsub>x\<^esub> \ u) v" show "x \ y" proof (unfold_locales) fix \ v u from a show "put\<^bsub>x\<^esub> (put\<^bsub>y\<^esub> \ v) u = put\<^bsub>y\<^esub> (put\<^bsub>x\<^esub> \ u) v" by auto show "get\<^bsub>x\<^esub> (put\<^bsub>y\<^esub> \ v) = get\<^bsub>x\<^esub> \" by (metis a assms(1) vwb_lens.put_eq vwb_lens_wb wb_lens_def weak_lens.put_get) show "get\<^bsub>y\<^esub> (put\<^bsub>x\<^esub> \ u) = get\<^bsub>y\<^esub> \" by (metis a assms(2) vwb_lens.put_eq vwb_lens_wb wb_lens_def weak_lens.put_get) qed qed subsection \ Lens Compatibility \ text \ Lens compatibility is a weaker notion than independence. It allows that two lenses can overlap so long as they manipulate the source in the same way in that region. It is most easily defined in terms of a function for copying a region from one source to another using a lens. \ definition lens_compat (infix "##\<^sub>L" 50) where [lens_defs]: "lens_compat X Y = (\s\<^sub>1 s\<^sub>2. s\<^sub>1 \\<^bsub>X\<^esub> s\<^sub>2 \\<^bsub>Y\<^esub> s\<^sub>2 = s\<^sub>1 \\<^bsub>Y\<^esub> s\<^sub>2 \\<^bsub>X\<^esub> s\<^sub>2)" lemma lens_compat_idem [simp]: "x ##\<^sub>L x" by (simp add: lens_defs) lemma lens_compat_sym: "x ##\<^sub>L y \ y ##\<^sub>L x" by (simp add: lens_defs) lemma lens_indep_compat [simp]: "x \ y \ x ##\<^sub>L y" by (simp add: lens_override_def lens_compat_def lens_indep_comm) end \ No newline at end of file diff --git a/thys/Optics/Lens_Lib.ML b/thys/Optics/Lens_Lib.ML --- a/thys/Optics/Lens_Lib.ML +++ b/thys/Optics/Lens_Lib.ML @@ -1,76 +1,83 @@ signature LENS_LIB = sig (* Lens Constant Names *) val bij_lensN: string val vwb_lensN: string val sym_lensN: string val lens_indepN: string val lens_plusN: string val lens_quotientN: string val lens_compN: string val id_lensN: string val sublensN: string val lens_equivN: string val lens_defsN: string val indepsN: string val sublensesN: string val quotientsN: string val compositionsN: string + val lens_suffix: string (* Lens terms *) - val lensT: typ -> typ -> typ (* Lens type *) + val lensT: typ -> typ -> typ (* Lens type *) val isLensT: typ -> bool - val astateT: typ (* Abstract state type *) + val astateT: typ (* Abstract state type *) val pairsWith: 'a list -> 'a list -> ('a * 'a) list - val pairings: 'a list -> ('a * 'a) list (* Calculate all pairings *) - val mk_vwb_lens: term -> term (* Make a very well-behaved lens term *) - val mk_indep: term -> term -> term (* Make an independence term *) - + val pairings: 'a list -> ('a * 'a) list (* Calculate all pairings *) + val mk_vwb_lens: term -> term (* Make a very well-behaved lens term *) + val mk_indep: term -> term -> term (* Make an independence term *) + val remove_lens_suffix: string -> string (* Remove the suffix subscript v from a name *) end structure Lens_Lib : LENS_LIB = struct open Syntax open HOLogic val bij_lensN = @{const_name bij_lens} val vwb_lensN = @{const_name vwb_lens} val sym_lensN = @{const_name sym_lens} val lens_indepN = @{const_name lens_indep} val lens_plusN = @{const_name lens_plus} val lens_quotientN = @{const_name lens_quotient} val lens_compN = @{const_name lens_comp} val id_lensN = @{const_name id_lens} val sublensN = @{const_name sublens} val lens_equivN = @{const_name lens_equiv} val lens_defsN = "lens_defs" val indepsN = "indeps" val sublensesN = "sublenses" val quotientsN = "quotients" val compositionsN = "compositions" +val lens_suffix = "\<^sub>v" + fun lensT a b = Type (@{type_name lens_ext}, [a, b, unitT]) fun isLensT (Type (n, _)) = (n = @{type_name lens_ext}) | isLensT _ = false -val astateT = (TFree ("'st", ["HOL.type"])) +val astateT = (TFree ("'st", [@{class type}, @{class scene_space}])) fun pairWith _ [] = [] | pairWith x (y :: ys) = [(x, y), (y, x)] @ pairWith x ys; fun pairsWith [] _ = [] | pairsWith (x :: xs) ys = pairWith x ys @ pairsWith xs ys; fun pairings [] = [] | pairings (x :: xs) = pairWith x xs @ pairings xs; fun mk_vwb_lens t = mk_Trueprop (const vwb_lensN $ t) fun mk_indep x y = mk_Trueprop (const lens_indepN $ x $ y) +fun remove_lens_suffix x = (if (String.isSuffix lens_suffix x) + then String.substring (x, 0, (String.size x - String.size lens_suffix)) + else x); + end diff --git a/thys/Optics/Lens_Order.thy b/thys/Optics/Lens_Order.thy --- a/thys/Optics/Lens_Order.thy +++ b/thys/Optics/Lens_Order.thy @@ -1,644 +1,683 @@ section \Order and Equivalence on Lenses\ theory Lens_Order imports Lens_Algebra begin subsection \Sub-lens Relation\ text \A lens $X$ is a sub-lens of $Y$ if there is a well-behaved lens $Z$ such that $X = Z \lcomp Y$, or in other words if $X$ can be expressed purely in terms of $Y$.\ definition sublens :: "('a \ 'c) \ ('b \ 'c) \ bool" (infix "\\<^sub>L" 55) where [lens_defs]: "sublens X Y = (\ Z :: ('a, 'b) lens. vwb_lens Z \ X = Z ;\<^sub>L Y)" text \Various lens classes are downward closed under the sublens relation.\ lemma sublens_pres_mwb: "\ mwb_lens Y; X \\<^sub>L Y \ \ mwb_lens X" by (unfold_locales, auto simp add: sublens_def lens_comp_def) lemma sublens_pres_wb: "\ wb_lens Y; X \\<^sub>L Y \ \ wb_lens X" by (unfold_locales, auto simp add: sublens_def lens_comp_def) lemma sublens_pres_vwb: "\ vwb_lens Y; X \\<^sub>L Y \ \ vwb_lens X" by (unfold_locales, auto simp add: sublens_def lens_comp_def) text \Sublens is a preorder as the following two theorems show.\ lemma sublens_refl [simp]: "X \\<^sub>L X" using id_vwb_lens sublens_def by fastforce lemma sublens_trans [trans]: "\ X \\<^sub>L Y; Y \\<^sub>L Z \ \ X \\<^sub>L Z" apply (auto simp add: sublens_def lens_comp_assoc) apply (rename_tac Z\<^sub>1 Z\<^sub>2) apply (rule_tac x="Z\<^sub>1 ;\<^sub>L Z\<^sub>2" in exI) apply (simp add: lens_comp_assoc) using comp_vwb_lens apply blast done text \Sublens has a least element -- @{text "0\<^sub>L"} -- and a greatest element -- @{text "1\<^sub>L"}. Intuitively, this shows that sublens orders how large a portion of the source type a particular lens views, with @{text "0\<^sub>L"} observing the least, and @{text "1\<^sub>L"} observing the most.\ lemma sublens_least: "wb_lens X \ 0\<^sub>L \\<^sub>L X" using sublens_def unit_vwb_lens by fastforce lemma sublens_greatest: "vwb_lens X \ X \\<^sub>L 1\<^sub>L" by (simp add: sublens_def) text \If $Y$ is a sublens of $X$ then any put using $X$ will necessarily erase any put using $Y$. Similarly, any two source types are observationally equivalent by $Y$ when performed following a put using $X$.\ lemma sublens_put_put: "\ mwb_lens X; Y \\<^sub>L X \ \ put\<^bsub>X\<^esub> (put\<^bsub>Y\<^esub> \ v) u = put\<^bsub>X\<^esub> \ u" by (auto simp add: sublens_def lens_comp_def) lemma sublens_obs_get: "\ mwb_lens X; Y \\<^sub>L X \ \ get\<^bsub>Y\<^esub> (put\<^bsub>X\<^esub> \ v) = get\<^bsub>Y\<^esub> (put\<^bsub>X\<^esub> \ v)" by (auto simp add: sublens_def lens_comp_def) text \Sublens preserves independence; in other words if $Y$ is independent of $Z$, then also any $X$ smaller than $Y$ is independent of $Z$.\ lemma sublens_pres_indep: "\ X \\<^sub>L Y; Y \ Z \ \ X \ Z" apply (auto intro!:lens_indepI simp add: sublens_def lens_comp_def lens_indep_comm) apply (simp add: lens_indep_sym) done lemma sublens_pres_indep': "\ X \\<^sub>L Y; Z \ Y \ \ Z \ X" by (meson lens_indep_sym sublens_pres_indep) lemma sublens_compat: "\ vwb_lens X; vwb_lens Y; X \\<^sub>L Y \ \ X ##\<^sub>L Y" unfolding lens_compat_def lens_override_def by (metis (no_types, opaque_lifting) sublens_obs_get sublens_put_put vwb_lens_mwb vwb_lens_wb wb_lens.get_put) text \Well-behavedness of lens quotient has sublens as a proviso. This is because we can only remove $X$ from $Y$ if $X$ is smaller than $Y$. \ lemma lens_quotient_mwb: "\ mwb_lens Y; X \\<^sub>L Y \ \ mwb_lens (X /\<^sub>L Y)" by (unfold_locales, auto simp add: lens_quotient_def lens_create_def sublens_def lens_comp_def comp_def) subsection \Lens Equivalence\ text \Using our preorder, we can also derive an equivalence on lenses as follows. It should be noted that this equality, like sublens, is heterogeneously typed -- it can compare lenses whose view types are different, so long as the source types are the same. We show that it is reflexive, symmetric, and transitive. \ definition lens_equiv :: "('a \ 'c) \ ('b \ 'c) \ bool" (infix "\\<^sub>L" 51) where [lens_defs]: "lens_equiv X Y = (X \\<^sub>L Y \ Y \\<^sub>L X)" lemma lens_equivI [intro]: "\ X \\<^sub>L Y; Y \\<^sub>L X \ \ X \\<^sub>L Y" by (simp add: lens_equiv_def) -lemma lens_equiv_refl: +lemma lens_equiv_refl [simp]: "X \\<^sub>L X" by (simp add: lens_equiv_def) lemma lens_equiv_sym: "X \\<^sub>L Y \ Y \\<^sub>L X" by (simp add: lens_equiv_def) lemma lens_equiv_trans [trans]: "\ X \\<^sub>L Y; Y \\<^sub>L Z \ \ X \\<^sub>L Z" by (auto intro: sublens_trans simp add: lens_equiv_def) lemma lens_equiv_pres_indep: "\ X \\<^sub>L Y; Y \ Z \ \ X \ Z" using lens_equiv_def sublens_pres_indep by blast lemma lens_equiv_pres_indep': "\ X \\<^sub>L Y; Z \ Y \ \ Z \ X" using lens_equiv_def sublens_pres_indep' by blast lemma lens_comp_cong_1: "X \\<^sub>L Y \ X ;\<^sub>L Z \\<^sub>L Y ;\<^sub>L Z" unfolding lens_equiv_def by (metis (no_types, lifting) lens_comp_assoc sublens_def) subsection \Further Algebraic Laws\ text \This law explains the behaviour of lens quotient.\ lemma lens_quotient_comp: "\ weak_lens Y; X \\<^sub>L Y \ \ (X /\<^sub>L Y) ;\<^sub>L Y = X" by (auto simp add: lens_quotient_def lens_comp_def comp_def sublens_def) text \Plus distributes through quotient.\ lemma lens_quotient_plus: "\ mwb_lens Z; X \\<^sub>L Z; Y \\<^sub>L Z \ \ (X +\<^sub>L Y) /\<^sub>L Z = (X /\<^sub>L Z) +\<^sub>L (Y /\<^sub>L Z)" apply (auto simp add: lens_quotient_def lens_plus_def sublens_def lens_comp_def comp_def) apply (rule ext) apply (rule ext) apply (simp add: prod.case_eq_if) done text \Laws for for lens plus on the denominator. These laws allow us to extract compositions of @{term "fst\<^sub>L"} and @{term "snd\<^sub>L"} terms. \ lemma lens_quotient_plus_den1: "\ weak_lens x; weak_lens y; x \ y \ \ x /\<^sub>L (x +\<^sub>L y) = fst\<^sub>L" by (auto simp add: lens_defs prod.case_eq_if fun_eq_iff, metis (lifting) lens_indep_def weak_lens.put_get) lemma lens_quotient_plus_den2: "\ weak_lens x; weak_lens z; x \ z; y \\<^sub>L z \ \ y /\<^sub>L (x +\<^sub>L z) = (y /\<^sub>L z) ;\<^sub>L snd\<^sub>L " by (auto simp add: lens_defs prod.case_eq_if fun_eq_iff lens_indep.lens_put_irr2) text \There follows a number of laws relating sublens and summation. Firstly, sublens is preserved by summation. \ lemma plus_pred_sublens: "\ mwb_lens Z; X \\<^sub>L Z; Y \\<^sub>L Z; X \ Y \ \ (X +\<^sub>L Y) \\<^sub>L Z" apply (auto simp add: sublens_def) apply (rename_tac Z\<^sub>1 Z\<^sub>2) apply (rule_tac x="Z\<^sub>1 +\<^sub>L Z\<^sub>2" in exI) apply (auto intro!: plus_wb_lens) - apply (simp add: lens_comp_indep_cong_left plus_vwb_lens) + apply (simp add: lens_comp_indep_cong_left) apply (simp add: plus_lens_distr) done text \Intuitively, lens plus is associative. However we cannot prove this using HOL equality due to monomorphic typing of this operator. But since sublens and lens equivalence are both heterogeneous we can now prove this in the following three lemmas.\ lemma lens_plus_sub_assoc_1: "X +\<^sub>L Y +\<^sub>L Z \\<^sub>L (X +\<^sub>L Y) +\<^sub>L Z" apply (simp add: sublens_def) apply (rule_tac x="(fst\<^sub>L ;\<^sub>L fst\<^sub>L) +\<^sub>L (snd\<^sub>L ;\<^sub>L fst\<^sub>L) +\<^sub>L snd\<^sub>L" in exI) apply (auto) apply (rule plus_vwb_lens) apply (simp add: comp_vwb_lens fst_vwb_lens) apply (rule plus_vwb_lens) apply (simp add: comp_vwb_lens fst_vwb_lens snd_vwb_lens) apply (simp add: snd_vwb_lens) apply (simp add: lens_indep_left_ext) apply (rule lens_indep_sym) apply (rule plus_pres_lens_indep) using fst_snd_lens_indep fst_vwb_lens lens_indep_left_comp lens_indep_sym vwb_lens_mwb apply blast using fst_snd_lens_indep lens_indep_left_ext lens_indep_sym apply blast apply (auto simp add: lens_plus_def lens_comp_def fst_lens_def snd_lens_def prod.case_eq_if split_beta')[1] done lemma lens_plus_sub_assoc_2: "(X +\<^sub>L Y) +\<^sub>L Z \\<^sub>L X +\<^sub>L Y +\<^sub>L Z" apply (simp add: sublens_def) apply (rule_tac x="(fst\<^sub>L +\<^sub>L (fst\<^sub>L ;\<^sub>L snd\<^sub>L)) +\<^sub>L (snd\<^sub>L ;\<^sub>L snd\<^sub>L)" in exI) apply (auto) apply (rule plus_vwb_lens) apply (rule plus_vwb_lens) apply (simp add: fst_vwb_lens) apply (simp add: comp_vwb_lens fst_vwb_lens snd_vwb_lens) apply (rule lens_indep_sym) apply (rule lens_indep_left_ext) using fst_snd_lens_indep lens_indep_sym apply blast apply (auto intro: comp_vwb_lens simp add: snd_vwb_lens) apply (rule plus_pres_lens_indep) apply (simp add: lens_indep_left_ext lens_indep_sym) apply (simp add: snd_vwb_lens) apply (auto simp add: lens_plus_def lens_comp_def fst_lens_def snd_lens_def prod.case_eq_if split_beta')[1] done lemma lens_plus_assoc: "(X +\<^sub>L Y) +\<^sub>L Z \\<^sub>L X +\<^sub>L Y +\<^sub>L Z" by (simp add: lens_equivI lens_plus_sub_assoc_1 lens_plus_sub_assoc_2) text \We can similarly show that it is commutative.\ lemma lens_plus_sub_comm: "X \ Y \ X +\<^sub>L Y \\<^sub>L Y +\<^sub>L X" apply (simp add: sublens_def) apply (rule_tac x="snd\<^sub>L +\<^sub>L fst\<^sub>L" in exI) apply (auto) apply (simp add: fst_vwb_lens lens_indep_sym snd_vwb_lens) apply (simp add: lens_indep_sym lens_plus_swap) done lemma lens_plus_comm: "X \ Y \ X +\<^sub>L Y \\<^sub>L Y +\<^sub>L X" by (simp add: lens_equivI lens_indep_sym lens_plus_sub_comm) - - text \Any composite lens is larger than an element of the lens, as demonstrated by the following four laws.\ lemma lens_plus_ub [simp]: "wb_lens Y \ X \\<^sub>L X +\<^sub>L Y" by (metis fst_lens_plus fst_vwb_lens sublens_def) lemma lens_plus_right_sublens: "\ vwb_lens Y; Y \ Z; X \\<^sub>L Z \ \ X \\<^sub>L Y +\<^sub>L Z" apply (auto simp add: sublens_def) apply (rename_tac Z') apply (rule_tac x="Z' ;\<^sub>L snd\<^sub>L" in exI) apply (auto) using comp_vwb_lens snd_vwb_lens apply blast apply (metis lens_comp_assoc snd_lens_plus vwb_lens_def) done lemma lens_plus_mono_left: "\ Y \ Z; X \\<^sub>L Y \ \ X +\<^sub>L Z \\<^sub>L Y +\<^sub>L Z" apply (auto simp add: sublens_def) apply (rename_tac Z') apply (rule_tac x="Z' \\<^sub>L 1\<^sub>L" in exI) apply (subst prod_lens_comp_plus) apply (simp_all) using id_vwb_lens prod_vwb_lens apply blast done lemma lens_plus_mono_right: "\ X \ Z; Y \\<^sub>L Z \ \ X +\<^sub>L Y \\<^sub>L X +\<^sub>L Z" by (metis prod_lens_comp_plus prod_vwb_lens sublens_def sublens_refl) text \If we compose a lens $X$ with lens $Y$ then naturally the resulting lens must be smaller than $Y$, as $X$ views a part of $Y$. \ lemma lens_comp_lb [simp]: "vwb_lens X \ X ;\<^sub>L Y \\<^sub>L Y" by (auto simp add: sublens_def) lemma sublens_comp [simp]: assumes "vwb_lens b" "c \\<^sub>L a" shows "(b ;\<^sub>L c) \\<^sub>L a" by (metis assms sublens_def sublens_trans) text \We can now also show that @{text "0\<^sub>L"} is the unit of lens plus\ lemma lens_unit_plus_sublens_1: "X \\<^sub>L 0\<^sub>L +\<^sub>L X" by (metis lens_comp_lb snd_lens_plus snd_vwb_lens zero_lens_indep unit_wb_lens) lemma lens_unit_prod_sublens_2: "0\<^sub>L +\<^sub>L X \\<^sub>L X" apply (auto simp add: sublens_def) apply (rule_tac x="0\<^sub>L +\<^sub>L 1\<^sub>L" in exI) apply (auto) apply (auto simp add: lens_plus_def zero_lens_def lens_comp_def id_lens_def prod.case_eq_if comp_def) apply (rule ext) apply (rule ext) apply (auto) done lemma lens_plus_left_unit: "0\<^sub>L +\<^sub>L X \\<^sub>L X" by (simp add: lens_equivI lens_unit_plus_sublens_1 lens_unit_prod_sublens_2) lemma lens_plus_right_unit: "X +\<^sub>L 0\<^sub>L \\<^sub>L X" using lens_equiv_trans lens_indep_sym lens_plus_comm lens_plus_left_unit zero_lens_indep by blast text \We can also show that both sublens and equivalence are congruences with respect to lens plus and lens product.\ lemma lens_plus_subcong: "\ Y\<^sub>1 \ Y\<^sub>2; X\<^sub>1 \\<^sub>L Y\<^sub>1; X\<^sub>2 \\<^sub>L Y\<^sub>2 \ \ X\<^sub>1 +\<^sub>L X\<^sub>2 \\<^sub>L Y\<^sub>1 +\<^sub>L Y\<^sub>2" by (metis prod_lens_comp_plus prod_vwb_lens sublens_def) lemma lens_plus_eq_left: "\ X \ Z; X \\<^sub>L Y \ \ X +\<^sub>L Z \\<^sub>L Y +\<^sub>L Z" by (meson lens_equiv_def lens_plus_mono_left sublens_pres_indep) lemma lens_plus_eq_right: "\ X \ Y; Y \\<^sub>L Z \ \ X +\<^sub>L Y \\<^sub>L X +\<^sub>L Z" by (meson lens_equiv_def lens_indep_sym lens_plus_mono_right sublens_pres_indep) lemma lens_plus_cong: assumes "X\<^sub>1 \ X\<^sub>2" "X\<^sub>1 \\<^sub>L Y\<^sub>1" "X\<^sub>2 \\<^sub>L Y\<^sub>2" shows "X\<^sub>1 +\<^sub>L X\<^sub>2 \\<^sub>L Y\<^sub>1 +\<^sub>L Y\<^sub>2" proof - have "X\<^sub>1 +\<^sub>L X\<^sub>2 \\<^sub>L Y\<^sub>1 +\<^sub>L X\<^sub>2" by (simp add: assms(1) assms(2) lens_plus_eq_left) moreover have "... \\<^sub>L Y\<^sub>1 +\<^sub>L Y\<^sub>2" using assms(1) assms(2) assms(3) lens_equiv_def lens_plus_eq_right sublens_pres_indep by blast ultimately show ?thesis using lens_equiv_trans by blast qed lemma prod_lens_sublens_cong: "\ X\<^sub>1 \\<^sub>L X\<^sub>2; Y\<^sub>1 \\<^sub>L Y\<^sub>2 \ \ (X\<^sub>1 \\<^sub>L Y\<^sub>1) \\<^sub>L (X\<^sub>2 \\<^sub>L Y\<^sub>2)" apply (auto simp add: sublens_def) apply (rename_tac Z\<^sub>1 Z\<^sub>2) apply (rule_tac x="Z\<^sub>1 \\<^sub>L Z\<^sub>2" in exI) apply (auto) using prod_vwb_lens apply blast apply (auto simp add: lens_prod_def lens_comp_def prod.case_eq_if) apply (rule ext, rule ext) apply (auto simp add: lens_prod_def lens_comp_def prod.case_eq_if) done lemma prod_lens_equiv_cong: "\ X\<^sub>1 \\<^sub>L X\<^sub>2; Y\<^sub>1 \\<^sub>L Y\<^sub>2 \ \ (X\<^sub>1 \\<^sub>L Y\<^sub>1) \\<^sub>L (X\<^sub>2 \\<^sub>L Y\<^sub>2)" by (simp add: lens_equiv_def prod_lens_sublens_cong) text \We also have the following "exchange" law that allows us to switch over a lens product and plus.\ lemma lens_plus_prod_exchange: "(X\<^sub>1 +\<^sub>L X\<^sub>2) \\<^sub>L (Y\<^sub>1 +\<^sub>L Y\<^sub>2) \\<^sub>L (X\<^sub>1 \\<^sub>L Y\<^sub>1) +\<^sub>L (X\<^sub>2 \\<^sub>L Y\<^sub>2)" proof (rule lens_equivI) show "(X\<^sub>1 +\<^sub>L X\<^sub>2) \\<^sub>L (Y\<^sub>1 +\<^sub>L Y\<^sub>2) \\<^sub>L (X\<^sub>1 \\<^sub>L Y\<^sub>1) +\<^sub>L (X\<^sub>2 \\<^sub>L Y\<^sub>2)" apply (simp add: sublens_def) apply (rule_tac x="((fst\<^sub>L ;\<^sub>L fst\<^sub>L) +\<^sub>L (fst\<^sub>L ;\<^sub>L snd\<^sub>L)) +\<^sub>L ((snd\<^sub>L ;\<^sub>L fst\<^sub>L) +\<^sub>L (snd\<^sub>L ;\<^sub>L snd\<^sub>L))" in exI) apply (auto) apply (auto intro!: plus_vwb_lens comp_vwb_lens fst_vwb_lens snd_vwb_lens lens_indep_right_comp) apply (auto intro!: lens_indepI simp add: lens_comp_def lens_plus_def fst_lens_def snd_lens_def) apply (auto simp add: lens_prod_def lens_plus_def lens_comp_def fst_lens_def snd_lens_def prod.case_eq_if comp_def)[1] apply (rule ext, rule ext, auto simp add: prod.case_eq_if) done show "(X\<^sub>1 \\<^sub>L Y\<^sub>1) +\<^sub>L (X\<^sub>2 \\<^sub>L Y\<^sub>2) \\<^sub>L (X\<^sub>1 +\<^sub>L X\<^sub>2) \\<^sub>L (Y\<^sub>1 +\<^sub>L Y\<^sub>2)" apply (simp add: sublens_def) apply (rule_tac x="((fst\<^sub>L ;\<^sub>L fst\<^sub>L) +\<^sub>L (fst\<^sub>L ;\<^sub>L snd\<^sub>L)) +\<^sub>L ((snd\<^sub>L ;\<^sub>L fst\<^sub>L) +\<^sub>L (snd\<^sub>L ;\<^sub>L snd\<^sub>L))" in exI) apply (auto) apply (auto intro!: plus_vwb_lens comp_vwb_lens fst_vwb_lens snd_vwb_lens lens_indep_right_comp) apply (auto intro!: lens_indepI simp add: lens_comp_def lens_plus_def fst_lens_def snd_lens_def) apply (auto simp add: lens_prod_def lens_plus_def lens_comp_def fst_lens_def snd_lens_def prod.case_eq_if comp_def)[1] apply (rule ext, rule ext, auto simp add: lens_prod_def prod.case_eq_if) done qed lemma lens_get_put_quasi_commute: "\ vwb_lens Y; X \\<^sub>L Y \ \ get\<^bsub>Y\<^esub> (put\<^bsub>X\<^esub> s v) = put\<^bsub>X /\<^sub>L Y\<^esub> (get\<^bsub>Y\<^esub> s) v" proof - assume a1: "vwb_lens Y" assume a2: "X \\<^sub>L Y" have "\l la. put\<^bsub>l ;\<^sub>L la\<^esub> = (\b c. put\<^bsub>la\<^esub> (b::'b) (put\<^bsub>l\<^esub> (get\<^bsub>la\<^esub> b::'a) (c::'c)))" by (simp add: lens_comp_def) then have "\l la b c. get\<^bsub>l\<^esub> (put\<^bsub>la ;\<^sub>L l\<^esub> (b::'b) (c::'c)) = put\<^bsub>la\<^esub> (get\<^bsub>l\<^esub> b::'a) c \ \ weak_lens l" by force then show ?thesis using a2 a1 by (metis lens_quotient_comp vwb_lens_wb wb_lens_def) qed lemma lens_put_of_quotient: "\ vwb_lens Y; X \\<^sub>L Y \ \ put\<^bsub>Y\<^esub> s (put\<^bsub>X /\<^sub>L Y\<^esub> v\<^sub>2 v\<^sub>1) = put\<^bsub>X\<^esub> (put\<^bsub>Y\<^esub> s v\<^sub>2) v\<^sub>1" proof - assume a1: "vwb_lens Y" assume a2: "X \\<^sub>L Y" have f3: "\l b. put\<^bsub>l\<^esub> (b::'b) (get\<^bsub>l\<^esub> b::'a) = b \ \ vwb_lens l" by force have f4: "\b c. put\<^bsub>X /\<^sub>L Y\<^esub> (get\<^bsub>Y\<^esub> b) c = get\<^bsub>Y\<^esub> (put\<^bsub>X\<^esub> b c)" using a2 a1 by (simp add: lens_get_put_quasi_commute) have "\b c a. put\<^bsub>Y\<^esub> (put\<^bsub>X\<^esub> b c) a = put\<^bsub>Y\<^esub> b a" using a2 a1 by (simp add: sublens_put_put) then show ?thesis using f4 f3 a1 by (metis mwb_lens.put_put mwb_lens_def vwb_lens_mwb weak_lens.put_get) qed +text \ If two lenses are both independent and equivalent then they must be ineffectual. \ + +lemma indep_and_equiv_implies_ief: + assumes "wb_lens x" "x \ y" "x \\<^sub>L y" + shows "ief_lens x" +proof - + have "x \ x" + using assms(2) assms(3) lens_equiv_pres_indep' by blast + thus ?thesis + using assms(1) lens_indep_quasi_irrefl vwb_lens_wb wb_lens_weak by blast +qed + +lemma indep_eff_implies_not_equiv [simp]: + fixes x :: "'a::two \ 'b" + assumes "wb_lens x" "x \ y" + shows "\ (x \\<^sub>L y)" + using assms indep_and_equiv_implies_ief no_ief_two_view by blast + subsection \Bijective Lens Equivalences\ text \A bijective lens, like a bijective function, is its own inverse. Thus, if we compose its inverse with itself we get @{term "1\<^sub>L"}.\ lemma bij_lens_inv_left: "bij_lens X \ inv\<^sub>L X ;\<^sub>L X = 1\<^sub>L" by (auto simp add: lens_inv_def lens_comp_def lens_create_def comp_def id_lens_def, rule ext, auto) lemma bij_lens_inv_right: "bij_lens X \ X ;\<^sub>L inv\<^sub>L X = 1\<^sub>L" by (auto simp add: lens_inv_def lens_comp_def comp_def id_lens_def, rule ext, auto) text \The following important results shows that bijective lenses are precisely those that are equivalent to identity. In other words, a bijective lens views all of the source type.\ lemma bij_lens_equiv_id: "bij_lens X \ X \\<^sub>L 1\<^sub>L" apply (auto) apply (rule lens_equivI) apply (simp_all add: sublens_def) apply (rule_tac x="lens_inv X" in exI) apply (simp add: bij_lens_inv_left lens_inv_bij) apply (auto simp add: lens_equiv_def sublens_def id_lens_def lens_comp_def comp_def) apply (unfold_locales) apply (simp) apply (simp) apply (metis (no_types, lifting) vwb_lens_wb wb_lens_weak weak_lens.put_get) done text \For this reason, by transitivity, any two bijective lenses with the same source type must be equivalent.\ lemma bij_lens_equiv: "\ bij_lens X; X \\<^sub>L Y \ \ bij_lens Y" by (meson bij_lens_equiv_id lens_equiv_def sublens_trans) lemma bij_lens_cong: "X \\<^sub>L Y \ bij_lens X = bij_lens Y" by (meson bij_lens_equiv lens_equiv_sym) text \We can also show that the identity lens @{term "1\<^sub>L"} is unique. That is to say it is the only lens which when compose with $Y$ will yield $Y$.\ lemma lens_id_unique: "weak_lens Y \ Y = X ;\<^sub>L Y \ X = 1\<^sub>L" apply (cases Y) apply (cases X) apply (auto simp add: lens_comp_def comp_def id_lens_def fun_eq_iff) apply (metis select_convs(1) weak_lens.create_get) apply (metis select_convs(1) select_convs(2) weak_lens.put_get) done text \Consequently, if composition of two lenses $X$ and $Y$ yields @{text "1\<^sub>L"}, then both of the composed lenses must be bijective.\ lemma bij_lens_via_comp_id_left: "\ wb_lens X; wb_lens Y; X ;\<^sub>L Y = 1\<^sub>L \ \ bij_lens X" apply (cases Y) apply (cases X) apply (auto simp add: lens_comp_def comp_def id_lens_def fun_eq_iff) apply (unfold_locales) apply (simp_all) using vwb_lens_wb wb_lens_weak weak_lens.put_get apply fastforce apply (metis select_convs(1) select_convs(2) wb_lens_weak weak_lens.put_get) done lemma bij_lens_via_comp_id_right: "\ wb_lens X; wb_lens Y; X ;\<^sub>L Y = 1\<^sub>L \ \ bij_lens Y" apply (cases Y) apply (cases X) apply (auto simp add: lens_comp_def comp_def id_lens_def fun_eq_iff) apply (unfold_locales) apply (simp_all) using vwb_lens_wb wb_lens_weak weak_lens.put_get apply fastforce apply (metis select_convs(1) select_convs(2) wb_lens_weak weak_lens.put_get) done text \Importantly, an equivalence between two lenses can be demonstrated by showing that one lens can be converted to the other by application of a suitable bijective lens $Z$. This $Z$ lens converts the view type of one to the view type of the other.\ lemma lens_equiv_via_bij: assumes "bij_lens Z" "X = Z ;\<^sub>L Y" shows "X \\<^sub>L Y" using assms apply (auto simp add: lens_equiv_def sublens_def) using bij_lens_vwb apply blast apply (rule_tac x="lens_inv Z" in exI) apply (auto simp add: lens_comp_assoc bij_lens_inv_left) using bij_lens_vwb lens_inv_bij apply blast done text \Indeed, we actually have a stronger result than this -- the equivalent lenses are precisely those than can be converted to one another through a suitable bijective lens. Bijective lenses can thus be seen as a special class of "adapter" lens.\ lemma lens_equiv_iff_bij: assumes "weak_lens Y" shows "X \\<^sub>L Y \ (\ Z. bij_lens Z \ X = Z ;\<^sub>L Y)" apply (rule iffI) apply (auto simp add: lens_equiv_def sublens_def lens_id_unique)[1] apply (rename_tac Z\<^sub>1 Z\<^sub>2) apply (rule_tac x="Z\<^sub>1" in exI) apply (simp) apply (subgoal_tac "Z\<^sub>2 ;\<^sub>L Z\<^sub>1 = 1\<^sub>L") apply (meson bij_lens_via_comp_id_right vwb_lens_wb) apply (metis assms lens_comp_assoc lens_id_unique) using lens_equiv_via_bij apply blast done lemma pbij_plus_commute: "\ a \ b; mwb_lens a; mwb_lens b; pbij_lens (b +\<^sub>L a) \ \ pbij_lens (a +\<^sub>L b)" apply (unfold_locales, simp_all add:lens_defs lens_indep_sym prod.case_eq_if) using lens_indep.lens_put_comm pbij_lens.put_det apply fastforce done subsection \Lens Override Laws\ text \The following laws are analogus to the equivalent laws for functions.\ lemma lens_override_id [simp]: "S\<^sub>1 \\<^sub>L S\<^sub>2 on 1\<^sub>L = S\<^sub>2" by (simp add: lens_override_def id_lens_def) lemma lens_override_unit [simp]: "S\<^sub>1 \\<^sub>L S\<^sub>2 on 0\<^sub>L = S\<^sub>1" by (simp add: lens_override_def zero_lens_def) lemma lens_override_overshadow: assumes "mwb_lens Y" "X \\<^sub>L Y" shows "(S\<^sub>1 \\<^sub>L S\<^sub>2 on X) \\<^sub>L S\<^sub>3 on Y = S\<^sub>1 \\<^sub>L S\<^sub>3 on Y" using assms by (simp add: lens_override_def sublens_put_put) lemma lens_override_irr: assumes "X \ Y" shows "S\<^sub>1 \\<^sub>L (S\<^sub>2 \\<^sub>L S\<^sub>3 on Y) on X = S\<^sub>1 \\<^sub>L S\<^sub>2 on X" using assms by (simp add: lens_override_def) lemma lens_override_overshadow_left: assumes "mwb_lens X" shows "(S\<^sub>1 \\<^sub>L S\<^sub>2 on X) \\<^sub>L S\<^sub>3 on X = S\<^sub>1 \\<^sub>L S\<^sub>3 on X" by (simp add: assms lens_override_def) lemma lens_override_overshadow_right: assumes "mwb_lens X" shows "S\<^sub>1 \\<^sub>L (S\<^sub>2 \\<^sub>L S\<^sub>3 on X) on X = S\<^sub>1 \\<^sub>L S\<^sub>3 on X" by (simp add: assms lens_override_def) lemma lens_override_plus: "X \ Y \ S\<^sub>1 \\<^sub>L S\<^sub>2 on (X +\<^sub>L Y) = (S\<^sub>1 \\<^sub>L S\<^sub>2 on X) \\<^sub>L S\<^sub>2 on Y" by (simp add: lens_indep_comm lens_override_def lens_plus_def) lemma lens_override_idem [simp]: "vwb_lens X \ S \\<^sub>L S on X = S" by (simp add: lens_override_def) lemma lens_override_mwb_idem [simp]: "\ mwb_lens X; S \ \\<^bsub>X\<^esub> \ \ S \\<^sub>L S on X = S" by (simp add: lens_override_def) lemma lens_override_put_right_in: "\ vwb_lens A; X \\<^sub>L A \ \ S\<^sub>1 \\<^sub>L (put\<^bsub>X\<^esub> S\<^sub>2 v) on A = put\<^bsub>X\<^esub> (S\<^sub>1 \\<^sub>L S\<^sub>2 on A) v" by (simp add: lens_override_def lens_get_put_quasi_commute lens_put_of_quotient) lemma lens_override_put_right_out: "\ vwb_lens A; X \ A \ \ S\<^sub>1 \\<^sub>L (put\<^bsub>X\<^esub> S\<^sub>2 v) on A = (S\<^sub>1 \\<^sub>L S\<^sub>2 on A)" by (simp add: lens_override_def lens_indep.lens_put_irr2) lemma lens_indep_overrideI: assumes "vwb_lens X" "vwb_lens Y" "(\ s\<^sub>1 s\<^sub>2 s\<^sub>3. s\<^sub>1 \\<^sub>L s\<^sub>2 on X \\<^sub>L s\<^sub>3 on Y = s\<^sub>1 \\<^sub>L s\<^sub>3 on Y \\<^sub>L s\<^sub>2 on X)" shows "X \ Y" using assms apply (unfold_locales) apply (simp_all add: lens_override_def) apply (metis mwb_lens_def vwb_lens_mwb weak_lens.put_get) apply (metis lens_override_def lens_override_idem mwb_lens_def vwb_lens_mwb weak_lens.put_get) apply (metis mwb_lens_weak vwb_lens_mwb vwb_lens_wb wb_lens.get_put weak_lens.put_get) done lemma lens_indep_override_def: assumes "vwb_lens X" "vwb_lens Y" shows "X \ Y \ (\ s\<^sub>1 s\<^sub>2 s\<^sub>3. s\<^sub>1 \\<^sub>L s\<^sub>2 on X \\<^sub>L s\<^sub>3 on Y = s\<^sub>1 \\<^sub>L s\<^sub>3 on Y \\<^sub>L s\<^sub>2 on X)" by (metis assms(1) assms(2) lens_indep_comm lens_indep_overrideI lens_override_def) text \ Alternative characterisation of very-well behaved lenses: override is idempotent. \ lemma override_idem_implies_vwb: "\ mwb_lens X; \ s. s \\<^sub>L s on X = s \ \ vwb_lens X" by (unfold_locales, simp_all add: lens_defs) subsection \ Alternative Sublens Characterisation \ text \ The following definition is equivalent to the above when the two lenses are very well behaved. \ definition sublens' :: "('a \ 'c) \ ('b \ 'c) \ bool" (infix "\\<^sub>L''" 55) where [lens_defs]: "sublens' X Y = (\ s\<^sub>1 s\<^sub>2 s\<^sub>3. s\<^sub>1 \\<^sub>L s\<^sub>2 on Y \\<^sub>L s\<^sub>3 on X = s\<^sub>1 \\<^sub>L s\<^sub>2 \\<^sub>L s\<^sub>3 on X on Y)" text \ We next prove some characteristic properties of our alternative definition of sublens. \ lemma sublens'_prop1: assumes "vwb_lens X" "X \\<^sub>L' Y" shows "put\<^bsub>X\<^esub> (put\<^bsub>Y\<^esub> s\<^sub>1 (get\<^bsub>Y\<^esub> s\<^sub>2)) s\<^sub>3 = put\<^bsub>Y\<^esub> s\<^sub>1 (get\<^bsub>Y\<^esub> (put\<^bsub>X\<^esub> s\<^sub>2 s\<^sub>3))" using assms by (simp add: sublens'_def, metis lens_override_def mwb_lens_def vwb_lens_mwb weak_lens.put_get) lemma sublens'_prop2: assumes "vwb_lens X" "X \\<^sub>L' Y" shows "get\<^bsub>X\<^esub> (put\<^bsub>Y\<^esub> s\<^sub>1 (get\<^bsub>Y\<^esub> s\<^sub>2)) = get\<^bsub>X\<^esub> s\<^sub>2" using assms unfolding sublens'_def by (metis lens_override_def vwb_lens_wb wb_lens_axioms_def wb_lens_def weak_lens.put_get) lemma sublens'_prop3: assumes "vwb_lens X" "vwb_lens Y" "X \\<^sub>L' Y" shows "put\<^bsub>Y\<^esub> \ (get\<^bsub>Y\<^esub> (put\<^bsub>X\<^esub> (put\<^bsub>Y\<^esub> \ (get\<^bsub>Y\<^esub> \)) v)) = put\<^bsub>X\<^esub> \ v" by (metis assms(1) assms(2) assms(3) mwb_lens_def sublens'_prop1 vwb_lens.put_eq vwb_lens_mwb weak_lens.put_get) text \ Finally we show our two definitions of sublens are equivalent, assuming very well behaved lenses. \ lemma sublens'_implies_sublens: assumes "vwb_lens X" "vwb_lens Y" "X \\<^sub>L' Y" shows "X \\<^sub>L Y" proof - have "vwb_lens (X /\<^sub>L Y)" by (unfold_locales ,auto simp add: assms lens_quotient_def lens_comp_def lens_create_def sublens'_prop1 sublens'_prop2) moreover have "X = X /\<^sub>L Y ;\<^sub>L Y" proof - have "get\<^bsub>X\<^esub> = (\\. get\<^bsub>X\<^esub> (create\<^bsub>Y\<^esub> \)) \ get\<^bsub>Y\<^esub>" by (rule ext, simp add: assms(1) assms(3) lens_create_def sublens'_prop2) moreover have "put\<^bsub>X\<^esub> = (\\ v. put\<^bsub>Y\<^esub> \ (get\<^bsub>Y\<^esub> (put\<^bsub>X\<^esub> (create\<^bsub>Y\<^esub> (get\<^bsub>Y\<^esub> \)) v)))" by (rule ext, rule ext, simp add: assms(1) assms(2) assms(3) lens_create_def sublens'_prop3) ultimately show ?thesis by (simp add: lens_quotient_def lens_comp_def) qed ultimately show ?thesis using sublens_def by blast qed lemma sublens_implies_sublens': assumes "vwb_lens Y" "X \\<^sub>L Y" shows "X \\<^sub>L' Y" by (metis assms lens_override_def lens_override_put_right_in sublens'_def) lemma sublens_iff_sublens': assumes "vwb_lens X" "vwb_lens Y" shows "X \\<^sub>L Y \ X \\<^sub>L' Y" using assms sublens'_implies_sublens sublens_implies_sublens' by blast +text \ We can also prove the closure law for lens quotient \ + +lemma lens_quotient_vwb: "\ vwb_lens x; vwb_lens y; x \\<^sub>L y \ \ vwb_lens (x /\<^sub>L y)" + by (unfold_locales) + (simp_all add: sublens'_def lens_quotient_def lens_quotient_mwb sublens_iff_sublens' lens_create_def sublens'_prop1 sublens'_prop2) + +lemma lens_quotient_indep: + "\ vwb_lens x; vwb_lens y; vwb_lens a; x \ y; x \\<^sub>L a; y \\<^sub>L a \ \ (x /\<^sub>L a) \ (y /\<^sub>L a)" + by (unfold_locales) + (simp_all add: lens_quotient_def sublens_iff_sublens' lens_create_def lens_indep.lens_put_comm sublens'_prop1 sublens'_prop2 lens_indep.lens_put_irr2) + +lemma lens_quotient_bij: "\ vwb_lens x; vwb_lens y; y \\<^sub>L x \ \ bij_lens (x /\<^sub>L y)" + by (metis lens_comp_quotient lens_equiv_iff_bij lens_equiv_sym vwb_lens_wb wb_lens_weak) + subsection \ Alternative Equivalence Characterisation \ definition lens_equiv' :: "('a \ 'c) \ ('b \ 'c) \ bool" (infix "\\<^sub>L''" 51) where [lens_defs]: "lens_equiv' X Y = (\ s\<^sub>1 s\<^sub>2. (s\<^sub>1 \\<^sub>L s\<^sub>2 on X = s\<^sub>1 \\<^sub>L s\<^sub>2 on Y))" lemma lens_equiv_iff_lens_equiv': assumes "vwb_lens X" "vwb_lens Y" shows "X \\<^sub>L Y \ X \\<^sub>L' Y" apply (simp add: lens_equiv_def sublens_iff_sublens' assms) apply (auto simp add: lens_defs assms) apply (metis assms(2) mwb_lens.put_put vwb_lens_mwb vwb_lens_wb wb_lens.get_put) done +subsection \ Ineffectual Lenses as Zero Elements \ + +lemma ief_lens_then_zero: "ief_lens x \ x \\<^sub>L 0\<^sub>L" + by (simp add: lens_equiv_iff_lens_equiv' lens_equiv'_def) + (simp add: ief_lens.put_inef lens_override_def) + +lemma ief_lens_iff_zero: "vwb_lens x \ ief_lens x \ x \\<^sub>L 0\<^sub>L" + by (metis ief_lens_axioms_def ief_lens_def ief_lens_then_zero lens_equiv_def lens_override_def lens_override_unit sublens'_prop3 sublens_implies_sublens' unit_vwb_lens vwb_lens_wb wb_lens_weak) + end \ No newline at end of file diff --git a/thys/Optics/Lens_Record.ML b/thys/Optics/Lens_Record.ML --- a/thys/Optics/Lens_Record.ML +++ b/thys/Optics/Lens_Record.ML @@ -1,361 +1,397 @@ signature LENS_UTILS = sig val add_alphabet : (string * class list) list * binding -> string option -> (binding * typ * mixfix) list -> theory -> theory val add_alphabet_cmd : (string * string option) list * binding -> string option -> (binding * string * mixfix) list -> theory -> theory val rename_alpha_vars : tactic end; structure Lens_Utils : LENS_UTILS = struct open Syntax; open Lens_Lib; (* We set up the following syntactic entities that correspond to various parts of Isabelle syntax and names that we depend on. These code would need to be updated if the names of the Isabelle and lens theories and/or theorems change. *) val FLDLENS = "FLDLENS" val BASELENS = "BASELENS" val base_lensN = "base\<^sub>L" val child_lensN = "more\<^sub>L" val all_lensN = "all\<^sub>L" val base_moreN = "base_more" val bij_lens_suffix = "_bij_lens" +val bij_lensesN = "bij_lenses" val vwb_lens_suffix = "_vwb_lens" val sym_lens_suffix = "_sym_lens" val Trueprop = @{const_name Trueprop} val HOLeq = @{const_name HOL.eq} -val lens_suffix = "\<^sub>v" val lens_defsN = "lens_defs" val lens_defs = (Binding.empty, [Token.make_src (lens_defsN, Position.none) []]) val alpha_splitsN = "alpha_splits" val alpha_splits = [Token.make_src (alpha_splitsN, Position.none) []] val equivN = "equivs" val splits_suffix = ".splits" val defs_suffix = ".defs" val slens_view = "view" val slens_coview = "coview" (* The following code is adapted from the record package. We generate a record, but also create lenses for each field and prove properties about them. *) fun read_parent NONE ctxt = (NONE, ctxt) | read_parent (SOME raw_T) ctxt = (case Proof_Context.read_typ_abbrev ctxt raw_T of Type (name, Ts) => (SOME (Ts, name), fold Variable.declare_typ Ts ctxt) | T => error ("Bad parent record specification: " ^ Syntax.string_of_typ ctxt T)); fun add_record_cmd overloaded (params, binding) raw_parent fields thy = let val ctxt = Proof_Context.init_global thy; val ctxt1 = fold (Variable.declare_typ o TFree) params ctxt; val (parent, ctxt2) = read_parent raw_parent ctxt1; val ctxt3 = fold Variable.declare_typ (map (fn (_, ty, _) => ty) fields) ctxt2 val params' = (map (Proof_Context.check_tfree ctxt3) params); in thy |> Record.add_record overloaded (params', binding) parent fields end; (* Get all the parents of a given named record *) fun get_parents thy nm = case Record.get_parent thy nm of SOME (ts, nm') => (ts, nm') :: get_parents thy nm' | NONE => []; - (* Construct a theorem and proof that a given field lens is very well-behaved *) fun lens_proof tname x thy = let open Simplifier; open Global_Theory in Goal.prove_global thy [] [] (hd (Type_Infer_Context.infer_types (Proof_Context.init_global thy) [mk_vwb_lens (const (Context.theory_name thy ^ "." ^ tname ^ "." ^ x))])) (fn {context = context, prems = _} => EVERY [ Locale.intro_locales_tac {strict = true, eager = true} context [] , PARALLEL_ALLGOALS (asm_simp_tac (fold add_simp (get_thm thy (x ^ "_def") :: get_thms thy (tname ^ ".defs")) context))]) end fun lens_sym_proof tname thy = let open Simplifier; open Global_Theory in Goal.prove_global thy [] [] (hd (Type_Infer_Context.infer_types (Proof_Context.init_global thy) [ Const (Trueprop, dummyT) $ (const sym_lensN $ const (Context.theory_name thy ^ "." ^ tname ^ "." ^ all_lensN))])) (fn {context = context, prems = _} => EVERY [ Classical.rule_tac context [@{thm sym_lens.intro}] [] 1 , PARALLEL_ALLGOALS (asm_simp_tac (fold add_simp (@{thms slens.defs} @ get_thms thy (tname ^ ".defs")) context))]) end fun prove_lens_goal tname thy ctx = let open Simplifier; open Global_Theory in auto_tac (fold add_simp (get_thms thy lens_defsN @ get_thms thy (tname ^ splits_suffix) @ [@{thm prod.case_eq_if}]) ctx) end fun prove_indep tname thy = let open Simplifier; open Global_Theory in (fn {context, prems = _} => EVERY [auto_tac (add_simp @{thm lens_indep_vwb_iff} context) ,prove_lens_goal tname thy context]) end fun prove_sublens tname thy = let open Simplifier; open Global_Theory in (fn {context, prems = _} => EVERY [auto_tac (add_simp @{thm sublens_iff_sublens'} context) ,prove_lens_goal tname thy context]) end fun prove_quotient tname thy = let open Simplifier; open Global_Theory in (fn {context, prems = _} => EVERY [prove_lens_goal tname thy context]) end fun prove_equiv tname thy = let open Simplifier; open Global_Theory in (fn {context, prems = _} => EVERY [auto_tac (add_simp @{thm lens_equiv_iff_lens_equiv'} context) ,prove_lens_goal tname thy context]) end -(* Constrct a proof that base + more is a bijective lens *) +(* Construct a proof that base + more is a bijective lens *) fun lens_bij_proof tname thy = let open Simplifier; open Global_Theory in Goal.prove_global thy [] [] (hd (Type_Infer_Context.infer_types (Proof_Context.init_global thy) [ Const (Trueprop, dummyT) $ (const (bij_lensN) $ (const (lens_plusN) $ const (Context.theory_name thy ^ "." ^ tname ^ "." ^ base_lensN) $ const (Context.theory_name thy ^ "." ^ tname ^ "." ^ child_lensN)))])) (fn {context = context, prems = _} => EVERY [ Locale.intro_locales_tac {strict = true, eager = true} context [] , auto_tac (fold add_simp (get_thms thy lens_defsN @ [@{thm prod.case_eq_if}]) context)]) end (* Construct a theorem and proof that two lenses, x and y, are independent. Since some lenses exist both with the source type as the record extension, and in the context of the extended record we need two versions of this function. The first shows it for the lenses on the extension, and thus uses an "intro_locales" as a means to discharge the individual lens laws of the vwb_lens locale. *) fun indep_proof tname thy (x, y) = let open Simplifier; open Global_Theory in Goal.prove_global thy [] [] (hd (Type_Infer_Context.infer_types (Proof_Context.init_global thy) [ mk_indep (const (Context.theory_name thy ^ "." ^ tname ^ "." ^ x)) (const (Context.theory_name thy ^ "." ^ tname ^ "." ^ y)) ])) (prove_indep tname thy) end +fun equiv_one_proof tname thy fs = + let open Simplifier; open Global_Theory; open Context; open Term in + Goal.prove_global thy [] [] + (hd (Type_Infer_Context.infer_types + (Proof_Context.init_global thy) + [ Const (Trueprop, dummyT) + $ ( Const (lens_equivN, dummyT) + $ Const (id_lensN, dummyT) + $ foldr1 (fn (x, y) => Const (lens_plusN, dummyT) $ x $ y) + (map (fn n => Const (theory_name thy ^ "." ^ tname ^ "." ^ n, dummyT)) (fs @ [child_lensN])) + )])) + (prove_equiv tname thy) + end + + fun equiv_more_proof tname pname thy fs = let open Simplifier; open Global_Theory; open Context; open Term in Goal.prove_global thy [] [] (hd (Type_Infer_Context.infer_types (Proof_Context.init_global thy) [ Const (Trueprop, dummyT) $ ( Const (lens_equivN, dummyT) $ Const (pname ^ "." ^ child_lensN, dummyT) $ foldr1 (fn (x, y) => Const (lens_plusN, dummyT) $ x $ y) (map (fn n => Const (theory_name thy ^ "." ^ tname ^ "." ^ n, dummyT)) (fs @ [child_lensN])) )])) (prove_equiv tname thy) end fun equiv_base_proof tname parent thy fs = let open Simplifier; open Global_Theory; open Context; open Term in Goal.prove_global thy [] [] (hd (Type_Infer_Context.infer_types (Proof_Context.init_global thy) [ Const (Trueprop, dummyT) $ ( Const (lens_equivN, dummyT) $ Const (theory_name thy ^ "." ^ tname ^ "." ^ base_lensN, dummyT) $ foldr1 (fn (x, y) => Const (lens_plusN, dummyT) $ x $ y) ((case parent of NONE => [] | SOME (_, pname) => [Const (pname ^ "." ^ base_lensN, dummyT)]) @ map (fn n => Const (theory_name thy ^ "." ^ tname ^ "." ^ n, dummyT)) fs) )])) (prove_equiv tname thy) end +fun lenses_bij_proof tname parent thy fs = + let open Simplifier; open Global_Theory; open Context; open Term in + Goal.prove_global thy [] [] + (hd (Type_Infer_Context.infer_types + (Proof_Context.init_global thy) + [ Const (Trueprop, dummyT) + $ (const (bij_lensN) $ + (foldr1 (fn (x, y) => Const (lens_plusN, dummyT) $ x $ y) + ((case parent of NONE => [] | SOME (_, pname) => [Const (pname ^ "." ^ base_lensN, dummyT)]) @ + map (fn n => Const (theory_name thy ^ "." ^ tname ^ "." ^ n, dummyT)) (fs @ [child_lensN])))) + ])) + (fn {context = context, prems = _} + => EVERY [ Locale.intro_locales_tac {strict = true, eager = true} context [] + , auto_tac (fold add_simp (get_thms thy lens_defsN @ [@{thm prod.case_eq_if}]) + context)]) + end + + fun equiv_partition_proof tname thy = let open Simplifier; open Global_Theory; open Context; open Term in Goal.prove_global thy [] [] (hd (Type_Infer_Context.infer_types (Proof_Context.init_global thy) [ Const (Trueprop, dummyT) $ ( Const (lens_equivN, dummyT) $ ( Const (lens_plusN, dummyT) $ Const (theory_name thy ^ "." ^ tname ^ "." ^ base_lensN, dummyT) $ Const (theory_name thy ^ "." ^ tname ^ "." ^ child_lensN, dummyT)) $ Const (id_lensN, dummyT) )])) (prove_equiv tname thy) end (* Prove a theorem that every child lens is a sublens of the parent. *) fun sublens_proof tname pname thy y x = let open Simplifier; open Global_Theory in Goal.prove_global thy [] [] (hd (Type_Infer_Context.infer_types (Proof_Context.init_global thy) [ Const (Trueprop, dummyT) $ ( Const (sublensN, dummyT) $ Const (Context.theory_name thy ^ "." ^ tname ^ "." ^ x, dummyT) $ Const (pname ^ "." ^ y, dummyT) )])) (prove_sublens tname thy) end fun quotient_proof tname thy x = let open Simplifier; open Global_Theory in Goal.prove_global thy [] [] (hd (Type_Infer_Context.infer_types (Proof_Context.init_global thy) [ Const (Trueprop, dummyT) $ ( Const (HOLeq, dummyT) $ (Const (lens_quotientN, dummyT) $ Const (Context.theory_name thy ^ "." ^ tname ^ "." ^ x, dummyT) $ Const (Context.theory_name thy ^ "." ^ tname ^ "." ^ base_lensN, dummyT) ) $ Const (Context.theory_name thy ^ "." ^ tname ^ "." ^ x, dummyT) )])) (prove_quotient tname thy) end fun composition_proof tname thy x = let open Simplifier; open Global_Theory in Goal.prove_global thy [] [] (hd (Type_Infer_Context.infer_types (Proof_Context.init_global thy) [ Const (Trueprop, dummyT) $ ( Const (HOLeq, dummyT) $ (Const (lens_compN, dummyT) $ Const (Context.theory_name thy ^ "." ^ tname ^ "." ^ x, dummyT) $ Const (Context.theory_name thy ^ "." ^ tname ^ "." ^ base_lensN, dummyT) ) $ Const (Context.theory_name thy ^ "." ^ tname ^ "." ^ x, dummyT) )])) (prove_quotient tname thy) end (* Finally we have the function that actually constructs the record, lenses for each field, independence proofs, and also sublens proofs. *) fun add_alphabet (params, binding) raw_parent ty_fields thy = let open Simplifier; open Global_Theory val tname = Binding.name_of binding val fields = map (fn (x, y, z) => (Binding.suffix_name lens_suffix x, y, z)) ty_fields val lnames = map (fn (x, _, _) => Binding.name_of x) ty_fields val (parent, _) = read_parent raw_parent (Proof_Context.init_global thy); fun ldef x = (x, x ^ " = " ^ FLDLENS ^ " " ^ x ^ lens_suffix) val pname = case parent of SOME (_,r) => r | NONE => ""; val plchild = case raw_parent of SOME _ => child_lensN | NONE => "" + val plchilds = + case raw_parent of + SOME _ => [child_lensN] | + NONE => [] val bldef = (base_lensN, base_lensN ^ " = " ^ BASELENS ^ " " ^ tname); val mldef = (child_lensN, child_lensN ^ " = " ^ FLDLENS ^ " more"); val sldef = (all_lensN, all_lensN ^ " \ \ " ^ slens_view ^ " = " ^ base_lensN ^ ", " ^ slens_coview ^ " = " ^ child_lensN ^ " \"); - val plnames = if (raw_parent = NONE) then [] else lnames @ [child_lensN]; + val plnames = if (raw_parent = NONE) then [] else lnames @ [child_lensN]; fun pindeps thy = map (fn thm => @{thm sublens_pres_indep} OF [thm]) (get_thms thy sublensesN) @ map (fn thm => @{thm sublens_pres_indep'} OF [thm]) (get_thms thy sublensesN) - val attrs = map (Attrib.attribute (Named_Target.theory_init thy)) @{attributes [simp, code_unfold]} + val attrs = map (Attrib.attribute (Named_Target.theory_init thy)) @{attributes [simp, code_unfold, lens]} in thy (* Add a new record for the new alphabet lenses *) |> add_record_cmd {overloaded = false} (params, binding) raw_parent fields (* Add the record definition theorems to lens_defs *) |> Named_Target.theory_map (snd o Specification.theorems_cmd "" [((Binding.empty, []), [(Facts.named (tname ^ defs_suffix), snd lens_defs)])] [] false) (* Add the record splitting theorems to the alpha_splits set for proof automation *) |> Named_Target.theory_map (snd o Specification.theorems_cmd "" [((Binding.empty, []), [(Facts.named (tname ^ splits_suffix), alpha_splits)])] [] false) (* Reorder parent splitting theorems, so the child ones have higher priority *) |> (fn thy => let (* Get the splitting theorems of all parents in reverse order *) val psplits = List.concat (map (#splits o Record.the_info thy) ((map snd (get_parents thy (Context.theory_name thy ^ "." ^ tname))))) (* Remove the splitting theorems *) val thy1 = Context.theory_map (fold (Named_Theorems.del_thm "Lens_Instances.alpha_splits") psplits) thy (* Add them again, so they have lower priority than the child splitting theorems *) val thy2 = Context.theory_map (fold (Named_Theorems.add_thm "Lens_Instances.alpha_splits") psplits) thy1 in thy2 end) (* Add definitions for each of the lenses corresponding to each record field in-situ *) |> Sign.qualified_path false binding |> Named_Target.theory_map (fold (fn (n, d) => snd o Specification.definition_cmd (SOME (Binding.make (n, Position.none), NONE, NoSyn)) [] [] (lens_defs, d) true) (map ldef lnames @ [bldef, mldef])) (* Add definition of the underlying symmetric lens *) |> Named_Target.theory_map (fold (fn (n, d) => Specification.abbreviation_cmd Syntax.mode_default (SOME (Binding.make (n, Position.none), NONE, NoSyn)) [] d true) [sldef]) (* Add a vwb lens proof for each field lens *) |> fold (fn x => fn thy => snd (add_thm ((Binding.make (x ^ vwb_lens_suffix, Position.none), lens_proof tname x thy), attrs) thy)) (lnames @ [base_lensN, child_lensN]) - (* Add a bij lens proof for the base and more lenses *) + (* Add a bij lens proof for the base and more lenses *) |> (fn thy => snd (add_thm ((Binding.make (base_moreN ^ bij_lens_suffix, Position.none), lens_bij_proof tname thy), attrs) thy)) + (* Add a bij lens proof for the summation of all constituent lenses and the more lens *) + |> (fn thy => if raw_parent = NONE then snd (add_thm ((Binding.make (bij_lensesN, Position.none), lenses_bij_proof tname parent thy lnames), attrs) thy) else thy) (* Add sublens proofs *) |> (fn thy => snd (add_thmss [((Binding.make (sublensesN, Position.none), map (sublens_proof tname pname thy plchild) plnames @ map (sublens_proof tname (Context.theory_name thy ^ "." ^ tname) thy base_lensN) lnames), attrs)] thy)) - (* Add quotient proofs *) + (* Add quotient proofs *) |> (fn thy => snd (add_thmss [((Binding.make (quotientsN, Position.none), map (quotient_proof tname thy) lnames), attrs)] thy)) (* Add composition proofs *) |> (fn thy => snd (add_thmss [((Binding.make (compositionsN, Position.none), map (composition_proof tname thy) lnames), attrs)] thy)) (* Add independence proofs for each pairing of lenses *) |> (fn thy => snd (add_thmss [((Binding.make (indepsN, Position.none), map (indep_proof tname thy) (pairings (lnames @ [child_lensN]) @ pairings [base_lensN, child_lensN]) (*@ map (parent_indep_proof_1 tname pname thy plchild) plnames @ map (parent_indep_proof_2 tname pname thy plchild) plnames *) @ pindeps thy), attrs)] thy)) (* Add equivalence properties *) |> (fn thy => snd (add_thmss - [((Binding.make (equivN, Position.none), (if (raw_parent = NONE) then [] else [equiv_more_proof tname pname thy lnames]) @ [equiv_base_proof tname parent thy lnames, equiv_partition_proof tname thy]), attrs)] thy)) + [((Binding.make (equivN, Position.none), (if (raw_parent = NONE) then [equiv_one_proof tname thy lnames] else [equiv_more_proof tname pname thy lnames]) @ [equiv_base_proof tname parent thy lnames, equiv_partition_proof tname thy]), attrs)] thy)) (* Add a symmetric lens proof for the base and more lenses *) |> (fn thy => snd (add_thm ((Binding.make (all_lensN ^ sym_lens_suffix, Position.none), lens_sym_proof tname thy), attrs) thy)) |> Sign.parent_path end; fun add_alphabet_cmd (raw_params, binding) raw_parent raw_fields thy = let val ctx = (Proof_Context.init_global thy) val params = map (apsnd (Typedecl.read_constraint ctx)) raw_params; val ctx1 = fold (Variable.declare_typ o TFree) params ctx; val ty_fields = map (fn (x, y, z) => (x, Syntax.read_typ ctx1 y, z)) raw_fields in add_alphabet (params, binding) raw_parent ty_fields thy end fun remove_lens_suffixes i st = let val (_, _, Bi, _) = Thm.dest_state (st, i); val params = (map #1 (Logic.strip_params Bi)) val params' = - map (fn x => if (String.isSuffix lens_suffix x) - then String.substring (x, 0, (String.size x - String.size lens_suffix)) - else x) params ; + map remove_lens_suffix params ; in if params = params' then Seq.empty else Seq.single (Thm.rename_params_rule (params', i) st) end; val rename_alpha_vars = ALLGOALS (fn i => PRIMSEQ (remove_lens_suffixes i)); val _ = Outer_Syntax.command @{command_keyword alphabet} "define record with lenses" ((Parse.type_args_constrained -- Parse.binding) -- (@{keyword "="} |-- Scan.option (Parse.typ --| @{keyword "+"}) -- Scan.repeat1 Parse.const_binding) >> (fn (x, (y, z)) => Toplevel.theory (add_alphabet_cmd x y z))); end \ No newline at end of file diff --git a/thys/Optics/Lens_Record_Example.thy b/thys/Optics/Lens_Record_Example.thy --- a/thys/Optics/Lens_Record_Example.thy +++ b/thys/Optics/Lens_Record_Example.thy @@ -1,58 +1,59 @@ theory Lens_Record_Example imports Optics begin text \The alphabet command supports syntax illustrated in the following comments.\ alphabet mylens = x :: nat y :: string thm base_more_bij_lens thm indeps thm equivs thm sublenses thm quotients thm compositions +thm lens lemma mylens_composition: "x +\<^sub>L y +\<^sub>L more\<^sub>L \\<^sub>L 1\<^sub>L" (is "?P \\<^sub>L ?Q") proof - have "?Q \\<^sub>L base\<^sub>L +\<^sub>L more\<^sub>L" by (simp add: lens_equiv_sym) also have "... \\<^sub>L (x +\<^sub>L y) +\<^sub>L more\<^sub>L" by (simp add: lens_plus_eq_left) also have "... \\<^sub>L x +\<^sub>L y +\<^sub>L more\<^sub>L" by (simp add: lens_plus_assoc) finally show ?thesis - using lens_equiv_sym by auto + using lens_equiv_sym + by blast qed lemma mylens_bij_lens: "bij_lens (x +\<^sub>L y +\<^sub>L more\<^sub>L)" using bij_lens_equiv_id mylens_composition by auto alphabet mylens_2 = mylens + z :: int k :: "string list" -thm lens_defs - thm base_more_bij_lens +thm bij_lenses thm indeps thm equivs thm sublenses alphabet mylens_3 = mylens_2 + n :: real h :: nat thm base_more_bij_lens thm indeps thm equivs thm sublenses alphabet 't::monoid_add mylens_4 = mn :: "'t" end diff --git a/thys/Optics/Optics.thy b/thys/Optics/Optics.thy --- a/thys/Optics/Optics.thy +++ b/thys/Optics/Optics.thy @@ -1,5 +1,6 @@ section \Optics Meta-Theory\ theory Optics - imports Lenses Prisms Scenes Dataspace Channel_Type + imports Lenses Prisms Scenes Scene_Spaces Dataspace + Channel_Type begin end \ No newline at end of file diff --git a/thys/Optics/Prisms.thy b/thys/Optics/Prisms.thy --- a/thys/Optics/Prisms.thy +++ b/thys/Optics/Prisms.thy @@ -1,152 +1,203 @@ section \Prisms\ theory Prisms imports Lenses begin subsection \ Signature and Axioms \ -text \Prisms are like lenses, but they act on sum types rather than product types~\cite{Gibbons17}. +text \Prisms are like lenses, but they act on sum types rather than product types~\cite{Gibbons17}. See \url{https://hackage.haskell.org/package/lens-4.15.2/docs/Control-Lens-Prism.html} for more information.\ record ('v, 's) prism = prism_match :: "'s \ 'v option" ("match\") prism_build :: "'v \ 's" ("build\") type_notation prism (infixr "\\<^sub>\" 0) locale wb_prism = fixes x :: "'v \\<^sub>\ 's" (structure) assumes match_build: "match (build v) = Some v" and build_match: "match s = Some v \ s = build v" begin lemma build_match_iff: "match s = Some v \ s = build v" using build_match match_build by blast lemma range_build: "range build = dom match" using build_match match_build by fastforce + + lemma inj_build: "inj build" + by (metis injI match_build option.inject) + end declare wb_prism.match_build [simp] declare wb_prism.build_match [simp] subsection \ Co-dependence \ text \ The relation states that two prisms construct disjoint elements of the source. This can occur, for example, when the two prisms characterise different constructors of an algebraic datatype. \ definition prism_diff :: "('a \\<^sub>\ 's) \ ('b \\<^sub>\ 's) \ bool" (infix "\" 50) where -"prism_diff X Y = (range build\<^bsub>X\<^esub> \ range build\<^bsub>Y\<^esub> = {})" +[lens_defs]: "prism_diff X Y = (range build\<^bsub>X\<^esub> \ range build\<^bsub>Y\<^esub> = {})" lemma prism_diff_intro: "(\ s\<^sub>1 s\<^sub>2. build\<^bsub>X\<^esub> s\<^sub>1 = build\<^bsub>Y\<^esub> s\<^sub>2 \ False) \ X \ Y" by (auto simp add: prism_diff_def) lemma prism_diff_irrefl: "\ X \ X" by (simp add: prism_diff_def) lemma prism_diff_sym: "X \ Y \ Y \ X" by (auto simp add: prism_diff_def) lemma prism_diff_build: "X \ Y \ build\<^bsub>X\<^esub> u \ build\<^bsub>Y\<^esub> v" by (simp add: disjoint_iff_not_equal prism_diff_def) +lemma prism_diff_build_match: "\ wb_prism X; X \ Y \ \ match\<^bsub>X\<^esub> (build\<^bsub>Y\<^esub> v) = None" + using UNIV_I wb_prism.range_build by (fastforce simp add: prism_diff_def) + +subsection \ Canonical prisms \ + +definition prism_id :: "('a \\<^sub>\ 'a)" ("1\<^sub>\") where +[lens_defs]: "prism_id = \ prism_match = Some, prism_build = id \" + +lemma wb_prism_id: "wb_prism 1\<^sub>\" + unfolding prism_id_def wb_prism_def by simp + +lemma prism_id_never_diff: "\ 1\<^sub>\ \ X" + by (simp add: prism_diff_def prism_id_def) + subsection \ Summation \ definition prism_plus :: "('a \\<^sub>\ 's) \ ('b \\<^sub>\ 's) \ 'a + 'b \\<^sub>\ 's" (infixl "+\<^sub>\" 85) where -"X +\<^sub>\ Y = \ prism_match = (\ s. case (match\<^bsub>X\<^esub> s, match\<^bsub>Y\<^esub> s) of +[lens_defs]: "X +\<^sub>\ Y = \ prism_match = (\ s. case (match\<^bsub>X\<^esub> s, match\<^bsub>Y\<^esub> s) of (Some u, _) \ Some (Inl u) | (None, Some v) \ Some (Inr v) | (None, None) \ None), prism_build = (\ v. case v of Inl x \ build\<^bsub>X\<^esub> x | Inr y \ build\<^bsub>Y\<^esub> y) \" +lemma prism_plus_wb [simp]: "\ wb_prism X; wb_prism Y; X \ Y \ \ wb_prism (X +\<^sub>\ Y)" + apply (unfold_locales) + apply (auto simp add: prism_plus_def sum.case_eq_if option.case_eq_if prism_diff_build_match) + apply (metis map_option_case map_option_eq_Some option.exhaust option.sel sum.disc(2) sum.sel(1) wb_prism.build_match_iff) + apply (metis (no_types, lifting) isl_def not_None_eq option.case_eq_if option.sel sum.sel(2) wb_prism.build_match) + done + +lemma build_plus_Inl [simp]: "build\<^bsub>c +\<^sub>\ d\<^esub> (Inl x) = build\<^bsub>c\<^esub> x" + by (simp add: prism_plus_def) + +lemma build_plus_Inr [simp]: "build\<^bsub>c +\<^sub>\ d\<^esub> (Inr y) = build\<^bsub>d\<^esub> y" + by (simp add: prism_plus_def) + +lemma prism_diff_preserved_1 [simp]: "\ X \ Y; X \ Z \ \ X \ Y +\<^sub>\ Z" + by (auto simp add: lens_defs sum.case_eq_if) + +lemma prism_diff_preserved_2 [simp]: "\ X \ Z; Y \ Z \ \ X +\<^sub>\ Y \ Z" + by (meson prism_diff_preserved_1 prism_diff_sym) + +text \ The following two lemmas are useful for reasoning about prism sums \ + +lemma Bex_Sum_iff: "(\x\A<+>B. P x) \ (\ x\A. P (Inl x)) \ (\ y\B. P (Inr y))" + by (auto) + +lemma Ball_Sum_iff: "(\x\A<+>B. P x) \ (\ x\A. P (Inl x)) \ (\ y\B. P (Inr y))" + by (auto) + subsection \ Instances \ definition prism_suml :: "('a, 'a + 'b) prism" ("Inl\<^sub>\") where [lens_defs]: "prism_suml = \ prism_match = (\ v. case v of Inl x \ Some x | _ \ None), prism_build = Inl \" definition prism_sumr :: "('b, 'a + 'b) prism" ("Inr\<^sub>\") where [lens_defs]: "prism_sumr = \ prism_match = (\ v. case v of Inr x \ Some x | _ \ None), prism_build = Inr \" -lemma wb_prim_suml: "wb_prism Inl\<^sub>\" +lemma wb_prim_suml [simp]: "wb_prism Inl\<^sub>\" apply (unfold_locales) apply (simp_all add: prism_suml_def sum.case_eq_if) apply (metis option.inject option.simps(3) sum.collapse(1)) done -lemma wb_prim_sumr: "wb_prism Inr\<^sub>\" +lemma wb_prim_sumr [simp]: "wb_prism Inr\<^sub>\" apply (unfold_locales) apply (simp_all add: prism_sumr_def sum.case_eq_if) apply (metis option.distinct(1) option.inject sum.collapse(2)) done lemma prism_suml_indep_sumr [simp]: "Inl\<^sub>\ \ Inr\<^sub>\" - by (auto simp add: prism_diff_def lens_defs) + by (auto simp add: lens_defs) + +lemma prism_sum_plus: "Inl\<^sub>\ +\<^sub>\ Inr\<^sub>\ = 1\<^sub>\" + unfolding lens_defs prism_plus_def by (auto simp add: Inr_Inl_False sum.case_eq_if) subsection \ Lens correspondence \ text \ Every well-behaved prism can be represented by a partial bijective lens. We prove this by exhibiting conversion functions and showing they are (almost) inverses. \ definition prism_lens :: "('a, 's) prism \ ('a \ 's)" where "prism_lens X = \ lens_get = (\ s. the (match\<^bsub>X\<^esub> s)), lens_put = (\ s v. build\<^bsub>X\<^esub> v) \" definition lens_prism :: "('a \ 's) \ ('a, 's) prism" where "lens_prism X = \ prism_match = (\ s. if (s \ \\<^bsub>X\<^esub>) then Some (get\<^bsub>X\<^esub> s) else None) , prism_build = create\<^bsub>X\<^esub> \" +lemma mwb_prism_lens: "wb_prism a \ mwb_lens (prism_lens a)" + by (simp add: mwb_lens_axioms_def mwb_lens_def weak_lens_def prism_lens_def) + lemma get_prism_lens: "get\<^bsub>prism_lens X\<^esub> = the \ match\<^bsub>X\<^esub>" by (simp add: prism_lens_def fun_eq_iff) lemma src_prism_lens: "\\<^bsub>prism_lens X\<^esub> = range (build\<^bsub>X\<^esub>)" by (auto simp add: prism_lens_def lens_source_def) lemma create_prism_lens: "create\<^bsub>prism_lens X\<^esub> = build\<^bsub>X\<^esub>" by (simp add: prism_lens_def lens_create_def fun_eq_iff) lemma prism_lens_inverse: "wb_prism X \ lens_prism (prism_lens X) = X" unfolding lens_prism_def src_prism_lens create_prism_lens get_prism_lens by (auto intro: prism.equality simp add: fun_eq_iff domIff wb_prism.range_build) text \ Function @{const lens_prism} is almost inverted by @{const prism_lens}. The $put$ functions are identical, but the $get$ functions differ when applied to a source where the prism @{term X} is undefined. \ lemma lens_prism_put_inverse: "pbij_lens X \ put\<^bsub>prism_lens (lens_prism X)\<^esub> = put\<^bsub>X\<^esub>" unfolding prism_lens_def lens_prism_def by (auto simp add: fun_eq_iff pbij_lens.put_is_create) lemma wb_prism_implies_pbij_lens: "wb_prism X \ pbij_lens (prism_lens X)" by (unfold_locales, simp_all add: prism_lens_def) lemma pbij_lens_implies_wb_prism: assumes "pbij_lens X" shows "wb_prism (lens_prism X)" proof (unfold_locales) fix s v show "match\<^bsub>lens_prism X\<^esub> (build\<^bsub>lens_prism X\<^esub> v) = Some v" by (simp add: lens_prism_def weak_lens.create_closure assms) assume a: "match\<^bsub>lens_prism X\<^esub> s = Some v" show "s = build\<^bsub>lens_prism X\<^esub> v" proof (cases "s \ \\<^bsub>X\<^esub>") case True with a assms show ?thesis by (simp add: lens_prism_def lens_create_def, metis mwb_lens.weak_get_put pbij_lens.put_det pbij_lens_mwb) next case False with a assms show ?thesis by (simp add: lens_prism_def) qed qed ML_file \Prism_Lib.ML\ end diff --git a/thys/Optics/Scene_Spaces.thy b/thys/Optics/Scene_Spaces.thy new file mode 100644 --- /dev/null +++ b/thys/Optics/Scene_Spaces.thy @@ -0,0 +1,841 @@ +section \ Scene Spaces \ + +theory Scene_Spaces + imports Scenes +begin + +subsection \ Preliminaries \ + +abbreviation foldr_scene :: "'a scene list \ 'a scene" ("\\<^sub>S") where +"foldr_scene as \ foldr (\\<^sub>S) as \\<^sub>S" + +lemma pairwise_indep_then_compat [simp]: "pairwise (\\<^sub>S) A \ pairwise (##\<^sub>S) A" + by (simp add: pairwise_alt) + +lemma pairwise_compat_foldr: + "\ pairwise (##\<^sub>S) (set as); \ b \ set as. a ##\<^sub>S b \ \ a ##\<^sub>S \\<^sub>S as" + apply (induct as) + apply (simp) + apply (auto simp add: pairwise_insert scene_union_pres_compat) + done + +lemma foldr_scene_indep: + "\ pairwise (##\<^sub>S) (set as); \ b \ set as. a \\<^sub>S b \ \ a \\<^sub>S \\<^sub>S as" + apply (induct as) + apply (simp) + apply (auto intro: scene_indep_pres_compat simp add: pairwise_insert ) + done + +lemma foldr_compat_dist: + "pairwise (##\<^sub>S) (set as) \ foldr (\\<^sub>S) (map (\a. a ;\<^sub>S x) as) \\<^sub>S = \\<^sub>S as ;\<^sub>S x" + apply (induct as) + apply (simp) + apply (auto simp add: pairwise_insert) + apply (metis pairwise_compat_foldr scene_compat_refl scene_union_comp_distl) + done + +lemma foldr_compat_quotient_dist: + "\ pairwise (##\<^sub>S) (set as); \ a\set as. a \ \x\\<^sub>\ \ \ foldr (\\<^sub>S) (map (\a. a /\<^sub>S x) as) \\<^sub>S = \\<^sub>S as /\<^sub>S x" + apply (induct as) + apply (auto simp add: pairwise_insert) + apply (subst scene_union_quotient) + apply simp_all + using pairwise_compat_foldr scene_compat_refl apply blast + apply (meson foldr_scene_indep scene_indep_sym scene_le_iff_indep_inv) + done + +lemma foldr_scene_union_add_tail: + "\ pairwise (##\<^sub>S) (set xs); \ x\set xs. x ##\<^sub>S b \ \ \\<^sub>S xs \\<^sub>S b = foldr (\\<^sub>S) xs b" + apply (induct xs) + apply (simp) + apply (simp) + apply (subst scene_union_assoc[THEN sym]) + apply (auto simp add: pairwise_insert) + using pairwise_compat_foldr scene_compat_refl apply blast + apply (meson pairwise_compat_foldr scene_compat_sym) + done + +lemma pairwise_Diff: "pairwise R A \ pairwise R (A - B)" + using pairwise_mono by fastforce + +lemma scene_compats_members: "\ pairwise (##\<^sub>S) A; x \ A; y \ A \ \ x ##\<^sub>S y" + by (metis pairwise_def scene_compat_refl) + +corollary foldr_scene_union_removeAll: + assumes "pairwise (##\<^sub>S) (set xs)" "x \ set xs" + shows "\\<^sub>S (removeAll x xs) \\<^sub>S x = \\<^sub>S xs" +using assms proof (induct xs) + case Nil + then show ?case by simp +next + case (Cons a xs) + have x_compat: "\ z. z \ set xs \ x ##\<^sub>S z" + using Cons.prems(1) Cons.prems(2) scene_compats_members by auto + + from Cons have x_compats: "x ##\<^sub>S \\<^sub>S (removeAll x xs)" + by (metis (no_types, lifting) insert_Diff list.simps(15) pairwise_compat_foldr pairwise_insert removeAll_id set_removeAll x_compat) + + from Cons have a_compats: "a ##\<^sub>S \\<^sub>S (removeAll x xs)" + by (metis (no_types, lifting) insert_Diff insert_iff list.simps(15) pairwise_compat_foldr pairwise_insert scene_compat_refl set_removeAll x_compats) + + from Cons show ?case + proof (cases "x \ set xs") + case True + with Cons show ?thesis + by (auto simp add: pairwise_insert scene_union_commute) + (metis a_compats scene_compats_members scene_union_assoc scene_union_idem, + metis (full_types) a_compats scene_union_assoc scene_union_commute x_compats) + next + case False + with Cons show ?thesis + by (simp add: scene_union_commute) + qed +qed + +lemma foldr_scene_union_eq_sets: + assumes "pairwise (##\<^sub>S) (set xs)" "set xs = set ys" + shows "\\<^sub>S xs = \\<^sub>S ys" +using assms proof (induct xs arbitrary: ys) + case Nil + then show ?case + by simp +next + case (Cons a xs) + hence ys: "set ys = insert a (set (removeAll a ys))" + by (auto) + then show ?case + by (metis (no_types, lifting) Cons.hyps Cons.prems(1) Cons.prems(2) Diff_insert_absorb foldr_scene_union_removeAll insertCI insert_absorb list.simps(15) pairwise_insert set_removeAll) +qed + +lemma foldr_scene_removeAll: + assumes "pairwise (##\<^sub>S) (set xs)" + shows "x \\<^sub>S \\<^sub>S (removeAll x xs) = x \\<^sub>S \\<^sub>S xs" + by (metis (mono_tags, opaque_lifting) assms foldr_Cons foldr_scene_union_eq_sets insertCI insert_Diff list.simps(15) o_apply removeAll.simps(2) removeAll_id set_removeAll) + +lemma pairwise_Collect: "pairwise R A \ pairwise R {x \ A. P x}" + by (simp add: pairwise_def) + +lemma removeAll_overshadow_filter: + "removeAll x (filter (\xa. xa \ A - {x}) xs) = removeAll x (filter (\ xa. xa \ A) xs)" + apply (simp add: removeAll_filter_not_eq) + apply (rule filter_cong) + apply (simp) + apply auto + done + +corollary foldr_scene_union_filter: + assumes "pairwise (##\<^sub>S) (set xs)" "set ys \ set xs" + shows "\\<^sub>S xs = \\<^sub>S (filter (\x. x \ set ys) xs) \\<^sub>S \\<^sub>S ys" +using assms proof (induct xs arbitrary: ys) + case Nil + then show ?case by (simp) +next + case (Cons x xs) + show ?case + proof (cases "x \ set ys") + case True + with Cons have 1: "set ys - {x} \ set xs" + by (auto) + have 2: "x ##\<^sub>S \\<^sub>S (removeAll x ys)" + by (metis Cons.prems(1) Cons.prems(2) True foldr_scene_removeAll foldr_scene_union_removeAll pairwise_subset scene_compat_bot(2) scene_compat_sym scene_union_incompat scene_union_unit(1)) + have 3: "\ P. x ##\<^sub>S \\<^sub>S (filter P xs)" + by (meson Cons.prems(1) Cons.prems(2) True filter_is_subset in_mono pairwise_compat_foldr pairwise_subset scene_compats_members set_subset_Cons) + have 4: "\ P. \\<^sub>S (filter P xs) ##\<^sub>S \\<^sub>S (removeAll x ys)" + by (rule pairwise_compat_foldr) + (metis Cons.prems(1) Cons.prems(2) pairwise_Diff pairwise_subset set_removeAll, + metis (no_types, lifting) "1" Cons.prems(1) filter_is_subset pairwise_compat_foldr pairwise_subset scene_compat_sym scene_compats_members set_removeAll set_subset_Cons subsetD) + have "\\<^sub>S (x # xs) = x \\<^sub>S \\<^sub>S xs" + by simp + also have "... = x \\<^sub>S (\\<^sub>S (filter (\xa. xa \ set ys - {x}) xs) \\<^sub>S \\<^sub>S (removeAll x ys))" + using 1 Cons(1)[where ys="removeAll x ys"] Cons(2) by (simp add: pairwise_insert) + also have "... = (x \\<^sub>S \\<^sub>S (filter (\xa. xa \ set ys - {x}) xs)) \\<^sub>S \\<^sub>S (removeAll x ys)" + by (simp add: scene_union_assoc 1 2 3 4) + also have "... = (x \\<^sub>S \\<^sub>S (removeAll x (filter (\xa. xa \ set ys - {x}) xs))) \\<^sub>S \\<^sub>S (removeAll x ys)" + by (metis (no_types, lifting) Cons.prems(1) filter_is_subset foldr_scene_removeAll pairwise_subset set_subset_Cons) + also have "... = (x \\<^sub>S \\<^sub>S (removeAll x (filter (\xa. xa \ set ys) xs))) \\<^sub>S \\<^sub>S (removeAll x ys)" + by (simp only: removeAll_overshadow_filter) + also have "... = (x \\<^sub>S \\<^sub>S (removeAll x (filter (\xa. xa \ set ys) (x # xs)))) \\<^sub>S \\<^sub>S (removeAll x ys)" + by simp + also have "... = (x \\<^sub>S \\<^sub>S (filter (\xa. xa \ set ys) (x # xs))) \\<^sub>S \\<^sub>S (removeAll x ys)" + by (simp add: True) + also have "... = (\\<^sub>S (filter (\xa. xa \ set ys) (x # xs)) \\<^sub>S x) \\<^sub>S \\<^sub>S (removeAll x ys)" + by (simp add: scene_union_commute) + also have "... = \\<^sub>S (filter (\xa. xa \ set ys) (x # xs)) \\<^sub>S (x \\<^sub>S \\<^sub>S (removeAll x ys))" + by (simp add: scene_union_assoc True 2 3 4 scene_compat_sym) + also have "... = \\<^sub>S (filter (\xa. xa \ set ys) (x # xs)) \\<^sub>S \\<^sub>S ys" + by (metis (no_types, lifting) Cons.prems(1) Cons.prems(2) True foldr_scene_union_removeAll pairwise_subset scene_union_commute) + finally show ?thesis . + next + case False + with Cons(2-3) have 1: "set ys \ set xs" + by auto + have 2: "x ##\<^sub>S \\<^sub>S (filter (\x. x \ set ys) xs)" + by (metis (no_types, lifting) Cons.prems(1) filter_is_subset filter_set list.simps(15) member_filter pairwise_compat_foldr pairwise_insert pairwise_subset scene_compat_refl) + have 3: "x ##\<^sub>S \\<^sub>S ys" + by (meson Cons.prems(1) Cons.prems(2) list.set_intros(1) pairwise_compat_foldr pairwise_subset scene_compats_members subset_code(1)) + from Cons(1)[of ys] Cons(2-3) have 4: "\\<^sub>S (filter (\x. x \ set ys) xs) ##\<^sub>S \\<^sub>S ys" + by (auto simp add: pairwise_insert) + (metis (no_types, lifting) "1" foldr_append foldr_scene_union_eq_sets scene_compat_bot(1) scene_union_incompat set_append subset_Un_eq) + + with 1 False Cons(1)[of ys] Cons(2-3) show ?thesis + by (auto simp add: pairwise_insert scene_union_assoc 2 3 4) + qed +qed + +lemma foldr_scene_append: + "\ pairwise (##\<^sub>S) (set (xs @ ys)) \ \ \\<^sub>S (xs @ ys) = \\<^sub>S xs \\<^sub>S \\<^sub>S ys" + by (simp add: foldr_scene_union_add_tail pairwise_compat_foldr pairwise_subset scene_compats_members) + +lemma foldr_scene_concat: + "\ pairwise (##\<^sub>S) (set (concat xs)) \ \ \\<^sub>S (concat xs) = \\<^sub>S (map \\<^sub>S xs)" + by (induct xs, simp_all, metis foldr_append foldr_scene_append pairwise_subset set_append set_concat sup_ge2) + +subsection \ Predicates \ + +text \ All scenes in the set are independent \ + +definition scene_indeps :: "'s scene set \ bool" where +"scene_indeps = pairwise (\\<^sub>S)" + +text \ All scenes in the set cover the entire state space \ + +definition scene_span :: "'s scene list \ bool" where +"scene_span S = (foldr (\\<^sub>S) S \\<^sub>S = \\<^sub>S)" + +text \ cf. @{term finite_dimensional_vector_space}, which scene spaces are based on. \ + +subsection \ Scene space class \ + +class scene_space = + fixes Vars :: "'a scene list" + assumes idem_scene_Vars [simp]: "\ x. x \ set Vars \ idem_scene x" + and indep_Vars: "scene_indeps (set Vars)" + and span_Vars: "scene_span Vars" +begin + +lemma scene_space_compats [simp]: "pairwise (##\<^sub>S) (set Vars)" + by (metis local.indep_Vars pairwise_alt scene_indep_compat scene_indeps_def) + +lemma Vars_ext_lens_indep: "\ a ;\<^sub>S x \ b ;\<^sub>S x; a \ set Vars; b \ set Vars \ \ a ;\<^sub>S x \\<^sub>S b ;\<^sub>S x" + by (metis indep_Vars pairwiseD scene_comp_indep scene_indeps_def) + +inductive_set scene_space :: "'a scene set" where +bot_scene_space [intro]: "\\<^sub>S \ scene_space" | +Vars_scene_space [intro]: "x \ set Vars \ x \ scene_space" | +union_scene_space [intro]: "\ x \ scene_space; y \ scene_space \ \ x \\<^sub>S y \ scene_space" + +lemma idem_scene_space: "a \ scene_space \ idem_scene a" + by (induct rule: scene_space.induct) auto + +lemma set_Vars_scene_space [simp]: "set Vars \ scene_space" + by blast + +lemma pairwise_compat_Vars_subset: "set xs \ set Vars \ pairwise (##\<^sub>S) (set xs)" + using pairwise_subset scene_space_compats by blast + +lemma scene_space_foldr: "set xs \ scene_space \ \\<^sub>S xs \ scene_space" + by (induction xs, auto) + +lemma top_scene_eq: "\\<^sub>S = \\<^sub>S Vars" + using local.span_Vars scene_span_def by force + +lemma top_scene_space: "\\<^sub>S \ scene_space" +proof - + have "\\<^sub>S = foldr (\\<^sub>S) Vars \\<^sub>S" + using span_Vars by (simp add: scene_span_def) + also have "... \ scene_space" + by (simp add: scene_space_foldr) + finally show ?thesis . +qed + +lemma Vars_compat_scene_space: "\ b \ scene_space; x \ set Vars \ \ x ##\<^sub>S b" +proof (induct b rule: scene_space.induct) + case bot_scene_space + then show ?case + by (metis scene_compat_refl scene_union_incompat scene_union_unit(1)) +next + case (Vars_scene_space a) + then show ?case + by (metis local.indep_Vars pairwiseD scene_compat_refl scene_indep_compat scene_indeps_def) +next + case (union_scene_space a b) + then show ?case + using scene_union_pres_compat by blast +qed + +lemma scene_space_compat: "\ a \ scene_space; b \ scene_space \ \ a ##\<^sub>S b" +proof (induct rule: scene_space.induct) + case bot_scene_space + then show ?case + by simp +next + case (Vars_scene_space x) + then show ?case + by (simp add: Vars_compat_scene_space) +next + case (union_scene_space x y) + then show ?case + using scene_compat_sym scene_union_pres_compat by blast +qed + +corollary scene_space_union_assoc: + assumes "x \ scene_space" "y \ scene_space" "z \ scene_space" + shows "x \\<^sub>S (y \\<^sub>S z) = (x \\<^sub>S y) \\<^sub>S z" + by (simp add: assms scene_space_compat scene_union_assoc) + +lemma scene_space_vars_decomp: "a \ scene_space \ \xs. set xs \ set Vars \ foldr (\\<^sub>S) xs \\<^sub>S = a" +proof (induct rule: scene_space.induct) + case bot_scene_space + then show ?case + by (simp add: exI[where x="[]"]) +next + case (Vars_scene_space x) + show ?case + apply (rule exI[where x="[x]"]) + using Vars_scene_space by simp +next + case (union_scene_space x y) + then obtain xs ys where xsys: "set xs \ set Vars \ foldr (\\<^sub>S) xs \\<^sub>S = x" + "set ys \ set Vars \ foldr (\\<^sub>S) ys \\<^sub>S = y" + by blast+ + show ?case + proof (rule exI[where x="xs @ ys"]) + show "set (xs @ ys) \ set Vars \ \\<^sub>S (xs @ ys) = x \\<^sub>S y" + by (auto simp: xsys) + (metis (full_types) Vars_compat_scene_space foldr_scene_union_add_tail pairwise_subset + scene_space_compats subsetD union_scene_space.hyps(3) xsys(1)) + qed +qed + +lemma scene_space_vars_decomp_iff: "a \ scene_space \ (\xs. set xs \ set Vars \ a = foldr (\\<^sub>S) xs \\<^sub>S)" + apply (auto simp add: scene_space_vars_decomp scene_space.Vars_scene_space scene_space_foldr) + apply (simp add: scene_space.Vars_scene_space scene_space_foldr subset_eq) + using scene_space_vars_decomp apply auto[1] + by (meson dual_order.trans scene_space_foldr set_Vars_scene_space) + +lemma "fold (\\<^sub>S) (map (\x. x ;\<^sub>S a) Vars) b = \a\\<^sub>\ \\<^sub>S b" + oops + +lemma Vars_indep_foldr: + assumes "x \ set Vars" "set xs \ set Vars" + shows "x \\<^sub>S \\<^sub>S (removeAll x xs)" +proof (rule foldr_scene_indep) + show "pairwise (##\<^sub>S) (set (removeAll x xs))" + by (simp, metis Diff_subset assms(2) pairwise_mono scene_space_compats) + from assms show "\b\set (removeAll x xs). x \\<^sub>S b" + by (simp) + (metis DiffE insertI1 local.indep_Vars pairwiseD scene_indeps_def subset_iff) +qed + +lemma Vars_indeps_foldr: + assumes "set xs \ set Vars" + shows "foldr (\\<^sub>S) xs \\<^sub>S \\<^sub>S foldr (\\<^sub>S) (filter (\x. x \ set xs) Vars) \\<^sub>S" + apply (rule foldr_scene_indep) + apply (meson filter_is_subset pairwise_subset scene_space_compats) + apply (simp) + apply auto + apply (rule scene_indep_sym) + apply (metis (no_types, lifting) assms foldr_scene_indep local.indep_Vars pairwiseD pairwise_mono scene_indeps_def scene_space_compats subset_iff) + done + +lemma uminus_var_other_vars: + assumes "x \ set Vars" + shows "- x = foldr (\\<^sub>S) (removeAll x Vars) \\<^sub>S" +proof (rule scene_union_indep_uniq[where Z="x"]) + show "idem_scene (foldr (\\<^sub>S) (removeAll x Vars) \\<^sub>S)" + by (metis Diff_subset idem_scene_space order_trans scene_space_foldr set_Vars_scene_space set_removeAll) + show "idem_scene x" "idem_scene (-x)" + by (simp_all add: assms local.idem_scene_Vars) + show "foldr (\\<^sub>S) (removeAll x Vars) \\<^sub>S \\<^sub>S x" + using Vars_indep_foldr assms scene_indep_sym by blast + show "- x \\<^sub>S x" + using scene_indep_self_compl scene_indep_sym by blast + show "- x \\<^sub>S x = foldr (\\<^sub>S) (removeAll x Vars) \\<^sub>S \\<^sub>S x" + by (metis \idem_scene (- x)\ assms foldr_scene_union_removeAll local.span_Vars scene_space_compats scene_span_def scene_union_compl uminus_scene_twice) +qed + +lemma uminus_vars_other_vars: + assumes "set xs \ set Vars" + shows "- \\<^sub>S xs = \\<^sub>S (filter (\x. x \ set xs) Vars)" +proof (rule scene_union_indep_uniq[where Z="foldr (\\<^sub>S) xs \\<^sub>S"]) + show "idem_scene (- foldr (\\<^sub>S) xs \\<^sub>S)" "idem_scene (foldr (\\<^sub>S) xs \\<^sub>S)" + using assms idem_scene_space idem_scene_uminus scene_space_vars_decomp_iff by blast+ + show "idem_scene (foldr (\\<^sub>S) (filter (\x. x \ set xs) Vars) \\<^sub>S)" + by (meson filter_is_subset idem_scene_space scene_space_vars_decomp_iff) + show "- foldr (\\<^sub>S) xs \\<^sub>S \\<^sub>S foldr (\\<^sub>S) xs \\<^sub>S" + by (metis scene_indep_self_compl uminus_scene_twice) + show "foldr (\\<^sub>S) (filter (\x. x \ set xs) Vars) \\<^sub>S \\<^sub>S foldr (\\<^sub>S) xs \\<^sub>S" + using Vars_indeps_foldr assms scene_indep_sym by blast + show "- \\<^sub>S xs \\<^sub>S \\<^sub>S xs = \\<^sub>S (filter (\x. x \ set xs) Vars) \\<^sub>S \\<^sub>S xs" + using foldr_scene_union_filter[of Vars xs, THEN sym] + by (simp add: assms) + (metis \idem_scene (- \\<^sub>S xs)\ local.span_Vars scene_span_def scene_union_compl uminus_scene_twice) +qed + +lemma scene_space_uminus: "\ a \ scene_space \ \ - a \ scene_space" + by (auto simp add: scene_space_vars_decomp_iff uminus_vars_other_vars) + (metis filter_is_subset) + +lemma scene_space_inter: "\ a \ scene_space; b \ scene_space \ \ a \\<^sub>S b \ scene_space" + by (simp add: inf_scene_def scene_space.union_scene_space scene_space_uminus) + +lemma scene_union_foldr_remove_element: + assumes "set xs \ set Vars" + shows "a \\<^sub>S \\<^sub>S xs = a \\<^sub>S \\<^sub>S (removeAll a xs)" + using assms proof (induct xs) + case Nil + then show ?case by simp +next + case (Cons a xs) + then show ?case apply auto + apply (metis order_trans scene_space.Vars_scene_space scene_space_foldr scene_space_union_assoc scene_union_idem set_Vars_scene_space) + apply (smt (verit, best) Diff_subset dual_order.trans removeAll_id scene_space_foldr scene_space_union_assoc scene_union_commute set_Vars_scene_space set_removeAll subset_iff) + done +qed + +lemma scene_union_foldr_Cons_removeAll: + assumes "set xs \ set Vars" "a \ set xs" + shows "foldr (\\<^sub>S) xs \\<^sub>S = foldr (\\<^sub>S) (a # removeAll a xs) \\<^sub>S" + by (metis assms(1) assms(2) foldr_scene_union_eq_sets insert_Diff list.simps(15) pairwise_subset scene_space_compats set_removeAll) + +lemma scene_union_foldr_Cons_removeAll': + assumes "set xs \ set Vars" "a \ set Vars" + shows "foldr (\\<^sub>S) (a # xs) \\<^sub>S = foldr (\\<^sub>S) (a # removeAll a xs) \\<^sub>S" + by (simp add: assms(1) scene_union_foldr_remove_element) + +lemma scene_in_foldr: "\ a \ set xs; set xs \ set Vars \ \ a \\<^sub>S \\<^sub>S xs" + apply (induct xs) + apply (simp) + apply (subst scene_union_foldr_Cons_removeAll') + apply simp + apply simp + apply (auto) + apply (rule scene_union_ub) + apply (metis Diff_subset dual_order.trans idem_scene_space scene_space_vars_decomp_iff set_removeAll) + using Vars_indep_foldr apply blast + apply (metis Vars_indep_foldr foldr_scene_union_removeAll idem_scene_space local.idem_scene_Vars order.trans pairwise_mono removeAll_id scene_indep_sym scene_space_compats scene_space_foldr scene_union_commute scene_union_ub set_Vars_scene_space subscene_trans) + done + +lemma scene_union_foldr_subset: + assumes "set xs \ set ys" "set ys \ set Vars" + shows "\\<^sub>S xs \\<^sub>S \\<^sub>S ys" + using assms proof (induct xs arbitrary: ys) + case Nil + then show ?case + by (simp add: scene_bot_least) +next + case (Cons a xs) + { assume "a \ set xs" + with Cons have "foldr (\\<^sub>S) xs \\<^sub>S = foldr (\\<^sub>S) (a # removeAll a xs) \\<^sub>S" + apply (subst scene_union_foldr_Cons_removeAll) + apply (auto) + done + } note a_in = this + { assume "a \ set xs" + then have "a \\<^sub>S foldr (\\<^sub>S) xs \\<^sub>S = foldr (\\<^sub>S) (a # xs) \\<^sub>S" + by simp + } note a_out = this + show ?case apply (simp) + apply (cases "a \ set xs") + using a_in Cons apply auto + apply (metis dual_order.trans scene_union_foldr_remove_element) + using a_out Cons apply auto + apply (rule scene_union_mono) + using scene_in_foldr apply blast + apply blast + apply (meson Vars_compat_scene_space dual_order.trans scene_space_foldr set_Vars_scene_space subsetD) + using local.idem_scene_Vars apply blast + apply (meson idem_scene_space scene_space_foldr set_Vars_scene_space subset_trans) + done +qed + +lemma union_scene_space_foldrs: + assumes "set xs \ set Vars" "set ys \ set Vars" + shows "(foldr (\\<^sub>S) xs \\<^sub>S) \\<^sub>S (foldr (\\<^sub>S) ys \\<^sub>S) = foldr (\\<^sub>S) (xs @ ys) \\<^sub>S" + using assms + apply (induct ys) + apply (simp_all) + apply (metis Vars_compat_scene_space foldr_scene_union_add_tail local.indep_Vars pairwise_mono scene_indep_compat scene_indeps_def scene_space.Vars_scene_space scene_space.union_scene_space scene_space_foldr subset_eq) + done + +lemma scene_space_ub: + assumes "a \ scene_space" "b \ scene_space" + shows "a \\<^sub>S a \\<^sub>S b" + using assms + apply (auto simp add: scene_space_vars_decomp_iff union_scene_space_foldrs) + by (smt (verit, ccfv_SIG) foldr_append scene_union_foldr_subset set_append sup.bounded_iff sup_commute sup_ge2) + +lemma scene_compl_subset_iff: + assumes "a \ scene_space" "b \ scene_space" + shows "- a \\<^sub>S -b \ b \\<^sub>S a" + by (metis scene_indep_sym scene_le_iff_indep_inv uminus_scene_twice) + +lemma inter_scene_space_foldrs: + assumes "set xs \ set Vars" "set ys \ set Vars" + shows "\\<^sub>S xs \\<^sub>S \\<^sub>S ys = \\<^sub>S (filter (\ x. x \ set xs \ set ys) Vars)" +proof - + have "\\<^sub>S xs \\<^sub>S \\<^sub>S ys = - (- \\<^sub>S xs \\<^sub>S - \\<^sub>S ys)" + by (simp add: inf_scene_def) + also have "... = - (\\<^sub>S (filter (\x. x \ set xs) Vars) \\<^sub>S \\<^sub>S (filter (\x. x \ set ys) Vars))" + by (simp add: uminus_vars_other_vars assms) + also have "... = - \\<^sub>S (filter (\x. x \ set xs) Vars @ filter (\x. x \ set ys) Vars)" + by (simp add: union_scene_space_foldrs assms) + also have "... = \\<^sub>S (filter (\x. x \ set (filter (\x. x \ set xs) Vars @ filter (\x. x \ set ys) Vars)) Vars)" + by (subst uminus_vars_other_vars, simp_all) + also have "... = \\<^sub>S (filter (\ x. x \ set xs \ set ys) Vars)" + proof - + have "\x. x \ set Vars \ ((x \ set Vars \ x \ set xs) \ (x \ set Vars \ x \ set ys)) = (x \ set xs \ x \ set ys)" + by auto + thus ?thesis + by (simp cong: arg_cong[where f="\\<^sub>S"] filter_cong add: assms) + qed + finally show ?thesis . +qed + +lemma scene_inter_distrib_lemma: + assumes "set xs \ set Vars" "set ys \ set Vars" "set zs \ set Vars" + shows "\\<^sub>S xs \\<^sub>S (\\<^sub>S ys \\<^sub>S \\<^sub>S zs) = (\\<^sub>S xs \\<^sub>S \\<^sub>S ys) \\<^sub>S (\\<^sub>S xs \\<^sub>S \\<^sub>S zs)" + using assms + apply (simp only: union_scene_space_foldrs inter_scene_space_foldrs) + apply (subst union_scene_space_foldrs) + apply (simp add: assms) + apply (simp add: assms) + apply (subst inter_scene_space_foldrs) + apply (simp) + apply (simp) + apply (rule foldr_scene_union_eq_sets) + apply (simp) + apply (smt (verit, ccfv_threshold) Un_subset_iff mem_Collect_eq pairwise_subset scene_space_compats subset_iff) + apply (auto) + done + +lemma scene_union_inter_distrib: + assumes "a \ scene_space" "b \ scene_space" "c \ scene_space" + shows "a \\<^sub>S b \\<^sub>S c = (a \\<^sub>S b) \\<^sub>S (a \\<^sub>S c)" + using assms + by (auto simp add: scene_space_vars_decomp_iff scene_inter_distrib_lemma) + +lemma finite_distinct_lists_subset: + assumes "finite A" + shows "finite {xs. distinct xs \ set xs \ A}" +proof - + from assms have 1: "{xs. distinct xs \ set xs \ A} = {xs. distinct xs \ length xs \ card A \ set xs \ A}" + by (auto, metis card_mono distinct_card) + have 2: "... \ {xs. set xs \ A \ length xs \ card A}" + by auto + have 3: "finite ..." + using assms finite_lists_length_le by blast + show ?thesis + by (metis (mono_tags, lifting) "1" "2" "3" infinite_super) +qed + +lemma foldr_scene_union_remdups: "set xs \ set Vars \ \\<^sub>S (remdups xs) = \\<^sub>S xs" + by (auto intro: foldr_scene_union_eq_sets simp add: pairwise_compat_Vars_subset) + +lemma scene_space_as_lists: + "scene_space = {\\<^sub>S xs | xs. distinct xs \ set xs \ set Vars}" +proof (rule Set.set_eqI, rule iffI) + fix a + assume "a \ scene_space" + then obtain xs where xs: "set xs \ set Vars" "\\<^sub>S xs = a" + using scene_space_vars_decomp_iff by auto + thus "a \ {\\<^sub>S xs |xs. distinct xs \ set xs \ set Vars}" + by auto (metis distinct_remdups foldr_scene_union_remdups set_remdups) +next + fix a + assume "a \ {\\<^sub>S xs |xs. distinct xs \ set xs \ set Vars}" + thus "a \ scene_space" + using scene_space_vars_decomp_iff by auto +qed + +lemma finite_scene_space: "finite scene_space" +proof - + have "scene_space = {\\<^sub>S xs | xs. distinct xs \ set xs \ set Vars}" + by (simp add: scene_space_as_lists) + also have "... = \\<^sub>S ` {xs. distinct xs \ set xs \ set Vars}" + by auto + also have "finite ..." + by (rule finite_imageI, simp add: finite_distinct_lists_subset) + finally show ?thesis . +qed + +lemma scene_space_inter_assoc: + assumes "x \ scene_space" "y \ scene_space" "z \ scene_space" + shows "(x \\<^sub>S y) \\<^sub>S z = x \\<^sub>S (y \\<^sub>S z)" +proof - + have "(x \\<^sub>S y) \\<^sub>S z = - (- x \\<^sub>S - y \\<^sub>S - z)" + by (simp add: scene_demorgan1 uminus_scene_twice) + also have "... = - (- x \\<^sub>S (- y \\<^sub>S - z))" + by (simp add: assms scene_space_uminus scene_space_union_assoc) + also have "... = x \\<^sub>S (y \\<^sub>S z)" + by (simp add: scene_demorgan1 uminus_scene_twice) + finally show ?thesis . +qed + +lemma scene_inter_union_distrib: + assumes "x \ scene_space" "y \ scene_space" "z \ scene_space" + shows "x \\<^sub>S (y \\<^sub>S z) = (x \\<^sub>S y) \\<^sub>S (x \\<^sub>S z)" +proof- + have "x \\<^sub>S (y \\<^sub>S z) = (x \\<^sub>S (x \\<^sub>S z)) \\<^sub>S (y \\<^sub>S z)" + by (metis assms(1) assms(3) idem_scene_space local.scene_union_inter_distrib scene_indep_bot scene_inter_commute scene_inter_indep scene_space.simps scene_union_unit(1)) + also have "... = (y \\<^sub>S z) \\<^sub>S (x \\<^sub>S (x \\<^sub>S z))" + by (simp add: scene_union_inter_distrib assms scene_inter_commute scene_union_assoc union_scene_space scene_space_inter scene_union_commute) + also have "\ = x \\<^sub>S ((y \\<^sub>S z) \\<^sub>S (x \\<^sub>S z))" + by (metis assms scene_inter_commute scene_space.union_scene_space scene_space_inter_assoc) + also have "\ = x \\<^sub>S (z \\<^sub>S (x \\<^sub>S y))" + by (simp add: assms scene_union_inter_distrib scene_inter_commute scene_union_commute) + + also have "\ = ((x \\<^sub>S y) \\<^sub>S x) \\<^sub>S ((x \\<^sub>S y) \\<^sub>S z)" + by (metis (no_types, opaque_lifting) assms(1) assms(2) idem_scene_space local.scene_union_inter_distrib scene_indep_bot scene_inter_commute scene_inter_indep scene_space.bot_scene_space scene_union_commute scene_union_idem scene_union_unit(1)) + also have "\ = (x \\<^sub>S y) \\<^sub>S (x \\<^sub>S z)" + by (simp add: assms scene_union_inter_distrib scene_space_inter) + finally show ?thesis . +qed + +lemma scene_union_inter_minus: + assumes "a \ scene_space" "b \ scene_space" + shows "a \\<^sub>S (b \\<^sub>S - a) = a \\<^sub>S b" + by (metis assms(1) assms(2) bot_idem_scene idem_scene_space idem_scene_uminus local.scene_union_inter_distrib scene_demorgan1 scene_space_uminus scene_union_compl scene_union_unit(1) uminus_scene_twice) + +lemma scene_union_foldr_minus_element: + assumes "a \ scene_space" "set xs \ scene_space" + shows "a \\<^sub>S \\<^sub>S xs = a \\<^sub>S \\<^sub>S (map (\ x. x \\<^sub>S - a) xs)" +using assms proof (induct xs) + case Nil + then show ?case by (simp) +next + case (Cons y ys) + have "a \\<^sub>S (y \\<^sub>S \\<^sub>S ys) = y \\<^sub>S (a \\<^sub>S \\<^sub>S ys)" + by (metis Cons.prems(2) assms(1) insert_subset list.simps(15) scene_space_foldr scene_space_union_assoc scene_union_commute) + also have "... = y \\<^sub>S (a \\<^sub>S \\<^sub>S (map (\x. x \\<^sub>S - a) ys))" + using Cons.hyps Cons.prems(2) assms(1) by auto + also have "... = y \\<^sub>S a \\<^sub>S \\<^sub>S (map (\x. x \\<^sub>S - a) ys)" + apply (subst scene_union_assoc) + using Cons.prems(2) assms(1) scene_space_compat apply auto[1] + apply (rule pairwise_compat_foldr) + apply (simp) + apply (rule pairwise_imageI) + apply (meson Cons.prems(2) assms(1) scene_space_compat scene_space_inter scene_space_uminus set_subset_Cons subsetD) + apply simp + apply (meson Cons.prems(2) assms(1) in_mono list.set_intros(1) scene_space_compat scene_space_inter scene_space_uminus set_subset_Cons) + apply (rule pairwise_compat_foldr) + apply (simp) + apply (rule pairwise_imageI) + apply (meson Cons.prems(2) assms(1) in_mono scene_space_compat scene_space_inter scene_space_uminus set_subset_Cons) + apply (simp) + apply (meson Cons.prems(2) assms(1) in_mono scene_space_compat scene_space_inter scene_space_uminus set_subset_Cons) + apply simp + done + also have "... = a \\<^sub>S (y \\<^sub>S - a \\<^sub>S \\<^sub>S (map (\x. x \\<^sub>S - a) ys))" + apply (subst scene_union_assoc) + using Cons.prems(2) assms(1) scene_space_compat scene_space_inter scene_space_uminus apply force + apply (metis (no_types, lifting) Cons.hyps Cons.prems(2) assms(1) insert_subset list.simps(15) scene_compat_sym scene_space_compat scene_space_foldr scene_union_assoc scene_union_idem scene_union_incompat scene_union_unit(1)) + apply (rule scene_space_compat) + using Cons.prems(2) assms(1) scene_space_inter scene_space_uminus apply auto[1] + apply (rule scene_space_foldr) + apply auto + apply (meson Cons.prems(2) assms(1) in_mono scene_space_inter scene_space_uminus set_subset_Cons) + apply (metis Cons.prems(2) assms(1) insert_subset list.simps(15) scene_union_inter_minus scene_union_commute) + done + finally show ?case using Cons + by auto +qed + +lemma scene_space_in_foldr: "\ a \ set xs; set xs \ scene_space \ \ a \\<^sub>S \\<^sub>S xs" +proof (induct xs) + case Nil + then show ?case + by simp +next + case (Cons y ys) + have ysp: "y \\<^sub>S \\<^sub>S ys = y \\<^sub>S \\<^sub>S (map (\ x. x \\<^sub>S - y) ys)" + using Cons.prems(2) scene_union_foldr_minus_element by force + show ?case + proof (cases "a \\<^sub>S y") + case False + with Cons show ?thesis + by (simp) + (metis (no_types, lifting) idem_scene_space scene_space_foldr scene_space_ub scene_union_commute subscene_trans) + next + case True + with Cons show ?thesis + by (simp) + (meson idem_scene_space scene_space_foldr scene_space_ub subscene_trans) + qed +qed + +lemma scene_space_foldr_lb: + "\ a \ scene_space; set xs \ scene_space; \ b\set xs. b \ a \ \ \\<^sub>S xs \\<^sub>S a" +proof (induct xs arbitrary: a) + case Nil + then show ?case + by (simp add: scene_bot_least) +next + case (Cons x xs) + then show ?case + by (simp add: scene_space_compat scene_space_foldr scene_union_lb) +qed + +lemma var_le_union_choice: + "\ x \ set Vars; a \ scene_space; b \ scene_space; x \ a \\<^sub>S b \ \ (x \ a \ x \ b)" + by (auto simp add: scene_space_vars_decomp_iff) + (metis Vars_indep_foldr bot_idem_scene idem_scene_space removeAll_id scene_bot_least scene_indep_pres_compat scene_le_iff_indep_inv scene_space.union_scene_space scene_space_foldr scene_space_in_foldr scene_union_compl set_Vars_scene_space subscene_trans subset_trans uminus_scene_twice uminus_top_scene) + +lemma var_le_union_iff: + "\ x \ set Vars; a \ scene_space; b \ scene_space \ \ x \ a \\<^sub>S b \ (x \ a \ x \ b)" + apply (rule iffI, simp add: var_le_union_choice) + apply (auto) + apply (meson idem_scene_space scene_space_ub subscene_trans) + apply (metis idem_scene_space scene_space_ub scene_union_commute subscene_trans) + done + +text \ @{term Vars} may contain the empty scene, as we want to allow vacuous lenses in alphabets \ + +lemma le_vars_then_equal: "\ x \ set Vars; y \ set Vars; x \ y; x \ \\<^sub>S \ \ x = y" + by (metis bot_idem_scene foldr_scene_removeAll local.idem_scene_Vars local.indep_Vars local.span_Vars pairwiseD scene_bot_least scene_indep_pres_compat scene_indeps_def scene_le_iff_indep_inv scene_space_compats scene_span_def scene_union_annhil subscene_antisym uminus_scene_twice uminus_top_scene uminus_var_other_vars) + +end + +lemma foldr_scene_union_eq_scene_space: + "\ set xs \ scene_space; set xs = set ys \ \ \\<^sub>S xs = \\<^sub>S ys" + by (metis foldr_scene_union_eq_sets pairwise_def pairwise_subset scene_space_compat) + +subsection \ Mapping a lens over a scene list \ + +definition map_lcomp :: "'b scene list \ ('b \ 'a) \ 'a scene list" where +"map_lcomp ss a = map (\ x. x ;\<^sub>S a) ss" + +lemma map_lcomp_dist: + "\ pairwise (##\<^sub>S) (set xs); vwb_lens a \ \ \\<^sub>S (map_lcomp xs a) = \\<^sub>S xs ;\<^sub>S a" + by (simp add: foldr_compat_dist map_lcomp_def) + +lemma map_lcomp_Vars_is_lens [simp]: "vwb_lens a \ \\<^sub>S (map_lcomp Vars a) = \a\\<^sub>\" + by (metis map_lcomp_dist scene_comp_top_scene scene_space_compats top_scene_eq) + +lemma set_map_lcomp [simp]: "set (map_lcomp xs a) = (\x. x ;\<^sub>S a) ` set xs" + by (simp add: map_lcomp_def) + +subsection \ Instances \ + +instantiation unit :: scene_space +begin + +definition Vars_unit :: "unit scene list" where [simp]: "Vars_unit = []" + +instance + by (intro_classes, simp_all add: scene_indeps_def scene_span_def unit_scene_top_eq_bot) + +end + +instantiation prod :: (scene_space, scene_space) scene_space +begin + +definition Vars_prod :: "('a \ 'b) scene list" where "Vars_prod = map_lcomp Vars fst\<^sub>L @ map_lcomp Vars snd\<^sub>L" + +instance proof + have pw: "pairwise (\\<^sub>S) (set (map_lcomp Vars fst\<^sub>L @ map_lcomp Vars snd\<^sub>L))" + by (auto simp add: pairwise_def Vars_ext_lens_indep scene_comp_pres_indep scene_indep_sym) + show "\x:: ('a \ 'b) scene. x \ set Vars \ idem_scene x" + by (auto simp add: Vars_prod_def) + from pw show "scene_indeps (set (Vars :: ('a \ 'b) scene list))" + by (simp add: Vars_prod_def scene_indeps_def) + show "scene_span (Vars :: ('a \ 'b) scene list)" + by (simp only: scene_span_def Vars_prod_def foldr_scene_append pw pairwise_indep_then_compat map_lcomp_Vars_is_lens fst_vwb_lens snd_vwb_lens) + (metis fst_vwb_lens lens_plus_scene lens_scene_top_iff_bij_lens plus_mwb_lens scene_union_commute snd_fst_lens_indep snd_vwb_lens swap_bij_lens vwb_lens_mwb) +qed + +end + +subsection \ Scene space and basis lenses \ + +locale var_lens = vwb_lens + + assumes lens_in_scene_space: "\x\\<^sub>\ \ scene_space" + +declare var_lens.lens_in_scene_space [simp] +declare var_lens.axioms(1) [simp] + +locale basis_lens = vwb_lens + + assumes lens_in_basis: "\x\\<^sub>\ \ set Vars" + +sublocale basis_lens \ var_lens + using lens_in_basis var_lens_axioms_def var_lens_def vwb_lens_axioms by blast + +declare basis_lens.lens_in_basis [simp] + +text \ Effectual variable and basis lenses need to have at least two view elements \ + +abbreviation (input) evar_lens :: "('a::two \ 's::scene_space) \ bool" + where "evar_lens \ var_lens" + +abbreviation (input) ebasis_lens :: "('a::two \ 's::scene_space) \ bool" + where "ebasis_lens \ basis_lens" + +lemma basis_then_var [simp]: "basis_lens x \ var_lens x" + using basis_lens.lens_in_basis basis_lens_def var_lens_axioms_def var_lens_def by blast + +lemma basis_lens_intro: "\ vwb_lens x; \x\\<^sub>\ \ set Vars \ \ basis_lens x" + using basis_lens.intro basis_lens_axioms.intro by blast + +subsection \ Composite lenses \ + +locale composite_lens = vwb_lens + + assumes comp_in_Vars: "(\ a. a ;\<^sub>S x) ` set Vars \ set Vars" +begin + +lemma Vars_closed_comp: "a \ set Vars \ a ;\<^sub>S x \ set Vars" + using comp_in_Vars by blast + +lemma scene_space_closed_comp: + assumes "a \ scene_space" + shows "a ;\<^sub>S x \ scene_space" +proof - + obtain xs where xs: "a = \\<^sub>S xs" "set xs \ set Vars" + using assms scene_space_vars_decomp by blast + have "(\\<^sub>S xs) ;\<^sub>S x = \\<^sub>S (map (\ a. a ;\<^sub>S x) xs)" + by (metis foldr_compat_dist pairwise_subset scene_space_compats xs(2)) + also have "... \ scene_space" + by (auto simp add: scene_space_vars_decomp_iff) + (metis comp_in_Vars image_Un le_iff_sup le_supE list.set_map xs(2)) + finally show ?thesis + by (simp add: xs) +qed + +sublocale var_lens +proof + show "\x\\<^sub>\ \ scene_space" + by (metis scene_comp_top_scene scene_space_closed_comp top_scene_space vwb_lens_axioms) +qed + +end + +lemma composite_implies_var_lens [simp]: + "composite_lens x \ var_lens x" + by (metis composite_lens.axioms(1) composite_lens.scene_space_closed_comp scene_comp_top_scene top_scene_space var_lens_axioms.intro var_lens_def) + +text \ The extension of any lens in the scene space remains in the scene space \ + +lemma composite_lens_comp [simp]: + "\ composite_lens a; var_lens x \ \ var_lens (x ;\<^sub>L a)" + by (metis comp_vwb_lens composite_lens.scene_space_closed_comp composite_lens_def lens_scene_comp var_lens_axioms_def var_lens_def) + +lemma comp_composite_lens [simp]: + "\ composite_lens a; composite_lens x \ \ composite_lens (x ;\<^sub>L a)" + by (auto intro!: composite_lens.intro simp add: composite_lens_axioms_def) + (metis composite_lens.Vars_closed_comp composite_lens.axioms(1) scene_comp_assoc) + +text \ A basis lens within a composite lens remains a basis lens (i.e. it remains atomic) \ + +lemma composite_lens_basis_comp [simp]: + "\ composite_lens a; basis_lens x \ \ basis_lens (x ;\<^sub>L a)" + by (metis basis_lens.lens_in_basis basis_lens_def basis_lens_intro comp_vwb_lens composite_lens.Vars_closed_comp composite_lens_def lens_scene_comp) + +lemma id_composite_lens: "composite_lens 1\<^sub>L" + by (force intro: composite_lens.intro composite_lens_axioms.intro) + +lemma fst_composite_lens: "composite_lens fst\<^sub>L" + by (rule composite_lens.intro, simp add: fst_vwb_lens, rule composite_lens_axioms.intro, simp add: Vars_prod_def) + +lemma snd_composite_lens: "composite_lens snd\<^sub>L" + by (rule composite_lens.intro, simp add: snd_vwb_lens, rule composite_lens_axioms.intro, simp add: Vars_prod_def) + +end \ No newline at end of file diff --git a/thys/Optics/Scenes.thy b/thys/Optics/Scenes.thy --- a/thys/Optics/Scenes.thy +++ b/thys/Optics/Scenes.thy @@ -1,498 +1,622 @@ section \ Scenes \ theory Scenes - imports Lens_Instances + imports Lens_Symmetric begin text \ Like lenses, scenes characterise a region of a source type. However, unlike lenses, scenes do not explicitly assign a view type to this region, and consequently they have just one type parameter. This means they can be more flexibly composed, and in particular it is possible to show they form nice algebraic structures in Isabelle/HOL. They are mainly of use in characterising sets of variables, where, of course, we do not care about the types of those variables and therefore representing them as lenses is inconvenient. \ subsection \ Overriding Functions \ text \ Overriding functions provide an abstract way of replacing a region of an existing source with the corresponding region of another source. \ locale overrider = fixes F :: "'s \ 's \ 's" (infixl "\" 65) assumes ovr_overshadow_left: "x \ y \ z = x \ z" and ovr_overshadow_right: "x \ (y \ z) = x \ z" begin lemma ovr_assoc: "x \ (y \ z) = x \ y \ z" by (simp add: ovr_overshadow_left ovr_overshadow_right) end locale idem_overrider = overrider + assumes ovr_idem: "x \ x = x" declare overrider.ovr_overshadow_left [simp] declare overrider.ovr_overshadow_right [simp] declare idem_overrider.ovr_idem [simp] subsection \ Scene Type \ typedef 's scene = "{F :: 's \ 's \ 's. overrider F}" by (rule_tac x="\ x y. x" in exI, simp, unfold_locales, simp_all) setup_lifting type_definition_scene lift_definition idem_scene :: "'s scene \ bool" is idem_overrider . lift_definition region :: "'s scene \ 's rel" is "\ F. {(s\<^sub>1, s\<^sub>2). (\ s. F s s\<^sub>1 = F s s\<^sub>2)}" . lift_definition coregion :: "'s scene \ 's rel" is "\ F. {(s\<^sub>1, s\<^sub>2). (\ s. F s\<^sub>1 s = F s\<^sub>2 s)}" . lemma equiv_region: "equiv UNIV (region X)" apply (transfer) apply (rule equivI) apply (rule refl_onI) apply (auto) apply (rule symI) apply (auto) apply (rule transI) apply (auto) done lemma equiv_coregion: "equiv UNIV (coregion X)" apply (transfer) apply (rule equivI) apply (rule refl_onI) apply (auto) apply (rule symI) apply (auto) apply (rule transI) apply (auto) done lemma region_coregion_Id: "idem_scene X \ region X \ coregion X = Id" by (transfer, auto, metis idem_overrider.ovr_idem) lemma state_eq_iff: "idem_scene S \ x = y \ (x, y) \ region S \ (x, y) \ coregion S" by (metis IntE IntI pair_in_Id_conv region_coregion_Id) lift_definition scene_override :: "'a \ 'a \ ('a scene) \ 'a" ("_ \\<^sub>S _ on _" [95,0,96] 95) is "\ s\<^sub>1 s\<^sub>2 F. F s\<^sub>1 s\<^sub>2" . abbreviation (input) scene_copy :: "'a scene \ 'a \ ('a \ 'a)" ("cp\<^bsub>_\<^esub>") where "cp\<^bsub>A\<^esub> s \ (\ s'. s' \\<^sub>S s on A)" lemma scene_override_idem [simp]: "idem_scene X \ s \\<^sub>S s on X = s" by (transfer, simp) lemma scene_override_overshadow_left [simp]: "S\<^sub>1 \\<^sub>S S\<^sub>2 on X \\<^sub>S S\<^sub>3 on X = S\<^sub>1 \\<^sub>S S\<^sub>3 on X" by (transfer, simp) lemma scene_override_overshadow_right [simp]: "S\<^sub>1 \\<^sub>S (S\<^sub>2 \\<^sub>S S\<^sub>3 on X) on X = S\<^sub>1 \\<^sub>S S\<^sub>3 on X" by (transfer, simp) definition scene_equiv :: "'a \ 'a \ ('a scene) \ bool" ("_ \\<^sub>S _ on _" [65,0,66] 65) where [lens_defs]: "S\<^sub>1 \\<^sub>S S\<^sub>2 on X = (S\<^sub>1 \\<^sub>S S\<^sub>2 on X = S\<^sub>1)" lemma scene_equiv_region: "idem_scene X \ region X = {(S\<^sub>1, S\<^sub>2). S\<^sub>1 \\<^sub>S S\<^sub>2 on X}" by (simp add: lens_defs, transfer, auto) (metis idem_overrider.ovr_idem, metis overrider.ovr_overshadow_right) lift_definition scene_indep :: "'a scene \ 'a scene \ bool" (infix "\\<^sub>S" 50) is "\ F G. (\ s\<^sub>1 s\<^sub>2 s\<^sub>3. G (F s\<^sub>1 s\<^sub>2) s\<^sub>3 = F (G s\<^sub>1 s\<^sub>3) s\<^sub>2)" . lemma scene_indep_override: "X \\<^sub>S Y = (\ s\<^sub>1 s\<^sub>2 s\<^sub>3. s\<^sub>1 \\<^sub>S s\<^sub>2 on X \\<^sub>S s\<^sub>3 on Y = s\<^sub>1 \\<^sub>S s\<^sub>3 on Y \\<^sub>S s\<^sub>2 on X)" by (transfer, auto) lemma scene_indep_copy: "X \\<^sub>S Y = (\ s\<^sub>1 s\<^sub>2. cp\<^bsub>X\<^esub> s\<^sub>1 \ cp\<^bsub>Y\<^esub> s\<^sub>2 = cp\<^bsub>Y\<^esub> s\<^sub>2 \ cp\<^bsub>X\<^esub> s\<^sub>1)" by (auto simp add: scene_indep_override comp_def fun_eq_iff) lemma scene_indep_sym: "X \\<^sub>S Y \ Y \\<^sub>S X" - by (transfer, auto) + by (transfer, auto) text \ Compatibility is a weaker notion than independence; the scenes can overlap but they must agree when they do. \ lift_definition scene_compat :: "'a scene \ 'a scene \ bool" (infix "##\<^sub>S" 50) is "\ F G. (\ s\<^sub>1 s\<^sub>2. G (F s\<^sub>1 s\<^sub>2) s\<^sub>2 = F (G s\<^sub>1 s\<^sub>2) s\<^sub>2)" . lemma scene_compat_copy: "X ##\<^sub>S Y = (\ s. cp\<^bsub>X\<^esub> s \ cp\<^bsub>Y\<^esub> s = cp\<^bsub>Y\<^esub> s \ cp\<^bsub>X\<^esub> s)" by (transfer, auto simp add: fun_eq_iff) lemma scene_indep_compat [simp]: "X \\<^sub>S Y \ X ##\<^sub>S Y" by (transfer, auto) lemma scene_compat_refl: "X ##\<^sub>S X" by (transfer, simp) lemma scene_compat_sym: "X ##\<^sub>S Y \ Y ##\<^sub>S X" by (transfer, simp) lemma scene_override_commute_indep: assumes "X \\<^sub>S Y" shows "S\<^sub>1 \\<^sub>S S\<^sub>2 on X \\<^sub>S S\<^sub>3 on Y = S\<^sub>1 \\<^sub>S S\<^sub>3 on Y \\<^sub>S S\<^sub>2 on X" using assms by (transfer, auto) instantiation scene :: (type) "{bot, top, uminus, sup, inf}" begin - lift_definition bot_scene :: "'s scene" is "\ x y. x" by (unfold_locales, simp_all) - lift_definition top_scene :: "'s scene" is "\ x y. y" by (unfold_locales, simp_all) - lift_definition uminus_scene :: "'s scene \ 's scene" is "\ F x y. F y x" + lift_definition bot_scene :: "'a scene" is "\ x y. x" by (unfold_locales, simp_all) + lift_definition top_scene :: "'a scene" is "\ x y. y" by (unfold_locales, simp_all) + lift_definition uminus_scene :: "'a scene \ 'a scene" is "\ F x y. F y x" by (unfold_locales, simp_all) text \ Scene union requires that the two scenes are at least compatible. If they are not, the result is the bottom scene. \ - lift_definition sup_scene :: "'s scene \ 's scene \ 's scene" + lift_definition sup_scene :: "'a scene \ 'a scene \ 'a scene" is "\ F G. if (\ s\<^sub>1 s\<^sub>2. G (F s\<^sub>1 s\<^sub>2) s\<^sub>2 = F (G s\<^sub>1 s\<^sub>2) s\<^sub>2) then (\ s\<^sub>1 s\<^sub>2. G (F s\<^sub>1 s\<^sub>2) s\<^sub>2) else (\ s\<^sub>1 s\<^sub>2. s\<^sub>1)" by (unfold_locales, auto, metis overrider.ovr_overshadow_right) - definition inf_scene :: "'s scene \ 's scene \ 's scene" where + definition inf_scene :: "'a scene \ 'a scene \ 'a scene" where [lens_defs]: "inf_scene X Y = - (sup (- X) (- Y))" instance .. end abbreviation union_scene :: "'s scene \ 's scene \ 's scene" (infixl "\\<^sub>S" 65) where "union_scene \ sup" abbreviation inter_scene :: "'s scene \ 's scene \ 's scene" (infixl "\\<^sub>S" 70) where "inter_scene \ inf" abbreviation top_scene :: "'s scene" ("\\<^sub>S") where "top_scene \ top" abbreviation bot_scene :: "'s scene" ("\\<^sub>S") where "bot_scene \ bot" +instantiation scene :: (type) "minus" +begin + definition minus_scene :: "'a scene \ 'a scene \ 'a scene" where + "minus_scene A B = A \\<^sub>S (- B)" +instance .. +end + +lemma bot_idem_scene [simp]: "idem_scene \\<^sub>S" + by (transfer, unfold_locales, simp_all) + +lemma top_idem_scene [simp]: "idem_scene \\<^sub>S" + by (transfer, unfold_locales, simp_all) + lemma uminus_top_scene [simp]: "- \\<^sub>S = \\<^sub>S" - by (simp add: top_scene_def bot_scene_def uminus_scene_def) - (metis top_scene.rep_eq top_scene_def) + by (transfer, simp) + +lemma uminus_bot_scene [simp]: "- \\<^sub>S = \\<^sub>S" + by (transfer, simp) lemma uminus_scene_twice: "- (- (X :: 's scene)) = X" by (transfer, simp) lemma scene_override_id [simp]: "S\<^sub>1 \\<^sub>S S\<^sub>2 on \\<^sub>S = S\<^sub>2" by (transfer, simp) lemma scene_override_unit [simp]: "S\<^sub>1 \\<^sub>S S\<^sub>2 on \\<^sub>S = S\<^sub>1" by (transfer, simp) lemma scene_override_commute: "S\<^sub>2 \\<^sub>S S\<^sub>1 on (- X) = S\<^sub>1 \\<^sub>S S\<^sub>2 on X" by (transfer, simp) lemma scene_union_incompat: "\ X ##\<^sub>S Y \ X \\<^sub>S Y = \\<^sub>S" by (transfer, auto) lemma scene_override_union: "X ##\<^sub>S Y \ S\<^sub>1 \\<^sub>S S\<^sub>2 on (X \\<^sub>S Y) = (S\<^sub>1 \\<^sub>S S\<^sub>2 on X) \\<^sub>S S\<^sub>2 on Y" by (transfer, auto) +lemma scene_override_inter: "-X ##\<^sub>S -Y \ S\<^sub>1 \\<^sub>S S\<^sub>2 on (X \\<^sub>S Y) = S\<^sub>1 \\<^sub>S S\<^sub>1 \\<^sub>S S\<^sub>2 on X on Y" + by (simp add: inf_scene_def scene_override_commute scene_override_union) + lemma scene_equiv_bot [simp]: "a \\<^sub>S b on \\<^sub>S" by (simp add: scene_equiv_def) -lemma scene_union_unit: "X \\<^sub>S \\<^sub>S = X" +lemma scene_equiv_refl [simp]: "idem_scene a \ s \\<^sub>S s on a" + by (simp add: scene_equiv_def) + +lemma scene_equiv_sym [simp]: "idem_scene a \ s\<^sub>1 \\<^sub>S s\<^sub>2 on a \ s\<^sub>2 \\<^sub>S s\<^sub>1 on a" + by (metis scene_equiv_def scene_override_idem scene_override_overshadow_right) + +lemma scene_union_unit [simp]: "X \\<^sub>S \\<^sub>S = X" "\\<^sub>S \\<^sub>S X = X" + by (transfer, simp)+ + +lemma scene_indep_bot [simp]: "X \\<^sub>S \\<^sub>S" + by (transfer, simp) + +text \ A unitary scene admits only one element, and therefore top and bottom are the same. \ + +lemma unit_scene_top_eq_bot: "(\\<^sub>S :: unit scene) = \\<^sub>S" by (transfer, simp) lemma idem_scene_union [simp]: "\ idem_scene A; idem_scene B \ \ idem_scene (A \\<^sub>S B)" apply (transfer, auto) - apply (unfold_locales, auto) - apply (metis overrider.ovr_overshadow_left) + apply (unfold_locales, auto) + apply (metis overrider.ovr_overshadow_left) apply (metis overrider.ovr_overshadow_right) done lemma scene_union_annhil: "idem_scene X \ X \\<^sub>S \\<^sub>S = \\<^sub>S" by (transfer, simp) lemma scene_union_pres_compat: "\ A ##\<^sub>S B; A ##\<^sub>S C \ \ A ##\<^sub>S (B \\<^sub>S C)" by (transfer, auto) +lemma scene_indep_pres_compat: "\ A \\<^sub>S B; A \\<^sub>S C \ \ A \\<^sub>S (B \\<^sub>S C)" + by (transfer, auto) + lemma scene_indep_self_compl: "A \\<^sub>S -A" by (transfer, simp) lemma scene_compat_self_compl: "A ##\<^sub>S -A" by (transfer, simp) +lemma scene_compat_bot [simp]: "a ##\<^sub>S \\<^sub>S" "\\<^sub>S ##\<^sub>S a" + by (transfer, simp)+ + +lemma scene_compat_top [simp]: + "idem_scene a \ a ##\<^sub>S \\<^sub>S" + "idem_scene a \ \\<^sub>S ##\<^sub>S a" + by (transfer, simp)+ + lemma scene_union_assoc: assumes "X ##\<^sub>S Y" "X ##\<^sub>S Z" "Y ##\<^sub>S Z" shows "X \\<^sub>S (Y \\<^sub>S Z) = (X \\<^sub>S Y) \\<^sub>S Z" using assms by (transfer, auto) lemma scene_inter_indep: assumes "idem_scene X" "idem_scene Y" "X \\<^sub>S Y" shows "X \\<^sub>S Y = \\<^sub>S" using assms unfolding lens_defs apply (transfer, auto) - apply (metis (no_types, opaque_lifting) idem_overrider.ovr_idem overrider.ovr_assoc overrider.ovr_overshadow_right) + apply (metis (no_types, opaque_lifting) idem_overrider.ovr_idem overrider.ovr_assoc overrider.ovr_overshadow_right) apply (metis (no_types, opaque_lifting) idem_overrider.ovr_idem overrider.ovr_overshadow_right) done +lemma scene_union_indep_uniq: + assumes "idem_scene X" "idem_scene Y" "idem_scene Z" "X \\<^sub>S Z" "Y \\<^sub>S Z" "X \\<^sub>S Z = Y \\<^sub>S Z" + shows "X = Y" + using assms apply (transfer, simp) + by (metis (no_types, opaque_lifting) ext idem_overrider.ovr_idem overrider_def) + lemma scene_union_idem: "X \\<^sub>S X = X" by (transfer, simp) lemma scene_union_compl: "idem_scene X \ X \\<^sub>S - X = \\<^sub>S" by (transfer, auto) lemma scene_inter_idem: "X \\<^sub>S X = X" by (simp add: inf_scene_def, transfer, auto) lemma scene_union_commute: "X \\<^sub>S Y = Y \\<^sub>S X" by (transfer, auto) - + lemma scene_inter_compl: "idem_scene X \ X \\<^sub>S - X = \\<^sub>S" by (simp add: inf_scene_def, transfer, auto) lemma scene_demorgan1: "-(X \\<^sub>S Y) = -X \\<^sub>S -Y" by (simp add: inf_scene_def, transfer, auto) lemma scene_demorgan2: "-(X \\<^sub>S Y) = -X \\<^sub>S -Y" by (simp add: inf_scene_def, transfer, auto) -lemma scene_compat_top: "idem_scene X \ X ##\<^sub>S \\<^sub>S" - by (transfer, simp) +lemma scene_inter_commute: "X \\<^sub>S Y = Y \\<^sub>S X" + by (simp add: inf_scene_def scene_union_commute) + +lemma scene_union_inter_distrib: + "\ idem_scene x; x \\<^sub>S y; x \\<^sub>S z; y ##\<^sub>S z \ \ x \\<^sub>S y \\<^sub>S z = (x \\<^sub>S y) \\<^sub>S (x \\<^sub>S z)" + apply (simp add: inf_scene_def, transfer) + apply (auto simp add: fun_eq_iff) + apply (unfold overrider_def idem_overrider_def idem_overrider_axioms_def) + apply metis+ + done lemma idem_scene_uminus [simp]: "idem_scene X \ idem_scene (- X)" by (simp add: uminus_scene_def idem_scene_def Abs_scene_inverse idem_overrider_axioms_def idem_overrider_def overrider.intro) +lemma scene_minus_cancel: "\ a \\<^sub>S b; idem_scene a; idem_scene b \ \ a \\<^sub>S (b \\<^sub>S - a) = a \\<^sub>S b" + apply (simp add: lens_defs, transfer, auto simp add: fun_eq_iff) + apply (metis (mono_tags, lifting) overrider.ovr_overshadow_left) + apply (metis (no_types, opaque_lifting) idem_overrider.ovr_idem overrider.ovr_overshadow_right) + done + instantiation scene :: (type) ord begin text \ $X$ is a subscene of $Y$ provided that overriding with first $Y$ and then $X$ can be rewritten using the complement of $X$. \ definition less_eq_scene :: "'a scene \ 'a scene \ bool" where [lens_defs]: "less_eq_scene X Y = (\ s\<^sub>1 s\<^sub>2 s\<^sub>3. s\<^sub>1 \\<^sub>S s\<^sub>2 on Y \\<^sub>S s\<^sub>3 on X = s\<^sub>1 \\<^sub>S (s\<^sub>2 \\<^sub>S s\<^sub>3 on X) on Y)" definition less_scene :: "'a scene \ 'a scene \ bool" where [lens_defs]: "less_scene x y = (x \ y \ \ y \ x)" instance .. end abbreviation subscene :: "'a scene \ 'a scene \ bool" (infix "\\<^sub>S" 55) where "subscene X Y \ X \ Y" lemma subscene_refl: "X \\<^sub>S X" by (simp add: less_eq_scene_def) lemma subscene_trans: "\ idem_scene Y; X \\<^sub>S Y; Y \\<^sub>S Z \ \ X \\<^sub>S Z" by (simp add: less_eq_scene_def, transfer, auto, metis (no_types, opaque_lifting) idem_overrider.ovr_idem) lemma subscene_antisym: "\ idem_scene Y; X \\<^sub>S Y; Y \\<^sub>S X \ \ X = Y" apply (simp add: less_eq_scene_def, transfer, auto) apply (rule ext) apply (rule ext) apply (metis (full_types) idem_overrider.ovr_idem overrider.ovr_overshadow_left) done lemma subscene_copy_def: assumes "idem_scene X" "idem_scene Y" shows "X \\<^sub>S Y = (\ s\<^sub>1 s\<^sub>2. cp\<^bsub>X\<^esub> s\<^sub>1 \ cp\<^bsub>Y\<^esub> s\<^sub>2 = cp\<^bsub>Y\<^esub> (cp\<^bsub>X\<^esub> s\<^sub>1 s\<^sub>2))" using assms by (simp add: less_eq_scene_def fun_eq_iff, transfer, auto) lemma subscene_eliminate: "\ idem_scene Y; X \ Y \ \ s\<^sub>1 \\<^sub>S s\<^sub>2 on X \\<^sub>S s\<^sub>3 on Y = s\<^sub>1 \\<^sub>S s\<^sub>3 on Y" by (metis less_eq_scene_def scene_override_overshadow_left scene_override_idem) lemma scene_bot_least: "\\<^sub>S \ X" unfolding less_eq_scene_def by (transfer, auto) lemma scene_top_greatest: "X \ \\<^sub>S" unfolding less_eq_scene_def by (transfer, auto) lemma scene_union_ub: "\ idem_scene Y; X \\<^sub>S Y \ \ X \ (X \\<^sub>S Y)" by (simp add: less_eq_scene_def, transfer, auto) (metis (no_types, opaque_lifting) idem_overrider.ovr_idem overrider.ovr_overshadow_right) +lemma scene_union_lb: "\ a ##\<^sub>S b; a \ c; b \ c \ \ a \\<^sub>S b \ c" + by (simp add: less_eq_scene_def scene_override_union) + +lemma scene_union_mono: "\ a \\<^sub>S c; b \\<^sub>S c; a ##\<^sub>S b; idem_scene a; idem_scene b \ \ a \\<^sub>S b \\<^sub>S c" + by (simp add: less_eq_scene_def, transfer, auto) + lemma scene_le_then_compat: "\ idem_scene X; idem_scene Y; X \ Y \ \ X ##\<^sub>S Y" unfolding less_eq_scene_def by (transfer, auto, metis (no_types, lifting) idem_overrider.ovr_idem overrider_def) lemma indep_then_compl_in: "A \\<^sub>S B \ A \ -B" unfolding less_eq_scene_def by (transfer, simp) lemma scene_le_iff_indep_inv: "A \\<^sub>S - B \ A \ B" by (auto simp add: less_eq_scene_def scene_indep_override scene_override_commute) lift_definition scene_comp :: "'a scene \ ('a \ 'b) \ 'b scene" (infixl ";\<^sub>S" 80) is "\ S X a b. if (vwb_lens X) then put\<^bsub>X\<^esub> a (S (get\<^bsub>X\<^esub> a) (get\<^bsub>X\<^esub> b)) else a" by (unfold_locales, auto) lemma scene_comp_idem [simp]: "idem_scene S \ idem_scene (S ;\<^sub>S X)" by (transfer, unfold_locales, simp_all) lemma scene_comp_lens_indep [simp]: "X \ Y \ (A ;\<^sub>S X) \\<^sub>S (A ;\<^sub>S Y)" by (transfer, auto simp add: lens_indep.lens_put_comm lens_indep.lens_put_irr2) lemma scene_comp_indep [simp]: "A \\<^sub>S B \ (A ;\<^sub>S X) \\<^sub>S (B ;\<^sub>S X)" by (transfer, auto) +lemma scene_comp_bot [simp]: "\\<^sub>S ;\<^sub>S x = \\<^sub>S" + by (transfer, auto) + +lemma scene_comp_id_lens [simp]: "A ;\<^sub>S 1\<^sub>L = A" + by (transfer, auto, simp add: id_lens_def) + +lemma scene_union_comp_distl: "a ##\<^sub>S b \ (a \\<^sub>S b) ;\<^sub>S x = (a ;\<^sub>S x) \\<^sub>S (b ;\<^sub>S x)" + by (transfer, auto simp add: fun_eq_iff) + +lemma scene_comp_assoc: "\ vwb_lens X; vwb_lens Y \ \ A ;\<^sub>S X ;\<^sub>S Y = A ;\<^sub>S (X ;\<^sub>L Y)" + by (transfer, auto simp add: lens_comp_def fun_eq_iff) + (metis comp_vwb_lens lens_comp_def) + +lift_definition scene_quotient :: "'b scene \ ('a \ 'b) \ 'a scene" (infixl "'/\<^sub>S" 80) +is "\ S X a b. if (vwb_lens X \ (\s\<^sub>1 s\<^sub>2 s\<^sub>3. S (s\<^sub>1 \\<^bsub>X\<^esub> s\<^sub>2) s\<^sub>3 = s\<^sub>1 \\<^bsub>X\<^esub> S s\<^sub>2 s\<^sub>3)) then get\<^bsub>X\<^esub> (S (create\<^bsub>X\<^esub> a) (create\<^bsub>X\<^esub> b)) else a" + by (unfold_locales, auto simp add: lens_create_def lens_override_def) + (metis (no_types, lifting) overrider.ovr_overshadow_right) + +lemma scene_quotient_idem: "idem_scene S \ idem_scene (S /\<^sub>S X)" + by (transfer, unfold_locales, auto simp add: lens_create_def lens_override_def) + (metis (no_types, lifting) overrider.ovr_overshadow_right) + +lemma scene_quotient_indep: "A \\<^sub>S B \ (A /\<^sub>S X) \\<^sub>S (B /\<^sub>S X)" + by (transfer, auto simp add: lens_create_def lens_override_def) + +lemma scene_bot_quotient [simp]: "\\<^sub>S /\<^sub>S X = \\<^sub>S" + by (transfer, auto) + +lemma scene_comp_quotient: "vwb_lens X \ (A ;\<^sub>S X) /\<^sub>S X = A" + by (transfer, auto simp add: fun_eq_iff lens_override_def) + +lemma scene_quot_id_lens [simp]: "(A /\<^sub>S 1\<^sub>L) = A" + by (transfer, simp, simp add: lens_defs) + subsection \ Linking Scenes and Lenses \ text \ The following function extracts a scene from a very well behaved lens \ lift_definition lens_scene :: "('v \ 's) \ 's scene" ("\_\\<^sub>\") is "\ X s\<^sub>1 s\<^sub>2. if (mwb_lens X) then s\<^sub>1 \\<^sub>L s\<^sub>2 on X else s\<^sub>1" by (unfold_locales, auto simp add: lens_override_def) lemma vwb_impl_idem_scene [simp]: "vwb_lens X \ idem_scene \X\\<^sub>\" by (transfer, unfold_locales, auto simp add: lens_override_overshadow_left lens_override_overshadow_right) lemma idem_scene_impl_vwb: "\ mwb_lens X; idem_scene \X\\<^sub>\ \ \ vwb_lens X" apply (cases "mwb_lens X") apply (transfer, unfold idem_overrider_def overrider_def, auto) apply (simp add: idem_overrider_axioms_def override_idem_implies_vwb) done lemma lens_compat_scene: "\ mwb_lens X; mwb_lens Y \ \ X ##\<^sub>L Y \ \X\\<^sub>\ ##\<^sub>S \Y\\<^sub>\" by (auto simp add: lens_scene.rep_eq scene_compat.rep_eq lens_defs) text \ Next we show some important congruence properties \ lemma zero_lens_scene: "\0\<^sub>L\\<^sub>\ = \\<^sub>S" by (transfer, simp) lemma one_lens_scene: "\1\<^sub>L\\<^sub>\ = \\<^sub>S" by (transfer, simp) +lemma scene_comp_top_scene [simp]: "vwb_lens x \ \\<^sub>S ;\<^sub>S x = \x\\<^sub>\" + by (transfer, simp add: fun_eq_iff lens_override_def) + +lemma scene_comp_lens_scene_indep [simp]: "x \ y \ \x\\<^sub>\ \\<^sub>S a ;\<^sub>S y" + by (transfer, simp add: lens_indep.lens_put_comm lens_indep.lens_put_irr2 lens_override_def) + lemma lens_scene_override: "mwb_lens X \ s\<^sub>1 \\<^sub>S s\<^sub>2 on \X\\<^sub>\ = s\<^sub>1 \\<^sub>L s\<^sub>2 on X" by (transfer, simp) lemma lens_indep_scene: assumes "vwb_lens X" "vwb_lens Y" shows "(X \ Y) \ \X\\<^sub>\ \\<^sub>S \Y\\<^sub>\" using assms by (auto, (simp add: scene_indep_override, transfer, simp add: lens_indep_override_def)+) lemma lens_indep_impl_scene_indep [simp]: "(X \ Y) \ \X\\<^sub>\ \\<^sub>S \Y\\<^sub>\" by (transfer, auto simp add: lens_indep_comm lens_override_def) lemma get_scene_override_indep: "\ vwb_lens x; \x\\<^sub>\ \\<^sub>S a \ \ get\<^bsub>x\<^esub> (s \\<^sub>S s' on a) = get\<^bsub>x\<^esub> s" proof - assume a1: "\x\\<^sub>\ \\<^sub>S a" assume a2: "vwb_lens x" then have "\b ba bb. bb \\<^sub>S b \\<^sub>S ba on a on \x\\<^sub>\ = bb \\<^sub>S b on \x\\<^sub>\" using a1 by (metis idem_scene_uminus indep_then_compl_in scene_indep_sym scene_override_commute subscene_eliminate vwb_impl_idem_scene) then show ?thesis using a2 by (metis lens_override_def lens_scene_override mwb_lens_def vwb_lens_mwb weak_lens.put_get) qed +lemma put_scene_override_indep: + "\ vwb_lens x; \x\\<^sub>\ \\<^sub>S a \ \ put\<^bsub>x\<^esub> s v \\<^sub>S s' on a = put\<^bsub>x\<^esub> (s \\<^sub>S s' on a) v" + by (transfer, auto) + (metis lens_override_def mwb_lens_weak vwb_lens_mwb weak_lens.put_get) + lemma get_scene_override_le: "\ vwb_lens x; \x\\<^sub>\ \ a \ \ get\<^bsub>x\<^esub> (s \\<^sub>S s' on a) = get\<^bsub>x\<^esub> s'" by (metis get_scene_override_indep scene_le_iff_indep_inv scene_override_commute) +lemma put_scene_override_le: "\ vwb_lens x; idem_scene a; \x\\<^sub>\ \ a \ \ put\<^bsub>x\<^esub> s v \\<^sub>S s' on a = s \\<^sub>S s' on a" + by (metis lens_override_idem lens_override_put_right_in lens_scene_override sublens_refl subscene_eliminate vwb_lens_mwb) + +lemma put_scene_override_le_distrib: + "\ vwb_lens x; idem_scene A; \x\\<^sub>\ \ A \ \ put\<^bsub>x\<^esub> (s\<^sub>1 \\<^sub>S s\<^sub>2 on A) v = (put\<^bsub>x\<^esub> s\<^sub>1 v) \\<^sub>S (put\<^bsub>x\<^esub> s\<^sub>2 v) on A" + by (metis put_scene_override_indep put_scene_override_le scene_le_iff_indep_inv scene_override_commute) + lemma lens_plus_scene: "\ vwb_lens X; vwb_lens Y; X \ Y \ \ \X +\<^sub>L Y\\<^sub>\ = \X\\<^sub>\ \\<^sub>S \Y\\<^sub>\" by (transfer, auto simp add: lens_override_plus lens_indep_override_def lens_indep_overrideI) lemma subscene_implies_sublens': "\ vwb_lens X; vwb_lens Y \ \ \X\\<^sub>\ \ \Y\\<^sub>\ \ X \\<^sub>L' Y" by (simp add: lens_defs, transfer, simp add: lens_override_def) lemma sublens'_implies_subscene: "\ vwb_lens X; vwb_lens Y; X \\<^sub>L' Y \ \ \X\\<^sub>\ \ \Y\\<^sub>\" by (simp add: lens_defs, auto simp add: lens_override_def lens_scene_override) lemma sublens_iff_subscene: assumes "vwb_lens X" "vwb_lens Y" shows "X \\<^sub>L Y \ \X\\<^sub>\ \ \Y\\<^sub>\" by (simp add: assms sublens_iff_sublens' subscene_implies_sublens') lemma lens_scene_indep_compl [simp]: assumes "vwb_lens x" "vwb_lens y" shows "\x\\<^sub>\ \\<^sub>S - \y\\<^sub>\ \ x \\<^sub>L y" by (simp add: assms scene_le_iff_indep_inv sublens_iff_subscene) +lemma lens_scene_comp: "\ vwb_lens X; vwb_lens Y \ \ \X ;\<^sub>L Y\\<^sub>\ = \X\\<^sub>\ ;\<^sub>S Y" + by (transfer, simp add: fun_eq_iff comp_vwb_lens) + (simp add: lens_comp_def lens_override_def) + +lemma scene_comp_pres_indep: "\ idem_scene a; idem_scene b; a \\<^sub>S \x\\<^sub>\ \ \ a \\<^sub>S b ;\<^sub>S x" + by (transfer, auto) + (metis (no_types, opaque_lifting) lens_override_def lens_override_idem vwb_lens_def wb_lens_weak weak_lens.put_get) + +lemma scene_comp_le: "A ;\<^sub>S X \ \X\\<^sub>\" + unfolding less_eq_scene_def by (transfer, auto simp add: fun_eq_iff lens_override_def) + +lemma scene_quotient_comp: "\ vwb_lens X; idem_scene A; A \ \X\\<^sub>\ \ \ (A /\<^sub>S X) ;\<^sub>S X = A" + unfolding less_eq_scene_def +proof (transfer, simp add: fun_eq_iff, safe) + fix Xa :: "'a \ 'b" and Aa :: "'b \ 'b \ 'b" and x :: 'b and xa :: 'b + assume a1: "vwb_lens Xa" + assume a2: "overrider Aa" + assume a3: "idem_overrider Aa" + assume a4: "\s\<^sub>1 s\<^sub>2 s\<^sub>3. Aa (s\<^sub>1 \\<^bsub>Xa\<^esub> s\<^sub>2) s\<^sub>3 = s\<^sub>1 \\<^bsub>Xa\<^esub> Aa s\<^sub>2 s\<^sub>3" + have "\b. Aa b b = b" + using a3 by simp + then have "Aa x (put\<^bsub>Xa\<^esub> src\<^bsub>Xa\<^esub> (get\<^bsub>Xa\<^esub> xa)) = Aa x xa" + by (metis a2 a4 lens_override_def overrider.ovr_overshadow_right) + then show "put\<^bsub>Xa\<^esub> x (get\<^bsub>Xa\<^esub> (Aa (create\<^bsub>Xa\<^esub> (get\<^bsub>Xa\<^esub> x)) (create\<^bsub>Xa\<^esub> (get\<^bsub>Xa\<^esub> xa)))) = Aa x xa" + using a4 a1 by (metis lens_create_def lens_override_def vwb_lens_def wb_lens.get_put wb_lens_weak weak_lens.put_get) +qed + +lemma lens_scene_quotient: "\ vwb_lens Y; X \\<^sub>L Y \ \ \X /\<^sub>L Y\\<^sub>\ = \X\\<^sub>\ /\<^sub>S Y" + by (metis lens_quotient_comp lens_quotient_vwb lens_scene_comp scene_comp_quotient sublens_pres_vwb vwb_lens_def wb_lens_weak) + +lemma scene_union_quotient: "\ A ##\<^sub>S B; A \ \X\\<^sub>\; B \ \X\\<^sub>\ \ \ (A \\<^sub>S B) /\<^sub>S X = (A /\<^sub>S X) \\<^sub>S (B /\<^sub>S X)" + unfolding less_eq_scene_def + by (case_tac "vwb_lens X"; transfer, auto simp add: lens_create_def lens_override_def) + text \ Equality on scenes is sound and complete with respect to lens equivalence. \ lemma lens_equiv_scene: assumes "vwb_lens X" "vwb_lens Y" shows "X \\<^sub>L Y \ \X\\<^sub>\ = \Y\\<^sub>\" proof assume a: "X \\<^sub>L Y" show "\X\\<^sub>\ = \Y\\<^sub>\" by (meson a assms lens_equiv_def sublens_iff_subscene subscene_antisym vwb_impl_idem_scene) next assume b: "\X\\<^sub>\ = \Y\\<^sub>\" show "X \\<^sub>L Y" by (simp add: assms b lens_equiv_def sublens_iff_subscene subscene_refl) qed -definition lens_insert :: "('a \ 'b) \ 'b scene \ 'b scene" ("insert\<^sub>S") where -"lens_insert x A = (if (\x\\<^sub>\ \ A) then \x\\<^sub>\ \\<^sub>S A else A)" - -lemma lens_insert_idem: "insert\<^sub>S x (insert\<^sub>S x A) = insert\<^sub>S x A" - apply (auto simp add: lens_insert_def less_eq_scene_def) +lemma lens_scene_top_iff_bij_lens: "mwb_lens x \ \x\\<^sub>\ = \\<^sub>S \ bij_lens x" apply (transfer) - apply (auto simp add: lens_override_overshadow_left) - apply (metis lens_override_overshadow_left) + apply (auto simp add: fun_eq_iff lens_override_def) + apply (unfold_locales) + apply auto done -text \ Membership operations. These have slightly hacky definitions at the moment in order to - cater for @{term mwb_lens}. See if they can be generalised? \ - -definition lens_member :: "('a \ 'b) \ 'b scene \ bool" (infix "\\<^sub>S" 50) where -[lens_defs]: -"lens_member x A = ((\ s\<^sub>1 s\<^sub>2 s\<^sub>3. s\<^sub>1 \\<^sub>S s\<^sub>2 on A \\<^sub>L s\<^sub>3 on x = s\<^sub>1 \\<^sub>S (s\<^sub>2 \\<^sub>L s\<^sub>3 on x) on A) \ - (\ b b'. get\<^bsub>x\<^esub> (b \\<^sub>S b' on A) = get\<^bsub>x\<^esub> b'))" - -lemma lens_member_override: "x \\<^sub>S A \ s\<^sub>1 \\<^sub>S s\<^sub>2 on A \\<^sub>L s\<^sub>3 on x = s\<^sub>1 \\<^sub>S (s\<^sub>2 \\<^sub>L s\<^sub>3 on x) on A" - using lens_member_def by force - -lemma lens_member_put: - assumes "vwb_lens x" "idem_scene a" "x \\<^sub>S a" - shows "put\<^bsub>x\<^esub> s v \\<^sub>S s on a = s" - by (metis (full_types) assms lens_member_override lens_override_def scene_override_idem vwb_lens.put_eq) - -lemma lens_member_top: "x \\<^sub>S \\<^sub>S" - by (auto simp add: lens_member_def) - -abbreviation lens_not_member :: "('a \ 'b) \ 'b scene \ bool" (infix "\\<^sub>S" 50) where -"x \\<^sub>S A \ (x \\<^sub>S - A)" - -lemma lens_member_get_override [simp]: "x \\<^sub>S a \ get\<^bsub>x\<^esub> (b \\<^sub>S b' on a) = get\<^bsub>x\<^esub> b'" - by (simp add: lens_member_def) - -lemma lens_not_member_get_override [simp]: "x \\<^sub>S a \ get\<^bsub>x\<^esub> (b \\<^sub>S b' on a) = get\<^bsub>x\<^esub> b" - by (simp add: lens_member_def scene_override_commute) - subsection \ Function Domain Scene \ lift_definition fun_dom_scene :: "'a set \ ('a \ 'b::two) scene" ("fds") is "\ A f g. override_on f g A" by (unfold_locales, simp_all add: override_on_def fun_eq_iff) lemma fun_dom_scene_empty: "fds({}) = \\<^sub>S" by (transfer, simp) lemma fun_dom_scene_union: "fds(A \ B) = fds(A) \\<^sub>S fds(B)" by (transfer, auto simp add: fun_eq_iff override_on_def) lemma fun_dom_scene_compl: "fds(- A) = - fds(A)" by (transfer, auto simp add: fun_eq_iff override_on_def) lemma fun_dom_scene_inter: "fds(A \ B) = fds(A) \\<^sub>S fds(B)" by (simp add: inf_scene_def fun_dom_scene_union[THEN sym] fun_dom_scene_compl[THEN sym]) lemma fun_dom_scene_UNIV: "fds(UNIV) = \\<^sub>S" by (transfer, auto simp add: fun_eq_iff override_on_def) lemma fun_dom_scene_indep [simp]: "fds(A) \\<^sub>S fds(B) \ A \ B = {}" by (transfer, auto simp add: override_on_def fun_eq_iff, meson two_diff) lemma fun_dom_scene_always_compat [simp]: "fds(A) ##\<^sub>S fds(B)" by (transfer, simp add: override_on_def fun_eq_iff) lemma fun_dom_scene_le [simp]: "fds(A) \\<^sub>S fds(B) \ A \ B" unfolding less_eq_scene_def by (transfer, auto simp add: override_on_def fun_eq_iff, meson two_diff) text \ Hide implementation details for scenes \ lifting_update scene.lifting lifting_forget scene.lifting end \ No newline at end of file diff --git a/thys/Optics/document/root.tex b/thys/Optics/document/root.tex --- a/thys/Optics/document/root.tex +++ b/thys/Optics/document/root.tex @@ -1,108 +1,108 @@ \documentclass[11pt,a4paper]{article} \usepackage[T1]{fontenc} \usepackage{isabelle,isabellesym} \usepackage{fullpage} \usepackage[usenames,dvipsnames]{color} \usepackage{graphicx} \usepackage{document} % further packages required for unusual symbols (see also % isabellesym.sty), use only when needed \usepackage{amssymb} %for \, \, \, \, \, \, %\, \, \, \, \, %\, \, \ \usepackage[greek,english]{babel} %option greek for \ %option english (default language) for \, \ \usepackage[only,bigsqcap]{stmaryrd} %for \ \usepackage{eufrak} %for \ ... \, \ ... \ (also included in amssymb) %\usepackage{textcomp} %for \, \, \, \, \, %\ \usepackage{stmaryrd} % this should be the last package used \usepackage{pdfsetup} % urls in roman style, theory text in math-similar italics \urlstyle{rm} \isabellestyle{it} % for uniform font size %\renewcommand{\isastyle}{\isastyleminor} % Lens operations \newcommand{\view}{\mathit{V}} \newcommand{\src}{\mathit{S}} \newcommand{\lsbs}{{L}} \newcommand{\lput}{\textit{\textsf{put}}} \newcommand{\lget}{\textit{\textsf{get}}} \newcommand{\lcreate}{\mathit{create}} \newcommand{\lto}{\Longrightarrow} \newcommand{\lsubseteq}{\preceq} \newcommand{\lsupseteq}{\mathop{\supseteq_\lsbs}} \newcommand{\lequiv}{\approx} \newcommand{\lcomp}{;_\lsbs} \newcommand{\lplus}{+_\lsbs} \newcommand{\lquot}{\mathop{/\!_\lsbs}} \newcommand{\lindep}{\mathop{\,\bowtie\,}} \newcommand{\lone}{\mathbf{1}} \newcommand{\lzero}{\mathbf{0}} \newcommand{\lfst}{\textit{\textsf{\textbf{fst}}}} \newcommand{\lsnd}{\textit{\textsf{\textbf{snd}}}} \setcounter{topnumber}{1} \setcounter{bottomnumber}{1} \setcounter{totalnumber}{1} \begin{document} \title{Optics in Isabelle/HOL} -\author{Simon Foster and Frank Zeyda \\[.5ex] University of York, UK \\[2ex] \texttt{\small $\{$simon.foster,frank.zeyda$\}$@york.ac.uk}} +\author{Simon Foster, Christian Pardillo-Laursen, and Frank Zeyda \\[.5ex] University of York, UK \\[2ex] \texttt{\small $\{$simon.foster,christian.laursen,frank.zeyda$\}$@york.ac.uk}} \maketitle \begin{abstract} Lenses provide an abstract interface for manipulating data types through spatially-separated views. They are defined abstractly in terms of two functions, $\lget$, the return a value from the source type, and $\lput$ that updates the value. We mechanise the underlying theory of lenses, in terms of an algebraic hierarchy of lenses, including well-behaved and very well-behaved lenses, each lens class being characterised by a set of lens laws. We also mechanise a lens algebra in Isabelle that enables their composition and comparison, so as to allow construction of complex lenses. This is accompanied by a large library of algebraic laws. Moreover we also show how the lens classes can be applied by instantiating them with a number of Isabelle data types. This theory development is based on our recent papers~\cite{Foster16a,Foster2020-IsabelleUTP}, which show how lenses can be used to unify heterogeneous representations of state-spaces in formalised programs. \end{abstract} \tableofcontents % sane default for proof documents \parindent 0pt\parskip 0.5ex % generated text of all theories \input{session} \vspace{4ex} % Acknowledgments \noindent\textbf{Acknowledgements}. This work is partly supported by EU H2020 project \emph{INTO-CPS}, grant agreement 644047. \url{http://into-cps.au.dk/}. We would also like to thank Prof. Burkhart Wolff and Dr. Achim Brucker for their generous and helpful comments on our work, and particurlarly their invaluable advice on Isabelle mechanisation and ML coding. % optional bibliography \bibliographystyle{abbrv} \bibliography{root} \end{document}