I think "Declarative Programming" is an important idea, but it means different things to different people.
Most would agree that it means expressing "what" a program should accomplish, rather than "how". I agree with that, more or less, but I think it's impossibly vague.
Some think that to be declarative a language should have no notion of time-sequence of execution, with assignments. I think that is too restrictive.
Some think that a declarative language should somehow resemble a formal logic, like predicate calculus, as in Prolog or SQL.
I think of declarativity not in terms of specific syntax or semantic features, but rather in terms of the directness with which it expresses requirements, as in a domain-specific-language (DSL).
One effect of such directness is that code is both short and clear.
This is a goal that should not be thought of as being achieved, but rather sought after. I get annoyed whenever I hear that a certain language "is declarative", when the measure of its declarativity is how succinctly it expresses problems and their solutions, and that can only be measured in specific cases.
Just by way of example, Differential Execution is the basis for a DSL that I wrote and use for programming complex user interfaces. It does not satisfy any of the usual definitions of DSL or declarativity, but it does accomplish the real result of making source code short (by an order of magnitude compared to common approaches), clear, and easily modified.
It does not insist on being easily understood by the uninitiated, rather requiring a one-time learning curve as the price of its productivity.