Форум программистов, компьютерный форум, киберфорум
Prolog
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 29.03.2013
Сообщений: 11

Переплыть через реку

04.01.2015, 14:00. Показов 3326. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание в Strawberry Prolog: четырем мужьям и их женам необходимо переплыть через реку. Лодка вмещает не более 2 человек, причем на берегу женщина может оставаться либо одна, либо в обществе других дам. Необходимо написать правило, находящее последовательность перевозки всех восьми человек с левого берега на правый.

Пробую сделать на основе похожей задачи "Во время наводнения пять супружеских пар оказались отрезанными от суши водой..." http://pro-prof.com/archives/1299

Prolog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
male(a).
male(b).
male(c).
male(d).
female(fa).
female(fb).
female(fc).
female(fd).
 
% генерация подсписков заданной длины
sublist(_, _, _, Len):- Len =< 0, !, fail.
sublist([], L, L, _).
sublist([H|_], L, [H|L], _).
sublist([H|T], L, [H|R], Len):-
  NewLen is Len - 1, sublist(T, L, R, NewLen).
sublist([_|T], L, R, Len):-
  sublist(T, L, R, Len).
 
% вычитание списков
dif([], _, []):-!.
dif([H|T], B, [H|TR]):-
  not(member(H, B)), !, dif(T, B, TR).
dif([_|T], B, TR):-
  dif(T, B, TR).
 
% длина списка
length([],0).
length([_|T],L):- length(T,TL), L=TL+1.
 
%подсчет количества мужчин и женщин
kolvoM([],0).
kolvoM([X|T],L):- kolvoM(T,TL), (male(X), L=TL+1;L=TL,!).
 
kolvoF([],0).
kolvoF([X|T],L):- kolvoF(T,TL), (female(X), L=TL+1;L=TL,!).
 
%проверка условия 
check(L):- kolvoM(L,M), kolvoF(L,F),!, (F=\=1;M=0). 
 
checkBoat([]):-!. 
 
%перегонка лодки с одного берега на другой
proliferate((Left, Boat, Right, left), (Left_1, Boat_1, Right, right)):-
  length(Boat, LenBoat), LenLeftPart is 2 - LenBoat,
  sublist(Left, [], LeftPart, LenLeftPart),
 
  dif(Left, LeftPart, Left_1),
  append(Boat, LeftPart, Boat_1),
 
  check(Left_1), check(Right), checkBoat(Boat_1).
 
proliferate((Left, Boat, Right, right), (Left, Boat_1, Right_1, left)):-
  length(Boat, LenBoat),
  sublist(Boat, [], BoatPart, LenBoat),
 
  dif(Boat, BoatPart, Boat_1),
  append(Right, BoatPart, Right_1),
 
  check(Right_1), check(Left),  checkBoat(Boat_1).
 
 
dfs(([], [], L, Dir), _, [([], [], L, Dir)]):-!.
 
 
dfs((A1,A2,A3,A4), VN, [(A1,A2,A3,A4)|TR]):-
  proliferate((A1,A2,A3,A4), (X1,X2,X3,X4)),
  not(member((X1,X2,X3,X4), VN)),
  dfs((X1,X2,X3,X4), [(A1,A2,A3,A4)|VN], TR).
 
?- dfs( ([a,b,c,d,fa,fb,fc,fd], [], [], left), [], Path),nl, write(Path).
Если убрать условие проверки checkBoat(Boat_1), то вроде работает, но лодка же сама по себе не может переплыть реку.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2015, 14:00
Ответы с готовыми решениями:

Перевезти через реку волка, козу и капусту
Здравствуйте. Требуется задача на Turbo Prolog: Крестьянину нужно перевезти через реку волка, козу и капусту. На реке есть лодка, на...

Переправить семью через реку
Здравствуйте дорогие друзья. У меня возникла проблема, нужно создать алгоритм на Clips к одной задаче, но вот как и что делать - не знаю....

Нужно переправить через реку
Здравствуйте уважаемые форумчане, помогите пожалуйста решить задачу, искала на форуме не нашла, аналогов решения много , но задачи совсем ...

2
Фрилансер
 Аватар для Black Fregat
3709 / 2083 / 567
Регистрация: 31.05.2009
Сообщений: 6,683
05.01.2015, 07:01
Вот, если честно, не знаю, как оно у Вас работает, даже если убрать checkBoat..

Для начала Вы должны самому себе чётко ответить на следующие вопросы:
1) Что есть текущее состояние системы и какими параметрами оно описывается
2) Каким образом генерируется множество допустимых ходов из данного состояния
3) Каким дополнительным условиям должен удовлетворять ход.

У Вас путаница уже с первым пунктом - в лодке всё время кто-то сидит, в результате совершенно непонятно, как соотносятся списки Left, Boat, Right.

Тем более Ваш proliferate понять совершенно невозможно. Две его ветки должны быть симметричными, а они разные..

Третий пункт Вы, вроде, сделали, но вот условие checkBoat явно нужно заменить на противоположное.

И еще один технический момент. Вы очень вольно обращаетесь с порядком элементов в списке. У Вас будет куча разных состояний, отличающихся только порядком людей в списке.
0
205 / 142 / 57
Регистрация: 25.12.2014
Сообщений: 447
07.01.2015, 17:52
Цитата Сообщение от Ashotrm Посмотреть сообщение
Лодка вмещает не более 2 человек, причем на берегу женщина может оставаться либо одна, либо в обществе других дам.
А если на берегу только женщина и её муж, то это уже нарушение? А в лодке она с чужим мужиком может кататься?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2015, 17:52
Помогаю со студенческими работами здесь

Чапаеву нужно переплыть реку С++
Чапаеву нужно переплыть реку Урал шириной B метров.Его скорость в стоячей воде V1 м,скорость реки V2.Под каким углом ему надо плыть,чтобы...

Через какое время катер пересечет реку
Катер пересекает реку шириной b=360м, текущую со скоростью v1=2 м/с. Рулевой катера держит курс перпендикулярно течению. Двигатель...

Задача: переправить через реку семью и полицейского с заключенным
Здравствуйте! Необходимо написать программу на языке C/C++ решения следующей задачи: Вам нужно переправить через реку с помощью одного...

Найти скорость и течения реки и время t, затраченное на переправу через реку
Лодка движется перпендикулярно к берегу со скоростью v = 7,2 км/ч. Течение относит ее на расстояние l = 150 м вниз по реке. Найти скорость...

Определить самую длинную реку
type река=(Волга,Ока,Нил,Тигр,Евфрат,Амазонка,Обь,Урал,Лена,Днепр); var длинна:array of integer. Определить самую длинную реку.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru