Podstawy języka PROLOG

Podobne dokumenty
Dariusz Banasiak. Instytut Informatyki, Automatyki i Robotyki. Politechniki Wrocławskiej

Programowanie w logice

Programowanie w logice

Laboratorium przedmiotu Paradygmaty Programowania

PROLOG. Prolog. Programowanie, W.F. Clocksin, C.S. Mellish, HELION Prolog, język sztucznej inteligencji, Eugeniusz Gatnar, Katarzyna Stąpor, Wyd.

PODSTAWY SZTUCZNEJ INTELIGENCJI

Programowanie deklaratywne

Wprowadzenie do Prologa

Programowanie deklaratywne

Deklarowania faktów dotyczących obiektów i związków między nimi. Definiowania reguł dotyczących obiektów i związków między nimi.

Języki programowania deklaratywnego

Prolog (Pro-Logic) Programowanie w Logice. Dr inż. Piotr Urbanek

Programowanie w Logice

Programowanie deklaratywne

Dana jest baza: kobieta(katarzyna). kobieta(anna). kobieta(maria). kobieta(marianna). kobieta(marta). Zdefiniujemy predykat kobiety/0 następująco:

Programowanie w logice Prolog 2

Paradygmaty programowania

Celem ćwiczenia jest zapoznanie się z podstawowymi możliwościami języka Prolog w zakresie definiowania faktów i reguł oraz wykonywania zapytań.

Projekt 4: Programowanie w logice

Definicje. Algorytm to:

Programowanie w logice

Programowanie deklaratywne

Programowanie w logice Prolog 1

Języki programowania deklaratywnego

Reprezentacja wiedzy i wnioskowanie

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Programowanie w logice Wykład z baz danych dla

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Logika stosowana. Ćwiczenia Programowanie w logice i PROLOG. Marcin Szczuka. Instytut Informatyki, Uniwersytet Warszawski

LOGIKA I TEORIA ZBIORÓW

SZTUCZNA INTELIGENCJA

Np. Olsztyn leży nad Łyną - zdanie prawdziwe, wartość logiczna 1 4 jest większe od 5 - zdanie fałszywe, wartość logiczna 0

Wykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu.

Wprowadzenie do Sztucznej Inteligencji Laboratorium lista 0.2 Elementy języka Prolog: reguły i rekurencja. Przemysław Kobylański

Algorytm. a programowanie -

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

Elementy logiki. Wojciech Buszkowski Wydział Matematyki i Informatyki UAM Zakład Teorii Obliczeń

Języki programowania zasady ich tworzenia

1. Wstęp do logiki. Matematyka jest nauką dedukcyjną. Nowe pojęcia definiujemy za pomocą pojęć pierwotnych lub pojęć uprzednio wprowadzonych.

MATEMATYKA DYSKRETNA, PODSTAWY LOGIKI I TEORII MNOGOŚCI

Wprowadzenie do logiki Zdania, cz. III Język Klasycznego Rachunku Predykatów

1 Wprowadzenie do algorytmiki

Programowanie w Logice Przykłady programów. Przemysław Kobylański

Internet Semantyczny i Logika I

JĘZYKI PRZETWARZANIA SYMBOLICZNEGO

Prezentacja do pobranie:

Operatory w C++ Operatory arytmetyczne. Operatory relacyjne (porównania) Operatory logiczne. + dodawanie - odejmowanie * mnożenie / dzielenie % modulo

Programowanie w Logice Struktury danych (Lista 2)

PROLOG. Programmation en Logique. Michał Bereta

Adam Meissner.

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

Wykład 2. Relacyjny model danych

Systemy ekspertowe i ich zastosowania. Katarzyna Karp Marek Grabowski

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

opisuje nazwy kolumn, wyrażenia arytmetyczne, funkcje nazwy tabel lub widoków warunek (wybieranie wierszy)

1 Podstawowe oznaczenia

Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Mathcad c.d. - Macierze, wykresy 3D, rozwiązywanie równań, pochodne i całki, animacje

Programowanie w języku Python. Grażyna Koba

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

Algebra Boole a i jej zastosowania

Programowanie w Logice

Struktura pliku projektu Console Application

Przeszukiwanie z nawrotami. Wykład 8. Przeszukiwanie z nawrotami. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 238 / 279

SQL - Structured Query Language -strukturalny język zapytań SQL SQL SQL SQL

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

Warunki logiczne instrukcja if

