Exemple #1
0
 def test_file_parsing(self):
     """Test parsing FDL from files."""
     kb = logic.PropKB()
     cp_parser = parser.ConceptualParser(kb)
     icp_parser = parser.IndexedConceptParser(kb)
     fdl_handler = fdl.BaseFrameHandler(kb, cp_parser, icp_parser)
     fdl_parser = fdl.FDLParser(fdl_handler)
     test_fdl_path = os.path.join(os.path.dirname(__file__), 'test.fdl')
     self.assertEqual(fdl_parser.parse_fdl_file(test_fdl_path), True)
     self.assertParseEqual(
         cp_parser.parse('hog let us restart the talk on'), [
             logic.Description(
                 'c-action-request', {
                     'action': 'c-restart',
                     'addressee': 'c-hog',
                     'object': 'c-talkon'
                 })
         ])
     self.assertParseEqual(
         cp_parser.parse("hog why don't we start over with the talk on"), [
             logic.Description(
                 'c-action-request', {
                     'action': 'c-restart',
                     'addressee': 'c-hog',
                     'object': 'c-talkon'
                 })
         ])
Exemple #2
0
    def test_sequence(self):
        """Test :sequence patterns."""
        kb = logic.PropKB()
        p = parser.ConceptualParser(kb)
        p.add_phrasal_pattern_object(logic.expr('c-thing'),
                                     [':sequence', 'a', 'b', 'c'])
        self.assertParseEqual(p.parse('a b c'), [logic.Description('c-thing')])
        self.assertParseEqual(p.parse('a b c d'), [])
        self.assertParseEqual(p.parse('g a b c'), [])
        p.add_phrasal_pattern_object(
            logic.expr('c-thing'),
            [':sequence', 'a', [':sequence', 'x', 'y', 'z']])
        p.add_phrasal_pattern_object(logic.expr('c-thing'),
                                     [':sequence', 'a', [':sequence', 'x']])
        p.add_phrasal_pattern_object(
            logic.expr('c-thing'),
            [':sequence', [':sequence', 'x', 'y', 'z'], 'a'])
        self.assertParseEqual(p.parse('a x y z'),
                              [logic.Description('c-thing')])
        self.assertParseEqual(p.parse('a x'), [logic.Description('c-thing')])
        self.assertParseEqual(p.parse('x y z a'),
                              [logic.Description('c-thing')])

        p.add_phrasal_pattern_object(
            logic.expr('c-thing'),
            [':sequence', [':sequence', 'x', 0, 'z'], 'a'])
        self.assertRaises(TypeError,
                          lambda: p.parse_tokens(['x', 0, 'z', 'a']))
Exemple #3
0
def descriptify(a):
    if isinstance(a, str):
        return logic.Description(a)
    elif isinstance(a, logic.Expr):
        return descriptify(a.op)
    elif isinstance(a, logic.Description):
        newslots = {}
        for slot in a.slots:
            newslots[slot] = descriptify(a.slots[slot])
        return logic.Description(a.base, newslots)
    else:
        return a
Exemple #4
0
 def test_simple_parsing(self):
     """Simple parsing tests."""
     kb = logic.PropKB()
     p = parser.ConceptualParser(kb)
     p.add_phrasal_pattern(logic.expr('BigRedThing'), 'big red thing')
     self.assertParseEqual(p.parse_tokens(['big', 'red', 'thing']),
                           [logic.Description('BigRedThing')])
     self.assertParseEqual(p.parse('big red thing'),
                           [logic.Description('BigRedThing')])
     self.assertParseEqual(p.parse('BIG red THING'),
                           [logic.Description('BigRedThing')])
     self.assertRaises(TypeError, lambda: p.parse_tokens(0))
     self.assertRaises(TypeError, lambda: p.parse_tokens([0]))
     self.assertRaises(TypeError, lambda: p.parse(0))
     self.assertRaises(TypeError, lambda: p.parse([0]))
