In this paper we present a language-based fault diagnosis framework for both permanent and intermittent faults, where each fault is associated with two events, describing respectively the activation and deactivation of the fault. We first introduce the concept of F-diagnosability, which requires a fault to be identifiable before it may disappear owing to recovery. Then we present a language-based sufficient and necessary condition to ensure F-diagnosability. Considering the PSPACE-hard nature of verifying F-diagnosability, our key contribution is to present a verifiable condition called F-consistency and a polynomial-time verification algorithm, relying on a novel state-weight updating strategy. If the plant is not F-diagnosable for a specific fault, then the algorithm will output false, which means the algorithm ensures no missing alarms, in the sense of misclassifying a non-F-diagnosable plant as an F-diagnosable one. But if the plant is F-diagnosable, then the algorithm will guarantee to output true, if the plant is F-consistent for the fault F. In other words, the proposed verification algorithm attains a tradeoff between computational complexity and quality of verification by reducing the original PSPACE-complete complexity to a polynomial-time complexity, and at the same time allowing possible false alarms, i.e., misclassifying an F-diagnosable plant as a non-F-diagnosable one, unless the proposed F-consistency property for the fault F holds in the plant. Theoretically speaking, our work identifies a subclass of plants that are F-consistent for a fault F, upon which the problem of verifying F-diagnosability becomes polynomial-time solvable instead of being PSPACE-complete.