diff --git a/reactor/.idea/copyright/profiles_settings.xml b/reactor/.idea/copyright/profiles_settings.xml
index a2c74e8e..4c0f48ac 100644
--- a/reactor/.idea/copyright/profiles_settings.xml
+++ b/reactor/.idea/copyright/profiles_settings.xml
@@ -1,5 +1,3 @@
-
-
-
+
\ No newline at end of file
diff --git a/reactor/code/src/jetbrains/mps/unification/Node.java b/reactor/code/src/jetbrains/mps/unification/Node.java
index a676d434..a878d1b7 100644
--- a/reactor/code/src/jetbrains/mps/unification/Node.java
+++ b/reactor/code/src/jetbrains/mps/unification/Node.java
@@ -24,4 +24,11 @@ package jetbrains.mps.unification;
*/
public interface Node {
+ boolean isTerm();
+
+ Term term();
+
+ boolean isVar();
+
+ Var var();
}
diff --git a/reactor/code/src/jetbrains/mps/unification/Term.java b/reactor/code/src/jetbrains/mps/unification/Term.java
index 1c95f0fd..e727eb1f 100644
--- a/reactor/code/src/jetbrains/mps/unification/Term.java
+++ b/reactor/code/src/jetbrains/mps/unification/Term.java
@@ -27,6 +27,6 @@ public interface Term extends Node {
Object symbol();
- Collection children();
+ Collection extends Node> children();
}
diff --git a/reactor/code/src/jetbrains/mps/unification/Unification.java b/reactor/code/src/jetbrains/mps/unification/Unification.java
index 6de3ebea..fa92dfd7 100644
--- a/reactor/code/src/jetbrains/mps/unification/Unification.java
+++ b/reactor/code/src/jetbrains/mps/unification/Unification.java
@@ -56,11 +56,11 @@ public class Unification {
Node zs = getSchema(s);
Node zt = getSchema(t);
- if (zs instanceof Term && zt instanceof Term) {
- if (eq(((Term)zs).symbol(), ((Term)zt).symbol())) {
+ if (zs.isTerm() && zt.isTerm()) {
+ if (eq(zs.term().symbol(), zt.term().symbol())) {
union(s, t);
- Iterator scit = ((Term) zs).children().iterator();
- Iterator tcit = ((Term) zt).children().iterator();
+ Iterator extends Node> scit = zs.term().children().iterator();
+ Iterator extends Node> tcit = zt.term().children().iterator();
while(scit.hasNext() && tcit.hasNext()) {
if (!unifClosure(scit.next(), tcit.next())) return false;
}
@@ -83,9 +83,9 @@ public class Unification {
union(t, s);
return;
}
- if (ssize == tsize && s instanceof Var && t instanceof Var) {
+ if (ssize == tsize && s.isVar() && t.isVar()) {
// ensure proper order of variables in the substitution
- if(((Var)s).compareTo((Var)t) < 0) {
+ if(s.var().compareTo(t.var()) < 0) {
union(t, s);
return;
}
@@ -95,7 +95,7 @@ public class Unification {
setSize(s, ssize + tsize);
appendVars(s, getVars(t));
- if (getSchema(s) instanceof Var) {
+ if (getSchema(s).isVar()) {
setSchema(s, getSchema(t));
}
setRepresentative(t, s);
@@ -130,10 +130,10 @@ public class Unification {
if (isAcyclic(z)) return substitution; // not part of a cycle
if (isVisited(z)) return FAILED_SUBSTITUTION; // there exists a cycle
- if (z instanceof Term) {
+ if (z.isTerm()) {
setVisited(z, true);
- for (Node c : ((Term) z).children()) {
+ for (Node c : z.term().children()) {
substitution = findSolution(c, substitution);
if (!substitution.isSuccessful()) return substitution;
}
@@ -182,7 +182,7 @@ public class Unification {
private List getVars(Node n) {
if (!hasData(n)) {
- return n instanceof Term ? Collections.emptyList() : Collections.singletonList((Var) n);
+ return n.isTerm() ? Collections.emptyList() : Collections.singletonList(n.var());
}
return getData(n).myVars;
}
@@ -237,7 +237,7 @@ public class Unification {
Data(Node n) {
myClass = n;
mySchema = n;
- myVars = n instanceof Term ? Collections.emptyList() : Collections.singletonList((Var) n);
+ myVars = n.isTerm() ? Collections.emptyList() : Collections.singletonList(n.var());
}
}
}
diff --git a/reactor/tests/src/jetbrains/mps/unification/MockNode.java b/reactor/tests/src/jetbrains/mps/unification/MockNode.java
index cc5b966b..82e1ad34 100644
--- a/reactor/tests/src/jetbrains/mps/unification/MockNode.java
+++ b/reactor/tests/src/jetbrains/mps/unification/MockNode.java
@@ -43,6 +43,26 @@ public abstract class MockNode implements Node {
this.myChildren = Arrays.asList(children);
}
+ @Override
+ public boolean isTerm() {
+ return true;
+ }
+
+ @Override
+ public boolean isVar() {
+ return false;
+ }
+
+ @Override
+ public Term term() {
+ return this;
+ }
+
+ @Override
+ public Var var() {
+ throw new IllegalStateException();
+ }
+
@Override
public Object symbol() {
return mySymbol;
@@ -93,6 +113,26 @@ public abstract class MockNode implements Node {
return myName;
}
+ @Override
+ public boolean isTerm() {
+ return false;
+ }
+
+ @Override
+ public boolean isVar() {
+ return true;
+ }
+
+ @Override
+ public Term term() {
+ throw new IllegalStateException();
+ }
+
+ @Override
+ public Var var() {
+ return this;
+ }
+
@Override
public String toString() {
return String.valueOf(myName);