class KBTest(unittest.TestCase): def setUp(self): # Assert starter facts file = 'statements_kb4.txt' self.data = read.read_tokenize(file) data = read.read_tokenize(file) self.KB = KnowledgeBase([], []) for item in data: if isinstance(item, Fact) or isinstance(item, Rule): self.KB.kb_assert(item) def test1(self): # Did the student code contain syntax errors, AttributeError, etc. ask1 = read.parse_input("fact: (motherof ada ?X)") print(' Asking if', ask1) answer = self.KB.kb_ask(ask1) self.assertEqual(str(answer[0]), "?X : bing") def test2(self): # Can fc_infer actually infer ask1 = read.parse_input("fact: (grandmotherof ada ?X)") print(' Asking if', ask1) answer = self.KB.kb_ask(ask1) self.assertEqual(str(answer[0]), "?X : felix") self.assertEqual(str(answer[1]), "?X : chen") def test3(self): # Does retract actually retract things r1 = read.parse_input("fact: (motherof ada bing)") print(' Retracting', r1) self.KB.kb_retract(r1) ask1 = read.parse_input("fact: (grandmotherof ada ?X)") print(' Asking if', ask1) answer = self.KB.kb_ask(ask1) self.assertEqual(len(answer), 1) self.assertEqual(str(answer[0]), "?X : felix") def test4(self): # makes sure retract does not retract supported fact ask1 = read.parse_input("fact: (grandmotherof ada ?X)") print(' Asking if', ask1) answer = self.KB.kb_ask(ask1) self.assertEqual(str(answer[0]), "?X : felix") self.assertEqual(str(answer[1]), "?X : chen") r1 = read.parse_input("fact: (grandmotherof ada chen)") print(' Retracting', r1) self.KB.kb_retract(r1) print(' Asking if', ask1) answer = self.KB.kb_ask(ask1) self.assertEqual(str(answer[0]), "?X : felix") self.assertEqual(str(answer[1]), "?X : chen") def test5(self): # makes sure retract does not deal with rules ask1 = read.parse_input("fact: (parentof ada ?X)") print(' Asking if', ask1) answer = self.KB.kb_ask(ask1) self.assertEqual(str(answer[0]), "?X : bing") r1 = read.parse_input("rule: ((motherof ?x ?y)) -> (parentof ?x ?y)") print(' Retracting', r1) self.KB.kb_retract(r1) print(' Asking if', ask1) answer = self.KB.kb_ask(ask1) self.assertEqual(str(answer[0]), "?X : bing") def test6(self): # infer a new fact from a rule with 1 lhs statement ask1 = read.parse_input("fact: (parentof ada ?X)") print(' Asking if', ask1) answer = self.KB.kb_ask(ask1) self.assertEqual(str(answer[0]), "?X : bing") def test7(self): """this student generated test ensures retract only removes facts and rules that are supported by 1 or less fact-rule pairs """ r1 = read.parse_input("fact: (dresslike profHammond TonyStark)") read1 = self.KB._get_fact(r1) print(len(read1.supported_by)) print(read1.supports_rules) print(' Retracting', r1) self.KB.kb_retract(r1) ask1 = read.parse_input("fact: (isliterally ?X TonyStark)") print(' Asking if', ask1) answer = self.KB.kb_ask(ask1) self.assertEqual(str(answer[0]), "?X : profHammond") ask2 = read.parse_input("fact: (resembles profHammond ?Y)") print(' Asking if', ask2) answer = self.KB.kb_ask(ask2) print(answer) self.assertFalse(answer)
def main(): # Assert starter facts file = 'statements_kb2.txt' data = read.read_tokenize(file) KB = KnowledgeBase([], []) for dtype, item in data: if dtype == read.FACT: KB.kb_assert(item) # KB demonstration # Ask for one of the starter facts # print "Starting basic KB demonstration" _, ask1 = read.parse_input("fact: (hero ?x)") # print " Asking if", ask1 # answer = KB.kb_ask(ask1) # # print answer # pprint_justification(answer) # print ("Basic demonstration of KB complete" if answer else "ERROR: KB demonstration failed") + "\n" print "Starting Test 1" _, test1 = read.parse_input("fact: (hero Ai)") # print " Retracting", test1 KB.kb_retract(test1) # print KB.facts answer = KB.kb_ask(ask1) # print answer # pprint_justification(answer) print(("Fail" if answer else "Pass") + " Test 1\n") hai = Fact(test1).statement print "Starting Test 2" fail = True for dtype, item in data: if dtype == read.RULE: # print "the item is", item KB.kb_assert(item) # if not factq(item): # print "SCREAM", Rule(item) # print "LHS first term is", Rule(item).lhs[0] # first_term = Rule(item).lhs[0] # bound = match(hai, first_term) # if bound: # print "bindings are", bound # insta = instantiate(Rule(item).lhs[0], bound) # print "INSTA", insta # insta2 = instantiate(Rule(item).rhs, bound) # print "INSTA2", insta2 # new_lhs = copy.deepcopy(Rule(item).lhs) # new_lhs.remove(first_term) # print "new lhs", new_lhs # supby = [[Rule(item), hai]] # newfact = Fact(insta2, supby) # print "newfact sup by is", newfact.supported_by # print newfact.statement # # print "now it's", Rule(item) # newrulelist = [[insta.predicate], [insta2.predicate, insta2.terms]] # print "list is", newrulelist # # newrule = Rule(newrulelist) # # else: # # print "DIDN'T MATCH" _, test2_1 = read.parse_input("fact: (strong ?x)") print " Asking", test2_1 answer = KB.kb_ask(test2_1) #pprint_justification(answer) if answer and len(answer) == 1 and answer[0]['?x'] == 'Ai': print " Pass Part 1" _, test2_2 = read.parse_input("fact: (inst Sarorah ?x)") print " Asking", test2_2 answer = KB.kb_ask(test2_2) #pprint_justification(answer) if answer and len(answer) == 2 and (answer[0]['?x'] == 'Sorceress' or answer[0]['?x'] == 'Wizard'): print " Pass Part 2" _, test2_3 = read.parse_input("fact: (dead ?dragon)") print " Asking", test2_3 answer = KB.kb_ask(test2_3) #pprint_justification(answer) if not answer: print " Pass Part 3" _, assert_hero = read.parse_input("fact: (hero Ai)") print " Asserting", assert_hero KB.kb_assert(assert_hero) _, test2_4 = read.parse_input("fact: (dead ?dragon)") print " Asking", test2_4 answer = KB.kb_ask(test2_4) # pprint_justification(answer) if answer and len( answer) == 1 and answer[0]['?dragon'] == 'Nosliw': print " Pass Part 4\nPass Test 2\n" fail = False if fail: print "Fail Test 2\n" # DEBUGGING FOR TEST 2 # answer = KB.kb_ask(test2_4) for f in KB.facts: print f.statement, "\n" f = KB.facts[2] print "this is the fact", f print "what", isinstance(f.statement, Statement) dummy = Fact(['possesses', 'Ai', 'code']) print dummy dummy2 = Fact(['a', 'b', 'c', 'd']) print "HELLO", KB._get_fact(dummy) # print "the fact", f.statement # for s in f.supported_by[0]: # print s # print "consider the fact", f.statement # print f.asserted # for sf in f.supported_by: # print sf, "\n" print "Starting Test 3" fail = True _, possesses = read.parse_input("fact: (possesses Ai Loot)") print " Retracting", possesses KB.kb_retract(possesses) _, test3_1 = read.parse_input("fact: (dead ?dragon)") print " Asking", test3_1 answer = KB.kb_ask(test3_1) print "I HATE IT", factq(['a']) #pprint_justification(answer) if not answer: print " Pass Part 1" print " Asserting", possesses KB.kb_assert(possesses) _, sleeping = read.parse_input("fact: (sleeping Nosliw)") _, safe = read.parse_input( "rule: (sleeping Nosliw) -> (safe HappyDale)") print " Asserting", sleeping KB.kb_assert(sleeping) print " Asserting", safe KB.kb_assert(safe) print " Retracting", possesses KB.kb_retract(possesses) _, possesses = read.parse_input("fact: (possesses Ai Loot)") _, test3_2 = read.parse_input("fact: (safe ?town)") print " Asking", test3_2 answer = KB.kb_ask(test3_2) #pprint_justification(answer) if answer and len(answer) == 1 and answer[0]['?town'] == 'HappyDale': print " Pass Part 2\nPass Test 3\n" fail = False if fail: print "Fail Test 3\n"