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