2016-09-23 67 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. 

希望它可以帮助别人,将来别人。