make_hash_table/1 — create a hash table and access predicates
make_hash_table/1 will create a hash table and a set of access methods with the atom
Name as the suffix. Suppose for the sake of the following discussion that
Name is bound to the atom
'_table'. Then the access predicates created will be as follows:
reset_table – throw away the old hash table associated with the
'_table' hash table and create a brand new one.
set_table(Key, Value) – associate ‘Key’ with ‘Value’ in the hash table.
Key should be bound to a ground term. Any former associations that
Key had in the hash table are replaced.
get_table(Key, Value) – get the value associated with the ground term bound to
Key and unify it with
del_table(Key, Value) – delete the
Key/Value association from the hash table.
Key must be bound to a ground term. `Value. will be unified against the associated value in the table. If the unification is not successful, the table will not be modified.
pget_table(KeyPattern, ValPattern) – The "
pdel, below, stands for pattern.
ValPattern to have any desired instantiation. It will backtrack through the table and locate associations matching the "
pattern" as specified by
pdel_table(KeyPattern, ValPattern) – This functions the same as
pget_table except that the association is deleted from the table once it is retrieved.
?- make_hash_table('_assoc'). yes. ?- set_assoc(a,f(1)). yes. ?- set_assoc(b,f(2)). yes. ?- set_assoc(c,f(3)). yes. ?- get_assoc(X,Y). no. ?- get_assoc(c,Y). Y=f(3) yes. ?- pget_assoc(X,Y). X=c Y=f(3); X=b Y=f(2); X=a Y=f(1); no. ?- del_assoc(b,Y). Y=f(2) yes. ?- pdel_assoc(X,f(3)). X=c yes. ?- pget_assoc(X,Y). X=a Y=f(1); no. ?- reset_assoc. yes. ?- pget_assoc(X,Y). no.
retract, the methods created by
make_hash_table/1 do not access the database. The associations between keys and values is stored on the heap. Thus elements of either keys or values may be modified in a destructive fashion. This will probably not have desirable consequences if a key is modified.
These predicates have an advantage over
retract in that no copies are made. In fact structure may be shared between hash table entries.
See the discussion in
make_gv/1 concerning global variable modification and backtracking.