Alphabet#
AUTHORS:
Franco Saliola (2008-12-17) : merged into sage
Vincent Delecroix and Stepan Starosta (2012): remove classes for alphabet and use other Sage classes otherwise (TotallyOrderedFiniteSet, FiniteEnumeratedSet, …). More shortcut to standard alphabets.
EXAMPLES:
sage: build_alphabet("ab")
{'a', 'b'}
sage: build_alphabet([0,1,2])
{0, 1, 2}
sage: build_alphabet(name="PP")
Positive integers
sage: build_alphabet(name="NN")
Non negative integers
sage: build_alphabet(name="lower")
{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}
- sage.combinat.words.alphabet.Alphabet(data=None, names=None, name=None)#
Return an object representing an ordered alphabet.
INPUT:
data
– the letters of the alphabet; it can be:a list/tuple/iterable of letters; the iterable may be infinite
an integer \(n\) to represent \(\{1, \ldots, n\}\), or infinity to represent \(\NN\)
names
– (optional) a list for the letters (i.e. variable names) or a string for prefix for all letters; if given a list, it must have the same cardinality as the set represented bydata
name
– (optional) if given, then return a named set and can be equal to :'lower', 'upper', 'space', 'underscore', 'punctuation', 'printable', 'binary', 'octal', 'decimal', 'hexadecimal', 'radix64'
.You can use many of them at once, separated by spaces :
'lower punctuation'
represents the union of the two alphabets'lower'
and'punctuation'
.Alternatively,
name
can be set to"positive integers"
(or"PP"
) or"natural numbers"
(or"NN"
).name
cannot be combined withdata
.
EXAMPLES:
If the argument is a Set, it just returns it:
sage: build_alphabet(ZZ) is ZZ True sage: F = FiniteEnumeratedSet('abc') sage: build_alphabet(F) is F True
If a list, tuple or string is provided, then it builds a proper Sage class (
TotallyOrderedFiniteSet
):sage: build_alphabet([0,1,2]) {0, 1, 2} sage: F = build_alphabet('abc'); F {'a', 'b', 'c'} sage: print(type(F).__name__) TotallyOrderedFiniteSet_with_category
If an integer and a set is given, then it constructs a
TotallyOrderedFiniteSet
:sage: build_alphabet(3, ['a','b','c']) {'a', 'b', 'c'}
If an integer and a string is given, then it considers that string as a prefix:
sage: build_alphabet(3, 'x') {'x0', 'x1', 'x2'}
If no data is provided,
name
may be a string which describe an alphabet. The available names decompose into two families. The first one are ‘positive integers’, ‘PP’, ‘natural numbers’ or ‘NN’ which refer to standard set of numbers:sage: build_alphabet(name="positive integers") Positive integers sage: build_alphabet(name="PP") Positive integers sage: build_alphabet(name="natural numbers") Non negative integers sage: build_alphabet(name="NN") Non negative integers
The other families for the option
name
are among ‘lower’, ‘upper’, ‘space’, ‘underscore’, ‘punctuation’, ‘printable’, ‘binary’, ‘octal’, ‘decimal’, ‘hexadecimal’, ‘radix64’ which refer to standard set of characters. Theses names may be combined by separating them by a space:sage: build_alphabet(name="lower") {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'} sage: build_alphabet(name="hexadecimal") {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'} sage: build_alphabet(name="decimal punctuation") {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ', ',', '.', ';', ':', '!', '?'}
In the case the alphabet is built from a list or a tuple, the order on the alphabet is given by the elements themselves:
sage: A = build_alphabet([0,2,1]) sage: A(0) < A(2) True sage: A(2) < A(1) False
If a different order is needed, you may use
TotallyOrderedFiniteSet
and set the optionfacade
toFalse
. That way, the comparison fits the order of the input:sage: A = TotallyOrderedFiniteSet([4,2,6,1], facade=False) sage: A(4) < A(2) True sage: A(1) < A(6) False
Be careful, the element of the set in the last example are no more integers and do not compare equal with integers:
sage: type(A.an_element()) <class 'sage.sets.totally_ordered_finite_set.TotallyOrderedFiniteSet_with_category.element_class'> sage: A(1) == 1 False sage: 1 == A(1) False
We give an example of an infinite alphabet indexed by the positive integers and the prime numbers:
sage: build_alphabet(oo, 'x') Lazy family (x(i))_{i in Non negative integers} sage: build_alphabet(Primes(), 'y') Lazy family (y(i))_{i in Set of all prime numbers: 2, 3, 5, 7, ...}
- sage.combinat.words.alphabet.build_alphabet(data=None, names=None, name=None)#
Return an object representing an ordered alphabet.
INPUT:
data
– the letters of the alphabet; it can be:a list/tuple/iterable of letters; the iterable may be infinite
an integer \(n\) to represent \(\{1, \ldots, n\}\), or infinity to represent \(\NN\)
names
– (optional) a list for the letters (i.e. variable names) or a string for prefix for all letters; if given a list, it must have the same cardinality as the set represented bydata
name
– (optional) if given, then return a named set and can be equal to :'lower', 'upper', 'space', 'underscore', 'punctuation', 'printable', 'binary', 'octal', 'decimal', 'hexadecimal', 'radix64'
.You can use many of them at once, separated by spaces :
'lower punctuation'
represents the union of the two alphabets'lower'
and'punctuation'
.Alternatively,
name
can be set to"positive integers"
(or"PP"
) or"natural numbers"
(or"NN"
).name
cannot be combined withdata
.
EXAMPLES:
If the argument is a Set, it just returns it:
sage: build_alphabet(ZZ) is ZZ True sage: F = FiniteEnumeratedSet('abc') sage: build_alphabet(F) is F True
If a list, tuple or string is provided, then it builds a proper Sage class (
TotallyOrderedFiniteSet
):sage: build_alphabet([0,1,2]) {0, 1, 2} sage: F = build_alphabet('abc'); F {'a', 'b', 'c'} sage: print(type(F).__name__) TotallyOrderedFiniteSet_with_category
If an integer and a set is given, then it constructs a
TotallyOrderedFiniteSet
:sage: build_alphabet(3, ['a','b','c']) {'a', 'b', 'c'}
If an integer and a string is given, then it considers that string as a prefix:
sage: build_alphabet(3, 'x') {'x0', 'x1', 'x2'}
If no data is provided,
name
may be a string which describe an alphabet. The available names decompose into two families. The first one are ‘positive integers’, ‘PP’, ‘natural numbers’ or ‘NN’ which refer to standard set of numbers:sage: build_alphabet(name="positive integers") Positive integers sage: build_alphabet(name="PP") Positive integers sage: build_alphabet(name="natural numbers") Non negative integers sage: build_alphabet(name="NN") Non negative integers
The other families for the option
name
are among ‘lower’, ‘upper’, ‘space’, ‘underscore’, ‘punctuation’, ‘printable’, ‘binary’, ‘octal’, ‘decimal’, ‘hexadecimal’, ‘radix64’ which refer to standard set of characters. Theses names may be combined by separating them by a space:sage: build_alphabet(name="lower") {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'} sage: build_alphabet(name="hexadecimal") {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'} sage: build_alphabet(name="decimal punctuation") {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ', ',', '.', ';', ':', '!', '?'}
In the case the alphabet is built from a list or a tuple, the order on the alphabet is given by the elements themselves:
sage: A = build_alphabet([0,2,1]) sage: A(0) < A(2) True sage: A(2) < A(1) False
If a different order is needed, you may use
TotallyOrderedFiniteSet
and set the optionfacade
toFalse
. That way, the comparison fits the order of the input:sage: A = TotallyOrderedFiniteSet([4,2,6,1], facade=False) sage: A(4) < A(2) True sage: A(1) < A(6) False
Be careful, the element of the set in the last example are no more integers and do not compare equal with integers:
sage: type(A.an_element()) <class 'sage.sets.totally_ordered_finite_set.TotallyOrderedFiniteSet_with_category.element_class'> sage: A(1) == 1 False sage: 1 == A(1) False
We give an example of an infinite alphabet indexed by the positive integers and the prime numbers:
sage: build_alphabet(oo, 'x') Lazy family (x(i))_{i in Non negative integers} sage: build_alphabet(Primes(), 'y') Lazy family (y(i))_{i in Set of all prime numbers: 2, 3, 5, 7, ...}