コード例 #1
0
  def exec_minconcat(self, envr, pm):
    result = ProofResult("")
    result.source = self
    
    if len(self.args) != 1:
      raise ProofError("-inconcat takes one argument, found: " + str(len(self.args)))
    intest = self.resolveOrDont(self.args[0])
    
    if not isinstance(intest, judge.InTest):
      raise ProofError("-inconcat expects a contains assertion, found: " + intext.shortString())
    cc = intest.rhs
    if not isinstance(cc, expSemantics.Concat):
      raise ProofError("-inconcat expects a concatenation, found: " + cc.shortString())
        
    els = []
    for c in cc.elements:    
      i2 = judge.InTest(None)
      i2.nt = intest.nt
      i2.lhs = intest.lhs
      i2.rhs = c
      els.append(i2)
      
    if intest.nt:
      r = expSemantics.And(None)
    else:
      r = expSemantics.Or(None)
    r.elements = els

    
    self.results = [r]
    result.verbose = pm.getIndent() + self.results[0].shortString()
    return result
コード例 #2
0
 def mor_callback(self, cases):
   comps = []
   falseTrip = True
   if len(cases.results) < len(cases.cases):
     falseTrip = False
   for r in cases.results:
     if not r.results:
       falseTrip = False
     elif len(r.results) == 1:
       rr = r.results[0]
       if rr != expSemantics.FALSE:
         falseTrip = False
       comps.append(rr)
     elif len(r.results) > 1:
       result = expSemantics.And(None)
       result.elements = r.results
       comps.append(result)
       
   if falseTrip:
     self.results = [expSemantics.FALSE]
   else:
     comps = list(set(comps))
     if expSemantics.FALSE in comps:
       comps.remove(expSemantics.FALSE)
     if not comps:
       self.results = [expSemantics.TRUE]
     elif len(comps) == 1:
       self.results = [comps[0]]
     else:
       result = expSemantics.Or(None)
       result.elements = comps
       self.results = [result]
コード例 #3
0
  def exec_apply(self, envr, pm):
    result = ProofResult("")
    rule = self.args[0]
    guessFV = False
    if hasattr(rule, "__iter__"):
      guessFV = rule[1]
      rule = rule[0]
    
    args = map(lambda x: [x], filter(lambda x: x != None, map(self.resolveOrDont, self.args[1:])))
    if self.equals:
      map(lambda x: envr.envClosure(x), args)

    fail = []
    matches = []
    for p in rule.premises:
      mm = []
      for a in args:
        for aa in a:
          m = aa.isSuperType(p, pm.world.symList)
          if m:
            mm.append(m)
      if not mm:
        fail.append(p)
      matches.append(mm)      
    if fail:
      raise ProofError("Premises of " + rule.name + " could not be satisfied: " + "; ".join(map(lambda x: x.shortString(), fail)))
    #try to unify the matches
    poss = [[]]
    for mm in matches:
      newPoss = []
      for m in mm:
        for p in poss:
          #if m agrees with p, then add p + m to newPoss
          if self.matchAgrees(p, m):
            newPoss.append(p + m.flatMatches())
      poss = newPoss
    if not poss:
      raise ProofError("Premises of " + rule.name + " could not be satisfied.")

    #find the conclusion and apply the possible unifications to it
    conc = sum(map(lambda c: map(lambda p: c.substMatch(p), poss), rule.getConclusions()), [])
    #fv in conc => forall quant
    #if the indhyp is being applied and was not primed (guessFV), then guess the FVs
    if not guessFV and conc and rule.freeConc:
      r = expSemantics.Forall(None)
      r.qVars = rule.freeConc
      if len(conc) == 1:
        r.rhs = conc[0]
      else:
        r.rhs = expSemantics.And(None)
        r.rhs.elements = conc
      conc = [r]   
    
    self.results = conc
    result.source = self
    result.verbose = pm.getIndent() + "Applied " + rule.name + ": " + "; ".join(map(lambda x: x.shortString(), self.results))
    return result
コード例 #4
0
 def exec_and(self, envr, pm):
   result = ProofResult("")
   result.source = self
   if self.args:
     conc = expSemantics.And(self.ast)
     conc.elements = map(lambda x: x.resolve(), self.args)
     self.results = [conc]
     result.verbose = pm.getIndent() + conc.shortString()
   
   return result
コード例 #5
0
  def implies_callback(self, cases):
    result = expSemantics.Implies(None)
    #lhs
    if len(self.args) == 1:
      result.lhs = self.args[0]
    else:
      result.lhs = expSemantics.And(None)
      result.lhs.elements = self.args
    
    #rhs
    if len(cases.results[0].results) == 0:
      result.rhs = expSemantics.TRUE
    elif len(cases.results[0].results) == 1:
      result.rhs = cases.results[0].results[0]
    else:
      result.rhs = expSemantics.And(None)
      result.rhs.elements = cases.results[0].results

     
    self.results = [result]
コード例 #6
0
 def forall_callback(self, cases):
   result = expSemantics.Forall(None)
   #quantifying variables
   result.qVars = self.args
   
   #rhs
   if len(cases.results[0].results) == 0:
     result.rhs = expSemantics.TRUE
   elif len(cases.results[0].results) == 1:
     result.rhs = cases.results[0].results[0]
   else:
     result.rhs = expSemantics.And(None)
     result.rhs.elements = cases.results[0].results
    
   self.results = [result]
コード例 #7
0
  def exec_invert(self, envr, pm):
    result = ProofResult("")
    result.source = self
    
    pc = self.invertArg(self.args[0], envr, pm)         
    if not pc:
      self.results = [expSemantics.FALSE]
      result.verbose = pm.getIndent() + expSemantics.FALSE.shortString()
      return result
    prems,cases = pc

    #package up results or open cases
    if self.star:
      r = expSemantics.Or(None)
      for p in prems:
        if len(p) == 0:
          cr = expSemantics.TRUE
        elif len(p) == 1:
          cr = p[0]
        else:
          cr = expSemantics.And(None)
          cr.elements = p
        r.elements.append(cr)
      if r.elements == 1:
        r = r.elements[0]
      self.results = [r]
      result.verbose = pm.getIndent() + r.shortString()
    else:
      if len(prems) == 1:
        self.results = prems[0]
        result.verbose = pm.getIndent() + "; ".join(map(lambda x: x.shortString(), self.results))
      else:
        self.cases = dict(zip(map(lambda c: c.name, cases), prems))
        result.verbose = pm.getIndent() + str(len(prems)) + " cases: " + "; ".join(map(lambda c: c.name, cases))
        pm.registerCallBack(self, "mor_callback")
      
    return result