2:- use_package(tabling). 3:- use_package(t_clpq). 4% :- push_prolog_flag(quiet, on). 5 6print_const(X) :- 7 display(X), 8 dump_constraints(X,X,C), 9 display(C). 10 11final(s0). 12final(s2). 13 14path(A,B,R) :- 15 A = s(s0,_,_), B = s(F,_,_), 16 reach(A,B,R), 17% print_const(R),nl, 18 final(F). 19 20:- table reach/3. 21reach(A,B,[A-Action,B]) :- 22 trans(A,B,Action). 23reach(A,B,[A-Action|R]) :- 24 trans(A,Z,Action), 25 reach(Z,B,R). 26 27trans(s(s0,T0, _C0), s(s1, T1, C1), drop(T1)) :- 28 T1 .>=. T0 + 1, 29 drop(T1), 30 C1 .=. 0. 31trans(s(s1,T1, _C1), s(s0, T00, C00), catch(T00)) :- 32 T00 .>=. T1 + 1, 33 C00 .=. T00 - T1, 34 catch(T00), 35 C00 .<. 2. 36trans(s(s1,T1, _C1), s(s2, T2, C2), wait(T2)) :- 37 T2 .>=. T1 + 1, 38 C2 .=. T2 - T1, 39 not catch(T2), 40 C2 .>=. 2. 41 42catch(T) :- not negcatch(T). 43negcatch(T) :- not catch(T). 44 45 46run :- 47 path(s(s0,0,0),s(_S,11,_C),R), T2 .=. T1 + 5, member(s(s0,T1,_)-drop(T2),R). 48 49% hold(T) :- T .>. 0. 50% hold(T) :- T .<. Td, drop(Td), not falling(T), not broken(T). 51% falling(T) :- not hold(T), not broken(T). 52% broken(T) :- not hold(T), not falling(T). 53 54% drop(2). 55%drop(T) :- T1 .<. T, T .<. T2, hold(T1), falling(T2). 56 57 58 59 60% hold(T) :- T .=. 0. 61% hold(T1) :- 62% T1 .>. Ti, 63% T1 .<. Td, 64% hold(Ti), 65% drop(Td). 66 67 68 69% findrange(M, N, X) :- driver(0, s0, 0, 0, X, R), 70% append(A, [f(catch, T2)|_], R), append(_, [f(drop, T1)|_], A), 71% N .<. T2 - T1, T2 .<. T1 + M, M .>. 0, N .>. 0. 72 73% append([], L, L). 74% append([X|A], B, [X|C]) :- append(A, B, C). 75 76% ball(s0, drop, s1, T1, T2, T3) :- 77% T3 .=. T1. 78% ball(s1, catch, s0, T1, T2, T3) :- 79% T1 .=<. T2 + 1, 80% T3 .=. T2. 81% ball(s1, wait, s2, T1, T2, T3) :- 82% T1 .>. T2 + 1, 83% T3 .=. T2. 84 85% driver(0,s0,T,T0,[X|Rst], [f(X,T)|R]) :- 86% ball(S0,X,S00,T,T0,T00), 87% % action(X,T), 88% TA .>. T, 89% % X = drop, N = 0, 90% driver(1, S00,TA,T00,Rst,R). 91 92% driver(N,S0,T,T0,[X|Rst], [f(X,T)|R]) :- 93% N > 0, 94% ball(S0,X,S00,T,T0,T00), 95% % action(X,T), 96% TA .>. T, 97% X \= drop, 98% driver(N, S00,TA,T00,Rst,R). 99 100% driver(N,S0,T,T0,[X|Rst], [f(X,T)|R]) :- 101% ball(S0,X,S00,T,T0,T00), 102% % action(X,T), 103% TA .>. T, 104% (X = drop ; X = wait), 105% R = [], Rst = [], N>0. 106 107 108 109 110% hold(T) :- 111% T1 .<. T, 112% T .<. T2, 113% init(T1), 114% drop(T2). 115 116 117 118 119 120 121 122% drop(T,T1,T2) :- 123% T1 .<. T2, 124% holding(T1,T), 125% not holding(T,T2). 126 127% holding(0,5). 128 129% not_holding(T,D) :- not holding(T,D). 130 131% :- holding(T,D), not_holding(T,D). 132 133 134 135 136% :- use_package(clpr). 137% :- op(700, fx, [(not)]). 138 139% n1(T) :- 140% holding(T), 141% not falling(T), 142% not broken(T). 143% n2(T) :- 144% not holding(T), 145% falling(T), 146% not broken(T). 147% n3(T) :- 148% not holding(T), 149% not falling(T), 150% broken(T). 151 152% edge(n1(T1),n2(T2),T1,T2) :- 153% T .>. T1 + 4, 154% drop(T), 155% % T2 .>. T1, 156% T1 .<. T, 157% T2 .>=. T. 158 159% edge(n2(T1), n1(T2),T1,T2) :- 160% catch(T), 161% % T2 .>. T1, 162% T1 .<. T, 163% T2 .>=. T, 164% T2 .<. T + 1. 165% edge(n2(T1), n3(T2),T1,T2) :- 166% not catch(T), 167% % T2 .>. T1, 168% T1 .<. T, 169% T2 .>=. T, 170% T2 .>=. T + 1. 171 172% trans(S1,S2,T1,T2) :- 173% edge(S1,S2,T1,T2). 174 175% trans(S1,S2,T1,T2) :- 176% T2 .>. T1, 177% edge(S1,Si,T1,Ti), 178% trans(Si,S2,Ti,T2).