Exemple #5
0
 def test_descriptions2(self):
     """More description tests."""
     kb = logic.PropKB()
     kb.tell(logic.expr('ISA(c-cat, c-animal)'))
     kb.tell(logic.expr('INSTANCEOF(i-petunia, c-cat)'))
     kb.tell(logic.expr('color(i-petunia, i-gray)'))
     kb.tell(logic.expr('ISA(i-gray, c-color)'))
     kb.tell(logic.expr('alternate-spelling(i-gray, grey)'))
     # Description of a cat whose color is something with an alternate
     # spelling 'grey'.
     d = logic.Description('c-cat', {
         'color':
         logic.Description('c-color', {'alternate-spelling': 'grey'})
     })
     self.assertEqual(d.find_all(kb), [logic.expr('i-petunia')])
     self.assertEqual(d.find_instances(kb), [logic.expr('i-petunia')])
Exemple #6
0
    def test_icp_slot_filling(self):
        """Slightly more complicated tests with ICP index sets that
    contain terminals and concepts.
    """
        kb = logic.PropKB()
        p = parser.IndexedConceptParser(kb)
        kb.tell(logic.expr('ISA(c-red, c-color)'))
        kb.tell(logic.expr('ISA(c-green, c-color)'))
        kb.tell(logic.expr('ISA(c-big, c-size)'))
        kb.tell(logic.expr('ISA(c-small, c-size)'))
        kb.tell(logic.expr('$constraint(c-dog, color, c-color)'))
        kb.tell(logic.expr('$constraint(c-dog, size, c-size)'))
        p.add_phrasal_pattern(logic.expr('c-red'), 'red')
        p.add_phrasal_pattern(logic.expr('c-green'), 'green')
        p.add_phrasal_pattern(logic.expr('c-big'), 'big')
        p.add_phrasal_pattern(logic.expr('c-small'), 'small')
        p.add_index_set('c-dog', '{color} !{size} !dog')

        results = p.parse('dog')
        self.assertEqual(len(results), 0)
        results = p.parse('big red')
        self.assertEqual(len(results), 0)
        results = p.parse('big red dog')
        self.assertEqual(len(results), 1)
        self.assertParseEqual(
            results,
            [logic.Description('c-dog', {
                'size': 'c-big',
                'color': 'c-red'
            })])
        results = p.parse('big dog')
        self.assertEqual(len(results), 1)
        self.assertParseEqual(results,
                              [logic.Description('c-dog', {'size': 'c-big'})])

        # Now multiple slots of the same type.
        kb.tell(logic.expr('$constraint(c-thing, slot-a, c-size)'))
        kb.tell(logic.expr('$constraint(c-thing, slot-b, c-size)'))
        p.add_index_set('c-thing', '{slot-a} {slot-b}')
        results = p.parse('big small')
        self.assertParseEqual(results, [
            logic.Description('c-thing', {
                'slot-a': 'c-big',
                'slot-b': 'c-small'
            })
        ])
Exemple #7
0
    def test_pre_parser(self):
        """Test the pre-parser."""
        kb = logic.PropKB()
        p = parser.ConceptualParser(kb)
        self.assertParseEqual(p.parse('123'),
                              [logic.Description('c-number', {'value': 123})])
        self.assertParseEqual(p.parse('0'),
                              [logic.Description('c-number', {'value': 0})])
        self.assertParseEqual(p.parse('01'),
                              [logic.Description('c-number', {'value': 1})])
        self.assertParseEqual(p.parse('019'),
                              [logic.Description('c-number', {'value': 19})])
        self.assertParseEqual(p.parse('5'),
                              [logic.Description('c-number', {'value': 5})])

        # FIXME: These parse into digits--need to fix this inconsistency.
        # self.assertParseEqual(p.parse('one'),
        #                       [logic.Description('c-number',
        #                                          {'value': 1})])
        # self.assertParseEqual(p.parse('seven'),
        #                       [logic.Description('c-number',
        #                                          {'value': 7})])

        self.assertParseEqual(
            p.parse('HK'),
            [logic.Description('c-mgrs-square', {'letters': 'hk'})])
        self.assertParseEqual(
            p.parse('XY'),
            [logic.Description('c-mgrs-square', {'letters': 'xy'})])
Exemple #8
0
 def test_combo_directives(self):
     """Test more combinations of directives."""
     kb = logic.PropKB()
     p = parser.ConceptualParser(kb)
     p.add_phrasal_pattern_object(logic.expr('c-thing'), [
         ':sequence', 'a',
         [
             ':any',
             [':sequence', 'b', [':optional', [':any', 'c', 'd']], 'e'], 'z'
         ]
     ])
     self.assertParseEqual(p.parse('a b e'), [logic.Description('c-thing')])
     self.assertParseEqual(p.parse('a b c e'),
                           [logic.Description('c-thing')])
     self.assertParseEqual(p.parse('a b d e'),
                           [logic.Description('c-thing')])
     self.assertParseEqual(p.parse('a b d e e'), [])
     self.assertParseEqual(p.parse('a z'), [logic.Description('c-thing')])
     self.assertParseEqual(p.parse('a z e'), [])
Exemple #9
0
    def test_any(self):
        """Test :any patterns."""
        kb = logic.PropKB()
        p = parser.ConceptualParser(kb)
        p.add_phrasal_pattern_object(
            logic.expr('c-thing'),
            [':sequence', 'a', [':any', 'b', 'c', 'd'], 'e'])
        self.assertParseEqual(p.parse('a b e'), [logic.Description('c-thing')])
        self.assertParseEqual(p.parse('a c e'), [logic.Description('c-thing')])
        self.assertParseEqual(p.parse('a d e'), [logic.Description('c-thing')])
        self.assertParseEqual(p.parse('a z e'), [])

        p = parser.ConceptualParser(kb)
        p.add_phrasal_pattern_object(
            logic.expr('c-thing'),
            [':sequence', [':optional', 'the'], 'thing'])
        self.assertParseEqual(p.parse('thing'), [logic.Description('c-thing')])
        self.assertParseEqual(p.parse('the thing'),
                              [logic.Description('c-thing')])
Exemple #10
0
    def test_optional(self):
        """Test :optional patterns."""
        kb = logic.PropKB()
        p = parser.ConceptualParser(kb)
        p.add_phrasal_pattern_object(
            logic.expr('c-thing'),
            [':sequence', 'the', [':optional', 'big'], 'thing'])
        self.assertParseEqual(p.parse('the thing'),
                              [logic.Description('c-thing')])
        self.assertParseEqual(p.parse('the big thing'),
                              [logic.Description('c-thing')])
        self.assertParseEqual(p.parse('the'), [])
        self.assertParseEqual(p.parse('thing'), [])

        p = parser.ConceptualParser(kb)
        p.add_phrasal_pattern_object(
            logic.expr('c-thing'),
            [':sequence', [':optional', 'the'], 'thing'])
        self.assertParseEqual(p.parse('thing'), [logic.Description('c-thing')])
        self.assertParseEqual(p.parse('the thing'),
                              [logic.Description('c-thing')])

        p = parser.ConceptualParser(kb)
        p.add_phrasal_pattern_object(
            logic.expr('c-thing'),
            [':sequence', 'the', [':optional', 'thing']])
        self.assertParseEqual(p.parse('the'), [logic.Description('c-thing')])
        self.assertParseEqual(p.parse('the thing'),
                              [logic.Description('c-thing')])
Exemple #11
0
 def test_fill_slots_at_most_once(self):
     """Test that slots get filled at most once."""
     kb = logic.PropKB()
     p = parser.ConceptualParser(kb)
     kb.tell(logic.expr('ISA(c-red, c-color)'))
     p.add_phrasal_pattern(logic.expr('c-red'), 'red')
     kb.tell(logic.expr('ISA(c-blue, c-color)'))
     p.add_phrasal_pattern(logic.expr('c-blue'), 'blue')
     kb.tell(logic.expr('$constraint(c-thing, color, c-color)'))
     p.add_phrasal_pattern(logic.expr('c-thing'), '[thing|{color} {:head}]')
     self.assertParseEqual(
         p.parse('red thing'),
         [logic.Description('c-thing', {'color': 'c-red'})])
     self.assertParseEqual(p.parse('red blue thing'), [])
