我想知道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,_),但我得到「規則是不安全的」。還試着計算出現的次數和類似的問題出現...
最重要的是,是否有可能得到我沒有那麼多技巧一次性所有結果?
任何幫助表示讚賞,
謝謝!