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

How should list be represented in ASP (Answer Set Programming)?

处理器 'a' 负责消息 'a_b_c_d' 的 header 'a' 并将有效负载 '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.

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

通过使用索引,我确实有办法遍历列表,但是,我不知道这是 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.

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

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

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

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

不,官方方式,但我想大多数人都没有意识到你可以在 ASP 中构建cons-cells。 例如,下面是如何从元素 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))))))

...

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