Задачка про сбор урожая - Prolog
Формулировка задачи:
Саша, Юля и Оксана помогали собирать урожай - малину, смородину и клубнику. Каждый из них собирал что-то одно. Кто что собирал, если известно, что больше всего было собрано клубники, Саша не собирал смородину, а Саша и Юля вдвоем набрали ягод меньше, чем Оксана?
на листочке то я решил,
Миша-вишню
Коля-крыжовник
Дима-смородину
а вот как это в прологе реализовать?
Решение задачи: «Задачка про сбор урожая»
textual
Листинг программы
domains
list = symbol*
predicates
select(symbol, list, list)
clauses
select(H, [H|T], T).
select(X, [H|T1], [H|T2]) :-
select(X, T1, T2).
goal
L1 = ["малину", "смородину", "клубнику"],
select(Sasha, L1, L2),
select(Yula, L2, L3),
select(Oksana, L3, _),
Oksana = "клубнику",
not(Sasha = "смородину"),
write("Саша собирала ", Sasha), nl,
write("Юля собирала ", Yula), nl,
write("Оксана собирала ", Oksana), nl.
Объяснение кода листинга программы
- Задана структура списка, он может содержать символы.
- Задана структура предиката select, который принимает три аргумента: символ, список, список.
- Задано правило для предиката select, которое позволяет обрабатывать список, состоящий из одного элемента.
- Задано правило для предиката select, которое позволяет обрабатывать список, состоящий из двух элементов.
- Задана цель, которую нужно достичь.
- Заданы значения переменных:
Sasha =
малинаYula =смородина* Oksana =клубника - Задано условие, которое говорит, что Sasha не должна быть равна
смородина. - Задано выражение для вывода на экран информации о сборе урожая.
- Выполняется сбор урожая: Саша собирает малину. Юля собирает смородину. * Оксана собирает клубнику.
- Выводится на экран информация о сборе урожая.