Prolog programowaniemath.uni.lodz.pl/~kowalcr/PDN/Prolog1.pdf · Jan Wielemaker, SWI-Prolog, ......

Preview:

Citation preview

Prolog

programowanieROZDZIAŁ 1: WPROWADZENIE

ROZDZIAŁ 2: PROLOG Z BLISKA

NA PODSTAWIE: PROLOG. PROGRAMOWANIE- W. F. CLOCKSIN, C. S. MELLISH

AUTOR OPRACOWANIA: BARTŁOMIEJ KAFTAN

26.04.2016

1Prezentacja do pobranie:

www.barkaf.cba.pl/prezentacja.rar

Instalacja Prologu w środowisku Windows

Współcześnie jest dostępnych szereg

implementacji Prologu, w tym

swobodnie dostępne kompilatory

Prologu:

Jan Wielemaker, SWI-

Prolog, http://www.swi-prolog.org

Daniel Diaz, GNU-

Prolog, http://gnu-prolog.inria.fr

2

Instalacja Prologu w środowisku Windows

Pobieramy plik wykonywalny, i

instalujemy środowisko do

programowania w języku Prolog:

3

Po zainstalowaniu mamy skrót w

menu start z pozytywnie

wyglądającą ikonką:

Uruchomienie zainstalowanego

środowiska: Stwórzmy pierwszą bazę danych, która

posłuży nam do wykonanie pierwszych

zapytań:

Tworzymy plik tekstowy z rozszerzeniem *.pl

W jego treści wpiszemy przykładowe dane:

4

Skrypty z rozszerzeniem pl zapisujemy w domyślnymkatalogu dla skryptów, będzie to zapewne folderProlog w katalogu Moje dokumenty.

Pierwszy program w Prologu

Ładujemy bazę danych poleceniem:

[nazwa_pliku bez rozszerzenia pl].

W naszym przypadku [fam].

Pojawi się true w przypadku poprawnego

załadowania bazy danych.

Następnie wywołujemy polecenie:

?- kobieta(X).

X = kasia pierwszy wynik, następny

wywołamy naciskając średnik.

X = eliza kolejny wynik.

Wyniki są zgodne z zadaną bazą

danych.

5

Podstawowe polecenia

Każdą linie kodu kończymy kropką:

cd('C:/Users/bk/Documents/Prolog').

pwd.

write(‚Hello World’).

Zakończenie pracy w powłoce:

halt.

Komentarz w skryptach:

% treść komentarza jednolinijkowego

/* komentarz wielolinijkowy */

6

Podstawowe polecenia Ładowanie bazy do interpretera:

[nazwa_pliku].

