PROLOG INNE PRZYKŁADY MACIEJ KELM

Podobne dokumenty
Statyczne i dynamiczne predykaty

Programowanie w Baltie klasa VII

Liczby losowe i pętla while w języku Python

PętlaforwOctave. Roman Putanowicz 13 kwietnia 2008

Nazwa implementacji: Nauka języka Python pętla for. Autor: Piotr Fiorek

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

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

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

Programowanie w Logice

Programowanie w logice

Programowanie w języku C++ Agnieszka Nowak Brzezińska Laboratorium nr 2

Algorytmy i struktury danych. Wykład 4 Tablice nieporządkowane i uporządkowane

Przykładowe zadania z teorii liczb

Laboratorium 7 Blog: dodawanie i edycja wpisów

INSTRUKCJE ITERACYJNE

JAVAScript w dokumentach HTML - przypomnienie

Liczby pseudolosowe. #include <stdio.h> #include <stdlib.h> int main() { printf("%d\n", RAND_MAX); return 0; }

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.

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

Ćwiczenie: JavaScript Cookies (3x45 minut)

Lab 9 Podstawy Programowania

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

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

Luty 2001 Algorytmy (7) 2000/2001

PODSTAWY SZTUCZNEJ INTELIGENCJI

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

Bibliotek grid została stworzona aby wykorzystywać funkcje programu R ( oraz wprowadzone do programu R) do tworzenia odwzorowań typu grid oraz siatek

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

Celem tego projektu jest stworzenie

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

Joanna Kluczenko 1. Spotkania z matematyka

Łączenie liczb i tekstu.

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Zadania do samodzielnego rozwiązania

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

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

Program telewizyjny emisji filmów w 4 stacjach telewizyjnych: Telewizja / stacja Film i godziny jego emisji Czas trwania emisji filmu

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne

Monika Wrzosek (IM UG) Programowanie obiektowe 21 / 25

Programowanie 3 - Funkcje, pliki i klasy

Blockly Kodowanie pomoc.

Treść wykładu. Pierścienie wielomianów. Dzielenie wielomianów i algorytm Euklidesa Pierścienie ilorazowe wielomianów

Wstęp do programowania

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

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 =

Laboratorium nr 1. i 2.

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

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.

Wstęp do programowania

Paradygmaty programowania

ZADANIE 1. Ważenie (14 pkt)

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Python wstęp. Michał Bereta

Wstęp do Programowania Lista 1

Projekt 4: Programowanie w logice

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Warsztaty dla nauczycieli

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

Instalacja i obsługa aplikacji MAC Diagnoza EW

BAZA DANYCH. Informatyka. ZESPÓŁ SZKÓŁ ELEKTRYCZNYCH Prowadzący: inż. Marek Genge

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

1. Operacje logiczne A B A OR B

Rekurencja (rekursja)

Pascal - wprowadzenie

Program, który się uczy.

Laboratorium przedmiotu Paradygmaty Programowania

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Programowanie w logice Prolog 2

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

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

koledzy, Jan, Nowak, ul. Niecała 8/23, , Wrocław, , ,

Programowanie zaawansowane

UWAGA!!! Przed przystąpieniem do zamknięcia roku proszę zrobić kopie bezpieczeństwa

Schematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.

Programowanie obiektowe - zadania

Funkcje wymierne. Jerzy Rutkowski. Działania dodawania i mnożenia funkcji wymiernych określa się wzorami: g h + k l g h k.

Systemy ekspertowe i ich zastosowania. Katarzyna Karp Marek Grabowski

Macierze symetryczne i nasycone grupy permutacji

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

UMOWY INSTRUKCJA STANOWISKOWA

Temat 1. Więcej o opracowywaniu tekstu

1. Napisz program, który wyświetli Twoje dane jako napis Witaj, Imię Nazwisko. 2. Napisz program, który wyświetli wizytówkę postaci:

Cw.12 JAVAScript w dokumentach HTML

Iteracje. Algorytm z iteracją to taki, w którym trzeba wielokrotnie powtarzać instrukcję, aby warunek został spełniony.

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

WEJŚCIE/WYJŚCIE HASKELL ŁUKASZ PAWLAK DARIUSZ KRYSIAK

Programowanie w języku Java

1. LICZBY RZECZYWISTE Opracowała: Kamila Kruk

Poziom 2. Pustynny wyścig

Zadanie 1. Suma silni (11 pkt)

EGZAMIN MATURALNY Z INFORMATYKI

SUM Edukacja Techniczno Informatyczna Języki i Systemy Programowania. Wykład 3. dr Artur Bartoszewski - WYKŁAD: Języki i Systemy Programowania,

Podstawy obsługi modułu administracyjnego

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

Transkrypt:

PROLOG INNE PRZYKŁADY MACIEJ KELM

PREDYKAT RANDOM Funkcja random zwraca losową liczbę całkowitą w przedziale od 1 do X. Gdzie X jest parametrem funkcji random. Przed użyciem random należy zainicjować tak zwany zalążek(seed). Jest on wykorzystywany do tworzenia liczb pesudolosowych przez generator. set_random(seed(1)). A is random(100). %ustawienie zalążka %wygenerowanie liczby Wynik: A = 45.

