W ramach wykonywania tych zadań polecam używanie online-kompilatora: https://www.onlinegdb.com/online_prolog_compiler
Zadanie 1 – rejestr faktów i proste zapytania
Napisz bazę faktów opisującą rodzina ludzi. Każdy fakt ma postać:
rodzic(Rodzic, Dziecko).
a) Zdefiniuj kilka faktów typu rodzic/2
.
b) Napisz zapytanie, które zwróci wszystkie dzieci wskazanej osoby.
c) Napisz predykat rodzenstwo(X, Y)
, który jest prawdziwy, gdy X i Y mają tego samego rodzica.
Zadanie 2 – rekurencja na grafie rodzinnym
Rozszerz bazę z zadania 1, aby dodać predykat:
przodek(Przodek, Potomek).
który jest prawdziwy, jeśli Przodek jest rodzicem Potomka lub przodkiem rodzica Potomka (czyli zdefiniowany rekurencyjnie).
- Zadbaj o zakończenie rekursji.
- Przetestuj predykat na kilku parach.
Zadanie 3 – przetwarzanie list: czyszczenie listy powtarzających się elementów
Napisz predykat
unikalne(Lista, Wynik).
który z listy Lista usuwa wszystkie duplikaty, zachowując kolejność pierwszych wystąpień.
- Przykład:
unikalne([a,b,a,c,b], X).
powinno zwrócićX = [a,b,c]
. - Wykorzystaj rekurencję po liście i predykat
member/2
.
Zadanie 4 – rozwiązywanie sudoku
Zaimplementuj prosty solver dla mini-sudoku 4×4 (kwadraty 2×2).
- Reprezentacja planszy: lista 4 list po 4 elementy, puste pola oznacz jako zmienną (np.
_
). - Implementacja powinna:
- Wypełnić puste pola liczbami od 1 do 4.
- Zapewnić, że w każdym wierszu, kolumnie i kwadraciku 2×2 liczby się nie powtarzają.
:- use_module(library(clpfd)).
sudoku(Rows) :-
% Impelentuj rozwiązanie tutaj.
...
% Przykładowe zadanie do rozwiązania
?- Puzzle = [[_, 2, _, _],
[_, _, _, 3],
[_, _, 1, _],
[4, _, _, _]],
sudoku(Puzzle),
maplist(writeln, Puzzle).