PrologEdit
Programmeringsspråket Prolog ble utviklet i 1972 av Alain Colmerauer. Det oppsto fra et samarbeid Mellom Colmerauer I Marseille og Robert Kowalski I Edinburgh. Colmerauer jobbet med naturlig språkforståelse, ved hjelp av logikk for å representere semantikk og bruke oppløsning for å svare på spørsmål. I løpet av sommeren 1971 oppdaget Colmerauer Og Kowalski at den klausale formen for logikk kunne brukes til å representere formelle grammatikker, og at løsningsteoremprovers kunne brukes til parsing. De observerte at noen teoremprovers, som hyper-resolution, oppfører seg som bottom-up-parsere og andre, som SL-resolution (1971), oppfører seg som top-down-parsere.det var sommeren 1972 At Kowalski, igjen i Samarbeid Med Colmerauer, utviklet den prosessuelle tolkningen av implikasjoner. Denne doble deklarative / prosessuelle tolkningen ble senere formalisert i Prolog-notasjonen
H: – B1,…, Bn.
som kan leses (og brukes) både deklarativt og prosedyremessig. Det ble også klart at slike klausuler kan være begrenset til bestemte klausuler eller Horn klausuler, Hvor H, B1,…, Bn er alle atompredikatlogiske formler, og AT SL-oppløsning kan begrenses (og generaliseres) TIL LUSH eller SLD-oppløsning. Kowalskis prosedyretolkning og LUSH ble beskrevet i et memo fra 1973, utgitt i 1974.Colmerauer, Med Philippe Roussel, brukte denne doble tolkningen av klausuler som grunnlag For Prolog, som ble implementert sommeren og høsten 1972. Det første Prolog-programmet, også skrevet i 1972 og implementert I Marseille, var et fransk spørsmålssvarssystem. Bruken Av Prolog som et praktisk programmeringsspråk ble gitt stor fart ved utviklingen Av en kompilator Av David Warren I Edinburgh i 1977. Eksperimenter viste At Edinburgh Prolog kunne konkurrere med prosesseringshastigheten til andre symbolske programmeringsspråk som Lisp. Edinburgh Prolog ble de facto standard og sterkt påvirket definisjonen AV ISO standard Prolog.
abductive logic programmingEdit
Abductive logic programming er en utvidelse av normal Logikk Programmering som gjør at noen predikater, erklært som abducible predikater, å være «åpen» eller udefinert. En klausul i et bortførende logisk program har formen:
H: – B1,…, Bn, A1,…, An. Hvor H Er en atomformel som ikke er abducible, er Alle Bi bokstavelige hvis predikater ikke er abducible, Og Ai er atomformler hvis predikater er abducible. De abducible predikatene kan begrenses av integritetsbegrensninger, som kan ha formen: false: – L1,…, Ln. Hvor Li er vilkårlig bokstav (definert eller abducible, og atomic eller negated). For eksempel:
canfly(X) :- bird(X), normal(X).false :- normal(X), wounded(X).bird(john).bird(mary).wounded(john).
hvor predikatet normal er abducible.
Problemløsning oppnås ved å utlede hypoteser uttrykt i form av abducible predikater som løsninger på problemer som skal løses. Disse problemene kan enten være observasjoner som må forklares (som i klassisk abduktiv resonnement) eller mål som skal løses (som i normal logisk programmering). For eksempel forklarer hypotesen normal (mary) observasjonen canfly (mary). Videre innebærer den samme hypotesen Den eneste løsningen X = mary av målet om å finne noe som kan fly:
:- canfly(X).
Abduktiv logisk programmering har blitt brukt til feildiagnose, planlegging, naturlig språkbehandling og maskinlæring. Det har også blitt brukt til å tolke Negasjon Som Fiasko som en form for bortførende resonnement.
metalogic programmingEdit
fordi matematisk logikk har en lang tradisjon for å skille mellom objektspråk og metalspråk, tillater logisk programmering også metalevel programmering. Det enkleste metalogiske programmet er den såkalte «vanilla» meta-tolken:
solve(true). solve((A,B)):- solve(A),solve(B). solve(A):- clause(A,B),solve(B).
hvor true representerer en tom sammenheng, og klausul (A,b) betyr at det er en objektnivåklausul i formA:-b.
Metalogisk programmering tillater objektnivå – og metalevel-representasjoner å bli kombinert, som i naturlig språk. Den kan også brukes til å implementere noen logikk som er angitt som slutnings regler. Metalogic brukes i logisk programmering for å implementere metaprogrammer, som manipulerer andre programmer, databaser, kunnskapsbaser eller aksiomatiske teorier som data.
Begrensning logikk programmingEdit
Begrensning logikk programmering kombinerer Horn klausul logikk programmering med begrensning løse. Det utvider Hornklausuler ved å tillate noen predikater, erklært som begrensningspredikater, å forekomme som bokstavelige i klausulenes kropp. Et begrensningslogikkprogram er et sett med klausuler i skjemaet:
H: – C1,…, Cn ◊ B1,…, Bn.
Hvor H og Alle Bi er atomformler, Og Ci er begrensninger. Deklarativt leses slike klausuler som vanlige logiske implikasjoner:
h hvis C1 og … og Cn Og B1 og … Og Bn. mens predikatene i klausulenes hoder er definert av begrensningslogikkprogrammet, er predikatene i begrensningene forhåndsdefinert av en domenespesifikk modellteoretisk struktur eller teori.
Prosedyremessig løses delmål hvis predikater defineres av programmet ved målreduksjon, som i vanlig logisk programmering, men begrensninger kontrolleres for satisfiability av en domenespesifikk begrensning-løser, som implementerer semantikken til begrensningspredikatene. Et innledende problem løses ved å redusere det til en tilfredsstillende sammenheng av begrensninger.
følgende begrensningslogikkprogram representerer en toy temporal database av 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 ≤ og < er begrensningspredikater, med deres vanlige tilsiktede semantikk. Følgende målklausul spør databasen for å finne ut når john både lærte logikk og var professor:
: – lærer(john, logic, T), rang(john, professor, T).
løsningen er 2010 ≤ T, t ≤ 2012.Begrensningslogikkprogrammering har blitt brukt til å løse problemer innen områder som sivilingeniør, maskinteknikk, digital kretsbekreftelse, automatisert tidsplanlegging, flytrafikkontroll og økonomi. Det er nært knyttet til abductive logikk programmering.
Samtidig logikkprogrammeringrediger
sammenhengen G1,… , Gn kalles vakt av klausulen, og / er forpliktelsesoperatøren. Deklarativt er bevoktede Hornklausuler lest som vanlige logiske implikasjoner:
h hvis G1 og … og Gn Og B1 og … og Bn. men prosedyremessig, når det er flere klausuler hvis hoder H samsvarer med et gitt mål, blir alle klausulene utført parallelt, og kontrollerer om deres vakter G1,… , Gn hold. Hvis vaktene på mer enn en klausul holder, blir det gjort et forpliktet valg til en av klausulene, og utførelsen fortsetter med delmålene B1, …, Bn av den valgte klausulen. Disse delmålene kan også utføres parallelt. Dermed implementerer samtidig logisk programmering en form for «ikke bryr seg om nondeterminisme», i stedet for «vet ikke nondeterminisme».for eksempel definerer følgende samtidige logikkprogram en predikat shuffle ( Venstre, Høyre, Merge), som kan brukes til å blande to lister Til Venstre og Høyre, kombinere dem til en enkelt listefusjon som bevarer rekkefølgen av de to lister Til Venstre Og Høyre:
shuffle(, , ).shuffle(Left, Right, Merge) :- Left = | Merge = , shuffle(Rest, Right, ShortMerge).shuffle(Left, Right, Merge) :- Right = | Merge = , shuffle(Left, Rest, ShortMerge).
her representerer den tomme listen, og representerer en liste med første elementhodet etterfulgt av listehale, som I Prolog. (Legg merke til at den første forekomsten av / i andre og tredje klausuler er listekonstruktøren, mens den andre forekomsten av / er forpliktelsesoperatøren.) Programmet kan for eksempel brukes til å blande lister og ved å påkalle målklausulen:
shuffle(, , Merge).
programmet vil ikke-deterministisk generere en enkelt løsning, for eksempel Merge = .samtidig logikk programmering er Basert på melding passerer, så det er underlagt den samme indeterminacy som andre samtidige melding passerer systemer, Slik Som Aktører (se Indeterminacy i samtidig beregning). Carl Hewitt har hevdet at samtidig logisk programmering ikke er basert på logikk i hans forstand at beregningstrinn ikke kan logisk utledes. Imidlertid er et hvilket som helst resultat av en avsluttende beregning en logisk konsekvens av programmet, og et hvilket som helst delvis resultat av en delvis beregning er en logisk konsekvens av programmet og gjenværende mål (prosessnettverk). Dermed innebærer ubestemmelsen av beregninger at ikke alle logiske konsekvenser av programmet kan utledes.
Programmerenderediger
Induktiv logisk programmeringrediger
programmering av høyere ordens logikk
Flere forskere har utvidet logisk programmering med høyere ordens programmeringsfunksjoner avledet fra høyere ordens logikk, for eksempel predikatvariabler. Slike språk inkluderer Prolog-utvidelsene HiLog og λ.
Linear logic programmingEdit
Basere logikk programmering innenfor lineær logikk har resultert i utformingen av logikk programmeringsspråk som er betydelig mer uttrykksfulle enn de som er basert på klassisk logikk. Horn-klausulprogrammer kan bare representere tilstandsendring ved endring i argumenter til predikater. I lineær logikkprogrammering kan man bruke den omgivende lineære logikken til å støtte tilstandsendring. Noen tidlige design av logiske programmeringsspråk basert på lineær logikk inkluderer LO, LOLLI, ACL og Forum . Forum gir en målrettet tolkning av all lineær logikk.
Objektorientert logikkprogrammeringrediger
F-logikk utvider logisk programmering med objekter og rammesyntaks.Logtalk utvider Programmeringsspråket Prolog med støtte for objekter, protokoller og andre oop-konsepter. Den støtter de fleste Standard-kompatible Prolog systemer som backend kompilatorer.transaksjonslogikk Er en utvidelse av logisk programmering med en logisk teori om tilstandsmodifiserende oppdateringer. Den har både en modellteoretisk semantikk og en prosessuell. En implementering av Et delsett Av Transaksjonslogikk er tilgjengelig I Flora – 2-systemet. Andre prototyper er også tilgjengelige.