% vypis seznamu, co polozka to radek vypis([]). vypis([X|Y]) :- write(X), nl, vypis(Y). % testovani zda je prvek v seznamu member(X, [X|_]). member(X, [_|Y]) :- member(X, Y). % inicializace seznamu usporadanych petic: % dum(poradi, barva, narodnost, cigarety, napoj, zvire) inicializace(Seznam) :- Seznam = [dum(1, _, _, _, _, _), dum(2, _, _, _, _, _), dum(3, _, _, _, _, _), dum(4, _, _, _, _, _), dum(5, _, _, _, _, _)]. % jednotlive vlastnosti: vlastnost(dum, hodnota) poradi(X, Y) :- X = dum(Y, _, _, _, _, _). barva(X, Y) :- X = dum(_, Y, _, _, _, _). narodnost(X, Y) :- X = dum(_, _, Y, _, _, _). cigarety(X, Y) :- X = dum(_, _, _, Y, _, _). napoj(X, Y) :- X = dum(_, _, _, _, Y, _). zvire(X, Y) :- X = dum(_, _, _, _, _, Y). % uskupeni domu: ktery s kterym sousedi vedle(1, 2). vedle(2, 1). vedle(2, 3). vedle(3, 2). vedle(3, 4). vedle(4, 3). vedle(4, 5). vedle(5, 4). vlevo(1, 2). vlevo(2, 3). vlevo(3, 4). vlevo(4, 5). % napoveda: znalosti(Seznam) :- % chybejici polozka zvirat z otazky: member(X21, Seznam), zvire(X21, rybicky), % Brit bydli v cervenem dome. member(X1, Seznam), narodnost(X1, brit), barva(X1, cervena), % Sved chova psa. member(X2, Seznam), narodnost(X2, sved), zvire(X2, pes), % Dan pije caj. member(X3, Seznam), narodnost(X3, dan), napoj(X3, caj), % Zeleny dum stoji hned nalevo od bileho. member(X4, Seznam), poradi(X4, C1), barva(X4, zelena), vlevo(C1, C2), member(X5, Seznam), poradi(X5, C2), barva(X5, bila), % Majitel zeleneho domu pije kavu. member(X6, Seznam), barva(X6, zelena), napoj(X6, kava), % Ten, kdo kouri PallMall, chova ptaka. member(X7, Seznam), cigarety(X7, pallmall), zvire(X7, ptak), % Majitel zluteho domu kouri Dunhill. member(X8, Seznam), barva(X8, zluta), cigarety(X8, dunhill), % Ten, kdo bydli uprostred rady domu, pije mleko. member(X9, Seznam), napoj(X9, mleko), poradi(X9, 3), % Nor bydli v prvnim dome. member(X10, Seznam), narodnost(X10, nor), poradi(X10, 1), % Ten, kdo kouri Blend, bydli vedle toho, kdo chova kocku. member(X11, Seznam), poradi(X11, C3), cigarety(X11, blend), vedle(C3, C4), member(X12, Seznam), poradi(X12, C4), zvire(X12, kocka), % Ten, kdo chova kone, bydli vedle toho, kdo kouri Dunhill. member(X13, Seznam), poradi(X13, C5), zvire(X11, kun), vedle(C5, C6), member(X14, Seznam), poradi(X14, C6), cigarety(X12, dunhill), % Ten, kdo kouri BlueMaster, pije pivo. member(X15, Seznam), cigarety(X15, bluemaster), napoj(X15, pivo), % Nemec kouri Prince. member(X16, Seznam), narodnost(X16, nemec), cigarety(X16, prince), % Nor bydli vedle modreho domu. member(X17, Seznam), poradi(X17, C7), narodnost(X17, nor), vedle(C7, C8), member(X18, Seznam), poradi(X18, C8), barva(X18, modra), % Ten, kdo kouri Blend, ma souseda, ktery pije vodu. member(X19, Seznam), poradi(X19, C9), cigarety(X19, blend), vedle(C9, C10), member(X20, Seznam), poradi(X20, C10), napoj(X20, voda). % samotne reseni: reseni :- inicializace(Seznam), znalosti(Seznam), vypis(Seznam). kdo_chova(Zvire) :- inicializace(Seznam), znalosti(Seznam), member(Z, Seznam), zvire(Z, Zvire), narodnost(Z, Nekdo), write(Nekdo), nl.