Skip to content

Instantly share code, notes, and snippets.

@susl
Created January 30, 2012 14:13
Show Gist options
  • Save susl/1704598 to your computer and use it in GitHub Desktop.
Save susl/1704598 to your computer and use it in GitHub Desktop.
Einstein's Problem in SWI-Prolog, see http://habrahabr.ru/blogs/prolog/122142/ (in Russian)
#!/usr/bin/pl -q -t einstein -s
einstein :-
/*
условия 0, 1 и 8 можно упостить до:
Houses = [[norwegian,_,_,_,_],_,[_,_,_,milk,_],_,_]
тогда не нужен предикат nth1, но хотелось быть как можно ближе к оригиналу
*/
/* 0. Всего 5 домов */
Houses = [_,_,_,_,_],
/* 1. Норвежец живёт в первом доме. */
nth1(1, Houses, [norwegian,_,_,_,_]),
/* 2. Англичанин живёт в красном доме. */
member([englishman,_,_,_,red], Houses),
/* 3. Зелёный дом находится слева от белого, рядом с ним. */
nextto([_,_,_,_,green], [_,_,_,_,white], Houses),
/* 4. Датчанин пьёт чай. */
member([dane,_,_,tea,_], Houses),
/* 5. Тот, кто курит Marlboro, живёт рядом с тем, кто выращивает кошек. */
neighbors([_,_,marlboro,_,_], [_,cat,_,_,_], Houses),
/* 6. Тот, кто живёт в жёлтом доме, курит Dunhill. */
member([_,_,dunhill,_,yellow], Houses),
/* 7. Немец курит Rothmans. */
member([german,_,rothmans,_,_], Houses),
/* 8. Тот, кто живёт в центре, пьёт молоко. */
nth1(3, Houses, [_,_,_,milk,_]),
/* 9. Сосед того, кто курит Marlboro, пьёт воду. */
neighbors([_,_,marlboro,_,_], [_,_,_,water,_], Houses),
/* 10. Тот, кто курит Pall Mall, выращивает птиц. */
member([_,bird,pallmall,_,_], Houses),
/* 11. Швед выращивает собак. */
member([swede,dog,_,_,_], Houses),
/* 12. Норвежец живёт рядом с синим домом. */
neighbors([norwegian,_,_,_,_], [_,_,_,_,blue], Houses),
/* 13. Тот, кто выращивает лошадей, живёт в синем доме. */
member([_,horse,_,_,blue], Houses),
/* 14. Тот, кто курит Winfield, пьет пиво. */
member([_,_,winfield,beer,_], Houses),
/* 15. В зелёном доме пьют кофе. */
member([_,_,_,coffee,green], Houses),
/* Внимание, вопрос: у кого рыба? */
member([Owner,fish,_,_,_], Houses),
/* Печатаем решение */
print('Owner of the fish: '), print(Owner), nl,
print('Full Solution: '), print(Houses), nl.
/* Вспомогательные функции: */
neighbors(X, Y, List) :- nextto(X, Y, List) ; nextto(Y, X, List) .
/*
Эти функции входят в стандартную библиотеку.
Приведены тут для полноты решения.
*/
/*
member(X, [X | _]).
member(X, [_ | Rest]) :- member(X, Rest).
nth1(1, [Elem | _], Elem).
nth1(N, [_ | Rest], Elem) :- N > 1, K is N-1, nth1(K, Rest, Elem).
nextto(L, R, [L, R | _]).
nextto(L, R, [_ | Rest]) :- nextto(L, R, Rest).
*/
@McKenlly
Copy link

McKenlly commented Dec 6, 2017

nice, thank you

@PiterCoder
Copy link

This is a great program. It helped a lot, thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment