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

Answer set programming 关于答案集编程的新手问题,answer-set-programming,clingo,Answer Set Programming,Clingo,我对Clingo(和逻辑编程)完全陌生,我正在寻找实现以下基本约束的最佳方法: 问题1。我选择了一个谓词(T),其中T的范围从1到N=5;如何指定至少存在一个T,以便选中(T) 问题2。我有一个二元谓词wrap(E,T),其中E,T的范围从1到M,N;我如何指定每个E至少存在一个T,以便包装(E,T) 第三季度。如何指定如果选择(a)或选择(b)则选择(c)必须为false 我实际上使用了两行代码,但可能有更好的方法: :- selected(c), selected(a) . :- s

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

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

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

第三季度。如何指定如果
选择(a)
选择(b)
选择(c)
必须为false

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

  :- selected(c), selected(a) .
  :- selected(c), selected(b) .
第四季度。如何指定如果某个条件C(a)为真,那么两个一元谓词p1(a)和p2(a)必须具有相同的值

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

p1(A) :- C(A), p2(A)
      :- C(A), not p2(A), p1(A)
问题5。你建议哪本书能很好地介绍答案集编程

Q1:

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

问题3:

问题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。在阅读与Potasco系列相关的材料时,您需要调整gringo 3和gringo 4的语言差异,官方手册没有很好地解释这一点,我也没有看到任何其他资源

编辑:现在有了Potasco工具的新手册,其中包含clasp 3和gringo/clingo 4.5的最新语法,请在此处找到:

Q1:

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

问题3:

问题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。在阅读与Potasco系列相关的材料时,您需要调整gringo 3和gringo 4的语言差异,官方手册没有很好地解释这一点,我也没有看到任何其他资源


编辑:现在有了Potasco工具的新手册,其中包含了clasp 3和gringo/clingo 4.5的最新语法,请在此处找到它:

哇,问题太多了!我建议你把他们分开,分别提问,否则你可能会因为这个问题过于宽泛而导致问题结束。@shree.pat18:我很确定所有问题都有一个非常简洁的答案:-)哇,问题太多了!我建议你把他们分开,分别提问,否则你可能会因为太宽泛而把这个问题结束。@shree.pat18:我很确定所有的问题都有一个非常简洁的答案:-)谢谢你的快速回复!!!关于Q4,我的意思是,如果C(A)持有p1(A),p2(A)都是真的或都是假的(或者以另一种形式C(A)->(p1(A)p2(S)))。问题3:我觉得很奇怪,没有一个简洁的或(这是很常见的):-S问题1,问题2:很好!问题5:事实上,我已经对在《外国佬4》中消失的琐碎的隐藏物有了一些麻烦:-)你知道有一个专门的论坛欢迎这样的问题/帮助请求吗?我编辑了上面的答案。除了这个论坛,我不知道还有其他论坛。你可能会发现一个有价值的资源,因为目前,除了上面提到的书之外,学习ASP的最好方法是阅读别人的编码。我还建议对您的解决方案进行基准测试,找出哪些是快速的,哪些不是。还可以查看
clingo--help=3
输出。而且,
gringo-t
是非常宝贵的。新的Potasco工具指南2.0可用,我将其添加到了答案中。感谢您的快速回复!!!关于Q4,我的意思是,如果C(A)持有p1(A),p2(A)都是真的或都是假的(或者以另一种形式C(A)->(p1(A)p2(S)))。问题3:我觉得很奇怪,没有一个简洁的或(这是很常见的):-S问题1,问题2:很好!问题5:事实上,我已经对在《外国佬4》中消失的琐碎的隐藏物有了一些麻烦:-)你知道有一个专门的论坛欢迎这样的问题/帮助请求吗?我编辑了上面的答案。除了这个论坛,我不知道还有其他论坛。你可能会发现一个有价值的资源,因为目前,除了上面提到的书之外,学习ASP的最好方法是阅读别人的编码。我还建议对您的解决方案进行基准测试,找出哪些是快速的,哪些不是。还可以查看
clingo--help=3
输出。而且,
gringo-t
是非常宝贵的。新的Potasco工具指南2.0已经发布,我把它添加到了答案中。