def builtin_date_time_stamp(g, pe): # logging.debug( "builtin_date_time_stamp called, g: %s" % g) pred = g.clause.body[g.inx] args = pred.args if len(args) != 2: raise PrologRuntimeError('date_time_stamp: 2 args expected.') if not isinstance(args[0], Predicate) or not args[0].name == 'date' or len(args[0].args) != 7: raise PrologRuntimeError('date_time_stamp: arg0: date structure expected.') arg_Y = prolog_get_int(args[0].args[0], g.env) arg_M = prolog_get_int(args[0].args[1], g.env) arg_D = prolog_get_int(args[0].args[2], g.env) arg_H = prolog_get_int(args[0].args[3], g.env) arg_Mn = prolog_get_int(args[0].args[4], g.env) arg_S = prolog_get_int(args[0].args[5], g.env) arg_TZ = prolog_get_string(args[0].args[6], g.env) tz = get_localzone() if arg_TZ == 'local' else pytz.timezone(arg_TZ) if not isinstance(args[1], Variable): raise PrologRuntimeError('date_time_stamp: arg1: variable expected.') v = g.env.get(args[1].name) if v: raise PrologRuntimeError('date_time_stamp: arg1: variable already bound.') dt = datetime.datetime(arg_Y, arg_M, arg_D, arg_H, arg_Mn, arg_S, tzinfo=tz) g.env[args[1].name] = time.mktime(dt.timetuple()) return True
def builtin_say(g, pe): # logging.debug("builtin_say called, g: %s" % g) pred = g.clause.body[g.inx] args = pred.args if len(args) < 2: raise PrologRuntimeError('say: at least 2 args expected.') arg_L = args[0].name arg_F = prolog_get_string(args[1], g.env) if len(args)>2: a = map(lambda x: prolog_get_literal(x, g.env), args[2:]) say_str = arg_F % tuple(a) else: say_str = arg_F pe.add_utterance(arg_L, say_str) # print # print "***** SAY(%s): %s" % (arg_L, arg_F) # print return True
def builtin_date_time_stamp(g, pe): # logging.debug( "builtin_date_time_stamp called, g: %s" % g) pe._trace('CALLED BUILTIN date_time_stamp', g) pred = g.clause.body[g.inx] args = pred.args if len(args) != 2: raise PrologRuntimeError('date_time_stamp: 2 args expected.') if not isinstance(args[0], Predicate) or not args[0].name == 'date' or len( args[0].args) != 7: raise PrologRuntimeError( 'date_time_stamp: arg0: date structure expected.') arg_Y = pe.prolog_get_int(args[0].args[0], g.env) arg_M = pe.prolog_get_int(args[0].args[1], g.env) arg_D = pe.prolog_get_int(args[0].args[2], g.env) arg_H = pe.prolog_get_int(args[0].args[3], g.env) arg_Mn = pe.prolog_get_int(args[0].args[4], g.env) arg_S = pe.prolog_get_int(args[0].args[5], g.env) arg_TZ = pe.prolog_get_string(args[0].args[6], g.env) #if pe.trace: # print "BUILTIN date_time_stamp called, Y=%s M=%s D=%s H=%s Mn=%s S=%s TZ=%s" % ( str(arg_Y), str(arg_M), str(arg_D), str(arg_H), str(arg_Mn), str(arg_S), str(arg_TZ)) tz = get_localzone() if arg_TZ == 'local' else pytz.timezone(arg_TZ) if not isinstance(args[1], Variable): raise PrologRuntimeError('date_time_stamp: arg1: variable expected.') v = g.env.get(args[1].name) if v: raise PrologRuntimeError( 'date_time_stamp: arg1: variable already bound.') dt = datetime.datetime(arg_Y, arg_M, arg_D, arg_H, arg_Mn, arg_S, tzinfo=tz) g.env[args[1].name] = NumberLiteral(time.mktime(dt.timetuple())) return True
def _builtin_list_lambda(pred, env, pe, l): args = pred.args if len(args) != 1: raise PrologRuntimeError('list builtin fn: 1 arg expected.') arg_list = pe.prolog_get_list(args[0], env) res = reduce(l, arg_list.l) return res, arg_list.l
def builtin_stamp_date_time(g, pe): pe._trace('CALLED BUILTIN stamp_date_time', g) pred = g.clause.body[g.inx] args = pred.args if len(args) != 2: raise PrologRuntimeError('stamp_date_time: 2 args expected.') if not isinstance(args[1], Predicate) or not args[1].name == 'date' or len( args[1].args) != 7: raise PrologRuntimeError( 'stamp_date_time: arg1: date structure expected.') try: arg_Y = pe.prolog_get_variable(args[1].args[0], g.env) arg_M = pe.prolog_get_variable(args[1].args[1], g.env) arg_D = pe.prolog_get_variable(args[1].args[2], g.env) arg_H = pe.prolog_get_variable(args[1].args[3], g.env) arg_Mn = pe.prolog_get_variable(args[1].args[4], g.env) arg_S = pe.prolog_get_variable(args[1].args[5], g.env) arg_TZ = pe.prolog_get_string(args[1].args[6], g.env) tz = get_localzone() if arg_TZ == 'local' else pytz.timezone(arg_TZ) arg_TS = pe.prolog_get_float(args[0], g.env) dt = datetime.datetime.fromtimestamp(arg_TS, tz) g.env[arg_Y] = NumberLiteral(dt.year) g.env[arg_M] = NumberLiteral(dt.month) g.env[arg_D] = NumberLiteral(dt.day) g.env[arg_H] = NumberLiteral(dt.hour) g.env[arg_Mn] = NumberLiteral(dt.minute) g.env[arg_S] = NumberLiteral(dt.second) except PrologRuntimeError: return False return True
def builtin_get_time(g, pe): # logging.debug( "builtin_get_time called, g: %s" % g) pred = g.clause.body[g.inx] args = pred.args if len(args) != 1: raise PrologRuntimeError('get_time: 1 arg expected.') arg_T = prolog_get_variable(args[0], g.env) dt = datetime.datetime.now() g.env[arg_T] = NumberLiteral(time.mktime(dt.timetuple())) return True
def builtin_cmp_op(g, op): pred = g.clause.body[g.inx] args = pred.args if len(args) != 2: raise PrologRuntimeError('cmp_op: 2 args expected.') a = prolog_get_float(args[0], g.env) b = prolog_get_float(args[1], g.env) res = op(a,b) # logging.debug("builtin_cmp_op called, g: %s, a:%s, b:%s, res:%s" % (g, a, b, res)) return res
def builtin_say(g, pe): pe._trace('CALLED BUILTIN say', g) pred = g.clause.body[g.inx] args = pred.args if len(args) != 2: raise PrologRuntimeError('say: 2 args expected.') arg_L = args[0].name arg_S = pe.prolog_get_string(args[1], g.env) pe.add_utterance(arg_L, arg_S) return True
def builtin_get_time(g, pe): pe._trace('CALLED BUILTIN get_time', g) pred = g.clause.body[g.inx] args = pred.args if len(args) != 1: raise PrologRuntimeError('get_time: 1 arg expected.') arg_T = pe.prolog_get_variable(args[0], g.env) dt = datetime.datetime.now() g.env[arg_T] = NumberLiteral(time.mktime(dt.timetuple())) return True
def builtin_set_context(g, pe): # logging.debug("builtin_set_context called, g: %s" % g) pred = g.clause.body[g.inx] args = pred.args if len(args) != 2: raise PrologRuntimeError('context: 2 args expected.') key = args[0].name value = prolog_eval(args[1], g.env) # print u"builtin_set_context: %s -> %s" % (key, unicode(value)) pe.db.write_context(pe.context_name, key, value) return True
def builtin_isoformat(pred, env, pe): pe._trace_fn('CALLED FUNCTION isoformat', env) args = pred.args if len(args) != 2: raise PrologRuntimeError('isoformat: 2 args expected.') arg_TS = pe.prolog_get_float(args[0], env) arg_TZ = pe.prolog_get_string(args[1], env) tz = get_localzone() if arg_TZ == 'local' else pytz.timezone(arg_TZ) dt = datetime.datetime.fromtimestamp(arg_TS, tz) return StringLiteral(dt.isoformat())
def builtin_cmp_op(g, op, pe): pred = g.clause.body[g.inx] args = pred.args if len(args) != 2: raise PrologRuntimeError('cmp_op: 2 args expected.') a = pe.prolog_get_float(args[0], g.env) b = pe.prolog_get_float(args[1], g.env) res = op(a, b) if pe.trace: logging.info("builtin_cmp_op called, a=%s, b=%s, res=%s" % (a, b, res)) return res
def builtin_set_context(g, pe): pe._trace('CALLED BUILTIN set_context', g) pred = g.clause.body[g.inx] args = pred.args if len(args) != 2: raise PrologRuntimeError('context: 2 args expected.') key = args[0].name value = pe.prolog_eval(args[1], g.env) # print u"builtin_set_context: %s -> %s" % (key, unicode(value)) pe.db.write_context(pe.context_name, key, value) return True
def builtin_context(g, pe): # logging.debug("builtin_context called, g: %s" % g) pred = g.clause.body[g.inx] args = pred.args if len(args) != 2: raise PrologRuntimeError('context: 2 args expected.') key = args[0].name arg_v = prolog_get_variable(args[1], g.env) v = pe.db.read_context(pe.context_name, key) if not v: return False # print u"builtin_context: %s -> %s" % (key, unicode(v.body)) g.env[arg_v] = v.body[0] return True
def builtin_sparql_query(g, pe): pe._trace('CALLED BUILTIN sparql_query', g) pred = g.clause.body[g.inx] args = pred.args if len(args) < 1: raise PrologRuntimeError('say: at least 1 argument expected.') query = pe.prolog_get_string(args[0], g.env) # logging.debug("builtin_sparql_query called, query: '%s'" % query) # run query result = pe.kb.query(query) # logging.debug("builtin_sparql_query result: '%s'" % repr(result)) # turn result into lists of literals we can then bind to prolog variables res_map = {} res_vars = {} # variable idx -> variable name for binding in result: for v in binding.labels: l = binding[v] value = unicode(l) if l.datatype: datatype = str(l.datatype) if datatype == 'http://www.w3.org/2001/XMLSchema#decimal': value = NumberLiteral(float(value)) elif datatype == 'http://www.w3.org/2001/XMLSchema#float': value = NumberLiteral(float(value)) elif datatype == 'http://www.w3.org/2001/XMLSchema#dateTime': dt = dateutil.parser.parse(value) value = NumberLiteral(time.mktime(dt.timetuple())) else: raise PrologRuntimeError( 'sparql_query: unknown datatype %s .' % datatype) else: value = StringLiteral(value) if not v in res_map: res_map[v] = [] res_vars[binding.labels[v]] = v res_map[v].append(value) # logging.debug("builtin_sparql_query res_map : '%s'" % repr(res_map)) # logging.debug("builtin_sparql_query res_vars: '%s'" % repr(res_vars)) # apply bindings to environment vars v_idx = 0 for arg in args[1:]: sparql_var = res_vars[v_idx] prolog_var = pe.prolog_get_variable(arg, g.env) value = res_map[sparql_var] # logging.debug("builtin_sparql_query mapping %s -> %s: '%s'" % (sparql_var, prolog_var, value)) g.env[prolog_var] = ListLiteral(value) v_idx += 1 return True
def builtin_sub_string(g, pe): pe._trace('CALLED BUILTIN sub_string', g) pred = g.clause.body[g.inx] args = pred.args if len(args) != 5: raise PrologRuntimeError('sub_string: 5 args expected.') arg_String = pe.prolog_get_string(args[0], g.env) arg_Before = pe.prolog_eval(args[1], g.env) arg_Length = pe.prolog_eval(args[2], g.env) arg_After = pe.prolog_eval(args[3], g.env) arg_SubString = pe.prolog_eval(args[4], g.env) # FIXME: implement other variants if arg_Before: if not isinstance(arg_Before, NumberLiteral): raise PrologRuntimeError( 'sub_string: arg_Before: Number expected, %s found instead.' % arg_Before.__class__) before = int(arg_Before.f) if arg_Length: if not isinstance(arg_Length, NumberLiteral): raise PrologRuntimeError( 'sub_string: arg_Length: Number expected, %s found instead.' % arg_Length.__class__) length = int(arg_Length.f) if arg_After: raise PrologRuntimeError( 'sub_string: FIXME: arg_After required to be a variable for now.' ) else: var_After = pe.prolog_get_variable(args[3], g.env) if var_After != '_': g.env[var_After] = NumberLiteral( len(arg_String) - before - length) if arg_SubString: raise PrologRuntimeError( 'sub_string: FIXME: arg_SubString required to be a variable for now.' ) else: var_SubString = pe.prolog_get_variable(args[4], g.env) if var_SubString != '_': g.env[var_SubString] = StringLiteral( arg_String[before:before + length]) else: raise PrologRuntimeError( 'sub_string: FIXME: arg_Length required to be a literal for now.' ) else: raise PrologRuntimeError( 'sub_string: FIXME: arg_Before required to be a literal for now.') return True