/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 analyze_all(g,a) w.r.t. the given Prolog program could not be shown: (0) Prolog (1) CutEliminatorProof [SOUND, 0 ms] (2) Prolog (3) FailTransformerProof [EQUIVALENT, 0 ms] (4) Prolog (5) UnifyTransformerProof [EQUIVALENT, 0 ms] (6) Prolog (7) OrTransformerProof [EQUIVALENT, 0 ms] (8) Prolog (9) UndefinedPredicateHandlerProof [SOUND, 0 ms] (10) Prolog (11) IntegerArithmeticTransformerProof [SOUND, 0 ms] (12) Prolog (13) CutEliminatorProof [SOUND, 0 ms] (14) Prolog (15) FailTransformerProof [EQUIVALENT, 0 ms] (16) Prolog (17) UnifyTransformerProof [EQUIVALENT, 0 ms] (18) Prolog (19) OrTransformerProof [EQUIVALENT, 0 ms] (20) Prolog (21) UndefinedPredicateHandlerProof [SOUND, 0 ms] (22) Prolog ---------------------------------------- (0) Obligation: Clauses: analyze_all(.(X, Y), .(X1, Y1)) :- ','(analyze(X, X1), analyze_all(Y, Y1)). analyze_all([], []). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ;(','(=(Body, true), ','(!, =(NewSource, Source))), ','(=(I, []), ','(=(G, []), ','(rewrite_3(Source, New_Source, I, G, _Y), ','(un_number_vars(New_Source, NewSource, others), !)))))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), ;(','(=(Result, 0), =(P, B)), rewrite(clause(H, B), clause(H, P), I, G, Info))). rewrite(clause(H, B), clause(H, P), I, G, Info) :- ','(numbervars_2(H, 0, Lhv), ','(collect_info(B, Info, Lhv, _X, _Y), ','(add_annotations(Info, P, I, G), !))). add_annotations([], [], X5, X6). add_annotations(.(I, Is), .(P, Ps), Indep, Gnd) :- ','(!, ','(add_annotations(I, P, Indep, Gnd), add_annotations(Is, Ps, Indep, Gnd))). add_annotations(Info, Phrase, I, G) :- ','(!, ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ;(;(','(var(Code), ','(!, =(Phrase, PCode))), ','(=(Vars, []), ','(!, =(Phrase, Code)))), =(Phrase, ','(PCode, Code)))))). collect_info(;(A, B), ','([], ','(sequential, ;(A, B))), Cin, Cout, _X) :- ','(!, ','(collect_info(A, _Y, Cin, C, _Z), collect_info(B, _N, C, Cout, _M))). collect_info(','(A, B), and(Ia, Ib), Cin, Cout, _X) :- ','(!, ','(collect_info(A, Ia, Cin, C, _Y), collect_info(B, Ib, C, Cout, _Z))). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ','(;(;(','(functor(A, F, Arity), ','(builtin(/(F, Arity)), ','(!, =(CInfo, sequential)))), ','(\==(NewVars, []), ','(!, =(CInfo, suspect)))), true), !)). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(!, ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ;(;(','(=(Xtype, sequential), ','(!, ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(;(;(','(var(Ycode), ','(!, =(Conjuncts, ','(Xcode, CGE)))), ','(=(YVars, []), ','(!, =(Conjuncts, ','(Xcode, Ycode))))), =(Conjuncts, ','(Xcode, ','(CGE, Ycode)))), ','(=(BagofVars, []), =(Type, sequential)))))), ','(=(Ytype, sequential), ','(!, ','(=(Conjuncts, Ycode), ','(=(BagofVars, XVars), =(Type, Xtype)))))), ','(=(Conjuncts, Ycode), ','(append(XVars, YVars, BagofVars), =(Type, Xtype))))))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ;(','(==(T, sequential), ','(!, ','(=(Type, T), ','(=(Vars, []), =(This_term, Term))))), ','(collect_vars(Term, Vs), ','(=(Type, par), =(Vars, .(','(','(T, ','(N, Term)), Vs), []))))). make_CGE_phrase(sequential, Code, X7, Code, X8, X9) :- !. make_CGE_phrase(_X, _Y, VarList, NewCode, I, G) :- ','(get_phrase(VarList, NewCode, I, G), !). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), ;(','(>(L, 1), ','(!, ','(eliminate_suspect_code(VarList, Rem, Vs, I, G), get_CGE_2(Vs, I, G, Code, Rem)))), =(VarList, .(','(','(_X, ','(_Y, Code)), _Z), [])))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(!, ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), ;(','(found(FVars, .(Last_goal, [])), ','(!, ','(=(Last_goal, ','(','(_L, ','(_M, SeqCode)), _N)), =(ParCode, .(This_goal, []))))), =(ParCode, .(This_goal, .(Last_goal, [])))))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ;(','(found(FVars, PCode), ','(!, ','(get_CGE_2(PCode, I, G, Code, SCode), =(ParCode, .(This_goal, []))))), ','(=(ParCode, .(This_goal, PCode)), =(Code, SCode))))). found([], _R) :- fail. found(.(H, T), Next_calls) :- ;(','(find_var(Next_calls, H), !), found(T, Next_calls)). find_var([], _R) :- fail. find_var(.(','(_R, NextCall), Others), V) :- ;(','(member(V, NextCall), !), find_var(Others, V)). get_CGE_2(.(','(','(_X, ','(_Y, Goal)), _Z), []), _W, _M, Goal, Others) :- ','(var(Others), !). get_CGE_2(.(','(','(X10, ','(X11, Goal)), X12), []), X13, X14, ','(Goal, Others), Others) :- !. get_CGE_2(Vs, I, G, Code, Rem) :- ','(get_conds(Vs, Conds, I, G), ','(make_norml_2(Vs, Parallel), babel_2(Conds, Parallel, Rem, Code))). get_conds(VARS, Y, I, G) :- ','(do_intersect(VARS, GS), ','(subtract(GS, G, Gnd), ','(singleton(VARS, VOIDS), ','(reduce_set(VARS, Gnd, VOIDS, I, RSET), ','(produce_tuples(RSET, Indep), get_text(Gnd, Indep, Y)))))). '$simplify_unconditional_cges'(off). babel_2(Conds, Parallel, C, Code) :- ','(;(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), ','(!, =(Pcode, Parallel)))), =..(Pcode, .('=>', .(Conds, .(Parallel, []))))), ;(','(var(C), ','(!, =(Code, Pcode))), =(Code, ','(Pcode, C)))). reduce_set([], _X, _Y, _Z, []). reduce_set(.(','(Info, V), Vs), Gnd, VOIDS, Indep, .(','(Info, Rset), Rs)) :- ','(!, ','(reduce_set(Vs, Gnd, VOIDS, Indep, Rs), ','(subtract(V, Gnd, Rg), ','(subtract(Rg, VOIDS, Rv), subtract(Rv, Indep, Rset))))). produce_tuples([], []). produce_tuples(.(','(_N, V), Vs), Tuples) :- ','(!, ','(produce_tuples(Vs, Ts), ','(pair(Vs, V, Ps), merge(Ps, Ts, Tuples)))). pair([], X15, []). pair(.(','(_N, L), Ls), Vs, Tuples) :- ','(pair(Ls, Vs, Ps), ','(tuple(L, Vs, Ts), merge(Ts, Ps, Tuples))). tuple([], X16, []). tuple(X17, [], []). tuple(List, .(L, Ls), Tuples) :- ','(!, ','(tuple(List, Ls, T1), ','(tuple(List, L, T2), merge(T1, T2, Tuples)))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(!, ','(;(','(@<(E, L), ','(!, =(Pair, .(.(E, .(L, [])), [])))), =(Pair, .(.(L, .(E, [])), []))), merge(Pair, T1, Tuples)))). make_norml(.(','(','(X18, ','(X19, T)), X20), []), T) :- !. make_norml(.(','(','(_X, ','(_Y, T)), _Z), Nxt), ','(T, Nc)) :- make_norml(Nxt, Nc). make_norml_2(.(','(','(X21, ','(X22, T)), X23), []), T) :- !. make_norml_2(.(','(','(_X, ','(_Y, T)), _Z), Nxt), '&'(T, Nc)) :- make_norml_2(Nxt, Nc). do_intersect([], []). do_intersect(.(','(_X, S1), .(','(_Y, S2), [])), IS) :- ','(!, intersect(S1, S2, IS)). do_intersect(.(S1, .(S2, Ss)), IS) :- ','(do_intersect(.(S2, Ss), IS1), ','(do_intersect(.(S1, Ss), IS2), ','(do_intersect(.(S1, .(S2, [])), IS3), ','(merge(IS1, IS2, T1), merge(IS3, T1, IS))))). get_text([], [], true). get_text([], X, indep(X)). get_text(X, [], ground(X)). get_text(X, Y, ','(ground(X), indep(Y))). find_vars(T, Vars, Cin, Cout) :- ','(numbervars_2(T, Cin, Cout), ','(is(NewVars, -(Cout, Cin)), ','(length(Vars, NewVars), ','(numbervars_2(Vars, Cin, _N), !)))). collect_vars(X, .(X, [])) :- ','(var(X), !). collect_vars('$VAR'(X), .('$VAR'(X), [])) :- !. collect_vars('$VAR'(X, Y), .('$VAR'(X, Y), [])) :- !. collect_vars(Term, Vars) :- ','(functor(Term, _N, A), ','(go_inside(A, Term, Vs), sort(Vs, Vars))). collect_vars(X24, []). go_inside(0, X25, []) :- !. go_inside(N, T, Bag) :- ','(is(Nth, -(N, 1)), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ;(;(','(var(ARG), ','(!, =(Bag, .(ARG, C)))), ','(atomic(ARG), ','(!, =(Bag, C)))), ','(collect_vars(ARG, Cs), append(Cs, C, Bag)))))). append([], L, L). append(.(H, T), L, .(H, R)) :- append(T, L, R). member(Element, .(Element, X26)). member(Element, .(_N, Rest)) :- member(Element, Rest). memberchk(Element, .(Element, X27)) :- !. memberchk(Element, .(_N, Rest)) :- memberchk(Element, Rest). subtract([], X28, []). subtract(.(Element, Residue), Set, Difference) :- ','(memberchk(Element, Set), ','(!, subtract(Residue, Set, Difference))). subtract(.(Element, Residue), Set, .(Element, Difference)) :- subtract(Residue, Set, Difference). singleton(.(','(','(X29, ','(X, X30)), X31), []), X). singleton(.(','(','(_A, ','(V, _B)), _C), Vs), X) :- ','(singleton(Vs, Y), merge(V, Y, X)). merge([], D, D) :- !. merge(D, [], D) :- !. merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(@<(A, D), ','(!, merge(As, .(D, Ds), Bs))). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(==(A, D), ','(!, merge(As, Ds, Bs))). merge(As, .(D, Ds), .(D, Bs)) :- merge(As, Ds, Bs). intersect([], X32, []) :- !. intersect(X33, [], []) :- !. intersect(.(A, As), .(D, Ds), Out) :- ','(@<(A, D), ','(!, intersect(As, .(D, Ds), Out))). intersect(.(A, As), .(D, Ds), .(A, Out)) :- ','(==(A, D), ','(!, intersect(As, Ds, Out))). intersect(As, .(_N, Ds), Out) :- intersect(As, Ds, Out). numbervars_2(X, N, N1) :- ','(var(X), ','(is(N1, +(N, 1)), ','(!, =(X, '$VAR'(N, _L))))). numbervars_2(A, N, N) :- ','(atomic(A), !). numbervars_2('$VAR'(X34, X35), N, N). numbervars_2(F, N, N1) :- numbervars_2(0, F, N, N1). numbervars_2(I, F, N, N1) :- ','(is(I1, +(I, 1)), ','(arg(I1, F, X), ','(numbervars_2(X, N, N0), ','(!, numbervars_2(I1, F, N0, N1))))). numbervars_2(X36, X37, N, N). un_number_vars(clause(Head, Body), clause(H, B), X) :- ','(un_number_vars_2(Head, H, X), ','(un_number_vars_2(Body, B, X), !)). un_number_vars(directive(X), directive(X), X38). un_number_vars_2('$VAR'(X39, X), X, others) :- !. un_number_vars_2('$VAR'(X, X40), '$VAR'(X), cge) :- !. un_number_vars_2(X, X, X41) :- ','(atomic(X), !). un_number_vars_2(F, F1, Y) :- ','(functor(F, Func, _N), ','(un_number_vars_2(0, F, List, Y), =..(F1, .(Func, List)))). un_number_vars_2(I, F, .(X1, Tail), Y) :- ','(is(I1, +(I, 1)), ','(arg(I1, F, X), ','(un_number_vars_2(X, X1, Y), ','(!, un_number_vars_2(I1, F, Tail, Y))))). un_number_vars_2(X42, X43, [], X44). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ;(','(=(ResultX, 0), =(Result, 0)), ','(check_if_cge(Y, ResultY), is(Result, *(ResultX, ResultY))))). check_if_cge('=>'(X45, X46), 0). check_if_cge('&'(X47, X48), 0). check_if_cge(X49, 1). builtin(/(fail, 0)). builtin(/(false, 0)). builtin(/(otherwise, 0)). builtin(/(repeat, 0)). builtin(/(true, 0)). builtin(/(version, 0)). builtin(/(version, 1)). builtin(/(!, 0)). builtin(/(abolish, 1)). builtin(/(abolish, 2)). builtin(/(abort, 0)). builtin(/(assert, 1)). builtin(/(assert, 2)). builtin(/(asserta, 1)). builtin(/(asserta, 2)). builtin(/(assertz, 1)). builtin(/(assertz, 2)). builtin(/(bagof, 3)). builtin(/(break, 0)). builtin(/(call, 1)). builtin(/(close, 1)). builtin(/(compile, 1)). builtin(/(consult, 1)). builtin(/(debug, 0)). builtin(/(debugging, 0)). builtin(/(ensure_loaded, 1)). builtin(/(erase, 1)). builtin(/(fileerrors, 0)). builtin(/(flush_output, 1)). builtin(/(foreign, 2)). builtin(/(foreign, 3)). builtin(/(foreign_file, 2)). builtin(/(get, 1)). builtin(/(get, 2)). builtin(/(get0, 1)). builtin(/(get0, 2)). builtin(/(halt, 0)). builtin(/(incore, 1)). builtin(/(load_foreign_files, 2)). builtin(/(module, 1)). builtin(/(nofileerrors, 0)). builtin(/(no_style_check, 1)). builtin(/(open, 3)). builtin(/(open_null_stream, 1)). builtin(/(read, 1)). builtin(/(read, 2)). builtin(/(recorda, 3)). builtin(/(recorded, 3)). builtin(/(recordz, 3)). builtin(/(reinitialise, 0)). builtin(/(restore, 1)). builtin(/(restore, 2)). builtin(/(retract, 1)). builtin(/(retractall, 1)). builtin(/(save, 1)). builtin(/(save, 2)). builtin(/(save_program, 1)). builtin(/(see, 1)). builtin(/(seeing, 1)). builtin(/(seen, 0)). builtin(/(set_input, 1)). builtin(/(set_output, 1)). builtin(/(setof, 3)). builtin(/(skip, 1)). builtin(/(skip, 2)). builtin(/(style_check, 1)). builtin(/(ttyget, 1)). builtin(/(ttyget0, 1)). builtin(/(ttyskip, 1)). builtin(/(unknown, 2)). builtin(/(use_module, 1)). builtin(/(use_module, 2)). builtin(/('^', 2)). builtin(/(\+, 1)). go(N) :- ','(prepare(N, ManyClauses), ','(analyze_all(ManyClauses, Result), conclude(Result))). time(A) :- statistics(runtime, .(_N, .(A, []))). prepare(N, ManyClauses) :- ','(data(Clauses), ','(mlist(N, Clauses, ManyClauses), time(_N))). conclude(Result) :- ','(time(T), ','(write('Executed in '), ','(write(T), ','(write(' mS.'), ','(nl, ','(length(Result, L), ','(write('Length = '), ','(write(L), nl)))))))). mlist(0, _1, []). mlist(X, SList, LList) :- ','(is(Y, -(X, 1)), ','(mlist(Y, SList, MList), ','(copy_term(SList, NewSlist), append(NewSlist, MList, LList)))). data(.(clause(f(X, Z), ','(p(X, Y), q(Y, Z))), .(clause(f(X1, Y1, Z1), ','(p(X1, Y1), q(Y1, Z1))), .(clause(f(X2, Y2, Z2), ','(is(Y2, +(X2, Z2)), ','(p(X2, Y2), ','(r(Y2), q(Y2, Z2))))), .(clause(f(X3, Y3, Z3), ','(var(X3), ','(f(X3), ','(q(Y3), ','(r(X3, Y3, Z3), q(X3)))))), .(clause(f(X4, Y4, Z4), ','(r(X4, Y4), ','(p(X4, Y4), ','(p(W4), ','(s(X4), q(Y4, W4, Z4)))))), [])))))). Query: analyze_all(g,a) ---------------------------------------- (1) CutEliminatorProof (SOUND) Eliminated all cuts by simply ignoring them[PROLOG]. ---------------------------------------- (2) Obligation: Clauses: analyze_all(.(X, Y), .(X1, Y1)) :- ','(analyze(X, X1), analyze_all(Y, Y1)). analyze_all([], []). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ;(','(=(Body, true), =(NewSource, Source)), ','(=(I, []), ','(=(G, []), ','(rewrite_3(Source, New_Source, I, G, _Y), un_number_vars(New_Source, NewSource, others)))))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), ;(','(=(Result, 0), =(P, B)), rewrite(clause(H, B), clause(H, P), I, G, Info))). rewrite(clause(H, B), clause(H, P), I, G, Info) :- ','(numbervars_2(H, 0, Lhv), ','(collect_info(B, Info, Lhv, _X, _Y), add_annotations(Info, P, I, G))). add_annotations([], [], X5, X6). add_annotations(.(I, Is), .(P, Ps), Indep, Gnd) :- ','(add_annotations(I, P, Indep, Gnd), add_annotations(Is, Ps, Indep, Gnd)). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ;(;(','(var(Code), =(Phrase, PCode)), ','(=(Vars, []), =(Phrase, Code))), =(Phrase, ','(PCode, Code))))). collect_info(;(A, B), ','([], ','(sequential, ;(A, B))), Cin, Cout, _X) :- ','(collect_info(A, _Y, Cin, C, _Z), collect_info(B, _N, C, Cout, _M)). collect_info(','(A, B), and(Ia, Ib), Cin, Cout, _X) :- ','(collect_info(A, Ia, Cin, C, _Y), collect_info(B, Ib, C, Cout, _Z)). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ;(;(','(functor(A, F, Arity), ','(builtin(/(F, Arity)), =(CInfo, sequential))), ','(\==(NewVars, []), =(CInfo, suspect))), true)). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ;(;(','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(;(;(','(var(Ycode), =(Conjuncts, ','(Xcode, CGE))), ','(=(YVars, []), =(Conjuncts, ','(Xcode, Ycode)))), =(Conjuncts, ','(Xcode, ','(CGE, Ycode)))), ','(=(BagofVars, []), =(Type, sequential))))), ','(=(Ytype, sequential), ','(=(Conjuncts, Ycode), ','(=(BagofVars, XVars), =(Type, Xtype))))), ','(=(Conjuncts, Ycode), ','(append(XVars, YVars, BagofVars), =(Type, Xtype)))))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ;(','(==(T, sequential), ','(=(Type, T), ','(=(Vars, []), =(This_term, Term)))), ','(collect_vars(Term, Vs), ','(=(Type, par), =(Vars, .(','(','(T, ','(N, Term)), Vs), []))))). make_CGE_phrase(sequential, Code, X7, Code, X8, X9). make_CGE_phrase(_X, _Y, VarList, NewCode, I, G) :- get_phrase(VarList, NewCode, I, G). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), ;(','(>(L, 1), ','(eliminate_suspect_code(VarList, Rem, Vs, I, G), get_CGE_2(Vs, I, G, Code, Rem))), =(VarList, .(','(','(_X, ','(_Y, Code)), _Z), [])))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), ;(','(found(FVars, .(Last_goal, [])), ','(=(Last_goal, ','(','(_L, ','(_M, SeqCode)), _N)), =(ParCode, .(This_goal, [])))), =(ParCode, .(This_goal, .(Last_goal, []))))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ;(','(found(FVars, PCode), ','(get_CGE_2(PCode, I, G, Code, SCode), =(ParCode, .(This_goal, [])))), ','(=(ParCode, .(This_goal, PCode)), =(Code, SCode))))). found([], _R) :- fail. found(.(H, T), Next_calls) :- ;(find_var(Next_calls, H), found(T, Next_calls)). find_var([], _R) :- fail. find_var(.(','(_R, NextCall), Others), V) :- ;(member(V, NextCall), find_var(Others, V)). get_CGE_2(.(','(','(_X, ','(_Y, Goal)), _Z), []), _W, _M, Goal, Others) :- var(Others). get_CGE_2(.(','(','(X10, ','(X11, Goal)), X12), []), X13, X14, ','(Goal, Others), Others). get_CGE_2(Vs, I, G, Code, Rem) :- ','(get_conds(Vs, Conds, I, G), ','(make_norml_2(Vs, Parallel), babel_2(Conds, Parallel, Rem, Code))). get_conds(VARS, Y, I, G) :- ','(do_intersect(VARS, GS), ','(subtract(GS, G, Gnd), ','(singleton(VARS, VOIDS), ','(reduce_set(VARS, Gnd, VOIDS, I, RSET), ','(produce_tuples(RSET, Indep), get_text(Gnd, Indep, Y)))))). '$simplify_unconditional_cges'(off). babel_2(Conds, Parallel, C, Code) :- ','(;(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), =(Pcode, Parallel))), =..(Pcode, .('=>', .(Conds, .(Parallel, []))))), ;(','(var(C), =(Code, Pcode)), =(Code, ','(Pcode, C)))). reduce_set([], _X, _Y, _Z, []). reduce_set(.(','(Info, V), Vs), Gnd, VOIDS, Indep, .(','(Info, Rset), Rs)) :- ','(reduce_set(Vs, Gnd, VOIDS, Indep, Rs), ','(subtract(V, Gnd, Rg), ','(subtract(Rg, VOIDS, Rv), subtract(Rv, Indep, Rset)))). produce_tuples([], []). produce_tuples(.(','(_N, V), Vs), Tuples) :- ','(produce_tuples(Vs, Ts), ','(pair(Vs, V, Ps), merge(Ps, Ts, Tuples))). pair([], X15, []). pair(.(','(_N, L), Ls), Vs, Tuples) :- ','(pair(Ls, Vs, Ps), ','(tuple(L, Vs, Ts), merge(Ts, Ps, Tuples))). tuple([], X16, []). tuple(X17, [], []). tuple(List, .(L, Ls), Tuples) :- ','(tuple(List, Ls, T1), ','(tuple(List, L, T2), merge(T1, T2, Tuples))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(;(','(@<(E, L), =(Pair, .(.(E, .(L, [])), []))), =(Pair, .(.(L, .(E, [])), []))), merge(Pair, T1, Tuples))). make_norml(.(','(','(X18, ','(X19, T)), X20), []), T). make_norml(.(','(','(_X, ','(_Y, T)), _Z), Nxt), ','(T, Nc)) :- make_norml(Nxt, Nc). make_norml_2(.(','(','(X21, ','(X22, T)), X23), []), T). make_norml_2(.(','(','(_X, ','(_Y, T)), _Z), Nxt), '&'(T, Nc)) :- make_norml_2(Nxt, Nc). do_intersect([], []). do_intersect(.(','(_X, S1), .(','(_Y, S2), [])), IS) :- intersect(S1, S2, IS). do_intersect(.(S1, .(S2, Ss)), IS) :- ','(do_intersect(.(S2, Ss), IS1), ','(do_intersect(.(S1, Ss), IS2), ','(do_intersect(.(S1, .(S2, [])), IS3), ','(merge(IS1, IS2, T1), merge(IS3, T1, IS))))). get_text([], [], true). get_text([], X, indep(X)). get_text(X, [], ground(X)). get_text(X, Y, ','(ground(X), indep(Y))). find_vars(T, Vars, Cin, Cout) :- ','(numbervars_2(T, Cin, Cout), ','(is(NewVars, -(Cout, Cin)), ','(length(Vars, NewVars), numbervars_2(Vars, Cin, _N)))). collect_vars(X, .(X, [])) :- var(X). collect_vars('$VAR'(X), .('$VAR'(X), [])). collect_vars('$VAR'(X, Y), .('$VAR'(X, Y), [])). collect_vars(Term, Vars) :- ','(functor(Term, _N, A), ','(go_inside(A, Term, Vs), sort(Vs, Vars))). collect_vars(X24, []). go_inside(0, X25, []). go_inside(N, T, Bag) :- ','(is(Nth, -(N, 1)), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ;(;(','(var(ARG), =(Bag, .(ARG, C))), ','(atomic(ARG), =(Bag, C))), ','(collect_vars(ARG, Cs), append(Cs, C, Bag)))))). append([], L, L). append(.(H, T), L, .(H, R)) :- append(T, L, R). member(Element, .(Element, X26)). member(Element, .(_N, Rest)) :- member(Element, Rest). memberchk(Element, .(Element, X27)). memberchk(Element, .(_N, Rest)) :- memberchk(Element, Rest). subtract([], X28, []). subtract(.(Element, Residue), Set, Difference) :- ','(memberchk(Element, Set), subtract(Residue, Set, Difference)). subtract(.(Element, Residue), Set, .(Element, Difference)) :- subtract(Residue, Set, Difference). singleton(.(','(','(X29, ','(X, X30)), X31), []), X). singleton(.(','(','(_A, ','(V, _B)), _C), Vs), X) :- ','(singleton(Vs, Y), merge(V, Y, X)). merge([], D, D). merge(D, [], D). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(@<(A, D), merge(As, .(D, Ds), Bs)). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(==(A, D), merge(As, Ds, Bs)). merge(As, .(D, Ds), .(D, Bs)) :- merge(As, Ds, Bs). intersect([], X32, []). intersect(X33, [], []). intersect(.(A, As), .(D, Ds), Out) :- ','(@<(A, D), intersect(As, .(D, Ds), Out)). intersect(.(A, As), .(D, Ds), .(A, Out)) :- ','(==(A, D), intersect(As, Ds, Out)). intersect(As, .(_N, Ds), Out) :- intersect(As, Ds, Out). numbervars_2(X, N, N1) :- ','(var(X), ','(is(N1, +(N, 1)), =(X, '$VAR'(N, _L)))). numbervars_2(A, N, N) :- atomic(A). numbervars_2('$VAR'(X34, X35), N, N). numbervars_2(F, N, N1) :- numbervars_2(0, F, N, N1). numbervars_2(I, F, N, N1) :- ','(is(I1, +(I, 1)), ','(arg(I1, F, X), ','(numbervars_2(X, N, N0), numbervars_2(I1, F, N0, N1)))). numbervars_2(X36, X37, N, N). un_number_vars(clause(Head, Body), clause(H, B), X) :- ','(un_number_vars_2(Head, H, X), un_number_vars_2(Body, B, X)). un_number_vars(directive(X), directive(X), X38). un_number_vars_2('$VAR'(X39, X), X, others). un_number_vars_2('$VAR'(X, X40), '$VAR'(X), cge). un_number_vars_2(X, X, X41) :- atomic(X). un_number_vars_2(F, F1, Y) :- ','(functor(F, Func, _N), ','(un_number_vars_2(0, F, List, Y), =..(F1, .(Func, List)))). un_number_vars_2(I, F, .(X1, Tail), Y) :- ','(is(I1, +(I, 1)), ','(arg(I1, F, X), ','(un_number_vars_2(X, X1, Y), un_number_vars_2(I1, F, Tail, Y)))). un_number_vars_2(X42, X43, [], X44). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ;(','(=(ResultX, 0), =(Result, 0)), ','(check_if_cge(Y, ResultY), is(Result, *(ResultX, ResultY))))). check_if_cge('=>'(X45, X46), 0). check_if_cge('&'(X47, X48), 0). check_if_cge(X49, 1). builtin(/(fail, 0)). builtin(/(false, 0)). builtin(/(otherwise, 0)). builtin(/(repeat, 0)). builtin(/(true, 0)). builtin(/(version, 0)). builtin(/(version, 1)). builtin(/(!, 0)). builtin(/(abolish, 1)). builtin(/(abolish, 2)). builtin(/(abort, 0)). builtin(/(assert, 1)). builtin(/(assert, 2)). builtin(/(asserta, 1)). builtin(/(asserta, 2)). builtin(/(assertz, 1)). builtin(/(assertz, 2)). builtin(/(bagof, 3)). builtin(/(break, 0)). builtin(/(call, 1)). builtin(/(close, 1)). builtin(/(compile, 1)). builtin(/(consult, 1)). builtin(/(debug, 0)). builtin(/(debugging, 0)). builtin(/(ensure_loaded, 1)). builtin(/(erase, 1)). builtin(/(fileerrors, 0)). builtin(/(flush_output, 1)). builtin(/(foreign, 2)). builtin(/(foreign, 3)). builtin(/(foreign_file, 2)). builtin(/(get, 1)). builtin(/(get, 2)). builtin(/(get0, 1)). builtin(/(get0, 2)). builtin(/(halt, 0)). builtin(/(incore, 1)). builtin(/(load_foreign_files, 2)). builtin(/(module, 1)). builtin(/(nofileerrors, 0)). builtin(/(no_style_check, 1)). builtin(/(open, 3)). builtin(/(open_null_stream, 1)). builtin(/(read, 1)). builtin(/(read, 2)). builtin(/(recorda, 3)). builtin(/(recorded, 3)). builtin(/(recordz, 3)). builtin(/(reinitialise, 0)). builtin(/(restore, 1)). builtin(/(restore, 2)). builtin(/(retract, 1)). builtin(/(retractall, 1)). builtin(/(save, 1)). builtin(/(save, 2)). builtin(/(save_program, 1)). builtin(/(see, 1)). builtin(/(seeing, 1)). builtin(/(seen, 0)). builtin(/(set_input, 1)). builtin(/(set_output, 1)). builtin(/(setof, 3)). builtin(/(skip, 1)). builtin(/(skip, 2)). builtin(/(style_check, 1)). builtin(/(ttyget, 1)). builtin(/(ttyget0, 1)). builtin(/(ttyskip, 1)). builtin(/(unknown, 2)). builtin(/(use_module, 1)). builtin(/(use_module, 2)). builtin(/('^', 2)). builtin(/(\+, 1)). go(N) :- ','(prepare(N, ManyClauses), ','(analyze_all(ManyClauses, Result), conclude(Result))). time(A) :- statistics(runtime, .(_N, .(A, []))). prepare(N, ManyClauses) :- ','(data(Clauses), ','(mlist(N, Clauses, ManyClauses), time(_N))). conclude(Result) :- ','(time(T), ','(write('Executed in '), ','(write(T), ','(write(' mS.'), ','(nl, ','(length(Result, L), ','(write('Length = '), ','(write(L), nl)))))))). mlist(0, _1, []). mlist(X, SList, LList) :- ','(is(Y, -(X, 1)), ','(mlist(Y, SList, MList), ','(copy_term(SList, NewSlist), append(NewSlist, MList, LList)))). data(.(clause(f(X, Z), ','(p(X, Y), q(Y, Z))), .(clause(f(X1, Y1, Z1), ','(p(X1, Y1), q(Y1, Z1))), .(clause(f(X2, Y2, Z2), ','(is(Y2, +(X2, Z2)), ','(p(X2, Y2), ','(r(Y2), q(Y2, Z2))))), .(clause(f(X3, Y3, Z3), ','(var(X3), ','(f(X3), ','(q(Y3), ','(r(X3, Y3, Z3), q(X3)))))), .(clause(f(X4, Y4, Z4), ','(r(X4, Y4), ','(p(X4, Y4), ','(p(W4), ','(s(X4), q(Y4, W4, Z4)))))), [])))))). Query: analyze_all(g,a) ---------------------------------------- (3) FailTransformerProof (EQUIVALENT) Added clauses for the built-in fail predicate [PROLOG]. ---------------------------------------- (4) Obligation: Clauses: analyze_all(.(X, Y), .(X1, Y1)) :- ','(analyze(X, X1), analyze_all(Y, Y1)). analyze_all([], []). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ;(','(=(Body, true), =(NewSource, Source)), ','(=(I, []), ','(=(G, []), ','(rewrite_3(Source, New_Source, I, G, _Y), un_number_vars(New_Source, NewSource, others)))))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), ;(','(=(Result, 0), =(P, B)), rewrite(clause(H, B), clause(H, P), I, G, Info))). rewrite(clause(H, B), clause(H, P), I, G, Info) :- ','(numbervars_2(H, 0, Lhv), ','(collect_info(B, Info, Lhv, _X, _Y), add_annotations(Info, P, I, G))). add_annotations([], [], X5, X6). add_annotations(.(I, Is), .(P, Ps), Indep, Gnd) :- ','(add_annotations(I, P, Indep, Gnd), add_annotations(Is, Ps, Indep, Gnd)). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ;(;(','(var(Code), =(Phrase, PCode)), ','(=(Vars, []), =(Phrase, Code))), =(Phrase, ','(PCode, Code))))). collect_info(;(A, B), ','([], ','(sequential, ;(A, B))), Cin, Cout, _X) :- ','(collect_info(A, _Y, Cin, C, _Z), collect_info(B, _N, C, Cout, _M)). collect_info(','(A, B), and(Ia, Ib), Cin, Cout, _X) :- ','(collect_info(A, Ia, Cin, C, _Y), collect_info(B, Ib, C, Cout, _Z)). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ;(;(','(functor(A, F, Arity), ','(builtin(/(F, Arity)), =(CInfo, sequential))), ','(\==(NewVars, []), =(CInfo, suspect))), true)). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ;(;(','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(;(;(','(var(Ycode), =(Conjuncts, ','(Xcode, CGE))), ','(=(YVars, []), =(Conjuncts, ','(Xcode, Ycode)))), =(Conjuncts, ','(Xcode, ','(CGE, Ycode)))), ','(=(BagofVars, []), =(Type, sequential))))), ','(=(Ytype, sequential), ','(=(Conjuncts, Ycode), ','(=(BagofVars, XVars), =(Type, Xtype))))), ','(=(Conjuncts, Ycode), ','(append(XVars, YVars, BagofVars), =(Type, Xtype)))))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ;(','(==(T, sequential), ','(=(Type, T), ','(=(Vars, []), =(This_term, Term)))), ','(collect_vars(Term, Vs), ','(=(Type, par), =(Vars, .(','(','(T, ','(N, Term)), Vs), []))))). make_CGE_phrase(sequential, Code, X7, Code, X8, X9). make_CGE_phrase(_X, _Y, VarList, NewCode, I, G) :- get_phrase(VarList, NewCode, I, G). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), ;(','(>(L, 1), ','(eliminate_suspect_code(VarList, Rem, Vs, I, G), get_CGE_2(Vs, I, G, Code, Rem))), =(VarList, .(','(','(_X, ','(_Y, Code)), _Z), [])))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), ;(','(found(FVars, .(Last_goal, [])), ','(=(Last_goal, ','(','(_L, ','(_M, SeqCode)), _N)), =(ParCode, .(This_goal, [])))), =(ParCode, .(This_goal, .(Last_goal, []))))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ;(','(found(FVars, PCode), ','(get_CGE_2(PCode, I, G, Code, SCode), =(ParCode, .(This_goal, [])))), ','(=(ParCode, .(This_goal, PCode)), =(Code, SCode))))). found([], _R) :- fail. found(.(H, T), Next_calls) :- ;(find_var(Next_calls, H), found(T, Next_calls)). find_var([], _R) :- fail. find_var(.(','(_R, NextCall), Others), V) :- ;(member(V, NextCall), find_var(Others, V)). get_CGE_2(.(','(','(_X, ','(_Y, Goal)), _Z), []), _W, _M, Goal, Others) :- var(Others). get_CGE_2(.(','(','(X10, ','(X11, Goal)), X12), []), X13, X14, ','(Goal, Others), Others). get_CGE_2(Vs, I, G, Code, Rem) :- ','(get_conds(Vs, Conds, I, G), ','(make_norml_2(Vs, Parallel), babel_2(Conds, Parallel, Rem, Code))). get_conds(VARS, Y, I, G) :- ','(do_intersect(VARS, GS), ','(subtract(GS, G, Gnd), ','(singleton(VARS, VOIDS), ','(reduce_set(VARS, Gnd, VOIDS, I, RSET), ','(produce_tuples(RSET, Indep), get_text(Gnd, Indep, Y)))))). '$simplify_unconditional_cges'(off). babel_2(Conds, Parallel, C, Code) :- ','(;(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), =(Pcode, Parallel))), =..(Pcode, .('=>', .(Conds, .(Parallel, []))))), ;(','(var(C), =(Code, Pcode)), =(Code, ','(Pcode, C)))). reduce_set([], _X, _Y, _Z, []). reduce_set(.(','(Info, V), Vs), Gnd, VOIDS, Indep, .(','(Info, Rset), Rs)) :- ','(reduce_set(Vs, Gnd, VOIDS, Indep, Rs), ','(subtract(V, Gnd, Rg), ','(subtract(Rg, VOIDS, Rv), subtract(Rv, Indep, Rset)))). produce_tuples([], []). produce_tuples(.(','(_N, V), Vs), Tuples) :- ','(produce_tuples(Vs, Ts), ','(pair(Vs, V, Ps), merge(Ps, Ts, Tuples))). pair([], X15, []). pair(.(','(_N, L), Ls), Vs, Tuples) :- ','(pair(Ls, Vs, Ps), ','(tuple(L, Vs, Ts), merge(Ts, Ps, Tuples))). tuple([], X16, []). tuple(X17, [], []). tuple(List, .(L, Ls), Tuples) :- ','(tuple(List, Ls, T1), ','(tuple(List, L, T2), merge(T1, T2, Tuples))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(;(','(@<(E, L), =(Pair, .(.(E, .(L, [])), []))), =(Pair, .(.(L, .(E, [])), []))), merge(Pair, T1, Tuples))). make_norml(.(','(','(X18, ','(X19, T)), X20), []), T). make_norml(.(','(','(_X, ','(_Y, T)), _Z), Nxt), ','(T, Nc)) :- make_norml(Nxt, Nc). make_norml_2(.(','(','(X21, ','(X22, T)), X23), []), T). make_norml_2(.(','(','(_X, ','(_Y, T)), _Z), Nxt), '&'(T, Nc)) :- make_norml_2(Nxt, Nc). do_intersect([], []). do_intersect(.(','(_X, S1), .(','(_Y, S2), [])), IS) :- intersect(S1, S2, IS). do_intersect(.(S1, .(S2, Ss)), IS) :- ','(do_intersect(.(S2, Ss), IS1), ','(do_intersect(.(S1, Ss), IS2), ','(do_intersect(.(S1, .(S2, [])), IS3), ','(merge(IS1, IS2, T1), merge(IS3, T1, IS))))). get_text([], [], true). get_text([], X, indep(X)). get_text(X, [], ground(X)). get_text(X, Y, ','(ground(X), indep(Y))). find_vars(T, Vars, Cin, Cout) :- ','(numbervars_2(T, Cin, Cout), ','(is(NewVars, -(Cout, Cin)), ','(length(Vars, NewVars), numbervars_2(Vars, Cin, _N)))). collect_vars(X, .(X, [])) :- var(X). collect_vars('$VAR'(X), .('$VAR'(X), [])). collect_vars('$VAR'(X, Y), .('$VAR'(X, Y), [])). collect_vars(Term, Vars) :- ','(functor(Term, _N, A), ','(go_inside(A, Term, Vs), sort(Vs, Vars))). collect_vars(X24, []). go_inside(0, X25, []). go_inside(N, T, Bag) :- ','(is(Nth, -(N, 1)), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ;(;(','(var(ARG), =(Bag, .(ARG, C))), ','(atomic(ARG), =(Bag, C))), ','(collect_vars(ARG, Cs), append(Cs, C, Bag)))))). append([], L, L). append(.(H, T), L, .(H, R)) :- append(T, L, R). member(Element, .(Element, X26)). member(Element, .(_N, Rest)) :- member(Element, Rest). memberchk(Element, .(Element, X27)). memberchk(Element, .(_N, Rest)) :- memberchk(Element, Rest). subtract([], X28, []). subtract(.(Element, Residue), Set, Difference) :- ','(memberchk(Element, Set), subtract(Residue, Set, Difference)). subtract(.(Element, Residue), Set, .(Element, Difference)) :- subtract(Residue, Set, Difference). singleton(.(','(','(X29, ','(X, X30)), X31), []), X). singleton(.(','(','(_A, ','(V, _B)), _C), Vs), X) :- ','(singleton(Vs, Y), merge(V, Y, X)). merge([], D, D). merge(D, [], D). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(@<(A, D), merge(As, .(D, Ds), Bs)). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(==(A, D), merge(As, Ds, Bs)). merge(As, .(D, Ds), .(D, Bs)) :- merge(As, Ds, Bs). intersect([], X32, []). intersect(X33, [], []). intersect(.(A, As), .(D, Ds), Out) :- ','(@<(A, D), intersect(As, .(D, Ds), Out)). intersect(.(A, As), .(D, Ds), .(A, Out)) :- ','(==(A, D), intersect(As, Ds, Out)). intersect(As, .(_N, Ds), Out) :- intersect(As, Ds, Out). numbervars_2(X, N, N1) :- ','(var(X), ','(is(N1, +(N, 1)), =(X, '$VAR'(N, _L)))). numbervars_2(A, N, N) :- atomic(A). numbervars_2('$VAR'(X34, X35), N, N). numbervars_2(F, N, N1) :- numbervars_2(0, F, N, N1). numbervars_2(I, F, N, N1) :- ','(is(I1, +(I, 1)), ','(arg(I1, F, X), ','(numbervars_2(X, N, N0), numbervars_2(I1, F, N0, N1)))). numbervars_2(X36, X37, N, N). un_number_vars(clause(Head, Body), clause(H, B), X) :- ','(un_number_vars_2(Head, H, X), un_number_vars_2(Body, B, X)). un_number_vars(directive(X), directive(X), X38). un_number_vars_2('$VAR'(X39, X), X, others). un_number_vars_2('$VAR'(X, X40), '$VAR'(X), cge). un_number_vars_2(X, X, X41) :- atomic(X). un_number_vars_2(F, F1, Y) :- ','(functor(F, Func, _N), ','(un_number_vars_2(0, F, List, Y), =..(F1, .(Func, List)))). un_number_vars_2(I, F, .(X1, Tail), Y) :- ','(is(I1, +(I, 1)), ','(arg(I1, F, X), ','(un_number_vars_2(X, X1, Y), un_number_vars_2(I1, F, Tail, Y)))). un_number_vars_2(X42, X43, [], X44). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ;(','(=(ResultX, 0), =(Result, 0)), ','(check_if_cge(Y, ResultY), is(Result, *(ResultX, ResultY))))). check_if_cge('=>'(X45, X46), 0). check_if_cge('&'(X47, X48), 0). check_if_cge(X49, 1). builtin(/(fail, 0)). builtin(/(false, 0)). builtin(/(otherwise, 0)). builtin(/(repeat, 0)). builtin(/(true, 0)). builtin(/(version, 0)). builtin(/(version, 1)). builtin(/(!, 0)). builtin(/(abolish, 1)). builtin(/(abolish, 2)). builtin(/(abort, 0)). builtin(/(assert, 1)). builtin(/(assert, 2)). builtin(/(asserta, 1)). builtin(/(asserta, 2)). builtin(/(assertz, 1)). builtin(/(assertz, 2)). builtin(/(bagof, 3)). builtin(/(break, 0)). builtin(/(call, 1)). builtin(/(close, 1)). builtin(/(compile, 1)). builtin(/(consult, 1)). builtin(/(debug, 0)). builtin(/(debugging, 0)). builtin(/(ensure_loaded, 1)). builtin(/(erase, 1)). builtin(/(fileerrors, 0)). builtin(/(flush_output, 1)). builtin(/(foreign, 2)). builtin(/(foreign, 3)). builtin(/(foreign_file, 2)). builtin(/(get, 1)). builtin(/(get, 2)). builtin(/(get0, 1)). builtin(/(get0, 2)). builtin(/(halt, 0)). builtin(/(incore, 1)). builtin(/(load_foreign_files, 2)). builtin(/(module, 1)). builtin(/(nofileerrors, 0)). builtin(/(no_style_check, 1)). builtin(/(open, 3)). builtin(/(open_null_stream, 1)). builtin(/(read, 1)). builtin(/(read, 2)). builtin(/(recorda, 3)). builtin(/(recorded, 3)). builtin(/(recordz, 3)). builtin(/(reinitialise, 0)). builtin(/(restore, 1)). builtin(/(restore, 2)). builtin(/(retract, 1)). builtin(/(retractall, 1)). builtin(/(save, 1)). builtin(/(save, 2)). builtin(/(save_program, 1)). builtin(/(see, 1)). builtin(/(seeing, 1)). builtin(/(seen, 0)). builtin(/(set_input, 1)). builtin(/(set_output, 1)). builtin(/(setof, 3)). builtin(/(skip, 1)). builtin(/(skip, 2)). builtin(/(style_check, 1)). builtin(/(ttyget, 1)). builtin(/(ttyget0, 1)). builtin(/(ttyskip, 1)). builtin(/(unknown, 2)). builtin(/(use_module, 1)). builtin(/(use_module, 2)). builtin(/('^', 2)). builtin(/(\+, 1)). go(N) :- ','(prepare(N, ManyClauses), ','(analyze_all(ManyClauses, Result), conclude(Result))). time(A) :- statistics(runtime, .(_N, .(A, []))). prepare(N, ManyClauses) :- ','(data(Clauses), ','(mlist(N, Clauses, ManyClauses), time(_N))). conclude(Result) :- ','(time(T), ','(write('Executed in '), ','(write(T), ','(write(' mS.'), ','(nl, ','(length(Result, L), ','(write('Length = '), ','(write(L), nl)))))))). mlist(0, _1, []). mlist(X, SList, LList) :- ','(is(Y, -(X, 1)), ','(mlist(Y, SList, MList), ','(copy_term(SList, NewSlist), append(NewSlist, MList, LList)))). data(.(clause(f(X, Z), ','(p(X, Y), q(Y, Z))), .(clause(f(X1, Y1, Z1), ','(p(X1, Y1), q(Y1, Z1))), .(clause(f(X2, Y2, Z2), ','(is(Y2, +(X2, Z2)), ','(p(X2, Y2), ','(r(Y2), q(Y2, Z2))))), .(clause(f(X3, Y3, Z3), ','(var(X3), ','(f(X3), ','(q(Y3), ','(r(X3, Y3, Z3), q(X3)))))), .(clause(f(X4, Y4, Z4), ','(r(X4, Y4), ','(p(X4, Y4), ','(p(W4), ','(s(X4), q(Y4, W4, Z4)))))), [])))))). fail :- failure(a). failure(b). Query: analyze_all(g,a) ---------------------------------------- (5) UnifyTransformerProof (EQUIVALENT) Added a fact for the built-in = predicate [PROLOG]. ---------------------------------------- (6) Obligation: Clauses: analyze_all(.(X, Y), .(X1, Y1)) :- ','(analyze(X, X1), analyze_all(Y, Y1)). analyze_all([], []). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ;(','(=(Body, true), =(NewSource, Source)), ','(=(I, []), ','(=(G, []), ','(rewrite_3(Source, New_Source, I, G, _Y), un_number_vars(New_Source, NewSource, others)))))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), ;(','(=(Result, 0), =(P, B)), rewrite(clause(H, B), clause(H, P), I, G, Info))). rewrite(clause(H, B), clause(H, P), I, G, Info) :- ','(numbervars_2(H, 0, Lhv), ','(collect_info(B, Info, Lhv, _X, _Y), add_annotations(Info, P, I, G))). add_annotations([], [], X5, X6). add_annotations(.(I, Is), .(P, Ps), Indep, Gnd) :- ','(add_annotations(I, P, Indep, Gnd), add_annotations(Is, Ps, Indep, Gnd)). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ;(;(','(var(Code), =(Phrase, PCode)), ','(=(Vars, []), =(Phrase, Code))), =(Phrase, ','(PCode, Code))))). collect_info(;(A, B), ','([], ','(sequential, ;(A, B))), Cin, Cout, _X) :- ','(collect_info(A, _Y, Cin, C, _Z), collect_info(B, _N, C, Cout, _M)). collect_info(','(A, B), and(Ia, Ib), Cin, Cout, _X) :- ','(collect_info(A, Ia, Cin, C, _Y), collect_info(B, Ib, C, Cout, _Z)). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ;(;(','(functor(A, F, Arity), ','(builtin(/(F, Arity)), =(CInfo, sequential))), ','(\==(NewVars, []), =(CInfo, suspect))), true)). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ;(;(','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(;(;(','(var(Ycode), =(Conjuncts, ','(Xcode, CGE))), ','(=(YVars, []), =(Conjuncts, ','(Xcode, Ycode)))), =(Conjuncts, ','(Xcode, ','(CGE, Ycode)))), ','(=(BagofVars, []), =(Type, sequential))))), ','(=(Ytype, sequential), ','(=(Conjuncts, Ycode), ','(=(BagofVars, XVars), =(Type, Xtype))))), ','(=(Conjuncts, Ycode), ','(append(XVars, YVars, BagofVars), =(Type, Xtype)))))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ;(','(==(T, sequential), ','(=(Type, T), ','(=(Vars, []), =(This_term, Term)))), ','(collect_vars(Term, Vs), ','(=(Type, par), =(Vars, .(','(','(T, ','(N, Term)), Vs), []))))). make_CGE_phrase(sequential, Code, X7, Code, X8, X9). make_CGE_phrase(_X, _Y, VarList, NewCode, I, G) :- get_phrase(VarList, NewCode, I, G). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), ;(','(>(L, 1), ','(eliminate_suspect_code(VarList, Rem, Vs, I, G), get_CGE_2(Vs, I, G, Code, Rem))), =(VarList, .(','(','(_X, ','(_Y, Code)), _Z), [])))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), ;(','(found(FVars, .(Last_goal, [])), ','(=(Last_goal, ','(','(_L, ','(_M, SeqCode)), _N)), =(ParCode, .(This_goal, [])))), =(ParCode, .(This_goal, .(Last_goal, []))))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ;(','(found(FVars, PCode), ','(get_CGE_2(PCode, I, G, Code, SCode), =(ParCode, .(This_goal, [])))), ','(=(ParCode, .(This_goal, PCode)), =(Code, SCode))))). found([], _R) :- fail. found(.(H, T), Next_calls) :- ;(find_var(Next_calls, H), found(T, Next_calls)). find_var([], _R) :- fail. find_var(.(','(_R, NextCall), Others), V) :- ;(member(V, NextCall), find_var(Others, V)). get_CGE_2(.(','(','(_X, ','(_Y, Goal)), _Z), []), _W, _M, Goal, Others) :- var(Others). get_CGE_2(.(','(','(X10, ','(X11, Goal)), X12), []), X13, X14, ','(Goal, Others), Others). get_CGE_2(Vs, I, G, Code, Rem) :- ','(get_conds(Vs, Conds, I, G), ','(make_norml_2(Vs, Parallel), babel_2(Conds, Parallel, Rem, Code))). get_conds(VARS, Y, I, G) :- ','(do_intersect(VARS, GS), ','(subtract(GS, G, Gnd), ','(singleton(VARS, VOIDS), ','(reduce_set(VARS, Gnd, VOIDS, I, RSET), ','(produce_tuples(RSET, Indep), get_text(Gnd, Indep, Y)))))). '$simplify_unconditional_cges'(off). babel_2(Conds, Parallel, C, Code) :- ','(;(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), =(Pcode, Parallel))), =..(Pcode, .('=>', .(Conds, .(Parallel, []))))), ;(','(var(C), =(Code, Pcode)), =(Code, ','(Pcode, C)))). reduce_set([], _X, _Y, _Z, []). reduce_set(.(','(Info, V), Vs), Gnd, VOIDS, Indep, .(','(Info, Rset), Rs)) :- ','(reduce_set(Vs, Gnd, VOIDS, Indep, Rs), ','(subtract(V, Gnd, Rg), ','(subtract(Rg, VOIDS, Rv), subtract(Rv, Indep, Rset)))). produce_tuples([], []). produce_tuples(.(','(_N, V), Vs), Tuples) :- ','(produce_tuples(Vs, Ts), ','(pair(Vs, V, Ps), merge(Ps, Ts, Tuples))). pair([], X15, []). pair(.(','(_N, L), Ls), Vs, Tuples) :- ','(pair(Ls, Vs, Ps), ','(tuple(L, Vs, Ts), merge(Ts, Ps, Tuples))). tuple([], X16, []). tuple(X17, [], []). tuple(List, .(L, Ls), Tuples) :- ','(tuple(List, Ls, T1), ','(tuple(List, L, T2), merge(T1, T2, Tuples))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(;(','(@<(E, L), =(Pair, .(.(E, .(L, [])), []))), =(Pair, .(.(L, .(E, [])), []))), merge(Pair, T1, Tuples))). make_norml(.(','(','(X18, ','(X19, T)), X20), []), T). make_norml(.(','(','(_X, ','(_Y, T)), _Z), Nxt), ','(T, Nc)) :- make_norml(Nxt, Nc). make_norml_2(.(','(','(X21, ','(X22, T)), X23), []), T). make_norml_2(.(','(','(_X, ','(_Y, T)), _Z), Nxt), '&'(T, Nc)) :- make_norml_2(Nxt, Nc). do_intersect([], []). do_intersect(.(','(_X, S1), .(','(_Y, S2), [])), IS) :- intersect(S1, S2, IS). do_intersect(.(S1, .(S2, Ss)), IS) :- ','(do_intersect(.(S2, Ss), IS1), ','(do_intersect(.(S1, Ss), IS2), ','(do_intersect(.(S1, .(S2, [])), IS3), ','(merge(IS1, IS2, T1), merge(IS3, T1, IS))))). get_text([], [], true). get_text([], X, indep(X)). get_text(X, [], ground(X)). get_text(X, Y, ','(ground(X), indep(Y))). find_vars(T, Vars, Cin, Cout) :- ','(numbervars_2(T, Cin, Cout), ','(is(NewVars, -(Cout, Cin)), ','(length(Vars, NewVars), numbervars_2(Vars, Cin, _N)))). collect_vars(X, .(X, [])) :- var(X). collect_vars('$VAR'(X), .('$VAR'(X), [])). collect_vars('$VAR'(X, Y), .('$VAR'(X, Y), [])). collect_vars(Term, Vars) :- ','(functor(Term, _N, A), ','(go_inside(A, Term, Vs), sort(Vs, Vars))). collect_vars(X24, []). go_inside(0, X25, []). go_inside(N, T, Bag) :- ','(is(Nth, -(N, 1)), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ;(;(','(var(ARG), =(Bag, .(ARG, C))), ','(atomic(ARG), =(Bag, C))), ','(collect_vars(ARG, Cs), append(Cs, C, Bag)))))). append([], L, L). append(.(H, T), L, .(H, R)) :- append(T, L, R). member(Element, .(Element, X26)). member(Element, .(_N, Rest)) :- member(Element, Rest). memberchk(Element, .(Element, X27)). memberchk(Element, .(_N, Rest)) :- memberchk(Element, Rest). subtract([], X28, []). subtract(.(Element, Residue), Set, Difference) :- ','(memberchk(Element, Set), subtract(Residue, Set, Difference)). subtract(.(Element, Residue), Set, .(Element, Difference)) :- subtract(Residue, Set, Difference). singleton(.(','(','(X29, ','(X, X30)), X31), []), X). singleton(.(','(','(_A, ','(V, _B)), _C), Vs), X) :- ','(singleton(Vs, Y), merge(V, Y, X)). merge([], D, D). merge(D, [], D). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(@<(A, D), merge(As, .(D, Ds), Bs)). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(==(A, D), merge(As, Ds, Bs)). merge(As, .(D, Ds), .(D, Bs)) :- merge(As, Ds, Bs). intersect([], X32, []). intersect(X33, [], []). intersect(.(A, As), .(D, Ds), Out) :- ','(@<(A, D), intersect(As, .(D, Ds), Out)). intersect(.(A, As), .(D, Ds), .(A, Out)) :- ','(==(A, D), intersect(As, Ds, Out)). intersect(As, .(_N, Ds), Out) :- intersect(As, Ds, Out). numbervars_2(X, N, N1) :- ','(var(X), ','(is(N1, +(N, 1)), =(X, '$VAR'(N, _L)))). numbervars_2(A, N, N) :- atomic(A). numbervars_2('$VAR'(X34, X35), N, N). numbervars_2(F, N, N1) :- numbervars_2(0, F, N, N1). numbervars_2(I, F, N, N1) :- ','(is(I1, +(I, 1)), ','(arg(I1, F, X), ','(numbervars_2(X, N, N0), numbervars_2(I1, F, N0, N1)))). numbervars_2(X36, X37, N, N). un_number_vars(clause(Head, Body), clause(H, B), X) :- ','(un_number_vars_2(Head, H, X), un_number_vars_2(Body, B, X)). un_number_vars(directive(X), directive(X), X38). un_number_vars_2('$VAR'(X39, X), X, others). un_number_vars_2('$VAR'(X, X40), '$VAR'(X), cge). un_number_vars_2(X, X, X41) :- atomic(X). un_number_vars_2(F, F1, Y) :- ','(functor(F, Func, _N), ','(un_number_vars_2(0, F, List, Y), =..(F1, .(Func, List)))). un_number_vars_2(I, F, .(X1, Tail), Y) :- ','(is(I1, +(I, 1)), ','(arg(I1, F, X), ','(un_number_vars_2(X, X1, Y), un_number_vars_2(I1, F, Tail, Y)))). un_number_vars_2(X42, X43, [], X44). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ;(','(=(ResultX, 0), =(Result, 0)), ','(check_if_cge(Y, ResultY), is(Result, *(ResultX, ResultY))))). check_if_cge('=>'(X45, X46), 0). check_if_cge('&'(X47, X48), 0). check_if_cge(X49, 1). builtin(/(fail, 0)). builtin(/(false, 0)). builtin(/(otherwise, 0)). builtin(/(repeat, 0)). builtin(/(true, 0)). builtin(/(version, 0)). builtin(/(version, 1)). builtin(/(!, 0)). builtin(/(abolish, 1)). builtin(/(abolish, 2)). builtin(/(abort, 0)). builtin(/(assert, 1)). builtin(/(assert, 2)). builtin(/(asserta, 1)). builtin(/(asserta, 2)). builtin(/(assertz, 1)). builtin(/(assertz, 2)). builtin(/(bagof, 3)). builtin(/(break, 0)). builtin(/(call, 1)). builtin(/(close, 1)). builtin(/(compile, 1)). builtin(/(consult, 1)). builtin(/(debug, 0)). builtin(/(debugging, 0)). builtin(/(ensure_loaded, 1)). builtin(/(erase, 1)). builtin(/(fileerrors, 0)). builtin(/(flush_output, 1)). builtin(/(foreign, 2)). builtin(/(foreign, 3)). builtin(/(foreign_file, 2)). builtin(/(get, 1)). builtin(/(get, 2)). builtin(/(get0, 1)). builtin(/(get0, 2)). builtin(/(halt, 0)). builtin(/(incore, 1)). builtin(/(load_foreign_files, 2)). builtin(/(module, 1)). builtin(/(nofileerrors, 0)). builtin(/(no_style_check, 1)). builtin(/(open, 3)). builtin(/(open_null_stream, 1)). builtin(/(read, 1)). builtin(/(read, 2)). builtin(/(recorda, 3)). builtin(/(recorded, 3)). builtin(/(recordz, 3)). builtin(/(reinitialise, 0)). builtin(/(restore, 1)). builtin(/(restore, 2)). builtin(/(retract, 1)). builtin(/(retractall, 1)). builtin(/(save, 1)). builtin(/(save, 2)). builtin(/(save_program, 1)). builtin(/(see, 1)). builtin(/(seeing, 1)). builtin(/(seen, 0)). builtin(/(set_input, 1)). builtin(/(set_output, 1)). builtin(/(setof, 3)). builtin(/(skip, 1)). builtin(/(skip, 2)). builtin(/(style_check, 1)). builtin(/(ttyget, 1)). builtin(/(ttyget0, 1)). builtin(/(ttyskip, 1)). builtin(/(unknown, 2)). builtin(/(use_module, 1)). builtin(/(use_module, 2)). builtin(/('^', 2)). builtin(/(\+, 1)). go(N) :- ','(prepare(N, ManyClauses), ','(analyze_all(ManyClauses, Result), conclude(Result))). time(A) :- statistics(runtime, .(_N, .(A, []))). prepare(N, ManyClauses) :- ','(data(Clauses), ','(mlist(N, Clauses, ManyClauses), time(_N))). conclude(Result) :- ','(time(T), ','(write('Executed in '), ','(write(T), ','(write(' mS.'), ','(nl, ','(length(Result, L), ','(write('Length = '), ','(write(L), nl)))))))). mlist(0, _1, []). mlist(X, SList, LList) :- ','(is(Y, -(X, 1)), ','(mlist(Y, SList, MList), ','(copy_term(SList, NewSlist), append(NewSlist, MList, LList)))). data(.(clause(f(X, Z), ','(p(X, Y), q(Y, Z))), .(clause(f(X1, Y1, Z1), ','(p(X1, Y1), q(Y1, Z1))), .(clause(f(X2, Y2, Z2), ','(is(Y2, +(X2, Z2)), ','(p(X2, Y2), ','(r(Y2), q(Y2, Z2))))), .(clause(f(X3, Y3, Z3), ','(var(X3), ','(f(X3), ','(q(Y3), ','(r(X3, Y3, Z3), q(X3)))))), .(clause(f(X4, Y4, Z4), ','(r(X4, Y4), ','(p(X4, Y4), ','(p(W4), ','(s(X4), q(Y4, W4, Z4)))))), [])))))). fail :- failure(a). failure(b). =(X, X). Query: analyze_all(g,a) ---------------------------------------- (7) OrTransformerProof (EQUIVALENT) Transformed all or-constructs[PROLOG]. ---------------------------------------- (8) Obligation: Clauses: analyze_all(.(X, Y), .(X1, Y1)) :- ','(analyze(X, X1), analyze_all(Y, Y1)). analyze_all([], []). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ','(=(Body, true), =(NewSource, Source))). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ','(=(I, []), ','(=(G, []), ','(rewrite_3(Source, New_Source, I, G, _Y), un_number_vars(New_Source, NewSource, others))))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), ','(=(Result, 0), =(P, B))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), rewrite(clause(H, B), clause(H, P), I, G, Info)). rewrite(clause(H, B), clause(H, P), I, G, Info) :- ','(numbervars_2(H, 0, Lhv), ','(collect_info(B, Info, Lhv, _X, _Y), add_annotations(Info, P, I, G))). add_annotations([], [], X5, X6). add_annotations(.(I, Is), .(P, Ps), Indep, Gnd) :- ','(add_annotations(I, P, Indep, Gnd), add_annotations(Is, Ps, Indep, Gnd)). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ','(var(Code), =(Phrase, PCode)))). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ','(=(Vars, []), =(Phrase, Code)))). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), =(Phrase, ','(PCode, Code)))). collect_info(;(A, B), ','([], ','(sequential, ;(A, B))), Cin, Cout, _X) :- ','(collect_info(A, _Y, Cin, C, _Z), collect_info(B, _N, C, Cout, _M)). collect_info(','(A, B), and(Ia, Ib), Cin, Cout, _X) :- ','(collect_info(A, Ia, Cin, C, _Y), collect_info(B, Ib, C, Cout, _Z)). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ','(functor(A, F, Arity), ','(builtin(/(F, Arity)), =(CInfo, sequential)))). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ','(\==(NewVars, []), =(CInfo, suspect))). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), true). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(','(var(Ycode), =(Conjuncts, ','(Xcode, CGE))), ','(=(BagofVars, []), =(Type, sequential))))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(','(=(YVars, []), =(Conjuncts, ','(Xcode, Ycode))), ','(=(BagofVars, []), =(Type, sequential))))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(=(Conjuncts, ','(Xcode, ','(CGE, Ycode))), ','(=(BagofVars, []), =(Type, sequential))))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Ytype, sequential), ','(=(Conjuncts, Ycode), ','(=(BagofVars, XVars), =(Type, Xtype)))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Conjuncts, Ycode), ','(append(XVars, YVars, BagofVars), =(Type, Xtype))))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ','(==(T, sequential), ','(=(Type, T), ','(=(Vars, []), =(This_term, Term)))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ','(collect_vars(Term, Vs), ','(=(Type, par), =(Vars, .(','(','(T, ','(N, Term)), Vs), [])))). make_CGE_phrase(sequential, Code, X7, Code, X8, X9). make_CGE_phrase(_X, _Y, VarList, NewCode, I, G) :- get_phrase(VarList, NewCode, I, G). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), ','(>(L, 1), ','(eliminate_suspect_code(VarList, Rem, Vs, I, G), get_CGE_2(Vs, I, G, Code, Rem)))). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), =(VarList, .(','(','(_X, ','(_Y, Code)), _Z), []))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), ','(found(FVars, .(Last_goal, [])), ','(=(Last_goal, ','(','(_L, ','(_M, SeqCode)), _N)), =(ParCode, .(This_goal, []))))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), =(ParCode, .(This_goal, .(Last_goal, [])))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ','(found(FVars, PCode), ','(get_CGE_2(PCode, I, G, Code, SCode), =(ParCode, .(This_goal, [])))))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ','(=(ParCode, .(This_goal, PCode)), =(Code, SCode)))). found([], _R) :- fail. found(.(H, T), Next_calls) :- find_var(Next_calls, H). found(.(H, T), Next_calls) :- found(T, Next_calls). find_var([], _R) :- fail. find_var(.(','(_R, NextCall), Others), V) :- member(V, NextCall). find_var(.(','(_R, NextCall), Others), V) :- find_var(Others, V). get_CGE_2(.(','(','(_X, ','(_Y, Goal)), _Z), []), _W, _M, Goal, Others) :- var(Others). get_CGE_2(.(','(','(X10, ','(X11, Goal)), X12), []), X13, X14, ','(Goal, Others), Others). get_CGE_2(Vs, I, G, Code, Rem) :- ','(get_conds(Vs, Conds, I, G), ','(make_norml_2(Vs, Parallel), babel_2(Conds, Parallel, Rem, Code))). get_conds(VARS, Y, I, G) :- ','(do_intersect(VARS, GS), ','(subtract(GS, G, Gnd), ','(singleton(VARS, VOIDS), ','(reduce_set(VARS, Gnd, VOIDS, I, RSET), ','(produce_tuples(RSET, Indep), get_text(Gnd, Indep, Y)))))). '$simplify_unconditional_cges'(off). babel_2(Conds, Parallel, C, Code) :- ','(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), =(Pcode, Parallel))), ','(var(C), =(Code, Pcode))). babel_2(Conds, Parallel, C, Code) :- ','(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), =(Pcode, Parallel))), =(Code, ','(Pcode, C))). babel_2(Conds, Parallel, C, Code) :- ','(=..(Pcode, .('=>', .(Conds, .(Parallel, [])))), ','(var(C), =(Code, Pcode))). babel_2(Conds, Parallel, C, Code) :- ','(=..(Pcode, .('=>', .(Conds, .(Parallel, [])))), =(Code, ','(Pcode, C))). reduce_set([], _X, _Y, _Z, []). reduce_set(.(','(Info, V), Vs), Gnd, VOIDS, Indep, .(','(Info, Rset), Rs)) :- ','(reduce_set(Vs, Gnd, VOIDS, Indep, Rs), ','(subtract(V, Gnd, Rg), ','(subtract(Rg, VOIDS, Rv), subtract(Rv, Indep, Rset)))). produce_tuples([], []). produce_tuples(.(','(_N, V), Vs), Tuples) :- ','(produce_tuples(Vs, Ts), ','(pair(Vs, V, Ps), merge(Ps, Ts, Tuples))). pair([], X15, []). pair(.(','(_N, L), Ls), Vs, Tuples) :- ','(pair(Ls, Vs, Ps), ','(tuple(L, Vs, Ts), merge(Ts, Ps, Tuples))). tuple([], X16, []). tuple(X17, [], []). tuple(List, .(L, Ls), Tuples) :- ','(tuple(List, Ls, T1), ','(tuple(List, L, T2), merge(T1, T2, Tuples))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(','(@<(E, L), =(Pair, .(.(E, .(L, [])), []))), merge(Pair, T1, Tuples))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(=(Pair, .(.(L, .(E, [])), [])), merge(Pair, T1, Tuples))). make_norml(.(','(','(X18, ','(X19, T)), X20), []), T). make_norml(.(','(','(_X, ','(_Y, T)), _Z), Nxt), ','(T, Nc)) :- make_norml(Nxt, Nc). make_norml_2(.(','(','(X21, ','(X22, T)), X23), []), T). make_norml_2(.(','(','(_X, ','(_Y, T)), _Z), Nxt), '&'(T, Nc)) :- make_norml_2(Nxt, Nc). do_intersect([], []). do_intersect(.(','(_X, S1), .(','(_Y, S2), [])), IS) :- intersect(S1, S2, IS). do_intersect(.(S1, .(S2, Ss)), IS) :- ','(do_intersect(.(S2, Ss), IS1), ','(do_intersect(.(S1, Ss), IS2), ','(do_intersect(.(S1, .(S2, [])), IS3), ','(merge(IS1, IS2, T1), merge(IS3, T1, IS))))). get_text([], [], true). get_text([], X, indep(X)). get_text(X, [], ground(X)). get_text(X, Y, ','(ground(X), indep(Y))). find_vars(T, Vars, Cin, Cout) :- ','(numbervars_2(T, Cin, Cout), ','(is(NewVars, -(Cout, Cin)), ','(length(Vars, NewVars), numbervars_2(Vars, Cin, _N)))). collect_vars(X, .(X, [])) :- var(X). collect_vars('$VAR'(X), .('$VAR'(X), [])). collect_vars('$VAR'(X, Y), .('$VAR'(X, Y), [])). collect_vars(Term, Vars) :- ','(functor(Term, _N, A), ','(go_inside(A, Term, Vs), sort(Vs, Vars))). collect_vars(X24, []). go_inside(0, X25, []). go_inside(N, T, Bag) :- ','(is(Nth, -(N, 1)), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ','(var(ARG), =(Bag, .(ARG, C)))))). go_inside(N, T, Bag) :- ','(is(Nth, -(N, 1)), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ','(atomic(ARG), =(Bag, C))))). go_inside(N, T, Bag) :- ','(is(Nth, -(N, 1)), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ','(collect_vars(ARG, Cs), append(Cs, C, Bag))))). append([], L, L). append(.(H, T), L, .(H, R)) :- append(T, L, R). member(Element, .(Element, X26)). member(Element, .(_N, Rest)) :- member(Element, Rest). memberchk(Element, .(Element, X27)). memberchk(Element, .(_N, Rest)) :- memberchk(Element, Rest). subtract([], X28, []). subtract(.(Element, Residue), Set, Difference) :- ','(memberchk(Element, Set), subtract(Residue, Set, Difference)). subtract(.(Element, Residue), Set, .(Element, Difference)) :- subtract(Residue, Set, Difference). singleton(.(','(','(X29, ','(X, X30)), X31), []), X). singleton(.(','(','(_A, ','(V, _B)), _C), Vs), X) :- ','(singleton(Vs, Y), merge(V, Y, X)). merge([], D, D). merge(D, [], D). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(@<(A, D), merge(As, .(D, Ds), Bs)). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(==(A, D), merge(As, Ds, Bs)). merge(As, .(D, Ds), .(D, Bs)) :- merge(As, Ds, Bs). intersect([], X32, []). intersect(X33, [], []). intersect(.(A, As), .(D, Ds), Out) :- ','(@<(A, D), intersect(As, .(D, Ds), Out)). intersect(.(A, As), .(D, Ds), .(A, Out)) :- ','(==(A, D), intersect(As, Ds, Out)). intersect(As, .(_N, Ds), Out) :- intersect(As, Ds, Out). numbervars_2(X, N, N1) :- ','(var(X), ','(is(N1, +(N, 1)), =(X, '$VAR'(N, _L)))). numbervars_2(A, N, N) :- atomic(A). numbervars_2('$VAR'(X34, X35), N, N). numbervars_2(F, N, N1) :- numbervars_2(0, F, N, N1). numbervars_2(I, F, N, N1) :- ','(is(I1, +(I, 1)), ','(arg(I1, F, X), ','(numbervars_2(X, N, N0), numbervars_2(I1, F, N0, N1)))). numbervars_2(X36, X37, N, N). un_number_vars(clause(Head, Body), clause(H, B), X) :- ','(un_number_vars_2(Head, H, X), un_number_vars_2(Body, B, X)). un_number_vars(directive(X), directive(X), X38). un_number_vars_2('$VAR'(X39, X), X, others). un_number_vars_2('$VAR'(X, X40), '$VAR'(X), cge). un_number_vars_2(X, X, X41) :- atomic(X). un_number_vars_2(F, F1, Y) :- ','(functor(F, Func, _N), ','(un_number_vars_2(0, F, List, Y), =..(F1, .(Func, List)))). un_number_vars_2(I, F, .(X1, Tail), Y) :- ','(is(I1, +(I, 1)), ','(arg(I1, F, X), ','(un_number_vars_2(X, X1, Y), un_number_vars_2(I1, F, Tail, Y)))). un_number_vars_2(X42, X43, [], X44). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ','(=(ResultX, 0), =(Result, 0))). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ','(check_if_cge(Y, ResultY), is(Result, *(ResultX, ResultY)))). check_if_cge('=>'(X45, X46), 0). check_if_cge('&'(X47, X48), 0). check_if_cge(X49, 1). builtin(/(fail, 0)). builtin(/(false, 0)). builtin(/(otherwise, 0)). builtin(/(repeat, 0)). builtin(/(true, 0)). builtin(/(version, 0)). builtin(/(version, 1)). builtin(/(!, 0)). builtin(/(abolish, 1)). builtin(/(abolish, 2)). builtin(/(abort, 0)). builtin(/(assert, 1)). builtin(/(assert, 2)). builtin(/(asserta, 1)). builtin(/(asserta, 2)). builtin(/(assertz, 1)). builtin(/(assertz, 2)). builtin(/(bagof, 3)). builtin(/(break, 0)). builtin(/(call, 1)). builtin(/(close, 1)). builtin(/(compile, 1)). builtin(/(consult, 1)). builtin(/(debug, 0)). builtin(/(debugging, 0)). builtin(/(ensure_loaded, 1)). builtin(/(erase, 1)). builtin(/(fileerrors, 0)). builtin(/(flush_output, 1)). builtin(/(foreign, 2)). builtin(/(foreign, 3)). builtin(/(foreign_file, 2)). builtin(/(get, 1)). builtin(/(get, 2)). builtin(/(get0, 1)). builtin(/(get0, 2)). builtin(/(halt, 0)). builtin(/(incore, 1)). builtin(/(load_foreign_files, 2)). builtin(/(module, 1)). builtin(/(nofileerrors, 0)). builtin(/(no_style_check, 1)). builtin(/(open, 3)). builtin(/(open_null_stream, 1)). builtin(/(read, 1)). builtin(/(read, 2)). builtin(/(recorda, 3)). builtin(/(recorded, 3)). builtin(/(recordz, 3)). builtin(/(reinitialise, 0)). builtin(/(restore, 1)). builtin(/(restore, 2)). builtin(/(retract, 1)). builtin(/(retractall, 1)). builtin(/(save, 1)). builtin(/(save, 2)). builtin(/(save_program, 1)). builtin(/(see, 1)). builtin(/(seeing, 1)). builtin(/(seen, 0)). builtin(/(set_input, 1)). builtin(/(set_output, 1)). builtin(/(setof, 3)). builtin(/(skip, 1)). builtin(/(skip, 2)). builtin(/(style_check, 1)). builtin(/(ttyget, 1)). builtin(/(ttyget0, 1)). builtin(/(ttyskip, 1)). builtin(/(unknown, 2)). builtin(/(use_module, 1)). builtin(/(use_module, 2)). builtin(/('^', 2)). builtin(/(\+, 1)). go(N) :- ','(prepare(N, ManyClauses), ','(analyze_all(ManyClauses, Result), conclude(Result))). time(A) :- statistics(runtime, .(_N, .(A, []))). prepare(N, ManyClauses) :- ','(data(Clauses), ','(mlist(N, Clauses, ManyClauses), time(_N))). conclude(Result) :- ','(time(T), ','(write('Executed in '), ','(write(T), ','(write(' mS.'), ','(nl, ','(length(Result, L), ','(write('Length = '), ','(write(L), nl)))))))). mlist(0, _1, []). mlist(X, SList, LList) :- ','(is(Y, -(X, 1)), ','(mlist(Y, SList, MList), ','(copy_term(SList, NewSlist), append(NewSlist, MList, LList)))). data(.(clause(f(X, Z), ','(p(X, Y), q(Y, Z))), .(clause(f(X1, Y1, Z1), ','(p(X1, Y1), q(Y1, Z1))), .(clause(f(X2, Y2, Z2), ','(is(Y2, +(X2, Z2)), ','(p(X2, Y2), ','(r(Y2), q(Y2, Z2))))), .(clause(f(X3, Y3, Z3), ','(var(X3), ','(f(X3), ','(q(Y3), ','(r(X3, Y3, Z3), q(X3)))))), .(clause(f(X4, Y4, Z4), ','(r(X4, Y4), ','(p(X4, Y4), ','(p(W4), ','(s(X4), q(Y4, W4, Z4)))))), [])))))). fail :- failure(a). failure(b). =(X, X). Query: analyze_all(g,a) ---------------------------------------- (9) UndefinedPredicateHandlerProof (SOUND) Added facts for all undefined predicates [PROLOG]. ---------------------------------------- (10) Obligation: Clauses: analyze_all(.(X, Y), .(X1, Y1)) :- ','(analyze(X, X1), analyze_all(Y, Y1)). analyze_all([], []). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ','(=(Body, true), =(NewSource, Source))). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ','(=(I, []), ','(=(G, []), ','(rewrite_3(Source, New_Source, I, G, _Y), un_number_vars(New_Source, NewSource, others))))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), ','(=(Result, 0), =(P, B))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), rewrite(clause(H, B), clause(H, P), I, G, Info)). rewrite(clause(H, B), clause(H, P), I, G, Info) :- ','(numbervars_2(H, 0, Lhv), ','(collect_info(B, Info, Lhv, _X, _Y), add_annotations(Info, P, I, G))). add_annotations([], [], X5, X6). add_annotations(.(I, Is), .(P, Ps), Indep, Gnd) :- ','(add_annotations(I, P, Indep, Gnd), add_annotations(Is, Ps, Indep, Gnd)). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ','(var(Code), =(Phrase, PCode)))). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ','(=(Vars, []), =(Phrase, Code)))). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), =(Phrase, ','(PCode, Code)))). collect_info(;(A, B), ','([], ','(sequential, ;(A, B))), Cin, Cout, _X) :- ','(collect_info(A, _Y, Cin, C, _Z), collect_info(B, _N, C, Cout, _M)). collect_info(','(A, B), and(Ia, Ib), Cin, Cout, _X) :- ','(collect_info(A, Ia, Cin, C, _Y), collect_info(B, Ib, C, Cout, _Z)). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ','(functor(A, F, Arity), ','(builtin(/(F, Arity)), =(CInfo, sequential)))). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ','(\==(NewVars, []), =(CInfo, suspect))). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), true). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(','(var(Ycode), =(Conjuncts, ','(Xcode, CGE))), ','(=(BagofVars, []), =(Type, sequential))))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(','(=(YVars, []), =(Conjuncts, ','(Xcode, Ycode))), ','(=(BagofVars, []), =(Type, sequential))))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(=(Conjuncts, ','(Xcode, ','(CGE, Ycode))), ','(=(BagofVars, []), =(Type, sequential))))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Ytype, sequential), ','(=(Conjuncts, Ycode), ','(=(BagofVars, XVars), =(Type, Xtype)))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Conjuncts, Ycode), ','(append(XVars, YVars, BagofVars), =(Type, Xtype))))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ','(==(T, sequential), ','(=(Type, T), ','(=(Vars, []), =(This_term, Term)))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ','(collect_vars(Term, Vs), ','(=(Type, par), =(Vars, .(','(','(T, ','(N, Term)), Vs), [])))). make_CGE_phrase(sequential, Code, X7, Code, X8, X9). make_CGE_phrase(_X, _Y, VarList, NewCode, I, G) :- get_phrase(VarList, NewCode, I, G). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), ','(>(L, 1), ','(eliminate_suspect_code(VarList, Rem, Vs, I, G), get_CGE_2(Vs, I, G, Code, Rem)))). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), =(VarList, .(','(','(_X, ','(_Y, Code)), _Z), []))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), ','(found(FVars, .(Last_goal, [])), ','(=(Last_goal, ','(','(_L, ','(_M, SeqCode)), _N)), =(ParCode, .(This_goal, []))))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), =(ParCode, .(This_goal, .(Last_goal, [])))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ','(found(FVars, PCode), ','(get_CGE_2(PCode, I, G, Code, SCode), =(ParCode, .(This_goal, [])))))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ','(=(ParCode, .(This_goal, PCode)), =(Code, SCode)))). found([], _R) :- fail. found(.(H, T), Next_calls) :- find_var(Next_calls, H). found(.(H, T), Next_calls) :- found(T, Next_calls). find_var([], _R) :- fail. find_var(.(','(_R, NextCall), Others), V) :- member(V, NextCall). find_var(.(','(_R, NextCall), Others), V) :- find_var(Others, V). get_CGE_2(.(','(','(_X, ','(_Y, Goal)), _Z), []), _W, _M, Goal, Others) :- var(Others). get_CGE_2(.(','(','(X10, ','(X11, Goal)), X12), []), X13, X14, ','(Goal, Others), Others). get_CGE_2(Vs, I, G, Code, Rem) :- ','(get_conds(Vs, Conds, I, G), ','(make_norml_2(Vs, Parallel), babel_2(Conds, Parallel, Rem, Code))). get_conds(VARS, Y, I, G) :- ','(do_intersect(VARS, GS), ','(subtract(GS, G, Gnd), ','(singleton(VARS, VOIDS), ','(reduce_set(VARS, Gnd, VOIDS, I, RSET), ','(produce_tuples(RSET, Indep), get_text(Gnd, Indep, Y)))))). '$simplify_unconditional_cges'(off). babel_2(Conds, Parallel, C, Code) :- ','(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), =(Pcode, Parallel))), ','(var(C), =(Code, Pcode))). babel_2(Conds, Parallel, C, Code) :- ','(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), =(Pcode, Parallel))), =(Code, ','(Pcode, C))). babel_2(Conds, Parallel, C, Code) :- ','(=..(Pcode, .('=>', .(Conds, .(Parallel, [])))), ','(var(C), =(Code, Pcode))). babel_2(Conds, Parallel, C, Code) :- ','(=..(Pcode, .('=>', .(Conds, .(Parallel, [])))), =(Code, ','(Pcode, C))). reduce_set([], _X, _Y, _Z, []). reduce_set(.(','(Info, V), Vs), Gnd, VOIDS, Indep, .(','(Info, Rset), Rs)) :- ','(reduce_set(Vs, Gnd, VOIDS, Indep, Rs), ','(subtract(V, Gnd, Rg), ','(subtract(Rg, VOIDS, Rv), subtract(Rv, Indep, Rset)))). produce_tuples([], []). produce_tuples(.(','(_N, V), Vs), Tuples) :- ','(produce_tuples(Vs, Ts), ','(pair(Vs, V, Ps), merge(Ps, Ts, Tuples))). pair([], X15, []). pair(.(','(_N, L), Ls), Vs, Tuples) :- ','(pair(Ls, Vs, Ps), ','(tuple(L, Vs, Ts), merge(Ts, Ps, Tuples))). tuple([], X16, []). tuple(X17, [], []). tuple(List, .(L, Ls), Tuples) :- ','(tuple(List, Ls, T1), ','(tuple(List, L, T2), merge(T1, T2, Tuples))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(','(@<(E, L), =(Pair, .(.(E, .(L, [])), []))), merge(Pair, T1, Tuples))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(=(Pair, .(.(L, .(E, [])), [])), merge(Pair, T1, Tuples))). make_norml(.(','(','(X18, ','(X19, T)), X20), []), T). make_norml(.(','(','(_X, ','(_Y, T)), _Z), Nxt), ','(T, Nc)) :- make_norml(Nxt, Nc). make_norml_2(.(','(','(X21, ','(X22, T)), X23), []), T). make_norml_2(.(','(','(_X, ','(_Y, T)), _Z), Nxt), '&'(T, Nc)) :- make_norml_2(Nxt, Nc). do_intersect([], []). do_intersect(.(','(_X, S1), .(','(_Y, S2), [])), IS) :- intersect(S1, S2, IS). do_intersect(.(S1, .(S2, Ss)), IS) :- ','(do_intersect(.(S2, Ss), IS1), ','(do_intersect(.(S1, Ss), IS2), ','(do_intersect(.(S1, .(S2, [])), IS3), ','(merge(IS1, IS2, T1), merge(IS3, T1, IS))))). get_text([], [], true). get_text([], X, indep(X)). get_text(X, [], ground(X)). get_text(X, Y, ','(ground(X), indep(Y))). find_vars(T, Vars, Cin, Cout) :- ','(numbervars_2(T, Cin, Cout), ','(is(NewVars, -(Cout, Cin)), ','(length(Vars, NewVars), numbervars_2(Vars, Cin, _N)))). collect_vars(X, .(X, [])) :- var(X). collect_vars('$VAR'(X), .('$VAR'(X), [])). collect_vars('$VAR'(X, Y), .('$VAR'(X, Y), [])). collect_vars(Term, Vars) :- ','(functor(Term, _N, A), ','(go_inside(A, Term, Vs), sort(Vs, Vars))). collect_vars(X24, []). go_inside(0, X25, []). go_inside(N, T, Bag) :- ','(is(Nth, -(N, 1)), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ','(var(ARG), =(Bag, .(ARG, C)))))). go_inside(N, T, Bag) :- ','(is(Nth, -(N, 1)), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ','(atomic(ARG), =(Bag, C))))). go_inside(N, T, Bag) :- ','(is(Nth, -(N, 1)), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ','(collect_vars(ARG, Cs), append(Cs, C, Bag))))). append([], L, L). append(.(H, T), L, .(H, R)) :- append(T, L, R). member(Element, .(Element, X26)). member(Element, .(_N, Rest)) :- member(Element, Rest). memberchk(Element, .(Element, X27)). memberchk(Element, .(_N, Rest)) :- memberchk(Element, Rest). subtract([], X28, []). subtract(.(Element, Residue), Set, Difference) :- ','(memberchk(Element, Set), subtract(Residue, Set, Difference)). subtract(.(Element, Residue), Set, .(Element, Difference)) :- subtract(Residue, Set, Difference). singleton(.(','(','(X29, ','(X, X30)), X31), []), X). singleton(.(','(','(_A, ','(V, _B)), _C), Vs), X) :- ','(singleton(Vs, Y), merge(V, Y, X)). merge([], D, D). merge(D, [], D). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(@<(A, D), merge(As, .(D, Ds), Bs)). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(==(A, D), merge(As, Ds, Bs)). merge(As, .(D, Ds), .(D, Bs)) :- merge(As, Ds, Bs). intersect([], X32, []). intersect(X33, [], []). intersect(.(A, As), .(D, Ds), Out) :- ','(@<(A, D), intersect(As, .(D, Ds), Out)). intersect(.(A, As), .(D, Ds), .(A, Out)) :- ','(==(A, D), intersect(As, Ds, Out)). intersect(As, .(_N, Ds), Out) :- intersect(As, Ds, Out). numbervars_2(X, N, N1) :- ','(var(X), ','(is(N1, +(N, 1)), =(X, '$VAR'(N, _L)))). numbervars_2(A, N, N) :- atomic(A). numbervars_2('$VAR'(X34, X35), N, N). numbervars_2(F, N, N1) :- numbervars_2(0, F, N, N1). numbervars_2(I, F, N, N1) :- ','(is(I1, +(I, 1)), ','(arg(I1, F, X), ','(numbervars_2(X, N, N0), numbervars_2(I1, F, N0, N1)))). numbervars_2(X36, X37, N, N). un_number_vars(clause(Head, Body), clause(H, B), X) :- ','(un_number_vars_2(Head, H, X), un_number_vars_2(Body, B, X)). un_number_vars(directive(X), directive(X), X38). un_number_vars_2('$VAR'(X39, X), X, others). un_number_vars_2('$VAR'(X, X40), '$VAR'(X), cge). un_number_vars_2(X, X, X41) :- atomic(X). un_number_vars_2(F, F1, Y) :- ','(functor(F, Func, _N), ','(un_number_vars_2(0, F, List, Y), =..(F1, .(Func, List)))). un_number_vars_2(I, F, .(X1, Tail), Y) :- ','(is(I1, +(I, 1)), ','(arg(I1, F, X), ','(un_number_vars_2(X, X1, Y), un_number_vars_2(I1, F, Tail, Y)))). un_number_vars_2(X42, X43, [], X44). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ','(=(ResultX, 0), =(Result, 0))). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ','(check_if_cge(Y, ResultY), is(Result, *(ResultX, ResultY)))). check_if_cge('=>'(X45, X46), 0). check_if_cge('&'(X47, X48), 0). check_if_cge(X49, 1). builtin(/(fail, 0)). builtin(/(false, 0)). builtin(/(otherwise, 0)). builtin(/(repeat, 0)). builtin(/(true, 0)). builtin(/(version, 0)). builtin(/(version, 1)). builtin(/(!, 0)). builtin(/(abolish, 1)). builtin(/(abolish, 2)). builtin(/(abort, 0)). builtin(/(assert, 1)). builtin(/(assert, 2)). builtin(/(asserta, 1)). builtin(/(asserta, 2)). builtin(/(assertz, 1)). builtin(/(assertz, 2)). builtin(/(bagof, 3)). builtin(/(break, 0)). builtin(/(call, 1)). builtin(/(close, 1)). builtin(/(compile, 1)). builtin(/(consult, 1)). builtin(/(debug, 0)). builtin(/(debugging, 0)). builtin(/(ensure_loaded, 1)). builtin(/(erase, 1)). builtin(/(fileerrors, 0)). builtin(/(flush_output, 1)). builtin(/(foreign, 2)). builtin(/(foreign, 3)). builtin(/(foreign_file, 2)). builtin(/(get, 1)). builtin(/(get, 2)). builtin(/(get0, 1)). builtin(/(get0, 2)). builtin(/(halt, 0)). builtin(/(incore, 1)). builtin(/(load_foreign_files, 2)). builtin(/(module, 1)). builtin(/(nofileerrors, 0)). builtin(/(no_style_check, 1)). builtin(/(open, 3)). builtin(/(open_null_stream, 1)). builtin(/(read, 1)). builtin(/(read, 2)). builtin(/(recorda, 3)). builtin(/(recorded, 3)). builtin(/(recordz, 3)). builtin(/(reinitialise, 0)). builtin(/(restore, 1)). builtin(/(restore, 2)). builtin(/(retract, 1)). builtin(/(retractall, 1)). builtin(/(save, 1)). builtin(/(save, 2)). builtin(/(save_program, 1)). builtin(/(see, 1)). builtin(/(seeing, 1)). builtin(/(seen, 0)). builtin(/(set_input, 1)). builtin(/(set_output, 1)). builtin(/(setof, 3)). builtin(/(skip, 1)). builtin(/(skip, 2)). builtin(/(style_check, 1)). builtin(/(ttyget, 1)). builtin(/(ttyget0, 1)). builtin(/(ttyskip, 1)). builtin(/(unknown, 2)). builtin(/(use_module, 1)). builtin(/(use_module, 2)). builtin(/('^', 2)). builtin(/(\+, 1)). go(N) :- ','(prepare(N, ManyClauses), ','(analyze_all(ManyClauses, Result), conclude(Result))). time(A) :- statistics(runtime, .(_N, .(A, []))). prepare(N, ManyClauses) :- ','(data(Clauses), ','(mlist(N, Clauses, ManyClauses), time(_N))). conclude(Result) :- ','(time(T), ','(write('Executed in '), ','(write(T), ','(write(' mS.'), ','(nl, ','(length(Result, L), ','(write('Length = '), ','(write(L), nl)))))))). mlist(0, _1, []). mlist(X, SList, LList) :- ','(is(Y, -(X, 1)), ','(mlist(Y, SList, MList), ','(copy_term(SList, NewSlist), append(NewSlist, MList, LList)))). data(.(clause(f(X, Z), ','(p(X, Y), q(Y, Z))), .(clause(f(X1, Y1, Z1), ','(p(X1, Y1), q(Y1, Z1))), .(clause(f(X2, Y2, Z2), ','(is(Y2, +(X2, Z2)), ','(p(X2, Y2), ','(r(Y2), q(Y2, Z2))))), .(clause(f(X3, Y3, Z3), ','(var(X3), ','(f(X3), ','(q(Y3), ','(r(X3, Y3, Z3), q(X3)))))), .(clause(f(X4, Y4, Z4), ','(r(X4, Y4), ','(p(X4, Y4), ','(p(W4), ','(s(X4), q(Y4, W4, Z4)))))), [])))))). fail :- failure(a). failure(b). =(X, X). var(X0). functor(X0, X1, X2). \==(X0, X1). true. ==(X0, X1). length(X0, X1). >(X0, X1). =..(X0, X1). @<(X0, X1). is(X0, X1). sort(X0, X1). arg(X0, X1, X2). atomic(X0). statistics(X0, X1). write(X0). nl. copy_term(X0, X1). Query: analyze_all(g,a) ---------------------------------------- (11) IntegerArithmeticTransformerProof (SOUND) Added definitions of predefined predicates [PROLOG]. ---------------------------------------- (12) Obligation: Clauses: analyze_all(.(X, Y), .(X1, Y1)) :- ','(analyze(X, X1), analyze_all(Y, Y1)). analyze_all([], []). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ;(','(=(Body, true), ','(!, =(NewSource, Source))), ','(=(I, []), ','(=(G, []), ','(rewrite_3(Source, New_Source, I, G, _Y), ','(un_number_vars(New_Source, NewSource, others), !)))))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), ;(','(=(Result, zero), =(P, B)), rewrite(clause(H, B), clause(H, P), I, G, Info))). rewrite(clause(H, B), clause(H, P), I, G, Info) :- ','(numbervars_2(H, zero, Lhv), ','(collect_info(B, Info, Lhv, _X, _Y), ','(add_annotations(Info, P, I, G), !))). add_annotations([], [], X5, X6). add_annotations(.(I, Is), .(P, Ps), Indep, Gnd) :- ','(!, ','(add_annotations(I, P, Indep, Gnd), add_annotations(Is, Ps, Indep, Gnd))). add_annotations(Info, Phrase, I, G) :- ','(!, ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ;(;(','(var(Code), ','(!, =(Phrase, PCode))), ','(=(Vars, []), ','(!, =(Phrase, Code)))), =(Phrase, ','(PCode, Code)))))). collect_info(;(A, B), ','([], ','(sequential, ;(A, B))), Cin, Cout, _X) :- ','(!, ','(collect_info(A, _Y, Cin, C, _Z), collect_info(B, _N, C, Cout, _M))). collect_info(','(A, B), and(Ia, Ib), Cin, Cout, _X) :- ','(!, ','(collect_info(A, Ia, Cin, C, _Y), collect_info(B, Ib, C, Cout, _Z))). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ','(;(;(','(functor(A, F, Arity), ','(builtin(/(F, Arity)), ','(!, =(CInfo, sequential)))), ','(\==(NewVars, []), ','(!, =(CInfo, suspect)))), true), !)). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(!, ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ;(;(','(=(Xtype, sequential), ','(!, ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(;(;(','(var(Ycode), ','(!, =(Conjuncts, ','(Xcode, CGE)))), ','(=(YVars, []), ','(!, =(Conjuncts, ','(Xcode, Ycode))))), =(Conjuncts, ','(Xcode, ','(CGE, Ycode)))), ','(=(BagofVars, []), =(Type, sequential)))))), ','(=(Ytype, sequential), ','(!, ','(=(Conjuncts, Ycode), ','(=(BagofVars, XVars), =(Type, Xtype)))))), ','(=(Conjuncts, Ycode), ','(append(XVars, YVars, BagofVars), =(Type, Xtype))))))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ;(','(==(T, sequential), ','(!, ','(=(Type, T), ','(=(Vars, []), =(This_term, Term))))), ','(collect_vars(Term, Vs), ','(=(Type, par), =(Vars, .(','(','(T, ','(N, Term)), Vs), []))))). make_CGE_phrase(sequential, Code, X7, Code, X8, X9) :- !. make_CGE_phrase(_X, _Y, VarList, NewCode, I, G) :- ','(get_phrase(VarList, NewCode, I, G), !). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), ;(','(','(','(=(X, L), =(X1, succ(zero))), isGreater(X, X1)), ','(!, ','(eliminate_suspect_code(VarList, Rem, Vs, I, G), get_CGE_2(Vs, I, G, Code, Rem)))), =(VarList, .(','(','(_X, ','(_Y, Code)), _Z), [])))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(!, ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), ;(','(found(FVars, .(Last_goal, [])), ','(!, ','(=(Last_goal, ','(','(_L, ','(_M, SeqCode)), _N)), =(ParCode, .(This_goal, []))))), =(ParCode, .(This_goal, .(Last_goal, [])))))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ;(','(found(FVars, PCode), ','(!, ','(get_CGE_2(PCode, I, G, Code, SCode), =(ParCode, .(This_goal, []))))), ','(=(ParCode, .(This_goal, PCode)), =(Code, SCode))))). found([], _R) :- fail. found(.(H, T), Next_calls) :- ;(','(find_var(Next_calls, H), !), found(T, Next_calls)). find_var([], _R) :- fail. find_var(.(','(_R, NextCall), Others), V) :- ;(','(member(V, NextCall), !), find_var(Others, V)). get_CGE_2(.(','(','(_X, ','(_Y, Goal)), _Z), []), _W, _M, Goal, Others) :- ','(var(Others), !). get_CGE_2(.(','(','(X10, ','(X11, Goal)), X12), []), X13, X14, ','(Goal, Others), Others) :- !. get_CGE_2(Vs, I, G, Code, Rem) :- ','(get_conds(Vs, Conds, I, G), ','(make_norml_2(Vs, Parallel), babel_2(Conds, Parallel, Rem, Code))). get_conds(VARS, Y, I, G) :- ','(do_intersect(VARS, GS), ','(subtract(GS, G, Gnd), ','(singleton(VARS, VOIDS), ','(reduce_set(VARS, Gnd, VOIDS, I, RSET), ','(produce_tuples(RSET, Indep), get_text(Gnd, Indep, Y)))))). '$simplify_unconditional_cges'(off). babel_2(Conds, Parallel, C, Code) :- ','(;(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), ','(!, =(Pcode, Parallel)))), =..(Pcode, .('=>', .(Conds, .(Parallel, []))))), ;(','(var(C), ','(!, =(Code, Pcode))), =(Code, ','(Pcode, C)))). reduce_set([], _X, _Y, _Z, []). reduce_set(.(','(Info, V), Vs), Gnd, VOIDS, Indep, .(','(Info, Rset), Rs)) :- ','(!, ','(reduce_set(Vs, Gnd, VOIDS, Indep, Rs), ','(subtract(V, Gnd, Rg), ','(subtract(Rg, VOIDS, Rv), subtract(Rv, Indep, Rset))))). produce_tuples([], []). produce_tuples(.(','(_N, V), Vs), Tuples) :- ','(!, ','(produce_tuples(Vs, Ts), ','(pair(Vs, V, Ps), merge(Ps, Ts, Tuples)))). pair([], X15, []). pair(.(','(_N, L), Ls), Vs, Tuples) :- ','(pair(Ls, Vs, Ps), ','(tuple(L, Vs, Ts), merge(Ts, Ps, Tuples))). tuple([], X16, []). tuple(X17, [], []). tuple(List, .(L, Ls), Tuples) :- ','(!, ','(tuple(List, Ls, T1), ','(tuple(List, L, T2), merge(T1, T2, Tuples)))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(!, ','(;(','(@<(E, L), ','(!, =(Pair, .(.(E, .(L, [])), [])))), =(Pair, .(.(L, .(E, [])), []))), merge(Pair, T1, Tuples)))). make_norml(.(','(','(X18, ','(X19, T)), X20), []), T) :- !. make_norml(.(','(','(_X, ','(_Y, T)), _Z), Nxt), ','(T, Nc)) :- make_norml(Nxt, Nc). make_norml_2(.(','(','(X21, ','(X22, T)), X23), []), T) :- !. make_norml_2(.(','(','(_X, ','(_Y, T)), _Z), Nxt), '&'(T, Nc)) :- make_norml_2(Nxt, Nc). do_intersect([], []). do_intersect(.(','(_X, S1), .(','(_Y, S2), [])), IS) :- ','(!, intersect(S1, S2, IS)). do_intersect(.(S1, .(S2, Ss)), IS) :- ','(do_intersect(.(S2, Ss), IS1), ','(do_intersect(.(S1, Ss), IS2), ','(do_intersect(.(S1, .(S2, [])), IS3), ','(merge(IS1, IS2, T1), merge(IS3, T1, IS))))). get_text([], [], true). get_text([], X, indep(X)). get_text(X, [], ground(X)). get_text(X, Y, ','(ground(X), indep(Y))). find_vars(T, Vars, Cin, Cout) :- ','(numbervars_2(T, Cin, Cout), ','(isMinus(Cout, Cin, U), ','(=(NewVars, U), ','(length(Vars, NewVars), ','(numbervars_2(Vars, Cin, _N), !))))). collect_vars(X, .(X, [])) :- ','(var(X), !). collect_vars('$VAR'(X), .('$VAR'(X), [])) :- !. collect_vars('$VAR'(X, Y), .('$VAR'(X, Y), [])) :- !. collect_vars(Term, Vars) :- ','(functor(Term, _N, A), ','(go_inside(A, Term, Vs), sort(Vs, Vars))). collect_vars(X24, []). go_inside(zero, X25, []) :- !. go_inside(N, T, Bag) :- ','(isMinus(N, succ(zero), U), ','(=(Nth, U), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ;(;(','(var(ARG), ','(!, =(Bag, .(ARG, C)))), ','(atomic(ARG), ','(!, =(Bag, C)))), ','(collect_vars(ARG, Cs), append(Cs, C, Bag))))))). append([], L, L). append(.(H, T), L, .(H, R)) :- append(T, L, R). member(Element, .(Element, X26)). member(Element, .(_N, Rest)) :- member(Element, Rest). memberchk(Element, .(Element, X27)) :- !. memberchk(Element, .(_N, Rest)) :- memberchk(Element, Rest). subtract([], X28, []). subtract(.(Element, Residue), Set, Difference) :- ','(memberchk(Element, Set), ','(!, subtract(Residue, Set, Difference))). subtract(.(Element, Residue), Set, .(Element, Difference)) :- subtract(Residue, Set, Difference). singleton(.(','(','(X29, ','(X, X30)), X31), []), X). singleton(.(','(','(_A, ','(V, _B)), _C), Vs), X) :- ','(singleton(Vs, Y), merge(V, Y, X)). merge([], D, D) :- !. merge(D, [], D) :- !. merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(@<(A, D), ','(!, merge(As, .(D, Ds), Bs))). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(==(A, D), ','(!, merge(As, Ds, Bs))). merge(As, .(D, Ds), .(D, Bs)) :- merge(As, Ds, Bs). intersect([], X32, []) :- !. intersect(X33, [], []) :- !. intersect(.(A, As), .(D, Ds), Out) :- ','(@<(A, D), ','(!, intersect(As, .(D, Ds), Out))). intersect(.(A, As), .(D, Ds), .(A, Out)) :- ','(==(A, D), ','(!, intersect(As, Ds, Out))). intersect(As, .(_N, Ds), Out) :- intersect(As, Ds, Out). numbervars_2(X, N, N1) :- ','(var(X), ','(isPlus(N, succ(zero), U), ','(=(N1, U), ','(!, =(X, '$VAR'(N, _L)))))). numbervars_2(A, N, N) :- ','(atomic(A), !). numbervars_2('$VAR'(X34, X35), N, N). numbervars_2(F, N, N1) :- numbervars_2(zero, F, N, N1). numbervars_2(I, F, N, N1) :- ','(isPlus(I, succ(zero), U), ','(=(I1, U), ','(arg(I1, F, X), ','(numbervars_2(X, N, N0), ','(!, numbervars_2(I1, F, N0, N1)))))). numbervars_2(X36, X37, N, N). un_number_vars(clause(Head, Body), clause(H, B), X) :- ','(un_number_vars_2(Head, H, X), ','(un_number_vars_2(Body, B, X), !)). un_number_vars(directive(X), directive(X), X38). un_number_vars_2('$VAR'(X39, X), X, others) :- !. un_number_vars_2('$VAR'(X, X40), '$VAR'(X), cge) :- !. un_number_vars_2(X, X, X41) :- ','(atomic(X), !). un_number_vars_2(F, F1, Y) :- ','(functor(F, Func, _N), ','(un_number_vars_2(zero, F, List, Y), =..(F1, .(Func, List)))). un_number_vars_2(I, F, .(X1, Tail), Y) :- ','(isPlus(I, succ(zero), U), ','(=(I1, U), ','(arg(I1, F, X), ','(un_number_vars_2(X, X1, Y), ','(!, un_number_vars_2(I1, F, Tail, Y)))))). un_number_vars_2(X42, X43, [], X44). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ;(','(=(ResultX, zero), =(Result, zero)), ','(check_if_cge(Y, ResultY), ','(isTimes(ResultX, ResultY, U), =(Result, U))))). check_if_cge('=>'(X45, X46), zero). check_if_cge('&'(X47, X48), zero). check_if_cge(X49, succ(zero)). builtin(/(fail, zero)). builtin(/(false, zero)). builtin(/(otherwise, zero)). builtin(/(repeat, zero)). builtin(/(true, zero)). builtin(/(version, zero)). builtin(/(version, succ(zero))). builtin(/(!, zero)). builtin(/(abolish, succ(zero))). builtin(/(abolish, succ(succ(zero)))). builtin(/(abort, zero)). builtin(/(assert, succ(zero))). builtin(/(assert, succ(succ(zero)))). builtin(/(asserta, succ(zero))). builtin(/(asserta, succ(succ(zero)))). builtin(/(assertz, succ(zero))). builtin(/(assertz, succ(succ(zero)))). builtin(/(bagof, succ(succ(succ(zero))))). builtin(/(break, zero)). builtin(/(call, succ(zero))). builtin(/(close, succ(zero))). builtin(/(compile, succ(zero))). builtin(/(consult, succ(zero))). builtin(/(debug, zero)). builtin(/(debugging, zero)). builtin(/(ensure_loaded, succ(zero))). builtin(/(erase, succ(zero))). builtin(/(fileerrors, zero)). builtin(/(flush_output, succ(zero))). builtin(/(foreign, succ(succ(zero)))). builtin(/(foreign, succ(succ(succ(zero))))). builtin(/(foreign_file, succ(succ(zero)))). builtin(/(get, succ(zero))). builtin(/(get, succ(succ(zero)))). builtin(/(get0, succ(zero))). builtin(/(get0, succ(succ(zero)))). builtin(/(halt, zero)). builtin(/(incore, succ(zero))). builtin(/(load_foreign_files, succ(succ(zero)))). builtin(/(module, succ(zero))). builtin(/(nofileerrors, zero)). builtin(/(no_style_check, succ(zero))). builtin(/(open, succ(succ(succ(zero))))). builtin(/(open_null_stream, succ(zero))). builtin(/(read, succ(zero))). builtin(/(read, succ(succ(zero)))). builtin(/(recorda, succ(succ(succ(zero))))). builtin(/(recorded, succ(succ(succ(zero))))). builtin(/(recordz, succ(succ(succ(zero))))). builtin(/(reinitialise, zero)). builtin(/(restore, succ(zero))). builtin(/(restore, succ(succ(zero)))). builtin(/(retract, succ(zero))). builtin(/(retractall, succ(zero))). builtin(/(save, succ(zero))). builtin(/(save, succ(succ(zero)))). builtin(/(save_program, succ(zero))). builtin(/(see, succ(zero))). builtin(/(seeing, succ(zero))). builtin(/(seen, zero)). builtin(/(set_input, succ(zero))). builtin(/(set_output, succ(zero))). builtin(/(setof, succ(succ(succ(zero))))). builtin(/(skip, succ(zero))). builtin(/(skip, succ(succ(zero)))). builtin(/(style_check, succ(zero))). builtin(/(ttyget, succ(zero))). builtin(/(ttyget0, succ(zero))). builtin(/(ttyskip, succ(zero))). builtin(/(unknown, succ(succ(zero)))). builtin(/(use_module, succ(zero))). builtin(/(use_module, succ(succ(zero)))). builtin(/('^', succ(succ(zero)))). builtin(/(\+, succ(zero))). go(N) :- ','(prepare(N, ManyClauses), ','(analyze_all(ManyClauses, Result), conclude(Result))). time(A) :- statistics(runtime, .(_N, .(A, []))). prepare(N, ManyClauses) :- ','(data(Clauses), ','(mlist(N, Clauses, ManyClauses), time(_N))). conclude(Result) :- ','(time(T), ','(write('Executed in '), ','(write(T), ','(write(' mS.'), ','(nl, ','(length(Result, L), ','(write('Length = '), ','(write(L), nl)))))))). mlist(zero, _1, []). mlist(X, SList, LList) :- ','(isMinus(X, succ(zero), U), ','(=(Y, U), ','(mlist(Y, SList, MList), ','(copy_term(SList, NewSlist), append(NewSlist, MList, LList))))). data(.(clause(f(X, Z), ','(p(X, Y), q(Y, Z))), .(clause(f(X1, Y1, Z1), ','(p(X1, Y1), q(Y1, Z1))), .(clause(f(X2, Y2, Z2), ','(is(Y2, +(X2, Z2)), ','(p(X2, Y2), ','(r(Y2), q(Y2, Z2))))), .(clause(f(X3, Y3, Z3), ','(var(X3), ','(f(X3), ','(q(Y3), ','(r(X3, Y3, Z3), q(X3)))))), .(clause(f(X4, Y4, Z4), ','(r(X4, Y4), ','(p(X4, Y4), ','(p(W4), ','(s(X4), q(Y4, W4, Z4)))))), [])))))). 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). Query: analyze_all(g,a) ---------------------------------------- (13) CutEliminatorProof (SOUND) Eliminated all cuts by simply ignoring them[PROLOG]. ---------------------------------------- (14) Obligation: Clauses: analyze_all(.(X, Y), .(X1, Y1)) :- ','(analyze(X, X1), analyze_all(Y, Y1)). analyze_all([], []). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ;(','(=(Body, true), =(NewSource, Source)), ','(=(I, []), ','(=(G, []), ','(rewrite_3(Source, New_Source, I, G, _Y), un_number_vars(New_Source, NewSource, others)))))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), ;(','(=(Result, zero), =(P, B)), rewrite(clause(H, B), clause(H, P), I, G, Info))). rewrite(clause(H, B), clause(H, P), I, G, Info) :- ','(numbervars_2(H, zero, Lhv), ','(collect_info(B, Info, Lhv, _X, _Y), add_annotations(Info, P, I, G))). add_annotations([], [], X5, X6). add_annotations(.(I, Is), .(P, Ps), Indep, Gnd) :- ','(add_annotations(I, P, Indep, Gnd), add_annotations(Is, Ps, Indep, Gnd)). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ;(;(','(var(Code), =(Phrase, PCode)), ','(=(Vars, []), =(Phrase, Code))), =(Phrase, ','(PCode, Code))))). collect_info(;(A, B), ','([], ','(sequential, ;(A, B))), Cin, Cout, _X) :- ','(collect_info(A, _Y, Cin, C, _Z), collect_info(B, _N, C, Cout, _M)). collect_info(','(A, B), and(Ia, Ib), Cin, Cout, _X) :- ','(collect_info(A, Ia, Cin, C, _Y), collect_info(B, Ib, C, Cout, _Z)). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ;(;(','(functor(A, F, Arity), ','(builtin(/(F, Arity)), =(CInfo, sequential))), ','(\==(NewVars, []), =(CInfo, suspect))), true)). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ;(;(','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(;(;(','(var(Ycode), =(Conjuncts, ','(Xcode, CGE))), ','(=(YVars, []), =(Conjuncts, ','(Xcode, Ycode)))), =(Conjuncts, ','(Xcode, ','(CGE, Ycode)))), ','(=(BagofVars, []), =(Type, sequential))))), ','(=(Ytype, sequential), ','(=(Conjuncts, Ycode), ','(=(BagofVars, XVars), =(Type, Xtype))))), ','(=(Conjuncts, Ycode), ','(append(XVars, YVars, BagofVars), =(Type, Xtype)))))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ;(','(==(T, sequential), ','(=(Type, T), ','(=(Vars, []), =(This_term, Term)))), ','(collect_vars(Term, Vs), ','(=(Type, par), =(Vars, .(','(','(T, ','(N, Term)), Vs), []))))). make_CGE_phrase(sequential, Code, X7, Code, X8, X9). make_CGE_phrase(_X, _Y, VarList, NewCode, I, G) :- get_phrase(VarList, NewCode, I, G). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), ;(','(','(','(=(X, L), =(X1, succ(zero))), isGreater(X, X1)), ','(eliminate_suspect_code(VarList, Rem, Vs, I, G), get_CGE_2(Vs, I, G, Code, Rem))), =(VarList, .(','(','(_X, ','(_Y, Code)), _Z), [])))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), ;(','(found(FVars, .(Last_goal, [])), ','(=(Last_goal, ','(','(_L, ','(_M, SeqCode)), _N)), =(ParCode, .(This_goal, [])))), =(ParCode, .(This_goal, .(Last_goal, []))))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ;(','(found(FVars, PCode), ','(get_CGE_2(PCode, I, G, Code, SCode), =(ParCode, .(This_goal, [])))), ','(=(ParCode, .(This_goal, PCode)), =(Code, SCode))))). found([], _R) :- fail. found(.(H, T), Next_calls) :- ;(find_var(Next_calls, H), found(T, Next_calls)). find_var([], _R) :- fail. find_var(.(','(_R, NextCall), Others), V) :- ;(member(V, NextCall), find_var(Others, V)). get_CGE_2(.(','(','(_X, ','(_Y, Goal)), _Z), []), _W, _M, Goal, Others) :- var(Others). get_CGE_2(.(','(','(X10, ','(X11, Goal)), X12), []), X13, X14, ','(Goal, Others), Others). get_CGE_2(Vs, I, G, Code, Rem) :- ','(get_conds(Vs, Conds, I, G), ','(make_norml_2(Vs, Parallel), babel_2(Conds, Parallel, Rem, Code))). get_conds(VARS, Y, I, G) :- ','(do_intersect(VARS, GS), ','(subtract(GS, G, Gnd), ','(singleton(VARS, VOIDS), ','(reduce_set(VARS, Gnd, VOIDS, I, RSET), ','(produce_tuples(RSET, Indep), get_text(Gnd, Indep, Y)))))). '$simplify_unconditional_cges'(off). babel_2(Conds, Parallel, C, Code) :- ','(;(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), =(Pcode, Parallel))), =..(Pcode, .('=>', .(Conds, .(Parallel, []))))), ;(','(var(C), =(Code, Pcode)), =(Code, ','(Pcode, C)))). reduce_set([], _X, _Y, _Z, []). reduce_set(.(','(Info, V), Vs), Gnd, VOIDS, Indep, .(','(Info, Rset), Rs)) :- ','(reduce_set(Vs, Gnd, VOIDS, Indep, Rs), ','(subtract(V, Gnd, Rg), ','(subtract(Rg, VOIDS, Rv), subtract(Rv, Indep, Rset)))). produce_tuples([], []). produce_tuples(.(','(_N, V), Vs), Tuples) :- ','(produce_tuples(Vs, Ts), ','(pair(Vs, V, Ps), merge(Ps, Ts, Tuples))). pair([], X15, []). pair(.(','(_N, L), Ls), Vs, Tuples) :- ','(pair(Ls, Vs, Ps), ','(tuple(L, Vs, Ts), merge(Ts, Ps, Tuples))). tuple([], X16, []). tuple(X17, [], []). tuple(List, .(L, Ls), Tuples) :- ','(tuple(List, Ls, T1), ','(tuple(List, L, T2), merge(T1, T2, Tuples))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(;(','(@<(E, L), =(Pair, .(.(E, .(L, [])), []))), =(Pair, .(.(L, .(E, [])), []))), merge(Pair, T1, Tuples))). make_norml(.(','(','(X18, ','(X19, T)), X20), []), T). make_norml(.(','(','(_X, ','(_Y, T)), _Z), Nxt), ','(T, Nc)) :- make_norml(Nxt, Nc). make_norml_2(.(','(','(X21, ','(X22, T)), X23), []), T). make_norml_2(.(','(','(_X, ','(_Y, T)), _Z), Nxt), '&'(T, Nc)) :- make_norml_2(Nxt, Nc). do_intersect([], []). do_intersect(.(','(_X, S1), .(','(_Y, S2), [])), IS) :- intersect(S1, S2, IS). do_intersect(.(S1, .(S2, Ss)), IS) :- ','(do_intersect(.(S2, Ss), IS1), ','(do_intersect(.(S1, Ss), IS2), ','(do_intersect(.(S1, .(S2, [])), IS3), ','(merge(IS1, IS2, T1), merge(IS3, T1, IS))))). get_text([], [], true). get_text([], X, indep(X)). get_text(X, [], ground(X)). get_text(X, Y, ','(ground(X), indep(Y))). find_vars(T, Vars, Cin, Cout) :- ','(numbervars_2(T, Cin, Cout), ','(isMinus(Cout, Cin, U), ','(=(NewVars, U), ','(length(Vars, NewVars), numbervars_2(Vars, Cin, _N))))). collect_vars(X, .(X, [])) :- var(X). collect_vars('$VAR'(X), .('$VAR'(X), [])). collect_vars('$VAR'(X, Y), .('$VAR'(X, Y), [])). collect_vars(Term, Vars) :- ','(functor(Term, _N, A), ','(go_inside(A, Term, Vs), sort(Vs, Vars))). collect_vars(X24, []). go_inside(zero, X25, []). go_inside(N, T, Bag) :- ','(isMinus(N, succ(zero), U), ','(=(Nth, U), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ;(;(','(var(ARG), =(Bag, .(ARG, C))), ','(atomic(ARG), =(Bag, C))), ','(collect_vars(ARG, Cs), append(Cs, C, Bag))))))). append([], L, L). append(.(H, T), L, .(H, R)) :- append(T, L, R). member(Element, .(Element, X26)). member(Element, .(_N, Rest)) :- member(Element, Rest). memberchk(Element, .(Element, X27)). memberchk(Element, .(_N, Rest)) :- memberchk(Element, Rest). subtract([], X28, []). subtract(.(Element, Residue), Set, Difference) :- ','(memberchk(Element, Set), subtract(Residue, Set, Difference)). subtract(.(Element, Residue), Set, .(Element, Difference)) :- subtract(Residue, Set, Difference). singleton(.(','(','(X29, ','(X, X30)), X31), []), X). singleton(.(','(','(_A, ','(V, _B)), _C), Vs), X) :- ','(singleton(Vs, Y), merge(V, Y, X)). merge([], D, D). merge(D, [], D). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(@<(A, D), merge(As, .(D, Ds), Bs)). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(==(A, D), merge(As, Ds, Bs)). merge(As, .(D, Ds), .(D, Bs)) :- merge(As, Ds, Bs). intersect([], X32, []). intersect(X33, [], []). intersect(.(A, As), .(D, Ds), Out) :- ','(@<(A, D), intersect(As, .(D, Ds), Out)). intersect(.(A, As), .(D, Ds), .(A, Out)) :- ','(==(A, D), intersect(As, Ds, Out)). intersect(As, .(_N, Ds), Out) :- intersect(As, Ds, Out). numbervars_2(X, N, N1) :- ','(var(X), ','(isPlus(N, succ(zero), U), ','(=(N1, U), =(X, '$VAR'(N, _L))))). numbervars_2(A, N, N) :- atomic(A). numbervars_2('$VAR'(X34, X35), N, N). numbervars_2(F, N, N1) :- numbervars_2(zero, F, N, N1). numbervars_2(I, F, N, N1) :- ','(isPlus(I, succ(zero), U), ','(=(I1, U), ','(arg(I1, F, X), ','(numbervars_2(X, N, N0), numbervars_2(I1, F, N0, N1))))). numbervars_2(X36, X37, N, N). un_number_vars(clause(Head, Body), clause(H, B), X) :- ','(un_number_vars_2(Head, H, X), un_number_vars_2(Body, B, X)). un_number_vars(directive(X), directive(X), X38). un_number_vars_2('$VAR'(X39, X), X, others). un_number_vars_2('$VAR'(X, X40), '$VAR'(X), cge). un_number_vars_2(X, X, X41) :- atomic(X). un_number_vars_2(F, F1, Y) :- ','(functor(F, Func, _N), ','(un_number_vars_2(zero, F, List, Y), =..(F1, .(Func, List)))). un_number_vars_2(I, F, .(X1, Tail), Y) :- ','(isPlus(I, succ(zero), U), ','(=(I1, U), ','(arg(I1, F, X), ','(un_number_vars_2(X, X1, Y), un_number_vars_2(I1, F, Tail, Y))))). un_number_vars_2(X42, X43, [], X44). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ;(','(=(ResultX, zero), =(Result, zero)), ','(check_if_cge(Y, ResultY), ','(isTimes(ResultX, ResultY, U), =(Result, U))))). check_if_cge('=>'(X45, X46), zero). check_if_cge('&'(X47, X48), zero). check_if_cge(X49, succ(zero)). builtin(/(fail, zero)). builtin(/(false, zero)). builtin(/(otherwise, zero)). builtin(/(repeat, zero)). builtin(/(true, zero)). builtin(/(version, zero)). builtin(/(version, succ(zero))). builtin(/(!, zero)). builtin(/(abolish, succ(zero))). builtin(/(abolish, succ(succ(zero)))). builtin(/(abort, zero)). builtin(/(assert, succ(zero))). builtin(/(assert, succ(succ(zero)))). builtin(/(asserta, succ(zero))). builtin(/(asserta, succ(succ(zero)))). builtin(/(assertz, succ(zero))). builtin(/(assertz, succ(succ(zero)))). builtin(/(bagof, succ(succ(succ(zero))))). builtin(/(break, zero)). builtin(/(call, succ(zero))). builtin(/(close, succ(zero))). builtin(/(compile, succ(zero))). builtin(/(consult, succ(zero))). builtin(/(debug, zero)). builtin(/(debugging, zero)). builtin(/(ensure_loaded, succ(zero))). builtin(/(erase, succ(zero))). builtin(/(fileerrors, zero)). builtin(/(flush_output, succ(zero))). builtin(/(foreign, succ(succ(zero)))). builtin(/(foreign, succ(succ(succ(zero))))). builtin(/(foreign_file, succ(succ(zero)))). builtin(/(get, succ(zero))). builtin(/(get, succ(succ(zero)))). builtin(/(get0, succ(zero))). builtin(/(get0, succ(succ(zero)))). builtin(/(halt, zero)). builtin(/(incore, succ(zero))). builtin(/(load_foreign_files, succ(succ(zero)))). builtin(/(module, succ(zero))). builtin(/(nofileerrors, zero)). builtin(/(no_style_check, succ(zero))). builtin(/(open, succ(succ(succ(zero))))). builtin(/(open_null_stream, succ(zero))). builtin(/(read, succ(zero))). builtin(/(read, succ(succ(zero)))). builtin(/(recorda, succ(succ(succ(zero))))). builtin(/(recorded, succ(succ(succ(zero))))). builtin(/(recordz, succ(succ(succ(zero))))). builtin(/(reinitialise, zero)). builtin(/(restore, succ(zero))). builtin(/(restore, succ(succ(zero)))). builtin(/(retract, succ(zero))). builtin(/(retractall, succ(zero))). builtin(/(save, succ(zero))). builtin(/(save, succ(succ(zero)))). builtin(/(save_program, succ(zero))). builtin(/(see, succ(zero))). builtin(/(seeing, succ(zero))). builtin(/(seen, zero)). builtin(/(set_input, succ(zero))). builtin(/(set_output, succ(zero))). builtin(/(setof, succ(succ(succ(zero))))). builtin(/(skip, succ(zero))). builtin(/(skip, succ(succ(zero)))). builtin(/(style_check, succ(zero))). builtin(/(ttyget, succ(zero))). builtin(/(ttyget0, succ(zero))). builtin(/(ttyskip, succ(zero))). builtin(/(unknown, succ(succ(zero)))). builtin(/(use_module, succ(zero))). builtin(/(use_module, succ(succ(zero)))). builtin(/('^', succ(succ(zero)))). builtin(/(\+, succ(zero))). go(N) :- ','(prepare(N, ManyClauses), ','(analyze_all(ManyClauses, Result), conclude(Result))). time(A) :- statistics(runtime, .(_N, .(A, []))). prepare(N, ManyClauses) :- ','(data(Clauses), ','(mlist(N, Clauses, ManyClauses), time(_N))). conclude(Result) :- ','(time(T), ','(write('Executed in '), ','(write(T), ','(write(' mS.'), ','(nl, ','(length(Result, L), ','(write('Length = '), ','(write(L), nl)))))))). mlist(zero, _1, []). mlist(X, SList, LList) :- ','(isMinus(X, succ(zero), U), ','(=(Y, U), ','(mlist(Y, SList, MList), ','(copy_term(SList, NewSlist), append(NewSlist, MList, LList))))). data(.(clause(f(X, Z), ','(p(X, Y), q(Y, Z))), .(clause(f(X1, Y1, Z1), ','(p(X1, Y1), q(Y1, Z1))), .(clause(f(X2, Y2, Z2), ','(is(Y2, +(X2, Z2)), ','(p(X2, Y2), ','(r(Y2), q(Y2, Z2))))), .(clause(f(X3, Y3, Z3), ','(var(X3), ','(f(X3), ','(q(Y3), ','(r(X3, Y3, Z3), q(X3)))))), .(clause(f(X4, Y4, Z4), ','(r(X4, Y4), ','(p(X4, Y4), ','(p(W4), ','(s(X4), q(Y4, W4, Z4)))))), [])))))). 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). Query: analyze_all(g,a) ---------------------------------------- (15) FailTransformerProof (EQUIVALENT) Added clauses for the built-in fail predicate [PROLOG]. ---------------------------------------- (16) Obligation: Clauses: analyze_all(.(X, Y), .(X1, Y1)) :- ','(analyze(X, X1), analyze_all(Y, Y1)). analyze_all([], []). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ;(','(=(Body, true), =(NewSource, Source)), ','(=(I, []), ','(=(G, []), ','(rewrite_3(Source, New_Source, I, G, _Y), un_number_vars(New_Source, NewSource, others)))))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), ;(','(=(Result, zero), =(P, B)), rewrite(clause(H, B), clause(H, P), I, G, Info))). rewrite(clause(H, B), clause(H, P), I, G, Info) :- ','(numbervars_2(H, zero, Lhv), ','(collect_info(B, Info, Lhv, _X, _Y), add_annotations(Info, P, I, G))). add_annotations([], [], X5, X6). add_annotations(.(I, Is), .(P, Ps), Indep, Gnd) :- ','(add_annotations(I, P, Indep, Gnd), add_annotations(Is, Ps, Indep, Gnd)). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ;(;(','(var(Code), =(Phrase, PCode)), ','(=(Vars, []), =(Phrase, Code))), =(Phrase, ','(PCode, Code))))). collect_info(;(A, B), ','([], ','(sequential, ;(A, B))), Cin, Cout, _X) :- ','(collect_info(A, _Y, Cin, C, _Z), collect_info(B, _N, C, Cout, _M)). collect_info(','(A, B), and(Ia, Ib), Cin, Cout, _X) :- ','(collect_info(A, Ia, Cin, C, _Y), collect_info(B, Ib, C, Cout, _Z)). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ;(;(','(functor(A, F, Arity), ','(builtin(/(F, Arity)), =(CInfo, sequential))), ','(\==(NewVars, []), =(CInfo, suspect))), true)). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ;(;(','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(;(;(','(var(Ycode), =(Conjuncts, ','(Xcode, CGE))), ','(=(YVars, []), =(Conjuncts, ','(Xcode, Ycode)))), =(Conjuncts, ','(Xcode, ','(CGE, Ycode)))), ','(=(BagofVars, []), =(Type, sequential))))), ','(=(Ytype, sequential), ','(=(Conjuncts, Ycode), ','(=(BagofVars, XVars), =(Type, Xtype))))), ','(=(Conjuncts, Ycode), ','(append(XVars, YVars, BagofVars), =(Type, Xtype)))))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ;(','(==(T, sequential), ','(=(Type, T), ','(=(Vars, []), =(This_term, Term)))), ','(collect_vars(Term, Vs), ','(=(Type, par), =(Vars, .(','(','(T, ','(N, Term)), Vs), []))))). make_CGE_phrase(sequential, Code, X7, Code, X8, X9). make_CGE_phrase(_X, _Y, VarList, NewCode, I, G) :- get_phrase(VarList, NewCode, I, G). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), ;(','(','(','(=(X, L), =(X1, succ(zero))), isGreater(X, X1)), ','(eliminate_suspect_code(VarList, Rem, Vs, I, G), get_CGE_2(Vs, I, G, Code, Rem))), =(VarList, .(','(','(_X, ','(_Y, Code)), _Z), [])))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), ;(','(found(FVars, .(Last_goal, [])), ','(=(Last_goal, ','(','(_L, ','(_M, SeqCode)), _N)), =(ParCode, .(This_goal, [])))), =(ParCode, .(This_goal, .(Last_goal, []))))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ;(','(found(FVars, PCode), ','(get_CGE_2(PCode, I, G, Code, SCode), =(ParCode, .(This_goal, [])))), ','(=(ParCode, .(This_goal, PCode)), =(Code, SCode))))). found([], _R) :- fail. found(.(H, T), Next_calls) :- ;(find_var(Next_calls, H), found(T, Next_calls)). find_var([], _R) :- fail. find_var(.(','(_R, NextCall), Others), V) :- ;(member(V, NextCall), find_var(Others, V)). get_CGE_2(.(','(','(_X, ','(_Y, Goal)), _Z), []), _W, _M, Goal, Others) :- var(Others). get_CGE_2(.(','(','(X10, ','(X11, Goal)), X12), []), X13, X14, ','(Goal, Others), Others). get_CGE_2(Vs, I, G, Code, Rem) :- ','(get_conds(Vs, Conds, I, G), ','(make_norml_2(Vs, Parallel), babel_2(Conds, Parallel, Rem, Code))). get_conds(VARS, Y, I, G) :- ','(do_intersect(VARS, GS), ','(subtract(GS, G, Gnd), ','(singleton(VARS, VOIDS), ','(reduce_set(VARS, Gnd, VOIDS, I, RSET), ','(produce_tuples(RSET, Indep), get_text(Gnd, Indep, Y)))))). '$simplify_unconditional_cges'(off). babel_2(Conds, Parallel, C, Code) :- ','(;(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), =(Pcode, Parallel))), =..(Pcode, .('=>', .(Conds, .(Parallel, []))))), ;(','(var(C), =(Code, Pcode)), =(Code, ','(Pcode, C)))). reduce_set([], _X, _Y, _Z, []). reduce_set(.(','(Info, V), Vs), Gnd, VOIDS, Indep, .(','(Info, Rset), Rs)) :- ','(reduce_set(Vs, Gnd, VOIDS, Indep, Rs), ','(subtract(V, Gnd, Rg), ','(subtract(Rg, VOIDS, Rv), subtract(Rv, Indep, Rset)))). produce_tuples([], []). produce_tuples(.(','(_N, V), Vs), Tuples) :- ','(produce_tuples(Vs, Ts), ','(pair(Vs, V, Ps), merge(Ps, Ts, Tuples))). pair([], X15, []). pair(.(','(_N, L), Ls), Vs, Tuples) :- ','(pair(Ls, Vs, Ps), ','(tuple(L, Vs, Ts), merge(Ts, Ps, Tuples))). tuple([], X16, []). tuple(X17, [], []). tuple(List, .(L, Ls), Tuples) :- ','(tuple(List, Ls, T1), ','(tuple(List, L, T2), merge(T1, T2, Tuples))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(;(','(@<(E, L), =(Pair, .(.(E, .(L, [])), []))), =(Pair, .(.(L, .(E, [])), []))), merge(Pair, T1, Tuples))). make_norml(.(','(','(X18, ','(X19, T)), X20), []), T). make_norml(.(','(','(_X, ','(_Y, T)), _Z), Nxt), ','(T, Nc)) :- make_norml(Nxt, Nc). make_norml_2(.(','(','(X21, ','(X22, T)), X23), []), T). make_norml_2(.(','(','(_X, ','(_Y, T)), _Z), Nxt), '&'(T, Nc)) :- make_norml_2(Nxt, Nc). do_intersect([], []). do_intersect(.(','(_X, S1), .(','(_Y, S2), [])), IS) :- intersect(S1, S2, IS). do_intersect(.(S1, .(S2, Ss)), IS) :- ','(do_intersect(.(S2, Ss), IS1), ','(do_intersect(.(S1, Ss), IS2), ','(do_intersect(.(S1, .(S2, [])), IS3), ','(merge(IS1, IS2, T1), merge(IS3, T1, IS))))). get_text([], [], true). get_text([], X, indep(X)). get_text(X, [], ground(X)). get_text(X, Y, ','(ground(X), indep(Y))). find_vars(T, Vars, Cin, Cout) :- ','(numbervars_2(T, Cin, Cout), ','(isMinus(Cout, Cin, U), ','(=(NewVars, U), ','(length(Vars, NewVars), numbervars_2(Vars, Cin, _N))))). collect_vars(X, .(X, [])) :- var(X). collect_vars('$VAR'(X), .('$VAR'(X), [])). collect_vars('$VAR'(X, Y), .('$VAR'(X, Y), [])). collect_vars(Term, Vars) :- ','(functor(Term, _N, A), ','(go_inside(A, Term, Vs), sort(Vs, Vars))). collect_vars(X24, []). go_inside(zero, X25, []). go_inside(N, T, Bag) :- ','(isMinus(N, succ(zero), U), ','(=(Nth, U), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ;(;(','(var(ARG), =(Bag, .(ARG, C))), ','(atomic(ARG), =(Bag, C))), ','(collect_vars(ARG, Cs), append(Cs, C, Bag))))))). append([], L, L). append(.(H, T), L, .(H, R)) :- append(T, L, R). member(Element, .(Element, X26)). member(Element, .(_N, Rest)) :- member(Element, Rest). memberchk(Element, .(Element, X27)). memberchk(Element, .(_N, Rest)) :- memberchk(Element, Rest). subtract([], X28, []). subtract(.(Element, Residue), Set, Difference) :- ','(memberchk(Element, Set), subtract(Residue, Set, Difference)). subtract(.(Element, Residue), Set, .(Element, Difference)) :- subtract(Residue, Set, Difference). singleton(.(','(','(X29, ','(X, X30)), X31), []), X). singleton(.(','(','(_A, ','(V, _B)), _C), Vs), X) :- ','(singleton(Vs, Y), merge(V, Y, X)). merge([], D, D). merge(D, [], D). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(@<(A, D), merge(As, .(D, Ds), Bs)). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(==(A, D), merge(As, Ds, Bs)). merge(As, .(D, Ds), .(D, Bs)) :- merge(As, Ds, Bs). intersect([], X32, []). intersect(X33, [], []). intersect(.(A, As), .(D, Ds), Out) :- ','(@<(A, D), intersect(As, .(D, Ds), Out)). intersect(.(A, As), .(D, Ds), .(A, Out)) :- ','(==(A, D), intersect(As, Ds, Out)). intersect(As, .(_N, Ds), Out) :- intersect(As, Ds, Out). numbervars_2(X, N, N1) :- ','(var(X), ','(isPlus(N, succ(zero), U), ','(=(N1, U), =(X, '$VAR'(N, _L))))). numbervars_2(A, N, N) :- atomic(A). numbervars_2('$VAR'(X34, X35), N, N). numbervars_2(F, N, N1) :- numbervars_2(zero, F, N, N1). numbervars_2(I, F, N, N1) :- ','(isPlus(I, succ(zero), U), ','(=(I1, U), ','(arg(I1, F, X), ','(numbervars_2(X, N, N0), numbervars_2(I1, F, N0, N1))))). numbervars_2(X36, X37, N, N). un_number_vars(clause(Head, Body), clause(H, B), X) :- ','(un_number_vars_2(Head, H, X), un_number_vars_2(Body, B, X)). un_number_vars(directive(X), directive(X), X38). un_number_vars_2('$VAR'(X39, X), X, others). un_number_vars_2('$VAR'(X, X40), '$VAR'(X), cge). un_number_vars_2(X, X, X41) :- atomic(X). un_number_vars_2(F, F1, Y) :- ','(functor(F, Func, _N), ','(un_number_vars_2(zero, F, List, Y), =..(F1, .(Func, List)))). un_number_vars_2(I, F, .(X1, Tail), Y) :- ','(isPlus(I, succ(zero), U), ','(=(I1, U), ','(arg(I1, F, X), ','(un_number_vars_2(X, X1, Y), un_number_vars_2(I1, F, Tail, Y))))). un_number_vars_2(X42, X43, [], X44). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ;(','(=(ResultX, zero), =(Result, zero)), ','(check_if_cge(Y, ResultY), ','(isTimes(ResultX, ResultY, U), =(Result, U))))). check_if_cge('=>'(X45, X46), zero). check_if_cge('&'(X47, X48), zero). check_if_cge(X49, succ(zero)). builtin(/(fail, zero)). builtin(/(false, zero)). builtin(/(otherwise, zero)). builtin(/(repeat, zero)). builtin(/(true, zero)). builtin(/(version, zero)). builtin(/(version, succ(zero))). builtin(/(!, zero)). builtin(/(abolish, succ(zero))). builtin(/(abolish, succ(succ(zero)))). builtin(/(abort, zero)). builtin(/(assert, succ(zero))). builtin(/(assert, succ(succ(zero)))). builtin(/(asserta, succ(zero))). builtin(/(asserta, succ(succ(zero)))). builtin(/(assertz, succ(zero))). builtin(/(assertz, succ(succ(zero)))). builtin(/(bagof, succ(succ(succ(zero))))). builtin(/(break, zero)). builtin(/(call, succ(zero))). builtin(/(close, succ(zero))). builtin(/(compile, succ(zero))). builtin(/(consult, succ(zero))). builtin(/(debug, zero)). builtin(/(debugging, zero)). builtin(/(ensure_loaded, succ(zero))). builtin(/(erase, succ(zero))). builtin(/(fileerrors, zero)). builtin(/(flush_output, succ(zero))). builtin(/(foreign, succ(succ(zero)))). builtin(/(foreign, succ(succ(succ(zero))))). builtin(/(foreign_file, succ(succ(zero)))). builtin(/(get, succ(zero))). builtin(/(get, succ(succ(zero)))). builtin(/(get0, succ(zero))). builtin(/(get0, succ(succ(zero)))). builtin(/(halt, zero)). builtin(/(incore, succ(zero))). builtin(/(load_foreign_files, succ(succ(zero)))). builtin(/(module, succ(zero))). builtin(/(nofileerrors, zero)). builtin(/(no_style_check, succ(zero))). builtin(/(open, succ(succ(succ(zero))))). builtin(/(open_null_stream, succ(zero))). builtin(/(read, succ(zero))). builtin(/(read, succ(succ(zero)))). builtin(/(recorda, succ(succ(succ(zero))))). builtin(/(recorded, succ(succ(succ(zero))))). builtin(/(recordz, succ(succ(succ(zero))))). builtin(/(reinitialise, zero)). builtin(/(restore, succ(zero))). builtin(/(restore, succ(succ(zero)))). builtin(/(retract, succ(zero))). builtin(/(retractall, succ(zero))). builtin(/(save, succ(zero))). builtin(/(save, succ(succ(zero)))). builtin(/(save_program, succ(zero))). builtin(/(see, succ(zero))). builtin(/(seeing, succ(zero))). builtin(/(seen, zero)). builtin(/(set_input, succ(zero))). builtin(/(set_output, succ(zero))). builtin(/(setof, succ(succ(succ(zero))))). builtin(/(skip, succ(zero))). builtin(/(skip, succ(succ(zero)))). builtin(/(style_check, succ(zero))). builtin(/(ttyget, succ(zero))). builtin(/(ttyget0, succ(zero))). builtin(/(ttyskip, succ(zero))). builtin(/(unknown, succ(succ(zero)))). builtin(/(use_module, succ(zero))). builtin(/(use_module, succ(succ(zero)))). builtin(/('^', succ(succ(zero)))). builtin(/(\+, succ(zero))). go(N) :- ','(prepare(N, ManyClauses), ','(analyze_all(ManyClauses, Result), conclude(Result))). time(A) :- statistics(runtime, .(_N, .(A, []))). prepare(N, ManyClauses) :- ','(data(Clauses), ','(mlist(N, Clauses, ManyClauses), time(_N))). conclude(Result) :- ','(time(T), ','(write('Executed in '), ','(write(T), ','(write(' mS.'), ','(nl, ','(length(Result, L), ','(write('Length = '), ','(write(L), nl)))))))). mlist(zero, _1, []). mlist(X, SList, LList) :- ','(isMinus(X, succ(zero), U), ','(=(Y, U), ','(mlist(Y, SList, MList), ','(copy_term(SList, NewSlist), append(NewSlist, MList, LList))))). data(.(clause(f(X, Z), ','(p(X, Y), q(Y, Z))), .(clause(f(X1, Y1, Z1), ','(p(X1, Y1), q(Y1, Z1))), .(clause(f(X2, Y2, Z2), ','(is(Y2, +(X2, Z2)), ','(p(X2, Y2), ','(r(Y2), q(Y2, Z2))))), .(clause(f(X3, Y3, Z3), ','(var(X3), ','(f(X3), ','(q(Y3), ','(r(X3, Y3, Z3), q(X3)))))), .(clause(f(X4, Y4, Z4), ','(r(X4, Y4), ','(p(X4, Y4), ','(p(W4), ','(s(X4), q(Y4, W4, Z4)))))), [])))))). 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). fail :- failure(a). failure(b). Query: analyze_all(g,a) ---------------------------------------- (17) UnifyTransformerProof (EQUIVALENT) Added a fact for the built-in = predicate [PROLOG]. ---------------------------------------- (18) Obligation: Clauses: analyze_all(.(X, Y), .(X1, Y1)) :- ','(analyze(X, X1), analyze_all(Y, Y1)). analyze_all([], []). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ;(','(=(Body, true), =(NewSource, Source)), ','(=(I, []), ','(=(G, []), ','(rewrite_3(Source, New_Source, I, G, _Y), un_number_vars(New_Source, NewSource, others)))))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), ;(','(=(Result, zero), =(P, B)), rewrite(clause(H, B), clause(H, P), I, G, Info))). rewrite(clause(H, B), clause(H, P), I, G, Info) :- ','(numbervars_2(H, zero, Lhv), ','(collect_info(B, Info, Lhv, _X, _Y), add_annotations(Info, P, I, G))). add_annotations([], [], X5, X6). add_annotations(.(I, Is), .(P, Ps), Indep, Gnd) :- ','(add_annotations(I, P, Indep, Gnd), add_annotations(Is, Ps, Indep, Gnd)). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ;(;(','(var(Code), =(Phrase, PCode)), ','(=(Vars, []), =(Phrase, Code))), =(Phrase, ','(PCode, Code))))). collect_info(;(A, B), ','([], ','(sequential, ;(A, B))), Cin, Cout, _X) :- ','(collect_info(A, _Y, Cin, C, _Z), collect_info(B, _N, C, Cout, _M)). collect_info(','(A, B), and(Ia, Ib), Cin, Cout, _X) :- ','(collect_info(A, Ia, Cin, C, _Y), collect_info(B, Ib, C, Cout, _Z)). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ;(;(','(functor(A, F, Arity), ','(builtin(/(F, Arity)), =(CInfo, sequential))), ','(\==(NewVars, []), =(CInfo, suspect))), true)). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ;(;(','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(;(;(','(var(Ycode), =(Conjuncts, ','(Xcode, CGE))), ','(=(YVars, []), =(Conjuncts, ','(Xcode, Ycode)))), =(Conjuncts, ','(Xcode, ','(CGE, Ycode)))), ','(=(BagofVars, []), =(Type, sequential))))), ','(=(Ytype, sequential), ','(=(Conjuncts, Ycode), ','(=(BagofVars, XVars), =(Type, Xtype))))), ','(=(Conjuncts, Ycode), ','(append(XVars, YVars, BagofVars), =(Type, Xtype)))))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ;(','(==(T, sequential), ','(=(Type, T), ','(=(Vars, []), =(This_term, Term)))), ','(collect_vars(Term, Vs), ','(=(Type, par), =(Vars, .(','(','(T, ','(N, Term)), Vs), []))))). make_CGE_phrase(sequential, Code, X7, Code, X8, X9). make_CGE_phrase(_X, _Y, VarList, NewCode, I, G) :- get_phrase(VarList, NewCode, I, G). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), ;(','(','(','(=(X, L), =(X1, succ(zero))), isGreater(X, X1)), ','(eliminate_suspect_code(VarList, Rem, Vs, I, G), get_CGE_2(Vs, I, G, Code, Rem))), =(VarList, .(','(','(_X, ','(_Y, Code)), _Z), [])))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), ;(','(found(FVars, .(Last_goal, [])), ','(=(Last_goal, ','(','(_L, ','(_M, SeqCode)), _N)), =(ParCode, .(This_goal, [])))), =(ParCode, .(This_goal, .(Last_goal, []))))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ;(','(found(FVars, PCode), ','(get_CGE_2(PCode, I, G, Code, SCode), =(ParCode, .(This_goal, [])))), ','(=(ParCode, .(This_goal, PCode)), =(Code, SCode))))). found([], _R) :- fail. found(.(H, T), Next_calls) :- ;(find_var(Next_calls, H), found(T, Next_calls)). find_var([], _R) :- fail. find_var(.(','(_R, NextCall), Others), V) :- ;(member(V, NextCall), find_var(Others, V)). get_CGE_2(.(','(','(_X, ','(_Y, Goal)), _Z), []), _W, _M, Goal, Others) :- var(Others). get_CGE_2(.(','(','(X10, ','(X11, Goal)), X12), []), X13, X14, ','(Goal, Others), Others). get_CGE_2(Vs, I, G, Code, Rem) :- ','(get_conds(Vs, Conds, I, G), ','(make_norml_2(Vs, Parallel), babel_2(Conds, Parallel, Rem, Code))). get_conds(VARS, Y, I, G) :- ','(do_intersect(VARS, GS), ','(subtract(GS, G, Gnd), ','(singleton(VARS, VOIDS), ','(reduce_set(VARS, Gnd, VOIDS, I, RSET), ','(produce_tuples(RSET, Indep), get_text(Gnd, Indep, Y)))))). '$simplify_unconditional_cges'(off). babel_2(Conds, Parallel, C, Code) :- ','(;(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), =(Pcode, Parallel))), =..(Pcode, .('=>', .(Conds, .(Parallel, []))))), ;(','(var(C), =(Code, Pcode)), =(Code, ','(Pcode, C)))). reduce_set([], _X, _Y, _Z, []). reduce_set(.(','(Info, V), Vs), Gnd, VOIDS, Indep, .(','(Info, Rset), Rs)) :- ','(reduce_set(Vs, Gnd, VOIDS, Indep, Rs), ','(subtract(V, Gnd, Rg), ','(subtract(Rg, VOIDS, Rv), subtract(Rv, Indep, Rset)))). produce_tuples([], []). produce_tuples(.(','(_N, V), Vs), Tuples) :- ','(produce_tuples(Vs, Ts), ','(pair(Vs, V, Ps), merge(Ps, Ts, Tuples))). pair([], X15, []). pair(.(','(_N, L), Ls), Vs, Tuples) :- ','(pair(Ls, Vs, Ps), ','(tuple(L, Vs, Ts), merge(Ts, Ps, Tuples))). tuple([], X16, []). tuple(X17, [], []). tuple(List, .(L, Ls), Tuples) :- ','(tuple(List, Ls, T1), ','(tuple(List, L, T2), merge(T1, T2, Tuples))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(;(','(@<(E, L), =(Pair, .(.(E, .(L, [])), []))), =(Pair, .(.(L, .(E, [])), []))), merge(Pair, T1, Tuples))). make_norml(.(','(','(X18, ','(X19, T)), X20), []), T). make_norml(.(','(','(_X, ','(_Y, T)), _Z), Nxt), ','(T, Nc)) :- make_norml(Nxt, Nc). make_norml_2(.(','(','(X21, ','(X22, T)), X23), []), T). make_norml_2(.(','(','(_X, ','(_Y, T)), _Z), Nxt), '&'(T, Nc)) :- make_norml_2(Nxt, Nc). do_intersect([], []). do_intersect(.(','(_X, S1), .(','(_Y, S2), [])), IS) :- intersect(S1, S2, IS). do_intersect(.(S1, .(S2, Ss)), IS) :- ','(do_intersect(.(S2, Ss), IS1), ','(do_intersect(.(S1, Ss), IS2), ','(do_intersect(.(S1, .(S2, [])), IS3), ','(merge(IS1, IS2, T1), merge(IS3, T1, IS))))). get_text([], [], true). get_text([], X, indep(X)). get_text(X, [], ground(X)). get_text(X, Y, ','(ground(X), indep(Y))). find_vars(T, Vars, Cin, Cout) :- ','(numbervars_2(T, Cin, Cout), ','(isMinus(Cout, Cin, U), ','(=(NewVars, U), ','(length(Vars, NewVars), numbervars_2(Vars, Cin, _N))))). collect_vars(X, .(X, [])) :- var(X). collect_vars('$VAR'(X), .('$VAR'(X), [])). collect_vars('$VAR'(X, Y), .('$VAR'(X, Y), [])). collect_vars(Term, Vars) :- ','(functor(Term, _N, A), ','(go_inside(A, Term, Vs), sort(Vs, Vars))). collect_vars(X24, []). go_inside(zero, X25, []). go_inside(N, T, Bag) :- ','(isMinus(N, succ(zero), U), ','(=(Nth, U), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ;(;(','(var(ARG), =(Bag, .(ARG, C))), ','(atomic(ARG), =(Bag, C))), ','(collect_vars(ARG, Cs), append(Cs, C, Bag))))))). append([], L, L). append(.(H, T), L, .(H, R)) :- append(T, L, R). member(Element, .(Element, X26)). member(Element, .(_N, Rest)) :- member(Element, Rest). memberchk(Element, .(Element, X27)). memberchk(Element, .(_N, Rest)) :- memberchk(Element, Rest). subtract([], X28, []). subtract(.(Element, Residue), Set, Difference) :- ','(memberchk(Element, Set), subtract(Residue, Set, Difference)). subtract(.(Element, Residue), Set, .(Element, Difference)) :- subtract(Residue, Set, Difference). singleton(.(','(','(X29, ','(X, X30)), X31), []), X). singleton(.(','(','(_A, ','(V, _B)), _C), Vs), X) :- ','(singleton(Vs, Y), merge(V, Y, X)). merge([], D, D). merge(D, [], D). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(@<(A, D), merge(As, .(D, Ds), Bs)). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(==(A, D), merge(As, Ds, Bs)). merge(As, .(D, Ds), .(D, Bs)) :- merge(As, Ds, Bs). intersect([], X32, []). intersect(X33, [], []). intersect(.(A, As), .(D, Ds), Out) :- ','(@<(A, D), intersect(As, .(D, Ds), Out)). intersect(.(A, As), .(D, Ds), .(A, Out)) :- ','(==(A, D), intersect(As, Ds, Out)). intersect(As, .(_N, Ds), Out) :- intersect(As, Ds, Out). numbervars_2(X, N, N1) :- ','(var(X), ','(isPlus(N, succ(zero), U), ','(=(N1, U), =(X, '$VAR'(N, _L))))). numbervars_2(A, N, N) :- atomic(A). numbervars_2('$VAR'(X34, X35), N, N). numbervars_2(F, N, N1) :- numbervars_2(zero, F, N, N1). numbervars_2(I, F, N, N1) :- ','(isPlus(I, succ(zero), U), ','(=(I1, U), ','(arg(I1, F, X), ','(numbervars_2(X, N, N0), numbervars_2(I1, F, N0, N1))))). numbervars_2(X36, X37, N, N). un_number_vars(clause(Head, Body), clause(H, B), X) :- ','(un_number_vars_2(Head, H, X), un_number_vars_2(Body, B, X)). un_number_vars(directive(X), directive(X), X38). un_number_vars_2('$VAR'(X39, X), X, others). un_number_vars_2('$VAR'(X, X40), '$VAR'(X), cge). un_number_vars_2(X, X, X41) :- atomic(X). un_number_vars_2(F, F1, Y) :- ','(functor(F, Func, _N), ','(un_number_vars_2(zero, F, List, Y), =..(F1, .(Func, List)))). un_number_vars_2(I, F, .(X1, Tail), Y) :- ','(isPlus(I, succ(zero), U), ','(=(I1, U), ','(arg(I1, F, X), ','(un_number_vars_2(X, X1, Y), un_number_vars_2(I1, F, Tail, Y))))). un_number_vars_2(X42, X43, [], X44). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ;(','(=(ResultX, zero), =(Result, zero)), ','(check_if_cge(Y, ResultY), ','(isTimes(ResultX, ResultY, U), =(Result, U))))). check_if_cge('=>'(X45, X46), zero). check_if_cge('&'(X47, X48), zero). check_if_cge(X49, succ(zero)). builtin(/(fail, zero)). builtin(/(false, zero)). builtin(/(otherwise, zero)). builtin(/(repeat, zero)). builtin(/(true, zero)). builtin(/(version, zero)). builtin(/(version, succ(zero))). builtin(/(!, zero)). builtin(/(abolish, succ(zero))). builtin(/(abolish, succ(succ(zero)))). builtin(/(abort, zero)). builtin(/(assert, succ(zero))). builtin(/(assert, succ(succ(zero)))). builtin(/(asserta, succ(zero))). builtin(/(asserta, succ(succ(zero)))). builtin(/(assertz, succ(zero))). builtin(/(assertz, succ(succ(zero)))). builtin(/(bagof, succ(succ(succ(zero))))). builtin(/(break, zero)). builtin(/(call, succ(zero))). builtin(/(close, succ(zero))). builtin(/(compile, succ(zero))). builtin(/(consult, succ(zero))). builtin(/(debug, zero)). builtin(/(debugging, zero)). builtin(/(ensure_loaded, succ(zero))). builtin(/(erase, succ(zero))). builtin(/(fileerrors, zero)). builtin(/(flush_output, succ(zero))). builtin(/(foreign, succ(succ(zero)))). builtin(/(foreign, succ(succ(succ(zero))))). builtin(/(foreign_file, succ(succ(zero)))). builtin(/(get, succ(zero))). builtin(/(get, succ(succ(zero)))). builtin(/(get0, succ(zero))). builtin(/(get0, succ(succ(zero)))). builtin(/(halt, zero)). builtin(/(incore, succ(zero))). builtin(/(load_foreign_files, succ(succ(zero)))). builtin(/(module, succ(zero))). builtin(/(nofileerrors, zero)). builtin(/(no_style_check, succ(zero))). builtin(/(open, succ(succ(succ(zero))))). builtin(/(open_null_stream, succ(zero))). builtin(/(read, succ(zero))). builtin(/(read, succ(succ(zero)))). builtin(/(recorda, succ(succ(succ(zero))))). builtin(/(recorded, succ(succ(succ(zero))))). builtin(/(recordz, succ(succ(succ(zero))))). builtin(/(reinitialise, zero)). builtin(/(restore, succ(zero))). builtin(/(restore, succ(succ(zero)))). builtin(/(retract, succ(zero))). builtin(/(retractall, succ(zero))). builtin(/(save, succ(zero))). builtin(/(save, succ(succ(zero)))). builtin(/(save_program, succ(zero))). builtin(/(see, succ(zero))). builtin(/(seeing, succ(zero))). builtin(/(seen, zero)). builtin(/(set_input, succ(zero))). builtin(/(set_output, succ(zero))). builtin(/(setof, succ(succ(succ(zero))))). builtin(/(skip, succ(zero))). builtin(/(skip, succ(succ(zero)))). builtin(/(style_check, succ(zero))). builtin(/(ttyget, succ(zero))). builtin(/(ttyget0, succ(zero))). builtin(/(ttyskip, succ(zero))). builtin(/(unknown, succ(succ(zero)))). builtin(/(use_module, succ(zero))). builtin(/(use_module, succ(succ(zero)))). builtin(/('^', succ(succ(zero)))). builtin(/(\+, succ(zero))). go(N) :- ','(prepare(N, ManyClauses), ','(analyze_all(ManyClauses, Result), conclude(Result))). time(A) :- statistics(runtime, .(_N, .(A, []))). prepare(N, ManyClauses) :- ','(data(Clauses), ','(mlist(N, Clauses, ManyClauses), time(_N))). conclude(Result) :- ','(time(T), ','(write('Executed in '), ','(write(T), ','(write(' mS.'), ','(nl, ','(length(Result, L), ','(write('Length = '), ','(write(L), nl)))))))). mlist(zero, _1, []). mlist(X, SList, LList) :- ','(isMinus(X, succ(zero), U), ','(=(Y, U), ','(mlist(Y, SList, MList), ','(copy_term(SList, NewSlist), append(NewSlist, MList, LList))))). data(.(clause(f(X, Z), ','(p(X, Y), q(Y, Z))), .(clause(f(X1, Y1, Z1), ','(p(X1, Y1), q(Y1, Z1))), .(clause(f(X2, Y2, Z2), ','(is(Y2, +(X2, Z2)), ','(p(X2, Y2), ','(r(Y2), q(Y2, Z2))))), .(clause(f(X3, Y3, Z3), ','(var(X3), ','(f(X3), ','(q(Y3), ','(r(X3, Y3, Z3), q(X3)))))), .(clause(f(X4, Y4, Z4), ','(r(X4, Y4), ','(p(X4, Y4), ','(p(W4), ','(s(X4), q(Y4, W4, Z4)))))), [])))))). 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). fail :- failure(a). failure(b). =(X, X). Query: analyze_all(g,a) ---------------------------------------- (19) OrTransformerProof (EQUIVALENT) Transformed all or-constructs[PROLOG]. ---------------------------------------- (20) Obligation: Clauses: analyze_all(.(X, Y), .(X1, Y1)) :- ','(analyze(X, X1), analyze_all(Y, Y1)). analyze_all([], []). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ','(=(Body, true), =(NewSource, Source))). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ','(=(I, []), ','(=(G, []), ','(rewrite_3(Source, New_Source, I, G, _Y), un_number_vars(New_Source, NewSource, others))))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), ','(=(Result, zero), =(P, B))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), rewrite(clause(H, B), clause(H, P), I, G, Info)). rewrite(clause(H, B), clause(H, P), I, G, Info) :- ','(numbervars_2(H, zero, Lhv), ','(collect_info(B, Info, Lhv, _X, _Y), add_annotations(Info, P, I, G))). add_annotations([], [], X5, X6). add_annotations(.(I, Is), .(P, Ps), Indep, Gnd) :- ','(add_annotations(I, P, Indep, Gnd), add_annotations(Is, Ps, Indep, Gnd)). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ','(var(Code), =(Phrase, PCode)))). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ','(=(Vars, []), =(Phrase, Code)))). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), =(Phrase, ','(PCode, Code)))). collect_info(;(A, B), ','([], ','(sequential, ;(A, B))), Cin, Cout, _X) :- ','(collect_info(A, _Y, Cin, C, _Z), collect_info(B, _N, C, Cout, _M)). collect_info(','(A, B), and(Ia, Ib), Cin, Cout, _X) :- ','(collect_info(A, Ia, Cin, C, _Y), collect_info(B, Ib, C, Cout, _Z)). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ','(functor(A, F, Arity), ','(builtin(/(F, Arity)), =(CInfo, sequential)))). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ','(\==(NewVars, []), =(CInfo, suspect))). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), true). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(','(var(Ycode), =(Conjuncts, ','(Xcode, CGE))), ','(=(BagofVars, []), =(Type, sequential))))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(','(=(YVars, []), =(Conjuncts, ','(Xcode, Ycode))), ','(=(BagofVars, []), =(Type, sequential))))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(=(Conjuncts, ','(Xcode, ','(CGE, Ycode))), ','(=(BagofVars, []), =(Type, sequential))))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Ytype, sequential), ','(=(Conjuncts, Ycode), ','(=(BagofVars, XVars), =(Type, Xtype)))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Conjuncts, Ycode), ','(append(XVars, YVars, BagofVars), =(Type, Xtype))))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ','(==(T, sequential), ','(=(Type, T), ','(=(Vars, []), =(This_term, Term)))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ','(collect_vars(Term, Vs), ','(=(Type, par), =(Vars, .(','(','(T, ','(N, Term)), Vs), [])))). make_CGE_phrase(sequential, Code, X7, Code, X8, X9). make_CGE_phrase(_X, _Y, VarList, NewCode, I, G) :- get_phrase(VarList, NewCode, I, G). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), ','(','(','(=(X, L), =(X1, succ(zero))), isGreater(X, X1)), ','(eliminate_suspect_code(VarList, Rem, Vs, I, G), get_CGE_2(Vs, I, G, Code, Rem)))). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), =(VarList, .(','(','(_X, ','(_Y, Code)), _Z), []))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), ','(found(FVars, .(Last_goal, [])), ','(=(Last_goal, ','(','(_L, ','(_M, SeqCode)), _N)), =(ParCode, .(This_goal, []))))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), =(ParCode, .(This_goal, .(Last_goal, [])))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ','(found(FVars, PCode), ','(get_CGE_2(PCode, I, G, Code, SCode), =(ParCode, .(This_goal, [])))))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ','(=(ParCode, .(This_goal, PCode)), =(Code, SCode)))). found([], _R) :- fail. found(.(H, T), Next_calls) :- find_var(Next_calls, H). found(.(H, T), Next_calls) :- found(T, Next_calls). find_var([], _R) :- fail. find_var(.(','(_R, NextCall), Others), V) :- member(V, NextCall). find_var(.(','(_R, NextCall), Others), V) :- find_var(Others, V). get_CGE_2(.(','(','(_X, ','(_Y, Goal)), _Z), []), _W, _M, Goal, Others) :- var(Others). get_CGE_2(.(','(','(X10, ','(X11, Goal)), X12), []), X13, X14, ','(Goal, Others), Others). get_CGE_2(Vs, I, G, Code, Rem) :- ','(get_conds(Vs, Conds, I, G), ','(make_norml_2(Vs, Parallel), babel_2(Conds, Parallel, Rem, Code))). get_conds(VARS, Y, I, G) :- ','(do_intersect(VARS, GS), ','(subtract(GS, G, Gnd), ','(singleton(VARS, VOIDS), ','(reduce_set(VARS, Gnd, VOIDS, I, RSET), ','(produce_tuples(RSET, Indep), get_text(Gnd, Indep, Y)))))). '$simplify_unconditional_cges'(off). babel_2(Conds, Parallel, C, Code) :- ','(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), =(Pcode, Parallel))), ','(var(C), =(Code, Pcode))). babel_2(Conds, Parallel, C, Code) :- ','(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), =(Pcode, Parallel))), =(Code, ','(Pcode, C))). babel_2(Conds, Parallel, C, Code) :- ','(=..(Pcode, .('=>', .(Conds, .(Parallel, [])))), ','(var(C), =(Code, Pcode))). babel_2(Conds, Parallel, C, Code) :- ','(=..(Pcode, .('=>', .(Conds, .(Parallel, [])))), =(Code, ','(Pcode, C))). reduce_set([], _X, _Y, _Z, []). reduce_set(.(','(Info, V), Vs), Gnd, VOIDS, Indep, .(','(Info, Rset), Rs)) :- ','(reduce_set(Vs, Gnd, VOIDS, Indep, Rs), ','(subtract(V, Gnd, Rg), ','(subtract(Rg, VOIDS, Rv), subtract(Rv, Indep, Rset)))). produce_tuples([], []). produce_tuples(.(','(_N, V), Vs), Tuples) :- ','(produce_tuples(Vs, Ts), ','(pair(Vs, V, Ps), merge(Ps, Ts, Tuples))). pair([], X15, []). pair(.(','(_N, L), Ls), Vs, Tuples) :- ','(pair(Ls, Vs, Ps), ','(tuple(L, Vs, Ts), merge(Ts, Ps, Tuples))). tuple([], X16, []). tuple(X17, [], []). tuple(List, .(L, Ls), Tuples) :- ','(tuple(List, Ls, T1), ','(tuple(List, L, T2), merge(T1, T2, Tuples))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(','(@<(E, L), =(Pair, .(.(E, .(L, [])), []))), merge(Pair, T1, Tuples))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(=(Pair, .(.(L, .(E, [])), [])), merge(Pair, T1, Tuples))). make_norml(.(','(','(X18, ','(X19, T)), X20), []), T). make_norml(.(','(','(_X, ','(_Y, T)), _Z), Nxt), ','(T, Nc)) :- make_norml(Nxt, Nc). make_norml_2(.(','(','(X21, ','(X22, T)), X23), []), T). make_norml_2(.(','(','(_X, ','(_Y, T)), _Z), Nxt), '&'(T, Nc)) :- make_norml_2(Nxt, Nc). do_intersect([], []). do_intersect(.(','(_X, S1), .(','(_Y, S2), [])), IS) :- intersect(S1, S2, IS). do_intersect(.(S1, .(S2, Ss)), IS) :- ','(do_intersect(.(S2, Ss), IS1), ','(do_intersect(.(S1, Ss), IS2), ','(do_intersect(.(S1, .(S2, [])), IS3), ','(merge(IS1, IS2, T1), merge(IS3, T1, IS))))). get_text([], [], true). get_text([], X, indep(X)). get_text(X, [], ground(X)). get_text(X, Y, ','(ground(X), indep(Y))). find_vars(T, Vars, Cin, Cout) :- ','(numbervars_2(T, Cin, Cout), ','(isMinus(Cout, Cin, U), ','(=(NewVars, U), ','(length(Vars, NewVars), numbervars_2(Vars, Cin, _N))))). collect_vars(X, .(X, [])) :- var(X). collect_vars('$VAR'(X), .('$VAR'(X), [])). collect_vars('$VAR'(X, Y), .('$VAR'(X, Y), [])). collect_vars(Term, Vars) :- ','(functor(Term, _N, A), ','(go_inside(A, Term, Vs), sort(Vs, Vars))). collect_vars(X24, []). go_inside(zero, X25, []). go_inside(N, T, Bag) :- ','(isMinus(N, succ(zero), U), ','(=(Nth, U), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ','(var(ARG), =(Bag, .(ARG, C))))))). go_inside(N, T, Bag) :- ','(isMinus(N, succ(zero), U), ','(=(Nth, U), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ','(atomic(ARG), =(Bag, C)))))). go_inside(N, T, Bag) :- ','(isMinus(N, succ(zero), U), ','(=(Nth, U), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ','(collect_vars(ARG, Cs), append(Cs, C, Bag)))))). append([], L, L). append(.(H, T), L, .(H, R)) :- append(T, L, R). member(Element, .(Element, X26)). member(Element, .(_N, Rest)) :- member(Element, Rest). memberchk(Element, .(Element, X27)). memberchk(Element, .(_N, Rest)) :- memberchk(Element, Rest). subtract([], X28, []). subtract(.(Element, Residue), Set, Difference) :- ','(memberchk(Element, Set), subtract(Residue, Set, Difference)). subtract(.(Element, Residue), Set, .(Element, Difference)) :- subtract(Residue, Set, Difference). singleton(.(','(','(X29, ','(X, X30)), X31), []), X). singleton(.(','(','(_A, ','(V, _B)), _C), Vs), X) :- ','(singleton(Vs, Y), merge(V, Y, X)). merge([], D, D). merge(D, [], D). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(@<(A, D), merge(As, .(D, Ds), Bs)). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(==(A, D), merge(As, Ds, Bs)). merge(As, .(D, Ds), .(D, Bs)) :- merge(As, Ds, Bs). intersect([], X32, []). intersect(X33, [], []). intersect(.(A, As), .(D, Ds), Out) :- ','(@<(A, D), intersect(As, .(D, Ds), Out)). intersect(.(A, As), .(D, Ds), .(A, Out)) :- ','(==(A, D), intersect(As, Ds, Out)). intersect(As, .(_N, Ds), Out) :- intersect(As, Ds, Out). numbervars_2(X, N, N1) :- ','(var(X), ','(isPlus(N, succ(zero), U), ','(=(N1, U), =(X, '$VAR'(N, _L))))). numbervars_2(A, N, N) :- atomic(A). numbervars_2('$VAR'(X34, X35), N, N). numbervars_2(F, N, N1) :- numbervars_2(zero, F, N, N1). numbervars_2(I, F, N, N1) :- ','(isPlus(I, succ(zero), U), ','(=(I1, U), ','(arg(I1, F, X), ','(numbervars_2(X, N, N0), numbervars_2(I1, F, N0, N1))))). numbervars_2(X36, X37, N, N). un_number_vars(clause(Head, Body), clause(H, B), X) :- ','(un_number_vars_2(Head, H, X), un_number_vars_2(Body, B, X)). un_number_vars(directive(X), directive(X), X38). un_number_vars_2('$VAR'(X39, X), X, others). un_number_vars_2('$VAR'(X, X40), '$VAR'(X), cge). un_number_vars_2(X, X, X41) :- atomic(X). un_number_vars_2(F, F1, Y) :- ','(functor(F, Func, _N), ','(un_number_vars_2(zero, F, List, Y), =..(F1, .(Func, List)))). un_number_vars_2(I, F, .(X1, Tail), Y) :- ','(isPlus(I, succ(zero), U), ','(=(I1, U), ','(arg(I1, F, X), ','(un_number_vars_2(X, X1, Y), un_number_vars_2(I1, F, Tail, Y))))). un_number_vars_2(X42, X43, [], X44). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ','(=(ResultX, zero), =(Result, zero))). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ','(check_if_cge(Y, ResultY), ','(isTimes(ResultX, ResultY, U), =(Result, U)))). check_if_cge('=>'(X45, X46), zero). check_if_cge('&'(X47, X48), zero). check_if_cge(X49, succ(zero)). builtin(/(fail, zero)). builtin(/(false, zero)). builtin(/(otherwise, zero)). builtin(/(repeat, zero)). builtin(/(true, zero)). builtin(/(version, zero)). builtin(/(version, succ(zero))). builtin(/(!, zero)). builtin(/(abolish, succ(zero))). builtin(/(abolish, succ(succ(zero)))). builtin(/(abort, zero)). builtin(/(assert, succ(zero))). builtin(/(assert, succ(succ(zero)))). builtin(/(asserta, succ(zero))). builtin(/(asserta, succ(succ(zero)))). builtin(/(assertz, succ(zero))). builtin(/(assertz, succ(succ(zero)))). builtin(/(bagof, succ(succ(succ(zero))))). builtin(/(break, zero)). builtin(/(call, succ(zero))). builtin(/(close, succ(zero))). builtin(/(compile, succ(zero))). builtin(/(consult, succ(zero))). builtin(/(debug, zero)). builtin(/(debugging, zero)). builtin(/(ensure_loaded, succ(zero))). builtin(/(erase, succ(zero))). builtin(/(fileerrors, zero)). builtin(/(flush_output, succ(zero))). builtin(/(foreign, succ(succ(zero)))). builtin(/(foreign, succ(succ(succ(zero))))). builtin(/(foreign_file, succ(succ(zero)))). builtin(/(get, succ(zero))). builtin(/(get, succ(succ(zero)))). builtin(/(get0, succ(zero))). builtin(/(get0, succ(succ(zero)))). builtin(/(halt, zero)). builtin(/(incore, succ(zero))). builtin(/(load_foreign_files, succ(succ(zero)))). builtin(/(module, succ(zero))). builtin(/(nofileerrors, zero)). builtin(/(no_style_check, succ(zero))). builtin(/(open, succ(succ(succ(zero))))). builtin(/(open_null_stream, succ(zero))). builtin(/(read, succ(zero))). builtin(/(read, succ(succ(zero)))). builtin(/(recorda, succ(succ(succ(zero))))). builtin(/(recorded, succ(succ(succ(zero))))). builtin(/(recordz, succ(succ(succ(zero))))). builtin(/(reinitialise, zero)). builtin(/(restore, succ(zero))). builtin(/(restore, succ(succ(zero)))). builtin(/(retract, succ(zero))). builtin(/(retractall, succ(zero))). builtin(/(save, succ(zero))). builtin(/(save, succ(succ(zero)))). builtin(/(save_program, succ(zero))). builtin(/(see, succ(zero))). builtin(/(seeing, succ(zero))). builtin(/(seen, zero)). builtin(/(set_input, succ(zero))). builtin(/(set_output, succ(zero))). builtin(/(setof, succ(succ(succ(zero))))). builtin(/(skip, succ(zero))). builtin(/(skip, succ(succ(zero)))). builtin(/(style_check, succ(zero))). builtin(/(ttyget, succ(zero))). builtin(/(ttyget0, succ(zero))). builtin(/(ttyskip, succ(zero))). builtin(/(unknown, succ(succ(zero)))). builtin(/(use_module, succ(zero))). builtin(/(use_module, succ(succ(zero)))). builtin(/('^', succ(succ(zero)))). builtin(/(\+, succ(zero))). go(N) :- ','(prepare(N, ManyClauses), ','(analyze_all(ManyClauses, Result), conclude(Result))). time(A) :- statistics(runtime, .(_N, .(A, []))). prepare(N, ManyClauses) :- ','(data(Clauses), ','(mlist(N, Clauses, ManyClauses), time(_N))). conclude(Result) :- ','(time(T), ','(write('Executed in '), ','(write(T), ','(write(' mS.'), ','(nl, ','(length(Result, L), ','(write('Length = '), ','(write(L), nl)))))))). mlist(zero, _1, []). mlist(X, SList, LList) :- ','(isMinus(X, succ(zero), U), ','(=(Y, U), ','(mlist(Y, SList, MList), ','(copy_term(SList, NewSlist), append(NewSlist, MList, LList))))). data(.(clause(f(X, Z), ','(p(X, Y), q(Y, Z))), .(clause(f(X1, Y1, Z1), ','(p(X1, Y1), q(Y1, Z1))), .(clause(f(X2, Y2, Z2), ','(is(Y2, +(X2, Z2)), ','(p(X2, Y2), ','(r(Y2), q(Y2, Z2))))), .(clause(f(X3, Y3, Z3), ','(var(X3), ','(f(X3), ','(q(Y3), ','(r(X3, Y3, Z3), q(X3)))))), .(clause(f(X4, Y4, Z4), ','(r(X4, Y4), ','(p(X4, Y4), ','(p(W4), ','(s(X4), q(Y4, W4, Z4)))))), [])))))). 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). fail :- failure(a). failure(b). =(X, X). Query: analyze_all(g,a) ---------------------------------------- (21) UndefinedPredicateHandlerProof (SOUND) Added facts for all undefined predicates [PROLOG]. ---------------------------------------- (22) Obligation: Clauses: analyze_all(.(X, Y), .(X1, Y1)) :- ','(analyze(X, X1), analyze_all(Y, Y1)). analyze_all([], []). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ','(=(Body, true), =(NewSource, Source))). analyze(Source, NewSource) :- ','(=(Source, clause(_X, Body)), ','(=(I, []), ','(=(G, []), ','(rewrite_3(Source, New_Source, I, G, _Y), un_number_vars(New_Source, NewSource, others))))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), ','(=(Result, zero), =(P, B))). rewrite_3(clause(H, B), clause(H, P), I, G, Info) :- ','(check_if_cge(B, Result), rewrite(clause(H, B), clause(H, P), I, G, Info)). rewrite(clause(H, B), clause(H, P), I, G, Info) :- ','(numbervars_2(H, zero, Lhv), ','(collect_info(B, Info, Lhv, _X, _Y), add_annotations(Info, P, I, G))). add_annotations([], [], X5, X6). add_annotations(.(I, Is), .(P, Ps), Indep, Gnd) :- ','(add_annotations(I, P, Indep, Gnd), add_annotations(Is, Ps, Indep, Gnd)). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ','(var(Code), =(Phrase, PCode)))). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), ','(=(Vars, []), =(Phrase, Code)))). add_annotations(Info, Phrase, I, G) :- ','(para_phrase(Info, Code, Type, Vars, I, G), ','(make_CGE_phrase(Type, Code, Vars, PCode, I, G), =(Phrase, ','(PCode, Code)))). collect_info(;(A, B), ','([], ','(sequential, ;(A, B))), Cin, Cout, _X) :- ','(collect_info(A, _Y, Cin, C, _Z), collect_info(B, _N, C, Cout, _M)). collect_info(','(A, B), and(Ia, Ib), Cin, Cout, _X) :- ','(collect_info(A, Ia, Cin, C, _Y), collect_info(B, Ib, C, Cout, _Z)). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ','(functor(A, F, Arity), ','(builtin(/(F, Arity)), =(CInfo, sequential)))). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), ','(\==(NewVars, []), =(CInfo, suspect))). collect_info(A, ','(NewVars, ','(CInfo, A)), In, Out, _R) :- ','(find_vars(A, NewVars, In, Out), true). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(','(var(Ycode), =(Conjuncts, ','(Xcode, CGE))), ','(=(BagofVars, []), =(Type, sequential))))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(','(=(YVars, []), =(Conjuncts, ','(Xcode, Ycode))), ','(=(BagofVars, []), =(Type, sequential))))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Xtype, sequential), ','(make_CGE_phrase(Ytype, Ycode, YVars, CGE, I, G), ','(=(Conjuncts, ','(Xcode, ','(CGE, Ycode))), ','(=(BagofVars, []), =(Type, sequential))))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Ytype, sequential), ','(=(Conjuncts, Ycode), ','(=(BagofVars, XVars), =(Type, Xtype)))))). para_phrase(and(X, Y), Conjuncts, Type, BagofVars, I, G) :- ','(para_phrase(X, Xcode, Xtype, XVars, I, G), ','(para_phrase(Y, Ycode, Ytype, YVars, I, G), ','(=(Conjuncts, Ycode), ','(append(XVars, YVars, BagofVars), =(Type, Xtype))))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ','(==(T, sequential), ','(=(Type, T), ','(=(Vars, []), =(This_term, Term)))). para_phrase(','(N, ','(T, Term)), This_term, Type, Vars, _X, _Y) :- ','(collect_vars(Term, Vs), ','(=(Type, par), =(Vars, .(','(','(T, ','(N, Term)), Vs), [])))). make_CGE_phrase(sequential, Code, X7, Code, X8, X9). make_CGE_phrase(_X, _Y, VarList, NewCode, I, G) :- get_phrase(VarList, NewCode, I, G). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), ','(','(','(=(X, L), =(X1, succ(zero))), isGreater(X, X1)), ','(eliminate_suspect_code(VarList, Rem, Vs, I, G), get_CGE_2(Vs, I, G, Code, Rem)))). get_phrase(VarList, Code, I, G) :- ','(length(VarList, L), =(VarList, .(','(','(_X, ','(_Y, Code)), _Z), []))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), ','(found(FVars, .(Last_goal, [])), ','(=(Last_goal, ','(','(_L, ','(_M, SeqCode)), _N)), =(ParCode, .(This_goal, []))))). eliminate_suspect_code(.(This_goal, .(Last_goal, [])), SeqCode, ParCode, _X, _Y) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _Z)), _W)), =(ParCode, .(This_goal, .(Last_goal, [])))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ','(found(FVars, PCode), ','(get_CGE_2(PCode, I, G, Code, SCode), =(ParCode, .(This_goal, [])))))). eliminate_suspect_code(.(This_goal, Subsequent_goals), Code, ParCode, I, G) :- ','(=(This_goal, ','(','(suspect, ','(FVars, _X)), _Y)), ','(eliminate_suspect_code(Subsequent_goals, SCode, PCode, I, G), ','(=(ParCode, .(This_goal, PCode)), =(Code, SCode)))). found([], _R) :- fail. found(.(H, T), Next_calls) :- find_var(Next_calls, H). found(.(H, T), Next_calls) :- found(T, Next_calls). find_var([], _R) :- fail. find_var(.(','(_R, NextCall), Others), V) :- member(V, NextCall). find_var(.(','(_R, NextCall), Others), V) :- find_var(Others, V). get_CGE_2(.(','(','(_X, ','(_Y, Goal)), _Z), []), _W, _M, Goal, Others) :- var(Others). get_CGE_2(.(','(','(X10, ','(X11, Goal)), X12), []), X13, X14, ','(Goal, Others), Others). get_CGE_2(Vs, I, G, Code, Rem) :- ','(get_conds(Vs, Conds, I, G), ','(make_norml_2(Vs, Parallel), babel_2(Conds, Parallel, Rem, Code))). get_conds(VARS, Y, I, G) :- ','(do_intersect(VARS, GS), ','(subtract(GS, G, Gnd), ','(singleton(VARS, VOIDS), ','(reduce_set(VARS, Gnd, VOIDS, I, RSET), ','(produce_tuples(RSET, Indep), get_text(Gnd, Indep, Y)))))). '$simplify_unconditional_cges'(off). babel_2(Conds, Parallel, C, Code) :- ','(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), =(Pcode, Parallel))), ','(var(C), =(Code, Pcode))). babel_2(Conds, Parallel, C, Code) :- ','(','(=(Conds, true), ','('$simplify_unconditional_cges'(on), =(Pcode, Parallel))), =(Code, ','(Pcode, C))). babel_2(Conds, Parallel, C, Code) :- ','(=..(Pcode, .('=>', .(Conds, .(Parallel, [])))), ','(var(C), =(Code, Pcode))). babel_2(Conds, Parallel, C, Code) :- ','(=..(Pcode, .('=>', .(Conds, .(Parallel, [])))), =(Code, ','(Pcode, C))). reduce_set([], _X, _Y, _Z, []). reduce_set(.(','(Info, V), Vs), Gnd, VOIDS, Indep, .(','(Info, Rset), Rs)) :- ','(reduce_set(Vs, Gnd, VOIDS, Indep, Rs), ','(subtract(V, Gnd, Rg), ','(subtract(Rg, VOIDS, Rv), subtract(Rv, Indep, Rset)))). produce_tuples([], []). produce_tuples(.(','(_N, V), Vs), Tuples) :- ','(produce_tuples(Vs, Ts), ','(pair(Vs, V, Ps), merge(Ps, Ts, Tuples))). pair([], X15, []). pair(.(','(_N, L), Ls), Vs, Tuples) :- ','(pair(Ls, Vs, Ps), ','(tuple(L, Vs, Ts), merge(Ts, Ps, Tuples))). tuple([], X16, []). tuple(X17, [], []). tuple(List, .(L, Ls), Tuples) :- ','(tuple(List, Ls, T1), ','(tuple(List, L, T2), merge(T1, T2, Tuples))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(','(@<(E, L), =(Pair, .(.(E, .(L, [])), []))), merge(Pair, T1, Tuples))). tuple(.(E, Es), L, Tuples) :- ','(tuple(Es, L, T1), ','(=(Pair, .(.(L, .(E, [])), [])), merge(Pair, T1, Tuples))). make_norml(.(','(','(X18, ','(X19, T)), X20), []), T). make_norml(.(','(','(_X, ','(_Y, T)), _Z), Nxt), ','(T, Nc)) :- make_norml(Nxt, Nc). make_norml_2(.(','(','(X21, ','(X22, T)), X23), []), T). make_norml_2(.(','(','(_X, ','(_Y, T)), _Z), Nxt), '&'(T, Nc)) :- make_norml_2(Nxt, Nc). do_intersect([], []). do_intersect(.(','(_X, S1), .(','(_Y, S2), [])), IS) :- intersect(S1, S2, IS). do_intersect(.(S1, .(S2, Ss)), IS) :- ','(do_intersect(.(S2, Ss), IS1), ','(do_intersect(.(S1, Ss), IS2), ','(do_intersect(.(S1, .(S2, [])), IS3), ','(merge(IS1, IS2, T1), merge(IS3, T1, IS))))). get_text([], [], true). get_text([], X, indep(X)). get_text(X, [], ground(X)). get_text(X, Y, ','(ground(X), indep(Y))). find_vars(T, Vars, Cin, Cout) :- ','(numbervars_2(T, Cin, Cout), ','(isMinus(Cout, Cin, U), ','(=(NewVars, U), ','(length(Vars, NewVars), numbervars_2(Vars, Cin, _N))))). collect_vars(X, .(X, [])) :- var(X). collect_vars('$VAR'(X), .('$VAR'(X), [])). collect_vars('$VAR'(X, Y), .('$VAR'(X, Y), [])). collect_vars(Term, Vars) :- ','(functor(Term, _N, A), ','(go_inside(A, Term, Vs), sort(Vs, Vars))). collect_vars(X24, []). go_inside(zero, X25, []). go_inside(N, T, Bag) :- ','(isMinus(N, succ(zero), U), ','(=(Nth, U), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ','(var(ARG), =(Bag, .(ARG, C))))))). go_inside(N, T, Bag) :- ','(isMinus(N, succ(zero), U), ','(=(Nth, U), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ','(atomic(ARG), =(Bag, C)))))). go_inside(N, T, Bag) :- ','(isMinus(N, succ(zero), U), ','(=(Nth, U), ','(go_inside(Nth, T, C), ','(arg(N, T, ARG), ','(collect_vars(ARG, Cs), append(Cs, C, Bag)))))). append([], L, L). append(.(H, T), L, .(H, R)) :- append(T, L, R). member(Element, .(Element, X26)). member(Element, .(_N, Rest)) :- member(Element, Rest). memberchk(Element, .(Element, X27)). memberchk(Element, .(_N, Rest)) :- memberchk(Element, Rest). subtract([], X28, []). subtract(.(Element, Residue), Set, Difference) :- ','(memberchk(Element, Set), subtract(Residue, Set, Difference)). subtract(.(Element, Residue), Set, .(Element, Difference)) :- subtract(Residue, Set, Difference). singleton(.(','(','(X29, ','(X, X30)), X31), []), X). singleton(.(','(','(_A, ','(V, _B)), _C), Vs), X) :- ','(singleton(Vs, Y), merge(V, Y, X)). merge([], D, D). merge(D, [], D). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(@<(A, D), merge(As, .(D, Ds), Bs)). merge(.(A, As), .(D, Ds), .(A, Bs)) :- ','(==(A, D), merge(As, Ds, Bs)). merge(As, .(D, Ds), .(D, Bs)) :- merge(As, Ds, Bs). intersect([], X32, []). intersect(X33, [], []). intersect(.(A, As), .(D, Ds), Out) :- ','(@<(A, D), intersect(As, .(D, Ds), Out)). intersect(.(A, As), .(D, Ds), .(A, Out)) :- ','(==(A, D), intersect(As, Ds, Out)). intersect(As, .(_N, Ds), Out) :- intersect(As, Ds, Out). numbervars_2(X, N, N1) :- ','(var(X), ','(isPlus(N, succ(zero), U), ','(=(N1, U), =(X, '$VAR'(N, _L))))). numbervars_2(A, N, N) :- atomic(A). numbervars_2('$VAR'(X34, X35), N, N). numbervars_2(F, N, N1) :- numbervars_2(zero, F, N, N1). numbervars_2(I, F, N, N1) :- ','(isPlus(I, succ(zero), U), ','(=(I1, U), ','(arg(I1, F, X), ','(numbervars_2(X, N, N0), numbervars_2(I1, F, N0, N1))))). numbervars_2(X36, X37, N, N). un_number_vars(clause(Head, Body), clause(H, B), X) :- ','(un_number_vars_2(Head, H, X), un_number_vars_2(Body, B, X)). un_number_vars(directive(X), directive(X), X38). un_number_vars_2('$VAR'(X39, X), X, others). un_number_vars_2('$VAR'(X, X40), '$VAR'(X), cge). un_number_vars_2(X, X, X41) :- atomic(X). un_number_vars_2(F, F1, Y) :- ','(functor(F, Func, _N), ','(un_number_vars_2(zero, F, List, Y), =..(F1, .(Func, List)))). un_number_vars_2(I, F, .(X1, Tail), Y) :- ','(isPlus(I, succ(zero), U), ','(=(I1, U), ','(arg(I1, F, X), ','(un_number_vars_2(X, X1, Y), un_number_vars_2(I1, F, Tail, Y))))). un_number_vars_2(X42, X43, [], X44). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ','(=(ResultX, zero), =(Result, zero))). check_if_cge(','(X, Y), Result) :- ','(check_if_cge(X, ResultX), ','(check_if_cge(Y, ResultY), ','(isTimes(ResultX, ResultY, U), =(Result, U)))). check_if_cge('=>'(X45, X46), zero). check_if_cge('&'(X47, X48), zero). check_if_cge(X49, succ(zero)). builtin(/(fail, zero)). builtin(/(false, zero)). builtin(/(otherwise, zero)). builtin(/(repeat, zero)). builtin(/(true, zero)). builtin(/(version, zero)). builtin(/(version, succ(zero))). builtin(/(!, zero)). builtin(/(abolish, succ(zero))). builtin(/(abolish, succ(succ(zero)))). builtin(/(abort, zero)). builtin(/(assert, succ(zero))). builtin(/(assert, succ(succ(zero)))). builtin(/(asserta, succ(zero))). builtin(/(asserta, succ(succ(zero)))). builtin(/(assertz, succ(zero))). builtin(/(assertz, succ(succ(zero)))). builtin(/(bagof, succ(succ(succ(zero))))). builtin(/(break, zero)). builtin(/(call, succ(zero))). builtin(/(close, succ(zero))). builtin(/(compile, succ(zero))). builtin(/(consult, succ(zero))). builtin(/(debug, zero)). builtin(/(debugging, zero)). builtin(/(ensure_loaded, succ(zero))). builtin(/(erase, succ(zero))). builtin(/(fileerrors, zero)). builtin(/(flush_output, succ(zero))). builtin(/(foreign, succ(succ(zero)))). builtin(/(foreign, succ(succ(succ(zero))))). builtin(/(foreign_file, succ(succ(zero)))). builtin(/(get, succ(zero))). builtin(/(get, succ(succ(zero)))). builtin(/(get0, succ(zero))). builtin(/(get0, succ(succ(zero)))). builtin(/(halt, zero)). builtin(/(incore, succ(zero))). builtin(/(load_foreign_files, succ(succ(zero)))). builtin(/(module, succ(zero))). builtin(/(nofileerrors, zero)). builtin(/(no_style_check, succ(zero))). builtin(/(open, succ(succ(succ(zero))))). builtin(/(open_null_stream, succ(zero))). builtin(/(read, succ(zero))). builtin(/(read, succ(succ(zero)))). builtin(/(recorda, succ(succ(succ(zero))))). builtin(/(recorded, succ(succ(succ(zero))))). builtin(/(recordz, succ(succ(succ(zero))))). builtin(/(reinitialise, zero)). builtin(/(restore, succ(zero))). builtin(/(restore, succ(succ(zero)))). builtin(/(retract, succ(zero))). builtin(/(retractall, succ(zero))). builtin(/(save, succ(zero))). builtin(/(save, succ(succ(zero)))). builtin(/(save_program, succ(zero))). builtin(/(see, succ(zero))). builtin(/(seeing, succ(zero))). builtin(/(seen, zero)). builtin(/(set_input, succ(zero))). builtin(/(set_output, succ(zero))). builtin(/(setof, succ(succ(succ(zero))))). builtin(/(skip, succ(zero))). builtin(/(skip, succ(succ(zero)))). builtin(/(style_check, succ(zero))). builtin(/(ttyget, succ(zero))). builtin(/(ttyget0, succ(zero))). builtin(/(ttyskip, succ(zero))). builtin(/(unknown, succ(succ(zero)))). builtin(/(use_module, succ(zero))). builtin(/(use_module, succ(succ(zero)))). builtin(/('^', succ(succ(zero)))). builtin(/(\+, succ(zero))). go(N) :- ','(prepare(N, ManyClauses), ','(analyze_all(ManyClauses, Result), conclude(Result))). time(A) :- statistics(runtime, .(_N, .(A, []))). prepare(N, ManyClauses) :- ','(data(Clauses), ','(mlist(N, Clauses, ManyClauses), time(_N))). conclude(Result) :- ','(time(T), ','(write('Executed in '), ','(write(T), ','(write(' mS.'), ','(nl, ','(length(Result, L), ','(write('Length = '), ','(write(L), nl)))))))). mlist(zero, _1, []). mlist(X, SList, LList) :- ','(isMinus(X, succ(zero), U), ','(=(Y, U), ','(mlist(Y, SList, MList), ','(copy_term(SList, NewSlist), append(NewSlist, MList, LList))))). data(.(clause(f(X, Z), ','(p(X, Y), q(Y, Z))), .(clause(f(X1, Y1, Z1), ','(p(X1, Y1), q(Y1, Z1))), .(clause(f(X2, Y2, Z2), ','(is(Y2, +(X2, Z2)), ','(p(X2, Y2), ','(r(Y2), q(Y2, Z2))))), .(clause(f(X3, Y3, Z3), ','(var(X3), ','(f(X3), ','(q(Y3), ','(r(X3, Y3, Z3), q(X3)))))), .(clause(f(X4, Y4, Z4), ','(r(X4, Y4), ','(p(X4, Y4), ','(p(W4), ','(s(X4), q(Y4, W4, Z4)))))), [])))))). 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). fail :- failure(a). failure(b). =(X, X). var(X0). functor(X0, X1, X2). \==(X0, X1). true. ==(X0, X1). length(X0, X1). =..(X0, X1). @<(X0, X1). sort(X0, X1). arg(X0, X1, X2). atomic(X0). statistics(X0, X1). write(X0). nl. copy_term(X0, X1). Query: analyze_all(g,a)