Reverse Polish notation (RPN ) on tapa kirjoittaa matemaattisia ja loogisia lausekkeita , joissa operandit sijaitsevat ennen operaatiomerkkejä . Kutsutaan myös nimellä käänteinen hakasuljeton merkintä , postfix-merkintä , Lukasiewiczin hakasuljeton symboliikka , puolalainen käänteismerkintä , POLIZ .
Pinokone on algoritmi, joka suorittaa laskutoimituksia käyttämällä käänteistä puolalaista merkintää (katso alla esimerkki lausekkeiden arvioinnista ).
Käänteinen puolalainen notaatio (RPN) kehitti australialainen filosofi ja tietokoneteoreetikko Charles Hamblin 1950-luvun puolivälissä perustuen puolalaiseen notaatioon , jota puolalainen matemaatikko Jan Lukasiewicz ehdotti vuonna 1920 . Hamblinin työ esiteltiin konferenssissa kesäkuussa 1957 ja julkaistiin vuosina 1957 ja 1962 .
Ensimmäiset tietokoneet, jotka tukivat käänteistä puolalaista merkintää, olivat englantilaisen Electric Companyn KDF9 , joka julkistettiin vuonna 1960 ja julkaistiin (näytettiin myyntiin) vuonna 1963 , ja vuonna 1961 julkistettu amerikkalainen Burroughs B5000 , joka julkaistiin samana vuonna 1963. Yksi B5000:n suunnittelijat R. S. Barton kirjoittivat myöhemmin, että hän kehitti käänteisen puolalaisen merkinnän Hamblinista riippumatta noin 1958 lukiessaan kirjaa symbolisesta logiikasta ja ennen kuin hän tutustui Hamblinin työhön.
Friden toi ylijännitesuojan pöytälaskimiin kesäkuun 1964 EC-130:lla. Ja vuonna 1968 Hewlett-Packardin insinöörit kehittivät 9100A - pöytälaskimen , jossa on ylijännitesuojan tuki. Tämä laskin teki käänteisestä puolalaisesta merkinnästä suositun tutkijoiden ja insinöörien keskuudessa, vaikka varhaisessa 9100A-mainoksessa ei mainittu ylijännitesuojaa. Vuonna 1972 HP-35 SPD - yhteensopivasta laskimesta tuli ensimmäinen tieteellinen taskulaskin .
Vuonna 1971 ilmestyi alkuperäinen ohjelmointikieli Forth , jonka kielikoneessa on kaksipinorakenne ja jossa kaikki laskelmat suoritetaan pinolle . Tällä kielellä OPN on luonnollinen tapa kirjoittaa mitä tahansa dataoperaatiota, vaikka haluttaessa on mahdollista toteuttaa aritmeettisten operaatioiden tavallinen ( infix ) merkintätapa.
Pysäytyslaitetta käytettiin vuonna 1976 julkaistussa Neuvostoliiton suunnittelulaskimessa B3-19M (yhteisesti kehitetty DDR:n kanssa). Kaikki Neuvostoliitossa 1980-luvun loppuun asti valmistetut ohjelmoitavat mikrolaskimet , paitsi Elektronika MK-85 ja Elektronika MK-90 , käyttivät pysäytintä - se oli helpompi toteuttaa ja mahdollisti ohjelmointilaskelmien suorittamisen pienemmällä laskurilla. komentojen määrä verrattuna tavanomaiseen algebralliseen merkintään, ja ohjelmamuistin määrä näissä malleissa on aina ollut kriittinen resurssi. Pidätintä käytetään nykyaikaisissa venäläisissä ohjelmoitavissa laskimissa " Elektronika MK-152 " ja " Elektronika MK-161 ", mikä varmistaa niiden yhteensopivuuden Neuvostoliiton laskimille kirjoitettujen ohjelmien kanssa.
Induktiivisen määritelmän antamiseksi jälkiliitteen merkinnällä [1] merkitään lausekkeet infix-merkinnöissä , , , niiden vastaavat lausekkeet postfix-merkinnöissä , vastaavasti ; on mielivaltainen binäärioperaattori, niin:
1. Jos - muuttuja tai vakio, eli .
2. Jos on muodon ilmaus , se on .
3. Jos on muodon ilmaus , se on .
Käänteisen puolan merkinnän erottuva piirre on, että kaikki argumentit (tai operandit ) sijoitetaan ennen operaatiomerkkiä. Yleisesti ottaen levy näyttää tältä:
Harkitse esimerkiksi lausekkeen arviointia 7 2 3 * −(vastaava lauseke infix-merkinnässä: 7 − 2 * 3).
Käänteisen puolalaisen merkinnän ilmeinen laajennus koskemaan unaarista, kolmiosaista ja operaatioita millä tahansa muulla operandimäärällä: käytettäessä tällaisten operaatioiden merkkejä lausekkeen arvioinnissa, operaatiota sovelletaan vastaavaan määrään viimeksi havaittuja operandeja.
Käänteisen puolan merkinnän ominaisuudet ovat seuraavat:
Lausekkeiden arvioinnin automatisointi käänteisessä puolan merkinnässä perustuu pinon käyttöön . Pinokoneen laskenta-algoritmi on alkeellinen:
Pinokoneen toteuttaminen sekä ohjelmistossa että laitteistossa on erittäin yksinkertaista ja voi olla erittäin tehokasta. Käänteinen puolalainen merkintätapa on täysin yhtenäinen - se kirjoittaa periaatteessa unaari-, binääri-, kolmi- ja kaikki muut toiminnot sekä funktiokutsut samalla tavalla, mikä mahdollistaa tietokonelaitteiden suunnittelun monimutkaisuuden samalla kun laajennat tuettujen toimintojen joukkoa. Tästä syystä joissakin tieteellisissä ja ohjelmoitavissa olevissa laskimissa käytettiin käänteistä puolalaista merkintää.
Infix-lauseke GRE:ssä voidaan kirjoittaa näin: 1 2 + 4 × 3 +
Laskenta suoritetaan vasemmalta oikealle, syöte tulkitaan alla olevan taulukon mukaisesti (pinon tila toimenpiteen jälkeen, pinon yläosa on korostettu punaisella ):
Syöte | Operaatio | Pino |
---|---|---|
yksi | laittaa pinoon | yksi |
2 | laittaa pinoon | 1, 2 |
+ | lisäys | 3 |
neljä | laittaa pinoon | 3, 4 |
* | kertolasku | 12 |
3 | laittaa pinoon | 12, 3 |
+ | lisäys | viisitoista |
Tulos, 15, on pinon yläosassa laskennan lopussa.
"Enter"-näppäin (merkitty laskimissa "Enter" tai symboli "↑") toimii operandin erottimena, kun kaksi operandia on välittömästi vierekkäin. Jos operandia seuraa operaatiomerkki , sen painamista ei tarvita, tämä vähentää toimintojen määrää, jotka on suoritettava tuloksen saamiseksi.
Edsger Dijkstra keksi algoritmin lausekkeiden muuntamiseksi infix-merkinnästä IPV:hen. Algoritmia kutsuttiin "järjestelypihaksi" sen toimintojen samankaltaisuuden vuoksi rautateiden järjestelypihoilla tapahtuvan kanssa. Infix-merkintä on useimpien ihmisten käyttämä matemaattisen merkintätavan muoto (esimerkiksi 3 + 4tai 3 + 4 * (2 − 1)). Kuten SPV-laskentaalgoritmi , myös järjestelypiha-algoritmi perustuu pinoon. Konversiossa on mukana kaksi tekstimuuttujaa: syöttö- ja lähtömerkkijonot. Muunnosprosessi käyttää pinoa, joka tallentaa toiminnot, joita ei ole vielä lisätty tulostemerkkijonoon. Muunnosohjelma lukee syötetyn merkkijonon merkki kerrallaan peräkkäin (merkki ei välttämättä ole kirjain), suorittaa jokaisessa vaiheessa joitain toimintoja sen mukaan, mikä merkki luettiin.
Sisäänkäynti:3 + 4
Lisää 3tulosriville (jos luku luetaan, se lisätään välittömästi tulosriville).
Työnnä +(tai sen tunniste) käyttöpinoon.
Lisää 4lähtöriville.
Olemme lukeneet koko lausekkeen, nyt työnnämme kaikki pinossa jäljellä olevat toiminnot tulosriville. Esimerkissämme pino sisältää vain +.
Lähtölinja:3 4 +
Tässä esimerkissä näkyy joitain sääntöjä: kaikki numerot siirretään lähtöriville heti lukemisen jälkeen; Kun lauseke luetaan kokonaan, kaikki pinon jäljellä olevat toiminnot työnnetään tulosriville.
Algoritmi olettaa, että lähdemerkkijono on oikea (kaikkia virheitä ei tarkisteta) ja kaikki etuliite/postfix-funktiot ovat unaarisia.
Katso pääartikkelista muokkaus monipaikkafunktioille, joissa on kiinteä määrä argumentteja .
Operaatioille, kuten -x , jotka ovat sekä binaarisia että unaarisia, tarvitaan muutos: kun tällainen operaatio löytyy, järjestelmä tarkastelee edellistä merkkiä ja määrittää, onko miinus binääritoiminto vai unaarifunktio. Vastaavasti pino ja NPV tarvitsevat eri symboleja binääri- ja unaarimiinuksille.
Jos kirjoitat tulkkia, alkuperäisen lausekkeen muuntamisen jälkeen käänteiseksi puolalaiseksi merkintämuodoksi saatu tulostemerkkijono voidaan tallentaa alkuperäisen lausekkeen tilalle myöhempää tulkintaa varten. Käänteinen puolalainen notaatio antaa myös tietokoneen yksinkertaistaa lausekkeita.
Harkitse algoritmia, joka suorittaa vakioiden esilaskennan lausekkeessa. OPN:ssä annetaan lauseke. Tarvitsemme pinon sekatietojen (numerot ja operaattorit) tallentamiseen.
Algoritmi on samanlainen kuin lausekkeiden arvioinnissa käytetty. Skannaamme lausekkeen vasemmalta oikealle.
Niin kauan kuin luettavia merkkejä on:
Kun koko lauseke on tutkittu, pinoon jää optimoitu lauseke (lausekkeen lauseet ovat pinossa käänteisessä järjestyksessä).
Tämä menetelmä ei tietenkään sisällä kaikkia mahdollisia optimointimenetelmiä.
Artikkeli " Käänteinen puolalainen merkintä: toteutusesimerkkejä " sisältää esimerkkejä käänteisen puolan merkinnän toteutuksesta eri ohjelmointikielillä.
Tämän tekniikan käytännön sovelluksena voimme mainita 1C:Enterprise -järjestelmän sovellusratkaisujen tavukoodikonfiguraatioiden organisoinnin . 1C ei anna virallista vahvistusta , mutta tämän järjestelmän käyttäjät erikoistuneilla foorumeilla tarjoavat todisteita ja algoritmeja, jotka mahdollistavat lähdetekstien purkamisen .
Ohjelmointikielet, jotka käyttävät OPN:ää pääasiallisena: