Как относительно и эффективно обрабатывать ключ, словарь значений с несколькими значениями на ключ
Сейчас я пытаюсь использовать ассоциативную библиотеку в sw-prolog для создания реляционной пролог-программы. Мне нужен словарь, который может хранить несколько значений. Это можно легко сделать, используя список в качестве значения.
Однако мне часто приходится искать все ключи, отдельные значения, т. Е. Идентифицировать все ключи, которые содержат один конкретный элемент значения. (Тем не менее, количество стоимости, как правило, ограничено не более десятков предметов).
Если бы мне нужно было использовать только хранилище ассоциаций, которое сопоставляет ключи с несколькими значениями, то мне нужно было бы просмотреть все ключи, извлечь значения и затем проверить, является ли значение его членом.
Это неэффективно и не кажется масштабируемым с большим количеством ключей.
Есть ли более эффективный способ сделать это?
Я мог бы управлять для каждого элемента значения своим собственным "обратным" хранилищем значений ключа, но это кажется довольно неэффективным. Кроме того, если бы я использовал хранилище фактов пролога (с assert/ и ретрактами), чтобы хранить каждую пару ключ-значение как отдельный факт, я бы, вероятно, получил бы этот индекс "индексированным" бесплатно.
Каков правильный выбор дизайна для реляционного подхода здесь?
[edit-1]: кстати, одно "решение" может заключаться в том, чтобы разрешить в библиотеке Assoc иметь несколько ключей, в случае, если значения затем внутренне "проиндексированы" - но библиотека Assoc не поддерживает это (поскольку я знаю).
[edit-2]: посмотрите на дополнительные библиотеки в swi-прологе, я замечаю невзвешенные графики. Возможно, использование структуры графа было бы более эффективным для передачи такого отношения "многие ко многим" между ключами и значениями. И в соответствии с реляционным подходом.
[edit-3): или, может быть, ugraph не очень хорошая идея, так как узлы (и ссылки) не типизированы. Мне нужно было бы структурно указать, какой узел является ключом, а какие значения.
благодарю вас,
Даниил