关于答案集编程的新手问题

时间:2015-02-04 09:33:52

标签: answer-set-programming clingo

我对Clingo(和逻辑编程)完全陌生,我正在寻找最佳方式来实现以下基本约束:

Q1。我有一个谓词selected(T),其中T的范围从1到N = 5;如何指定至少存在一个T ,以便选择(T)?

Q2。我有一个二元谓词wrap(E,T),其中E,T的范围从1到M,N;如何指定每个E的至少存在一个T ,以包裹(E,T)?

Q3。如何指定selected(a)selected(b)然后selected(c)必须为假

我实际上使用了两行代码,但可能有更好的方法:

  :- selected(c), selected(a) .
  :- selected(c), selected(b) .

Q4。如何指定如果某个条件C(A)为真,那么两个一元谓词p1(A)和p2(A)必须具有相同的值?

我实际上使用了两行代码:

p1(A) :- C(A), p2(A)
      :- C(A), not p2(A), p1(A)

Q5。你建议哪一本书能够很好地介绍答案集编程?

1 个答案:

答案 0 :(得分:5)

Q1:

%%%% Config
#const n = 5.
%%%% Code
% selected is not an empty predicate
1 { selected(1..n) }.

Q2:

%%%% Config
%% N
#const n = 5.
%% M
#const m = 4.

%%%% Helpers
%% Ts
t(1..n).
%% Es
e(1..m).

%%%% Code
% there is an E, then there must be at least one
% wrap(E,T) where T is from t
1 { wrap(E, T) : t(T) } :- e(E).

问题3:

:- selected(c), selected(a;b).

问题4:我其实想过

:- c(A), p1(A)!=p2(A).

可行,但显然不行。我认为最清楚的写作方式是

:- c(A), not p1(A), p2(A).
:- c(A), p1(A), not p2(A).

虽然我对使用' not'感到不满意。也许最近使用ASP的人会记得更好的解决方案。或者,您可以将p1和p2扩展为二进制谓词并写入

:- c(A), p1(A,P1), p2(A,P2), P1!=P2.

问题5:不幸的是,在我看来,ASP没有好的书。那说我读过的绝对最好的就是"答案集在实践中解决"由通常的嫌疑人Gebser,Kaminski,Kaufmann,Schaub。在阅读与potassco系列相关的资料时,您需要在gringo 3和gringo 4语言差异之间进行调整,官方手册并没有很好地解释,我也没有看到任何其他资源。

编辑:现在有一本Potassco工具的新手册,其中包含了clasp 3和gringo / clingo 4.5的最新语法,请在此处找到:http://sourceforge.net/projects/potassco/files/guide/2.0/