Logiikkaohjelmointi

PrologEdit

pääartikkeli: Prolog

ohjelmointikielen Prolog kehitti vuonna 1972 Alain Colmerauer. Se syntyi Colmerauerin Marseillessa ja Robert Kowalskin Edinburghissa tekemästä yhteistyöstä. Colmerauer työskenteli luonnollisen kielen ymmärtämisen parissa, käytti logiikkaa semantiikan esittämiseen ja käytti resoluutiota kysymys-vastaamiseen. Kesällä 1971 Colmerauer ja Kowalski keksivät, että logiikan klausaalista muotoa voitaisiin käyttää formaalien kieliopin esittämiseen ja että resoluutiolauseen provereita voitaisiin käyttää jäsentämiseen. He havaitsivat, että jotkut teoreemojen proverit, kuten hyper-resoluutiot, käyttäytyvät alhaalta ylös-parsereina ja toiset, kuten SL-resolution (1971), käyttäytyvät ylhäältä alas-parsereina.

seuraavana kesänä 1972 Kowalski kehitti jälleen yhdessä Colmerauerin kanssa seuraamusten proseduraalista tulkintaa. Tämä kaksijakoinen deklaratiivi / proseduraalinen tulkinta virallistui myöhemmin Prolog – notaatiossa

h: – B1, …, Bn.

jota voidaan lukea (ja käyttää) sekä deklaratiivisesti että menettelyllisesti. Kävi myös selväksi, että tällaiset lausekkeet voitiin rajoittaa määräisiin lausekkeisiin tai Horn-lausekkeisiin, joissa H, B1,…, Bn ovat kaikki atomisia predikaattilogiikan kaavoja, ja tämä SL-resoluutio voitaisiin rajoittaa (ja yleistää) LUSH-tai SLD-resoluutioon. Kowalskin prosessitulkintaa ja rehevyyttä kuvattiin vuonna 1973 julkaistussa muistiossa, joka julkaistiin vuonna 1974.

Colmerauer käytti Philippe Rousselin kanssa tätä lausekkeiden kaksijakoista tulkintaa pohjana prologissa, joka toteutettiin kesällä ja syksyllä 1972. Ensimmäinen Prolog-ohjelma, joka myös kirjoitettiin vuonna 1972 ja toteutettiin Marseillessa, oli ranskalainen kysymyksenvastausjärjestelmä. Prologin käyttö käytännön ohjelmointikielenä sai suurta vauhtia David Warrenin Edinburghissa vuonna 1977 kehittämästä kääntäjästä. Kokeet osoittivat, että Edinburgh Prolog pystyi kilpailemaan muiden symbolisten ohjelmointikielten, kuten Lispin, prosessointinopeuden kanssa. Edinburgh prologista tuli de facto-standardi ja se vaikutti voimakkaasti ISO-standardin Prolog määrittelyyn.

Abductive logic programmingEdit

Abductive logic programming on normaalin Logiikkaohjelmoinnin laajennus, joka sallii joidenkin kaappaaviksi predikaateiksi julistettujen predikaattien olevan ”avoimia” tai määrittelemättömiä. Kaappauslogiikan ohjelman lauseke on muotoa

H :- B1, …, Bn, A1, …, An.

missä H on atomikaava, joka ei ole kaappauskelpoinen, kaikki Bi: t ovat literaaleja, joiden predikaatit eivät ole kaappauskelpoisia, ja Ai ovat atomikaavoja, joiden predikaatit ovat kaappauskelpoisia. Siepattavia predikaatteja voivat rajoittaa eheysrajoitteet, jotka voivat olla muotoa:

epätosi: – L1,…, Ln.

, jossa Li ovat mielivaltaisia literaaleja (määriteltyjä tai siepattuja, ja atomisia tai negatoituja). Esimerkiksi:

canfly(X) :- bird(X), normal(X).false :- normal(X), wounded(X).bird(john).bird(mary).wounded(john).

missä predikaattinormaali on kaappaus.

