-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathumbrella.pl
39 lines (32 loc) · 1.39 KB
/
umbrella.pl
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
% take(L,H,T) unifies iff H is a member of list L and T is the list without H
take([H|T],H,T).
take([H|T],R,[H|S]) :- take(T,R,S).
% list permutation
perm([],[]).
perm(List,[H|T]) :- take(List,H,R), perm(R,T).
% Umbrella problem
speed(andy, 1).
speed(brenda, 2).
speed(carl, 5).
speed(dana, 10).
returnJourney(InHouse, InCar, GoOut, Return1, Return2, InHouseNext, InCarNext, Time) :-
take(InHouse, GoOut, InHouse2),
take([GoOut|InCar], Return1, InCar2),
take(InCar2, Return2, InCarNext),
InHouseNext = [Return1, Return2 | InHouse2],
speed(GoOut, OutTime),
speed(Return1, Return1Time),
speed(Return2, Return2Time),
Time is OutTime + max(Return1Time, Return2Time).
travels(X, Y, X, Y, 0, []).
travels(InHouse, InCar, InHouseFinal, InCarFinal, TotalTime, Log) :-
returnJourney(InHouse, InCar, GoOut, Return1, Return2, InHouseNext, InCarNext, Time),
travels(InHouseNext, InCarNext, InHouseFinal, InCarFinal, TotalTimeNext, LogNext),
Log = [out(GoOut), return(Return1, Return2) | LogNext],
TotalTime is Time + TotalTimeNext.
solve(Log, Time) :-
perm([andy, brenda, carl, dana], Everybody),
travels([andy, brenda], [ carl, dana], Everybody, [], Time, Log).
iterative([Time|Log], Time) :- solve(Log, Time).
iterative(Log, Time) :- LongerTime is Time + 1, iterative(Log, LongerTime).
iterative(Log) :- iterative(Log, 0).