Я изменил формат ввода. Это немного легче искать сейчас.
Я надеюсь, что все в порядке, как это.
obj(obj1, material, wood).
obj(obj2, material, wood).
obj(obj3, material, glass).
obj(obj4, material, glass).
obj(obj5, material, iron).
obj(obj1, type, table).
obj(obj2, type, chair).
obj(obj3, type, mesa).
obj(obj4, type, jar).
obj(obj5, type, rattle).
obj(obj1, weight, 10.5).
obj(obj2, weight, 1.5).
obj(obj3, weight, 1.6).
obj(obj4, weight, 0.5).
obj(obj5, weight, 1.8).
Учитывая этот формат ввода, вы можете теперь сопоставить его со списком (списков), например. как это:
object_description(List) :-
findall(Id-TmpList, bagof(Type-Value, obj(Id, Type, Value), TmpList), List).
Это не дает точный формат вывода, который у вас есть в вопросе, но дает нечто похожее (и, возможно, легче обрабатывать дальше).
Использование:
?- object_description(List).
List = [obj1-[material-wood, type-table, weight-10.5],
obj2-[material-wood, type-chair, weight-1.5],
obj3-[material-glass, type-mesa, weight-1.6],
obj4-[material-glass, type-jar, weight-0.5],
obj5-[material-iron, type-rattle, ... - ...]].