Paradygmaty programowania/Ćwiczenia 7: Programowanie w logice - przegląd
Zadanie 1
Napisać funktor służący do obliczania długości listy.
Nota bene: Czy takiego funktora można użyć do wygenerowania listy o podanej długości, np. pytając len(X, 3)? Sprawdź. Co by się stało, gdybyśmy zamienili kolejność termów w poprzedniku? Sprawdź...
Zadanie 2
Napisać funktor służący do sumowania elementów listy (przy założeniu, że lista składa się z samych liczb).
Zadanie 3
Oszacować złożoność przykładów podanych na końcu wykładu (append, reverse, member) w funkcji długości przetwarzanych list. Czy zależy to od sposobu użycia tych funktorów (policzenie wyniku lub tylko sprawdzenie)?
Zadanie 4
Podany w przykładzie funktor member sprawdza przynależność elementu do listy nie zakładając nic o uporządkowaniu listy. Gdyby założyć, że lista zawiera np. liczby uporządkowane rosnąco, można by przerwać szukanie, gdy tylko dojdziemy do liczby większej niż szukana. Napisz taką wersję funktora. Można korzystać z infiksowych operatorów porównywania liczb.
Zadanie 5*
Napisać w Prologu program sortujący listę.
Zadanie 6
Napisać program prologowy opisujący relacje rodzinne, wraz z przykładową bazą faktów. Program powinien pozwalać na wyliczanie, kto jest czyim ojcem, matką, synem, córką, dziadkiem, wujem, ciotką itp. Przykładowe fakty mogą wyglądać tak:
kobieta(anna). kobieta(ewa). mężczyzna(jan). mężczyzna(jerzy). matka(anna, jerzy). ojciec(jan, jerzy).
Zauważmy, że stwierdzenia typu kobieta(anna) i mężczyzna(jerzy) są potrzebne nie tylko do rozstrzygnięcia pewnych relacji (np. syn/córka, brat/siostra), ale również do generowania rozwiązań, gdy pytanie zawiera zmienne.