Einsteins raadsel

Creative Commons License
This work is licensed under a
Creative Commons Attribution-NonCommercial-ShareAlike 4.0
International License
.

Editor

John Val
Einsteins raadsel

Wat leer je in dit hoofdstuk:

Bron De zebra puzzel ook bekend als het raadsel van Einstein en het gerucht gaat (niet bewezen!) dat de beroemde wetenschapper Albert Einstein dit raadsel heeft verzonnen. Daarnaast, gaat het gerucht dat ongeveer 2% van alle mensen dit raadsel goed kan oplossen. Ben je er klaar voor? Hier is het raadsel:

  1. Er zijn vijf huizen.
  2. De Engelsman woont in het rode huis.
  3. De Spanjaard is de eigenaar van de hond.
  4. Koffie wordt in het groene huis gedronken.
  5. De Ukraiener drinkt thee.
  6. Het groene huis staat direct rechts naast het ivoor kleurige huis.
  7. De "Old Gold" roker is eigenaar van slakken.
  8. "Kools" worden gerookt in het gele huis.
  9. Melk wordt in het middelste huis gedronken.
  10. De Noor woont in het eerste huis.
  11. De man die "Chesterfields"rookt woont in het huis naast de man met de vos.
  12. "Kools" worden gerookt in het huis naast het huis waar het paard is.
  13. De "Lucky Strike" roker drink sinaasappelsap.
  14. De Japanner rookt "Parliaments".
  15. De Noor woont naast het blauwe huis.

De vraag is nu: Wie drinkt water en van wie is de zebra?

Voor de duidelijkheid, ieder huis heeft een andere kleur, een ander huisdier, en één bewoner uit een verschillend land. Ieder bewoner heeft zijn eigen drankje en zijn eigen sigarettenmerk (alle verschillend).

Oké, het is natuurlijk een uitdaging om dit op papier op te lossen. Hoor jij bij de 2%? Maar is het niet interessanter als we een programma kunnne schrijven die dit probleem voor ons oplost? Dit soort problemen zijn één van de weinige gebieden waar Prolog geweldig is - programmeren met voorwaarden. In de procedurele programma's, zoals Javascript, moet je algoritme verzinnen om tot een oplossing te komen. Dit is geen makkelijke taak. In Prolog echter hoeven we alleen de voorwaarden ( feiten en regels ) te formuleren, waarna Prolog het probleem oplost door middel van "backtracking". Hier onder vind je een opzet om een aantal van de voorwaarden in het raadsel om te zetten naar Prolog code. Probeer zelf de andere voorwaarden erbij te zetten.


% raadselEinstein.pl
% Het raadsel van Einstein
losOp( WieDrinktWater, VanWieIsDeZebra) :-
  length(Huizen, 5),                                     		% 1.  Er zijn 5 Huizen.
  member(huis(red, engelsman, _, _, _), Huizen),            		% 2.  De Engelsman woont in het rode huis.
  ... ,

  nth0(0, Huizen, huis(_, noor, _, _, _) ),				% 10. De Noor woont in het eerste huis.
  (   	
	nextto(huis(_, _, _, _, chesterfields ), huis(_, _, vos, _, _ ), Huizen);
	nextto(huis(_, _, vos, _, _ ), huis(_, _, _, _, chesterfields ), Huizen)
  ),			    						% 11. De man die "Chesterfields"rookt woont in het huis naast de man met de vos.
  ... ,


  member(huis(_, WieDrinktWater, _, water, _), Huizen),  		% Wie drinkt water?
  member(huis(_, VanWieIsDeZebra, zebra, _, _), Huizen). 		% Van wie is de zebra?
  

Je kunt de aangevulde code in een nieuw programma in SWISH kopiëren. Daarna stel je je vraag in het vraagveld

?- solve(WieDrinktWater, VanWieIsDeZebra).
WieDrinktWater = noor,
VanWieIsDeZebra = japanner ;
  false.

Ta-da! Prolog vertelt ons dat de Noor water drinkt en de Japanner de eigenaar van de zebra is. Als we om nog een oplossing vragen blijkt dat dit ook de enige oplossing is.

De volledige code voor het probleem kun je hier of hier vinden.