我想知道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,_),但我得到“规则是不安全的”。还试着计算出现的次数和类似的问题出现...
最重要的是,是否有可能得到我没有那么多技巧一次性所有结果?
任何帮助表示赞赏,
谢谢!