| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Prolog > Задача о миссионерах и людоедах |
| Автор: Alenkakiss 22.12.2009, 15:19 | ||
| Помогите нововичку разобраться в логической задаче. Условие Миссионеры и людоеды (поиск в ширину). Три миссионера и три людоеда находятся по одну сторону реки, через которую они хотят переправиться. В их распоряжении имеется лодка, которая может выдержать вес только двух человек. Кроме того, если в какой-то мо-мент число людоедов станет больше числа миссионеров, миссионеры будут съедены независимо от того, на каком берегу реки это случится. Указания к решению. Различные состояния этой задачи однозначно задаются информацией, на каком берегу находятся лодка и сколько миссионеров и лю-доедов на этом же берегу. Поэтому структура state(ЛокализацияЛодки, ЧислоМиссионеровНаТомБерегуГдеЛодка, ЧислоЛюдоедовНаТомБерегуГдеЛодка) полностью описывает состояние. Допустимые состояния для решения задачи - это те, когда людоеды не могут съесть миссионеров ни на том берегу, где лодка, ни на противоположном, Возможные значение первого аргумента: атомы west (западный берег) и east (восточный берег). Возможные значения остальных аргументов: 0, 1, 2 или 3. Начальное состояние: state(east,3, 3). Конечное состояние: state(west,3,3). 2 людоеда или 1 людоед и 1 миссионер переправляются. 2. миссионер возвращается назад, если посылали 2 людоедов, то возвращается один из людоедов. Итак: на 1-ом берегу 2Л и 3М, на втором 1Л. 3. Посылаем на тот берег 2Л. 4. Возвращаем 1Л. Итак: на 1-ом берегу 1Л и 3М, на втором 2Л. 5. Пускаем 2М на тот берег. 6. Возвращаем 1Л и 1М. Итак: На этом берегу 2Л и 2М, на втором 1Л и 1М 7. Посылаем на тот берег 2М. 8. Возвращаем на 1-ый берег 1Л. Итак: на 1-ом берегу 3Л, на втором 3М. 9. Посылаем на тот берег 2Л. 10. Возвращаем назад 1Л. 11. Переправляем последних голодных и уставших 2Л. Нашла решение этой задачи на VIP7 с помощью поиска в ширину. Оно содержит 11 переправ.
Подскажите, как переделать для SWI-Prolog? |