All of the answers here are more or less on the right track, but I think are missing some of the details about why..
First, the sentence:
Yesterday I could lift the couch but today, after the injury, I can barely walk.
Is grammatically fine and perfectly idiomatic, but may or may not have the implication you're wanting, depending on what that is (which I'll explain more below).
You are also correct that:
Yesterday I could go there but I did not
is not correct, but I don't think your stated reason is quite right. The problem is not that it's for a single event (that's fine), but that (as others have mentioned) your use of "could" in this way implies that you did, so when you then say that you did not, it is self-contradictory.
The complication here stems from the fact that the word "could", by itself, can be one of two things:
- It is the simple past tense of "can" ("Today, I can lift the couch" --> "Yesterday, I could lift the couch")
- It is also the conditional present tense of "can" ("I could eat that cookie right now")
The conditional form of a verb implies that what is being described is not actually taking place, but has the potential to take place, if a particular condition is met. In the above example, the condition is not explicitly stated, but there is an implied condition of:
I could eat that cookie right now (if I decided to).
So how does "could have" fit into all of this? Well, "could have" is simply the past form of the conditional present version of "could". That is, "could have" is the conditional past form of "can". It implies that something in the past did not happen but had the potential to happen if some condition had been met.
- Simple Present: "can" -- Something is able to happen.
- Simple Past: "could" -- Something was able to happen, and by implication, did happen.
- Conditional Present: "could" -- Something is able to happen, but is not (or may not) due to some condition.
- Conditional Past: "could have" -- Something was able to happen, but did not happen due to some condition.
So what does this all mean for your original question? Let's look at the different possible forms of lifting the couch:
I can lift the couch. (now)
This is the simple present. You are simply expressing that you have the ability to lift the couch. There are no particular implications beyond that, however.
I could lift the couch. (now)
This is the conditional present. You are expressing that you would be able to lift the couch if you wanted/decided to, but you might not.
Yesterday, I could lift the couch.
This is the simple past. You are expressing that you were able to lift the couch, and implying that you actually did.
Yesterday, I could have lifted the couch.
This is the conditional past. You are expressing that you were able to lift the couch, but implying that you did not (because you did not decide to, or something else prevented you from doing so).
I hope this helps clear things up a bit..