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

Vor*_*Vor 1 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)OR selected(b)那么selected(c)一定是假的

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

  :- selected(c), selected(a) .
  :- selected(c), selected(b) .
Run Code Online (Sandbox Code Playgroud)

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

我实际上使用两行代码:

p1(A) :- C(A), p2(A)
      :- C(A), not p2(A), p1(A)
Run Code Online (Sandbox Code Playgroud)

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

vuk*_*ukk 5

Q1:

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

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).
Run Code Online (Sandbox Code Playgroud)

Q3:

:- selected(c), selected(a;b).
Run Code Online (Sandbox Code Playgroud)

Q4:我其实在想

:- c(A), p1(A)!=p2(A).
Run Code Online (Sandbox Code Playgroud)

会工作,但显然不是.我认为写清楚的方式最清楚

:- c(A), not p1(A), p2(A).
:- c(A), p1(A), not p2(A).
Run Code Online (Sandbox Code Playgroud)

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

:- c(A), p1(A,P1), p2(A,P2), P1!=P2.
Run Code Online (Sandbox Code Playgroud)

Q5:不幸的是在我看来,有没有好的书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/