# Differences

This shows you the differences between two versions of the page.

Both sides previous revision Previous revision Next revision | Previous revision | ||

manual:chapter3:symbolic [2019/01/24 08:46] claudio [Attributes] |
manual:chapter3:symbolic [2019/01/30 06:02] (current) claudio [Attributes] |
||
---|---|---|---|

Line 59: | Line 59: | ||

Attributes are hints that the user can include in an expression to increase the knowledge that the system has about certain variables. For example, if variables ''A'' and ''B'' in the expression ''%%'%%A*B*INV(A)%%'%%'' represent a matrix, the system should not simplify that expression to ''%%'%%B%%'%%''. Furthermore, if ''A'' and ''B'' are real numbers, the simplification is only valid when ''A'' is known not to be zero. | Attributes are hints that the user can include in an expression to increase the knowledge that the system has about certain variables. For example, if variables ''A'' and ''B'' in the expression ''%%'%%A*B*INV(A)%%'%%'' represent a matrix, the system should not simplify that expression to ''%%'%%B%%'%%''. Furthermore, if ''A'' and ''B'' are real numbers, the simplification is only valid when ''A'' is known not to be zero. | ||

- | Attributes allow the user to let the system know that ''A'' is a real number and it cannot be zero. To add attributes to a variable, simply add a combination of subscript numbers after the variable name. For example, if ''A'' is a real number known not to be zero, simply write ''A₂₁'' in the expression (the exact meaning of the numbers will be explained in the next section). Notice that these attributes are only visible when editing the expression. Once the expression is in the stack, only the name of the variable will be visible, as the subscript numbers don't become part of the name of the variable. Ideally, the user should provide the same attributes to the same variables all throughout the expression (otherwise the system will think the variable represents different things in different parts of the same expression). | + | Attributes allow the user to let the system know that ''A'' is a real number and it cannot be zero. To add attributes to a variable, simply add a combination of subscript numbers after the variable name. For example, if ''A'' is a real number known not to be zero, simply write ''A₂₁'' in the expression (the exact meaning of the numbers will be explained in the next section). |

+ | | ||

+ | Notice that these attributes are only visible when editing the expression. Once the expression is in the stack, only the name of the variable will be visible, as the subscript numbers don't become part of the name of the variable. Ideally, the user should provide the same attributes to the same variables all throughout the expression (otherwise the system will think the variable represents different things in different parts of the same expression). | ||

Attributes are also useful within rules. If a variable (or wildcard special variable) has any attributes given within a rule definition, it will only match variables (or expressions) that have compatible attributes. For example a rule to cancel out factors in an expression could be: ''%%'%%.xX/.xX:->1%%'%%''. But this is not correct if the expression being canceled may be zero. Using attributes, we can write ''%%'%%.xX₂₁/.xX₂₁:->1%%'%%'' and now it will only match expressions that are known to be real and are known not to be zero. | Attributes are also useful within rules. If a variable (or wildcard special variable) has any attributes given within a rule definition, it will only match variables (or expressions) that have compatible attributes. For example a rule to cancel out factors in an expression could be: ''%%'%%.xX/.xX:->1%%'%%''. But this is not correct if the expression being canceled may be zero. Using attributes, we can write ''%%'%%.xX₂₁/.xX₂₁:->1%%'%%'' and now it will only match expressions that are known to be real and are known not to be zero. | ||

Line 68: | Line 70: | ||

=== Encoding of attributes === | === Encoding of attributes === | ||

+ | |||

Attributes can be any number of up to 8 decimal digits. The value of zero is reserved for 'no attributes' and will be automatically removed from the variables. The newRPL algebraic engine uses only 3 digits (other digits may or may not be used in the future). | Attributes can be any number of up to 8 decimal digits. The value of zero is reserved for 'no attributes' and will be automatically removed from the variables. The newRPL algebraic engine uses only 3 digits (other digits may or may not be used in the future). | ||

+ | |||

The first 3 digits will be referred to as 't' (for type), 's' (sign) and 'p' (parity) from now on. They go after a variable in 'tsp' order, and trailing zeros can be omitted. | The first 3 digits will be referred to as 't' (for type), 's' (sign) and 'p' (parity) from now on. They go after a variable in 'tsp' order, and trailing zeros can be omitted. | ||

