Oleksandr Fedoruk

Software engineer, lecturer, researcher

Programowanie w chmurze – laboratorium 4

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:
    1. Wypełnić puste pola liczbami od 1 do 4.
    2. 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).