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.