Can you summarize the following document?
        
  宣告式程式設計通常被定義為除命令式以外的程式設計正規化。同時存在一些其他的定義,這些定義不是簡單的將宣告式程式設計和指令式程式設計做對比,例如:  這些定義有一些是重合的。

  宣告式程式設計是一個大的概念,其下包含一些有名的子程式設計正規化。

  在約束式程式設計()中,變數之間的關係是在約束中說明的,定義了問題的解的範圍。這些約束然後被應用程式來求解,以使得每個變數獲得一個值,並讓最多的約束得到滿足。  約束式程式設計經常被用作函數語言程式設計、邏輯程式設計甚至指令式程式設計的補充。

  一些著名的宣告式領域專屬語言(DSLs)包括yacc語法分析器,編譯說明語言Make,Puppet管理配置語言,正規表示式和SQL的一些子集(例如Select queries等)。DSLs有時非常有用,並且不需要是圖靈完全的,這往往讓其很容易以一種純宣告式的方式來表達。  很多文字標記語言例如HTML、MXML、XAML和XSLT往往是宣告式的。

  函數語言程式設計,特別是純函數語言程式設計,嘗試最小化狀態帶來的副作用,因此被認為是宣告式的。大多數函數語言程式設計語言,例如Scheme、Clojure、Haskell、OCaml、Standard ML和Unlambda,允許副作用的存在。

  邏輯式程式語言如Prolog宣告關係並且對關係進行提問。同函數語言程式設計一樣,許多邏輯程式語言允許副作用的存在。

  「宣告式」與「指令式」
宣告式程式設計(英語:Declarative programming)是一種程式設計正規化,與指令式程式設計相對立。它描述目標的性質,讓電腦明白目標,而非流程。宣告式程式設計不用告訴電腦問題領域,從而避免隨之而來的副作用。而指令式程式設計則需要用演算法來明確的指出每一步該怎麼做。