Programowanie logiczne

PrologEdit

artykuł główny: Prolog

język programowania Prolog został opracowany w 1972 roku przez Alaina Colmerauera. Powstał w wyniku współpracy Colmerauera z Marsylii i Roberta Kowalskiego z Edynburga. Colmerauer pracował nad rozumieniem języka naturalnego, używając logiki do reprezentowania semantyki i używając rozdzielczości do odpowiadania na pytania. Latem 1971 roku Colmerauer i Kowalski odkryli, że clausalna forma logiki może być używana do reprezentowania formalnych gramatyk, a do parsowania można użyć twierdzeń o rozdzielczości. Zauważyli, że niektóre twierdzenia, takie jak hyper-resolution, zachowują się jak oddolne parsery, a inne, takie jak SL-resolution (1971), zachowują się jak parsery odgórne.

To właśnie latem 1972 roku Kowalski, ponownie współpracując z Colmerauerem, opracował proceduralną interpretację implikacji. Ta Podwójna deklaratywno-proceduralna interpretacja została później sformalizowana w notacji Prolog

h :- B1, …, Bn.

, które mogą być odczytywane (i używane) zarówno deklaratywnie, jak i proceduralnie. Stało się również jasne, że takie klauzule mogą być ograniczone do klauzul określonych lub klauzul rogowych, gdzie H, B1,…, Bn to wszystkie atomowe formuły predykatów logicznych i że rozdzielczość SL może być ograniczona (i uogólniona)do LUSH lub SLD-resolution. Interpretacja proceduralna Kowalskiego i LUSZA zostały opisane w notatce z 1973 roku, opublikowanej w 1974 roku.

Colmerauer wraz z Philippe ’ em Rousselem zastosował tę podwójną interpretację klauzul jako podstawę prologu, który został wdrożony latem i jesienią 1972 roku. Pierwszy program Prolog, również napisany w 1972 roku i wdrożony w Marsylii, był francuskim systemem odpowiedzi na pytania. Użycie Prolog jako praktycznego języka programowania nabrało Wielkiego rozmachu dzięki opracowaniu kompilatora przez Davida Warrena w Edynburgu w 1977 roku. Eksperymenty wykazały, że Edinburgh Prolog może konkurować z szybkością przetwarzania innych symbolicznych języków programowania, takich jak Lisp. Prolog stał się de facto standardem i silnie wpłynął na definicję standardu ISO Prolog.

Programowanie logiki Uprowadzeniowejedit

Programowanie logiki Uprowadzeniowej jest rozszerzeniem normalnego programowania logicznego, które pozwala niektórym predykatom, deklarowanym jako predykaty uprowadzalne, być „otwartym” lub niezdefiniowanym. Klauzula w programie logicznym ma postać:

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

Gdzie H jest formułą atomową, która nie jest uprowadzalna, wszystkie Bi są literałami, których predykaty nie są uprowadzalne, a Ai są formułami atomowymi, których predykaty są uprowadzalne. Predykaty mogą być ograniczone przez ograniczenia integralności, które mogą mieć postać:

false: – L1,…, Ln.

Gdzie Li są dowolnymi literałami (definiowanymi lub negowanymi, a atomowymi lub negowanymi). Na przykład:

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

gdzie predykat normalny jest prawidłowy.

rozwiązywanie problemów osiąga się poprzez wyprowadzanie hipotez wyrażonych w kategoriach predykatów jako rozwiązań problemów do rozwiązania. Problemy te mogą być albo obserwacjami, które należy wyjaśnić (jak w klasycznym rozumowaniu uprowadzającym), albo celami do rozwiązania (jak w normalnym programowaniu logicznym). Na przykład hipoteza normalna (mary) wyjaśnia obserwację canfly (mary). Co więcej, Ta sama hipoteza wiąże się z jedynym rozwiązaniem X = mary celu znalezienia czegoś, co może latać:

:- canfly(X).

Programowanie logiczne było wykorzystywane do diagnozowania błędów, planowania, przetwarzania języka naturalnego i uczenia maszynowego. Używano go również do interpretacji negacji jako niepowodzenia jako formy rozumowania uprowadzającego.

programowanie Metalogiczneedit

ponieważ logika matematyczna ma długą tradycję rozróżniania między językiem obiektowym a metajęzykiem, programowanie logiczne umożliwia również programowanie metajęzykowe. Najprostszym programem metalogic jest tzw. meta-interpreter „vanilla”:

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

