Combining logical and probabilistic reasoning in program analysis