Prolog 2 (Filip Wroński, Łukasz Betkowski, Paweł Świerblewski, Konrad Kosmatka)

Arytmetyka liczb binarnych

Składnia rachunku predykatów pierwszego rzędu

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Języki programowania Prolog

Pascal - wprowadzenie

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Andrzej Wiśniewski Logika I Materiały do wykładu dla studentów kognitywistyki. Wykład 9. Koniunkcyjne postacie normalne i rezolucja w KRZ

Za pierwszy niebanalny algorytm uważa się algorytm Euklidesa wyszukiwanie NWD dwóch liczb (400 a 300 rok przed narodzeniem Chrystusa).

Prolog struktury danych oraz obliczenia. 1. Arytmetyka?- Y is 2+2. Y = 4. ?- 5 is 3+3. false. ?- Z is (3.9 / 2.1). Z =

Logika binarna. Prawo łączności mówimy, że operator binarny * na zbiorze S jest łączny gdy (x * y) * z = x * (y * z) dla każdego x, y, z S.

Teoretyczne podstawy programowania liniowego

5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Logika Stosowana. Wykład 1 - Logika zdaniowa. Marcin Szczuka. Instytut Informatyki UW. Wykład monograficzny, semestr letni 2016/2017

Logika predykatów pierwszego rzędu PROLOG. Zarządzanie wiedzą. Wykład Reprezentacja wiedzy logika predykatów. Joanna Kołodziejczyk.

Wstęp do informatyki- wykład 2

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

Aproksymacja funkcji a regresja symboliczna

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Wprowadzenie do Sztucznej Inteligencji Laboratorium lista 0.1 Elementy języka Prolog: fakty i zapytania. Przemysław Kobylański

1 Podstawy c++ w pigułce.

INŻYNIERIA WIEDZY I SYSTEMY EKSPERTOWE

Przedrostkowa i przyrostkowa inkrementacja i dekrementacja

Rekurencja (rekursja)

Elementy języków programowania

PROLOG INNE PRZYKŁADY MACIEJ KELM

Metoda tabel semantycznych. Dedukcja drogi Watsonie, dedukcja... Definicja logicznej konsekwencji. Logika obliczeniowa.

Transkrypt:

Dariusz Banasiak Katedra Informatyki Technicznej Wydział Elektroniki

PROLOG akronim od PROgramming in LOGic Prolog został stworzony w 1971 przez Alaina Colmeraurera i Philipa Roussela. Podstawy teoretyczne sformułował Robert Kowalski. Prolog jest nazywany językiem programowania logicznego. Podstawą dla jego utworzenia była logika predykatów pierwszego rzędu oraz zasada rezolucji. Podstawowe implementacje: Turbo Prolog (firma Borland) SWI-Prolog (Jan Wielemaker) Visual Prolog (Prolog Development Center) Autor: Dariusz Banasiak Katedra Informatyki Technicznej 2

Język Prolog zalicza się do języków deklaratywnych program opisuje jedynie zadanie, które ma zostać rozwiązane (bez podania algorytmu). Program w języku Prolog składa się z następujących elementów: faktów (prawdziwe stwierdzenia) reguł (związki między faktami) celu (określa zadanie do wykonania). Pisząc program w Prologu określamy CO należy rozwiązać, zamiast JAK należy problem rozwiązać. Program napisany w języku Prologu różni się zasadniczo od programów w językach proceduralnych (Pascal, C, itd.), gdzie należy podać szczegółowy algorytm rozwiązania problemu. Autor: Dariusz Banasiak Katedra Informatyki Technicznej 3

Podstawowe zastosowania języka Prolog reprezentacja wiedzy przeszukiwanie przestrzeni stanów rozwiązywanie problemów logicznych dowodzenie twierdzeń przetwarzanie języka naturalnego realizacja systemów ekspertowych realizacja relacyjnych baz danych symboliczne rozwiązywanie równań różniczkowanie i całkowanie symboliczne Autor: Dariusz Banasiak Katedra Informatyki Technicznej 4

Reprezentacja faktów W Prologu fakty (bezwarunkowo prawdziwe twierdzenia) przedstawia się za pomocą predykatów pierwszego rzędu, których składnia wygląda następująco: nazwa_predykatu(ob_1, ob_2,..., ob_n). Powyższy predykat oznacza relację określoną przez nazwa_predykatu zachodzącą pomiędzy obiektami: ob_1, ob_2,..., ob_n, które są argumentami predykatu. Predykat: lubi(marta, mandarynki). przedstawia fakt, że Marta lubi mandarynki (obiektami są marta i mandarynki, zaś relacją lubi ). Autor: Dariusz Banasiak Katedra Informatyki Technicznej 5

Przy tworzeniu predykatów obowiązują następujące reguły: nazwa relacji (nazwa_pedykatu) jest pisana małymi literami, argumenty predykatu znajdują się w nawiasach i są oddzielone przecinkami, liczba argumentów predykatu, ich rodzaj i kolejność jest ściśle określona, argumentami predykatu mogą być stałe lub zmienne, stałe pisane są małymi literami, a zmienne zaczynają się dużą literą (stałe można umieścić również w cudzysłowie i wówczas mogą zawierać dowolne znaki), predykat jest zakończony kropką. Autor: Dariusz Banasiak Katedra Informatyki Technicznej 6

Uwaga: Dwa następujące predykaty: lubi(piotr, marta). lubi(marta, piotr). reprezentują zupełnie różne fakty. Autor: Dariusz Banasiak Katedra Informatyki Technicznej 7

Reprezentacja reguł Reguły są warunkowymi stwierdzeniami o istnieniu pewnych zależności między obiektami (faktami). Język Prolog akceptuje reguły o następującej składni: IF A 1 and A 2 and... and A n THEN B W notacji języka Prolog powyższą regułę można zapisać w jednej z dwóch postaci: B if A 1 and A 2 and... and A n. B :- A 1, A 2,..., A n. gdzie A 1, A 2,..., A n, B są predykatami. Autor: Dariusz Banasiak Katedra Informatyki Technicznej 8

Tworząc regułę należy pamiętać o następujących zasadach: nagłówek (konkluzja) reguły składa się tylko z jednego predykatu, część warunkową reguły stanowi koniunkcja (iloczyn) dowolnej liczby warunków, warunki oddzielone są słowem and (lub przecinkiem), reguła zakończona jest kropką. Jako argumenty predykatów mogą wystąpić zmienne. Przedstawiają one nazwy obiektów, które nie są w danej chwili znane. W Prologu nazwy zmiennych zaczynają się od dużej litery lub znaku _. Autor: Dariusz Banasiak Katedra Informatyki Technicznej 9

Regułę, że Marta lubi mężczyzn, którzy są przystojni i jeżdżą porsche można zapisać następująco: lubi(marta,x) :- mezczyzna(x), przystojny(x), jeżdzi(x,porsche). W regule tej X oznacza zmienną (nieznanego w danej chwili mężczyznę), który spełnia podane warunki. Regułę, że osoba S jest siostrą osoby X możemy zapisać następująco: siostra(s,x) :- kobieta(s), rodzice(matka,ojciec,s), rodzice(matka,ojciec,x). Reguła ta przedstawia prawidłowość: S jest siostrą X, jeżeli S jest kobietą oraz X i S mają tych samych rodziców. Autor: Dariusz Banasiak Katedra Informatyki Technicznej 10

Reguły i fakty w Prologu nazywa się klauzulami. Klauzule zawarte w programie tworzą tzw. bazę danych programu. W bazie może znajdować się większa liczba predykatów o takiej samej nazwie. Wówczas taki zbiór predykatów będziemy nazywać procedurą. Autor: Dariusz Banasiak Katedra Informatyki Technicznej 11

Cel Po wprowadzeniu do bazy faktów i reguł można zadawać pytania (stawiać cele do realizacji). Celem może być: pytanie o prawdziwość faktu, polecenia znalezienia nazw obiektów będących w relacji z innymi obiektami. Cel można określić przez podanie pojedynczego predykatu lub koniunkcji predykatów (tzw. cel złożony). W drugim przypadku predykaty składowe oddzielone są przecinkami (nazywamy je wówczas podcelami). Autor: Dariusz Banasiak Katedra Informatyki Technicznej 12

Jeżeli w predykacie (predykatach) celu występują tylko symbole (stałe), to wówczas jest to pytanie o prawdziwość faktów. Odpowiedzią jest wówczas PRAWDA lub FAŁSZ. Jeżeli w predykatach występują zmienne, to celem jest znalezienie wszystkich obiektów, które znajdują się w określonej relacji z innymi obiektami. Inaczej mówiąc mogą one zastąpić zmienną w predykacie celu nie prowadząc do sprzeczności z faktami zawartymi w bazie danych programu. Autor: Dariusz Banasiak Katedra Informatyki Technicznej 13

