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

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

Programowanie w logice

PROLOG INNE PRZYKŁADY MACIEJ KELM

Programowanie w Logice

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

Programowanie w logice Prolog 2

7. Pętle for. Przykłady

4. Funkcje. Przykłady

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

Paradygmaty programowania

Wstęp do informatyki- wykład 7

Cw.12 JAVAScript w dokumentach HTML

Programowanie w logice

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 Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

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

Pętla for. Wynik działania programu:

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Wykład 1 Informacje Podstawowe

Języki programowania deklaratywnego

Pętle. for, while, do... while, foreach. Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.

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

1. Wypisywanie danych

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

JAVAScript w dokumentach HTML (1)

Laboratorium przedmiotu Paradygmaty Programowania

Definicje. Algorytm to:

Wykład 1 Informacje Podstawowe

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

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!

Statyczne i dynamiczne predykaty

Wykład 1 Informacje Podstawowe

Programowanie w logice Prolog 3

Podstawy programowania

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 3

do drukowania tekstu służy funkcja echo <?php echo "hello world!";?> jeżeli użyjemy jej kilka razy: <?php

6. Pętle while. Przykłady

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

Wprowadzenie do języka Java

Program, który się uczy.

Programowanie w Logice

Architektura komputerów ćwiczenia Bramki logiczne. Układy kombinacyjne. Kanoniczna postać dysjunkcyjna i koniunkcyjna.

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

Być może jesteś doświadczonym programistą, biegle programujesz w Javie,

PętlaforwOctave. Roman Putanowicz 13 kwietnia 2008

Wstęp do metod numerycznych Uwarunkowanie Eliminacja Gaussa. P. F. Góra

Programowanie deklaratywne

Algorytm - pojęcie algorytmu, sposób zapisu, poziom szczegółowości, czynności proste i strukturalne. Pojęcie procedury i funkcji.

Złożoność informacyjna Kołmogorowa. Paweł Parys

a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Program znajduje największa lub najmniejsza z podanych liczb. Liczby podajemy dopóki nam sie nie znudzi.

void Pobierz(Student &a); void Wypisz(Student a); void Ustaw_zaliczenia(Student t[],int r); void Wypisz_najlepszych(Student t[],int r, float prog);

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?

Podstawy Programowania Podstawowa składnia języka C++

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

Naukę zaczynamy od poznania interpretera. Interpreter uruchamiamy z konsoli poleceniem

PODSTAWY SZTUCZNEJ INTELIGENCJI

Języki programowania deklaratywnego

Treść wykładu. Układy równań i ich macierze. Rząd macierzy. Twierdzenie Kroneckera-Capellego.

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc.

Programowanie w logice Prolog 1

Podstawy programowania w C++

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Mechanizm zarządzania bazą towarową Quattro i kas firmy ELZAB Wersja RMC 1.9

Wykład 2. Relacyjny model danych

Prolog Wejście / wyjście r

Programowanie logiczne a negacja

Wczytywanie i wypisywanie

Programowanie w logice

BASH - LINIA POLECEŃ. Bioinformatyka 2018/2019

Akademia ETI Marcin Jurkiewicz

Podstawy i języki programowania

PRACOWNIA INFORMATYCZNA BASH - PODSTAWOWE INFORMACJE

Projekt 4: Programowanie w logice

Semantyka i Weryfikacja Programów - Laboratorium 3

1,3,4,2,3,4,0,1,4,5,0. Wówczas największa suma trzech kolejnych liczb (zaznaczone na czerwono) wynosi:

Programowanie i techniki algorytmiczne

do instrukcja while (wyrażenie);

Technologie cyfrowe. Artur Kalinowski. Zakład Cząstek i Oddziaływań Fundamentalnych Pasteura 5, pokój 4.15

Definicje wyższego poziomu

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

Języki programowania zasady ich tworzenia

Programowanie proceduralne w języku C++ Pojęcia podstawowe - kod źródłowy

Języki i paradygmaty programowania. I. Wprowadzenie

Python wstęp do programowania dla użytkowników WCSS

Warsztaty dla nauczycieli

Programowanie - instrukcje sterujące

Systemy operacyjne II Laboratorium. Część 1: Pliki wsadowe Windows

OPIS NOWYCH FUNKCJI PROGRAMU MIGRACJA DANYCH DO PROGRAMU BATECH 2.0 AKTUALIZACJA SŁOWNIKÓW

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

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Liczby zmiennoprzecinkowe i błędy

Programowanie strukturalne i obiektowe. Funkcje

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

Pętla for. Matematyka dla ciekawych świata -19- Scilab. for i=1:10... end. for k=4:-1:1... end. k=3 k=4. k=1. k=2

INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład VII

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Laboratorium kryptograficzne dla licealistów 1

Transkrypt:

Prolog 2 (Filip Wroński, Łukasz Betkowski, Paweł Świerblewski, Konrad Kosmatka) Rozdział 2 Constructing Prolog Programs z książki Prolog Programming in Depth autorstwa Michael A. Covington, Donald Nute, André Vellino

Wstęp Prolog interpretuje klauzule jako definicje procedur. Wynika z tego, że język posiada semantyki deklaratywne i proceduralne. Jakakolwiek wiedza w Prologu może być rozumiana deklaratywnie jako reprezentowanie wiedzy, lub proceduralnie jako pewne określone akcje obliczeniowe.

Wstęp Ale nawet dla reprezentacji wiedzy, Prolog nie jest idealnie deklaratywny; programista musi pewne kwestie proceduralne przechowywać w głowie. Na przykład, niektóre poprawnie deklaratywnie bazy wiedzy tworzą nieskończone pętle. W innych przypadkach, dwie deklaratywnie równoważne bazy wiedzy mogą być całkowicie odmienne w kwestii efektywności obliczeniowej.

