1. Zmodyfikuj funkcje operujące na ułamkach tak, by wykluczały wystąpienie zera w mianowniku. Wskazówka: zastosuj instrukcję if...then...else i zastosuj wyjątek exception DzieleniePrzezZero. 2. Zadeklaruj typ danych umożliwiający reprezentację ułamków w postaci rekordów. Podaj definicje odpowiednich funkcji. 3. Zmodyfikuj funkcje operujące na ułamkach tak, by następowało każdorazowe skracanie wynikowego ułamka (licznika i mianownika). Użyj funkcji skroc. 4. Ułamki: zmodyfikuj funkcję nastring tak, by ułamek był wyświetlany w postaci właściwej, czyli część całkowita i ułamkowa. Wskazówka: po wyznaczeniu wartości bezwzgl. licznika i mianownika wydziel część całkowitą przez dzielenie div i pozostały licznik reszta z dzielenia, operator mod. 5. Zadeklaruj i przetestuj działanie funkcji rekurencyjnej suma typu : int*int int, gdzie suma(m,n)=m+(m+1)+(m+2)+...+(m+(n-1))+(m+n), m 0, n 0. Wsk.: zapisz dwa warunki dla (m,0) i (m,n). 6. Zadeklaruj samodzielnie infiksową funkcję potęgowania ^^, wskazówka: zastosuj dwa warianty - m^^n = m * m^^(n-1), m^^0=1 7. Opracuj zestaw funkcji arytmetycznych dla liczb zespolonych (++,--,**,// - zob. Wykład 2 Przykłady programów). Sprawdź działanie tych funkcji na kilku przykładach. Uzupełnij zestaw o funkcję sqrt obliczającą pierwiastki liczby zespolonej A+j B. Wsk.: Każdy pierwiastek a+j b musi spełniać równanie (a+j b) (a+j b)=(a+j B) 8. Napisz funkcję obliczającą ułamek do potęgi całkowitej nieujemnej n. Napisz funkcję pomocniczą podnoszącą liczbę do potęgi z dwoma wariantami: - m**n = m * m**(n- 1), m**0=1 9. a) Zadeklaruj i przetestuj działanie funkcji test:int*int*int bool, taką że niepodzielne(a,c) and niepodzielne(a + 1,c)... and niepodzielne(b,c) test(a,b,c) dla b a jest wartością logiczną powyższego wyrażenia. Zatem test(a,b,c) sprawdza, czy liczby w przedziale (a,b) nie są podzielne przez c. b) Zadeklaruj infiksowy operator równoważności i sprawdź jego działanie. 10. Zadeklaruj i przetestuj działanie funkcji pierwsza: int bool, gdzie pierwsza (n)=true wtedy i tylko wtedy, gdy n jest liczba pierwszą. Wsk.: Liczba pierwsza to taka, której podzielnikami są tylko 1 i ona sama. Skonstruuj funkcję pomocniczą pierwsza z dwoma wariantami (kończącym rekurencję) pierwsza (n,2) i pierwsza (n,k) wywoływaną przez zasadniczą: fun pierwsza n = pierwsza' (n,n-1);
11. Zadeklaruj i przetestuj działanie funkcji podzielnaoddo(od,do,dzielnik): int*int*int int, wyszukującej najmniejszą liczbę z przedziału od...do podzielną przez dzielnik. 12. Utwórz następujące funkcje: 1) mnożenia ułamka przez liczbę; 2) dzielenia ułamka przez liczbę; 3) pierwiastkowania ułamka. Napisz funkcję zwracającą odwrotność ułamka. 13. Zadeklaruj i przetestuj działanie funkcji wystodigo:string*int*char int, gdzie wystodigo (str,i,ch)=liczba występowania znaku ch na pozycjach j w stringu str, gdzie j i. Wsk.: Funkcja dla i size str powinna zwracać 0. Zastosuj String.sub. 14. Zadeklaruj funkcję tylkomalelitery: string->bool badającą, czy wszystkie znaki w podanym stringu są małymi literami. Na przykład: tylkomalelitery abc = true tylkomalelitery Abc = false Wsk.: Wykorzystaj funkcję biblioteczną String.sub. Napisz funkcję pomocniczą tylkomale(st,i) wywoływaną przez zasadniczą funkcję: tylkomalelitery(st) = tylkomale(st, size st 1). 15. Zrealizuj funkcję mrn wykonującą mnożenie liczb całkowitych poprzez rekurencyjne dodawanie wykorzystując zależności: m*n = m*0 = 0; dla n=0 m*n = m*1 = m; dla n=1 m*n = m+ m*(n-1) dla n>0 Sprawdź jej działanie dla dodatnich i ujemnych argumentów. Spróbuj zmodyfikować funkcję wzorując się na definicji funkcji silnia. 16. Zadeklaruj kilka rekordów zawierających dane osoby: imię, nazwisko i numer telefonu. Napisz funkcję sprawdzającą, czy dwie osoby mają to samo nazwisko. 17. Zadeklaruj kilka rekordów zawierających dane książki: tytuł, nazwisko autora, rok wydania, cena. Napisz funkcję zmieniającą cenę w podanym rekordzie na nową, jeżeli poprzednio była wpisana wartość większa niż podana. 18. Uzupełnij obsługę wyjątku w funkcji intpprog tak, aby wypisywała wszystkie instrukcje pozostałe jeszcze do wykonania. Wykorzystaj (rekurencyjnie) funkcję wypisz_instr. fun wypisz_instr ( PUSH x) = "PUSH "^(Real.toString x) wypisz_instr ( ^^ ) = " ^^ " wypisz_instr ( ADD ) = " ADD " wypisz_instr ( SUB ) = " SUB " wypisz_instr ( MUL ) = " MUL "; 19. Uzupełnij zestaw instrukcji (deklaracja datatype instruction) o dzielenie. Jak reagować na wyjątek Div zdefiniowany i wywoływany przez moduł biblioteczny Math? Dopisz jego obsługę bezpośrednio w funkcji intinstr stosując konstrukcję handle. Podaj przykład wykonania. Wskazówka: instrukcja handle powinna się znajdować bezpośrednio po operacji y/x.
20. Funkcje arytmetyczne mogą zgłaszać wyjątek Overflow zdefiniowany w module Math. Zastanów się, jak na niego reagować? Napisz obsługę (konstrukcję handle) wyjątku bezpośrednio w funkcji intinstr, dla jednej z instrukcji, aby była zwracana stała wartość (zdefiniowana wcześniej) MAX_REAL. 21. Uzupełnij zestaw instrukcji (deklaracja datatype instruction) o Math.tan. Przy nieprawidłowym argumencie zgłaszany jest przez moduł Math wyjątek Domain (dziedzina). Napisz obsługę wyjątku bezpośrednio w funkcji intinstr, tak aby była zwracana wartość (zdefiniowana wcześniej) MAX_REAL lub ~MAX_REAL. Wskazówka: instrukcja handle powinna się znajdować bezpośrednio po operacji Math.tan x. 22. Wzorując się na programie procesora arytmetycznego zrealizuj procesor logiczny z operatorami koniunkcji i negacji operujący na liście elementów typu bool. Czy możliwe jest zgłaszanie przez nie wyjątków? Oblicz za pomocą programu kalkulatora wartość wyrażenia: not true and true. 23. Wzorując się na programie procesora arytmetycznego zrealizuj procesor logiczny z operatorami alternatywy i negacji operujący na liście elementów typu bool. Czy możliwe jest zgłaszanie przez nie wyjątków? Oblicz pomocą programu kalkulatora wartość wyrażenia: not true or false. 24. Napisz wariant funkcji intpprog, tak aby obliczenia wykonywane były krokowo (kolejny krok po naciśnięciu dowolnego klawisza). Wskazówka: użyj funkcji bibliotecznej TextIO.inputLine w następujący sposób: load "TextIO"; (* wczytanie biblioteki *) (* kontynuacja programu... *) val _ = TextIO.inputLine TextIO.stdIn; (* odczyt linii wystarczy klawisz ENTER *) Powyższą instrukcję należy wpisać w miejscu, w którym rekurencyjnie jest wywoływana funkcja intinstr. Do grupowania instrukcji użyj konstrukcji: ( instr1; instr2;...;instrn); albo zastosuj deklarację let... in...end. 25. Napisz inny wariant modelu procesora (funkcję intinstr), w którym nie występuje instrukcja PUSH of real. Dane powinny być już przy starcie programu umieszczone w pamięci (liście). Instrukcje jak dotychczas pobierają argumenty i składają rezultaty na stosie. Oblicz wartość wyrażenia: 2.0*(3.0+4.0)*5.0. 26. Napisz zmodyfikowaną funkcję intinstr, tak aby zgłaszała brak argumentu (1 lub 2)dla operacji ADD. Wskazówka: dopisz dwa dodatkowe warianty do funkcji intinstr. 27. Dopisz do listy instrukcji operacje na rejestrze X: WRX, RDX. Zmodyfikuj funkcję intinstr. Będzie ona teraz zwracała parę (stos, rejestr) i posiada trzy argumenty (instrukcja, stos, rejestr). Wartość początkową rejestru przyjmij jako zero. Wskazówka: funkcja intinstr może zawierać następujący wariant: intinstr(add, x::y::xs, rejx) = ((x+y)::xs, rejx) Wykonanie WRX oznacza przepisanie wartości z wierzchołka stosu do pola rejx. RDX działa odwrotnie. Zrealizuj z użyciem rejestru obliczenia 3.0*(2.0+3.0) + 4.0*(2.0+3.0) 28. Dopisz do listy instrukcji operacje na rejestrze X: WRX, RDX. Wartość początkowa argumentu jest nieznana. Zabezpiecz program przed odczytem rejestru, który nie był wcześniej
zapisany. Wskazówka: funkcja intinstr będzie posiadała 4 argumenty. Jednym z nich będzie flaga (typu bool) informująca o tym, że rejestr był już zapisywany. 29. Zmodyfikuj funkcję sprawdzającą poprawny tak, aby precyzyjnie informowała (przynajmniej dla jednego wariantu), która instrukcja jest błędna i z jakich powodów. Zastosuj funkcje pomocnicze: fun wypisz_stos ([]:stack) = "nil"^"\n" wypisz_stos (x1::xs) = (Real.toString x1)^" "^wypisz_stos(xs); fun wypisz_instr ( PUSH x) = "PUSH "^(Real.toString x) wypisz_instr ( ^^ ) = " ^^ " wypisz_instr ( ADD ) = " ADD " wypisz_instr ( SUB ) = " SUB " wypisz_instr ( MUL ) = " MUL "; 30. Zdefiniuj wielowariantową funkcję intinstr (drugim argumentem jest dowolna lista il) za pomocą konstrukcji case. Do wyodrębniania elementów listy użyj instrukcji postaci let val (x1::x2::xs) = il in...end; Uwzględnij generowanie wyjątków przy nieprawidłowych wywołaniach funkcji. 31. Zdefiniuj wielowariantową funkcję wypisz_instr za pomocą konstrukcji case. Zmodyfikuj intpprog tak, aby zliczała wykonane instrukcje. Teraz funkcja powinna zwracać parę. 32. Zadeklaruj funkcję usunnieparzyste, taką że: usunnieparzyste[x 1,x 2,x 3,x 4,...]=[x 2,x 4,...] 33. Podaj deklarację funkcji typu int list -> int option odszukującej najmniejszy element z listy liczb całkowitych. 34. Podaj deklarację funkcji typu int list -> int option odszukującej największy element z listy liczb całkowitych. 35. Zadeklaruj funkcję polacz łączącą elementy listy w pary, tzn. polacz [x 1,x 2,x 3,x 4,...]= [(x 1,x 2 ),(x 3,x 4 ),...]. 36. Zaproponuj deklarację funkcji length wyznaczającej długość listy. 37. Zadeklaruj funkcję krotnosc(x,ys), która podaje ile razy element x występuje na liście ys. 38. Napisz funkcję sprawdzającą, czy na podanej liście występują powtórzenia elementów. Działanie zaprezentuj na przykładzie. 39. Zrealizuj funkcję biblioteczną map typu: ('a -> 'b)->'a list -> 'b list wywołującą
podaną funkcję kolejno dla każdego elementu listy: map f [a1,a2,...,an] = [f(a1),f(a2),...,f(an)] 40. Napisz funkcję rev odwracającą kolejność elementów w liście. 41. Podaj definicję funkcji nty typu 'a list*int -> 'a option, która zwraca n-ty element na podanej liście (licząc od zera). 42. Napisz funkcję sprawdzającą, czy wszystkie całkowite elementy listy typu int są nieujemne. 43. Zaproponuj funkcję wstaw typu 'a list * int * 'a: 'a list wstawiającą do listy na podane miejsce (licząc od zera) określony element. 44. Napisz funkcję sprawdzającą, czy w rejestrze w kasie sklepowej nie występują powtórzenia kodów kreskowych. 45. Sprawdź, czy wszystkie ceny artykułów w bazie danych sklepu są nieujemne. 46. Zmień ceny w rejestrze kasy sklepowej, tak by były wartościami typu real. Oblicz średnią cenę artykułu. Wsk.: może to być kilka funkcji. 47. Dokonaj przeceny artykułu o kodzie Kod o 1/5. Napisz odpowiednią funkcję. 48. Wyszukaj wszystkie artykuły o cenach zawartych w podanym zakresie (min,max). 49. Rozszerz rejestr o daną typu int zawierającą informację o liczbie sztuk w magazynie. Napisz funkcję, która zwraca listę artykułów, których liczba jest mniejsza niż MIN. 50. Wyszukaj za pomocą odpowiedniej funkcji najtańszy artykuł w sklepie. 51. Znajdź n-artykułów najtańszych w sklepie. Utwórz odpowiednią funkcję. Wsk.: najpierw posortuj.
52. Znajdź n-artykułów najdroższych w sklepie. Utwórz odpowiednią funkcję. Wsk.: najpierw posortuj. 53. Wyszukaj za pomocą odpowiedniej funkcji najdroższy artykuł w sklepie. 54. Zadeklaruj funkcje ++, ** z funkcjami mnozconst, mnozx jako lokalnymi ( niewidocznymi z zewnątrz).
55. Jaką funkcję realizuje przedstawiony na poniższym rysunku układ? Wykaż formalnie. b a 1 S 0 S 1 MUX 0 1 2 3 f Sprawdź formalnie które z poniższych wzorów są prawdziwe? 56. [( p q) r] [ p ( q r)] 57. [( p q) r] [( p q) ( q r)] Sprawdź formalnie które z poniższych wzorów są prawdziwe? 58. ( p + q) ( p + r) ( q + r) ( p + q) ( p + r) 59. q [( p + q) p] 60.. Dekoder jest układem o n wejściach i 2 n wyjściach. Do dekodera 2:4 dołączono sygnały A, B. Zaproponuj układ, który dołączony do wyjść dekodera odtworzy sygnały A,B. Wykaż formalnie poprawność działania. DX 0 1 A 0? B 1 2 A B 3 61. Wykaż słuszność następującego rozumowania: Jeśli student nie złoży projektu, to nie zaliczy przedmiotu X. Jeśli student nie zaliczy przedmiotu X, to nie przejdzie na następny rok. Zatem jeśli student przeszedł na następny rok, to znaczy, że musiał złożyć projekt z przedmiotu X. Wskazówka. Jako atomy można przyjąć następujące zdania logiczne: 1) student składa projekt, 2) przedmiot X zaliczony, 3) student przechodzi na następny rok.
62. Wykaż, że poniższy układ realizuje podaną funkcję. x = a( b + cd) a b c d x 62. Dwa spośród sześciu sygnałów sterujących odłącznikami transformatorów i odłącznikiem sekcyjnym w stacji dwutransformatorowej mają postać x = a + c, z = e + a + c + b + d + c + d gdzie: a, b stany przekaźników podnapięciowych (1 jest napięcie (true)) c, d stany odłączników transformatorów (1 zamknięty) e stan odłącznika sekcyjnego (1 zamknięty) x z sygnał otwierania odłącznika transformatora I (1 otwieranie) sygnał zamykania odłącznika sekcyjnego (1 zamykanie). Narysuj schemat złożony z dowolnych bramek i zweryfikuj go. 63. Udowodnij formalnie, że następujące dwa układy kombinacyjnie nie generują identycznych wyjść. a b c Y a c Y d 64. Górny moduł wyświetlacza 7-segmentowego jest zapalany zgodnie z funkcją x = abd + acd + bcd + abc Zaproponuj układ złożony z multipleksera 4:1 i bramek, który zrealizuje taką funkcję. Wykaż formalnie jego poprawność.
65. Napisz program w dziedzinie boolowskiej realizujący funkcję przerzutnika D (bez wejścia resetującego) na podstawie zero-jedynkowej tablicy prawdy. Udowodnij formalnie, że program ten odpowiada specyfikacji (zob. Wykł. 6). Użyj funkcji IF_POST(). 66. Napisz program realizujący sterowanie otwieraniem szlabanu kolejowego (U2, Wykł. 7). Przeprowadź kilka testów. Udowodnij poprawność. U2 =!B*B[i-1]*!C + U2[i-1]*!C 67. Przerzutnik D można zrealizować według rysunku obok. Uzasadnij to formalnie (zob. Wykł. 6 i 7). C PULSE D MUX 68. Napisz program w dziedzinie boolowskiej realizujący funkcję przerzutnika SR na podstawie tablicy zero-jedynkowej. Uzasadnij, że jest on poprawny. Użyj funkcji IF_POST(). 69. Zaproponuj program realizujący funkcję blokowanego generatora fali prostokątnej (funkcjonującego jak na rysunku obok). Udowodnij formalnie, jest on poprawny. EN GEN Y EN Y że 70. Jaką funkcję realizuje układ? Uzasadnij na podstawie testów i formalnie. NOT BUF x i x i-1 AND
71. Jaką funkcję realizuje układ? Uzasadnij na podstawie testów i formalnie. A B S R SET 1 CLR S R SET 2 CLR X 72. Jaką funkcję realizuje układ? Uzasadnij na podstawie testów i formalnie. BUF x i x i-1 EXOR 73. Przy pojawieniu się narastającego zbocza na wejściu blok przerzutnika T (uproszczonego) zmienia wyjście. Jak wygląda specyfikacja? Napisz program w dziedzinie boolowskiej realizujący funkcję przerzutnika i wykaż jego poprawność. SET x y T i =y i-1 CLR