2016-09-23 14 views
0

ルール内にあるすべての述語の要素を含むリストを作成する方法がDLVにあるかどうかは疑問でした。例えば、私が持っている場合は、次の述語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)。私は2つの理由からそれをやりたい:(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)を生成しようとしましたが、ルールは安全ではありません。また、出現回数や類似の問題の数を数えてみました...

最も重要なのは、私が一度に期待する結果を得ることは、多くのトリックなしに可能ですか?

すべてのヘルプは高く評価され、

ありがとう!

答えて

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. 

それが将来的に他の誰かに役立ちます願っています。

関連する問題