
test(0) :- prove(imp(atom(a), atom(a))).
test(1) :- prove(imp(atom(a), imp(atom(b), atom(a)))).
test(2) :- prove(imp(imp(atom(a), atom(b)), imp(imp(atom(a), imp(atom(b), atom(c))), imp(atom(a), atom(c))))).
test(3) :- prove(imp(and(atom(a), atom(b)), and(atom(b), atom(a)))).
test(4) :- prove(imp(or(atom(a), atom(b)), or(atom(b), atom(a)))).
test(5) :- prove(imp(and(or(atom(a), atom(c)), imp(atom(b), atom(c))), imp(imp(atom(a), atom(b)), atom(c)))).
test(6) :- prove(imp(or(imp(atom(a), atom(b)), imp(atom(a), atom(c))), imp(atom(a), or(atom(b), atom(c))))).
test(7) :- prove(imp(and(or(atom(a), atom(b)), imp(atom(b), atom(c))), imp(imp(atom(a), atom(b)), atom(c)))).
test(8) :- prove(imp(imp(atom(a), atom(b)), imp(imp(atom(b), atom(c)), imp(imp(atom(c), atom(d)), imp(atom(a), atom(d)))))).
test(9) :- prove(imp(imp(atom(a), atom(b)), imp(imp(atom(a), atom(c)), imp(atom(a), atom(b))))).
test(10) :- prove(imp(imp(atom(a), atom(b)), imp(imp(atom(a), atom(c)), imp(atom(a), atom(c))))).
test(11) :- prove(imp(atom(a), imp(imp(atom(a), atom(b)), imp(imp(atom(a), atom(c)), atom(b))))).
test(12) :- prove(imp(atom(a), imp(imp(atom(a), atom(b)), imp(imp(atom(a), atom(c)), atom(c))))).
test(13) :- prove(imp(imp(atom(a), imp(atom(b), atom(c))), imp(atom(a), imp(atom(b), atom(c))))).
test(14) :- prove(imp(imp(atom(a), imp(atom(b), atom(c))), imp(atom(b), imp(atom(a), atom(c))))).
test(15) :- prove(imp(atom(a), imp(atom(b), imp(imp(atom(a), imp(atom(b), atom(c))), atom(c))))).
test(16) :- prove(imp(atom(b), imp(atom(a), imp(imp(atom(a), imp(atom(b), atom(c))), atom(c))))).
test(17) :- prove(imp(imp(atom(a), atom(b)), imp(atom(a), atom(b)))).
test(18) :- prove(imp(imp(imp(atom(a), atom(b)), atom(c)), imp(imp(atom(a), atom(b)), atom(c)))).
test(19) :- prove(imp(imp(imp(imp(atom(a), atom(b)), atom(c)), atom(d)), imp(imp(imp(atom(a), atom(b)), atom(c)), atom(d)))).
test(20) :- prove(imp(imp(imp(imp(imp(atom(a), atom(b)), atom(c)), atom(d)), atom(e)), imp(imp(imp(imp(atom(a), atom(b)), atom(c)), atom(d)), atom(e)))).
test(21) :- prove(imp(imp(imp(imp(imp(imp(atom(a), atom(b)), atom(c)), atom(d)), atom(e)), atom(g)), imp(imp(imp(imp(imp(atom(a), atom(b)), atom(c)), atom(d)), atom(e)), atom(g)))).
test(22) :- prove(imp(imp(imp(imp(imp(imp(atom(a), atom(b)), atom(c)), atom(d)), atom(e)), atom(g)), or(imp(imp(imp(imp(imp(atom(a), atom(b)), atom(c)), atom(d)), atom(e)), atom(g)), imp(imp(imp(imp(imp(atom(a), atom(b)), atom(c)), atom(d)), atom(e)), atom(g))))).
test(23) :- prove(imp(imp(imp(atom(a), atom(b)), atom(c)), imp(atom(d), or(atom(d), atom(d))))).
test(24) :- prove(imp(imp(or(atom(a), atom(b)), atom(c)), or(imp(atom(a), atom(c)), imp(atom(b), atom(c))))).
test(25) :- prove(imp(imp(imp(atom(a), or(atom(b), atom(c))), atom(d)), imp(atom(a), imp(or(atom(b), atom(c)), atom(d))))).
test(26) :- prove(imp(imp(and(atom(a), atom(b)), or(atom(c), atom(d))), imp(imp(or(atom(c), atom(d)), top), imp(and(atom(a), atom(b)), top)))).
test(27) :- prove(imp(imp(or(atom(a), imp(atom(a), bot)), bot), bot)).
test(28) :- prove(and(imp(imp(atom(a), and(atom(b), atom(c))), and(imp(atom(a), atom(b)), imp(atom(a), atom(c)))), imp(and(imp(atom(a), atom(b)), imp(atom(a), atom(c))), imp(atom(a), and(atom(b), atom(c)))))).
test(29) :- prove(imp(imp(atom(a), atom(b)), imp(imp(atom(c), or(atom(d), and(atom(a), atom(d)))), imp(atom(c), or(atom(d), and(atom(b), atom(d))))))).
test(30) :- prove(imp(imp(atom(a), atom(b)), imp(imp(atom(a), imp(atom(b), atom(c))), imp(atom(a), atom(c))))).
test(31) :- prove(imp(imp(atom(a), atom(b)), imp(or(atom(a), atom(c)), or(atom(b), atom(c))))).
test(32) :- prove(imp(atom(a), imp(imp(atom(a), bot), bot))).
test(33) :- prove(imp(or(imp(atom(a), bot), atom(a)), imp(imp(imp(atom(a), bot), bot), atom(a)))).
test(34) :- prove(imp(and(imp(atom(a), bot), atom(b)), imp(imp(imp(atom(a), atom(b)), imp(imp(atom(a), bot), imp(atom(b), bot))), bot))).
test(35) :- prove(imp(and(atom(a), atom(b)), imp(or(imp(atom(a), bot), imp(atom(b), bot)), bot))).
test(36) :- prove(imp(or(atom(a), atom(b)), imp(and(imp(atom(a), bot), imp(atom(b), bot)), bot))).
test(37) :- prove(imp(or(imp(atom(a), bot), imp(atom(b), bot)), imp(and(atom(a), atom(b)), bot))).
test(38) :- prove(and(imp(and(imp(atom(a), bot), imp(atom(b), bot)), imp(or(atom(a), atom(b)), bot)), imp(imp(or(atom(a), atom(b)), bot), and(imp(atom(a), bot), imp(atom(b), bot))))).
test(39) :- prove(imp(and(atom(a), atom(b)), imp(imp(atom(a), imp(atom(b), bot)), bot))).
test(40) :- prove(imp(imp(atom(a), atom(b)), imp(and(atom(a), imp(atom(b), bot)), bot))).
test(41) :- prove(imp(and(atom(a), imp(atom(b), bot)), imp(imp(atom(a), atom(b)), bot))).
test(42) :- prove(and(imp(imp(atom(a), imp(atom(b), bot)), imp(and(atom(a), atom(b)), bot)), imp(imp(and(atom(a), atom(b)), bot), imp(atom(a), imp(atom(b), bot))))).
test(43) :- prove(imp(or(atom(a), atom(b)), imp(imp(atom(a), bot), atom(b)))).
test(44) :- prove(imp(or(imp(atom(a), bot), atom(b)), imp(atom(a), atom(b)))).
test(45) :- refute(or(atom(a), imp(atom(a), bot))).
test(46) :- refute(imp(imp(atom(a), or(atom(b), atom(c))), or(imp(atom(a), atom(b)), imp(atom(a), atom(c))))).
test(47) :- refute(imp(imp(imp(atom(a), atom(b)), atom(c)), and(or(atom(a), atom(b)), imp(atom(b), atom(c))))).
test(48) :- refute(imp(imp(imp(imp(atom(a), bot), bot), atom(a)), or(atom(a), imp(atom(a), bot)))).
test(49) :- refute(imp(imp(imp(atom(a), atom(b)), atom(a)), atom(a))).
test(50) :- refute(imp(imp(or(imp(atom(a), bot), imp(atom(b), bot)), bot), and(atom(a), atom(b)))).
test(51) :- refute(imp(imp(and(imp(atom(a), bot), imp(atom(b), bot)), bot), or(atom(a), atom(b)))).
test(52) :- refute(imp(imp(and(atom(a), atom(b)), bot), or(imp(atom(a), bot), imp(atom(b), bot)))).
test(53) :- refute(imp(imp(imp(atom(a), imp(atom(b), bot)), bot), and(atom(a), atom(b)))).
test(54) :- refute(imp(imp(and(atom(a), imp(atom(b), bot)), bot), imp(atom(a), atom(b)))).
test(55) :- refute(imp(imp(imp(atom(a), atom(b)), bot), and(atom(a), imp(atom(b), bot)))).
test(56) :- refute(imp(imp(imp(atom(a), bot), atom(b)), or(atom(a), atom(b)))).
test(57) :- refute(imp(imp(atom(a), atom(b)), or(imp(atom(a), bot), atom(b)))).


refute(P) :-
    \+ prove(P).

testone(N, CorrectIn, CorrectOut) :-
    test(N),
    !,
    format(user_output, "Passed ~p.\n", [N]),
    CorrectOut is CorrectIn + 1.

testone(N, CorrectIn, CorrectIn) :-
    format(user_output, "Failed ~p.\n", [N]).

testall(58, Correct) :-
    !,
    format(user_output, "Passed ~p tests out of ~p.\n", [Correct, 58]).

testall(N, Correct) :-
    testone(N, Correct, Correct1),
    !,
    N1 is N + 1,
    testall(N1, Correct1).

test :-
    testall(0, 0).