gdzie true oznacza pustą koniunkcję, a klauzula(A,B) oznacza, że istnieje klauzula obiektowa formy:-B.

programowanie Metalogic umożliwia łączenie reprezentacji na poziomie obiektowym i metalevel, tak jak w języku naturalnym. Może być również używany do implementacji dowolnej logiki, która jest określona jako reguły wnioskowania. Metalogic jest używany w programowaniu logicznym do implementacji metaprogramów, które manipulują innymi programami, bazami danych, bazami wiedzy lub teoriami aksjomatycznymi jako danymi.

programowanie logiki Ograniczeniaedit

Główny artykuł: Programowanie logiki ograniczeń

Programowanie logiki ograniczeń łączy programowanie logiki klauzuli Horn z rozwiązywaniem ograniczeń. Rozszerza klauzule Horna, pozwalając niektórym predykatom, deklarowanym jako predykaty ograniczające, występować jako literały w ciele klauzul. Program constraint logic jest zbiorem klauzul w postaci:

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

Gdzie h i wszystkie Bi są wzorami atomowymi, a Ci są ograniczeniami . Deklaratywnie takie klauzule są odczytywane jako zwykłe implikacje logiczne:

H jeśli C1 I … oraz Cn i B1 i … I Bn.

jednak, podczas gdy predykaty w głowach klauzul są zdefiniowane przez program logiki ograniczeń, predykaty w ograniczeniach są predefiniowane przez jakąś specyficzną dla danej dziedziny strukturę lub teorię modelowo-teoretyczną.

proceduralnie, podzbiory, których predykaty są zdefiniowane przez program, są rozwiązywane przez redukcję celu, jak w zwykłym programowaniu logicznym, ale ograniczenia są sprawdzane pod kątem satysfakcji przez specyficzny dla danej dziedziny constraint-solver, który implementuje semantykę predykatów constraint. Początkowy problem rozwiązuje się, redukując go do zadowalającej koniunkcji ograniczeń.

poniższy program constraint logic przedstawia zabawkową bazę danych historii Jana jako nauczyciela:

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.

tutaj ≤ i< są predykatami ograniczeń, z ich Zwykle zamierzoną semantyką. Następująca klauzula celu zapytuje bazę danych, aby dowiedzieć się, kiedy john zarówno nauczał logiki, jak i był profesorem:

: – teaches(john, logic, T), rank(john, professor, T).

rozwiązaniem jest 2010 ≤ T, T ≤ 2012 .

Programowanie logiki ograniczeń zostało wykorzystane do rozwiązywania problemów w takich dziedzinach, jak inżynieria lądowa, inżynieria mechaniczna, weryfikacja obwodów cyfrowych, automatyczne harmonogramy, kontrola ruchu lotniczego i finanse. Jest ściśle związany z programowaniem logicznym.

współbieżne programowanie logiczneedit

Główny artykuł: współbieżne programowanie logiczne

współbieżne programowanie logiczne integruje pojęcia programowania logicznego z programowaniem współbieżnym. Jego rozwój dał duży impuls w 1980 roku przez jego wybór na język programowania systemów japońskiego projektu piątej generacji (Fgcs).

program logiczny współbieżny jest zbiorem klauzul o postaci:

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

koniunkcja G1, … , Gn nazywa się strażnikiem klauzuli I / lub operatorem zobowiązania. Deklaratywnie klauzule Horn są odczytywane jako zwykłe implikacje logiczne:

h if G1 and … and Gn and B1 and … and Bn.

jednak proceduralnie, gdy istnieje kilka klauzul, których główki H odpowiadają danemu celowi, to wszystkie klauzule są wykonywane równolegle, sprawdzając czy ich G1, … , Gn hold. Jeśli strażnicy więcej niż jednej klauzuli trzymają, wtedy dokonywany jest wybór jednej z klauzul, a egzekucja następuje z podobszarów B1, …, Bn wybranej klauzuli. Te podgrupy mogą być również wykonywane równolegle. W ten sposób współbieżne programowanie logiczne implementuje formę „don’ t care nondeterminizm”, a nie „don’ t know nondeterminizm”.

na przykład następujący program logiki współbieżnej definiuje predykat shuffle ( Left, Right, Merge), który może być użyty do tasowania dwóch list w lewo i w prawo, łącząc je w jedno Scalanie list, które zachowuje kolejność dwóch list w lewo i w prawo:

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