ongelmanratkaisu saavutetaan johtamalla hypoteeseja, jotka on ilmaistu siepattavien predikaattien muodossa ratkaistavien ongelmien ratkaisuina. Nämä ongelmat voivat olla joko selitettäviä havaintoja (kuten klassisessa abduktiivisessa päättelyssä) tai ratkaistavia tavoitteita (kuten normaalissa logiikkaohjelmoinnissa). Esimerkiksi hypoteesi normaali (mary) selittää havainnon canfly(mary). Lisäksi samaan hypoteesiin sisältyy ainoa ratkaisu X = mary tavoitteesta löytää jotain mikä voi lentää:

:- canfly(X).

Kaappauslogiikkaohjelmointia on käytetty vikadiagnostiikkaan, suunnitteluun, luonnollisen kielen käsittelyyn ja koneoppimiseen. Sitä on käytetty myös tulkitsemaan negaatio epäonnistumisena eräänlaisena kaappausajatteluna.

Metaloginen ohjelmointi

koska matemaattisella logiikalla on pitkät perinteet oliokielen ja metalanguagen erottamisessa toisistaan, logiikkaohjelmointi mahdollistaa myös metalevel-ohjelmoinnin. Yksinkertaisin metaloginen ohjelma on niin sanottu” vanilla”-metatulkinta:

 solve(true). solve((A,B)):- solve(A),solve(B). solve(A):- clause(A,B),solve(B).

missä true edustaa tyhjää konjunktiota, ja lauseke(A,B) tarkoittaa, että forma:-B: n oliotason lauseke on olemassa.

Metaloginen ohjelmointi mahdollistaa oliotason ja metalitason representaatioiden yhdistämisen, kuten luonnollisessa kielessä. Sitä voidaan käyttää myös minkä tahansa päättelysäännöiksi määritellyn logiikan toteuttamiseen. Metalogia käytetään logiikkaohjelmoinnissa toteuttamaan metaprogrameja, jotka manipuloivat muita ohjelmia, tietokantoja, tietopohjia tai aksiomaattisia teorioita datana.

Constraint logic programmingEdit

Pääartikkeli: Constraint logic programming

Constraint logic programming yhdistää Torvilauselogiikan ohjelmoinnin ja constraint solvingin. Se laajentaa Horn-lausekkeita sallimalla joidenkin rajoite-predikaateiksi julistettujen predikaattien esiintyä lausekkeiden rungossa literaaleina. Rajoituslogiikkaohjelma on joukko lausekkeita muodossa:

H: – C1, …, CN ◊ B1, …, Bn.

missä H ja kaikki Bi ovat atomikaavoja ja Ci rajoitteita. Deklaratiivisesti tällaiset lausekkeet luetaan tavallisiksi loogisiksi seuraamuksiksi:

H jos C1 ja … ja Cn ja B1 ja … ja Bn.

siinä missä lausekkeiden päiden predikaatit määritellään rajoituslogiikkaohjelmalla, rajoitusten predikaatit on kuitenkin määritelty ennalta jollakin toimialakohtaisella malliteoreettisella rakenteella tai teorialla.

proseduraalisesti ne alatavoitteet, joiden predikaatit ohjelma määrittelee, ratkaistaan tavoitteellisella reduktiolla, kuten tavallisessa logiikkaohjelmoinnissa, mutta rajoitteet tarkastetaan tyydytettävyyden perusteella domain-spesifisellä rajoitteen ratkaisijalla, joka toteuttaa rajoitteen predikaattien semantiikan. Alkuperäinen ongelma ratkaistaan vähentämällä se tyydyttävään konjunktioon rajoitteita.

seuraava rajoituslogiikkaohjelma edustaa lelun aikatietokantaa Johnin historiasta opettajana:

teaches(john, hardware, T) :- 1990 ≤ T, T < 1999.teaches(john, software, T) :- 1999 ≤ T, T < 2005.teaches(john, logic, T) :- 2005 ≤ T, T ≤ 2012.rank(john, instructor, T) :- 1990 ≤ T, T < 2010.rank(john, professor, T) :- 2010 ≤ T, T < 2014.

