Did you know ... | Search Documentation: |
Pack logtalk -- logtalk-3.85.0/manuals/_sources/libraries/sets.rst.txt |
.. _library_sets:
sets
This library provides a set protocol and two implementations of this protocol using ordered lists, one of them a parametric object that takes the type of the set elements as a parameter. Although representing sets as ordered lists is a common representation, is best practice to regard sets as opaque terms and only access them using the library predicates.
Open the `../../docs/library_index.html#sets <../../docs/library_index.html#sets>`__ link in a web browser.
To load all entities in this library, load the loader.lgt
file:
::
| ?- logtalk_load(sets(loader))
.
To test this library predicates, load the tester.lgt
file:
::
| ?- logtalk_load(sets(tester))
.
First, select a set implementation. Use the set(Type)
object if you
want to type-check the set elements. Otherwise, use the set
object.
To create a new set, you can use the new/1 predicate. For example:
::
| ?- set::new(Set)
.
Set = []
yes
You can also create a new set with all unique elements from a list of terms by using the as_set/2 predicate. For example:
::
| ?- set::as_set([1,3,2,1,2], Set)
.
Set = [1, 2, 3]
yes
Predicates are provided for the most common set operations. For example:
::
| ?- set::(
as_set([1,3,2,1,2], Set1)
,
as_set([7,4,2,5,1], Set2)
,
intersection(Set1, Set2, Intersection)
,
symdiff(Set1, Set2, Difference)
).
Set1 = [1, 2, 3],
Set2 = [1, 2, 4, 5, 7],
Intersection = [1, 2],
Difference = [3, 4, 5, 7]
yes
When working with a custom type of set elements, the corresponding
object must implement the comparingp
protocol. For example:
::
:- object(rainbow_colors,
implements(comparingp))
.
order(red, 1)
.
order(orange, 2)
.
order(yellow, 3)
.
order(green, 4)
.
order(blue, 5)
.
order(indigo, 6)
.
order(violet, 7)
.
Color1 < Color2 :-
order(Color1, N1)
,
order(Color2, N2)
,
{N1 < N2}.
Color1 =< Color2 :-
order(Color1, N1)
,
order(Color2, N2)
,
{N1 =< N2}.
...
:- end_object.
We can then use this object with the set/1 parametric object. For example:
::
| ?- set(rainbow_colors)
::as_set([blue, yellow, violet], Set)
.
Set = [yellow, blue, violet]
yes
For details on these and other provided predicates, consult the library API documentation.
Some predicates adapted from code authored by Richard O'Keefe.