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 でコンスセルを構築できることに気付いていないと思います。たとえば、要素 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 のリストに似ていますが、使用されているかどうかに関係なく、可能性のあるすべてのリスト (爆発) のすべてのグラウンド インスタンスがグラウンド プログラムに含まれていることを意味します。

したがって、最初のポイントに戻ります。可能であれば、Clingo の代わりに DLV を使用してみてください (少なくとも、このタスクでは)。

于 2015-05-28T13:52:55.270 に答える