ルールで真であるすべての述語の要素を含むリストを作成する方法が 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)を生成しようとしましたが、「ルールは安全ではありません」と表示されます。また、発生回数を数えてみると、同様の問題が発生します...
最も重要なことは、それほど多くのトリックを行わなくても、期待どおりの結果を一度に得ることができるかということです。
どんな助けでも大歓迎です、
ありがとう!