Przykład Baza wiedzy zawiera następujące fakty: lubi(jan, wino). lubi(jan, tenis). lubi(marta, jabłka). lubi(marta, wino). Zadane pytania i uzyskane odpowiedzi: lubi(marta, wino) lubi(marta, tenis) lubi(x, wino) lubi(jan, X), lubi(marta, X) lubi(x, wino), lubi(jan, X) odpowiedź: YES odpowiedź: NO odpowiedź: X=jan, X=marta odpowiedź: X=wino odpowiedź: NO Autor: Dariusz Banasiak Katedra Informatyki Technicznej 14

Mechanizm wnioskujący w Prologu Podstawą wnioskowania w Prologu jest uzgadnianie (dopasowanie) klauzul zawartych w bazie wiedzy z danym celem (lub podcelami). Klauzule próbuje się uzgadniać wtedy, gdy ich predykaty są takie same. Procesowi porównywania poddawane są argumenty predykatów. Ponieważ argumentem predykatu może być symbol (stała) lub zmienna mogą zachodzić dwa następujące przypadki: Autor: Dariusz Banasiak Katedra Informatyki Technicznej 15

na tej samej pozycji występuje w jednym predykacie stała, a w drugim zmienna (wówczas zmienna przyjmuje wartość symbolu) operacja ukonkretniania, na tej samej pozycji występują dwie zmienne (wówczas następuje powiązanie zmiennych tzn. jeżeli któraś z nich w pewnym momencie zostanie ukonkretniona, to druga zmienna automatycznie przyjmie tą samą wartość) operacja powiązania. Operacje ukonkretniania i powiązania są bardzo istotne w procesie wnioskowania realizowanym przez mechanizm wnioskowania języka Prolog. Autor: Dariusz Banasiak Katedra Informatyki Technicznej 16

Przykłady uzgadniania klauzul: Fakt Pytanie Uzgadnianie Rodzaj lubi(jan, wino) lubi(x, wino) X = jan ukonkretnienie lubi(marta, tenis) lubi(marta, Y) Y = tenis ukonkretnienie lubi(piotr, maria) lubi(v, Z) V = piotr Z = maria ukonkretnienie lubi(jan, Cos) lubi(jan, X) Cos = X powiązanie Autor: Dariusz Banasiak Katedra Informatyki Technicznej 17

Przykład Baza wiedzy zawiera następujące fakty (tekst zawarty między symbolami /*... */ oznacza komentarz): matka(alicja, maria). /* k1 - alicja jest matką maria */ matka(ewa, piotr). /* k2 */ matka(teresa, maria). /* k3 */ matka(olga, jan). /* k4 */ Mamy podany cel: matka(x, maria). Cel ten oznacza zadanie znalezienia tych matek, których córki mają na imię Maria. Autor: Dariusz Banasiak Katedra Informatyki Technicznej 18

Proces wnioskowania polega na kolejnym uzgadnianiu celu z kolejnymi klauzulami znajdującymi się w bazie wiedzy. W danym przypadku proces ten przebiega następująco: w wyniku dopasowywania celu z klauzulą 1 zmienna X zostanie ukonkretniona stałą alicja (cel został osiągnięty i następuje wyświetlenie wartości zmiennej X = alicja). Następuje też ustawianie tzw. znacznika powrotu na klauzulę 1, program próbuje dopasować cel z pierwszą klauzulą znajdującą za znacznikiem - jest to klauzula nr 2 (klauzuli tej nie da się uzgodnić z celem), Autor: Dariusz Banasiak Katedra Informatyki Technicznej 19

w wyniku uzgodnienia klauzuli 3 z celem otrzymamy nową wartość zmiennej X (zostanie ona ukonkretniona stałą teresa ) - program wyświetli, a znacznik pozycji zostanie przesunięty na klauzulę nr 3, następną klauzulą jest klauzula 4 (ponieważ nie można uzgodnić celu i jest to ostatnia klauzula w bazie wiedzy przeszukiwanie zostaje zakończone). Zostały więc znalezione dwa rozwiązania: X = alicja X = teresa Autor: Dariusz Banasiak Katedra Informatyki Technicznej 20

