Loogiline programmeerimine: põhimõisted, Prolog ja rakendused
Loogiline programmeerimine on matemaatilise loogika kasutamine arvutiprogrammide kirjutamiseks. Selle paradigma keskmes on teadmiste esitus loogiliste faktide ja reeglitena ning pöörduspäringute (päringute) lahendamine loogiliste tuletusreeglite abil. On olemas spetsiaalsed programmeerimiskeeled, kus kasutaja saab otse sisestada selliseid loogilisi avaldusi. Tõenäoliselt on neist keeltest kõige tuntum keel, mida nimetatakse Prologiks. Alonzo Church kasutas loogilise programmeerimise vormi, mida tänapäeval nimetatakse lambdaarvutuseks. Loogilist programmeerimist on kasutatud ka LISPis.
Põhimõisted
Loogilistes programmides väljendatakse teadmisi:
- faktid — baasväited, mis on ilma tingimusteta tõestatavad (nt isa(mati, kali));
- reeglid — tingimuslikud seosed, mis võimaldavad tuletada uusi fakte olemasolevatest (nt vanem(X, Y) :- isa(X, Y); emapoolne(X, Y) :- ema(X, Y)).
Prolog — lühikokkuvõte
Prolog (Programming in Logic) on enimlevinud loogilise programmeerimise keel. Prologis väljendatakse teadmisi objektide, suhete ja reeglitega; süsteem püüab päringutele leida tõestuse tuletamise teel. Näide Prologist:
% faktid isa(mati, juku). ema(liisa, juku). % reegel vanem(X, Y) :- isa(X, Y). vanem(X, Y) :- ema(X, Y). % päring ?- vanem(mati, juku). true.
Prolog kasutab päringute lahendamiseks sügavust-esimesena (depth-first) otsingut koos tagasi-tagasi (backtracking) mehhanismiga.
Eitamine kui ebaõnnestumine (negation as failure)
Loogilises programmeerimises kasutatakse sageli nn eitamist kui ebaõnnestumist ehk nõrka eitamist. See tähendab, et kui faktidest ja reeglitest ei ole võimalik tuletada mõnda lauset p {\displaystyle p}, eeldab süsteem, et selle eitus on tõene. See põhimõte seostub tihedalt suletud maailma eeldusega (closed-world assumption): kõik, mida süsteem ei tea kui tõestatud, võetakse võrdselt teadaolevalt vääraks.
Rakendused ja laiendused
Loogilist programmeerimist ja Prologit kasutatakse mitmes valdkonnas, näiteks:
- teadmusbaasid ja ekspertsüsteemid;
- looduskeele töötlemine (NLP) ja süntaktiline/parsing-analüüs;
- teoreemide automaatne tõestamine ja formaalne kontroll;
- plaanimine, optimeerimine ja otsingupõhised probleemid;
- piiratud loogika variandid nagu Constraint Logic Programming (CLP) ja Answer Set Programming (ASP) raskemate teadmiste esituse ja optimeerimise jaoks.
Tugevused ja piirangud
- Tugevused: loogiline ja deklaratiivne lähenemine muudab programmi mõtlemise- ja loogikaesituse selgeks; sobib hästi teadmiste esitamiseks ja keerukate loogiliste seoste modelleerimiseks.
- Piirangud: klassikaline Prolog on piiratud, kui tegemist on väga suure andmemahtude või keeruka otsingu kontrolliga (nt sügavuse-eesmendilise otsingu lõkete ja jõudlusprobleemide tõttu); samuti ei sobi negation-as-failure alati mingite probleemide formaalseks esituseks, kus on vaja avatud maailma või täpsema semantika modelleerimist.
Lõpetuseks
Loogiline programmeerimine pakub tugevat raamistikku deklaratiivseks modelleerimiseks ja teadmiste esitamiseks. Kuigi traditsiooniline Prolog ei pruugi kõigi ülesannete jaoks olla kõige efektiivsem, on paradigma ideed — reeglitele ja faktidele tuginev esitus ning automaatne tuletamine — endiselt olulised nii uurimistöös kui ka tööstuslikes rakendustes. Moodsaid lähenemisi (nt CLP, ASP ja hübriidlahendused) kasutatakse laialdaselt keerukamate teadmuspõhiste süsteemide loomiseks.
Küsimused ja vastused
K: Mis on loogiline programmeerimine?
V: Loogiline programmeerimine on programmeerimise käsitlusviis, mis kasutab matemaatilist loogikat arvutiprogrammide kirjutamiseks.
K: Millised on mõned programmeerimiskeeled, mis kasutavad loogilist programmeerimist?
V: Mõned programmeerimiskeeled, mis kasutavad loogilist programmeerimist, on näiteks Prolog ja LISP.
K: Milline on reeglite ja faktide roll loogilises programmeerimises?
V: Programmid loogilises programmeerimises koosnevad reeglite ja faktide kogumist.
K: Mis on eitus kui ebaõnnestumine loogilises programmeerimises?
V: Negatsioon kui ebaõnnestumine on loogilises programmeerimises mõiste, mille puhul, kui faktidest ja reeglitest ei ole võimalik tuletada mingit kindlat lauset, eeldab süsteem, et selle eitus on tõene.
K: Mis on nõrk eitus loogilises programmeerimises?
V: Nõrk eitus on teine termin eitusele kui ebaõnnestumisele, mis on mõiste loogilises programmeerimises.
K: Kes kasutas loogilise programmeerimise vormi lambda-kalkuluses?
V: Alonzo Church kasutas loogilise programmeerimise vormi, mida tänapäeval tuntakse lambda-arvutusena.
K: Milline on tuntuim programmeerimiskeel, mis võimaldab kasutajatel otse sisestada loogilisi avaldisi?
V: Prolog on ilmselt kõige tuntum programmeerimiskeel, mis võimaldab kasutajatel otse loogilisi avaldisi sisestada.