1

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

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

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

Q3。我如何指定 if selected(a)OR selected(b)thenselected(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。你推荐什么书来很好地介绍答案集编程?

4

1 回答 1

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).

Q4:其实我以为

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

会工作,但显然不是。我认为最清晰的写法是

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

虽然我对“不”的使用不满意。也许最近使用过 ASP 的人记得一个更好的解决方案。或者,您可以将 p1 和 p2 扩展到二进制谓词并编写

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

Q5:不幸的是,在我看来,没有关于 ASP的好书。也就是说,我读过的绝对最好的一本书是常见的嫌疑人 Gebser、Kaminski、Kaufmann、Schaub 的“实践中的答案集求解”。在阅读与 potassco 集合相关的材料时,您需要在 gringo 3 和 gringo 4 语言差异之间进行调整,官方手册没有很好地解释这一点,我见过的任何其他资源也没有。

编辑:现在有一个 Potassco 工具的新手册,其中包含 clasp 3 和 gringo/cligo 4.5 的最新语法,在这里找到它:http: //sourceforge.net/projects/potassco/files/guide/2.0/

于 2015-02-04T11:07:54.337 回答