UPDATE: edited the examples to show concrete types so it's easier to understand.
Kostis Sagonas goes over PropEr and Dialyzer for Erlang.
With these two tools one can have a stronger type system than Haskell. PropEr is amazing work. Not to mention CED https://github.com/mariachris/CED which checks all possible state transitions for race conditions.
Even with documentation, I'll never be able to do justice to the art of logic programming - if you're willing to pick up The Reasoned Schemer you'll understand exactly how core.logic works and any good Prolog book will take you the rest of the way.
Prolog as general programming paradigm has problems - Prolog/Datalog as a way for programmers to reason about their own programs is an untapped goldmine.
We don't want provability or inference as the first approach to problems - slapping something together with a mix of mutable/functional code is Good Enough to start understanding the domain. But once the solution is complex, and it's necessary to improve iteration times and lower error rates, it tends to be too hard to jury-rig deeper logical properties into existing languages; it leads to mucking about with the build system and compilation process at a deep level, which adds a ton of extra complexity. The "now you have two problems" quote comes to mind.