Exemple #12
0
    def test_descriptions(self):
        """Test descriptions."""
        kb = logic.PropKB()
        kb.tell(logic.expr('ISA(Mammal, Animal)'))
        kb.tell(logic.expr('ISA(Cat, Mammal)'))
        kb.tell(logic.expr('ISA(Petunia, Cat)'))
        kb.tell(logic.expr('ISA(Dog, Animal)'))
        kb.tell(logic.expr('ISA(Nine, Dog)'))
        kb.define_fluent(logic.expr('Color'), inherited=True)
        kb.define_fluent(logic.expr('Size'), inherited=True)
        kb.tell(logic.expr('Size(Cat, Small)'))
        kb.tell(logic.expr('Color(Petunia, Black)'))
        kb.tell(logic.expr('Size(Dog, Large)'))
        kb.tell(logic.expr('Color(Gretchen, Black)'))
        kb.tell(logic.expr('IsEdible(Animal, true)'))
        kb.tell(logic.expr('Color(Animal, Purple)'))

        d = logic.Description('Cat', {'Size': 'Small'})
        self.assertEqual(
            d.find_all(kb),
            [logic.expr('Cat'), logic.expr('Petunia')])
        d = logic.Description('Cat')
        self.assertEqual(
            d.find_all(kb),
            [logic.expr('Cat'), logic.expr('Petunia')])
        d = logic.Description('Cat', {'Size': 'Small', 'Color': 'Black'})
        self.assertEqual(d.find_all(kb), [logic.expr('Petunia')])
        d = logic.Description('Cat', {
            'Size': 'Small',
            'Color': 'Black',
            'Age': '35'
        })
        self.assertEqual(d.find_all(kb), [])
        d = logic.Description('Animal', {'Color': 'Black'})
        self.assertEqual(d.find_all(kb), [logic.expr('Petunia')])

        d = logic.Description('Animal', {'Color': 'Black'})
        query = logic.expr('Color')(d, logic.expr('?c'))
        self.assertAllBindingsEqual(kb.ask_all(query), [{'?c': 'Black'}])
        query = logic.expr('IsEdible')(d, logic.expr('?c'))
        self.assertAllBindingsEqual(kb.ask_all(query), [{'?c': 'true'}])

        self.assertEqual(d.has_slot('Color'), True)
        self.assertEqual(d.has_slot(logic.expr('Color')), True)
        self.assertEqual(d.has_slot('Size'), False)
        self.assertEqual(d.has_slot(logic.expr('Size')), False)
        self.assertEqual(d.slot_value('Color'), 'Black')
        self.assertRaises(KeyError, lambda: d.slot_value('Size'))

        d = logic.Description('Cat', {'IsEdible': 'false'})
        self.assertEqual(kb.slot_value(d, 'IsEdible'), logic.expr('false'))
        self.assertEqual(kb.slot_value(d, 'Color'), logic.expr('Purple'))
Exemple #13
0
    def test_descriptions3(self):
        """Even more description tests."""
        kb = logic.PropKB()
        kb.tell(logic.expr('ISA(c-cat, c-animal)'))
        kb.tell(logic.expr('INSTANCEOF(i-petunia, c-cat)'))
        kb.tell(logic.expr('color(i-petunia, i-gray)'))
        kb.tell(logic.expr('ISA(i-gray, c-color)'))
        kb.tell(logic.expr('alternate-spelling(i-gray, grey)'))
        kb.tell(logic.expr('INSTANCEOF(i-domestic-short-hair, c-species)'))
        kb.tell(logic.expr('species(i-petunia, i-domestic-short-hair)'))
        kb.tell(logic.expr('origin(i-domestic-short-hair, i-egypt)'))
        kb.tell(logic.expr('INSTANCEOF(i-egypt, c-city)'))
        kb.tell(logic.expr('capital(i-egypt, cairo)'))
        # Description of a cat whose color is something with an alternate
        # spelling 'grey' and whose species has an origin whose capital is
        # cairo.
        species_d = logic.Description(
            'c-species',
            {'origin': logic.Description('c-city', {'capital': 'cairo'})})
        d = logic.Description(
            'c-cat', {
                'color':
                logic.Description('c-color', {'alternate-spelling': 'grey'}),
                'species':
                species_d
            })
        self.assertEqual(d.find_all(kb), [logic.expr('i-petunia')])
        self.assertEqual(d.find_instances(kb), [logic.expr('i-petunia')])

        self.assertEqual(kb.isa(logic.expr(d), logic.expr('c-animal')), True)
        self.assertEqual(kb.isa(logic.expr(d), logic.expr('c-cat')), True)
        self.assertBindingsEqual(
            kb.ask(logic.expr('ISA')(logic.expr(d), logic.expr('c-animal'))),
            {})
        self.assertBindingsEqual(
            kb.ask(logic.expr('ISA')(logic.expr(d), logic.expr('c-cat'))), {})
