Прежде чем заявить об этом, я логически понимаю решение этого вопроса, просто мне трудно его кодировать. Семья из 4 человек пытается перейти мост ночью. Чтобы пересечь мост, нужен фонарик, и только два человека могут пересечь мост одновременно, двигаясь со скоростью более медленного из двух. Отец пересекает мост за 1 минуту, Мать — за 2 минуты, Ребенок — за 5 минут, а бабушка — за 10. Я пытаюсь написать программу на Прологе, которая сможет справиться с такими вопросами, но для семей любого размера, движущихся с любой скоростью. Общее время пересечения должно быть меньше максимального указанного времени. Нам даны семьи в фактической форме family(Name,[X1/T1,X2/T2...etc])
. Нас просят определить предикат MoveFamily(FamilyName, MAxTime, Moves, Time)
, где familyName
и Max time
являются связанными переменными, а ходы привязываются к шагам, предпринимаемым для перехода всех с одной стороны на другую, время привязывается к общему времени, которое требуется. Вот что у меня есть до сих пор:
moveSouth(North,South,Moves,Time):-
member(X/T1,North), % x is a member of the north list
member(Y/T2,North), %y is a member of the north list
X \= Y,
Big is max(T1,T2),
select(X/T1, North, List2), %List2 is North with x removed
select(Y/T2, List2, NewNorth), %newNorth is north with x and y removed
New is Time+Big, %new time is old time plus maximum time
moveNorth(NewNorth, [X/T1,Y/T2|South], [X+Y|Moves], New).
moveNorth([],_,[],_,_). %this will be the last move
moveNorth(North,South,Moves,Time):-
member(X/T1,South),
select(X/T1, South, NewSouth),
New is Time + T1,
moveSouth([X/T1|North], NewSouth, [X|Moves], New).
getList(Name,List):-
family(Name,List).
moveFamily(Name, Max, Moves, Time):-
getList(Name,People),
Time =< Max,
moveSouth(People, [], Moves, Time).
family(two, [fred/1, george/2]).
Когда я запускаю это на факте family(two, [fred/1, george/2])
. Я получил :
[debug] ?- moveFamily(two,20,Moves,Time).
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [9] _10170=<20
ERROR: [8] moveFamily(two,20,_10200,_10202)
ERROR: [7] <user>
Exception: (9) _9500=<20 ? creep
Exception: (8) moveFamily(two, 20, _9498, _9500) ? creep
Кто-нибудь знает, почему это не сработает?
редактировать: при пересечении двух одновременно они движутся со скоростью более медленного члена
edit2: семья "Два" family(two, [fred/1, george/2])
.
edit3: желаемый результат запроса moveFamily(two,20,Moves,Time)
должен быть
Moves = [fred+george],
Time = 2
edit4: я поместил семейный факт в блок кода, я манекен и должен был понять, что вы имели в виду, лол