PREDYKAT ASSERT Komenda assert pozwala dodawać nowe wpisy do bazy wiedzy. podpinamy się pod pustą bazę wiedzy assert(zadowolony(jan)). assert(zadowolony(wojtek)). assert(zadowolony(zosia)). assert(zadowolony(arek)). assert(zadowolony(jan)). zadowolony(x). Udało nam się dodać fakty do bazy wiedzy ale komenda assert pozwala dodawać także nowe zasady.

PREDYKAT ASSERT Udało nam się dodać fakty do bazy wiedzy ale komenda assert pozwala dodawać także nowe zasady. Załóżmy że chcemy dodać następującą zasadę: Każdy kto jest zadowolony jest naiwny Kod wyglądałby następująco: assert( (naiwny(x):- zadowolony(x)) ).

PREDYKATY ASSERTA ORAZ ASSERTZ Większe możliwości manipulacji na bazie wiedzy dają komendy asserta oraz assertz które kolejno dodają elementy na początku i na końcu bazy. assert(temp(b)). asserta(temp(a)). assertz(temp(c)). temp(x). Wynik: temp(x). X = a ; X = b ; X = c.

PREDYKAT RETRACT Funkcja retract pozwala na usuwanie wpisów z bazy wiedzy retract(zadowolony(jan)). zadowolony(x). Warto zauważyć że tylko pierwszy wpis w bazie został usunięty. Wynika to z działania samego Prologa który przeszukuje bazę od góry do znalezienia pierwszego wstąpienia faktu. Do usunięcia wszystkich faktów możemy posłużyć się zmienną retract(zadowolony(x)).

MANIPULACJE NA BAZIE WIEDZY Manipulacje na bazie wiedzy są bardzo użyteczną techniką zwłaszcza gdy chcemy przechowywać wyniki obliczeń. Pozwala to na późniejsze ich użycie bez potrzeby wykonywania ponownie obliczeń. (plik: db_1.pl) dynamic wyniki/3. kwadratsumy(x,y,res):- wyniki (X,Y,Res),!. kwadratsumy(x,y,res):- Res is (X+Y)*(X+Y), assert(wyniki(x,y,res)).

MANIPULACJE NA BAZIE WIEDZY Wyżej opisany program zwraca kwadrat sumy X oraz Y. Najważniejszą rzeczą jest jednak to w jaki sposób tego dokonuje. Na początek deklarujemy wyniki/3 jako dynamiczny predykat. Musimy tego dokonać ponieważ definicja wyniki/3 zostanie zmieniona w trakcie trwania programu. Pierwsza klauzula sprawdza bazę danych w poszukiwaniu wyników. Jeżeli je odnajdzie program kończy działanie. Druga klauzula wykonuje potrzebne operacje matematyczne oraz zapisuje wynik do bazy.

MANIPULACJE NA BAZIE WIEDZY kwadratsumy(1, 2, X). kwadratsumy(1, 3, X). wyniki(x, Y, Z). Wynik: X = 1, Y = 2, Z = 9 ; X = 1, Y = 3, Z = 16.

PREDYKAT GENSYM Podczas pracy z Prologiem spotkamy się z problemem w którym, w czasie trwania programu będziemy musieli wygenerować nowe obiekty. Podczas generowania obiektu musimy się upewnić że nowy atom nie koliduje z już istniejącymi. Jeżeli operujemy na studentach oznaczenia atomów byłyby następujące: pierwszy student : student1 drugi student : student2 i tak dalej

PREDYKAT GENSYM Pomocny w takim przypadku może okazać się predykat gensym gensym(student, X). X = student1 gensym(student, X). X = student2 i tak dalej Przy każdym następnym wywołaniu utworzony zostanie atom który nie będzie kolidował z już istniejącymi.

PREDYKAT FINDALL Predykat findall pozwala znaleźć wszystkie wyniki bez potrzeby ciągłego wciskania klawisza ;. Załóżmy że chcemy znaleźć liczby parzyste z danego przedziału Potrzebujemy do tego predykatów mod dzielenie modulo oraz numlist zwraca liste kolejnych elementów z przedziału. Działają one w następujący sposób:?- A is mod(5,2). A = 1.?- A is mod(4,2). A = 0.?- numlist(1,8,x). X = [1, 2, 3, 4, 5, 6, 7, 8].

PREDYKAT FINDALL Predykat findall realizujący problem wyglądałby następująco: findall(x, (numlist(1,8,nl),member(x,nl),0 =:= mod(x,2)),l). Pierwszy argument X oznacza zmienna którą chcemy zapisywać w trzecim argumencie L. Powyższą definicję findall można przeczytać: Znajdź wszystkie X spełniające warunek(drugi argument) i zapisze je do listy L Wynik:?- findall(x, (numlist(1,8,nl),member(x,nl),0 =:= mod(x,2)),l). L = [2, 4, 6, 8].

ZADANIA Znajdź wszystkie liczby nieparzyste z przedziału 1-10 za pomocą predykatu findall Napisz program który wygeneruje za pomocą predykatu gensym atom uczen, wygeneruje za pomocą predykatu random ocenę w skali 1-5 i zapisze fakt ocena(x,y) do bazy wiedzy. Gdzie X oznacza atom ucznia, Y atom oceny. Wyświetl wynik. Za pomocą skryptu z poprzedniego zadania wygeneruj 5 ocen. Za pomocą metody retract usuń drugi i trzeci fakt ocena(x, Y) Za pomocą skryptu z poprzedniego zadania drugiego wygeneruj 5 ocen. Usuń wszystkie wpisy w bazie wiedzy.