/export/starexec/sandbox/solver/bin/starexec_run_standard /export/starexec/sandbox/benchmark/theBenchmark.pl /export/starexec/sandbox/output/output_files -------------------------------------------------------------------------------- Graph construction failed Graph construction failed Graph construction failed MAYBE proof of /export/starexec/sandbox/benchmark/theBenchmark.pl # AProVE Commit ID: 48fb2092695e11cc9f56e44b17a92a5f88ffb256 marcel 20180622 unpublished dirty Left Termination of the query pattern peephole_opt(g,a) w.r.t. the given Prolog program could not be shown: (0) Prolog (1) NotTransformerProof [EQUIVALENT, 0 ms] (2) Prolog (3) CallTransformerProof [EQUIVALENT, 0 ms] (4) Prolog (5) CutEliminatorProof [SOUND, 0 ms] (6) Prolog (7) IfThenElseTransformerProof [EQUIVALENT, 0 ms] (8) Prolog (9) CallTransformerProof [EQUIVALENT, 0 ms] (10) Prolog (11) CutEliminatorProof [SOUND, 0 ms] (12) Prolog (13) FailTransformerProof [EQUIVALENT, 0 ms] (14) Prolog (15) UnifyTransformerProof [EQUIVALENT, 0 ms] (16) Prolog (17) OrTransformerProof [EQUIVALENT, 0 ms] (18) Prolog (19) UndefinedPredicateHandlerProof [SOUND, 0 ms] (20) Prolog (21) IntegerArithmeticTransformerProof [SOUND, 0 ms] (22) Prolog (23) NotTransformerProof [EQUIVALENT, 0 ms] (24) Prolog (25) CallTransformerProof [EQUIVALENT, 0 ms] (26) Prolog (27) CutEliminatorProof [SOUND, 0 ms] (28) Prolog (29) IfThenElseTransformerProof [EQUIVALENT, 0 ms] (30) Prolog (31) CallTransformerProof [EQUIVALENT, 0 ms] (32) Prolog (33) CutEliminatorProof [SOUND, 0 ms] (34) Prolog (35) FailTransformerProof [EQUIVALENT, 0 ms] (36) Prolog (37) UnifyTransformerProof [EQUIVALENT, 0 ms] (38) Prolog (39) OrTransformerProof [EQUIVALENT, 0 ms] (40) Prolog (41) UndefinedPredicateHandlerProof [SOUND, 0 ms] (42) Prolog ---------------------------------------- (0) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', 2), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', 2), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(!, ','(;(','(>=(N, 0), member1(','(P, N), Seen)), <(N, 0)), popt4(Rest, Seen, ORest))). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(!, ','(;(','(>=(N, 0), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(=:=(SFlag, 1), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(=\=(SFlag, 1), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(<(N, 0), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest))). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, 0))), ','(nonvar(L), ','(=(L, .(P1, L1)), ;(->(=(P, P1), =(Flag, 1)), popt_chkmember(P, L1, Flag))))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- ','(peep_term(Inst, R), !). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- \+(P). Query: peephole_opt(g,a) ---------------------------------------- (1) NotTransformerProof (EQUIVALENT) Transformed all not-constructs [PROLOG]. ---------------------------------------- (2) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', 2), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', 2), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(!, ','(;(','(>=(N, 0), member1(','(P, N), Seen)), <(N, 0)), popt4(Rest, Seen, ORest))). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(!, ','(;(','(>=(N, 0), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(=:=(SFlag, 1), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(=\=(SFlag, 1), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(<(N, 0), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest))). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, 0))), ','(nonvar(L), ','(=(L, .(P1, L1)), ;(->(=(P, P1), =(Flag, 1)), popt_chkmember(P, L1, Flag))))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- ','(peep_term(Inst, R), !). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). not1(P) :- ','(call(P), ','(!, fail)). not1(P). Query: peephole_opt(g,a) ---------------------------------------- (3) CallTransformerProof (EQUIVALENT) Transformed all call-constructs [PROLOG]. ---------------------------------------- (4) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', 2), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', 2), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(!, ','(;(','(>=(N, 0), member1(','(P, N), Seen)), <(N, 0)), popt4(Rest, Seen, ORest))). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(!, ','(;(','(>=(N, 0), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(=:=(SFlag, 1), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(=\=(SFlag, 1), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(<(N, 0), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest))). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, 0))), ','(nonvar(L), ','(=(L, .(P1, L1)), ;(->(=(P, P1), =(Flag, 1)), popt_chkmember(P, L1, Flag))))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- ','(peep_term(Inst, R), !). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). not1(P) :- ','(call1(P), ','(!, fail)). not1(P). call1(P) :- P. Query: peephole_opt(g,a) ---------------------------------------- (5) CutEliminatorProof (SOUND) Eliminated all cuts by simply ignoring them[PROLOG]. ---------------------------------------- (6) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', 2), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', 2), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(;(','(>=(N, 0), member1(','(P, N), Seen)), <(N, 0)), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(;(','(>=(N, 0), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(=:=(SFlag, 1), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(=\=(SFlag, 1), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(<(N, 0), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, 0))), ','(nonvar(L), ','(=(L, .(P1, L1)), ;(->(=(P, P1), =(Flag, 1)), popt_chkmember(P, L1, Flag))))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). not1(P) :- ','(call1(P), fail). not1(P). call1(P) :- P. Query: peephole_opt(g,a) ---------------------------------------- (7) IfThenElseTransformerProof (EQUIVALENT) Transformed all if-then-else-constructs [PROLOG]. ---------------------------------------- (8) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', 2), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', 2), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(;(','(>=(N, 0), member1(','(P, N), Seen)), <(N, 0)), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(;(','(>=(N, 0), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(=:=(SFlag, 1), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(=\=(SFlag, 1), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(<(N, 0), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, 0))), ','(nonvar(L), ','(=(L, .(P1, L1)), if(P, P1, Flag, L1)))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). not1(P) :- ','(call1(P), fail). not1(P). call1(P) :- P. if(P, P1, Flag, L1) :- ','(call(=(P, P1)), ','(!, =(Flag, 1))). if(P, P1, Flag, L1) :- popt_chkmember(P, L1, Flag). Query: peephole_opt(g,a) ---------------------------------------- (9) CallTransformerProof (EQUIVALENT) Transformed all call-constructs [PROLOG]. ---------------------------------------- (10) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', 2), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', 2), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(;(','(>=(N, 0), member1(','(P, N), Seen)), <(N, 0)), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(;(','(>=(N, 0), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(=:=(SFlag, 1), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(=\=(SFlag, 1), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(<(N, 0), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, 0))), ','(nonvar(L), ','(=(L, .(P1, L1)), if(P, P1, Flag, L1)))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). not1(P) :- ','(call1(P), fail). not1(P). call1(P) :- P. if(P, P1, Flag, L1) :- ','(call2(P, P1), ','(!, =(Flag, 1))). if(P, P1, Flag, L1) :- popt_chkmember(P, L1, Flag). call2(P, P1) :- =(P, P1). Query: peephole_opt(g,a) ---------------------------------------- (11) CutEliminatorProof (SOUND) Eliminated all cuts by simply ignoring them[PROLOG]. ---------------------------------------- (12) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', 2), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', 2), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(;(','(>=(N, 0), member1(','(P, N), Seen)), <(N, 0)), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(;(','(>=(N, 0), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(=:=(SFlag, 1), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(=\=(SFlag, 1), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(<(N, 0), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, 0))), ','(nonvar(L), ','(=(L, .(P1, L1)), if(P, P1, Flag, L1)))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). not1(P) :- ','(call1(P), fail). not1(P). call1(P) :- P. if(P, P1, Flag, L1) :- ','(call2(P, P1), =(Flag, 1)). if(P, P1, Flag, L1) :- popt_chkmember(P, L1, Flag). call2(P, P1) :- =(P, P1). Query: peephole_opt(g,a) ---------------------------------------- (13) FailTransformerProof (EQUIVALENT) Added clauses for the built-in fail predicate [PROLOG]. ---------------------------------------- (14) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', 2), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', 2), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(;(','(>=(N, 0), member1(','(P, N), Seen)), <(N, 0)), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(;(','(>=(N, 0), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(=:=(SFlag, 1), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(=\=(SFlag, 1), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(<(N, 0), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, 0))), ','(nonvar(L), ','(=(L, .(P1, L1)), if(P, P1, Flag, L1)))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). not1(P) :- ','(call1(P), fail). not1(P). call1(P) :- P. if(P, P1, Flag, L1) :- ','(call2(P, P1), =(Flag, 1)). if(P, P1, Flag, L1) :- popt_chkmember(P, L1, Flag). call2(P, P1) :- =(P, P1). fail :- failure(a). failure(b). Query: peephole_opt(g,a) ---------------------------------------- (15) UnifyTransformerProof (EQUIVALENT) Added a fact for the built-in = predicate [PROLOG]. ---------------------------------------- (16) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', 2), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', 2), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(;(','(>=(N, 0), member1(','(P, N), Seen)), <(N, 0)), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(;(','(>=(N, 0), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(=:=(SFlag, 1), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(=\=(SFlag, 1), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(<(N, 0), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, 0))), ','(nonvar(L), ','(=(L, .(P1, L1)), if(P, P1, Flag, L1)))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). not1(P) :- ','(call1(P), fail). not1(P). call1(P) :- P. if(P, P1, Flag, L1) :- ','(call2(P, P1), =(Flag, 1)). if(P, P1, Flag, L1) :- popt_chkmember(P, L1, Flag). call2(P, P1) :- =(P, P1). fail :- failure(a). failure(b). =(X, X). Query: peephole_opt(g,a) ---------------------------------------- (17) OrTransformerProof (EQUIVALENT) Transformed all or-constructs[PROLOG]. ---------------------------------------- (18) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', 2), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', 2), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(','(>=(N, 0), member1(','(P, N), Seen)), popt4(Rest, Seen, ORest)). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(<(N, 0), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(>=(N, 0), ','(popt_chkmember(','(P, N), Seen, SFlag), ','(=:=(SFlag, 1), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(>=(N, 0), ','(popt_chkmember(','(P, N), Seen, SFlag), ','(=\=(SFlag, 1), =(OList, .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(<(N, 0), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ','(var(L), ','(=(L, .(P, _N)), =(Flag, 0))). popt_chkmember(P, L, Flag) :- ','(nonvar(L), ','(=(L, .(P1, L1)), if(P, P1, Flag, L1))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). not1(P) :- ','(call1(P), fail). not1(P). call1(P) :- P. if(P, P1, Flag, L1) :- ','(call2(P, P1), =(Flag, 1)). if(P, P1, Flag, L1) :- popt_chkmember(P, L1, Flag). call2(P, P1) :- =(P, P1). fail :- failure(a). failure(b). =(X, X). Query: peephole_opt(g,a) ---------------------------------------- (19) UndefinedPredicateHandlerProof (SOUND) Added facts for all undefined predicates [PROLOG]. ---------------------------------------- (20) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', 2))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', 2), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', 2), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(','(>=(N, 0), member1(','(P, N), Seen)), popt4(Rest, Seen, ORest)). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(<(N, 0), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(>=(N, 0), ','(popt_chkmember(','(P, N), Seen, SFlag), ','(=:=(SFlag, 1), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(>=(N, 0), ','(popt_chkmember(','(P, N), Seen, SFlag), ','(=\=(SFlag, 1), =(OList, .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(<(N, 0), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ','(var(L), ','(=(L, .(P, _N)), =(Flag, 0))). popt_chkmember(P, L, Flag) :- ','(nonvar(L), ','(=(L, .(P1, L1)), if(P, P1, Flag, L1))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). not1(P) :- ','(call1(P), fail). not1(P). call1(P) :- P. if(P, P1, Flag, L1) :- ','(call2(P, P1), =(Flag, 1)). if(P, P1, Flag, L1) :- popt_chkmember(P, L1, Flag). call2(P, P1) :- =(P, P1). fail :- failure(a). failure(b). =(X, X). >=(X0, X1). <(X0, X1). =:=(X0, X1). =\=(X0, X1). var(X0). nonvar(X0). Query: peephole_opt(g,a) ---------------------------------------- (21) IntegerArithmeticTransformerProof (SOUND) Added definitions of predefined predicates [PROLOG]. ---------------------------------------- (22) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', succ(succ(zero))), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', succ(succ(zero))), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(!, ','(;(','(','(','(=(X, N), =(X1, zero)), ;(isGreater(X, X1), =(X, X1))), member1(','(P, N), Seen)), ','(','(=(X2, N), =(X3, zero)), isLess(X2, X3))), popt4(Rest, Seen, ORest))). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(!, ','(;(','(','(','(=(X4, N), =(X5, zero)), ;(isGreater(X4, X5), =(X4, X5))), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(','(','(=(X, SFlag), =(X1, succ(zero))), =(X, X1)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(','(','(=(X2, SFlag), =(X3, succ(zero))), nounify(X2, X3)), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(','(','(=(X6, N), =(X7, zero)), isLess(X6, X7)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest))). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, zero))), ','(nonvar(L), ','(=(L, .(P1, L1)), ;(->(=(P, P1), =(Flag, succ(zero))), popt_chkmember(P, L1, Flag))))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- ','(peep_term(Inst, R), !). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- \+(P). nounify(X, Y) :- \+(=(X, Y)). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). Query: peephole_opt(g,a) ---------------------------------------- (23) NotTransformerProof (EQUIVALENT) Transformed all not-constructs [PROLOG]. ---------------------------------------- (24) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', succ(succ(zero))), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', succ(succ(zero))), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(!, ','(;(','(','(','(=(X, N), =(X1, zero)), ;(isGreater(X, X1), =(X, X1))), member1(','(P, N), Seen)), ','(','(=(X2, N), =(X3, zero)), isLess(X2, X3))), popt4(Rest, Seen, ORest))). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(!, ','(;(','(','(','(=(X4, N), =(X5, zero)), ;(isGreater(X4, X5), =(X4, X5))), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(','(','(=(X, SFlag), =(X1, succ(zero))), =(X, X1)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(','(','(=(X2, SFlag), =(X3, succ(zero))), nounify(X2, X3)), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(','(','(=(X6, N), =(X7, zero)), isLess(X6, X7)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest))). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, zero))), ','(nonvar(L), ','(=(L, .(P1, L1)), ;(->(=(P, P1), =(Flag, succ(zero))), popt_chkmember(P, L1, Flag))))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- ','(peep_term(Inst, R), !). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). nounify(X, Y) :- not2(X, Y). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not1(P) :- ','(call(P), ','(!, fail)). not1(P). not2(X, Y) :- ','(call(=(X, Y)), ','(!, fail)). not2(X, Y). Query: peephole_opt(g,a) ---------------------------------------- (25) CallTransformerProof (EQUIVALENT) Transformed all call-constructs [PROLOG]. ---------------------------------------- (26) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', succ(succ(zero))), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', succ(succ(zero))), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(!, ','(;(','(','(','(=(X, N), =(X1, zero)), ;(isGreater(X, X1), =(X, X1))), member1(','(P, N), Seen)), ','(','(=(X2, N), =(X3, zero)), isLess(X2, X3))), popt4(Rest, Seen, ORest))). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(!, ','(;(','(','(','(=(X4, N), =(X5, zero)), ;(isGreater(X4, X5), =(X4, X5))), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(','(','(=(X, SFlag), =(X1, succ(zero))), =(X, X1)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(','(','(=(X2, SFlag), =(X3, succ(zero))), nounify(X2, X3)), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(','(','(=(X6, N), =(X7, zero)), isLess(X6, X7)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest))). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, zero))), ','(nonvar(L), ','(=(L, .(P1, L1)), ;(->(=(P, P1), =(Flag, succ(zero))), popt_chkmember(P, L1, Flag))))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- ','(peep_term(Inst, R), !). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). nounify(X, Y) :- not2(X, Y). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not1(P) :- ','(call1(P), ','(!, fail)). not1(P). not2(X, Y) :- ','(call2(X, Y), ','(!, fail)). not2(X, Y). call1(P) :- P. call2(X, Y) :- =(X, Y). Query: peephole_opt(g,a) ---------------------------------------- (27) CutEliminatorProof (SOUND) Eliminated all cuts by simply ignoring them[PROLOG]. ---------------------------------------- (28) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', succ(succ(zero))), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', succ(succ(zero))), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(;(','(','(','(=(X, N), =(X1, zero)), ;(isGreater(X, X1), =(X, X1))), member1(','(P, N), Seen)), ','(','(=(X2, N), =(X3, zero)), isLess(X2, X3))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(;(','(','(','(=(X4, N), =(X5, zero)), ;(isGreater(X4, X5), =(X4, X5))), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(','(','(=(X, SFlag), =(X1, succ(zero))), =(X, X1)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(','(','(=(X2, SFlag), =(X3, succ(zero))), nounify(X2, X3)), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(','(','(=(X6, N), =(X7, zero)), isLess(X6, X7)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, zero))), ','(nonvar(L), ','(=(L, .(P1, L1)), ;(->(=(P, P1), =(Flag, succ(zero))), popt_chkmember(P, L1, Flag))))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). nounify(X, Y) :- not2(X, Y). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not1(P) :- ','(call1(P), fail). not1(P). not2(X, Y) :- ','(call2(X, Y), fail). not2(X, Y). call1(P) :- P. call2(X, Y) :- =(X, Y). Query: peephole_opt(g,a) ---------------------------------------- (29) IfThenElseTransformerProof (EQUIVALENT) Transformed all if-then-else-constructs [PROLOG]. ---------------------------------------- (30) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', succ(succ(zero))), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', succ(succ(zero))), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(;(','(','(','(=(X, N), =(X1, zero)), ;(isGreater(X, X1), =(X, X1))), member1(','(P, N), Seen)), ','(','(=(X2, N), =(X3, zero)), isLess(X2, X3))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(;(','(','(','(=(X4, N), =(X5, zero)), ;(isGreater(X4, X5), =(X4, X5))), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(','(','(=(X, SFlag), =(X1, succ(zero))), =(X, X1)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(','(','(=(X2, SFlag), =(X3, succ(zero))), nounify(X2, X3)), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(','(','(=(X6, N), =(X7, zero)), isLess(X6, X7)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, zero))), ','(nonvar(L), ','(=(L, .(P1, L1)), if(P, P1, Flag, L1)))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). nounify(X, Y) :- not2(X, Y). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not1(P) :- ','(call1(P), fail). not1(P). not2(X, Y) :- ','(call2(X, Y), fail). not2(X, Y). call1(P) :- P. call2(X, Y) :- =(X, Y). if(P, P1, Flag, L1) :- ','(call(=(P, P1)), ','(!, =(Flag, succ(zero)))). if(P, P1, Flag, L1) :- popt_chkmember(P, L1, Flag). Query: peephole_opt(g,a) ---------------------------------------- (31) CallTransformerProof (EQUIVALENT) Transformed all call-constructs [PROLOG]. ---------------------------------------- (32) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', succ(succ(zero))), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', succ(succ(zero))), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(;(','(','(','(=(X, N), =(X1, zero)), ;(isGreater(X, X1), =(X, X1))), member1(','(P, N), Seen)), ','(','(=(X2, N), =(X3, zero)), isLess(X2, X3))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(;(','(','(','(=(X4, N), =(X5, zero)), ;(isGreater(X4, X5), =(X4, X5))), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(','(','(=(X, SFlag), =(X1, succ(zero))), =(X, X1)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(','(','(=(X2, SFlag), =(X3, succ(zero))), nounify(X2, X3)), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(','(','(=(X6, N), =(X7, zero)), isLess(X6, X7)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, zero))), ','(nonvar(L), ','(=(L, .(P1, L1)), if(P, P1, Flag, L1)))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). nounify(X, Y) :- not2(X, Y). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not1(P) :- ','(call1(P), fail). not1(P). not2(X, Y) :- ','(call2(X, Y), fail). not2(X, Y). call1(P) :- P. call2(X, Y) :- =(X, Y). if(P, P1, Flag, L1) :- ','(call3(P, P1), ','(!, =(Flag, succ(zero)))). if(P, P1, Flag, L1) :- popt_chkmember(P, L1, Flag). call3(P, P1) :- =(P, P1). Query: peephole_opt(g,a) ---------------------------------------- (33) CutEliminatorProof (SOUND) Eliminated all cuts by simply ignoring them[PROLOG]. ---------------------------------------- (34) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', succ(succ(zero))), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', succ(succ(zero))), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(;(','(','(','(=(X, N), =(X1, zero)), ;(isGreater(X, X1), =(X, X1))), member1(','(P, N), Seen)), ','(','(=(X2, N), =(X3, zero)), isLess(X2, X3))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(;(','(','(','(=(X4, N), =(X5, zero)), ;(isGreater(X4, X5), =(X4, X5))), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(','(','(=(X, SFlag), =(X1, succ(zero))), =(X, X1)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(','(','(=(X2, SFlag), =(X3, succ(zero))), nounify(X2, X3)), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(','(','(=(X6, N), =(X7, zero)), isLess(X6, X7)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, zero))), ','(nonvar(L), ','(=(L, .(P1, L1)), if(P, P1, Flag, L1)))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). nounify(X, Y) :- not2(X, Y). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not1(P) :- ','(call1(P), fail). not1(P). not2(X, Y) :- ','(call2(X, Y), fail). not2(X, Y). call1(P) :- P. call2(X, Y) :- =(X, Y). if(P, P1, Flag, L1) :- ','(call3(P, P1), =(Flag, succ(zero))). if(P, P1, Flag, L1) :- popt_chkmember(P, L1, Flag). call3(P, P1) :- =(P, P1). Query: peephole_opt(g,a) ---------------------------------------- (35) FailTransformerProof (EQUIVALENT) Added clauses for the built-in fail predicate [PROLOG]. ---------------------------------------- (36) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', succ(succ(zero))), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', succ(succ(zero))), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(;(','(','(','(=(X, N), =(X1, zero)), ;(isGreater(X, X1), =(X, X1))), member1(','(P, N), Seen)), ','(','(=(X2, N), =(X3, zero)), isLess(X2, X3))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(;(','(','(','(=(X4, N), =(X5, zero)), ;(isGreater(X4, X5), =(X4, X5))), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(','(','(=(X, SFlag), =(X1, succ(zero))), =(X, X1)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(','(','(=(X2, SFlag), =(X3, succ(zero))), nounify(X2, X3)), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(','(','(=(X6, N), =(X7, zero)), isLess(X6, X7)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, zero))), ','(nonvar(L), ','(=(L, .(P1, L1)), if(P, P1, Flag, L1)))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). nounify(X, Y) :- not2(X, Y). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not1(P) :- ','(call1(P), fail). not1(P). not2(X, Y) :- ','(call2(X, Y), fail). not2(X, Y). call1(P) :- P. call2(X, Y) :- =(X, Y). if(P, P1, Flag, L1) :- ','(call3(P, P1), =(Flag, succ(zero))). if(P, P1, Flag, L1) :- popt_chkmember(P, L1, Flag). call3(P, P1) :- =(P, P1). fail :- failure(a). failure(b). Query: peephole_opt(g,a) ---------------------------------------- (37) UnifyTransformerProof (EQUIVALENT) Added a fact for the built-in = predicate [PROLOG]. ---------------------------------------- (38) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(;(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), ','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', succ(succ(zero))), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', succ(succ(zero))), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(;(','(','(','(=(X, N), =(X1, zero)), ;(isGreater(X, X1), =(X, X1))), member1(','(P, N), Seen)), ','(','(=(X2, N), =(X3, zero)), isLess(X2, X3))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(;(','(','(','(=(X4, N), =(X5, zero)), ;(isGreater(X4, X5), =(X4, X5))), ','(popt_chkmember(','(P, N), Seen, SFlag), ;(','(','(','(=(X, SFlag), =(X1, succ(zero))), =(X, X1)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), ','(','(','(=(X2, SFlag), =(X3, succ(zero))), nounify(X2, X3)), =(OList, .(label(','(P, ','(N, K))), ORest)))))), ','(','(','(=(X6, N), =(X7, zero)), isLess(X6, X7)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ;(','(var(L), ','(=(L, .(P, _N)), =(Flag, zero))), ','(nonvar(L), ','(=(L, .(P1, L1)), if(P, P1, Flag, L1)))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). nounify(X, Y) :- not2(X, Y). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not1(P) :- ','(call1(P), fail). not1(P). not2(X, Y) :- ','(call2(X, Y), fail). not2(X, Y). call1(P) :- P. call2(X, Y) :- =(X, Y). if(P, P1, Flag, L1) :- ','(call3(P, P1), =(Flag, succ(zero))). if(P, P1, Flag, L1) :- popt_chkmember(P, L1, Flag). call3(P, P1) :- =(P, P1). fail :- failure(a). failure(b). =(X, X). Query: peephole_opt(g,a) ---------------------------------------- (39) OrTransformerProof (EQUIVALENT) Transformed all or-constructs[PROLOG]. ---------------------------------------- (40) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', succ(succ(zero))), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', succ(succ(zero))), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(','(','(','(=(X, N), =(X1, zero)), isGreater(X, X1)), member1(','(P, N), Seen)), popt4(Rest, Seen, ORest)). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(','(','(','(=(X, N), =(X1, zero)), =(X, X1)), member1(','(P, N), Seen)), popt4(Rest, Seen, ORest)). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(','(','(=(X2, N), =(X3, zero)), isLess(X2, X3)), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(','(','(=(X4, N), =(X5, zero)), isGreater(X4, X5)), ','(popt_chkmember(','(P, N), Seen, SFlag), ','(','(','(=(X, SFlag), =(X1, succ(zero))), =(X, X1)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(','(','(=(X4, N), =(X5, zero)), isGreater(X4, X5)), ','(popt_chkmember(','(P, N), Seen, SFlag), ','(','(','(=(X2, SFlag), =(X3, succ(zero))), nounify(X2, X3)), =(OList, .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(','(','(=(X4, N), =(X5, zero)), =(X4, X5)), ','(popt_chkmember(','(P, N), Seen, SFlag), ','(','(','(=(X, SFlag), =(X1, succ(zero))), =(X, X1)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(','(','(=(X4, N), =(X5, zero)), =(X4, X5)), ','(popt_chkmember(','(P, N), Seen, SFlag), ','(','(','(=(X2, SFlag), =(X3, succ(zero))), nounify(X2, X3)), =(OList, .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(','(','(=(X6, N), =(X7, zero)), isLess(X6, X7)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ','(var(L), ','(=(L, .(P, _N)), =(Flag, zero))). popt_chkmember(P, L, Flag) :- ','(nonvar(L), ','(=(L, .(P1, L1)), if(P, P1, Flag, L1))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). nounify(X, Y) :- not2(X, Y). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not1(P) :- ','(call1(P), fail). not1(P). not2(X, Y) :- ','(call2(X, Y), fail). not2(X, Y). call1(P) :- P. call2(X, Y) :- =(X, Y). if(P, P1, Flag, L1) :- ','(call3(P, P1), =(Flag, succ(zero))). if(P, P1, Flag, L1) :- popt_chkmember(P, L1, Flag). call3(P, P1) :- =(P, P1). fail :- failure(a). failure(b). =(X, X). Query: peephole_opt(g,a) ---------------------------------------- (41) UndefinedPredicateHandlerProof (SOUND) Added facts for all undefined predicates [PROLOG]. ---------------------------------------- (42) Obligation: Clauses: peephole_opt(Pil, OptPil) :- ','(popt1(Pil, Pil1), ','(popt2(Pil1, Pil2), ','(popt3(Pil2, Pil3), popt4(Pil3, _N, OptPil)))). popt1([], []). popt1(.(Inst, Rest), Pil1) :- popt11(Inst, Rest, Pil1). popt1(.(Inst, Rest), Pil1) :- ','(not(popt11(Inst, Rest, Pil)), ','(=(Pil1, .(Inst, Pil)), popt1(Rest, Pil))). popt11(puttvar(T, R), .(getstr(S, R), PilRest), .(putstr(S, T), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(getstr(S, T), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(getstr(S, R), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(getstr(S, R), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(puttbreg(T), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(puttbreg(R), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(puttbreg(R), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(addreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(addreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(addreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(subreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(subreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(subreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(mulreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(mulreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(mulreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(','(peep_chk(PilRest, R), =(OptInstList, .(divreg(T, S), OptPilRest))), popt1(PilRest, OptPilRest)). popt11(movreg(T, R), .(divreg(R, S), PilRest), OptInstList) :- ','(','(not(peep_chk(PilRest, R)), =(OptInstList, .(movreg(T, R), .(divreg(R, S), OptPilRest)))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getpval(V, R), PilRest), .(putpvar(V, R), OptPilRest)) :- popt1(PilRest, OptPilRest). popt11(putpval(V, R), .(getstr(Str, R), PilRest), .(getstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1(PilRest, OptPilRest)). popt11(putpvar(V, R), .(getstr(Str, R), PilRest), .(putstrv(Str, V), OptPilRest)) :- ','(not(=(Str, ','('.', succ(succ(zero))))), popt1a(PilRest, OptPilRest)). popt11(gettval(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(movreg(R, R), PRest, OptPRest) :- popt1(PRest, OptPRest). popt11(jump(L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt11(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1(PRest, OptPRest). popt1a([], []). popt1a(.(Inst, PilRest), Pil1) :- popt1a1(Inst, PilRest, Pil1). popt1a(.(Inst, PilRest), Pil1) :- ','(not(popt1a1(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt1a(PilRest, Pil1Rest))). popt1a1(unipvar(X), PilRest, .(bldpvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unipval(X), PilRest, .(bldpval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitvar(X), PilRest, .(bldtvar(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unitval(X), PilRest, .(bldtval(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unicon(X), PilRest, .(bldcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(uninumcon(X), PilRest, .(bldnumcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(unifloatcon(X), PilRest, .(bldfloatcon(X), OptPilRest)) :- popt1a(PilRest, OptPilRest). popt1a1(gettval(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(movreg(R, R), PRest, OptPRest) :- popt1a(PRest, OptPRest). popt1a1(jump(L), .(label(L), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jump(Addr), .(jump(_N), PRest), .(jump(Addr), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpnz(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumplt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumple(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpgt(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt1a1(jumpge(_N, L), .(label(L), PRest), .(label(L), OptPRest)) :- popt1a(PRest, OptPRest). popt2([], []). popt2(.(Inst, PilRest), Pil1) :- popt21(Inst, PilRest, Pil1). popt2(.(Inst, PilRest), Pil1) :- ','(not(popt21(Inst, PilRest, Pil1)), ','(=(Pil1, .(Inst, Pil1Rest)), popt2(PilRest, Pil1Rest))). popt21(getstr(','('.', succ(succ(zero))), R), PilRest, .(getlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putstr(','('.', succ(succ(zero))), R), PilRest, .(putlist(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(getcon('[]', R), PilRest, .(getnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(putcon('[]', R), PilRest, .(putnil(R), OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(unicon('[]'), PilRest, .(uninil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt21(bldcon('[]'), PilRest, .(bldnil, OptPilRest)) :- popt2(PilRest, OptPilRest). popt3([], []). popt3(.(Inst, Rest), Pil) :- popt31(Inst, Rest, Pil). popt3(.(Inst, Rest), Pil) :- ','(not(popt31(Inst, Rest, Pil)), ','(=(Pil, .(Inst, Pil1)), popt3(Pil, Pil1))). popt31(getlist(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getlist_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt31(getcomma(R0), .(unitvar(R1), .(unitvar(R2), Rest)), .(getcomma_tvar_tvar(R0, R1, R2), OptRest)) :- popt3(Rest, OptRest). popt4([], X1, []). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(','(','(','(=(X, N), =(X1, zero)), isGreater(X, X1)), member1(','(P, N), Seen)), popt4(Rest, Seen, ORest)). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(','(','(','(=(X, N), =(X1, zero)), =(X, X1)), member1(','(P, N), Seen)), popt4(Rest, Seen, ORest)). popt4(.(label(','(P, ','(N, K))), Rest), Seen, .(label(','(P, ','(N, K))), ORest)) :- ','(','(','(=(X2, N), =(X3, zero)), isLess(X2, X3)), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(','(','(=(X4, N), =(X5, zero)), isGreater(X4, X5)), ','(popt_chkmember(','(P, N), Seen, SFlag), ','(','(','(=(X, SFlag), =(X1, succ(zero))), =(X, X1)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(','(','(=(X4, N), =(X5, zero)), isGreater(X4, X5)), ','(popt_chkmember(','(P, N), Seen, SFlag), ','(','(','(=(X2, SFlag), =(X3, succ(zero))), nounify(X2, X3)), =(OList, .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(','(','(=(X4, N), =(X5, zero)), =(X4, X5)), ','(popt_chkmember(','(P, N), Seen, SFlag), ','(','(','(=(X, SFlag), =(X1, succ(zero))), =(X, X1)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(','(','(=(X4, N), =(X5, zero)), =(X4, X5)), ','(popt_chkmember(','(P, N), Seen, SFlag), ','(','(','(=(X2, SFlag), =(X3, succ(zero))), nounify(X2, X3)), =(OList, .(label(','(P, ','(N, K))), ORest))))), popt4(Rest, Seen, ORest)). popt4(.(execute(','(P, N)), .(label(','(P, ','(N, K))), Rest)), Seen, OList) :- ','(','(','(','(=(X6, N), =(X7, zero)), isLess(X6, X7)), =(OList, .(execute(','(P, N)), .(label(','(P, ','(N, K))), ORest)))), popt4(Rest, Seen, ORest)). popt4(.(Inst, Rest), Seen, .(Inst, ORest)) :- popt4(Rest, Seen, ORest). popt_chkmember(P, L, Flag) :- ','(var(L), ','(=(L, .(P, _N)), =(Flag, zero))). popt_chkmember(P, L, Flag) :- ','(nonvar(L), ','(=(L, .(P1, L1)), if(P, P1, Flag, L1))). peep_use(getcon(X2, R), R). peep_use(getnumcon(X3, R), R). peep_use(getfloatcon(X4, R), R). peep_use(getpval(X5, R), R). peep_use(gettval(X6, R), R). peep_use(gettval(R, X7), R). peep_use(gettbreg(R), R). peep_use(getpbreg(R), R). peep_use(getstr(X8, R), R). peep_use(getstrv(X9, R), R). peep_use(getlist(R), R). peep_use(getlist_tvar_tvar(R, X10, X11), R). peep_use(getcomma(R), R). peep_use(getcomma_tvar_tvar(R, X12, X13), R). peep_use(unitval(R), R). peep_use(unipval(R), R). peep_use(bldtval(R), R). peep_use(bldpval(R), R). peep_use(and(R, X14), R). peep_use(and(X15, R), R). peep_use(negate(R), R). peep_use(or(R, X16), R). peep_use(or(X17, R), R). peep_use(logshiftl(R, X18), R). peep_use(logshiftl(X19, R), R). peep_use(logshiftr(R, X20), R). peep_use(logshiftr(X21, R), R). peep_use(addreg(R, X22), R). peep_use(addreg(X23, R), R). peep_use(subreg(R, X24), R). peep_use(subreg(X25, R), R). peep_use(mulreg(R, X26), R). peep_use(mulreg(X27, R), R). peep_use(divreg(R, X28), R). peep_use(divreg(X29, R), R). peep_use(movreg(R, X30), R). peep_use(switchonterm(R, X31, X32), R). peep_use(switchoncon(R, X33, X34), R). peep_use(switchonstr(R, X35, X36), R). peep_use(switchonbound(R, X37, X38), R). peep_use(jump(X39), X40). peep_use(jumpeq(X41, X42), X43). peep_use(jumpne(X44, X45), X46). peep_use(jumplt(X47, X48), X49). peep_use(jumple(X50, X51), X52). peep_use(jumpgt(X53, X54), X55). peep_use(jumpge(X56, X57), X58). peep_chk([], X59). peep_chk(.(Inst, Rest), R) :- ','(not(peep_use(Inst, R)), term_or_chk(.(Inst, Rest), R)). term_or_chk(.(Inst, _N), R) :- peep_term(Inst, R). term_or_chk(.(_N, Rest), R) :- peep_chk(Rest, R). peep_term(call(X60, X61), X62). peep_term(calld(X63, X64), X65). peep_term(execute(X66), X67). peep_term(putcon(R), R). peep_term(putnumcon(R), R). peep_term(putfloatcon(R), R). peep_term(puttvar(R, X68), R). peep_term(putpvar(X69, R), R). peep_term(putdval(X70, R), R). peep_term(putuval(X71, R), R). peep_term(puttbreg(R), R). peep_term(putpval(X72, R), R). peep_term(putstr(X73, R), R). peep_term(putstrv(X74, R), R). peep_term(putlist(R), R). peep_term(putnil(R), R). peep_term(movreg(X75, R), R). peep_term(bldtvar(R), R). member1(X, .(X, Xs)). member1(X, .(_N, Xs)) :- member1(X, Xs). not(P) :- not1(P). nounify(X, Y) :- not2(X, Y). isPlus(zero, X, X). isPlus(succ(X), zero, succ(X)). isPlus(succ(X), succ(Y), succ(succ(Z))) :- isPlus(X, Y, Z). isPlus(succ(X), pred(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), zero, pred(X)). isPlus(pred(X), succ(Y), Z) :- isPlus(X, Y, Z). isPlus(pred(X), pred(Y), pred(pred(Z))) :- isPlus(X, Y, Z). isMinus(X, zero, X). isMinus(zero, succ(Y), pred(Z)) :- isMinus(zero, Y, Z). isMinus(zero, pred(Y), succ(Z)) :- isMinus(zero, Y, Z). isMinus(succ(X), succ(Y), Z) :- isMinus(X, Y, Z). isMinus(succ(X), pred(Y), succ(succ(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), succ(Y), pred(pred(Z))) :- isMinus(X, Y, Z). isMinus(pred(X), pred(Y), Z) :- isMinus(X, Y, Z). isTimes(X, zero, zero). isTimes(zero, succ(Y), zero). isTimes(zero, pred(Y), zero). isTimes(succ(X), succ(Y), Z) :- ','(isTimes(succ(X), Y, A), isPlus(A, succ(X), Z)). isTimes(succ(X), pred(Y), Z) :- ','(isTimes(succ(X), Y, A), isMinus(A, succ(X), Z)). isTimes(pred(X), succ(Y), Z) :- ','(isTimes(pred(X), Y, A), isPlus(A, pred(X), Z)). isTimes(pred(X), pred(Y), Z) :- ','(isTimes(pred(X), Y, A), isMinus(A, pred(X), Z)). isDiv(zero, succ(Y), zero). isDiv(zero, pred(Y), zero). isDiv(succ(X), succ(Y), zero) :- isMinus(succ(X), succ(Y), pred(Z)). isDiv(succ(X), succ(Y), succ(Z)) :- ','(isMinus(succ(X), succ(Y), A), isDiv(A, succ(Y), Z)). isDiv(succ(X), pred(Y), Z) :- ','(isMinus(zero, pred(Y), A), ','(isDiv(succ(X), A, B), isMinus(zero, B, Z))). isDiv(pred(X), pred(Y), zero) :- isMinus(pred(X), pred(Y), succ(Z)). isDiv(pred(X), pred(Y), succ(Z)) :- ','(isMinus(pred(X), pred(Y), A), isDiv(A, pred(Y), Z)). isDiv(pred(X), succ(Y), Z) :- ','(isMinus(zero, pred(X), A), ','(isDiv(A, succ(Y), B), isMinus(zero, B, Z))). isModulo(X, Y, Z) :- ','(isDiv(X, Y, A), ','(isTimes(A, Y, B), isMinus(X, B, Z))). isGreater(succ(X), zero). isGreater(succ(X), pred(Y)). isGreater(succ(X), succ(Y)) :- isGreater(X, Y). isGreater(zero, pred(Y)). isGreater(pred(X), pred(Y)) :- isGreater(X, Y). isLess(pred(X), zero). isLess(pred(X), succ(Y)). isLess(pred(X), pred(Y)) :- isLess(X, Y). isLess(zero, succ(Y)). isLess(succ(X), succ(Y)) :- isLess(X, Y). not1(P) :- ','(call1(P), fail). not1(P). not2(X, Y) :- ','(call2(X, Y), fail). not2(X, Y). call1(P) :- P. call2(X, Y) :- =(X, Y). if(P, P1, Flag, L1) :- ','(call3(P, P1), =(Flag, succ(zero))). if(P, P1, Flag, L1) :- popt_chkmember(P, L1, Flag). call3(P, P1) :- =(P, P1). fail :- failure(a). failure(b). =(X, X). var(X0). nonvar(X0). Query: peephole_opt(g,a)