PrologEdit
programmeringssproget Prolog blev udviklet i 1972 af Alain Colmerauer. Det fremgår af et samarbejde mellem Colmerauer i Marseille og Robert Kovalski i Edinburgh. Colmerauer arbejdede på naturlig sprogforståelse, ved hjælp af logik til at repræsentere semantik og ved hjælp af opløsning til spørgsmålssvar. I løbet af sommeren 1971 opdagede Colmerauer og Kovalski, at den clausale form for logik kunne bruges til at repræsentere formelle grammatikker, og at opløsningssætninger kunne bruges til parsing. De observerede, at nogle teorembevisere, som hyper-resolution, opfører sig som bottom-up parsere og andre, som SL-resolution (1971), opfører sig som top-ned parsere.
det var i den følgende sommer 1972, at Kovalski, der igen arbejdede med Colmerauer, udviklede den proceduremæssige fortolkning af implikationer. Denne dobbelte deklarative / proceduremæssige fortolkning blev senere formaliseret i Prolog notationen
H: – B1, …, Bn.
som kan læses (og bruges) både deklarativt og proceduremæssigt. Det blev også klart, at sådanne klausuler kunne begrænses til bestemte klausuler eller Hornklausuler, hvor H, B1,…, Bn er alle atomiske prædikatlogiske formler, og at SL-opløsning kunne begrænses (og generaliseres) til LUSH eller SLD-opløsning. Kovalskis proceduremæssige fortolkning og LUSH blev beskrevet i et notat fra 1973, der blev offentliggjort i 1974.
Colmerauer, med Philippe Roussel, brugte denne dobbelte fortolkning af klausuler som grundlag for Prolog, som blev implementeret i sommeren og efteråret 1972. Det første Prolog-program, der også blev skrevet i 1972 og implementeret i Marseille, var et fransk spørgsmålssvaresystem. Brugen af Prolog som et praktisk programmeringssprog fik stor fart ved udviklingen af en kompilator af David Varren i Edinburgh i 1977. Eksperimenter viste, at Edinburgh Prolog kunne konkurrere med behandlingshastigheden for andre symbolske programmeringssprog såsom Lisp. Edinburgh Prolog blev de facto standard og stærkt påvirket definitionen af ISO standard Prolog.
Abduktiv logikprogrammeringredit
Abduktiv logikprogrammering er en udvidelse af normal Logikprogrammering, der gør det muligt for nogle prædikater, der er erklæret som bortførelige prædikater, at være “åbne” eller udefinerede. En klausul i et abduktivt logikprogram har formen:
H :- B1, …, Bn, A1, …, An.
hvor H er en atomformel, der ikke kan bortføres, er alle Bi bogstavelige, hvis predikater ikke er bortførelige, og Ai er atomformler, hvis predikater er bortførelige. De bortførelige prædikater kan begrænses af integritetsbegrænsninger, som kan have formen:
falsk :- L1,…, Ln.
hvor Li er vilkårlige bogstaver (defineret eller bortførelig og atomisk eller negeret). For eksempel:
canfly(X) :- bird(X), normal(X).false :- normal(X), wounded(X).bird(john).bird(mary).wounded(john).
hvor prædikatet normalt er bortføreligt.
problemløsning opnås ved at udlede hypoteser udtrykt i form af de bortførelige prædikater som løsninger på problemer, der skal løses. Disse problemer kan enten være observationer, der skal forklares (som i klassisk bortførende ræsonnement) eller mål, der skal løses (som i normal logisk programmering). For eksempel forklarer hypotesen normal(mary) observationen canfly(mary).
:- canfly(X).
Abductive logic programmering er blevet brugt til fejldiagnose, planlægning, naturlig sprogbehandling og maskinindlæring. Det er også blevet brugt til at fortolke Negation som fiasko som en form for bortførende ræsonnement.
Metalogic programmingEdit
da matematisk logik har en lang tradition for at skelne mellem objektsprog og metalsprog, tillader logisk programmering også metalevel-programmering. Det enkleste metalogic-program er den såkaldte “vanilje” metatolk:
solve(true). solve((A,B)):- solve(A),solve(B). solve(A):- clause(A,B),solve(B).
hvor true repræsenterer en tom sammenhæng, og klausul(A,B) betyder, at der er en klausul på objektniveau i formA:-B.
Metalogic programmering gør det muligt at kombinere objektniveau-og metalniveau-repræsentationer, som på naturligt sprog. Det kan også bruges til at implementere enhver logik, der er specificeret som slutningsregler. Metalogic bruges i logisk programmering til at implementere metaprogrammer, der manipulerer andre programmer, databaser, vidensbaser eller aksiomatiske teorier som data.
Constraint logic programmingEdit
Constraint logic programming kombinerer Horn klausul logik programmering med begrænsning løsning. Det udvider Hornklausuler ved at tillade nogle prædikater, erklæret som begrænsningsprædikater, at forekomme som bogstav i klausulernes krop. Et begrænsningslogikprogram er et sæt klausuler i formularen:
H :- C1, …, CN Kurt B1, …, Bn.
hvor H og alle Bi er atomformler, og Ci er begrænsninger. Deklarativt læses sådanne klausuler som almindelige logiske implikationer:
H if C1 og … og Cn og B1 og … og Bn.
men mens prædikaterne i hovederne af klausuler er defineret af constraint logic-programmet, er prædikaterne i begrænsningerne foruddefineret af en eller anden domænespecifik modelteoretisk struktur eller teori.proceduremæssigt løses undermål, hvis prædikater er defineret af programmet, ved målreduktion, som i almindelig logisk programmering, men begrænsninger kontrolleres for tilfredsstillelse af en domænespecifik begrænsningsløser, der implementerer semantikken i begrænsningsprædikaterne. Et indledende problem løses ved at reducere det til en tilfredsstillende sammenhæng med begrænsninger.
følgende begrænsningslogikprogram repræsenterer en legetøjstidsdatabase over Johns historie som lærer:
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.
Her er Kurt og < begrænsningsprædikater med deres sædvanlige tilsigtede semantik. Følgende målklausul spørger databasen for at finde ud af, hvornår john både underviste i logik og var professor:
:- underviser(john, logic, T), rang(john, professor, T).
løsningen er 2010 ir T, ir 2012.
Constraint logic programmering er blevet brugt til at løse problemer inden for områder som civilingeniør, Maskinteknik, verifikation af digitalt kredsløb, automatiseret køreplanlægning, flyvekontrol og finansiering. Det er tæt forbundet med abduktiv logik programmering.
samtidig logikprogrammeringredit
samtidig logikprogrammering integrerer koncepter for logisk programmering med samtidig programmering. Dens udvikling fik en stor drivkraft i 1980 ‘ erne ved sit valg til systemprogrammeringssproget i det japanske femte Generationsprojekt (FGCS).
et samtidig logikprogram er et sæt bevogtede Hornklausuler i formularen: H :- G1, …, Gn / B1, …, Bn.
sammenhængen G1,… , Gn kaldes vagt for klausulen, og / er forpligtelsesoperatøren. Deklarativt læses beskyttede Hornklausuler som almindelige logiske implikationer:
H hvis G1 og … og Gn og B1 og … og Bn.
imidlertid, proceduremæssigt, når der er flere klausuler, hvis hoveder h matcher et givet mål, derefter udføres alle klausulerne parallelt, kontrollere, om deres vagter G1,… , Gn hold. Hvis vagterne i mere end en klausul holder, derefter foretages et engageret valg til en af klausulerne, og henrettelsen fortsætter med undermålene B1, …, Bn af den valgte klausul. Disse undermål kan også udføres parallelt. Således implementerer samtidig logisk programmering en form for “ligeglad med ikke-determinisme” snarere end “kender ikke ikke-determinisme”.
for eksempel definerer følgende samtidige logikprogram en prædikatblanding(Venstre, højre, fletning), som kan bruges til at blande to lister til venstre og højre og kombinere dem i en enkelt Listefletning, der bevarer rækkefølgen af de to lister til venstre og højre:
shuffle(, , ).shuffle(Left, Right, Merge) :- Left = | Merge = , shuffle(Rest, Right, ShortMerge).shuffle(Left, Right, Merge) :- Right = | Merge = , shuffle(Left, Rest, ShortMerge).
Her repræsenterer den tomme liste og repræsenterer en liste med første elementhoved efterfulgt af listehale, som i Prolog. (Bemærk, at den første forekomst af | i anden og tredje klausul er listekonstruktøren, mens den anden forekomst af | er forpligtelsesoperatøren. Bruges til at blande listerne og ved at påberåbe sig målklausulen:
shuffle(, , Merge).
programmet vil ikke-deterministisk generere en enkelt løsning, for eksempel Merge = .
formentlig er samtidig logisk programmering baseret på meddelelsesoverføring, så den er underlagt den samme ubestemmelighed som andre samtidige meddelelsesovergangssystemer, såsom skuespillere (se ubestemmelighed i samtidig beregning). Carl Hevitt har hævdet, at samtidig logisk programmering ikke er baseret på logik i hans forstand, at beregningstrin ikke logisk kan udledes. I samtidig logisk programmering er ethvert resultat af en afsluttende beregning imidlertid en logisk konsekvens af programmet, og ethvert delvist resultat af en delvis beregning er en logisk konsekvens af programmet og det resterende mål (procesnetværk). Således indebærer ubestemmeligheden af beregninger, at ikke alle logiske konsekvenser af programmet kan udledes.
samtidig begrænsning logik programmeringrediger
samtidig begrænsningslogikprogrammering kombinerer samtidig logisk programmering og begrænsningslogikprogrammering ved hjælp af begrænsninger til at kontrollere samtidighed. En klausul kan indeholde en vagt, som er et sæt begrænsninger, der kan blokere anvendeligheden af klausulen. Når vagterne i flere klausuler er opfyldt, foretager samtidig begrænsningslogikprogrammering et engageret valg om kun at bruge en.
Induktiv logikprogrammeringrediger
Induktiv logikprogrammering beskæftiger sig med generalisering af positive og negative eksempler i sammenhæng med baggrundsviden: maskinindlæring af logiske programmer. Nyligt arbejde på dette område, der kombinerer logisk programmering, læring og sandsynlighed, har givet anledning til det nye felt for statistisk relationel læring og probabilistisk induktiv logikprogrammering.
højere ordens logik programmeringredit
flere forskere har udvidet logisk programmering med højere ordens programmeringsfunktioner afledt af højere ordens logik, såsom prædikatvariabler. Sådanne sprog inkluderer Prolog-udvidelserne HiLog og prisprolog.
lineær logikprogrammeringredit
basering af logisk programmering inden for lineær logik har resulteret i design af logiske programmeringssprog, der er betydeligt mere udtryksfulde end dem, der er baseret på klassisk logik. Hornklausulprogrammer kan kun repræsentere tilstandsændring ved ændringen i argumenter til prædikater. I lineær logisk programmering kan man bruge den omgivende lineære logik til at understøtte tilstandsændring. Nogle tidlige design af logiske programmeringssprog baseret på lineær logik inkluderer LO , Lolli, ACL og Forum . Forum giver en målrettet fortolkning af al lineær logik.
objektorienteret logikprogrammeringredit
F-logic udvider logikprogrammering med objekter og rammesyntaks.
Logtalk udvider prolog programmeringssprog med understøttelse af objekter, protokoller og andre OOP begreber. Det understøtter de fleste standard-kompatible Prolog systemer som backend compilere.
Transaktionslogik programmeringredit
Transaktionslogik er en udvidelse af logisk programmering med en logisk teori om tilstandsmodificerende opdateringer. Det har både en model-teoretisk semantik og en proceduremæssig. En implementering af en delmængde af Transaktionslogik er tilgængelig i Flora-2-systemet. Andre prototyper er også tilgængelige.