:-use_module(library(tcltk)). r_0toy0(['$t'((r_0toy0(A,B),C),(tcl_command('destroy .',D,E),F),G,H)|A],['$t'(C,F,G,H)|B]). r_1toy0(['$t'(A,B,(tcl_command(update,['$t'(A,C,D,E)|F],['$t'((r_1toy0(G,H),I),J,K,L)|G]),D),E)|F],['$t'(I,B,K,L)|H]). toy(A,B):- static([green,red,move,stop,start,quit]), tk([name(toy)],A,C), r_set_value(move,0), r_set_value(quit,0), r_set_value(stop,0), r_set_value(start,0), r_set_value(red,1), r_set_value(green,0), toy_init(C,D), r_0toy0(D,E), r_1toy0(E,B). r_0toy00(['$t'((r_0toy00(A,B),C),(tcl_command('destroy .',D,E),F),G,H)|A],['$t'(C,F,G,H)|B]). r_1toy00(['$t'(A,B,(tcl_command(update,['$t'(A,C,D,E)|F],['$t'((r_1toy00(G,H),I),J,K,L)|G]),D),E)|F],['$t'(I,B,K,L)|H]). toy0(A,B):- static([green,red,move,stop,start,quit]), r_set_value(move,0), r_set_value(quit,0), r_set_value(stop,0), r_set_value(start,0), r_set_value(red,1), r_set_value(green,0), toy_init(A,C), r_0toy00(C,D), r_1toy00(D,B). r_0toy_init0(A,['$t'(B,C,D,E)|F]):- check_event(A,['$t'((r_0toy_init0(G,F),B),C,D,E)|G]). toy_init(A,['$t'(B,C,D,'$c'(E,F,notEmpty))|G]):- r_0toy_init0(A,H), bounce_init(['$t'(I,J)|'$t'(K,L)],'$t'(M,N),'$t'(O,P),H,['$t'((toy1([J|L],N,P,Q,G),B),C,D,'$c'(E,F,notEmpty))|Q]). r_0toy13(A,B,C,D,['$t'(E,F,G,H)|I]):- unifyNext(A,J), unifyNext(B,K), unifyNext(C,L), button_red(A,D,M), button_green(B,M,N), bounce(C,N,['$t'((r_0toy13(J,K,L,O,I),E),F,G,H)|O]). toy1(A,B,C,D,E):- s1(D,F), r_0toy13(B,C,A,F,E). r_0start0(A,A):- r_set_value(start,0). r_0start0(A,A). start(['$t'((r_0start0(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_set_value(start,1). r_0stop0(A,A):- r_set_value(stop,0). r_0stop0(A,A). stop(['$t'((r_0stop0(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_set_value(stop,1). quit(A,A):- r_set_value(quit,1). button_red(A,B,C):- r_read_value(red,0), out(A,'""',red,B,C). button_red(A,B,C):- r_read_value(red,1), out(A,'Red',red,B,C). button_green(A,B,C):- r_read_value(green,0), out(A,'""',green,B,C). button_green(A,B,C):- r_read_value(green,1), out(A,'Green',green,B,C). size(A,B,C,D,E,E):- uatom(A,200), uatom(B,200), uatom(C,5), uatom(D,'7x14'). r_0bounce_init3(A,B,C,['$t'((r_0bounce_init3(D,E,F,G,H),I),J,K,L)|G],['$t'(I,J,K,L)|H]):- unifyNowNext(A,M,D), unifyNow(D,M), unifyNowNext(B,N,E), unifyNow(E,N), unifyNowNext(C,O,F), unifyNow(F,O). bounce_init(A,B,C,D,E):- ulist(A,F,G), uconst(F,'.toy'), ulist(G,H,I), uconst(H,'$w.canvas0'), ulist(I,J,K), uconst(J,circle), ulist(K,L,M), uconst(L,'$w.frame1.label3'), ulist(M,N,O), unifyNext(N,P), unifyNow(P,Q), ulist(O,R,S), uconst(R,'$w.frame1.label2'), ulist(S,T,U), unifyNext(T,V), unifyNow(V,W), ulist(U,X,Y), unifyNext(X,Z), unifyNow(Z,A1), unifyAll(['$t'(B1,'$t'(C1,D1)),'$t'(-(E1),F1),'$t'(G1,H1),'$t'(I1,J1)],Y), uconst(B,'$w.frame1.label3'), uconst(C,'$w.frame1.label2'), size('$t'(K1,L1),'$t'(M1,N1),'$t'(O1,P1),Q1,D,R1), S1 is K1-2, T1 is M1-2, Q is K1/2, W is M1/2, view('$t'(K1,L1),'$t'(M1,N1),'$t'('.toy',U1),'$t'('$w.canvas0',V1),R1,W1), rectangle(0,0,0,'$t'(S1,X1),'$t'(T1,Y1),'$t'('$w.canvas0',V1),W1,Z1), circle(1,'$t'(circle,A2),'$t'(Q,B2),'$t'(W,C2),'$t'(O1,P1),'$t'('$w.canvas0',V1),Z1,D2), I1 is K1-10, G1 is M1-10, E1 is O1/2, r_0bounce_init3('$t'(I1,J1),'$t'(G1,H1),'$t'(-(E1),F1),D2,E), A1 is O1/2, C1 is O1*2. bounce(A,B,C):- ulist(A,D,E), ulist(E,F,G), ulist(G,H,I), ulist(I,J,K), ulist(K,L,M), unifyNowNext(L,N,O), unifyNow(O,P), ulist(M,Q,R), ulist(R,S,T), unifyNowNext(S,U,V), unifyNow(V,W), ulist(T,X,Y), unifyNowNext(X,Z,A1), unifyNow(A1,B1), unifyAll(['$t'(C1,'$t'(D1,E1)),'$t'(F1,G1),H1,I1],Y), r_read_value(move,1), r_read_value(quit,0), J1 is U+C1, K1 is J1, moveto(F,H,L,S,B,L1), calc_xd(L,X,'$t'(B1,M1),H1,L1,N1), calc_yd(S,'$t'(C1,'$t'(D1,E1)),'$t'(O1,P1),'$t'(K1,Q1),'$t'(W,R1),N1,C), P is N+Z, D1 is O1+F1. bounce(A,B,B):- ulist(A,C,D), ulist(D,E,F), ulist(F,G,H), ulist(H,I,J), ulist(J,K,L), unifyNowNext(K,M,N), unifyNow(N,M), ulist(L,O,P), ulist(P,Q,R), unifyNowNext(Q,S,T), unifyNow(T,S), ulist(R,U,V), unifyNowNext(U,W,X), unifyNow(X,W), unifyAll(['$t'(Y,'$t'(Y,Z)),A1,B1,C1],V), r_read_value(move,0), r_read_value(quit,0). bounce(A,B,B):- ulist(A,C,D), r_read_value(quit,1). calc_xd(A,B,C,D,E,E):- unifyNow(A,F), unifyNow(B,G), unifyNow(C,H), F<10, H is abs(G). calc_xd(A,B,C,D,E,E):- unifyNow(A,F), unifyNow(B,G), unifyNow(C,H), unifyNow(D,I), F>I, H is-(abs(G)). calc_xd(A,B,C,D,E,E):- unifyAll(B,C). calc_yd(A,B,C,D,E,F,F):- unifyNow(A,G), unifyNow(B,H), unifyNow(C,H), unifyNow(E,10), G<10, H>0. calc_yd(A,B,C,D,E,F,F):- unifyNow(A,G), unifyNow(B,H), unifyNow(C,I), unifyNow(E,10), G<10, I is 9* -(H)/10. calc_yd(A,B,C,D,E,F,F):- unifyAll(B,C), unifyAll(D,E). out(A,B,C,D,E):- tcl_command([A,' configure -text ',B,' -foreground ',C],D,E). view(A,B,C,D,E,F):- tcl_command(['set w ',C],E,G), tcl_command('source bou.tcl',G,F). rectangle(A,B,C,D,E,F,G,H):- uatom(A,1), !, tcl_command([F,' create rectangle ',B,' ',C,' ',D,' ',E,' ','-stipple gray50 -fill black'],G,H). rectangle(A,B,C,D,E,F,G,H):- uatom(A,0), tcl_command([F,' create rectangle ',B,' ',C,' ',D,' ',E],G,H). circle(A,B,C,D,E,F,G,H):- uatom(A,1), unifyNow(C,I), unifyNow(D,J), unifyNow(E,K), !, L is I-K, M is L, N is J-K, O is N, P is I+K, Q is P, R is J+K, S is R, tcl_command([F,' create oval ','$t'(M,T),' ','$t'(O,U),' ','$t'(Q,V),' ','$t'(S,W),' -tag ',B,' -stipple gray50 -fill black'],G,H). circle(A,B,C,D,E,F,G,H):- uatom(A,0), unifyNow(C,I), unifyNow(D,J), unifyNow(E,K), !, L is I-K, M is L, N is J-K, O is N, P is I+K, Q is P, R is J+K, S is R, tcl_command([F,' create oval ','$t'(M,T),' ','$t'(O,U),' ','$t'(Q,V),' ','$t'(S,W),' -tag ',B,' -stipple gray50 -fill black'],G,H). move(A,B,C,D,E,E):- unifyNow(A,F), unifyNow(B,G), unifyNow(C,H), unifyNow(D,I), call(tcl_command([F,' move ',G,' ',H,' ',I])). moveto(A,B,C,D,E,F):- unifyNow(C,G), unifyNow(D,H), size('$t'(I,J),K,'$t'(L,M),N,E,O), P is G-L, Q is P, R is I-(H-L), S is R, T is G+L, U is T, V is I-(H+L), W is V, tcl_command([A,' coords ',B,' ','$t'(Q,X),' ','$t'(S,Y),' ','$t'(U,Z),' ','$t'(W,A1)],O,F). tk(A,B,B):- unifyNow(A,C), call(tk_new(C,D)), r_set_value(int,D). tcl_command(A,B,B):- unifyNow(A,C), r_read_value(int,D), call(tcl_eval(D,C,E)). :-static([green,move,quit,red,start,stop]). print_state(A,A):- r_read_value(green,B), r_read_value(move,C), r_read_value(quit,D), r_read_value(red,E), r_read_value(start,F), r_read_value(stop,G), write((green=B,move=C,quit=D,red=E,start=F,stop=G)). true(A,A):- r_empty(A). true(['$t'(A,B,C,'$c'(D,E,notEmpty))|F],['$t'(A,B,C,'$c'(D,E,notEmpty))|F]). s1(A,A):- r_read_value(stop,1), r_read_value(start,1), r_read_value(quit,1), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1), r_empty(A). s1(A,A):- r_read_value(stop,1), r_read_value(start,1), r_read_value(quit,1), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0), r_empty(A). s1(A,A):- r_read_value(stop,1), r_read_value(start,0), r_read_value(quit,1), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1), r_empty(A). s1(A,A):- r_read_value(stop,1), r_read_value(start,0), r_read_value(quit,1), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0), r_empty(A). s1(A,A):- r_read_value(stop,0), r_read_value(start,1), r_read_value(quit,1), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1), r_empty(A). s1(A,A):- r_read_value(stop,0), r_read_value(start,1), r_read_value(quit,1), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0), r_empty(A). s1(A,A):- r_read_value(stop,0), r_read_value(start,0), r_read_value(quit,1), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1), r_empty(A). s1(A,A):- r_read_value(stop,0), r_read_value(start,0), r_read_value(quit,1), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0), r_empty(A). s1(['$t'((s2(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_read_value(stop,1), r_read_value(start,0), r_read_value(quit,0), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1). s1(['$t'((s3(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_read_value(stop,0), r_read_value(start,1), r_read_value(quit,0), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0). s1(['$t'((s4(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_read_value(stop,0), r_read_value(start,0), r_read_value(quit,0), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1). s1(['$t'((s4(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_read_value(stop,0), r_read_value(start,0), r_read_value(quit,0), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0). s2(A,A):- r_read_value(stop,1), r_read_value(quit,1), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1), r_empty(A). s2(A,A):- r_read_value(stop,1), r_read_value(quit,1), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0), r_empty(A). s2(A,A):- r_read_value(stop,0), r_read_value(start,1), r_read_value(quit,1), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1), r_empty(A). s2(A,A):- r_read_value(stop,0), r_read_value(start,1), r_read_value(quit,1), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0), r_empty(A). s2(A,A):- r_read_value(stop,0), r_read_value(start,0), r_read_value(quit,1), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1), r_empty(A). s2(A,A):- r_read_value(stop,0), r_read_value(start,0), r_read_value(quit,1), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0), r_empty(A). s2(['$t'((s2(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_read_value(stop,1), r_read_value(start,0), r_read_value(quit,0), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1). s2(['$t'((s3(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_read_value(stop,0), r_read_value(start,1), r_read_value(quit,0), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0). s2(['$t'((s2(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_read_value(stop,0), r_read_value(start,0), r_read_value(quit,0), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1). s3(A,A):- r_read_value(stop,1), r_read_value(quit,1), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1), r_empty(A). s3(A,A):- r_read_value(stop,1), r_read_value(quit,1), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0), r_empty(A). s3(A,A):- r_read_value(stop,0), r_read_value(start,1), r_read_value(quit,1), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1), r_empty(A). s3(A,A):- r_read_value(stop,0), r_read_value(start,1), r_read_value(quit,1), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0), r_empty(A). s3(A,A):- r_read_value(stop,0), r_read_value(start,0), r_read_value(quit,1), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1), r_empty(A). s3(A,A):- r_read_value(stop,0), r_read_value(start,0), r_read_value(quit,1), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0), r_empty(A). s3(['$t'((s2(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_read_value(stop,1), r_read_value(start,0), r_read_value(quit,0), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1). s3(['$t'((s3(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_read_value(stop,0), r_read_value(start,1), r_read_value(quit,0), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0). s3(['$t'((s3(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_read_value(stop,0), r_read_value(start,0), r_read_value(quit,0), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0). s4(A,A):- r_read_value(stop,1), r_read_value(quit,1), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1), r_empty(A). s4(A,A):- r_read_value(stop,1), r_read_value(quit,1), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0), r_empty(A). s4(A,A):- r_read_value(stop,0), r_read_value(start,1), r_read_value(quit,1), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1), r_empty(A). s4(A,A):- r_read_value(stop,0), r_read_value(start,1), r_read_value(quit,1), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0), r_empty(A). s4(A,A):- r_read_value(stop,0), r_read_value(start,0), r_read_value(quit,1), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1), r_empty(A). s4(A,A):- r_read_value(stop,0), r_read_value(start,0), r_read_value(quit,1), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0), r_empty(A). s4(['$t'((s2(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_read_value(stop,1), r_read_value(start,0), r_read_value(quit,0), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1). s4(['$t'((s3(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_read_value(stop,0), r_read_value(start,1), r_read_value(quit,0), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0). s4(['$t'((s4(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_read_value(stop,0), r_read_value(start,0), r_read_value(quit,0), r_set_value(green,0), r_set_value(move,0), r_set_value(red,1). s4(['$t'((s4(A,B),C),D,E,'$c'(F,G,notEmpty))|A],['$t'(C,D,E,'$c'(F,G,notEmpty))|B]):- r_read_value(stop,0), r_read_value(start,0), r_read_value(quit,0), r_set_value(green,1), r_set_value(move,1), r_set_value(red,0).