Exemple #14
0
    def test_slot_filling(self):
        """Test slot filling."""
        kb = logic.PropKB()
        kb.tell(logic.expr('$constraint(BigRedThing, color, red)'))
        p = parser.ConceptualParser(kb)
        p.add_phrasal_pattern(logic.expr('BigRedThing'), 'big <color> thing')
        p.add_phrasal_pattern(logic.expr('red'), 'red')
        self.assertParseEqual(
            p.parse('big red thing'),
            [logic.Description('BigRedThing', {'color': 'red'})])
        p.add_phrasal_pattern(logic.expr('BigRedThing'), 'big <rudolph> thing')
        self.assertRaises(parser.Error, lambda: p.parse('big crazy thing'))

        p.add_phrasal_pattern(logic.expr('BigRedThing'),
                              'big <doesnotexist> thing')
        self.assertRaises(parser.Error, lambda: p.parse('big floppy thing'))
Exemple #15
0
 def parse_c_number(token):
     return logic.Description(
         logic.expr('c-number'),
         {logic.expr('value'): logic.expr(int(token))})
Exemple #16
0
 def test_examples2(self):
     """Even more tests."""
     kb = logic.PropKB()
     kb.tell(logic.expr('ISA(c-start-over, c-action)'))
     kb.tell(logic.expr('ISA(c-hog, c-name)'))
     kb.tell(logic.expr('ISA(c-process, c-thing)'))
     kb.tell(logic.expr('ISA(c-nine-line, c-process)'))
     kb.tell(logic.expr('ISA(c-talk-on, c-process)'))
     kb.tell(logic.expr('$constraint(c-action-request, addressee, c-name)'))
     kb.tell(logic.expr('$constraint(c-action-request, action, c-action)'))
     kb.tell(logic.expr('$constraint(c-action-request, object, c-thing)'))
     p = parser.ConceptualParser(kb)
     p.add_phrasal_pattern(logic.expr('c-hog'), 'hog')
     p.add_phrasal_pattern(logic.expr('c-start-over'), 'start [over|again]')
     p.add_phrasal_pattern(logic.expr('c-start-over'), 'restart')
     p.add_phrasal_pattern(logic.expr('c-nine-line'), '[nine|9] line')
     p.add_phrasal_pattern(logic.expr('c-nine-line'), 'nineline')
     p.add_phrasal_pattern(logic.expr('c-nine-line'), '9line')
     p.add_phrasal_pattern(logic.expr('c-talk-on'), 'talk on')
     p.add_phrasal_pattern(logic.expr('c-talk-on'), 'talkon')
     p.add_phrasal_pattern(
         logic.expr('c-action-request'),
         ("?:?addressee ?:[let's|let us|lets|why don't we] "
          "?action ?:[with|on] ?:the ?object"))
     self.assertParseEqual(p.parse('hog'), [logic.Description('c-hog')])
     self.assertParseEqual(p.parse('9 line'),
                           [logic.Description('c-nine-line')])
     self.assertParseEqual(p.parse('start again'),
                           [logic.Description('c-start-over')])
     self.assertParseEqual(
         p.parse("hog, let's start over with the nine-line"), [
             logic.Description(
                 'c-action-request', {
                     'addressee': 'c-hog',
                     'action': 'c-start-over',
                     'object': 'c-nine-line'
                 })
         ])
     self.assertParseEqual(
         p.parse("hog, why don't we start over with talk-on"), [
             logic.Description(
                 'c-action-request', {
                     'addressee': 'c-hog',
                     'action': 'c-start-over',
                     'object': 'c-talk-on'
                 })
         ])
     self.assertParseEqual(p.parse('hog, start over with the nine-line'), [
         logic.Description(
             'c-action-request', {
                 'addressee': 'c-hog',
                 'action': 'c-start-over',
                 'object': 'c-nine-line'
             })
     ])
     self.assertParseEqual(p.parse('restart the nine-line'), [
         logic.Description('c-action-request', {
             'action': 'c-start-over',
             'object': 'c-nine-line'
         })
     ])
     self.assertParseEqual(p.parse('restart the 9-line'), [
         logic.Description('c-action-request', {
             'action': 'c-start-over',
             'object': 'c-nine-line'
         })
     ])
     self.assertParseEqual(p.parse('restart the 9line'), [
         logic.Description('c-action-request', {
             'action': 'c-start-over',
             'object': 'c-nine-line'
         })
     ])
