3

处理器“a”处理消息“a_b_c_d”的标头“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',并将上述更改为一般情况?

4

4 回答 4

2

不,官方方式,但我认为大多数人没有意识到您可以在 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))))))

...

于 2016-08-20T20:00:36.347 回答
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.
于 2015-05-11T17:51:36.767 回答
0

据我所知,没有“官方”的方式来处理 ASP 中的列表。但是,DLV 具有类似于 Prolog 的内置列表处理。

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

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

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

于 2015-05-28T13:52:55.270 回答
0

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

于 2020-05-09T05:57:37.047 回答