Programare logică

PrologEdit

Articol principal: Prolog

limbajul de programare Prolog a fost dezvoltat în 1972 de Alain Colmerauer. A apărut dintr-o colaborare între Colmerauer în Marsilia și Robert Kowalski în Edinburgh. Colmerauer lucra la înțelegerea limbajului natural, folosind logica pentru a reprezenta semantica și folosind rezoluția pentru răspunsul la întrebări. În vara anului 1971, Colmerauer și Kowalski au descoperit că forma clauzală a logicii ar putea fi folosită pentru a reprezenta gramatici formale și că teorema rezoluției provers ar putea fi folosit pentru parsare. Ei au observat că unele demonstratoare de teoreme, cum ar fi hiper-rezoluția, se comportă ca analizoare de jos în sus și altele, cum ar fi rezoluția SL (1971), se comportă ca analizoare de sus în jos.în vara următoare a anului 1972, Kowalski, colaborând din nou cu Colmerauer, a dezvoltat interpretarea procedurală a implicațiilor. Această dublă interpretare declarativă / procedurală a devenit ulterior formalizată în notația Prolog

H :- B1, …, Bn.

care poate fi citit (și utilizat) atât declarativ, cât și procedural. De asemenea, a devenit clar că astfel de clauze ar putea fi limitate la clauze definite sau Clauze Horn, unde H, B1,…, Bn sunt toate formule logice predicate Atomice și că rezoluția SL ar putea fi restricționată (și generalizată) la rezoluție luxuriantă sau SLD. Interpretarea procedurală a lui Kowalski și LUSH au fost descrise într-o notă din 1973, publicată în 1974.

Colmerauer, împreună cu Philippe Roussel, au folosit această dublă interpretare a clauzelor ca bază a Prolog, care a fost pusă în aplicare în vara și toamna anului 1972. Primul program Prolog, scris și în 1972 și implementat la Marsilia, a fost un sistem francez de răspuns la întrebări. Utilizarea Prolog ca limbaj de programare practic a primit un mare impuls prin dezvoltarea unui compilator de David Warren în Edinburgh în 1977. Experimentele au demonstrat că Edinburgh Prolog ar putea concura cu viteza de procesare a altor limbaje de programare simbolice, cum ar fi Lisp. Edinburgh Prolog a devenit standardul de facto și a influențat puternic definiția standardului ISO prolog.

programarea logicii Abductive

programarea logicii Abductive este o extensie a programării logice normale care permite ca unele predicate, declarate ca predicate abductive, să fie „deschise” sau nedefinite. O clauză dintr – un program de logică abductivă are forma:

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

unde H este o formulă atomică care nu este abductibilă, toți Bi sunt literali ale căror predicate nu sunt abductibile, iar Ai sunt formule atomice ale căror predicate sunt abductibile. Predicatele abducibile pot fi constrânse de constrângeri de integritate, care pot avea forma:

false :- L1, …, Ln.

unde Li sunt literali arbitrari (definiți sau abductibili și atomici sau negați). De exemplu:

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

unde predicatul normal este abducibil.

rezolvarea problemelor se realizează prin derivarea ipotezelor exprimate în termeni de predicate abductibile ca soluții ale problemelor de rezolvat. Aceste probleme pot fi fie observații care trebuie explicate (ca în raționamentul abductiv clasic), fie obiective care trebuie rezolvate (ca în programarea logică normală). De exemplu, ipoteza normal(mary) explică observația canfly(mary). Mai mult decât atât, aceeași ipoteză implică singura soluție X = Maria a obiectivului de a găsi ceva care poate zbura:

:- canfly(X).

programarea logică Abductivă a fost utilizată pentru diagnosticarea erorilor, planificarea, procesarea limbajului natural și învățarea automată. De asemenea, a fost folosit pentru a interpreta negația ca eșec ca formă de raționament abductiv.

programare Metalogicedit

