Prezentacja do pobranie: www.barkaf.cba.pl/prezentacja.rar 1 Prolog programowanie ROZDZIAŁ 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
Instalacja Prologu w środowisku Windows 2 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
Instalacja Prologu w środowisku Windows 3 Pobieramy plik wykonywalny, i instalujemy środowisko do programowania w języku Prolog: Po zainstalowaniu mamy skrót w menu start z pozytywnie wyglądającą ikonką:
Uruchomienie zainstalowanego 4 ś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: Skrypty z rozszerzeniem pl zapisujemy w domyślnym katalogu dla skryptów, będzie to zapewne folder Prolog w katalogu Moje dokumenty.
Pierwszy program w Prologu 5 Ł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.
Podstawowe polecenia 6 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 */
Podstawowe polecenia 7 Ł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 baz danych. 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ących zadaną nazwę
Podstawowe polecenia 8 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
Prolog jako język programowania logicznego 9 Programowanie logiczne: - programowanie w logice; - programowanie w języku logiki; Programowanie logiczne, jest to metoda programowania, będąca odmianą programowania deklaratywnego. 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 10 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.
Zastosowanie języka Prolog 11 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.
Pisanie programów w Prologu 12 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 obiektami zwią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.
Obiekty i relacje 13 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).
Obiekt, ale nie programowanie 14 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.
Program w Prologu 15 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.
Programowanie 16 Podstawowe pojęcia: Fakt, Zapytanie, Zmienna, Połączenie, Reguła, Listy, Rekurencje
Programowanie 17 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.
Fakty 18 Przykład: Zasady: lubi(adam,ewa). 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 nawiasach okrą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 nie oznacza że Ewa lubi Adama, aby to określić musimy podać następny fakt lubi(ewa,adam), lub utworzyć odpowiednią regułę. Jako że nazwy obiektów mogą być wieloznaczne, to programista decyduje jak rozumień daną nazwę.
Nazewnictwo 19 Nazwy obiektów występujące w nawiasach nazywamy argumentami. Nazwę relacji znajdującej się przed nawiasem nazywamy predykatem. 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.
1024 argumenty predykatu 20
Zapytania 21 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 fakt lubi(adam,ewa)., oczywiście jeżeli w bazie danych nie ma takiego faktu to zwró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 not correct goal) Oznacza to że nasza baza nie zawiera predykatu cosczegoniema, więc nasze zapytanie nie może uzyskać sensownej odpowiedzi.
Przykład użycia nieistniejącego predykatu 22
Zmienne 23 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 X=pawel no po wciśnięciu średnika otrzymamy po raz kolejny wciskamy średnik i otrzymujemy ponieważ nie ma obiektu spełniającego kryteria wyszukiwania.
Przykład użycia zmiennej 24 Interpretacja: 2) Pytamy kogo lubi obiekt jan. 3) Pytamy przez kogo lubiany jest obiekt jan. 4) Pytamy kto lubi kogo. Uwaga na wielkość liter, bo jan to obiekt z bazy, a Jan to zmienna, której przyporządkowane są wartości.
Koniunkcje, 25 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.
Przykład zastosowania koniunkcji, i dowód na to, że nie wystarczy kogoś lubić, aby też być lubianym 26
Bardziej skomplikowane zapytania 27 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.
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 30 lubią wino?
Reguły 31 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ło moglibyśmy dojść do bezsensownych zapisów np.: Anna jest siostrą Marii, jeśli Karolina jest kobietą oraz Monika i Paulina mają tych samych rodziców. 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ły 32 W 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.
Przykład użycia reguły 33
Reguły, przykłady 34 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.
Reguły, przykłady 35 Rozważmy przykład złodzieja: dana osoba moż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). Definicja lubi składa się z 3 klauzul: Dwóch faktów. Jednej reguły.
Jan kradnie Marie? 36 Sposób myślenia języka Prolog:?- 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). 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 38 Programy składają się z termów. Term to stała, zmienna lub struktura. Składnia języka 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.
Stałe pierwszy rodzaj termów. 39 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`
Zmienne drugi rodzaj termów. 40 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 ma znaczenia. Stosuje się je po to, aby nie wymyślać nazw dla zmiennych, które i tak nie zostaną nigdzie dalej wykorzystane.
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))). 42 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ędzie twierdzą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
Przykład użycia struktury 43
Operatory 44 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ść.
Operatory +, -, *, / 45 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.
Równość i unifikacja 46 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). 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 49 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.
Prawa strona wyrażenia is 50 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.
Podsumowanie 51 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.
Zadanie 1. Napisz bazę zad1.pl w taki sposób, aby poniższe zapytania zwróciły następujące wyniki. 52
Zadanie 2. 53 Napisz bazę zad2.pl w taki sposób, aby poniższe zapytania zwróciły następujące wyniki. Podczas pisania bazy zdecydowany zakaz używania faktów typu: Można użyć: lubi(imie,imie). lubi(imie,imie). lubi(imie,imie).
Zadanie 3. Dane jest drzewo obrazujące relacje ojciec syn: 54 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.
Zadanie 4. 55 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.
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