Pydatalog聚合函数的用法

时间:2016-08-17 03:21:25

标签: logic-programming

我一直在玩各种聚合功能以感受它们,在过去几天感到困惑后,我需要澄清。我或者得到完全不直观的行为或无益的错误。例如,我测试:

(p [X] == min_(Y,order_by = Z))< = Y.in _((4,6,2))& Z.in _((6))

查看示例输出:

  
    
      

P [0] == X,Y,Z       ([(6,)],[4,6,2],[6,6,6])

             

P [1] == X,Y,Z       ([(6,)],[6,4,2],[6,6,6])

             

P [2] == X,Y,Z       ([(6,)],[4,2,6],[6,6,6])

    
  
  1. 为什么最低6? 2.为什么绑定到Z的值重复了3次? 3.'order_by'与找到最小值的列表相关的目的究竟是什么? 4.为什么输出会根据'order_by'列表中是否有多个值而改变;为什么在'order_by'列表中的特定值 - 6,在这种情况下 - 会影响输出?另一个例子:
  2. (p [X] == min_(Y,order_by = Z))< = Y.in _((4,6,2))& Z.in _((0,))

    输出:

      
        
          

    P [0] == X,Y,Z       ([(6,)],[4,6,2],[0,0,0])

                 

    P [1] == X,Y,Z       ([(6,)],[2,6,4],[0,0,0])

                 

    P [2] == X,Y,Z       ([(2,)],[2,6,4],[0,0,0])

        
      

    为什么X的输出会根据提供的索引从6变为2?尽管前面的例子中的输出是错误的,但至少它对于所使用的索引是一致的;因为那里只有一分钟/最大值,这是因为。

    我至少可以使用min_,max_,sum_函数查看输出;但是,当涉及到rank_和running_sum_时,我迷失了。我在定义函数时遵循类似的过程:

    (p [X] == running_sum_(Z,group_by = Z,order_by = Z))< = Z.in _((43,44,65))

    我尝试查看输出:

    P [0] == X

    我收到错误:

    追踪(最近一次通话):   文件“”,第1行,in   文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/UserList.py”,第16行, repr     def repr (self):return repr(self.data)   文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py”,第109行,数据     self.todo.ask()   文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py”,第566行,在询问中     self._data = Body(self.pre_calculations,self).ask()   文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py”,第686行,在询问中     self._data = literal.lua.ask()   文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py”,第909行,在_中     调用(子目标)   调用文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py”,第664行     todo.do()#获取thunk并执行它   文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py”,第640行,在     self.thunk()   文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyEngine.py”,第846行,in     aggregate.complete(base_subgoal,subgoal))   文件“/usr/local/lib/python3.4/dist-packages/pyDatalog/pyParser.py”,第820行,完整     result = [tuple(l.terms)for l in list(base_subgoal.facts.values())] AttributeError:'bool'对象没有属性'values'

    这是什么意思?做错了什么? running_sum_(和rank_)参数共享的关系是什么 - “group_by”和“order_by”?

    由于网上似乎没有示例,因此非常感谢2或3个rank_和running_sum_用法的简短示例。

1 个答案:

答案 0 :(得分:0)

聚合子句分两步解决:

  • 首先解决子句中的未知数,同时忽略聚合函数
  • 然后在结果
  • 上应用聚合函数

以下是编写第一个句子的方法:

(p[None]==min_(Y, order_by=Y)) <= Y.in_((4,6,2))

p后括号中的变量用作&#34;组&#34;在SQL中,还必须出现在子句的主体中。在这种情况下,它不会改变,所以我使用无。当您想要检索另一个值而不是您订购的值时,需要order_by变量。

让我们假设您要检索每个班级中最年轻学生的姓名。基本谓词为pupil(ClassName, Name, Age)

+ pupil('1A', 'John', 8)
+ pupil('1B', 'Joe', 9)

汇总条款是:

(younger[ClassName] == min_(Name, order_by= Age)) <= pupil(ClassName, Name, Age)

然后查询将是:

(younger[ClassName]==X)