1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
Copyright 2024 Erwan Mahe (github.com/erwanM974)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
use crate;
/**
Something that can simplify a term which root is a unary operator.
**/
/**
* This can be used to simplify a term which has a unary operator at its root.
* Two examples below.
*
* (1) If op and op' are two unary operators and if there exists
* an op'' such that for any x, op(op'(x)) is equivalent to op''(x)
* then we may rewrite :
* op(op'(x)) -> op''(x)
*
* A typical example of that is the power operation on real numbers:
* we have, for any reals y and z:
* - denoting the operator x->x^y as F
* - denoting the operator x->x^z as G
* - denoting the operator x->x^(y+z) as H
*
* We have, for any real x G(F(x)) = H(x) so we may perform the rewrite operation:
* G(F(x)) -> H(x)
* which is semantically correct
*
* (2) If c is a constant (operator with arity 0) and it is a fixpoint for a unary operator op
* then we may rewrite :
* - op(c) -> c
*
* A typical example of that is fixpoints for unary operators, for example:
* - for any real x, 1^x = 1
**/
pub