Skip to content

Instantly share code, notes, and snippets.

Created August 18, 2012 08:32
Show Gist options
  • Save anonymous/3385336 to your computer and use it in GitHub Desktop.
Save anonymous/3385336 to your computer and use it in GitHub Desktop.
Решение тринадцатого конкурса по функциональному программированию под эгидой ФП(ФП) на языке Prolog
% Для удобства вводим предикат "безумен", соответствующий отрицанию предиката "в своём уме"
% используем negation as failure
insane(X) :- \+ sane(X).
% Далее мы, по сути, почти дословно переписываем условия задачи -
% основную работу за нас будет делать логический движок Prolog.
% Используем такую формализацию: если X в своём уме, то то что
% X думает является истиной (фактом). У нас фигуранты думают
% исключительно о нормальности друг друга. :)
% Тройка думает, что Туз не в своём уме.
sane(troika) :- insane(tuz).
% Четвёрка думает, что Тройка и Двойка обе не могут быть не в своём уме.
% Более формально:
% Четвёрка думает, что Тройка в своём уме или Двойка в своём уме (или обе вместе, конечно)
sane(chetverka) :- sane(troika) ; sane(dvoika).
% Пятёрка думает, что Туз и Четвёрка либо оба не в своём уме, либо оба в своём уме.
sane(pjaterka) :- insane(tuz), insane(chetverka) ; sane(tuz), sane(chetverka).
% Шестёрка думает, что Туз и Двойка оба в своём уме.
sane(shesterka) :- sane(tuz), sane(dvoika).
% Семёрка думает, что Пятёрка не в своём уме.
sane(semerka) :- insane(pjaterka).
% Валет думает, что Шестёрка и Семёрка обе не могут быть не в своём уме.
sane(valet) :- sane(shesterka) ; sane(semerka).
% В своём ли уме Валет?
% swipl -s valet.pl -g "sane(valet), write('sane'), nl." -t halt
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment