The type set is defined as "all types which implement the interface".
Any type implementing interface{int; m()} has to both
1. have the method m()
2. be the type int
That's not possible. Therefore, the type set of that interface is empty.
However, since then, the design has changed and become more restricted, so the proof might no longer be accurate (I also wrote a follow-up, but the design has changed after that as well). So, I don't know if this is still NP-hard.
If it is, though, that would present a problem, because if the spec defines interface types to be identical, if their type sets are identical, the compiler would have to solve an NP-hard problem to check if two interface types are indeed identical. Obviously, we want to avoid needing a compiler to do that, so our definition should then not depend on the actual type sets.
Currently, this isn't a problem, because the compiler only has to check if two interface types are identical, when this is trivial to do, by comparing method sets. So, in a sense, it doesn't matter if "the spec is right or not", because there is no one disagreeing with the spec. But we might want to consider this, if we ever allow *other* interfaces to be full types (i.e. to take values), because then the compiler would have to actually be able to check that.
At that point, we should either a) be certain that we can efficiently compute type sets, or b) change the definition to no longer rely on type sets (as we did for e.g. whether or not it's valid to call methods or use operators).