[ścieżka/nazwa_pliku.pl']

Domyślne miejsce przechowywania baz danych:

pwd. sprawdzenie domyślnego miejsca na bazę.

cd(ścieżka/do/katalogu'). zadanie nowego miejsca zaciągania bazdanych.

Wyświetlenie zawartości wczytanej bazy danych:

listing. wyświetlenie bazy.

listing(predykat). informacja na temat danego predykatu

apropos(nazwa) informacje na temat predykatów zawierającychzadaną nazwę

7

Podstawowe polecenia Sposoby uzyskania pomocy:

help. wyświetla cały manual

help(predykat) np. help(write). wyświetli informacje na temat danego

predykatu.

Narzędzia do edycji skryptów:

emasc.uruchamia edytor emacs

zwykły notatnik,

okno swi-prolog file/edit

Operatory:

, - operator and

; - operator or

8

Prolog jako język programowania logicznego

Programowanie logiczne:

- programowanie w logice;

- programowanie w języku logiki;

Programowanie logiczne, jest to metoda programowania, będąca odmianą

programowania deklaratywnego.

9

Programowanie deklaratywne - programista opisuje warunki, jakie musi spełniać końcowe

rozwiązanie (co chcemy osiągnąć), a nie szczegółową sekwencję kroków, które do niego

prowadzą (jak to zrobić). Programowanie deklaratywne często traktuje programy jako pewne

hipotezy wyrażone w logice formalnej, a wykonywanie obliczeń jako ich dowodzenie.

Programowanie deklaratywne jest szczególnym przedmiotem zainteresowania naukowców, gdyż

dzięki minimalizacji lub eliminacji skutków ubocznych może znacząco uprościć tworzenie

programów współbieżnych. Paradygmat programowania deklaratywnego obejmuje szeroką

gamę języków programowania i bardziej szczegółowych paradygmatów podrzędnych.

Przykładami programowalnych języków deklaratywnych są języki funkcyjne i logiczne takie, jak

Ocaml, XSLT czy Prolog.

Prolog – początki

Nazwa języka Prolog pochodzi od francuskiego „Programmation en

Logique”, można to przetłumaczyć jako „programowanie w logice”.

Prolog powstał jako język programowania służący do automatycznej

analizy języków naturalnych, jest jednak językiem ogólnego

zastosowania, szczególnie dobrze sprawdzającym się w programach

związanych ze sztuczną inteligencją. Prolog w przeciwieństwie do

większości popularnych języków jest językiem deklaratywnym.

Prolog został stworzony w 1971 roku przez Alaina Colmeraurera i

Phillipe'a Roussela.

10

Zastosowanie języka Prolog

Relacyjne bazy danych,

Logika matematyczna,

Rozwiązywanie problemów abstrakcyjnych,

Przetwarzanie języka naturalnego,

Automatyzacja projektowania,

Symboliczne rozwiązywanie równań,

Analiza struktur biochemicznych,

Różne zagadnienia z dziedziny sztucznej inteligencji.

11

Pisanie programów w Prologu

Programowanie w prologu nie polega na opisywaniu konkretnych

algorytmów, tak jak w tradycyjnych językach programowania. Pisząc

programy w Prologu musimy zająć się formalnymi relacjami i obiektamizwiązanymi z zadaną problematyką, sprawdzając prawdziwość

poszczególnych relacji, dla zadanego problemu.

Programując w Prologu opisujemy znane fakty i relacje dotyczące

problemu. Program powinien potrafić w dużej mierze wywnioskować,

na podstawie istniejących faktów, o nowych faktach.

12

Obiekty i relacje

Przykład 1:

Ala ma kota.

Ala – obiekt, ma – relacja posiadania, kot – obiekt.

Mamy do czynienia z relacją uporządkowaną ponieważ, to Ala ma kota, a nie kot ma Ale.

Można to zapisać następująco: posiada(ala,kot).

Przykład 2:

Piwo jest tanie.

Relacja nie musi określać jawnie wszystkich obiektów. W przykładzie mamy relacje „bycia tanim”, i relacja dotyczy tutaj obiektu piwo.

Można to zapisać następująco: tanie(piwo).

13

Obiekt, ale nie programowanie

obiektowe

Programowanie obiektowe: obiekt jest strukturą danych, która może

dziedziczyć pola i metody. Początek programowania obiektowego to lata

6O-te, jednak popularność to lata 80-90 (języki Smalltalk, C++, Java).

Prolog służy do zupełnie innych celów niż języki obiektowe. Definiując

obiekt w Prologu mamy na uwadze nie strukturę danych, która może

dziedziczyć pola i metody, ale obiekt rozumiemy jako byt, który możemy

opisać termami.

Ujednolicona struktura danych, term – na jej podstawie tworzone są

wszystkie dane, oraz programy w Prologu.

14

Program w Prologu

Program złożony jest ze zbioru klauzul.

Klauzula to fakt opisujący pewną informację.

Klauzula to reguła mówiąca, jak rozwiązanie można powiązać z danymi faktami.

Do zapisu relacji używamy reguł.

Przykład reguły:

Dwoje ludzi to siostry, jeśli oboje tychże ludzi to kobiety, oraz oboje tychże ludzi mają tych samych rodziców.

Reguła pokazuje jak sprawdzić czy dwie osoby są siostrami sprawdzamy czy obie osoby to kobiety, oraz czy obie osoby mają tych samych rodziców.

15

Programowanie

Podstawowe pojęcia:

Fakt,

Zapytanie,

Zmienna,

Połączenie,

Reguła,

Listy,

Rekurencje

16

Programowanie

Programowanie w Prologu składa się z następujących elementów:

Deklarowanie faktów dotyczących obiektów i związków miedzy

nimi.

Definiowanie reguł dotyczących obiektów i związków miedzy nimi.

Zadawania zapytań o obiektach i związkach między nimi.

Prolog to zbiór faktów i reguł, które są używane do udzielenia

odpowiedzi na zapytanie. Podajemy fakty i reguły, aby program

wywnioskował nowe fakty, na podstawie istniejących.

17

Fakty

Przykład:

lubi(adam,ewa).

Zasady:

Nazwy relacji i obiektów piszemy z małych liter.

W nazwach relacji oraz obiektów nie używamy polskich znaków.

Najpierw piszemy relacje, a następnie obiekty rozdzielone przecinkami w nawiasachokrągłych.

Fakt musi się kończyć kropką – nawiązanie do języka naturalnego.

Ważna jest kolejność podawania argumentów, ponieważ to Adam lubi Ewę, co nieoznacza że Ewa lubi Adama, aby to określić musimy podać następny faktlubi(ewa,adam), lub utworzyć odpowiednią regułę.

Jako że nazwy obiektów mogą być wieloznaczne, to programista decyduje jakrozumień daną nazwę.

18

Nazewnictwo

Nazwy obiektów występujące w nawiasach nazywamy

argumentami.

Nazwę relacji znajdującej się przed nawiasem nazywamypredykatem.

Podawane nazwy są zupełnie dowolne, ale dobrą praktyką jest

przypisywanie nazw dających obraz tego, czego dana nazwa

dotyczy.

Predykaty mogą mieć maksymalnie 1024 argumenty.

Zbiór faktów nazywamy bazą danych.

Podobnie zbiór reguł również nazywamy bazą danych.

19

1024 argumenty predykatu 20

Zapytania

Po utworzeniu bazy danych, możemy zająć się pytaniami. Pytania wyglądająpodobnie jak fakty, ale są poprzedzone znakiem zapytania i myślnikiem „?-”.

Przykład zapytania:

?- lubi(adam,ewa).

Powyższe zapytanie zwróci „true” jeżeli w bazie danych istnieje faktlubi(adam,ewa)., oczywiście jeżeli w bazie danych nie ma takiego faktu tozwrócony zostanie „false”.

Jeżeli zapytamy o coś czego nie ma w bazie, w sensie nie ma odpowiedniego predykatu, to otrzymamy informację:

ERROR: toplevel: Undefined procedure: cosCzegoNieMa/0 (DWIM could notcorrect goal)

Oznacza to że nasza baza nie zawiera predykatu „cosCzegoNieMa”, więc naszezapytanie nie może uzyskać sensownej odpowiedzi.

21

Przykład użycia nieistniejącego predykatu22

Zmienne Zmienne używamy po to, aby nie odpytywać ciągle po kolei o wszystkie interesujące

nas kwestie, ale aby zapytać raz, używając właśnie zmiennej, która będzie

przechodzić po poszczególnych obiektach.

Zmienna może być ukonkretniona lub nieukonkretniona.

Zmienna ukonkretniona, odpowiada konkretnemu obiektowi.

Zmienna nieukonkretniona, gdy nie wiemy jakiemu obiektowi może odpowiadać.

Weźmy zapytanie: ?- lubi(X,maria).

Przetłumaczymy to jako: Kto lubi Marię.

Przyjmijmy, że takimi obiektami będą Piotr oraz Paweł.

?- lubi(X,maria).

X=piotr po wciśnięciu średnika otrzymamy

X=pawel po raz kolejny wciskamy średnik i otrzymujemy

no ponieważ nie ma obiektu spełniającego kryteria wyszukiwania.

23

Przykład użycia zmiennej

Interpretacja:

2) Pytamy kogo lubi obiekt jan.

3) Pytamy przez kogo lubiany jest

