Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SWI Prolog. Задача Волк-коза-капуста, не знаю как подойти к задаче 
:(
    Опции темы
wowka19
Дата 5.5.2012, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



Задача проста.

На берегу реки находятся Волк, Коза и Капуста.
Мужику надо перевести всех на другой берег, но в лодку поместится только что-то одно.
Очевидно нужно сделать три ходки, но при этом учитывать, что оставлять Волка с Козой или Козу с Капустой одних на берегу нельзя по понятным причинам.

Решение несложное.
1. Переправить Козу
2. Вернуться обратно пустым (в лодке никого нет)
3. Переправить Волка
4. Вернуться обратно забрав Козу
5. Переправить Капусту, оставив Козу
6. Вернуться обратно пустым
7. Переправить Козу.

Примечание.
Конечно это не единственное решение.

Вот только найти это решение нужно на прологе! желательно SWI.
Не знаю как подойти к задаче. Мне как сишнику пролог просто ломает мозг.

Заранее Спасибо.
PM MAIL   Вверх
Фантом
Дата 5.5.2012, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 2
Всего: 49



Цитата(wowka19 @  5.5.2012,  16:42 Найти цитируемый пост)
Задача проста.

Держите решение. Я оставил вывод информации о попытках поиска решения, чтобы было нагляднее. Решение формально получается в обратном порядке, однако поскольку решений два и они симметричны, то можно читать и в прямом. Конечно, можно было не выпендриваться с полными названиями, но, думаю, так будет понятнее.

Код

/* состояние(человек,волк,коза,капуста,последняя перевозка) */

состояние(правый,правый,правый,правый,_):-
  write('Приехали'),nl,
  write('Итоговая последовательность действий в обратном порядке:'),nl. 

состояние(Человек,Волк,Коза,_,_):-
  Волк=Коза,not(Коза=Человек),write('Козу съели'),nl,!,fail.
состояние(Человек,_,Коза,Капуста,_):-
  Капуста=Коза,not(Коза=Человек),write('Капусту съели'),nl,!,fail.

состояние(правый,Волк,Коза,Капуста,Последний):-
  not(Последний=ничего),write('Поехали порожняком на левый'),nl,
  состояние(левый,Волк,Коза,Капуста,ничего),write('Поехали порожняком на левый'),nl.

состояние(Вместе,Вместе,Коза,Капуста,Последний):-
  not(Последний=волк),напротив(Вместе,Другой),
  write('Повезли волка на'),write(Другой),nl,
  состояние(Другой,Другой,Коза,Капуста,волк),
  write('Повезли волка на '),write(Другой),nl.

состояние(Вместе,Волк,Вместе,Капуста,Последний):-
  not(Последний=коза),напротив(Вместе,Другой),
  write('Повезли козу на '),write(Другой),nl,
  состояние(Другой,Волк,Другой,Капуста,коза),
  write('Повезли козу на '),write(Другой),nl.

состояние(Вместе,Волк,Коза,Вместе,Последний):-
  not(Последний=капуста),напротив(Вместе,Другой),
  write('Повезли капусту на '),write(Другой),nl,
  состояние(Другой,Волк,Коза,Другой,капуста),
  write('Повезли капусту на '),write(Другой),nl.

состояние(левый,Волк,Коза,Капуста,Последний):-
  not(Последний=ничего),
  write('Поехали порожняком на правый'),nl,
  состояние(правый,Волк,Коза,Капуста,ничего),
  write('Поехали порожняком на правый'),nl.

напротив(правый,левый).
напротив(левый,правый).

goal:-состояние(левый,левый,левый,левый,ничего).


Тут есть пара "фокусов" - введен явный запрет лодочнику делать одно и то же два раза подряд (чтобы не возил одного пассажира туда-сюда до бесконечности) и явно выделено преимущество перевозки слева направо (первая возможная альтернатива для лодочника - возвращаться с правого берега на левый порожняком).

Цитата(wowka19 @  5.5.2012,  16:42 Найти цитируемый пост)
Мне как сишнику пролог просто ломает мозг.

Ничего, это полезно.  smile 

PM   Вверх
wowka19
Дата 16.5.2012, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 30.11.2011

Репутация: нет
Всего: нет



блин! идея вроде понятна - закрываешь код и пробуешь реализовывать самому - полный тупняк!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Добро пожаловать в раздел "Другие языки" форума Vingrad!

Void
Void

Раздел посвящён различным языкам программирования, для которых (в силу невысокой популярности) нет отдельного раздела (GPSS, Lua, MATLAB, Ada, Forth, Smalltalk, Tcl, REXX, AWK и др.)

  • Обязательно следуйте правилам Форума.
  • Пожалуйста, прочитайте и следуйте рекомендациям по работе в разделе и навигации по Форуму.
  • Для вставки текстов исходных кодов используйте подсветку синтаксиса из выплывающего списка Код в форме ответа. Если Ваш язык в списке не представлен, то используйте тег: [code=ваш_язык]код[/code], например, [code=ada]код[/code]. Если в будущем подсветка синтаксиса для указанного языка будет реализована, исходный код преобразится.
  • Помните, один вопрос - одна тема.

Приятного времяпрепровождения! С уважением, Void, kemiisto .

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Другие языки | Следующая тема »


 




[ Время генерации скрипта: 0.1034 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.