Języki programowania Prolog

Podobne dokumenty
Projekt 4: Programowanie w logice

Programowanie w Logice

Programowanie w logice

Programowanie w języku Python. Grażyna Koba

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Ćwiczenie 1. Matlab podstawy (1) Matlab firmy MathWorks to uniwersalny pakiet do obliczeń naukowych i inżynierskich, analiz układów statycznych

Programowanie w logice Prolog 2

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

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

Programowanie deklaratywne

Programowanie w logice

4. Funkcje. Przykłady

Wyrażenia arytmetyczne

Języki programowania zasady ich tworzenia

Podstawy programowania skrót z wykładów:

Wstęp do Programowania, laboratorium 02

Programowanie w języku C++ Grażyna Koba

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

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

/*W tym miejscu funkcja system wywołuje systemową komendę PAUSE tj.czeka tak długo, aż zostanie wciśnięty dowolny znak z

Programowanie w Logice Środowisko programowania i dialog z systemem (Lista 0)

Paradygmaty programowania

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

I. Podstawowe pojęcia i oznaczenia logiczne i mnogościowe. Elementy teorii liczb rzeczywistych.

PODSTAWY SZTUCZNEJ INTELIGENCJI

Semantyka rachunku predykatów

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 8. Karol Tarnowski A-1 p.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Języki programowania deklaratywnego

MATEMATYKA DYSKRETNA, PODSTAWY LOGIKI I TEORII MNOGOŚCI

Kwerendy (zapytania) wybierające

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Algorytm. a programowanie -

Rys. 1. Główne okno programu QT Creator. Na rysunku 2 oznaczone zostały cztery przyciski, odpowiadają kolejno następującym funkcjom:

Przykłady zdań w matematyce. Jeśli a 2 + b 2 = c 2, to trójkąt o bokach długości a, b, c jest prostokątny (a, b, c oznaczają dane liczby dodatnie),

Programowanie w Logice Struktury danych (Lista 2)

Systemy operacyjne. Laboratorium 9. Perl wyrażenia regularne. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

Odwrotna Notacja Polska

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

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

I. WSTĘP. Przykład 1. Przykład 2. Programowanie czyli tworzenie programów komputerowych (aplikacji komputerowych)

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

Wprowadzenie do Prologa

Programowanie deklaratywne

UONET+ moduł Dziennik

1 Podstawy c++ w pigułce.

Instalacja i opis podstawowych funkcji programu Dev-C++

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

Elementy logiki matematycznej

Wprowadzania liczb. Aby uniknąć wprowadzania ułamka jako daty, należy poprzedzać ułamki cyfrą 0 (zero); np.: wpisać 0 1/2

MentorGraphics ModelSim

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Język JAVA podstawy. wykład 1, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

0.1. Logika podstawowe pojęcia: zdania i funktory, reguły wnioskowania, zmienne zdaniowe, rachunek zdań.

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

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Skrypty powłoki Skrypty Najcz ciej u ywane polecenia w skryptach:

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

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

Laboratorium przedmiotu Paradygmaty Programowania

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

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

Języki i metodyka programowania. Wprowadzenie do języka C

Algorytmika i Programowanie VBA 1 - podstawy

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

WYRAŻENIA ALGEBRAICZNE

Obliczenia iteracyjne

C++ wprowadzanie zmiennych

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

Cel: Przypisujemy przyciskom określone funkcje panel górny (Panel1)

Programowanie Komputerów

Make jest programem komputerowym automatyzującym proces kompilacji programów, na które składa się wiele zależnych od siebie plików.

dokumentacja Edytor Bazy Zmiennych Edytor Bazy Zmiennych Podręcznik użytkownika

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Mikrokontroler ATmega32. Język symboliczny

Autor: dr inż. Katarzyna Rudnik

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Definicje wyższego poziomu

Język programowania zbiór reguł określających, które ciągi symboli tworzą program komputerowy oraz jakie obliczenia opisuje ten program.

Metody numeryczne Laboratorium 2

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

ECDL Podstawy programowania Sylabus - wersja 1.0

Przykład wykorzystania dodatku SOLVER 1 w arkuszu Excel do rozwiązywania zadań programowania matematycznego

Uzupełnij pola tabeli zgodnie z przykładem poniżej,

Liczby zespolone. x + 2 = 0.

Programowanie deklaratywne

LOGIKA I TEORIA ZBIORÓW

Makropolecenia w Excelu

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

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.

Instalacja

JĘZYK SHELL JEST PEŁNYM JĘZYKIEM PROGRAMOWANIA

Programowanie w logice Prolog 1

Przykład rozwiązywania problemu w programie DSS1OPT

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Instalacja Webroot SecureAnywhere przy użyciu GPO w Active Directory

Transkrypt:

1. Środowisko ECL i PS e Języki programowania Prolog zadanie projektowe nr. 3 (2016/17) T. Goluch W projekcie wykorzystane będzie środowisko ECL i PS e. Dostępne jest ono pod adresem: http://eclipseclp.org/. Po zainstalowaniu środowiska będziemy mieli dostępne dwie jego wersje: konsolową (dla systemu Windows jest to <katalog-instalacji>\lib\i386_nt\eclipse.exe). Możemy dodać ścieżkę dostępu za pomocą komendy: PATH = %PATH%;<kataloginstalacji>\lib\i386_nt. Kompilacji dokonujemy komendą: eclipse -f <nazwa-pliku>. Plik powinien mieć rozszerzenie.ecl albo.pl i znajdować się w bieżącym katalogu, natomiast nazwa pliku może być podana z pominięciem rozszerzenia. Niemniej jednak po poprawnej instalacji środowiska ECL i PS e do uruchomienia plików.ecl powinno wystarczyć dwukrotne ich kliknięcie. Po uruchomieniu powinna się wyświetlić informacja o licencji i wersji kompilatora, oraz napis: [eclipse 1]: _ po którym można wpisywać kolejne zapytania. Aby opuścić program i powrócić do linii komend należy zastosować instrukcję halt.. graficzną (TkEclipse). Po utworzeniu pliku z programem (w ulubionym edytorze lub przy pomocy File Edit new...) możemy go skompilować poleceniem File Compile... lub wpisując [<nazwa-pliku-bez-rozszerzenia>]. w polu Query Entry. W tym wypadku plik powinien mieć rozszerzenie.ecl albo.pl i znajdować się w bieżącym katalogu. Nową ścieżkę bieżącego katalogu możemy podać wybierając opcję menu File Change Directory.... Zapytania wpisujemy w polu Query Entry. Jeśli chcemy wyczyścić wszystkie dotychczas skompilowane moduły możemy posłużyć się opcją menu File Clear toplevel module. 2. Programowanie w logice Program w języku PROLOG składa się z zestawu definicji klauzul. Najprostsza definicja klauzuli p/1 (1 oznacza liczbę parametrów klauzuli) ma postać: p(1). Oznacza ona, że klauzula ta jest spełniona dla parametru równego 1 (i tylko dla takiego). Jeżeli teraz wykonamy zapytanie: p(x). otrzymamy odpowiedź: programowania{c91e19c4-8b08-4d63-9b7c-0913aab2a7ce} 1

X = 1 Yes Po zadaniu zapytania PROLOG przegląda wszystkie zdefiniowane klauzule i próbuje dopasować do nich zapytanie. Na przykład, gdy p jest spełnione dla 1 i 2: p(1). p(2). > p(x) X = 1 \\ Yes, maybe more X = 2 \\ Yes, maybe more Aby uzyskać kolejne dopasowania należy, w zależności od wersji, nacisnąć średnik (wersja konsolowa eclipse.exe) albo nacisnąć przycisk more (wersja graficzna TkEclipse). Warto również zauważyć, że kolejność klauzul ma znaczenie, zamieniając ją otrzymamy następującą odpowiedź: p(2). p(1). > p(x) X = 2 \\ Yes, maybe more X = 1 \\ Yes, maybe more Ogólna definicja klauzuli ma postać: predykat(zmienne) :- cel. i oznacza, że klauzula dla zmiennych Zmienne jest spełniona, jeżeli spełniony jest cel, przy czym cel jest listą pod-celi połączonych koniunkcją (w postaci cel-1, cel-2,..., cel-n) lub alternatywą (w postaci (cel-1; cel-2;...; cel-n)). Np. klauzula: q( 0,0 ). q( X,Y ) :- X > 0, T is X 1, q( T,Y ). jest spełniona dla parametrów 0,0 oraz dla wszystkich X,Y takich, że q( X-1,Y ) jest spełnione. Do obliczenia wartości wyrażenia potrzebna jest klauzula is/2. W przeciwnym wypadku zmiennej logicznej T zostałoby przypisane wyrażenie symboliczne X 1. Klauzule postaci p(x). (tzn. z pustą listą celów) nazywamy faktami, pozostałe klauzule regułami. Zadajmy teraz zapytanie q( 7,0 ). Nie udało się go dopasować do pierwszej klauzuli, jednak dopasowanie do drugiej powiedzie się: zmienna X zostanie związana z wartością 7, Y zaś z zerem, po czym nastąpi sprawdzenie prawdziwości pod-celi. Pierwsze dwa są spełnione. Aby sprawdzić prawdziwość trzeciego podcelu, należy sprawdzić, czy q( 6,0 ) jest prawdziwe. Nastąpi ponowna próba dopasowania zapytania (tym razem q( 6,0 )). Będzie ono prawdziwe, jeżeli prawdziwe będzie q( 5,0 ) itd., aż do zapytania q( 0,0 ), które jest prawdziwe z definicji (pierwszy fakt). Nazwy zmiennych zawsze zaczynają się od wielkiej, a predykatów od małej litery. 3. Debugger W celu lepszego zrozumienia działania programu bądź analizy błędów możemy posłużyć się debuggerem. Wybieramy z menu opcję: Tools Tracer i ponownie uruchamiamy zapytanie np.: programowania{c91e19c4-8b08-4d63-9b7c-0913aab2a7ce} 2

q(7,0). W oknie stosu wywołań Call Stack wyświetlony zostanie aktualny (kolor niebieski) oraz potomne cele. Cele spełnione oznaczane są na zielono a niespełnione na czerwono. Aby kontynuować śledzenie należy wykorzystać przycisk Creep. Wszystkie wywołane cele w porządku chronologicznym można obejrzeć przeglądając zakładkę Trace Log. 4. Typy danych W prologu możemy wyróżnić następujące typy danych: a) liczby możemy wyróżnić cztery rodzaje: całkowite, w przypadku wykorzystania biblioteki GMP ograniczeniem na ich wielkość jest jedynie pamięć urządzenia: 123-27 34923748927492749495867593039484746374859589174 zmiennoprzecinkowe, do reprezentacji wykorzystywany jest typ double z języka C: 3.141592653589793 6.02e23-35e-12-1.0Inf wymierne (wartość reprezentowana jest jako iloraz dwóch nieograniczonych liczb całkowitych): 2_6, rational(2.5), 4_3 + rational(1.5) bounded reals (liczba rzeczywista która zawiera się pomiędzy dwoma wartościami zmiennoprzecinkowymi): 1.5 2.0, 1.0 1.0, 3.1415926535897927 3.1415926535897936 b) napisy są reprezentacją dowolnej sekwencji bajtów i zapisywane są w cudzysłowach: "hello" "I am a string!" "string with a newline \n and a null \000 character" c) atomy to proste stałe symboliczne (podobne do typów wyliczeniowych z innych języków). Składniowo, wszystkie słowa zaczynające się od małej litery oznaczają atomy, atomami są również sekwencje symboli są oraz cokolwiek w apostrofach: atom quark i486 -*-??? 'Atom' 'an atom' d) listy to uporządkowany ciąg elementów zawartych między nawiasami kwadratowymi i rozdzielonych przecinkami, np.: [1,2,3,5]. Szczególnym przypadkiem jest pusta lista, oznaczana przy pomocy []. Każda niepusta lista skonstruowana jest z głowy (pierwszego elementu) i ogona (listy pozostałych elementów, potencjalnie pustej). Konstrukcja listy z programowania{c91e19c4-8b08-4d63-9b7c-0913aab2a7ce} 3

głowy H i ogona T ma postać [H T]. Zatem lista [1,2,3] może być zapisana na jeden z równoważnych sposobów: [1,2,3] [1 [ 2,3 ]] [1 [2 [3]]] [1 [2 [3 []]]] Przykładowy predykat, wyznaczający długość listy ma postać: dlugosc( [],0 ). dlugosc( [_ T],L ) :- dlugosc( T,P ), L is P + 1. czyli długością pustej listy jest zero, zaś lista niepusta ma długość o jeden większą niż długość jej ogona. _ oznacza, że głowy listy nie wiążemy z żadną zmienną logiczną. Kolejny przykład dołączenie jednej listy na koniec drugiej: dolacz( [],L,L ). dolacz( [H T],L,[H X] ) :- dolacz( T,L,X ). Lista L dołączona do pustej listy daje listę L. Lista L dołączona na koniec listy składającej się z głowy H i ogona T tworzy listę zbudowaną z głowy H i ogona X będącego wynikiem dołączenia na koniec T listy L. Kolejny przykład sprawdzenie, czy X jest równy jednemu z elementów listy: nalezy( X,[X _] ). nalezy( X,[H T] ) :- nalezy( X,T ). e) struktury to nazwany zbiór o stałej liczbie argumentów o następującej składni: <name>(<arg>1,...<arg>n) przykłady struktur: 5. Operatory data(grudzien, 25, "swieto") pierwiastek(wodor, sklad(1,0)) lot(londyn, nowy_york, 12.05, 17.55) W prologu możemy łatwo uzyskać listę wszystkich 87 operatorów wraz z informacją o ich priorytecie i łączności. Wystarczy wykonać następujące zapytanie: gdzie: current_op(pierwszenstwo, Typ, Nazwa). Pierwszenstwo liczba całkowita z zakresu 0..1200, wyższa liczba oznacza wyższy priorytet, programowania{c91e19c4-8b08-4d63-9b7c-0913aab2a7ce} 4

Typ określa ilu argumentowy jest operator i czy jest łączny. Ponadto w przypadku operatorów dwuargumentowych jeśli jest łączny to czy prawo czy lewo stronnie. Np. yfx to operator dwuargumentowy (infiksowy) lewostronnie łączny gdzie: o f miejsce operatora, o y strona od której zostanie rozpoczęte wykonywanie wyrażenia, o x brak łączności z tej strony. Operator to symbol operatora. Jeśli chcemy np. zapytać o wszystkie operatory prefixowe łączne (jednoargumentowe) należy wykonać zapytanie: current_op(pierwszenstwo, fy, Nazwa). W szczególności, znając symbol operatora możemy uzyskać dodatkowe informacje, np: 6. Komentarze current_op(pierwszenstwo, Typ, :-). Komentarze w PROLOG u zawarte są pomiędzy /* i */ (jak w C) lub pomiędzy % a końcem linii, np.: p(1). /* to jest komentarz */ p(2). % to tez jest komentarz 7. Predykat nawrotu fail/0 oraz operator odcięcia! Wykonanie predykatu fail zawsze kończy się niepowodzeniem i wymusza nawrót sterowania. Operator odcięcia! dzieli klauzulę na dwie części i nie pozwala ma ponowne uzgadnianie (nawracanie) do lewej części. rozne(x, Y) :- X=Y,!, fail. rozne(_, _). Rozważmy powyższy przykład, operator odcięcia nie pozwala na Jeśli zmienne X i Y będą różne to pierwszy pod-cel nie będzie spełniony a zatem nastąpi sprawdzenie dopasowania kolejnego predykatu, który dla dowolnych dwóch zmiennych zawsze jest spełniony. Odpowiedź będzie poprawna Yes. W przypadku kiedy zmienne będą różne pierwszy pod-cel będzie spełniony ale drugi zawsze będzie niespełniony, Jednak operator odcięcia nie pozwoli na powrót do lewej części klauzuli i na ponowne uzgodnienie predykatu. 8. Programowanie z ograniczeniami Aby wykorzystać programowanie z ograniczeniami, należy zaimportować bibliotekę ic, przy pomocy polecenia (podanego na początku programu): :- lib(ic). programowania{c91e19c4-8b08-4d63-9b7c-0913aab2a7ce} 5

