Toggle navigation
?
users online
Logout
Open hangout
Open chat for current file
/** <examples> ?- win_race1(Win, Fans). ?- win_race2(Win, Fans). */ % — Вот увидишь, Шумахер не придет первым, — сказал Дима. approve(dima, shum, no). % Первым будет Хилл. approve(dima, hill, yes). % — Да нет же, победителем будет, как всегда, Шумахер, — воскликнул Никита. approve(nik, shum, yes). % — А об Алези и говорить нечего, ему не быть первым. approve(nik, alesi, no). % Паша, к которому обратился Никита, возмутился: % — Хиллу не видать первого места, approve(pasha, hill, no). % а вот Алези пилотирует самую мощную машину. approve(pasha, _, yes). % По завершении этапа гонок оказалось, что каждое из двух предположений двоих % друзей подтвердилось, а оба предположения третьего из друзей оказались неверны. % Кто выиграл этап гонки? win_race1(Win, [Fan1-truth, Fan2-truth, Fan3-lie]) :- % если один из болельщиков назвал пилота-победителя правильно approve(Fan1, Win, yes), % и не назвал иначе \+ approve(Fan1, Win, no), % то другой approve(Fan2, _, _), % угадал так же, approve(Fan2, Win, yes), % и, не говорил, что этот пилот не победит \+ approve(Fan2, Win, no), % а третий approve(Fan3, _, _), % утверждал, что выигравший пилот не будет победителем, approve(Fan3, Win, no), % и также не утверждал, что будет \+ approve(Fan3, Win, yes), % рассуждения вели разные болельщики is_distinct([Fan1, Fan2, Fan3]), !. win_race2(Win, [Fan1-truth, Fan2-truth, Fan3-lie]) :- % подобрать болельщиков перестановкой permutation1([dima, nik, pasha], [Fan1, Fan2, Fan3]), % если один из болельщиков назвал пилота-победителя правильно approve(Fan1, Win, yes), % и не назвал иначе \+ approve(Fan1, Win, no), % то другой % угадал так же, approve(Fan2, Win, yes), % и, не говорил, что этот пилот не победит \+ approve(Fan2, Win, no), % а третий % утверждал, что выигравший пилот не будет победителем, approve(Fan3, Win, no), % и также не утверждал, что будет \+ approve(Fan3, Win, yes), !. % все элементы списка разные is_distinct([]). is_distinct([H | T]) :- \+ member1(H, T), !, is_distinct(T). % принадлежность member1(X,[X|_]). member1(X,[_|T]):- member1(X,T). % перестановка permutation1([], []). permutation1(List, [First|Perm]) :- select1(First, List, Rest), permutation1(Rest, Perm). % выбор с удалением select1(X, [X|Tail], Tail). select1(Elem, [Head|Tail], [Head|Rest]) :- select1(Elem, Tail, Rest).