Struktury danych i obliczenia w Prologu. Wykonali: Dzięgielewski Patryk Golacik Tomasz Rzepecki Michał Zawadzki Marcin
|
|
- Elżbieta Jasińska
- 7 lat temu
- Przeglądów:
Transkrypt
1 Struktury danych i obliczenia w Prologu Wykonali: Dzięgielewski Patryk Golacik Tomasz Rzepecki Michał Zawadzki Marcin
2 Arytmetyka Przykłady obliczeń w Prologu:?- Y is 2+2. Y=4?- 5 is 3-3. false?- Z is (3.9 / 2.1). Z =
3 Wbudowany predykat is bierze wyrażenie arytmetyczne z jego prawej strony, oblicza je i unifikuje je z wyrażeniem po jego lewej stronie. Wyrażenia w Prologu są bardzo podobne do tych z innych języków programowania. Najprostsze wyrażenie składa się z samej liczby: Cos is 2. Operatory infix: + dodawanie - odejmowanie * mnożenie / dzielenie typu floating-point // dzielenie typu integer mod modulo Funkcje: abs() sqrt() log() exp() wartość bezwzględna pierwiastek kwadratowy logarytm antylogarytm floor() największa wartość typu integer mniejsza lub równa argumentowi round() najbliższa wartość typu integer
4 Kolejność wykonywania działań jest taka sama jak w innych językach programowanie i matematyce. Prolog obsługuje wartości typu floating-point oraz integer i przekształca je w razie potrzeby. Warto zauważyć, że Prolog nie potrafi rozwiązywać równań matematycznych;?- 5 is 2 + Cos. instantiation error może być to zaskakujące, ze względu na fakt, że Prolog potrafi znaleźć niewiadomą w wyrażeniu ojciec(michal, Kto), ale nie w 5 is 2 + Cos. Po namyśle można jednak zauważyć, że pierwsze zapytanie może zostać rozwiązane poprzez podstawienie wszystkich z możliwych zależności, natomiast drugie zapytanie nie może być rozwiązane w ten sposób, ponieważ, dla is nie ma zdefiniowany zależności, a próba znalezienia rozwiązania oznaczała by przeszukiwanie nieskończonej liczby potencjalnych liczb w kilku wymiarach. Jedynymi metodami rozwiązania byłaby manipulacja algebraiczna(5 2 = Cos) lub numeryczna(omówiona w rozdziale 7).
5 Konstruowanie wyrażeń Dużą różnicą między Prologiem, a innymi językami programowania jest to, że inne języki wyliczają wyrażenia arytmetyczne, kiedykolwiek wystąpią, zaś Prolog wylicza je tylko w konkretnych miejscach. Dla przykładu; 2+2 jest wyliczane w 4 tylko wtedy gdy jest argumentem predykatu arytmetycznego, w innych przypadkach jest to tylko jakaś struktura danych składająca się z 2, + i 2: is bierze wyrażenie po prawej stronie, wylicza je i unifikuje rezultat z argumentem po lewej stronie, =:= wylicza dwa wyrażenia i porównuje wyniki, = unifikuje dwa wyrażenia, bez ich wyliczania, Zatem:?- Cos is 2+3. Cos = 5?- 4+1 =:= 2+3. true?- Cos = 2+3. Cos = 2+3
6 Inne porównania(<, >, =<, >=) działają tak jak =:= R is Wyr wylicza Wyr i unifikuje z R Wyr1 =:= Wyr2 - prawda jeśli wyniki obu wyrażeń są równe, Wyr1 =\= Wyr2 - prawda jeśli wyniki obu wyrażeń nie są równe, Wyr1 > Wyr2 Wyr1 < Wyr2 Wyr1 >= Wyr2 Wyr1 =< Wyr2 Uwaga: =< i >=, nie <= i =>.
7 Należy zauważyć, że predykaty porównawcze wymagają konkretnych argumentów; nie możemy powiedzieć: Podaj mi liczbę mniejszą od 20, ponieważ takie zapytanie miałoby nieskończoną liczbę możliwych odpowiedzi. Uwaga: Liczba zmienno-przecinkowa uzyskana w obliczeniach komputerowych prawie nigdy nie jest dokładnie równa jakiejkolwiek innej liczbie zmienno-przecinkowej, nawet jeśli obie wyglądają tak samo na wyjściu. Dzieje się tak, ponieważ komputery liczą w systemie binarnym, a my piszemy liczby w systemie dziesiętnym. Wiele dziesiętnych liczb, jak 0.1 nie ma binarnej reprezentacji ze skończoną liczbą znaków. (Wyrażanie 1/10 w notacji binarnej jest jak wyrażanie 1/3 lub 1/7 w notacji dziesiętnej znaki po prawej stronie kropki powtarzają się w nieskończoność.) W wyniku tego liczby zmienno-przecinkowe są przedmiotem błędów zaokrągleń.
8 Należy zauważyć, że predykaty porównawcze wymagają konkretnych argumentów; nie możemy powiedzieć: Podaj mi liczbę mniejszą od 20, ponieważ takie zapytanie miałoby nieskończoną liczbę możliwych odpowiedzi. Uwaga: Liczba zmienno-przecinkowa uzyskana w obliczeniach komputerowych prawie nigdy nie jest dokładnie równa jakiejkolwiek innej liczbie zmienno-przecinkowej, nawet jeśli obie wyglądają tak samo na wyjściu. Dzieje się tak, ponieważ komputery liczą w systemie binarnym, a my piszemy liczby w systemie dziesiętnym. Wiele dziesiętnych liczb, jak 0.1 nie ma binarnej reprezentacji ze skończoną liczbą znaków. (Wyrażanie 1/10 w notacji binarnej jest jak wyrażanie 1/3 lub 1/7 w notacji dziesiętnej znaki po prawej stronie kropki powtarzają się w nieskończoność.) W wyniku tego liczby zmienno-przecinkowe są przedmiotem błędów zaokrągleń.
9 Ćwiczenie: Wyjaśnij które z podanych zapytań zadziała, nie zadziała lub zwróci błąd, oraz dlaczego:?- 5 is 2+3.?- 5 =:= 2+3.?- 5 = 2+3.?- 4+1 is 2+3.?- 4+1 =:=2+3.?- 4+1 =:= 5.?- Cos is 2+3.?- Cos =:= 2+3.?- Cos is 5.?- Cos =5.
10 Praktyczne obliczenia Uważny czytelnik zauważy, że używając wyrażeń w Prologu, mieszamy dwa style kodowania. Z logicznego punktu widzenia suma i produkt to zależności między liczbami, tak jak ojciec i matka są zależnościami między ludźmi, więc zamiast?- Cos is 2 + 3*4 + 5 powinniśmy pisać?- produkt(3,4,p), suma(2,p,s), suma(s,5,cos) I rzeczywiście wczesne wersje Prologa tak działały, ale te stare podejście ma dwa problemy; jest niepraktycznie i daje wrażenie, że Prolog posiada strategię wyszukiwania dla liczb, co nie jest prawdą. Używamy więc wyrażeń.
11 Jeśli chcemy implementować numeryczne algorytmy, musimy zdefiniować własne predykaty. Dla przykłady zdefiniujmy predykat close_enough/2 który zadziała dla dwóch liczb różniących się o To pozwoli nam porównać liczby zmienno-przecinkowe bez bycia zmylonymi przez błędy zaokrągleń. close_enough(x,x) :-!. close_enough(x,y) :- X<Y, Y-X< close_enough(x,y) :- X>Y, close_enough(y,x). Pierwsza klauzula obsługuje przypadek gdy dwa argumenty, jakimś cudem, rzeczywiście są równe, wykrzyknik zapewnia, że jeśli pierwsza klauzula się wykona, dwie następne nie będą uruchomione. Druga klauzula to serce obliczeń; porównaj X i Y, odejmij mniejszą od większej, i sprawdź czy różnica jest mniejsza od Trzecia klauzula zajmuje się argumentami w przeciwnej kolejności zamienia je i wywołuje samą siebie ponownie.
12 Teraz wykonamy obliczenia, następujący predykat inicjalizuje Y wartością real square root X jeśli istnieje lub atomem nonexistent jeśli nie; real_square_root(x,nonexistent) :- X < 0.0. real_square_root(x,y) :- X >= 0.0, Y is sqrt(x). Przykład użycia:?- real_square_root(9.0,root). Root =3.0?- real_square_root(-1.0,root). Root =nonexistent Należy zauważyć, że zapytanie real_square_root(121.0,11.0) prawdopodobnie zawiedzie, ponieważ 11.0 nie równa się dokładnie zmienno-przecinkowemu wynikowi sqrt pomimo, że pierwiastek ze 121 wynosi dokładnie 11. Możemy to naprawić wykorzystując nasz predykat close_enough. Wymaga to następującej redefinicji real_square_root
13 real_square_root(x,nonexistent) :- X < 0.0. real_square_root(x,y) :- X >= 0.0, R is sqrt(x), close_enough(r,y). Teraz mamy nasz pożądany rezultat:?- real_square_root(121.0, 11.0) true Wreszcie, wykorzystajmy zdolność Prologa do zwracania alternatywnych odpowiedzi, każda dodatnia liczba rzeczywista ma dwa pierwiastki kwadratowe, jeden dodatni i jeden ujemny.
14 Potrzebujemy dodatkowych klauzul dla alternatyw, ponieważ arytmetyka w Prologu jest całkowicie deterministyczna; real_square_root(x,y) :- X > 0.0, R is -sqrt(x), close_enough(r,y). To daje nam alternatywną metodę znajdowania pierwiastka. Teraz każde wywołanie zakończone sukcesem zwróci dwa wyniki:?- real_square_root(9.0,root). Root =3.0 Root =-3.0
15 Testowanie dla inicjalizacji Jak dotąd real_square_root wymaga aby pierwszy argument był zainicjalizowany, ale z drobnymi zmianami może zostać wyposażony w wymienność niewiadomych. Używając X i Y nasza strategia wygląda tak: Jeśli X jest znane unifikuj Y z pierwiastkiem z X lub ujemnym pierwiastkiem z X(alternatywne rozwiązania). Jeśli Y jest znane, unifikuj X z Y*Y. Aby to osiągnąć musimy sprawdzić czy X i Y są zainicjalizowane. Prolog dostarcza dwa predykaty w tym celu: var który zwraca prawdę jeśli argument jest niezainicjalizowany oraz nonvar, który zwraca prawdę, jeśli argument ma wartość. Możemy zatem udoskonalić real_square_root;
16 real_square_root(x,nonexistent) :- nonvar(x), X < 0.0. real_square_root(x,y) :- nonvar(x), X >= 0.0, R is sqrt(x), close_enough(r,y). real_square_root(x,y) :- nonvar(x), X > 0.0, R is -sqrt(x), close_enough(r,y). real_square_root(x,y) :- nonvar(y), Ysquared is Y*Y, close_enough(ysquared,x). Tutaj klauzula 4 zapewnia metodę wyliczenia X z Y, a użycie nonvar zapewnia, że właściwa klauzula zostanie wybrana i nie będziemy próbować liczyć lub porównywać niezainicjalizowanych zmiennych.
17 Listy Jedną z najważniejszych struktur danych Prologa jest lista. Lista to posortowana sekwencja zera lub więcej termów wypisanych w nawiasach kwadratowych, oddzielonych kropkami: [alpha,beta,gamma,delta] [1,2,3,go] [(2+2),in(austin,texas),-4.356,X] [[a,list,within],a,list] Elementy listy mogą być termami dowolnego typu, włączając w to inne listy. Pusta lista to []. Warto zauważyć, że jednoelementowa lista [a] nie jest równa atomowi a. Listy mogą być konstruowane bądź rozkładane poprzez unifikacje. Cała lista może oczywiście równać się jednej zmiennej. Unify With Result [a,b,c] X X=[a,b,c]
18 Także, odpowiadające element dwóch list mogą być unifikowane jedna do drugiej Unify With Result [X,Y,Z] [a,b,c] X=a,Y=b, Z=c [X,b,Z] [a,y,c] X=a,Y=b, Z=c Ta zasada odnosi się także do list lub struktur zagnieżdżonych w listach Unify With Result [[a,b],c] [X,Y] X=[a,b], Y=c [a(b),c(x)] [Z,c(a)] X=a, Z=a(b) Co ważniejsze jakakolwiek lista może zostać podzielona na głowę i ogon poprzez symbol. Głową listy jest pierwszy element, zaś ogonem lista pozostałych elementów(może być pusta). Każda nie pusta lista ma głowę i ogon; [a [b,c,d]] = [a,b,c,d] [a []] = [a]
19 Term [X Y] unifikuje z jakąkolwiek nie pustą listą, inicjalizując X do głowy i Y do ogona: Unify With Result [X Y] [a,b,c,d] X=a, Y=[b,c,d] [X Y] [a] X=a, Y=[] Jak dotąd jest jak rozróżnienie CAR-CDR w Lispie, ale w przeciwieństwie do CAR i CDR, może wziąć pod uwagę więcej niż jeden początkowy element w pojedynczym kroku: [a,b,c [d,e,f]] = [a,b,c,d,e,f]
20 Co naprawdę przydaję się w unifikacji: Unify With Result [X,Y Z] [a,b,c] X=a, Y=b, Z=[c] [X,Y Z] [a,b,c,d] X=a, Y=b, Z=[c,d] [X,Y,Z A] [a,b,c] X=a, Y=b, Z=c, A=[] [X,Y,Z A] [a,b] fails [X,Y,a] [Z,b,Z] X=Z=a, Y=b [X,Y Z] [a W] X=a, W=[Y Z] Proces konstrukcji i rozkładania list jest wykonywany głównie poprzez unifikację, nie przez procedury. To znaczy, że serce procedury przetwarzającej listę jest często w notacji, która opisuje strukturę argumentów. Aby się do tej notacji przyzwyczaić, zdefiniujmy przetwarzający predykat: third_element([a,b,c Rest],C).
21 Osiąga on sukces, jeśli pierwszy argument jest listą, a drugi jest trzecim elementem listy. Posiada kompletną wymienność niewiadomych, więc:?- third_element([a,b,c,d,e,f],x). X= c?- third_element([a,b,y,d,e,f],c). Y= c?- third_element(x,a). X= [_0001,_0002,a _0003] W ostatnim użyciu predykatu, komputer nie wie nic o X poza tym, że jest lista, której trzecim elementem jest, więc tworzy listę z niezainicjalizowanym 1 i 2 elementem, następnie a, a po nim niezainicjalizowany ogon.
22 Przechowywanie danych w listach Listy mogą przechowywać dane podobnie jak rekordy w w COBOL-u bądź Pascalu. Dla przykładu; ['Michael Covington', '285 Saint George Drive', 'Athens', 'Georgia', '30606'] Jest to rozsądna metoda przedstawienia adresu, z polami dla imienia, ulicy, miasta, stanu oraz adresu pocztowego. Procedury takie jak third_element mogą wydobywać bądź wprowadzać dane do takiej listy.
23 Zasadniczą różnicą jest fakt, że pomiędzy listą, a rekordem danych jest fakt, że liczba elementów listy nie musi być z góry zadeklarowana. Kolejną różnicą jest to, że elementy listy nie muszą być żadnego konkretnego typu. Atomy, struktury i liczby mogą być dowolnie wykorzystywane w jakiejkolwiek kombinacji. Co więcej, lista może zawierać inną listę jako jeden ze swoich elementów. ['Michael Covington', [['B.A',1977], ['M.Phil.',1978], ['Ph.D.',1982]], 'Associate Research Scientist', 'University of Georgia'] W tym przykładzie główna lista posiada cztery elementy: imię, listę tytułów naukowych, stanowisko w pracy, pracodawca. Lista stopni naukowych posiada 3 elementy z których każdy jest dwu-elementową listą zawierającą stopień i datę. Zauważmy, że liczba stopni naukowych na osobę nie jest ograniczona; ta sama struktura może obsłużyć osobę bez żadnych luz z kilkunastoma.
24 Listy w Prologu mogą posłużyć jako zamiennik dla tablic z innych języków programowania. Np. macierz liczb może być przedstawiona jako lista list: [[1,2,3], [4,5,6], [7,8,9]] Istnieje jednak ważna różnica, w tablicy każdy element ma taki sam czas dostępu, pracując na liście komputer musi zawsze zaczynać od początku i przechodzić element po elemencie.
25 Rekurencja Aby całkowicie wykorzystać potencjał list, potrzebujemy metody pracowania z elementami listy, bez potrzeby określania ich pozycji z wyprzedzeniem. Rozwiązaniem jest rekurencja, czyli metoda kiedy procedura wywołuje samą siebie. Zdefiniujmy predykat member(x,y) który zwraca prawdę, jeśli X jest elementem tablicy Y. Nie wiemy z góry ile elementów posiada lista Y, nie możemy więc użyć skończonej liczby predeterminowanych pozycji, musimy kontynuować sprawdzanie, dopóki nie znajdziemy X lub elementy Y nie skończą się.
26 Zanim zajmiemy się samą rekurencją, pomyślmy nad dwoma specjalnymi przypadkami które nie są powtarzalne: 1) Jeśli Y jest puste, zwróć fałsz bez dalszych czynności, ponieważ nic nie jest elementem pustej listy, 2) Jeśli X jest pierwszym elementem Y zwróć prawdę bez dalszych czynności. Z pierwszą sytuacją uporamy się upewniając się, że we wszystkich naszych klauzulach, drugi argument jest czymś co nie unifikuje się z pustą listą, pusta lista nie ma ogona, więc możemy wykluczyć puste listy pozwalając drugiemu argumentowi być listą, która ma zarówno głowę jak i ogon. member(x,[x _]). Następnie rekurencyjna część: member(x,[_ Ytail]) :- member(x,ytail). Przykładowe uzycie:?- member(c,[a,b,c]).
27 To nie pasuje do klauzuli 1, więc program kontynuuje do drugiej, ta z kolei generuje nowe zapytanie:?- member(c,[b,c]). Ponownie, klauzula 1 nie pasuje, ale klauzula 2 już tak i generuje nowe zapytanie:?- member(c,[c]). Tym razem zadziała klauzula 1, ponieważ [c] jest równoznaczne z [c []], zapytanie kończy się sukcesem, zgodnie z oczekiwaniami.
28 Liczenie elementów listy Oto rekurencyjny algorytm do liczenia elementów listy: 1) Jeśli lista jest pusta, to ma 0 elementów, 2) W innym wypadku, pomiń pierwszy element, policz liczbę pozostałych elementów i dodaj 1. Druga z tych klauzul jest rekurencyjna ponieważ, w celu policzenia elementów listy, musisz policzyć elementy innej, mniejszej liczby. Algorytm zapisany w Prologu ma postać: list_length([],0). list_length([_ Tail],K) :- list_length(tail,j), K is J + 1.
29 Rekurencja kończy się ponieważ lista w końcu stanie się pusta po usuwaniu kolejnych elementów. Przykład użycia:?- list_length([a,b,c],k0).?- list_length([b,c],k1).?- list_length([c],k2).?-listl_ength([],0).?- K2 is 0+1.?- K1 is 1+1.?- K0 is 2+1.
30 Łączenie list Co jeśli chcielibyśmy połączyć dwie listy? Np. [a,b,c] z [d,e,f], aby uzyskać [a,b,c,d,e,f]. nie spełni zadania; [[a,b,c] [d,e,f]] daje [[a,b,c],d,e,f], a to nie to czego oczekujemy. Będziemy musieli przejść po pierwszej liście element po elemencie, dodając je do drugiej listy. Na początek zajmijmy się warunkiem ograniczającym, gdyż lista ewentualnie zostanie pusta. append([],x,x). Rekurencyjna klauzula jest mniej intuicyjna, ale bardzo zwięzła: append([x1 X2],Y,[X1 Z]) :- append(x2,y,z). Pierwszy element wynikowy jest taki sam jak pierwszy elemente pierwszej listy. Ogon wyniku jest uzyskany poprzez dołączenie ogona pierwszej listy do całej drugiej listy. Bardziej proceduralnie: Weź pierwszy element pierwszej listy(nazwij X1) Rekurencyjnie dołącz ogon pierwszej listy do całej drugiej listy. Nazwij rezultat Z. Dodaj X1 do początku Z.
31 Z powodu deklaratywnej natury appena jest całkowicie wymienna dla niewiadomych?- append([a,b,c],[d,e,f],x). X= [a,b,c,d,e,f]?- append([a,b,c],x,[a,b,c,d,e,f]). X= [d,e,f]?- append(x,[d,e,f],[a,b,c,d,e,f]). X= [a,b,c] Każde z tych jest deterministyczne istnieje tylko jedno możliwe rozwiązanie, ale jeśli zostawimy dwa pierwsze argumenty niezainicjalizowane, dostaniemy, jako alternatywne rozwiązania, wszystkie możliwe sposoby podzielenia drugiej argumentu na dwie podlisty:?- append(x,y,[a,b,c,d]). X=[] Y=[a,b,c,d] X=[a] Y=[b,c,d] X=[a,b] Y=[c,d] X=[a,b,c] Y=[d] X=[a,b,c,d] Y=[]
32 Rekurencyjne odwracanie list Klasyczny algorytm rekurencyjny dla odwrócenia elementów na liście: Podziel oryginalną listę na head(głowę) i tail(ogon). Rekurencyjnie odwrócić tail(ogon) oryginalnej listy. Stworzyć liste której jedyne elementy są head(głową) oryginalnej listy. Powiązać odwrócony tail(ogon) oryginalnej listy z listą stworzoną w kroku 3. Ponieważ lista staje się krótsza za każdym razem, ograniczający przypadkiem jest pusta lista, którą chcemy zwrócić nie zmienioną. W Prologu: reverse([],[]). % Klauzula 1 reverse([head Tail], Result) :- % Klauzula 2 reverse(tail,reversedtail), append(reversedtail,[head],result).
33 Jest to tłumaczenie klasycznego algorytmu odwracania listy Lisp-a (rodzina języków programowania) znany jako naive reversal albo NREV i często używany do testowanie prędkości realizacji Lisp-a i Prolog-a. Jego naiwność polega na jego wielkiej nieskuteczności. Można pomyśleć ze 8 elementowa lista możliwa jest do odwrócenia w 8-9 krokach. Z tym algorytmem jednak odwrócenie 8 elementowej listy potrzebuje 45 kroków 9 wezwań do odwrócenia, a następnie 36 wezwań do dołączenia. Jedną z rzeczy którą można powiedzieć na korzyść algorytmu jest to, że lubi wymienność niewiadomych przynajmniej przy pierwszym rozwiązaniu każdego pytania. Lecz jeżeli pierwszy argument jest niezainicjowany, drugi argument jest listą i prosimy o więcej niż jedno rozwiązanie zaczynają się dziać różne dziwne rzeczy. Ćwiczenie Wstawiając kilka writes i nls, spraw by reverse wyświetliło argumenty każdego wezwania do siebie i każde wezwanie do dodania. Następnie spróbuj pytania reverse(what, [a,b,c]), poproś o alternatywne rozwiązania i zobacz co się stanie. Pokaż swoją zmodyfikowaną wersję reverse i jego wynik.
34 Szybszy sposób na odwracanie list Oto algorytm który odwraca listy o wiele szybciej ale kosztem możliwości wymiany niewiadomych. fast_reverse(original,result) :- nonvar(original), fast_reverse_aux(original,[],result). fast_reverse_aux([head Tail],Stack,Result) :- fast_reverse_aux(tail,[head Stack],Result). fast_reverse_aux([],result,result). Pierwsza klauzula sprawdza czy oryginalna lista rzeczywiście jest zainicjowana, następnie wywołuje trzy argumentową procedurę nazywaną fast_reverse_aux. Ideą jest przesuniecie elementów jeden po drugim, podnosząc je z początku oryginalnej listy i dodawanie ich do nowej listy służącej jako stos. Nowa lista staje się odwróconą kopią oryginalnej listy. Przez wszystkie wezwania rekurencyjne, Result(wynik) jest niezainicjowany, na końcu zainicjowywujemy go i przekazujemy z powrotem do procedury wezwań.
35 ?- fast_reverse_aux([a,b,c],[],result).?- fast_reverse_aux([b,c],[a],result).?- fast_reverse_aux([c],[b,a],result).?- fast_reverse_aux([],[c,b,a],[c,b,a]). Ten algorytm odwróci n-elementową listę w n+1 krokach. W pierwszej klauzurze załączyliśmy nonvar by fast_reverse zawiodło jeżeli pierwszy argument jest niezainicjowany. Bez tego niezainicjowany argument wprowadził by komputer w niekończące się obliczanie, tworząc dłuższe i dłuższe listy niezainicjowanych zmiennych która żadna nie była by rozwiązaniem. Ćwiczenie Pokaż że fast_reverse działa jak opisaliśmy. Zmodyfikuj by wypisywało argumenty każdego wezwania rekurencyjnego byś mógł zobaczyć co się dzieje z algorytmem.
36 Ciąg znaków Są trzy sposoby na zaprezentowanie ciągu znaków w Prologu: 1) Jako atom. Atomy są kompaktowe ale ciężkie do rozdzielenia lub manipulowania. 2) Jako lista kodów ASCII. Możesz użyć na nich standardowej listy technik przetwarzania. 3) Jako lista jedno znakowych atomów. Ponownie możesz użyć na nich standardowej listy technik przetwarzania. W Prologu jeśli wpiszesz znak w cuszysłowiu ( tak jak tu ), komputer interpretuje to jako liste kodów ASCII. Tak więc abc i [97,98,99] są takie same w terminologi Prologu. Taki listy kodów ASCII tradycyjnie nazywane są Stringami.
37 Natychmiastowym problemem jest to że nie ma standardowego sposobu na wyświetlenie znaku, ponieważ write i display wypisują listę numerów:?- write("abc"). [97,98,99] yes Prosta procedura wyświetlania stringów: write_str([head Tail]) :- put(head), write_str(tail). write_str([]). Rekurencja jest prosta do śledzenia. Jeżeli string nie jest pusty (tak więc będzie się zgadzał [Head Tail]) wypisze pierwszą pozycjie i powtórz procedure dla pozostałych pozycji. Kiedy String stanie się pusty, zakończ powodzeniem bez kolejnych akcji. Stringi są listami w każdym sensie słowa i kazda lista technik przetwarzania może być na nich użyta. Tak więc reverse odwróci string-a, append zwiąże lub podzieli string i tak dalej.
38 Zdefiniuj Prologa przewidź print_split który, gdy otrzyma stringa, wypisze wszystkie możliwe sposoby podziału stringu na dwa tak jak to:?- print_splits("university"). university u niversity un iversity uni versity univ ersity unive rsity univer sity univers ity universi ty universit y university yes
39 Wprowadzenie linii jako string lub atom Łatwo sprawić by Prolog czytał całą linie wprowadzeń do pojedynczego stringa. Ideą jest unikanie używania read, a zamiast tego używania get 0 do wprowadzania znaków dopóki nie dojdziemy do końca linii. Okazuje się że algorytm potrzebuje jednego znaku LOOKAHEAD- nie może zdecydować co zrobić z każdym znakiem dopóki nie będzie wiedział czy kolejny znak jest znacznikiem końca linii. Wiec oto sposób jak to zrobić % read_str(string) % Accepts a whole line of input as a string (list of ASCII codes). % Assumes that the keyboard is buffered. read_str(string) :- get0(char), read_str_aux(char,string). read_str_aux(-1,[]) :-!. % end of file read_str_aux(10,[]) :-!. % end of line (UNIX) read_str_aux(13,[]) :-!. % end of line (DOS) read_str_aux(char,[char Rest]) :- read_str(rest). Zauważ ze przewidywanie zaczyna się krótkim komentarzem opisującym to. Od teraz taki komentarz będzie naszą standardową praktyką.
40 Lookahead jest osiągnięty przez przeczytanie jednego znaku, następnie przekazaniem tego znaku do read_str_aux, który dokonuje decyzji, a potem kończy wpisywanie w linii. Konkretnie: 1) Jeżeli Char jest 10 lub 13 (koniec linii) lub -1 (koniec pliku), nie wkładaj nic wiecej, reszta stringu jest pusta. 2) W przeciwnym wypadku postaw Char na początku stringu i rekurencyjnie wkładaj jego resztę w ten sam sposób. Cięcia w read_str_aux zapewniają że jeżeli jakakolwiek z pierwszych trzech klauzul zakończy się powodzeniem ostatnia klauzula nie będzie nigdy wypróbowywana. Celem cięć w tym przypadku jest zachowanie ostatniej klauzuli przed dopasowywaniem nieodpowiednich wartości Char-ów. Zauważcie ze read_str zakłada ze input klawiatury jest buforowany. Jeżeli klawiatura jest nie buforowana read_str będzie wciąż działał, ale jeżeli użytkownik użyje backspace podczas wpisywania backspace nie usunie poprzedniego znaku zamiast tego znak backspace-u pojawi się w stringu.
41 Często chcemy przeczytać całą linie input-u nie jako string ale jako atom. Jest to również proste, ponieważ wbudowane orzeczenie name/2 konwertuje stringi i atomy w obie strony:?- name(abc,what). What = [97,98,99] % equivalent to "abc"?- name(what,"abc"). What = abc?- name(what,"hello there"). What = 'Hello there' yes?- name(what,[97,98]). What = ab Ćwiczenie Uruchom read_str i read_atom na swoim komputerze i sprawdź czy działają tak jak jest to opisane.
42 Struktury Wiele warunków Prologa składa się z funktora wynikającego z zera lub więcej warunków takich jak argumenty: a(b,c) alpha([beta,gamma],x) 'this and'(that) f(g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v) i_have_no_arguments Warunki tej formy nazywane są Structures(Struktury). Funktor zawsze jest atomem, ale argumenty mogą być warunkami każdego typu. Struktura bez argumentów jest po prostu atomem.
43 Dotąd używaliśmy struktur w faktach, zasadach, zapytaniach i wyrażeniach algebraicznych. Struktury są również pozycjami danych w ich własnych prawach. Dla przykładu: person(name('michael Covington'), gender(male), birthplace(city('valdosta'), state('georgia'))) sentence(noun_phrase(determiner(the), noun(cat)), verb_phrase(verb(chased), noun_phrase(determiner(the) ), noun(dog))))
44 Struktury działają jak listy, jednakże są inaczej przechowywane (i bardziej kompaktowo) w pamięci. Struktura a(b,c) zawiera te same informacje jak lista [a,b,c]. W rzeczywistości oba są wymienialne przez =..?- a(b,c,d) =.. X. X = [a,b,c,d] yes?- X =.. [w,x,y,z]. X = w(x,y,z) Yes?- alpha =.. X. X = [alpha] Yes Zauważcie ze po lewej stronie argument jest zawsze strukturą, kiedy prawa strona argumentu jest zawsze listą której pierwszy element jest atomem.
45 Jedną ważną różnicą jest to że lista jest rozkładana na head i tail, kiedy struktura nie jest. Struktura zjednoczy się z inna strukturą która ma taki sam funktor i tą samą liczbę argumentów. Oczywiście cała struktura również zjednoczy się z pojedynczą zmienna: Unify With Result a(b,c) X X=a(b,c) a(b,c) a(x,y) X=b, Y=c a(b,c) a(x) fails a(b,c) a(x,y,z) fails Ćwiczenie Używając tego co już znasz o listach wykonywania, stwórz orzeczenie reverse_args które bierze dowolną strukture i odwraca kolejność jej argumentów:?- reverse_args(a(b,c,d,e),what). What = a(e,d,c,b)
46 Occurs check Można stworzyć dziwną, zapętloną strukturę by ujednolicić zmienne z strukturą lub listą która zawiera tę zmienną. Takie struktury zawierają wskaźniki do nich samych i prowadzą do niekończących się pętli kiedy wydruk staję się rutyną lub cokolwiek innego próbuje pokrzyżować je. Dla przykładu:?- X = f(x). X = f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f...?- X = [a,b,x] X = [a,b,[a,b,[a,b,[a,b,[a,b,[a,b,[a,b,[a,b[a,b,[a,b[a,b,[a,b...?- f(x) = f(f(x)) X = f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(...
47 Standard ISO zawiera orzeczenie unify_with_occurs_check które sprawdza którykolwiek jeden termin zawierający inny przed próbą ujednolicenia i zawodzi, jeśli tak to:?- unify_with_occurs_check(x,f(x)). no.?- unify_with_occurs_check(x,f(a)). X = f(a) Nasze doświadczenie jest takie ze occurs-check jest rzadko potrzebny w praktycznych programach Prologa, jednak jest czymś czego powinniśmy byś świadomi. Ćwiczenie Który z podanych zapytań tworzy zapętloną strukturę:?- X=Y, Y=X.?- X=f(Y), Y=X.?- X=f(Y), Y=f(X).?- X=f(Y), Y=f(Z), Z=a.
48 Konstruowanie celów na starcie Ponieważ zapytania w Prologu są strukturami, możesz je traktować jako dane i konstruować je podczas uruchomienia programu. Wbudowane orzeczenie call wykonuje swoje argumenty jako pytanie. Tak więc call(write( hello there )) jest równoznaczne z write( hello there ). Siła call-a pochodzi z faktu ze cel może być stworzony przez obliczenie i wykonanie. Dla przykładu: answer_question :- write('mother or father? '), read_atom(x), write('of whom? '), read_atom(y), Q =.. [X,Who,Y], call(q), write(who), nl.
49 Jeżeli użytkownik wpisze mother i cathy wtedy Q stanie się mother(who,cathy). Jest to wtedy wykonywane jako pytanie a wartość Who jest wypisana. Tak więc:?- answer_question. Mother or father? father Of whom? michael charles_gordon yes?- answer_question. Mother or father? mother Of whom? melody eleanor yes
50 Możemy zrobić to nieco bardziej wygodne przez zdefiniowanie orzeczenia Apple (podobne do APPLY w Lisp) które bierze atom oraz listę i tworzy zapytanie używając atomu jako funktora a listy jako argumentów, następnie wykonuje zapytanie. % apply(functor,arglist) % Constructs and executes a query. apply(functor,arglist) :- Query =.. [Functor Arglist], call(query). Cel apple(mother,[who,melody]) ma ten sam efekt co mother(who,melody). Argumenty dawane są przez listę ponieważ ich liczba jest nieprzewidywalna. Prolog zapobiega zdefiniowaniu orzeczenia z dowolną zmienną liczbą argumentów. Ćwiczenie Czy twój Prolog pozwala ci na wpisaniu zmiennej jako cel, zamiast używania call?
51 Strategie przechowywania danych Istnieją trzy miejsca w których mogą być przechowywane dane w programie Prolog: 1) W instancji zmiennej. Jest to mniej trwały sposób przechowywania informacji ponieważ, zmienne istnieją tylko w zasięgu klauzuli która je definiuje. Dalej zmienne tracą swoje wartości na rzecz backtracking-u. 2) W argumentach orzeczeń. Lista argumentów jest jedynym sposobem by procedura Prologa normalnie komunikowała się ze światem. Przez przekazywanie argumentów do siebie kiedy wzywa się rekurencyjnie, procedura może wykonać rekurencyjny proces i zapisać informacje z jednej rekurencji do następnej. 3) W bazie wiedzy. Jest to najbardziej trwały sposób przechowywania informacji. Informacje umieszczone w bazie wiedzy przez asserta lub assertz pozostaje tam dopóki wyraźnie je wycofamy.
52 Prostym przykładem przechowywania wiedzy w bazie wiedzy jest orzeczenie count które mówi ci ile razy zostało wywołane. Dla przykładu:?- count(x). X = 1 yes?- count(x). X = 2 Yes % count(x) % Unifies X with the number of times count/1 has been called. count(x) :- retract(count_aux(n)), X is N+1, asserta(count_aux(x)). :- dynamic(count_aux/1). count_aux(0).
53 Ponieważ count musi zapamiętać informacje z jednego wezwania do następnego bez względu na backtracking lub niepowodzenie, musi przechowywać dane w bazie wiedzy używając assert i retract. Nie ma możliwości by informacje mogły przejść z jednej procedury do innej przez argumenty, ponieważ nie ma możliwości przewidzenia jaka będzie ścieżka wykonywania. Jest kilka powodów by używać assert tylko jako środek ostateczny. Pierwszym jest to ze assert przeważnie zabiera więcej czasu komputerowi niż zwykłe przekazywanie argumentu. Innym powodem jest to że programy używające assert są trudniejsze do zdebugowania. Są jednak słuszne powody używania assert. Jednym z nich jest zapisywanie wyników które zajmują dużo czasu i miejsca do przeliczenia. Dla przykłady algorytm przeszukujący grafy może wykonać ogromną ilość kroków by znaleźć każdą ścieżkę grafu.
54 Kolejnym słusznym użyciem assert jest ustawienie parametrów kontrolnych duzego skomplikowanego programu takiego jak eksperckiego systemu którego użytkownik może używać w kilku trybach. Przez wykonywanie właściwych assert-ów program może ustawić się do wykonywanie funkcji które użytkownik chce wykorzystać w szczególnych sesjach. Ćwiczenie Zdefiniuj procedurę Gengym(x) która generuje nowy atom za każdym razem gdy jest wywołana. Jedyną z możliwości było by sprawić by działało tak:?- gensym(what). What = a?- gensym(what). What = b...?- gensym(what). What = z?- gensym(what). What = za Jednak możesz generować atomy jak tylko chcesz pod warunkiem by się nie powtarzały.
55 Dziękujemy za uwagę
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 =
Prolog struktury danych oraz obliczenia 1. Arytmetyka?- Y is 2+2. Y = 4?- 5 is 3+3. false.?- Z is 4.5 + (3.9 / 2.1). Z = 6.357142857142857. Wbudowany predykat is bierze wyrażenie po prawej, oblicza je
Bardziej szczegółowoProlog 2 (Filip Wroński, Łukasz Betkowski, Paweł Świerblewski, Konrad Kosmatka)
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,
Bardziej szczegółowoProgramowanie w logice
Wydział Matematyki UŁ 14 marca 2007 Plan prezentacji 1 Składnia Termy Stałe Zmienne Struktury 2 Własny operator Przeciążanie operatorów 3 Arytmetyczne i logiczne predykaty systemowe 4 Do zapamiętania Termy
Bardziej szczegółowoProgramowanie strukturalne. Opis ogólny programu w Turbo Pascalu
Programowanie strukturalne Opis ogólny programu w Turbo Pascalu STRUKTURA PROGRAMU W TURBO PASCALU Program nazwa; } nagłówek programu uses nazwy modułów; } blok deklaracji modułów const } blok deklaracji
Bardziej szczegółowoProgramowanie w logice
Programowanie w logice PROLOG cz.1 PROLOG język wysokiego poziomu Powstał w 1972 na Uniwersytecie w Marsylii (Francja) w zespole A.Colmerauer a i F.Roussel a PROgrammation en LOGique, PROgramming in LOGic,
Bardziej szczegółowoDefinicje wyższego poziomu
Definicje wyższego poziomu Interpreter Scheme-a nie będzie narzekad w przypadku wystąpienia niezdefionowanej zmiennej w ciele wyrażenia lambda dopóki nie będzie zastosowana Przykład braku informacji o
Bardziej szczegółowoProgramowanie w Logice
Programowanie w Logice Działanie Prologu Przemysław Kobylański na podstawie [CM2003] Składnia Programy Prologu składają się z termów. Term to stała, zmienna lub struktura (term złożony). Term zapisuje
Bardziej szczegółowoPodstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno
Instrukcja laboratoryjna 6 Podstawy programowania 2 Temat: Funkcje i procedury rekurencyjne Przygotował: mgr inż. Tomasz Michno Wstęp teoretyczny Rekurencja (inaczej nazywana rekursją, ang. recursion)
Bardziej szczegółowoPROLOG INNE PRZYKŁADY MACIEJ KELM
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
Bardziej szczegółowoPascal - wprowadzenie
Pascal - wprowadzenie Ogólne informacje o specyfice języka i budowaniu programów Filip Jarmuszczak kl. III c Historia Pascal dawniej jeden z najpopularniejszych języków programowania, uniwersalny, wysokiego
Bardziej szczegółowoI. Podstawy języka C powtórka
I. Podstawy języka C powtórka Zadanie 1. Utwórz zmienne a = 730 (typu int), b = 106 (typu long long), c = 123.45 (typu double) Wypisz następujące komunikaty: Dane sa liczby: a = 730, b = 106 i c = 123.45.
Bardziej szczegółowo4. Funkcje. Przykłady
4. Funkcje Przykłady 4.1. Napisz funkcję kwadrat, która przyjmuje jeden argument: długość boku kwadratu i zwraca pole jego powierzchni. Używając tej funkcji napisz program, który obliczy pole powierzchni
Bardziej szczegółowoREKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał
REKURENCJA W JĘZYKU HASKELL Autor: Walczak Michał CZYM JEST REKURENCJA? Rekurencja zwana rekursją, polega na wywołaniu przez funkcję samej siebie. Algorytmy rekurencyjne zastępują w pewnym sensie iteracje.
Bardziej szczegółowoCw.12 JAVAScript w dokumentach HTML
Cw.12 JAVAScript w dokumentach HTML Wstawienie skryptu do dokumentu HTML JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.skrypty Java- Script mogą być zagnieżdżane
Bardziej szczegółowoJAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.
IŚ ćw.8 JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania. Skrypty JavaScript są zagnieżdżane w dokumentach HTML. Skrypt JavaScript
Bardziej szczegółowoWidoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?
Część XVIII C++ Funkcje 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? Umiemy już podzielić nasz
Bardziej szczegółowoLuty 2001 Algorytmy (7) 2000/2001 s-rg@siwy.il.pw.edu.pl
System dziesiętny 7 * 10 4 + 3 * 10 3 + 0 * 10 2 + 5 *10 1 + 1 * 10 0 = 73051 Liczba 10 w tym zapisie nazywa się podstawą systemu liczenia. Jeśli liczba 73051 byłaby zapisana w systemie ósemkowym, co powinniśmy
Bardziej szczegółowoznajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Bardziej szczegółowoWskaź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.
Część XXII C++ w 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. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na
Bardziej szczegółowoArytmetyka liczb binarnych
Wartość dwójkowej liczby stałoprzecinkowej Wartość dziesiętna stałoprzecinkowej liczby binarnej Arytmetyka liczb binarnych b n-1...b 1 b 0,b -1 b -2...b -m = b n-1 2 n-1 +... + b 1 2 1 + b 0 2 0 + b -1
Bardziej szczegółowoJęzyki programowania deklaratywnego
Katedra Inżynierii Wiedzy laborki 14 Języki deklaratywne Główne różnice między paradygmatem deklaratywnym a imperatywnym Omów główne cechy paradygmatu programowania w logice na przykładzie Prologa Główne
Bardziej szczegółowoAlgorytmy i struktury danych. Wykład 4
Wykład 4 Różne algorytmy - obliczenia 1. Obliczanie wartości wielomianu 2. Szybkie potęgowanie 3. Algorytm Euklidesa, liczby pierwsze, faktoryzacja liczby naturalnej 2017-11-24 Algorytmy i struktury danych
Bardziej szczegółowoProgramowanie w logice Prolog 2
Programowanie w logice Prolog 2 Listy Lista to uporządkowany ciąg elementów. Elementami listy mogą być dowolne terminy: stałe, zmienne i struktury W Prologu listę zapisujemy następująco: Przykłady [element1,element2,,elementn]
Bardziej szczegółowo1. Wypisywanie danych
1. Wypisywanie danych Przykłady 1.1. Napisz program, który wypisze na ekran słowa Hello, world!. 1 // Przyklad 1: Hello, world! 3 using namespace std; 5 int main() { 6 cout
Bardziej szczegółowoJAVAScript w dokumentach HTML (1)
JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania. Skrypty JavaScript mogą być zagnieżdżane w dokumentach HTML. Instrukcje JavaScript
Bardziej szczegółowoInstrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory
Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory Poniżej pozwoliłem sobie za cytować za wikipedią definicję zmiennej w informatyce.
Bardziej szczegółowoAlgorytm. a programowanie -
Algorytm a programowanie - Program komputerowy: Program komputerowy można rozumieć jako: kod źródłowy - program komputerowy zapisany w pewnym języku programowania, zestaw poszczególnych instrukcji, plik
Bardziej szczegółowoProjekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Publikacja jest dystrybuowana bezpłatnie Program Operacyjny Kapitał Ludzki Priorytet 9 Działanie 9.1 Poddziałanie
Bardziej szczegółowoPASCAL. Etapy pisania programu. Analiza potrzeb i wymagań (treści zadania) Opracowanie algorytmu Kodowanie Kompilacja Testowanie Stosowanie
PASCAL Język programowania wysokiego poziomu Opracowany przez Mikołaja Wirtha na początku lat 70 XX wieku Prosty, z silną kontrolą poprawności Stosowany prawie wyłącznie na uczelniach do nauki programowania
Bardziej szczegółowoLiczby losowe i pętla while w języku Python
Liczby losowe i pętla while w języku Python Mateusz Miotk 17 stycznia 2017 Instytut Informatyki UG 1 Generowanie liczb losowych Na ogół programy są spójne i prowadzą do przewidywanych wyników. Czasem jednak
Bardziej szczegółowoInstrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.
Instrukcje warunkowe i skoku. Spotkanie 2 Dr inż. Dariusz JĘDRZEJCZYK Wyrażenia i operatory logiczne Instrukcje warunkowe: if else, switch Przykłady 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania
Bardziej szczegółowoJęzyki i techniki programowania Ćwiczenia 2
Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...
Bardziej szczegółowolekcja 8a Gry komputerowe MasterMind
lekcja 8a Gry komputerowe MasterMind Posiadamy już elementarną wiedzę w zakresie programowania. Pora więc zabrać się za rozwiązywanie problemów bardziej złożonych, które wymagają zastosowania typowych
Bardziej szczegółowoPo uruchomieniu programu nasza litera zostanie wyświetlona na ekranie
Część X C++ Typ znakowy służy do reprezentacji pojedynczych znaków ASCII, czyli liter, cyfr, znaków przestankowych i innych specjalnych znaków widocznych na naszej klawiaturze (oraz wielu innych, których
Bardziej szczegółowoDZIAŁANIA NA UŁAMKACH DZIESIĘTNYCH.
DZIAŁANIA NA UŁAMKACH DZIESIĘTNYCH. Dodawanie,8 zwracamy uwagę aby podpisywać przecinek +, pod przecinkiem, nie musimy uzupełniać zerami z prawej strony w liczbie,8. Pamiętamy,że liczba to samo co,0, (
Bardziej szczegółowoZmienne, stałe i operatory
Zmienne, stałe i operatory Przemysław Gawroński D-10, p. 234 Wykład 2 4 marca 2019 (Wykład 2) Zmienne, stałe i operatory 4 marca 2019 1 / 21 Outline 1 Zmienne 2 Stałe 3 Operatory (Wykład 2) Zmienne, stałe
Bardziej szczegółowoPascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:
Zmienna i typ Pascal typy danych Zmienna to obiekt, który może przybierać różne wartości. Typ zmiennej to zakres wartości, które może przybierać zmienna. Deklarujemy je w nagłówku poprzedzając słowem kluczowym
Bardziej szczegółowoProgramowanie komputerowe. Zajęcia 1
Programowanie komputerowe Zajęcia 1 Code::Blocks - tworzenie projektu Create New Project Console Application -> C++ Wybierz nazwę projektu Stworzy się nowy projekt z wpisaną funkcją main Wpisz swój program
Bardziej szczegółowo1. Operacje logiczne A B A OR B
1. Operacje logiczne OR Operacje logiczne są operacjami działającymi na poszczególnych bitach, dzięki czemu można je całkowicie opisać przedstawiając jak oddziałują ze sobą dwa bity. Takie operacje logiczne
Bardziej szczegółowoPodstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Bardziej szczegółowoProjekt 4: Programowanie w logice
Języki Programowania Projekt 4: Programowanie w logice Środowisko ECL i PS e W projekcie wykorzystane będzie środowisko ECL i PS e. Dostępne jest ono pod adresem http://eclipseclp.org/. Po zainstalowaniu
Bardziej szczegółowodo instrukcja while (wyrażenie);
Instrukcje pętli -ćwiczenia Instrukcja while Pętla while (póki) powoduje powtarzanie zawartej w niej sekwencji instrukcji tak długo, jak długo zaczynające pętlę wyrażenie pozostaje prawdziwe. while ( wyrażenie
Bardziej szczegółowo12.Rozwiązywanie równań i nierówności liniowych oraz ich układów.
matematyka /.Rozwiązywanie równań i nierówności liniowych oraz ich układów. I. Przypomnij sobie:. Co to jest równanie /nierówność? Rodzaje nierówności. Ogólnie: Równaniem nazywamy dwa wyrażenia algebraiczne
Bardziej szczegółowoOperatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia:
Operatory logiczne Komputery i ich logika AND - && Podstawy programowania w C++ Operatory AND, OR, NOT, XOR Opracował: Andrzej Nowak Bibliografia: CPA: PROGRAMMING ESSENTIALS IN C++ https://www.netacad.com
Bardziej szczegółowoPodstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD
programowania Wykład: 4 Instrukcje sterujące, operatory 1 programowania w C++ Instrukcje sterujące 2 Pętla for for ( instrukcja_ini ; wyrazenie_warunkowe ; instrukcja_krok ) tresc_petli ; instrukcja_ini
Bardziej szczegółowoDefinicje. Algorytm to:
Algorytmy Definicje Algorytm to: skończony ciąg operacji na obiektach, ze ściśle ustalonym porządkiem wykonania, dający możliwość realizacji zadania określonej klasy pewien ciąg czynności, który prowadzi
Bardziej szczegółowoProgramowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++
Programowanie Wstęp p do programowania Klasa 3 Lekcja 9 PASCAL & C++ Język programowania Do przedstawiania algorytmów w postaci programów służą języki programowania. Tylko algorytm zapisany w postaci programu
Bardziej szczegółowoInformatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki
Informatyka I Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2019 1 Plan wykładu
Bardziej szczegółowoWykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu.
Andrzej Wiśniewski Logika I Materiały do wykładu dla studentów kognitywistyki Wykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu. 1 Logika Klasyczna obejmuje dwie teorie:
Bardziej szczegółowoZadanie 1. Potęgi (14 pkt)
2 Egzamin maturalny z informatyki Zadanie 1. otęgi (14 pkt) W poniższej tabelce podane są wartości kolejnych potęg liczby 2: k 0 1 2 3 4 5 6 7 8 9 10 2 k 1 2 4 8 16 32 64 128 256 512 1024 Ciąg a=(a 0,
Bardziej szczegółowoSamodzielnie wykonaj następujące operacje: 13 / 2 = 30 / 5 = 73 / 15 = 15 / 23 = 13 % 2 = 30 % 5 = 73 % 15 = 15 % 23 =
Systemy liczbowe Dla każdej liczby naturalnej x Î N oraz liczby naturalnej p >= 2 istnieją jednoznacznie wyznaczone: liczba n Î N oraz ciąg cyfr c 0, c 1,..., c n-1 (gdzie ck Î {0, 1,..., p - 1}) taki,
Bardziej szczegółowoPodstawy Programowania
Podstawy Programowania Monika Wrzosek Instytut Matematyki Uniwersytet Gdański Matematyka 2017/18 Monika Wrzosek (IM UG) Podstawy Programowania 1 / 119 Sprawy organizacyjne E-mail: mwrzosek@mat.ug.edu.pl
Bardziej szczegółowowagi cyfry 7 5 8 2 pozycje 3 2 1 0
Wartość liczby pozycyjnej System dziesiętny W rozdziale opiszemy pozycyjne systemy liczbowe. Wiedza ta znakomicie ułatwi nam zrozumienie sposobu przechowywania liczb w pamięci komputerów. Na pierwszy ogień
Bardziej szczegółowoNiezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.
Część XIX C++ w Każda poznana do tej pory zmienna może przechowywać jedną liczbę. Jeśli zaczniemy pisać bardziej rozbudowane programy, okaże się to niewystarczające. Warto więc poznać zmienne, które mogą
Bardziej szczegółowoInformacja o języku. Osadzanie skryptów. Instrukcje, komentarze, zmienne, typy, stałe. Operatory. Struktury kontrolne. Tablice.
Informacja o języku. Osadzanie skryptów. Instrukcje, komentarze, zmienne, typy, stałe. Operatory. Struktury kontrolne. Tablice. Język PHP Język interpretowalny, a nie kompilowany Powstał w celu programowania
Bardziej szczegółowoPodstawowe operacje arytmetyczne i logiczne dla liczb binarnych
1 Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych 1. Podstawowe operacje logiczne dla cyfr binarnych Jeśli cyfry 0 i 1 potraktujemy tak, jak wartości logiczne fałsz i prawda, to działanie
Bardziej szczegółowoArytmetyka komputera. Na podstawie podręcznika Urządzenia techniki komputerowej Tomasza Marciniuka. Opracował: Kamil Kowalski klasa III TI
Arytmetyka komputera Na podstawie podręcznika Urządzenia techniki komputerowej Tomasza Marciniuka Opracował: Kamil Kowalski klasa III TI Spis treści 1. Jednostki informacyjne 2. Systemy liczbowe 2.1. System
Bardziej szczegółowoKurs ZDAJ MATURĘ Z MATEMATYKI MODUŁ 2 Teoria liczby rzeczywiste cz.2
1 POTĘGI Definicja potęgi ł ę ę > a 0 = 1 (każda liczba różna od zera, podniesiona do potęgi 0 daje zawsze 1) a 1 = a (każda liczba podniesiona do potęgi 1 dają tą samą liczbę) 1. Jeśli wykładnik jest
Bardziej szczegółowoProgramowanie w logice
Programowanie w logice PROLOG cz.3 Predykat sprawdzający, czy podana lista stanowi początek innej listy: poczatek([],[_ _]). poczatek([h1 T1], [H2 T2]) :- H1 = H2, poczatek(t1,t2). ------------------------------------------------------------------------
Bardziej szczegółowoWstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami
Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami Przykład 1. Napisz program, który dla podanej liczby n wypisze jej rozkład na czynniki pierwsze. Oblicz asymptotyczną złożoność
Bardziej szczegółowoProgramowanie w Logice Struktury danych (Lista 2)
Programowanie w Logice Struktury danych (Lista 2) Przemysław Kobylański Wstęp Struktury danych wyraża się w Prologu w postaci termów, tj. symbolicznych wyrażeń. Dotychczas poznaliśmy proste termy takie
Bardziej szczegółowoWstęp do programowania. Drzewa podstawowe techniki. Piotr Chrząstowski-Wachtel
Wstęp do programowania Drzewa podstawowe techniki Piotr Chrząstowski-Wachtel Drzewa wyszukiwań Drzewa często służą do przechowywania informacji. Jeśli uda sie nam stworzyć drzewo o niewielkiej wysokości
Bardziej szczegółowoNazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.
Nazwa implementacji: Nauka języka Python wyrażenia warunkowe Autor: Piotr Fiorek Opis implementacji: Poznanie wyrażeń warunkowych if elif - else. Nasz kalkulator umie już liczyć, ale potrafi przeprowadzać
Bardziej szczegółowo1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
Bardziej szczegółowoProgramowanie w Baltie klasa VII
Programowanie w Baltie klasa VII Zadania z podręcznika strona 127 i 128 Zadanie 1/127 Zadanie 2/127 Zadanie 3/127 Zadanie 4/127 Zadanie 5/127 Zadanie 6/127 Ten sposób pisania programu nie ma sensu!!!.
Bardziej szczegółowoWHILE (wyrażenie) instrukcja;
INSTRUKCJE ITERACYJNE WHILE, DO WHILE, FOR Instrukcje iteracyjne pozwalają powtarzać daną instrukcję programu określoną liczbę razy lub do momentu osiągnięcia określonego skutku. Pętla iteracyjna while
Bardziej szczegółowo3. Macierze i Układy Równań Liniowych
3. Macierze i Układy Równań Liniowych Rozważamy równanie macierzowe z końcówki ostatniego wykładu ( ) 3 1 X = 4 1 ( ) 2 5 Podstawiając X = ( ) x y i wymnażając, otrzymujemy układ 2 równań liniowych 3x
Bardziej szczegółowoNazwa implementacji: Nauka języka Python pętla for. Autor: Piotr Fiorek
Nazwa implementacji: Nauka języka Python pętla for Autor: Piotr Fiorek Opis implementacji: Poznanie innego rodzaju pętli, jaką jest pętla for w języku Python. Składnia pętli for jest następująca: for
Bardziej szczegółowoSchematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.
Schematy blokowe I Jeżeli po schematach blokowych będzie używany język C, to należy używać operatorów: '&&', ' ', '!=', '%' natomiast jeśli Ruby to 'and', 'or', '%', '!='. 1. Dostępne bloki: a) początek:
Bardziej szczegółowoMETODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH
METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH ĆWICZENIE NR 9 WYRAŻENIA LOGICZNE, INSTRUKCJE WARUNKOWE I INSTRUKCJE ITERACYJNE W PROGRAMIE KOMPUTEROWYM MATLAB Dr inż. Sergiusz Sienkowski ĆWICZENIE NR
Bardziej szczegółowoElżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki
Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki Turbo Pascal jest językiem wysokiego poziomu, czyli nie jest rozumiany bezpośrednio dla komputera, ale jednocześnie jest wygodny dla programisty,
Bardziej szczegółowoLaboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych
1. Wstawianie skryptu na stroną: Laboratorium 1 Do umieszczenia skryptów na stronie służy znacznik: //dla HTML5 ...instrukcje skryptu //dla HTML4 ...instrukcje
Bardziej szczegółowoWstęp do informatyki- wykład 2
MATEMATYKA 1 Wstęp do informatyki- wykład 2 Systemy liczbowe Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion, 2012 www.cplusplus.com Jerzy
Bardziej szczegółowoJAVAScript w dokumentach HTML - przypomnienie
Programowanie obiektowe ćw.1 JAVAScript w dokumentach HTML - przypomnienie JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania. Skrypty JavaScript są zagnieżdżane w
Bardziej szczegółowoJęzyki programowania zasady ich tworzenia
Strona 1 z 18 Języki programowania zasady ich tworzenia Definicja 5 Językami formalnymi nazywamy każdy system, w którym stosując dobrze określone reguły należące do ustalonego zbioru, możemy uzyskać wszystkie
Bardziej szczegółowoWYRAŻENIA ALGEBRAICZNE
WYRAŻENIA ALGEBRAICZNE Wyrażeniem algebraicznym nazywamy wyrażenie zbudowane z liczb, liter, nawiasów oraz znaków działań, na przykład: Symbole literowe występujące w wyrażeniu algebraicznym nazywamy zmiennymi.
Bardziej szczegółowoMetody numeryczne Laboratorium 2
Metody numeryczne Laboratorium 2 1. Tworzenie i uruchamianie skryptów Środowisko MATLAB/GNU Octave daje nam możliwość tworzenia skryptów czyli zapisywania grup poleceń czy funkcji w osobnym pliku i uruchamiania
Bardziej szczegółowoTemat 1: Podstawowe pojęcia: program, kompilacja, kod
Temat 1: Podstawowe pojęcia: program, kompilacja, kod wynikowy. Przykłady najprostszych programów. Definiowanie zmiennych. Typy proste. Operatory: arytmetyczne, przypisania, inkrementacji, dekrementacji,
Bardziej szczegółowoCelem ćwiczenia jest zapoznanie się z podstawowymi możliwościami języka Prolog w zakresie definiowania faktów i reguł oraz wykonywania zapytań.
Paradygmaty Programowania Język Prolog Celem ćwiczenia jest zapoznanie się z podstawowymi możliwościami języka Prolog w zakresie definiowania faktów i reguł oraz wykonywania zapytań. Wstęp Prolog (od francuskiego
Bardziej szczegółowoPliki. Operacje na plikach w Pascalu
Pliki. Operacje na plikach w Pascalu ścieżka zapisu, pliki elementowe, tekstowe, operacja plikowa, etapy, assign, zmienna plikowa, skojarzenie, tryby otwarcia, reset, rewrite, append, read, write, buforowanie
Bardziej szczegółowoPoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.
PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy. 1. Instrukcję case t of... w przedstawionym fragmencie programu moŝna zastąpić: var t : integer; write( Podaj
Bardziej szczegółowoLista 0. Kamil Matuszewski 1 marca 2016
Lista 0 Kamil Matuszewski marca 206 2 3 4 5 6 7 8 0 0 Zadanie 4 Udowodnić poprawność mnożenia po rosyjsku Zastanówmy się co robi nasz algorytm Mamy podane liczby n i m W każdym kroku liczbę n dzielimy
Bardziej szczegółowoB.B. 2. Sumowanie rozpoczynamy od ostatniej kolumny. Sumujemy cyfry w kolumnie zgodnie z podaną tabelką zapisując wynik pod kreską:
Dodawanie dwójkowe Do wykonywania dodawania niezbędna jest znajomość tabliczki dodawania, czyli wyników sumowania każdej cyfry z każdą inną. W systemie binarnym mamy tylko dwie cyfry 0 i 1, zatem tabliczka
Bardziej szczegółowoWstęp do programowania. Różne różności
Wstęp do programowania Różne różności Typy danych Typ danych określa dwie rzeczy: Jak wartości danego typu są określane w pamięci Jakie operacje są dozwolone na obiektach danego typu 2 Rodzaje typów Proste
Bardziej szczegółowoKod U2 Opracował: Andrzej Nowak
PODSTAWY TEORII UKŁADÓW CYFROWYCH Kod U2 Opracował: Andrzej Nowak Bibliografia: Urządzenia techniki komputerowej, K. Wojtuszkiewicz http://pl.wikipedia.org/ System zapisu liczb ze znakiem opisany w poprzednim
Bardziej szczegółowoPowtórka algorytmów. Wprowadzenie do języka Java.
Powtórka algorytmów. Wprowadzenie do języka Java. BEGIN Readln(a); Readln(b); Suma := 0; IF Suma < 10 THEN Writeln( Suma wynosi:, Suma); ELSE Writeln( Suma większa niż 10! ) END. 1. Narysować schemat blokowy
Bardziej szczegółowoWstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.
Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy Laboratorium 2 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Komentarze Funkcja printf() Zmienne Łańcuchy
Bardziej szczegółowoMyśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści
Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop. 2017 Spis treści Przedmowa 11 1. Jak w programie 21 Czym jest program? 21 Uruchamianie interpretera języka Python 22 Pierwszy
Bardziej szczegółowoProgramowanie w języku Python. Grażyna Koba
Programowanie w języku Python Grażyna Koba Kilka definicji Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i
Bardziej szczegółowoOperacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.
Operatory w Javie W Javie występują następujące typy operatorów: Arytmetyczne. Inkrementacji/Dekrementacji Przypisania. Porównania. Bitowe. Logiczne. Pozostałe. Operacje wykonywane są na operandach (argumentach
Bardziej szczegółowoW dowolnym momencie można zmienić typ wskaźnika.
c++ Wskaźniki mają jeszcze jedną przydatną cechę. W dowolnym momencie można zmienić typ wskaźnika. Robi się to za pomocą operatora rzutowania. Najpierw zdefiniujemy sobie wsk_uniwersalny mogący pokazywać
Bardziej szczegółowoObiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.
Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody
Bardziej szczegółowoPodstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.
Podstawy programowania Programowanie wyrażeń 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń. W językach programowania są wykorzystywane
Bardziej szczegółowoPodstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
Bardziej szczegółowox 2 = a RÓWNANIA KWADRATOWE 1. Wprowadzenie do równań kwadratowych 2. Proste równania kwadratowe Równanie kwadratowe typu:
RÓWNANIA KWADRATOWE 1. Wprowadzenie do równań kwadratowych Przed rozpoczęciem nauki o równaniach kwadratowych, warto dobrze opanować rozwiązywanie zwykłych równań liniowych. W równaniach liniowych niewiadoma
Bardziej szczegółowoBash - wprowadzenie. Bash - wprowadzenie 1/39
Bash - wprowadzenie Bash - wprowadzenie 1/39 Bash - wprowadzenie 2/39 Czym jest bash? Rysunek : Zadanie powłoki to ukrycie wywołań systemowych Bash - wprowadzenie 3/39 Czym jest bash? Przykład polecenia:
Bardziej szczegółowoZapisywanie algorytmów w języku programowania
Temat C5 Zapisywanie algorytmów w języku programowania Cele edukacyjne Zrozumienie, na czym polega programowanie. Poznanie sposobu zapisu algorytmu w postaci programu komputerowego. Zrozumienie, na czym
Bardziej szczegółowo