Narzędzia użytkownika

Narzędzia witryny


notatki:prolog

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Nowa wersja
Poprzednia wersja
notatki:prolog [2025/05/13 22:01] – utworzono administratornotatki:prolog [2025/05/14 09:21] (aktualna) administrator
Linia 1: Linia 1:
-====== Prolog ======+====== Prolog: Podstawy programowania logicznego ====== 
 +===== Programy do uruchomienia Prologa ===== 
 + 
 +  * https://wiki.ostrowski.net.pl/prolog/ na bazie https://tau-prolog.org/ 
 +  * https://swish.swi-prolog.org/ 
 + 
 +====== Wstęp ====== 
 + 
 +Prolog (Programming in Logic) to jeden z najstarszych i najbardziej znanych języków programowania deklaratywnego. Został stworzony w latach 70-tych XX wieku przez Alaina Colmeraura i Phillipa Rousselota. Jest to język, w którym programista opisuje problem w postaci faktów, reguł i zapytań, a system komputerowy samodzielnie wyciąga wnioski i szuka rozwiązań. 
 + 
 +====== Zastosowania Prologa ====== 
 + 
 +Prolog jest szeroko stosowany w dziedzinach, które wymagają rozwiązywania problemów logicznych, takich jak: 
 +  * Sztuczna inteligencja (AI): Prolog jest używany do tworzenia systemów eksperckich, systemów wnioskowania i robotyki, gdzie konieczne jest podejmowanie decyzji na podstawie dostępnych danych. 
 +  * Analiza i przetwarzanie języka naturalnego: Prolog znajduje zastosowanie w przetwarzaniu języka naturalnego (NLP), ponieważ potrafi analizować i przetwarzać struktury językowe. 
 +  * Bazy danych: Prolog może być używany do tworzenia baz danych i systemów wyszukiwania, w których relacje między danymi są wyrażone za pomocą faktów i reguł. 
 +  * Rozwiązywanie problemów matematycznych: Dzięki swojej logice, Prolog jest wykorzystywany do rozwiązywania problemów związanych z teorią grafów, szukaniem ścieżek, algorytmami planowania i innymi problemami kombinatorycznymi. 
  
-Proste IDE prolog: https://wiki.ostrowski.net.pl/prolog/ 
-Trzeba wykonywać jedno zapytanie na raz. 
  
 ====== Drzewo Genealogiczne ====== ====== Drzewo Genealogiczne ======
 +<WRAP right round tip 50%>
 +
 +To jest fakt w Prologu, który opisuje relację "rodzic". W tym przypadku:
 +<code prolog>
 +rodzic(jozef,jacek) oznacza, że Józef jest rodzicem Jacka.
 +</code>
 +Fakty w Prologu są podstawowymi stwierdzeniami, które są uznawane za prawdziwe. Każdy fakt składa się z predykatu (np. rodzic) i argumentów (np. jozef i jacek), które stanowią dane związane z tym predykatem.
 +</WRAP>
 +<WRAP right round tip 50%>
 +
 +W Prologu ''\+'' oznacza negację. Jest to operator, który sprawdza, czy wyrażenie jest fałszywe. Możesz to rozumieć jako zapytanie "Czy to nie jest prawda?". Operator ''\+'' działa jak negacja logiczna w innych językach programowania.
 +
 +Przykład użycia negacji:
 +<code prolog>
 +\+ rodzic(jozef, jacek).
 +</code>
 +To zapytanie sprawdza, czy Józef nie jest rodzicem Jacka. Jeśli fakt rodzic(jozef, jacek) nie jest zapisany w bazie danych, wynik będzie prawda (ponieważ negacja fałszywego stwierdzenia daje prawdę). Jeśli taki fakt istnieje, wynik będzie fałsz.
 +
 +Negacja w Prologu działa w następujący sposób:
 +  * ''\+ A'' będzie prawdą, jeśli A jest fałszywe.
 +  * ''\+ A'' będzie fałszem, jeśli A jest prawdą.
 +
 +Przykłady:
 +  * Jeśli mamy fakt ''rodzic(jozef, jacek)'', zapytanie ''\+ rodzic(jozef, jacek).'' zwróci fałsz.
 +  * Jeśli mamy zapytanie ''\+ rodzic(krzysztof, jacek).'' (które nie jest zapisane jako fakt w bazie), to zwróci prawdę.
 +
 +</WRAP>
 +
  
 Predykaty i reguły: Predykaty i reguły:
Linia 81: Linia 124:
 wnuk(X,Y) :- dziecko(D,Y), dziecko(X,D). wnuk(X,Y) :- dziecko(D,Y), dziecko(X,D).
  
