У меня проблемы с группировкой некоторых фактов в прологе по 3 различным свойствам.Это моя база знаний (график в основном):
% entity(Label, Id)
% relationship(Type, Subject, Object)
entity('Person', id_0).
entity('Place', 1468).
relationship('wasIn', id_0, 1468).
entity('Place', 1367).
relationship('wasIn', 1468, 1367).
entity('Person', 1466).
relationship('wasIn', 1466, 1468).
entity('Place', 1478).
relationship('aliasOf', 1478, 1468).
entity('Place', 1052).
relationship('wasIn', id_0, 1052).
entity('Place', 1184).
relationship('wasIn', 1052, 1184).
entity('Person', 1048).
relationship('wasIn', 1048, 1052).
entity('Place', 1069).
relationship('wasIn', id_0, 1069).
entity('Place', 1070).
relationship('wasIn', 1069, 1070).
entity('Person', 1068).
relationship('wasIn', 1068, 1069).
Я хотел сгруппировать отношения по каждому идентификатору сущности и типу субъекта, чтобы получить что-то вроде:
[
[
[id_0, wasIn, Place],
% because entities 1468, 1052, 1069 are Places
[ relationship(wasIn, id_0, 1468),
relationship(wasIn, id_0, 1052),
relationship(wasIn, id_0, 1069)]
],
[
[id_0, wasIn, Some Other Subject Label],
[relationship(wasIn, id_0, ...),
...]
],
[
[1468, wasIn, Place],
[relationship(wasIn, 1468, ...),
...]
],
...
]
и т. Д.далее.
Пока мне удалось сгруппировать только по темам и типам.К сожалению, я получаю дубликаты от этого (которого я хотел избежать).Любая дальнейшая попытка, которую я попробовал, не сработала, поэтому я спрашиваю здесь.Это мои текущие правила:
group_relationships_by_node([[Subject, Type] | [R]]) :-
entity(_, Subject),
relationship(Type, Subject, _),
findall(relationship(Type, Subject, Object), relationship(Type, Subject, Object), R).
group_by_relationships(Result) :-
findall(X, group_relationships_by_node(X), Result).
это мой текущий результат:
[
[
[id_0, wasIn],
[ relationship(wasIn, id_0, 1468),
relationship(wasIn, id_0, 1052),
relationship(wasIn, id_0, 1069) ]
],
% duplicate
[
[id_0, wasIn],
[ relationship(wasIn, id_0, 1468),
relationship(wasIn, id_0, 1052),
relationship(wasIn, id_0, 1069) ]
],
% duplicate
[
[id_0, wasIn],
[ relationship(wasIn, id_0, 1468),
relationship(wasIn, id_0, 1052),
relationship(wasIn, id_0, 1069) ]
],
[
[ 1468, wasIn ],
[ relationship(wasIn, 1468, 1367) ]
],
[
[ 1466, wasIn ],
[ relationship(wasIn, 1466, 1468) ]
],
[
[ 1478, aliasOf ],
[ relationship(aliasOf, 1478, 1468) ]
],
[
[ 1052, wasIn ],
[ relationship(wasIn, 1052, 1184) ]
],
[
[ 1048, wasIn ],
[ relationship(wasIn, 1048, 1052) ]
],
[
[ 1069, wasIn ],
[ relationship(wasIn, 1069, 1070) ]
],
[
[ 1068, wasIn ],
[ relationship(wasIn, 1068, 1069) ]
]
]
Увы, я сам не очень хорошо знаю пролог, надеюсь, вы даже можете предложить мнелучшее решение.
Большое спасибо