Exemple #17
0
 def parse_cardinal(token):
     return logic.Description(
         logic.expr('c-digit'),
         {logic.expr('value'): logic.expr(Cardinals[token])})
Exemple #18
0
 def parse_mgrs_square(token):
     return logic.Description(
         logic.expr('c-mgrs-square'),
         {logic.expr('letters'): logic.expr(token)})
Exemple #19
0
    def test_slot_filling2(self):
        """More slot filling tests"""
        kb = logic.PropKB()

        kb.tell(logic.expr('ISA(c-animal, c-physobj)'))
        kb.tell(logic.expr('ISA(c-dog, c-animal)'))
        kb.tell(logic.expr('ISA(c-cat, c-animal)'))
        kb.tell(logic.expr('ISA(c-red, c-color)'))
        kb.tell(logic.expr('ISA(c-green, c-color)'))
        kb.tell(logic.expr('ISA(c-big, c-size)'))
        kb.tell(logic.expr('ISA(c-small, c-size)'))
        kb.tell(logic.expr('ISA(c-feed, c-action)'))

        kb.tell(logic.expr('$constraint(c-physobj, color, c-color)'))
        kb.tell(logic.expr('$constraint(c-physobj, size, c-size)'))
        kb.tell(logic.expr('$constraint(c-action-request, action, c-action)'))
        kb.tell(
            logic.expr(
                '$constraint(c-action-request, theta-object, c-physobj)'))

        p = parser.ConceptualParser(kb)
        p.add_phrasal_pattern(logic.expr('c-physobj'), '<size> <color> thing')
        p.add_phrasal_pattern(logic.expr('c-red'), 'red')
        p.add_phrasal_pattern(logic.expr('c-green'), 'green')
        p.add_phrasal_pattern(logic.expr('c-small'), 'small')
        p.add_phrasal_pattern(logic.expr('c-small'), 'tiny')
        p.add_phrasal_pattern(logic.expr('c-big'), 'big')
        p.add_phrasal_pattern(logic.expr('c-big'), 'large')
        p.add_phrasal_pattern(logic.expr('c-feed'), 'feed')
        p.add_phrasal_pattern(logic.expr('c-action-request'),
                              '<action> the <theta-object>')

        self.assertParseEqual(p.parse_tokens(['big', 'red', 'thing']), [
            logic.Description('c-physobj', {
                'color': 'c-red',
                'size': 'c-big'
            })
        ])
        self.assertParseEqual(p.parse('big red thing'), [
            logic.Description('c-physobj', {
                'color': 'c-red',
                'size': 'c-big'
            })
        ])
        self.assertParseEqual(p.parse('big green thing'), [
            logic.Description('c-physobj', {
                'color': 'c-green',
                'size': 'c-big'
            })
        ])
        self.assertParseEqual(p.parse('small red thing'), [
            logic.Description('c-physobj', {
                'color': 'c-red',
                'size': 'c-small'
            })
        ])
        self.assertParseEqual(p.parse('small green thing'), [
            logic.Description('c-physobj', {
                'color': 'c-green',
                'size': 'c-small'
            })
        ])
        self.assertParseEqual(p.parse('feed the small green thing'), [
            logic.Description(
                'c-action-request', {
                    'action':
                    'c-feed',
                    'theta-object':
                    logic.Description('c-physobj', {
                        'color': 'c-green',
                        'size': 'c-small'
                    })
                })
        ])
Exemple #20
0
 def find_frame(self, base, slots):
     """Creates a description with the specified base class and slots."""
     return logic.Description(base, slots)
Exemple #21
0
    def test_head_directive(self):
        """Test :head directive."""
        kb = logic.PropKB()
        kb.tell(logic.expr('ISA(c-animal, c-physobj)'))
        kb.tell(logic.expr('ISA(c-dog, c-animal)'))
        kb.tell(logic.expr('ISA(c-cat, c-animal)'))
        kb.tell(logic.expr('ISA(c-red, c-color)'))
        kb.tell(logic.expr('ISA(c-green, c-color)'))
        kb.tell(logic.expr('ISA(c-big, c-size)'))
        kb.tell(logic.expr('ISA(c-small, c-size)'))
        kb.tell(logic.expr('ISA(c-flea-bitten, c-flea-status)'))
        kb.tell(logic.expr('ISA(c-flea-free, c-flea-status)'))
        kb.tell(logic.expr('ISA(c-feed, c-action)'))
        kb.tell(logic.expr('$constraint(c-physobj, color, c-color)'))
        kb.tell(logic.expr('$constraint(c-physobj, size, c-size)'))
        kb.tell(logic.expr('$constraint(c-action-request, action, c-action)'))
        kb.tell(
            logic.expr(
                '$constraint(c-action-request, theta-object, c-physobj)'))
        kb.tell(logic.expr('$constraint(c-dog, flea-status, c-flea-status)'))

        p = parser.ConceptualParser(kb)
        p.add_phrasal_pattern(logic.expr('c-physobj'),
                              '<size> <color> <:head>')
        p.add_phrasal_pattern(logic.expr('c-physobj'), 'thing')
        p.add_phrasal_pattern(logic.expr('c-cat'), 'cat')
        p.add_phrasal_pattern(logic.expr('c-dog'), 'dog')
        p.add_phrasal_pattern(logic.expr('c-dog'), '<flea-status> dog')
        p.add_phrasal_pattern(logic.expr('c-red'), 'red')
        p.add_phrasal_pattern(logic.expr('c-green'), 'green')
        p.add_phrasal_pattern(logic.expr('c-small'), 'small')
        p.add_phrasal_pattern(logic.expr('c-small'), 'tiny')
        p.add_phrasal_pattern(logic.expr('c-big'), 'big')
        p.add_phrasal_pattern(logic.expr('c-big'), 'large')
        p.add_phrasal_pattern(logic.expr('c-flea-bitten'), 'itchy')
        p.add_phrasal_pattern(logic.expr('c-flea-free'), 'happy')
        p.add_phrasal_pattern(logic.expr('c-feed'), 'feed')
        p.add_phrasal_pattern(logic.expr('c-action-request'),
                              '<action> <theta-object>')
        p.add_phrasal_pattern(logic.expr('c-action-request'),
                              '<action> the <theta-object>')

        self.assertParseEqual(p.parse('big red thing'), [
            logic.Description('c-physobj', {
                'color': 'c-red',
                'size': 'c-big'
            })
        ])
        self.assertParseEqual(p.parse('big green thing'), [
            logic.Description('c-physobj', {
                'color': 'c-green',
                'size': 'c-big'
            })
        ])
        self.assertParseEqual(p.parse('small red thing'), [
            logic.Description('c-physobj', {
                'color': 'c-red',
                'size': 'c-small'
            })
        ])
        self.assertParseEqual(p.parse('small green thing'), [
            logic.Description('c-physobj', {
                'color': 'c-green',
                'size': 'c-small'
            })
        ])
        cat_desc = logic.Description('c-cat', {
            'color': 'c-green',
            'size': 'c-small'
        })
        self.assertParseEqual(p.parse('feed the small green cat'), [
            logic.Description('c-action-request', {
                'action': 'c-feed',
                'theta-object': cat_desc
            })
        ])
        green_dog_desc = logic.Description('c-dog', {
            'color': 'c-green',
            'size': 'c-small'
        })
        self.assertParseEqual(p.parse('feed the small green dog'), [
            logic.Description('c-action-request', {
                'action': 'c-feed',
                'theta-object': green_dog_desc
            })
        ])
        green_itchy_dog_desc = logic.Description('c-dog', {
            'flea-status': 'c-flea-bitten',
            'color': 'c-green',
            'size': 'c-small'
        })
        self.assertParseEqual(p.parse('feed the small green itchy dog'), [
            logic.Description('c-action-request', {
                'action': 'c-feed',
                'theta-object': green_itchy_dog_desc
            })
        ])
