.. index:: dictionaryp
.. _dictionaryp/0:

**protocol**

``dictionaryp``
===============

Dictionary protocol.

| **Author:** Paulo Moura
| **Version:** 2.0
| **Date:** 2010/2/26

| **Compilation flags:**
|    ``static``


(no dependencies on other entities)


Public interface
----------------

.. raw:: html

   <div id="as_dictionary/2"> </div>

.. index:: as_dictionary/2
.. _dictionaryp/0::as_dictionary/2:

``as_dictionary/2``
^^^^^^^^^^^^^^^^^^^

Converts a list of key-value pairs to a dictionary.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``as_dictionary(Pairs,Dictionary)``
| **Mode and number of proofs:**
|    ``as_dictionary(@list(pairs),-dictionary)`` - ``one``


.. raw:: html

   <div id="as_list/2"> </div>

.. index:: as_list/2
.. _dictionaryp/0::as_list/2:

``as_list/2``
^^^^^^^^^^^^^

Converts a dictionary to a ordered list of key-value pairs.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``as_list(Dictionary,Pairs)``
| **Mode and number of proofs:**
|    ``as_list(@dictionary,-list(pairs))`` - ``one``


.. raw:: html

   <div id="clone/3"> </div>

.. index:: clone/3
.. _dictionaryp/0::clone/3:

``clone/3``
^^^^^^^^^^^

Clones a dictionary using the same keys but with all values unbound and returning a list of all the pairs in the new clone.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``clone(Dictionary,Clone,ClonePairs)``
| **Mode and number of proofs:**
|    ``clone(+tree,-tree,-list(pairs))`` - ``one``


.. raw:: html

   <div id="clone/4"> </div>

.. index:: clone/4
.. _dictionaryp/0::clone/4:

``clone/4``
^^^^^^^^^^^

Clones a dictionary using the same keys but with all values unbound and returning the list of all pairs in the dictionary and in the clone.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``clone(Dictionary,Pairs,Clone,ClonePairs)``
| **Mode and number of proofs:**
|    ``clone(+tree,-list(pairs),-tree,-list(pairs))`` - ``one``


.. raw:: html

   <div id="insert/4"> </div>

.. index:: insert/4
.. _dictionaryp/0::insert/4:

``insert/4``
^^^^^^^^^^^^

Inserts a Key-Value pair into a dictionary, returning the updated dictionary. When the key already exists, the associated value is updated.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``insert(OldDictionary,Key,Value,NewDictionary)``
| **Mode and number of proofs:**
|    ``insert(+dictionary,+ground,@term,-dictionary)`` - ``one``


.. raw:: html

   <div id="delete/4"> </div>

.. index:: delete/4
.. _dictionaryp/0::delete/4:

``delete/4``
^^^^^^^^^^^^

Deletes a matching Key-Value pair from a dictionary, returning the updated dictionary.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``delete(OldDictionary,Key,Value,NewDictionary)``
| **Mode and number of proofs:**
|    ``delete(+dictionary,@ground,?term,-dictionary)`` - ``zero_or_one``


.. raw:: html

   <div id="update/4"> </div>

.. index:: update/4
.. _dictionaryp/0::update/4:

``update/4``
^^^^^^^^^^^^

Updates the value associated with Key in a dictionary, returning the updated dictionary. Fails if it cannot find the key.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``update(OldDictionary,Key,NewValue,NewDictionary)``
| **Mode and number of proofs:**
|    ``update(+dictionary,@ground,+term,-dictionary)`` - ``zero_or_one``


.. raw:: html

   <div id="update/5"> </div>

.. index:: update/5
.. _dictionaryp/0::update/5:

``update/5``
^^^^^^^^^^^^

Updates the value associated with Key in a dictionary, returning the updated dictionary. Fails if it cannot find the key or if the existing value does not match OldValue.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``update(OldDictionary,Key,OldValue,NewValue,NewDictionary)``
| **Mode and number of proofs:**
|    ``update(+dictionary,@ground,?term,+term,-dictionary)`` - ``zero_or_one``


.. raw:: html

   <div id="empty/1"> </div>

.. index:: empty/1
.. _dictionaryp/0::empty/1:

``empty/1``
^^^^^^^^^^^

True if the dictionary is empty.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``empty(Dictionary)``
| **Mode and number of proofs:**
|    ``empty(@dictionary)`` - ``zero_or_one``


.. raw:: html

   <div id="lookup/3"> </div>

.. index:: lookup/3
.. _dictionaryp/0::lookup/3:

``lookup/3``
^^^^^^^^^^^^

Lookups a matching Key-Value pair from a dictionary.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``lookup(Key,Value,Dictionary)``
| **Mode and number of proofs:**
|    ``lookup(+ground,?term,@dictionary)`` - ``zero_or_one``
|    ``lookup(-ground,?term,@dictionary)`` - ``zero_or_more``


.. raw:: html

   <div id="previous/4"> </div>

.. index:: previous/4
.. _dictionaryp/0::previous/4:

``previous/4``
^^^^^^^^^^^^^^

