1 The concrete case of finite automata A simple algorithm for checking language equivalence of finite automata consists in trying to compute a bisimulation that relates them. This is possible because language equivalence can be characterised coinductively, as the largest bisimulation.More precisely, consider an automaton S, t, o , where S is a (finite) set of states, t : S → P(S)A is a non-deterministic transition function, and o : S → 2 is the characteristic function of the set of accepting states. Such an automation gives rise to a determinised automaton P(S), t , o , where t : P(S) → P(S) A and o : P(S) → 2 are the natural extensions of t and o to sets. A bisimulation is a relation R between sets of states such that for all sets of states X, Y , X R Y entails:, and 2. for all letter a, t a (X) R t a (Y ).The coinductive characterisation is the following one: two sets of states recognise the same language if and only if they are related by some bisimulation.Taking inspiration from concurrency theory [4,5], one can improve this proof technique by weakening the second item in the definition of bisimulation: given a function f on binary relations, a bisimulation up to f is a relation R between states such that for all sets X, Y , X R Y entails:For well-chosen functions f , bisimulations up to f are contained in a bisimulation, so that the improvement is sound. So is the function mapping each relation to its equivalence closure. In this particular case, one recover the standard algorithm by Hopcroft and Karp [2]: two sets can be skipped whenever they can already be related by a sequence of pairwise related states.One can actually do more, by considering the function c mapping each relation to its congruence closure: the smallest equivalence relation which contains Appeared as an invited talk in Proc.