在正确的组合中查找字典之间的公共值集

时间:2015-11-28 19:18:39

标签: python dictionary combinations itertools

我正在尝试在 Python 中构建一个推理系统,它将说明是否可以根据我的知识库中的现有语句推断出查询。

输入是:

  
      
  1. Predicate1(x,y)^ Predicate2(x,y,z)^ Predicate3(y,z)^ Predicate4(Constant,z)=> Predicate5(r)的

  2.   
  3. Predicate1(X1,Y1)

  4.   
  5. Predicate1(X1,Y2)

  6.   
  7. Predicate1(X4,Y5)

  8.   
  9. Predicate2(X1,Y1,Z1)

  10.   
  11. Predicate2(X4,Y2,Z1)

  12.   
  13. Predicate3(Y2,X1)

  14.   
  15. Predicate3(Y1,Z1)

  16.   
  17. Predicate4(CONSTANT1,Z1)

  18.   
  19. Predicate4(CONSTANT2,Z5)

  20.   

我的查询是Predicate5(R1)。

因此,对于我的查询来说,1的LHS必须是真的。

Predicates的所有参数都是变量(小写)或常量(以大写开头)或者是常量和变量的混合,并且可以有任意数量的参数。

我正在使用递归后向链方法来计算每个谓词的所有可能值 - 每个谓词为Predicate1,Predicate2等,它返回词典列表

例如,LHS上的每个合取,

Predicate1将有[{'x':'X1','y':'Y1'},{'x':'X1','y':'Y2'},{'x':'X4','y':'Y5'}]

Predicate2将有[{'x':'X1','y':'Y1','z':'Z1'},{'x':'X4','y':'Y2','z':'Z1'}]

Predicate3将有[{'y':'Y2','z':'X1'},{'y':'Y1','z':'Z1'}]

Predicate4将有[{'z':'Z1'},{'z':'Z5}]

我想到的方法是通过扫描每个谓词的所有字典并消除其他谓词中不存在的变量的值来创建一个新的值到列表的映射(另一个字典)。字典,并在此字典中添加新变量(如果它们尚未存在)。

这里的问题是它必须完全在正确的组合中。例如,Predicate2的{'x':'X4','y':'Y2','z':'Z1'}因为Predicate1的字典而无法生效(对于Predicate1,没有'x':'X4''y':'Y2')。

我基本上需要计算所有Predicates中为True的公共变量值,并返回它们。如果不存在一个/多个此类组合,则返回False;否则返回列表并返回True。

对于上面的例子,'x'应仅采用'X1','y'仅采用'Y1','z':'Z1'。 即输出应为[{x:'X1','y':'Y1','z':'Z1'}]

我应该使用itertools或类似的方法来做到这一点吗?关于如何做到这一点的任何想法?

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

您似乎需要OrderedDict才能解决问题。它将保证您的dict始终以相同的顺序出现。