Abstract interpretation of logic programs