Možná už tuhle hádanku znáte, možná ne - pak vám třeba pěkně potrápí hlavičky:
Einstein vytvořil tuto hádanku v minulém století. Tvrdil, že 98 % lidí na světě není schopno ji vyřešit. Dobrou zábavu!
- Je 5 domů, každý jiné barvy.
- V každém domě bydlí jedna osoba jiné národnosti.
- Každý majitel domu upřednostňuje určitý nápoj, kouří určitou značku cigaret a chová určité zvíře.
- Žádná z těchto pěti osob nepije STEJNÝ nápoj, nekouří stejné cigarety ani nechová stejné zvíře jako některý z jejich sousedů.
Otázka: Komu patří ryba? Kdo pije vodu? Víte, že:
- Brit žije v červeném domě
- Švéd chová psa
- Dán pije rád čaj
- Němec kouří cigarety Rothmanns.
- Nor bydlí v prvním domku.
- Majitel zeleného domu pije kávu.
- Kuřák cigaret Winfield pije rád pivo.
- Majitel žlutého domu kouří cigarety Dunhill.
- Osoba, která kouří Pall Mall, chová papouška.
- Muž, který bydlí v prostředním domě, pije mléko.
- Kuřák cigaret Marlboro bydlí vedle toho, kdo chová kočku.
- Muž, který chová koně, bydlí vedle toho, který kouří Dunhill.
- Nor bydlí vedle modrého domu.
- Kuřák cigaret Marlboro má souseda, který pije vodu.
- Zelený dům stojí nalevo od bíleho domu.
A nebyl by to blog o programování, kdyby se tu neobjevilo řešení (v Prologu). Originál i s vysvětlivkami najdete na stránkách předmětu Základy umělé inteligence.
left_right(L,R,[L,R,_,_,_]).
left_right(L,R,[_,L,R,_,_]).
left_right(L,R,[_,_,L,R,_]).
left_right(L,R,[_,_,_,L,R]).
nextto(X,Y,L) :- left_right(X,Y,L).
nextto(X,Y,L) :- left_right(Y,X,L).
street([house(_,_,_,_,_),
house(_,_,_,_,_),
house(_,_,_,_,_),
house(_,_,_,_,_),
house(_,_,_,_,_)]).
constraints( Street ) :-
member(house(cerveny, brit, _, _, _), Street),
member(house(_, sved, pes, _, _), Street),
member(house(_, dan, _, caj, _), Street),
member(house(_, nemec, _, _, rothmans), Street),
Street = [house(_, nor, _, _, _)|_],
member(house(zeleny, _, _, kava, _), Street),
member(house(_, _, _, pivo, winfield), Street),
member(house(zluty, _, _, _, dunhill), Street),
member(house(_, _, papousek, _, pallmall), Street),
Street = [_, _, house(_, _, _, mleko, _), _, _],
nextto(house(_, _, _, _, marlboro), house(_, _, kocka, _, _),Street),
nextto(house(_, _, _, _, dunhill), house(_, _, kun, _, _), Street),
nextto(house(_, nor, _, _, _), house(modry, _, _, _, _), Street),
nextto(house(_, _, _, _, marlboro), house(_, _, _, voda, _), Street),
left_right(house(zeleny, _, _, _, _), house(bily, _, _, _, _), Street).
ryba( Kdo ) :-
street(Street),
constraints(Street),
member(house(_, Kdo, ryba, _, _), Street).
voda( Kdo ) :-
street(Street),
constraints(Street),
member(house(_, Kdo, _, voda, _), Street).
% Kdo chova rybu?
ryba(Kdo).
% Kdo pije vodu?
voda(Kdo).
Po dlouhé době odpovědi:
Rybu chová Němec.
Vodu pije Nor.
Máš hezký blog. Jen je v tomhle zdrojáku malinká chybička, aby byl zdrojový kód funkční je třeba doplnit:
member(H,[H|T]).
member(X,[H|T]) :- member(X,T).