/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 investigate(g,a) w.r.t. the given Prolog program could not be shown: (0) Prolog (1) IntegerArithmeticTransformerProof [SOUND, 0 ms] (2) Prolog (3) CutEliminatorProof [SOUND, 0 ms] (4) Prolog (5) IfThenElseTransformerProof [EQUIVALENT, 0 ms] (6) Prolog (7) CallTransformerProof [EQUIVALENT, 0 ms] (8) Prolog (9) CutEliminatorProof [SOUND, 0 ms] (10) Prolog (11) FailTransformerProof [EQUIVALENT, 0 ms] (12) Prolog (13) UnifyTransformerProof [EQUIVALENT, 0 ms] (14) Prolog (15) OrTransformerProof [EQUIVALENT, 0 ms] (16) Prolog (17) UndefinedPredicateHandlerProof [SOUND, 0 ms] (18) Prolog (19) CutEliminatorProof [SOUND, 0 ms] (20) Prolog (21) IfThenElseTransformerProof [EQUIVALENT, 0 ms] (22) Prolog (23) CallTransformerProof [EQUIVALENT, 0 ms] (24) Prolog (25) CutEliminatorProof [SOUND, 0 ms] (26) Prolog (27) FailTransformerProof [EQUIVALENT, 0 ms] (28) Prolog (29) UnifyTransformerProof [EQUIVALENT, 0 ms] (30) Prolog (31) OrTransformerProof [EQUIVALENT, 0 ms] (32) Prolog (33) UndefinedPredicateHandlerProof [SOUND, 0 ms] (34) Prolog ---------------------------------------- (0) Obligation: Clauses: main(V1, V2) :- ','(init(100, 10, 4, V1, Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), ','(!, arg(1, Prop, Val))). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(;(','(match(D, P), fail), true), p_match(Patterns, D)). match([], []) :- !. match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(!, ','(=(X, Y), match(PRest, SRest)))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(!, ','(concat(X, SRest, List), match(SRest, Rest))))). match(.(X, PRest), .(Y, SRest)) :- ','(;(->(atom(X), =(X, Y)), match(X, Y)), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(100, 10, 4, .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, 21), ','(!, investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), []))))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(0, _X, _Y, _Z, _W, _L) :- !. init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(is(J, -(M, I)), ','(fill(J, .(pattern(Ppats), L), Symb), ','(is(N1, -(N, 1)), ','(;(->(==(I, 0), is(I1, M)), is(I1, -(I, 1))), init(N1, I1, M, Npats, Ipats, Rest))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(0, _X, [], _Y) :- !. get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(is(N1, -(N, 1)), get_pats(N1, Xs, Ys, Ipats)). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(0, L, L) :- !. fill(N, L, .(dummy([]), Rest)) :- ','(is(N1, -(N, 1)), fill(N1, L, Rest)). randomize([], [], X3) :- !. randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(is(Rand1, mod(*(Rand, 17), 251)), ','(is(N, mod(Rand1, Lin)), ','(split(N, In, X, In1), randomize(In1, Out, Rand1))))). split(0, .(X, Xs), X, Xs) :- !. split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(is(N1, -(N, 1)), split(N1, Xs, RemovedElt, Ys)). Query: investigate(g,a) ---------------------------------------- (1) IntegerArithmeticTransformerProof (SOUND) Added definitions of predefined predicates [PROLOG]. ---------------------------------------- (2) Obligation: Clauses: main(V1, V2) :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), V1, Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), ','(!, arg(succ(zero), Prop, Val))). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(;(','(match(D, P), fail), true), p_match(Patterns, D)). match([], []) :- !. match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(!, ','(=(X, Y), match(PRest, SRest)))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(!, ','(concat(X, SRest, List), match(SRest, Rest))))). match(.(X, PRest), .(Y, SRest)) :- ','(;(->(atom(X), =(X, Y)), match(X, Y)), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), ','(!, investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), []))))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(zero, _X, _Y, _Z, _W, _L) :- !. init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(isMinus(M, I, U), ','(=(J, U), ','(fill(J, .(pattern(Ppats), L), Symb), ','(isMinus(N, succ(zero), U), ','(=(N1, U), ','(;(->(==(I, zero), =(I1, M)), ','(isMinus(I, succ(zero), U), =(I1, U))), init(N1, I1, M, Npats, Ipats, Rest))))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(zero, _X, [], _Y) :- !. get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), get_pats(N1, Xs, Ys, Ipats))). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(zero, L, L) :- !. fill(N, L, .(dummy([]), Rest)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), fill(N1, L, Rest))). randomize([], [], X3) :- !. randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(isTimes(Rand, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))), U), ','(isModulo(U, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), U1), ','(=(Rand1, U1), ','(isModulo(Rand1, Lin, U), ','(=(N, U), ','(split(N, In, X, In1), randomize(In1, Out, Rand1)))))))). split(zero, .(X, Xs), X, Xs) :- !. split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), split(N1, Xs, RemovedElt, Ys))). 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))). Query: investigate(g,a) ---------------------------------------- (3) CutEliminatorProof (SOUND) Eliminated all cuts by simply ignoring them[PROLOG]. ---------------------------------------- (4) Obligation: Clauses: main(V1, V2) :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), V1, Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(succ(zero), Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(;(','(match(D, P), fail), true), p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(;(->(atom(X), =(X, Y)), match(X, Y)), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(zero, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(isMinus(M, I, U), ','(=(J, U), ','(fill(J, .(pattern(Ppats), L), Symb), ','(isMinus(N, succ(zero), U), ','(=(N1, U), ','(;(->(==(I, zero), =(I1, M)), ','(isMinus(I, succ(zero), U), =(I1, U))), init(N1, I1, M, Npats, Ipats, Rest))))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(zero, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), get_pats(N1, Xs, Ys, Ipats))). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(zero, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), fill(N1, L, Rest))). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(isTimes(Rand, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))), U), ','(isModulo(U, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), U1), ','(=(Rand1, U1), ','(isModulo(Rand1, Lin, U), ','(=(N, U), ','(split(N, In, X, In1), randomize(In1, Out, Rand1)))))))). split(zero, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), split(N1, Xs, RemovedElt, Ys))). 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))). Query: investigate(g,a) ---------------------------------------- (5) IfThenElseTransformerProof (EQUIVALENT) Transformed all if-then-else-constructs [PROLOG]. ---------------------------------------- (6) Obligation: Clauses: main(V1, V2) :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), V1, Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(succ(zero), Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(;(','(match(D, P), fail), true), p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(if(X, Y), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(zero, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(isMinus(M, I, U), ','(=(J, U), ','(fill(J, .(pattern(Ppats), L), Symb), ','(isMinus(N, succ(zero), U), ','(=(N1, U), ','(if1(I, I1, M, U), init(N1, I1, M, Npats, Ipats, Rest))))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(zero, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), get_pats(N1, Xs, Ys, Ipats))). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(zero, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), fill(N1, L, Rest))). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(isTimes(Rand, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))), U), ','(isModulo(U, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), U1), ','(=(Rand1, U1), ','(isModulo(Rand1, Lin, U), ','(=(N, U), ','(split(N, In, X, In1), randomize(In1, Out, Rand1)))))))). split(zero, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), split(N1, Xs, RemovedElt, Ys))). 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))). if(X, Y) :- ','(call(atom(X)), ','(!, =(X, Y))). if(X, Y) :- match(X, Y). if1(I, I1, M, U) :- ','(call(==(I, zero)), ','(!, =(I1, M))). if1(I, I1, M, U) :- ','(isMinus(I, succ(zero), U), =(I1, U)). Query: investigate(g,a) ---------------------------------------- (7) CallTransformerProof (EQUIVALENT) Transformed all call-constructs [PROLOG]. ---------------------------------------- (8) Obligation: Clauses: main(V1, V2) :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), V1, Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(succ(zero), Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(;(','(match(D, P), fail), true), p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(if(X, Y), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(zero, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(isMinus(M, I, U), ','(=(J, U), ','(fill(J, .(pattern(Ppats), L), Symb), ','(isMinus(N, succ(zero), U), ','(=(N1, U), ','(if1(I, I1, M, U), init(N1, I1, M, Npats, Ipats, Rest))))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(zero, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), get_pats(N1, Xs, Ys, Ipats))). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(zero, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), fill(N1, L, Rest))). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(isTimes(Rand, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))), U), ','(isModulo(U, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), U1), ','(=(Rand1, U1), ','(isModulo(Rand1, Lin, U), ','(=(N, U), ','(split(N, In, X, In1), randomize(In1, Out, Rand1)))))))). split(zero, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), split(N1, Xs, RemovedElt, Ys))). 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))). if(X, Y) :- ','(call1(X), ','(!, =(X, Y))). if(X, Y) :- match(X, Y). if1(I, I1, M, U) :- ','(call2(I), ','(!, =(I1, M))). if1(I, I1, M, U) :- ','(isMinus(I, succ(zero), U), =(I1, U)). call1(X) :- atom(X). call2(I) :- ==(I, zero). Query: investigate(g,a) ---------------------------------------- (9) CutEliminatorProof (SOUND) Eliminated all cuts by simply ignoring them[PROLOG]. ---------------------------------------- (10) Obligation: Clauses: main(V1, V2) :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), V1, Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(succ(zero), Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(;(','(match(D, P), fail), true), p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(if(X, Y), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(zero, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(isMinus(M, I, U), ','(=(J, U), ','(fill(J, .(pattern(Ppats), L), Symb), ','(isMinus(N, succ(zero), U), ','(=(N1, U), ','(if1(I, I1, M, U), init(N1, I1, M, Npats, Ipats, Rest))))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(zero, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), get_pats(N1, Xs, Ys, Ipats))). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(zero, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), fill(N1, L, Rest))). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(isTimes(Rand, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))), U), ','(isModulo(U, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), U1), ','(=(Rand1, U1), ','(isModulo(Rand1, Lin, U), ','(=(N, U), ','(split(N, In, X, In1), randomize(In1, Out, Rand1)))))))). split(zero, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), split(N1, Xs, RemovedElt, Ys))). 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))). if(X, Y) :- ','(call1(X), =(X, Y)). if(X, Y) :- match(X, Y). if1(I, I1, M, U) :- ','(call2(I), =(I1, M)). if1(I, I1, M, U) :- ','(isMinus(I, succ(zero), U), =(I1, U)). call1(X) :- atom(X). call2(I) :- ==(I, zero). Query: investigate(g,a) ---------------------------------------- (11) FailTransformerProof (EQUIVALENT) Added clauses for the built-in fail predicate [PROLOG]. ---------------------------------------- (12) Obligation: Clauses: main(V1, V2) :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), V1, Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(succ(zero), Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(;(','(match(D, P), fail), true), p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(if(X, Y), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(zero, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(isMinus(M, I, U), ','(=(J, U), ','(fill(J, .(pattern(Ppats), L), Symb), ','(isMinus(N, succ(zero), U), ','(=(N1, U), ','(if1(I, I1, M, U), init(N1, I1, M, Npats, Ipats, Rest))))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(zero, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), get_pats(N1, Xs, Ys, Ipats))). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(zero, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), fill(N1, L, Rest))). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(isTimes(Rand, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))), U), ','(isModulo(U, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), U1), ','(=(Rand1, U1), ','(isModulo(Rand1, Lin, U), ','(=(N, U), ','(split(N, In, X, In1), randomize(In1, Out, Rand1)))))))). split(zero, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), split(N1, Xs, RemovedElt, Ys))). 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))). if(X, Y) :- ','(call1(X), =(X, Y)). if(X, Y) :- match(X, Y). if1(I, I1, M, U) :- ','(call2(I), =(I1, M)). if1(I, I1, M, U) :- ','(isMinus(I, succ(zero), U), =(I1, U)). call1(X) :- atom(X). call2(I) :- ==(I, zero). fail :- failure(a). failure(b). Query: investigate(g,a) ---------------------------------------- (13) UnifyTransformerProof (EQUIVALENT) Added a fact for the built-in = predicate [PROLOG]. ---------------------------------------- (14) Obligation: Clauses: main(V1, V2) :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), V1, Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(succ(zero), Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(;(','(match(D, P), fail), true), p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(if(X, Y), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(zero, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(isMinus(M, I, U), ','(=(J, U), ','(fill(J, .(pattern(Ppats), L), Symb), ','(isMinus(N, succ(zero), U), ','(=(N1, U), ','(if1(I, I1, M, U), init(N1, I1, M, Npats, Ipats, Rest))))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(zero, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), get_pats(N1, Xs, Ys, Ipats))). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(zero, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), fill(N1, L, Rest))). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(isTimes(Rand, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))), U), ','(isModulo(U, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), U1), ','(=(Rand1, U1), ','(isModulo(Rand1, Lin, U), ','(=(N, U), ','(split(N, In, X, In1), randomize(In1, Out, Rand1)))))))). split(zero, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), split(N1, Xs, RemovedElt, Ys))). 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))). if(X, Y) :- ','(call1(X), =(X, Y)). if(X, Y) :- match(X, Y). if1(I, I1, M, U) :- ','(call2(I), =(I1, M)). if1(I, I1, M, U) :- ','(isMinus(I, succ(zero), U), =(I1, U)). call1(X) :- atom(X). call2(I) :- ==(I, zero). fail :- failure(a). failure(b). =(X, X). Query: investigate(g,a) ---------------------------------------- (15) OrTransformerProof (EQUIVALENT) Transformed all or-constructs[PROLOG]. ---------------------------------------- (16) Obligation: Clauses: main(V1, V2) :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), V1, Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(succ(zero), Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(','(match(D, P), fail), p_match(Patterns, D)). p_match(.(P, Patterns), D) :- ','(true, p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(if(X, Y), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(zero, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(isMinus(M, I, U), ','(=(J, U), ','(fill(J, .(pattern(Ppats), L), Symb), ','(isMinus(N, succ(zero), U), ','(=(N1, U), ','(if1(I, I1, M, U), init(N1, I1, M, Npats, Ipats, Rest))))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(zero, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), get_pats(N1, Xs, Ys, Ipats))). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(zero, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), fill(N1, L, Rest))). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(isTimes(Rand, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))), U), ','(isModulo(U, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), U1), ','(=(Rand1, U1), ','(isModulo(Rand1, Lin, U), ','(=(N, U), ','(split(N, In, X, In1), randomize(In1, Out, Rand1)))))))). split(zero, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), split(N1, Xs, RemovedElt, Ys))). 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))). if(X, Y) :- ','(call1(X), =(X, Y)). if(X, Y) :- match(X, Y). if1(I, I1, M, U) :- ','(call2(I), =(I1, M)). if1(I, I1, M, U) :- ','(isMinus(I, succ(zero), U), =(I1, U)). call1(X) :- atom(X). call2(I) :- ==(I, zero). fail :- failure(a). failure(b). =(X, X). Query: investigate(g,a) ---------------------------------------- (17) UndefinedPredicateHandlerProof (SOUND) Added facts for all undefined predicates [PROLOG]. ---------------------------------------- (18) Obligation: Clauses: main(V1, V2) :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), V1, Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(succ(zero), Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(','(match(D, P), fail), p_match(Patterns, D)). p_match(.(P, Patterns), D) :- ','(true, p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(if(X, Y), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))), succ(succ(succ(succ(zero)))), .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero)))))))))))))))))))))), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(zero, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(isMinus(M, I, U), ','(=(J, U), ','(fill(J, .(pattern(Ppats), L), Symb), ','(isMinus(N, succ(zero), U), ','(=(N1, U), ','(if1(I, I1, M, U), init(N1, I1, M, Npats, Ipats, Rest))))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(zero, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), get_pats(N1, Xs, Ys, Ipats))). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(zero, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), fill(N1, L, Rest))). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(isTimes(Rand, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))), U), ','(isModulo(U, succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(succ(zero))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))), U1), ','(=(Rand1, U1), ','(isModulo(Rand1, Lin, U), ','(=(N, U), ','(split(N, In, X, In1), randomize(In1, Out, Rand1)))))))). split(zero, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(isMinus(N, succ(zero), U), ','(=(N1, U), split(N1, Xs, RemovedElt, Ys))). 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))). if(X, Y) :- ','(call1(X), =(X, Y)). if(X, Y) :- match(X, Y). if1(I, I1, M, U) :- ','(call2(I), =(I1, M)). if1(I, I1, M, U) :- ','(isMinus(I, succ(zero), U), =(I1, U)). call1(X) :- atom(X). call2(I) :- ==(I, zero). fail :- failure(a). failure(b). =(X, X). functor(X0, X1, X2). arg(X0, X1, X2). true. var(X0). nonvar(X0). length(X0, X1). atom(X0). ==(X0, X1). Query: investigate(g,a) ---------------------------------------- (19) CutEliminatorProof (SOUND) Eliminated all cuts by simply ignoring them[PROLOG]. ---------------------------------------- (20) Obligation: Clauses: main(V1, V2) :- ','(init(100, 10, 4, V1, Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(1, Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(;(','(match(D, P), fail), true), p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(;(->(atom(X), =(X, Y)), match(X, Y)), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(100, 10, 4, .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(0, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(is(J, -(M, I)), ','(fill(J, .(pattern(Ppats), L), Symb), ','(is(N1, -(N, 1)), ','(;(->(==(I, 0), is(I1, M)), is(I1, -(I, 1))), init(N1, I1, M, Npats, Ipats, Rest))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(0, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(is(N1, -(N, 1)), get_pats(N1, Xs, Ys, Ipats)). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(0, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(is(N1, -(N, 1)), fill(N1, L, Rest)). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(is(Rand1, mod(*(Rand, 17), 251)), ','(is(N, mod(Rand1, Lin)), ','(split(N, In, X, In1), randomize(In1, Out, Rand1))))). split(0, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(is(N1, -(N, 1)), split(N1, Xs, RemovedElt, Ys)). Query: investigate(g,a) ---------------------------------------- (21) IfThenElseTransformerProof (EQUIVALENT) Transformed all if-then-else-constructs [PROLOG]. ---------------------------------------- (22) Obligation: Clauses: main(V1, V2) :- ','(init(100, 10, 4, V1, Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(1, Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(;(','(match(D, P), fail), true), p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(if(X, Y), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(100, 10, 4, .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(0, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(is(J, -(M, I)), ','(fill(J, .(pattern(Ppats), L), Symb), ','(is(N1, -(N, 1)), ','(if1(I, I1, M), init(N1, I1, M, Npats, Ipats, Rest))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(0, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(is(N1, -(N, 1)), get_pats(N1, Xs, Ys, Ipats)). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(0, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(is(N1, -(N, 1)), fill(N1, L, Rest)). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(is(Rand1, mod(*(Rand, 17), 251)), ','(is(N, mod(Rand1, Lin)), ','(split(N, In, X, In1), randomize(In1, Out, Rand1))))). split(0, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(is(N1, -(N, 1)), split(N1, Xs, RemovedElt, Ys)). if(X, Y) :- ','(call(atom(X)), ','(!, =(X, Y))). if(X, Y) :- match(X, Y). if1(I, I1, M) :- ','(call(==(I, 0)), ','(!, is(I1, M))). if1(I, I1, M) :- is(I1, -(I, 1)). Query: investigate(g,a) ---------------------------------------- (23) CallTransformerProof (EQUIVALENT) Transformed all call-constructs [PROLOG]. ---------------------------------------- (24) Obligation: Clauses: main(V1, V2) :- ','(init(100, 10, 4, V1, Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(1, Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(;(','(match(D, P), fail), true), p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(if(X, Y), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(100, 10, 4, .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(0, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(is(J, -(M, I)), ','(fill(J, .(pattern(Ppats), L), Symb), ','(is(N1, -(N, 1)), ','(if1(I, I1, M), init(N1, I1, M, Npats, Ipats, Rest))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(0, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(is(N1, -(N, 1)), get_pats(N1, Xs, Ys, Ipats)). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(0, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(is(N1, -(N, 1)), fill(N1, L, Rest)). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(is(Rand1, mod(*(Rand, 17), 251)), ','(is(N, mod(Rand1, Lin)), ','(split(N, In, X, In1), randomize(In1, Out, Rand1))))). split(0, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(is(N1, -(N, 1)), split(N1, Xs, RemovedElt, Ys)). if(X, Y) :- ','(call1(X), ','(!, =(X, Y))). if(X, Y) :- match(X, Y). if1(I, I1, M) :- ','(call2(I), ','(!, is(I1, M))). if1(I, I1, M) :- is(I1, -(I, 1)). call1(X) :- atom(X). call2(I) :- ==(I, 0). Query: investigate(g,a) ---------------------------------------- (25) CutEliminatorProof (SOUND) Eliminated all cuts by simply ignoring them[PROLOG]. ---------------------------------------- (26) Obligation: Clauses: main(V1, V2) :- ','(init(100, 10, 4, V1, Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(1, Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(;(','(match(D, P), fail), true), p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(if(X, Y), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(100, 10, 4, .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(0, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(is(J, -(M, I)), ','(fill(J, .(pattern(Ppats), L), Symb), ','(is(N1, -(N, 1)), ','(if1(I, I1, M), init(N1, I1, M, Npats, Ipats, Rest))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(0, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(is(N1, -(N, 1)), get_pats(N1, Xs, Ys, Ipats)). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(0, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(is(N1, -(N, 1)), fill(N1, L, Rest)). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(is(Rand1, mod(*(Rand, 17), 251)), ','(is(N, mod(Rand1, Lin)), ','(split(N, In, X, In1), randomize(In1, Out, Rand1))))). split(0, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(is(N1, -(N, 1)), split(N1, Xs, RemovedElt, Ys)). if(X, Y) :- ','(call1(X), =(X, Y)). if(X, Y) :- match(X, Y). if1(I, I1, M) :- ','(call2(I), is(I1, M)). if1(I, I1, M) :- is(I1, -(I, 1)). call1(X) :- atom(X). call2(I) :- ==(I, 0). Query: investigate(g,a) ---------------------------------------- (27) FailTransformerProof (EQUIVALENT) Added clauses for the built-in fail predicate [PROLOG]. ---------------------------------------- (28) Obligation: Clauses: main(V1, V2) :- ','(init(100, 10, 4, V1, Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(1, Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(;(','(match(D, P), fail), true), p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(if(X, Y), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(100, 10, 4, .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(0, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(is(J, -(M, I)), ','(fill(J, .(pattern(Ppats), L), Symb), ','(is(N1, -(N, 1)), ','(if1(I, I1, M), init(N1, I1, M, Npats, Ipats, Rest))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(0, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(is(N1, -(N, 1)), get_pats(N1, Xs, Ys, Ipats)). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(0, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(is(N1, -(N, 1)), fill(N1, L, Rest)). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(is(Rand1, mod(*(Rand, 17), 251)), ','(is(N, mod(Rand1, Lin)), ','(split(N, In, X, In1), randomize(In1, Out, Rand1))))). split(0, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(is(N1, -(N, 1)), split(N1, Xs, RemovedElt, Ys)). if(X, Y) :- ','(call1(X), =(X, Y)). if(X, Y) :- match(X, Y). if1(I, I1, M) :- ','(call2(I), is(I1, M)). if1(I, I1, M) :- is(I1, -(I, 1)). call1(X) :- atom(X). call2(I) :- ==(I, 0). fail :- failure(a). failure(b). Query: investigate(g,a) ---------------------------------------- (29) UnifyTransformerProof (EQUIVALENT) Added a fact for the built-in = predicate [PROLOG]. ---------------------------------------- (30) Obligation: Clauses: main(V1, V2) :- ','(init(100, 10, 4, V1, Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(1, Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(;(','(match(D, P), fail), true), p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(if(X, Y), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(100, 10, 4, .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(0, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(is(J, -(M, I)), ','(fill(J, .(pattern(Ppats), L), Symb), ','(is(N1, -(N, 1)), ','(if1(I, I1, M), init(N1, I1, M, Npats, Ipats, Rest))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(0, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(is(N1, -(N, 1)), get_pats(N1, Xs, Ys, Ipats)). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(0, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(is(N1, -(N, 1)), fill(N1, L, Rest)). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(is(Rand1, mod(*(Rand, 17), 251)), ','(is(N, mod(Rand1, Lin)), ','(split(N, In, X, In1), randomize(In1, Out, Rand1))))). split(0, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(is(N1, -(N, 1)), split(N1, Xs, RemovedElt, Ys)). if(X, Y) :- ','(call1(X), =(X, Y)). if(X, Y) :- match(X, Y). if1(I, I1, M) :- ','(call2(I), is(I1, M)). if1(I, I1, M) :- is(I1, -(I, 1)). call1(X) :- atom(X). call2(I) :- ==(I, 0). fail :- failure(a). failure(b). =(X, X). Query: investigate(g,a) ---------------------------------------- (31) OrTransformerProof (EQUIVALENT) Transformed all or-constructs[PROLOG]. ---------------------------------------- (32) Obligation: Clauses: main(V1, V2) :- ','(init(100, 10, 4, V1, Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(1, Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(','(match(D, P), fail), p_match(Patterns, D)). p_match(.(P, Patterns), D) :- ','(true, p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(if(X, Y), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(100, 10, 4, .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(0, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(is(J, -(M, I)), ','(fill(J, .(pattern(Ppats), L), Symb), ','(is(N1, -(N, 1)), ','(if1(I, I1, M), init(N1, I1, M, Npats, Ipats, Rest))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(0, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(is(N1, -(N, 1)), get_pats(N1, Xs, Ys, Ipats)). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(0, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(is(N1, -(N, 1)), fill(N1, L, Rest)). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(is(Rand1, mod(*(Rand, 17), 251)), ','(is(N, mod(Rand1, Lin)), ','(split(N, In, X, In1), randomize(In1, Out, Rand1))))). split(0, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(is(N1, -(N, 1)), split(N1, Xs, RemovedElt, Ys)). if(X, Y) :- ','(call1(X), =(X, Y)). if(X, Y) :- match(X, Y). if1(I, I1, M) :- ','(call2(I), is(I1, M)). if1(I, I1, M) :- is(I1, -(I, 1)). call1(X) :- atom(X). call2(I) :- ==(I, 0). fail :- failure(a). failure(b). =(X, X). Query: investigate(g,a) ---------------------------------------- (33) UndefinedPredicateHandlerProof (SOUND) Added facts for all undefined predicates [PROLOG]. ---------------------------------------- (34) Obligation: Clauses: main(V1, V2) :- ','(init(100, 10, 4, V1, Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, V2))). investigate([], X1). investigate(.(U, Units), Patterns) :- ','(property(U, pattern, Data), ','(p_investigate(Data, Patterns), investigate(Units, Patterns))). property([], _X, _Y) :- fail. property(.(Prop, RProps), P, Val) :- ','(functor(Prop, P, _X), arg(1, Prop, Val)). property(.(_X, RProps), P, Val) :- property(RProps, P, Val). p_investigate([], _X). p_investigate(.(D, Data), Patterns) :- ','(p_match(Patterns, D), p_investigate(Data, Patterns)). p_match([], X2). p_match(.(P, Patterns), D) :- ','(','(match(D, P), fail), p_match(Patterns, D)). p_match(.(P, Patterns), D) :- ','(true, p_match(Patterns, D)). match([], []). match(.(X, PRest), .(Y, SRest)) :- ','(var(Y), ','(=(X, Y), match(PRest, SRest))). match(List, .(Y, Rest)) :- ','(nonvar(Y), ','(=(Y, star(X)), ','(concat(X, SRest, List), match(SRest, Rest)))). match(.(X, PRest), .(Y, SRest)) :- ','(if(X, Y), match(PRest, SRest)). concat([], L, L). concat(.(X, L1), L2, .(X, L3)) :- concat(L1, L2, L3). main :- ','(init(100, 10, 4, .(.(a, .(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(a, .(a, .(a, .(b, .(b, .(a, .(a, .(a, []))))))))))))))))), .(.(a, .(a, .(b, .(b, .(b, .(b, .(a, .(a, .(.(a, .(a, [])), .(.(b, .(b, [])), [])))))))))), .(.(a, .(a, .(a, .(b, .(.(b, .(a, [])), .(b, .(a, .(b, .(a, []))))))))), []))), Symbols), ','(randomize(Symbols, RSymbols, 21), investigate(RSymbols, .(.(star(SA), .(B, .(star(SB), .(B, .(a, .(star(SA), .(a, .(star(SB), .(star(SA), []))))))))), .(.(star(SA), .(star(SB), .(star(SB), .(star(SA), .(.(star(SA), []), .(.(star(SB), []), [])))))), .(.(_X, .(_Y, .(star(_Z), .(.(b, .(a, [])), .(star(_A), .(_B, .(_C, []))))))), [])))))). init(N, M, Npats, Ipats, Result) :- init(N, M, M, Npats, Ipats, Result). init(0, _X, _Y, _Z, _W, _L). init(N, I, M, Npats, Ipats, .(Symb, Rest)) :- ','(fill(I, [], L), ','(get_pats(Npats, Ipats, Ppats), ','(is(J, -(M, I)), ','(fill(J, .(pattern(Ppats), L), Symb), ','(is(N1, -(N, 1)), ','(if1(I, I1, M), init(N1, I1, M, Npats, Ipats, Rest))))))). get_pats(Npats, Ipats, Result) :- get_pats(Npats, Ipats, Result, Ipats). get_pats(0, _X, [], _Y). get_pats(N, .(X, Xs), .(X, Ys), Ipats) :- ','(is(N1, -(N, 1)), get_pats(N1, Xs, Ys, Ipats)). get_pats(N, [], Ys, Ipats) :- get_pats(N, Ipats, Ys, Ipats). fill(0, L, L). fill(N, L, .(dummy([]), Rest)) :- ','(is(N1, -(N, 1)), fill(N1, L, Rest)). randomize([], [], X3). randomize(In, .(X, Out), Rand) :- ','(length(In, Lin), ','(is(Rand1, mod(*(Rand, 17), 251)), ','(is(N, mod(Rand1, Lin)), ','(split(N, In, X, In1), randomize(In1, Out, Rand1))))). split(0, .(X, Xs), X, Xs). split(N, .(X, Xs), RemovedElt, .(X, Ys)) :- ','(is(N1, -(N, 1)), split(N1, Xs, RemovedElt, Ys)). if(X, Y) :- ','(call1(X), =(X, Y)). if(X, Y) :- match(X, Y). if1(I, I1, M) :- ','(call2(I), is(I1, M)). if1(I, I1, M) :- is(I1, -(I, 1)). call1(X) :- atom(X). call2(I) :- ==(I, 0). fail :- failure(a). failure(b). =(X, X). functor(X0, X1, X2). arg(X0, X1, X2). true. var(X0). nonvar(X0). is(X0, X1). length(X0, X1). atom(X0). ==(X0, X1). Query: investigate(g,a)