In
computer science
Computer science is the study of computation, information, and automation. Computer science spans Theoretical computer science, theoretical disciplines (such as algorithms, theory of computation, and information theory) to Applied science, ...
, declarative programming is a
programming paradigm
A programming paradigm is a relatively high-level way to conceptualize and structure the implementation of a computer program. A programming language can be classified as supporting one or more paradigms.
Paradigms are separated along and descri ...
—a style of building the structure and elements of computer programs—that expresses the logic of a
computation
A computation is any type of arithmetic or non-arithmetic calculation that is well-defined. Common examples of computation are mathematical equation solving and the execution of computer algorithms.
Mechanical or electronic devices (or, hist ...
without describing its
control flow.
Many languages that apply this style attempt to minimize or eliminate
side effects by describing ''what'' the program must accomplish in terms of the
problem domain, rather than describing ''how'' to accomplish it as a sequence of the programming
language primitives
(the ''how'' being left up to the language's
implementation
Implementation is the realization of an application, execution of a plan, idea, scientific modelling, model, design, specification, Standardization, standard, algorithm, policy, or the Management, administration or management of a process or Goal ...
). This is in contrast with
imperative programming
In computer science, imperative programming is a programming paradigm of software that uses Statement (computer science), statements that change a program's state (computer science), state. In much the same way that the imperative mood in natural ...
, which implements
algorithm
In mathematics and computer science, an algorithm () is a finite sequence of Rigour#Mathematics, mathematically rigorous instructions, typically used to solve a class of specific Computational problem, problems or to perform a computation. Algo ...
s in explicit steps.
Declarative programming often considers
programs as theories of a
formal logic
Logic is the study of correct reasoning. It includes both formal and informal logic. Formal logic is the study of deductively valid inferences or logical truths. It examines how conclusions follow from premises based on the structure o ...
, and computations as deductions in that logic space. Declarative programming may greatly simplify writing
parallel programs.
Common declarative languages include those of
database query languages (e.g.,
SQL,
XQuery),
regular expressions,
logic programming (e.g.
Prolog
Prolog is a logic programming language that has its origins in artificial intelligence, automated theorem proving, and computational linguistics.
Prolog has its roots in first-order logic, a formal logic. Unlike many other programming language ...
,
Datalog,
answer set programming),
functional programming
In computer science, functional programming is a programming paradigm where programs are constructed by Function application, applying and Function composition (computer science), composing Function (computer science), functions. It is a declarat ...
,
configuration management, and
algebraic modeling systems.
Definition
Declarative programming is often defined as any style of programming that is not imperative. A number of other common definitions attempt to define it by simply contrasting it with imperative programming. For example:
* A high-level program that describes what a computation should perform.
* Any programming language that lacks
side effects (or more specifically, is
referentially transparent).
* A language with a clear correspondence to
mathematical logic
Mathematical logic is the study of Logic#Formal logic, formal logic within mathematics. Major subareas include model theory, proof theory, set theory, and recursion theory (also known as computability theory). Research in mathematical logic com ...
.
These definitions overlap substantially.
Declarative programming is a non-imperative style of programming in which programs describe their desired results without explicitly listing commands or steps that must be performed. Functional and logic programming languages are characterized by a declarative programming style. In logic programming, programs consist of sentences expressed in logical form, and computation uses those sentences to solve problems, which are also expressed in logical form.
In a
pure functional language, such as
Haskell, all functions are
without side effects, and state changes are only represented as functions that transform the state, which is explicitly represented as a
first-class object in the program. Although pure functional languages are non-imperative, they often provide a facility for describing the effect of a function as a series of steps. Other functional languages, such as
Lisp
Lisp (historically LISP, an abbreviation of "list processing") is a family of programming languages with a long history and a distinctive, fully parenthesized Polish notation#Explanation, prefix notation.
Originally specified in the late 1950s, ...
,
OCaml
OCaml ( , formerly Objective Caml) is a General-purpose programming language, general-purpose, High-level programming language, high-level, Comparison of multi-paradigm programming languages, multi-paradigm programming language which extends the ...
and
Erlang, support a mixture of procedural and functional programming.
Some logic programming languages, such as
Prolog
Prolog is a logic programming language that has its origins in artificial intelligence, automated theorem proving, and computational linguistics.
Prolog has its roots in first-order logic, a formal logic. Unlike many other programming language ...
, and database query languages, such as SQL, while declarative in principle, also support a procedural style of programming.
Subparadigms
Declarative programming is an
umbrella term
Hypernymy and hyponymy are the wikt:Wiktionary:Semantic relations, semantic relations between a generic term (''hypernym'') and a more specific term (''hyponym''). The hypernym is also called a ''supertype'', ''umbrella term'', or ''blanket term ...
that includes a number of better-known
programming paradigm
A programming paradigm is a relatively high-level way to conceptualize and structure the implementation of a computer program. A programming language can be classified as supporting one or more paradigms.
Paradigms are separated along and descri ...
s.
Constraint programming
Constraint programming states relations between variables in the form of constraints that specify the properties of the target solution. The set of constraints is
solved by giving a value to each variable so that the solution is consistent with the maximum number of constraints. Constraint programming often complements other paradigms: functional, logical, or even imperative programming.
Domain-specific languages
Well-known examples of declarative domain-specific languages (DSLs) include the
yacc
Yacc (Yet Another Compiler-Compiler) is a computer program for the Unix operating system developed by Stephen C. Johnson. It is a lookahead left-to-right rightmost derivation (LALR) parser generator, generating a LALR parser (the part of a co ...
parser generator input language,
QML, the
Make build specification language,
Puppet
A puppet is an object, often resembling a human, animal or Legendary creature, mythical figure, that is animated or manipulated by a person called a puppeteer. Puppetry is an ancient form of theatre which dates back to the 5th century BC in anci ...
's configuration management language,
regular expressions,
Datalog,
answer set programming and a subset of
SQL (SELECT queries, for example). DSLs have the advantage of being useful while not necessarily needing to be
Turing-complete, which makes it easier for a language to be purely declarative.
Many markup languages such as
HTML
Hypertext Markup Language (HTML) is the standard markup language for documents designed to be displayed in a web browser. It defines the content and structure of web content. It is often assisted by technologies such as Cascading Style Sheets ( ...
,
MXML,
XAML,
XSLT or other
user-interface markup languages are often declarative. HTML, for example, only describes what should appear on a webpage - it specifies neither
control flow for rendering a page nor the page's possible
interactions with a user.
, some software systems combine traditional user-interface markup languages (such as HTML) with declarative markup that defines what (but not how) the back-end server systems should do to support the declared interface. Such systems, typically using a domain-specific
XML namespace, may include abstractions of SQL database syntax or parameterized calls to web services using
representational state transfer (REST) and
SOAP
Soap is a salt (chemistry), salt of a fatty acid (sometimes other carboxylic acids) used for cleaning and lubricating products as well as other applications. In a domestic setting, soaps, specifically "toilet soaps", are surfactants usually u ...
.
Functional programming
Functional programming languages such as
Haskell,
Scheme, and
ML evaluate expressions via function application. Unlike the related but more imperative paradigm of
procedural programming
Procedural programming is a programming paradigm, classified as imperative programming, that involves implementing the behavior of a computer program as Function (computer programming), procedures (a.k.a. functions, subroutines) that call each o ...
, functional programming places little emphasis on explicit sequencing. Instead, computations are characterised by various kinds of recursive
higher-order function In mathematics and computer science, a higher-order function (HOF) is a function that does at least one of the following:
* takes one or more functions as arguments (i.e. a procedural parameter, which is a parameter of a procedure that is itself ...
application and
composition, and as such can be regarded simply as a set of mappings between
domains and
codomains. Many functional languages, including most of those in the ML and Lisp families, are not
purely functional, and thus allow the introduction of
stateful effects in programs.
Hybrid languages
Makefiles, for example, specify dependencies in a declarative fashion, but include an imperative list of actions to take as well. Similarly, yacc specifies a context free grammar declaratively, but includes code snippets from a host language, which is usually imperative (such as
C).
Logic programming
Logic programming languages, such as
Prolog
Prolog is a logic programming language that has its origins in artificial intelligence, automated theorem proving, and computational linguistics.
Prolog has its roots in first-order logic, a formal logic. Unlike many other programming language ...
,
Datalog and
answer set programming, compute by proving that a goal is a logical consequence of the program, or by showing that the goal is true in a model defined by the program. Prolog computes by reducing goals to subgoals, top-down using
backward reasoning, whereas most Datalog systems compute bottom-up using
forward reasoning. Answer set programs typically use
SAT solvers to generate a model of the program.
Modeling
Models, or mathematical representations, of physical systems may be implemented in computer code that is declarative. The code contains a number of equations, not imperative assignments, that describe ("declare") the behavioral relationships. When a model is expressed in this formalism, a computer is able to perform algebraic manipulations to best formulate the solution algorithm. The mathematical causality is typically imposed at the boundaries of the physical system, while the behavioral description of the system itself is declarative or acausal. Declarative
modeling languages and environments include
Analytica,
Modelica and
Simile.
Examples
Lisp
Lisp
Lisp (historically LISP, an abbreviation of "list processing") is a family of programming languages with a long history and a distinctive, fully parenthesized Polish notation#Explanation, prefix notation.
Originally specified in the late 1950s, ...
is a family of programming languages loosely inspired by mathematical notation and
Alonzo Church
Alonzo Church (June 14, 1903 – August 11, 1995) was an American computer scientist, mathematician, logician, and philosopher who made major contributions to mathematical logic and the foundations of theoretical computer science. He is bes ...
's
lambda calculus
In mathematical logic, the lambda calculus (also written as ''λ''-calculus) is a formal system for expressing computability, computation based on function Abstraction (computer science), abstraction and function application, application using var ...
. Some dialects, such as
Common Lisp, are primarily imperative but support functional programming. Others, such as
Scheme, are designed for functional programming.
In Scheme, the
factorial
In mathematics, the factorial of a non-negative denoted is the Product (mathematics), product of all positive integers less than or equal The factorial also equals the product of n with the next smaller factorial:
\begin
n! &= n \times ...
function can be defined as follows:
(define (factorial n)
(if (= n 0)
1 ;;; 0! = 1
(* n (factorial (- n 1))))) ;;; n! = n*(n-1)!
This defines the factorial function using its recursive definition. In contrast, it is more typical to define a procedure for an imperative language.
In lisps and lambda calculus, functions are generally
first-class citizens. Loosely, this means that functions can be inputs and outputs for other functions. This can simplify the definition of some functions.
For example, writing a function to output the first n
square numbers in
Racket can be done accordingly:
(define (first-n-squares n)
(map (lambda (x) (* x x)) ;;; A function mapping x -> x^2
(iota n))) ;;; Lists the first n naturals
The
map function accepts a function and a list; the output is a list of results of the input function on each element of the input list.
ML
ML (1973)
stands for "Meta Language." ML is statically typed, and function arguments and return types may be annotated.
''ML'' is not as bracket-centric as ''Lisp'', and instead uses a wider variety of syntax to codify the relationship between code elements, rather than appealing to list ordering and nesting to express everything. The following is an application of
times_10
:
times_10 2
It returns "20 : int", that is,
20
, a value of type
int
.
Like ''Lisp'', ''ML'' is tailored to process lists, though all elements of a list must be the same type.
Prolog
Prolog
Prolog is a logic programming language that has its origins in artificial intelligence, automated theorem proving, and computational linguistics.
Prolog has its roots in first-order logic, a formal logic. Unlike many other programming language ...
(1972) stands for "PROgramming in LOGic." It was developed for natural language
question answering,
using SL resolution both to deduce answers to queries and to parse and generate natural language sentences.
The building blocks of a Prolog program are ''facts'' and ''rules''. Here is a simple example:
cat(tom). % tom is a cat
mouse(jerry). % jerry is a mouse
animal(X) :- cat(X). % each cat is an animal
animal(X) :- mouse(X). % each mouse is an animal
big(X) :- cat(X). % each cat is big
small(X) :- mouse(X). % each mouse is small
eat(X,Y) :- mouse(X), cheese(Y). % each mouse eats each cheese
eat(X,Y) :- big(X), small(Y). % each big being eats each small being
Given this program, the query
eat(tom,jerry) succeeds, while
eat(jerry,tom) fails. Moreover, the query
eat(X,jerry) succeeds with the answer substitution
X=tom.
Prolog executes programs top-down, using
SLD resolution to
reason backwards, reducing goals to subgoals. In this example, it uses the last rule of the program to reduce the goal of answering the query
eat(X,jerry) to the subgoals of first finding an X such that
big(X) holds and then of showing that
small(jerry) holds. It repeatedly uses rules to further reduce subgoals to other subgoals, until it eventually succeeds in
unifying all subgoals with facts in the program. This backward reasoning, goal-reduction strategy treats rules in logic programs as procedures, and makes Prolog both a declarative and
procedural programming
Procedural programming is a programming paradigm, classified as imperative programming, that involves implementing the behavior of a computer program as Function (computer programming), procedures (a.k.a. functions, subroutines) that call each o ...
language.
The broad range of Prolog applications is highlighted in the Year of Prolog Book,
celebrating the 50 year anniversary of Prolog.
Datalog
The
origins of Datalog date back to the beginning of logic programming, but it was identified as a separate area around 1977.
Syntactically and semantically, it is a subset of Prolog. But because it does not have
compound terms, it is not
Turing-complete.
Most Datalog systems execute programs bottom-up, using rules to
reason forwards, deriving new facts from existing facts, and terminating when there are no new facts that can be derived, or when the derived facts unify with the query. In the above example, a typical Datalog system would first derive the new facts:
animal(tom).
animal(jerry).
big(tom).
small(jerry).
Using these facts, it would then derive the additional fact:
eats(tom, jerry).
It would then terminate, both because no new, additional facts can be derived, and because the newly derived fact unifies with the query
eats(X, jerry).
Datalog has been applied to such problems as
data integration,
information extraction,
networking,
security,
cloud computing
Cloud computing is "a paradigm for enabling network access to a scalable and elastic pool of shareable physical or virtual resources with self-service provisioning and administration on-demand," according to International Organization for ...
and
machine learning
Machine learning (ML) is a field of study in artificial intelligence concerned with the development and study of Computational statistics, statistical algorithms that can learn from data and generalise to unseen data, and thus perform Task ( ...
.
Answer Set Programming
Answer set programming (ASP) evolved in the late 1990s, based on the
stable model (answer set) semantics of logic programming. Like Datalog, it is a subset of Prolog; and, because it does not have compound terms, it is not Turing-complete.
Most implementations of ASP execute a program by first "grounding" the program, replacing all variables in rules by constants in all possible ways, and then using a propositional SAT solver, such as the
DPLL algorithm to generate one or more models of the program.
Its applications are oriented towards solving difficult
search problems and
knowledge representation
Knowledge representation (KR) aims to model information in a structured manner to formally represent it as knowledge in knowledge-based systems whereas knowledge representation and reasoning (KRR, KR&R, or KR²) also aims to understand, reason, and ...
.
[as PDF]
See also
*
Inductive programming
*
List of declarative programming languages
References
External links
* Frans Coenen
Characteristics of declarative programming languages 1999.
*
Robert Harper.
What, If Anything, Is A Declarative Language? 2013.
*
There Is Such A Thing As A Declarative Language, and It's The World's Best DSL. 2013.
* Olof Torgersson
1996.
{{Authority control
Programming paradigms