I have a friend who describes C as a really nice macro language for accessing and setting addresses. This really isn't much of an exageration. The imperative languages were a direct incremental step in the progress up from machine language, and assembly language. In my undergrad architecture course we learned to hand assemble C code to VAX assembler and it was really a pretty trivial task. In Functional programming the model of computation is much more abstract.
Variable names have a very different meaning in Functional programming.
They are just a conveniece for giving names to values, not memory addresses. Functional languages generally have a much richer notion of data type, and in particular do automatic memory management for dynamic structures. Modern functional languages also support the notion of higher-order programming in which functions can be freely passed as parameters. In Logic Programming the model of computation is not. That is, in theory, when you write a logic program you are not describing a computation, but rather a set of properties of data and relationships that hold between different data.