Examine individual changes
This page allows you to examine the variables generated by the Edit Filter for an individual change.
Variables generated for this change
Variable | Value |
---|---|
Name of the user account (user_name ) | '122.162.207.207' |
Page ID (page_id ) | 2386211 |
Page namespace (page_namespace ) | 0 |
Page title without namespace (page_title ) | 'Answer set programming' |
Full page title (page_prefixedtitle ) | 'Answer set programming' |
Action (action ) | 'edit' |
Edit summary/reason (summary ) | '/* References */ ' |
Whether or not the edit is marked as minor (no longer in use) (minor_edit ) | false |
Old page wikitext, before the edit (old_wikitext ) | ''''Answer set programming''' (ASP) is a form of [[declarative programming]] oriented towards difficult (primarily [[NP-hard]]) [[search algorithm|search problems]]. It is based on the [[stable model semantics|stable model]] (answer set) semantics of [[logic programming]]. In ASP, search problems are reduced to computing stable models, and ''answer set solvers'' -- programs for generating stable models -- are used to perform search. The computational process employed in the design of many answer set solvers is an enhancement of the [[DPLL algorithm]] and, in principle, it always terminates (unlike [[Prolog]] query evaluation, which may lead to an [[infinite loop]]).
In a more general sense, ASP includes all applications of answer sets to [[knowledge representation]]<ref>C. Baral [2003] ''Knowledge Representation, Reasoning and Declarative Problem Solving.'' Cambridge University Press.</ref><ref>M. Gelfond [2008] ''[http://www.krlab.cs.ttu.edu/Papers/download/gel07b.pdf Answer sets.]'' In: Handbook of Knowledge Representation, Elsevier, pages 285-316.</ref> and the use of Prolog-style query evaluation for solving problems arising in these applications.
==History==
The [[Automated planning and scheduling|planning]] method proposed by Dimopoulos, Nebel and Köhler<ref>Y. Dimopoulos, [[Bernhard Nebel|B. Nebel]] and J. Köhler [1997] ''[ftp://ftp.informatik.uni-freiburg.de/documents/papers/ki/dimopoulos-etal-ecp97.ps.gz Encoding planning problems in non-monotonic logic programs.]'' In: Proceedings of ECP-97, Springer Verlag, pages 273-285.</ref> is an early example of answer set programming. Their approach is based on the relationship between plans and stable models<ref>V.S.Subrahmanian and C. Zaniolo [1995] ''[http://www.cs.ucla.edu/%7Ezaniolo/papers/iclp95.ps Relating stable models and AI planning domains.]'' In: Proceedings of ICLP-95, pages 233-247.</ref>. Soininen and Niemelä<ref>T. Soininen and I. Niemelä [1998] ''[http://www.tcs.hut.fi/~ini/papers/sn-faanmr98.ps.gz Formalizing configuration knowledge using rules with choices.]'' Technical Report TKO-B142, Laboratory of Information Processing Science, Helsinki University of Technology.</ref> applied what is now known as answer set programming to the problem of product configuration. The use of answer set solvers for search was identified as a new programming paradigm in Marek and Truszczyński<ref>V. Marek and M. Truszczyński [1999] ''[http://xxx.lanl.gov/pdf/cs/9809032 Stable models and an alternative logic programming paradigm.]'' In: The Logic Programming Paradigm: a 25-Year Perspective, Springer Verlag, pages 169-181.</ref> (the term "answer set programming" was used for the first time as the title of a part of the collection where that paper appeared) and in [Niemelä 1999].<ref>I. Niemelä [1999] ''[http://www.tcs.hut.fi/~ini/papers/lp-csp-long.ps Logic programs with stable model semantics as a constraint programming paradigm.]'' Annals of Mathematics and Artificial Intelligence, Vol. 25, pages 241-273.</ref>
==Answer set programming language Lparse==
[http://www.tcs.hut.fi/Software/smodels/lparse.ps Lparse] is the name of the program that was originally created as
a front-end for the answer set solver [http://www.tcs.hut.fi/Software/smodels/ smodels], and is now used in the same way in many other answer set solvers, including [http://assat.cs.ust.hk/ assat], [http://www.cs.uni-potsdam.de/clasp/ clasp], [http://www.cs.utexas.edu/users/tag/cmodels/ cmodels], [http://www.tcs.hut.fi/Software/gnt/ gNt], [http://www.cs.uni-potsdam.de/nomore/ nomore++] and [http://www.cs.uky.edu/ai/pbmodels/ pbmodels]. ([http://www.dbai.tuwien.ac.at/proj/dlv/ dlv] is an exception; the syntax of ASP programs written for dlv is somewhat different.)
An Lparse program consists of rules of the form
<pre>
<head> :- <body> .
</pre>
The symbol <code>:-</code> ("if") is dropped if <code><body></code> is empty. The simplest kind of Lparse rules are [[Stable model semantics#Programs with constraints|rules with constraints]].
One other useful construct included in this language is ''choice''. For instance, the choice rule
<pre>
{p,q,r}.
</pre>
says: choose arbitrarily which of the atoms <math>p,q,r</math> to include in the stable model. The lparse program that contains this choice rule and no other rules has 8 stable models -- arbitrary subsets of <math>\{p,q,r\}</math>. The definition of a stable model was generalized to programs with choice rules.<ref>I. Niemelä, P. Simons and T. Soinenen [1999] ''[http://www.tcs.hut.fi/~ini/papers/nss-lpnmr99-www.ps.gz Stable model semantics of weight constraint rules.]'' In: Proceedings of LPNMR-99, pages 317-331.</ref> Choice rules can be treated also as abbreviations for [[Stable_model_semantics#Stable_models_of_a_set_of_propositional_formulas|propositional formulas under the stable model semantics]].<ref>P. Ferraris and V. Lifschitz [2005] ''[http://www.cs.utexas.edu/users/vl/papers/weight.ps Weight constraints as nested expressions.]'' Theory and Practice of Logic Programming, Vol. 5, pages 45-74.</ref> For instance, the choice rule above can be viewed as shorthand for the conjunction of three "[[excluded middle]]" formulas:
:<math>(p\lor\neg p)\land(q\lor\neg q)\land(r\lor\neg r).</math>
The language of lparse allows us also to write "constrained" choice rules, such as
<pre>
1{p,q,r}2.
</pre>
This rule says: choose at least 1 of the atoms <math>p,q,r</math>, but not more than 2. The meaning of this rule under the stable model semantics is represented by the [[propositional formula]]
:<math>(p\lor\neg p)\land(q\lor\neg q)\land(r\lor\neg r)</math>
::<math>\land\,(p\lor q\lor r)\land\neg(p\land q\land r).</math>
Cardinality bounds can be used in the body of a rule as well, for instance:
<pre>
:- 2{p,q,r}.
</pre>
Adding this constraint to an Lparse program eliminates the stable models that contain at least 2 of the atoms <math>p,q,r</math>. The meaning of this rule can be represented by the propositional formula
::<math>\neg((p\land q)\lor(p\land r)\lor(q\land r)).</math>
Variables (capitalized, as in [[Prolog#Data types|Prolog]]) are used in Lparse to abbreviate collections of rules that follow the same pattern, and also to abbreviate collections of atoms within the same rule. For instance, the Lparse program
<pre>
p(a). p(b). p(c).
q(X) :- p(X), X!=a.
</pre>
has the same meaning as
<pre>
p(a). p(b). p(c).
q(b). q(c).
</pre>
The program
<pre>
p(a). p(b). p(c).
{q(X):p(X)}2.
</pre>
is shorthand for
<pre>
p(a). p(b). p(c).
{q(a),q(b),q(c)}2.
</pre>
==Generating stable models==
To find a stable model of the Lparse program stored in file <code><filename></code> we use the command
<pre>
% lparse <filename> | smodels
</pre>
Option 0 instructs smodels to find ''all'' stable models of the program. For instance, if file <code>test</code> contains the rules
<pre>
1{p,q,r}2.
s :- not p.
</pre>
then the command
<pre>
% lparse test | smodels 0
</pre>
produces the output
<pre>
Answer: 1
Stable Model: q p
Answer: 2
Stable Model: p
Answer: 3
Stable Model: r p
Answer: 4
Stable Model: q s
Answer: 5
Stable Model: r s
Answer: 6
Stable Model: r q s
</pre>
==Examples of ASP programs==
===Graph coloring===
An <math>n</math>-[[Graph coloring|coloring]] of a [[Graph (mathematics)|graph]] <math>G</math> is a function <math>color\ </math> from its set of vertices to <math>\{1,\dots,n\}</math> such that <math>color(x)\neq color(y)</math> for every pair of adjacent vertices <math>x,y</math>. We would like to use ASP to find an <math>n</math>-coloring of a given graph (or determine that it does not exist).
This can be accomplished using the following Lparse program:
<pre>
c(1..n).
1 {color(X,I) : c(I)} 1 :- v(X).
:- color(X,I), color(Y,I), e(X,Y), c(I).
</pre>
Line 1 defines the numbers <math>1,\dots,n</math> to be colors. According to the choice rule in Line 2, a unique color <math>i</math> should be assigned to each vertex <math>x</math>. The constraint in Line 3 prohibits assigning the same color to vertices <math>x</math> and <math>y</math> if there is an edge connecting them.
If we combine this file with a definition of <math>G</math>, such as
<pre>
v(1..100). % 1,...,100 are vertices
e(1,55). % there is an edge from 1 to 55
. . .
</pre>
and run smodels on it, with the numeric value of <math>n</math> specified on the command line, then the atoms of the form <math>color(\dots,\dots)</math> in the output of smodels will represent an <math>n</math>-coloring of <math>G</math>.
The program in this example illustrates the "generate-and-test" organization that is often found in simple ASP programs. The choice rule describes a set of "potential solutions" -- a simple superset of the set of solutions to the given search problem. It is followed by a constraint, which eliminates all potential solutions that are not acceptable. However, the search process employed by smodels and other answer set solvers is not based on [[trial and error]].
===Large clique===
A [[Clique (graph theory)|clique]] in a graph is a set of pairwise adjacent vertices. The following lparse program finds a clique of size <math>\geq n</math> in a given graph, or determines that it does not exist:
<pre>
n {in(X) : v(X)}.
:- in(X), in(Y), v(X), v(Y), X!=Y, not e(X,Y), not e(Y,X).
</pre>
This is another example of the generate-and-test organization. The choice rule in Line 1 "generates" all sets consisting of <math>\geq n</math> vertices. The constraint in Line 2 "weeds out" the sets that are not cliques.
===Hamiltonian cycle===
A [[Hamiltonian cycle]] in a [[directed graph]] is a [[Path (graph theory)|cycle]] that passes through each vertex of the graph exactly once. The following Lparse program can be used to find a Hamiltonian cycle in a given directed graph if it exists; we assume that 0 is one of the vertices.
<pre>
{in(X,Y)} :- e(X,Y).
:- 2 {in(X,Y) : e(X,Y)}, v(X).
:- 2 {in(X,Y) : e(X,Y)}, v(Y).
r(X) :- in(0,X), v(X).
r(Y) :- r(X), in(X,Y), e(X,Y).
:- not r(X), v(X).
</pre>
The choice rule in Line 1 "generates" all subsets of the set of edges. The three constraints "weed out" the subsets that are not Hamiltonian cycles. The last of them uses the auxiliary predicate <math>r(x)</math> ("<math>x</math> is reachable from 0") to prohibit the vertices that do not satisfy this condition. This predicate is defined recursively in Lines 4 and 5.
This program is an example of the more general "generate, define and test" organization: it includes the definition of an auxiliary predicate that helps us eliminate all "bad" potential solutions.
==Comparison of implementations==
{| class="wikitable"
|-
! colspan="3" | Platform
! colspan="4" | Features
! colspan="1" | Mechanics
|-
! style="background:#ffdead;" | Name
! style="background:#ffdead;" | OS
! style="background:#ffdead;" | Licence
! style="background:#ffdead;" | Variables
! style="background:#ffdead;" | Function symbols
! style="background:#ffdead;" | Explicit sets
! style="background:#ffdead;" | Explicit lists
|-
|{{rh}}|[[DLV]]
|[[Linux]], [[Mac OS]], [[Microsoft Windows|Windows]]
|[[Freeware]]
|{{yes}}
|{{no}}
|{{no}}
|{{no}}
|
|-
|{{rh}}|[[Smodels]]
|[[Linux]], [[Mac OS]], [[Microsoft Windows|Windows]]
|[[GPL]]
|{{yes}}
|{{no}}
|{{no}}
|{{no}}
|
|}
==References==
<references/>
==See also==
*[[Default logic]]
*[[Logic programming]]
*[[Non-monotonic logic]]
*[[Prolog]]
*[[Stable model semantics]]
==External links==
*[http://asparagus.cs.uni-potsdam.de/contest/ First ASP System Competition]
*[http://www.cs.kuleuven.be/~dtai/events/ASP-competition/index.shtml Second ASP Competition]
*[http://www.cs.uni-potsdam.de/platypus/ Platypus]
*[http://www.kr.tuwien.ac.at/staff/tkren/deb.html A variety of answer set solvers packaged for Debian / Ubuntu]
[[Category:Logic programming]]
[[zh:回答集编程]]' |
New page wikitext, after the edit (new_wikitext ) | ''''Answer set programming''' (ASP) is a form of [[declarative programming]] oriented towards difficult (primarily [[NP-hard]]) [[search algorithm|search problems]]. It is based on the [[stable model semantics|stable model]] (answer set) semantics of [[logic programming]]. In ASP, search problems are reduced to computing stable models, and ''answer set solvers'' -- programs for generating stable models -- are used to perform search. The computational process employed in the design of many answer set solvers is an enhancement of the [[DPLL algorithm]] and, in principle, it always terminates (unlike [[Prolog]] query evaluation, which may lead to an [[infinite loop]]).
In a more general sense, ASP includes all applications of answer sets to [[knowledge representation]]<ref>C. Baral [2003] ''Knowledge Representation, Reasoning and Declarative Problem Solving.'' Cambridge University Press.</ref><ref>M. Gelfond [2008] ''[http://www.krlab.cs.ttu.edu/Papers/download/gel07b.pdf Answer sets.]'' In: Handbook of Knowledge Representation, Elsevier, pages 285-316.</ref> and the use of Prolog-style query evaluation for solving problems arising in these applications.
==History==
The [[Automated planning and scheduling|planning]] method proposed by Dimopoulos, Nebel and Köhler<ref>Y. Dimopoulos, [[Bernhard Nebel|B. Nebel]] and J. Köhler [1997] ''[ftp://ftp.informatik.uni-freiburg.de/documents/papers/ki/dimopoulos-etal-ecp97.ps.gz Encoding planning problems in non-monotonic logic programs.]'' In: Proceedings of ECP-97, Springer Verlag, pages 273-285.</ref> is an early example of answer set programming. Their approach is based on the relationship between plans and stable models<ref>V.S.Subrahmanian and C. Zaniolo [1995] ''[http://www.cs.ucla.edu/%7Ezaniolo/papers/iclp95.ps Relating stable models and AI planning domains.]'' In: Proceedings of ICLP-95, pages 233-247.</ref>. Soininen and Niemelä<ref>T. Soininen and I. Niemelä [1998] ''[http://www.tcs.hut.fi/~ini/papers/sn-faanmr98.ps.gz Formalizing configuration knowledge using rules with choices.]'' Technical Report TKO-B142, Laboratory of Information Processing Science, Helsinki University of Technology.</ref> applied what is now known as answer set programming to the problem of product configuration. The use of answer set solvers for search was identified as a new programming paradigm in Marek and Truszczyński<ref>V. Marek and M. Truszczyński [1999] ''[http://xxx.lanl.gov/pdf/cs/9809032 Stable models and an alternative logic programming paradigm.]'' In: The Logic Programming Paradigm: a 25-Year Perspective, Springer Verlag, pages 169-181.</ref> (the term "answer set programming" was used for the first time as the title of a part of the collection where that paper appeared) and in [Niemelä 1999].<ref>I. Niemelä [1999] ''[http://www.tcs.hut.fi/~ini/papers/lp-csp-long.ps Logic programs with stable model semantics as a constraint programming paradigm.]'' Annals of Mathematics and Artificial Intelligence, Vol. 25, pages 241-273.</ref>
==Answer set programming language Lparse==
[http://www.tcs.hut.fi/Software/smodels/lparse.ps Lparse] is the name of the program that was originally created as
a front-end for the answer set solver [http://www.tcs.hut.fi/Software/smodels/ smodels], and is now used in the same way in many other answer set solvers, including [http://assat.cs.ust.hk/ assat], [http://www.cs.uni-potsdam.de/clasp/ clasp], [http://www.cs.utexas.edu/users/tag/cmodels/ cmodels], [http://www.tcs.hut.fi/Software/gnt/ gNt], [http://www.cs.uni-potsdam.de/nomore/ nomore++] and [http://www.cs.uky.edu/ai/pbmodels/ pbmodels]. ([http://www.dbai.tuwien.ac.at/proj/dlv/ dlv] is an exception; the syntax of ASP programs written for dlv is somewhat different.)
An Lparse program consists of rules of the form
<pre>
<head> :- <body> .
</pre>
The symbol <code>:-</code> ("if") is dropped if <code><body></code> is empty. The simplest kind of Lparse rules are [[Stable model semantics#Programs with constraints|rules with constraints]].
One other useful construct included in this language is ''choice''. For instance, the choice rule
<pre>
{p,q,r}.
</pre>
says: choose arbitrarily which of the atoms <math>p,q,r</math> to include in the stable model. The lparse program that contains this choice rule and no other rules has 8 stable models -- arbitrary subsets of <math>\{p,q,r\}</math>. The definition of a stable model was generalized to programs with choice rules.<ref>I. Niemelä, P. Simons and T. Soinenen [1999] ''[http://www.tcs.hut.fi/~ini/papers/nss-lpnmr99-www.ps.gz Stable model semantics of weight constraint rules.]'' In: Proceedings of LPNMR-99, pages 317-331.</ref> Choice rules can be treated also as abbreviations for [[Stable_model_semantics#Stable_models_of_a_set_of_propositional_formulas|propositional formulas under the stable model semantics]].<ref>P. Ferraris and V. Lifschitz [2005] ''[http://www.cs.utexas.edu/users/vl/papers/weight.ps Weight constraints as nested expressions.]'' Theory and Practice of Logic Programming, Vol. 5, pages 45-74.</ref> For instance, the choice rule above can be viewed as shorthand for the conjunction of three "[[excluded middle]]" formulas:
:<math>(p\lor\neg p)\land(q\lor\neg q)\land(r\lor\neg r).</math>
The language of lparse allows us also to write "constrained" choice rules, such as
<pre>
1{p,q,r}2.
</pre>
This rule says: choose at least 1 of the atoms <math>p,q,r</math>, but not more than 2. The meaning of this rule under the stable model semantics is represented by the [[propositional formula]]
:<math>(p\lor\neg p)\land(q\lor\neg q)\land(r\lor\neg r)</math>
::<math>\land\,(p\lor q\lor r)\land\neg(p\land q\land r).</math>
Cardinality bounds can be used in the body of a rule as well, for instance:
<pre>
:- 2{p,q,r}.
</pre>
Adding this constraint to an Lparse program eliminates the stable models that contain at least 2 of the atoms <math>p,q,r</math>. The meaning of this rule can be represented by the propositional formula
::<math>\neg((p\land q)\lor(p\land r)\lor(q\land r)).</math>
Variables (capitalized, as in [[Prolog#Data types|Prolog]]) are used in Lparse to abbreviate collections of rules that follow the same pattern, and also to abbreviate collections of atoms within the same rule. For instance, the Lparse program
<pre>
p(a). p(b). p(c).
q(X) :- p(X), X!=a.
</pre>
has the same meaning as
<pre>
p(a). p(b). p(c).
q(b). q(c).
</pre>
The program
<pre>
p(a). p(b). p(c).
{q(X):p(X)}2.
</pre>
is shorthand for
<pre>
p(a). p(b). p(c).
{q(a),q(b),q(c)}2.
</pre>
==Generating stable models==
To find a stable model of the Lparse program stored in file <code><filename></code> we use the command
<pre>
% lparse <filename> | smodels
</pre>
Option 0 instructs smodels to find ''all'' stable models of the program. For instance, if file <code>test</code> contains the rules
<pre>
1{p,q,r}2.
s :- not p.
</pre>
then the command
<pre>
% lparse test | smodels 0
</pre>
produces the output
<pre>
Answer: 1
Stable Model: q p
Answer: 2
Stable Model: p
Answer: 3
Stable Model: r p
Answer: 4
Stable Model: q s
Answer: 5
Stable Model: r s
Answer: 6
Stable Model: r q s
</pre>
==Examples of ASP programs==
===Graph coloring===
An <math>n</math>-[[Graph coloring|coloring]] of a [[Graph (mathematics)|graph]] <math>G</math> is a function <math>color\ </math> from its set of vertices to <math>\{1,\dots,n\}</math> such that <math>color(x)\neq color(y)</math> for every pair of adjacent vertices <math>x,y</math>. We would like to use ASP to find an <math>n</math>-coloring of a given graph (or determine that it does not exist).
This can be accomplished using the following Lparse program:
<pre>
c(1..n).
1 {color(X,I) : c(I)} 1 :- v(X).
:- color(X,I), color(Y,I), e(X,Y), c(I).
</pre>
Line 1 defines the numbers <math>1,\dots,n</math> to be colors. According to the choice rule in Line 2, a unique color <math>i</math> should be assigned to each vertex <math>x</math>. The constraint in Line 3 prohibits assigning the same color to vertices <math>x</math> and <math>y</math> if there is an edge connecting them.
If we combine this file with a definition of <math>G</math>, such as
<pre>
v(1..100). % 1,...,100 are vertices
e(1,55). % there is an edge from 1 to 55
. . .
</pre>
and run smodels on it, with the numeric value of <math>n</math> specified on the command line, then the atoms of the form <math>color(\dots,\dots)</math> in the output of smodels will represent an <math>n</math>-coloring of <math>G</math>.
The program in this example illustrates the "generate-and-test" organization that is often found in simple ASP programs. The choice rule describes a set of "potential solutions" -- a simple superset of the set of solutions to the given search problem. It is followed by a constraint, which eliminates all potential solutions that are not acceptable. However, the search process employed by smodels and other answer set solvers is not based on [[trial and error]].
===Large clique===
A [[Clique (graph theory)|clique]] in a graph is a set of pairwise adjacent vertices. The following lparse program finds a clique of size <math>\geq n</math> in a given graph, or determines that it does not exist:
<pre>
n {in(X) : v(X)}.
:- in(X), in(Y), v(X), v(Y), X!=Y, not e(X,Y), not e(Y,X).
</pre>
This is another example of the generate-and-test organization. The choice rule in Line 1 "generates" all sets consisting of <math>\geq n</math> vertices. The constraint in Line 2 "weeds out" the sets that are not cliques.
===Hamiltonian cycle===
A [[Hamiltonian cycle]] in a [[directed graph]] is a [[Path (graph theory)|cycle]] that passes through each vertex of the graph exactly once. The following Lparse program can be used to find a Hamiltonian cycle in a given directed graph if it exists; we assume that 0 is one of the vertices.
<pre>
{in(X,Y)} :- e(X,Y).
:- 2 {in(X,Y) : e(X,Y)}, v(X).
:- 2 {in(X,Y) : e(X,Y)}, v(Y).
r(X) :- in(0,X), v(X).
r(Y) :- r(X), in(X,Y), e(X,Y).
:- not r(X), v(X).
</pre>
The choice rule in Line 1 "generates" all subsets of the set of edges. The three constraints "weed out" the subsets that are not Hamiltonian cycles. The last of them uses the auxiliary predicate <math>r(x)</math> ("<math>x</math> is reachable from 0") to prohibit the vertices that do not satisfy this condition. This predicate is defined recursively in Lines 4 and 5.
This program is an example of the more general "generate, define and test" organization: it includes the definition of an auxiliary predicate that helps us eliminate all "bad" potential solutions.
==Comparison of implementations==
{| class="wikitable"
|-
! colspan="3" | Platform
! colspan="4" | Features
! colspan="1" | Mechanics
|-
! style="background:#ffdead;" | Name
! style="background:#ffdead;" | OS
! style="background:#ffdead;" | Licence
! style="background:#ffdead;" | Variables
! style="background:#ffdead;" | Function symbols
! style="background:#ffdead;" | Explicit sets
! style="background:#ffdead;" | Explicit lists
|-
|{{rh}}|[[DLV]]
|[[Linux]], [[Mac OS]], [[Microsoft Windows|Windows]]
|[[Freeware]]
|{{yes}}
|{{no}}
|{{no}}
|{{no}}
|
|-
|{{rh}}|[[Smodels]]
|[[Linux]], [[Mac OS]], [[Microsoft Windows|Windows]]
|[[GPL]]
|{{yes}}
|{{no}}
|{{no}}
|{{no}}
|
|}
==References==vvvvvvvv
<references/>
==See also==
*[[Default logic]]
*[[Logic programming]]
*[[Non-monotonic logic]]
*[[Prolog]]
*[[Stable model semantics]]
==External links==
*[http://asparagus.cs.uni-potsdam.de/contest/ First ASP System Competition]
*[http://www.cs.kuleuven.be/~dtai/events/ASP-competition/index.shtml Second ASP Competition]
*[http://www.cs.uni-potsdam.de/platypus/ Platypus]
*[http://www.kr.tuwien.ac.at/staff/tkren/deb.html A variety of answer set solvers packaged for Debian / Ubuntu]
[[Category:Logic programming]]
[[zh:回答集编程]]' |
Whether or not the change was made through a Tor exit node (tor_exit_node ) | 0 |
Unix timestamp of change (timestamp ) | 1276777388 |