Logikai programozás

PrologEdit

fő cikk: Prolog

a Prolog programozási nyelvet 1972-ben fejlesztette ki Alain Colmerauer. A Marseille-i Colmerauer és az Edinburgh-i Robert Kowalski közötti együttműködés eredményeként jött létre. Colmerauer a természetes nyelv megértésén dolgozott, a logikát a szemantika ábrázolására, a felbontást pedig a kérdések megválaszolására használta. 1971 nyarán Colmerauer és Kowalski felfedezte, hogy a logika klauzális formája használható a formális nyelvtanok ábrázolására, és hogy a felbontási tétel bizonyítóit fel lehet használni az elemzéshez. Megfigyelték, hogy egyes tétel-bizonyítók, mint a hiper-felbontás, alulról felfelé értelmezőként viselkednek, mások pedig, mint az SL-felbontás (1971), felülről lefelé értelmezőként viselkednek.

1972 következő nyarán Kowalski, ismét Colmerauerrel együttműködve, kidolgozta a következmények eljárási értelmezését. Ez a kettős deklaratív / eljárási értelmezés később formalizálódott a Prolog jelölés

H: – B1, …, Bn.

amely mind deklaratív, mind eljárási szempontból olvasható (és használható). Világossá vált az is, hogy az ilyen záradékok határozott záradékokra vagy kürt záradékokra korlátozódhatnak, ahol H, B1,…, Bn mind atomi predikátum logikai képletek, és hogy az SL-felbontás korlátozható (és általánosítható) LUSH vagy SLD-felbontásra. Kowalski eljárási értelmezését és LUSH-t egy 1973-as feljegyzés írta le, amely 1974-ben jelent meg.

Colmerauer Philippe Roussel-lel együtt ezt a kettős értelmezést használta a Prolog alapjául, amelyet 1972 nyarán és őszén hajtottak végre. Az első Prolog program, amelyet szintén 1972-ben írtak, és Marseille-ben hajtottak végre, egy francia kérdés-válaszoló rendszer volt. A Prolog gyakorlati programozási nyelvként való használata nagy lendületet adott a fordító által David Warren Edinburgh-ban 1977-ben. A kísérletek azt mutatták, hogy az Edinburgh Prolog versenyezhet más szimbolikus programozási nyelvek, például a Lisp feldolgozási sebességével. Edinburgh Prolog lett a de facto szabvány, és erősen befolyásolta a meghatározása ISO szabvány Prolog.

Abductive logic programmingEdit

az Abductive logic programming a normál logikai programozás kiterjesztése, amely lehetővé teszi, hogy egyes, elrabolható predikátumoknak nyilvánított predikátumok “nyitottak” vagy meghatározatlanok legyenek. Az elrabló logikai program záradékának formája:

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

ahol H egy atomi képlet, amely nem elrabolható, az összes Bi olyan literálok, amelyek predikátumai nem elrabolhatók, az Ai pedig atomi képletek, amelyek predikátumai elrabolhatók. Az elrabolható predikátumokat integritási korlátok korlátozhatják, amelyek formája lehet:

hamis :- L1,…, Ln.

ahol a Li önkényes literálok (definiált vagy elrabolható, atomi vagy tagadott). Például:

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

ahol a normál predikátum elrabolható.

a problémamegoldást az elrabolható predikátumokban kifejezett hipotézisek levezetésével érik el, mint megoldandó problémák megoldását. Ezek a problémák lehetnek magyarázandó megfigyelések (mint a klasszikus abduktív érvelésben) vagy megoldandó célok (mint a normál logikai programozásban). Például a hipotézis normál (mary) magyarázza a megfigyelést canfly(mary). Sőt, ugyanez a hipotézis magában foglalja az egyetlen megoldást X = mary a cél, hogy talál valamit, ami tud repülni:

:- canfly(X).

Abductive logikai programozás használták hiba diagnózis, tervezés, természetes nyelvi feldolgozás és gépi tanulás. Arra is használták, hogy a tagadást kudarcként értelmezzék, mint az elrabló érvelés egyik formáját.

Metalogic programmingEdit