täällä ≤ ja < ovat rajoittavia predikaatteja tavanomaisine tarkoituksineen. Seuraava maalauseke kyselee tietokannasta, milloin john sekä opetti logiikkaa että oli professori:

:- opettaa(john, logiikka, T), rank(john, professori, T).

ratkaisu on 2010 ≤ t, t ≤ 2012.

Rajoituslogiikan ohjelmointia on käytetty ongelmien ratkaisemiseen muun muassa maa-ja vesirakentamisessa, koneenrakennuksessa, digitaalipiirien todentamisessa, automatisoidussa aikataulutuksessa, lennonjohdossa ja rahoituksessa. Se on läheistä sukua abduktiiviselle logiikkaohjelmoinnille.

Concurrent logic programmingEdit

Pääartikkeli: Concurrent logic programming

Concurrent logic programming integroi logiikkaohjelmoinnin käsitteitä samanaikaiseen ohjelmointiin. Sen kehitys sai suuren sysäyksen 1980-luvulla, kun se valittiin japanilaisen viidennen sukupolven projektin (Fgcs) systems-ohjelmointikieleksi.

yhtäaikainen logiikkaohjelma on joukko vartioituja Torvilausekkeita muodossa: H :- G1, …, Gn / B1, …, Bn.

Konjunktio G1,… , Gn kutsutaan vartija lausekkeen, ja / on sitoutuminen operaattori. Deklaratiivisesti vartioidut Torvilausekkeet luetaan tavallisiksi loogisiksi seuraamuksiksi:

H jos G1 ja … ja Gn ja B1 ja … ja Bn.

kuitenkin menettelyllisesti, kun on useita lausekkeita, joiden päät h vastaavat tiettyä päämäärää, niin kaikki lausekkeet suoritetaan rinnakkain, tarkistaen ovatko niiden vartijat G1,… Odottakaa. Jos vartijat useamman kuin yhden lausekkeen pitää, niin sitoutunut valinta tehdään yksi lausekkeista, ja toteutus etenee alatavoitteet B1,…, BN valitun lausekkeen. Nämä alatavoitteet voidaan suorittaa myös rinnakkain. Näin rinnakkainen logiikkaohjelmointi toteuttaa muotoa ” don ’t care nondeterminism”, eikä ”don’ t know nondeterminism”.

esimerkiksi seuraavassa samanaikaisessa logiikkaohjelmassa määritellään predikaattisekoitus (Vasen, Oikea, yhdistäminen) , jolla voidaan sekoittaa kaksi listaa vasemmalle ja oikealle yhdistäen ne yhdeksi Listaliitokseksi, joka säilyttää kahden listaa vasemman ja oikean järjestyksen:

shuffle(, , ).shuffle(Left, Right, Merge) :- Left = | Merge = , shuffle(Rest, Right, ShortMerge).shuffle(Left, Right, Merge) :- Right = | Merge = , shuffle(Left, Rest, ShortMerge).

tässä on tyhjä lista, ja se edustaa listaa, jonka ensimmäisen elementin päätä seuraa listan pyrstö, kuten prologissa. (Huomaa, että ensimmäinen esiintyminen | toisessa ja kolmannessa lausekkeessa on luettelon rakentaja, kun taas toinen esiintyminen | on sitoumuksen operaattori.) Ohjelmaa voidaan käyttää esimerkiksi listojen sekoittamiseen ja maalilausekkeeseen vetoamalla:

shuffle(, , Merge).

ohjelma luo ei-deterministisesti yhden ratkaisun, esimerkiksi Merge = .

