Exemple #1
0
 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)
Exemple #2
0
 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) ])
Exemple #3
0
 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)
Exemple #4
0
 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) ])
Exemple #5
0
 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])
Exemple #6
0
 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])
Exemple #7
0
 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 ])
Exemple #8
0
 def nil(self, v):
     if v.is_var():
         return Substitutions(self, [{v: mk_term([])}])
     else:
         return Errors(self, ["nil: checking not supported"])