Exemple #22
0
    def test_string_parsing(self):
        """Test parsing FDL from strings."""
        xml = """
<fdl>

<lexicon>
  <lexeme>
    <!-- Short for 'roger'. -->
    <spelling>rog</spelling>
    <part-of-speech>interjection</part-of-speech>
    <phonemes>r ao jh</phonemes>
    <phonemes>r ao d</phonemes>
  </lexeme>
  <lexeme>
    <!-- Whatever, this is just a test. -->
    <spelling>john</spelling>
    <part-of-speech>noun</part-of-speech>
    <phonemes>j uh n</phonemes>
  </lexeme>
</lexicon>


<frame id='c-action-request'>
  <parent id='c-utterance' />

  <constraint slot='addressee' type='c-name' />
  <constraint slot='action' type='c-action' />
  <constraint slot='object' type='c-thing' />

  <phrase>
    {addressee} ?:[let's|let us|why don't we]
    {action} ?:[with|on] ?:the {object}
  </phrase>
</frame>

<frame id='c-hog'>
  <parent id='c-name' />
  <phrase>hog</phrase>
</frame>

<frame id='c-restart'>
  <parent id='c-action' />
  <phrase>[restart|start over]</phrase>
</frame>

<frame id='c-talkon'>
  <parent id='c-thing' />
  <phrase>[talk on|talkon]</phrase>
</frame>

<frame id='i-petunia'>
  <parent id='c-cat' instanceof='true' />
  <slot name='color' value='i-gray' />
  <generate>Petunia</generate>
</frame>

</fdl>
"""
        kb = logic.PropKB()
        cp_parser = parser.ConceptualParser(kb)
        icp_parser = parser.IndexedConceptParser(kb)
        fdl_handler = fdl.BaseFrameHandler(kb, cp_parser, icp_parser)
        fdl_parser = fdl.FDLParser(fdl_handler)
        self.assertEqual(fdl_parser.parse_fdl_string(xml), True)
        self.assertEqual(
            kb.isa(logic.expr('c-action-request'), logic.expr('c-utterance')),
            True)
        self.assertEqual(
            cp_parser.slot_constraint(logic.expr('c-action-request'),
                                      logic.expr('addressee')),
            logic.expr('c-name'))
        self.assertEqual(
            cp_parser.slot_constraint(logic.expr('c-action-request'),
                                      logic.expr('action')),
            logic.expr('c-action'))
        self.assertEqual(
            cp_parser.slot_constraint(logic.expr('c-action-request'),
                                      logic.expr('object')),
            logic.expr('c-thing'))
        self.assertParseEqual(cp_parser.parse('hog'),
                              [logic.Description('c-hog')])
        self.assertParseEqual(cp_parser.parse('restart'),
                              [logic.Description('c-restart')])
        self.assertParseEqual(cp_parser.parse('start over'),
                              [logic.Description('c-restart')])
        self.assertParseEqual(cp_parser.parse('talkon'),
                              [logic.Description('c-talkon')])
        self.assertParseEqual(cp_parser.parse('talk on'),
                              [logic.Description('c-talkon')])
        self.assertParseEqual(
            cp_parser.parse('hog let us restart the talk on'), [
                logic.Description(
                    'c-action-request', {
                        'action': 'c-restart',
                        'addressee': 'c-hog',
                        'object': 'c-talkon'
                    })
            ])
        self.assertParseEqual(
            cp_parser.parse("hog why don't we start over with the talk on"), [
                logic.Description(
                    'c-action-request', {
                        'action': 'c-restart',
                        'addressee': 'c-hog',
                        'object': 'c-talkon'
                    })
            ])
        self.assertAllBindingsEqual(kb.ask_all(logic.expr('ISINSTANCE(?x)')),
                                    [{
                                        '?x': 'i-petunia'
                                    }])
        self.assertAllBindingsEqual(
            kb.ask_all(logic.expr('INSTANCEOF(i-petunia, ?x)')), [{
                '?x': 'c-cat'
            }])
        self.assertAllBindingsEqual(
            kb.ask_all(logic.expr('color(i-petunia, ?c)')), [{
                '?c': 'i-gray'
            }])
        self.assertEqual('color' in kb.heritable, True)

        generator = generation.Generator(kb)
        self.assertEqual(generator.generate(logic.expr('i-petunia')),
                         'Petunia')
        self.assertEqual(len(fdl_handler.lexemes), 2)
        self.assertEqual(fdl_handler.lexemes[0].spelling, 'rog')
        self.assertEqual(fdl_handler.lexemes[0].part_of_speech, 'interjection')
        self.assertEqual(fdl_handler.lexemes[0].phonetic_pronunciations,
                         ['r ao jh', 'r ao d'])
        self.assertEqual(fdl_handler.lexemes[1].spelling, 'john')
        self.assertEqual(fdl_handler.lexemes[1].part_of_speech, 'noun')
        self.assertEqual(fdl_handler.lexemes[1].phonetic_pronunciations,
                         ['j uh n'])