@@ -57,6 +57,9 @@ bool RewriteStep::isInverseOf(const RewriteStep &other) const {
5757 case RewriteStep::Rule:
5858 return Arg == other.Arg ;
5959
60+ case RewriteStep::Relation:
61+ return Arg == other.Arg ;
62+
6063 default :
6164 return false ;
6265 }
@@ -67,8 +70,7 @@ bool RewriteStep::isInverseOf(const RewriteStep &other) const {
6770
6871bool RewriteStep::maybeSwapRewriteSteps (RewriteStep &other,
6972 const RewriteSystem &system) {
70- if (Kind != RewriteStep::Rule ||
71- other.Kind != RewriteStep::Rule)
73+ if (Kind != other.Kind )
7274 return false ;
7375
7476 // Two rewrite steps are _orthogonal_ if they rewrite disjoint subterms
@@ -122,22 +124,43 @@ bool RewriteStep::maybeSwapRewriteSteps(RewriteStep &other,
122124 // other.StartOffset = |A|+|V|+|B|
123125 // other.EndOffset = |C|
124126
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 ());
128131
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 ());
132135
133- if (StartOffset < other.StartOffset + otherLHS.size ())
134- return false ;
136+ if (StartOffset < other.StartOffset + otherLHS.size ())
137+ return false ;
135138
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 ());
139142
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 ;
141164}
142165
143166// / Cancels out adjacent rewrite steps that are inverses of each other.
0 commit comments