obiekt jan.

4) Pytamy kto lubi kogo.

24

Uwaga na wielkość liter, bo jan to

obiekt z bazy, a Jan to zmienna,

której przyporządkowane są

wartości.

Koniunkcje , Koniunkcje będą służyć do zadawania bardziej skomplikowanych zapytań.

Przykład: czy Paweł i Piotr lubią się wzajemnie?

W tej sytuacji należało by zadać dwa odrębne pytania:

Czy Paweł lubi Piotra?

Czy Piotr lubi Pawła?

Gdy obydwie odpowiedzi będą twierdzące, wtedy mamy odpowiedź na pytanie

podstawowe, czy Piotr i Paweł lubią się wzajemnie.

Do skrócenia takich zapisów używamy koniunkcji.

Zapiszemy takie zapytanie w sposób następujący:

?- lubi(piotr,pawel) , lubi (pawel,piotr).

W Prologu spójnik łączący dwa zapytania tj. „i” zapisujemy za pomocą przecinka.

Za pomocą przecinka możemy oddzielić dowolną liczbę zapytań.

Całe zapytanie będzie prawdziwe tylko wtedy, gdy wszystkie pod odpowiedzi będą

pozytywne.

25

Przykład zastosowania koniunkcji,

i dowód na to, że nie wystarczy kogoś lubić,

aby też być lubianym

26

Bardziej skomplikowane zapytania

Przykład: chcemy się dowiedzieć, czy jest coś

wspólnego co lubią dwa zadane obiekty.

?- lubi(obiekt1,X), lubi(obiekt2,X).

Jako rezultat tego zapytania otrzymamy X=… (przy

założeniu że oba obiekty lubią coś wspólnego.

Program najpierw sprawdzi czy jest coś, co lubi

obiekt1, a następnie sprawdzi czy to konkretne coś

jest lubiane także przez obiekt2.

Koniunkcje celów sprawdzamy od strony lewej do

prawej.

27

Przykład bardziej skomplikowanego zapytania 28

Przy pierwszym załadowaniu bazy,

w bazie nie znajdował się fakt:

lubi(piotr,maria).

Mechanizm nawracania 29

Czy naprawdę Jan i Maria razem

lubią wino?

30

Reguły Załóżmy, ze chcemy zapisać fakt, że Piotr lubi wszystkich. Można by tego dokonać

wpisując wszystkie fakty po kolej, ale przy zastosowaniu tego sposobu np. do wszystkich

ludzi w Polsce byłoby to dość pracochłonne oraz czasochłonne.

W Prologu reguł używa się do zapisania, że pewien fakt zależy od grupy innych faktów.

Zapiszmy to w języku potocznym:

„Jan kupuje wino, jeśli jest ono tańsze od piwa.”

„Piotr lubi obiekt, jeśli obiekt jest człowiekiem narodowości polskiej”.

Kolejny przykład w języku potocznym:

X jest siostrą Y, jeśli: X jest kobietą oraz X i Y mają tych samych rodziców.

Jest oczywiste, że zmienne X oraz Y w całym zdaniu muszą mieć tę samą wartość, jeśli by tak nie byłomoglibyśmy dojść do bezsensownych zapisów np.: Anna jest siostrą Marii, jeśli Karolina jest kobietą orazMonika i Paulina mają tych samych rodziców.

31

Reguła to ogólne stwierdzenie dotyczące obiektów i ich powiązań. Możemy pozwolić,

aby miała różne wartości w przypadkach użycia, ale w samej regule musi być

interpretowana jednolicie.

RegułyW języku Prolog reguła składa się z głowy i treści, połączonych symbolami dwukropka

oraz myślnika --> głowa :- treść, oczywiście zakończone kropką:

lubi(jan,X) :- lubi(X,wino).

Przetłumaczmy tę regułę: „Jan lubi X, jeśli X lubi wino.”

Głową reguły będzie: lubi(jan,X)

Treścią reguły będzie: lubi(X,wino)

Głowa i treść połączone są za pomocą :-

Reguła kończy się kropką.

Możemy dodać Janowi bardziej sprecyzowane kryteria poszukiwania sympatii poprzez dodanie

kolejnych warunków:

lubi(jan,X) :- lubi(X,wino), lubi(X,piwo), lubi(X,ciastka).

Reguły zapisujemy w pliku z rozszerzenie .pl w bazie danych.

32

Przykład użycia reguły 33

Reguły, przykłady

Weźmy zapis o siostrach, przyjmijmy:

Dwuargumentowy predykat siostra(X,Y) mówiący, że X jest siostrą Y jeżeli:

X jest kobietą,

Matką X jest M, a ojcem X jest O,

Y ma takich samych: matkę i ojca, jak X.

Zapiszmy to w postaci reguły:

siostra(X,Y) :-

kobieta(X),

rodzice(X,M,O),

rodzice(T,M,O).

To samo możemy zapisać w jednym wierszu.

34

Reguły, przykłady

Rozważmy przykład złodzieja: dana osobamoże coś ukraść, jeśli jest złodziejem, i coś lubi

bo np. to coś jest wartościowe. Zapiszmy to w

Prologu:

moze_ukrasc(P,T) :- zlodziej(P), lubi(P,T).

P – potencjalny złodziej.

T – kradziona rzecz.

/*1*/ zlodziej(jan).

/*2*/ lubi(maria, czekolada).

/*3*/ lubi(maria,wino).

/*4*/ lubi(jan,X) :- lubi(X,wino).

/*5*/ moze_ukrasc(X,Y) :- zlodziej(X), lubi(X,Y).

35

Definicja lubi składa się z 3 klauzul:

Dwóch faktów.

Jednej reguły.

Jan kradnie Marie? 36

?- moze_ukrasc(jan,X).

/*1*/ zlodziej(jan).

/*2*/ lubi(maria, czekolada).

/*3*/ lubi(maria,wino).

/*4*/ lubi(jan,X) :- lubi(X,wino).

/*5*/ moze_ukrasc(X,Y) :- zlodziej(X), lubi(X,Y).

Sposób myślenia języka Prolog:

Aby ukraść cokolwiek, Jan musi być przede wszystkim złodziejem – z klauzuli nr 1 wynika że warunek ten jest spełniony,

Jan musi lubić to co ma ukraść, bo po co kraść coś czego się nie lubi.

Klauzula 4: Jan lubi wszystko to, co lubi wino.

Klauzula 3: Maria lubi wino, a więc z klauzuli 4 wiemy, że Jan lubi Marie.

Spełnione są obydwa warunki:

Jan jest złodziejem oraz Jan lubi Marię.

Wynika z tego, że Jan może ukraść Marię.

Jan kradnie Marie. 37

Prolog z bliska

Składnia języka Programy składają się z termów.

Term to stała, zmienna lub struktura.

Term zapisywany jest jako ciąg znaków, możemy używać następujących

znaków:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

a b c d e f g h i j k l m n o p q r s t u v w x y z

0 1 2 3 4 5 6 7 8 9

! ’’ # $ % & ’ ( ) = - ^ | \ { } [ ] _ ` @ + : * ; < > . , ? /

Każdy rodzaj termu: stałe, zmienne oraz struktury rządzą się innymi

zasadami ich tworzenia.

38

Stałe – pierwszy rodzaj termów. Stałe nazywają konkretne obiekty i konkretne relacje.

Rodzaje stałych:

atom: np. lubi, maria, ksiazka, moze_ukrasc, `?-` symbol pytań, `:-` symbol reguł.

liczby np. -17, -2e2, 33.33, 444444, 3.33e-20

Atomy dzielimy na:

Składające się z liter i liczb,

Składające się z symboli.

Jeśli atom ujęty zostanie w pojedynczy apostrof może zawierać dowolne znaki, może się

także zaczynać z dużej litery np. `jan_kowalski` , `jan-kowalski’, `Jan_Kowalski`

39

Zmienne – drugi rodzaj termów. Zmienne mają postać atomów, ale zaczynają się wielką literą, albo

podkreśleniem. Zmienna to inaczej zastępstwo dla danych obiektów.

Przykłady nazewnictwa zmiennych:

X,Y,Z

Odpowiedz, Imie, Nazwisko

Bardzo_opisowa_nazwa_zmiennej

_zmienna

Zmienna anonimowa: oznaczana pojedynczym podkreśleniem _

?- lubi(_,piotr).

Zmiennych anonimowych używamy wtedy, gdy nazwa zmiennej nie maznaczenia. Stosuje się je po to, aby nie wymyślać nazw dla zmiennych, które itak nie zostaną nigdzie dalej wykorzystane.

40

Przykład użycia zmiennych 41

Struktury – trzeci rodzaj termów. Struktury nazywamy termami złożonymi.

Struktura to pojedynczy obiekt, składający się z zestawu innych obiektów.

Te „inne obiekty” nazywamy składnikami struktury.

Składniki struktury są pogrupowane w strukturę.

W prologu strukturę zapisujemy podając funktor oraz jego składniki.

posiada(piotr,ksiazka(pan_tadeusz,mickiewicz)).

Wewnątrz faktu posiada mamy strukturę książka, mającą dwa składniki: tytuł i autora.

posiada(piotr,ksiazka(pan_tadeusz,autor(adam,mickiewicz))).

Jak widać elementem struktury, może był kolejna struktura, w tym przypadku struktura autor.

posiada(piotr,ksiazka(X,autor(adam,Y))).

Struktury mogą być wykorzystywane w zapytaniach i zawierać zmienne. Gdy odpowiedź będzietwierdząca zmienna X zostanie skonkretyzowana tytułem książki, a zmienna Y przyjmie wartośćnazwiska autora, przy założeniu że ma on na imię adam.

Składnia struktur i faktów jest taka sama.

Predykat (w faktach i regułach) jest funktorem struktury.

Argumenty (w faktach i regułach) są składnikami struktury

42

Przykład użycia struktury43

Operatory Funktory możemy zapisywać jako operatory, dla zwiększenia czytelnmości

programów.

Łatwiej jest zapisać „2 + 2 * 2” niżli: +(2, *(2,2)), choć obydwa zapisy znaczą zupełnie to samo.

Operatory nie powodują wykonanie obliczeń, dla Prologu 1 + 1 nie oznacza 2, lecz oznacza +(1,1).

O operatorach musimy znać:

Ich położenie.

Priorytet.

Łączność.

44

Operatory +, -, *, / Są to operatory infiksowe (zapisywane są między swoimi argumentami).

Aby używać operatorów, trzeba ustalić reguły dotyczące kolejności wykonywania

operacji – tzw. priorytety.

Operatory w prologu mają klasę priorytetu. Klasa priorytety to odpowiednia liczba

całkowita, im ta liczba mniejsza, tym priorytet większy.

Łączność operatorów:

Łączność lewostronna.

Łączność prawostronna.

Operatory arytmetyczne posiadają łączność lewostronną, dlatego 4/4/2 jest interpretowane

jako (4/4)/2

Aby wymusić obliczenie możemy zastosować zapis: X is wyrażenie do wyliczenia.

?- X is 2+2*2.

45

Równość i unifikacja Predykat równości, infiksowy operator zapisywany jako =

?- X = Y.

Unifikacja to próba uczynniania X i Y równymi. Predykat równości jest wbudowany (jest z

góry zdefiniowany w Prologu).

46

Struktury są sobie równe, gdy mają taki sam funktor, taką samą liczbę

składników, a odpowiadające sobie składniki są sobie równe.

Arytmetyka Predykaty do porównywania liczb: 47

Arytmetyka a obliczenie 48

Operator infiksowy is Jego prawy argument jest termem, który jest zinterpretowany jako

wyrażenie arytmetyczne.

Wynik wyrażenia arytmetycznego po prawej jest dopasowywany do

lewego argumentu.

Wszystkie wartości wyrażenia po prawej muszą być znane.

P/A to zwykła struktura, natomiast jest traktowana jako wyrażenie

arytmetyczne, dlatego że stoi po prawej stronie operatora is.

Wartość wyrażenia zostaje przyporządkowana do zmiennej Y.

49

Prawa strona wyrażenia is Po prawej stronie możemy użyć następujących wyrażeń.

X + Y

X – Y

X * Y

X / Y

X // Y całkowity iloraz X przez Y

X mod Y reszta z dzielenia X przez Y

oraz najróżniejszych ich kombinacji.

50

Podsumowanie Programista w języku Prolog zadaje pytania, na które zgodnie z załączoną

bazą wiedzy uzyskuje odpowiedź.

Zapytanie to koniunkcja celów jakie mają być spełnione.

Zgodność z faktem spełnia zapytanie od razu.

Reguła pozwala zadania spełniać stopniowo, poprzez spełnienie

koniunkcji jej składowych celów.

Gdy nie można spełnić klauzuli uruchamiany jest proces nawracania.

Nawracanie to przeglądanie dotąd zrealizowanego programu i próba

ponownego spełnienia celu przez znalezienie alternatywnego

rozwiązania.

Po udzieleniu odpowiedzi możemy ponownie wymusić proces nawracania

poprzez wciśnięcie średnika.

51

Zadanie 1. Napisz bazę zad1.pl w taki sposób, aby poniższe zapytania zwróciły

następujące wyniki.

52

Zadanie 2. Napisz bazę zad2.pl w taki sposób, aby poniższe zapytania zwróciły następujące

wyniki.

53

Podczas pisania bazy zdecydowany

zakaz używania faktów typu:

lubi(imie,imie).

Można użyć:

lubi(imie,imie).

lubi(imie,imie).

Zadanie 3.Dane jest drzewo obrazujące relacje ojciec – syn:

Zdefiniuj fakty ojciec(a, b) oraz reguły: dziadek (X,Y), syn(X,Y), brat(X,Y) bazujące na

faktach ojciec(X,Y). Fakty i reguły zapisz do pliku zad3.pl

ojciec(X,Y) oznacza X jest ojcem Y.

dziadek(X,Y) oznacza X jest dziadkiem Y.

syn(X,Y) oznacza X jest synem Y.

brat(X,Y) oznacza X jest bratem Y.

54

Zadanie 4. Utwórz plik zad4.pl zawierający regułę oblicz zawierającą 5

argumentów z czego ostatni pomniejszony o połowę powinien być

równy sumie pierwszego i drugiego argumentu, wymnożonej przez

trzeci argument, podzielonej przez czwarty argument.

oblicz(10,2,3,2,9). ma zwrócić true.

oblicz(15,2,3,2,12.75). ma zwrócić true.

oblicz(11,2,3,0,9). ma zwrócić:

ERROR: //2: Arithmetic: evaluation error: `zero_divisor'

oblicz(10,10,10,10,10). ma zwrócić true.

oblicz(17,10,10,10,10). ma zwrócić false.

55

Zadanie 5. Baza => baza5.pl Napisz reguły:

a(X) Wypisz imiona wszystkich kierowców, którzy poruszają się samochodami o mocy

powyżej 180 koni mechanicznych.

b(X) Wypisz imiona wszystkich kierowców, którzy poruszają się samochodami o mocy

powyżej 180 koni mechanicznych, i poniżej 205 koni mechanicznych, o nadwoziu sedan.

c Wypisz imię kierowcy, rozmiar opony, moc, rodzaj nadwozia w następującym

formacie:

Kierowca = …

Kolor = …

Opona = …

Moc = …

Nadwozie = …

Ale nie wypisuj pojazdów w nadwoziu sedan, oraz o mocy od 170 do 210 koni

mechanicznych. Rozmiar opony niech będzie nie większy niż 16 cali.

56

Baza do zadania nr 5 57

kierowca(piotr,samochod(silnik(100,benzyna),nadwozie(hatchback,zielony),ogumienie(14,zimowe))).

kierowca(adam,samochod(silnik(110,diesel),nadwozie(kombi,zielony),ogumienie(16,letnie))).

kierowca(piotr,samochod(silnik(120,benzyna),nadwozie(sedan,zielony),ogumienie(17,letnie))).

kierowca(michal,samochod(silnik(130,diesel),nadwozie(hatchback,zielony),ogumienie(18,zimowe))).

kierowca(karol,samochod(silnik(140,benzyna),nadwozie(kombi,zielony),ogumienie(19,letnie))).

kierowca(karolina,samochod(silnik(150,diesel),nadwozie(sedan,zielony),ogumienie(20,zimowe))).

kierowca(pawel,samochod(silnik(160,benzyna),nadwozie(hatchback,zielony),ogumienie(13,letnie))).

kierowca(teresa,samochod(silnik(170,diesel),nadwozie(sedan,zielony),ogumienie(16,zimowe))).

kierowca(aleksandra,samochod(silnik(180,benzyna),nadwozie(kombi,zielony),ogumienie(18,zimowe))).

kierowca(beata,samochod(silnik(190,diesel),nadwozie(hatchback,zielony),ogumienie(15,letnie))).

kierowca(agnieszka,samochod(silnik(200,benzyna),nadwozie(sedan,zielony),ogumienie(16,letnie))).

kierowca(anna,samochod(silnik(300,diesel),nadwozie(kombi,zielony),ogumienie(17,zimowe))).

kierowca(karina,samochod(silnik(400,diesel),nadwozie(hatchback,zielony),ogumienie(18,letnie))).

kierowca(zbigniew,samochod(silnik(500,benzyna),nadwozie(sedan,zielony),ogumienie(19,zimowe))).

Dziękuj

58

Recommended