Rozdział IV Wyrażenia proceduralne algorytmów Grzegorz Gacek Patryk Gajewski.

Slides:



Advertisements
Podobne prezentacje
Tablice 1. Deklaracja tablicy
Advertisements

Katarzyna Szafrańska kl. II ti
Język C/C++ Funkcje.
Rekurencja 1 Podprogram lub strukturę danych nazywamy rekurencyjną, (recursive subprogram, recursive data structure) jeżeli częściowo składa się z samej.
Programowanie obiektowe
Język ANSI C Funkcje Wykład: Programowanie komputerów
Wykład 06 Metody Analizy Programów System Hoare
Programowanie I Rekurencja.
Języki programowania C++
PROGRAMOWANIE STRUKTURALNE
Turbo pascal – instrukcje warunkowe, iteracyjne,…
Materiały do zajęć z przedmiotu: Narzędzia i języki programowania Programowanie w języku PASCAL Część 8: Wykorzystanie procedur i funkcji © Jan Kaczmarek.
Instrukcje Instrukcja : definicja obliczenia i określenie sposobu wykonania tego obliczenia. Program : ciąg instrukcji wykonywanych kolejno od pierwszej.
Podstawy informatyki Rekurencja i rekurencja Grupa: 1A
Podstawy informatyki Informatyka stosowana Prowadzący: Grzegorz Smyk
Podstawy informatyki Wirtotechnologia – Funkcje Grupa: 1A
Komunikacja z arkuszem. Iteracje. Funkcje.
Semantyki programów współbieżnych " Determinizm programów sekwencyjnych, " Nie-determinizm programów współbieżnych, " prawdziwa równoległość vs.przeploty.
Wstęp do interpretacji algorytmów
PASCAL (2) dr Anna Kwiatkowska.
Wprowadzenie do programowania w języku Turbo Pascal
Schemat Hornera Mgr inż. Michał Szucki.
Podstawy programowania
ADRESOWANIE WZGLĘDNE I BEZWZGLĘDNE Ćwiczenia
Instrukcje sterujące część 1
Podstawy programowania
Podstawy programowania
Programowanie strukturalne i obiektowe
Pliki tekstowe. Operacje na plikach. mgr inż. Agata Pacek.
Funkcje w Pascalu Przypomnienie wiadomości o procedurach Prowadzący: Anna Kaleta Piotr Chojnacki.
Algorytmy z przykładami w Turbo Pascal 7.0
Instrukcje sterujące część 2
© A. Jędryczkowski – 2006 r. © A. Jędryczkowski – 2006 r.
Wyrażenia w Turbo Pascalu.
Algorytmy i struktury danych
Procedury i funkcje.
PHP: warunki, pętle, switch, break, continue
ANNA BANIEWSKA SYLWIA FILUŚ
Łódź, 3 października 2013 r. Katedra Analizy Nieliniowej, WMiI UŁ Podstawy Programowania Programy różne w C++
Instrukcja warunkowa i wyboru
Elżbieta Fiedziukiewicz
Informatyka MZT1 Wykład 6 Iteracje while i repeat Tablice Rekordy
Wykład 10 typ zbiorowy rekurencja.
Temat 7: Instrukcje warunkowe
Algorytmika Iteracje autor: Tadeusz Lachawiec.
Metody numeryczne szukanie pierwiastka metodą bisekcji
Iteracje w C# Informatyka Cele lekcji: Wiadomości: Uczeń potrafi:
Temat 8: Pętle.
Instrukcje wyboru.
Programowanie proceduralne Podstawy Programowania dla geoinformatyków Wykład 3 Rafał Witkowski, 2015.
PHP Instrukcja warunkowa if Damian Urbańczyk. Warunek? Instrukcję warunkową wykorzystujemy wtedy, gdy chcemy sprawdzić pewien fakt, który może być prawdziwy.
Krakowski Piotr, Woliński Radosław, Kowalski Piotr, Machowski Michał.
Iga Lewandowska I EMII MU
Pętle Zajęcia 6.
Wstęp do interpretacji algorytmów
Listy Listy w Prologu mogą przechowywać dane dowolnego typu [alpha,beta,gamma,delta] [1,2,3] Sama lista również może zawierać listę: [[a,list,within],a,list]
Pętle – instrukcje powtórzeń
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
Instrukcje warunkowe w php. Pętla FOR Czasem zachodzi potrzeba wykonania jakiejś czynności określoną ilość razy. Z pomocą przychodzi jedna z najczęściej.
Temat 3: Podstawy programowania Algorytmy – 2 z 2 _________________________________________________________________________________________________________________.
Testy jednostkowe. „Test jednostkowy (unit test) to fragment kodu, który sprawdza inny fragment kodu”
Algorytmy. Co to jest algorytm? Przepis prowadzący do rozwiązania zadania.
Algorytmy, sposoby ich zapisu.1 Algorytm to uporządkowany opis postępowania przy rozwiązywaniu problemu z uwzględnieniem opisu danych oraz opisu kolejnych.
Nawracanie i odcięcie Jakub Czoboda, Jezierski Aleksander, Skierkowski Paweł, Bembenista Kamil, Martynowski Witold.
Piotr Kawałek , Mateusz Śliwowski
Rekurencja - Haskell Bartosz Pawlak Sebastian Żółtowski Adam Stegenda Krystian Sobótka Tomasz Gołębiewski.
Rozdział 5 REKURENCJA.
Dane wejściowe/wyjściowe Wbudowane predykaty
Haskell Składnia funkcji.
Instrukcja warunkowa if
Zapis prezentacji:

