Package spade :: Module kb
[hide private]
[frames] | no frames]

Source Code for Module spade.kb

  1  from logic import FolKB, fol_bc_ask, expr, is_definite_clause, variables 
  2   
  3  import random 
  4  import string 
  5  import types 
  6   
7 -class KBNameNotString(Exception): pass
8 -class KBValueNotKnown(Exception): pass
9
10 -class KBConfigurationFailed(Exception):
11 - def __init__(self, msg=""):
12 self.msg = msg
13 - def __str__(self):
14 return repr(self.msg)
15
16 -class SpadeKB(FolKB):
17 - def tell(self, sentence):
18 if issubclass(sentence.__class__,str): 19 sentence = expr(sentence) 20 if is_definite_clause(sentence): 21 self.clauses.append(sentence) 22 else: 23 raise Exception("Not a definite clause: %s" % sentence)
24
25 - def retract(self, sentence):
26 if issubclass(sentence.__class__,str): 27 sentence = expr(sentence) 28 self.clauses.remove(sentence)
29
30 - def ask(self, q):
31 e = expr(q) 32 vars = variables(e) 33 ans = fol_bc_ask(self, [e]) 34 res = [] 35 for a in ans: 36 res.append(dict([(x, v) for (x, v) in a.items() if x in vars])) 37 res.sort(key=str) 38 39 if res==[]: return False 40 for r in res: 41 if r!={}: 42 return res 43 return True #res is a list of empty dicts
44
45 - def _encode(self, key,value):
46 key = key.capitalize() 47 if issubclass(value.__class__, str): 48 self.tell("Var("+key+","+value.capitalize()+",Str)") 49 50 elif issubclass(value.__class__,int): 51 self.tell("Var("+key+","+str(value)+",Int)") 52 53 elif issubclass(value.__class__,float): 54 self.tell("Var("+key+","+str(value) + ",Float)") 55 56 elif issubclass(value.__class__,list): 57 listID = ''.join(random.choice(string.ascii_uppercase+string.ascii_lowercase) for x in range(8)) 58 listID = listID.capitalize() #listID.replace(listID[0],listID[0].lower(),1) 59 for elem in value: 60 self._encode(listID, elem) 61 self.tell("Var("+ key + ","+ listID +",List)") 62 63 elif issubclass(value.__class__,dict): 64 dictID = ''.join(random.choice(string.ascii_uppercase+string.ascii_lowercase) for x in range(8)) 65 dictID = dictID.capitalize() #listID.replace(listID[0],listID[0].lower(),1) 66 for k,v in value.items(): 67 elemID = ''.join(random.choice(string.ascii_uppercase+string.ascii_lowercase) for x in range(8)) 68 elemID = elemID.capitalize() #elemID.replace(elemID[0],elemID[0].lower(),1) 69 self._encode(elemID+"Key",k) 70 self._encode(elemID+"Value",v) 71 self.tell("Pair("+dictID+","+elemID+")") 72 self.tell("Var("+key+","+dictID+",Dict)") 73 74 else: 75 raise KBValueNotKnown
76
77 - def _decode(self, key):
78 gen = self._gen_decode(key) 79 try: 80 return gen.next() 81 except StopIteration: 82 return None
83
84 - def _gen_decode(self, key):
85 key = key.capitalize() 86 results = self.ask("Var("+key+", value, type)") 87 if type(results)==types.BooleanType: 88 yield None 89 for res in results: 90 value = str(res[expr("value")]) 91 typ = str(res[expr("type")]) 92 93 if typ == "Int": yield int(value) 94 elif typ == "Str": yield str(value).lower() 95 elif typ == "Float": yield float(value) 96 elif typ == "List": 97 l = [] 98 listID = str(value) 99 gen = self._gen_decode(listID) 100 hasElements=True 101 while hasElements: 102 try: 103 l.append(gen.next()) 104 except: 105 hasElements=False 106 yield l 107 elif typ == "Dict": 108 dictID = str(value) 109 d = {} 110 for i in self.ask("Pair("+dictID+", elemid)"): 111 elemID = str(i[expr("elemid")]) 112 newkey = self._gen_decode(elemID+"Key").next() 113 newvalue = self._gen_decode(elemID+"Value").next() 114 d[newkey] = newvalue 115 yield d
116 117 118 119
120 -class KB:
121
122 - def __init__(self):
123 self.kb = SpadeKB() 124 self.type = "Spade"
125
126 - def configure(self, typ, sentence=None, path=None):
127 """ 128 Supported Knowledge Bases are: ["ECLiPSe", "Flora2", "SPARQL", "SWI", "XSB", "Spade"] 129 """ 130 try: 131 if typ not in ["ECLiPSe", "Flora2", "SPARQL", "SWI", "XSB", "Spade"]: 132 raise KBConfigurationFailed(typ + " is not a valid KB.") 133 if typ=="Spade": 134 self.kb = SpadeKB() 135 return 136 elif typ=="SPARQL": import SPARQLKB 137 elif typ=="XSB": import XSBKB 138 elif typ=="Flora2": import Flora2KB 139 elif typ=="SWI": import SWIKB 140 elif typ=="ECLiPSe":import ECLiPSeKB 141 else: raise KBConfigurationFailed("Could not import "+str(typ)+" KB.") 142 143 except KBConfigurationFailed as e: 144 #self.myAgent.DEBUG(str(e)+" Using Fol KB.", 'warn') 145 typ = "Spade" 146 147 self.type = typ 148 typ+="KB" 149 150 if typ=="SpadeKB": 151 self.kb = SpadeKB() 152 elif path!=None: 153 self.kb = eval(typ+"."+typ+"("+str(sentence)+", '"+path+"')") 154 else: 155 self.kb = eval(typ+"."+typ+"("+str(sentence)+")")
156
157 - def tell(self, sentence):
158 return self.kb.tell(sentence)
159
160 - def retract(self, sentence):
161 return self.kb.retract(sentence)
162
163 - def ask(self, sentence):
164 return self.kb.ask(sentence)
165
166 - def set(self, key, value):
167 if not issubclass(key.__class__, str): 168 raise KBNameNotString 169 170 self.kb._encode(key,value)
171
172 - def get(self, key):
173 return self.kb._decode(key)
174 175 176 if __name__ == "__main__": 177 178 kb0 = KB() 179 180 kb0.set("varname1",1234) 181 a = kb0.get("varname1") 182 print a, a.__class__ 183 184 kb0.set("varname2","myString") 185 a = kb0.get("varname2") 186 print a, a.__class__ 187 188 kb0.set("varname3",1.34) 189 a = kb0.get("varname3") 190 print a, a.__class__ 191 192 193 kb0.set("varname4",[5,6,7,8]) 194 a = kb0.get("varname4") 195 print a, a.__class__ 196 197 kb0.set("varname5",[5,6.23,"7",[8,9]]) 198 a = kb0.get("varname5") 199 print a, a.__class__ 200 201 kb0.set("varname6",{'a':123,'b':456,789:"c"}) 202 a = kb0.get("varname6") 203 print a, a.__class__ 204 205 kb0.set("varname7",{'a':[123.25],'b':[4,5,6],789:{'a':1,'b':2}}) 206 a = kb0.get("varname7") 207 print a, a.__class__ 208 209 try: 210 kb0.set(123,"newvalue") 211 except KBNameNotString: 212 print "Test KBNameNotString passed." 213 214
215 - class A: pass
216 try: 217 kb0.set("i8", A()) 218 except KBValueNotKnown: 219 print "Test KBValueNotKnown passed." 220 221 222 a = kb0.get("varname9") 223 print a, a.__class__ 224 225 #print kb0.kb.clauses 226