deoarece logica matematică are o lungă tradiție de a distinge între limbajul obiectelor și metalimbajul, programarea logică permite, de asemenea, programarea la nivel metalic. Cel mai simplu program metalogic este așa-numitul meta-interpret „vanilla”:

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

unde true reprezintă o conjuncție goală, iar clauza(A,B) înseamnă că există o clauză la nivel de obiect a formei:-B.

programarea Metalogică permite combinarea reprezentărilor la nivel de obiect și la nivel de metal, ca în limbajul natural. De asemenea, poate fi folosit pentru a implementa orice logică care este specificată ca reguli de inferență. Metalogic este utilizat în programarea logică pentru a implementa metaprograme, care manipulează alte programe, baze de date, baze de cunoștințe sau teorii axiomatice ca date.

programare logică de Constrângereedit

Articol principal: programare logică de constrângere

programare logică de constrângere combină programarea logică a clauzelor cornului cu rezolvarea constrângerilor. Se extinde clauze de corn permițând unor predicate, declarate ca predicate de constrângere, să apară ca literali în corpul clauzelor. Un program logic de constrângere este un set de clauze de forma:

H :- C1, …, CN B1, …, BN.

unde H și toate Bi sunt formule atomice, iar Ci sunt constrângeri. Declarativ, astfel de clauze sunt citite ca implicații logice obișnuite:

H dacă C1 și … și Cn și B1 și … și Bn. cu toate acestea, în timp ce predicatele din capetele de clauze sunt definite de programul logic de constrângere, predicatele din constrângeri sunt predefinite de o anumită structură sau teorie model-teoretică specifică domeniului.

procedural, subgoalele ale căror predicate sunt definite de program sunt rezolvate prin reducerea obiectivelor, ca în programarea logică obișnuită, dar constrângerile sunt verificate pentru satisfiabilitate de către un rezolvator de constrângeri specific domeniului, care implementează semantica predicatelor de constrângere. O problemă inițială este rezolvată prin reducerea acesteia la o conjuncție satisfăcătoare de constrângeri.

următorul program de logică de constrângere reprezintă o bază de date temporală de jucărie a istoriei lui john ca profesor:

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.

aici și< sunt predicate de constrângere, cu semantica lor obișnuită intenționată. Următoarea clauză de obiectiv interoghează baza de date pentru a afla când john a predat logica și a fost profesor:

:- învață(john, logic, T), rang(john, profesor, T).

soluția este 2010, t, t, t, 2012.

programarea logică a constrângerilor a fost utilizată pentru a rezolva probleme în domenii precum inginerie civilă, Inginerie Mecanică, verificarea circuitelor digitale, orare automată, controlul traficului aerian și Finanțe. Este strâns legată de programarea logică abductivă.

programare logică Concurentăedit

Articol principal: programare logică concurentă

programare logică concurentă integrează concepte de programare logică cu programare concurentă. Dezvoltarea sa a primit un mare impuls în anii 1980 prin alegerea sa pentru limbajul de programare a sistemelor proiectului japonez de generația a cincea (Fgcs).

un program logic concurent este un set de clauze de corn păzite de forma:

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

conjuncția G1, … , Gn se numește Garda clauzei și / este operatorul de angajament. Declarativ, clauzele cornului păzit sunt citite ca implicații logice obișnuite:

H dacă G1 și … și Gn și B1 și … și Bn.

cu toate acestea, procedural, atunci când există mai multe clauze ale căror capete h Se potrivesc cu un anumit scop, atunci toate clauzele sunt executate în paralel, verificând dacă gardienii lor G1,… , Gn hold. Dacă gardienii mai multor clauze dețin, atunci se face o alegere angajată la una dintre clauze, iar execuția continuă cu subgolurile B1,…, Bn din clauza aleasă. Aceste subgoale pot fi, de asemenea, executate în paralel. Astfel, programarea logică concurentă implementează o formă de” nu-mi pasă de nedeterminism”, mai degrabă decât”nu știu nedeterminismul”.