Wstęp W tym rozdziale skupimy się na proceduralnej interpretacji w Prologu. Poznamy wbudowany predykaty dla wejścia/wyjścia w celu modyfikowania bazy wiedzy i kontrolowania procesu wstecznego (backtracking). Programy w tym rozdziale będą zawierały bazę wiedzy jak i również zestawy procedur. Będziemy zazwyczaj używać prostej bazy wiedzy.

OUTPUT: polecenia write, nl, display Wbudowany predykat write traktuje każde termin Prologa jako własny argument i wyświetla go na ekranie. Predykat nl, który nie posiada argumentów, przechodzi do nowej linii.

Przykłady write, nl?- write('hello'), write('world'). Helloworld true?- write('hello'), nl, write('world'). Hello world true

Wielokrotne write Możemy używać wielokrotnie write w celu wypisania wartości przechowywanej przez zmienną, na przykład:?- matka(x,krystyna), write('matką krystyny jest '), write(x). Matką krystyny jest barbara. true

Właściwości write Jeśli argument jest niezainicjowaną zmienną, write wyświetli unikalny symbol identyfikujący tę zmienną, np. _0001.?- write(x).

writeq Zauważmy, że write wyświetla napisy bez cudzysłowów. Jeśli chcemy, aby write wypisało Hello world, wypisze Hello world, czyli w postaci dwóch jednostek, a nie jednej, co jest trudne w późniejszym ewentualnym wykorzystaniu przez składnię Prologa. Aby otrzymać napis razem z cudzysłowami, należy użyć predykatu writeq.

Przykład writeq?- writeq('hello there'). 'hello there' true

display Inny predykat, display wyświetla funktory z przodu ich argumentów, nawet jeśli były napisane w innych pozycjach. To sprawia, że display jest użyteczne dla poznania wewnętrznej reprezentacji danych w Prologu.

Przykład display?- display(2+2). +(2,2) true Jak widzimy, 2+2 nie przedstawia 4, tylko strukturę danych złożonych z 2, + i 2.

write_canonical Kolejny predykat, write_canonical, jest kombinacją writeq oraz display.?- write_canonical(2+3). +(2,3)?- write_canonical('hello there'). 'hello there'

Obliczanie i wydruk Ważne jest odróżnianie zapytań, które używają operacji wejścia/wyjścia, od zapytań, które ich nie używają. Na przykład:?- matka(x,karolina), write(x). Powyższe zapytanie mówi komputerowi, żeby znalazł, kto jest matką Karoliny i wypisał wynik.

Obliczanie i wydruk Dla kontrastu weźmy poniższe zapytanie:?- matka(x,karolina). To zapytanie z kolei mówi komputerowi, żeby zidentyfikował matkę Karoliny, ale z kolei nic nie mówi o wydruku. Jeśli wpiszemy kolejne zapytanie, żeby Prolog wypisał wynik, zostanie wypisana zmienna X, ponieważ Prolog zawsze wypisuje wartości zmiennych zainicjowanych przez zapytania, które nie użyły operacji wyjścia.

Obliczanie i wydruk Popularnym błędem jest konstruowanie predykatu, który ma coś wypisać, kiedy chcemy, żeby coś obliczył i na odwrót. W normalnych sytuacjach, dowolny predykat, który wykonuje obliczenia, powinien dostarczyć wynik za pomocą zainicjowanego argumentu, a nie za pomocą wypisania bezpośrednio na ekran. W ten sposób, wynik może być wykorzystany później w tym samym programie.

Wymuszanie wracania się z fail Wbudowany predykat fail można wykorzystać do wymuszenia innych predykatów do wracania się przez wszystkie rozwiązania.

Wymuszanie wracania się z fail Dla przykładu, rozważmy małą bazę wiedzy Stolice.?- stolica(kraj,miasto), write(miasto), write( jest stolicą ), write(kraj),nl. Powyższe zapytanie wyświetli informacje o pierwszym kraju, które znajdzie, ponieważ Prolog zakłada, że jeśli użyliśmy write, musi coś wypisać, niezależnie, czy chcieliśmy to widzieć.

Wymuszanie wracania się z fail W tym miejscu fail odgrywa swoją rolę. Aby wydrukować wszystkie alternatywy, możemy zbudować zapytanie w poniższy sposób:?- stolica(kraj,miasto), write(miasto), write( jest stolicą kraju ),write(kraj),nl,fail.

Wymuszanie wracania się z fail W miejscu predykatu fail możemy użyć dowolnego predykatu, który zwraca false, ponieważ dowolna porażka powoduje, że Prolog cofa się do ostatniej niewykorzystanej możliwości.

Wymuszanie wracania się z fail Jak to po kolei działa, obrazują kroki poniżej:?- stolica(kraj,miasto), write(miasto), write( jest stolicą kraju ),write(kraj),nl,fail. 1.Rozwiąż pierwszy cel, stolica(kraj,miasto) przez inicjalizację Kraj jako polska i Miasto jako warszawa. 2.Rozwiąż drugi, trzeci, czwarty i piąty cel (trzy razy write oraz nl) wypisując Warszawa jest stolicą kraju Polska i przejście do następnej linii. 3.Rozwiąż ostatni cel, fail. Ten cel nie może być rozwiązany, więc wróć. 4.Ostatni cel, który ma alternatywy, jest pierwszy, więc wybierz inny kraj oraz miasto i spróbuj ponownie.

Wymuszanie wracania się z fail Poniższe drzewo przedstawia ten proces. Widać wyraźnie, że na napotkaniu porażki, Prolog wraca na samą górę do polecenia stolica(kraj,miasto), żeby zdobyć alternatywę.