处理器' 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中,并将上述内容更改为一般情况?
答案 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)