Fault recovery in discrete-event systems using observer-based supervisors