Różnice między wybraną wersją a wersją aktualną.
Poprzednia rewizja po obu stronachPoprzednia wersjaNowa wersja | Poprzednia wersja | ||
notatki:prolog [2025/05/27 13:15] – administrator | notatki:prolog [2025/05/27 14:56] (aktualna) – administrator | ||
---|---|---|---|
Linia 555: | Linia 555: | ||
X = d. | X = d. | ||
</ | </ | ||
+ | Wywołania rekurencyjne: | ||
+ | {{.: | ||
+ | |||
+ | ===== Znajdowanie elementu w liście ===== | ||
+ | |||
+ | Aby sprawdzić, czy dany element znajduje się w liście, można skorzystać z wbudowanego predykatu `member/2`, albo zdefiniować własną wersję. | ||
+ | |||
+ | Wersja oparta na rekurencji: | ||
+ | |||
+ | <code prolog> | ||
+ | in_list([X|_], | ||
+ | in_list([_|T], | ||
+ | in_list(T, X). | ||
+ | </ | ||
+ | |||
+ | - **[X|_]** – dopasowanie, | ||
+ | - **[_|T]** – rekurencyjne przeszukiwanie ogona listy. | ||
+ | |||
+ | Przykład użycia: | ||
+ | |||
+ | <code prolog> | ||
+ | ?- in_list([1, 2, 3, 4], 3). | ||
+ | true. | ||
+ | |||
+ | ?- in_list([a, b, c], d). | ||
+ | false. | ||
+ | </ | ||
+ | |||
+ | Alternatywa: | ||
+ | |||
+ | <code prolog> | ||
+ | ?- member(3, [1,2,3,4]). | ||
+ | true. | ||
+ | </ | ||
+ | |||
+ | ===== Sprawdzanie, | ||
+ | |||
+ | Predykat sprawdzający, | ||
+ | |||
+ | <code prolog> | ||
+ | sorted_asc([]). | ||
+ | sorted_asc([_]). | ||
+ | sorted_asc([X, | ||
+ | X =< Y, | ||
+ | sorted_asc([Y | T]). | ||
+ | </ | ||
+ | |||
+ | - **[]** i **[ _ ]** — lista pusta lub jednoelementowa jest uporządkowana. | ||
+ | - **[X, Y | T]** — sprawdzamy, czy pierwszy element jest mniejszy lub równy drugiemu, a następnie rekurencyjnie resztę listy. | ||
+ | |||
+ | Przykład użycia: | ||
+ | |||
+ | <code prolog> | ||
+ | ?- sorted_asc([1, | ||
+ | true. | ||
+ | |||
+ | ?- sorted_asc([1, | ||
+ | false. | ||
+ | </ | ||
+ | |||
+ | ===== Wstawianie elementu do listy uporządkowanej rosnąco ===== | ||
+ | |||
+ | Predykat, który wstawia element `X` do posortowanej listy rosnącej `List`, zwracając nową listę `Result`, również uporządkowaną rosnąco: | ||
+ | |||
+ | <code prolog> | ||
+ | insert_sorted(X, | ||
+ | insert_sorted(X, | ||
+ | X =< H. | ||
+ | insert_sorted(X, | ||
+ | X > H, | ||
+ | insert_sorted(X, | ||
+ | </ | ||
+ | |||
+ | - Jeśli lista jest pusta, nowa lista to `[X]`. | ||
+ | - Jeśli `X` jest mniejsze lub równe pierwszemu elementowi `H`, wstawiamy `X` przed `H`. | ||
+ | - W przeciwnym razie rekurencyjnie wstawiamy `X` w ogon listy. | ||
+ | |||
+ | Przykład użycia: | ||
+ | |||
+ | <code prolog> | ||
+ | ?- insert_sorted(3, | ||
+ | Result = [1, 2, 3, 4, 5]. | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Sortowanie listy metodą wstawiania ===== | ||
+ | |||
+ | Predykat sortujący listę numeryczną rosnąco za pomocą algorytmu sortowania przez wstawianie (*insertion sort*). | ||
+ | |||
+ | Definicja: | ||
+ | |||
+ | <code prolog> | ||
+ | insert_sorted(X, | ||
+ | insert_sorted(X, | ||
+ | X =< H. | ||
+ | insert_sorted(X, | ||
+ | X > H, | ||
+ | insert_sorted(X, | ||
+ | |||
+ | insertion_sort([], | ||
+ | insertion_sort([H|T], | ||
+ | insertion_sort(T, | ||
+ | insert_sorted(H, | ||
+ | </ | ||
+ | |||
+ | Opis działania: | ||
+ | - `insert_sorted/ | ||
+ | - `insertion_sort/ | ||
+ | |||
+ | Przykład użycia: | ||
+ | |||
+ | <code prolog> | ||
+ | ?- insertion_sort([4, | ||
+ | Sorted = [1, 2, 3, 4]. | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Obliczanie długości listy ===== | ||
+ | |||
+ | Predykat `length_list/ | ||
+ | |||
+ | Definicja: | ||
+ | |||
+ | <code prolog> | ||
+ | length_list([], | ||
+ | length_list([_|T], | ||
+ | length_list(T, | ||
+ | N is N1 + 1. | ||
+ | </ | ||
+ | |||
+ | - **[]** – pusta lista ma długość 0. | ||
+ | - **[_|T]** – ignorujemy pierwszy element i rekurencyjnie liczymy długość ogona listy, zwiększając wynik o 1. | ||
+ | |||
+ | Przykład użycia: | ||
+ | |||
+ | <code prolog> | ||
+ | ?- length_list([a, | ||
+ | N = 4. | ||
+ | </ | ||
+ | |||
+ | Alternatywnie, | ||
+ | |||
+ | <code prolog> | ||
+ | ?- length([a, b, c, d], N). | ||
+ | N = 4. | ||
+ | </ | ||
+ | |||
+ | ===== Sumowanie elementów listy ===== | ||
+ | |||
+ | Predykat `sum_list/ | ||
+ | |||
+ | Definicja: | ||
+ | |||
+ | <code prolog> | ||
+ | sum_list([], | ||
+ | sum_list([H|T], | ||
+ | sum_list(T, Rest), | ||
+ | Sum is H + Rest. | ||
+ | </ | ||
+ | |||
+ | - **[]** – suma pustej listy to 0. | ||
+ | - **[H|T]** – dodajemy bieżący element `H` do sumy pozostałych elementów `T`. | ||
+ | |||
+ | Przykład użycia: | ||
+ | |||
+ | <code prolog> | ||
+ | ?- sum_list([1, | ||
+ | S = 10. | ||
+ | </ | ||
+ | |||
+ | Można również użyć wbudowanego predykatu `sum_list/ | ||
+ | |||
+ | <code prolog> | ||
+ | ?- sum_list([1, | ||
+ | S = 10. | ||
+ | </ | ||
+ | |||
+ | ===== Średnia arytmetyczna elementów listy ===== | ||
+ | |||
+ | Predykat `average_list/ | ||
+ | |||
+ | Wymaga dwóch pomocniczych predykatów: | ||
+ | * `sum_list/ | ||
+ | * `length_list/ | ||
+ | |||
+ | Definicja: | ||
+ | |||
+ | <code prolog> | ||
+ | sum_list([], | ||
+ | sum_list([H|T], | ||
+ | sum_list(T, Rest), | ||
+ | Sum is H + Rest. | ||
+ | |||
+ | length_list([], | ||
+ | length_list([_|T], | ||
+ | length_list(T, | ||
+ | N is N1 + 1. | ||
+ | |||
+ | average_list(List, | ||
+ | sum_list(List, | ||
+ | length_list(List, | ||
+ | Length > 0, | ||
+ | Avg is Sum / Length. | ||
+ | </ | ||
+ | |||
+ | Opis działania: | ||
+ | - Najpierw obliczamy sumę elementów listy. | ||
+ | - Następnie obliczamy jej długość. | ||
+ | - Obliczamy średnią jako `Sum / Length`. | ||
+ | |||
+ | Przykład użycia: | ||
+ | |||
+ | <code prolog> | ||
+ | ?- average_list([2, | ||
+ | A = 5.0. | ||
+ | </ | ||
+ | |||
+ | Uwaga: predykat sprawdza, czy długość listy jest większa od zera, aby uniknąć dzielenia przez zero. | ||