@@ -57,6 +57,9 @@ bool RewriteStep::isInverseOf(const RewriteStep &other) const {
57
57
case RewriteStep::Rule:
58
58
return Arg == other.Arg ;
59
59
60
+ case RewriteStep::Relation:
61
+ return Arg == other.Arg ;
62
+
60
63
default :
61
64
return false ;
62
65
}
@@ -67,8 +70,7 @@ bool RewriteStep::isInverseOf(const RewriteStep &other) const {
67
70
68
71
bool RewriteStep::maybeSwapRewriteSteps (RewriteStep &other,
69
72
const RewriteSystem &system) {
70
- if (Kind != RewriteStep::Rule ||
71
- other.Kind != RewriteStep::Rule)
73
+ if (Kind != other.Kind )
72
74
return false ;
73
75
74
76
// Two rewrite steps are _orthogonal_ if they rewrite disjoint subterms
@@ -122,22 +124,43 @@ bool RewriteStep::maybeSwapRewriteSteps(RewriteStep &other,
122
124
// other.StartOffset = |A|+|V|+|B|
123
125
// other.EndOffset = |C|
124
126
125
- const auto &rule = system.getRule (Arg);
126
- auto lhs = (Inverse ? rule.getRHS () : rule.getLHS ());
127
- auto rhs = (Inverse ? rule.getLHS () : rule.getRHS ());
127
+ if (Kind == RewriteStep::Rule) {
128
+ const auto &rule = system.getRule (Arg);
129
+ auto lhs = (Inverse ? rule.getRHS () : rule.getLHS ());
130
+ auto rhs = (Inverse ? rule.getLHS () : rule.getRHS ());
128
131
129
- const auto &otherRule = system.getRule (other.Arg );
130
- auto otherLHS = (other.Inverse ? otherRule.getRHS () : otherRule.getLHS ());
131
- auto otherRHS = (other.Inverse ? otherRule.getLHS () : otherRule.getRHS ());
132
+ const auto &otherRule = system.getRule (other.Arg );
133
+ auto otherLHS = (other.Inverse ? otherRule.getRHS () : otherRule.getLHS ());
134
+ auto otherRHS = (other.Inverse ? otherRule.getLHS () : otherRule.getRHS ());
132
135
133
- if (StartOffset < other.StartOffset + otherLHS.size ())
134
- return false ;
136
+ if (StartOffset < other.StartOffset + otherLHS.size ())
137
+ return false ;
135
138
136
- std::swap (*this , other);
137
- EndOffset += (lhs.size () - rhs.size ());
138
- other.StartOffset += (otherRHS.size () - otherLHS.size ());
139
+ std::swap (*this , other);
140
+ EndOffset += (lhs.size () - rhs.size ());
141
+ other.StartOffset += (otherRHS.size () - otherLHS.size ());
139
142
140
- return true ;
143
+ return true ;
144
+ } else if (Kind == RewriteStep::Relation) {
145
+ const auto &relation = system.getRelation (Arg);
146
+ auto lhs = (Inverse ? relation.second : relation.first );
147
+ auto rhs = (Inverse ? relation.first : relation.second );
148
+
149
+ const auto &otherRelation = system.getRelation (other.Arg );
150
+ auto otherLHS = (other.Inverse ? otherRelation.second : otherRelation.first );
151
+ auto otherRHS = (other.Inverse ? otherRelation.first : otherRelation.second );
152
+
153
+ if (StartOffset < other.StartOffset + otherLHS.size ())
154
+ return false ;
155
+
156
+ std::swap (*this , other);
157
+ EndOffset += (lhs.size () - rhs.size ());
158
+ other.StartOffset += (otherRHS.size () - otherLHS.size ());
159
+
160
+ return true ;
161
+ }
162
+
163
+ return false ;
141
164
}
142
165
143
166
// / Cancels out adjacent rewrite steps that are inverses of each other.
0 commit comments