En batteridrevet automat er en abstrakt maskin som brukes i teoretisk informatikk og, mer presist, i automatteori .
En stablet automat er en generalisering av endelig automat : den har også et uendelig minne organisert i en stack ( last-in / first-out eller LIFO ). En batteridrevet automat tar et ord som inngang og utfører en serie overganger. Det gjør en overgang for hver bokstav i ordet, avhengig av bokstaven, tilstanden til automaten og toppen av stabelen, og kan også endre innholdet i stabelen. Avhengig av tilstanden til PLC og batteriet på slutten av beregningen, godtas eller avvises ordet.
Språkene som aksepteres av batteridrevne automater er nøyaktig algebraiske språk , det vil si de som genereres av en algebraisk grammatikk .
Betydningen av pushdown automata kommer fra deres bruk i den syntaktiske analysen av programmeringsspråk , og mer generelt i transformasjonen av definisjoner eller rekursive algoritmer til deres iterative analoger.
En pushdown-automat (ikke-deterministisk) er en 7-tupel , der:
I stedet for funksjonen møter vi ofte settet definert av
Elementene i er reglene for overganger . Når vi snakker om en - regelen . Alle settene i definisjonen er endelige .
En intern konfigurasjon av PLC er et par . En PLC- konfigurasjon er en triplett . En beregning av automaten på et ord er en serie overganger som starter fra den opprinnelige konfigurasjonen . Det er en overgang fra konfigurasjonen , hvor og til konfigurasjonen, og vi skriver:
når . Når endres ikke inntastingsordet. Vi snakker da om en - overgang eller en spontan overgang . I alle fall, for at en overgang skal være mulig, må ikke bunken være tom.
Vi sier at et ord aksepteres av automaten hvis det er en serie overganger som fører til en akseptabel konfigurasjon . Det finnes flere gjenkjennelsesmåter:
Den språket anerkjent av automaton er sett av ord som er akseptert.
De tre aksepteringsmåtene er likeverdige, i den forstand at hvis et språk blir gjenkjent av en nedtrekksautomat av en art, kan vi bygge en automat som gjenkjenner dette språket, av andre arter.
En batteridrevet automat består av to interagerende deler: automatdelen , med et endelig antall tilstander, og et uendelig hjelpeminne, organisert i en bunke. Vi forventer derfor å ha to operasjoner på bunken, en for å stable et symbol, en for å stakke en. Den matematiske definisjonen som er vedtatt, består i å erstatte disse to operasjonene med en enkelt som kombinerer dem, og som, i spesielle tilfeller, gir stabling og unstacking. Faktisk, hvis vi bruker en overgangsregel
,først stabler vi symbolet , så stabler vi ordet , så blir erstattet av . Hvis ordet er tomt, består operasjonen ganske enkelt av å stakke; hvis ordet begynner med , derfor hvis operasjonen tilsvarer å stable et annet ord oppå det . En tredje fordel med denne komprimerte notasjonen er at du kan teste karakteren til symbolet øverst i bunken, ganske enkelt ved å lese den og sette den tilbake.
I formalismen som presenteres, kan man ikke teste om bunken er tom, for hvis bunken er tom, er enhver beregning (som må starte med en unstacking) umulig. En måte å omgå denne vanskeligheten er å bruke et spesielt symbol nederst i bunken som du ikke fjerner.
En push-down automat er deterministisk når overgangsfunksjonen er en delvis funksjon som tilfredsstiller en tilleggsbetingelse.
Mer presist, er en delvis funksjon . Videre, når er definert, er da ikke definert for noen bokstav . Dermed, hvis en spontan overgang er mulig, er ingen annen overgang mulig fra denne konfigurasjonen.
Gjenkjenningsmodusene, etter endelig tilstand eller med tomt batteri, er ikke lenger likeverdige. Et deterministisk algebraisk språk er et algebraisk språk som det er en endelig tilstands deterministisk push-down automat som gjenkjenner det. Deterministiske automater med tom stabelgjenkjenning gjenkjenner nøyaktig deterministiske algebraiske språk som er prefikser (intet ord i språket er et prefiks i et annet ord i språket).
For eksempel er språket prefiks, og gjenkjennes av de to typene deterministisk automat, men språket gjenkjennes bare av deterministisk automat av endelig tilstand.
Automaten har to tilstander ; staten er innledende, det er ingen terminal tilstand. Anerkjennelse skjer ved tomt batteri . Bunnsymbolet er . Det er bare ett ekstra stack symbol, bemerket . Overgangene er:
(1) (2) (3) (4)Den tredje regelen er en -regel. Hun sier at fra staten kan du gå til staten uten å lese noe, og uten å bytte batteri.
Vi starter med å lese det første tegnet:
Så, ved hver lesing, stabler vi en ekstra etter regel (2). Etter å ha lest bokstaver etter hverandre, inneholder bunken . Hvis vi ser en mens den er i staten , henger maskinen fordi ingen regler gjelder.
I tilstanden endres regel (3) til tilstand uten å lese et brev eller endre bunken. Da gjelder bare regel (4), og vi kan bruke den så lenge bunken ikke er tom, det vil si så mange ganger som vi har lest bokstaver . Aksept med tom stabel betyr at det innleste ordet aksepteres når bunken er tom, så når ordet har form .
Eksemplet ville være mer komplisert hvis vi ønsket å unngå -regelen.
Hvert språk definert av en algebraisk grammatikk gjenkjennes av en pushdown-automat og omvendt.
Derfor er problemet med tilhørigheten av et ord til et algebraisk språk avgjørende : det eksisterer en algoritme som, gitt beskrivelsen av en ikke-kontekstuell grammatikk og et ord, svarer på endelig tid på spørsmålet om medlemskapet av dette ordet i språk definert av denne grammatikken (mer presist, den kan testes på en gang for et ord med lengde n , takket være CYK-algoritmen ).
Klassen av rasjonelle språk (anerkjent av en endelig automat) er strengt tatt med i klassen av deterministiske algebraiske språk (anerkjent av en push-down automaton deterministisk av endelig tilstand), selv strengt tatt med i klassen av algebraiske språk (anerkjent av en push ned-automat). ikke deterministisk). For eksempel er språket deterministisk algebraisk, men ikke rasjonelt, og språket til palindromiske ord er algebraisk, men ikke deterministisk algebraisk.
Andre variasjoner av aksept eksisterer. Dette er grunnen til at vi noen ganger møter en formulering som skiller definisjonen i to: på den ene siden defineres en stabelmaskin uten å spesifisere akseptmodusen. På den annen side er en automat spesifisert av dataene til de interne akseptkonfigurasjonene . For eksempel :
En pushdown-automat er i sanntid ( engelsk i sanntid ) hvis han ikke har -Rules. En batteridrevet automat er enkel hvis den bare har en tilstand. Vi kan vise at ethvert riktig algebraisk språk (dvs. ikke inneholder det tomme ordet) kan gjenkjennes av en enkel sanntids push-up-automat.
På den annen side kan ikke noe deterministisk språk gjenkjennes av en deterministisk push-down automat i sanntid. For eksempel språket
er deterministisk algebraisk, men kan ikke gjenkjennes av en deterministisk pushdown-automat i sanntid.
Den stabel språket i en stablet automat er det sett av ord som vises på stabelen under en vellykket beregning, det vil si i en konfigurasjon av en rekke overganger fra den første konfigurasjon til en akseptere konfigurasjon. For en hvilken som helst push-down automat, og uansett hvilken akseptmodus, er stack- språket et rasjonelt språk . Karakteren til stablespråk - og mer generelt språket for mellomliggende memoriseringer - har blitt systematisk studert av Oscar H. Ibarra og IanMcQuillan.
En automat med to eller flere stabler har samme datakraft som en Turing-maskin . Faktisk er to-stakk-automata en generalisering av to-meters maskiner , som i seg selv tilsvarer Turing-maskiner. Det kan også demonstreres mer direkte: en automat med to stabler kan simulere en Turing-maskin ved å sørge for at delen av båndet til venstre for lesehodet blir registrert i den første stakken, og delen av båndet til høyre av spillhodet blir spilt inn på den andre.
Géraud Sénizergues beviste i 2001 at ekvivalensen til to deterministiske stakeautomater kan avgjøres. Dette problemet hadde vært åpent siden definisjonen av deterministisk automat på 1970-tallet. Géraud Sénizergues fikk Gödel-prisen for dette beviset.
De fleste programmeringsspråk er beskrevet av en algebraisk grammatikk. Den syntaktiske analysen av et program, som er en av de første operasjonene som utføres av en kompilator , kan derfor utføres av en trykknappautomat. Hvis språkets grammatikk er en deterministisk algebraisk grammatikk, er det tilstrekkelig å konstruere en deterministisk push-down automat; Ellers må vi bygge en ikke-deterministisk push-down automat.
Det finnes automatiske verktøy for å bygge nedtrekksautomaten fra en beskrivelse av språkets grammatikk (for eksempel ANTLR ).
Følgende kildeprogram i C-språk verifiserer at det angitte uttrykket respekterer språket i parentes der eventuell åpningsparentes må svare til en sluttparentes:
#include <stdlib.h> #include <stdio.h> #define POP -1 /* Dépiler l'état */ #define ACCEPT -2 /* Accepter l'expression entrée */ #define ERROR -3 /* Refuser l'expression entrée */ #define ALPHABET 3 /* Grandeur*/ /* Push-down automation Symbol | ( | ) | \0 ---------+---------+--------+----------- State 0 | PUSH 1 | ERROR | ACCEPT State 1 | PUSH 1 | POP | ERROR */ int states[2][ALPHABET*2] = { /* Valeur d'entrée Action */ { '(', 1 /* PUSH 1 */, ')', ERROR, '\0', ACCEPT }, { '(', 1 /* PUSH 1 */, ')', POP, '\0', ERROR } }; int main( int argc, char** argv ) { int stack[100] = { 0 }; int i = 0; int action = 0; int* tos = stack; char s[80+1]; char* p = s; /* Chaine de donnée */ printf("Entrez l'expression : "); fgets( &s , 80 , stdin); // modification pour éviter les débordements de mémoire /* État initial 0 mis dans la pile : */ *(tos++) = 0; /* Sortie */ do { /* Recherche de l'action correspondant au symbole d'entrée courant... */ action = ERROR; /* Action par défaut si le symbole n'est pas trouvé. */ for( i = 0; i < ALPHABET; i++ ) { if( states[*(tos-1)][i*2] == *p ) { /* Caractère entré trouvé */ action = states[*(tos-1)][i*2+1]; break; } } /* Effectuer l'action associée au symbole d'entrée courant... */ if( action == ERROR ) { printf("Erreur inattendue à la position %d", p-s); break; } else if( action == ACCEPT ) printf("Sortie acceptée !"); else if( action == POP ) tos--; /* Dépiler l'état */ else *(tos++) = action; /* Empiler l'état spécifié */ /* Données supplémentaires... */ p++; } while( action != ACCEPT ); getchar(); return 0; }