Kolejny przykład ilustruje rolę znaczników w procesie wnioskowania. Przykład Baza wiedzy zawiera następujące fakty i reguły: /* 1 */ ojciec(karol,edward). /* ojciec(o,d) - o jest ojcem d */ /* 2 */ ojciec(karol,august). /* 3 */ dziadek(x,y) :- ojciec(x,z),dziecko(y,z). /* 4 */ dziadek(karol,maurycy). /* dziadek(d,w) - d jest dziadkiem w */ /* 5 */ dziecko(henryk,edward). /* dziecko(d,r) - d jest dzieckiem r */ /* 6 */ dziecko(teofil,august). Autor: Dariusz Banasiak Katedra Informatyki Technicznej 21

Celem niech będzie znalezienie wszystkich wnuków Karola, co zapisujemy w sposób formalny: goal dziadek(karol,w). Proces wnioskowania w języku Prolog polega na próbie uzgodnienia celu po kolei z klauzulami występującymi w bazie wiedzy: uzgodnienie celu głównego z klauzulą 3 dziadek(karol,w). dziadek(x,y) :- ojciec(x,z), dziecko(y,z). X = karol (ukonkretnienie), W = Y (powiązanie) podcel 1: ojciec(karol,z) zn 1 = klauzula 3 (znacznik nawracania) u Autor: Dariusz Banasiak Katedra Informatyki Technicznej 22

uzgodnienie podcelu 1 z klauzulą 1 u ojciec(karol,z) ojciec(karol,edward). Z = edward (ukonkretnienie) podcel 2: dziecko(w,edward) - drugi podcel klauzuli 3 zn 2 = klauzula 1 (znacznik nawracania) uzgodnienie podcelu 2 z klauzulą 5 u dziecko(w,edward) dziecko(henryk,edward). W = henryk (ukonkretnienie) rozwiązanie: W = henryk udowodniono oba podcele klauzuli 3 zn 3 = klauzula 5 (znacznik nawracania) Autor: Dariusz Banasiak Katedra Informatyki Technicznej 23

szukanie kolejnych klauzul dla podcelu 2 Podcel 2 próbujemy uzgodnić z kolejnymi klauzulami w bazie (od miejsca wskazywanego przez znacznik zn 3 ). Znajdujemy klauzulę 6: dziecko(w,edward) dziecko(teofil,august). Ponieważ próba uzgodnienia kończy się niepowodzeniem i klauzula 6 jest ostatnią klauzulą w bazie należy: usunąć znacznik zn 3 i wrócić do znacznika zn 2 (podcel 1: ojciec(karol,z), zn 2 = klauzula 1) uzgodnienie podcelu 1 z klauzulą 2 u ojciec(karol,z) ojciec(karol,august). Z = august (ukonkretnienie) podcel 2: dziecko(w,august) - drugi podcel klauzuli 3 zn 2 = klauzula 2 (znacznik nawracania) u Autor: Dariusz Banasiak Katedra Informatyki Technicznej 24

uzgodnienie podcelu 2 z klauzulą 6 dziecko(w,august) dziecko(teofil,august). W = teofil (ukonkretnienie) rozwiązanie: W = teofil udowodniono oba podcele klauzuli 3 zn 3 = klauzula 6 (znacznik nawracania) u szukanie kolejnych klauzul dla podcelu 2 Podcel 2 próbujemy uzgodnić z kolejnymi klauzulami w bazie. Ponieważ klauzula 6 jest ostatnią klauzulą w bazie należy: usunąć znacznik zn 3 i wrócić do znacznika zn 2 (podcel 1: ojciec(karol,z), zn 2 = klauzula 2) Autor: Dariusz Banasiak Katedra Informatyki Technicznej 25

szukanie kolejnych klauzul dla podcelu 1 Podcel 1 próbujemy uzgodnić z kolejnymi klauzulami (od znacznika zn 2 ). Ponieważ próba uzgodnienia kończy się niepowodzeniem należy: usunąć znacznik zn 2 i wrócić do znacznika zn 1 (cel główny: dziadek(karol,w), zn 1 = klauzula 3). uzgodnienie celu głównego z klauzulą 4 dziadek(karol,w). W = maurycy (ukonkretnienie) rozwiązanie: W = maurycy dziadek(karol,maurycy). zn 1 = klauzula 4 (znacznik nawracania) u Autor: Dariusz Banasiak Katedra Informatyki Technicznej 26