Rozdział IV Wyrażenia proceduralne algorytmów Grzegorz Gacek Patryk Gajewski

Proceduralny Prolog Jak wiemy Prolog łączy programowanie proceduralne z nieproceduralnym. W tym rozdziale omówimy język programowania, jakim jest Prolog, od strony proceduralnej. Przedstawione zostaną programy przekształcone z innych języków na Prolog. Przez niektórych uważane jest, że Prolog nie powinien zawierać programowanie proceduralnego. Jednak ze jest to niewłaściwe podejście. Prolog powinien być kompromisem programowanie nieproceduralnego z proceduralnym.

Wyrażenia warunkowe Istotną różnicą pomiędzy Prologiem, a innymi językami programowania jest to ze procedury w Prologu mogą mieć wiele definicji, a każda być stosowana w różnych warunkach. W Prologu wyrażenia warunkowe są zwykłymi zależnościami i w przeciwieństwie do programowania proceduralnego nie trzeba stosować IF ani CASE, ale inne definicje procedur.

Przykład wypisywania nazw liczb: PascalProlog procedure writename(X:integer); Begin case X ofwritename(1) :- write(‘One’). 1:write(‘One’);writename(2) :- write(‘Two’). 2:write(‘Two’):writename(3) :- write(‘Three’). 3:write(‘Three’) end end;

Kluczem do efektywnego programowania w Prologu jest uczynienie każdej logicznej jednostki programu jako osobną procedurę. Każda decyzja, która klauzula powinna być wykonana powinna być podejmowana w trakcie działania procedury. Za każdym razem jak ma być podjęta decyzja, Prolog wywołuje procedury i wybiera właściwą klauzule do wykonania.

Operator CUT Wróćmy do przykładu wypisywania nazw liczb. A o gdybyśmy chcieli, aby program wypisywał, że wyszliśmy poza zakres w przypadku podania nieuwzględnionej liczby? writename(1) :- write(‘One’). writename(2) :- write(‘Two’). writename(3) :- write(‘Three’). writename(X) :- X<1, write(‘Out of range’). writename(X) :- X>3, write(‘Out of range’). Jest to poprawny przykład, ale brakuje mu zwięzłości. Program aby powiedzieć, że liczba jest z poza przedziału musi przetestować dwie ostanie klauzule.

Spróbujmy inaczej: writename(1) :- write(‘One’). writename(2) :- write(‘Two’). writename(3) :- write(‘Three’). writename(_) :- write(‘Out of range’). Sposób ten jest niewłaściwy, ponieważ weźmy na przykład zapytanie ?-writename(1). Wypisze nam zarówno „One” jak i „Out of range” gdyż do obu będzie pasować.

Z pomocą przychodzi nam operator cut, pisany przy pomocy znaku wykrzyknika -! Pozwala on na zablokowanie procesu nawrotu w wybranym miejscu. W efekcie można uniknąć wyszukiwania niechcianych, zbędnych, a czasem wręcz niepoprawnych rozwiązań. Oto oprawiony przykład: writename(1) :-!, write(‘One’). writename(2) :-!, write(‘Two’). writename(3) :-!, write(‘Three’). writename(_) :- write(‘Out of range’).

Red Cuts and Green Cuts Red Cuts- są to odcięcia dodawane w celu ograniczenia zbioru rozwiązań. Green Cuts- odcięcia dodawane w celu poprawienia wydajności programu.

Przykład wypisywania nazw liczb z użyciem green cut: writename(1) :- !, write(‘One’). writename(2) :- !, write(‘Two’). writename(3) :- !, write(‘Three’). writename(X) :-X<1, !, write(‘Out of range’). writename(X) :-X>3, write(‘Out of range’). Dzięki temu wyeliminowaliśmy nawracanie.

Przykład wypisywania nazw liczb z użyciem red cut: writename(1) :-!, write(‘One’). writename(2) :-!, write(‘Two’). writename(3) :-!, write(‘Three’). writename(_) :- write(‘Out of range’). Pozwala nam to na zaoszczędzenie czasu gdyż jeśli X=1 wykonana zostanie pierwsza klauzula, a reszta nigdy nie zostanie wykonana.

Alternatywa dla CUT Alternatywą dla operatora odcięcia jest predykat once(). Zastosowanie tego predykatu spowoduje podanie pierwszego rozwiązania naszego wyrażenia, nie szukając dalszych alternatyw. Zatem dla: writename(1) :- write(‘One’). writename(2) :- write(‘Two’). writename(3) :- write(‘Three’). Użycie ?- once(writename(X)). Spowoduje wypisanie tylko pierwszej opcji.

Struktura IF-THEN-ELSE Inną możliwością osiągnięcia deterministycznych wyborów w Prologu jest użycie struktury if-then-else. Składnia jest następująca: Cel1 -> Cel2 ; Cel3. Co można przeczytać w następujący sposób: Jeśli Cel1 jest prawdą to wykonaj Cel2, jeśli nie to wykonaj Cel3. Przykład: writename(X) :- X = 1 -> write(‘One’) ; write(‘not one’). Co można przetłumaczyć: jeśli X jest równy 1 to napisz,one’ jeśli nie to napisz,not one’.

Strukturę if-then-else możemy zagnieżdżać: write(X) :- ( X = 1 -> write(‘one’) ; X = 2 -> write(‘two’) ; X = 3 -> write(‘three’) ; write(‘out of range’)).

Zawsze prawda lub zawsze fałsz Czasami w celu zachowania wykonywania programu koniecznie jest zagwarantowanie, że cel uda się niezależnie od wyników obliczenia. Na przykład: g(X,Y) :- X<Y, write(X’ less than Y’), !, true. g(X,Y) :- X<Y, write(‘Y less than X’), !, fail. Zapytanie ?- g(2,3). Zwróci „X less than Y” oraz true, a zapytanie ?- g(2,4). Zwróci „Y less than X” oraz false mimo ze jest to prawda.

Powtarzanie poprzez nawracanie Predykat repeat służy do wymuszenia poszukiwania kolejnych rozwiązań. Jest to predykat, który zawsze się powodzi i wymusza „Zmianę kierunku” podczas nawracania. Przykład zastosowania predykatu repeat: typewriter :- repeat, get0(C), C = 115. Po wprowadzeniu ?- typewriter. Program będzie powtarzał się dopóki nie osiągnie wartości true, w tym przykładzie nie przerwie się dopóki nie wciśnięty zostanie klawisz s.

W związku z tym, że predykat repeat zawsze zwraca true, to użycie razem z predykat fail wymuszającym zwrócenie fail, pozwoli na stworzenie nieskończonych pętli: ?-repat, write(‘*’),fail.

Pętle rekurencyjne Rekurencja to wywołanie jakiejś metody przez samą siebie. W pewnym miejscu następuje ponowne wywołanie siebie od początku. Gdybyśmy nie przerwali rekurencji, trwałaby ona w nieskończoność. Przykład rekurencji obliczającej potęgi liczb od 1 do 5: print_squares(I) :- I > 5, !. print_squares(I) :- S is I*I, write(I), write(‘ ‘), write(S), ni, NewI is I+1, print_squares(NewI).

Zasady poprawnej organizacji kodu rekursywnego Określenie warunku zakończenia i kontynuacji pętli Poprawnie działająca pętla rekursywna: Rozpoczyna się w poprawnym miejscu Kończy się w poprawnym miejscu Poprawnie przechodzi z jednego stanu do drugiego

Tail recursion Jest to rodzaj rekurencji gdzie ostatnia operacja ma na celu wywołanie samej siebie lub zwrócenie wyniku końcowego. Taka rekurencja może być wykonana przy pomocy zwykłych funkcji. Później w razie potrzeby można taką funkcję zamienić na iterację. Ale trzeba pamiętać, że niewłaściwe użycie tego może doprowadzić do przepełnienia się stosu. Przykład: test1(N) :- write(N), nI, NewN is N+1, test1(NewN). Funkcja w ostatniej operacji wywołuje siebie samą.

Indeksowanie Indeksowanie pozwala Prologowi na znalezienie od razu szukanego predykatu bez przeszukiwania całej bazy danych. Indeksowanie może bardzo przyspieszyć zapytania. Może również stworzyć zapytania, które mają rekursję w ogonie, gdy w inny sposób nie da się ich uzyskać. Przykład: test8(0) :- write(‘Still going’), nl, test8(0). test8(-1). Wykonanie zapytania ?- test8(0). Spowoduje rekurencyjne wykonanie ogona w związku z czym druga klauzula nigdy się nie wykona. Zapytanie ?-test8(-1). Przejdzie od razu do drugiej klauzuli nie wykonując pierwszej.

Dziękujemy za uwagę !!! :D