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).