Constraint programming was invented, or discovered, in the early 1960s. A main idea in constraint programming is to tell a computer what you want without specifying an exact procedure and/or process to follow. Constraints are relations that must be satisfied; examples: a line must remain horizontal, a component in an electrical circuit simulation must obey Ohm's Law, one column in a web page table must be at least twice as wide as another. Constraints have been used in many types of languages and systems, especially in user interface toolkits, planning and scheduling, and simulation. It is often easy to write constraints where the answer is hard to compute. Example: In constraint programming, X * X = 2 will find X even if you don't tell a program exactly how to do it. For this, it solves by iteratively changing X and converging on an answer, without knowing how to do the square root algorithm; this was Isaac Newton's method for finding square roots. In programming and mathematics, constraints can be algebraic or logical (Boolean): often an equality or inequality relation, between the values of one or more variables, often between two; example: x > 2 is a constraint on x. Constraint satisfaction is the process of assigning values to variables so all constraints are true. In programming, constraints are relationships that are declared once, and then maintained automatically by a system. Constraints are automatically evaluated when needed, rather than needing programmers to call them when needed. They should have no side effects. Constraints can also serve as a type of inheritance. Constraint programming uses methods from mathematics, artificial intelligence, and operations research. It allows fast development, economic maintenance, and high performance. Directly representing a problem as constraints results in shorter, simpler programs, easier to understand and adapt to changing needs. On this page, languages are arranged in three groups and levels: 1) Top group: types or classes of languages. 2) Middle group: languages for which there are more than one instance of a language of this name/type, a language family. 3) Bottom group: specific languages, individual instances; there is only one language of this name/type.