Я установил KnowRob на мою машину (Ubuntu 14.04 с ros-indigo по соображениям совместимости) и создал файл .pl со следующим содержимым:
:- module(utils, [object_hierarchy/2]).
object_hierarchy_internal_none(Child,Parent) :-
not(owl_has(Parent, knowrob:properPhysicalParts, Child)).
object_hierarchy_internal(Item, Hierarchy, HierarchyFinal) :-
(
object_hierarchy_internal_none(Item, _)
,
HierarchyFinal = Hierarchy
)
;
(
owl_has(Parent, knowrob:properPhysicalParts, Item)
,
append(Hierarchy, [Parent], ExtendedHierarchy)
,
object_hierarchy_internal(Item, Parent, ExtendedHierarchy, HierarchyFinal)
)
.
object_hierarchy(Item, Hierarchy) :- object_hierarchy_internal(Item, [], Hierarchy).
В действительности не имеет значения, что он делает, но в основном object_hierarchy
вызывается извне и использует внутренние предикаты для выполнения работы. Эти внутренние предикаты используют предикат owl_has/3
. В частности, он использует его с переменной Ìtem
, которая передается пользователем.
Терминал запускается и настраивается следующим образом:
rosrun rosprolog rosprolog knowrob_common
? owl_parse('package://knowrob_map_date/owl/ccrl2_semantic_map.owl')
Я пытаюсь использовать базу знаний, то есть object_hierarchy
, как показано ниже (с подходящим экземпляром для Item
):
? object_hierarchy(knowrob:'Handle127', Hierarchy).
Это, к сожалению, неправильный путь, так как это приводит к следующему сообщению об исключении:
ERROR: rdf_db:rdf/3: Type error: `rdf_object' expected, found `rdf_object(knowrob:Handle127)'
Exception: (13) t20_owl:owl_has_direct(_G2589, knowrob:properPhysicalParts, knowrob:'Handle127')
Интересно, как код должен быть адаптирован для преднамеренной работы.