Settings
Perform the necessary Imports.
In [1]: import sys
...: from truealgebra.core.settings import(
...: settings, bp
...: )
...: from truealgebra.core import setsettings
...: from truealgebra.core.constants import (
...: DIGITS, LETTERS, WHITE_SPACE, OPERATORS, META_DELIMITERS
...: )
...: from truealgebra.core import expressions as expr
...:
From The module truealgebra.core.settings is imported the settings object which is a singleton.
In [2]: type(settings)
Out[2]: truealgebra.core.settings.SettingsSingleton
The data inside seettings provides the envioroment for a truealgebra session. It primarily controls the parsing that creates truealgebra expressions from python strings.
To avoid confuion, for a truealgebra session, there should be only one environment. At the beginning of a truealgebra session the settings should be adjusted as desired at the beginning of the session and kept unchanged throughout the rest of the session.
Constants
The five python constants shown below are used during parsing or when a user manually creates truealgebra expressions. The first three constants are required knowledge for a user writing code to instantiate expressions through application of a rule.
In [3]: print('DIGITS = ' + str(DIGITS))
...: print('LETTERS = ' + str(LETTERS))
...: print('OPERATORS = ' + str(OPERATORS))
...: print('WHITE_SPACE = ' + str(WHITE_SPACE))
...: print('META_DELIMITERS = ' + str(META_DELIMITERS))
...:
DIGITS = {'3', '5', '1', '6', '2', '0', '8', '4', '7', '9'}
LETTERS = {'j', 'D', 'f', 'P', 'v', 'u', 'O', 'z', 'E', 'x', 'U', 'I', 'J', 'n', 'g', 'p', 'w', 'T', 'y', 's', 'Q', 'A', 'H', 'o', 'F', 'b', '_', 'Z', 'l', 'V', 'W', 'L', 'a', 'R', 'B', 'd', 'M', 'c', 'K', 'r', 'C', 'X', 'k', 'e', 'Y', 'G', 'N', 'S', 'i', 'm', 'h', 't', 'q'}
OPERATORS = {'+', ':', '?', '`', '/', '@', '>', '%', '<', '*', '!', '^', '=', '~', '-', '&', '|', '\\', '"'}
WHITE_SPACE = {'\t', ' '}
META_DELIMITERS = {';', '\n'}
These constant are sets and the characters are printed without order. The
settings.DIGITS set contains the digits 0 through 9.
The settings.LETTERS set contains the lower and upper case alphabet
characters as well as the number sign and underscore characters.
Definitions
In order to facilitate the discussion, the following definitions have been made.
Binding Power
A binding power is a python object of type int and equal to or greater than 0. Binding powers are used during parsing.
Every truealgebra expression has two binding powers assigned to lbp (left binding power) and rbp (right binding power) attributes. These attributes can be either class or instance attributes. See lbp and rbp attributes.
Symbol Name
A symbol name is a nonempty python string made up of characters from the constants LETTERS and DIGITS. There is no limit on the length of a symbol name. The first character must be one of the characters in the set LETTERS. The remaining characters can only be from the set LETTERS or the set DIGITS.
The name attribute of a Symbol instance must be a symbol name. A symbol name is also the first naming convention for name attributes of Container instances.
Operator Name
An operator name is a nonempty python string made up of characters from the set settings.OPERATORS. Operator names are the second naming convention for name attributes of Container instances.
Settings are python objects that should be modified as needed by users.
bp
bp is a namedtuble, used to create immutable objects that holds left and right binding powers.
An instance of the bp named tuple class below, holds two binding powers. The object my_bp_tuple is a bp instance. The 250 parameter becomes the lbp attribute of the instance and the 600 parameter becomes the rbp attribute. The lbp stands for left binding power and rbp stands for right binding power.
In [4]: my_bp_tuple = bp(250, 600)
...: print(my_bp_tuple.lbp)
...: print(my_bp_tuple.rbp)
...:
250
600
Settings Attributes
The attributes of the settings object hold the actual data that is set.
It is strongly recomended that users do not modify the attributes directly. To prevent hidden errors that are difficult to debug, use the Set Functions.
default_bp
This setting is used during parsing to provide the default left and right binding powers for Container instances with operator names.
The default_bp settings attribute is a bp class instance containing two positive binding powers. The default value for default_bp is bp(250, 250).
In [5]: print(settings.default_bp)
...: settings.default_bp = bp(275, 276)
...: print(settings.default_bp)
...:
bp(lbp=250, rbp=250)
bp(lbp=275, rbp=276)
custom_bp
The custom_bp setting is used during parsing to specify custom binding powers for Container instances with operator names to be parsed as operators.
The custom_bp attribute is a dictionary which by default is empty. A dictionary key must be an operator name. A dictionary values must be an instance of bp containing two binding powers. Both binding powers cannot be 0. If the dictionary key is also a key for settings.infixprefix then both binding powers must be positive.
In [6]: print(settings.custom_bp)
...: settings.custom_bp['*'] = bp(400, 400)
...: settings.custom_bp['!'] = bp(600, 0)
...: print(settings.custom_bp)
...:
{'=': bp(lbp=50, rbp=50)}
{'=': bp(lbp=50, rbp=50), '*': bp(lbp=400, rbp=400), '!': bp(lbp=600, rbp=0)}
infixprefix
The infixprefix settings attribute is used during parsing to specify Container instances that can be both infix and prefix operators.
This setting is a dictionary and by default it is empty. A dictionary key must be an operator name. The dictionary value must be a positive binding power. The infix form of the Container instance must have both binding powers positive.
In [7]: print(settings.infixprefix)
...: settings.infixprefix['-'] = 800
...: print(settings.infixprefix)
...:
{}
{'-': 800}
symbol_operators
This setting is used during parsing to specify Container instances with symbol names that will be parsed as operators.
The symbol_operator setting is a dictionary which by default is empty. The dictionary key must be a symbol name. The dictionary value must be a settings.bp instance that contains two binding powers. Both binding powers cannot be 0. A dictionary key cannot also be a key in settings.bodied_functions.
In [8]: print(settings.symbol_operators)
...: settings.symbol_operators['and'] = bp(325, 425)
...: print(settings.symbol_operators)
...:
{'and': bp(lbp=75, rbp=75)}
{'and': bp(lbp=325, rbp=425)}
bodied_functions
The bodied_functions setting is used during parsing to specify Container instances that will parsed as bodied functions.
The bodied_functions setting is a dictionary which is by default empty. A dictionary key must be an symbol name. A dictionary value must be a positive integer.Both binding powers cannot be 0. A dictionary key cannot also be a key in settings.symbol_operators.
In [9]: print(settings.bodied_functions)
...: settings.bodied_functions['D'] = 100
...: print(settings.bodied_functions)
...:
{}
{'D': 100}
container_subclass
The container_subclass setting links name attributes with Container subclasses. This setting is used during parsing when Container instances are instantiated.
This setting is a dictionary that is by default empty. The dictionary key must be symbol or operator name. The dictionary value must be a Container subclass.
In [10]: print(settings.container_subclass)
....: settings.container_subclass['*'] = expr.CommAssoc
....: print(settings.container_subclass)
....:
{'*': <class 'truealgebra.core.expressions.CommAssoc'>}
{'*': <class 'truealgebra.core.expressions.CommAssoc'>}
complement
The complement setting is used to specify an attribute name of a Container instance that complements an attribute name of a CommAssoc instance. During parsing, A Container instance will be converted to a CommAssoc instance that it complements.
The complement setting is a dictionary that is by default empty. A dictionary key must be either a symbol name or operator name. The dictionary value must be a settings.commassoc_tuple named tuple instance.
The name attribute of the named tuple must also be the name attribute of CommAssoc instances. The identity attribute of the named tuple must be an expression that represents the mathematical identity of the mathematical operation represented by the CommAssoc instances.
The string '*', was assigned above as an attribute name for CommAssoc instances.
In the example below, Container instances with a attribute name of 'star' complement CommAssoc instances with name '*'.
SKIP:
.. ipython::
In [1]: print(settings.complement)
...: settings.complement['star'] = settings.commassoc_tuple(
...: name='*',
...: identity=expr.Number(1),
...: )
...: print(settings.complement)
container_categories
The container_categories setting can used by rules to identify the name attribute of Container instances that fall in a particular category. Categories are strings and there are no predefined categories. Any string can be used for a category.
Consider the example below where the category is suchthat_names. Any Container instance with a name attribute in the set settings.container_categories['suchthat_names'] is said to be in the suchthat_names category. A rule that has been written for the suchthat_names category would apply to Container instances with a name attribute of ':' or '|'.
The container_types setting is a default dictionary with a default value of an empty set. The truealgebra.core.settings module initializes an empty dictionary. Every dictionary key must be a string. Every dictionary value is a set that can contain only symbol names or operator names.
SKIP:
.. ipython::
In [1]: print(settings.container_categories)
...: settings.container_categories['suchthat_names'].add('|')
...: settings.container_categories['suchthat_names'].add(':')
...: print(settings.container_categories)
Setting Tools
The setting tools are functions related to the environment settings. Setting tools are found in the module truealgebra.core.setting_tools.
Utility Functions
- clear_settings()
Returns all settings to their default value. This function is especially helpful with unit tests.
- isbindingpower(num)
Returns True if
numis a binding power, otherwise returns False.- issymbolname(name)
Returns True if
nameis a symbol name, otherwise returns False.- isoperatorname(name)
Returns True if
nameis an operator name, otherwise returns False.
Set Functions
In the following function definitions, the parameters lbp and rbp stand for left and right binding power. If mistakes are made when using these functions, error messages will be printed and no cahnges to the settings will be made,
- set_default_bp(lbp, rbp)
Assigns new named tuple settings.bp instance for setting settings.default. The parameters
lbpandrbpmust be positive binding powers.- set_custom_bp(name, lbp, rbp)
Add or reassign key to settings.custom_bp dictionary. The key is the parameter
namewhich must be an operator name. The parameterslbpandrbpmust be binding powers. Bothlbpandrbpcannot be 0.- set_infixprefix (name, rbp)
Add or reassign key to settings.infixprefix dictionary. The key is the parameter
namewhich must be an operator name. The parameterrbpmust be a positive binding power. The infix form of thenamemust have both binding powers positive.- set_symbol_operators (name, lbp, rbp)
Add or reassign key to settings.symbol_operators dictionary. The key is the parameter
namewhich must be a symbol name. The parameternamecannot be a key in the settingsettings.bodied_functionsdictionary. The parameterslbpandrbpmust be binding powers. Bothlbpandrbpcannot be 0.- set_bodied_functions(name, rbp)
Add or reassign key to settings.bodied_function dictionary. The key is the parameter
namewhich must be a symbol name. The parameternamecannot be a key in the settingsettings.symbol_operatorsdictionary. The parametersrbpmust be a positive binding power.- set_container_subclass(name, cls)
Add or reassign key to settings.container_subclass dictionary. The key is the parameter
namewhich must be a symbol name or an operator name. The parameterclsmust be a Container subclass.- set_complement(complement_name, commassoc_name, identity)
Add or reassign key to settings.complement dictionary. The key is the parameter
complement_namewhich must be a symbol name or an operator name. The parametercommassoc_namemust be a key insettings.container_subclasspointing to CommAssoc. The parameteridentitymust be a truealgebra expression.- set_container_categories(category, name)
Add or reassign key to settings.container_categories dictionary. The key is the parameter
catgegorywhich must be a string. The parameternamewhich must be symbol name or operator name is the corresponding value
Set Function Error Example
All three parameters of settingst.set_custom_bp have flaws. Error messages are printed and no changes made to the setting settings.custom_bp.
In [11]: print('custom_bp= ' + str(settings.custom_bp))
....: setsettings.set_custom_bp('q@d$', -300, 'four')
....: print('custom_bp= ' + str(settings.custom_bp))
....:
custom_bp= {'=': bp(lbp=50, rbp=50), '*': bp(lbp=400, rbp=400), '!': bp(lbp=600, rbp=0)}
TRUEALGEBRA ERROR!
set_custom_bp error
name q@d$ must be an operator name.
lbp -300 must be a binding power
rbp four must be a binding power
custom_bp= {'=': bp(lbp=50, rbp=50), '*': bp(lbp=400, rbp=400), '!': bp(lbp=600, rbp=0)}