Skip to content

Instantly share code, notes, and snippets.

@mbauhardt
Last active May 30, 2017 21:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mbauhardt/05d9feca90062c7c0561b8eb3f779b5b to your computer and use it in GitHub Desktop.
Save mbauhardt/05d9feca90062c7c0561b8eb3f779b5b to your computer and use it in GitHub Desktop.
Prolog program to solve the Einstein Puzzle (https://en.wikipedia.org/wiki/Zebra_Puzzle)
% 5 hauser neben einander
% jedes hat eine andere farbe
% in jedem haus woihnt ein andere nationalität
% in jedem haus ein anderes getränk
% in jedem haus eine andere zigaretten marke
% in jedem haus ein anderes haustier
% 1 der engländer wohnt im roten haus
% 2 der spanier hat einen hund
% 3 Kaffee wird im gruenen haus getrunken
% 4 der ukrainer trinkt tee
% 5 das gruene haus ist direkt rechts neben de weissen haus
% 6 der raucher vom altem gold hat schnecken
% 7 Kools werden im gelben haus geraucht
% 8 milch wird im mittleren haus getrunken
% 9 der norweger wohnt im linken haus
% 10 der chesterfield raucher wohnt direkt neben dem mann mit dem fuchs
% 11 kools wird neben dem haus mit dem pferd geraucht
% 12 der lucky strike raucher trinkt orangensaft
% 13 der japaner raucht parliament
% 14 der norweger wohnt neben dem blauen haus
% wer trinkt wasser
% wer besitzt das zebra
:-print('loese_das_einstein_raetsel eingeben um das Einstein Raetsel zu loesen'),nl,nl.
erste(F, [F,_,_,_,_]).
mittlere(M, [_, _, M, _, _]).
rechts(R, L, [L, R|_]).
rechts(R, L, [_|T]) :- rechts(R, L, T).
neben(A, B, [A, B|_]).
neben(A, B, [B, A|_]).
neben(A, B, [_|T]) :- neben(A, B, T).
writehaus([]).
writehaus([A|T]) :- write(A), nl, writehaus(T).
% haus: [farbe, nation, haustier, getraenk, zigarette]
loese_das_einstein_raetsel :-
% 5 hauser
H = [_, _, _, _, _],
% der engländer wohnt im roten haus
member([rot, englaender, _, _, _], H),
% der spanier hat einen hund
member([_, spanier, hund, _, _], H),
% kaffee wird im gruenen haus getrunken
member([gruen, _, _, kaffee, _], H),
% der ukrainer trinkt tee
member([_, ukrainer, _, tee, _], H),
% das gruene haus ist direkt rechts neben de weissen haus
rechts([weiss, _, _, _, _], [gruen, _, _, _, _], H),
% der raucher vom altem gold hat schnecken
member([_, _, schnecke, _, altesgold], H),
% Kools werden im gelben haus geraucht
member([gelb, _, _, _, kools], H),
% milch im mittleren
mittlere([_,_,_,milch,_], H),
% der norweger wohnt im linken haus
erste([_, norweger, _, _, _], H),
% chesterfields raucher wohnt direkt neben dem mann mit dem fuchs
neben([_, _, _, _, chesterfield], [_, _, fuchs, _, _], H),
% kools neben dem haus mit dem pferd
neben([_, _, _, _, kools], [_, _, pferd, _, _], H),
% lucky strike trinkt orangensaft
member([_, _, _, orangensaft, luckies], H),
% japaner rucht parliament
member([_, japaner, _, _, parliament], H),
% der norweger wohnt neben dem blauen haus
neben([_, norweger, _, _, _], [blau, _, _, _, _], H),
member([_, Wassertrinker, _, wasser, _], H),
member([_, Zebrabesitzer, zebra, _, _], H),
nl,
write('Der '), write(Zebrabesitzer), write(' besitzt das Zebra.'), nl,
write('Der '), write(Wassertrinker), write(' trinkt Wasser.'), nl,
nl,
writehaus(H),
nl.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment