2016-09-23 66 views
0

我想知道DLV中是否有一種方法來創建一個列表,其中包含規則中所有謂詞的元素。舉例來說,如果我有以下謂詞DLV列表組合

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

我要找應該有新的謂詞,結果其中第一個元素是foo第一個參數和第二個參數應包含相關的所有元素的列表第一個參數。經驗:

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. 

然而,這開始變得複雜並且顯示所有最大尺寸的列表,而不僅僅是其中的一個。我如何擺脫除一個之外的所有人?我試圖生成酒吧(A,P),以防萬一他們沒有其他酒吧(A,_),但我得到「規則是不安全的」。還試着計算出現的次數和類似的問題出現...

最重要的是,是否有可能得到我沒有那麼多技巧一次性所有結果?

任何幫助表示讚賞,

謝謝!

回答

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. 

希望它可以幫助別人,將來別人。