szukanie kolejnych klauzul dla celu głównego Cel główny próbujemy uzgodnić z kolejnymi klauzulami (od znacznika zn 1 ). Ponieważ próba uzgodnienia kończy się niepowodzeniem należy usunąć znacznik zn 1. Ponieważ nie ma już żadnych znaczników powrotu proces przeszukiwania zostaje zakończony. W wyniku procesu wnioskowania znaleziono następujące rozwiązania: W = henryk W = teofil W = maurycy Autor: Dariusz Banasiak Katedra Informatyki Technicznej 27

Modyfikatory procesu wnioskowania Operator odcięcia ( cut ) jest to bezargumentowy predykat, który zawsze jest prawdziwy i służy do ograniczania nawrotów. Występuje przeważnie jako jeden z podcelów w części warunkowej reguły i uniemożliwia nawrót do któregokolwiek z poprzedzających go podcelów przy próbie znajdowania rozwiązań alternatywnych: dziadek(x,y) :- ojciec(x,z), dziecko(y,z),!. /* znajduje tylko pierwsze rozwiązanie W = henryk */ dziadek(x,y) :-!, ojciec(x,z), dziecko(y,z). /* zapobiega nawrotom do kolejnych predykatów tego samego typu W = henryk, W = teofil */ Autor: Dariusz Banasiak Katedra Informatyki Technicznej 28

Operator odcięcia wykorzystywany jest również przy definicjach rekurencyjnych. Przykład Procedura obliczająca silnię dowolnej liczby: silnia(0,1) :-!. silnia(x,y) :- N is X-1, /* operator podstawienia N = X-1 */ silnia(n,b), Y is X*B. Drugim operatorem modyfikującym proces wnioskowania jest predykat fail. Predykat ten jest zawsze fałszywy. Najczęściej jest używany do wymuszenia nawrotów. Autor: Dariusz Banasiak Katedra Informatyki Technicznej 29

Listy Lista jest podstawową strukturą danych w Prologu. Jest ona uporządkowanym zbiorem dowolnej liczby elementów, którymi mogą być: stałe, zmienne lub struktury (np. inne listy). Przykłady list: [ ] - lista pusta [1,2,5,4,7] [[1,2],[5,4],7] - lista zawiera inne listy Listę można podzielić na dwa elementy: głowę (head) oraz ogon (tail). Głową jest pierwszy element listy, a ogonem pozostała część listy. Autor: Dariusz Banasiak Katedra Informatyki Technicznej 30

Wybrane operacje na listach [X Y] podział listy na głowę (X) i ogon (Y) member(x,l) sprawdzenie czy element X należy do listy L np. member(2,[1,2,3,4,5,6,]) append(l1,l2,l3) utworzenie listy L3 przez dołączenie listy L2 na koniec listy L1 np. append([1,2],[5,6],x) Autor: Dariusz Banasiak Katedra Informatyki Technicznej 31

Operacje arytmetyczne w Prologu Prolog jest językiem służącym przede wszystkim do wykonywania operacji na symbolach. Posiada on jednak również możliwości wykonywania operacji arytmetycznych na liczbach całkowitych. Służą do tego wbudowane operatory arytmetyczne: * (mnożenie), / (dzielenie), - (odejmowanie), + (dodawanie) i mod (reszta z dzielenia). Dostępne są również operatory relacyjne: = (równy), \ (różny), < (mniejszy), > (większy), <= (mniejszy lub równy) i >= (większy lub równy). Autor: Dariusz Banasiak Katedra Informatyki Technicznej 32

Przykład W bazie danych mamy następujące fakty: urodzony(jan,1974). urodzony(ludwik,1979). urodzony(andrzej,1980). urodzony(marcin,1970). Aby porównać wiek osób (kto jest starszy od kogo) można zdefiniować następujący predykat: starszy(x,y):- urodzony(x,r1), urodzony(y,r2), R1>R2. Autor: Dariusz Banasiak Katedra Informatyki Technicznej 33

Operacje wejścia i wyjścia Operacje wejścia i wyjścia umożliwiają komunikację z użytkownikiem podczas wykonywania programu. Wbudowane predykaty wejścia-wyjścia: read(x) odczytuje term z bieżącego strumienia wejściowego write(x) zapisuje term X do bieżącego strumienia wyjściowego nl przejście do nowego wiersza Przykład: pytanie1(dziecko) :- read(x), rodzic(x, Dziecko). Autor: Dariusz Banasiak Katedra Informatyki Technicznej 34