Hacklang also has something like type guards called type refinement [0].
I'm still kinda new to the idea of using conditional branches to inform static type checkers but it sounds like it's an idea that has been thought about in some depth [1][2][3] (i.e. doesn't sound like it was jimmy-rigged to match common JS patterns).
I personally love type refinement. Hacklang's type refinement was the first time it clicked that statically typed languages could _actually help_ you write code instead of get in the way.
Having algorithms that learn is nothing new. Steamrollers (neural networks, genetic algorithms, etc.) have been learning from their mistakes for a long time. I think chubot (http://news.ycombinator.com/item?id=2217740) explained best the problem Chomsky seems to have with Watson.