de exemplu, următorul program de logică concurentă definește o amestecare predicată (stânga, dreapta, îmbinare), care poate fi utilizată pentru a amesteca două liste la stânga și la dreapta, combinându-le într-o singură îmbinare de liste care păstrează ordonarea celor două liste la stânga și la dreapta:

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

aici, reprezintă lista goală și reprezintă o listă cu capul primului element urmat de coada listei, ca în Prolog. (Observați că prima apariție a / în a doua și a treia clauză este constructorul listei, în timp ce a doua apariție a | este operatorul angajamentului.) Programul poate fi folosit, de exemplu, pentru a amesteca listele și invocând clauza de obiectiv:

shuffle(, , Merge).

programul va genera nedeterministic o singură soluție, de exemplu Merge = .

probabil, programarea logică concurentă se bazează pe transmiterea mesajelor, deci este supusă aceleiași nedeterminări ca și alte sisteme concurente de transmitere a mesajelor, cum ar fi actorii (vezi nedeterminarea în calculul concurent). Carl Hewitt a susținut că programarea logică concurentă nu se bazează pe logică în sensul său că pașii de calcul nu pot fi deduși logic. Cu toate acestea, în programarea logică concurentă, orice rezultat al unui calcul de terminare este o consecință logică a programului și orice rezultat parțial al unui calcul parțial este o consecință logică a programului și a obiectivului rezidual (rețeaua de procese). Astfel, nedeterminarea calculelor implică faptul că nu toate consecințele logice ale programului pot fi deduse.

programare logică de constrângere Concurentăedit

Articol principal: Programarea logică de constrângere concurentă

programarea logică de constrângere concurentă combină programarea logică concurentă și programarea logică de constrângere, folosind constrângeri pentru a controla concurența. O clauză poate conține o gardă, care este un set de constrângeri care pot bloca aplicabilitatea clauzei. Când gardienii mai multor clauze sunt satisfăcuți, programarea logică de constrângere concurentă face o alegere angajată de a utiliza doar una.

programare logică Inductivăedit

Articol principal: Programarea logică inductivă

programarea logică inductivă este preocupată de generalizarea exemplelor pozitive și negative în contextul cunoștințelor de bază: învățarea automată a programelor logice. Lucrările recente în acest domeniu, combinând programarea logică, învățarea și probabilitatea, au dat naștere noului domeniu de învățare relațională statistică și programare logică inductivă probabilistică.

programare logică de ordin superior

Mai mulți cercetători au extins programarea logică cu caracteristici de programare de ordin superior derivate din logica de ordin superior, cum ar fi variabilele predicate. Astfel de limbi includ extensiile Prolog HiLog și inktiprolog.

programare logică Liniarăedit

programarea logică bazată în logica liniară a dus la proiectarea limbajelor de programare logică care sunt considerabil mai expresive decât cele bazate pe logica clasică. Programele clauzei Horn pot reprezenta doar schimbarea stării prin schimbarea argumentelor în predicate. În programarea logică liniară, se poate utiliza logica liniară ambientală pentru a sprijini schimbarea stării. Unele modele timpurii ale limbajelor de programare logică bazate pe logica liniară includ LO , Lolli, ACL, și Forum . Forumul oferă o interpretare orientată spre obiectiv a tuturor logicii liniare.

programare logică orientată pe Obiectedit

f-logic extinde programarea logică cu obiecte și sintaxa cadrului.

Logtalk extinde limbajul de programare Prolog cu suport pentru obiecte, protocoale și alte concepte OOP. Aceasta susține cele mai multe sisteme prolog conforme cu standardul ca compilatoare backend.

Transaction logic programmingEdit

Transaction logic este o extensie a programării logice cu o teorie logică a actualizărilor care Modifică starea. Are atât o semantică model-teoretică, cât și una procedurală. O implementare a unui subset de logică a tranzacțiilor este disponibilă în sistemul Flora-2. Sunt disponibile și alte prototipuri.

Lasă un răspuns

Adresa ta de email nu va fi publicată.