Line 75: | Line 79: | ||

^ Value ^ Meaning ^ | ^ Value ^ Meaning ^ | ||

| 0 ((Will be automatically removed)) | Nothing is known about this variable | | | 0 ((Will be automatically removed)) | Nothing is known about this variable | | ||

- | | 1 | Variable may be infinity or NaN | | + | | 1 | Variable known to be finite (cannot be infinity or NaN) | |

- | | 2 | Variable is known to be real | | + | | 2 | Variable is known to be real, may be infinity/NaN | |

- | | 3 | Variable is known to be real, may be infinity/NaN | | + | | 3 | Variable is known to be real (and finite) | |

- | | 4 | Variable is known to be complex | | + | | 4 | Variable is known to be complex, may be infinity/NaN | |

- | | 5 | Variable is known to be complex, may be infinity/NaN | | + | | 5 | Variable is known to be complex (and finite) | |

| 6 | Variable is known to be a matrix | | | 6 | Variable is known to be a matrix | | ||

| 8 ((Internal use only)) | Variable is known to be of unknown type | | | 8 ((Internal use only)) | Variable is known to be of unknown type | | ||

Line 91: | Line 95: | ||

| 2 | Value is known not to be < 0 (therefore it's >=0) | | | 2 | Value is known not to be < 0 (therefore it's >=0) | | ||

| 3 | Value is known not to be < 0 and not to be zero (therefore it's >0) | | | 3 | Value is known not to be < 0 and not to be zero (therefore it's >0) | | ||

- | | 4 | Value is known not to be > 0 (therefore it's <=0) | | + | | 4 | Value is known not to be > 0 (therefore it's %%<=%%0) | |

| 5 | Value is known not to be > 0 and not to be zero (therefore it's <0) | | | 5 | Value is known not to be > 0 and not to be zero (therefore it's <0) | | ||

- | ^ Third digit 'p' (parity): || | + | The third digit provides insight about the parity of the number, and whether a real is an integer or not. Much like the 's' digit, this is only meaningful for real values. |

+ | | ||

+ | ^ Third digit 'p' (parity): || | ||

^ Value ^ Meaning ^ | ^ Value ^ Meaning ^ | ||

- | | 0 | ((Will be removed/omitted)) | Nothing is known regarding parity of this value | | + | | 0 ((Will be removed/omitted)) | Nothing is known regarding parity of this value | |

| 1 | Value if known to be an integer | | | 1 | Value if known to be an integer | | ||

| 2 | Value is known to be odd | | | 2 | Value is known to be odd | | ||

Line 102: | Line 108: | ||

| 4 | Value is known to be even | | | 4 | Value is known to be even | | ||

| 5 | Value is known to be an even integer | | | 5 | Value is known to be an even integer | | ||

+ | |||

+ | |||

+ | ==== Using rules and attributes, examples ==== | ||

+ | |||

+ | ^ Rule ^ Effect ^ | ||

+ | | ''%%'%%ABS(.xX₂₂):->.xX%%'%%'' | Simplify absolute value of an expression that is known to be real >=0 | | ||

+ | |||

+ | ^ Test cases ^ Result ^ Explanation ^ | ||

+ | | ''Y*ABS(X₂₃)'' | ''Y*X₂₃'' | The expression matches because ''X'' is known to be a real >0 | | ||

+ | | ''Y*ABS(-4)'' | ''Y*ABS(-4)'' | The expression doesn't match because ''-4'' is known to be a real <0 | | ||

+ | | ''Y*ABS(X₂₃+1)'' | ''Y*(X₂₃+1)'' | The expression matches because ''X+1'' is known to be a real >0 | | ||

+ | | ''Y*ABS(X₂₃-1)'' | ''Y*ABS(X₂₃-1)'' | The expression doesn't match because ''X-1'' could be <0 for 0<x<1 | | ||

+ | | ''Y*ABS%%((X₂₃-1)%%^2)'' | ''Y*(X₂₃-1)^2'' | The expression matches because ''(X-1)^2'' is known to be >=0 | | ||

+ | |||

+ | |||

---- | ---- |