Programowanie funkcyjne/Procedury jeszcze wyższych rzędów/Ćwiczenia: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Linia 9: | Linia 9: | ||
==Laboratorium== | ==Laboratorium== | ||
* Napisz procedurę <tt>exists</tt>, która dla danego*;predykatu i listy sprawdzi, czy na liście jest element spełniający predykat. | * Napisz procedurę <tt>exists</tt>, która dla danego*;predykatu i listy sprawdzi, czy na liście jest element spełniający predykat. | ||
* Napisz procedurę negującą predykat <tt>non: ('a -> bool) -> ('a -> bool)</tt>. Za pomocą tej procedury, procedury <tt>exists</tt> oraz składania funkcji zdefiniuj procedurę <tt>forall</tt>, która sprawdza, czy dany predykat jest spełniony przez wszystkie | * Napisz procedurę negującą predykat <tt>non: ('a -> bool) -> ('a -> bool)</tt>. Za pomocą tej procedury, procedury <tt>exists</tt> oraz składania funkcji zdefiniuj procedurę <tt>forall</tt>, która sprawdza, czy dany predykat jest spełniony przez wszystkie elementy danej listy. | ||
* Przypomnij sobie zadanie dotyczące wyliczania wartości. Rozszerz składnię wyrażeń o zmienne. Procedura obliczająca wartość wyrażenia będzie wymagać dodatkowego parametru - wartościowania zmiennych, czyli funkcji, która nazwie zmiennej przyporządkowuje jej wartość. | * Przypomnij sobie zadanie dotyczące wyliczania wartości. Rozszerz składnię wyrażeń o zmienne. Procedura obliczająca wartość wyrażenia będzie wymagać dodatkowego parametru - wartościowania zmiennych, czyli funkcji, która nazwie zmiennej przyporządkowuje jej wartość. | ||
* Całkowanie funkcji. | * Całkowanie funkcji. | ||
* Zadanie o Origami. Dana jest lista prostych zorientowanych wyznaczająca ciąg złożeń papieru. Kartka papieru to kwadrat jednostkowy. Każda prosta jest reprezentowana przez parę różnych punktów. Punkt to para współrzędnych <math>x</math> i <math>y</math>. Papier jest składany w ten sposób, że z prawej strony prostej (patrząc w kierunku od pierwszego punktu do drugiego) jest przekładany na lewą. Napisz procedurę <tt>origami</tt>, która dla wywołania <tt>origami l p</tt> oblicza ile warstw papieru znajdzie się w punkcie <tt>p</tt> po złożeniu papieru zgodnie z prostymi z listy <tt>l</tt> (Przyjmujemy, że na linii złożenia są obie składane warstwy papieru.) Jest to bardzo ładne zadanie. Należy tu wykorzystać procedury jako strukturę danych reprezentującą stan kartki. | * Zadanie o Origami. Dana jest lista prostych zorientowanych wyznaczająca ciąg złożeń papieru. Kartka papieru to kwadrat jednostkowy. Każda prosta jest reprezentowana przez parę różnych punktów. Punkt to para współrzędnych <math>x</math> i <math>y</math>. Papier jest składany w ten sposób, że z prawej strony prostej (patrząc w kierunku od pierwszego punktu do drugiego) jest przekładany na lewą. Napisz procedurę <tt>origami</tt>, która dla wywołania <tt>origami l p</tt> oblicza ile warstw papieru znajdzie się w punkcie <tt>p</tt> po złożeniu papieru zgodnie z prostymi z listy <tt>l</tt> (Przyjmujemy, że na linii złożenia są obie składane warstwy papieru.) Jest to bardzo ładne zadanie. Należy tu wykorzystać procedury jako strukturę danych reprezentującą stan kartki. |
Wersja z 18:58, 19 lip 2006
Ćwiczenia
- Dla dowolnych dwóch funkcji i istnieje dokładnie jedna taka funkcja , że i . Zdefiniuj wprost procedurę prod, która na podstawie funkcji i wyznacza funkcję dla proceduralnej definicji produktów. (let prod f g x p = p (f x) (g x);;)
- Zaimplementuj sumy rozłączne (koprodukty) za pomocą procedur. (Koprodukt zbiorów i to taki zbiór wraz z włożeniami , , że dla dowolnej pary funkcji i istnieje dokładnie jedna taka funkcja , że i . Potraktuj tę definicję dosłownie.) Należy zaimplementować włożenie i w oraz procedurę, która na podstawie funkcji i wyznaczy funkcję .
- Potęgowanie funkcji w czasie logarytmicznym. Co tak na prawdę jest obliczane szybciej: funkcja wynikowa, czy jej wartość?
- Jak można rozszerzyć liczby naturalne Churcha do liczb całkowitych?
- Jak za pomocą operatora punktu stałego można wyznaczać procedury wzajemnie rekurencyjne?
Laboratorium
- Napisz procedurę exists, która dla danego*;predykatu i listy sprawdzi, czy na liście jest element spełniający predykat.
- Napisz procedurę negującą predykat non: ('a -> bool) -> ('a -> bool). Za pomocą tej procedury, procedury exists oraz składania funkcji zdefiniuj procedurę forall, która sprawdza, czy dany predykat jest spełniony przez wszystkie elementy danej listy.
- Przypomnij sobie zadanie dotyczące wyliczania wartości. Rozszerz składnię wyrażeń o zmienne. Procedura obliczająca wartość wyrażenia będzie wymagać dodatkowego parametru - wartościowania zmiennych, czyli funkcji, która nazwie zmiennej przyporządkowuje jej wartość.
- Całkowanie funkcji.
- Zadanie o Origami. Dana jest lista prostych zorientowanych wyznaczająca ciąg złożeń papieru. Kartka papieru to kwadrat jednostkowy. Każda prosta jest reprezentowana przez parę różnych punktów. Punkt to para współrzędnych i . Papier jest składany w ten sposób, że z prawej strony prostej (patrząc w kierunku od pierwszego punktu do drugiego) jest przekładany na lewą. Napisz procedurę origami, która dla wywołania origami l p oblicza ile warstw papieru znajdzie się w punkcie p po złożeniu papieru zgodnie z prostymi z listy l (Przyjmujemy, że na linii złożenia są obie składane warstwy papieru.) Jest to bardzo ładne zadanie. Należy tu wykorzystać procedury jako strukturę danych reprezentującą stan kartki.