Typowe rozwiązanie problemu przy użyciu CLP ma postać: rozwiaz(zmienne):- wczytaj_dane(dane), ustaw_ograniczenia(dane,zmienne), labeling(zmienne). gdzie ustaw_ograniczenia/2 definiuje model problemu. Predykat labeling/1 próbuje znaleźć rozwiązania sprawdzając wszystkie podstawienia dla zmiennych. Rozważmy następujący problem, w którym mamy 8 zmiennych: S, E, N, D, M, O, R, Y, każda z nich oznacza inną cyfrę, oraz spełniona jest równość: S E N D + M O R E = M O N E Y Rozwiązanie tego problemu będzie miało postać: :- lib(ic). model(zmienne) :- Zmienne = [S,E,N,D,M,O,R,Y], Zmienne :: 0..9, alldifferent(zmienne), S #\= 0, M #\= 0, 1000 * S + 100 * E + 10 * N + D + 1000 * M + 100 * O + 10 * R + E #= 10000 * M + 1000 * O + 100 * N + 10 * E + Y. rozwiaz(zmienne) :- model(zmienne), labeling(zmienne). Predykat model najpierw tworzy listę zmiennych w naszym problemie. W drugim kroku przypisujemy wszystkim zmiennym (przy pomocy predykatu ::/2) jako domenę zbiór liczb naturalnych z przedziału <0, 9>. Aby stworzyć domenę będącą podzbiorem liczb rzeczywistych, przedział 0..9 należałoby zmienić na 0.0..9.0 lub użyć predykatu $::/2. W następnej linii określamy, że wszystkie zmienne muszą być różne. Na koniec stwierdzamy że ani S ani M nie mogą być równe zero (ograniczenia wyrażone operatorami porównania tworzy się dodając znak # przed operatorem) oraz opisujemy nasze równanie. 9. Literatura http://eclipseclp.org/ ECL i PS e A Tutorial Introduction (http://eclipseclp.org/doc/tutorial.pdf) ECL i PS e User Manual (http://eclipseclp.org/doc/userman.pdf) programowania{c91e19c4-8b08-4d63-9b7c-0913aab2a7ce} 6