From 8d8b6ab81762a0e90a8be24f66a65944f6e10034 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Wed, 11 Jun 2014 18:21:31 +0200 Subject: [PATCH 001/190] Initial commit --- reactor/.idea/.name | 1 + reactor/.idea/compiler.xml | 23 ++ reactor/.idea/copyright/JetBrains.xml | 9 + reactor/.idea/copyright/profiles_settings.xml | 5 + reactor/.idea/encodings.xml | 5 + reactor/.idea/libraries/junit_junit_4_11.xml | 11 + reactor/.idea/misc.xml | 28 ++ reactor/.idea/modules.xml | 10 + reactor/.idea/scopes/scope_settings.xml | 5 + reactor/.idea/vcs.xml | 7 + reactor/code/code.iml | 12 + .../src/jetbrains/mps/unification/Node.java | 27 ++ .../mps/unification/Substitution.java | 52 +++ .../src/jetbrains/mps/unification/Term.java | 32 ++ .../mps/unification/Unification.java | 314 ++++++++++++++++++ .../src/jetbrains/mps/unification/Var.java | 28 ++ reactor/doc/allclasses-frame.html | 41 +++ reactor/doc/allclasses-noframe.html | 41 +++ reactor/doc/constant-values.html | 44 +++ reactor/doc/deprecated-list.html | 44 +++ reactor/doc/help-doc.html | 101 ++++++ reactor/doc/index.html | 70 ++++ .../doc/jetbrains/mps/unification/Node.html | 62 ++++ .../mps/unification/Substitution.Binding.html | 162 +++++++++ .../mps/unification/Substitution.html | 133 ++++++++ .../doc/jetbrains/mps/unification/Term.html | 124 +++++++ .../mps/unification/Unification.html | 154 +++++++++ .../doc/jetbrains/mps/unification/Var.html | 111 +++++++ .../mps/unification/package-frame.html | 51 +++ .../mps/unification/package-summary.html | 87 +++++ reactor/doc/package-list | 1 + reactor/doc/resources/inherit.gif | Bin 0 -> 57 bytes reactor/doc/stylesheet.css | 29 ++ reactor/lib/hamcrest-core-1.3.jar | Bin 0 -> 45024 bytes reactor/lib/junit-4.11.jar | Bin 0 -> 245039 bytes .../mps/unification/AssertUnification.java | 81 +++++ .../jetbrains/mps/unification/MockNode.java | 116 +++++++ .../mps/unification/MockTreeParser.java | 188 +++++++++++ .../mps/unification/ParserTests.java | 120 +++++++ .../mps/unification/SolverTests.java | 158 +++++++++ reactor/tests/tests.iml | 14 + 41 files changed, 2501 insertions(+) create mode 100644 reactor/.idea/.name create mode 100644 reactor/.idea/compiler.xml create mode 100644 reactor/.idea/copyright/JetBrains.xml create mode 100644 reactor/.idea/copyright/profiles_settings.xml create mode 100644 reactor/.idea/encodings.xml create mode 100644 reactor/.idea/libraries/junit_junit_4_11.xml create mode 100644 reactor/.idea/misc.xml create mode 100644 reactor/.idea/modules.xml create mode 100644 reactor/.idea/scopes/scope_settings.xml create mode 100644 reactor/.idea/vcs.xml create mode 100644 reactor/code/code.iml create mode 100644 reactor/code/src/jetbrains/mps/unification/Node.java create mode 100644 reactor/code/src/jetbrains/mps/unification/Substitution.java create mode 100644 reactor/code/src/jetbrains/mps/unification/Term.java create mode 100644 reactor/code/src/jetbrains/mps/unification/Unification.java create mode 100644 reactor/code/src/jetbrains/mps/unification/Var.java create mode 100644 reactor/doc/allclasses-frame.html create mode 100644 reactor/doc/allclasses-noframe.html create mode 100644 reactor/doc/constant-values.html create mode 100644 reactor/doc/deprecated-list.html create mode 100644 reactor/doc/help-doc.html create mode 100644 reactor/doc/index.html create mode 100644 reactor/doc/jetbrains/mps/unification/Node.html create mode 100644 reactor/doc/jetbrains/mps/unification/Substitution.Binding.html create mode 100644 reactor/doc/jetbrains/mps/unification/Substitution.html create mode 100644 reactor/doc/jetbrains/mps/unification/Term.html create mode 100644 reactor/doc/jetbrains/mps/unification/Unification.html create mode 100644 reactor/doc/jetbrains/mps/unification/Var.html create mode 100644 reactor/doc/jetbrains/mps/unification/package-frame.html create mode 100644 reactor/doc/jetbrains/mps/unification/package-summary.html create mode 100644 reactor/doc/package-list create mode 100644 reactor/doc/resources/inherit.gif create mode 100644 reactor/doc/stylesheet.css create mode 100644 reactor/lib/hamcrest-core-1.3.jar create mode 100644 reactor/lib/junit-4.11.jar create mode 100644 reactor/tests/src/jetbrains/mps/unification/AssertUnification.java create mode 100644 reactor/tests/src/jetbrains/mps/unification/MockNode.java create mode 100644 reactor/tests/src/jetbrains/mps/unification/MockTreeParser.java create mode 100644 reactor/tests/src/jetbrains/mps/unification/ParserTests.java create mode 100644 reactor/tests/src/jetbrains/mps/unification/SolverTests.java create mode 100644 reactor/tests/tests.iml diff --git a/reactor/.idea/.name b/reactor/.idea/.name new file mode 100644 index 00000000..13400552 --- /dev/null +++ b/reactor/.idea/.name @@ -0,0 +1 @@ +unification \ No newline at end of file diff --git a/reactor/.idea/compiler.xml b/reactor/.idea/compiler.xml new file mode 100644 index 00000000..217af471 --- /dev/null +++ b/reactor/.idea/compiler.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/reactor/.idea/copyright/JetBrains.xml b/reactor/.idea/copyright/JetBrains.xml new file mode 100644 index 00000000..361c3c6b --- /dev/null +++ b/reactor/.idea/copyright/JetBrains.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/reactor/.idea/copyright/profiles_settings.xml b/reactor/.idea/copyright/profiles_settings.xml new file mode 100644 index 00000000..a2c74e8e --- /dev/null +++ b/reactor/.idea/copyright/profiles_settings.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/reactor/.idea/encodings.xml b/reactor/.idea/encodings.xml new file mode 100644 index 00000000..e206d70d --- /dev/null +++ b/reactor/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/reactor/.idea/libraries/junit_junit_4_11.xml b/reactor/.idea/libraries/junit_junit_4_11.xml new file mode 100644 index 00000000..c4657f5f --- /dev/null +++ b/reactor/.idea/libraries/junit_junit_4_11.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/reactor/.idea/misc.xml b/reactor/.idea/misc.xml new file mode 100644 index 00000000..49cd2039 --- /dev/null +++ b/reactor/.idea/misc.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/reactor/.idea/modules.xml b/reactor/.idea/modules.xml new file mode 100644 index 00000000..a09fee9d --- /dev/null +++ b/reactor/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/reactor/.idea/scopes/scope_settings.xml b/reactor/.idea/scopes/scope_settings.xml new file mode 100644 index 00000000..922003b8 --- /dev/null +++ b/reactor/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/reactor/.idea/vcs.xml b/reactor/.idea/vcs.xml new file mode 100644 index 00000000..c80f2198 --- /dev/null +++ b/reactor/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/reactor/code/code.iml b/reactor/code/code.iml new file mode 100644 index 00000000..d5c07432 --- /dev/null +++ b/reactor/code/code.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/reactor/code/src/jetbrains/mps/unification/Node.java b/reactor/code/src/jetbrains/mps/unification/Node.java new file mode 100644 index 00000000..a676d434 --- /dev/null +++ b/reactor/code/src/jetbrains/mps/unification/Node.java @@ -0,0 +1,27 @@ +/* + * Copyright 2014 JetBrains s.r.o. + * + * 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. + */ + +package jetbrains.mps.unification; + +/** + * Represents a node in a term DAG. A node can be either a an instance of + * {@link Term} or {@link Var}. + * + * @author Fedor Isakov + */ +public interface Node { + +} diff --git a/reactor/code/src/jetbrains/mps/unification/Substitution.java b/reactor/code/src/jetbrains/mps/unification/Substitution.java new file mode 100644 index 00000000..c417be3e --- /dev/null +++ b/reactor/code/src/jetbrains/mps/unification/Substitution.java @@ -0,0 +1,52 @@ +/* + * Copyright 2014 JetBrains s.r.o. + * + * 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. + */ + +package jetbrains.mps.unification; + +import java.util.Collection; +import java.util.Collections; + +/** + * The result of unification, either successful or not. If successful, contains a read-only collection + * of {@link Binding} instances. + * + * @author Fedor Isakov + */ +public interface Substitution { + + boolean isSuccessful(); + + Collection bindings() ; + + class Binding { + private Var myVar; + private Node myNode; + + public Binding(Var myVar, Node myNode) { + this.myVar = myVar; + this.myNode = myNode; + } + + public Var var() { + return myVar; + } + + public Node term() { + return myNode; + } + } + +} diff --git a/reactor/code/src/jetbrains/mps/unification/Term.java b/reactor/code/src/jetbrains/mps/unification/Term.java new file mode 100644 index 00000000..1c95f0fd --- /dev/null +++ b/reactor/code/src/jetbrains/mps/unification/Term.java @@ -0,0 +1,32 @@ +/* + * Copyright 2014 JetBrains s.r.o. + * + * 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. + */ + +package jetbrains.mps.unification; + +import java.util.Collection; + +/** + * A term node. Has a symbol object and a read-only collection of children nodes. + * + * @author Fedor Isakov + */ +public interface Term extends Node { + + Object symbol(); + + Collection children(); + +} diff --git a/reactor/code/src/jetbrains/mps/unification/Unification.java b/reactor/code/src/jetbrains/mps/unification/Unification.java new file mode 100644 index 00000000..6de3ebea --- /dev/null +++ b/reactor/code/src/jetbrains/mps/unification/Unification.java @@ -0,0 +1,314 @@ +/* + * Copyright 2014 JetBrains s.r.o. + * + * 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. + */ + +package jetbrains.mps.unification; + +import java.util.*; + +/** + * This is an implementation of the "near linear" algorithm for solving syntactic unification + * as described in the paper linked below.1 No recursive terms are allowed, meaning the "occurrs check" + * is performed on the input. If successful, the returned {@link Substitution} contains + * the variable bindings. + *

+ * The variables are sorted using {@link java.lang.Comparable} to ensure uniqueness of bindings + * whereas the substituted term is also a variable. + *

+ *

+ * 1. Baader, Franz, and Wayne Snyder. "Unification Theory." Handbook of automated reasoning 1 (2001): 445-532. + *
+ * + * @author Fedor Isakov + */ +public class Unification { + + public static Substitution unify(Node a, Node b) { + DagUnifier dagUnifier = new DagUnifier(); + + if (!dagUnifier.unifClosure(a, b)) return FAILED_SUBSTITUTION; + + return dagUnifier.findSolution(a); + } + + private static class DagUnifier { + + private Map myData = new HashMap(); + + private boolean unifClosure(Node s, Node t) { + s = find(s); + t = find(t); + + if (s == t) return true; + + Node zs = getSchema(s); + Node zt = getSchema(t); + + if (zs instanceof Term && zt instanceof Term) { + if (eq(((Term)zs).symbol(), ((Term)zt).symbol())) { + union(s, t); + Iterator scit = ((Term) zs).children().iterator(); + Iterator tcit = ((Term) zt).children().iterator(); + while(scit.hasNext() && tcit.hasNext()) { + if (!unifClosure(scit.next(), tcit.next())) return false; + } + } + else { + return false; // symbol clash + } + } + else { + union(s, t); + } + + return true; + } + + private void union(Node s, Node t) { + Integer ssize = getSize(s); + Integer tsize = getSize(t); + if (ssize < tsize) { + union(t, s); + return; + } + if (ssize == tsize && s instanceof Var && t instanceof Var) { + // ensure proper order of variables in the substitution + if(((Var)s).compareTo((Var)t) < 0) { + union(t, s); + return; + } + } + + // union s and t classes by moving t under s + + setSize(s, ssize + tsize); + appendVars(s, getVars(t)); + if (getSchema(s) instanceof Var) { + setSchema(s, getSchema(t)); + } + setRepresentative(t, s); + } + + private Node find(Node s) { + Node node = getRepresentative(s); + if (node == s) return s; + + // find representative and compress paths + + List path = new ArrayList(); + path.add(node); + for (Node t; (t = getRepresentative(node)) != node; ) { + path.add(t); + node = t; + } + for (Node p : path) { + setRepresentative(p, node); + } + + return node; + } + + private Substitution findSolution(Node s) { + return findSolution(s, EMPTY_SUBSTITUTION); + } + + private Substitution findSolution(Node s, Substitution substitution) { + Node z = getSchema(find(s)); + + if (isAcyclic(z)) return substitution; // not part of a cycle + if (isVisited(z)) return FAILED_SUBSTITUTION; // there exists a cycle + + if (z instanceof Term) { + setVisited(z, true); + + for (Node c : ((Term) z).children()) { + substitution = findSolution(c, substitution); + if (!substitution.isSuccessful()) return substitution; + } + + setVisited(z, false); + } + + setAcyclic(z, true); + + SuccessfulSubstitution success = new SuccessfulSubstitution(substitution); + for (Var var : getVars(find(z))) { + if (var != z) { + success.addBinding(var, z); + } + } + + return success; + } + + private int getSize(Node n) { + if (!hasData(n)) return 1; + return getData(n).mySize; + } + + private void setSize(Node n, int size) { + getData(n).mySize = size; + } + + private Node getRepresentative(Node n) { + if (!hasData(n)) return n; + return getData(n).myClass; + } + + private void setRepresentative(Node n, Node rep) { + getData(n).myClass = rep; + } + + private Node getSchema(Node n) { + if (!hasData(n)) return n; + return getData(n).mySchema; + } + + private void setSchema(Node n, Node schema) { + getData(n).mySchema = schema; + } + + private List getVars(Node n) { + if (!hasData(n)) { + return n instanceof Term ? Collections.emptyList() : Collections.singletonList((Var) n); + } + return getData(n).myVars; + } + + private void appendVars(Node n, List vars) { + List newVars = new ArrayList(getVars(n)); + newVars.addAll(vars); + getData(n).myVars = newVars; + } + + private boolean isAcyclic(Node n) { + if (!hasData(n)) return false; + return getData(n).myAcyclic; + } + + private void setAcyclic(Node n, boolean acyclic) { + getData(n).myAcyclic = acyclic; + } + + private boolean isVisited(Node n) { + if (!hasData(n)) return false; + return getData(n).myVisited; + } + + private void setVisited(Node n, boolean visited) { + getData(n).myVisited = visited; + } + + private boolean hasData(Node n) { + return myData.containsKey(n); + } + + private Data getData(Node n) { + if (myData.containsKey(n)) return myData.get(n); + Data data = new Data(n); + myData.put(n, data); + return data; + } + + private boolean eq(Object a, Object b) { + return a == null ? b == null : a.equals(b); + } + + private static class Data { + int mySize = 1; + boolean myAcyclic = false; + boolean myVisited = false; + List myVars; + + Node myClass; + Node mySchema; + Data(Node n) { + myClass = n; + mySchema = n; + myVars = n instanceof Term ? Collections.emptyList() : Collections.singletonList((Var) n); + } + } + } + + private static final Substitution FAILED_SUBSTITUTION = new Substitution() { + @Override + public boolean isSuccessful() { + return false; + } + + @Override + public Collection bindings() { + return Collections.emptyList(); + } + + @Override + public String toString() { + return "[FAILED_SUBSTITUTION]"; + } + }; + + private static final Substitution EMPTY_SUBSTITUTION = new Substitution() { + @Override + public boolean isSuccessful() { + return true; + } + + @Override + public Collection bindings() { + return Collections.emptyList(); + } + + @Override + public String toString() { + return "[]"; + } + }; + + private static class SuccessfulSubstitution implements Substitution { + + private LinkedList myBindings; + + private SuccessfulSubstitution(Substitution substitution) { + this.myBindings = new LinkedList(substitution.bindings()); + } + + @Override + public boolean isSuccessful() { + return true; + } + + @Override + public Collection bindings() { + return Collections.unmodifiableCollection(myBindings); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("["); + String sep = ""; + for (Binding b : myBindings) { + sb.append(sep); sep = ", "; + sb.append(b.var()).append(" -> ").append(b.term()); + } + return sb.append("]").toString(); + } + + private void addBinding(Var v, Node n) { + myBindings.addFirst(new Binding(v, n)); + } + + } + +} diff --git a/reactor/code/src/jetbrains/mps/unification/Var.java b/reactor/code/src/jetbrains/mps/unification/Var.java new file mode 100644 index 00000000..8ef1514d --- /dev/null +++ b/reactor/code/src/jetbrains/mps/unification/Var.java @@ -0,0 +1,28 @@ +/* + * Copyright 2014 JetBrains s.r.o. + * + * 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. + */ + +package jetbrains.mps.unification; + +/** + * A variable node. Has a name and must implement {@link java.lang.Comparable}. + * + * @author Fedor Isakov + */ +public interface Var extends Node, Comparable { + + String name(); + +} diff --git a/reactor/doc/allclasses-frame.html b/reactor/doc/allclasses-frame.html new file mode 100644 index 00000000..222667e8 --- /dev/null +++ b/reactor/doc/allclasses-frame.html @@ -0,0 +1,41 @@ + + + + + + +All Classes + + + + + + + + + + + +All Classes +
+ + + + + +
Node +
+Substitution +
+Substitution.Binding +
+Term +
+Unification +
+Var +
+
+ + + diff --git a/reactor/doc/allclasses-noframe.html b/reactor/doc/allclasses-noframe.html new file mode 100644 index 00000000..54e68ca7 --- /dev/null +++ b/reactor/doc/allclasses-noframe.html @@ -0,0 +1,41 @@ + + + + + + +All Classes + + + + + + + + + + + +All Classes +
+ + + + + +
Node +
+Substitution +
+Substitution.Binding +
+Term +
+Unification +
+Var +
+
+ + + diff --git a/reactor/doc/constant-values.html b/reactor/doc/constant-values.html new file mode 100644 index 00000000..0c3c6aee --- /dev/null +++ b/reactor/doc/constant-values.html @@ -0,0 +1,44 @@ + + + + + + +Constant Field Values + + + + + + + + + + + + +
+ +
+
+

+Constant Field Values

+
+
+Contents
    +
+ +
+ +
+ + + diff --git a/reactor/doc/deprecated-list.html b/reactor/doc/deprecated-list.html new file mode 100644 index 00000000..aa8a66a7 --- /dev/null +++ b/reactor/doc/deprecated-list.html @@ -0,0 +1,44 @@ + + + + + + +Deprecated List + + + + + + + + + + + + +
+ +
+
+

+Deprecated API

+
+
+Contents
    +
+ +
+ +
+ + + diff --git a/reactor/doc/help-doc.html b/reactor/doc/help-doc.html new file mode 100644 index 00000000..0d45f41f --- /dev/null +++ b/reactor/doc/help-doc.html @@ -0,0 +1,101 @@ + + + + + + +API Help + + + + + + + + + + + + +
+ +
+
+

+How This API Document Is Organized

+
+This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.

+Package

+
+ +

+Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain four categories:

    +
  • Interfaces (italic)
  • Classes
  • Enums
  • Exceptions
  • Errors
  • Annotation Types
+
+

+Class/Interface

+
+ +

+Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    +
  • Class inheritance diagram
  • Direct Subclasses
  • All Known Subinterfaces
  • All Known Implementing Classes
  • Class/interface declaration
  • Class/interface description +

    +

  • Nested Class Summary
  • Field Summary
  • Constructor Summary
  • Method Summary +

    +

  • Field Detail
  • Constructor Detail
  • Method Detail
+Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
+ +

+Annotation Type

+
+ +

+Each annotation type has its own separate page with the following sections:

    +
  • Annotation Type declaration
  • Annotation Type description
  • Required Element Summary
  • Optional Element Summary
  • Element Detail
+
+ +

+Enum

+
+ +

+Each enum has its own separate page with the following sections:

    +
  • Enum declaration
  • Enum description
  • Enum Constant Summary
  • Enum Constant Detail
+
+

+Deprecated API

+
+The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.
+

+Prev/Next

+These links take you to the next or previous class, interface, package, or related page.

+Frames/No Frames

+These links show and hide the HTML frames. All pages are available with or without frames. +

+

+Serialized Form

+Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description. +

+

+Constant Field Values

+The Constant Field Values page lists the static final fields and their values. +

+ + +This help file applies to API documentation generated using the standard doclet. + +
+


+ +
+ + + diff --git a/reactor/doc/index.html b/reactor/doc/index.html new file mode 100644 index 00000000..4bc6c393 --- /dev/null +++ b/reactor/doc/index.html @@ -0,0 +1,70 @@ + + + + + + +Generated Documentation (Untitled) + + + + + + + + +<H2> +Frame Alert</H2> + +<P> +This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. +<BR> +Link to<A HREF="jetbrains/mps/unification/package-summary.html">Non-frame version.</A> + + + diff --git a/reactor/doc/jetbrains/mps/unification/Node.html b/reactor/doc/jetbrains/mps/unification/Node.html new file mode 100644 index 00000000..3bddae52 --- /dev/null +++ b/reactor/doc/jetbrains/mps/unification/Node.html @@ -0,0 +1,62 @@ + + + + + + +Node + + + + + + + + + + + + +
+ +
+ +

+ +jetbrains.mps.unification +
+Interface Node

+
+
All Known Subinterfaces:
Term, Var
+
+
+
+
public interface Node
+ + +

+Represents a node in a term DAG. A node can be either a an instance of + Term or Var. +

+ +

+


+ +

+ +

+ +


+ +
+ + + diff --git a/reactor/doc/jetbrains/mps/unification/Substitution.Binding.html b/reactor/doc/jetbrains/mps/unification/Substitution.Binding.html new file mode 100644 index 00000000..8a19ce15 --- /dev/null +++ b/reactor/doc/jetbrains/mps/unification/Substitution.Binding.html @@ -0,0 +1,162 @@ + + + + + + +Substitution.Binding + + + + + + + + + + + + +
+ +
+ +

+ +jetbrains.mps.unification +
+Class Substitution.Binding

+
+java.lang.Object
+  extended by jetbrains.mps.unification.Substitution.Binding
+
+
+
Enclosing interface:
Substitution
+
+
+
+
public static class Substitution.Binding
extends java.lang.Object
+ + +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
Substitution.Binding(Var myVar, + Node myNode) + +
+           
+  + + + + + + + + + + + + + + + +
+Method Summary
+ Nodeterm() + +
+           
+ Varvar() + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Substitution.Binding

+
+public Substitution.Binding(Var myVar,
+                            Node myNode)
+
+
+ + + + + + + + +
+Method Detail
+ +

+var

+
+public Var var()
+
+
+
+
+
+
+ +

+term

+
+public Node term()
+
+
+
+
+
+ +
+ +
+ + + diff --git a/reactor/doc/jetbrains/mps/unification/Substitution.html b/reactor/doc/jetbrains/mps/unification/Substitution.html new file mode 100644 index 00000000..57053348 --- /dev/null +++ b/reactor/doc/jetbrains/mps/unification/Substitution.html @@ -0,0 +1,133 @@ + + + + + + +Substitution + + + + + + + + + + + + +
+ +
+ +

+ +jetbrains.mps.unification +
+Interface Substitution

+
+
+
public interface Substitution
+ + +

+The result of unification, either successful or not. If successful, contains a read-only collection + of Substitution.Binding instances. +

+ +

+


+ +

+ + + + + + + + + + + +
+Nested Class Summary
+static classSubstitution.Binding + +
+           
+  + + + + + + + + + + + + + + + +
+Method Summary
+ java.util.Collection<Substitution.Binding>bindings() + +
+           
+ booleanisSuccessful() + +
+           
+  +

+ + + + + + + + +
+Method Detail
+ +

+isSuccessful

+
+boolean isSuccessful()
+
+
+
+
+
+
+ +

+bindings

+
+java.util.Collection<Substitution.Binding> bindings()
+
+
+
+
+
+ +
+ +
+ + + diff --git a/reactor/doc/jetbrains/mps/unification/Term.html b/reactor/doc/jetbrains/mps/unification/Term.html new file mode 100644 index 00000000..79900e9b --- /dev/null +++ b/reactor/doc/jetbrains/mps/unification/Term.html @@ -0,0 +1,124 @@ + + + + + + +Term + + + + + + + + + + + + +
+ +
+ +

+ +jetbrains.mps.unification +
+Interface Term

+
+
All Superinterfaces:
Node
+
+
+
+
public interface Term
extends Node
+ + +

+A term node. Has a symbol object and a read-only collection of children nodes. +

+ +

+


+ +

+ + + + + + + + + + + + + + + + +
+Method Summary
+ java.util.Collection<Node>children() + +
+           
+ java.lang.Objectsymbol() + +
+           
+  +

+ + + + + + + + +
+Method Detail
+ +

+symbol

+
+java.lang.Object symbol()
+
+
+
+
+
+
+
+
+
+ +

+children

+
+java.util.Collection<Node> children()
+
+
+
+
+
+
+
+
+ +
+ +
+ + + diff --git a/reactor/doc/jetbrains/mps/unification/Unification.html b/reactor/doc/jetbrains/mps/unification/Unification.html new file mode 100644 index 00000000..70d12022 --- /dev/null +++ b/reactor/doc/jetbrains/mps/unification/Unification.html @@ -0,0 +1,154 @@ + + + + + + +Unification + + + + + + + + + + + + +
+ +
+ +

+ +jetbrains.mps.unification +
+Class Unification

+
+java.lang.Object
+  extended by jetbrains.mps.unification.Unification
+
+
+
+
public class Unification
extends java.lang.Object
+ + +

+This is an implementation of the "near linear" algorithm for solving syntactic unification + as described in the paper linked below.1 No recursive terms are allowed, meaning the "occurrs check" + is performed on the input. If successful, the returned Substitution contains + the variable bindings. +

+ The variables are sorted using Comparable to ensure uniqueness of bindings + whereas the substituted term is also a variable. +

+

+ 1. Baader, Franz, and Wayne Snyder. "Unification Theory." Handbook of automated reasoning 1 (2001): 445-532. +
+

+ +

+


+ +

+ + + + + + + + + + + +
+Constructor Summary
Unification() + +
+           
+  + + + + + + + + + + + +
+Method Summary
+static Substitutionunify(Node a, + Node b) + +
+           
+ + + + + + + +
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+  +

+ + + + + + + + +
+Constructor Detail
+ +

+Unification

+
+public Unification()
+
+
+ + + + + + + + +
+Method Detail
+ +

+unify

+
+public static Substitution unify(Node a,
+                                 Node b)
+
+
+
+
+
+ +
+ +
+ + + diff --git a/reactor/doc/jetbrains/mps/unification/Var.html b/reactor/doc/jetbrains/mps/unification/Var.html new file mode 100644 index 00000000..a6c00c5c --- /dev/null +++ b/reactor/doc/jetbrains/mps/unification/Var.html @@ -0,0 +1,111 @@ + + + + + + +Var + + + + + + + + + + + + +
+ +
+ +

+ +jetbrains.mps.unification +
+Interface Var

+
+
All Superinterfaces:
java.lang.Comparable<Var>, Node
+
+
+
+
public interface Var
extends Node, java.lang.Comparable<Var>
+ + +

+A variable node. Has a name and must implement Comparable. +

+ +

+


+ +

+ + + + + + + + + + + + +
+Method Summary
+ java.lang.Stringname() + +
+           
+ + + + + + + +
Methods inherited from interface java.lang.Comparable
compareTo
+  +

+ + + + + + + + +
+Method Detail
+ +

+name

+
+java.lang.String name()
+
+
+
+
+
+
+
+
+ +
+ +
+ + + diff --git a/reactor/doc/jetbrains/mps/unification/package-frame.html b/reactor/doc/jetbrains/mps/unification/package-frame.html new file mode 100644 index 00000000..d23b40de --- /dev/null +++ b/reactor/doc/jetbrains/mps/unification/package-frame.html @@ -0,0 +1,51 @@ + + + + + + +jetbrains.mps.unification + + + + + + + + + + + +jetbrains.mps.unification + + + + +
+Interfaces  + +
+Node +
+Substitution +
+Term +
+Var
+ + + + + + +
+Classes  + +
+Substitution.Binding +
+Unification
+ + + + diff --git a/reactor/doc/jetbrains/mps/unification/package-summary.html b/reactor/doc/jetbrains/mps/unification/package-summary.html new file mode 100644 index 00000000..fe5e33e2 --- /dev/null +++ b/reactor/doc/jetbrains/mps/unification/package-summary.html @@ -0,0 +1,87 @@ + + + + + + +jetbrains.mps.unification + + + + + + + + + + + + +
+ +
+

+Package jetbrains.mps.unification +

+ + + + + + + + + + + + + + + + + + + + + +
+Interface Summary
NodeRepresents a node in a term DAG.
SubstitutionThe result of unification, either successful or not.
TermA term node.
VarA variable node.
+  + +

+ + + + + + + + + + + + + +
+Class Summary
Substitution.Binding 
UnificationThis is an implementation of the "near linear" algorithm for solving syntactic unification + as described in the paper linked below.1 No recursive terms are allowed, meaning the "occurrs check" + is performed on the input.
+  + +

+

+
+
+ +
+ + + diff --git a/reactor/doc/package-list b/reactor/doc/package-list new file mode 100644 index 00000000..ba7291d0 --- /dev/null +++ b/reactor/doc/package-list @@ -0,0 +1 @@ +jetbrains.mps.unification diff --git a/reactor/doc/resources/inherit.gif b/reactor/doc/resources/inherit.gif new file mode 100644 index 0000000000000000000000000000000000000000..c814867a13deb0ca7ea2156c6ca1d5a03372af7e GIT binary patch literal 57 zcmZ?wbhEHbIIT!9-C*e{wE9>Kx3D)-;0v)C; KYxQGgum%9JOA&7X literal 0 HcmV?d00001 diff --git a/reactor/doc/stylesheet.css b/reactor/doc/stylesheet.css new file mode 100644 index 00000000..6ea9e516 --- /dev/null +++ b/reactor/doc/stylesheet.css @@ -0,0 +1,29 @@ +/* Javadoc style sheet */ + +/* Define colors, fonts and other style attributes here to override the defaults */ + +/* Page background color */ +body { background-color: #FFFFFF; color:#000000 } + +/* Headings */ +h1 { font-size: 145% } + +/* Table colors */ +.TableHeadingColor { background: #CCCCFF; color:#000000 } /* Dark mauve */ +.TableSubHeadingColor { background: #EEEEFF; color:#000000 } /* Light mauve */ +.TableRowColor { background: #FFFFFF; color:#000000 } /* White */ + +/* Font used in left-hand frame lists */ +.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } +.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } +.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } + +/* Navigation bar fonts and colors */ +.NavBarCell1 { background-color:#EEEEFF; color:#000000} /* Light mauve */ +.NavBarCell1Rev { background-color:#00008B; color:#FFFFFF} /* Dark Blue */ +.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;color:#000000;} +.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;color:#FFFFFF;} + +.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} +.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} + diff --git a/reactor/lib/hamcrest-core-1.3.jar b/reactor/lib/hamcrest-core-1.3.jar new file mode 100644 index 0000000000000000000000000000000000000000..9d5fe16e3dd37ebe79a36f61f5d0e1a69a653a8a GIT binary patch literal 45024 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 UgpPtD2z>DYYp}SJr5?)v0beu;=l}o! literal 0 HcmV?d00001 diff --git a/reactor/lib/junit-4.11.jar b/reactor/lib/junit-4.11.jar new file mode 100644 index 0000000000000000000000000000000000000000..aaf74448492932e95902b40a70c7a4da5bad4744 GIT binary patch literal 245039 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

^K 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 Zm9-%!eZV646_hI`4?(783XX*6{{TREv-ki2 literal 0 HcmV?d00001 diff --git a/reactor/tests/src/jetbrains/mps/unification/AssertUnification.java b/reactor/tests/src/jetbrains/mps/unification/AssertUnification.java new file mode 100644 index 00000000..7eb18698 --- /dev/null +++ b/reactor/tests/src/jetbrains/mps/unification/AssertUnification.java @@ -0,0 +1,81 @@ +/* + * Copyright 2014 JetBrains s.r.o. + * + * 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. + */ + +package jetbrains.mps.unification; + +import jetbrains.mps.unification.Substitution; +import static jetbrains.mps.unification.Substitution.*; +import jetbrains.mps.unification.Unification; +import jetbrains.mps.unification.Node; +import jetbrains.mps.unification.Var; + +import java.util.*; + +import static org.junit.Assert.*; + + +/** + * Created by fyodor on 09.06.2014. + */ +public class AssertUnification { + + public static Binding bind(Var v, Node n) { + return new Binding(v, n); + } + + public static void assertSameBindings(Collection expected, Collection actual) throws Exception { + Iterator expIt = expected.iterator(); + Iterator actIt = actual.iterator(); + + Map expMap = new HashMap(); + Map actMap = new HashMap(); + + while(expIt.hasNext() && actIt.hasNext()) { + Binding expb = expIt.next(); + Binding actb = actIt.next(); + + expMap.put(expb.var(), expb.term()); + actMap.put(actb.var(), actb.term()); + } + + assertEquals(expMap, actMap); + + if(expIt.hasNext() || actIt.hasNext()) throw new Exception("mismatched number of bindings"); + } + + public static void assertUnifiesWithBindings(Node s, Node t, Substitution.Binding ... bindings) throws Exception{ + Substitution subs = Unification.unify(s, t); + + assertTrue(subs.isSuccessful()); + assertSameBindings( + Arrays.asList( + bindings + ), + subs.bindings()); + + Substitution subs2 = Unification.unify(t, s); + + assertTrue(subs2.isSuccessful()); + assertSameBindings(subs.bindings(), subs2.bindings()); + } + + public static void assertUnifificationFails(Node s, Node t) throws Exception { + Substitution subs = Unification.unify(s, t); + + assertFalse(subs.isSuccessful()); + } + +} \ No newline at end of file diff --git a/reactor/tests/src/jetbrains/mps/unification/MockNode.java b/reactor/tests/src/jetbrains/mps/unification/MockNode.java new file mode 100644 index 00000000..cc5b966b --- /dev/null +++ b/reactor/tests/src/jetbrains/mps/unification/MockNode.java @@ -0,0 +1,116 @@ +/* + * Copyright 2014 JetBrains s.r.o. + * + * 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. + */ + +package jetbrains.mps.unification; + +import java.util.*; + +/** + * Created by fyodor on 09.06.2014. + */ +public abstract class MockNode implements Node { + + public MockNode() { + } + + public static Term term(Object sym, Node ... children) { + return new MockTerm(sym, children); + } + + public static Var var(String name) { + return new MockVar(name); + } + + public static class MockTerm extends MockNode implements Term { + private List myChildren; + private Object mySymbol; + + public MockTerm(Object symbol, Node... children) { + mySymbol = symbol; + this.myChildren = Arrays.asList(children); + } + + @Override + public Object symbol() { + return mySymbol; + } + + @Override + public Collection children() { + return Collections.unmodifiableList(myChildren); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(String.valueOf(mySymbol)); + if (!myChildren.isEmpty()) { + sb.append("{"); + String sep = ""; + for (Node child : myChildren) { + sb.append(sep); sep = " "; + sb.append(child.toString()); + } + sb.append("}"); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int hash = 43 + mySymbol.hashCode(); + return hash*19 + myChildren.hashCode(); + } + + @Override + public boolean equals(Object o) { + return ((MockTerm)o).mySymbol.equals(mySymbol) && + ((MockTerm)o).myChildren.equals(myChildren); + } + } + + public static class MockVar extends MockNode implements Var { + private String myName; + + public MockVar(String name) { + myName = name; + } + + @Override + public String name() { + return myName; + } + + @Override + public String toString() { + return String.valueOf(myName); + } + + @Override + public int hashCode() { + return 43 + myName.hashCode(); + } + + @Override + public boolean equals(Object o) { + return ((MockVar)o).myName.equals(myName); + } + + @Override + public int compareTo(Var var) { + return ((String)myName).compareTo((String)((MockVar)var).myName); + } + } +} diff --git a/reactor/tests/src/jetbrains/mps/unification/MockTreeParser.java b/reactor/tests/src/jetbrains/mps/unification/MockTreeParser.java new file mode 100644 index 00000000..8b37027d --- /dev/null +++ b/reactor/tests/src/jetbrains/mps/unification/MockTreeParser.java @@ -0,0 +1,188 @@ +/* + * Copyright 2014 JetBrains s.r.o. + * + * 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. + */ + +package jetbrains.mps.unification; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static jetbrains.mps.unification.MockNode.*; + +/** + * Created by fyodor on 10.06.2014. + */ +public class MockTreeParser { + + public static Node parse(String str) { + return new RecursiveDescent().parse(str); + } + + public static Term parseTerm(String str) { + return (Term) new RecursiveDescent().parse(str); + } + + public static Var parseVar(String str) { + return (Var) new RecursiveDescent().parse(str); + } + + private static class RecursiveDescent { + + private Token lastToken; + private LinkedList termsStack = new LinkedList(); + private LinkedList> childrenStack = new LinkedList>(); + + private Node parse(String toParse) { + parseNextToken(Token.START, null); + loop(toParse); + parseNextToken(Token.END, null); + checkFinalState(); + return childrenStack.pop().get(0); + } + + private void loop(String toParse) { + Matcher matcher = null; + do { + for (Token token: Token.values()) { + if (token.pattern == null) continue; + + if ((matcher = token.pattern.matcher(toParse)).lookingAt()) { + parseNextToken(token, matcher.group()); + toParse = toParse.substring(matcher.end()); + break; + } + } + // see if the last matching succeeded + assert matcher != null; + if (!matcher.lookingAt() && !matcher.hitEnd()) { + throw new ParseException("unexpected input"); + } + } while (!matcher.hitEnd()); + } + + private void parseNextToken(Token token, String value) { + switch (token) { + case START: + childrenStack.push(new ArrayList()); + break; + case END: + checkLastTokenOneOf(Token.TERM, Token.VAR, Token.RBRACE); + if (lastToken == Token.TERM) { + emptyTerm(); + } + break; + case TERM: + if (lastToken == Token.TERM) { + emptyTerm(); + } + beginTerm(value); + break; + case VAR: + if (lastToken == Token.TERM) { + emptyTerm(); + } + addVar(value); + break; + case LBRACE: + checkLastTokenOneOf(Token.TERM); + beginChildren(); + break; + case RBRACE: + checkLastTokenOneOf(Token.TERM, Token.VAR, Token.RBRACE); + if (lastToken == Token.TERM) { + emptyTerm(); + } + checkCloseBraceState(); + endChildren(); + break; + case WHITESPACE: + return; // ignore + } + this.lastToken = token; + } + + private void checkLastTokenOneOf(Token ... tokens) { + for (Token token : tokens) { + if (token == lastToken) return; + } + throw new ParseException("parse error"); + } + + private void checkFinalState() { + if (childrenStack.size() != 1 || childrenStack.peek().isEmpty() || !termsStack.isEmpty()) { + throw new ParseException("unexpected end of input"); + } + } + + private void checkCloseBraceState() { + if (childrenStack.isEmpty() || childrenStack.peek().isEmpty() || termsStack.isEmpty()) { + throw new ParseException("unexpected closing brace"); + } + } + + private void beginTerm(String name) { + termsStack.push(name); + } + + private void emptyTerm() { + String term = termsStack.pop(); + childrenStack.peek().add(term(term)); + } + + private void beginChildren(){ + childrenStack.push(new ArrayList()); + } + + private void endChildren() { + String term = termsStack.pop(); + List children = childrenStack.pop(); + childrenStack.peek().add(term(term, children.toArray(new Node[children.size()]))); + } + + private void addVar(String name) { + childrenStack.peek().add(var(name)); + } + } + + private static enum Token { + START(null), + END(null), + TERM(Pattern.compile("[a-z][a-zA-Z0-9_]*")), + VAR(Pattern.compile("[A-Z][a-zA-Z0-9_]*")), + LBRACE(Pattern.compile("\\{")), + RBRACE(Pattern.compile("\\}")), + WHITESPACE(Pattern.compile("\\s+")); + + private Pattern pattern; + + Token(Pattern pattern) { + this.pattern = pattern; + } + } + + public static class ParseException extends RuntimeException { + private ParseException(String s) { + super(s); + } + } +} + + + + + diff --git a/reactor/tests/src/jetbrains/mps/unification/ParserTests.java b/reactor/tests/src/jetbrains/mps/unification/ParserTests.java new file mode 100644 index 00000000..3a8a1c6e --- /dev/null +++ b/reactor/tests/src/jetbrains/mps/unification/ParserTests.java @@ -0,0 +1,120 @@ +/* + * Copyright 2014 JetBrains s.r.o. + * + * 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. + */ + +package jetbrains.mps.unification; + +import org.junit.Test; + +import static org.junit.Assert.*; + +import static jetbrains.mps.unification.MockNode.*; +import static jetbrains.mps.unification.MockTreeParser.*; +/** + * Created by fyodor on 10.06.2014. + */ +public class ParserTests { + + @Test + public void testNormal() { + assertEquals(parse("a"), term("a")); + assertEquals(parseTerm("a").symbol(), term("a").symbol()); + assertEquals(parseVar("X").name(), var("X").name()); + assertEquals(parse("a b"), term("a")); + assertEquals(parse("X b"), var("X")); + assertEquals(parse("a{b}"), term("a", term("b"))); + assertEquals(parseTerm("a{b}").symbol(), term("a", term("b")).symbol()); + assertEquals(parse("a{b c}"), term("a", term("b"), term("c"))); + assertEquals(parse("a{b X}"), term("a", term("b"), var("X"))); + assertEquals(parse("a{X b}"), term("a", var("X"), term("b"))); + assertEquals(parse("a{X Y}"), term("a", var("X"), var("Y"))); + } + + @Test + public void testWhitespace() { + assertEquals(parse(" a"), term("a")); + assertEquals(parse(" a b"), term("a")); + assertEquals(parse(" a Y"), term("a")); + assertEquals(parse(" Y b"), var("Y")); + assertEquals(parse("a{ b }"), term("a", term("b"))); + assertEquals(parse("a{ b c }"), term("a", term("b"), term("c"))); + assertEquals(parse("a{b X} "), term("a", term("b"), var("X"))); + assertEquals(parse("a {X b}"), term("a", var("X"), term("b"))); + assertEquals(parse(" a{X Y } "), term("a", var("X"), var("Y"))); + } + + @Test + public void testDeep() { + assertEquals(parse("a{b{c{d{e f g}}}}"), + term("a", + term("b", + term("c", + term("d", + term("e"), term("f"), term("g")))))); + + assertEquals(parse("a{X b{c{d{Z e W f g} Y}}}"), + term("a", + var("X"), term("b", + term("c", + term("d", + var("Z"), term("e"), var("W"), term("f"), term("g")), + var("Y"))))); + } + + @Test(expected = MockTreeParser.ParseException.class) + public void testEmptyFail() { + parse(""); + } + + @Test(expected = MockTreeParser.ParseException.class) + public void testEmptyChildrenFail() { + parse("a{}"); + } + + @Test(expected = MockTreeParser.ParseException.class) + public void testUclosedFail() { + parse("a{b "); + } + + @Test(expected = MockTreeParser.ParseException.class) + public void testUclosedFail2() { + parse("a{X b"); + } + + @Test(expected = MockTreeParser.ParseException.class) + public void testUclosedFail3() { + parse("a{{X b}"); + } + + @Test(expected = MockTreeParser.ParseException.class) + public void testDoubleClosed() { + parse("a{X b}}"); + } + + @Test(expected = MockTreeParser.ParseException.class) + public void testWrongStartFail() { + parse("{a}"); + } + + @Test(expected = MockTreeParser.ParseException.class) + public void testVarHasChilrenFail() { + parse("X{a}"); + } + + @Test(expected = MockTreeParser.ParseException.class) + public void testExtraSymbolFail() { + parse("a}"); + } +} diff --git a/reactor/tests/src/jetbrains/mps/unification/SolverTests.java b/reactor/tests/src/jetbrains/mps/unification/SolverTests.java new file mode 100644 index 00000000..91bb30ce --- /dev/null +++ b/reactor/tests/src/jetbrains/mps/unification/SolverTests.java @@ -0,0 +1,158 @@ +/* + * Copyright 2014 JetBrains s.r.o. + * + * 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. + */ + +package jetbrains.mps.unification; + +import org.junit.Test; + +import static jetbrains.mps.unification.MockNode.*; +import static jetbrains.mps.unification.MockTreeParser.*; +import static jetbrains.mps.unification.AssertUnification.*; + +/** + * Created by fyodor on 09.06.2014. + */ +public class SolverTests { + + @Test + public void test1() throws Exception { + assertUnifiesWithBindings( + term("a"), + var("X"), + + bind(var("X"), term("a")) + ); + assertUnifiesWithBindings( + var("Y"), + var("X"), + + bind(var("Y"), var("X")) + ); + } + + @Test + public void test2() throws Exception { + assertUnifiesWithBindings( + parse("a{b c}"), + parse("a{X Y}"), + + bind(var("X"), term("b")), + bind(var("Y"), term("c")) + ); + assertUnifiesWithBindings( + parse("a{b Y}"), + parse("a{X c}"), + + bind(var("X"), term("b")), + bind(var("Y"), term("c")) + ); + assertUnifiesWithBindings( + parse("a{b X Y Z}"), + parse("a{X Y Z b{e}}"), + + bind(var("X"), term("b")), + bind(var("Y"), term("b")), + bind(var("Z"), term("b")) + ); + assertUnifiesWithBindings( + parse("a{b Z Y X}"), + parse("a{Z Y X b{e}}"), + + bind(var("X"), term("b")), + bind(var("Y"), term("b")), + bind(var("Z"), term("b")) + ); + } + + @Test + public void test3() throws Exception { + assertUnifiesWithBindings( + parse("a{b{X} c{Y}}"), + parse("a{V W}"), + + bind(var("V"), parseTerm("b{X}")), + bind(var("W"), parseTerm("c{Y}")) + ); + assertUnifiesWithBindings( + parse("a{X}"), + parse("a{Y}"), + + bind(var("Y"), var("X")) + ); + assertUnifiesWithBindings( + parse("a{b{X} c{Y}}"), + parse("a{b{V} c{W}}"), + + bind(var("X"), var("V")), + bind(var("Y"), var("W")) + ); + } + + @Test + public void test4() throws Exception { + assertUnifiesWithBindings( + parse("a{b{X} c{Y}}"), + parse("a{Y Z}"), + + bind(var("Y"), parseTerm("b{X}")), + bind(var("Z"), parseTerm("c{Y}")) + ); + } + + @Test + public void test5() throws Exception { + assertUnifiesWithBindings( + parseTerm("a{b{c} Y}"), + parseTerm("a{Y b{X}}"), + + bind(var("Y"), parseTerm("b{c}")), + bind(var("X"), term("c")) + ); + } + + @Test + public void test6() throws Exception { + assertUnifiesWithBindings( + parseTerm("a{b{X} c{Y}}"), + parseTerm("a{Y c{b{d}}}"), + + bind(var("Y"), parseTerm("b{X}")), + bind(var("X"), term("d")) + ); + } + + @Test + public void test7() throws Exception { + assertUnifiesWithBindings( + parseTerm("a{b{X} c{Y} Z}"), + parseTerm("a{Y c{b{d{Z}}} e{f}}"), + + bind(var("X"), parseTerm("d{Z}")), + bind(var("Y"), parseTerm("b{X}")), + bind(var("Z"), parseTerm("e{f}")) + ); + } + + @Test + public void testFail1() throws Exception { + assertUnifificationFails( + term("a"), + term("b") + ); + + } + +} diff --git a/reactor/tests/tests.iml b/reactor/tests/tests.iml new file mode 100644 index 00000000..24c200a3 --- /dev/null +++ b/reactor/tests/tests.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + From 0003e1c7f3cd62605bd33b141b0311a4c72d4443 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Wed, 11 Jun 2014 09:45:47 -0700 Subject: [PATCH 002/190] Published with https://stackedit.io/ --- reactor/README.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 reactor/README.md diff --git a/reactor/README.md b/reactor/README.md new file mode 100644 index 00000000..4ba2c037 --- /dev/null +++ b/reactor/README.md @@ -0,0 +1,39 @@ +Unification +=========== + +This small package contains a Java implementation of a "near linear" time syntactic unification algorithm.[^uni] + +In order to make use of the API one must implement two interfaces: + + Term + Var + +These are used by the algorithm to analyze the syntax graph. + +The results are provided in the form of variable bindings. On successful unification, the algorithm returns the solution in a triangular form. + +Some javadoc can be found [here] [1]. + +License +------- + +Copyright 2014 JetBrains s.r.o. + +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. + +> Written with [StackEdit](https://stackedit.io/). + + [^uni]: Baader, Franz, and Wayne Snyder. "Unification Theory." Handbook of automated reasoning 1 (2001): 445-532. + + [1]: http://../doc/index.html + \ No newline at end of file From 69f9844b129ddb323b5cb77774fd790812092a39 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Wed, 11 Jun 2014 10:00:22 -0700 Subject: [PATCH 003/190] Published with https://stackedit.io/ --- reactor/README.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/reactor/README.md b/reactor/README.md index 4ba2c037..f552c79a 100644 --- a/reactor/README.md +++ b/reactor/README.md @@ -1,7 +1,7 @@ Unification =========== -This small package contains a Java implementation of a "near linear" time syntactic unification algorithm.[^uni] +This small package contains a Java implementation of a "near linear" time syntactic unification algorithm.1 In order to make use of the API one must implement two interfaces: @@ -12,8 +12,6 @@ These are used by the algorithm to analyze the syntax graph. The results are provided in the form of variable bindings. On successful unification, the algorithm returns the solution in a triangular form. -Some javadoc can be found [here] [1]. - License ------- @@ -33,7 +31,4 @@ limitations under the License. > Written with [StackEdit](https://stackedit.io/). - [^uni]: Baader, Franz, and Wayne Snyder. "Unification Theory." Handbook of automated reasoning 1 (2001): 445-532. - - [1]: http://../doc/index.html - \ No newline at end of file + 1: Baader, Franz, and Wayne Snyder. "Unification Theory." Handbook of automated reasoning 1 (2001): 445-532. From 49c96f1526f41555cdab460975d2e8a22b984f48 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Thu, 3 Jul 2014 19:03:41 +0200 Subject: [PATCH 006/190] Better Node API, cleaner code --- reactor/.idea/copyright/profiles_settings.xml | 4 +- .../src/jetbrains/mps/unification/Node.java | 7 ++++ .../src/jetbrains/mps/unification/Term.java | 2 +- .../mps/unification/Unification.java | 22 +++++----- .../jetbrains/mps/unification/MockNode.java | 40 +++++++++++++++++++ 5 files changed, 60 insertions(+), 15 deletions(-) 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 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 scit = zs.term().children().iterator(); + Iterator 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); From 1c7fd82419bf6995b25419c9f9c2fcc797e4b2ad Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Wed, 9 Jul 2014 13:50:12 +0200 Subject: [PATCH 007/190] Testing parsing mutiple nodes --- .../jetbrains/mps/unification/AssertAll.java | 33 +++++++++++++ .../mps/unification/MockTreeParser.java | 22 +++++---- .../mps/unification/ParserTests.java | 48 ++++++++++++------- .../mps/unification/SolverTests.java | 12 +++++ 4 files changed, 91 insertions(+), 24 deletions(-) create mode 100644 reactor/tests/src/jetbrains/mps/unification/AssertAll.java diff --git a/reactor/tests/src/jetbrains/mps/unification/AssertAll.java b/reactor/tests/src/jetbrains/mps/unification/AssertAll.java new file mode 100644 index 00000000..75d868e2 --- /dev/null +++ b/reactor/tests/src/jetbrains/mps/unification/AssertAll.java @@ -0,0 +1,33 @@ +/* + * Copyright 2014 JetBrains s.r.o. + * + * 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. + */ + +package jetbrains.mps.unification; + +import java.util.Arrays; +import java.util.Collection; + +import static org.junit.Assert.assertEquals; + +/** + * @author fyodor on 09.07.2014. + */ +public class AssertAll { + + public static void assertEqualsAll(Collection parsed, Node ... nodes) { + assertEquals(parsed, Arrays.asList(nodes)); + } + +} diff --git a/reactor/tests/src/jetbrains/mps/unification/MockTreeParser.java b/reactor/tests/src/jetbrains/mps/unification/MockTreeParser.java index 8b37027d..a3af85ef 100644 --- a/reactor/tests/src/jetbrains/mps/unification/MockTreeParser.java +++ b/reactor/tests/src/jetbrains/mps/unification/MockTreeParser.java @@ -16,9 +16,7 @@ package jetbrains.mps.unification; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -29,16 +27,24 @@ import static jetbrains.mps.unification.MockNode.*; */ public class MockTreeParser { - public static Node parse(String str) { + public static Collection parseAll(String str) { return new RecursiveDescent().parse(str); } + public static Node parse(String str) { + List nodes = new RecursiveDescent().parse(str); + if (nodes.size() != 1) { + throw new IllegalArgumentException("expected single term or var"); + } + return nodes.get(0); + } + public static Term parseTerm(String str) { - return (Term) new RecursiveDescent().parse(str); + return (Term) parse(str); } public static Var parseVar(String str) { - return (Var) new RecursiveDescent().parse(str); + return (Var) parse(str); } private static class RecursiveDescent { @@ -47,12 +53,12 @@ public class MockTreeParser { private LinkedList termsStack = new LinkedList(); private LinkedList> childrenStack = new LinkedList>(); - private Node parse(String toParse) { + private List parse(String toParse) { parseNextToken(Token.START, null); loop(toParse); parseNextToken(Token.END, null); checkFinalState(); - return childrenStack.pop().get(0); + return Collections.unmodifiableList(childrenStack.pop()); } private void loop(String toParse) { diff --git a/reactor/tests/src/jetbrains/mps/unification/ParserTests.java b/reactor/tests/src/jetbrains/mps/unification/ParserTests.java index 3a8a1c6e..c2af86ff 100644 --- a/reactor/tests/src/jetbrains/mps/unification/ParserTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/ParserTests.java @@ -22,18 +22,19 @@ import static org.junit.Assert.*; import static jetbrains.mps.unification.MockNode.*; import static jetbrains.mps.unification.MockTreeParser.*; +import static jetbrains.mps.unification.AssertAll.*; + /** * Created by fyodor on 10.06.2014. */ public class ParserTests { @Test - public void testNormal() { + public void testSingle() { assertEquals(parse("a"), term("a")); assertEquals(parseTerm("a").symbol(), term("a").symbol()); assertEquals(parseVar("X").name(), var("X").name()); - assertEquals(parse("a b"), term("a")); - assertEquals(parse("X b"), var("X")); + assertEquals(parse("X"), var("X")); assertEquals(parse("a{b}"), term("a", term("b"))); assertEquals(parseTerm("a{b}").symbol(), term("a", term("b")).symbol()); assertEquals(parse("a{b c}"), term("a", term("b"), term("c"))); @@ -42,12 +43,17 @@ public class ParserTests { assertEquals(parse("a{X Y}"), term("a", var("X"), var("Y"))); } + @Test + public void testMuti() { + assertEqualsAll(parseAll("a b"), term("a"), term("b")); + assertEqualsAll(parseAll("X Y"), var("X"), var("Y")); + assertEqualsAll(parseAll("a{b} a{b}"), term("a", term("b")), term("a", term("b"))); + } + @Test public void testWhitespace() { assertEquals(parse(" a"), term("a")); - assertEquals(parse(" a b"), term("a")); - assertEquals(parse(" a Y"), term("a")); - assertEquals(parse(" Y b"), var("Y")); + assertEquals(parse(" Y "), var("Y")); assertEquals(parse("a{ b }"), term("a", term("b"))); assertEquals(parse("a{ b c }"), term("a", term("b"), term("c"))); assertEquals(parse("a{b X} "), term("a", term("b"), var("X"))); @@ -72,16 +78,6 @@ public class ParserTests { var("Z"), term("e"), var("W"), term("f"), term("g")), var("Y"))))); } - - @Test(expected = MockTreeParser.ParseException.class) - public void testEmptyFail() { - parse(""); - } - - @Test(expected = MockTreeParser.ParseException.class) - public void testEmptyChildrenFail() { - parse("a{}"); - } @Test(expected = MockTreeParser.ParseException.class) public void testUclosedFail() { @@ -103,6 +99,26 @@ public class ParserTests { parse("a{X b}}"); } + @Test(expected = IllegalArgumentException.class) + public void testFailMulti1() { + parse(" a Y"); + } + + @Test(expected = IllegalArgumentException.class) + public void testFailMulti2() { + parse("a b"); + } + + @Test(expected = MockTreeParser.ParseException.class) + public void testEmptyFail() { + parse(""); + } + + @Test(expected = MockTreeParser.ParseException.class) + public void testEmptyChildrenFail() { + parse("a{}"); + } + @Test(expected = MockTreeParser.ParseException.class) public void testWrongStartFail() { parse("{a}"); diff --git a/reactor/tests/src/jetbrains/mps/unification/SolverTests.java b/reactor/tests/src/jetbrains/mps/unification/SolverTests.java index 91bb30ce..5f8c0a4f 100644 --- a/reactor/tests/src/jetbrains/mps/unification/SolverTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/SolverTests.java @@ -146,6 +146,18 @@ public class SolverTests { ); } + @Test + public void test8() throws Exception { + assertUnifiesWithBindings( + parseTerm("a{b{c d} e{f g} }"), + parseTerm("a{b{X Y} e{Z} }"), + + bind(var("X"), parseTerm("c")), + bind(var("Y"), parseTerm("d")), + bind(var("Z"), parseTerm("f")) + ); + } + @Test public void testFail1() throws Exception { assertUnifificationFails( From ffedd789885e8213499937afed3ec94d3009fb0d Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Wed, 9 Jul 2014 14:34:08 +0200 Subject: [PATCH 008/190] Unification fails in case two terms' children's sizes are different --- .../mps/unification/Unification.java | 3 ++ .../mps/unification/SolverTests.java | 41 ++++++++++++++----- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/reactor/code/src/jetbrains/mps/unification/Unification.java b/reactor/code/src/jetbrains/mps/unification/Unification.java index fa92dfd7..de82be01 100644 --- a/reactor/code/src/jetbrains/mps/unification/Unification.java +++ b/reactor/code/src/jetbrains/mps/unification/Unification.java @@ -64,6 +64,9 @@ public class Unification { while(scit.hasNext() && tcit.hasNext()) { if (!unifClosure(scit.next(), tcit.next())) return false; } + if (scit.hasNext() != tcit.hasNext()) { + return false; // children lists are of different size + } } else { return false; // symbol clash diff --git a/reactor/tests/src/jetbrains/mps/unification/SolverTests.java b/reactor/tests/src/jetbrains/mps/unification/SolverTests.java index 5f8c0a4f..29777bb8 100644 --- a/reactor/tests/src/jetbrains/mps/unification/SolverTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/SolverTests.java @@ -60,20 +60,20 @@ public class SolverTests { bind(var("Y"), term("c")) ); assertUnifiesWithBindings( - parse("a{b X Y Z}"), - parse("a{X Y Z b{e}}"), + parse("a{b{c} X Y Z}"), + parse("a{X Y Z b{c}}"), - bind(var("X"), term("b")), - bind(var("Y"), term("b")), - bind(var("Z"), term("b")) + bind(var("X"), parse("b{c}")), + bind(var("Y"), parse("b{c}")), + bind(var("Z"), parse("b{c}")) ); assertUnifiesWithBindings( - parse("a{b Z Y X}"), - parse("a{Z Y X b{e}}"), + parse("a{b{c} Z Y X}"), + parse("a{Z Y X b{c}}"), - bind(var("X"), term("b")), - bind(var("Y"), term("b")), - bind(var("Z"), term("b")) + bind(var("X"), parse("b{c}")), + bind(var("Y"), parse("b{c}")), + bind(var("Z"), parse("b{c}")) ); } @@ -149,7 +149,7 @@ public class SolverTests { @Test public void test8() throws Exception { assertUnifiesWithBindings( - parseTerm("a{b{c d} e{f g} }"), + parseTerm("a{b{c d} e{f} }"), parseTerm("a{b{X Y} e{Z} }"), bind(var("X"), parseTerm("c")), @@ -158,13 +158,32 @@ public class SolverTests { ); } + @Test + public void test9() throws Exception { + assertUnifiesWithBindings( + parseTerm("a{b{c d} e{X} }"), + parseTerm("a{b{X Y} e{Z} }"), + + bind(var("X"), parseTerm("c")), + bind(var("Y"), parseTerm("d")), + bind(var("Z"), parseTerm("c")) + ); + } + @Test public void testFail1() throws Exception { assertUnifificationFails( term("a"), term("b") ); + } + @Test + public void testFail2() throws Exception { + assertUnifificationFails( + parse("a{b c}"), + parse("a{X}") + ); } } From c5da28e059f4bf26675be256382e24e4693a8937 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Mon, 21 Jul 2014 16:06:25 +0200 Subject: [PATCH 009/190] Slightly better API, changed the tests's package --- .../code/src/jetbrains/mps/unification/Node.java | 4 ++-- .../jetbrains/mps/unification/Substitution.java | 4 ++-- .../jetbrains/mps/unification/Unification.java | 16 ++++++++-------- .../mps/unification/{ => test}/AssertAll.java | 4 +++- .../{ => test}/AssertUnification.java | 6 +++--- .../mps/unification/{ => test}/MockNode.java | 14 +++++++++----- .../unification/{ => test}/MockTreeParser.java | 10 +++++++--- .../mps/unification/{ => test}/ParserTests.java | 8 ++++---- .../mps/unification/{ => test}/SolverTests.java | 8 ++++---- 9 files changed, 42 insertions(+), 32 deletions(-) rename reactor/tests/src/jetbrains/mps/unification/{ => test}/AssertAll.java (91%) rename reactor/tests/src/jetbrains/mps/unification/{ => test}/AssertUnification.java (94%) rename reactor/tests/src/jetbrains/mps/unification/{ => test}/MockNode.java (92%) rename reactor/tests/src/jetbrains/mps/unification/{ => test}/MockTreeParser.java (96%) rename reactor/tests/src/jetbrains/mps/unification/{ => test}/ParserTests.java (95%) rename reactor/tests/src/jetbrains/mps/unification/{ => test}/SolverTests.java (95%) diff --git a/reactor/code/src/jetbrains/mps/unification/Node.java b/reactor/code/src/jetbrains/mps/unification/Node.java index a878d1b7..b37f1b19 100644 --- a/reactor/code/src/jetbrains/mps/unification/Node.java +++ b/reactor/code/src/jetbrains/mps/unification/Node.java @@ -26,9 +26,9 @@ public interface Node { boolean isTerm(); - Term term(); + Term asTerm(); boolean isVar(); - Var var(); + Var asVar(); } diff --git a/reactor/code/src/jetbrains/mps/unification/Substitution.java b/reactor/code/src/jetbrains/mps/unification/Substitution.java index c417be3e..fe221dbd 100644 --- a/reactor/code/src/jetbrains/mps/unification/Substitution.java +++ b/reactor/code/src/jetbrains/mps/unification/Substitution.java @@ -31,7 +31,7 @@ public interface Substitution { Collection bindings() ; - class Binding { + public class Binding { private Var myVar; private Node myNode; @@ -44,7 +44,7 @@ public interface Substitution { return myVar; } - public Node term() { + public Node node() { return myNode; } } diff --git a/reactor/code/src/jetbrains/mps/unification/Unification.java b/reactor/code/src/jetbrains/mps/unification/Unification.java index de82be01..ac7f0440 100644 --- a/reactor/code/src/jetbrains/mps/unification/Unification.java +++ b/reactor/code/src/jetbrains/mps/unification/Unification.java @@ -57,10 +57,10 @@ public class Unification { Node zt = getSchema(t); if (zs.isTerm() && zt.isTerm()) { - if (eq(zs.term().symbol(), zt.term().symbol())) { + if (eq(zs.asTerm().symbol(), zt.asTerm().symbol())) { union(s, t); - Iterator scit = zs.term().children().iterator(); - Iterator tcit = zt.term().children().iterator(); + Iterator scit = zs.asTerm().children().iterator(); + Iterator tcit = zt.asTerm().children().iterator(); while(scit.hasNext() && tcit.hasNext()) { if (!unifClosure(scit.next(), tcit.next())) return false; } @@ -88,7 +88,7 @@ public class Unification { } if (ssize == tsize && s.isVar() && t.isVar()) { // ensure proper order of variables in the substitution - if(s.var().compareTo(t.var()) < 0) { + if(s.asVar().compareTo(t.asVar()) < 0) { union(t, s); return; } @@ -136,7 +136,7 @@ public class Unification { if (z.isTerm()) { setVisited(z, true); - for (Node c : z.term().children()) { + for (Node c : z.asTerm().children()) { substitution = findSolution(c, substitution); if (!substitution.isSuccessful()) return substitution; } @@ -185,7 +185,7 @@ public class Unification { private List getVars(Node n) { if (!hasData(n)) { - return n.isTerm() ? Collections.emptyList() : Collections.singletonList(n.var()); + return n.isTerm() ? Collections.emptyList() : Collections.singletonList(n.asVar()); } return getData(n).myVars; } @@ -240,7 +240,7 @@ public class Unification { Data(Node n) { myClass = n; mySchema = n; - myVars = n.isTerm() ? Collections.emptyList() : Collections.singletonList(n.var()); + myVars = n.isTerm() ? Collections.emptyList() : Collections.singletonList(n.asVar()); } } } @@ -303,7 +303,7 @@ public class Unification { String sep = ""; for (Binding b : myBindings) { sb.append(sep); sep = ", "; - sb.append(b.var()).append(" -> ").append(b.term()); + sb.append(b.var()).append(" -> ").append(b.node()); } return sb.append("]").toString(); } diff --git a/reactor/tests/src/jetbrains/mps/unification/AssertAll.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertAll.java similarity index 91% rename from reactor/tests/src/jetbrains/mps/unification/AssertAll.java rename to reactor/tests/src/jetbrains/mps/unification/test/AssertAll.java index 75d868e2..61a46c31 100644 --- a/reactor/tests/src/jetbrains/mps/unification/AssertAll.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertAll.java @@ -14,7 +14,9 @@ * limitations under the License. */ -package jetbrains.mps.unification; +package jetbrains.mps.unification.test; + +import jetbrains.mps.unification.Node; import java.util.Arrays; import java.util.Collection; diff --git a/reactor/tests/src/jetbrains/mps/unification/AssertUnification.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java similarity index 94% rename from reactor/tests/src/jetbrains/mps/unification/AssertUnification.java rename to reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java index 7eb18698..e25a4e57 100644 --- a/reactor/tests/src/jetbrains/mps/unification/AssertUnification.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package jetbrains.mps.unification; +package jetbrains.mps.unification.test; import jetbrains.mps.unification.Substitution; import static jetbrains.mps.unification.Substitution.*; @@ -47,8 +47,8 @@ public class AssertUnification { Binding expb = expIt.next(); Binding actb = actIt.next(); - expMap.put(expb.var(), expb.term()); - actMap.put(actb.var(), actb.term()); + expMap.put(expb.var(), expb.node()); + actMap.put(actb.var(), actb.node()); } assertEquals(expMap, actMap); diff --git a/reactor/tests/src/jetbrains/mps/unification/MockNode.java b/reactor/tests/src/jetbrains/mps/unification/test/MockNode.java similarity index 92% rename from reactor/tests/src/jetbrains/mps/unification/MockNode.java rename to reactor/tests/src/jetbrains/mps/unification/test/MockNode.java index 82e1ad34..3d022c8a 100644 --- a/reactor/tests/src/jetbrains/mps/unification/MockNode.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/MockNode.java @@ -14,7 +14,11 @@ * limitations under the License. */ -package jetbrains.mps.unification; +package jetbrains.mps.unification.test; + +import jetbrains.mps.unification.Node; +import jetbrains.mps.unification.Term; +import jetbrains.mps.unification.Var; import java.util.*; @@ -54,12 +58,12 @@ public abstract class MockNode implements Node { } @Override - public Term term() { + public Term asTerm() { return this; } @Override - public Var var() { + public Var asVar() { throw new IllegalStateException(); } @@ -124,12 +128,12 @@ public abstract class MockNode implements Node { } @Override - public Term term() { + public Term asTerm() { throw new IllegalStateException(); } @Override - public Var var() { + public Var asVar() { return this; } diff --git a/reactor/tests/src/jetbrains/mps/unification/MockTreeParser.java b/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java similarity index 96% rename from reactor/tests/src/jetbrains/mps/unification/MockTreeParser.java rename to reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java index a3af85ef..ccbde7ca 100644 --- a/reactor/tests/src/jetbrains/mps/unification/MockTreeParser.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java @@ -14,13 +14,17 @@ * limitations under the License. */ -package jetbrains.mps.unification; +package jetbrains.mps.unification.test; + +import jetbrains.mps.unification.Node; +import jetbrains.mps.unification.Term; +import jetbrains.mps.unification.Var; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static jetbrains.mps.unification.MockNode.*; +import static jetbrains.mps.unification.test.MockNode.*; /** * Created by fyodor on 10.06.2014. @@ -34,7 +38,7 @@ public class MockTreeParser { public static Node parse(String str) { List nodes = new RecursiveDescent().parse(str); if (nodes.size() != 1) { - throw new IllegalArgumentException("expected single term or var"); + throw new IllegalArgumentException("expected single asTerm or asVar"); } return nodes.get(0); } diff --git a/reactor/tests/src/jetbrains/mps/unification/ParserTests.java b/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java similarity index 95% rename from reactor/tests/src/jetbrains/mps/unification/ParserTests.java rename to reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java index c2af86ff..e022913d 100644 --- a/reactor/tests/src/jetbrains/mps/unification/ParserTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java @@ -14,15 +14,15 @@ * limitations under the License. */ -package jetbrains.mps.unification; +package jetbrains.mps.unification.test; import org.junit.Test; import static org.junit.Assert.*; -import static jetbrains.mps.unification.MockNode.*; -import static jetbrains.mps.unification.MockTreeParser.*; -import static jetbrains.mps.unification.AssertAll.*; +import static jetbrains.mps.unification.test.MockNode.*; +import static jetbrains.mps.unification.test.MockTreeParser.*; +import static jetbrains.mps.unification.test.AssertAll.*; /** * Created by fyodor on 10.06.2014. diff --git a/reactor/tests/src/jetbrains/mps/unification/SolverTests.java b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java similarity index 95% rename from reactor/tests/src/jetbrains/mps/unification/SolverTests.java rename to reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java index 29777bb8..c6a5f74e 100644 --- a/reactor/tests/src/jetbrains/mps/unification/SolverTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package jetbrains.mps.unification; +package jetbrains.mps.unification.test; import org.junit.Test; -import static jetbrains.mps.unification.MockNode.*; -import static jetbrains.mps.unification.MockTreeParser.*; -import static jetbrains.mps.unification.AssertUnification.*; +import static jetbrains.mps.unification.test.MockNode.*; +import static jetbrains.mps.unification.test.MockTreeParser.*; +import static jetbrains.mps.unification.test.AssertUnification.*; /** * Created by fyodor on 09.06.2014. From db6c89afa277e8b00834266220ab16c5463843c5 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Mon, 21 Jul 2014 16:08:22 +0200 Subject: [PATCH 010/190] Ignore list --- reactor/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 reactor/.gitignore diff --git a/reactor/.gitignore b/reactor/.gitignore new file mode 100644 index 00000000..2c4beb2b --- /dev/null +++ b/reactor/.gitignore @@ -0,0 +1,2 @@ +/.idea/workspace.xml +/out From 928f0cb27390c9c0a2e1f373453cb5c9f5eb53b9 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Tue, 3 Feb 2015 16:34:39 +0100 Subject: [PATCH 011/190] Sorting the order of variables in a binding in case of a var->var substitution; some tests --- .../mps/unification/Unification.java | 10 ++++- .../mps/unification/test/SolverTests.java | 45 ++++++++++++++++--- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/reactor/code/src/jetbrains/mps/unification/Unification.java b/reactor/code/src/jetbrains/mps/unification/Unification.java index ac7f0440..2df9f9da 100644 --- a/reactor/code/src/jetbrains/mps/unification/Unification.java +++ b/reactor/code/src/jetbrains/mps/unification/Unification.java @@ -309,7 +309,15 @@ public class Unification { } private void addBinding(Var v, Node n) { - myBindings.addFirst(new Binding(v, n)); + Binding bng; + if (n.isVar() && n.asVar().compareTo(v) < 0) { + bng = new Binding(n.asVar(), v); + } + else { + bng = new Binding(v, n); + } + + myBindings.addFirst(bng); } } diff --git a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java index c6a5f74e..085882a7 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java @@ -39,7 +39,7 @@ public class SolverTests { var("Y"), var("X"), - bind(var("Y"), var("X")) + bind(var("X"), var("Y")) ); } @@ -69,11 +69,12 @@ public class SolverTests { ); assertUnifiesWithBindings( parse("a{b{c} Z Y X}"), - parse("a{Z Y X b{c}}"), + parse("a{Z Y X b{W}}"), bind(var("X"), parse("b{c}")), bind(var("Y"), parse("b{c}")), - bind(var("Z"), parse("b{c}")) + bind(var("Z"), parse("b{c}")), + bind(var("W"), parse("c")) ); } @@ -90,14 +91,14 @@ public class SolverTests { parse("a{X}"), parse("a{Y}"), - bind(var("Y"), var("X")) + bind(var("X"), var("Y")) ); assertUnifiesWithBindings( parse("a{b{X} c{Y}}"), parse("a{b{V} c{W}}"), - bind(var("X"), var("V")), - bind(var("Y"), var("W")) + bind(var("V"), var("X")), + bind(var("W"), var("Y")) ); } @@ -170,6 +171,38 @@ public class SolverTests { ); } + @Test + public void test10() throws Exception { + assertUnifiesWithBindings( + parseTerm("a{b{c Y} e{X} }"), + parseTerm("a{X e{b{Z d}} }"), + + bind(var("X"), parseTerm("b{c Y}")), + bind(var("Y"), parseTerm("d")), + bind(var("Z"), parseTerm("c")) + ); + } + + @Test + public void test11() throws Exception { + assertUnifiesWithBindings( + parseTerm("a{b{c d} e{f g{b{c d}}} }"), + parseTerm("a{X e{f g{X }} }"), + + bind(var("X"), parseTerm("b{c d}")) + ); + } + + @Test + public void test12() throws Exception { + assertUnifiesWithBindings( + parse("node{name{foo} child{X}}"), + parse("node{name{foo} child{Y}}"), + + bind(var("X"), var("Y")) + ); + } + @Test public void testFail1() throws Exception { assertUnifificationFails( From 4e1abad452c0f52f8cbd895b611197fb1b07a620 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Tue, 3 Feb 2015 18:33:21 +0100 Subject: [PATCH 012/190] Avoid infinite recursion: replace the variables without calling the method recursively --- .../src/jetbrains/mps/unification/Unification.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactor/code/src/jetbrains/mps/unification/Unification.java b/reactor/code/src/jetbrains/mps/unification/Unification.java index 2df9f9da..beaddf53 100644 --- a/reactor/code/src/jetbrains/mps/unification/Unification.java +++ b/reactor/code/src/jetbrains/mps/unification/Unification.java @@ -82,15 +82,15 @@ public class Unification { private void union(Node s, Node t) { Integer ssize = getSize(s); Integer tsize = getSize(t); + + // keep the order if (ssize < tsize) { - union(t, s); - return; + Node tmp = t; t = s; s = tmp; } - if (ssize == tsize && s.isVar() && t.isVar()) { + else if (ssize == tsize && s.isVar() && t.isVar()) { // ensure proper order of variables in the substitution if(s.asVar().compareTo(t.asVar()) < 0) { - union(t, s); - return; + Node tmp = t; t = s; s = tmp; } } From 83eb1ca8270a8aacfbb0d6c7acc70a2aca466fbb Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Sun, 8 Mar 2015 15:13:33 +0100 Subject: [PATCH 013/190] A couple more tests --- .../mps/unification/test/SolverTests.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java index 085882a7..70c17c18 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java @@ -203,6 +203,16 @@ public class SolverTests { ); } + @Test + public void test13() throws Exception { + assertUnifiesWithBindings( + parse("node{name{foo} child{node{name{bar}}}}"), + parse("node{name{foo} child{X}}"), + + bind(var("X"), parseTerm("node{name{bar}}")) + ); + } + @Test public void testFail1() throws Exception { assertUnifificationFails( @@ -219,4 +229,12 @@ public class SolverTests { ); } + @Test + public void testFail3() throws Exception { + assertUnifificationFails( + parse("node{name{X} child{abc}}"), + parse("node{name{foo} child{X}}") + ); + } + } From 28387e683bca7cde6335142258f4e1522c2a4de9 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Wed, 18 Mar 2015 11:21:03 +0100 Subject: [PATCH 014/190] Introduced unification of cyclic terms, redesigned the algorithm, refactored the API, wrote a bunch of tests --- .../src/jetbrains/mps/unification/Node.java | 32 +- .../mps/unification/Substitution.java | 6 +- .../src/jetbrains/mps/unification/Term.java | 2 + .../mps/unification/Unification.java | 235 +-------------- .../UnionFindTermGraphUnifier.java | 278 ++++++++++++++++++ .../src/jetbrains/mps/unification/Var.java | 7 +- .../test/AssertStructurallyEquivalent.java | 158 ++++++++++ .../unification/test/AssertUnification.java | 41 ++- .../mps/unification/test/MockNode.java | 149 +++++++--- .../mps/unification/test/MockTreeParser.java | 111 ++++++- .../mps/unification/test/ParserTests.java | 83 +++++- .../mps/unification/test/SolverTests.java | 160 +++++++++- 12 files changed, 955 insertions(+), 307 deletions(-) create mode 100644 reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java create mode 100644 reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java diff --git a/reactor/code/src/jetbrains/mps/unification/Node.java b/reactor/code/src/jetbrains/mps/unification/Node.java index b37f1b19..f9494f81 100644 --- a/reactor/code/src/jetbrains/mps/unification/Node.java +++ b/reactor/code/src/jetbrains/mps/unification/Node.java @@ -16,19 +16,45 @@ package jetbrains.mps.unification; +import java.util.Collection; + /** - * Represents a node in a term DAG. A node can be either a an instance of - * {@link Term} or {@link Var}. + * Represents a node in a term graph. The graph may contain cycles. A node in a term + * graph can be of three kinds: a variable, a function (possibly constant) and a reference. + * A reference must point to a function term. + * + * A term must implement {@link java.lang.Comparable}, but this is only really used for + * comparing the variables. + * + * Soon to be renamed to Term. * * @author Fedor Isakov */ -public interface Node { +public interface Node extends Comparable { + @Deprecated boolean isTerm(); + @Deprecated Term asTerm(); + @Deprecated boolean isVar(); + @Deprecated Var asVar(); + + Object symbol(); + + Collection children(); + + Node get(); + + boolean is(Kind kind); + + enum Kind { + FUN, + VAR, + REF + } } diff --git a/reactor/code/src/jetbrains/mps/unification/Substitution.java b/reactor/code/src/jetbrains/mps/unification/Substitution.java index fe221dbd..1e16b58c 100644 --- a/reactor/code/src/jetbrains/mps/unification/Substitution.java +++ b/reactor/code/src/jetbrains/mps/unification/Substitution.java @@ -32,15 +32,15 @@ public interface Substitution { Collection bindings() ; public class Binding { - private Var myVar; + private Node myVar; private Node myNode; - public Binding(Var myVar, Node myNode) { + public Binding(Node myVar, Node myNode) { this.myVar = myVar; this.myNode = myNode; } - public Var var() { + public Node var() { return myVar; } diff --git a/reactor/code/src/jetbrains/mps/unification/Term.java b/reactor/code/src/jetbrains/mps/unification/Term.java index e727eb1f..679dc8f4 100644 --- a/reactor/code/src/jetbrains/mps/unification/Term.java +++ b/reactor/code/src/jetbrains/mps/unification/Term.java @@ -21,8 +21,10 @@ import java.util.Collection; /** * A term node. Has a symbol object and a read-only collection of children nodes. * + * @deprecated soon to be removed * @author Fedor Isakov */ +@Deprecated public interface Term extends Node { Object symbol(); diff --git a/reactor/code/src/jetbrains/mps/unification/Unification.java b/reactor/code/src/jetbrains/mps/unification/Unification.java index beaddf53..fb22cbbc 100644 --- a/reactor/code/src/jetbrains/mps/unification/Unification.java +++ b/reactor/code/src/jetbrains/mps/unification/Unification.java @@ -19,233 +19,20 @@ package jetbrains.mps.unification; import java.util.*; /** - * This is an implementation of the "near linear" algorithm for solving syntactic unification - * as described in the paper linked below.1 No recursive terms are allowed, meaning the "occurrs check" - * is performed on the input. If successful, the returned {@link Substitution} contains - * the variable bindings. - *

- * The variables are sorted using {@link java.lang.Comparable} to ensure uniqueness of bindings - * whereas the substituted term is also a variable. - *

- *

- * 1. Baader, Franz, and Wayne Snyder. "Unification Theory." Handbook of automated reasoning 1 (2001): 445-532. - *
+ * This is the main entry point to the unification solver. Presently @{link UnionFindTermGraphUnifier} is used + * for finding the solution. * * @author Fedor Isakov */ public class Unification { public static Substitution unify(Node a, Node b) { - DagUnifier dagUnifier = new DagUnifier(); + UnionFindTermGraphUnifier dagUnifier = new UnionFindTermGraphUnifier(); - if (!dagUnifier.unifClosure(a, b)) return FAILED_SUBSTITUTION; - - return dagUnifier.findSolution(a); + return dagUnifier.unify(a, b); } - private static class DagUnifier { - - private Map myData = new HashMap(); - - private boolean unifClosure(Node s, Node t) { - s = find(s); - t = find(t); - - if (s == t) return true; - - Node zs = getSchema(s); - Node zt = getSchema(t); - - if (zs.isTerm() && zt.isTerm()) { - if (eq(zs.asTerm().symbol(), zt.asTerm().symbol())) { - union(s, t); - Iterator scit = zs.asTerm().children().iterator(); - Iterator tcit = zt.asTerm().children().iterator(); - while(scit.hasNext() && tcit.hasNext()) { - if (!unifClosure(scit.next(), tcit.next())) return false; - } - if (scit.hasNext() != tcit.hasNext()) { - return false; // children lists are of different size - } - } - else { - return false; // symbol clash - } - } - else { - union(s, t); - } - - return true; - } - - private void union(Node s, Node t) { - Integer ssize = getSize(s); - Integer tsize = getSize(t); - - // keep the order - if (ssize < tsize) { - Node tmp = t; t = s; s = tmp; - } - else if (ssize == tsize && s.isVar() && t.isVar()) { - // ensure proper order of variables in the substitution - if(s.asVar().compareTo(t.asVar()) < 0) { - Node tmp = t; t = s; s = tmp; - } - } - - // union s and t classes by moving t under s - - setSize(s, ssize + tsize); - appendVars(s, getVars(t)); - if (getSchema(s).isVar()) { - setSchema(s, getSchema(t)); - } - setRepresentative(t, s); - } - - private Node find(Node s) { - Node node = getRepresentative(s); - if (node == s) return s; - - // find representative and compress paths - - List path = new ArrayList(); - path.add(node); - for (Node t; (t = getRepresentative(node)) != node; ) { - path.add(t); - node = t; - } - for (Node p : path) { - setRepresentative(p, node); - } - - return node; - } - - private Substitution findSolution(Node s) { - return findSolution(s, EMPTY_SUBSTITUTION); - } - - private Substitution findSolution(Node s, Substitution substitution) { - Node z = getSchema(find(s)); - - if (isAcyclic(z)) return substitution; // not part of a cycle - if (isVisited(z)) return FAILED_SUBSTITUTION; // there exists a cycle - - if (z.isTerm()) { - setVisited(z, true); - - for (Node c : z.asTerm().children()) { - substitution = findSolution(c, substitution); - if (!substitution.isSuccessful()) return substitution; - } - - setVisited(z, false); - } - - setAcyclic(z, true); - - SuccessfulSubstitution success = new SuccessfulSubstitution(substitution); - for (Var var : getVars(find(z))) { - if (var != z) { - success.addBinding(var, z); - } - } - - return success; - } - - private int getSize(Node n) { - if (!hasData(n)) return 1; - return getData(n).mySize; - } - - private void setSize(Node n, int size) { - getData(n).mySize = size; - } - - private Node getRepresentative(Node n) { - if (!hasData(n)) return n; - return getData(n).myClass; - } - - private void setRepresentative(Node n, Node rep) { - getData(n).myClass = rep; - } - - private Node getSchema(Node n) { - if (!hasData(n)) return n; - return getData(n).mySchema; - } - - private void setSchema(Node n, Node schema) { - getData(n).mySchema = schema; - } - - private List getVars(Node n) { - if (!hasData(n)) { - return n.isTerm() ? Collections.emptyList() : Collections.singletonList(n.asVar()); - } - return getData(n).myVars; - } - - private void appendVars(Node n, List vars) { - List newVars = new ArrayList(getVars(n)); - newVars.addAll(vars); - getData(n).myVars = newVars; - } - - private boolean isAcyclic(Node n) { - if (!hasData(n)) return false; - return getData(n).myAcyclic; - } - - private void setAcyclic(Node n, boolean acyclic) { - getData(n).myAcyclic = acyclic; - } - - private boolean isVisited(Node n) { - if (!hasData(n)) return false; - return getData(n).myVisited; - } - - private void setVisited(Node n, boolean visited) { - getData(n).myVisited = visited; - } - - private boolean hasData(Node n) { - return myData.containsKey(n); - } - - private Data getData(Node n) { - if (myData.containsKey(n)) return myData.get(n); - Data data = new Data(n); - myData.put(n, data); - return data; - } - - private boolean eq(Object a, Object b) { - return a == null ? b == null : a.equals(b); - } - - private static class Data { - int mySize = 1; - boolean myAcyclic = false; - boolean myVisited = false; - List myVars; - - Node myClass; - Node mySchema; - Data(Node n) { - myClass = n; - mySchema = n; - myVars = n.isTerm() ? Collections.emptyList() : Collections.singletonList(n.asVar()); - } - } - } - - private static final Substitution FAILED_SUBSTITUTION = new Substitution() { + protected static final Substitution FAILED_SUBSTITUTION = new Substitution() { @Override public boolean isSuccessful() { return false; @@ -262,7 +49,7 @@ public class Unification { } }; - private static final Substitution EMPTY_SUBSTITUTION = new Substitution() { + protected static final Substitution EMPTY_SUBSTITUTION = new Substitution() { @Override public boolean isSuccessful() { return true; @@ -279,11 +66,11 @@ public class Unification { } }; - private static class SuccessfulSubstitution implements Substitution { + protected static class SuccessfulSubstitution implements Substitution { private LinkedList myBindings; - private SuccessfulSubstitution(Substitution substitution) { + protected SuccessfulSubstitution(Substitution substitution) { this.myBindings = new LinkedList(substitution.bindings()); } @@ -308,10 +95,10 @@ public class Unification { return sb.append("]").toString(); } - private void addBinding(Var v, Node n) { + protected void addBinding(Node v, Node n) { Binding bng; - if (n.isVar() && n.asVar().compareTo(v) < 0) { - bng = new Binding(n.asVar(), v); + if (n.is(Node.Kind.VAR) && n.compareTo(n) < 0) { + bng = new Binding((Var)n, v); } else { bng = new Binding(v, n); diff --git a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java new file mode 100644 index 00000000..e3b8bab0 --- /dev/null +++ b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java @@ -0,0 +1,278 @@ +/* + * Copyright 2015 JetBrains s.r.o. + * + * 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. + */ + +package jetbrains.mps.unification; + +import java.util.*; + +/** + * This is an implementation of the "near linear" algorithm for solving syntactic unification + * as described in the paper linked below and also in the textbook of the same author.1 2 + * + * No recursive terms are allowed as a solution, meaning the "occurrs check" for variables + * is performed on the input. However, cyclic terms are allowed as input and can be unified, producing + * solutions bindind variables to cyclic terms. + * + * If successful, the returned {@link Substitution} contains + * the variable bindings. + *

+ * The variables are sorted using {@link java.lang.Comparable} to ensure uniqueness of bindings + * whereas the substituted term is also a variable. + *

+ *

+ * 1. Baader, Franz, and Wayne Snyder. "Unification Theory." Handbook of automated reasoning 1 (2001): 445-532. + * 2. Baader, Franz, and Tobias Nipkow. Term rewriting and all that. Cambridge University Press, 1999. + *
+ * + * @author Fedor Isakov + */ +public class UnionFindTermGraphUnifier { + + private Map myData = new HashMap(); + + public Substitution unify(Node a, Node b) { + if (!unifClosure(a, b)) { + return Unification.FAILED_SUBSTITUTION; + } + + return findSolution(a); + } + + private boolean unifClosure(Node s, Node t) { + s = find(s); + t = find(t); + + if (s == t) return true; + + Node zs = getSchema(s); + Node zt = getSchema(t); + + // a VAR always matches another node + if(zs.is(Node.Kind.VAR) || zt.is(Node.Kind.VAR)) { + union(s, t); + return true; + } + + // dereference REF nodes + zs = zs.is(Node.Kind.REF) ? zs.get() : zs; + zt = zt.is(Node.Kind.REF) ? zt.get() : zt; + + // use find 2nd time to account for dereferenced nodes + if (find(zs) == find(zt)) return true; + + if (zs.is(Node.Kind.FUN) && zt.is(Node.Kind.FUN)) + { + if (!eq(zs.symbol(), zt.symbol())) { + return false; // symbol clash + } + + // union REF nodes only to each other + if (s.is(Node.Kind.REF) == t.is(Node.Kind.REF)) { + union(s, t); + } + + Iterator scit = zs.children().iterator(); + Iterator tcit = zt.children().iterator(); + while (scit.hasNext() && tcit.hasNext()) { + if (!unifClosure(scit.next(), tcit.next())) return false; + } + + // fail if different children count + return scit.hasNext() == tcit.hasNext(); + } + else { + // something's wrong with the input + return false; + } + } + + private void union(Node s, Node t) { + int ssize = getSize(s); + int tsize = getSize(t); + + // keep the order + if (ssize < tsize) { + Node tmp = t; t = s; s = tmp; + } + else if (ssize == tsize && s.is(Node.Kind.VAR) && t.is(Node.Kind.VAR)) { + // ensure proper order of variables in the substitution + if(s.compareTo(t) < 0) { + Node tmp = t; t = s; s = tmp; + } + } + + // union s and t classes by moving t under s + + setSize(s, ssize + tsize); + appendVars(s, getVars(t)); + if (getSchema(s).is(Node.Kind.VAR)) { + setSchema(s, getSchema(t)); + } + setRepresentative(t, s); + } + + private Node find(Node s) { + Node node = getRepresentative(s); + if (node == s) { + return s; + } + + // find representative and compress paths + + List path = new ArrayList(); + path.add(node); + for (Node t; (t = getRepresentative(node)) != node; ) { + path.add(t); + node = t; + } + for (Node p : path) { + setRepresentative(p, node); + } + + return node; + } + + private Substitution findSolution(Node s) { + return findSolution(s, Unification.EMPTY_SUBSTITUTION); + } + + private Substitution findSolution(Node s, Substitution substitution) { + Node z = getSchema(find(s)); + + if (isAcyclic(z)) { + return substitution; // not part of a cycle + } + if (isVisited(z)) { + return Unification.FAILED_SUBSTITUTION; // there exists a cycle + } + + if (z.is(Node.Kind.FUN)) { + setVisited(z, true); + + for (Node c : z.children()) { + substitution = findSolution(c, substitution); + if (!substitution.isSuccessful()) { + break; + } + } + + setVisited(z, false); + } + + if (!substitution.isSuccessful()) { + return substitution; + } + + setAcyclic(z, true); + + Unification.SuccessfulSubstitution success = new Unification.SuccessfulSubstitution(substitution); + for (Var var : getVars(find(z))) { + if (var != z) { + success.addBinding(var, z.is(Node.Kind.REF) ? z.get() : z); + } + } + + return success; + } + + private int getSize(Node n) { + if (!hasData(n)) return 1; + return getData(n).mySize; + } + + private void setSize(Node n, int size) { + getData(n).mySize = size; + } + + private Node getRepresentative(Node n) { + if (!hasData(n)) return n; + return getData(n).myClass; + } + + private void setRepresentative(Node n, Node rep) { + getData(n).myClass = rep; + } + + private Node getSchema(Node n) { + if (!hasData(n)) return n; + return getData(n).mySchema; + } + + private void setSchema(Node n, Node schema) { + getData(n).mySchema = schema; + } + + private List getVars(Node n) { + if (!hasData(n)) { + return n.is(Node.Kind.VAR) ? Collections.singletonList((Var)n) : Collections.emptyList(); + } + return getData(n).myVars; + } + + private void appendVars(Node n, List vars) { + List newVars = new ArrayList(getVars(n)); + newVars.addAll(vars); + getData(n).myVars = newVars; + } + + private boolean isAcyclic(Node n) { + if (!hasData(n)) return false; + return getData(n).myAcyclic; + } + + private void setAcyclic(Node n, boolean acyclic) { + getData(n).myAcyclic = acyclic; + } + + private boolean isVisited(Node n) { + if (!hasData(n)) return false; + return getData(n).myVisited; + } + + private void setVisited(Node n, boolean visited) { + getData(n).myVisited = visited; + } + + private boolean hasData(Node n) { + return myData.containsKey(n); + } + + private Data getData(Node n) { + if (myData.containsKey(n)) return myData.get(n); + Data data = new Data(n); + myData.put(n, data); + return data; + } + + private boolean eq(Object a, Object b) { + return a == null ? b == null : a.equals(b); + } + + private static class Data { + int mySize = 1; + boolean myAcyclic = false; + boolean myVisited = false; + List myVars; + + Node myClass; + Node mySchema; + Data(Node n) { + myClass = n; + mySchema = n; + myVars = n.is(Node.Kind.VAR) ? Collections.singletonList((Var)n) : Collections.emptyList(); + } + } +} diff --git a/reactor/code/src/jetbrains/mps/unification/Var.java b/reactor/code/src/jetbrains/mps/unification/Var.java index 8ef1514d..729f76f0 100644 --- a/reactor/code/src/jetbrains/mps/unification/Var.java +++ b/reactor/code/src/jetbrains/mps/unification/Var.java @@ -19,10 +19,15 @@ package jetbrains.mps.unification; /** * A variable node. Has a name and must implement {@link java.lang.Comparable}. * + * @deprecated soon to be removed * @author Fedor Isakov */ -public interface Var extends Node, Comparable { +@Deprecated +public interface Var extends Node { + Object symbol(); + + @Deprecated String name(); } diff --git a/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java new file mode 100644 index 00000000..eaea6dae --- /dev/null +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java @@ -0,0 +1,158 @@ +/* + * Copyright 2015 JetBrains s.r.o. + * + * 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. + */ + +package jetbrains.mps.unification.test; + +import jetbrains.mps.unification.Node; +import static org.junit.Assert.*; + +import java.util.*; + +/** + * @author Fedor Isakov + */ +public class AssertStructurallyEquivalent { + + public static void assertEquivalent(Node a, Node b) throws Exception { + + final Signature signature = new Signature(); + signature.setWalkers( + // first pass + new NodeWalker( + new NodeVisitor(Node.Kind.FUN) { + @Override + public Collection visit(Node term) throws Exception { + signature.label(term); + return term.children(); + } + }), + // second pass + new NodeWalker( + new NodeVisitor(Node.Kind.FUN) { + @Override + public Collection visit(Node term) throws Exception { + signature.appendSignature("@").append(signature.getLabel(term)).append(term.symbol()); + return term.children(); + } + }, + new NodeVisitor(Node.Kind.VAR) { + @Override + public Collection visit(Node var) throws Exception { + signature.appendSignature("$").append(var.symbol()); + return Collections.emptyList(); + } + }, new NodeVisitor(Node.Kind.REF) { + @Override + public Collection visit(Node ref) throws Exception { + Integer label = signature.getLabel(ref.get()); + assertNotNull("not found label for '"+ref.get() + "'", label); + signature.appendSignature("^").append(label); + return Collections.emptyList(); + } + }) + ); + + String signa = signature.getSignature(a); + String signb = signature.getSignature(b); + + assertEquals(signa, signb); + } + + + private static class Signature { + + private IdentityHashMap labels = new IdentityHashMap(); + private int label = 1; + private StringBuilder signature = new StringBuilder(); + private NodeWalker[] walkers; + + protected void label(Node node) { + labels.put(node, label++); + } + + protected Integer getLabel(Node node) { + return labels.get(node); + } + + protected StringBuilder appendSignature(String str) { + return signature.append(str); + } + + public String getSignature (Node node) throws Exception { + reset(); + for (NodeWalker walker : walkers) { + walker.walk(node); + } + return signature.toString(); + } + + protected void reset() { + labels.clear(); + this.label = 1; + signature.setLength(0); + } + + protected void setWalkers(NodeWalker ... walkers) { + this.walkers = walkers; + } + } + + private static abstract class NodeVisitor { + + private Node.Kind kind; + + public NodeVisitor(Node.Kind kind) { + this.kind = kind; + } + + public Node.Kind applicableTo() { + return kind; + } + + public abstract Collection visit(T t) throws Exception ; + + } + + private static class NodeWalker { + + private Map> visitorMap = new HashMap>(); + + public NodeWalker(NodeVisitor... visitors) { + for (NodeVisitor visitor : visitors) { + visitorMap.put(visitor.applicableTo(), visitor); + } + } + + public void walk(Node node) throws Exception { + Collection children = switchClass(node); + for (Node child : children) { + walk(child); + } + } + + private Collection switchClass(Node node) throws Exception { + for (Map.Entry> e : visitorMap.entrySet()) { + if (node.is(e.getKey())) { + NodeVisitor value = (NodeVisitor) e.getValue(); + return value.visit(node); + } + } + return Collections.emptyList(); + } + + } + +} diff --git a/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java index e25a4e57..b5380ec2 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java @@ -24,6 +24,7 @@ import jetbrains.mps.unification.Var; import java.util.*; +import static jetbrains.mps.unification.test.AssertStructurallyEquivalent.assertEquivalent; import static org.junit.Assert.*; @@ -32,27 +33,32 @@ import static org.junit.Assert.*; */ public class AssertUnification { - public static Binding bind(Var v, Node n) { + public static final Comparator BINDING_COMPARATOR = new Comparator() { + @Override + public int compare(Binding a, Binding b) { + return a.var().compareTo(b.var()); + } + }; + + public static Binding bind(Node v, Node n) { return new Binding(v, n); } public static void assertSameBindings(Collection expected, Collection actual) throws Exception { - Iterator expIt = expected.iterator(); - Iterator actIt = actual.iterator(); - - Map expMap = new HashMap(); - Map actMap = new HashMap(); + ArrayList expectedCopy = new ArrayList(expected); + Collections.sort(expectedCopy, BINDING_COMPARATOR); + Iterator expIt = expectedCopy.iterator(); + ArrayList actualCopy = new ArrayList(actual); + Collections.sort(actualCopy, BINDING_COMPARATOR); + Iterator actIt = actualCopy.iterator(); while(expIt.hasNext() && actIt.hasNext()) { Binding expb = expIt.next(); Binding actb = actIt.next(); - expMap.put(expb.var(), expb.node()); - actMap.put(actb.var(), actb.node()); + assertEquals(expb.var(), actb.var()); + assertEquivalent(expb.node(), actb.node()); } - - assertEquals(expMap, actMap); - if(expIt.hasNext() || actIt.hasNext()) throw new Exception("mismatched number of bindings"); } @@ -72,7 +78,18 @@ public class AssertUnification { assertSameBindings(subs.bindings(), subs2.bindings()); } - public static void assertUnifificationFails(Node s, Node t) throws Exception { + public static void assertUnifiesWithBindingsAsymm(Node s, Node t, Substitution.Binding ... bindings) throws Exception{ + Substitution subs = Unification.unify(s, t); + + assertTrue(subs.isSuccessful()); + assertSameBindings( + Arrays.asList( + bindings + ), + subs.bindings()); + } + + public static void assertUnificationFails(Node s, Node t) throws Exception { Substitution subs = Unification.unify(s, t); assertFalse(subs.isSuccessful()); diff --git a/reactor/tests/src/jetbrains/mps/unification/test/MockNode.java b/reactor/tests/src/jetbrains/mps/unification/test/MockNode.java index 3d022c8a..52ec28c9 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/MockNode.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/MockNode.java @@ -30,15 +30,67 @@ public abstract class MockNode implements Node { public MockNode() { } - public static Term term(Object sym, Node ... children) { + public static Node term(Object sym, Node ... children) { return new MockTerm(sym, children); } - public static Var var(String name) { + public static Node var(String name) { return new MockVar(name); } - public static class MockTerm extends MockNode implements Term { + public static Node ref(Node term) { + return new MockRef(term); + } + + public static Node ref(TermLookup termLookup) { + return new MockRef(termLookup); + } + + interface TermLookup { + Node lookupTerm(); + } + + @Override + public boolean isTerm() { + return is(Kind.FUN); + } + + @Override + public Term asTerm() { + return (Term) this; + } + + @Override + public boolean isVar() { + return is(Kind.VAR); + } + + @Override + public Var asVar() { + return (Var) this; + } + + @Override + public Object symbol() { + return null; + } + + @Override + public Collection children() { + return null; + } + + @Override + public Node get() { + return this; + } + + @Override + public int compareTo(Node node) { + return String.valueOf(symbol()).compareTo(String.valueOf(node.symbol())); + } + + public static class MockTerm extends MockNode { private List myChildren; private Object mySymbol; @@ -47,26 +99,6 @@ 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 asTerm() { - return this; - } - - @Override - public Var asVar() { - throw new IllegalStateException(); - } - @Override public Object symbol() { return mySymbol; @@ -77,6 +109,11 @@ public abstract class MockNode implements Node { return Collections.unmodifiableList(myChildren); } + @Override + public boolean is(Kind kind) { + return Kind.FUN == kind; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(String.valueOf(mySymbol)); @@ -118,23 +155,13 @@ public abstract class MockNode implements Node { } @Override - public boolean isTerm() { - return false; + public Object symbol() { + return myName; } @Override - public boolean isVar() { - return true; - } - - @Override - public Term asTerm() { - throw new IllegalStateException(); - } - - @Override - public Var asVar() { - return this; + public boolean is(Kind kind) { + return Kind.VAR == kind; } @Override @@ -152,9 +179,53 @@ public abstract class MockNode implements Node { return ((MockVar)o).myName.equals(myName); } + } + + public static class MockRef extends MockNode { + + private Node term; + private TermLookup termLookup; + + public MockRef(Node term) { + this.term = term; + } + + public MockRef(TermLookup termLookup) { + this.termLookup = termLookup; + } + @Override - public int compareTo(Var var) { - return ((String)myName).compareTo((String)((MockVar)var).myName); + public final Node get() { + if (term == null && termLookup != null) { + term = termLookup.lookupTerm(); + termLookup = null; + } + return term; + } + + @Override + public boolean is(Kind kind) { + return Kind.REF == kind; + } + + @Override + public String toString() { + Node t = get(); + return t != null ? "^"+ t.symbol() : "^"; + } + + @Override + public boolean equals(Object that) { + if (that == this) return true; + if (that == null || getClass() != that.getClass()) return false; + + return get() == ((MockNode) that).get(); + } + + @Override + public int hashCode() { + Node t = get(); + return t != null ? System.identityHashCode(t) : 0; } } } diff --git a/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java b/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java index ccbde7ca..fea21202 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java @@ -17,7 +17,7 @@ package jetbrains.mps.unification.test; import jetbrains.mps.unification.Node; -import jetbrains.mps.unification.Term; +import jetbrains.mps.unification.Node; import jetbrains.mps.unification.Var; import java.util.*; @@ -43,8 +43,8 @@ public class MockTreeParser { return nodes.get(0); } - public static Term parseTerm(String str) { - return (Term) parse(str); + public static Node parseTerm(String str) { + return (Node) parse(str); } public static Var parseVar(String str) { @@ -55,13 +55,20 @@ public class MockTreeParser { private Token lastToken; private LinkedList termsStack = new LinkedList(); + private LinkedList termsLabelsStack = new LinkedList(); private LinkedList> childrenStack = new LinkedList>(); + private int lastLabel = -1; + private Map termRefs = new HashMap(); + // initialized on the parse finished + private LookupHelper lookupHelper = new LookupHelper(); private List parse(String toParse) { parseNextToken(Token.START, null); loop(toParse); parseNextToken(Token.END, null); checkFinalState(); + checkAllRefsExist(); + lookupHelper.setTermRefs(Collections.unmodifiableMap(new HashMap(termRefs))); return Collections.unmodifiableList(childrenStack.pop()); } @@ -80,7 +87,7 @@ public class MockTreeParser { // see if the last matching succeeded assert matcher != null; if (!matcher.lookingAt() && !matcher.hitEnd()) { - throw new ParseException("unexpected input"); + throw new ParseException("unexpected input: '"+toParse+"'"); } } while (!matcher.hitEnd()); } @@ -103,6 +110,7 @@ public class MockTreeParser { beginTerm(value); break; case VAR: + checkLastTokenNotOneOf(Token.LABEL); if (lastToken == Token.TERM) { emptyTerm(); } @@ -113,7 +121,7 @@ public class MockTreeParser { beginChildren(); break; case RBRACE: - checkLastTokenOneOf(Token.TERM, Token.VAR, Token.RBRACE); + checkLastTokenOneOf(Token.TERM, Token.VAR, Token.REF, Token.RBRACE); if (lastToken == Token.TERM) { emptyTerm(); } @@ -122,15 +130,39 @@ public class MockTreeParser { break; case WHITESPACE: return; // ignore + case LABEL: + checkLastTokenNotOneOf(Token.LABEL); + if (lastToken == Token.TERM) { + emptyTerm(); + } + lastLabel = Integer.parseInt(value.substring(1)); + break; + case REF: + checkLastTokenNotOneOf(Token.LABEL); + if (lastToken == Token.TERM) { + emptyTerm(); + } + addRef(value); + break; } this.lastToken = token; } private void checkLastTokenOneOf(Token ... tokens) { + if (lastToken == Token.WHITESPACE) return; for (Token token : tokens) { if (token == lastToken) return; } - throw new ParseException("parse error"); + throw new ParseException("parse error: unexpected token '"+lastToken+"'"); + } + + private void checkLastTokenNotOneOf(Token ... tokens) { + if (lastToken == Token.WHITESPACE) return; + for (Token token : tokens) { + if (token == lastToken) { + throw new ParseException("parse error: unexpected token '"+lastToken+"'"); + } + } } private void checkFinalState() { @@ -145,13 +177,28 @@ public class MockTreeParser { } } + private void checkAllRefsExist() { + for (Map.Entry e: termRefs.entrySet()) { + if (e.getValue() == null) { + throw new ParseException("non-existing label '" + e.getKey() + "'"); + } + } + } + private void beginTerm(String name) { termsStack.push(name); + termsLabelsStack.push(lastLabel >= 0 ? lastLabel : null); + lastLabel = -1; } private void emptyTerm() { - String term = termsStack.pop(); - childrenStack.peek().add(term(term)); + String name = termsStack.pop(); + Integer label = termsLabelsStack.pop(); + Node newTerm = term(name); + childrenStack.peek().add(newTerm); + if (label != null) { + termRefs.put(label, newTerm); + } } private void beginChildren(){ @@ -159,14 +206,30 @@ public class MockTreeParser { } private void endChildren() { - String term = termsStack.pop(); List children = childrenStack.pop(); - childrenStack.peek().add(term(term, children.toArray(new Node[children.size()]))); + String name = termsStack.pop(); + Integer label = termsLabelsStack.pop(); + Node newTerm = term(name, children.toArray(new Node[children.size()])); + childrenStack.peek().add(newTerm); + if (label != null) { + termRefs.put(label, newTerm); + } } private void addVar(String name) { childrenStack.peek().add(var(name)); } + + private void addRef(String ref) { + final int label = Integer.parseInt(ref.substring(1)); + if (termRefs.containsKey(label)) { + childrenStack.peek().add(ref(termRefs.get(label))); + } + else { + termRefs.put(label, null); + childrenStack.peek().add(ref(lookupHelper.lookup(label))); + } + } } private static enum Token { @@ -176,7 +239,9 @@ public class MockTreeParser { VAR(Pattern.compile("[A-Z][a-zA-Z0-9_]*")), LBRACE(Pattern.compile("\\{")), RBRACE(Pattern.compile("\\}")), - WHITESPACE(Pattern.compile("\\s+")); + WHITESPACE(Pattern.compile("\\s+")), + LABEL(Pattern.compile("@[0-9]+")), + REF(Pattern.compile("\\^[0-9]+")); private Pattern pattern; @@ -190,6 +255,30 @@ public class MockTreeParser { super(s); } } + + private static class LookupHelper { + private Map termRefs; + + private void setTermRefs (Map termRefs) { + this.termRefs = termRefs; + } + + public TermLookup lookup(final int label) { + return new TermLookup() { + @Override + public Node lookupTerm() { + if (termRefs == null) { + throw new IllegalStateException("call to uninitialized lookup"); + } + if (!termRefs.containsKey(label)) { + throw new IllegalStateException("non-existing label '" + label + "'"); + } + return termRefs.get(label); + } + }; + } + + } } diff --git a/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java b/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java index e022913d..220ba106 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java @@ -16,6 +16,8 @@ package jetbrains.mps.unification.test; +import jetbrains.mps.unification.Node; +import org.junit.ComparisonFailure; import org.junit.Test; import static org.junit.Assert.*; @@ -23,17 +25,27 @@ import static org.junit.Assert.*; import static jetbrains.mps.unification.test.MockNode.*; import static jetbrains.mps.unification.test.MockTreeParser.*; import static jetbrains.mps.unification.test.AssertAll.*; +import static jetbrains.mps.unification.test.AssertStructurallyEquivalent.*; /** * Created by fyodor on 10.06.2014. */ public class ParserTests { + private static class LazyTermLookup implements TermLookup{ + private Node term; + + @Override + public Node lookupTerm() { + return term; + } + } + @Test public void testSingle() { assertEquals(parse("a"), term("a")); assertEquals(parseTerm("a").symbol(), term("a").symbol()); - assertEquals(parseVar("X").name(), var("X").name()); + assertEquals(parseVar("X").symbol(), var("X").symbol()); assertEquals(parse("X"), var("X")); assertEquals(parse("a{b}"), term("a", term("b"))); assertEquals(parseTerm("a{b}").symbol(), term("a", term("b")).symbol()); @@ -66,31 +78,75 @@ public class ParserTests { assertEquals(parse("a{b{c{d{e f g}}}}"), term("a", term("b", - term("c", - term("d", - term("e"), term("f"), term("g")))))); + term("c", + term("d", + term("e"), term("f"), term("g")))))); assertEquals(parse("a{X b{c{d{Z e W f g} Y}}}"), term("a", var("X"), term("b", - term("c", - term("d", - var("Z"), term("e"), var("W"), term("f"), term("g")), - var("Y"))))); + term("c", + term("d", + var("Z"), term("e"), var("W"), term("f"), term("g")), + var("Y"))))); + } + + @Test + public void testRef() throws Exception { + LazyTermLookup termLookup = new LazyTermLookup(); + Node a = termLookup.term = term("a", ref(termLookup)); + assertEquivalent(parse("@1a{^1}"), + a); + + Node b = term("b"); + assertEquivalent(parse("a{@1b ^1}"), + term("a", b, ref(b))); + + Node c = term("c"); + assertEquivalent(parse("a{^1 @1c}"), + term("a", ref(c), c)); + + Node b1 = term("b"); + Node b2 = term("b"); + assertEquivalent(parse("a{@2b ^1 ^2 @1b}"), + term("a", b2, ref(b1), ref(b2), b1)); + } + + @Test(expected = ComparisonFailure.class) + public void testNotEquivalent1() throws Exception { + Node d = term("d"); + assertEquivalent(parse("a{^1 @1c}"), + term("a", ref(d), d)); + } + + @Test(expected = ComparisonFailure.class) + public void testNotEquivalent2() throws Exception { + Node b1 = term("b"); + Node b2 = term("b"); + assertEquivalent(parse("a{@2b ^1 @1b ^2}"), + term("a", b2, ref(b2), b1, ref(b1))); + } + + @Test(expected = ComparisonFailure.class) + public void testNotEquivalent3() throws Exception { + Node b1 = term("b"); + Node b2 = term("b"); + assertEquivalent(parse("a{@2b ^1 ^2 @1b}"), + term("a", b2, ref(b2), ref(b1), b1)); } @Test(expected = MockTreeParser.ParseException.class) - public void testUclosedFail() { + public void testUnclosedFail() { parse("a{b "); } @Test(expected = MockTreeParser.ParseException.class) - public void testUclosedFail2() { + public void testUnclosedFail2() { parse("a{X b"); } @Test(expected = MockTreeParser.ParseException.class) - public void testUclosedFail3() { + public void testUnclosedFail3() { parse("a{{X b}"); } @@ -133,4 +189,9 @@ public class ParserTests { public void testExtraSymbolFail() { parse("a}"); } + + @Test(expected = MockTreeParser.ParseException.class) + public void testNonExistingRefFail() { + parse("a{b ^1}"); + } } diff --git a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java index 70c17c18..fd258eff 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java @@ -213,9 +213,140 @@ public class SolverTests { ); } + @Test + public void test14() throws Exception { + assertUnifiesWithBindings( + parse("f{X g{a}}"), + parse("f{g{Y} g{Y}}"), + + bind(var("X"), parseTerm("g{Y}")), + bind(var("Y"), parseTerm("a")) + ); + } + + @Test + public void test15() throws Exception { + assertUnifiesWithBindingsAsymm( + parse("h{X1 f{Y0 Y0} Y1}"), + parse("h{f{X0 X0} Y1 X1}"), + + bind(var("X0"), parseVar("Y0")), + bind(var("X1"), parseTerm("f{Y0 Y0}")), + bind(var("Y1"), parseTerm("f{Y0 Y0}")) + ); + } + + @Test + public void test16() throws Exception { + // this test illustrates why the used algorithm is superior to recursive descent: + // the latter would have an exponential complexity because of "functional" form of + // substitution instead of the "triangular" form used here. + + assertUnifiesWithBindingsAsymm( + parse("h{X1 X2 X3 X4 X5 X6 X7 X8 X9 " + + "f{Y0 Y0} f{Y1 Y1} f{Y2 Y2} f{Y3 Y3} f{Y4 Y4} f{Y5 Y5} f{Y6 Y6} f{Y7 Y7} f{Y8 Y8} Y9}"), + parse("h{f{X0 X0} f{X1 X1} f{X2 X2} f{X3 X3} f{X4 X4} f{X5 X5} f{X6 X6} f{X7 X7} f{X8 X8} " + + "Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 X9}"), + + bind(var("X0"), parseVar("Y0")), + bind(var("X1"), parseTerm("f{Y0 Y0}")), + bind(var("X2"), parseTerm("f{Y1 Y1}")), + bind(var("X3"), parseTerm("f{Y2 Y2}")), + bind(var("X4"), parseTerm("f{Y3 Y3}")), + bind(var("X5"), parseTerm("f{Y4 Y4}")), + bind(var("X6"), parseTerm("f{Y5 Y5}")), + bind(var("X7"), parseTerm("f{Y6 Y6}")), + bind(var("X8"), parseTerm("f{Y7 Y7}")), + bind(var("X9"), parseTerm("f{Y8 Y8}")), + bind(var("Y1"), parseTerm("f{Y0 Y0}")), + bind(var("Y2"), parseTerm("f{Y1 Y1}")), + bind(var("Y3"), parseTerm("f{Y2 Y2}")), + bind(var("Y4"), parseTerm("f{Y3 Y3}")), + bind(var("Y5"), parseTerm("f{Y4 Y4}")), + bind(var("Y6"), parseTerm("f{Y5 Y5}")), + bind(var("Y7"), parseTerm("f{Y6 Y6}")), + bind(var("Y8"), parseTerm("f{Y7 Y7}")), + bind(var("Y9"), parseTerm("f{Y8 Y8}")) + ); + } + + @Test + public void testCyclic() throws Exception { + assertUnifiesWithBindings( + parse("@1 a{b ^1}"), + parse("@2 a{b a{b ^2}}") + + ); + assertUnifiesWithBindings( + parse("@1 a{b ^1}"), + parse(" a{b @3 a{b ^3}}") + + ); + assertUnifiesWithBindings( + parse("@1 a{b ^1}"), + parse("@2 a{b ^2}") + ); + } + + @Test + public void testCyclicVar() throws Exception { + assertUnifiesWithBindings( + parse("@1 a{b ^1}"), + parse("@1 a{b X}"), + + bind(var("X"), parse("@1 a{b ^1}")) + ); + assertUnifiesWithBindings( + parse("@1 a{b ^1}"), + parse("X"), + + bind(var("X"), parse("@1 a{b ^1}")) + ); + assertUnifiesWithBindings( + parse("@1 a{^1 b c}"), + parse("X"), + + bind(var("X"), parse("@1 a{^1 b c}")) + ); + assertUnifiesWithBindings( + parse("@1 a{b ^1}"), + parse("@1 a{b a{b X}}"), + + bind(var("X"), parse("@1 a{b ^1}")) + ); + } + + @Test + public void testCyclic_TermRewriting() throws Exception { + // The original problem is to unify two cyclic terms: + // + // +->f +--->f + // |_/ \ | / \ + // X | f f<-+ + // |_/ \ / \_| + // Y + // + // -- which would be equivalent to the following: + // + // "@1 f {^1 X}" "@2 f {f {^2 Y} @3 f {Y ^3}}" + // + // Unfortunately, although the algorithm can successfully unify these + // two terms, no solution exists that is not recursive. That is, + // we cannot produce a list of variable bindings that do not include a + // variable itself in the substitution. Thus, we resort to a simplified test. + + assertUnifiesWithBindings( + parse("@1 f {^1 X}"), + parse("@2 f {f {^2 Y} @3 f {Z ^3}}"), + + bind(var("X"), parse("@1 f{Z ^1}")), + bind(var("Y"), parse("@1 f{Z ^1}")) + ); + } + @Test public void testFail1() throws Exception { - assertUnifificationFails( + assertUnificationFails( term("a"), term("b") ); @@ -223,7 +354,7 @@ public class SolverTests { @Test public void testFail2() throws Exception { - assertUnifificationFails( + assertUnificationFails( parse("a{b c}"), parse("a{X}") ); @@ -231,10 +362,33 @@ public class SolverTests { @Test public void testFail3() throws Exception { - assertUnifificationFails( + assertUnificationFails( parse("node{name{X} child{abc}}"), parse("node{name{foo} child{X}}") ); } + @Test + public void testFail4() throws Exception { + assertUnificationFails( + parse("f{a{X} Y }"), + parse("f{Y a{b{X}}}") + ); + } + + @Test + public void testFail5() throws Exception { + assertUnificationFails( + parse("f{X}"), + parse("X") + ); + } + + @Test + public void testFail6() throws Exception { + assertUnificationFails( + parse("f{f{X}}"), + parse("f{X}") + ); + } } From 868d82c1dbb00c844de9b7943e65074d71c6549c Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Wed, 18 Mar 2015 11:56:58 +0100 Subject: [PATCH 015/190] Made the Node's inner enum explicitly public (MPS wrongly assumes it to be package local) --- reactor/code/src/jetbrains/mps/unification/Node.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactor/code/src/jetbrains/mps/unification/Node.java b/reactor/code/src/jetbrains/mps/unification/Node.java index f9494f81..6092033e 100644 --- a/reactor/code/src/jetbrains/mps/unification/Node.java +++ b/reactor/code/src/jetbrains/mps/unification/Node.java @@ -52,7 +52,7 @@ public interface Node extends Comparable { boolean is(Kind kind); - enum Kind { + public enum Kind { FUN, VAR, REF From 09e0fd00b7b4ec912ca7a08fb08fec1d24144659 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Thu, 19 Mar 2015 17:31:08 +0100 Subject: [PATCH 016/190] Fixed variables order, removing usages of the obsolete interface, code cleanup --- .../UnionFindTermGraphUnifier.java | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java index e3b8bab0..a3695484 100644 --- a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java +++ b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java @@ -109,7 +109,7 @@ public class UnionFindTermGraphUnifier { } else if (ssize == tsize && s.is(Node.Kind.VAR) && t.is(Node.Kind.VAR)) { // ensure proper order of variables in the substitution - if(s.compareTo(t) < 0) { + if(t.compareTo(s) < 0) { Node tmp = t; t = s; s = tmp; } } @@ -179,7 +179,7 @@ public class UnionFindTermGraphUnifier { setAcyclic(z, true); Unification.SuccessfulSubstitution success = new Unification.SuccessfulSubstitution(substitution); - for (Var var : getVars(find(z))) { + for (Node var : getVars(find(z))) { if (var != z) { success.addBinding(var, z.is(Node.Kind.REF) ? z.get() : z); } @@ -215,15 +215,15 @@ public class UnionFindTermGraphUnifier { getData(n).mySchema = schema; } - private List getVars(Node n) { + private List getVars(Node n) { if (!hasData(n)) { - return n.is(Node.Kind.VAR) ? Collections.singletonList((Var)n) : Collections.emptyList(); + return collectVars(n); } return getData(n).myVars; } - private void appendVars(Node n, List vars) { - List newVars = new ArrayList(getVars(n)); + private void appendVars(Node n, List vars) { + List newVars = new ArrayList(getVars(n)); newVars.addAll(vars); getData(n).myVars = newVars; } @@ -250,6 +250,13 @@ public class UnionFindTermGraphUnifier { return myData.containsKey(n); } + private List collectVars(Node n) { + if (n.is(Node.Kind.VAR)) { + return Collections.singletonList(n); + } + return Collections.emptyList(); + } + private Data getData(Node n) { if (myData.containsKey(n)) return myData.get(n); Data data = new Data(n); @@ -261,18 +268,18 @@ public class UnionFindTermGraphUnifier { return a == null ? b == null : a.equals(b); } - private static class Data { + private class Data { int mySize = 1; boolean myAcyclic = false; boolean myVisited = false; - List myVars; + List myVars; Node myClass; Node mySchema; Data(Node n) { myClass = n; mySchema = n; - myVars = n.is(Node.Kind.VAR) ? Collections.singletonList((Var)n) : Collections.emptyList(); + myVars = collectVars(n); } } } From 004480ca70c300c05cfb2dc26d61d63e4153fea1 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Fri, 20 Mar 2015 12:57:35 +0100 Subject: [PATCH 017/190] Now allowing REF nodes to point to variables too, adapted the algorithm, removed obsolete interfaces, created more tests --- reactor/.idea/misc.xml | 3 +- reactor/code/code.iml | 3 +- .../src/jetbrains/mps/unification/Node.java | 14 +---- .../src/jetbrains/mps/unification/Term.java | 34 ----------- .../mps/unification/Unification.java | 2 +- .../UnionFindTermGraphUnifier.java | 56 ++++++++++++++++--- .../src/jetbrains/mps/unification/Var.java | 33 ----------- .../test/AssertStructurallyEquivalent.java | 18 ++++-- .../unification/test/AssertUnification.java | 1 - .../mps/unification/test/MockNode.java | 29 +--------- .../mps/unification/test/MockTreeParser.java | 32 +++++++---- .../mps/unification/test/ParserTests.java | 25 +++++++-- .../mps/unification/test/SolverTests.java | 37 ++++++++++++ 13 files changed, 146 insertions(+), 141 deletions(-) delete mode 100644 reactor/code/src/jetbrains/mps/unification/Term.java delete mode 100644 reactor/code/src/jetbrains/mps/unification/Var.java diff --git a/reactor/.idea/misc.xml b/reactor/.idea/misc.xml index 49cd2039..15f63515 100644 --- a/reactor/.idea/misc.xml +++ b/reactor/.idea/misc.xml @@ -24,5 +24,4 @@ - - + \ No newline at end of file diff --git a/reactor/code/code.iml b/reactor/code/code.iml index d5c07432..c90834f2 100644 --- a/reactor/code/code.iml +++ b/reactor/code/code.iml @@ -8,5 +8,4 @@ - - + \ 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 6092033e..c18d4a8c 100644 --- a/reactor/code/src/jetbrains/mps/unification/Node.java +++ b/reactor/code/src/jetbrains/mps/unification/Node.java @@ -21,7 +21,7 @@ import java.util.Collection; /** * Represents a node in a term graph. The graph may contain cycles. A node in a term * graph can be of three kinds: a variable, a function (possibly constant) and a reference. - * A reference must point to a function term. + * A reference must point to either a function term or a variable. * * A term must implement {@link java.lang.Comparable}, but this is only really used for * comparing the variables. @@ -32,18 +32,6 @@ import java.util.Collection; */ public interface Node extends Comparable { - @Deprecated - boolean isTerm(); - - @Deprecated - Term asTerm(); - - @Deprecated - boolean isVar(); - - @Deprecated - Var asVar(); - Object symbol(); Collection children(); diff --git a/reactor/code/src/jetbrains/mps/unification/Term.java b/reactor/code/src/jetbrains/mps/unification/Term.java deleted file mode 100644 index 679dc8f4..00000000 --- a/reactor/code/src/jetbrains/mps/unification/Term.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2014 JetBrains s.r.o. - * - * 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. - */ - -package jetbrains.mps.unification; - -import java.util.Collection; - -/** - * A term node. Has a symbol object and a read-only collection of children nodes. - * - * @deprecated soon to be removed - * @author Fedor Isakov - */ -@Deprecated -public interface Term extends Node { - - Object symbol(); - - Collection children(); - -} diff --git a/reactor/code/src/jetbrains/mps/unification/Unification.java b/reactor/code/src/jetbrains/mps/unification/Unification.java index fb22cbbc..01f4530a 100644 --- a/reactor/code/src/jetbrains/mps/unification/Unification.java +++ b/reactor/code/src/jetbrains/mps/unification/Unification.java @@ -98,7 +98,7 @@ public class Unification { protected void addBinding(Node v, Node n) { Binding bng; if (n.is(Node.Kind.VAR) && n.compareTo(n) < 0) { - bng = new Binding((Var)n, v); + bng = new Binding(n, v); } else { bng = new Binding(v, n); diff --git a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java index a3695484..4ed00562 100644 --- a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java +++ b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java @@ -24,7 +24,8 @@ import java.util.*; * * No recursive terms are allowed as a solution, meaning the "occurrs check" for variables * is performed on the input. However, cyclic terms are allowed as input and can be unified, producing - * solutions bindind variables to cyclic terms. + * solutions binding variables to cyclic terms. Variables can also be passed by reference without altering the + * intuitive behaviour of the algorithm. * * If successful, the returned {@link Substitution} contains * the variable bindings. @@ -67,11 +68,35 @@ public class UnionFindTermGraphUnifier { } // dereference REF nodes - zs = zs.is(Node.Kind.REF) ? zs.get() : zs; - zt = zt.is(Node.Kind.REF) ? zt.get() : zt; + Node ds = zs.is(Node.Kind.REF) ? zs.get() : zs; + Node dt = zt.is(Node.Kind.REF) ? zt.get() : zt; + + if (ds.is(Node.Kind.VAR)) { + if (s != find(ds)) { + union(s, find(ds)); + } + union(s, t); + return true; + } + else { + zs = ds; + } + + if (dt.is(Node.Kind.VAR)) { + if (t != find(dt)) { + union(t, find(dt)); + } + union(t, s); + return true; + } + else { + zt = dt; + } // use find 2nd time to account for dereferenced nodes - if (find(zs) == find(zt)) return true; + if (find(zs) == find(zt)) { + return true; + } if (zs.is(Node.Kind.FUN) && zt.is(Node.Kind.FUN)) { @@ -103,7 +128,7 @@ public class UnionFindTermGraphUnifier { int ssize = getSize(s); int tsize = getSize(t); - // keep the order + // keep the order: the smaller class gets inserted under the bigger one if (ssize < tsize) { Node tmp = t; t = s; s = tmp; } @@ -118,9 +143,15 @@ public class UnionFindTermGraphUnifier { setSize(s, ssize + tsize); appendVars(s, getVars(t)); - if (getSchema(s).is(Node.Kind.VAR)) { - setSchema(s, getSchema(t)); + + Node zs = getSchema(s); + Node zt = getSchema(t); + if (zs.is(Node.Kind.VAR) || + (zs.is(Node.Kind.REF) && zs.get().is(Node.Kind.VAR) && !zt.is(Node.Kind.VAR))) + { + setSchema(s, zt); } + setRepresentative(t, s); } @@ -164,6 +195,7 @@ public class UnionFindTermGraphUnifier { for (Node c : z.children()) { substitution = findSolution(c, substitution); + if (!substitution.isSuccessful()) { break; } @@ -181,7 +213,15 @@ public class UnionFindTermGraphUnifier { Unification.SuccessfulSubstitution success = new Unification.SuccessfulSubstitution(substitution); for (Node var : getVars(find(z))) { if (var != z) { - success.addBinding(var, z.is(Node.Kind.REF) ? z.get() : z); + Node val = z.is(Node.Kind.REF) ? z.get() : z; + + // Keep the order of variables within a binding + if (val.is(Node.Kind.VAR) && val.compareTo(var) < 0) { + success.addBinding(val, var); + } + else { + success.addBinding(var, val); + } } } diff --git a/reactor/code/src/jetbrains/mps/unification/Var.java b/reactor/code/src/jetbrains/mps/unification/Var.java deleted file mode 100644 index 729f76f0..00000000 --- a/reactor/code/src/jetbrains/mps/unification/Var.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2014 JetBrains s.r.o. - * - * 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. - */ - -package jetbrains.mps.unification; - -/** - * A variable node. Has a name and must implement {@link java.lang.Comparable}. - * - * @deprecated soon to be removed - * @author Fedor Isakov - */ -@Deprecated -public interface Var extends Node { - - Object symbol(); - - @Deprecated - String name(); - -} diff --git a/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java index eaea6dae..1ff68c20 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java @@ -57,10 +57,20 @@ public class AssertStructurallyEquivalent { }, new NodeVisitor(Node.Kind.REF) { @Override public Collection visit(Node ref) throws Exception { - Integer label = signature.getLabel(ref.get()); - assertNotNull("not found label for '"+ref.get() + "'", label); - signature.appendSignature("^").append(label); - return Collections.emptyList(); + if (ref.get().is(Node.Kind.FUN)) { + Integer label = signature.getLabel(ref.get()); + assertNotNull("not found label for '"+ref.get() + "'", label); + signature.appendSignature("^").append(label); + return Collections.emptyList(); + } + else if (ref.get().is(Node.Kind.VAR)) { + signature.appendSignature("^").append(ref.get().symbol()); + return Collections.emptyList(); + } + else { + throw new UnsupportedOperationException(); + } + } }) ); diff --git a/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java index b5380ec2..3f9fc4b8 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java @@ -20,7 +20,6 @@ import jetbrains.mps.unification.Substitution; import static jetbrains.mps.unification.Substitution.*; import jetbrains.mps.unification.Unification; import jetbrains.mps.unification.Node; -import jetbrains.mps.unification.Var; import java.util.*; diff --git a/reactor/tests/src/jetbrains/mps/unification/test/MockNode.java b/reactor/tests/src/jetbrains/mps/unification/test/MockNode.java index 52ec28c9..284b8268 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/MockNode.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/MockNode.java @@ -17,8 +17,6 @@ package jetbrains.mps.unification.test; import jetbrains.mps.unification.Node; -import jetbrains.mps.unification.Term; -import jetbrains.mps.unification.Var; import java.util.*; @@ -50,26 +48,6 @@ public abstract class MockNode implements Node { Node lookupTerm(); } - @Override - public boolean isTerm() { - return is(Kind.FUN); - } - - @Override - public Term asTerm() { - return (Term) this; - } - - @Override - public boolean isVar() { - return is(Kind.VAR); - } - - @Override - public Var asVar() { - return (Var) this; - } - @Override public Object symbol() { return null; @@ -142,18 +120,13 @@ public abstract class MockNode implements Node { } } - public static class MockVar extends MockNode implements Var { + public static class MockVar extends MockNode { private String myName; public MockVar(String name) { myName = name; } - @Override - public String name() { - return myName; - } - @Override public Object symbol() { return myName; diff --git a/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java b/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java index fea21202..90bd80fa 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java @@ -17,8 +17,6 @@ package jetbrains.mps.unification.test; import jetbrains.mps.unification.Node; -import jetbrains.mps.unification.Node; -import jetbrains.mps.unification.Var; import java.util.*; import java.util.regex.Matcher; @@ -47,15 +45,15 @@ public class MockTreeParser { return (Node) parse(str); } - public static Var parseVar(String str) { - return (Var) parse(str); + public static Node parseVar(String str) { + return parse(str); } private static class RecursiveDescent { private Token lastToken; private LinkedList termsStack = new LinkedList(); - private LinkedList termsLabelsStack = new LinkedList(); + private LinkedList termLabelsStack = new LinkedList(); private LinkedList> childrenStack = new LinkedList>(); private int lastLabel = -1; private Map termRefs = new HashMap(); @@ -98,7 +96,7 @@ public class MockTreeParser { childrenStack.push(new ArrayList()); break; case END: - checkLastTokenOneOf(Token.TERM, Token.VAR, Token.RBRACE); + checkLastTokenOneOf(Token.TERM, Token.VAR, Token.VARREF, Token.RBRACE); if (lastToken == Token.TERM) { emptyTerm(); } @@ -116,12 +114,19 @@ public class MockTreeParser { } addVar(value); break; + case VARREF: + checkLastTokenNotOneOf(Token.LABEL); + if (lastToken == Token.TERM) { + emptyTerm(); + } + addVarRef(value.substring(1)); + break; case LBRACE: checkLastTokenOneOf(Token.TERM); beginChildren(); break; case RBRACE: - checkLastTokenOneOf(Token.TERM, Token.VAR, Token.REF, Token.RBRACE); + checkLastTokenOneOf(Token.TERM, Token.VAR, Token.VARREF, Token.REF, Token.RBRACE); if (lastToken == Token.TERM) { emptyTerm(); } @@ -187,13 +192,13 @@ public class MockTreeParser { private void beginTerm(String name) { termsStack.push(name); - termsLabelsStack.push(lastLabel >= 0 ? lastLabel : null); + termLabelsStack.push(lastLabel >= 0 ? lastLabel : null); lastLabel = -1; } private void emptyTerm() { String name = termsStack.pop(); - Integer label = termsLabelsStack.pop(); + Integer label = termLabelsStack.pop(); Node newTerm = term(name); childrenStack.peek().add(newTerm); if (label != null) { @@ -208,7 +213,7 @@ public class MockTreeParser { private void endChildren() { List children = childrenStack.pop(); String name = termsStack.pop(); - Integer label = termsLabelsStack.pop(); + Integer label = termLabelsStack.pop(); Node newTerm = term(name, children.toArray(new Node[children.size()])); childrenStack.peek().add(newTerm); if (label != null) { @@ -220,6 +225,10 @@ public class MockTreeParser { childrenStack.peek().add(var(name)); } + private void addVarRef(String name) { + childrenStack.peek().add(ref(var(name))); + } + private void addRef(String ref) { final int label = Integer.parseInt(ref.substring(1)); if (termRefs.containsKey(label)) { @@ -241,7 +250,8 @@ public class MockTreeParser { RBRACE(Pattern.compile("\\}")), WHITESPACE(Pattern.compile("\\s+")), LABEL(Pattern.compile("@[0-9]+")), - REF(Pattern.compile("\\^[0-9]+")); + REF(Pattern.compile("\\^[0-9]+")), + VARREF(Pattern.compile("\\^[A-Z][a-zA-Z0-9_]*")); private Pattern pattern; diff --git a/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java b/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java index 220ba106..3f4dbc66 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java @@ -95,23 +95,40 @@ public class ParserTests { public void testRef() throws Exception { LazyTermLookup termLookup = new LazyTermLookup(); Node a = termLookup.term = term("a", ref(termLookup)); - assertEquivalent(parse("@1a{^1}"), + assertEquivalent( + parse("@1a{^1}"), a); Node b = term("b"); - assertEquivalent(parse("a{@1b ^1}"), + assertEquivalent( + parse("a{@1b ^1}"), term("a", b, ref(b))); Node c = term("c"); - assertEquivalent(parse("a{^1 @1c}"), + assertEquivalent( + parse("a{^1 @1c}"), term("a", ref(c), c)); Node b1 = term("b"); Node b2 = term("b"); - assertEquivalent(parse("a{@2b ^1 ^2 @1b}"), + assertEquivalent( + parse("a{@2b ^1 ^2 @1b}"), term("a", b2, ref(b1), ref(b2), b1)); } + @Test + public void testVarRef() throws Exception { + Node x = var("X"); + + assertEquivalent( + parse("^X"), + ref(x)); + assertEquivalent( + parse("a{^X}"), + term("a", ref(x))); + + } + @Test(expected = ComparisonFailure.class) public void testNotEquivalent1() throws Exception { Node d = term("d"); diff --git a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java index fd258eff..094b2dc9 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java @@ -16,6 +16,7 @@ package jetbrains.mps.unification.test; +import jetbrains.mps.unification.Node; import org.junit.Test; import static jetbrains.mps.unification.test.MockNode.*; @@ -316,6 +317,42 @@ public class SolverTests { ); } + @Test + public void testVarRef() throws Exception { + + assertUnifiesWithBindings( + parse("^X"), + parse("Y"), + + bind(var("X"), var("Y")) + ); + assertUnifiesWithBindings( + parse("a{b ^X}"), + parse("a{b c{d}}"), + + bind(var("X"), parse("c{d}")) + ); + assertUnifiesWithBindings( + parse("a{b c{X} ^X}"), + parse("a{b c{d} d}"), + + bind(var("X"), parse("d")) + ); + assertUnifiesWithBindings( + parse("a{b{d} c{X} ^X}"), + parse("a{b{^X} c{d} d}"), + + bind(var("X"), parse("d")) + ); + assertUnifiesWithBindings( + parse("a{b{d} c{X}}"), + parse("a{b{^X} c{d}}"), + + bind(var("X"), parse("d")) + ); + + } + @Test public void testCyclic_TermRewriting() throws Exception { // The original problem is to unify two cyclic terms: From 690e2929bbdc14e723d8e1192765902d89f2f7fb Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Sun, 22 Mar 2015 15:10:41 +0100 Subject: [PATCH 018/190] Ensure the data is associated with nodes using identity, except variables, which are identified by symbol --- .../UnionFindTermGraphUnifier.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java index 4ed00562..5213efa0 100644 --- a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java +++ b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java @@ -42,7 +42,7 @@ import java.util.*; */ public class UnionFindTermGraphUnifier { - private Map myData = new HashMap(); + private Map myData = new IdentityHashMap(); public Substitution unify(Node a, Node b) { if (!unifClosure(a, b)) { @@ -287,7 +287,16 @@ public class UnionFindTermGraphUnifier { } private boolean hasData(Node n) { - return myData.containsKey(n); + Object key = n.is(Node.Kind.VAR) ? String.valueOf(n.symbol()).intern() : n; + return myData.containsKey(key); + } + + private Data getData(Node n) { + Object key = n.is(Node.Kind.VAR) ? String.valueOf(n.symbol()).intern() : n; + if (myData.containsKey(key)) return myData.get(key); + Data data = new Data(n); + myData.put(key, data); + return data; } private List collectVars(Node n) { @@ -297,13 +306,6 @@ public class UnionFindTermGraphUnifier { return Collections.emptyList(); } - private Data getData(Node n) { - if (myData.containsKey(n)) return myData.get(n); - Data data = new Data(n); - myData.put(n, data); - return data; - } - private boolean eq(Object a, Object b) { return a == null ? b == null : a.equals(b); } From 80d16b592d4868b24f5faaa605ce25a2129ec27a Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Tue, 24 Mar 2015 11:49:06 +0100 Subject: [PATCH 019/190] Ensure cyclic terms in the solution are fully reconciled, some tests and code cleanup --- .../UnionFindTermGraphUnifier.java | 102 +++++++++++------- .../test/AssertStructurallyEquivalent.java | 3 +- .../mps/unification/test/SolverTests.java | 39 ++++--- 3 files changed, 84 insertions(+), 60 deletions(-) diff --git a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java index 5213efa0..af2d7231 100644 --- a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java +++ b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java @@ -16,8 +16,13 @@ package jetbrains.mps.unification; +import jetbrains.mps.unification.Unification.SuccessfulSubstitution; + import java.util.*; +import static jetbrains.mps.unification.Node.Kind.*; +import static jetbrains.mps.unification.Unification.*; + /** * This is an implementation of the "near linear" algorithm for solving syntactic unification * as described in the paper linked below and also in the textbook of the same author.1 2 @@ -44,9 +49,11 @@ public class UnionFindTermGraphUnifier { private Map myData = new IdentityHashMap(); + private int myUnreconciledRefs = 0; + public Substitution unify(Node a, Node b) { if (!unifClosure(a, b)) { - return Unification.FAILED_SUBSTITUTION; + return FAILED_SUBSTITUTION; } return findSolution(a); @@ -62,16 +69,16 @@ public class UnionFindTermGraphUnifier { Node zt = getSchema(t); // a VAR always matches another node - if(zs.is(Node.Kind.VAR) || zt.is(Node.Kind.VAR)) { + if(zs.is(VAR) || zt.is(VAR)) { union(s, t); return true; } // dereference REF nodes - Node ds = zs.is(Node.Kind.REF) ? zs.get() : zs; - Node dt = zt.is(Node.Kind.REF) ? zt.get() : zt; + Node ds = zs.is(REF) ? zs.get() : zs; + Node dt = zt.is(REF) ? zt.get() : zt; - if (ds.is(Node.Kind.VAR)) { + if (ds.is(VAR)) { if (s != find(ds)) { union(s, find(ds)); } @@ -82,7 +89,7 @@ public class UnionFindTermGraphUnifier { zs = ds; } - if (dt.is(Node.Kind.VAR)) { + if (dt.is(VAR)) { if (t != find(dt)) { union(t, find(dt)); } @@ -98,14 +105,14 @@ public class UnionFindTermGraphUnifier { return true; } - if (zs.is(Node.Kind.FUN) && zt.is(Node.Kind.FUN)) + if (zs.is(FUN) && zt.is(FUN)) { if (!eq(zs.symbol(), zt.symbol())) { return false; // symbol clash } // union REF nodes only to each other - if (s.is(Node.Kind.REF) == t.is(Node.Kind.REF)) { + if (s.is(REF) == t.is(REF)) { union(s, t); } @@ -132,7 +139,7 @@ public class UnionFindTermGraphUnifier { if (ssize < tsize) { Node tmp = t; t = s; s = tmp; } - else if (ssize == tsize && s.is(Node.Kind.VAR) && t.is(Node.Kind.VAR)) { + else if (ssize == tsize && s.is(VAR) && t.is(VAR)) { // ensure proper order of variables in the substitution if(t.compareTo(s) < 0) { Node tmp = t; t = s; s = tmp; @@ -146,8 +153,7 @@ public class UnionFindTermGraphUnifier { Node zs = getSchema(s); Node zt = getSchema(t); - if (zs.is(Node.Kind.VAR) || - (zs.is(Node.Kind.REF) && zs.get().is(Node.Kind.VAR) && !zt.is(Node.Kind.VAR))) + if (zs.is(VAR) || (zs.is(REF) && zs.get().is(VAR) && !zt.is(VAR))) { setSchema(s, zt); } @@ -177,7 +183,8 @@ public class UnionFindTermGraphUnifier { } private Substitution findSolution(Node s) { - return findSolution(s, Unification.EMPTY_SUBSTITUTION); + myUnreconciledRefs = 0; + return findSolution(s, EMPTY_SUBSTITUTION); } private Substitution findSolution(Node s, Substitution substitution) { @@ -187,10 +194,11 @@ public class UnionFindTermGraphUnifier { return substitution; // not part of a cycle } if (isVisited(z)) { - return Unification.FAILED_SUBSTITUTION; // there exists a cycle + return FAILED_SUBSTITUTION; // there exists a cycle } - if (z.is(Node.Kind.FUN)) { + int unreconciled = myUnreconciledRefs; + if (z.is(FUN)) { setVisited(z, true); for (Node c : z.children()) { @@ -208,15 +216,24 @@ public class UnionFindTermGraphUnifier { return substitution; } + if (isReferenced(z)) { + setReferenced(z, false); + myUnreconciledRefs--; + } + setAcyclic(z, true); - Unification.SuccessfulSubstitution success = new Unification.SuccessfulSubstitution(substitution); + SuccessfulSubstitution success = new SuccessfulSubstitution(substitution); for (Node var : getVars(find(z))) { if (var != z) { - Node val = z.is(Node.Kind.REF) ? z.get() : z; + if (myUnreconciledRefs != unreconciled) { + return FAILED_SUBSTITUTION; // there's an unreconciled outward reference + } + + Node val = z.is(REF) ? z.get() : z; // Keep the order of variables within a binding - if (val.is(Node.Kind.VAR) && val.compareTo(var) < 0) { + if (val.is(VAR) && val.compareTo(var) < 0) { success.addBinding(val, var); } else { @@ -225,6 +242,11 @@ public class UnionFindTermGraphUnifier { } } + if (z.is(REF) && z.get().is(FUN)) { + setReferenced(z.get(), true); + myUnreconciledRefs++; + } + return success; } @@ -256,10 +278,7 @@ public class UnionFindTermGraphUnifier { } private List getVars(Node n) { - if (!hasData(n)) { - return collectVars(n); - } - return getData(n).myVars; + return hasData(n) ? getData(n).myVars : singletonVar(n); } private void appendVars(Node n, List vars) { @@ -269,8 +288,7 @@ public class UnionFindTermGraphUnifier { } private boolean isAcyclic(Node n) { - if (!hasData(n)) return false; - return getData(n).myAcyclic; + return hasData(n) && getData(n).myAcyclic; } private void setAcyclic(Node n, boolean acyclic) { @@ -278,50 +296,58 @@ public class UnionFindTermGraphUnifier { } private boolean isVisited(Node n) { - if (!hasData(n)) return false; - return getData(n).myVisited; + return hasData(n) && getData(n).myVisited; } private void setVisited(Node n, boolean visited) { getData(n).myVisited = visited; } + private boolean isReferenced(Node n) { + return hasData(n) && getData(n).myReferenced; + } + + private void setReferenced(Node n, boolean referenced) { + getData(n).myReferenced = referenced; + } + private boolean hasData(Node n) { - Object key = n.is(Node.Kind.VAR) ? String.valueOf(n.symbol()).intern() : n; + Object key = n.is(VAR) ? String.valueOf(n.symbol()).intern() : n; return myData.containsKey(key); } private Data getData(Node n) { - Object key = n.is(Node.Kind.VAR) ? String.valueOf(n.symbol()).intern() : n; + Object key = n.is(VAR) ? String.valueOf(n.symbol()).intern() : n; if (myData.containsKey(key)) return myData.get(key); Data data = new Data(n); myData.put(key, data); return data; } - private List collectVars(Node n) { - if (n.is(Node.Kind.VAR)) { - return Collections.singletonList(n); - } - return Collections.emptyList(); - } - - private boolean eq(Object a, Object b) { + private static boolean eq(Object a, Object b) { return a == null ? b == null : a.equals(b); } - private class Data { + private static List singletonVar(Node n) { + return n.is(VAR) ? + Collections.singletonList(n) : + Collections.emptyList(); + } + + private static class Data { int mySize = 1; boolean myAcyclic = false; boolean myVisited = false; - List myVars; + boolean myReferenced = false; + List myVars; Node myClass; Node mySchema; + Data(Node n) { myClass = n; mySchema = n; - myVars = collectVars(n); + myVars = singletonVar(n); } } } diff --git a/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java index 1ff68c20..16f3d3b1 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java @@ -84,10 +84,11 @@ public class AssertStructurallyEquivalent { private static class Signature { + private NodeWalker[] walkers; + private IdentityHashMap labels = new IdentityHashMap(); private int label = 1; private StringBuilder signature = new StringBuilder(); - private NodeWalker[] walkers; protected void label(Node node) { labels.put(node, label++); diff --git a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java index 094b2dc9..06372b73 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java @@ -382,31 +382,15 @@ public class SolverTests { } @Test - public void testFail1() throws Exception { + public void testFailConflict() throws Exception { assertUnificationFails( term("a"), term("b") ); - } - - @Test - public void testFail2() throws Exception { - assertUnificationFails( - parse("a{b c}"), - parse("a{X}") - ); - } - - @Test - public void testFail3() throws Exception { assertUnificationFails( parse("node{name{X} child{abc}}"), parse("node{name{foo} child{X}}") ); - } - - @Test - public void testFail4() throws Exception { assertUnificationFails( parse("f{a{X} Y }"), parse("f{Y a{b{X}}}") @@ -414,18 +398,31 @@ public class SolverTests { } @Test - public void testFail5() throws Exception { + public void testFailCard() throws Exception { assertUnificationFails( - parse("f{X}"), - parse("X") + parse("a{b c}"), + parse("a{X}") ); } @Test - public void testFail6() throws Exception { + public void testFailRecursive() throws Exception { + assertUnificationFails( + parse("f{X}"), + parse("X") + ); assertUnificationFails( parse("f{f{X}}"), parse("f{X}") ); + assertUnificationFails( + parse("a{X c{X}}"), + parse("a{b{Y} Y }") + + ); + assertUnificationFails ( + parse("a{@1 b{c{^1}} @2 c{b{^2}}}"), + parse("a{ b{Y} Y }") + ); } } From 41077453e8ce7b5bbd33c01ba206ce6cb85e3107 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Tue, 24 Mar 2015 16:20:40 +0100 Subject: [PATCH 020/190] Reporting the cause of failed unification, some code cleanup --- .../mps/unification/Substitution.java | 51 +++++++++++++++++-- .../mps/unification/Unification.java | 49 ++++++------------ .../UnionFindTermGraphUnifier.java | 17 +++++-- .../unification/test/AssertUnification.java | 7 +++ .../mps/unification/test/SolverTests.java | 47 ++++++++++++----- 5 files changed, 115 insertions(+), 56 deletions(-) diff --git a/reactor/code/src/jetbrains/mps/unification/Substitution.java b/reactor/code/src/jetbrains/mps/unification/Substitution.java index 1e16b58c..180815ef 100644 --- a/reactor/code/src/jetbrains/mps/unification/Substitution.java +++ b/reactor/code/src/jetbrains/mps/unification/Substitution.java @@ -25,13 +25,38 @@ import java.util.Collections; * * @author Fedor Isakov */ -public interface Substitution { +public class Substitution { - boolean isSuccessful(); + private boolean mySuccessful; - Collection bindings() ; + private FailureCause myFailureCause; - public class Binding { + public Substitution(boolean successful) { + mySuccessful = successful; + } + + public Substitution(FailureCause failCause) { + myFailureCause = failCause; + mySuccessful = false; + } + + public boolean isSuccessful() { + return mySuccessful; + } + + public Collection bindings() { + return Collections.emptyList(); + } + + public FailureCause failureCause() { + return myFailureCause; + } + + public String toString() { + return myFailureCause != null ? "[" + myFailureCause + "]" : "[FAILED_SUBSTITUTION]"; + } + + public static class Binding { private Node myVar; private Node myNode; @@ -49,4 +74,22 @@ public interface Substitution { } } + public enum FailureCause { + CYCLE_DETECTED("cycle detected"), + UNRECONCILED_REF("unreconciled ref"), + SYMBOL_CLASH("symbol clash"), + UKNOWN("uknown"); + + private String myMessage; + + FailureCause(String message) { + myMessage = message; + } + + @Override + public String toString() { + return myMessage; + } + } + } diff --git a/reactor/code/src/jetbrains/mps/unification/Unification.java b/reactor/code/src/jetbrains/mps/unification/Unification.java index 01f4530a..cb1d31dd 100644 --- a/reactor/code/src/jetbrains/mps/unification/Unification.java +++ b/reactor/code/src/jetbrains/mps/unification/Unification.java @@ -16,6 +16,8 @@ package jetbrains.mps.unification; +import jetbrains.mps.unification.Substitution.FailureCause; + import java.util.*; /** @@ -32,53 +34,33 @@ public class Unification { return dagUnifier.unify(a, b); } - protected static final Substitution FAILED_SUBSTITUTION = new Substitution() { - @Override - public boolean isSuccessful() { - return false; - } - - @Override - public Collection bindings() { - return Collections.emptyList(); - } - - @Override - public String toString() { - return "[FAILED_SUBSTITUTION]"; - } - }; - - protected static final Substitution EMPTY_SUBSTITUTION = new Substitution() { - @Override - public boolean isSuccessful() { - return true; - } - - @Override - public Collection bindings() { - return Collections.emptyList(); - } + protected static Substitution failedSubstitution(FailureCause failCause) { + return new Substitution(failCause); + } + protected static final Substitution EMPTY_SUBSTITUTION = new Substitution(true) { @Override public String toString() { return "[]"; } }; - protected static class SuccessfulSubstitution implements Substitution { + protected static final Substitution FAILED_SUBSTITUTION = new Substitution(FailureCause.UKNOWN) { + @Override + public String toString() { + return "[FAILED_SUBSTITUTION]"; + } + }; + + protected static class SuccessfulSubstitution extends Substitution { private LinkedList myBindings; protected SuccessfulSubstitution(Substitution substitution) { + super(true); this.myBindings = new LinkedList(substitution.bindings()); } - @Override - public boolean isSuccessful() { - return true; - } - @Override public Collection bindings() { return Collections.unmodifiableCollection(myBindings); @@ -108,5 +90,4 @@ public class Unification { } } - } diff --git a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java index af2d7231..91182f3f 100644 --- a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java +++ b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java @@ -16,11 +16,13 @@ package jetbrains.mps.unification; +import jetbrains.mps.unification.Substitution.FailureCause; import jetbrains.mps.unification.Unification.SuccessfulSubstitution; import java.util.*; import static jetbrains.mps.unification.Node.Kind.*; +import static jetbrains.mps.unification.Substitution.FailureCause.*; import static jetbrains.mps.unification.Unification.*; /** @@ -51,9 +53,11 @@ public class UnionFindTermGraphUnifier { private int myUnreconciledRefs = 0; + private FailureCause myFailureCause = UKNOWN; + public Substitution unify(Node a, Node b) { if (!unifClosure(a, b)) { - return FAILED_SUBSTITUTION; + return failedSubstitution(myFailureCause); } return findSolution(a); @@ -108,6 +112,7 @@ public class UnionFindTermGraphUnifier { if (zs.is(FUN) && zt.is(FUN)) { if (!eq(zs.symbol(), zt.symbol())) { + myFailureCause = SYMBOL_CLASH; return false; // symbol clash } @@ -119,7 +124,9 @@ public class UnionFindTermGraphUnifier { Iterator scit = zs.children().iterator(); Iterator tcit = zt.children().iterator(); while (scit.hasNext() && tcit.hasNext()) { - if (!unifClosure(scit.next(), tcit.next())) return false; + if (!unifClosure(scit.next(), tcit.next())) { + return false; // children mismatch + } } // fail if different children count @@ -127,7 +134,7 @@ public class UnionFindTermGraphUnifier { } else { // something's wrong with the input - return false; + throw new IllegalStateException("invalid input"); } } @@ -194,7 +201,7 @@ public class UnionFindTermGraphUnifier { return substitution; // not part of a cycle } if (isVisited(z)) { - return FAILED_SUBSTITUTION; // there exists a cycle + return failedSubstitution(CYCLE_DETECTED); // there exists a cycle } int unreconciled = myUnreconciledRefs; @@ -227,7 +234,7 @@ public class UnionFindTermGraphUnifier { for (Node var : getVars(find(z))) { if (var != z) { if (myUnreconciledRefs != unreconciled) { - return FAILED_SUBSTITUTION; // there's an unreconciled outward reference + return failedSubstitution(UNRECONCILED_REF); // there's an unreconciled outward reference } Node val = z.is(REF) ? z.get() : z; diff --git a/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java index 3f9fc4b8..2081f9d4 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java @@ -94,4 +94,11 @@ public class AssertUnification { assertFalse(subs.isSuccessful()); } + public static void assertUnificationFails(Node s, Node t, FailureCause failureCause) throws Exception { + Substitution subs = Unification.unify(s, t); + + assertFalse(subs.isSuccessful()); + assertSame(failureCause, subs.failureCause()); + } + } \ No newline at end of file diff --git a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java index 06372b73..d168c873 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java @@ -16,12 +16,13 @@ package jetbrains.mps.unification.test; -import jetbrains.mps.unification.Node; import org.junit.Test; -import static jetbrains.mps.unification.test.MockNode.*; -import static jetbrains.mps.unification.test.MockTreeParser.*; +import static jetbrains.mps.unification.Substitution.FailureCause.*; import static jetbrains.mps.unification.test.AssertUnification.*; +import static jetbrains.mps.unification.test.MockNode.term; +import static jetbrains.mps.unification.test.MockNode.var; +import static jetbrains.mps.unification.test.MockTreeParser.*; /** * Created by fyodor on 09.06.2014. @@ -315,6 +316,13 @@ public class SolverTests { bind(var("X"), parse("@1 a{b ^1}")) ); + assertUnifiesWithBindings( + parse("a{X c{X} }"), + parse("a{b{Y} c{@1 b{@2 c{b{^2}}}}}"), + + bind(var("X"), parse("b{Y}")), + bind(var("Y"), parse("@1 c{b{^1}}")) + ); } @Test @@ -385,15 +393,15 @@ public class SolverTests { public void testFailConflict() throws Exception { assertUnificationFails( term("a"), - term("b") + term("b"), + + SYMBOL_CLASH ); assertUnificationFails( parse("node{name{X} child{abc}}"), - parse("node{name{foo} child{X}}") - ); - assertUnificationFails( - parse("f{a{X} Y }"), - parse("f{Y a{b{X}}}") + parse("node{name{foo} child{X}}"), + + SYMBOL_CLASH ); } @@ -409,20 +417,33 @@ public class SolverTests { public void testFailRecursive() throws Exception { assertUnificationFails( parse("f{X}"), - parse("X") + parse("X"), + + CYCLE_DETECTED ); assertUnificationFails( parse("f{f{X}}"), - parse("f{X}") + parse("f{X}"), + + CYCLE_DETECTED + ); + assertUnificationFails( + parse("f{a{X} Y }"), + parse("f{Y a{b{X}}}"), + + CYCLE_DETECTED ); assertUnificationFails( parse("a{X c{X}}"), - parse("a{b{Y} Y }") + parse("a{b{Y} Y }"), + CYCLE_DETECTED ); assertUnificationFails ( parse("a{@1 b{c{^1}} @2 c{b{^2}}}"), - parse("a{ b{Y} Y }") + parse("a{ b{Y} Y }"), + + UNRECONCILED_REF ); } } From 2fb992ead31ccbc51c27e384464e5c121d2908f1 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Fri, 27 Mar 2015 21:50:15 +0100 Subject: [PATCH 021/190] Dropped check for unreconciled refs, adapted the tests --- .../UnionFindTermGraphUnifier.java | 27 +----- .../test/AssertStructurallyEquivalent.java | 42 +++++++-- .../unification/test/AssertUnification.java | 19 ++-- .../mps/unification/test/MockTreeParser.java | 2 +- .../mps/unification/test/ParserTests.java | 16 ---- .../mps/unification/test/SolverTests.java | 87 +++++++++++++++++-- 6 files changed, 133 insertions(+), 60 deletions(-) diff --git a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java index 91182f3f..c3a130e0 100644 --- a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java +++ b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java @@ -51,8 +51,6 @@ public class UnionFindTermGraphUnifier { private Map myData = new IdentityHashMap(); - private int myUnreconciledRefs = 0; - private FailureCause myFailureCause = UKNOWN; public Substitution unify(Node a, Node b) { @@ -190,7 +188,6 @@ public class UnionFindTermGraphUnifier { } private Substitution findSolution(Node s) { - myUnreconciledRefs = 0; return findSolution(s, EMPTY_SUBSTITUTION); } @@ -204,7 +201,6 @@ public class UnionFindTermGraphUnifier { return failedSubstitution(CYCLE_DETECTED); // there exists a cycle } - int unreconciled = myUnreconciledRefs; if (z.is(FUN)) { setVisited(z, true); @@ -223,20 +219,11 @@ public class UnionFindTermGraphUnifier { return substitution; } - if (isReferenced(z)) { - setReferenced(z, false); - myUnreconciledRefs--; - } - setAcyclic(z, true); SuccessfulSubstitution success = new SuccessfulSubstitution(substitution); for (Node var : getVars(find(z))) { if (var != z) { - if (myUnreconciledRefs != unreconciled) { - return failedSubstitution(UNRECONCILED_REF); // there's an unreconciled outward reference - } - Node val = z.is(REF) ? z.get() : z; // Keep the order of variables within a binding @@ -249,14 +236,10 @@ public class UnionFindTermGraphUnifier { } } - if (z.is(REF) && z.get().is(FUN)) { - setReferenced(z.get(), true); - myUnreconciledRefs++; - } - return success; } + private int getSize(Node n) { if (!hasData(n)) return 1; return getData(n).mySize; @@ -310,14 +293,6 @@ public class UnionFindTermGraphUnifier { getData(n).myVisited = visited; } - private boolean isReferenced(Node n) { - return hasData(n) && getData(n).myReferenced; - } - - private void setReferenced(Node n, boolean referenced) { - getData(n).myReferenced = referenced; - } - private boolean hasData(Node n) { Object key = n.is(VAR) ? String.valueOf(n.symbol()).intern() : n; return myData.containsKey(key); diff --git a/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java index 16f3d3b1..f622495c 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java @@ -38,7 +38,18 @@ public class AssertStructurallyEquivalent { signature.label(term); return term.children(); } - }), + } + , + new NodeVisitor(Node.Kind.REF) { + @Override + public Collection visit(Node ref) throws Exception { + if (ref.get().is(Node.Kind.FUN)) { + return Collections.singletonList(ref.get()); + } + return Collections.emptyList(); + } + } + ), // second pass new NodeWalker( new NodeVisitor(Node.Kind.FUN) { @@ -59,9 +70,14 @@ public class AssertStructurallyEquivalent { public Collection visit(Node ref) throws Exception { if (ref.get().is(Node.Kind.FUN)) { Integer label = signature.getLabel(ref.get()); - assertNotNull("not found label for '"+ref.get() + "'", label); - signature.appendSignature("^").append(label); - return Collections.emptyList(); + assertNotNull("not found label for '" + ref.get() + "'", label); + if (signature.isTopLevel(ref.get())) { + signature.appendSignature("^").append(label); + return Collections.emptyList(); + } + else { + return Collections.singletonList(ref.get()); + } } else if (ref.get().is(Node.Kind.VAR)) { signature.appendSignature("^").append(ref.get().symbol()); @@ -98,6 +114,8 @@ public class AssertStructurallyEquivalent { return labels.get(node); } + protected boolean isTopLevel(Node node) { return labels.get(node) == 1; } + protected StringBuilder appendSignature(String str) { return signature.append(str); } @@ -133,12 +151,16 @@ public class AssertStructurallyEquivalent { return kind; } + + public abstract Collection visit(T t) throws Exception ; } private static class NodeWalker { + private static Object SINGLETON = new Object(); + private Map> visitorMap = new HashMap>(); public NodeWalker(NodeVisitor... visitors) { @@ -148,9 +170,19 @@ public class AssertStructurallyEquivalent { } public void walk(Node node) throws Exception { + walk(node, new IdentityHashMap()); + } + + private void walk(Node node, Map visited) throws Exception { + if (node.is(Node.Kind.FUN)) { + visited.put(node, SINGLETON); + } Collection children = switchClass(node); for (Node child : children) { - walk(child); + if (visited.containsKey(child)) { + continue; + } + walk(child, visited); } } diff --git a/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java index 2081f9d4..19618d5b 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java @@ -89,16 +89,25 @@ public class AssertUnification { } public static void assertUnificationFails(Node s, Node t) throws Exception { - Substitution subs = Unification.unify(s, t); + Substitution subs1 = Unification.unify(s, t); - assertFalse(subs.isSuccessful()); + assertFalse(subs1.isSuccessful()); + + Substitution subs2 = Unification.unify(s, t); + + assertFalse(subs2.isSuccessful()); } public static void assertUnificationFails(Node s, Node t, FailureCause failureCause) throws Exception { - Substitution subs = Unification.unify(s, t); + Substitution subs1 = Unification.unify(s, t); - assertFalse(subs.isSuccessful()); - assertSame(failureCause, subs.failureCause()); + assertFalse(subs1.isSuccessful()); + assertSame(failureCause, subs1.failureCause()); + + Substitution subs2 = Unification.unify(t, s); + + assertFalse(subs2.isSuccessful()); + assertSame(failureCause, subs2.failureCause()); } } \ No newline at end of file diff --git a/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java b/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java index 90bd80fa..d8a74d7b 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java @@ -231,7 +231,7 @@ public class MockTreeParser { private void addRef(String ref) { final int label = Integer.parseInt(ref.substring(1)); - if (termRefs.containsKey(label)) { + if (termRefs.containsKey(label) && termRefs.get(label) != null) { childrenStack.peek().add(ref(termRefs.get(label))); } else { diff --git a/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java b/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java index 3f4dbc66..3b7c44bf 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java @@ -136,22 +136,6 @@ public class ParserTests { term("a", ref(d), d)); } - @Test(expected = ComparisonFailure.class) - public void testNotEquivalent2() throws Exception { - Node b1 = term("b"); - Node b2 = term("b"); - assertEquivalent(parse("a{@2b ^1 @1b ^2}"), - term("a", b2, ref(b2), b1, ref(b1))); - } - - @Test(expected = ComparisonFailure.class) - public void testNotEquivalent3() throws Exception { - Node b1 = term("b"); - Node b2 = term("b"); - assertEquivalent(parse("a{@2b ^1 ^2 @1b}"), - term("a", b2, ref(b2), ref(b1), b1)); - } - @Test(expected = MockTreeParser.ParseException.class) public void testUnclosedFail() { parse("a{b "); diff --git a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java index d168c873..dbb8556b 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java @@ -16,10 +16,12 @@ package jetbrains.mps.unification.test; +import jetbrains.mps.unification.Node; import org.junit.Test; import static jetbrains.mps.unification.Substitution.FailureCause.*; import static jetbrains.mps.unification.test.AssertUnification.*; +import static jetbrains.mps.unification.test.MockNode.ref; import static jetbrains.mps.unification.test.MockNode.term; import static jetbrains.mps.unification.test.MockNode.var; import static jetbrains.mps.unification.test.MockTreeParser.*; @@ -288,6 +290,77 @@ public class SolverTests { parse("@1 a{b ^1}"), parse("@2 a{b ^2}") ); + // the following tests are not very strict, but they suffice to convey a message + // that cyclic terms can be safely unified + assertUnifiesWithBindings( + parse("a{@1 b{c{^2}} @2 b{c{^1}}}"), + parse("a{ b{Y} b{Y} }"), + + // TODO: the innermost "b" must actually contain a ref to the top level + // FIXME: AssertStructurallyEquivalent + bind(var("Y"), parse("@1 c{b{c{b }}}")) + ); + assertUnifiesWithBindings( + parse("a{@1 b{c{^1}} @2 c{b{^2}}}"), + parse("a{ b{Y} Y }"), + + // TODO: the innermost "b" must actually contain a ref to the top level + // FIXME: AssertStructurallyEquivalent + bind(var("Y"), parse("c{b }")) + ); + assertUnifiesWithBindings( + parse("a{@1 b{c{@3 b{c{^3}}}} @2 c{b{^2}}}"), + parse("a{ b{Y} Y }"), + + // TODO: the innermost "c" must actually contain a ref to the top level + // FIXME: AssertStructurallyEquivalent + bind(var("Y"), parse("c{b{c }}")) + ); + assertUnifiesWithBindings( + parse("@1 a{c{d} b{e{^1 f}}}"), + parse(" a{c{X} b{Y}}"), + + bind(var("X"), parse("d")), + + // TODO: the innermost "b" must actually contain a ref to the top level + // FIXME: AssertStructurallyEquivalent + bind(var("Y"), parse("e{a{c{d} b } f}")) + ); + assertUnifiesWithBindings( + parse("@1 a{c{d} b{e{@2 a{c{d} b{e{^2 f}}} f}}}"), + parse(" a{c{X} b{Y}}"), + + bind(var("X"), parse("d")), + + // TODO: the innermost "e" must actually contain a ref to the top level + // FIXME: AssertStructurallyEquivalent + bind(var("Y"), parse("e{a{c{d} b{e{ f}}} f}")) + ); + } + + @Test + public void testCyclicExt() throws Exception { + Node left = parse("@1 j{^1}"); + Node right = term("j", term("j", ref(left))); + assertUnifiesWithBindings( + left, + right + ); + assertUnifiesWithBindings( + parse("a{@1 b{c{^1}} b{c{Z}} @2 c{b{^2}}}"), + parse("a{ Z b{Y} Y }"), + + bind(var("Y"), parse("@2 c{Z}")), + bind(var("Z"), parse("@1 b{c{^1}}")) + ); + assertUnifiesWithBindings( + parse("@1 a{c{d} b{e{Z f}} ^1}"), + parse(" a{c{X} b{Y} Z}"), + + bind(var("X"), parse("d")), + bind(var("Y"), parse("e{Z f}")), + bind(var("Z"), parse("@1 a{c{d} b{e{Z f}} ^1}")) + ); } @Test @@ -327,7 +400,6 @@ public class SolverTests { @Test public void testVarRef() throws Exception { - assertUnifiesWithBindings( parse("^X"), parse("Y"), @@ -358,7 +430,6 @@ public class SolverTests { bind(var("X"), parse("d")) ); - } @Test @@ -414,7 +485,7 @@ public class SolverTests { } @Test - public void testFailRecursive() throws Exception { + public void testFailCyclic() throws Exception { assertUnificationFails( parse("f{X}"), parse("X"), @@ -439,11 +510,13 @@ public class SolverTests { CYCLE_DETECTED ); - assertUnificationFails ( - parse("a{@1 b{c{^1}} @2 c{b{^2}}}"), - parse("a{ b{Y} Y }"), + assertUnificationFails( + parse("a{ b{c{b{c{b{c{^2}}}}}} @2 b{c{b{c{^2}}}}}"), + parse("a{ b{Y} b{Y} }"), - UNRECONCILED_REF + CYCLE_DETECTED ); } + + } From 5ee965a88d8575f4bee5a9418aa53bb07270ecb2 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Sat, 1 Aug 2015 12:11:46 +0200 Subject: [PATCH 022/190] Renamed Node to Term, changed the API accordingly --- .../mps/unification/Substitution.java | 14 +-- .../mps/unification/{Node.java => Term.java} | 8 +- .../mps/unification/Unification.java | 8 +- .../UnionFindTermGraphUnifier.java | 102 +++++++++--------- .../mps/unification/test/AssertAll.java | 6 +- .../test/AssertStructurallyEquivalent.java | 98 ++++++++--------- .../unification/test/AssertUnification.java | 14 +-- .../test/{MockNode.java => MockTerm.java} | 64 +++++------ ...ckTreeParser.java => MockTermsParser.java} | 48 ++++----- .../mps/unification/test/ParserTests.java | 44 ++++---- .../mps/unification/test/SolverTests.java | 12 +-- 11 files changed, 207 insertions(+), 211 deletions(-) rename reactor/code/src/jetbrains/mps/unification/{Node.java => Term.java} (89%) rename reactor/tests/src/jetbrains/mps/unification/test/{MockNode.java => MockTerm.java} (72%) rename reactor/tests/src/jetbrains/mps/unification/test/{MockTreeParser.java => MockTermsParser.java} (88%) diff --git a/reactor/code/src/jetbrains/mps/unification/Substitution.java b/reactor/code/src/jetbrains/mps/unification/Substitution.java index 180815ef..beafdbd7 100644 --- a/reactor/code/src/jetbrains/mps/unification/Substitution.java +++ b/reactor/code/src/jetbrains/mps/unification/Substitution.java @@ -57,20 +57,20 @@ public class Substitution { } public static class Binding { - private Node myVar; - private Node myNode; + private Term myVar; + private Term myTerm; - public Binding(Node myVar, Node myNode) { + public Binding(Term myVar, Term myTerm) { this.myVar = myVar; - this.myNode = myNode; + this.myTerm = myTerm; } - public Node var() { + public Term var() { return myVar; } - public Node node() { - return myNode; + public Term term() { + return myTerm; } } diff --git a/reactor/code/src/jetbrains/mps/unification/Node.java b/reactor/code/src/jetbrains/mps/unification/Term.java similarity index 89% rename from reactor/code/src/jetbrains/mps/unification/Node.java rename to reactor/code/src/jetbrains/mps/unification/Term.java index c18d4a8c..a4e6d909 100644 --- a/reactor/code/src/jetbrains/mps/unification/Node.java +++ b/reactor/code/src/jetbrains/mps/unification/Term.java @@ -26,17 +26,15 @@ import java.util.Collection; * A term must implement {@link java.lang.Comparable}, but this is only really used for * comparing the variables. * - * Soon to be renamed to Term. - * * @author Fedor Isakov */ -public interface Node extends Comparable { +public interface Term extends Comparable { Object symbol(); - Collection children(); + Collection children(); - Node get(); + Term get(); boolean is(Kind kind); diff --git a/reactor/code/src/jetbrains/mps/unification/Unification.java b/reactor/code/src/jetbrains/mps/unification/Unification.java index cb1d31dd..a2136593 100644 --- a/reactor/code/src/jetbrains/mps/unification/Unification.java +++ b/reactor/code/src/jetbrains/mps/unification/Unification.java @@ -28,7 +28,7 @@ import java.util.*; */ public class Unification { - public static Substitution unify(Node a, Node b) { + public static Substitution unify(Term a, Term b) { UnionFindTermGraphUnifier dagUnifier = new UnionFindTermGraphUnifier(); return dagUnifier.unify(a, b); @@ -72,14 +72,14 @@ public class Unification { String sep = ""; for (Binding b : myBindings) { sb.append(sep); sep = ", "; - sb.append(b.var()).append(" -> ").append(b.node()); + sb.append(b.var()).append(" -> ").append(b.term()); } return sb.append("]").toString(); } - protected void addBinding(Node v, Node n) { + protected void addBinding(Term v, Term n) { Binding bng; - if (n.is(Node.Kind.VAR) && n.compareTo(n) < 0) { + if (n.is(Term.Kind.VAR) && n.compareTo(n) < 0) { bng = new Binding(n, v); } else { diff --git a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java index c3a130e0..bcfc04e9 100644 --- a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java +++ b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java @@ -21,7 +21,7 @@ import jetbrains.mps.unification.Unification.SuccessfulSubstitution; import java.util.*; -import static jetbrains.mps.unification.Node.Kind.*; +import static jetbrains.mps.unification.Term.Kind.*; import static jetbrains.mps.unification.Substitution.FailureCause.*; import static jetbrains.mps.unification.Unification.*; @@ -53,7 +53,7 @@ public class UnionFindTermGraphUnifier { private FailureCause myFailureCause = UKNOWN; - public Substitution unify(Node a, Node b) { + public Substitution unify(Term a, Term b) { if (!unifClosure(a, b)) { return failedSubstitution(myFailureCause); } @@ -61,14 +61,14 @@ public class UnionFindTermGraphUnifier { return findSolution(a); } - private boolean unifClosure(Node s, Node t) { + private boolean unifClosure(Term s, Term t) { s = find(s); t = find(t); if (s == t) return true; - Node zs = getSchema(s); - Node zt = getSchema(t); + Term zs = getSchema(s); + Term zt = getSchema(t); // a VAR always matches another node if(zs.is(VAR) || zt.is(VAR)) { @@ -77,8 +77,8 @@ public class UnionFindTermGraphUnifier { } // dereference REF nodes - Node ds = zs.is(REF) ? zs.get() : zs; - Node dt = zt.is(REF) ? zt.get() : zt; + Term ds = zs.is(REF) ? zs.get() : zs; + Term dt = zt.is(REF) ? zt.get() : zt; if (ds.is(VAR)) { if (s != find(ds)) { @@ -119,8 +119,8 @@ public class UnionFindTermGraphUnifier { union(s, t); } - Iterator scit = zs.children().iterator(); - Iterator tcit = zt.children().iterator(); + Iterator scit = zs.children().iterator(); + Iterator tcit = zt.children().iterator(); while (scit.hasNext() && tcit.hasNext()) { if (!unifClosure(scit.next(), tcit.next())) { return false; // children mismatch @@ -136,18 +136,18 @@ public class UnionFindTermGraphUnifier { } } - private void union(Node s, Node t) { + private void union(Term s, Term t) { int ssize = getSize(s); int tsize = getSize(t); // keep the order: the smaller class gets inserted under the bigger one if (ssize < tsize) { - Node tmp = t; t = s; s = tmp; + Term tmp = t; t = s; s = tmp; } else if (ssize == tsize && s.is(VAR) && t.is(VAR)) { // ensure proper order of variables in the substitution if(t.compareTo(s) < 0) { - Node tmp = t; t = s; s = tmp; + Term tmp = t; t = s; s = tmp; } } @@ -156,8 +156,8 @@ public class UnionFindTermGraphUnifier { setSize(s, ssize + tsize); appendVars(s, getVars(t)); - Node zs = getSchema(s); - Node zt = getSchema(t); + Term zs = getSchema(s); + Term zt = getSchema(t); if (zs.is(VAR) || (zs.is(REF) && zs.get().is(VAR) && !zt.is(VAR))) { setSchema(s, zt); @@ -166,33 +166,33 @@ public class UnionFindTermGraphUnifier { setRepresentative(t, s); } - private Node find(Node s) { - Node node = getRepresentative(s); - if (node == s) { + private Term find(Term s) { + Term term = getRepresentative(s); + if (term == s) { return s; } // find representative and compress paths - List path = new ArrayList(); - path.add(node); - for (Node t; (t = getRepresentative(node)) != node; ) { + List path = new ArrayList(); + path.add(term); + for (Term t; (t = getRepresentative(term)) != term; ) { path.add(t); - node = t; + term = t; } - for (Node p : path) { - setRepresentative(p, node); + for (Term p : path) { + setRepresentative(p, term); } - return node; + return term; } - private Substitution findSolution(Node s) { + private Substitution findSolution(Term s) { return findSolution(s, EMPTY_SUBSTITUTION); } - private Substitution findSolution(Node s, Substitution substitution) { - Node z = getSchema(find(s)); + private Substitution findSolution(Term s, Substitution substitution) { + Term z = getSchema(find(s)); if (isAcyclic(z)) { return substitution; // not part of a cycle @@ -204,7 +204,7 @@ public class UnionFindTermGraphUnifier { if (z.is(FUN)) { setVisited(z, true); - for (Node c : z.children()) { + for (Term c : z.children()) { substitution = findSolution(c, substitution); if (!substitution.isSuccessful()) { @@ -222,9 +222,9 @@ public class UnionFindTermGraphUnifier { setAcyclic(z, true); SuccessfulSubstitution success = new SuccessfulSubstitution(substitution); - for (Node var : getVars(find(z))) { + for (Term var : getVars(find(z))) { if (var != z) { - Node val = z.is(REF) ? z.get() : z; + Term val = z.is(REF) ? z.get() : z; // Keep the order of variables within a binding if (val.is(VAR) && val.compareTo(var) < 0) { @@ -240,65 +240,65 @@ public class UnionFindTermGraphUnifier { } - private int getSize(Node n) { + private int getSize(Term n) { if (!hasData(n)) return 1; return getData(n).mySize; } - private void setSize(Node n, int size) { + private void setSize(Term n, int size) { getData(n).mySize = size; } - private Node getRepresentative(Node n) { + private Term getRepresentative(Term n) { if (!hasData(n)) return n; return getData(n).myClass; } - private void setRepresentative(Node n, Node rep) { + private void setRepresentative(Term n, Term rep) { getData(n).myClass = rep; } - private Node getSchema(Node n) { + private Term getSchema(Term n) { if (!hasData(n)) return n; return getData(n).mySchema; } - private void setSchema(Node n, Node schema) { + private void setSchema(Term n, Term schema) { getData(n).mySchema = schema; } - private List getVars(Node n) { + private List getVars(Term n) { return hasData(n) ? getData(n).myVars : singletonVar(n); } - private void appendVars(Node n, List vars) { - List newVars = new ArrayList(getVars(n)); + private void appendVars(Term n, List vars) { + List newVars = new ArrayList(getVars(n)); newVars.addAll(vars); getData(n).myVars = newVars; } - private boolean isAcyclic(Node n) { + private boolean isAcyclic(Term n) { return hasData(n) && getData(n).myAcyclic; } - private void setAcyclic(Node n, boolean acyclic) { + private void setAcyclic(Term n, boolean acyclic) { getData(n).myAcyclic = acyclic; } - private boolean isVisited(Node n) { + private boolean isVisited(Term n) { return hasData(n) && getData(n).myVisited; } - private void setVisited(Node n, boolean visited) { + private void setVisited(Term n, boolean visited) { getData(n).myVisited = visited; } - private boolean hasData(Node n) { + private boolean hasData(Term n) { Object key = n.is(VAR) ? String.valueOf(n.symbol()).intern() : n; return myData.containsKey(key); } - private Data getData(Node n) { + private Data getData(Term n) { Object key = n.is(VAR) ? String.valueOf(n.symbol()).intern() : n; if (myData.containsKey(key)) return myData.get(key); Data data = new Data(n); @@ -310,10 +310,10 @@ public class UnionFindTermGraphUnifier { return a == null ? b == null : a.equals(b); } - private static List singletonVar(Node n) { + private static List singletonVar(Term n) { return n.is(VAR) ? Collections.singletonList(n) : - Collections.emptyList(); + Collections.emptyList(); } private static class Data { @@ -322,11 +322,11 @@ public class UnionFindTermGraphUnifier { boolean myVisited = false; boolean myReferenced = false; - List myVars; - Node myClass; - Node mySchema; + List myVars; + Term myClass; + Term mySchema; - Data(Node n) { + Data(Term n) { myClass = n; mySchema = n; myVars = singletonVar(n); diff --git a/reactor/tests/src/jetbrains/mps/unification/test/AssertAll.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertAll.java index 61a46c31..84cf034a 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/AssertAll.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertAll.java @@ -16,7 +16,7 @@ package jetbrains.mps.unification.test; -import jetbrains.mps.unification.Node; +import jetbrains.mps.unification.Term; import java.util.Arrays; import java.util.Collection; @@ -28,8 +28,8 @@ import static org.junit.Assert.assertEquals; */ public class AssertAll { - public static void assertEqualsAll(Collection parsed, Node ... nodes) { - assertEquals(parsed, Arrays.asList(nodes)); + public static void assertEqualsAll(Collection parsed, Term... terms) { + assertEquals(parsed, Arrays.asList(terms)); } } diff --git a/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java index f622495c..34ad22a7 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java @@ -16,7 +16,7 @@ package jetbrains.mps.unification.test; -import jetbrains.mps.unification.Node; +import jetbrains.mps.unification.Term; import static org.junit.Assert.*; import java.util.*; @@ -26,24 +26,24 @@ import java.util.*; */ public class AssertStructurallyEquivalent { - public static void assertEquivalent(Node a, Node b) throws Exception { + public static void assertEquivalent(Term a, Term b) throws Exception { final Signature signature = new Signature(); signature.setWalkers( // first pass - new NodeWalker( - new NodeVisitor(Node.Kind.FUN) { + new TermWalker( + new TermVisitor(Term.Kind.FUN) { @Override - public Collection visit(Node term) throws Exception { + public Collection visit(Term term) throws Exception { signature.label(term); return term.children(); } } , - new NodeVisitor(Node.Kind.REF) { + new TermVisitor(Term.Kind.REF) { @Override - public Collection visit(Node ref) throws Exception { - if (ref.get().is(Node.Kind.FUN)) { + public Collection visit(Term ref) throws Exception { + if (ref.get().is(Term.Kind.FUN)) { return Collections.singletonList(ref.get()); } return Collections.emptyList(); @@ -51,24 +51,24 @@ public class AssertStructurallyEquivalent { } ), // second pass - new NodeWalker( - new NodeVisitor(Node.Kind.FUN) { + new TermWalker( + new TermVisitor(Term.Kind.FUN) { @Override - public Collection visit(Node term) throws Exception { + public Collection visit(Term term) throws Exception { signature.appendSignature("@").append(signature.getLabel(term)).append(term.symbol()); return term.children(); } }, - new NodeVisitor(Node.Kind.VAR) { + new TermVisitor(Term.Kind.VAR) { @Override - public Collection visit(Node var) throws Exception { + public Collection visit(Term var) throws Exception { signature.appendSignature("$").append(var.symbol()); return Collections.emptyList(); } - }, new NodeVisitor(Node.Kind.REF) { + }, new TermVisitor(Term.Kind.REF) { @Override - public Collection visit(Node ref) throws Exception { - if (ref.get().is(Node.Kind.FUN)) { + public Collection visit(Term ref) throws Exception { + if (ref.get().is(Term.Kind.FUN)) { Integer label = signature.getLabel(ref.get()); assertNotNull("not found label for '" + ref.get() + "'", label); if (signature.isTopLevel(ref.get())) { @@ -79,7 +79,7 @@ public class AssertStructurallyEquivalent { return Collections.singletonList(ref.get()); } } - else if (ref.get().is(Node.Kind.VAR)) { + else if (ref.get().is(Term.Kind.VAR)) { signature.appendSignature("^").append(ref.get().symbol()); return Collections.emptyList(); } @@ -100,30 +100,30 @@ public class AssertStructurallyEquivalent { private static class Signature { - private NodeWalker[] walkers; + private TermWalker[] walkers; - private IdentityHashMap labels = new IdentityHashMap(); + private IdentityHashMap labels = new IdentityHashMap(); private int label = 1; private StringBuilder signature = new StringBuilder(); - protected void label(Node node) { - labels.put(node, label++); + protected void label(Term term) { + labels.put(term, label++); } - protected Integer getLabel(Node node) { - return labels.get(node); + protected Integer getLabel(Term term) { + return labels.get(term); } - protected boolean isTopLevel(Node node) { return labels.get(node) == 1; } + protected boolean isTopLevel(Term term) { return labels.get(term) == 1; } protected StringBuilder appendSignature(String str) { return signature.append(str); } - public String getSignature (Node node) throws Exception { + public String getSignature (Term term) throws Exception { reset(); - for (NodeWalker walker : walkers) { - walker.walk(node); + for (TermWalker walker : walkers) { + walker.walk(term); } return signature.toString(); } @@ -134,51 +134,51 @@ public class AssertStructurallyEquivalent { signature.setLength(0); } - protected void setWalkers(NodeWalker ... walkers) { + protected void setWalkers(TermWalker... walkers) { this.walkers = walkers; } } - private static abstract class NodeVisitor { + private static abstract class TermVisitor { - private Node.Kind kind; + private Term.Kind kind; - public NodeVisitor(Node.Kind kind) { + public TermVisitor(Term.Kind kind) { this.kind = kind; } - public Node.Kind applicableTo() { + public Term.Kind applicableTo() { return kind; } - public abstract Collection visit(T t) throws Exception ; + public abstract Collection visit(T t) throws Exception ; } - private static class NodeWalker { + private static class TermWalker { private static Object SINGLETON = new Object(); - private Map> visitorMap = new HashMap>(); + private Map> visitorMap = new HashMap>(); - public NodeWalker(NodeVisitor... visitors) { - for (NodeVisitor visitor : visitors) { + public TermWalker(TermVisitor... visitors) { + for (TermVisitor visitor : visitors) { visitorMap.put(visitor.applicableTo(), visitor); } } - public void walk(Node node) throws Exception { - walk(node, new IdentityHashMap()); + public void walk(Term term) throws Exception { + walk(term, new IdentityHashMap()); } - private void walk(Node node, Map visited) throws Exception { - if (node.is(Node.Kind.FUN)) { - visited.put(node, SINGLETON); + private void walk(Term term, Map visited) throws Exception { + if (term.is(Term.Kind.FUN)) { + visited.put(term, SINGLETON); } - Collection children = switchClass(node); - for (Node child : children) { + Collection children = switchClass(term); + for (Term child : children) { if (visited.containsKey(child)) { continue; } @@ -186,11 +186,11 @@ public class AssertStructurallyEquivalent { } } - private Collection switchClass(Node node) throws Exception { - for (Map.Entry> e : visitorMap.entrySet()) { - if (node.is(e.getKey())) { - NodeVisitor value = (NodeVisitor) e.getValue(); - return value.visit(node); + private Collection switchClass(Term term) throws Exception { + for (Map.Entry> e : visitorMap.entrySet()) { + if (term.is(e.getKey())) { + TermVisitor value = (TermVisitor) e.getValue(); + return value.visit(term); } } return Collections.emptyList(); diff --git a/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java index 19618d5b..3c2c31d7 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java @@ -19,7 +19,7 @@ package jetbrains.mps.unification.test; import jetbrains.mps.unification.Substitution; import static jetbrains.mps.unification.Substitution.*; import jetbrains.mps.unification.Unification; -import jetbrains.mps.unification.Node; +import jetbrains.mps.unification.Term; import java.util.*; @@ -39,7 +39,7 @@ public class AssertUnification { } }; - public static Binding bind(Node v, Node n) { + public static Binding bind(Term v, Term n) { return new Binding(v, n); } @@ -56,12 +56,12 @@ public class AssertUnification { Binding actb = actIt.next(); assertEquals(expb.var(), actb.var()); - assertEquivalent(expb.node(), actb.node()); + assertEquivalent(expb.term(), actb.term()); } if(expIt.hasNext() || actIt.hasNext()) throw new Exception("mismatched number of bindings"); } - public static void assertUnifiesWithBindings(Node s, Node t, Substitution.Binding ... bindings) throws Exception{ + public static void assertUnifiesWithBindings(Term s, Term t, Substitution.Binding ... bindings) throws Exception{ Substitution subs = Unification.unify(s, t); assertTrue(subs.isSuccessful()); @@ -77,7 +77,7 @@ public class AssertUnification { assertSameBindings(subs.bindings(), subs2.bindings()); } - public static void assertUnifiesWithBindingsAsymm(Node s, Node t, Substitution.Binding ... bindings) throws Exception{ + public static void assertUnifiesWithBindingsAsymm(Term s, Term t, Substitution.Binding ... bindings) throws Exception{ Substitution subs = Unification.unify(s, t); assertTrue(subs.isSuccessful()); @@ -88,7 +88,7 @@ public class AssertUnification { subs.bindings()); } - public static void assertUnificationFails(Node s, Node t) throws Exception { + public static void assertUnificationFails(Term s, Term t) throws Exception { Substitution subs1 = Unification.unify(s, t); assertFalse(subs1.isSuccessful()); @@ -98,7 +98,7 @@ public class AssertUnification { assertFalse(subs2.isSuccessful()); } - public static void assertUnificationFails(Node s, Node t, FailureCause failureCause) throws Exception { + public static void assertUnificationFails(Term s, Term t, FailureCause failureCause) throws Exception { Substitution subs1 = Unification.unify(s, t); assertFalse(subs1.isSuccessful()); diff --git a/reactor/tests/src/jetbrains/mps/unification/test/MockNode.java b/reactor/tests/src/jetbrains/mps/unification/test/MockTerm.java similarity index 72% rename from reactor/tests/src/jetbrains/mps/unification/test/MockNode.java rename to reactor/tests/src/jetbrains/mps/unification/test/MockTerm.java index 284b8268..3987a2b5 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/MockNode.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/MockTerm.java @@ -16,36 +16,36 @@ package jetbrains.mps.unification.test; -import jetbrains.mps.unification.Node; +import jetbrains.mps.unification.Term; import java.util.*; /** * Created by fyodor on 09.06.2014. */ -public abstract class MockNode implements Node { +public abstract class MockTerm implements Term { - public MockNode() { + public MockTerm() { } - public static Node term(Object sym, Node ... children) { - return new MockTerm(sym, children); + public static Term term(Object sym, Term... children) { + return new MockFun(sym, children); } - public static Node var(String name) { + public static Term var(String name) { return new MockVar(name); } - public static Node ref(Node term) { + public static Term ref(Term term) { return new MockRef(term); } - public static Node ref(TermLookup termLookup) { + public static Term ref(TermLookup termLookup) { return new MockRef(termLookup); } interface TermLookup { - Node lookupTerm(); + Term lookupTerm(); } @Override @@ -54,27 +54,27 @@ public abstract class MockNode implements Node { } @Override - public Collection children() { + public Collection children() { return null; } @Override - public Node get() { + public Term get() { return this; } @Override - public int compareTo(Node node) { - return String.valueOf(symbol()).compareTo(String.valueOf(node.symbol())); + public int compareTo(Term term) { + return String.valueOf(symbol()).compareTo(String.valueOf(term.symbol())); } - public static class MockTerm extends MockNode { - private List myChildren; + public static class MockFun extends MockTerm { + private List myArgs; private Object mySymbol; - public MockTerm(Object symbol, Node... children) { + public MockFun(Object symbol, Term... children) { mySymbol = symbol; - this.myChildren = Arrays.asList(children); + this.myArgs = Arrays.asList(children); } @Override @@ -83,8 +83,8 @@ public abstract class MockNode implements Node { } @Override - public Collection children() { - return Collections.unmodifiableList(myChildren); + public Collection children() { + return Collections.unmodifiableList(myArgs); } @Override @@ -95,10 +95,10 @@ public abstract class MockNode implements Node { @Override public String toString() { StringBuilder sb = new StringBuilder(String.valueOf(mySymbol)); - if (!myChildren.isEmpty()) { + if (!myArgs.isEmpty()) { sb.append("{"); String sep = ""; - for (Node child : myChildren) { + for (Term child : myArgs) { sb.append(sep); sep = " "; sb.append(child.toString()); } @@ -110,17 +110,17 @@ public abstract class MockNode implements Node { @Override public int hashCode() { int hash = 43 + mySymbol.hashCode(); - return hash*19 + myChildren.hashCode(); + return hash*19 + myArgs.hashCode(); } @Override public boolean equals(Object o) { - return ((MockTerm)o).mySymbol.equals(mySymbol) && - ((MockTerm)o).myChildren.equals(myChildren); + return ((MockFun)o).mySymbol.equals(mySymbol) && + ((MockFun)o).myArgs.equals(myArgs); } } - public static class MockVar extends MockNode { + public static class MockVar extends MockTerm { private String myName; public MockVar(String name) { @@ -154,12 +154,12 @@ public abstract class MockNode implements Node { } - public static class MockRef extends MockNode { + public static class MockRef extends MockTerm { - private Node term; + private Term term; private TermLookup termLookup; - public MockRef(Node term) { + public MockRef(Term term) { this.term = term; } @@ -168,7 +168,7 @@ public abstract class MockNode implements Node { } @Override - public final Node get() { + public final Term get() { if (term == null && termLookup != null) { term = termLookup.lookupTerm(); termLookup = null; @@ -183,7 +183,7 @@ public abstract class MockNode implements Node { @Override public String toString() { - Node t = get(); + Term t = get(); return t != null ? "^"+ t.symbol() : "^"; } @@ -192,12 +192,12 @@ public abstract class MockNode implements Node { if (that == this) return true; if (that == null || getClass() != that.getClass()) return false; - return get() == ((MockNode) that).get(); + return get() == ((MockTerm) that).get(); } @Override public int hashCode() { - Node t = get(); + Term t = get(); return t != null ? System.identityHashCode(t) : 0; } } diff --git a/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java b/reactor/tests/src/jetbrains/mps/unification/test/MockTermsParser.java similarity index 88% rename from reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java rename to reactor/tests/src/jetbrains/mps/unification/test/MockTermsParser.java index d8a74d7b..51215554 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/MockTreeParser.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/MockTermsParser.java @@ -16,36 +16,36 @@ package jetbrains.mps.unification.test; -import jetbrains.mps.unification.Node; +import jetbrains.mps.unification.Term; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static jetbrains.mps.unification.test.MockNode.*; +import static jetbrains.mps.unification.test.MockTerm.*; /** * Created by fyodor on 10.06.2014. */ -public class MockTreeParser { +public class MockTermsParser { - public static Collection parseAll(String str) { + public static Collection parseAll(String str) { return new RecursiveDescent().parse(str); } - public static Node parse(String str) { - List nodes = new RecursiveDescent().parse(str); - if (nodes.size() != 1) { + public static Term parse(String str) { + List terms = new RecursiveDescent().parse(str); + if (terms.size() != 1) { throw new IllegalArgumentException("expected single asTerm or asVar"); } - return nodes.get(0); + return terms.get(0); } - public static Node parseTerm(String str) { - return (Node) parse(str); + public static Term parseTerm(String str) { + return parse(str); } - public static Node parseVar(String str) { + public static Term parseVar(String str) { return parse(str); } @@ -54,19 +54,19 @@ public class MockTreeParser { private Token lastToken; private LinkedList termsStack = new LinkedList(); private LinkedList termLabelsStack = new LinkedList(); - private LinkedList> childrenStack = new LinkedList>(); + private LinkedList> childrenStack = new LinkedList>(); private int lastLabel = -1; - private Map termRefs = new HashMap(); + private Map termRefs = new HashMap(); // initialized on the parse finished private LookupHelper lookupHelper = new LookupHelper(); - private List parse(String toParse) { + private List parse(String toParse) { parseNextToken(Token.START, null); loop(toParse); parseNextToken(Token.END, null); checkFinalState(); checkAllRefsExist(); - lookupHelper.setTermRefs(Collections.unmodifiableMap(new HashMap(termRefs))); + lookupHelper.setTermRefs(Collections.unmodifiableMap(new HashMap(termRefs))); return Collections.unmodifiableList(childrenStack.pop()); } @@ -93,7 +93,7 @@ public class MockTreeParser { private void parseNextToken(Token token, String value) { switch (token) { case START: - childrenStack.push(new ArrayList()); + childrenStack.push(new ArrayList()); break; case END: checkLastTokenOneOf(Token.TERM, Token.VAR, Token.VARREF, Token.RBRACE); @@ -183,7 +183,7 @@ public class MockTreeParser { } private void checkAllRefsExist() { - for (Map.Entry e: termRefs.entrySet()) { + for (Map.Entry e: termRefs.entrySet()) { if (e.getValue() == null) { throw new ParseException("non-existing label '" + e.getKey() + "'"); } @@ -199,7 +199,7 @@ public class MockTreeParser { private void emptyTerm() { String name = termsStack.pop(); Integer label = termLabelsStack.pop(); - Node newTerm = term(name); + Term newTerm = term(name); childrenStack.peek().add(newTerm); if (label != null) { termRefs.put(label, newTerm); @@ -207,14 +207,14 @@ public class MockTreeParser { } private void beginChildren(){ - childrenStack.push(new ArrayList()); + childrenStack.push(new ArrayList()); } private void endChildren() { - List children = childrenStack.pop(); + List children = childrenStack.pop(); String name = termsStack.pop(); Integer label = termLabelsStack.pop(); - Node newTerm = term(name, children.toArray(new Node[children.size()])); + Term newTerm = term(name, children.toArray(new Term[children.size()])); childrenStack.peek().add(newTerm); if (label != null) { termRefs.put(label, newTerm); @@ -267,16 +267,16 @@ public class MockTreeParser { } private static class LookupHelper { - private Map termRefs; + private Map termRefs; - private void setTermRefs (Map termRefs) { + private void setTermRefs (Map termRefs) { this.termRefs = termRefs; } public TermLookup lookup(final int label) { return new TermLookup() { @Override - public Node lookupTerm() { + public Term lookupTerm() { if (termRefs == null) { throw new IllegalStateException("call to uninitialized lookup"); } diff --git a/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java b/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java index 3b7c44bf..8c615022 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/ParserTests.java @@ -16,14 +16,14 @@ package jetbrains.mps.unification.test; -import jetbrains.mps.unification.Node; +import jetbrains.mps.unification.Term; import org.junit.ComparisonFailure; import org.junit.Test; import static org.junit.Assert.*; -import static jetbrains.mps.unification.test.MockNode.*; -import static jetbrains.mps.unification.test.MockTreeParser.*; +import static jetbrains.mps.unification.test.MockTerm.*; +import static jetbrains.mps.unification.test.MockTermsParser.*; import static jetbrains.mps.unification.test.AssertAll.*; import static jetbrains.mps.unification.test.AssertStructurallyEquivalent.*; @@ -33,10 +33,10 @@ import static jetbrains.mps.unification.test.AssertStructurallyEquivalent.*; public class ParserTests { private static class LazyTermLookup implements TermLookup{ - private Node term; + private Term term; @Override - public Node lookupTerm() { + public Term lookupTerm() { return term; } } @@ -94,23 +94,23 @@ public class ParserTests { @Test public void testRef() throws Exception { LazyTermLookup termLookup = new LazyTermLookup(); - Node a = termLookup.term = term("a", ref(termLookup)); + Term a = termLookup.term = term("a", ref(termLookup)); assertEquivalent( parse("@1a{^1}"), a); - Node b = term("b"); + Term b = term("b"); assertEquivalent( parse("a{@1b ^1}"), term("a", b, ref(b))); - Node c = term("c"); + Term c = term("c"); assertEquivalent( parse("a{^1 @1c}"), term("a", ref(c), c)); - Node b1 = term("b"); - Node b2 = term("b"); + Term b1 = term("b"); + Term b2 = term("b"); assertEquivalent( parse("a{@2b ^1 ^2 @1b}"), term("a", b2, ref(b1), ref(b2), b1)); @@ -118,7 +118,7 @@ public class ParserTests { @Test public void testVarRef() throws Exception { - Node x = var("X"); + Term x = var("X"); assertEquivalent( parse("^X"), @@ -131,27 +131,27 @@ public class ParserTests { @Test(expected = ComparisonFailure.class) public void testNotEquivalent1() throws Exception { - Node d = term("d"); + Term d = term("d"); assertEquivalent(parse("a{^1 @1c}"), term("a", ref(d), d)); } - @Test(expected = MockTreeParser.ParseException.class) + @Test(expected = MockTermsParser.ParseException.class) public void testUnclosedFail() { parse("a{b "); } - @Test(expected = MockTreeParser.ParseException.class) + @Test(expected = MockTermsParser.ParseException.class) public void testUnclosedFail2() { parse("a{X b"); } - @Test(expected = MockTreeParser.ParseException.class) + @Test(expected = MockTermsParser.ParseException.class) public void testUnclosedFail3() { parse("a{{X b}"); } - @Test(expected = MockTreeParser.ParseException.class) + @Test(expected = MockTermsParser.ParseException.class) public void testDoubleClosed() { parse("a{X b}}"); } @@ -166,32 +166,32 @@ public class ParserTests { parse("a b"); } - @Test(expected = MockTreeParser.ParseException.class) + @Test(expected = MockTermsParser.ParseException.class) public void testEmptyFail() { parse(""); } - @Test(expected = MockTreeParser.ParseException.class) + @Test(expected = MockTermsParser.ParseException.class) public void testEmptyChildrenFail() { parse("a{}"); } - @Test(expected = MockTreeParser.ParseException.class) + @Test(expected = MockTermsParser.ParseException.class) public void testWrongStartFail() { parse("{a}"); } - @Test(expected = MockTreeParser.ParseException.class) + @Test(expected = MockTermsParser.ParseException.class) public void testVarHasChilrenFail() { parse("X{a}"); } - @Test(expected = MockTreeParser.ParseException.class) + @Test(expected = MockTermsParser.ParseException.class) public void testExtraSymbolFail() { parse("a}"); } - @Test(expected = MockTreeParser.ParseException.class) + @Test(expected = MockTermsParser.ParseException.class) public void testNonExistingRefFail() { parse("a{b ^1}"); } diff --git a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java index dbb8556b..3c5f8eae 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java @@ -16,15 +16,13 @@ package jetbrains.mps.unification.test; -import jetbrains.mps.unification.Node; +import jetbrains.mps.unification.Term; import org.junit.Test; import static jetbrains.mps.unification.Substitution.FailureCause.*; import static jetbrains.mps.unification.test.AssertUnification.*; -import static jetbrains.mps.unification.test.MockNode.ref; -import static jetbrains.mps.unification.test.MockNode.term; -import static jetbrains.mps.unification.test.MockNode.var; -import static jetbrains.mps.unification.test.MockTreeParser.*; +import static jetbrains.mps.unification.test.MockTerm.*; +import static jetbrains.mps.unification.test.MockTermsParser.*; /** * Created by fyodor on 09.06.2014. @@ -340,8 +338,8 @@ public class SolverTests { @Test public void testCyclicExt() throws Exception { - Node left = parse("@1 j{^1}"); - Node right = term("j", term("j", ref(left))); + Term left = parse("@1 j{^1}"); + Term right = term("j", term("j", ref(left))); assertUnifiesWithBindings( left, right From 14aa99a727f0b9841601f1fb33880130e95e961e Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Sat, 1 Aug 2015 14:17:53 +0200 Subject: [PATCH 023/190] Terminology updated: children renamed to arguments --- .../src/jetbrains/mps/unification/Term.java | 2 +- .../UnionFindTermGraphUnifier.java | 10 +++---- .../test/AssertStructurallyEquivalent.java | 12 ++++---- .../mps/unification/test/MockTerm.java | 16 +++++------ .../mps/unification/test/MockTermsParser.java | 28 +++++++++---------- 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/reactor/code/src/jetbrains/mps/unification/Term.java b/reactor/code/src/jetbrains/mps/unification/Term.java index a4e6d909..9af4ebe7 100644 --- a/reactor/code/src/jetbrains/mps/unification/Term.java +++ b/reactor/code/src/jetbrains/mps/unification/Term.java @@ -32,7 +32,7 @@ public interface Term extends Comparable { Object symbol(); - Collection children(); + Collection arguments(); Term get(); diff --git a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java index bcfc04e9..50758b15 100644 --- a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java +++ b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java @@ -119,15 +119,15 @@ public class UnionFindTermGraphUnifier { union(s, t); } - Iterator scit = zs.children().iterator(); - Iterator tcit = zt.children().iterator(); + Iterator scit = zs.arguments().iterator(); + Iterator tcit = zt.arguments().iterator(); while (scit.hasNext() && tcit.hasNext()) { if (!unifClosure(scit.next(), tcit.next())) { - return false; // children mismatch + return false; // arguments mismatch } } - // fail if different children count + // fail if different arguments count return scit.hasNext() == tcit.hasNext(); } else { @@ -204,7 +204,7 @@ public class UnionFindTermGraphUnifier { if (z.is(FUN)) { setVisited(z, true); - for (Term c : z.children()) { + for (Term c : z.arguments()) { substitution = findSolution(c, substitution); if (!substitution.isSuccessful()) { diff --git a/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java index 34ad22a7..06887b18 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertStructurallyEquivalent.java @@ -36,7 +36,7 @@ public class AssertStructurallyEquivalent { @Override public Collection visit(Term term) throws Exception { signature.label(term); - return term.children(); + return term.arguments(); } } , @@ -56,7 +56,7 @@ public class AssertStructurallyEquivalent { @Override public Collection visit(Term term) throws Exception { signature.appendSignature("@").append(signature.getLabel(term)).append(term.symbol()); - return term.children(); + return term.arguments(); } }, new TermVisitor(Term.Kind.VAR) { @@ -177,12 +177,12 @@ public class AssertStructurallyEquivalent { if (term.is(Term.Kind.FUN)) { visited.put(term, SINGLETON); } - Collection children = switchClass(term); - for (Term child : children) { - if (visited.containsKey(child)) { + Collection arguments = switchClass(term); + for (Term arg : arguments) { + if (visited.containsKey(arg)) { continue; } - walk(child, visited); + walk(arg, visited); } } diff --git a/reactor/tests/src/jetbrains/mps/unification/test/MockTerm.java b/reactor/tests/src/jetbrains/mps/unification/test/MockTerm.java index 3987a2b5..4b902fbf 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/MockTerm.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/MockTerm.java @@ -28,8 +28,8 @@ public abstract class MockTerm implements Term { public MockTerm() { } - public static Term term(Object sym, Term... children) { - return new MockFun(sym, children); + public static Term term(Object sym, Term... arguments) { + return new MockFun(sym, arguments); } public static Term var(String name) { @@ -54,7 +54,7 @@ public abstract class MockTerm implements Term { } @Override - public Collection children() { + public Collection arguments() { return null; } @@ -72,9 +72,9 @@ public abstract class MockTerm implements Term { private List myArgs; private Object mySymbol; - public MockFun(Object symbol, Term... children) { + public MockFun(Object symbol, Term... arguments) { mySymbol = symbol; - this.myArgs = Arrays.asList(children); + this.myArgs = Arrays.asList(arguments); } @Override @@ -83,7 +83,7 @@ public abstract class MockTerm implements Term { } @Override - public Collection children() { + public Collection arguments() { return Collections.unmodifiableList(myArgs); } @@ -98,9 +98,9 @@ public abstract class MockTerm implements Term { if (!myArgs.isEmpty()) { sb.append("{"); String sep = ""; - for (Term child : myArgs) { + for (Term arg : myArgs) { sb.append(sep); sep = " "; - sb.append(child.toString()); + sb.append(arg.toString()); } sb.append("}"); } diff --git a/reactor/tests/src/jetbrains/mps/unification/test/MockTermsParser.java b/reactor/tests/src/jetbrains/mps/unification/test/MockTermsParser.java index 51215554..99f52049 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/MockTermsParser.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/MockTermsParser.java @@ -54,7 +54,7 @@ public class MockTermsParser { private Token lastToken; private LinkedList termsStack = new LinkedList(); private LinkedList termLabelsStack = new LinkedList(); - private LinkedList> childrenStack = new LinkedList>(); + private LinkedList> argumentsStack = new LinkedList>(); private int lastLabel = -1; private Map termRefs = new HashMap(); // initialized on the parse finished @@ -67,7 +67,7 @@ public class MockTermsParser { checkFinalState(); checkAllRefsExist(); lookupHelper.setTermRefs(Collections.unmodifiableMap(new HashMap(termRefs))); - return Collections.unmodifiableList(childrenStack.pop()); + return Collections.unmodifiableList(argumentsStack.pop()); } private void loop(String toParse) { @@ -93,7 +93,7 @@ public class MockTermsParser { private void parseNextToken(Token token, String value) { switch (token) { case START: - childrenStack.push(new ArrayList()); + argumentsStack.push(new ArrayList()); break; case END: checkLastTokenOneOf(Token.TERM, Token.VAR, Token.VARREF, Token.RBRACE); @@ -171,13 +171,13 @@ public class MockTermsParser { } private void checkFinalState() { - if (childrenStack.size() != 1 || childrenStack.peek().isEmpty() || !termsStack.isEmpty()) { + if (argumentsStack.size() != 1 || argumentsStack.peek().isEmpty() || !termsStack.isEmpty()) { throw new ParseException("unexpected end of input"); } } private void checkCloseBraceState() { - if (childrenStack.isEmpty() || childrenStack.peek().isEmpty() || termsStack.isEmpty()) { + if (argumentsStack.isEmpty() || argumentsStack.peek().isEmpty() || termsStack.isEmpty()) { throw new ParseException("unexpected closing brace"); } } @@ -200,43 +200,43 @@ public class MockTermsParser { String name = termsStack.pop(); Integer label = termLabelsStack.pop(); Term newTerm = term(name); - childrenStack.peek().add(newTerm); + argumentsStack.peek().add(newTerm); if (label != null) { termRefs.put(label, newTerm); } } private void beginChildren(){ - childrenStack.push(new ArrayList()); + argumentsStack.push(new ArrayList()); } private void endChildren() { - List children = childrenStack.pop(); + List arguments = argumentsStack.pop(); String name = termsStack.pop(); Integer label = termLabelsStack.pop(); - Term newTerm = term(name, children.toArray(new Term[children.size()])); - childrenStack.peek().add(newTerm); + Term newTerm = term(name, arguments.toArray(new Term[arguments.size()])); + argumentsStack.peek().add(newTerm); if (label != null) { termRefs.put(label, newTerm); } } private void addVar(String name) { - childrenStack.peek().add(var(name)); + argumentsStack.peek().add(var(name)); } private void addVarRef(String name) { - childrenStack.peek().add(ref(var(name))); + argumentsStack.peek().add(ref(var(name))); } private void addRef(String ref) { final int label = Integer.parseInt(ref.substring(1)); if (termRefs.containsKey(label) && termRefs.get(label) != null) { - childrenStack.peek().add(ref(termRefs.get(label))); + argumentsStack.peek().add(ref(termRefs.get(label))); } else { termRefs.put(label, null); - childrenStack.peek().add(ref(lookupHelper.lookup(label))); + argumentsStack.peek().add(ref(lookupHelper.lookup(label))); } } } From 27a42d9841cf98d306897b9b3918d867ee1fbec2 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Wed, 12 Aug 2015 16:13:27 +0200 Subject: [PATCH 024/190] Report details if the unification failed --- .../mps/unification/Substitution.java | 50 +++++++++++++++++-- .../mps/unification/Unification.java | 4 ++ .../UnionFindTermGraphUnifier.java | 5 +- .../unification/test/AssertUnification.java | 18 ++++++- .../mps/unification/test/SolverTests.java | 8 ++- 5 files changed, 77 insertions(+), 8 deletions(-) diff --git a/reactor/code/src/jetbrains/mps/unification/Substitution.java b/reactor/code/src/jetbrains/mps/unification/Substitution.java index beafdbd7..7d34256b 100644 --- a/reactor/code/src/jetbrains/mps/unification/Substitution.java +++ b/reactor/code/src/jetbrains/mps/unification/Substitution.java @@ -16,6 +16,7 @@ package jetbrains.mps.unification; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -29,14 +30,19 @@ public class Substitution { private boolean mySuccessful; - private FailureCause myFailureCause; + private Failure myFailure; public Substitution(boolean successful) { mySuccessful = successful; } public Substitution(FailureCause failCause) { - myFailureCause = failCause; + myFailure = new Failure(failCause); + mySuccessful = false; + } + + public Substitution(FailureCause failCause, Object... details) { + myFailure = new Failure(failCause, details); mySuccessful = false; } @@ -49,15 +55,21 @@ public class Substitution { } public FailureCause failureCause() { - return myFailureCause; + return myFailure != null ? myFailure.getCause() : null; + } + + public Object[] failureDetails() { + return myFailure != null ? myFailure.getDetails() : null; } public String toString() { - return myFailureCause != null ? "[" + myFailureCause + "]" : "[FAILED_SUBSTITUTION]"; + return myFailure != null ? "[" + String.valueOf(myFailure) + "]" : "[FAILED_SUBSTITUTION]"; } public static class Binding { + private Term myVar; + private Term myTerm; public Binding(Term myVar, Term myTerm) { @@ -74,6 +86,36 @@ public class Substitution { } } + + public static class Failure { + + private FailureCause myCause; + + private Object[] myDetails; + + public Failure(FailureCause cause) { + this.myCause = cause; + } + + public Failure(FailureCause cause, Object... details) { + this.myCause = cause; + this.myDetails = details; + } + + public FailureCause getCause() { + return myCause; + } + + public Object[] getDetails() { + return myDetails; + } + + @Override + public String toString() { + return String.valueOf(myCause) + (myDetails != null ? Arrays.asList(myDetails) : ""); + } + } + public enum FailureCause { CYCLE_DETECTED("cycle detected"), UNRECONCILED_REF("unreconciled ref"), diff --git a/reactor/code/src/jetbrains/mps/unification/Unification.java b/reactor/code/src/jetbrains/mps/unification/Unification.java index a2136593..70dea80d 100644 --- a/reactor/code/src/jetbrains/mps/unification/Unification.java +++ b/reactor/code/src/jetbrains/mps/unification/Unification.java @@ -38,6 +38,10 @@ public class Unification { return new Substitution(failCause); } + protected static Substitution failedSubstitution(FailureCause failCause, Object... details) { + return new Substitution(failCause, details); + } + protected static final Substitution EMPTY_SUBSTITUTION = new Substitution(true) { @Override public String toString() { diff --git a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java index 50758b15..10fcffbd 100644 --- a/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java +++ b/reactor/code/src/jetbrains/mps/unification/UnionFindTermGraphUnifier.java @@ -53,9 +53,11 @@ public class UnionFindTermGraphUnifier { private FailureCause myFailureCause = UKNOWN; + private Object[] myFailureDetails = null; + public Substitution unify(Term a, Term b) { if (!unifClosure(a, b)) { - return failedSubstitution(myFailureCause); + return failedSubstitution(myFailureCause, myFailureDetails); } return findSolution(a); @@ -111,6 +113,7 @@ public class UnionFindTermGraphUnifier { { if (!eq(zs.symbol(), zt.symbol())) { myFailureCause = SYMBOL_CLASH; + myFailureDetails = new Object[]{zs.symbol(), zt.symbol()}; return false; // symbol clash } diff --git a/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java b/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java index 3c2c31d7..d1efd057 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/AssertUnification.java @@ -25,6 +25,7 @@ import java.util.*; import static jetbrains.mps.unification.test.AssertStructurallyEquivalent.assertEquivalent; import static org.junit.Assert.*; +import static org.junit.Assert.assertArrayEquals; /** @@ -110,4 +111,19 @@ public class AssertUnification { assertSame(failureCause, subs2.failureCause()); } -} \ No newline at end of file + public static void assertUnificationFails(Term s, Term t, FailureCause failureCause, Object... details) throws Exception { + Substitution subs1 = Unification.unify(s, t); + + assertFalse(subs1.isSuccessful()); + assertSame(failureCause, subs1.failureCause()); + assertArrayEquals(details, subs1.failureDetails()); + + Substitution subs2 = Unification.unify(t, s); + + assertFalse(subs2.isSuccessful()); + assertSame(failureCause, subs1.failureCause()); + // dont test for details: may be in different order + } + +} + diff --git a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java index 3c5f8eae..16124f9d 100644 --- a/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java +++ b/reactor/tests/src/jetbrains/mps/unification/test/SolverTests.java @@ -464,13 +464,17 @@ public class SolverTests { term("a"), term("b"), - SYMBOL_CLASH + SYMBOL_CLASH, + "a", + "b" ); assertUnificationFails( parse("node{name{X} child{abc}}"), parse("node{name{foo} child{X}}"), - SYMBOL_CLASH + SYMBOL_CLASH, + "abc", + "foo" ); } From 52c4df14ae59ae0189c3c763f055781493b77325 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Fri, 20 Nov 2015 14:55:48 +0100 Subject: [PATCH 025/190] Initial import. Kotlin libs 1.0 Beta 1103. Imported abstract constraints API from the Logic project --- reactor/.gitignore | 2 + reactor/.idea/.name | 1 + reactor/.idea/compiler.xml | 23 ++ reactor/.idea/copyright/profiles_settings.xml | 3 + reactor/.idea/encodings.xml | 6 + reactor/.idea/libraries/KotlinJavaRuntime.xml | 12 + reactor/.idea/libraries/lib.xml | 10 + reactor/.idea/misc.xml | 67 ++++ reactor/.idea/modules.xml | 8 + reactor/.idea/vcs.xml | 6 + reactor/API/API.iml | 11 + .../constraint/AbstractConstraint.java | 90 +++++ .../reactor/constraint/AutoConstraint.java | 19 + .../reactor/constraint/ComputingItem.java | 15 + .../reactor/constraint/ComputingSession.java | 111 ++++++ .../reactor/constraint/ComputingTracer.java | 12 + .../logic/reactor/constraint/Constraint.java | 19 + .../reactor/constraint/Instructible.java | 10 + .../logic/reactor/constraint/Queryable.java | 10 + .../mps/logic/reactor/constraint/trace.info | 331 ++++++++++++++++++ .../mps/logic/reactor/logical/ILogical.java | 20 ++ .../logic/reactor/logical/ILogicalVar.java | 10 + .../logic/reactor/logical/NamingContext.java | 33 ++ .../mps/logic/reactor/logical/trace.info | 71 ++++ reactor/Reactor.iml | 12 + reactor/lib/kotlin-reflect.jar | Bin 0 -> 2285222 bytes reactor/lib/kotlin-runtime-sources.jar | Bin 0 -> 886740 bytes reactor/lib/kotlin-runtime.jar | Bin 0 -> 972470 bytes 28 files changed, 912 insertions(+) create mode 100644 reactor/.gitignore create mode 100644 reactor/.idea/.name create mode 100644 reactor/.idea/compiler.xml create mode 100644 reactor/.idea/copyright/profiles_settings.xml create mode 100644 reactor/.idea/encodings.xml create mode 100644 reactor/.idea/libraries/KotlinJavaRuntime.xml create mode 100644 reactor/.idea/libraries/lib.xml create mode 100644 reactor/.idea/misc.xml create mode 100644 reactor/.idea/modules.xml create mode 100644 reactor/.idea/vcs.xml create mode 100644 reactor/API/API.iml create mode 100644 reactor/API/src/jetbrains/mps/logic/reactor/constraint/AbstractConstraint.java create mode 100644 reactor/API/src/jetbrains/mps/logic/reactor/constraint/AutoConstraint.java create mode 100644 reactor/API/src/jetbrains/mps/logic/reactor/constraint/ComputingItem.java create mode 100644 reactor/API/src/jetbrains/mps/logic/reactor/constraint/ComputingSession.java create mode 100644 reactor/API/src/jetbrains/mps/logic/reactor/constraint/ComputingTracer.java create mode 100644 reactor/API/src/jetbrains/mps/logic/reactor/constraint/Constraint.java create mode 100644 reactor/API/src/jetbrains/mps/logic/reactor/constraint/Instructible.java create mode 100644 reactor/API/src/jetbrains/mps/logic/reactor/constraint/Queryable.java create mode 100644 reactor/API/src/jetbrains/mps/logic/reactor/constraint/trace.info create mode 100644 reactor/API/src/jetbrains/mps/logic/reactor/logical/ILogical.java create mode 100644 reactor/API/src/jetbrains/mps/logic/reactor/logical/ILogicalVar.java create mode 100644 reactor/API/src/jetbrains/mps/logic/reactor/logical/NamingContext.java create mode 100644 reactor/API/src/jetbrains/mps/logic/reactor/logical/trace.info create mode 100644 reactor/Reactor.iml create mode 100644 reactor/lib/kotlin-reflect.jar create mode 100644 reactor/lib/kotlin-runtime-sources.jar create mode 100644 reactor/lib/kotlin-runtime.jar diff --git a/reactor/.gitignore b/reactor/.gitignore new file mode 100644 index 00000000..d2c8ad3b --- /dev/null +++ b/reactor/.gitignore @@ -0,0 +1,2 @@ +.idea/workspace.xml +out diff --git a/reactor/.idea/.name b/reactor/.idea/.name new file mode 100644 index 00000000..6e1d9535 --- /dev/null +++ b/reactor/.idea/.name @@ -0,0 +1 @@ +Reactor \ No newline at end of file diff --git a/reactor/.idea/compiler.xml b/reactor/.idea/compiler.xml new file mode 100644 index 00000000..a8523149 --- /dev/null +++ b/reactor/.idea/compiler.xml @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/reactor/.idea/copyright/profiles_settings.xml b/reactor/.idea/copyright/profiles_settings.xml new file mode 100644 index 00000000..e7bedf33 --- /dev/null +++ b/reactor/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/reactor/.idea/encodings.xml b/reactor/.idea/encodings.xml new file mode 100644 index 00000000..97626ba4 --- /dev/null +++ b/reactor/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/reactor/.idea/libraries/KotlinJavaRuntime.xml b/reactor/.idea/libraries/KotlinJavaRuntime.xml new file mode 100644 index 00000000..207fc74d --- /dev/null +++ b/reactor/.idea/libraries/KotlinJavaRuntime.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/reactor/.idea/libraries/lib.xml b/reactor/.idea/libraries/lib.xml new file mode 100644 index 00000000..72e3b2ee --- /dev/null +++ b/reactor/.idea/libraries/lib.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/reactor/.idea/misc.xml b/reactor/.idea/misc.xml new file mode 100644 index 00000000..e0057c2d --- /dev/null +++ b/reactor/.idea/misc.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/reactor/.idea/modules.xml b/reactor/.idea/modules.xml new file mode 100644 index 00000000..04f1eb91 --- /dev/null +++ b/reactor/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/reactor/.idea/vcs.xml b/reactor/.idea/vcs.xml new file mode 100644 index 00000000..94a25f7f --- /dev/null +++ b/reactor/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/reactor/API/API.iml b/reactor/API/API.iml new file mode 100644 index 00000000..c90834f2 --- /dev/null +++ b/reactor/API/API.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/reactor/API/src/jetbrains/mps/logic/reactor/constraint/AbstractConstraint.java b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/AbstractConstraint.java new file mode 100644 index 00000000..129bc8b2 --- /dev/null +++ b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/AbstractConstraint.java @@ -0,0 +1,90 @@ +package jetbrains.mps.logic.reactor.constraint; + +/*Generated by MPS */ + + +/** + * Abstract superclass for use in implementations of Constraint and AutoConstraint. + */ +public abstract class AbstractConstraint implements ComputingItem { + + public AbstractConstraint(String symbol, int arity) { + this.symbol = symbol; + this.arity = arity; + } + + public String name() { + return symbol; + } + + public String symbol() { + return symbol; + } + + public int arity() { + return arity; + } + + public Instructible handler(ComputingSession session) { + return session.handler(asConstraint()); + } + + public Queryable solver(ComputingSession session) { + return session.solver(asAutoConstraint()); + } + + public abstract Class solverClass(); + + public Class handlerClass() { + return solverClass(); + } + + @Override + public String toString() { + return symbol; + } + + public Constraint asConstraint() { + return (Constraint) this; + } + + public AutoConstraint asAutoConstraint() { + return (AutoConstraint) this; + } + + protected void registerHandler(ComputingSession session, Instructible instructible) { + session.registerHandler(asConstraint(), instructible); + } + + protected void registerSolver(ComputingSession session, Queryable queryable) { + session.registerSolver(asAutoConstraint(), queryable); + session.registerHandler(asConstraint(), queryable); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || this.getClass() != o.getClass()) { + return false; + } + + AbstractConstraint that = (AbstractConstraint) o; + if ((symbol != null ? !(((Object) symbol).equals(that.symbol)) : that.symbol != null)) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + int result = 17; + result = 31 * result + ((symbol != null ? String.valueOf(symbol).hashCode() : 37)); + return result; + } + + private String symbol; + private int arity; +} diff --git a/reactor/API/src/jetbrains/mps/logic/reactor/constraint/AutoConstraint.java b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/AutoConstraint.java new file mode 100644 index 00000000..c6870020 --- /dev/null +++ b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/AutoConstraint.java @@ -0,0 +1,19 @@ +package jetbrains.mps.logic.reactor.constraint; + +/*Generated by MPS */ + + +/** + * A constraint that is provided by a solver. Can be either told or asked for a constraint. + */ +public interface AutoConstraint extends Constraint { + + public Queryable solver(ComputingSession session); + + public Class solverClass(); + + public String symbol(); + + public int arity(); + +} diff --git a/reactor/API/src/jetbrains/mps/logic/reactor/constraint/ComputingItem.java b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/ComputingItem.java new file mode 100644 index 00000000..89a017b7 --- /dev/null +++ b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/ComputingItem.java @@ -0,0 +1,15 @@ +package jetbrains.mps.logic.reactor.constraint; + +/*Generated by MPS */ + + +/** + * A basic item of computation. + */ +public interface ComputingItem { + + public void init(ComputingSession session, ComputingTracer tracer); + + public void dispose(ComputingSession session); + +} diff --git a/reactor/API/src/jetbrains/mps/logic/reactor/constraint/ComputingSession.java b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/ComputingSession.java new file mode 100644 index 00000000..40f1da6c --- /dev/null +++ b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/ComputingSession.java @@ -0,0 +1,111 @@ +package jetbrains.mps.logic.reactor.constraint; + +/*Generated by MPS */ + +import java.util.Arrays; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; +import java.util.HashMap; + +/** + * Computing session is used to provide an interface for handlers and solvers working together in a single session. + */ +public class ComputingSession { + + public static ComputingSession.Builder with(ComputingItem... cst) { + return new ComputingSession.Builder(cst); + } + + private ComputingSession(ComputingTracer tracer) { + this.tracer = tracer; + } + + public static class Builder { + + private Builder(ComputingItem... item) { + items.addAll(Arrays.asList(item)); + } + + public ComputingSession.Builder withTracer(ComputingTracer tracer) { + this.tracer = tracer; + return this; + } + + public ComputingSession newSession() { + ComputingSession session = new ComputingSession(tracer); + for (ComputingItem ci : items) { + ci.init(session, tracer); + } + return session; + } + + private List items = new ArrayList(); + private ComputingTracer tracer; + } + + + public boolean ask(AutoConstraint autoConstraint, Object... arg) { + Queryable solver = solver(autoConstraint); + if (solver == null) { + throw new IllegalStateException("no solver for '" + autoConstraint.symbol() + "'"); + } + + return solver.ask(autoConstraint, arg); + } + + public void tell(Constraint constraint, Object... arg) { + Instructible handler = handler(constraint); + if (handler == null) { + throw new IllegalStateException("no handler for '" + constraint.name() + "'"); + } + + handler.tell(constraint, arg); + } + + public Constraint lookupConstraint(Class clazz) { + for (Map.Entry e : handlers.entrySet()) { + if (clazz.isAssignableFrom(e.getKey().handlerClass())) { + return e.getKey(); + } + } + return null; + } + + public AutoConstraint lookupAutoConstraint(Class clazz) { + for (Map.Entry e : solvers.entrySet()) { + if (clazz.isAssignableFrom(e.getKey().solverClass())) { + return e.getKey(); + } + } + return null; + } + + protected Instructible handler(Constraint constraint) { + if (!(handlers.containsKey(constraint))) { + throw new IllegalStateException("no handler: " + constraint); + } + return handlers.get(constraint); + } + + protected Queryable solver(AutoConstraint constraint) { + if (!(solvers.containsKey(constraint))) { + throw new IllegalStateException("no handler: " + constraint); + } + return solvers.get(constraint); + } + + protected void registerHandler(Constraint constraint, Instructible instructible) { + handlers.put(constraint, instructible); + } + + protected void registerSolver(AutoConstraint constraint, Queryable queryable) { + solvers.put(constraint, queryable); + } + + private Map handlers = new HashMap(); + + private Map solvers = new HashMap(); + + private final ComputingTracer tracer; +} diff --git a/reactor/API/src/jetbrains/mps/logic/reactor/constraint/ComputingTracer.java b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/ComputingTracer.java new file mode 100644 index 00000000..f2ab9f53 --- /dev/null +++ b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/ComputingTracer.java @@ -0,0 +1,12 @@ +package jetbrains.mps.logic.reactor.constraint; + +/*Generated by MPS */ + + +public interface ComputingTracer { + + public void askSuccess(AutoConstraint autoConstraint, Object... args); + + public void askFailure(AutoConstraint autoConstraint, Object... args); + +} diff --git a/reactor/API/src/jetbrains/mps/logic/reactor/constraint/Constraint.java b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/Constraint.java new file mode 100644 index 00000000..0ee21b24 --- /dev/null +++ b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/Constraint.java @@ -0,0 +1,19 @@ +package jetbrains.mps.logic.reactor.constraint; + +/*Generated by MPS */ + + +/** + * A constraint provided by a handler. Can only be told. + */ +public interface Constraint extends ComputingItem { + + public Instructible handler(ComputingSession session); + + public Class handlerClass(); + + public String name(); + + public int arity(); + +} diff --git a/reactor/API/src/jetbrains/mps/logic/reactor/constraint/Instructible.java b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/Instructible.java new file mode 100644 index 00000000..c780b5a9 --- /dev/null +++ b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/Instructible.java @@ -0,0 +1,10 @@ +package jetbrains.mps.logic.reactor.constraint; + +/*Generated by MPS */ + + +public interface Instructible { + + public void tell(Constraint constraint, Object... arg); + +} diff --git a/reactor/API/src/jetbrains/mps/logic/reactor/constraint/Queryable.java b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/Queryable.java new file mode 100644 index 00000000..aab792be --- /dev/null +++ b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/Queryable.java @@ -0,0 +1,10 @@ +package jetbrains.mps.logic.reactor.constraint; + +/*Generated by MPS */ + + +public interface Queryable extends Instructible { + + public boolean ask(AutoConstraint autoConstraint, Object... arg); + +} diff --git a/reactor/API/src/jetbrains/mps/logic/reactor/constraint/trace.info b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/trace.info new file mode 100644 index 00000000..1a2d5b3f --- /dev/null +++ b/reactor/API/src/jetbrains/mps/logic/reactor/constraint/trace.info @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactor/API/src/jetbrains/mps/logic/reactor/logical/ILogical.java b/reactor/API/src/jetbrains/mps/logic/reactor/logical/ILogical.java new file mode 100644 index 00000000..72bc7e5c --- /dev/null +++ b/reactor/API/src/jetbrains/mps/logic/reactor/logical/ILogical.java @@ -0,0 +1,20 @@ +package jetbrains.mps.logic.reactor.logical; + +/*Generated by MPS */ + + +public interface ILogical { + + public String name(); + + public String name(NamingContext namingContext); + + public ILogical findRoot(); + + public T value(); + + public boolean isBound(); + + public boolean isWildcard(); + +} diff --git a/reactor/API/src/jetbrains/mps/logic/reactor/logical/ILogicalVar.java b/reactor/API/src/jetbrains/mps/logic/reactor/logical/ILogicalVar.java new file mode 100644 index 00000000..907e48d4 --- /dev/null +++ b/reactor/API/src/jetbrains/mps/logic/reactor/logical/ILogicalVar.java @@ -0,0 +1,10 @@ +package jetbrains.mps.logic.reactor.logical; + +/*Generated by MPS */ + + +public interface ILogicalVar { + + public ILogical logical(); + +} diff --git a/reactor/API/src/jetbrains/mps/logic/reactor/logical/NamingContext.java b/reactor/API/src/jetbrains/mps/logic/reactor/logical/NamingContext.java new file mode 100644 index 00000000..906831b9 --- /dev/null +++ b/reactor/API/src/jetbrains/mps/logic/reactor/logical/NamingContext.java @@ -0,0 +1,33 @@ +package jetbrains.mps.logic.reactor.logical; + +/*Generated by MPS */ + +import java.util.Map; +import java.util.HashMap; +import java.util.IdentityHashMap; + +public class NamingContext { + + public String uniqueName(ILogical logical) { + if (!(cachedUnique.containsKey(logical))) { + cachedUnique.put(logical, makeUnique(logical.name())); + } + return cachedUnique.get(logical); + } + + private String makeUnique(String name) { + int c = getAndIncrementCounter(name); + return (c == 0 ? name : name + c); + } + + private int getAndIncrementCounter(String name) { + Integer c = (uniqueCounters.containsKey(name) ? uniqueCounters.get(name) : 0); + uniqueCounters.put(name, c + 1); + return c; + } + + private Map uniqueCounters = new HashMap(); + + private Map cachedUnique = new IdentityHashMap(); + +} diff --git a/reactor/API/src/jetbrains/mps/logic/reactor/logical/trace.info b/reactor/API/src/jetbrains/mps/logic/reactor/logical/trace.info new file mode 100644 index 00000000..e4b5c5a6 --- /dev/null +++ b/reactor/API/src/jetbrains/mps/logic/reactor/logical/trace.info @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/reactor/Reactor.iml b/reactor/Reactor.iml new file mode 100644 index 00000000..245d3429 --- /dev/null +++ b/reactor/Reactor.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/reactor/lib/kotlin-reflect.jar b/reactor/lib/kotlin-reflect.jar new file mode 100644 index 0000000000000000000000000000000000000000..a02d0dfb5c190a46a687d80baecb072a1b92f23b GIT binary patch literal 2285222 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�v%FsKab$s9~kr(aAqS3WBh((3F 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 z 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%0DpBE`reWCAIY;M497tIx zhmR63UExk=`Ioegq&;p(DZ~()sOgmC@xWxJ3z!>T(+Yjijcvx~>;^ZK&m7#` z`SX_Nz_-C`1nn7T;dQ696w~LSV9%oc_~SVXLSK9BP$9tx0=N;WO|)ry&oIvRnsv)m zOrAvz{;ekw?gdIo{qCT+PN*6DgqQ9rUdV^!aM7aHl0?-7ojMY9I>fgB^&24+l_mtMBiiz^aC|&%^VXGo*4ui z*R6kHNAPC{=pe!J5o?#V)>92=<&QX-zzGF>-ijRb$#mkxaPlNZX1L^un5gQP9)A3z zV%3Wz5`3Y%#OEYkael3WxlzQO;bnj++k?jTpu(R=>S&X9KYY!pR+2QwJ5%>Me({Xh z-PwGmp7%WDy9bI9&KGfgm*i_39OUpYy@dl*+(Ua~&ETspTAU;+?(Au-qN8i5LUw2pFLj{UbCc6V8$3QNa`}e zsGOj`bD{as2{oVT+%VswMeou;=S*$=%@AlVGCp&$wzt$}+M&<;z|7`Y!=G)p{Bcp( ztK=rpAA&c$u=e;BT<SOdPEt0d42IsVqc&yHMkn2=x0&L{tq8=IgB*4HhLo=17#GlbP1*J zQODm1{s&BnO5Vqglk#unRR4G({x_UTs-=`#T%;(U$u0VMt=P5y=2YkXp$S_a8LmaI`IGyudDCX@%)Sf( z6Evn>7$&hd2jf4kU3z^d1?N8R!m0 zp{CU+6(_o(Fs$0iT_(C4D5ftTv@#aA;RRR?p96FGhYc#JwC2<-wf261hQ>CYFC?|| z-RCXB8O$@7a$);)K%*A5KcadH!@;yol8y^}3bbfLsR2S`2$VhU*|r01nWf4v{%lZc z_GA4V*9ag+CSgr7>%W{xI!R}LIgtdj|8gR^{pCbj`ll1={U1&w#L%Pa|8OEzx(%+Z z-Zd7tRQa@NZa4a`G@{%y2_c~9S*>E2^BWdo(W<07nQR}`$m`otG*NvRDH8HgPPW(t zJyzaAt0E#3XhvgKghgszEfH5df`pZ+?m>eaHpZa2cgpk5zL;?H$*kOwH@+XnYOe|9 z!3WbhGTsGwVOGC%FvYjkm4?})Yt*b z`~y@ijKQgio@}nd*z_{MbJ~#E(fKkr9VxAPWp36qCT*e)Il{2|y~x#TWl#E(qMCmaA!ru)F95Gl?S2 zwUnfO2)L~GeEF7WOpO|SDL{jH7BJ0pty(-#Oql?^JY7#zcOY%#?+=~u-dD_=>INW| zE5y;ripQ&OuUM;hDy~C?wd9OUE)S!Diru{@==d3hB2(uEEypy?c*YTD`J0&2+Uv#z zD!Ljq+cj*$KewhKyWY-^Ar-d(T`5iiFf$7$IX&oFB;P2I<3y)LFQ4pCr085FUc$l~ zqm#CsF{1tft&CxMSU;fEMbe@}J-Y0g9L`4sK>5-~9r;>)bsuN4x!8~Drh$;kADhFn zz8o#>OV1BuYX$3G0+|QfDSbdID1B!gYxBRLRmV%DqUY1)*Yeh|Iwf3<1s&sWB{XluGSx@B|nnr=pO5ITJ##tchiycHfUreG$ zhy)^suA(krrti$CW9O;GZ`hweQ0WqP zZ9s_r;aTm+%@1OuYTSr*`s6z?aO~#6eCzkH%oQmjD!_o-wcl-JXM-E%Y2so=N==Ht@f>5a> z{e(W_Q0fHRGuF4iM~Y7jdOp_2j(zcOrB;7GhyM??dR1GQ$Mh~YA|7G4WnuY8rjIc;c5S;Ae6tOQ+MEr_QE+0*CwtSd#{$o3DBjsK{lm62BuK)fq|EY)c z`7Am)2ilvPAG|XEwCcI%y}w*!zJFox?_e;>WKC-}H@4c5SS#d8E?YYbGv@?ZAKi@x zA*Mv=7GX!8_D2A@Crm?DxPN@a>vTB6H6+&G>hLNplxgk*jYH!cLkCLB@M@f0igt>i zB2u-q2Fqyo=T#kD9E0W}E>B2SrEoZ^MC-~|nuV6s%qX8I zz@#?VlEf9_Q(2{4QrOnKkx!5-&)k$8yu3#xJ=2eYGn*h{U;4h(*S` zT5WxU3EC{zwMBkwsmfW~XQ3`P)KU#x%oGsXW25qyY!(p3`c3To{pLRAIcwN2|HY&WS{|w?WAenRGXkjC*Og~yWNnWo1p%VlUewP z=`A1^$(gynCnV>*R*e<0^2ybtX^V#ar`}0I+%CR1#(SMsoXRcM? zOgVtOe*Hkql0j5($ALPk`0kVnHudum@T`fxK*FP-vxif zusl}pDAk_*ck&V=620wOZ+nP8UaUia37mACuURLRQRh!!)W)0|R8Wd}4h%Z(z61DP zC)4OAq&xx}G>lTfwLl!v6q6Y4)coXCXYFB^&dk9`{H+4MAx8AjG}K2h{KUPB%MrE5 z##{E)C$#k-3f`Zdpv;)Uud<|2#Tz}+@K#evc&?&`M9GpJz0TWujT*A8z2nr28#^;T z1TINV7LiV{Ij$q*Y@h?WBUHMnQDR!ITkJ+b5Xt4YHN;^OZF|bPNM%>PHY{8MzW4&o zTfT>1ZN0YKS6B~m_pUN$S1G@1U;J`4t)40GzId{=O@rZqZ8R{oJ68Zbg%-e4bPC>C znYQ!si}+_AznQ1!*om!+bYv0t(cKt>QouyfEkv=03v=iv%% z00SL7k)yxJor8>n&QaPy+FpCBaTsammm>*BOu11A@fhP+^j0tV2;En=T}n{V?Pvg2QYp2y6cH!U2%)kQwL zqy+W)+VRd*?Fc6o!C{yX*}(?YuYQ}R$)i1|{7JIG6iORrIjdw}?Nb4HXF z9lN#MLH(I{xvPi!cr@omwb{IrQK9THJ_FCGo4fuUeXOtSAT<{u{7#biwvcD9ox9?B zO75)ZyC7p4mHmi;EA!9c)TJ!njVr5*-(Od0J&1<|)OudT5S-0LMv;#k(zhJU)#C0` z5g1zgj~P}ojzw)xC@GR0ESd{}$n3F=zFL4MZ{>4ZLU=XCyxdHaMvQC8wQe^;uZ4Av z(rH~c&Zt0$3L{iB--16kG87>o?#2SeNz8GiCDXF8tS#>~^&5a`9D4>nQ!5^UFWW%* zwM8Sd!|SdCQx*uywXl)j00U0CAVfTP-g04hlQeJ593Ta8y5;;CKC&tcnjeTk>TW)* z)d=8+?_t2LD1CG;6JH?Cm0iE|H?&mmW{#hAEIy-k47LX8fie;$ly0rJ;0f`4Q(jaAZx4~i#eP+W;zDpu%BiP7Q{@lOI%q>n8r*RV;-!{RRe(dNf{DR*2V!q zYk4f7O41kcD*aZn^sUc)^}CuqO11HtmTh-vuPNmn2w3GcyCSq3Rt^23@bS#=j7#IN zP29D8zbH82m?i5s-ZJHR)sl?5uGV7I8RtN=fE6^GGaA~#SQPjZv=%m4Is%Z=v1f$B zGxmT;Z$m4} zr<-sNqs4&906%xPbs(EZKr-5D-m@Kq?3zvwP57Me4F!co)t71mHz=1L&T$dP)x%8= zNvLo`hgTk~gCCy`z}kO}-i;h;cUbIeo{rx!DsJJR=Wu#sZ#D)LY;hc!rCoq?jJP62 z+{mzur+$jC$H}y+@YGer9(br*pIOXhlW1d1BNvm~gmTZwA!lW-3U2g8g2=he(YX3P z;qfJq>tt(H>o4_NFMV9{{bMuNNBmds8`1xp_su^du}J=N1$p{^RFJQgQ%8nS{8REl z`hq&!>@qn{ErbDvp!%( zB3^2#tQ5D3zE(aXYZ0|)v%k;bCI|#HsnL29-7QI@xY5NpiuYVML&ano5M(#XQe**# z)6=hXQ#sFQxriyiJ7x8%>O1iRQqb`y0wfdws%|CMCO=AQ`x)Aw21si$=@j`b`-r7e z4gf`-z(m3}WL(@`2BRFP1q`z0s||CPk0x@V`$CmCAnnGF?Qv{sw72emG?Du$K)qrN zA}88ow-FMSkd59$k+KN!ZD{P|U3!+g4VIx&^pJ{77mmC)0g^BK#kv!kb0OJ@66h4e zX2)#tE)CD0wdYpV`(#C{HoACM5y?}C(u;IyHW*~=bh8a=m01l^Bh)4ZGrF=jLrN)a zQc{=_j?_aY$G7O=>(-T{1?}yox@n4}hia$MHEh)oDeBY@oubRnbOAT-^W(mukl3+V z@rSgK9=)sOpJmR1e;myKoeGM=N<(#)qMU9@Bq7O=%X}e`TiBOB@UX{oA}CM*5PiUy z-VcqK`DT0Q<`J^R9Ol(uCig2-o13mS%xYtl(q@36jQO18L;0C$8e-;oOxm1rP1=O` zOZm~|fe{Hu#RNIAJ(-RKDFuP$<| z#%Jum&h`AS+^YX`tKz@mT>n%5NmtgA!~RIj_yVDYov1Y!C@%;tYbf0fE)k2|Qi}i^ z5=e+H<_#^kbNBg+v+3k`De0RE5v%oF(A&?KLJHFbDF~_`yW%Ch%o|O5`<^ei5B#6z zFR6QM#g?BHo3dR`;3k@b(mUgaL*zfs_Ifal?bEhMVWfzeoJCiao*A^%so#KC=3oj$ z|JPY1=7ZT29G7co#uW_&Oaf zfH}-IQ^xXXkcsEH-+*I~380o6DEH&VS_w~UH4U$H0IwW|(xsCf zj>Z%`P%3Ed^Sm-<#bOK5fuw!0s`rfPuvBBJ5X^(w&uv)-o~L=fmllD->-dV^^_$7tvQM8zxS?`tI+SzWioCA0#twEkLlt^UU-=l7w zEJ~j6rPQ;hKC&slW4n0rWRPk?V=9}&+9ExpteFHe{T9mOxBH`0{T*-GhXX7VNQ9@Z z7%XxTTZJ)};4Q{@gPve`1;+E+r+wt76rO$mcL;uRrW4mR1O9%gkm2@}=MKqLUkplG zukTfHPbi4%cZy|ZVGilL=ZoFN?jHLNDjAhUCFS?hzO;dfZ2 zCxeEt=zznUOyyB~aIR_(oq%#+iu#uYcoRS#o~7rPzaGWs+zU_ij}i0dUy47H|35~| zf9-Pn-(%*Z%S{Cd5>i3-Peb`VskpzsSOW8Z!+o)?IA3kw&Y=C9&_CyNUiQT5wmcrJB1+(j#b7Uj7+OL=NCXUaTpnoscMx8_yr zmrTaxFylDaohrYxz2Y^bd>Ltar4uohqyN18qNdZ4ZHEC}O^Xc28;(^r&d|5dR>#Zb zc~8{Y!DXO)b_31AsQF$R`%UX_K>_lWkf3yKaI0rud-4Zd(z#5NejO(62oHsJQJg1i zSe>KQW16_UQ3#7|VWpc|H3q=ErV&Pu;WCi0YihxnODAD;s(_ljpC7mj^6bKajZjS<*n`3%-TRKuQJPJOx zKOV|C(|69VMU~r1ThYZ?jX7?!&8h>1ElcSsj@yeF#3jzNeYzsiYu!4laLmKnweHEghNU{_D5}yooa^N=i~0ihM!08@ z@S5-N1h+M1;@&}7S9k+~1bw`aAJ=YE$JI#{KB#}vFCBy;f5Nhf}4Fyz4P8M=MpJogE^g5>#iRfQp!>u7CP zh4@$rPiIK_h1?vT6ibSq;T`fMdf*dYL%Wcx;0ewXN%Z$)Tx5~v1B`rh6C^c#NQ|ey zFY4Rfl@z6`*(1!abE?cXMl(PcEqwDy0R|U(zZDa4Wzv$cT5>QaMU(*h3HYJB^YOT!Cz~PtKY8cNv>0= zx6okm`6`5z;^VKp@znw`Y3m#&En=CXE1UpR1eG0=3#NQL40v3c%2V04f^pXQ$q6J@ z0iC~v3xbX=4aVqc!8p%Cbxs8CYx`wyy`ofa5f=7;m6^|ET_rA7a&GF*^EpY7E!btO zyz&x8z6Vo8S{?W-bnjWkI*DsTo^FbkpsI?wFYAF2q2bHn^J|C#Z;KcNMNY)kT~}tE zy|BYP0&n5MBF(JLg3}eBgm%(uQPjr$uC^U7clu;?7Z>sb+KDi>Q!u@RG@eD=5$ERPRDZl*%FRpc*O|#OOa&gYvjr-oJT(h~UBXIbXsJXy z`+x4WBev%tW>a_YmJxSjr3>w&K&up<>mBI>)R>O-Lh-RuyvwpgI@YA|#gKCaJC%L$ z!4kp901neB_8ko;DH@gR`Pr%R_<+{KtnH{LaA!Oa!_qnX!l%J2K3^>0spT<^5YaZs zERZPqKgWG>*az(vA5V^&jhAzQl2~~g$}!E=>!mDcq3g`iF%8Tq19#9p1v0$AY~H?7 z^%sH%96|i#YiVw2i}^msA0R9;%*`FubY+zcX53Ie#70pm8KXEkR)sLM2QK|dUZy8PV zFnOb4N9tG$rWQqSO38K;`Zn77lWo0d=aF@ADf(cEC44qZ^UPs3zWYq$FDW{@9acd; zgVSNGq|k*aF(JD0=EnUPgN%W{??Yj`ew!5d!2jI;694o5-;e8mYESCHJ}4hPBhjD* zYI=lf#;$xYBdbcIuu4vcMGkSM&vQ_{Uz8SPX6kB_`mTphOIHOWS*+dJWiI~6UgXn8 z>5Gdix;Gp>q2DdAFVE4!4as|p)-1bScs!)CyPtGaw87{@zXM%eDXsIIh^;IRlr+0x z^|W;mPC$9dpcL3hITM;6gn8*~Gt?>OIuZ00x$Y(`q4lH;pt|Uz0W!Mc5(|zztk5kb zICK~TSEt`(CNSzG(UTls2lEFnqar)mBMICZY;nQcaO)xC9 zg<$YNymyoo*};VB4c^Epm~4r^);f$BKRdW5R-0_}DN-F61=kiQYs+EVz*3;#>t7bZ zJzH(v(S4CqtW)mi0&(w(yY!A}wife$HBMcr!K=e}lNOD{)sqL88cepsa4`s*#ECOogCL^R)-#9IiTh@*w)L{N zJm}cGb!w!#HEMSJbCTyI%gG9aGtQG3&D~BMM-R=mH{E&MGqZRo11l~nx0N zJt@aCDJ1kW{*(>&oES@nsDle9Gt!1syd*dkLD> zUUF4k{?|yXL`{1=(VXa<(OUU7G!7s!OVhdMyYJchGk_qrs6V~SYNq=r=02}(aeW{n3kEGqLg`PaUSDr`Lg++ zJj2@Zs|=XC;l1QrH%rxT^H!1;2XoR?6_X~4Hl?@m^hH+zMHTAiO5#$fpI97jLXgY{l4U7pRNI4cw} zv5o-_QCr`0D3B49sutw|6V^OBViwiMB*pEmNCR`{)vZeK#MVXKJ3Kt`_4!PcNNKb0 zQcKg#crf86@yjuC+eTn<*_M1k@yzCmHOlsHUnl(cf^o+Vi*h*_B4ZZBoVYT@zVSrR z;fvabb#ZsIT4rG?EUT!gvJek3OsZ+%#eduRgh-9iWAE!M*!AiD&t|s-q(FeC-Dlf^ zeBR|Sm|{9=>l?}>LGj7V-_x~pheir7baje8G~Z79=#rI_6d1yguACCa)8K<-x;c+8 zlotV!w<-t*@wR^P6{w?I>3ppaH-LeQ&}8HcgGG&L9uKR{f>5o#N71zuZgwf0l~8je zt@y3rKcA@xt9%y^#y2Fa-LgyH+4tA(ev+iARnExfzyY$K;nccCKpC24B!;1=1!LkL zjoYHdOFxD+y1kAc{E=0~4LmLOrH!bZ(|{g*EO9~@x#FptOmtn%55#_-D~4U^Y4BTr zuY@Uw0e{H(bZJc0mp>jV-g$#?MI8UQk$>UA4~IbJ6SpqSE>64zG*Rru@%1Qqq0|`z z7RFbWV-x&LuaNNh!XlsT#4$)jv(3kbllqfKsGV+YOK3vvtAvsrbI-482Qb%qnK2(F zK#Mxy@=UAcIlg|8J2QNqu$kFk=)lJ+>ulR4sdKXzb5cTEG3nz(Y3S)~ei8egz)YXR zDMJUtX&M~WT1?*xq1vD0v;jOUKP-`iBAnNxo=ZXW+th%W@I_6TcZ;$YH&2g{Y0hE8dsRCL>|#tSpUCyoA!P0|-l ziWh8#;26G5?g@&f zTCG5=|kAB81P${u#pO0F`nF#lmrZJc-FLYq+S9Y)DQ z*v@-LHv0HLGVy%A_xQ<&--T~x4GtMM&&Jre_kc&ezOqVc^VzSzr&okj?rs42Gg&#^ z?Y-PBk1TZ#s~vWZBRi6LXxUcqB-VC?L7H#I3fYk%d_jeY@0)aH$k8Lxsnz>ZjBhwu&}DR*>~{@bZ)ojU#~p#TY1C$QbL&o@`exuBO%&8qp`UGU zX{tQmcp_~%*P%HU9SVKmH<}{wRi$9KCeoo*74`~T6!uJwix(NaO0@IPuWl@;ULA1b zb-OEuV?$Ow>+slDU|-s3q$*S(J)5vLsa3$<6~4IoyNehTwJw_xJsv@~o|!q1UWH9> z+=F&rxgmL0o+Q_wV08yBhST)4#rwdrKG&Do?PM;^1^EOw|Gp5?sFZE4S}cJRyQ~!J z?>Jgv?p+fkqqwmfsG^KeeeQvn)!~(%WjT6l4 zQEo1b348igAO5~Se<%K)tJd)49@M5Zo6EyF@4;$Y%frBg?FJZ)e#WIM|2*)kTktB} zUc`OMSpxdUO~h#EHg;Pj+T(1`%w8y_DZQ6@0W)7{y~JXADw!!XU5ekJhw^o!)9q_F zwLQSAMt|Pe@%D97;fzF@GJhC3AWfw@iZJY5XiP9dzPU0f(6ZEN_|8lZWi`iBPN=1Q zPM)Fuj^&3p!LA7JBA2t=SEd$0xbA}OD4h(NROLa~0iA4b$6tJnMwo%6 zS|mA(a`@>?Q&_zAo(np8m_m!PCZv`KCTrlVW}|j5Du%}6&Zk+YDWdBy(zP0N#-#mO%8krDsnh~bq!y@Xr}UU3q(`As()N zT1RM^r&#A7urjXHxy3E6?=F3goC*tHuzs-KW^$2NID7yAM z>B!5ku5*gF9qX^D8rrsTCq1fRyL(c#64MAdn6d4B(sBdEzFYhIvVm$^R)AUl*#&bG zQ_UuWr}5t)(gC=!iV|L-TY~wG-3yI-b}BXJ9IFpEw0<%7xy5@y!)u3v>_X0BZ~KB8 zM|smDf>PXqK!*8%gV;U^SR6QAeFis?1ol447?xFw86>z?LX2mk$LK{E&AzC0k%KRk zxn*U;tmF>dk=0NTqvB3gzECtn2&8TvdR`%Q1QaJw9(+qYuAVD$018LAUx`js@C`WpnRzK5${??G5AwnwUBAmyJh^WOGBiq)&Ridip5NJuAczhZL7y>9GP5+NuT&lgSi5?MJQkE zFWnf#i2{j=DO(Y6nB$yl=v4RZ&nL8cwixy#$Zxs6^wt}lL_L@u8jE+y=p`AK{>9q+ zvP!5gjYJIEqpdob&f`Tv6v?hX#Q^O56v2SFoW(vP#>3G+Rkd<;H&Q%D-RO@YF$XwY3Th$ue@<8J=`QeMk^QD%G=#1#Nn*E9I;9vGH-Tz=T24qT|4_ zLk>}8^crzZ-V(fm`U+FvAzhW#Z`_#AE~```jRh3(>Sk8*tqgWGB<4{OsUY^`hOFJ|lj6JTiKhl?3t23gKai-mYt>=0LjBHj zT*r+deTyKM&=1~$xk=J{}nE9gVO~68lIsS;>e@zP~ljm6gOr+P?|-~gi@=!ks7!0CG^tq&EPWj_ zXVzkI^ly?{AhX#W9YOKmVK3KVuTkFTt!@l&o)LItVIJBOK3st@bEgN*l1<&94uQMF z9p*s2LgMrz;fo1Txjed@QYJ<2a0qmGrrp{PlPCD&zJvd@67=efD876MEn9$pwGz<% z4_>nWSOxmjgFQZ!mG^MfYsu=*;`-Q*90`mBON$|b=>dyT;(WipYqQyd$4$n!Zr0`L zO^l*%r`QyW=nM@Y;;A^)40E#TB#n&d10bjs zBMX~a6_usOCWGMDlv#9Wm$gVi^(kdii%dKKOKQ%$i4;I|n2_FBcMA46bs8em;EhEz z3UhEAa2xDPN6Z{qVgWbis!~W1!+rhKwv;m|sagv;ngMZX@X|)Lf zPB96jV2>sfQPWGzwxhK;Cqs?#kMjT? zWXU`pnP~CS&>uDTKZbSL;)ytga|#g_$Ixd;JF~L8 zsjD%qiCo+8P0UY_=~(h)gG)6H{aK~4c;+0RjMcFIsx-OUz;rcckmOvyaIP(wUzd+b zO@S$xjA^VJeDLj6+mllE71FRcP7RS7GCmk%4XKQ{I4P-e7As7KsdgWbUQ4qlox}0_ zT3aDC2g$yP-w<`8&s3RNiv-4P70JpXnT&7MtYmUK&4Nvvcrkn`iB^1Q_BtR6-6DoG z0AXYi;7`45x0=DD$+G`Z!BN!8ox}43*v(-nOVu4w@^zi@G&i45fwVPN_&HebeX7+U zgEizsyWJlwU9tH7O^022B%H^4kpVIB+OIA$j(^kD;x(pPr9B4Dg0KYE(5l$+p)zKI zda3oYA@e5!t-_Z+vA|GvWkT*Zqsz-QLg6#ZQXhpqQE%OFEoC0>$+WK!%MHPsW%dm+ zZv9BVoD6@VRIK=0Do!NE@dTeSj+)1}ViLSm#n^yN-*%R*)d=hCVK>-NZY;UBsE5Jb z0G97HBO+Anod)TZ?QdnNJ>3_Rh{|0l&GBv|zlmsqDl89m`zPCjig)x>=;!8*+f5PiuH#rqc5u8bzcm341ctXC%1Q7e} zVwDq1E|&n$BOoR*=h$t>ZKtk}PgpTabM2oWW@v;oGia8knQA@N{2Fhr_7!RKbHpFU z2(dxGaK-8{G4sAIjg0!F^eo{5wEa;ywhp^muoueKmB?6*F@|bbEt<^rR8(ksWB_is zW_>LkQLH5=olrI)BURP0My#k8P5HODBRMDYY1sULL{2rvcLXJGBZ02FOIp%}TWtl} zLgk^Gt2BiqW+$xBm?*}urD^T{LCShgO2<-MY<`Es(Z@q|6Q@Vl=RqI{qJeFU3Nvbm zb@Y)TTmw|aEmHQa`TOfA?w4wS|JKsV^(!uRPCqJpaP}wX9Z%-{@2uuIJ(8#oz`)cT zx&2vAEz^)gjdY@XX4ARH@lr`*8|M_!0-Hmx`51{6u5?{sa?jWJ5&W_oSv>9^(B5pu&$;R%PI8C z4j%qcLSRVVE_qD()GFLCn5suKvM^yQPhEIrv{Wp1)G9w4GOV(I4=d#bw}IB|6*OvZ zBFtM7cb)IQ*Y`kigCMgMi^|EbudYU&ABN9Z=}k{Jv#p3*Y0E_9!aq=%oLGIoMwX}O zUt&Vh+=43)@`n$rN=bI|&tUnPxfO!X-!}o#sMdH&Y39vW#_TinBi&da~^aV z(Z{%MPc%#|~CnlL0M)*H?t z7%0cIyd_A?cDgYUKZSnskAxlgO*))$kBnx zr0lHr8S=h&--+EdC z`V5q#IGCrGW+RMUbZRg?hf^ta9wJC^0ty4pG-W005D-vhdSm*)=BtC9X2tf#SlJ4A z;_gT{ImnPDL!=C~mA3hKqpR~NZ?>aN`z0EyP&_fEU}t?w3P7550eddV*K z0mz0!?9W9DLgLILO1z9NOpk$Fpocq(t(biqs;wh@0_&A3wRtlP^TE;e5XRkv(On>6 zO?&7NCf}%2Y#Y`v?*iY&AUZ>-Z$@EL#OBQAl?RHQve?Ee!42!5E+`s6e>#}9=&{gK zn1$=51&r*-&Wib^gKN0l_e;Vv;tT0!Oq-Qma`YJX__r2`_%5&#HMMeAweo;|q3$MT zxYHliVTH%b(V;6=zf~f z7Luh1irun>gmsiz|L8;GfQ>4v*_Yg_qt?ANp!t*z`E)^Sc?|8dCEt(v0We~E4EE{e zig*GcUyuxhbnRU2)7DR@hC$$037wWW6KeK2W^>ZVmE#urXz7u^huu* z8F9%+<1@EQ(4nx%WL{)JkoY1*`m`JE$K|N0Qx5GVo9V=X)zqa0g4R1(J3s-XqYkax zU?{7fN0`dbPwCxpc?zvlpu2&r4TtXmz2xp*wKI^VrE)Dl<#fi*uTZt#U4?qRR_1yY z#Ly?>;lS?yQeHk-9yhE!8thBNVu`knKF8u@bG8>^*Vp{^V1KrARM+^ZF~v5t@q3f~0OBE4Bw;qTZmb?y0$6U^cI~oghA(4t|Ly4GGy;&Pn zH4o6Wc@RHmHa;kEOsTqnBfd}z5~OqLi&Zu?qRghy(Fd+UIRxC{I?G4`VERn+q(`e0 zu~Y1PMj%=&zH&Pe9)IU{pmy{A%I(wQCo94H`6(C+ z5y6F=l^Y(;nI^hn&Kwq6+s1r2Uc)V_d|qt#PC(EWG~|jv5|^`xpfg`1jo z#th?sjqPaEZ=AWp1yz+gN1cY}LjB-GncfFGlabk|_V*JuXO^4M{mdNlE)Z#jZ1F}^ z>b29t0ZzpMN(B`p^kBZU2w&C7$1&lj`Bb#&84M3|n@)j7eK(+pPlx&_L7|gaLs5SfLiPMQ_-5T3c9*Rc@0g!LP}}tA5dQS z@H-Z8dILsHu}5^a`GMz1{X^(8q5+2P9|*F%Lr>qc2A*6aNoQMFQgFZV*aS$bM)!!T z3x*Bu$ih9U@6iV)R~&+A&v1zHh!e%W_zH!6d`Bz5GzMqY1!;c%`PcJoRG2~7_e%pq z`j;Bmza?${?@Qg$&DQ8YdN>mm*X$8R;kfe}+EwK}fBawp?5F~ZFKeeuT07%K2k05# zTV~8c!j{C<4;xe&mu$pQe3a!=*oAZD-(Sjs*>Z*$ zt;4ek!l^X1>j0O_uTXD8dZMcUDE(&mSuwY!gAcwd5I+VsqEv_5+^PbxJALe3tUg6+ zMzs*xz7nSVhRIKfE0dt?1Cu#6NKvh1q^YY!z52moKfHsFe99leh5iMVTxiV%En7C3 zG-NiF=%Nus&Q{njDAKZ09CC1y6%H?LFkp%Q!C6{Sa2#Aeeh$1*eQZ^{Y<1>m{lecL z^0>^{#xMD2+x$FeB;)FcJ#%MqOJD%OEOUQ-8xIFJ#%(f3PcMpgkD`G_Hklm6sL?)j z%3C^kJVrAFaUY6gXGkb^dA=aBL4~qw_XU5H7668|WBvJbFS$Oojaxo|hi++4eK&E< zy+|ITcPJk~1qWQ-pm_euI`Ddj{Iq&sRQ$JC}5O{fzI>FR7_&%K519)Te z7(8Brs*FMUDT-`fJ&p(H*g$gxxOa-99m*kr6o3m}_Q?f+E)*D%a!>`v2u~wS#dmi7 zx9<{i=&kS<-3R<%(tYUuy~y%k4y^y>xTyW7%wleoiiiHAmY!b#l*nL=0RSPxw@e^s zDOKH5vRgQzu5GEOX3s>)nlHL~*Ev;B+#x&rnTgMZupesvRkwU7N3}?b(y!+l+uO?CAOoOI~v?%DMio;2U zh)!6`b3N2x^+$Q@ACXyeV-9=$8!ElwSTs*$#qdxDET|de)P9E4^2(D{MXrhoGxUu; zVn)}|XP2oHs1N)IWp?Nvi`mNTy#08zrtDdx#zgY*VL#C{PYlh=!8QkVv*n!4FfM_u0~Ap_0ImOVpv+S!D3O~41xfdWVF zxQC)M6D2rodXi_%}K+BTO=$R>Z8kOp?T*EvrbKXD?KFSNCID^Pk)WVb#oh@HSEI6ZC<;5Mw0b zf;c{NU@HaBy2%#V6nmJF!sPRYm51`FW|P$(ruQ|Hax=|3j3tG0 zCx+?QY31?1dpBf^>DhBE*OAs!Z;7jCf zuvMcp8?@#$xezjDXIGiT$81f7S45UL)T25}2=k;}&}sF#(MNgI3hYcirPxHz6S)a@cxiE4-B1<2 zM(Tl01(rbXRN z*FvG5ZP7*PvuYgMPn*?w z22k=O@(iIDXr)HlkW%~{^H|Iw`mG__k_O%8v#4xPavBa#C;e|R5g*QlR0v+VXnk=_rD1?trRLJ!-^Q|w3JTmD6JAQ5` zBb91kIquL0S2P$$35hI67R750zM`!rFsj?Ld>nbo?CQ7DAxYSlr7)anwj8LU>YI*7 z!EW23ZpOgQb}Wk4RL(&omdwQ@J~sOgBR*9_hFr(l11ubM7%5uDT##OsbhDu{GtPD>mO|C}Yj&O*JY-QewS_&SSB6gl<%gnFzH zXj2-{KjLTQiJ@)2V)u;8DF_xF2#Z=KqA9Bi?H@I>n@O8@@&SKQxn>4@R7GTU4uUw6 zI=AT#v7%k54k(F5)6t7Eom|@M!+fHQB%{?Ti#ZFf_2!_{;L)cT&U6Gd zRA#jl93DL<>}Gc0nai*I{Uw{v`b7|W$$*62$3`v(kr@lBIA%`zQQ}ZggAjEJYxJex zBO|lpZp_L`^ju9Qt{hOc2joXo-3dh;L6A&nYecWx)^84l8(|8XWr{Ae zZ#}W=Yt_m}zIWwn=gD|3WXzTs+U-KWtp>4PW2W)W8^)hFS6j+J&N8!g4gTufZ%htO z`LlvZkymmYS$gQ8*t;rngU-!dM9ct5o|S8yH$Ls`FnZeX<_k%&ab=vMS}FA{Cuh%wUd}n z=upa8Q;{zSr?$;EB`|<q@ej)f4?uyhFwA6G4Oqoj3L)EX(@#o5+l1_jfko$SoFcO5?#SMo(x1N!PCe zvwVW+x!&hGVo0zT|Bif z%<2|DsSCm&&07$j#*D4zpqRj*P{zkcgz;_*|Da`8WC#RB6eh)apSNTIV$v*jm9Cy< zu@m;;(eKBOh^J{vHYz?`t=^$3fP&HH?OZ8P#C4Gjy}N0 zv9mn5vin=60hk^xkJ@n#vB2<(`WkSG#^wbW{2Y>r*22P%rV}Maoo|J@v;I9yh?59m!*E`GzwV%N~dA|x7S{K8(SlL zM>o3vA5ivRVA_kyYCbw}GC7N=KP*6z<%6rN70~>aB|;U28@Su3(DICrzI}1B9kM*K4%a>Y!O6D8ZG(CV`>SY`b0>@(qte@R zbryOIIeI|a%VMc!t=BG_7KL*n3GX%zbnxmAhpJ-10?ShA(A)1*lBTp5nfH`-l_eGQ zn*c&nH2sv5H5Tl)2GT4rQB`O_1*(i@uoP{8KD{vMvQ=oi5J(K|xM+nix`QY0bW(5qTa(A4E*;%#OdR${@&C{qv5Qca{sf{xVi4A35 zQUQKRPcfZkhE+g+4f2r2xQ{ey$_ugyc>#gM1WwZ72yuCDq7c(;+|&h|dR$;6p>@`f z)j0Mo(Q2VG#apj7%q3Y-KS|OA6|}(x>CSzRqrDqOrJ3mFOn|3i%&$$p^?;?McW>p< zO~DL|3ywik-gL*Ulo0GA-RNt!VWPfp#)2PGZ|cuxh`g(k;(u5qe2Ubj=nCC8u@V)# zR4cKoBYY`{%v+|O77Vtjv*{{UA$AtuubMR{42BzpO7OrQV^+`A&%~H5PS169zBq19 zIwNeQ9Vy+|Hjd&1C5;)0lbn~WpJ*Y>9Rc#+kAYdtPsw}#FiYl zF4&-J%v`S#`904CjPvUSo;_$4XWJ6yePrtB?iJ?C=I1gAvuWSD7)5aL;y=F%t>|6} zqmUJgqg>8Y`lL^~py2r8s`7~G{9L|Mad$(wsoH!GqWQML@v~p-QSsZ|4>jbI-(q4!#3Do@#PSGDZ^tS9&HaHy_awxd?|;`i+DJSMgBJA!X;B$rKvf z3{BSheF|tzJ+FQ~t?15E{={HqgEvB+sq2nFYA zuu|8UFaRwhw@9f%a%o|qswcb7RB7Q~-c*Txe|X_D3Bp)P!e!GjvsJWxMeqanJ`*#* z?U|Q(x1aTA{{ykXc&H1%!0;y7BuF`~Re)ZQpO=G@Kt8$JE8k$_+R?JTY(2Z?NrqlU zGPR^+%J9J`^$cC$qOp~T_N8v)e_XOhTOp-0u5-O08h6nZ<3bRJ7M*OZK z&FKi^imw_8eZUHEFrBC>I+TGfei-<=^tQGu&YQu&E9;v8`>2n&>Wj)~C9YuyvS@g< ztwM7=A{JQ1$!a$Qz5;L3eS#OD#`a8ZmK(I!{GnCbM-`^mVIVzL2&DyBIZjp|d>35k zIyPa`4wFi;^=vUn3pooS@C}YBu%_02PrFDfL3@fp8W}o9Uhtn_Yvu6{N4S@0N>l!^#khGgpM}^2c>DmffI#( z@Ez2rFUKglWpZc^pmlKLp;^_83lST17hprS2dPu@P%y>n)Va6|DMFr)?$d)cL}l^= z?W-jd|IBWA@QR4&aIV{67cLHAhdA;oLI}JmmJ8S{a_0em%QMn!eMZbIpLvj(go%W{ zAnqT-o^7YePFY`CvBdwSR{S3y!r!)tsFCBBL-G%?DN#w|FL?CFVl7-Jkq{^pa2f$k z7%h+;xfLQ=iL_X0Nr=2y>hTp3=0aQ?aVa6=T-UTt!eqT!5o{*Uqo`9WLO4BJ<}$5` z)5Do}+u_#LhuYiAl@}VkY|4bw8p&20&OgRnq(whprXOjjc%RHBOm)~K zX)AnTk>K!`+1=GGQj-fWQmhp|3pe!-&o@^2Ou2PAtD+lSnrzy%hC1{_R54L>_~Yq5 z@m)a(f$tBjRHlCTKhV^r`w?tp89?-~lP4$9T23XV$U~sQ%^Gj;v?xy@#+w-HB6w$| zN-3dGAQ%}cER;Hmrsdl(%OjwxQOd{Pgi|O)L#--8ORwea2d2s=D5+s2H$X9)>FK*= zmLdz|$f8pqn;IMXC>M0}_tD?Kda3`ukl-CXaSM`9-B%vKN>;c@DpaPl-w9JBH`^lK zgId8@KrBH*m4o-QX_Mw(#wxe%u!gfIY~IF)J7B^<##WphGJS^Qdf4zb~=MN8Kw73jSU@)LV#Wl|sXaZXG(43C~ujjLZ1 zBfD~MSRQ9IopW6in|R9Y`jcfG$tu=x@%plt?R1;4*=tev?(J}YUwfh`pq_$XAc9fdo z2F)8SupL*O#$uSiCV2<;`Eg2}wz$hQ`kfU#*>Ygl!f*E&mzE0LOskjOs06bJ@%*(FrB_=IF-i7xARu>@G$gK?5wxt^Fp7e7*C_#fOA+Enzq zhu+?)YLCRvY|1;sK9IP<;u=1@Pw#mwv{~t}NnbMvNmVx~4_Q9D6J{@$$rF79pOdXO zpUZC9F0Uww?l9zzH@Ddz)F_bZ(jylTw1w=EXw?dznR;k2ir$bfE!t)2sgD)JKp8-j zQ%hP6wrK`s`2BZFiiW}VzBtMxz$73y-xa>keP{gs2x1I^dQIr}^YiZ@b@fR3WBr%> z{O4buknI2Md-&fQgUR0;!++RFnF?BeosQgsf0cb&R+#e3)$3~nQsZ_0j*Sg3^z+Rr z47)bd2<9;2lq^($`hP)`1tZfZCMUUFzJ601*3RX5-+Kxui6VW14W19u{ zPSW|G<0*3|zHl$)$~kAs6!pil0ZIwE&RL25^;1@!%dR{7jY>_*S-}w91Mri^me6)idlm&C#1RRbN9Z`EKE1ot zzc--`#(3mIX|&{E!+O`se?VBFSno!MksDG;>Dp)1kEfvBgP`wCZT=iV7NlVvzV>I; z6lL#htR-zABuh}IetZ2!^cKUluOeqOfIT7D^gSVztZB|(25Zg9a1JI46A6Bhnya6% zD~w7_(lf`v48g1C*Mh__33z0PfeGG_?u>^LQ$b!^xQylWgOV@IgU141h=~L!%COGP zAF~gIH|-8#sDd}$P^|N0L)F)+QWQ%h>2W_}{rWTPU%18#r=_4i?8<0KCKb3e>c}%4THmXt;BA^nw91Wer~Um!aVdm4$7mf3Mw=ta67VTy zHZx;GS6i(FZ}28BV#rJ{ohzps8h&uUQ~V0zMC^-8QEw<+AcMSk$LN*y&V#FVsQ-kP z_3{#SL5pH9v$C?ik@jxVgwn|BT%}?GX6#4++A193qqWpiVa$0ZxffMERr%WbEtx1F z&6axyQa&^F*%yEG_GTLahai6ksjP8%2brI|Bt6@#pHCiYM1zeMLBf(+xRSl^SAN7f zRGsagDCo;-yf##HNg@%|j0q4z$v!GHye=+YikKYgzQnvq3YmpGBpRkI_` z9U9{`xTdK@7L8YQ)D-wgnxx)4gj{OQ-7F6mvU41filthPak(%b8nyM9MK^YS-XyZf z|FD|pg`fg@0Z%Ud9wuvc)t~HQ2mL(P5N})ZVVm8n>DVzQe>ViocqU8O|Kn(QhlhjP z5dfst4yb&E8}Admn@$YThV{a6vts(kWDU_$qRjc%H|6jzVL1QZkNmGU#sB3;eo^PY ziaWhUDQnIMB2g_3`1J|-YT!`SNZ^LxiV&8g%>~AZnF2LiLxum*+xZgTcuXvQ`G`B6 z9h+ZqUgQ-&lzkiVQX)HLsv`eQ4J_#A*U^x1o8>ae?qK|o{`vlD@lEB5HMrk;ra_AH z7;P;n&LM&GH7MV#E!f~x`Q`z;sM&<=B4BK#H;Xuc{>{tzd9^pXvx<~@W0G`hbsfJV z^%OEn_W(M}VVt|^$k5T+Qi;z*CE28M3Tv@^rJPqM`_J~_2%}VEx3EYo{*5LD!z$Vr zHk2SQlb`dbBTOq9UtMj2f8%C3qrgGtZr`g9U_6sVCM3nA`|DoXp@N008*Y78D-+O_ zV3K&JtFDiYuN7geT6A~*_{}0gepLRqxL@?I7o3R@|4mQ6nOrJ3!$ZTU8tWvZ1a%gS zOoJNVO4A-Gu@i7%PSvb?a(Zb@LrSWGl#`B@f@+2=>6)Bwa`70`^fQra-rti#TQI=& zIQw#VbA_Wbb&>()jLUPW+ToLRVr(dSsgYP>_Y`w-&VrpAxY8iOt1{w`DUIpI5;kY* zBA4LgS_-G?B-jw`qpG@Bh55ny5*)+UHS+^^f)9f&M(hj-M(OzbXTOsc^J68vcPb55 z-6rW4HKTv`@xd66K`B%aQ5`?<@@knm*FPH)n-QzjYi-m+hX4`>({4p3XR$X5o~D$3 zdm=fNNhnj59qlD>2Dcr@Ldm}TVTR8tk1ei<;|sq=Id3wwF^sxdT7(2eY^ktiv^ljN z$ytI`Kaisor`)eEW+WJI+=pI5hRNpQpM=_?pp46Q=Pm$8$Z9q?zHpu)FXve%Jb(b& zx~VDJA*9Z6aoY=Sf*Kn>t+dlrr}7BkNi(|wfV=|&n6>hQgjAtSLPz5CrL~LclpqHx z;*F@1407BW2fZ}*41(vwmhcUBQV=}FCUowQ(UZ|L7E!o7?0u%9lVTw4bTdlaJBr@Gv4~PhJ#w7aHj`0wOo=0+k5O9%{f<;( zNYK($lct^AFm*i14_(3V{F8J!ccz9pD&#@{tK@?_e{yLqbz~6M9tHCmu5FzYR zW2nY>9{L3*b-^56&DC^Z95V9co1EBSwr_I@wd%nOqk4oFI>Wd~HD7?;4VhN*44rVk z3%RCYQ4Hh*p>>N)hSA0Xo^Bg169ZiEpR5sc9#&iwZskGl!t_0bo%lhiD@^C+c30!* zm`3u>x&Gk(Gz9AtkrM{;fI7a!I(ODI9rC@BRD7!MpY~$U@qYfG-&8kD_DUvHY>2qgQ#cJon3I9%au{%V;(<^(lDKU8k zvmQ|7u%JvVqzvMWC6s?I2 z-PfQ@!;m;tT?tZ35mC@v2zav1c>c0ZQPGtPTl1|l z;{uWO+lk9GT4o8;gN3^!f!L*Q(i3SRqRvjK<37E%NATX^K5XmOFU$vETWph~qr&i(WR1PKf#*nlEJI>n@+T%pM>5)bE}z*x&xZgA?nYY^hBp7*_Oj45$tqzIgtj zcYNP>Bl!AwzhQ?cFYy*9jJn>E0m&-VN-snM%avWH98aMIk@J3-k=V(Q`gXmpk zM7E?>hwzEAA)}rHjI$kxJYtecW`?)5mJQnKM`VKj6zHTw27qnME;=tcVhKzXSCn@M z5{uSebGvz%p06$2Al4w%Acb)78exbynr#S7)IZ^#KKl9}?R!I!4v$-32d6yZzq*kA zw_OeT|BtI-Ve^I0;@)lO(B7?YxFxBtxix(gYiGj;NrSV^3`}blx22H8N0?nrZA~wC zsmOFP?Yau$1xBbx7VBmu@2OXvz$aY0ZFV>u=RVv-|9qdS`ofeB@&ve>vjt53te>wnT9qm7Pc=_WfVwQ*7QqOXqV5UfO(`=l;U7soN3IDp zNrmm{TK@w%lkP2q7BdMXgJq+ih{W9^mv<>6Ol@G>( zej}klm`b#3Ly0HI)Ayh(k5@d4H){U=0V3=ctFJN3Pofkmk+ZE>{1nTLQ#LB-9u7i8 z%%MYVejSUTskCfNkEkfJvJ{ho6djZBP-|#KHj7!5}I5i=ggIg+!?ZG=9n zBC)zQFU#-ed;t0|F)ya4U;*E`zBgIPiXm>YSsMQ%=F8w1&T+?)O=<^?CR?qI<^;Xm z8ERWg@Z1*Y`hUBiU&lQ&MIS*M zq=y%VU=&(#t5mq@J#8)F#Ds@pTyKLYwrtH0+Js|3K^w%Ja@%#(sU!EiA%o;42oAc7 zVjW+iQHa0~utYN3LnFxF-E<*oA}>0`cre#DNnnNI7%9-Ml?s{PW|7ko*d)$jkb2_G z>a@I#C&{Qlh2C`DFhWA>q$jU7?3<%iJ7hwTnXQR0G@@~ngt3xz#=rTJjZC1}|V<_BrVdyDn1?{^&3>ml-;sFLzORL+`Ww z9NiPP;r5?89=VBczR$IC0CdtaPaIu&Qy7prBi@Aq*6t=y?_0Yohu@sktwi8^QTh}c z3^?2)k|!9oj+_Eer%tm*8w|1Myu=mDgN^5zG?s>UOV;StE2nGPGLl=BqJy6?px=~@|UKnPXxvM#x18hz&KE!=|&gBjB9esCPbczE#NJ~EBjrC40AIUJ~bC=tuoXkQM85FS-quiPs+g<+DKP8BH*GI*Od?jX*+ zM?D2%$uN9A!*7P%y8#a)eNIPU5?jco7&ydcLO4`0Feu1KutdjMa6fVW6KQbI zE8M@a4Tqy6uwTz#w|}YM{I?wr`hVtdC|G@IIB?#DD$R}B1C)5mLgaYU%4`t?^u^ag z;ux6y`eIPomFMy(l`eY^5<6Y9w5D&{uven!hZ5vf^ikq%b+2dRjEqxf?;p3fsJ_JI zaLO=m(}`Kgp;{{Qf)<~}M&h(ceuvGAuM^$8Nc>L)^*B!zrOU{ES0}ma9F9(KJtwrw z)~p)-fMA#?x|z0SfmT;I1p7pq)2}p1;{k_61;QO6JlU}aMic+ccY)E8k#k1ZcsLuj z9Kq%BXp(bsjR>QkH@`gu&7!8*dD4HAhRdZ1#fzMMVRcqn9BjxjeORsIQPQ!Qc@-8G z8_JDo_Z_KIRawrV3U)Jeg8c5%!mrwIvcKD-7VsE&yx2)Guo2^r>y*u#snTkM^@V%A z9yEcgD_r5J&I#e22-Gf9*^JrLYt;bi+3MT`8mFl*Taxp*B35R9zqwU$a+{5POza@`j#^?0^yAVCN1XoJv5noB?Q z9l7Y}{4F68hOfuKABkXD9kiYUX!A+?R05BE?g1fklx5&4fv-yozaDZ)^9{9*Q%EBh z9);d@=fG8U9>~gQe&}6bXied3WF`+AF#h7B58}c>cMSy~?Wpd_EWQPYa$KKAx19qs z$UiF7!v#~!B4VB^O9N{ewy!=2tRNU&icyTjdMzTtUfft!twUOuPJDoKp+BbPxx|xDG{KQ3!*<8aO11x*A zWm{j{EVFNPiZ1*J)Kc(9uUpgm$czuXb#s2b!JMuYFp1Dc0U@S3m?4bM*&#Od?5(5dK* zf71E&uFe0SaX{$*sRN>1OEp#lK1i%7XZ#8eAu+8fRimG@p7 zrS1i{VNkHC!ykc)hZxAyqC@6Owg`teJJQtfYsY zt`+uQ{G3N^_}1^`xXOzxi`KZOd$Z1*nvh)JQ!mgt1Oh1^ionQn0w*Nk5zH~M@3bxH ze&08YH<0`tH0q$R|aS(Fx$M}FPaoXHSXj$6D`R}PyIr;{k9p{KJJ=a$vf z8|NQkgFK-AjvR+E-8(rBY^0N9G*VJmiZUu4{c!`UURs!tl#x7YtUi-VSqAh`s&81A z&V)|SSb{Mkr!Ia>WJT%83utL{AOV}YQ~_Mz=zAZ<`XKk(Z@u?~nDDG%pCPq@IRzGZ zrq6b@3~R5!?Lh0{<^e6MC&OYEJ6W;d^BPwV)wBz zL7oCb?6|Tb6~TPxO%Fem0<@klZ;C(>29~tpK=xe^i7qSU>_GO4-3KUDoTt;E#&JWz z&kDKPi()#O!T6K!;YjHsSM9ojOiE8a-#~2k=jaCf!Cp3rK5o#oj=h!`yFLpxVoPqU zmOV+@B!^+_TH$K&JV;ln^EPa49Ki|s5O8g_;9S%$v(sNlS0-V10iKKBlX#?Lca2z8?@57btjiGKYw~ zt{5KmRcd#2H=!TApPXN0cS?72cVKt^cBwZF-8=1HNANc%sG9pP3xy8+UtRkD+bZ-w zc9wr)q5R!LSwZ&46uE}F_XhtT7D^6zFb2ZzTqBf|F6Ww55%U{mRM^+J+0+Nw?nVqs z4K%$q3n%B}I{V`~w~Nom%a;(1k;Pb^?YfFQtNb>+?_`DRlHM4bMtR))aAC3E&^%jI zR$x4qX=5wh{br63sfW+uddx@blZ|UPV3es~9jSN2Fmn@TJe(W?e+F7}QZj$pf^wgG zTE7MoY?xfucx4!A$oL5aI#&`F5OMV*oT;NPdW=#gL17}+o7_CI7A;b~;KjI2eqAqx z`g7qaNT}4rauFQSJpw=JFFrI&Kt&J|iFD*PN#8o%`|G>8__{ut#l0B1bFCmJ&YNM- zI`S&jS3?}4LP{fDbQt|Cg9X6_B*Soa2W&iLu%&bCE=W~dw7sX5u&lZ0FOr6|&qpA! z7hJc|s=w#VLaaeZ;N==U&m6J89F)HQ>Y%vQCOruZ%@V!%=aeSKLL;Pr4NdYT_2fR5 znu>|KAZ0G+o|k>YK6@Uk|x_K!^o%Y68FFdioChyK+TM>n9&xr%|S#QJBL9DwCN z8L%*TzxCJJoogcxRQjKDQ2w{I`=1Vqg{%TSns;l@!Js45FW~kZ!NFfJsF#9>!gLXc z`v?eqMb>3`wu|v|*5EHie;X)&Wn*lng2faajmOMh+mjE^J&u=bvOB+}3~&dxU|V^W zwDYy!2oJcgO|+6GBKz%hKHdrcaS_&iG!DPl;?+P*0$y2RL+d-0U%Lqv4qF;i(tc8V zD9xczHaBW7c(8WwoCi8hh;{Pz>Y!`sRCnd$4F>Q!49yJK0$e}X^r2GoxD+^(@INo@ z2I6!>CnSl_e+09(>{i{WDthAB4t4%X+?NmQb|c5KAQA5?gHQn9t6cEAh9Pi$`#~vX znLizXH1M(J&jnr6z-`nNn3xEXjVTBo$ttW%mO^$9@v=$eSBKUwd8DNR1p^~UENteYop)8`tHQOhmqWU{iBF2azSuO3JG#ow2Krn6~ z4$4Dl0-2R1w$vES{h(#mys8p2c$RC)Z5PfDgy18!QI1n?eK@C&Xiq)C800(>NcCi(H711m@km}26{p~TswrdB7lwf*4BBNGmi zFv9d+H%&3P2_?`=+6}k6&Wh+!V)|h4(#$dRjfRAD94@5FyB7Vit$U(Ydf{&WN_p~G zVhq21kq#<Gt6v;s05`2|`84(X!XdIt5jTU@(mD>e_tyQrXTJcdgC;r^1%+=ZNyDKw8%pO|Z} zy-eXiZ5sg%2B{s4iV&VjJ(~FzzjUj!a7;Uu1!u4Tq9`^Z-e;iQ=OdnWmmCR~H71F9 zYi_@_dT0Ewgl54uBKFY0G{I)cEmTJi;niblp@<`D0zscUzvnd@_R-luzRrov{~2fH?{DotoRwFVFK6XLq|AsI-!du0%Fikm zx=|Z%40wpXzXWbsNh%bYftpylO$<`I{O6|H%yzwWI*S*v7m?Q+w)pBQ&$(HQ&js$n z9A_J4SO`_%D1TiWWOM2E{o=JS-#=e5nZrEApS<=t>4rcrT)EvgeY%9aid2@E4i z)-iQ@x64kol^JOZ+C=JeBxJha!!Lt8Vr{iDiOPJxVy_KzEuXn=J^%7SpYq5p^HADg zs5Hd^V+pb$%-CU!vB?C+g2i?Gz@AZBIPDgt9$PH91m=kBiXl*YM1&tzu-=LU!V~I* zKTn3I5v{jj0c*bDl|eYlA-C%6goKsCD2!`J=tr<`qh2{nt0;Oq$iyrfW-88I5p4l+ zj81f^WtNjT`DXx~0@ud)vvGiTBfaQuIA>++u07irmp!aUaUr^f?sZmmwo%H-Oy7y7 z`h(&A-LI!gR=k+kxd1b@ljOele3m_2l?BQ2t%MVn?WTTfKC&FhStj^fuAvhX-}j2X&Ur;4~mFcPgo60d3O{Y=W+V(4=u1xUa2Rl!(eL^a_q5uHz| zj3ycXc1i%;FQ(nPcNV9n3FpL@khhR+)+*1YhLZBKHjbt#F(2Q)i-q{UGW3L7?UHcM zC_!urY>4!xAv;jERA^w5;9uu+Itd1nT3FbmBsHsW7_W?Y`a3TrS*!JKE0Bh!*R(Yv z!1J7vNylI9z2_QRDUZur+k`+}kZ!lpJU9}q!oQe>tgG_Vo@k^M;G&|8$rMExA9-5J zd9*f_hE>OcMf8}QxNR&W=T{0vlRO{I&@jkZq5H`f{GvXQboMNPi33jta|^_G+7YH` zc9x>x%|B4zYxO^cT9_=S_pmn!6+mvHj49^+;S_^}aReoJ%Dj!y&)HfKhQxy?1T4qP z<;opuwhm`w^GnlFNC!x+d8OaO>X|VVZ4*itrHNcgH3n*j+nI?AQ>0kf08Yi0nXmm2 zO(Z5knQqFq1;mnYP&67|&Ndm);LJMR^X_n-&jGP%e8g?Z2ohmf)~-zTW$ctUnH>aAm$s6N`GH2ZGu06q= zAE~(3ywCV5Qk({xGTBF~0mTpVipizsAQmp`W4v!47U&aRdn}ELQpKw1Y6H8NMLz~9m#-77N94Y#iAyS zak9A$cLuS2@<<|KaVe-}3CXEzLl1UV^&?cyV`!;10pv-Q6v?yL)hV zcXtc!?(S~I_w9YEPIquiA-oAcl^60VtKX4IDZTs4 zD>qlOi*=fSJl|yr(t{t`KR^Qnv!u@iH%RKMUG%ou@%rCGit88cxx7NAVJ|y(_LUud z=|vi)>3j$PD}6|8@S_D;-(%5$X?1Lv8QtvuCb#gnYqT+!&X(dY>LW=s?bNA1R<8%m zZ=G=UCa?G?wQ?inG8SAi7T6-rViY3AO|g#bmu_9YUAct9Lk~f757ye9f_p97L?c@< zj3eh9c!_XYJ>h6KdGgkQ@LIt<-bjDJ4b0j^zZ;+W^6JR>>&2&yrp=#sdGgD<;3SWm z#FVwKL!kv{;H9zIgJ@|Qo!?1x&EfDi%G-`Z;vIK%&V;Wk#AjD`7W zuI~T$Fd2sbnaTXMSBtwgti3`1ySc!xX)tV2J?u*~GEY9!@UP`zt|){OD8VSB3CWWmQ8}@k zM@Y`CNQ}D`vkk4q%3;LI>^K^`^4}{v z7{!?~;u`unAI*$c_{qMaX6P0iH^H67yE`hgT4oW@Qw{;?1Fyhpl1WO|8RJ6HH5n~u)T0Q-Z7wK&hn~fu6%e3s8DKDG+U{6rJCl1} z7X{N11qL-^SE?0hb|ebo1%TNl>j%d~x_`bY$xqcXS>#4uiE7rB1!lP|RddVvwSJmU zgtGhx=6u5jiuE}@$n|nS24mE*Brm#Q9`=i^z5QrfhPjTr!QM|!LN`I=qAnRbunSFSTk?s z3aOV4;WZR}sF0L(SkQkAU$6KboHnUWgZ?fcKU2eyvFQ!?Xt}Z=v9PiU9p;P z##V!X=U!u5nNr{KxR*Lz2kAfouE)hx9A(cq!F3ouzmWF4)i*K_rb1EqEVA09kDEFVF+M@K;d_ zM!l+D2McWjzdb}kAX*a<_b&CIZV}g%7O4AP1G7;e0=%ag-vlw{@g3_9Nq+ujtjDF(`9OdsFM0fAGxQ|}N-8py z8NWiq*M3LoMLlz?DF!Q?V%ULS!64oCmw&oXxFC=*dM@c>K^wspeByto=?Lm5Y)aGN zB4eN@Bjl~;b+!H@KeJjD2#fy7X5#-nY=+@~#b!RUi2i0XBGlaKRb<~4WMEL-CPPH>ysV-G9;2b+nMQ-Cs+Ja;lOK1fM2zCS;xyx{#3f9YT4 zvI!n(N3DI%QG=%PA|fTx>~pKRrBcc2aq;uHdvH4Sf|+%%;x=DB>fl*e@t0=S{oP zsd$SDQXPZ=4#)#v8XPcxjeOj@3zHbjend4|L?n^vg%Nu=E59CaFnNW!`;;e|>_Qq) zzQ<@>$;81?VGCep;VMHu-1>n_R<=iABDu8Ch~zZ3+VHZFS~ibB9wVfo_y8ntLO`{d zK^&nNt$yzC>SC**n^=EcyJX-LI_*I51QXC@zT88pNjPya_6lp~_j$Z782}*aL ze_dKP!-6;vwdH=?8aX_0xBB~tQe0>;?R$1o@>7AbHM^ZAQ*-#3*zS`PIu~3|T*^oX z8&V?CYT#W%%jA9jP2#I7vTn`x6P&p=grYW?vU-nW`wxHJ`ucS{99c(TYkt$fI3tab z@%5Thau0QQO7IqoZV9I(sIz>Nk1R5K_zg4cJ<6olX3ljbmwW|GCNc@lNiS@VQleW7 z!D>el#0s2svJ!K~k4!p^mAHC8xGlz=Q{59Mu%6pJNoyhWgu+yQ5PK3M`m7$5inK$Y z{){pgM@*;fIsaN}57e3$9u25B)V+~ArCN%&2IAHwyRUQc4eoh$dh$s0~T3fL4-0zpT8ffa-uwd29QdXz^qnw_i)aDW_?MINDuKX+Ra_C zxWlMul0ciNsce=pH2}OyCz9&?WmUPcD$h16uDP|e@_q<`?ld};K9zicPl~llGPOtl z8*N6N0I6|C9k~Hr*W-*qyGjHSFqm})@zl0%pc+H5XCd&e?;8NSohA0QtIig+7&lrN z%ac>o?ABc4GrbXDqOs7FOyn!C-h1>X)srLRo@P^@k4R0D^EG2*Z zq}fO7BYp(M5Lf||G!2kKV)nOzo%tqHBOB6{SRAQS;9c1HJ;QWH8lS`S-2FqElv1^x zpa9Nmirt-k*H$|j1%-zSc`i7X}Z3bGBc&s`D;sJt;K?aMQ*Bl^}#Hy z)Zm-0P^G4laaIZqwgJM{V8rzEM6<2sZb_hLqPrr`L2tkrrvs$(A&c`l>YebPh+MxO zqpe>3^4CI{no4T%( zT1qaFiwQI^j8+mYR1{L4BODKa6Cy_?%JvCfE)UFe5e=bKR}-8zq|Q~Fa*>ldw|;Wc zpKbK6e7vu>vefjX77L9=^g@7z`HDViqZ~n@DKPly&Ko8K>B{9&;O8ebk5vMoj;xNY27$Ic@7W@W;g1u zYZ|;}y{GgiExsqWSjbyZT+OI|K2n@pWi|`1WSUk3Om9aL8=PmAgkwrKbkmW}brbsy zPe9~y*UCFj*c}w8I{`+~*n1mJDz^5B>{=b2A4=4yfpmdaY`{Dyf_+vWK*4shP$J}* zr@rmWU86Re4S~q6=vug*Kb`A> zw@70<0kV?NkO~n%c|AEHjJtP>qb7(3G!^RRV*@+rz059&So{mzL%3Zq|LGUQTJ`6I9Z08_QBt3 zrC{gdQL2IXYw!+>T=aoc*rh<14CQnCyS{6fHYjw|&)xd4PtfD`H|Pn;KY;3Xr`=9* z7Bxm+*WD`jHd=8Pz(S*9zby=?PzU1tI_r5fnM0pKmtc~ zyPkICW0%#!$SWXm_}zCeE7cXA`BaMk*&|gw*zN{`qhnvO;Ma}K?{8ZHox;^SwW4iV z{WyMY22a?D`jQf_U<9~p9Ozla$5U5d+DX56U&SNe!ra0Fpgaia$moD{RCI*VC>W?1 zf4BBz6c;i!d_|pS?!TmS3g|zkw4dF*?B9cZ{!x?upRvyje`^`#VyFq<6vd}=W>3I_ zoPYpTN}VYwC!2O!U*TS zcveN?%HX+1m^tXaQmhW(W~y5P((Q@as|z(rO1jxLaMmyi6}|8ma6{wL?m+uzO^;{WcPQD%4e+c`7(pSchF-`s~p z>=s-=lafFkNQW4i;e+ERbm2G^8+lH_Q7yKj48pN^q3DN`NsguR-8;mu;7R7HH9|m- zY#&l!*Q68J`|Pb)ucN;th{l9WL~Nb)On0KC%={#=HBBOaB2K;RA>$y}yQls)_wh5d za|dF)hyRoN$f2m_t}$)BGrz-C|GoY5)_C>J|5E(n=Jj*?ry5&tJ3@i$z#Ejbhz(%| z_ux(xB2N@4A`jx$l|u(4THr4k_f5h?LYvsXxXhPNe1e5Z)W|%c)VxLW7<2Ovp$0 zF17T48j=D+;QV^8^_B}YHZ2kpR%r-3oTl5vQ+<$^+2OT?kTFFjQfZ8>8yX!;ODS*9 zXEW$u7@H>PT64>36VQW`I*L@STi0&$Y6yR>J}6~ExG94-~RFf7=La;;)m}I z$dwl*7>?$YWUkl84E@MdgE0-K=9iV$s0{EPL40de2_L;M<&(ma}n6#$iP4$UXqV0#v3%(E+c zOR?GYi#B0i@d>qd*>%BhH^(0BC=TK}D7m!!aJW1(jKFpFin?X<#FvKW5{Jr&w zfZ&Q4|3*O0sZNS3bBPy+)(%p!{5)YdP0=K&lz?^Z)Z0r}&IrXJ9UNqbfC?jrc`NCb z4}+#}WbvF=6~@tBC?K#c(#liX*-f@uAXGC=EG}xglN0IpnHFAtXa+=9Tp`C#kYBqVhdnBOapZ5 z?rKCuhcUKGO=mAnVt8wL1eM~;I^fZ}jX<9r(uJ4<;q}scElli@8woAO;96T3$pUnz z2XN%lJ)%ncA4OcO1>yvEu}IBGqqe>c;~CiCIGZM9f2sas2ljCI67S?`u=W9Z#Q-rf zG==YHnBFDkN06Qq+&Kl;`Gt`!0#Ob#ou18{%>3XA_pfUQYWZ^;;S&Ls{Cg14-`DQ{ zhJYwt>-jNgbvS=iA^uiFf>%Xg@6M6-H)u7Zt41Wqud_n0-UR2qoCsYOTdtE@0ea?L z3}(fAx@%@KZyyid|L_(UIy)(Ueg~D{XJmY_`ZCVye7?&0a`ExLqy5F`@)H7C^;2N& zH5FT<-ua?#EYbEy)a0ibmScF|RH!b^NS$0sR@5oScVoOWX0>-T<(`>e5tk8H`F9u%f9;CC#~ZGu@YkHvhKutYvw69kDwWJ}xr!TX_{{skdXCQz(71>odbq z2weJxF?`7YXp4>xX9P?&qzqj$76o~7x0}=Zo0YO#n2-L=f@m*J{$@ce@gWcZ5X)W_ z%U}_VwzSlI`b4Qr<>_40;oKqF1j8jv^6XVu`lXrvbY~|mU2Is$0Y&Fk^p-)c4y*fy zRHIXpw4eMiqgAjqB~_o4wbqOVWu&S~S$@u9fb{N(Uz1=MIePY2OZ2^~ogD{SZ2m9W zvb?ymm9$uKvpGuemzEj(Y%1)ZJzvY5`R;)e2S{b#GZN~GT0V_6jTc^OqmON7QP~VN zNdm*}xn(Q7PD-DDrX36x{`9xoem`=N&+xxYE5RhxVnXiRP4|?4>#4Lt872ojpcc zStk4U?VQiTq2g7Rw{NL!YaJyUlHNcs8#g$PB7Mu^7CH^zXov{D6dE*1jW4`FV>U0< zOH{(Ui0MTI?KsmTC7O!-3~bNCzY+!p)Zbsn6)X!L@Mu_Rx`784~+%C8_Y0Pdnoj|irVS&?_fYK^Q~D8?WOKBTEAR|Q&6HD@@xM&OEN zsx@m=pW=+}NT8Y*t5FraV(2x^p1#LXhGBI@fF@;6UBkfN_MB^qPZMV_*{up8&{(GE z9p?jsL0P^o{yHD5!cX#Rii-K-L5HzTIvdoBs-?3wX!S)51-^EpBoTH3)VjI7lz~h@ zD&x3mcro`E`E-i@-;_wE{@WRP;rVyT%P)9695{Lvy%_5!O(qQtjG{ZcpvNMjkB{zp z-b1iQAK0-K_9%VPNuzWW{O)%CEcVq1@^<&OC!%)&B=B5L!T7GLHiV%on z?UwJEEis6@RkT^#_@NxTlB``~8+PTI1qmY;F6TZae@7cqE-~WkG=!4w)<}_#e(NVS zd;Z0_a$Mbvki&7Dn+1@aa2E%ahhBGyT$((M`ZSxsalnY?W@Ua`t(?qp?Mi1d<2?3Pqax|G+ic?_!6^TqTna{UD;_Z}&Aq$9yTo8Ksf3}x+aev8N6m$|*B z)P{o|c+%G6sHGd)`=Egi!@`Y`r{b{a;2wGDg1=D-nNvIYiOOD^suiU#pG-3O-0)WK zH(EU*4+UQRF>t}3n{dAydw=|dd@Y816qE1Lb^s;AaMLXQ4{)S)JU&e;{gP1k#`cR> z{slzU5z)y8SMJ*ydwRb2?XJzYV-5_`-VVpMv8hSh%pK4{p~xgQ2sQ}zz$Of={iZ(K z6n%e&uY+WR7=vsg$vc!d%4~!i#w(Icf5KIst<A&3|e zcRa|O{&9Q$ex`6G>_c!6ZGF*J*V-we^Gq`D4+i2!y6zA3t-Nb-EJk1_^YkpRI`1-; z)03+0B_i+nA;K+c@#{yZqM&QMm-Kg8{ZPcm4kq*F(F$o2IHMU*`dh6sRiky1AYk!I z;wT`_LQ*ztH@Mu^4E@vN?!YQ=qc+U6O2y3pXgQU06RjDBzgc0*#w5|Ki-Ue!Ex7$8 z@wb?M`9mdI4259C;A`T!n*|CnP{*-dX=$;Mwnl6e)!t+M`Lbfmlg%qIC)w zh%U;2+?JWm5+r&=(Lx!o-t);OcgoNf z;k1aLq}9zc1Ww4<&F~y^0CUSM{8|!HormZ&Wzx~8aif7GOFcRb4~+#>T|NW~v|8~4 zHibb;UaQT+$Utz0s7gIM88H5{!Y%Nzg05dlE^l+nJ`WQd$alYro&4?3S4Hx=zh=?a ze4*sl&9jO(~VC$h;R ztKK7wk&mwz`tod(asEoX=1W-euzp@QhsAH1ZL@FNA7eOWn-2*%YVlvrC|@VCNe?6L zvZ|hQTbn{y)+Bnc4E~Tl&vIBezJakF$~TF8g&Bp0)zbIytqw?@1wX`-bYp|RmUR6r z?^<7C=-}?b^N0hmg~MMr#r_|&ZMm|!GO{wtT2c|TE=r&Bl$m9IYLL+%xpKHD3ivc6 zB2X!b>N&9{f1hE=bVzF6?2iE%&BLGyuk)zm<7P$yyf`|sXz;O}3GSCu`w1T7Wbcoc zOV(eIHW+y4SPccoHN%ZeS`B*{?ImT$EUb<~aY>0%xdT$}yvpUKJ2xH@woK|8>aui! zF}Q{@G0Z}hL$u5^cFah?UkhUiYor-3wJXk!H1NN9b_X;?vFE%tL?l!Z`L-L9`LI*wGXrt$C& zSK~;5S}k0hE=>%;u`HI?wbn{!I7krdyDD^&jVlyU6ThtoPz6OFkfJ4e6wj&(jCzgQ zUPh?cmM?L>aFSis2_{cW;tLE5`R1BngPb*Zh1sFgwER00kt{`EMUWxTHV``_PgpOX zI#I0vqG{Zwy={E771n!J(h52Q6?J@zeUuiVH$#wTk#NaLX*kCpEY^0FFLdj+sl7Zl zb=p%jST{PJuFwRF6t(Q3u%oIyEb_b|5c2HBb-+^nG38WlasFsaRTi4WMtkT4q*t(W zURKg+LH<{*KLBswiWzUp#O|g4Y^m2EB8V9aRhHb8KQ4+JFw&L6pvtpmOm-V*RCyd( zZgy>-KR=_EKWf%w)%e*!h4}HnyI%qZ zYqao>=Z`)y3F~2-S;(?;E&L_yqJ&F`Vz)(v0`PXYY8pN};-1h^!G!e>T4KA8IN7!_ zpJ&DvKO}OXef%+LL`D4NNZ6gS8we}jl~iCODeL31mesg@_Bq4KnsHNA%ktulo2Txi8l^Qk+2{N_~g%5no^j*nbB z%l;|L`Vsr*Ota$Mf?|bF|B}m*XOm36QLyh!XWV=-(01sKJu;0G3GMvV~zvVg3+kXry!wpj1 z2q`ip$Im!gwcvkGr{LX(&0CzuWQzhxN5W^u$jg$|_yLyYz$#%Zd>~Q$@aVtAUBUPo zpnj68jraX65)bfeM)sOzi{^aFHSB$&i4t02m3!sqTYXqX7{Fko8(1EaVQY7p(DhCd zjAbn#^;Ex)YiGPR4jr;q?#_hKC>sbDKH~;e&-ZuMAaPV8h zi)wi43ZrVlNv=&z6HuG31Inr!mvjA%d(1(wV~|Ab-*_9z@W*_LUt>D^#EsMOdu?yg z(s_^89^_5RI{gP*WTWOxqVDEoalBy0SxQ+nG zwS5XO;0V>L8kt*OsW&st&@H*1yu}S1ot;#>gNoZH7NF2x)D^817J*a^Uq0+*4m{F& zZRA{IXqupNnWY)2%DiB=eL$x~d+#0ZhFh(pkA#L4z`z62$g?~P@GEI1mq&@41bTF| z4p44AY1~Aslm85q2+fmCqG<(Bxs;CzYIhKWwGu2-1)>h8R^nXhpFeBNt*LZaQB-eq zbFadSq!9QNYn82F$nsYHWK=8Rn35c9H71zc{AnXKkIG6dg*kbo68h)7m{ziON-l=U z)@G`QYgl5qZq&PWeVP0BtX}qtkgt;)J(X5P##eL+7Q5e?hqU1CeXAAV)Mp`ZM>D#5 zt@+^=!MIEDtsN@z6m&6aQdBV`Z&TAU{y8)1SZKm@;+caEsX(r_z>eIDHS&Q8x+m~P z9-@w#jHW*fHDB!un{a#U2Akr#mcXQq?TuY7$-9lO=(>ZDxe}=Bx|{Jfb6J{x^@HIM zVawI+dlNpOQrZgQX9`Y&a1nD#(VON)yGALbcqsy=;abBfZBm>5(dTPRO_nu3`+Upi zY5rdaE&ZRI6E$vE+NdEcY_Ma-qw)LHr|8DodCc3hUV&cJCD zmqDREtkoZ6uOnx#S%bNIU4>NnqjR6X)KRhP0QeZ^J_IU<{hWf7y*u5J$tT6j!&_6& z(agqko8bGDkXqCXn_Dyt*&eJpAXNh;MC3Uz^e|qC%APbwtNvJ{;p}1rn#qZ^jzyCv zsDlG?yMD4W5tu_aG*_NBR86a2HPfR+%%ElybTTNwp?!2kA6PCugKLuj|6~lIpKu`n zcDQd?Ahrj^px6j~Som9sumhz0`X zEHMMOu$0x#AUPON_U?F&g&YLr9PenFHQq0FIhsV>+5s~IRub|WIw~Bok5$(QZ^LrU z&AqLwcg@RoS@q7MF`KTwFHpI^U_VF6FG7JS1>YK1adlS+l4cb($Sqwfd*|ylqdc;9 zY4tfot`{)&-&anUPkxWl^>fQ$$lp3tp{q{W>naA_fz8JwRnCe~e48z)d4*D@T3^66O&As)^bijK%g9<Wn=H3z{=LoF|0iaVw?&dclm4 z8fLj)LR7M68W)oDA#ePzMmoGkvf{oR)?tX$+6cCev zr$_}g>{K&H?Ab(l%+FXU5Cd2kh49F5f9b^XY*LBv&73z_W1CbYM%^is;e-t`Y(7()Og=Y-2 zgL$Fe+TqEWU@cd^LlwbLFnMhU}k1KFC%}N%ldXI z8cL0s)kVh>9Jt&c60T1)j&AhI&keO~r0&P);Wdblmz7iMQ80S>C8toAL%DWIHEfUU zuBGV0onw(|y{=lN)Q>cdoi$(^H`)23jYTtTQK7U+M0sI(b?7o`*p8DgqVxCh zS-CncX4!fL1v_z!ML)Nh*>>K#*>_fr)3rW`fG@)=9CGRR5=$N)075Lzg9)0aR@FrH zd-}dqFpS;JcrWr$2bcqT@6gD5of@nM+EGUj-gCx#99QY+159CaF|bLfYe^sk_=E#a z{2u;tnKdNohqY$rrvFs$PFhCX6)UcIzX0a-$jJm47yE8U?#oW5mgh7WJ(NtO=(|Uj zEy}*Q~0o!|jPKyu03^Q@w7=Ittk^Ld2ke7=cnxi%CRC>mT z(owRgSTP!U4LDW#5kzFNz%5>aoW@!us7cC$b+r-4PNpp8!LwklhjGM_nZ2m~QPBcJ zanM;@t)oBJ$7SLR0sBtBXO{RHX!jI(X~O8a7_Bz@7y~7^w38cVOahy$djvBa4YJM`Zf=ZT^~xU9T_F8$}(uf+&` zX4QeA4&C&Uv}1%7T`+Xluz!t6eyjx_&Yz9t_Fp!Z|I>5+&*oCDw5I$SpYj1mKn0!c zQCB|=!ym#T1{)@NCSpQ)JtfQ!16Lqa$FT&c`t%vsat_C^YQHMq*1J(O@VIzfcYky# ze;`CTv%-pjO%K>fGcdlSHFvrntf#miOnQ60!F4fR1Drz>nH=Qn`x6P6iqDlKO02|n z(^h{bDO;9OSu`h6Bt#r~5)!> zIu7GYjTfjNEr^w?EgTd<-p@*^vZafyOEGA0EdjtY07T_dvVZ#jY}D-y=NKfLEeOEy z12k(}ibq=kJ}O-3eDH*T5PjVGQ{5$Q`E#gZ^BV|foaG2P)CK`3a5A|u%Pxd{S8nAX z5omJNfKUR4HXsIs*)4KMeqAWRGXFvMyqLPNkAyT0Aj8;PU-IZsSKpkfYXZ#0<~Q4* zFGy(Zwx~L5BW_@(s+HQl)^G`1U9Z7%P2-#LMS%7IBTg=Oj%TCLl!C^ zP9q`=!cN3FM;bmi+M-fuQhw8+vyT#zpokQ*V_Eh3wBu#9n@Ng^22u(kRqbp!`9( zTuRzHxVq(J9O)lnc+BDI#u&gBnh_>L;b{4<3Uk&cS6f3zProg`)`LwjID?zPWY`@% z9^Ixlabb0~L|IfbZXOAZTql`s&|cMXG>uU3>VC>VuBJWj{`JSc%n7BH+hoXe2dcNQ z7XKGrs%?k*VMje)yOvWVn^lUx90J(15{VX=49-qX~^m|OsT@KOb~)l&(~-)E~Uw~@cY-P;|1 zMM-U3;b0<2%)y)*>w;~8-YEHuh-s^_3KhtWz`AD~!0|)OBo0L2G&(-4K)Tn)n)jn> z-FMP*mn6&4hQzDR;b#1X@Sf?PJYFG5LQPW&tX1lt?~6STy`xS|)n(t!LM3o60~G)o zruN*IG=Co^$YOQ&N0pC1^;1|oqMzHiF!H820~wQDYmz)fe#R=ul*N}k-Dx*om)G%I zrh!lI{-v%L+^1<4R}{7`$t7Zezo6wyu_K{D8p8YM?kf$iRr({e^F93sXz_-vzP`;9 z_a+)g)0tYk-tlaSpev%?|n7RRHfp$BTHjXxWRA_V+Xn4WR9vaUYV8 z_T{69wHSi7+zMZ4rkf{gM@~nasQVRj1cWD_PH+`s+X^OVVWlGfWVFHt2`Kq(A>9vN zK!FX~0Z#g$dY{MGYJe0Sq_uu<0gi@)%`ib!GtxgE^cu8}b8>%HDj3**H3qZ%Z*=8< z2wn9mrs~)Ws9u$55YU(iI)j@!>cZ7AbVCT7Qh;nU&{m4%Mc-|?)B-=IA-{aY6wVyS zmORrnX3ZH-iIuveSgVFO9VAwA%g(#TTh`m7=F}+~e}8#imqhmq*Gcz8_jAm*mrmkNS+BZ_96eD)Hhn~}g&MB3D?@MoSny@>{>zKbKF zlb4m|db|L+szhL>nkMPe)o}Abch6N*kE?K&N_d1!q%sWJyqdUqB}GuwP;q=)svKBb zbEa;YD?btrVDNsEC_8}Q4;?OaIUvLES=b5#(9tHem(yG=D!!jC8O?&4QHnV(ji|p3 z3enhBLW3F<#mI(KL%{e->hK4Z2eF}+rSSAls`{(b&Dy>lM4Lrw{bKu@vZrKCJ-a7Q zs_Nv#Un>a_Omr7Z+Z z$0-EBg&K_BCC}Yc7qMNZQ3N%{S(lD!vlktmkZfY<+|UV|mWs>%GBj4Q=a^NqSSMms zBE67E07NSCIbFgtvbea|NMO%T@6!G;zEM5Jt#|gP<}}z8W_>ZV0vu5?b2}Er@3UgN z1*1W$&;f&vj=e*N{OZCof%B;Pib;wQK~!t~#9Z+Y6-TQ_J>h>61!!})#rAojw47}< zLqu>=(+jXIc|vZ-547Aw<*T7+cI{%mtR6`crpb*lYso)V?TOlP(p#`7zY)g|00E3# zQ%wG-`bh9+iY?;(#Nl#EsThF9`z&;1Mx98prdg}YIfHTD2SZ;p-U&pKXQu?lA);E)a{rT=AoPY2QTCRz&yN59gKt@u79vHv{e9;B1RaIr^~tFa>1;Z zWw4ls@HUCj!o2}h4y@@p92wXa9k8%eAtinH-4^6~)+l-pi&~dzldkTxBnd`fW zJp$8XYn<47XZ-B%9K#o6rk>lQASZY1tvt|Zn{0(KfT?lGdIpY`SNjn4UxP}WyULQY zfv#m+R#Vo@^4lqZS0n)g_{pTZ)KCMZ*%?8^!pu2L0^uRZD)_}qiC55QE%&5qe z_*0qJAWk4|7WWA@K&mS;rx6fq{4_j$uP37+d@d;%Gwv_8hzMu7d!lHu4*aR;S#rE- z4Ew^nP>x@rYL2GQv{%Vg@Lkntt{ICXELi9xAXJWhdFVY7I7}3{RP+ zq{le3sDRwsLvP|(N<(vsPawx)iF{eZL9DyXfH z>|W+jQ7gl=db`edG5a?2%I%hx&*@3n>x_Spbg?yD@nB7WwAz#3h+qiBKT6FXMccPN z_}+MQOb>pE;&%9+m=Btl7Y~CBSDX(76R`?leT2~KZdIv^vfLu#d^|i`?IA2$0Hxl; z9hiB<;D-IZ@6P>jMWHc{;0unDo~HucFt|;8Q=Kr<`iSV^(nD z#e?YhCL1sN`NOHr{Z<~;sLkP%RNWhTENQn-60C@RTQh?iw48ZiZo)cncn^ZM{itQ} zp_{#1vwUS^tBc4&wS`ZyN2_pggXX0bi%awk?A*d_ktpkW+DlFMRt>wUG_&(+?18S_ zTxhj_xAdIoEFFHj*h_DBcznxN>&K@?^)4>lW`3>b7c$LMYT9QxpB)NgO&x~~G7QA! zY;MK=KzNe5AYxZ)pRG=F#vZsV>J9LoUV#v6L~JkyzbE@9I3?|U7@UK=j!GwOSmO>3 zZ+mNlv&+`kf1?|z70DAxgadDXYmc+XHej3HJ80{x|EqWM3TjX+QXa<-2SnP?A$aHZ zpF7cg5bESVJxCdt|7vWZ{jZEI|Cm=Y6h9L-ln~bE`uSN91nDAdB?!NQApgJsW%2uolN<}k}X5}m`q{gqaS^~32o`$3lX z$20a9B^`7E?`Z({LL=xw?ZGVn$>Zy+-P<2%k1bVvFF>lXG{U?e}3?}*r{W{ zA-%CUvxh=_#n~S5N|NRWt4%vpG%2HW^$lj6naKFHT0mVx#s)03-4K)#FE%QmKDqCpmcV4T)*f;I+bV~fis;FlV~V6%~TKJ|){U1#cIy(p?DIE-fwUJSz55iIoO z(E~&3G(Y|{Tu7{pY=x_e4j=ze zs`qB~PK>8IAd)J+!6b@{7C)}y(Z^u-@DEV+)Lcw0J2>;8N%(1O??g~2I`$A|t0&Q0 zLSR#uE`1b6JeI&*Tt%Ri+4$to)UP>32GHo_gQ7jpOdTEHY1jnm=_}W7T1q;UN!4OGrorpRl)rBv&jo=y@_+JM*c?dyPgaBte7XA zc(%xGi42;vEZkhiWX_)EsfmB_sIua4i$HxBH*6YJ*%`B6pyR3k+%MCiOikGbbpm`_dI^l&Svu9S$vA0{f$!Q@g$b z>7?}sjoQ!PVB>!D!f(Q?5d&3G)pSnawisDhPPkR(%t2%&dO58LyQa14*Xb-1Ce~)v z$bPL8{VgBDt+!ZZL{z+WKd?N)s=T}vj2Cl0^197wRt({KZtLk0J2n72vLq+^rJgy> zWb)3<%)LW#?c$ys=XPW7$jRI$PucFr3a|D_8j;oyzE>_dEpXcY{}xtrz-R ze9oiu9{yr@Eb4sYOSatKcvP;Q(g&kbdtD7VRJ~hb75W%vZmKqu(Tn}MU>9hVEV8B_ojV;`QYqzei|A2{l%$5jMDJ+ zgz_xVZY?R(vC*ldVp=Is?eY9n4`bHABn!2a*?YdA{kK}FdJ1|6Z7)B9v|A<<3Dis@ zE`o0HEEp$*9MW8UC(R;=Et$B7%1||UFjV-;_IzzDXn6NgcjNZAw?v&`z?{w_(v3i zHNpcBiHUhFM5W7{<2FeNKc<oDVNu;%LNiG&5X;ul~mW8{e9G87fW+~Q3y6y+qhhBYF$^;rQ)`YEU4FblSfJ}dyc zCsL-v&9$PKp32bx$DV{S@q3i)f=j%0neP$VDC<2D(!!%i=jmA`e!Bd20?U4yJ)#Bm zKO;ft;}BQHH@`OdpQiNUtdcm`E}NRR{hYG^p1evRQGRov`~b&z_;Q8df8-I|D&~|L z1qH8#Jl4(a1(#yL^GAtnoIf=&la{}_a;C@i2`_|4_zBq~wa>GP=e!ezHlF0tInN#H za+YF)?J;~VPa5V$*SwOAXi&5s{?Zi`ITHnfyA1%Y3iHyEnldbSUAdDk7B>^R5i4Zl-d!0R zXJ-T6(-V5hn)3GX(x|73DC2ttjiI+dXQ!Aa@@KT)qzoPVAs4PzJM3vM;2tIp@c790 zbkbyS7kbB#w}1=Xz^X72Uc&WvuKTtagOou^oW(FNlq(@3F|=B;t5^Szc9VlE?95KX zpx18#2rgKNAa4-_L8y@DXC85ayhK94*yb(mn9+W(!Rbl30^4|3iyeP$mVMaA&;uvn zpMc6IiYWtlfKI@mP)F-fA#FLKlAtpp_p5+4qV?~|O$PbMtcHb77>1@$kadP8qsxLV zG$F))h%NXMFA|HN2!#IspNjGy8nL3KJhmc=*EiUuSTLCQj-U0^%w|Y=VJeoWc~U-$ zKU}1+P}6N`(qJ_fSNqqn2fVHi9{b@rb|kL+@Er&6_gq+jpz>JRP9)9F51*?;Z&vLm zJ?|?!y)C`BzHtPOS=XYyM~DpI^W6C7lv}cj0F{6FQtKOC2`BMv;C~0t>0oc zbo@FDbdmyFqc$aGw}<*&cCe1*k*9Z3ao^V?@qTsD2*mRa$pC1-qp|7+wdKXFpDgM} zV`@m1J4!gX82g&M3vMjy;m4$HEgH)}4Y5i?>7z;Dde4e&-la5>^`AXt79t0>K-g55UpgS3K>9m^oZi zXmK+DdaP(=Wai$9AG_tC8^y@zKxEcl1H#qFv_IgKw&@LUgr7qT@=Ww* z?&i^p5i_W8Pg*sz2*Lxz(TTkTM18w#`s%&CPi}q_QO~R6>=h(^@*=#?5H&2ogi_sg zgZwVS539glC>W5XS9PuqPgE&H#jL7fm^DNhgZqTJRCY(Hy=wkTq40M)e@DEer}CtB+KOI^-<7|--gSTflE47iVk%=?#n+df{6<)y>ysd; z2y&q|=#cH>{cAMIIMcbE{46B@I-m33HkvU0(~zUMVuvMy@ZVT_$LPwVyj`$T728I| ztk|sBwr$%J;(jGaIq$<4|;SJbR ziHesxvL;5FK{2eEn|GUh&c*S?+imsc#}@}US%B3dN4ARGcQ@W`T=S1VhZ3eDe_9SJ z1mIq~pvMg>7ata67yf#`1)yMDc#@Pn3og5cEcnHB+6FP%%!e9K{ygbeyttY@HRt)Z zk9$met`aIgko3$iuoW{jUv)eDz}Ks4+1T&!G!e(X1HU*3T#;ZN&kox)TV$l`6kTF3 z!lv(}c7xjKtv0EnTcPVZbZA|GbivRoqMVYb6Jad z0<$@Fz>F?C^)y+tFYjw@BTT`{{GP-Kz#jM86rO2l$X&b=!J{roJZvy68ARL<<~7fh zSLX4^eZn;KnB?4}Tw$>bn;!cI)s>2BcB}P;`#BO7#Ve9S8xYz7%lG?o?gH?mlxs=2p zVlAsd0yvUn>=v@$-S!P1+W;rXA0&=ZGuiZXZ-GL+&j^hOk+*Mb22bV2{z|0W1UDl$xL7xG8K^ z77_dnkN*sbt0D*VgnVBAw@()T|D3z@f9(3R{ugIi!&?1wm9wsn1UXoTu!N{+1kEZ% zLKb8r1DaD%it7FC+0Twh-6G42s|)P05X;6v*)6y%uzZ$CXt3PvSZ$EpbY1!4W`XB_ ze4_OR^M;^XuK$u-ew-F+0uvYb6OPIK;xyCu;nULB`H<+7&RqS)>r*#vBG{}VDvkY` zH)=}D)SW6xl|FzVtAv(cjKDXBU`?GiQkJhKvcR&OIS@*wx<43Z2S3WpA-f)S2WtRt zAMM#E6&xj*rlNI1d(oZ>GLfEPV`19qBseC@NWm-&rm?Jtpd*D<2Ze-Zkc>~c6aO6= zlfwBU0N@$@hK_7tQ4X*4lR(%QhISneQ@8^b6@ry`46qPpM8T#k=^XkF-$2C3v4ubnIl zmqFZB!k?>+#-%zDS(?_BUtljVBG8zc)9ILy#)*Q9Xbg@{FGS=SGG5g7;%eg9hgi2e!DD>-p*sr*|O zOdPtCcW6HZ6ff8wB}R6uX5317 zDdxxgEEaY!Uy_(yf#CLOJ8K++qf$S8=to|lZv7f}uk5ly9cHOxA+H|3wpf1Bd4Alu zNZa>5nZ2a_ziX)SgFG?BC_$Wph>E1SU&W~IK+FJ_2@;O)+L>E*Qf@BSu_}?>7H%+i zp>b;=37n!Uyq<^2btW_*+%CG?3O>CaY#=GFr)>Kfr?GbgD8sT*+pE3ET30Sb6tptp z+zyw$dJcO=A2@R^Ql|aogh^1aHfO>7cPo+zhkFl*lhg>`94F?|XX5K5)15lGIe`V3 zGCIl#dxF>ne$O2}FDz_D={cz4M2Y+3f-oLkFqSsmgf8i* zdjBP5_?lwMg73@@3%z`NL{u1r1@T&R z7=c$kJY|!gm#7p7>G07x0Rk+M!6iw6l*7Q$y`8*IBqn~c(ir&)9Jt}S15S7DL7cE5 zl#PC!7)>o=5_4)9g31kanXEE_*6&pp?Z0MgW3$n*@@x2IANK{*)t8+!wbtLccqu3$9TVfyBn|T%LZ)Z>63dA!{XFsz6teZJ56{FjT zgLU0O7p@6z@G9b#T$t#&&#f*>Tgx$7yZt>nH?DBhUcA@RJutI!l`fyxt#BTV4w5^rqWBFB$`kuN$nq=L4`aqiSDAc%0%GljoCR#dK&7Cdi@1RnyMvK zWC~uEuIS8+`n%K#V6JuXH^3cGoN@+Y{6JPsnel=zp7hf+CM@+7Ykutk@ zo>*sVxngjN#5qd+CoFdI$G!j=Y40=v=KV*jrgb$LXAB7%}-5YjG zMz%+j+08CG5svqtL+6N3_Y+WDusTkQluO3gO}+fHV^D_Up>6#v7d|lmQ^~;ezc$SL zFN%kzrv~~V&WEoKaFU+HqxKiLi!~;?`jr%>kqEjDmx=;i>L6nKx2W;S*|g>8B5|47 zhFV)A8xZa+MW^rzMYN>yv;o=~%IaO$B`x3kMb2CK{hOJYA&Ov%x$lyBSDO3Ai+8oX z$EkmHC*mK%4_M4d!JUU+y)hMmmN!Q*X~A$6*IitsTe&8C&C7$ zF$NlSYC3-K;_0A%L7mb-wa8;0?#e7;(G1KqZKqMR#|lv6&xALxo~6gS$3~NGbYZa6 zMddipN2rn~B?7Y$Mzx>fRAFdyoY%6>I}u1cJDq|fmcde>(79XWNPBRBVzU86)=((r+Cw0$7=pyIQW#Unc`t&7W^92nWqC@z zdtksfsmK2P$~_mk6g&Yx&ml`;Kr0LuzWxKxP#1^Ev(UOLz#s(r+i%OSq;Y$kz~H&% z7@oBy01r;Gc;Rm{sb=O9Ni&_|6AXP$4|}oEKCcUDk;5?Z0o-Y-S^jm=EK*&oob~c} z2QYUQk6~|WHG)>0L!7!Qi880|{>b3J8_8yaZUaz0w@2&2x+HFSX}K?$(8xapFLC3G zR^^+z+opol&M;;IkvmCw5-t(V`-c&i@gqc)WNn0bQWkn^sMjk|YI3#>29r=7rro5Q zP1~T>n}iXU5haDZZ3beOwx{tyGLkbb#TOllsF%sWvI6ZBnFKDF^+^6~L2*mO??oN^ z?jvF{vJPD@piQvRLd~gCc*&J^2L_~SV^&12*$QlE&+obVB3OO!wm9h2KizyR5cJ_` zUvp3H(-dbR6O4keos7T0PN-`nI9-0TdF&c zrelV!p!^P=iTVkQcWdy)F~Z5#Q3gHj{)0F|bb#{@EzC$ki;YY@N1;W3`2o~*SXk&a zF`zP1$`347i65RytDj!HUFpRv!QXCfBIK^{KuM`>B0BRP#Yd&z(kDue_tp@`W39^U z1v*#s_dK+4+J~1;WlH}YOy>UIlU-KvG-0o^u1S>kURz0%lKJdV0~WJWpj7Y-cGH z!NzlOMPFV-eI)y_uJ-Zz*KACEh$k4yf6!6B@rbb5)=QTh>k#)XnB-lF!EqLr2!oMBr#@rYj+aV%n9 z9BDJ&Fq&k!_>oMX;9LGosfXR}cWY?lp5mcWtM;h0vx_c>AXTMQ8s(Rflp+Dk#7QC_ zcu~oY#Mxa*TV0n)N&ihWz^S`MU#EnBbLANAI@r^@wy*-Z0XN#rcIAD?> zqaqAHv7T$Tq!pnx3KF>PeCB2R$YI_KV?)XF-&8s;s!zz>({!tHx>YQM=P9mGNMD%a>K)Y4} z{+7dFYHI+SpQjM6tAq8T3CT4#y!SzkFbWqW8iZj~vx#JniJYfEe4;VHTI77*i(9BWB;*3)nSm+&nrf2x3 z5E~uTXZS-G2K*gQ$`&wfqhg9DuF=MuRBJxx_(45I(`*3M*Xx>Ze#PI4^cC(RI_-BX zrXi{$1=?*rAL7EJ`=y;JJsXd!43zn$Fbc!Z-=g1;XE!Z(dBoZ^z7fkyVygphPJA+ zgpN7&aQ7MXn)Eu1I;k@I%NKSzDu-OxNYU~&EMc~vWutc4B3r#tQ@kjzp79PX1?sNF z+q!=8%!Pj0=t0+6SU2^-v*UiZC0%llvtRd3G4P3BioD#G^%}dR*RFA1vfpm4Xr~3I z?eTYj-yA{;yLasKilh=@t^4j5MnsHss)^?pmGd2IzXC~MV2X-ALK9qIh(Ur9D{?30 z5knMa0Me1Zjz5A@Axb}JTmEi37PW0d7!?RkAjAcz%`Vy%XUKE9@r=?HDB;_i!p zWu*Q>1uOhI3ZVkcY4E0X1jPz>G)l9#SYD9kO>EK!R*$?K7{-OTlU7cZL3AAzlxo^5 z=G;kc`&I9ip-xKMazMW#>g804!B3bgWx^RzFfdO4x4N<$Shs+^;T5)qrEtPVQ9F+P z;mm0FG|%f52h_c`mh+W6TzX`)rEh6_{_!u5a{*zI7wLEnkZxLsHOiv;g6gE8O#U2N z(6bax(WgfwDRqM+vf*4qq^tEQ`<(4MW(69@Vs$0bg6%rJ-Ll>K8u7vz$~BUb7Xpr= z5zcwxjY;+Xq}F!DN5QGCi4!3X4Zf%w^b>K*5fqb1>lPQRnZg_cR|N035XfYuc@_m5 zgS3Es4MT(dfBAjq(5jW|eeR6haQ{>B_TQ3pRXiO`|LN9XW$0%3k01ZuIY%q&{tvMw zMu8eSGCG7!WX&&qByx%ZBPC)3Dq<%7)WUyfF}jxmWApC16|Hg4 z{I_0>HW=nDllb?GL1{xSBL_|%nO z6hK3BVM&NPe;wK}ZkOKc;481TK3#wDZn*I&w&Zv=A66~HN>3v0Jj58)g3)AS@82~e zmi{JkS63n>&w+97DYjkife$phoSf)VU|cXLfq=W+qp>Zzep7z9e@AhIZM{GT?iF@o z4}Ppq21JtMf&QQzF+f5UtkFZss%|rc$oDSEDO)M-dgl?}`*u;7{^6lus}VW4cQ^AL z_mH)h)Mx>qjPmALWI8w__zG`kpqa=qz2h_s5O>U)^VTzKLETWM!W-i1uZ3^9fK!4% z#i?)D+s+=y+d!00QH&Ae<~JYgAUKVv9{5VJJhqQ-ApIIt=I5)HTl^k0t>Ul*k*}rA z5{XAh1K-zcq+7lg2bBNI?bbIhVNLH-6jSgYMKQGhUHkFx6Z~I|hq|pgnmD?j8OMm3 zumV;XDhdRQL?E_ctyYO`m_Y$ zPj@gmj-Py@3aT^ISgS}h%^T|f0*K?cKWOgPh40FDwRZM>Rs@P*WyO}Szy7tt zpU1ozEs?;TO2I>BKOg!+DA9%3$TKkO6gd5=BuJ5IF`5$ol1{26l|m8NP+d=`Pm(A4 zrj$P8SKrjP_XTf8NhVuigkh~|{D#DwGlfr~XEFt1_NH%NO23h>fZcxb<-lBY=a7Rmsw1xC74zvzTI1?S5+}dngS^w<69s* zf&WpyZ_!pgW8RTPpR3O#@^VOB$?qjUrdz29i-+$Rfk>8$=Lno~ou++91G2d;k$H{z znQQ%Ijbl&_{F-it#nDbPHSp5Cwo;elDs~iXN!bQ1PH|_pKXX}3m`ZmLi%Nv(#81?= zD&K|4_UMN`bwC%P!#%7(=&TP$O+tLy>Ar?)9{R$2H>21ywJQwZz&F>QvJs zixyb+-cWqXiBgZ?p*h<@UWz9m=Mk`zCrk|hYWIaS8STqoqjP|8Y0ROb!wE_9ZWBd_ zW@TPGC3mqt*ALY**m+`vr2;S_k%mcN%m2pmZ0l!yR9yer%N$a&*9Z=vd?VuB_irKZ zqcUU*#!wi#c#b26WHYBvc5Sy(lya9*A8Ts0G8x6A;3y4L)>f6B80cius!Iyg8$C^? zw(=S5vMV{a;T{DuX|M1<}gT^sa2C9xrp}Q1wo6W zeoL=V5Y6!xnAVOt8Co?H8B+HE<)!0!;qAN?2-^+giu%nk6o+DkHTvrj^MnwC$WP<$ z9XJ3Hfsr;eF;eac@h=I+nH)YEd5h#=mo0gT&3xT22pyp!AnmnB!iY<#N0R^=o{}M5 zTO?K90Y?()tUxi0oG}GfSaSL*Bt= z#I|11?eroSrUW9&-}+k#V&=k5WPXs)6Lj~KLEUhCX}tUby90K!(aKHTup@r^786>3 zW6kRs8`_$~cn5pYO(uUGr9-Vklz_7A=sUJ}S>w=U`g^dSff4PSJ!3NG2VxS3L|57G zW2eUE){O~{YxG`ROIy?^g}@e^=Ss8yv(jW981dIN9E^@XoLkGzF)0|qIT3joic2z@Mat;m7wXX5`LA&VUltY%E0V%rp>z^ShUYtfT zLe(tyGhxp7Z~x-bw5UhRK7D%hNFx5Hnuz1Sc~NBTO#@BPx5u&@|e4SJY7EJeDS(w z6Ylt@ELTx28%T{WFU1v6+qzz)~k_ylrCj`H%7>DDjKs-gV97{W6A8r^^OpnJh zWu{ryKrnMPrfwq9_6(v;$0_Gj7!k2asV|K;`?L$loI?2;+r*(hK`(3|*+dbQNbFo* z7hu8@vr_`{tA!upWLSYU4dufKO{4(`AO?(Yz4SRDQ$XP?7gTkFVSh@xgO^dAqpFx%f+xI;TPfo_HTc6t57IRBr7)=UJXbQhw5nW z|JLpuj1wqQi?5%!NmF3K*5WQX+V;(rGxU~ZGB07f?*&ETXJRi$iA4lkzk^lmR0I@W zu-#qQQC|o*zHmMfy^e{6KSv?N9diq{kd?RUm)J9m`COzFYeyJ$Y%RpC=3nLTvRN-0 z5@9Wnc{0xyR5V-Mz*^lS=*LuCan)gPG8heE`V;FLp3-~BNN-mO!+yj!3P-*|EcMod zyO>f^nue=n*}fyRwHsq-9Kc9^6TLxVUP@-sNY6vzyyD+j?kGbY5lpniSSvc`NAIDc zestk;tC3MUidzb%#O;%9C*^2UP>VICH6Sy+j_n7Qx@!>L=^U4fZMcV4sQj2Hi+JqV z`5R~q@c!#i)#!>hNIF+|jk`_m1di5_FouP3)W+em7RO4$n5klgToRs5nnrfbB;GDE zi851uXO06)LN9I+hRM?0n!8n=d*tR%ftpu%JBv_Drnh)d%fN(bv1Ex`AS_A5_qG@3 z(fGmh1xW@DYG1*oZ!_dolMceQ0U1pUDzTcP2}9BY9X2Xtf4L&1A?h?*ySqcZf@X5_ zee4=lf^lqRnJ{kB*8Ci1qy^;|aN=#cL5k%xn^D70v$GSS$rWjGwxKkbX7^{}zuGE> zJdb%yIdpN=k0(RoZmlUw@$_eIy07v8YT4pJ=Gl3q&*;C;;9MqL`2=mwIQrXjayLU{ zb?`1d!zHF5Avu^>A5f!Vkc0@+DLaTScQx6qPw#n!R}j)SE>?QTESLJQTG+8}cm*$T z%+{O8y@xiT0lYB!9IO3TkQX67vBDd5=fMnn-jd~A!8MIEyiEup9j3Peo$p-R>sq(( zqKTJlsxxz^2}hH zvkBTHd_*c%E^yGZF_v^f6lqYlkJ$%;b<@E_wR?YbrMr@Ik!OP`mU#s8CA(J(4uPUt zm*nUCE8c0@&FaI8w%kCBwVwiFmh91BYXh!B`Y@Ie`;b{Ak|>4L*@h9M2$5&eJrC(~ zykG60u`#E~6|9ZE0#5XM<$<&!k~gsC7Vo$SR~IT|X_YUUAqeCZGe`L>&C?n|80Z#q z9e)1@&$B-OLvpLmjkKl>!1)L2|1HHJS29-?C7|t)jr%%#)znmSQnqo zk}=!0b}L^>x*rbFaZYUuNft0$YHNUfcqo=4^+p|}8|(hmC|EDgJYHyTzD9RNVXoZX z5hOQ?_2e4Wsvocj=#m9_`MadP1#lV7X>Ywter4RokxlvU z>gM^%sinkGC7F&)7?H;5h+@gN>!9(HP2p&&o!n zRugY|HkzIRoPSGC4nK99b}zR(DweH7 zrGdfR@}R3Zhpq$U0;C<(weEWz*aY=dIL4|&=w@=o-;2w*kIB3kTW(eW{0wG24~iJc z!O%P?s@P^>2&t-gN z%WjD=h6TzkQM8}lxCSFtr<_4Duy4akZKioo7O+{vr<@@m$$rM7e7rVXU1Mxs3Jg{q z%IXmP1GdpJT5%npCSS=RaJ!C-G=6X> znrhAO${#s_Zl}?0y0K++as}{W?LrZ0Kit;|`Z6c*QHWQxPy%ASTgvlldg7o>(M<_* z#Co;om}1-4QwM$XZi9)q6FGHF_5A1vnaCpDL~p*|9Yw`>KKxdQX))c;FfW&)DFtNL z0VCzDWP!(lKL(^U*3tEh3yZO@ZYG(l*$(n?W*>40v%OraLzrvIjTA3dx@5u2Cr~q1 z84SE~nU}rhltel1MvZ#aD32qRVC^@yyBK_QNd9J(#T%5cLI8uFD?<6DwiY^4_{Gvp zzQ?F)J)z;MKx|BX0Dh|e--a;Oms&e#ZyBYr|nu_ERp?b4MfDq^1XXvLlu-{PolgK8)l?X=s{}~x1Qv95Q z^f^F@{*U2XJpWC}`~QtS|2OWaoZEfsPxy>^G*=xZG-iLoHLNb!Ex5(o{vl^&x14PV z_+?zi9f5vreI~aixlq60r_nIgheVhw(XcPvBS3R41MN7}ZYQbC23yDLeCU_W<9zY{ zcZ#9=+at6r;51b4NNWGlXcHrAnhX05zf@?O_JaGtXkT~p6iy(Kgo^z!KeT;~tp_{( zZ&uPE7?H!!e%YzdI{)|06{}qr9BOS}^Wr8gV-0TCf&h5n851Z^Y@o)W%m)%4lGHMe zm`{hYAU=1m%7@Gc(t0jqvVo{nj*1V1Gb7w3$%`s$i}}RWre|G(F?Gm3&ak6utcqEu zNxn>DgS;AW=$`crrOB6mWHjkUh|rt8vj(S?p1kv}ZaVoig5G`c&2A2jrsLN3QyS79 z;Et^(Ze_iBTiHk!Fn`E@3Dd@FU4=fbxzVKxizyv29~n5E=cT5t5rJRNnLy!Gh*PA0 zKHlTK5==*NH(6)kC2z{)+ux4ytmKNI;er;NJ0uLibK6x7UEvtItnyha|0Ug$IV6gX zGuc5Q?b-axQfI^%()sSp&4>Pw2_OY#Z%7l0egK#HQ&2h*KJ6+19{Z%n3WQeeoQd0+H!$-|*KcMD5R0Xoud7)Yc!4yNoKFT(fU1Q!=h`ZrCqZg)br zJ}OT&0?aaO1*j7xi@qi$*w{U*pw8!Y?--EW? zzEDA|Jx+hQ4*Ukjv$?FhUhpO_(hkQTw7n0Y4niBUIT#xJgpP5}1ZbudDr+b;N>p-s zo&tneT7*w+G9lHEm1A7$W{-@GSKaJaSy2NB)fUvx~5s+%qW+dugK5u z1PeH3^UL%z=WyR2_KJs^G@el4qEB)@C${p}$Hv^;0{N3Qx~1a+1G0TQACC}fv@w!3 zG234kj;ydJQL9|zl|BS@WfX>*vk$yE?DD{X}e@o{wxvqpF#$dP%(qNvI^0=i8pH8rhx4|H z!7^{<*fi|$vX+e-4<9t7f(DBLtaKg#{b9Nz{5}$A;p&R$ybt)a_N^WTB3JTh+|^KuS;ml2kT2cfNMKYJ z$Ribk?lnKEWMFkJwLMFGDs{wDSGCQp8pz1%A#tAlgMf|7&%48`bytns&VVe)Fp3#I z6Pa8cII}s*5s&QyuR@9;6QcBDpY`a>G?~)om zKR4a5$*DK*oO;ZgCneB~HaTMLk6&~A8rq@Gjb!yc;apf7KhfA@PNTQCYBZy0c}Gqi z(!F)_9T}`jxv_1&Js>w76@IKzndq%l_hIVo&Rm7}8%(0)%{SKgFQ8q2qcaT1g{bD} z+|8?tbjJaY>N+zWwyK#2Utq;+REGEP+wVk`vNl>5*nJbo8G&$IHJ5%7^*AV-zhWUTqWdQ@(~AzAW7~=>3G0 ze#{GTDVxZ{!|bxbuupXu)EXFya&CI+S9^O=Bd=2$2Ur$?$xEz5o->yDw} zhWA66Pm$`%i6qEM{JW4Zow*XWW#~?oz(FZASnd<0Q|c7TigY(xt_Y_F4Q8$kG^aFG zmUVeO9RJ0|U!#ieRV4j1#N%SzEZIzy651J2*@durFWW zJ{MpAbDI8tH=_K1*K7X+!jn{H*kHW&(#-|b3kzA}j6k`Sk-s<0}h zKNbL)cY2s@-I`@ziG49-$!7Z1(LU`(-J8*C@PuC+F4tLD4l`R>K%4$uAK*2C7=V3X z@}-1n>rNJ_%_jE|p{CMPpXyqzp6Hfz^E_r1LkP#>UJT-(!2)jV2~@|}kI-`8(}4@H z32kknU~I9E0T&DS0kDfg147`A0>I@6UealxhWk$LAlVfgesDpq^S!85anrMp5wkhO zMV98cIw4-u^1u;-6jBM>bo%vS*4RUXNUMFpqM{P*@5z<4rK*$uBbhZ~I)MmHEl+&e zDmOYjn%TGqA-N7mTn_>uN+o+LN!FP~yzkI^tyozKZtB3c@4%S1pZP#>7a4{u%CH&%IP(Yuwbb@~l z+Z<}ryx+CsH&oc>)S4VJsbrQ2x60p)lymDATWx}hzdEm^!y<%e+&=GUd#wTq{$wr% z;||)+rsTB+w8iHg4m0AghL^F$G~J8nhwP4EDoCS<7ZZ2#d%5YcAb9t<{y(H>WIs$8e|;YC_W$UY&+@;D zHvbxe45)3|y4uQGZ~e5?HS1dco8#a4_^pR6 z5r^KMv&(eFGG&oY?=L8N!fd6%_hJQ*q<2aMR|VRsvUidPGv-`pWRGqzUHW?mlnUyi z#WqgGX3WNNgKrj(V9eskw&U9w9BebB#y00{m3AaE7cD-3n#`L`Q(;`gU)S8C8vHX1 z0i2)71V@x(ih{@(!jfIRt8b8*tQz{Wjeud;F@k)blS(MeEfD_zZ`(k{1aPWrS3WCg zJTJ57Zc5SnT~C{~Jfq`2qZ}sfIaFDUw^rQ(kmN^Lb@R#J^`F01Urnw_KdC1(*X*#< zkhbew-)r)}T&1yxafbNhNa{A~IqSStx%_E{U$k%<70Z$IU};kZp>6o|fii5T7OAuK zw%cR@C><orNrXhy|q7Ij5Z_NRSab<+i2g;i6Jd&7lcr2(g&4Tz_-NKH^ zxD(Y_numVRj&2kBht;YdV{Xa=2)`wbBuF9)l_;d&=0eHGk!$ykjU3{GM0pU!M(bsI zi;;}UiP>o|r$lOg4!u*gLaYy$DO{rn%hW}YG;^!FIsPhC!(5e|05X_@-&?QvPO7?RL@a&Fh}2dwQG5g%NukjBV}7EPrbAH zULA4~-8gji^6iU4lrix8@yx*Wy1y>)gQv^Hila-*WyLP3IyF$IHq+MGeVLgz)_eN+ zEO=ln0PQaSFeN)~%F->13~gnOeUcX~7V3s|kXuS->qk7&5hWs#Lrmrz@_=TCEX($m zy2#g6qZ14>H;3Gc&T`#Xg6+B@YvqADH_415rrb_-pO}Z{-+rw@9%+HPwB3Dsh<1sM zNDaXaIf!S4`=Jc}q|Mv9$LLJqt7PgA7Iq`xLy`&oNFEZ-5V-}V(?Lqm$i4w=mJakw zB9Jolc{@hG6|zy#!RlDuITLw&sjRrznxosHj9OX3O!LsbNoycJE5a(&eo_5c9qP1i zKGG)IjOFt|2=SWjRmbhYLYgsRdd!~|eF_(OinP%%lmL2BX`XPYi3u(p%NqXC4hgV( zn-f+(&40S7v0EQ1CPigfyi6tudsq%oaQXmv2wYNRljK$q!IKAz_j-KQ|DBoV(U9_8 zG$_F>-XwF+noK^yhY$blpE@`c9V$V*&wkq!!4>vXkd!O3*k8i&sh_DlNSJ@C~50A8q^c23Hep7{|qXWPMvGc&8bm3J^}W*Sx^mvVgsmn9yN6?o3= z8N7O)1|LH;Mltpz;LDhjoU==QXs$5tef^Q;jp-5X$;CHHA_-4P+A}NBEW;`s9s>EpN>` zqZ4P6ZT^JA?C6+a$~xrJPfB)I6mX3VdQHiVcHiNpchc!02cT(VNW+E^=cFN_{f)Z( zsRbffr#T{it9n)l;2=#X;hyAlD}_9AeT_)87>74mWWf)@HZstL4`L#fj5ZyjKaKHb z>|-R5YuWRj>k|{Qs^X4DK5*bgub##irq>En-D^)WlBB#f!-W-Q_p7VpTjcTuc8)UQ z#?qOPad3%2e5D1oqorhSyOi!&;T3hctQ{p?U4?iJ4f}CC!jh1q6sd#GizOR=Q!)ng zz+3GI?a^I0$?PBi!bRqYNz-;xF@LrOTY|e(_b+y$=6aJiU0^W$<=8#ZgK6;L@4CR~ zUW~;5^b}TqkdjE)+|j^qdaq_1 zagGSJEjMa_f8FJ z+oKr!V=YH&CqdemoTms~N7&~m!;=;X&nCfF*MM*$kp@569H$1BmDNzBnQJ%#tt*7e ztZWo~O3RPrcjehxdF$d}%p+|46kPegHTi?P!IGKet#wA!5zJOQW zl9xnX+VfXvU+d-aP;Ab@wk^I=Lq{U%%xuccR|fQqhWj*W;XxRuqzsz3Seb0O>ejrPPdxdUmC?O%fv#IZ4k7QsEN zzxe!tWw_>-j}_FpGh6v>~aVg||3r}39} zA{e97^(h0F^{++q0m^LCDxlM=umy(e`H$DCh!}qc($$ZDj)j?I?&)(sQIHq)KcS%b z|Gx_C69wgstUh;BN~U(7WQfl|4s{DtJ6S^q2TMEi{|YY(QPhnD{Y2-hf0NM8H(UIh z@8?pE*QiRi6NyACMC}P(Sz2I?{`?(ewk9V_Asw&ws!0Pp=SuH_H)E8*D$8pBV^2k=&CzI%wK0 z<2AM*JyZCe6L#g0pf08t z9P8=22NZ6hcCq?X$(=KDxud>GRh(C$KE4mvBj56DLDS& zGQme+C1`M<2zf{QN5yXcEXvsa*_I~$$F@}VfA_pN{qx|6x!M`Kd>$q;rhm^2DpjrJ z@x;;jb}5@I!z`6y$t>4e!VwVgX5;u}EOozKu*V30Zw!89ZGvK{$rj}?R`HYk5F=8W z4ORK;?5~oaI`Et$qqI35%^y=3B%fnT0Zrd)NJPjpsMz#fxxp(!c z#J{{F?xSbbV>4D8G%(73d_~y{a;RNX-Zt}N7svoNek^4VbEA`rcF(ZY<8Eu_x|*95 zj9PwL@k|@Os5)#2v4e10d<<~IT{{iOAiS#jKD@InSK2i3(6Z||@3^+^F#SN}jV)2&r3NxGW1FRNH;N$% zudZ}4YxfPS4eV+q*o^R@SVZ6#x*6Vs0a)!v2c>Tj>RjI3rqEo=AcUKU-sK!5(un;h z)1XE`mbL60nTGVcdYj+mdCMwXSmE^}9$Z=FgGw{4B;|=LGuIZLfv!td z%-OU`59F>ADl8@ktvB<2i}DmJpss6oLLBOA&|2?Sl`izN8z3OL_fuj=$N5D78@b1r!7>-v-cUQ}Ygvpg|0a zI=PQlc7Q)#)42=LM!tbOID1UOwFPOlzlhiP{G9Oz9g+&mOr2D%C?S+(QM zN}rQ)0}f2|Xe=$h=Z6>t?O^GQS%7U8popgpns@DoKwH1Aun*@|8qkZDoA#-{vMUml zN|K*++9kBy7Kta%q;Kx%1wqaFAw?yW^O>5cw^+$rNfzCVO&Up5j>PN~VIebj9y|ml zYa}n&nn*VC>L*~v1~1>N!UL<6NT3-+1haR8TB6Yu9aCjf41AYVfgYsdfsEc&R`f8g073%Q@Hb*)4+iRTsZ%2~s z{~z~~{}ka(YM{D^C&=I4&^d$?%m`@u$y6G?MrzFUeuSyKhrr*)v)AMVXqwy69 zy^KY(anX*2R_l$8QZ9f}3(R;`euYw5F!RM8EL&19(l6rtJ3cP#YR#R#{*@m$TOT_= z+b_dE-wTK{T%V-AAjbx(4yIJ4gE*(MxI8Lrq-qW9AzA&`hq(8JEoIIp*0m z4sNF3#tZs=3&STI>=<0sD0K)vGBU^)u zjg{S%%{|zw%XujH(2p_sh|+Vb^yM+*rm0_f2pA80pQi+PRm5)+}aLCnU53*wpq5v=I5ZyND? z1eZ1hb$GOdv}>%7=A`AN=;gYLBN=PkHKW~DuGu#gf`iF&!-|tlMOajLF;K9R5oVT- zobxZ@jmjq8IboSJx)v1J_j22O@AeKs~B{t1$MOk61g;`;+tnP-=@JuLTufvprNv-wMn?w3Wu8qs%jgSiN zJ!BmvU`51`-VBWe%$S|*J-0MHVsn!%zBhj{W;iLXK;?t_s8P;6F3aZRX3@%n`^!Q{ zSyXG8l%z+8%*Hx~89cow{meR(i(S&})P*v$UD84L*Zue#6| z94?BBSK)eCtx#OKrIQVTZ_&>?wpO1GgQ&I8^*pyw6lvHJHc8J6KY#H^h{QDo&v9sP zq}BjscoJzKfy%Hnz1Ah{&J~~N9!scf1yU&ix=4|5Q9pUBi@|6zEKoT!_#_=K!Nu8M3LxStMrW0)EHH)Z-IjfgA7TM%9If6@RBFD(l)fcrnHsgKCtbbxO--M zqAevcba-93UIjDA+%1LH;BN1?C^5B?wPO9R^8JBb? zObtz-Kg%q(y`W_Ln2n+c9mdv`Ahfuvo;xHm8y!Mk)iQ??httX5E)~2F4yLi3AQ}e+VRM5LW2Pr*JXUe$g39C3F=)sqBC+y2SACt&Z_y#8O zdryh59z@&NcOkn3CLrc98q=lq6R}AX+e&9A zR+kYj76~tQE|KYoTn9Abtj*VZ0`tqe+sg_TVdI>*J8BHZbIADiSKk`6|5Q7MC@Yr(v4YIG6WHBL?wdgE}27fKl?*109=9;f8O#w^nF zkxFma%zi##PTv92Hxk-Lp(1-3bGx)>_RA%Kt3PUUz}VoNwe%-`P0qzFQSff2hsj@^ zye=C}a^k2ZPV9f(%wE}UoC?QlEXSDyZZrD~jBJR}8*UJt&=Kh7#xw%GE=@4C0>>r( z<6~I5$vYEnqdGeSFIcV!Jh%xo6zI;_iThfLR<9rEe|hp}pPPpk1iD0w&Kn*%ugU2_QT};L_z79b zi${u-;{Ieq)ZZN!;5q?W*`8c`0U%l3NMtuEK(k$ow*|oaA z@;vS-1yLph34O*<4+ApU0RuKZ?c|`ZEZ@m;1(~rAo1uF(=90qoT7;Sq#$0M>%a)}_ z=qSwl-aG(jpmV@8nA{%(7&L`71YRgnz-Lopr^|po>QpK@uskrzj2*N2hfmkEv+r?d z2TI9$9jIePwaUrf)Jzy0JkR4uL$(5vg?G` zrL>~zg}3#i_jyZW!`-baHRz()L*&qKrIsF4V-SU-4nXg^u4u8sttp_ZKnbH*5?%pe z30Oh`pZx9`kFScn$(|n8?@IkL*>T*ijALqmuLS9-cyLs2-0;hLtl5$CmnXOP3a=Iy zhBS^XQ96?Ox;T1)$t+@npA{*3MW52j+hLaUz7R0XmYOGty2N6J4nzh+`Dapfa;BS+ z{Gh7Xy{Pq%!O^D{2j*kq^rWK>p9`64-%hKCIZghij)KQuXsC`Yi)n)|QfoA!3F)4W zC>`v>{Irms%oXBXE#zsD3^}p15fPh~^167-{JJ4x8k6rvsqvQxU$`U=gnucU`nZ7-j7rP|$Pa_olIk65! zqZxfz@YbLW+Y0jm-s<~*W>v_oC;_aZ7sPwCv#L~ejsncHZ;B0mR3vTybA(eMr{_+2&QKZcfZvd<5qn6M*DP7VOJBy< zu??)qxE}1&2id+KS(ym92zK2O9@kuJryLOr9BpXyb}b)(f-~u@K`2y2A@-Tx*dZ;D5N^;pST1H}3Q>?syZRWC_!s;IR_L{ePVja3_DJ{wW?U%@Vhu;92rA zur&$+ht6Ljbk>5=g6D2|A$s+mULfElNHCSHnDG@ZG{EG?_=g9$;`4-FgOc?c6LCyx}e`a z|NE~s4DBj|cAK56wllwX#HPUeP=9Nk2L_=4;xv0|{N96X_E-u>1KJU&;Y2IqNIP|& z1g4V(GehsGG18Egce*U`g(E;F8vlRY#86S>dg^inqdT-GDNFEvc`I0C!^y4iC; znl+s6`vJRNN*p`Z&11Iqk|OuH^(ABVY10muNPd0&gK-F2 z)LO2O<`~!_0Hl4Z+n&8Pr9iAkpQ;e4hK1<+ZIaJa0r@$mp5HpbOp}eAj**g&&EXuw z{tSQ#S)tm{K&UajStGGRIzJ?)*D)ITp+7sRpUY&wCdcvEnKr4t@fee$3_aisFH@do z(kVG9x}FGDZzdo(S~^N)VJ`M;c;3zEGYiztF3su?5u1QNs^=L~BRQ+uDgr=BU`nuW zl_Sv3Bc!_6TsQCipvAf{t?Dpe*Qg@Y@ahV}%1QD;p+mp|1dFK)IZdu(KnK1u)q45} z(^%A0Ku9`{w-|NK9_ zJ)>W!!t3vJLj>=?>+SuI(^V&HM>8v<|8md%S0~TN{y!J1B@J*_jisdT7^07{8G8g8 zF?@NKqWZ#9F_=7AQ$Ooj6w(ZZ=47HGJ#fEu z7(F|2Gcv1O55IZ6;z=k+_F3r(D6I8hwihn3WXiR8%XhDZ8;8g1j$f?bjQ332&GArz z3^$-ITbFR@<^gmoQ_MuobK6q3uf@x*ufzk8VvmSj2Qw(wUn}0N`kj(yGVYx76y89# zjwHUJBW2F7YUr&Fw|F4PJX)CFtGKW1B8ECH$envZO<&ciI~5;>;#d3elWHpI?`b_M z-qLK$Y=wsjk||A z7r2qnAoFSc{OP5`xx&x7C*RFc1Te8@xTH)?`O7Pl zPVdEvmL6189Jg?t@0tE3h=N9^9LoBSr?x=qbFctFvh1sZFx3I`&Z&}#oJ23DUnS1z#s-=-Eed|9{N zjem|6SCbSQVQqp&p}>H>%k$fHMb%w-VX;`&$#DKf3ilPzubX3y^2}HosihP{2X`Py ze~UWSyZoMWH?%AU5cqOS54H z$}A?D*W|*;(UEQ8)8`RH1NNOMwyc|^uuhe~4t}SdQmiCo30N5g2-IQ-T?lO&VQIdR8_q0v7EQ-<02Zp}MPV%I+NJdFvnk;WM0Qf(9jv_4 zDk0FFD()?;aJ|j^f64zA4m{XX3RWlNFV+CGw%(d^l>s4SYb$h(A&I%vr2!<}c`rMQmO!S_h!==Qci^GG!Z199;vxv7Hl{&W