Комнатный мир: Отношения и действия
Введение
Данный документ и серия последующих, посвящены описанию ограниченного мира. Этот мир содержит объекты и допускает действия, происходящие внутри условного дома или рядом с ним, поэтому называется "Комнатным миром". Мы ограничиваем число возможных сущностей которые может понимать интеллектуальная система, однако стремимся к тому, чтобы это понимание было максимально полным.
Напомним, что понимание означает построение на основе доступной информации модели мира, при помощи которой система прогнозирует будущее и объясняет прошлое. Модель может иметь разные степени приближения. Вначале мы будем строить очень простые модели, постепенно стараясь их сделать более детальными и адекватными реальному миру или хотя бы тому миру который (также в качестве модели) возникает в сознании человека. Пока система будет вести себя пассивно. Её задача анализировать текстовую информацию и давать осмысленные ответы на задаваемые ей вопросы.
Неполнота информации
Основная сложность в реализации понимания интеллектуальной системой входной информации возникает, когда существует неполнота этой информации. Если пока отвлечься от желаний и целей агентов, можно выделить три источника неполноты:
- Подразумеваемые, но не упомянутые сущности и их части. Например, если "Сэм встаёт со стула" это означает, что он стоит на полу (если стул в комнате). Пол является частью комнаты, а стул обычно не висит в воздухе, не прикручен к потолку, а стоит на полу. Поэтому не сообщается, что "стул стоит на горизонтальной поверхности, являющейся частью комнаты". Эту информацию (как наиболее вероятную) необходимо извлечь из базы знаний, чтобы на вопрос "где находится Сэм?" ответить - "стоит на полу, рядом со стулом".
- Отсутствие полного описания текущего положения и свойств объектов. Например информация: "Мия подошла к Лизе и дала ключ Сэму" сообщает, что до первого события Мия была не рядом с Лизой, а после события goto(Mia, Liz), Мия оказалась рядом с Лизой. Второе событие give(Mia, key, Sam) позволяет сделать вывод, что не только Мия и Лиза, но и Сэм находятся рядом, у Мии был ключ, а теперь он у Сэма. Однако где конкретно находится Сэм, вообще говоря, не известно. Он может стоять рядом с Лизой, он может быть у неё на руках или на руках у Мии. Сэм может быть взрослым мужчиной, ребёнком или маленькой собачкой. Дальнейшая информация может частично уменьшить существующую неопределённость.
- Отсутствие всей информации о происходящих событиях. Например, когда Мия подошла к Лизе, рядом с ней мог идти Сэм (или подошёл позже, после чего Мия дала ему ключ). Причины по которым источник информации опускает некоторые события могут быть различными. Например, действия могли показаться источнику не существенными. Однако их отсутствие может полностью изменить модель мира.
Базовые сущности
Перечислим некоторые базовые сущности, которые будут встречаться в дальнейшем:
- agent (агент) - способная к самостоятельному перемещению сущность (человек, животное). Участвует как субъект во всех действиях (goto, take и т.д.)
- thing (вещь) - пассивная, обычно перемещаемая сущность с которой производят различные действия (ключ, конфета, стул, стол)
- container (контейнер) - вещь, которая может сохранять в себе другие вещи (ящик, сумка, сундук). Участвует в отношениях (in, ins).
- space - большой, не перемещаемый объект внутри которого могут находиться другие объекты (комната, дом, лес). Как и контейнер участвует в отношениях in, ins.
- surface (поверхность) - плоская часть объекта (пол комнаты, крышка стола). Если она горизонтальная, то на неё можно ставить объекты (отношение on). Агент, обычно, перемещается по поверхности.
Отношения
Отношения положения:
- X on Y - истинно, если X находится на горизонтальной поверхности Y (на полу, на столе). Небольшой предмет, находящийся на поверхности агент может взять (take) или положит на неё (put_on). На такую поверхность можно сесть, встать, переместившись при этом с одной поверхности на другую (со стула на пол). Объекты, при помощи отношения on, могут образовывать "стопки" (pen on book; book on table; table on floor). Однако, это не вполне транзитивное отношение (если ручка с небольшой натяжкой находится на столе, то уж точно не на полу).
- X in Y - истинно, если X находится где-то внутри контейнера или пространства Y. Отношение in транзитивно и образует строгий древесный порядок (key in bag; bag in box -> key in box).
- X ins Y - истинно, если X находится непосредственно внутри Y ("заглянули" в Y и увидели X). Чтобы X можно было достать из Y, необходимо, чтобы X ins Y. Иначе, надо сначала достать из ящика сумку, а из сумки уже достать ключ.
- X hold Y - истинно, если X держит Y (в руках, зубах, в кармане). При перемещении X, перемещается и Y. Если "X on Y", то X не может состоять в отношении hold, хотя это возможно опосредовано: "яблоко лежит на тарелке, котроую держит Мия" (apple on plate; Mia hold plate).
- X pos Y - истинно, если объект X находится в локации (месте) Y (уточняет положение). Например: Мия подошла к Сэму. Они оба стоят на полу [Mia, Sam] on floor, но сначала в местах, находящихся не рядом, затем Мия сменила pos и оказалась рядом с Сэмом.
Вспомогательные отношения:
- X near Y локация X находится рядом с локацией Y.
- X prev Y - событие X предшествует событию Y (previous).
Перемещение в пространстве агента
Все действия считаем совершёнными (подошёл, взял, съел). Они меняют текущее состояние (изменяются отношения между объектами). При перемещении в пространстве различаем перемещение по поверхности (горизонтальной или наклонной), смену поверхности (встал со стула на пол, легла на кровать) и перемещение между двумя пространствами (вышел из комнаты)
- goto(Sub, To, Surf) - агент Sub перемещается с его текущего места к месту рядом с объектом To по поверхности Surf (пол, земля, лестница). "Мия подошла к Бобу (столу, двери)". Все объекты Obj, связанные c Sub отношением hold (прямо или косвенно) перемещаются к Des вместе с Sub: "У Мии есть сумка, где лежит конфета": Mia hold bag; candy in bag. Переносить можно и других людей: Sam hold Liz, но нельзя переносить неподвижные объекты (комната) или прикреплённые к ним (дверь). Поверхность может отсутствовать в описании истории и тогда её необходимо реконструировать.
- shift(Sub, From, To) - смена агентом Sub поверхности. Частные случаи: садится (с пола на стул), встаёт (со стула на пол), ложиться (с пола на кровать) и т.д.
- come(Sub, From, To, Hole) - Sub перемещается из пространства From в пространство To (комнату, дом) P через отверстие Hole (дверной проём). Сначала Sub должен оказаться возле отверстия (goto).
Смена владения
- give(Sub, Obj, Des) - агент Sub даёт объект Obj другому агенту Des. До действия "Sub hold Obj" и "Des !hold Obj". После действия - наоборот. Sub и Des должны находиться рядом (до и после).
- put_on(Sub, Obj, Surf) - Sub ставит несомый объект Obj (человека, вещь) на поверхность Surf (пол, стол). После этого должно быть "Obj on Surf" и Sub !hold Obj. Перед действием Sub hold Obj. Все (Sub, Obj, Surf) должны находиться рядом.
- put_in(Sub, Obj, Des) - Sub помещает объект Obj в контейнер Des Перед действием Sub hold Obj, после него Obj ins Des.
- take(Sub, Obj) - Sub берёт объект Obj (человека, вещь) с поверхности Surf (пол, стол) в руки. Перед этим должно быть "Obj on Surf".
- take_out(Sub, Obj, Des) - Sub извлекает объект Obj из контейнера Des
Трансформация объектов
- eat(Sub, Obj) - Sub съедает Obj
- open(Sub, Obj) - Sub открывает крышку Obj (дверь, крышка коробки). У объекта меняется атрибут Sen=>$open.
- close(Sub, Obj) - Sub закрывает крышку Obj.
- apply(Sub, Obj1, Obj2) - Sub применят объект Obj1 к объекту Obj2 (ключ к замку).
Пример: Сэм и конфета
Сэм встал в спальне с кровати, пошел на кухню и подошёл к столу. Со стола взял коробку, вернулся в спальню и сел на кровать. Из коробки Сэм достал конфету и съел её.

// статические отношения для неизменных объектов: [bedroom, kitchen] in house; floor1 pof bedroom; floor2 pof kitchen; doorway pof [bedroom, kitchen]; door pof doorway; // динамические отношения: [Sam, bed] ins bedroom; Sam on bed; bed on floor1; [candy, box, table] ins kitchen; candy ins box; box on table; table on floor2;Действия истории:
shift (Sam, bed, floor1) goto (Sam, doorway, floor1) come (Sam, kitchen, bedroom, doorway) goto (Sam, table, floor2) take_out(Sam, candy, box) goto (Sam, doorway, floor2) come (Sam, bedroom, kitchen, doorway) goto (Sam, bed, floor1) shift (Sam, floor1, bed) eat (Sam, candy)