Since an easier class is included as a subset of a harder one, it is
helpful to have a notion of a language (i.e., problem) being among the
hardest possible within a class. Let X refer to either P, NP, PSPACE,
or EXPTIME. A language is called *X-hard* if every language
in class X is *polynomial-time reducible* to . In short,
this means that in polynomial time, any language in can be
translated into instances for language , and then the decisions for
can be correctly translated back in polynomial time to correctly
decide . Thus, if can be decided, then within a
polynomial-time factor, every language in X can be decided. The
hardness concept can even be applied to a language (problem) that does
not belong to the class. For example, we can declare that a language
is NP-hard even if
NP (it could be harder and lie in
EXPTIME, for example). If it is known that the language is both hard
for some class X and is also a member of X, then it is called *X-complete* (i.e., NP-complete, PSPACE-complete, etc.).^{6.8} Note that because of this uncertainty regarding P,
NP, and PSPACE, one cannot say that a problem is intractable if it is
NP-hard or PSPACE-hard, but one can, however, if the problem is
EXPTIME-hard. One additional remark: it is useful to remember that
PSPACE-hard implies NP-hard.

Steven M LaValle 2020-08-14