Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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"