The key can be arbitrarily complex, but must be a ground term. The value can be an arbitrary term, and may contain uninstantiated variables. Note that values are copied when being stored or retrieved, therefore a retrieved nonground value will contain fresh variables rather than the original ones (this is similar to the behaviour of bags, shelves and global variables).
The complexity of the store operation is linear in both the size of the key and the value, since both are being copied. For indexing purposes, a hash value is computed from the key, and the full depth of the key is taken into account.
Note: If StoreHandle is not a handle, then it must be an atom or a compound term, and the store is identified by this term's toplevel functor together with the context module.
?- store_create(Handle), store_set(Handle, tom, 12345), store_set(Handle, name(dick,tracy), phone(42376,home)), store_set(Handle, numbers:prime, [2,3,5,7|_More]), stored_keys_and_values(Handle, Data). Handle = $&(store,"17h3") Data = [(numbers : prime) - [2, 3, 5, 7|_123], tom - 12345, name(dick, tracy) - phone(42376, home)] Yes (0.00s cpu) ?- store_create(Handle), store_set(Handle, tom, first), store_set(Handle, tom, second), % overwrite old entry store_get(Handle, tom, X). Handle = $&(store,"17h3") X = second Yes (0.00s cpu)