Look Ma, a FOL resolution theorem prover in Prolog:
See also:
http://logic.stanford.edu/intrologic/chapters/chapter_14.html
many([], S, S).
many([C|T], S, R) :- next(C, T, S, R).
next(C, T, S, R) :- member(D, S), weaker(D, C), !, many(T, S, R).
next(C, T, S, R) :- filter(S, C, K), apply(C, K, H),
append(T, H, J), many(J, [C|K], R).
apply(C, S, T) :-
findall(E, (member(D, S), resolvent(C, D, E)), T).
resolvent(C, D, E) :-
select(A, C, H), factor(A, H, C2),
select(B, D, J), factor(B, J, D2),
opposite(A, B),
append(C2, D2, E).
opposite(pos(A), neg(A)).
opposite(neg(A), pos(A)).
factor(_, C, C).
factor(A, C, C2) :- select(A, C, H), factor(A, H, C2).
filter([], _, []).
filter([D|L], C, R) :- weaker(C, D), !, filter(L, C, R).
filter([D|L], C, [D|R]) :- filter(L, C, R).
weaker(C, D) :- \+ \+ (numbervars(D, 0, _), subset(C, D)).
subset([], _).
subset([X|L], R) :- member(X, R), subset(L, R).
% ?- many([[pos(p(X)),pos(p(Y))],[neg(p(U)),neg(p(V))]],[],S).
% S = [[]].