Следующие комментарии касаются вашего вопроса в порядке, грубо говоря, от «более конкретного» до «более общего».
Во-первых, обращаясь к ваш конкретный комментарий:
Я сделал бы использовать хэш-таблицы/словаря, но, насколько я знаю, что это не представляется возможным в Прологе.
Все серьезные реализации Prolog позволяют деструктивно изменять условия Prolog, используя, например, setarg/3
. Используя arg/3
и setarg/3
, вы получаете доступ O (1) к каждому аргументу термина, которого достаточно для реализации хеш-таблицы точно так же, как на других языках, если ваша система не устанавливает произвольные ограничения на атрибуты терминов.
Это не очень хорошая идея сделать это самостоятельно, так как вы должны учитывать неожиданное копирование и совместное использование терминов на всех условиях. Вместо этого полагайтесь на библиотеки, чтобы сделать это.
Какие библиотеки? Я второй, что другие написали: Вместо хэширования библиотеки, использовать дерева на основе библиотек как library(assoc)
, library(avl)
и т.д. Это не совсем так эффективно, как хэшей в среднем случае, но:
- они часто эффективны достаточно
- они масштабируются очень предсказуемо: наиболее важными операциями являются всегда в O (log (n)).
Кроме того, как пишут другие, деструктивные изменения несовместимы с логикой программирования, а библиотеки деревьев имеют огромное преимущество, что они могут быть реализованы в ISO Прологе и в чисто образом с асимптотически оптимальный эффективность.
Наконец, Dict расширение SWI-Prolog являются не ISO совместимой, даже синтаксический не, и, следовательно, не переносится на системы Prolog согласованных с! См. Статью comments Ульриха Ноймеркеля о том, как инфиксная точка может быть добавлена в соответствии с ISO.
Я только что видел, что его произошло недавно - это был принятый ответ. Нам просто пришлось подождать несколько лет, чтобы он был разработан. – nedned