-rodzeństwo_n(X,Y) :- matka(M,Y), matka(M,X), ojciec(O,Y), ojciec(O,X), X \= Y.+rodzeństwo_n(X,Y) :-  
 +  matka(M,Y),  
 +  matka(M,X), 
 +  ojciec(O,Y), 
 +  ojciec(O,X), X \= Y.
  
-rodzeństwo_p(X,Y) :- matka(M,Y), matka(M,X), ojciec(O1,Y), ojciec(O2,X), X \= Y, O1 \= O2.+rodzeństwo_p(X,Y) :-  
 +  matka(M,Y),  
 +  matka(M,X),  
 +  ojciec(O1,Y),  
 +  ojciec(O2,X),  
 +  X \= Y,  
 +  O1 \= O2.
  
-rodzeństwo_p(X,Y) :- matka(M1,Y), matka(M2,X), ojciec(O,Y), ojciec(O,X), X \= Y, M1 \= M2.+rodzeństwo_p(X,Y) :-  
 +  matka(M1,Y),  
 +  matka(M2,X),  
 +  ojciec(O,Y),  
 +  ojciec(O,X),  
 +  X \= Y,  
 +  M1 \= M2.
  
-rodzeństwo(X,Y) :- rodzeństwo_n(X,Y); rodzeństwo_p(X,Y).+rodzeństwo(X,Y) :-  
 +  rodzeństwo_n(X,Y);  
 +  rodzeństwo_p(X,Y).
  
 siostra(X,Y) :- rodzeństwo(X,Y), kobieta(X). siostra(X,Y) :- rodzeństwo(X,Y), kobieta(X).
 brat(X,Y) :- rodzeńśtwo(X,Y), mężczyzna(X). brat(X,Y) :- rodzeńśtwo(X,Y), mężczyzna(X).
  
-mąż(X,Y) :- mężczyzna(Y), małżeństwo(X,Y), kobieta(Y). +mąż(X,Y) :-  
-żona(X,Y) :- kobieta(X), małżeństwo(X,Y), mężczyzna(Y).+  mężczyzna(Y),  
 +  małżeństwo(X,Y),  
 +  kobieta(Y). 
 + 
 +żona(X,Y) :-  
 +  kobieta(X),  
 +  małżeństwo(X,Y),  
 +  mężczyzna(Y).
 </code> </code>
  
Linia 167: Linia 235:
  
 ====== Zagadka kryminalna ====== ====== Zagadka kryminalna ======
 +<WRAP right round tip 50%>
 +W Prologu ''\='' oznacza nierówność.\\
 +To jest operator porównania, który sprawdza, czy dwie wartości (lub zmienne) są różne.\\ 
 +W tym przypadku:\\
 +''X \= O'' oznacza, że ''X'' jest różne od ''O''.
 +</WRAP>
 +<WRAP right round tip 50%>
 +W Prologu ''_'' jest tzw. anonimową zmienną. Oznacza to, że nie interesuje nas wartość tej zmiennej i nie będziemy jej używać w dalszej części programu. Prolog przyjmuje ją, ale nie przypisuje jej żadnej konkretnej wartości.
  
 +W Prologu możesz używać ''_,'' gdy nie zależy ci na wynikach tej zmiennej, np. w przypadku:
 +
 +<code prolog>
 +motyw(X, zazdrość) :-
 +    kobieta(X),
 +    zamordowana(O),
 +    romans(O, M),
 +    romans(X, M),
 +    X \= O.
 +</code>
 +W przypadku powyższym, zmienna M w regule romans(O, M) jest używana, ponieważ sprawdzamy romans między O a M, ale jeśli w innym przypadku nie chcemy używać jakiejś zmiennej, zapisujemy ją jako ''_'':
 +<code prolog>
 +romans(_, _). % przykładowy zapis, który oznacza, że nie zależy nam na wartościach
 +</code>
 +To mówi Prologowi: „Przyjmij wszystkie możliwe wartości, ale nie będziemy ich używać ani sprawdzać”.
 +
 +Zatem ''_'' pełni rolę zmiennej, której wartości nie będziemy wykorzystywać w dalszej logice.
 +</WRAP>
 +Predykaty i reguły:
 <code prolog> <code prolog>
 % Fakty % Fakty
Linia 261: Linia 356:
     motyw(X, M).     motyw(X, M).
 </code> </code>
 +
 +
 +
  
 Odpowiedz na pytania: Odpowiedz na pytania:
notatki/prolog.1747166466.txt.gz · ostatnio zmienione: 2025/05/13 22:01 przez administrator