Preduvid je tehnika u algoritmima za uzimanje nekoliko sledećih ulaznih stavki pre donošenja najekonomičnije odluke u određenoj etapi algoritma.
Preduvid u problemima pretrage
Kod veštačke inteligencije, preduvid je važna komponenta kombinatorne pretrage koja određuje, grubo, koliko se duboko ispituje graf koji predstavlja problem. Potreba za specifičnim ograničenjem za preduvid dolazi od velikih problemskih grafova u mnogim aplikacijama, kao što su računarski šah i računarski go. Prvi očigledni izbor, pretraga u širinu, bi brzo potrošila svu raspoloživu memoriju bilo kojeg modernog računara. Postavljanjem specifičnog preduvidnog ograničenja, vreme algoritma se može pažljivo kontrolisati; njegovo vreme raste eksponencijalno sa rastom preduvidnog ograničenja.
Prefinjenije tehnike pretrage kao što je alfa-beta potkresivanje mogu da eliminišu čitava podstabla u stablu pretrage iz razmatranja. Kada se koriste ove tehnike, količina preduvida nije precizno određena, nego je bilo najveća pretražena dubina bilo neka vrsta proseka.
Preduvidni simbol u sintaksičkoj analizi
Preduvid je takođe važan koncept u sintaksičnim analizatorima u kompajlerima koji su zasnovani na maksimalnom broju ulaznih tokena koje analizator može da vidi i da na osnovu njih odluči koje pravilo treba da primeni.
Preduvid je naročito značajan kod LL, LR, i LALR sintaksičkih analizatora, gde je čest slučaj da se u nazivu algoritma u zagradama eksplicitno naglasi preduvid, na primer LALR(1).
Većina programskih jezika, inače primarnih ciljeva za sintaksičke analizatore, su pažljivo definisani gramatikama tako da ih mogu obrađivati analizatori sa ograničenim (najčešće jedan) preduvidom, zato što su takvi analizatori često efikasniji. Važna promena u ovom prilazu načinjena je 1990. godine kada je Terence Parr napravio ANTLR (kao svoju postdiplomsku tezu), generator sintaksičkih analizatora za efikasnu LL(k) analizu, gde je k fiksirana veličina.
Analizatori obično imaju na raspolaganju par akcija posle gledanja svakog tokena. One su: prebacivanje (pomeranje) – dodavanje tokena na stek radi kasnijeg svođenje (skidanja), svođenje – skidanje tokena sa steka i formiranje sintaksičkog konstrukta, kraj, greška – nijedno poznato pravilo nije primenljivo ili konflikt – nepoznato da li treba uraditi prebacivanje ili svođenje.
Preduvid ima dve prednosti.
- Pomaže da analizator izvrši odgovarajuću akciju u slučaju konflikta. Na primer, da analizira if iskaz u slučaju da se pojavi else klauzula.
- Uklanja mnoga dvostruka stanja i olakšava teret dodatnog steka. Analizator za programski jezik C koji ne koristi preduvid bi imao oko 10,000 stanja, a koji koristi – oko 300.
Primer: Analiza izraza 1+ 2 * 3
Skup pravila za analizu izraza (koji se naziva gramatika) je sledeći: Pravilo 1: E → E + E Izraz je zbir dva izraza. Pravilo 2: E → E * E Izraz je proizvod dva izraza. Pravilo 3: E → broj Izraz je običan broj. Pravilo 4: operator + ima manji prioritet od operatora *
Većina programskih jezika (izuzev nekih kao što je APL) i algebarskih formula daju veći prioritet množenju nego sabiranju. Pravilno tumačenje navedenog primera je (1 + (2 * 3)). Primetite da je Pravilo 4 semantičko pravilo. Moguće je preraditi gramatiku tako da se prioritet ubaci u sintaksu. Međutim, nije moguće sva semantička pravila prevesti u sintaksu.
Jednostavne akcije ne-preduvidnog analizatora
- Svođenje broja 1 na ulazu na izraz E po pravilu 3
- Prebacivanje simbola + sa ulaza na stek da bi se moglo iskoristiti pravilo 1.
- Svođenje broja 2 na ulazu na izraz E po pravilu 3.
- Skidanje niske E+ E sa steka i stavljanje simbola E po pravilu 1.
- Prebacivanje simbola * sa ulaza na stek u iščekivanju da će se primeniti pravilo 2.
- Prebacivanje broja 3 sa ulaza na stek u iščekivanju da će se primeniti pravilo 3.
- Svođenje broja 3 na izraz E po pravilu 3.
- Skidanje niske E*E sa steka i stavljanje na stek simbola E na osnovu pravila 2.
Stablo sintaksičke analize i rezultujući kod nisu korektni po semantičkim pravilima jezika.
Da bi se ispravila analiza bez preduvida postoje tri načina.
- Korisnik mora da stavi izraz u zagradu. Ovo često nije odgovarajuće rešenje.
- Analizator mora da sadrži dodatnu logiku da uradi bektreking i pokuša ponovo kad god je pravilo prekršeno ili nije ispunjeno. Sličan metod se koristi kod LL analizatora.
- Alternativno, analizator ili gramatika moraju da poseduju dodatnu logiku da odlože svođenje i da svode samo onda kada su potpuno koje pravilo da svedu prvo. Ovaj metod koriste LR analizatori. Na ovaj način se pravilno radi analiza izraza, ali sa mnogo više stanja i sa uvećanom dubinom steka.
Akcija analizatora sa preduvidom
- Prebacivanje broja 1 na stek u očekivanju da se iskoristi pravilo 3. Ne vrši se odmah svođenje.
- Svođenje elementa steka na jednostavan izraz po pravilu 3. Ovo se vrši zato što je preduvidni simbol +, pa je analiza na putu ka rečeničnoj formi E+, pa se moze izvršiti svođenje steka na E.
- Prebacivanje ulaznog simbola + na stek u očekivanju da će se primeniti pravilo 1.
- Prebacivanje sa ulaza na stek broja 2 u očekivanju pravila 3.
- Svođenje broja 2 na E zbog simbola * na ulazu po pravilu 3. Preduvidni karakter * očekuje samo E pre njega.
- Sada je na steku E+E, a na ulazu je jos uvek *. Sada postoje dve mogućnosti - da se izvrši prebacivanje na osnovu pravila 2 ili svođenje na osnovu pravila 1. Pošto operator * ima veći prioritet od operatora + na osnovu pravila 4, prebacuje se * na stek po pravilu 2.
- Prebacuje se broj 3 sa ulaza na stek u iščekivanju da će se primeniti pravilo 3.
- Vrši se svođenje broja 3, na steku, na E pošto je viđen kraj ulaza, po pravilu 3.
- Svođenje izraza E*E koji je na steku na E, po pravilu 2.
- Svođenje izraza E+E koji je na steku na E, na osnovu pravila 1.
Stablo sintaksične analize koje je generisano je ispravno i mnogo efikasnije od ne-preduvidnih analizatora. Ovu strategiju koristi LALR analizator.