def times(self, a, b, prod): """Like Prolog times; at most one argument may be a variable, if none are checks whether prod=a+b, else binds the variable accordingly. """ if (a.is_var() and (b.is_var() or prod.is_var())) or (b.is_var() and prod.is_var()): return Errors(self, ["Only one variable allowed in times."]) if ((not (a.is_var() or a.is_numconst())) or (not (b.is_var() or b.is_numconst())) or (not (prod.is_var() or prod.is_numconst()))): return Errors(self, ["times expects numbers"]) if a.is_var(): if b.num == 0: return Errors(self, ["times: divide by 0 not allowed"]) else: return Substitutions(self, [self.bindResult(a, prod.num / b.num)]) elif b.is_var(): if a.num == 0: return Errors(self, ["times: divide by 0 not allowed"]) else: return Substitutions(self, [self.bindResult(b, prod.num / a.num)]) elif prod.is_var(): return Substitutions(self, [self.bindResult(prod, a.num * b.num)]) else: res = prod.num == a.num * b.num return Success(self) if res else Failure(self)
def gcc_compile(self, src, deps, obj): dst = os.path.splitext(src['file'])[0] + '.o' env = os.environ env['LC_ALL'] = 'C' env['LANG'] = 'C' (ret, _, err) = self.callTool('gcc', '-c', '-o', dst, src['file'], env=env) if ret != 0: self.log.error(err) return Errors(self, [ err ] ) objref = self.fs.put_file(dst) return Substitutions(self, [ self.bindResult(obj, objref) ])
def plus(self, a, b, sum): """Like Prolog sum; at most one argument may be a variable, if none are checks whether sum=a+b, else binds the variable accordingly. """ if (a.is_var() and (b.is_var() or sum.is_var())) or (b.is_var() and sum.is_var()): return Errors(self, ["Only one variable allowed in plus."]) if ((not (a.is_var() or a.is_numconst())) or (not (b.is_var() or b.is_numconst())) or (not (sum.is_var() or sum.is_numconst()))): return Errors(self, ["plus expects numbers"]) if a.is_var(): return Substitutions(self, [self.bindResult(a, sum.num - b.num)]) elif b.is_var(): return Substitutions(self, [self.bindResult(b, sum.num - a.num)]) elif sum.is_var(): return Substitutions(self, [self.bindResult(sum, a.num + b.num)]) else: res = sum.num == a.num + b.num return Success(self) if res else Failure(self)
def gcc_link(self, ofiles, exename, exe): filenames = [ r['file'] for r in ofiles ] args = [ 'gcc', '-o', exename.val ] + filenames env = os.environ env['LC_ALL'] = 'C' env['LANG'] = 'C' (ret, _, err) = self.callTool(*args, env=env) if ret != 0: self.log.error(err) return Errors(self, [ err ] ) exeref = self.fs.put_file(exename.val) return Substitutions(self, [ self.bindResult(exe, exeref) ])
def yices(self, formula, result, model): with tempfile.NamedTemporaryFile(delete=False, dir='.') as oc: new_file = os.path.basename(oc.name) print >> oc, '(include "%s")' % formula['file'] print >> oc, '(check)' (ret, out, err) = self.callTool('yices', '-e', new_file) if ret != 0: self.log.error(err) return Errors(self, ['error("yices", "%s")' % err]) output = out.split('\n') if output[0] == 'sat': s = self.bindResult(result, output[0]) s = self.bindResult(model, ''.join(output[1:]), current=s) else: s = self.bindResult(result, output[0]) s = self.bindResult(model, [], current=s) if s == []: return Failure(self) else: return Substitutions(self, [s])
def nil(self, v): if v.is_var(): return Substitutions(self, [self.bindResult(v, mk_term([]))]) else: return Errors(self, ["nil passed a non variable: %s" % v])
def nil(self, v): """Bind v to the empty list""" if v.is_var(): return Substitutions(self, [ self.bindResult(v, terms.mk_term([])) ]) else: return Errors(self, [ "nil passed a non variable: %s" % v ])
def nil(self, v): if v.is_var(): return Substitutions(self, [{v: mk_term([])}]) else: return Errors(self, ["nil: checking not supported"])