2duration(load,D) :-
3 D #< 23/3, D #> 10/3.
4duration(shoot,5).
5duration(wait,36).
6
7holds(0,State,[]) :-
8 init(State).
9holds(Time1, FinalState, [Action|As]) :-
10 Time1 #> 0,
11 Time1 #= Time + Duration,
12 duration(Action, Duration),
13 not prohibited(Action, Time1),
14 transition(Action, PrevState, FinalState),
15 holds(Time, PrevState, As).
16
17init(state(alive, unloaded, 0)).
18
19transition(load, state(alive, _, _), state(alive, loaded,FinalArmed)) :-
20 FinalArmed = 0.
21transition(wait, state(alive, Gun, PrevArmed), state(alive, Gun, FinalArmed)) :-
22 duration(wait, D), FinalArmed #= PrevArmed + D.
23transition(shoot, state(alive, loaded, PrevArmed), state(dead, unloaded, 0)) :-
24 not spoiled(PrevArmed).
25transition(shoot, state(alive, loaded, PrevArmed), state(alive, unloaded, 0)) :-
26 spoiled(PrevArmed).
27
28spoiled(Armed) :- Armed #> 35.
29prohibited(shoot, T) :- T #< 35.
30
31?- T #< 40, holds(T, state(dead,_,_), List). 32
33#show holds/3