我对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。你建议哪一本书能够很好地介绍答案集编程?
答案 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/