TLA + - TLA+
Paradigma | Akce |
---|---|
Navrhl | Leslie Lamport |
Poprvé se objevil | 23.dubna 1999[1] |
Stabilní uvolnění | TLA+2 / 15. ledna 2014[2] |
Jazyk implementace | Jáva |
OS | Cross-platform (více platforem) |
Licence | Licence MIT[3] |
Přípony názvu souboru | .tla |
webová stránka | výzkum |
TLA+ je formální specifikace jazyk vyvinutý společností Leslie Lamport. Používá se zejména k navrhování, modelování, dokumentování a ověřování programů souběžné systémy a distribuované systémy. TLA+ byl popsán jako taxativně testovatelný pseudo kód,[4] a jeho použití přirovnáváno k kreslení plánů pro softwarové systémy;[5] TLA je akronym pro Časová logika akcí.
Pro návrh a dokumentaci, TLA+ plní stejný účel jako neformální Technické specifikace. Nicméně TLA+ specifikace jsou psány ve formálním jazyce v logika a matematika a přesnost specifikací napsaných v tomto jazyce má odhalit nedostatky v návrhu před zahájením implementace systému.[6]
Od TLA+ specifikace jsou psány ve formálním jazyce, jsou konečné kontrola modelu. Kontrola modelu najde všechna možná chování systému až do určitého počtu prováděcích kroků a prozkoumá, zda nejsou porušena požadovaná invariance vlastnosti jako bezpečnost a živost. TLA+ specifikace používají základní teorie množin definovat bezpečnost (špatné věci se nestanou) a časová logika definovat živost (dobré věci se nakonec stanou).
TLA+ se také používá k psaní strojem kontrolované důkazy o správnosti oba pro algoritmy a matematické věty. Důkazy jsou psány deklarativním, hierarchickým stylem nezávislým na jakémkoli backendu prověrky věty. Formální i neformální strukturované matematické důkazy lze psát v TLA+; jazyk je podobný Latex a existují nástroje pro překlad TLA+ specifikace dokumentů LaTeXu.[7]
TLA+ byl představen v roce 1999 po několika desetiletích výzkumu metody ověřování souběžných systémů. Od té doby se vyvinul nástrojový řetězec, včetně IDE a distribuovaný model kontroly. Jazyk podobný pseudokódu PlusCal byl vytvořen v roce 2009; to transpiles do TLA+ a je užitečné pro specifikaci sekvenčních algoritmů. TLA+2 bylo oznámeno v roce 2014 a rozšiřuje jazykovou podporu pro konstrukty důkazů. Aktuální TLA+ odkaz je TLA+ Hyperbook Leslie Lamport.
Dějiny
Moderní časová logika byl vyvinut společností Arthur Prior v roce 1957, poté nazvaný napjatá logika. Ačkoli Amir Pnueli byl první, kdo vážně studoval aplikace časové logiky na počítačová věda, Prior spekuloval o jeho použití o deset let dříve v roce 1967:
Užitečnost systémů tohoto druhu [v diskrétním čase] nezávisí na žádném vážném metafyzickém předpokladu, že čas je diskrétní; jsou použitelné v omezených oblastech diskurzu, ve kterých se zabýváme pouze tím, co se stane dále v posloupnosti diskrétních stavů, např. v práci digitálního počítače.
Pnueli zkoumal použití časové logiky při specifikaci a uvažování o počítačových programech lineární časová logika v roce 1977. LTL se stal důležitým nástrojem pro analýzu souběžných programů, snadno vyjadřujících vlastnosti jako např vzájemné vyloučení a svoboda od zablokování.[8]
Souběžně s Pnueliho prací na LTL akademici pracovali na generalizaci Logika hoare pro ověření víceprocesních programů. Leslie Lamport se o problém začal zajímat poté peer review našel chybu v příspěvku, který předložil o vzájemném vyloučení. Představen Ed Ashcroft invariance ve svém příspěvku z roku 1975 „Proving Assertions About Parallel Programmes“, který Lamport zobecnil Floyd Metoda v jeho příspěvku z roku 1977 „Prokazování správnosti víceprocesových programů“. Lamportův článek také představil bezpečnost a živost jako zobecnění částečná správnost a ukončení, resp.[9] Tato metoda byla použita k ověření první souběžnosti odvoz odpadu algoritmus v dokumentu z roku 1978 s Edsger Dijkstra.[10]
Lamport se poprvé setkal s Pnueliho LTL během semináře v roce 1978 Stanford organizováno Susan Owicki. Podle Lamporta „jsem si byl jistý, že časová logika je jakýmsi abstraktním nesmyslem, který by nikdy neměl žádnou praktickou aplikaci, ale vypadalo to jako zábava, tak jsem se zúčastnil.“ V roce 1980 vydal „„ Někdy “je někdy„ Ne nikdy ““, který se stal jedním z nejčastěji citovaných článků v literatuře časové logiky.[11] Lamport pracoval na psaní časových logických specifikací během svého působení v SRI, ale shledal tento přístup nepraktickým:
Začal jsem však být rozčarovaný časovou logikou, když jsem viděl, jak Schwartz, Melliar-Smith a Fritz Vogt tráví dny snahou specifikovat jednoduchý FIFO fronta - dohadování se o tom, zda vlastnosti, které uvedli, jsou dostatečné. Uvědomil jsem si, že navzdory své estetické přitažlivosti psaní specifikace jako spojení časových vlastností v praxi prostě nefungovalo.
Jeho hledání praktické metody specifikace vyústilo v dokument z roku 1983 „Specifying Concurrent Programming Modules“, který představil myšlenku popsat přechody stavu jako booleovské funkce primovaných a neprimprimovaných proměnných.[12] Práce pokračovaly během 80. let a Lamport začal vydávat příspěvky na časová logika akcí v roce 1990; formálně to však bylo zavedeno až v roce 1994, kdy byla zveřejněna „Časová logika akcí“. TLA umožnila použití akce v časových vzorcích, které podle Lamporta „poskytují elegantní způsob formalizace a systematizace všech úvah použitých při souběžném ověřování systému“.[13]
Specifikace TLA se většinou skládaly z obyčejné jiné než časové matematiky, což Lamportovi připadalo méně těžkopádné než čistě časová specifikace. TLA poskytla matematický základ specifikačnímu jazyku TLA+, představený v článku „Specifikace souběžných systémů s TLA+„v roce 1999.[1] Později téhož roku Yuan Yu napsal TLC kontrola modelu pro TLA+ Specifikace; TLC byla použita k nalezení chyb v soudržnost mezipaměti protokol pro a Compaq víceprocesorový.[14]
Lamport vydal úplnou učebnici o TLA+ v roce 2002 s názvem „Specifikace systémů: TLA+ Jazyk a nástroje pro softwarové inženýry ".[15] PlusCal byl představen v roce 2009,[16] a TLA+ proof system (TLAPS) v roce 2012.[17] TLA+2 bylo oznámeno v roce 2014 a bylo přidáno několik dalších jazykových konstrukcí a značně vzrostla jazyková podpora pro kontrolní systém.[2] Lamport se zabývá vytvářením aktualizovaných TLA+ odkaz, „The TLA+ Hyperbook ". Nedokončená práce je dostupný z jeho oficiálních webových stránek. Lamport také vytváří Video kurz TLA +, popsaný v tomto dokumentu jako „nedokončené dílo, které spočívá na začátku řady video přednášek, které mají učit programátory a softwarové inženýry, jak psát své vlastní specifikace TLA +“.
Jazyk
TLA+ specifikace jsou uspořádány do modulů. Moduly mohou rozšířit (importovat) další moduly, aby využily své funkce. Ačkoli TLA+ Standard je specifikován v sázených matematických symbolech, existujících TLA+ nástroje používají Latex -jako definice symbolů v ASCII. TLA+ používá několik termínů, které vyžadují definici:
- Stát - přiřazení hodnot k proměnným
- Chování - sled stavů
- Krok - dvojice po sobě jdoucích stavů v chování
- Koktavý krok - krok, během kterého se proměnné nemění
- Vztah dalšího státu - vztah popisující, jak se mohou proměnné měnit v kterémkoli kroku
- Funkce státu - výraz obsahující proměnné a konstanty, který není vztahem dalšího stavu
- Státní predikát - stavová funkce s booleovskou hodnotou
- Invariantní - predikát stavu pravdivý ve všech dosažitelných stavech
- Časový vzorec - výraz obsahující příkazy v časové logice
Bezpečnost
TLA+ se zabývá definováním sady všech správných chování systému. Například jednobitové hodiny tikající donekonečna mezi 0 a 1 lze určit takto:
VARIABLE clockInit == clock in {0, 1} Tick == IF clock = 0 THEN clock '= 1 ELSE clock' = 0Spec == Init / [] [Tick] _ <>
Vztah dalšího státu Klíště sady hodiny' (hodnota hodiny v dalším stavu) na 1, pokud hodiny je 0 a 0 pokud hodiny je 1. Predikát stavu Init je pravda, pokud je hodnota hodiny je buď 0 nebo 1. Spec je dočasný vzorec prohlašující, že všechna chování jednobitových hodin musí zpočátku vyhovovat Init a všechny kroky se musí shodovat Klíště nebo být koktavé kroky. Dvě takové chování jsou:
0 -> 1 -> 0 -> 1 -> 0 -> ...1 -> 0 -> 1 -> 0 -> 1 -> ...
Bezpečnostní vlastnosti jednobitových hodin - sada dosažitelných stavů systému - jsou adekvátně popsány ve specifikaci.
Živost
Výše uvedená specifikace zakazuje podivné stavy pro jednobitové hodiny, ale neříká, že hodiny budou někdy tikat. Například jsou přijímána následující neustále zakoktávající chování:
0 -> 0 -> 0 -> 0 -> 0 -> ...1 -> 1 -> 1 -> 1 -> 1 -> ...
Hodiny, které netikají, nejsou užitečné, proto by toto chování mělo být zakázáno. Jedním z řešení je zakázat koktání, ale TLA+ vyžaduje, aby bylo vždy povoleno koktání; krok koktání představuje změnu některé části systému, která není popsána ve specifikaci, a je užitečný pro upřesnění. Aby bylo zajištěno, že hodiny musí nakonec tikat, slabé spravedlnost je uplatňováno pro Klíště:
Spec == Init / [] [Tick] _ <> / WF_ <> (Tick)
Slabá spravedlnost nad akcí znamená, že pokud je tato akce neustále povolena, musí být nakonec přijata. Se slabou férovostí Klíště mezi klíšťaty je povolen pouze konečný počet kroků koktání. Toto časové logické tvrzení o Klíště se nazývá tvrzení živosti. Obecně by mělo být tvrzení o živosti strojově zavřený: nemělo by to omezovat množinu dosažitelných stavů, pouze množinu možných chování.[18]
Většina specifikací nevyžaduje uplatnění živých vlastností. Bezpečnostní vlastnosti postačují jak pro kontrolu modelu, tak pro vedení při implementaci systému.[19]
Operátoři
TLA+ je založeno na ZF, takže operace s proměnnými zahrnují manipulaci s množinami. Jazyk obsahuje sadu členství, svaz, průsečík, rozdíl, výkonová sada, a podmnožina operátory. Logika prvního řádu operátoři jako ∨, ∧, ¬, ⇒, ↔, ≡ jsou také zahrnuty, stejně jako univerzální a existenciální kvantifikátory ∀ a ∃. Hilberta ε je poskytován jako operátor CHOOSE, který jedinečně vybere prvek libovolné množiny. Aritmetické operátory skončily realita, celá čísla, a přirozená čísla jsou k dispozici ze standardních modulů.
Časové logické operátory jsou zabudovány do TLA+. Používají se dočasné vzorce znamenat P je vždy pravda, a znamenat P je nakonec pravda. Operátoři jsou sloučeni do znamenat P platí nekonečně často, nebo znamenat nakonec P bude vždy pravda. Mezi další časové operátory patří slabá a silná spravedlnost. Slabá spravedlnost WFE(A) znamená, že akce A je povoleno nepřetržitě (tj. bez přerušení), musí být nakonec přijato. Silná spravedlnost SFE(A) znamená, že akce A je povoleno neustále (opakovaně, s přerušeními nebo bez přerušení), musí být nakonec přijato.
Časová existenciální a univerzální kvantifikace jsou zahrnuty v TLA+, i když bez podpory nástrojů.
Uživatelem definované operátory jsou podobné makra. Operátoři se liší od funkcí v tom, že jejich doména nemusí být nastavena: například nastavit členství provozovatel má kategorie sad jako jeho doména, kterou je není platná sada v ZFC (protože jeho existence vede k Russellův paradox ). Do TLA byly přidány rekurzivní a anonymní uživatelsky definované operátory+2.
Datové struktury
Základní datová struktura TLA+ je sada. Sady jsou buď explicitně vyjmenovány, nebo vytvořeny z jiných sad pomocí operátorů nebo s {X v S: str}
kde p je nějaká podmínka na Xnebo {e: x v S}
kde E je nějaká funkce X. Unikátní prázdná sada je reprezentován jako {}
.
Funkce v TLA+ přiřadit hodnotu každému prvku v jejich doméně, množině. [S -> T]
je sada všech funkcí s f [X] v T, pro každého X v doména soubor S. Například TLA+ funkce Double [x in Nat] == x * 2
je prvek sady [Nat -> Nat]
tak Double in [Nat -> Nat]
je pravdivé tvrzení v TLA+. Funkce jsou také definovány pomocí [x v S | -> e]
pro nějaký výraz Enebo úpravou existující funkce [f KROMĚ! [v1] = v2]
.
Evidence jsou typem funkce v TLA+. Záznam [jméno | -> „John“, věk | -> 35]
je záznam s názvem a věkem polí, přístupný pomocí r. jméno
a vztek
a patří do sady záznamů [jméno: řetězec, věk: Nat]
.
N-tice jsou zahrnuty v TLA+. Jsou výslovně definovány pomocí << e1,E2,E3>>
nebo konstruovány s operátory ze standardního modulu Sekvence. Sady n-tic jsou definovány kartézský součin; například je definována množina všech párů přirozených čísel Nat X Nat
.
Standardní moduly
TLA+ má sadu standardních modulů obsahujících běžné operátory. Jsou distribuovány syntaktickým analyzátorem. Kontrola modelu TLC používá pro lepší výkon implementace Java.
- Konečné sady: Modul pro práci s konečné množiny. Poskytuje IsFiniteSet (S) a Mohutnost (S) operátory.
- Sekvence: Definuje operátory n-tice jako Objektiv), Hlava (S), Ocas (S), Připojit (S, E), zřetězení, a filtr.
- Tašky: Modul pro práci s multisety. Poskytuje analoga operací primitivní množiny a počítání duplikátů.
- Přírodní: Definuje Přirozená čísla spolu s nerovnostmi a aritmetickými operátory.
- Celá čísla: Definuje Celá čísla.
- Skutečné: Definuje Skutečná čísla spolu s rozdělením a nekonečno.
- Reálný čas: Poskytuje definice užitečné v systém v reálném čase Specifikace.
- TLC: Poskytuje funkce obslužného programu pro specifikace kontrolované modelem, například protokolování a tvrzení.
Standardní moduly se importují pomocí ROZŠIŘUJE
nebo INSTANCE
prohlášení.
Nástroje
IDE
TLA+ IDE v typickém použití zobrazující spec explorer vlevo, editor uprostřed a analyzovat chyby vpravo. | |
Původní autoři | Simon Zambrovski, Markus Kuppe, Daniel Ricketts |
---|---|
Vývojáři | Hewlett Packard, Microsoft |
První vydání | 4. února 2010 |
Stabilní uvolnění | 1.7.0 / 25. dubna 2020 |
Náhled verze | 1.7.1 / 1. května 2020 |
Úložiště | github |
Napsáno | Jáva |
K dispozici v | Angličtina |
Typ | Integrované vývojové prostředí |
Licence | Licence MIT |
webová stránka | výzkum |
An integrované vývojové prostředí je implementován nad Zatmění. Obsahuje editor s chybou a zvýraznění syntaxe, plus a GUI front-end k několika dalším TLA+ nástroje:
- Syntaktický analyzátor SANY, který analyzuje a kontroluje syntaktické chyby spec.
- The Latex překladatel, generovat pěkně tištěný brejle.
- Překladač PlusCal.
- Kontrola modelu TLC.
- Systém kontroly TLAPS.
IDE je distribuován v Sada nástrojů TLA.
Kontrola modelu
TLC kontrola modelu staví a konečný stav model TLA+ specifikace pro kontrolu vlastnosti invariance. TLC generuje sadu počátečních stavů vyhovujících specifikaci, poté provede a vyhledávání na šířku přes všechny definované přechody stavu. Provádění se zastaví, když všechny přechody stavu vedou ke stavům, které již byly objeveny. Pokud TLC objeví stav, který naruší invariant systému, zastaví se a poskytne cestu trasování stavu do problematického stavu. TLC poskytuje metodu deklarování modelových symetrií, proti kterým se brání kombinatorická exploze.[14] To také paralelizuje krok průzkumu stavu a může běžet v distribuovaném režimu k rozložení pracovní zátěže na velký počet počítačů.[20]
Jako alternativu k vyčerpávajícímu vyhledávání na šířku může TLC použít vyhledávání na hloubku nebo generovat náhodné chování. TLC pracuje na podmnožině TLA+; model musí být konečný a vyčíslitelný a některé časové operátory nejsou podporovány. V distribuovaném režimu TLC nemůže zkontrolovat vlastnosti živosti ani zkontrolovat náhodné chování nebo chování do hloubky. TLC je dostupný jako nástroj příkazového řádku nebo dodávaný se sadou nástrojů TLA.
Důkazní systém
TLA+ Proof System, nebo TLAPS, mechanicky kontroluje důkazy napsané v TLA+. Byl vyvinut na Microsoft Research -INRIA Společné centrum k prokázání správnosti souběžných a distribuovaných algoritmů. Jazyk korektury je navržen tak, aby byl nezávislý na jakémkoli konkrétním důkazu věty; důkazy jsou psány deklarativním stylem a transformovány do jednotlivých povinností, které jsou zasílány back-end proverům. Primární back-end provery jsou Isabelle a Zenon, se zálohou k SMT řešitelé CVC3, Yices, a Z3. Důkazy TLAPS jsou hierarchicky strukturované, což usnadňuje refaktoring a umožňuje nelineární vývoj: práce mohou začít na pozdějších krocích, než budou ověřeny všechny předchozí kroky, a obtížné kroky budou rozloženy na menší dílčí kroky. TLAPS funguje dobře s TLC, protože kontrola modelu rychle najde malé chyby, než začne ověřování. TLAPS zase může prokázat vlastnosti systému, které přesahují možnosti kontroly konečných modelů.[17]
TLAPS v současné době nepodporuje uvažování s reálnými čísly, ani většina časových operátorů. Isabelle a Zenon obecně nemohou prokázat povinnosti aritmetického důkazu vyžadující použití řešičů SMT.[21] TLAPS byl použit k prokázání správnosti Byzantský Paxos, bezpečnostní architektura Memoir a komponenty Pečivo distribuované hash tabulky.[17] Je distribuován odděleně od zbytku TLA+ nástroje a je to svobodný software distribuovaný pod Licence BSD.[22] TLA+2 výrazně rozšířená jazyková podpora pro konstrukty důkazů.
Průmyslové použití
Na Microsoft byla v systému objevena kritická chyba Xbox 360 paměťový modul během procesu zápisu specifikace v TLA+.[23] TLA+ byl použit k napsání formálních důkazů o správnosti pro Byzantský Paxos a komponenty Pečivo distribuované hash tabulky.[17]
Webové služby Amazon používá TLA+ od roku 2011. TLA+ kontrola modelu odhalených chyb ve Windows DynamoDB, S3, EBS a interní distribuovaný správce zámku; některé chyby vyžadovaly stopy stavu 35 kroků. Kontrola modelu byla také použita k ověření agresivních optimalizací. Kromě toho TLA+ Bylo zjištěno, že specifikace mají hodnotu jako dokumentace a návrhové pomůcky.[4][24]
Microsoft Azure použitý TLA+ navrhnout Kosmos DB, globálně distribuovaná databáze s pěti různými modely konzistence.[25][26]
Příklady
--------------------------- MODULE KeyValueStore --------------------- ------KONSTANTY Klíč, \* The soubor z Všechno klíče. Val, \* The soubor z Všechno hodnoty. TxId \* The soubor z Všechno transakce ID.PREMENNÉ obchod, \* A data obchod mapování klíče na hodnoty. tx, \* The soubor z otevřeno momentka transakce. snapshotStore, \* Momentky z the obchod pro každý transakce. psaný, \* A log z píše provedeno v rámci každý transakce. minul \* The soubor z píše neviditelný na každý transakce.----------------------------------------------------------------------------NoVal == \* Vybrat něco na zastupovat the absence z A hodnota. VYBRAT proti : proti \ne v ValObchod == \* The soubor z Všechno klíč-hodnota obchody. [Klíč -> Val \pohár {NoVal}]Init == \* The počáteční predikát. /\ obchod = [k \v Klíč |-> NoVal] \* Všechno obchod hodnoty jsou zpočátku NoVal. /\ tx = {} \* The soubor z otevřeno transakce je zpočátku prázdný. /\ snapshotStore = \* Všechno snapshotStore hodnoty jsou zpočátku NoVal. [t \v TxId |-> [k \v Klíč |-> NoVal]] /\ psaný = [t \v TxId |-> {}] \* Všechno psát si protokoly jsou zpočátku prázdný. /\ minul = [t \v TxId |-> {}] \* Všechno minul píše jsou zpočátku prázdný. TypInvariant == \* The typ neměnný. /\ obchod \v Obchod /\ tx \subseteq TxId /\ snapshotStore \v [TxId -> Obchod] /\ psaný \v [TxId -> PODMNOŽINA Klíč] /\ minul \v [TxId -> PODMNOŽINA Klíč] TxLifecycle == /\ \A t \v tx : \* Li obchod != momentka & my ne psaný to, my musí mít minul A psát si. \A k \v Klíč : (obchod[k] /= snapshotStore[t][k] /\ k \ne v psaný[t]) => k \v minul[t] /\ \A t \v TxId \ tx : \* Kontroly transakce jsou vyčistit nahoru po likvidace. /\ \A k \v Klíč : snapshotStore[t][k] = NoVal /\ psaný[t] = {} /\ minul[t] = {}OpenTx(t) == \* Otevřeno A Nový transakce. /\ t \ne v tx /\ tx ' = tx \pohár {t} /\ snapshotStore ' = [snapshotStore AŽ NA ![t] = obchod] /\ BEZE ZMĚNY <<psaný, minul, obchod>>Přidat(t, k, proti) == \* Použitím transakce t, přidat hodnota proti na the obchod pod klíč k. /\ t \v tx /\ snapshotStore[t][k] = NoVal /\ snapshotStore ' = [snapshotStore AŽ NA ![t][k] = proti] /\ psaný' = [psaný AŽ NA ![t] = @ \pohár {k}] /\ BEZE ZMĚNY <<tx, minul, obchod>> Aktualizace(t, k, proti) == \* Použitím transakce t, Aktualizace the hodnota spojené s klíč k na proti. /\ t \v tx /\ snapshotStore[t][k] \ne v {NoVal, proti} /\ snapshotStore ' = [snapshotStore AŽ NA ![t][k] = proti] /\ psaný' = [psaný AŽ NA ![t] = @ \pohár {k}] /\ BEZE ZMĚNY <<tx, minul, obchod>> Odstranit(t, k) == \* Použitím transakce t, odstranit klíč k z the obchod. /\ t \v tx /\ snapshotStore[t][k] /= NoVal /\ snapshotStore ' = [snapshotStore AŽ NA ![t][k] = NoVal] /\ psaný' = [psaný AŽ NA ![t] = @ \pohár {k}] /\ BEZE ZMĚNY <<tx, minul, obchod>> RollbackTx(t) == \* Zavřít the transakce bez slučování píše do obchod. /\ t \v tx /\ tx ' = tx \ {t} /\ snapshotStore ' = [snapshotStore AŽ NA ![t] = [k \v Klíč |-> NoVal]] /\ psaný' = [psaný AŽ NA ![t] = {}] /\ zmeškané ' = [minul AŽ NA ![t] = {}] /\ BEZE ZMĚNY obchodCloseTx(t) == \* Zavřít transakce t, slučování píše do obchod. /\ t \v tx /\ minul[t] \víčko psaný[t] = {} \* Detekce z psát si-psát si konflikty. /\ obchod' = \* Spojit snapshotStore píše do obchod. [k \v Klíč |-> LI k \v psaný[t] PAK snapshotStore[t][k] JINÝ obchod[k]] /\ tx ' = tx \ {t} /\ zmeškané ' = \* Aktualizace the minul píše pro jiný otevřeno transakce. [otherTx \v TxId |-> LI otherTx \v tx ' PAK minul[otherTx] \pohár psaný[t] JINÝ {}] /\ snapshotStore ' = [snapshotStore AŽ NA ![t] = [k \v Klíč |-> NoVal]] /\ psaný' = [psaný AŽ NA ![t] = {}]další == \* The další-Stát vztah. \/ \E t \v TxId : OpenTx(t) \/ \E t \v tx : \E k \v Klíč : \E proti \v Val : Přidat(t, k, proti) \/ \E t \v tx : \E k \v Klíč : \E proti \v Val : Aktualizace(t, k, proti) \/ \E t \v tx : \E k \v Klíč : Odstranit(t, k) \/ \E t \v tx : RollbackTx(t) \/ \E t \v tx : CloseTx(t) Spec == \* Inicializovat Stát s Init a přechod s další. Init /\ [][další]_<<obchod, tx, snapshotStore, psaný, minul>>----------------------------------------------------------------------------TEORÉM Spec => [](TypInvariant /\ TxLifecycle)=============================================================================
------------------------------ MODULE Firewall ------------------ ------------ROZŠIŘUJE Celá číslaKONSTANTY Adresa, \* The soubor z Všechno adresy Přístav, \* The soubor z Všechno porty Protokol \* The soubor z Všechno protokolyRozsah adres == \* The soubor z Všechno adresa rozsahy {r \v Adresa \X Adresa : r[1] <= r[2]}InAddressRange[r \v Rozsah adres, A \v Adresa] == /\ r[1] <= A /\ A <= r[2]PortRange == \* The soubor z Všechno přístav rozsahy {r \v Přístav \X Přístav : r[1] <= r[2]}InPortRange[r \v PortRange, p \v Přístav] == /\ r[1] <= p /\ p <= r[2]Balíček == \* The soubor z Všechno balíčky [sourceAddress : Adresa, sourcePort : Přístav, destAddress : Adresa, destPort : Přístav, protokol : Protokol]Firewall == \* The soubor z Všechno firewally [Balíček -> BOOLEAN]Pravidlo == \* The soubor z Všechno firewall pravidla [remoteAddress : Rozsah adres, remotePort : PortRange, localAddress : Rozsah adres, localPort : PortRange, protokol : PODMNOŽINA Protokol, dovolit : BOOLEAN]Sada pravidel == \* The soubor z Všechno firewall sady pravidel PODMNOŽINA PravidloPovoleno[rset \v Sada pravidel, p \v Balíček] == \* Zda the sada pravidel umožňuje the balíček NECHAT zápasy == {pravidlo \v rset : /\ InAddressRange[pravidlo.remoteAddress, p.sourceAddress] /\ InPortRange[pravidlo.remotePort, p.sourcePort] /\ InAddressRange[pravidlo.localAddress, p.destAddress] /\ InPortRange[pravidlo.localPort, p.destPort] /\ p.protokol \v pravidlo.protokol} V /\ zápasy /= {} /\ \A pravidlo \v zápasy : pravidlo.dovolit=============================================================================
------------------------------ MODULOVÝ Výtah ------------------ ------------(***************************************************************************)(* Tento spec popisuje A jednoduchý multi-auto výtah Systém. The akce v *)(* tento spec jsou nepřekvapující a běžný na Všechno takový systémy až na pro *)(* DispatchElevator, který obsahuje the logika na určit který výtah *)(* měl by na servis který volání. The algoritmus použitý je velmi jednoduchý a dělá *)(* ne optimalizovat pro globální propustnost nebo průměrný Počkejte čas. The *)(* Časová neměnná definice zajišťuje tento Specifikace poskytuje *)(* schopnosti očekávaný z žádný výtah Systém, takový tak jako lidé nakonec *)(* dosahující jejich destinace podlaha. *)(***************************************************************************)ROZŠIŘUJE Celá číslaKONSTANTY Osoba, \* The soubor z Všechno lidé použitím the výtah Systém Výtah, \* The soubor z Všechno výtahy FloorCount \* The číslo z podlahy servisováno podle the výtah SystémPREMENNÉ PersonState, \* The Stát z každý osoba ActiveElevatorCalls, \* The soubor z Všechno aktivní výtah hovory Stav výtahu \* The Stát z každý výtahVars == \* Tuple z Všechno Specifikace proměnné <<PersonState, ActiveElevatorCalls, Stav výtahu>>Podlaha == \* The soubor z Všechno podlahy 1 .. FloorCountSměr == \* Pokyny dostupný na tento výtah Systém {"Nahoru", "Dolů"}VýtahVolání == \* The soubor z Všechno výtah hovory [podlaha : Podlaha, směr : Směr]ElevatorDirectionState == \* Výtah hnutí Stát; to je buď stěhování v A směr nebo stacionární Směr \pohár {"Stacionární"}GetDistance[f1, f2 \v Podlaha] == \* The vzdálenost mezi dva podlahy LI f1 > f2 PAK f1 - f2 JINÝ f2 - f1 GetDirection[proud, destinace \v Podlaha] == \* Směr z cestovat Požadované na hýbat se mezi proud a destinace podlahy LI destinace > proud PAK "Nahoru" JINÝ "Dolů"CanServiceCall[E \v Výtah, C \v VýtahVolání] == \* Zda výtah je v pozice na ihned servis volání NECHAT majetek == Stav výtahu[E] V /\ C.podlaha = majetek.podlaha /\ C.směr = majetek.směrLidé čekají[F \v Podlaha, d \v Směr] == \* The soubor z Všechno lidé čekání na an výtah volání {p \v Osoba : /\ PersonState[p].umístění = F /\ PersonState[p].čekání /\ GetDirection[PersonState[p].umístění, PersonState[p].destinace] = d}TypInvariant == \* Prohlášení o the proměnné který my očekávat na držet v každý Systém Stát /\ PersonState \v [Osoba -> [umístění : Podlaha \pohár Výtah, destinace : Podlaha, čekání : BOOLEAN]] /\ ActiveElevatorCalls \subseteq VýtahVolání /\ Stav výtahu \v [Výtah -> [podlaha : Podlaha, směr : ElevatorDirectionState, dveře otevřené : BOOLEAN, tlačítka stisknuta : PODMNOŽINA Podlaha]]Bezpečnostní Varianta == \* Nějaký více obsáhlý kontroly mimo the typ neměnný /\ \A E \v Výtah : \* An výtah má A podlaha knoflík stisknuto pouze -li A osoba v že výtah je jít na že podlaha /\ \A F \v Stav výtahu[E].tlačítka stisknuta : /\ \E p \v Osoba : /\ PersonState[p].umístění = E /\ PersonState[p].destinace = F /\ \A p \v Osoba : \* A osoba je v an výtah pouze -li the výtah je stěhování směrem k jejich destinace podlaha /\ \A E \v Výtah : /\ (PersonState[p].umístění = E /\ Stav výtahu[E].podlaha /= PersonState[p].destinace) => /\ Stav výtahu[E].směr = GetDirection[Stav výtahu[E].podlaha, PersonState[p].destinace] /\ \A C \v ActiveElevatorCalls : Lidé čekají[C.podlaha, C.směr] /= {} \* Ne duch hovoryČasová neměnná == \* Očekávání o výtah Systém schopnosti /\ \A C \v VýtahVolání : \* Každý volání je nakonec servisováno podle an výtah /\ C \v ActiveElevatorCalls ~> \E E \v Výtah : CanServiceCall[E, C] /\ \A p \v Osoba : \* Li A osoba čeká pro jejich výtah, oni budou nakonec přijet na jejich podlaha /\ PersonState[p].čekání ~> PersonState[p].umístění = PersonState[p].destinaceVyberte nový cíl(p) == \* Osoba rozhodne ony potřeba na jít na A odlišný podlaha NECHAT pState == PersonState[p] V /\ ~pState.čekání /\ pState.umístění \v Podlaha /\ \E F \v Podlaha : /\ F /= pState.umístění /\ PersonState ' = [PersonState AŽ NA ![p] = [@ AŽ NA !.destinace = F]] /\ BEZE ZMĚNY <<ActiveElevatorCalls, Stav výtahu>>CallElevator(p) == \* Osoba hovory the výtah na jít v A určitý směr z jejich podlaha NECHAT pState == PersonState[p] V NECHAT volání == [podlaha |-> pState.umístění, směr |-> GetDirection[pState.umístění, pState.destinace]] V /\ ~pState.čekání /\ pState.umístění /= pState.destinace /\ ActiveElevatorCalls ' = LI \E E \v Výtah : /\ CanServiceCall[E, volání] /\ Stav výtahu[E].dveře otevřené PAK ActiveElevatorCalls JINÝ ActiveElevatorCalls \pohár {volání} /\ PersonState ' = [PersonState AŽ NA ![p] = [@ AŽ NA !.čekání = SKUTEČNÝ]] /\ BEZE ZMĚNY <<Stav výtahu>>OpenElevatorDoors(E) == \* Otevřeno the výtah dveře -li tam je A volání na tento podlaha nebo the knoflík pro tento podlaha byl stisknuto. NECHAT majetek == Stav výtahu[E] V /\ ~majetek.dveře otevřené /\ \/ \E volání \v ActiveElevatorCalls : CanServiceCall[E, volání] \/ majetek.podlaha \v majetek.tlačítka stisknuta /\ Stav výtahu = [Stav výtahu AŽ NA ![E] = [@ AŽ NA !.dveře otevřené = SKUTEČNÝ, !.tlačítka stisknuta = @ \ {majetek.podlaha}]] /\ ActiveElevatorCalls ' = ActiveElevatorCalls \ {[podlaha |-> majetek.podlaha, směr |-> majetek.směr]} /\ BEZE ZMĚNY <<PersonState>> EnterElevator(E) == \* Všechno lidé na tento podlaha SZO jsou čekání pro the výtah a cestování the stejný směr vstoupit the výtah. NECHAT majetek == Stav výtahu[E] V NECHAT daří == Lidé čekají[majetek.podlaha, majetek.směr] V NECHAT cíle == {PersonState[p].destinace : p \v daří} V /\ majetek.dveře otevřené /\ majetek.směr /= "Stacionární" /\ daří /= {} /\ PersonState ' = [p \v Osoba |-> LI p \v daří PAK [PersonState[p] AŽ NA !.umístění = E] JINÝ PersonState[p]] /\ Stav výtahu = [Stav výtahu AŽ NA ![E] = [@ AŽ NA !.tlačítka stisknuta = @ \pohár cíle]] /\ BEZE ZMĚNY <<ActiveElevatorCalls>>ExitElevator(E) == \* Všechno lidé jehož destinace je tento podlaha výstup the výtah. NECHAT majetek == Stav výtahu[E] V NECHAT dostatVypnuto == {p \v Osoba : PersonState[p].umístění = E /\ PersonState[p].destinace = majetek.podlaha} V /\ majetek.dveře otevřené /\ dostatVypnuto /= {} /\ PersonState ' = [p \v Osoba |-> LI p \v dostatVypnuto PAK [PersonState[p] AŽ NA !.umístění = majetek.podlaha, !.čekání = NEPRAVDIVÉ] JINÝ PersonState[p]] /\ BEZE ZMĚNY <<ActiveElevatorCalls, Stav výtahu>>CloseElevatorDoors(E) == \* Zavřít the výtah dveře jednou Všechno lidé mít vstoupil a natěšený the výtah na tento podlaha. NECHAT majetek == Stav výtahu[E] V /\ ~ZAPNUTO EnterElevator(E) /\ ~ZAPNUTO ExitElevator(E) /\ majetek.dveře otevřené /\ Stav výtahu = [Stav výtahu AŽ NA ![E] = [@ AŽ NA !.dveře otevřené = NEPRAVDIVÉ]] /\ BEZE ZMĚNY <<PersonState, ActiveElevatorCalls>>MoveElevator(E) == \* Hýbat se the výtah na the další podlaha ledaže my mít na otevřeno the dveře tady. NECHAT majetek == Stav výtahu[E] V NECHAT nextFloor == LI majetek.směr = "Nahoru" PAK majetek.podlaha + 1 JINÝ majetek.podlaha - 1 V /\ majetek.směr /= "Stacionární" /\ ~majetek.dveře otevřené /\ majetek.podlaha \ne v majetek.tlačítka stisknuta /\ \A volání \v ActiveElevatorCalls : \* Umět hýbat se pouze -li jiný výtah servis volání /\ CanServiceCall[E, volání] => /\ \E e2 \v Výtah : /\ E /= e2 /\ CanServiceCall[e2, volání] /\ nextFloor \v Podlaha /\ Stav výtahu = [Stav výtahu AŽ NA ![E] = [@ AŽ NA !.podlaha = nextFloor]] /\ BEZE ZMĚNY <<PersonState, ActiveElevatorCalls>>StopElevator(E) == \* Zastaví the výtah -li své přestěhoval tak jako daleko tak jako to umět v jeden směr NECHAT majetek == Stav výtahu[E] V NECHAT nextFloor == LI majetek.směr = "Nahoru" PAK majetek.podlaha + 1 JINÝ majetek.podlaha - 1 V /\ ~ZAPNUTO OpenElevatorDoors(E) /\ ~majetek.dveře otevřené /\ nextFloor \ne v Podlaha /\ Stav výtahu = [Stav výtahu AŽ NA ![E] = [@ AŽ NA !.směr = "Stacionární"]] /\ BEZE ZMĚNY <<PersonState, ActiveElevatorCalls>>(***************************************************************************)(* Tento akce vybere an výtah na servis the volání. The jednoduchý *)(* algoritmus výběry the nejbližší výtah který je buď stacionární nebo *)(* již stěhování směrem k the volání podlaha v the stejný směr tak jako the volání. *)(* The Systém udržuje Ne záznam z přiřazování an výtah na servis A volání. *)(* To je možný Ne výtah je schopný na servis A volání, ale my jsou *)(* zaručeno an výtah vůle nakonec stát se dostupný. *)(***************************************************************************)DispatchElevator(C) == NECHAT stacionární == {E \v Výtah : Stav výtahu[E].směr = "Stacionární"} V NECHAT blížící se == {E \v Výtah : /\ Stav výtahu[E].směr = C.směr /\ \/ Stav výtahu[E].podlaha = C.podlaha \/ GetDirection[Stav výtahu[E].podlaha, C.podlaha] = C.směr } V /\ C \v ActiveElevatorCalls /\ stacionární \pohár blížící se /= {} /\ Stav výtahu = NECHAT nejbližší == VYBRAT E \v stacionární \pohár blížící se : /\ \A e2 \v stacionární \pohár blížící se : /\ GetDistance[Stav výtahu[E].podlaha, C.podlaha] <= GetDistance[Stav výtahu[e2].podlaha, C.podlaha] V LI nejbližší \v stacionární PAK [Stav výtahu AŽ NA ![nejbližší] = [@ AŽ NA !.podlaha = C.podlaha, !.směr = C.směr]] JINÝ Stav výtahu /\ BEZE ZMĚNY <<PersonState, ActiveElevatorCalls>>Init == \* Inicializuje se lidé a výtahy na libovolný podlahy /\ PersonState \v [Osoba -> [umístění : Podlaha, destinace : Podlaha, čekání : {NEPRAVDIVÉ}]] /\ ActiveElevatorCalls = {} /\ Stav výtahu \v [Výtah -> [podlaha : Podlaha, směr : {"Stacionární"}, dveře otevřené : {NEPRAVDIVÉ}, tlačítka stisknuta : {{}}]]další == \* The další-Stát vztah \/ \E p \v Osoba : Vyberte nový cíl(p) \/ \E p \v Osoba : CallElevator(p) \/ \E E \v Výtah : OpenElevatorDoors(E) \/ \E E \v Výtah : EnterElevator(E) \/ \E E \v Výtah : ExitElevator(E) \/ \E E \v Výtah : CloseElevatorDoors(E) \/ \E E \v Výtah : MoveElevator(E) \/ \E E \v Výtah : StopElevator(E) \/ \E C \v VýtahVolání : DispatchElevator(C)Časové předpoklady == \* Předpoklady o jak výtahy a lidé vůle chovat se /\ \A p \v Osoba : WF_Vars(CallElevator(p)) /\ \A E \v Výtah : WF_Vars(OpenElevatorDoors(E)) /\ \A E \v Výtah : WF_Vars(EnterElevator(E)) /\ \A E \v Výtah : WF_Vars(ExitElevator(E)) /\ \A E \v Výtah : SF_Vars(CloseElevatorDoors(E)) /\ \A E \v Výtah : SF_Vars(MoveElevator(E)) /\ \A E \v Výtah : WF_Vars(StopElevator(E)) /\ \A C \v VýtahVolání : SF_Vars(DispatchElevator(C))Spec == \* Inicializovat Stát s Init a přechod s další, předmět na Časové předpoklady /\ Init /\ [][další]_Vary /\ Časové předpokladyTEORÉM Spec => [](TypInvariant /\ Bezpečnostní Varianta /\ Časová neměnná)=============================================================================
Viz také
- Slitina (specifikační jazyk)
- B-metoda
- Logika výpočetního stromu
- PlusCal
- Časová logika
- Časová logika akcí
- Z notace
Reference
- ^ A b Lamport, Leslie (Leden 2000). Specifikace souběžných systémů s TLA+ (PDF). NATO Science Series, III: Computer and Systems Sciences. 173. IOS Press, Amsterdam. 183–247. ISBN 978-90-5199-459-9. Citováno 22. května 2015.
- ^ A b Lamport, Leslie (15. ledna 2014). „TLA+2: Předběžný průvodce " (PDF). Citováno 2. května 2015.
- ^ "Tlaplus Tools - Licence". CodePlex. Microsoft, Compaq. 8. dubna 2013. Citováno 10. května 2015.https://tlaplus.codeplex.com/license
- ^ A b Newcombe, Chris; Rath, Tim; Zhang, Fan; Munteanu, Bogdan; Brooker, Marc; Deardeuff, Michael (29. září 2014). „Použití formálních metod u webových služeb Amazon“ (PDF). Amazonka. Citováno 8. května 2015.
- ^ Lamport, Leslie (25. ledna 2013). „Proč bychom měli stavět software tak, jako stavíme domy“. Kabelové. Kabelové. Citováno 7. května 2015.
- ^ Lamport, Leslie (18. června 2002). „7.1 Proč specifikovat“. Specifikace systémů: TLA+ Jazyk a nástroje pro hardwarové a softwarové inženýry. Addison-Wesley. str. 75. ISBN 978-0-321-14306-8.
Přesný popis návrhu často odhalí problémy - jemné interakce a „rohové případy“, které lze snadno přehlédnout.
- ^ Lamport, Leslie (2012). „Jak napsat důkaz 21. století“ (PDF). Deník teorie pevných bodů a aplikací. 11: 43–63. doi:10.1007 / s11784-012-0071-6. ISSN 1661-7738. Citováno 23. května 2015.
- ^ Øhrstrøm, Peter; Hasle, Per (1995). „3.7 Časová logika a informatika“. Temporal Logic: From Ancient Ideas to Artificial Intelligence. Studium lingvistiky a filozofie. 57. Springer Nizozemsko. str. 344–365. doi:10.1007/978-0-585-37463-5. ISBN 978-0-7923-3586-3.
- ^ Lamport, Leslie. „Spisy Leslie Lamportové: Prokazování správnosti víceprocesových programů“. Citováno 22. května 2015.
- ^ Lamport, Leslie. „Spisy Leslie Lamportové: Sbírka odpadků za běhu: cvičení ve spolupráci“. Citováno 22. května 2015.
- ^ Lamport, Leslie. „Spisy Leslie Lamportové:„ Někdy “je někdy„ Ne nikdy'". Citováno 22. května 2015.
- ^ Lamport, Leslie. „Spisy Leslie Lamportové: Specifikace souběžných programovacích modulů“. Citováno 22. května 2015.
- ^ Lamport, Leslie. „Spisy Leslie Lamportové: Časová logika jednání“. Citováno 22. května 2015.
- ^ A b Yu, Yuan; Manolios, Panagiotis; Lamport, Leslie (1999). Kontrola modelu TLA+ Specifikace (PDF). Správný návrh hardwaru a metody ověření. Přednášky z informatiky. 1703. Springer-Verlag. str. 54–66. doi:10.1007/3-540-48153-2_6. ISBN 978-3-540-66559-5. Citováno 14. května 2015.
- ^ Lamport, Leslie (18. června 2002). Specifikace systémů: TLA+ Jazyk a nástroje pro hardwarové a softwarové inženýry. Addison-Wesley. ISBN 978-0-321-14306-8.
- ^ Lamport, Leslie (2. ledna 2009). Jazyk algoritmu PlusCal (PDF). Přednášky z informatiky. 5684. Springer Berlin Heidelberg. str. 36–60. doi:10.1007/978-3-642-03466-4_2. ISBN 978-3-642-03465-7. Citováno 10. května 2015.
- ^ A b C d Cousineau, Denis; Doligez, Damien; Lamport, Leslie; Merz, Stephan; Ricketts, Daniel; Vanzetto, Hernán (1. ledna 2012). TLA+ Důkazy (PDF). FM 2012: Formální metody. Přednášky z informatiky. 7436. Springer Berlin Heidelberg. 147–154. doi:10.1007/978-3-642-32759-9_14. ISBN 978-3-642-32758-2. Citováno 14. května 2015.
- ^ Lamport, Leslie (18. června 2002). „8.9.2 Uzavření stroje“. Specifikace systémů: TLA+ Jazyk a nástroje pro hardwarové a softwarové inženýry. Addison-Wesley. str. 112. ISBN 978-0-321-14306-8.
Málokdy chceme napsat specifikaci, která není zavřená. Pokud jeden napíšeme, je to obvykle omylem.
- ^ Lamport, Leslie (18. června 2002). „8.9.6 Dočasná logika považována za matoucí“. Specifikace systémů: TLA+ Jazyk a nástroje pro hardwarové a softwarové inženýry. Addison-Wesley. str. 116. ISBN 978-0-321-14306-8.
Opravdu [většina inženýrů] může docela dobře vycházet se specifikacemi formuláře (8.38), které vyjadřují pouze bezpečnostní vlastnosti a neskrývají žádné proměnné.
- ^ Markus A. Kuppe (3. června 2014). Distribuovaná TLC (Záznam technické přednášky). TLA+ Komunitní akce 2014, Toulouse, Francie.CS1 maint: umístění (odkaz)
- ^ „Nepodporované funkce TLAPS“. TLA+ Důkazní systém. Microsoft Research - INRIA Společné centrum. Citováno 14. května 2015.
- ^ Důkazní systém TLA +
- ^ Leslie Lamport (3. dubna 2014). Thinking for Programmers (ve 21m46s) (Záznam technické přednášky). San Francisco: Microsoft. Citováno 14. května 2015.
- ^ Chris, Newcombe (2014). Proč si Amazon vybral TLA+. Přednášky z informatiky. 8477. Springer Berlin Heidelberg. s. 25–39. doi:10.1007/978-3-662-43652-3_3. ISBN 978-3-662-43651-6.
- ^ Lardinois, Frederic (10. května 2017). „S Cosmos DB chce Microsoft vybudovat jednu databázi, která by jim vládla všem“. TechCrunch. Citováno 10. května 2017.
- ^ Leslie Lamport (10. května 2017). Základy Azure Cosmos DB s Dr. Leslie Lamport (Záznam rozhovoru). Microsoft Azure. Citováno 10. května 2017.
externí odkazy
- Domovská stránka TLA, Webová stránka Leslie Lamportové odkazující na TLA+ nástroje a zdroje
- TLA+ Hyperbook, TLA+ učebnice Leslie Lamport
- Jak webové služby Amazon používají formální metody, článek z dubna 2015 Komunikace ACM
- Myšlení pro programátory, přednáška Leslie Lamportové na Stavět 2014
- Myšlení nad kodexem, přednáška Leslie Lamportové v roce 2014 Microsoft Research summit fakulty
- Kdo staví mrakodrap bez kreslení plánů?, přednáška Leslie Lamportové na Reagovat San Francisco 2014
- Programování by mělo být více než kódování, 2015 přednáška na Stanford Leslie Lamport
- Euclid píše algoritmus: pohádka, TLA+ úvod Leslie Lamport zahrnutý v a slavnostní svátek pro Manfred Broy
- TLA+ Google Group