0

ルールで真であるすべての述語の要素を含むリストを作成する方法が DLV にあるかどうか疑問に思っていました。たとえば、次の述語がある場合

foo(a, b).
foo(a, c).
foo(a, e).
foo(b, c).

私が探している結果は、最初の要素が最初のパラメーターでfooあり、2 番目のパラメーターが最初のパラメーターに関連付けられたすべての要素を含むリストを含む新しい述語である必要があります。経験的に:

bar(a, [b,c,e]).
bar(b, [c]).

次のコードを使用して、これらの結果 (さらに多くの結果) を取得する方法があることを知っています。

bar(A, [X]) :-  foo(A, X).
bar(A,  P ) :-  bar(A, P0),
                foo(A, X), 
                not #member(X, P0),
                #insLast(P0, X, P).

しかし、サイズが 1 から N (N は最終リストの要素数) のすべての可能なリストの生成を防ぐ方法があるかどうかを知りたいです。(1) 計算コストを削減する (2) 不要な述語をすべて破棄しないようにするためです。

計算コストが問題にならない場合 (その可能性もあります)、最大のリストを持つ述語のみを保持するために、次の変更を考えていました。

tmp_bar(A, [X], 1) :-   foo(A, X).
tmp_bar(A,  P,  L) :-   tmp_bar(A, P0, L0),
                        foo(A, X), 
                        not #member(X, P0),
                        #insLast(P0, X, P),
                        L = L0 + 1.
bar(A, P)      :- tmp_bar(A, P, L), 
                  max_list(A, L).
max_list(A, L) :- foo(A, _), 
                  #max{X: tmp_bar(A, P, X)} = L.

ただし、これは複雑になり始め、そのうちの 1 つだけでなく、最大サイズのすべてのリストを表示しています。1つを除くすべてを取り除くにはどうすればよいですか? 他のバー(A、_)がない場合にのみバー(A、P)を生成しようとしましたが、「ルールは安全ではありません」と表示されます。また、発生回数を数えてみると、同様の問題が発生します...

最も重要なことは、それほど多くのトリックを行わなくても、期待どおりの結果を一度に得ることができるかということです。

どんな助けでも大歓迎です、

ありがとう!

4

1 に答える 1

0

どうやら、特定の順序で要素を追加することで問題の解決策を見つけたようです。私がしていることは、現在のリストの最後の要素よりも小さい場合にのみ、リストの最後に要素を追加することです。私は数字ではなく名前を扱っていたので、これは不可能でしたが)。

コードは次のとおりです。

tmp_bar(A, [X], 1) :-   foo(A, X).
tmp_bar(A,  P,  L)  :-  tmp_bar(A, P0, L0),
                        foo(A, X), 
                        #last(P0, Y),
                        Y < X,
                        #insLast(P0, X, P),
                        L = L0 + 1.

bar(A, P) :- tmp_bar(A, P, L), 
             max_list(A, L).

max_list(A, L) :- foo(A, _), 
                 #max{X: tmp_bar(A, P, X)} = L.

将来、他の誰かに役立つことを願っています。

于 2016-09-23T10:15:11.893 に答える