Exemple #1
0
def determine_param_orderings(predicate):
  logger.debug("Determining ordering for: " + str(predicate))
  
  def establish_relationship(value_pair, index_pair, op, cmp_map):
    x,y = value_pair
    i,k = index_pair
    if not(cmp_map.has_key((i,k)) and cmp_map[(i,k)] == None):
      if op(x,y):
        if cmp_map.has_key((i,k)): 
          if op != cmp_map[(i,k)]:
            cmp_map[(i,k)] = None
        else:
          cmp_map[(i,k)] = op
      elif cmp_map.has_key((i,k)) and op == cmp_map[(i,k)]:
        cmp_map[(i,k)] = None
      logger.debug(str(cmp_map))
  # end establish_relationship
      
  v = UniqueVariableFactory()
  type_map = {}
  types = predicate.param_types
  for i, type in zip(range(0, len(types)), types):
    if not type_map.has_key(type):
      type_map[type] = []
    type_map[type].append(i)
  pairs = []
  for type in type_map.keys():
    for x in choose(type_map[type], 2):
      pairs.append(list(x))
  cmp_map = {}
  variables = v.next_variable_sequence(predicate.arity)
  logger.debug("Calling: fol_bc_ask( %s )" % predicate(*variables))
  for answer in fol_bc_ask([predicate(*variables)], {}):
    logger.debug("Answer: " + str(answer))
    for pair in pairs:
      i,k = pair
      x,y = answer[variables[i]], answer[variables[k]]
      logger.debug("Comparing %s and %s." % (x, y))
      try:
        for op in [operator.lt, operator.gt, operator.eq]:
          establish_relationship((x,y), (i,k), op, cmp_map)
      except:
        pass
  return cmp_map
Exemple #2
0
def foil_main(predicate, positive_tuples, negative_tuples, bk, ordering=None):
  arity = predicate.arity
  clauses = set([])
  variable_factory = UniqueVariableFactory()
  params = variable_factory.next_variable_sequence(predicate.arity, 
                                                   prefix="PARAM_")
  training_set = TrainingSet(predicate, 
                             params, 
                             positive_tuples, 
                             negative_tuples)
  while len(training_set.positive_examples) > 0:
    head = tuple(training_set.variables)
    for x in head: x.depth = 0
    body = []
    rule = MutableRule(predicate, head, body)
    predicate.rules.append(rule)
    construct_clause_recursive(predicate, 
                               rule, 
                               training_set, 
                               bk, 
                               variable_factory=variable_factory, 
                               ordering=ordering)