如何在ASP(答案集编程)中表示列表?

时间:2015-05-11 01:21:21

标签: answer-set-programming clingo

处理器' a'注意标题' a'消息' a_b_c_d'并传递有效载荷' b_c_d'到下一级别的另一个处理器如下:

msg(a, b_c_d).
pro(a;b;c;d).

msg(b, c_d) :- pro(X), msg(X, b_c_d).
msg(c, d)   :- pro(X), msg(X, c_d).
msg(d)      :- pro(X), msg(X, d).

#hide. #show msg/2. #show msg/1.

我应该如何表示列表' a_b_c_d'在ASP中,并将上述内容更改为一般情况?

4 个答案:

答案 0 :(得分:2)

不,官方的方式,但我认为大多数人都没有意识到你可以在ASP中构建cons-cell。 例如,以下是如何从元素1..6

获取长度为5的所有列表的项目
element(1..6).
listLen(empty, 0).
listLen(cons(E, L), K + 1) :- element(E); listLen(L, K); K < 5.
is5List(L) :- listLen(L, 5).

#show is5List/1.

导致

is5List(cons(1,cons(1,cons(1,cons(1,cons(1,empty))))))
is5List(cons(1,cons(1,cons(1,cons(1,cons(2,empty))))))
is5List(cons(1,cons(1,cons(1,cons(1,cons(3,empty))))))

...

答案 1 :(得分:0)

通过使用索引,我确实有办法走一个列表,但是,我不知道这是处理ASP列表的官方方法。有人有更多的ASP经验可以帮助我们吗?谢谢。

index(3,a). index(2,b). index(1,c). index(0,d). 
pro(a;b;c;d). msg(3,a).

msg(I-1,N) :- pro(P), msg(I,P), index(I,P), I>0, index(I-1,N).

#hide. #show msg/2.

答案 2 :(得分:0)

没有&#39;官方&#39;据我所知,在ASP中处理列表的方法。但是,DLV具有类似于Prolog的内置列表处理。

实现列表的方式,列表本身不能用作术语,因此如果要在列表中的变量和规则的其他元素之间进行绑定会怎样?也许你想要像p(t,[q(X),q(Y)])这样的东西: - X!= Y。

您可以尝试将列表实现为(a,b,c)和追加谓词,但问题是ASP需要在计算答案集之前进行接地。因此,以这种方式定义的列表虽然更像Prolog中的列表,但意味着地面程序包含所有可能列表(爆炸)的所有地面实例,无论它们是否被使用。

因此,我回到第一点,如果可能的话,尝试使用DLV而不是Clingo(至少这个任务)。

答案 3 :(得分:0)

您可以使用s(ASP)s(CASP) ASP系统。它们都支持像prolog这样的列表操作。您可能需要定义ASP中内置的列表。

相关问题