tutaj reprezentuje pustą listę i reprezentuje listę z nagłówkiem pierwszego elementu, a następnie ogonem listy, jak w prologu. (Zauważ, że pierwsze wystąpienie | w drugiej i trzeciej klauzuli jest konstruktorem listy, podczas gdy drugie wystąpienie | jest operatorem zaangażowania.) Program może być użyty np. do tasowania list i wywołania klauzuli goal:

shuffle(, , Merge).

program niedeterministycznie wygeneruje pojedyncze rozwiązanie, na przykład Merge = .

prawdopodobnie współbieżne programowanie logiczne opiera się na przekazywaniu wiadomości, więc podlega tej samej nieokreśloności, co inne systemy współbieżnego przekazywania wiadomości, takie jak aktorzy (zobacz nieokreśloność w obliczeniach współbieżnych). Carl Hewitt argumentował, że równoległe programowanie logiczne nie opiera się na logice w jego rozumieniu, że kroków obliczeniowych nie można logicznie wydedukować. Jednak w programowaniu logicznym współbieżnym, każdy wynik kończącego obliczenia jest logiczną konsekwencją programu, a każdy częściowy wynik częściowego obliczenia jest logiczną konsekwencją programu i pozostałego celu (sieci procesowej). Tak więc nieokreśloność obliczeń oznacza, że nie wszystkie logiczne konsekwencje programu można wydedukować.

współbieżne programowanie logiki ograniczeniaedit

Główny artykuł: Współbieżne programowanie logiczne ograniczeń

współbieżne programowanie logiczne ograniczeń łączy współbieżne programowanie logiczne i programowanie logiczne ograniczeń, używając ograniczeń do kontrolowania współbieżności. Klauzula może zawierać guard, który jest zbiorem ograniczeń, które mogą blokować stosowanie klauzuli. Gdy strażnicy kilku klauzul są spełnione, współbieżne programowanie logiki ograniczeń podejmuje zdecydowany wybór, aby użyć tylko jednej.

Programowanie logiki Indukcyjnejedit

artykuł główny: Programowanie logiki indukcyjnej

Programowanie logiki indukcyjnej zajmuje się uogólnianiem pozytywnych i negatywnych przykładów w kontekście wiedzy podstawowej: uczenie maszynowe programów logicznych. Ostatnie prace w tej dziedzinie, łączące programowanie logiczne, uczenie się i prawdopodobieństwo, dały początek nowej dziedzinie statystycznego uczenia się relacyjnego i probabilistycznego indukcyjnego programowania logicznego.

Programowanie logiki wyższego rzędu (ang. Higher-order logic programming)

kilku badaczy rozszerzyło programowanie logiczne o funkcje programowania wyższego rzędu pochodzące z logiki wyższego rzędu, takie jak zmienne predykatowe. Do takich języków należą rozszerzenia Prolog HiLog i λProlog.

programowanie logiki Liniowejedit

bazowanie na programowaniu logiki w ramach logiki liniowej zaowocowało opracowaniem logicznych języków programowania, które są znacznie bardziej ekspresyjne niż te oparte na klasycznej logice. Programy klauzuli Horn mogą reprezentować zmianę stanu tylko przez zmianę argumentów na predykaty. W programowaniu logiki liniowej można użyć logiki liniowej otoczenia do obsługi zmiany stanu. Niektóre wczesne projekty logicznych języków programowania opartych na logice liniowej obejmują LO, Lolli, ACL i Forum. Forum zapewnia ukierunkowaną na cel interpretację całej logiki liniowej.

Programowanie Obiektoweedit

f-logic rozszerza programowanie logiczne o obiekty i składnię ramek.

Logtalk rozszerza język programowania Prolog o obsługę obiektów, protokołów i innych koncepcji OOP. Obsługuje większość zgodnych ze standardami systemów Prolog jako Kompilatory zaplecza.

programowanie logiki Transakcyjnejedit

logika transakcyjna jest rozszerzeniem programowania logicznego o logiczną teorię aktualizacji modyfikujących stan. Ma zarówno semantykę modelowo-teoretyczną, jak i proceduralną. Implementacja podzbioru logiki transakcyjnej jest dostępna w systemie Flora-2. Dostępne są również inne prototypy.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.