Mitigating Hallucinations in Large Language Models via Causal Reasoning