todennäköisesti samanaikaisen logiikan ohjelmointi perustuu viestin välittämiseen, joten siihen kohdistuu sama epämääräisyys kuin muihin samanaikaisiin sanomanvälitysjärjestelmiin, kuten näyttelijöihin (katso samanaikaisen laskennan epämääräisyys). Carl Hewitt on esittänyt, että samanaikainen logiikkaohjelmointi ei perustu logiikkaan siinä mielessä, että laskennallisia vaiheita ei voida loogisesti päätellä. Samanaikaisessa logiikkaohjelmoinnissa mikä tahansa päättävän laskennan tulos on kuitenkin looginen seuraus ohjelmasta, ja mikä tahansa osittaisen laskennan tulos on looginen seuraus ohjelmasta ja jäännöstavoitteesta (prosessiverkko). Laskelmien indeterminacy tarkoittaa siis, että kaikkia ohjelman loogisia seurauksia ei voida päätellä.

samanaikaisen rajoituslogiikan ohjelmointimedit

pääartikkeli: Samanaikainen rajoituslogiikkaohjelmointi

samanaikainen rajoituslogiikkaohjelmointi yhdistää samanaikaisen logiikkaohjelmoinnin ja rajoituslogiikkaohjelmoinnin, käyttäen rajoituksia samanaikaisuuden ohjaamiseen. Lauseke voi sisältää suojuksen, joka on joukko rajoitteita, jotka voivat estää lausekkeen soveltamisen. Kun useiden lausekkeiden suojukset täyttyvät, samanaikaisen rajoituslogiikan ohjelmointi tekee sitoutuneen valinnan käyttää vain yhtä.

induktiivisen logiikan ohjelmointimedit

pääartikkeli: Induktiivinen logiikkaohjelmointi

Induktiivinen logiikkaohjelmointi käsittelee positiivisten ja negatiivisten esimerkkien yleistämistä taustatiedon yhteydessä: logiikkaohjelmien koneoppimista. Logiikkaohjelmointia, oppimista ja todennäköisyyslaskentaa yhdistelevä viimeaikainen työ tällä alalla on synnyttänyt uuden tilastollisen relaatio-oppimisen ja probabilistisen induktiivisen logiikkaohjelmoinnin alan.

Higher-order logic programmingEdit

useat tutkijat ovat laajentaneet logiikkaohjelmointia korkeamman kertaluvun logiikasta johdetuilla korkeamman kertaluvun ohjelmointiominaisuuksilla, kuten predikaattimuuttujilla. Tällaisia kieliä ovat esimerkiksi Prolog-laajennukset HiLog ja λProlog.

Linear logic programmingEdit

basing logic programming in linear logic on johtanut logiikan ohjelmointikielten suunnitteluun, jotka ovat huomattavasti ekspressiivisempiä kuin klassiseen logiikkaan perustuvat. Torvilauseohjelmat voivat esittää tilan muutosta vain siten, että argumentit muuttuvat predikaateiksi. Lineaarisessa logiikkaohjelmoinnissa voidaan käyttää ympäristön lineaarista logiikkaa tukemaan tilamuutosta. Eräitä lineaariseen logiikkaan perustuvien logiikkaohjelmointikielten varhaisia malleja ovat LO, Lolli, ACL ja Forum . Forum tarjoaa tavoitteellisen tulkinnan kaikesta lineaarisesta logiikasta.

Oliokeskeinen logiikkaohjelmointi

F-logiikka laajentaa logiikkaohjelmointia olioilla ja kehyssyntaksilla.

Logtalk laajentaa Prolog-ohjelmointikieltä, joka tukee olioita, protokollia ja muita OOP-käsitteitä. Se tukee useimpia standardin mukaisia Prolog-järjestelmiä taustaosan kääntäjinä.

Transaction logic programmingEdit

Transaction logic on logiikkaohjelmoinnin laajennus, jossa on looginen teoria tilaa muokkaavista päivityksistä. Siinä on sekä malliteoreettinen semantiikka että proseduraalinen. Flora-2-järjestelmässä on saatavilla Transaktiologiikan osajoukon toteutus. Myös muita prototyyppejä on saatavilla.

Vastaa

Sähköpostiosoitettasi ei julkaista.