can と be able to については、いろいろな本で説明されており、過去形の場合「やる能力があって実際にやった」場合にはwas able to、「習慣的能力があった、恒久的な能力あった」場合はcould、などと説明されています。 つまり「I could swim」の場合は、実際に泳いだ・泳がなかったは関係なく、その時点で「泳げる能力があった」ということを示すのに対し、「I was able to swim」は、ある時点で実際に泳ぐことができた(たとえば川に落ちた時に泳げた)ということを指すということです。 これで言うと、be able to の場合は一時的にできたことにも使えるのに対し、could は一回限りできたことには使えません。たとえば I could not see it. は恒久的な理由で(たとえば視力が悪いなど)それが見えなかった場合。I was not able to see it. は、障害物があって一時的に見えなかった場合、という風にもなります。
現在形の場合は「能力」をあらわすとして、意味はほぼ同じとされていますが、実際のところ、過去形現在形に関係なく、両者には本質的な違いがあります。 can は「できごとの可能性」、be able to はその「能力があるかないかの状態」を表すのです。 ですから、I can swim. = 私が泳ぐという「できごとが起こりうる」。つまり、泳げるということ(実際に泳ぐ泳がないは関係なく、そのできごとは起こりうる) I am able to swim = 私は、泳ぐことが可能な状態。つまり泳げるということ(現在泳げる「状態」であって、それは恒久的な能力とは限らない)。 結果的には「泳げる」で同じとなりますが、視点は全く違うことに気づくと思います。 これでいくと、it can snow. は OK でも it is able to snow. はおかしいことがわかります(雪が降る可能性はあると言えるが、雪の降る能力に言及するのはおかしい)。 さらに、「You can leave this room」が命令的な意味になることも、「You can have this if you want」が穏やかな許可になることも、そういう出来事が起こる可能性に言及してると理解すると、すんなりわかります。これらの文に be able to を使うと、命令的な意味も許可の意味もなくなり、単に「できる能力がある」という状態を表すことになります。
can は助動詞なので、動詞を助ける単語(動詞に「可能性」という広がりを持たせている)、be able to は普通の動詞(動作を表すだけの語)と理解すればわかりやすと思います。