Hádanka pro chytré hlavičky

Ostatní2. duben 2006, 21:56

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!

  1. Je 5 domů, každý jiné barvy.
  2. V každém domě bydlí jedna osoba jiné národnosti.
  3. Každý majitel domu upřednostňuje určitý nápoj, kouří určitou značku cigaret a chová určité zvíře.
  4. Žá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).
[1] Kalicka [web], 5. červen 2006, 19:04

Po dlouhé době odpovědi:

Rybu chová Němec.

Vodu pije Nor.

[2] Robert Brunetto, 19. září 2008, 4:26

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