Returns the previous pair in a dictionary given a key.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``previous(Dictionary,Key,Previous,Value)``
| **Mode and number of proofs:**
|    ``previous(+dictionary,+key,-key,-value)`` - ``zero_or_one``


.. raw:: html

   <div id="next/4"> </div>

.. index:: next/4
.. _dictionaryp/0::next/4:

``next/4``
^^^^^^^^^^

Returns the next pair in a dictionary given a key.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``next(Dictionary,Key,Next,Value)``
| **Mode and number of proofs:**
|    ``next(+dictionary,+key,-key,-value)`` - ``zero_or_one``


.. raw:: html

   <div id="min/3"> </div>

.. index:: min/3
.. _dictionaryp/0::min/3:

``min/3``
^^^^^^^^^

Returns the pair with the minimum key in a dictionary. Fails if the dictionary is empty.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``min(Dictionary,Key,Value)``
| **Mode and number of proofs:**
|    ``min(+dictionary,-key,-value)`` - ``zero_or_one``


.. raw:: html

   <div id="max/3"> </div>

.. index:: max/3
.. _dictionaryp/0::max/3:

``max/3``
^^^^^^^^^

Returns the pair with the maximum key in a dictionary. Fails if the dictionary is empty.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``max(Dictionary,Key,Value)``
| **Mode and number of proofs:**
|    ``max(+dictionary,-key,-value)`` - ``zero_or_one``


.. raw:: html

   <div id="delete_min/4"> </div>

.. index:: delete_min/4
.. _dictionaryp/0::delete_min/4:

``delete_min/4``
^^^^^^^^^^^^^^^^

Deletes the pair with the minimum key from a dictionary, returning the deleted pair and the updated dictionary.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``delete_min(OldDictionary,Key,Value,NewDictionary)``
| **Mode and number of proofs:**
|    ``delete_min(+dictionary,-key,-value,-dictionary)`` - ``zero_or_one``


.. raw:: html

   <div id="delete_max/4"> </div>

.. index:: delete_max/4
.. _dictionaryp/0::delete_max/4:

``delete_max/4``
^^^^^^^^^^^^^^^^

Deletes the pair with the maximum key from a dictionary, returning the deleted pair and the updated dictionary.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``delete_max(OldDictionary,Key,Value,NewDictionary)``
| **Mode and number of proofs:**
|    ``delete_max(+dictionary,-key,-value,-dictionary)`` - ``zero_or_one``


.. raw:: html

   <div id="keys/2"> </div>

.. index:: keys/2
.. _dictionaryp/0::keys/2:

``keys/2``
^^^^^^^^^^

Returns a list with all dictionary keys.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``keys(Dictionary,List)``
| **Mode and number of proofs:**
|    ``keys(@dictionary,-list)`` - ``one``


.. raw:: html

   <div id="map/2"> </div>

.. index:: map/2
.. _dictionaryp/0::map/2:

``map/2``
^^^^^^^^^

Maps a closure over each dictionary key-value pair. Fails if the mapped closure attempts to modify the keys.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``map(Closure,Dictionary)``
| **Meta-predicate template:**
|    ``map(1,*)``
| **Mode and number of proofs:**
|    ``map(@callable,+dictionary)`` - ``zero_or_more``


.. raw:: html

   <div id="map/3"> </div>

.. index:: map/3
.. _dictionaryp/0::map/3:

``map/3``
^^^^^^^^^

Maps a closure over each dictionary key-value pair, returning the new dictionary. Fails if the mapped closure attempts to modify the keys.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``map(Closure,OldDictionary,NewDictionary)``
| **Meta-predicate template:**
|    ``map(2,*,*)``
| **Mode and number of proofs:**
|    ``map(@callable,+dictionary,-dictionary)`` - ``zero_or_more``


.. raw:: html

   <div id="apply/4"> </div>

.. index:: apply/4
.. _dictionaryp/0::apply/4:

``apply/4``
^^^^^^^^^^^

Applies a closure to a specific key-value pair, returning the new dictionary. Fails if the key cannot be found or if the mapped closure attempts to modify the key.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``apply(Closure,OldDictionary,Key,NewDictionary)``
| **Meta-predicate template:**
|    ``apply(2,*,*,*)``
| **Mode and number of proofs:**
|    ``apply(+callable,+dictionary,+key,-dictionary)`` - ``zero_or_one``


.. raw:: html

   <div id="size/2"> </div>

.. index:: size/2
.. _dictionaryp/0::size/2:

``size/2``
^^^^^^^^^^

Number of dictionary entries.

| **Compilation flags:**
|    ``static``

| **Template:**
|    ``size(Dictionary,Size)``
| **Mode and number of proofs:**
|    ``size(@dictionary,?integer)`` - ``zero_or_one``


Protected interface
-------------------

(none)

Private predicates
------------------

(none)

Operators
---------

(none)

Remarks
-------

(none)

.. seealso::

   :ref:`bintree <bintree/0>`, :ref:`rbtree <rbtree/0>`

