Re: The Bridge crossing prolog program
- From: Markus Triska <triska@xxxxxx>
- Date: Sun, 29 Jan 2006 21:17:17 +0100
Hi!
vag wrote:
Anyone have the prolog program solving this problem?
Here is one:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
touristList([t1,t2,t3,t4]).
time(t1, 6).
time(t2, 7).
time(t3, 10).
time(t4, 15).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
member_rest(E, [E|Es], Es).
member_rest(M, [E|Es], [E|Rest]) :-
member_rest(M, Es, Rest).
% move two people from left to right
solve_left(s(Lefts0, Rights0), Time0, Plan0, Plan) :-
member_rest(T1, Lefts0, Lefts1),
member_rest(T2, Lefts1, Lefts2),
time(T1, TT1),
time(T2, TT2),
Time1 is Time0 - max(TT1, TT2),
Time1 >= 0,
Plan0 = [[T1,T2]|Rest],
solve_right(s(Lefts2, [T1,T2|Rights0]), Time1, Rest, Plan).
% move one tourist from right to left if necessary
solve_right(s(Lefts0, Rights0), Time0, Plan0, Plan) :-
( Lefts0 == [] ->
Plan0 = Plan
;
member_rest(T, Rights0, Rights1),
time(T, TT),
Time1 is Time0 - TT,
Time1 >= 0,
Plan0 = [[T]|Rest],
solve_left(s([T|Lefts0], Rights1), Time1, Rest, Plan)
).
cross(Max, Plan) :-
touristList(Ts),
( Ts = [Single] ->
time(Single, Time),
Time =< Max,
Plan = [[Single]]
;
solve_left(s(Ts, []), Max, Plan, [])
).
Example:
?- cross(42, Plan).
Plan = [[t1, t2], [t1], [t3, t4], [t2], [t2, t1]]
Yes
All the best,
Markus.
.