mivel a matematikai logikának nagy hagyománya van a tárgynyelv és a metanyelv megkülönböztetésében, a logikai programozás lehetővé teszi a metalevel programozást is. A legegyszerűbb metalogic program az úgynevezett “vanília” meta-interpreter:

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

ahol a true egy üres kötőszót jelent, és az(A,B) záradék azt jelenti, hogy van egy objektumszintű záradék a formA:-B.

A Metalogic programozás lehetővé teszi az objektumszintű és metalevel reprezentációk kombinálását, mint a természetes nyelvben. Azt is fel lehet használni, hogy végre minden logika, amely meghatározott következtetési szabályok. A metalogicot a logikai programozásban használják metaprogramok végrehajtására, amelyek adatként más programokat, adatbázisokat, tudásbázisokat vagy axiomatikus elméleteket manipulálnak.

Constraint logic programmingEdit

fő cikk: Constraint logic programming

a Constraint logic programming ötvözi a Horn-záradék logikai programozását a kényszer megoldásával. Kiterjeszti a kürt-záradékokat azáltal, hogy lehetővé teszi egyes predikátumok, kényszer-predikátumként deklarálva, hogy literálként forduljanak elő a záradékok testében. A kényszer logikai program a következő formájú záradékok halmaza:

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

ahol H és az összes Bi atomi képletek, A Ci pedig korlátok. Deklaratív módon az ilyen záradékokat rendes logikai következményekként értelmezik:

H ha C1 és … és Cn és B1 és … és Bn.

míg azonban a záradékok fejeiben szereplő predikátumokat a kényszer logikai program határozza meg, a kényszerekben szereplő predikátumokat valamilyen tartományspecifikus modellelméleti struktúra vagy elmélet határozza meg.

eljárási szempontból azokat a részcélokat, amelyek predikátumait a program határozza meg, célcsökkentéssel oldják meg, mint a szokásos logikai programozásban, de a megszorításokat egy tartományspecifikus kényszer-megoldó ellenőrzi a kielégíthetőség szempontjából, amely megvalósítja a kényszer predikátumok szemantikáját. A kezdeti problémát úgy oldják meg, hogy a korlátok kielégítő összekapcsolódására redukálják.

a következő kényszer logikai program egy játék időbeli adatbázist képvisel john tanári történetéről:

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.

itt a) és < kényszer predikátumok, a szokásos tervezett szemantikájukkal. A következő célmondat lekérdezi az adatbázist, hogy megtudja, mikor tanított John logikát és professzor volt:

:- tanít(john, logic, T), rang(john, professor, T).

a megoldás 2010-es, 2012-es, 2010-es.

a kényszer logikai programozást Olyan problémák megoldására használták, mint az építőmérnöki, gépészeti, digitális áramkör-ellenőrzés, automatizált menetrend, légiforgalmi irányítás és Pénzügy. Szorosan kapcsolódik az elrabló logikai programozáshoz.

egyidejű logikai programozás

fő cikk: egyidejű logikai programozás

az egyidejű logikai programozás integrálja a logikai programozás koncepcióit az egyidejű programozással. Fejlesztése nagy lendületet kapott az 1980-as években, amikor a japán ötödik generációs projekt (FGCS) rendszerprogramozási nyelvét választotta.

a párhuzamos logikai program egy sor őrzött kürt záradék formájában:

H: – G1, …, Gn | B1, …, Bn.

a G1 kötőszó,… , A GN-t a záradék őrének nevezik, és | az elkötelezettség operátora. Deklaratív módon az őrzött kürt-záradékokat rendes logikai következményekként értelmezik:

H ha G1 és … és Gn és B1 és … és Bn.

eljárási szempontból azonban, ha több olyan záradék van, amelynek feje H egy adott célnak felel meg, akkor az összes záradékot párhuzamosan hajtják végre, ellenőrizve, hogy őreik G1,… , GN tartsa. Ha egynél több záradék őrei tartanak, akkor elkötelezett választás történik az egyik záradék mellett, a végrehajtás pedig a B1 alcélokkal folytatódik,…, A választott záradék Bn. Ezek a részcélok párhuzamosan is végrehajthatók. Így az egyidejű logikai programozás a “nem érdekel a nondeterminizmus” egy formáját valósítja meg, nem pedig a “nem ismerem a nondeterminizmust”.

például a következő egyidejű logikai program definiál egy predikátum shuffle(Bal, Jobb, Merge), amely lehet használni, hogy shuffle két listát balra és jobbra, egyesíti őket egyetlen lista egyesítése, amely megőrzi a sorrendben a két lista balra és jobbra:

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

itt az üres listát képviseli, és egy listát képvisel, amelynek első elemfejét a lista farka követi, mint a Prologban. (Figyeljük meg, hogy a második és harmadik záradék első előfordulása | a lista konstruktora, míg a | második előfordulása a kötelezettségvállalási operátor.) A program használható például a listák keverésére és a cél záradék meghívásával:

shuffle(, , Merge).

a program nem determinisztikusan egyetlen megoldást generál, például Merge = .

vitathatatlanul az egyidejű logikai programozás az üzenetátadáson alapul, ezért ugyanolyan határozatlanságnak van kitéve, mint más egyidejű üzenetátadó rendszerek, például színészek (lát határozatlanság az egyidejű számításban). Carl Hewitt azzal érvelt, hogy az egyidejű logikai programozás nem logikán alapul abban az értelemben, hogy a számítási lépéseket nem lehet logikusan levezetni. Az egyidejű logikai programozásban azonban a végződő számítás bármely eredménye a Program logikai következménye, a részleges számítás bármely részeredménye pedig a program és a maradék cél (folyamathálózat) logikai következménye. Így a számítások határozatlansága azt jelenti, hogy a program nem minden logikai következménye levezethető.

párhuzamos kényszerlogika programozásszerkesztés

fő cikk: Egyidejű kényszerlogikai programozás

az egyidejű kényszerlogikai programozás kombinálja az egyidejű logikai programozást és a kényszerlogikai programozást, a kényszerek használatával a párhuzamosság szabályozására. A záradék tartalmazhat őrt, amely olyan korlátozások halmaza, amelyek blokkolhatják a záradék alkalmazhatóságát. Ha több záradék őrei teljesülnek, az egyidejű kényszerlogikai programozás elkötelezett döntést hoz, hogy csak egyet használjon.

Induktív logikai programozásszerkesztés

fő cikk: Induktív logikai programozás

az Induktív logikai programozás pozitív és negatív példák általánosításával foglalkozik a háttérismeret összefüggésében: logikai programok gépi tanulása. A logikai programozás, a tanulás és a valószínűség kombinálásával ezen a területen végzett legújabb munka a statisztikai relációs tanulás és a valószínűségi Induktív logikai programozás új területét eredményezte.

magasabb rendű logikai programozás

számos kutató kiterjesztette a logikai programozást a magasabb rendű logikából származó magasabb rendű programozási jellemzőkkel, például predikátumváltozókkal. Az ilyen nyelvek közé tartoznak a HiLog és az XXI. Prolog kiterjesztések.

lineáris logikai programozás

a logikai programozás lineáris logikán belüli alapozása olyan logikai programozási nyelvek tervezését eredményezte, amelyek lényegesen kifejezőbbek, mint a klasszikus logikán alapulók. A Horn-záradék programok csak az állapotváltozást ábrázolhatják az argumentumok predikátumokká történő változásával. A lineáris logikai programozásban a környezeti lineáris logika az állapotváltozás támogatására használható. A lineáris logikán alapuló logikai programozási nyelvek korai tervei közé tartozik a lo , Lolli, ACL és Forum . A fórum az összes lineáris logika célirányos értelmezését biztosítja.

objektumorientált logikai programozás

az F-logic kiterjeszti a logikai programozást objektumokkal és a keret szintaxisával.

a Logtalk kiterjeszti a Prolog programozási nyelvet objektumok, protokollok és egyéb OOP koncepciók támogatásával. Támogatja a legtöbb szabványnak megfelelő Prolog rendszerek backend fordítók.

tranzakciós logikai programozás

a tranzakciós logika a logikai programozás kiterjesztése az állapotmódosító frissítések logikai elméletével. Mind modellelméleti, mind eljárási szemantikával rendelkezik. A tranzakciós logika egy részhalmazának megvalósítása elérhető a Flora – 2 rendszerben. Más prototípusok is rendelkezésre állnak.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.