Tímový projekt — predmet Logické programovanie a inferencia (LPI), TUKE Téma 9: Program odporúčajúci filmy/knihy/technológie na základe definovaných pravidiel.
Implementácia vysvetliteľného odporúčacieho systému v jazyku SWI-Prolog.
Doména pokrýva štyri prepojené typy obsahu — filmy, seriály, knihy a videohry — modelované
cez unifikovaný dátový model polozka/4. Systém kombinuje content-based filtering
(žáner, hodnotenie, rozmer, krajina, štúdio, tvorca) so collaborative filteringom
(podobnosť používateľov), pridáva cross-domain odporúčania (z filmu → na knihu/hru/seriál),
reverzný filter fanúšikov (kto by mal rád konkrétnu položku) a robustné cestovanie
po grafe vzťahov medzi položkami.
prolog_recommend_system/
├── README.md <- tento súbor
├── report.pdf <- elaborát (PDF — skopírovaný z docs/)
├── .env.example <- vzorové premenné prostredia
├── docker-compose.yml <- orchestrácia backend + frontend kontajnerov
├── backend/
│ ├── Dockerfile <- SWI-Prolog kontajner
│ ├── program.pl <- znalostná báza + inferenčné pravidlá
│ ├── api.pl <- tenká HTTP JSON API vrstva (port 4000)
│ ├── examples.pl <- 10 demonštračných príkladov
│ └── tests.pl <- PlUnit regresné testy
├── docs/
│ ├── report.tex <- LaTeX zdrojový kód elaborátu
│ ├── bibliography.bib <- BibTeX bibliografia
│ └── report.pdf <- kompilovaný výstup
└── web/ <- Next.js frontendová aplikácia (port 3000)
├── app/ <- Next.js App Router (page, layout, API routes)
├── components/ <- React komponenty (playground sekcie)
└── lib/ <- typy, API klient, utility
sudo apt install swi-prologbrew install swi-prologStiahni inštalátor zo stránky https://www.swi-prolog.org/Download.html.
swipl -q -g run_all -t halt backend/examples.plswipl -q -g run_tests -t halt backend/tests.plswipl backend/program.plPríklady dopytov v ?- prompt-e:
%% Základné odporúčanie (filmy + seriály + knihy + hry naprieč doménami)
?- odporucam(jan, P).
?- odporucam(maria, P), polozka(P, T, N, _).
%% Top odporúčania zoradené podľa skóre
?- top_odporucania(anna, T).
%% Vysvetlenie konkrétneho odporúčania
?- vysvetli(jan, interstellar).
?- dovody_odporucania(jan, interstellar, Dovody).
%% Collaborative filtering
?- podobni_pouzivatelia(jan, P).
?- podobnost_pouzivatelov(peter, jan, Skore, Dovody).
?- odporucam_collaborative(peter, F).
%% Cross-domain odporúčanie (páči sa mi film → odporuč hru)
?- cross_domain_odporucam(peter, dune, Ciel, Dovod).
%% Filter "kto má rád X"
?- fanusikovia(witcher3, Pouzivatelia).
?- fanusikovia_s_dovodmi(parasite, Pary).
%% Robustné cestovanie po grafe vzťahov
?- pribuzne_polozky(dune, X, Sila), Sila >= 2.
?- top_pribuzne(witcher3, Top).
?- retazec(amelie, dark_souls, 4, Cesta).
%% Adaptácie, univerzá a hybridné skóre
?- adaptacia(X, Y).
?- univerzum(X, U).
?- hybridne_skore(maria, lotr, S).
?- top_hybridne(maria, T).
%% Constraint odporúčanie: filmový večer do 300 minút
?- filmovy_vecer(jan, 300, Vyber, Dlzka, Skore).
%% Štatistika
?- pocet_odporucani(peter, N).
?- pocet_odporucani_typu(maria, hra, N).swipl backend/examples.pl
?- priklad1. % základné odporúčanie pre Jana
?- priklad2. % top odporúčania zoradené podľa skóre (Anna)
?- priklad3. % vysvetlenie odporúčania (Jan, Interstellar)
?- priklad4. % collaborative filtering pre Petra
?- priklad5. % štatistika a kategorizácia
?- priklad6. % cross-domain odporúčanie (Peter videl Dune)
?- priklad7. % filter fanúšikov (Witcher 3, Parasite)
?- priklad8. % robustné cestovanie po grafe vzťahov
?- priklad9. % adaptácie, univerzá, hybridné skóre
?- priklad10. % filmový večer do časového limitu
?- halt.| Typ | Počet | Atribúty |
|---|---|---|
| filmy | 15 | žáner, hodnotenie, dĺžka (min), krajina, štúdio, režisér |
| knihy | 15 | žáner, hodnotenie, počet strán, krajina, vydavateľstvo, autor |
| videohry | 15 | žáner, hodnotenie, dĺžka prejdenia (hod), krajina, herné štúdio, vývojár |
| seriály | 10 | žáner, hodnotenie, počet epizód, krajina, platforma/štúdio, tvorca |
5 používateľov s preferenciami naprieč doménami: obľúbené žánre, obľúbené typy obsahu, obľúbení tvorcovia, obľúbené krajiny a štúdiá, minimálne hodnotenie, maximálne rozmery (zvlášť pre filmy/knihy/hry/seriály), história konzumácie.
| Predikát | Význam |
|---|---|
odporucam(P, Polozka) |
Hlavné pravidlo odporúčania naprieč všetkými typmi |
skore_odporucania(P, F, S) |
Skóre 0–17 (hodnotenie + zaner +2, tvorca +3, krajina +1, studio +1) |
top_odporucania(P, T) |
Zoradený zoznam podľa skóre zostupne |
dovody_odporucania(P, F, D) |
Vráti čistý zoznam dôvodov odporúčania |
vysvetli(P, F) |
Vypíše prečo bola položka odporúčaná |
kategoria_odporucania(P, F, K) |
Vyborná / Dobrá / Slabá zhoda |
podobnost_pouzivatelov(P1, P2, S) |
Číselné skóre podobnosti preferencií |
podobnost_pouzivatelov(P1, P2, S, D) |
Skóre podobnosti aj s dôvodmi |
podobni_pouzivatelia(P1, P2) |
Podobnosť pri skóre aspoň 4 |
odporucam_collaborative(P, F) |
Odporúčanie cez podobného používateľa, rešpektuje typ a rozmer |
cross_domain_odporucam(P, Z, C, D) |
Cross-domain: páči sa mi Z → odporuč C s dôvodom D |
fanusikovia(Polozka, Pouz) |
Komu by sa páčila daná položka? |
fanusikovia_s_dovodmi(Polozka, Pary) |
Detail s konkrétnymi dôvodmi zhody |
pribuzne_polozky(P1, P2, Sila) |
Sila = počet zdieľaných atribútov |
top_pribuzne(P, Top) |
Top príbuzné položky zoradené podľa sily |
retazec(Od, Na, Max, Cesta) |
Tranzitívna cesta v grafe vzťahov |
adaptacia(Z, C) |
Z je adaptácia diela C (napr. film podľa knihy) |
univerzum(Polozka, U) |
Príslušnosť k fiktívnemu svetu (Stredozemie, dune_universe, …) |
hybridne_skore(P, F, S) |
Content-based skóre + collab/adaptácia/univerzum bonus |
top_hybridne(P, Top) |
Zoradenie podľa hybridného skóre |
filmovy_vecer(P, Max, Vyber, Dlzka, Skore) |
Constraint výber filmov do časového limitu |
pocet_odporucani(P, N) |
Štatistika — koľko položiek odporúčame |
pocet_odporucani_typu(P, Typ, N) |
Štatistika podľa typu |
priklad1— základné odporúčanie pre Jana naprieč typmi obsahupriklad2— top odporúčania pre Annu zoradené podľa rozšíreného skórepriklad3— vysvetlenie odporúčania (Interstellar pre Jana)priklad4— collaborative filtering pre Petrapriklad5— štatistika a kategorizácia (rozpis filmy/knihy/hry/seriály)priklad6— cross-domain: Peter videl Dune → ktoré hry a seriály mu odporúčiťpriklad7— komu by sa páčila hra Witcher 3, komu film Parasitepriklad8— cestovanie po grafe vzťahov z filmu Dunepriklad9— adaptácie, spoločné univerzá a hybridné skóre pre Mariupriklad10— filmový večer do časového limitu cez CLP(FD)
Suite v library(plunit) s viacerými blokmi: znalostna_baza (počty,
úplnosť atribútov), odporucanie (Jan dostane film+knihu, Anna nedostane hry,
neopakovanie videného, validita skóre, monotónnosť top zoznamu, čisté dôvody),
cross_domain (adaptácia Dune, univerzum Witcher, type-disjointness),
collaborative (skóre podobnosti, rešpektovanie typu a rozmeru),
graf (symetria, acyklickosť), hybridne_skore (hybrid ≥ content,
universe bonus pre Mariu na LOTR) a constraint_odporucanie (filmový večer
do časového limitu).
Súčasťou projektu je interaktívny playground — moderná webová aplikácia, ktorá volá reálny SWI-Prolog engine a vizualizuje všetky schopnosti systému. Frontend je napísaný v Next.js 15 (App Router) a komunikuje s tenkým HTTP backendom v Prologu.
Najjednoduchšia cesta je Docker Compose — spustí oba kontajnery (frontend aj backend) naraz.
docker compose up --buildNásledne otvor prehliadač na http://localhost:3000.
# 1. Backend (Prolog API na porte 4000)
swipl backend/api.pl
# 2. Frontend (Next.js na porte 3000)
cd web
cp ../.env.example .env.local # nastav PROLOG_API_URL=http://localhost:4000
npm install
npm run dev| Endpoint | Parametre | Popis |
|---|---|---|
GET /api/health |
— | Stav servera |
GET /api/users |
— | Zoznam používateľov s preferenciami |
GET /api/items |
— | Všetky položky znalostnej bázy |
GET /api/recommend |
user |
Content-based odporúčania zoradené podľa skóre |
GET /api/explain |
user, item |
Dôvody odporúčania konkrétnej položky |
GET /api/hybrid |
user |
Hybridné skóre (content + collab + adaptácia + univerzum) |
GET /api/collaborative |
user |
Podobní používatelia + ich odporúčania |
GET /api/cross-domain |
user, item |
Cross-domain odporúčania z danej položky |
GET /api/fans |
item |
Komu by sa páčila daná položka |
GET /api/related |
item |
Príbuzné položky podľa sily prepojenia |
GET /api/path |
from, to, max |
Cesta v grafe vzťahov |
GET /api/movie-night |
user, limit |
CLP(FD) výber filmov do časového limitu |
GET /api/stats |
user |
Štatistika odporúčaní podľa typov obsahu |
backend/api.pl(Prolog HTTP API):- Tenký obal nad
program.pl— žiadna logika sa neduplikuje. - Každý handler pozbiera riešenia cez
findall/setofa pošlereply_json_dict. - Využíva
library(http/thread_httpd), beží na porte 4000 (alebo$PORT).
- Tenký obal nad
web/(Next.js):- React/Next.js 15 (App Router) s Tailwind CSS a shadcn/ui komponentmi.
- Všetka logika zostala v Prologu — Next.js robí len proxy dopytov (route handlery) a vizualizáciu.
- Dynamický render (
force-dynamic) — každý dopyt ide na živý Prolog engine.
Poznámka pre nasadenie: Vercel nepodporuje Docker/perzistentné servery. Pre verejné nasadenie odporúčame platformy s podporou Docker kontajnerov (Render, Fly.io, Railway).
==============================================
PRIKLAD 6: Cross-domain odporucanie (Peter videl Dune)
==============================================
-> [serial] Arcane (spolocna_krajina(usa))
-> [serial] Arcane (spolocny_zaner(akcia))
-> [hra] BioShock (spolocna_krajina(usa))
-> [hra] BioShock (spolocny_zaner(akcia))
-> [hra] BioShock (spolocny_zaner(sci_fi))
-> [serial] Black Mirror (spolocny_zaner(sci_fi))
-> [serial] Breaking Bad (spolocna_krajina(usa))
-> [serial] Chernobyl (spolocna_krajina(usa))
-> [hra] Cyberpunk 2077 (spolocny_zaner(sci_fi))
-> [serial] Game of Thrones (spolocna_krajina(usa))
-> [hra] Half-Life 2 (spolocna_krajina(usa))
-> [hra] Half-Life 2 (spolocny_zaner(akcia))
-> [hra] Half-Life 2 (spolocny_zaner(sci_fi))
-> [hra] Horizon Zero Dawn (spolocny_zaner(akcia))
-> [hra] Horizon Zero Dawn (spolocny_zaner(sci_fi))
-> [hra] The Last of Us (spolocna_krajina(usa))
-> [hra] The Last of Us (spolocny_zaner(akcia))
-> [serial] The Mandalorian (spolocna_krajina(usa))
-> [serial] The Mandalorian (spolocny_zaner(akcia))
-> [serial] The Mandalorian (spolocny_zaner(sci_fi))
-> [hra] Mass Effect (spolocny_zaner(sci_fi))
-> [hra] Portal 2 (spolocna_krajina(usa))
-> [hra] Portal 2 (spolocny_zaner(sci_fi))
-> [hra] Red Dead Redemption 2 (spolocna_krajina(usa))
-> [hra] Red Dead Redemption 2 (spolocny_zaner(akcia))
-> [serial] The Expanse (spolocna_krajina(usa))
-> [serial] The Expanse (spolocny_zaner(sci_fi))
-> [serial] True Detective (spolocna_krajina(usa))
-> [serial] Westworld (spolocna_krajina(usa))
-> [serial] Westworld (spolocny_zaner(sci_fi))
==============================================
PRIKLAD 7: Komu by sa pacila hra The Witcher 3?
==============================================
- Maria Toth :: [zaner(fantasy), zaner(rpg), tvorca(sapkowski),
krajina(polsko), studio(cd_projekt_red)]
- Tomas Varga :: [zaner(akcia), zaner(rpg), krajina(polsko),
studio(cd_projekt_red)]
==============================================
PRIKLAD 8: Cesta z 'amelie' (film) do 'dark_souls' (hra)
==============================================
[film] Amelie -->
[film] Forrest Gump -->
[film] Inception -->
[kniha] The Name of the Wind -->
[hra] Dark Souls
==============================================
PRIKLAD 10: Filmovy vecer do casoveho limitu
==============================================
Celkova dlzka: 286 minut, celkove skore: 27
- Interstellar (2014), 169 min, skore 15
- Blade Runner (1982), 117 min, skore 12
cd docs
pdflatex report.tex
bibtex report
pdflatex report.tex
pdflatex report.texVýstup: docs/report.pdf (a kópia v koreni projektu).
| Člen | Zodpovednosť |
|---|---|
| Člen 1 | Dátový model polozka/4, znalostná báza (55 položiek, 5 používateľov) |
| Člen 2 | Hlavné inferenčné pravidlo odporucam/2, polymorfný filter rozmerov |
| Člen 3 | Pokročilé pravidlá: skórovanie, top, vysvetlenie, collaborative, cross-domain, fanúšikovia, graf vzťahov, constraint odporúčanie |
| Člen 4 | Demonštračné príklady (10 scenárov) a testovanie |
| Člen 5 | Elaborát (LaTeX) a prezentácia |
- Materiály kurzu LPI (TUKE FEI KKUI) — https://kurzy.kpi.fei.tuke.sk/lpi/
- SWI-Prolog dokumentácia — https://www.swi-prolog.org/pldoc/
- L. Sterling, E. Shapiro: The Art of Prolog (MIT Press, 1994)
- I. Bratko: Prolog Programming for AI (Addison-Wesley, 2011)