Быстрый дикт или хэш-список: значение по ключу и ключ по значению?

#list #dictionary #lambda #prolog #maplist

#Список #словарь #лямбда #пролог #maplist

Вопрос:

Изобрел быстрый и грязный хэш-например, используя список, т.е.

  [ key1:val1,key2:val2, ....]
 

Я могу получить ключи и значения :

 hl_keys(HL,Res) :- maplist(I^K^(I = K:_),HL,Res).
hl_vals(HL,Res) :- maplist(I^V^(I = _:V),HL,Res).
 

но как мне получить конкретное значение по ключу и ключ по значению?

Комментарии:

1. Есть ли причина не использовать существующий словарь (он же список ассоциаций или карта) библиотеки?

2. нет, просто мысль — это умная идея для небольших хэшей, и ее можно использовать для быстрых аргументов / реквизитов… у elixir есть что-то похожее

3. Предполагая небольшое количество пар, вы могли бы использовать вместо этого простую реализацию двоичного дерева, поскольку ее наихудший случай будет таким же, как список, но в среднем может обеспечить лучшую производительность.

Ответ №1:

это было просто :

 hl_val(HL,Key,Res) :- member(Key:Res,HL).
hl_key(HL,Val,Res) :- member(Res:Val,HL).
 

и хорошо, что он действует как двусторонний хэш

Комментарии:

1. В Prolog более идиоматично использовать Key-Value , а не Key:Value . В остальном, молодец!