occam-verify-cli 0.0.1067 → 0.0.1068

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/lib/assertion/contained.js +2 -2
  2. package/lib/assertion/defined.js +2 -2
  3. package/lib/assignment/judgement.js +3 -3
  4. package/lib/conclusion.js +4 -4
  5. package/lib/consequent.js +4 -4
  6. package/lib/declaration.js +90 -3
  7. package/lib/frame.js +109 -48
  8. package/lib/judgement.js +84 -5
  9. package/lib/metaType.js +24 -3
  10. package/lib/metavariable.js +93 -25
  11. package/lib/mixins/statement/unify.js +2 -17
  12. package/lib/mixins/statement/verify.js +13 -13
  13. package/lib/premise.js +10 -6
  14. package/lib/reference.js +11 -9
  15. package/lib/rule.js +5 -2
  16. package/lib/ruleNames.js +5 -1
  17. package/lib/statement/unqualified.js +26 -2
  18. package/lib/statement.js +4 -2
  19. package/lib/substitution/frameForMetavariable.js +61 -60
  20. package/lib/substitution/statementForMetavariable.js +52 -29
  21. package/lib/substitution/termForVariable.js +53 -52
  22. package/lib/substitution.js +28 -28
  23. package/lib/substitutions.js +46 -40
  24. package/lib/supposition.js +4 -4
  25. package/lib/unifier/intrinsicLevel.js +4 -4
  26. package/lib/unifier/metaLevel.js +11 -7
  27. package/lib/unifier/statementWithCombinator.js +2 -2
  28. package/lib/utilities/node.js +24 -10
  29. package/lib/utilities/tokens.js +8 -1
  30. package/lib/variable.js +9 -5
  31. package/package.json +1 -1
  32. package/src/assertion/contained.js +1 -1
  33. package/src/assertion/defined.js +1 -1
  34. package/src/assignment/judgement.js +3 -4
  35. package/src/conclusion.js +4 -4
  36. package/src/consequent.js +4 -4
  37. package/src/declaration.js +57 -4
  38. package/src/frame.js +149 -90
  39. package/src/judgement.js +109 -3
  40. package/src/metaType.js +29 -3
  41. package/src/metavariable.js +145 -42
  42. package/src/mixins/statement/unify.js +1 -23
  43. package/src/mixins/statement/verify.js +15 -13
  44. package/src/premise.js +13 -6
  45. package/src/reference.js +11 -7
  46. package/src/rule.js +7 -1
  47. package/src/ruleNames.js +1 -0
  48. package/src/statement/unqualified.js +31 -1
  49. package/src/statement.js +3 -1
  50. package/src/substitution/frameForMetavariable.js +65 -84
  51. package/src/substitution/statementForMetavariable.js +63 -32
  52. package/src/substitution/termForVariable.js +56 -77
  53. package/src/substitution.js +21 -21
  54. package/src/substitutions.js +51 -46
  55. package/src/supposition.js +4 -4
  56. package/src/unifier/intrinsicLevel.js +4 -3
  57. package/src/unifier/metaLevel.js +19 -7
  58. package/src/unifier/statementWithCombinator.js +1 -1
  59. package/src/utilities/node.js +26 -10
  60. package/src/utilities/tokens.js +7 -0
  61. package/src/variable.js +14 -5
  62. package/lib/unify/metavariableWithFrame.js +0 -40
  63. package/lib/unify/simpleSubstitutionStatementWithComplexSubstitutionStatement.js +0 -31
  64. package/lib/verify/declaration.js +0 -83
  65. package/lib/verify/frame.js +0 -120
  66. package/lib/verify/judgement.js +0 -88
  67. package/lib/verify/metavariableGivenMetaType.js +0 -44
  68. package/src/unify/metavariableWithFrame.js +0 -40
  69. package/src/unify/simpleSubstitutionStatementWithComplexSubstitutionStatement.js +0 -27
  70. package/src/verify/declaration.js +0 -113
  71. package/src/verify/frame.js +0 -157
  72. package/src/verify/judgement.js +0 -127
  73. package/src/verify/metavariableGivenMetaType.js +0 -45
@@ -4,19 +4,23 @@ import shim from "../shim";
4
4
  import Substitution from "../substitution";
5
5
 
6
6
  import { nodeQuery } from "../utilities/query";
7
+ import { metavariableNameFromMetavariableNode } from "../utilities/name";
8
+ import { substitutionNodeFromSubstitutionTokens } from "../utilities/node";
9
+ import { substitutionTokensFromSubstitutionString } from "../utilities/tokens";
7
10
 
8
- const substitutionNodeQuery = nodeQuery("/statement/substitution"),
9
- substitutionFrameNodeQuery = nodeQuery("/substitution/frame!"),
10
- frameMetavariableNodeQuery = nodeQuery("/frame/metavariable!"),
11
- substitutionMetavariableNodeQuery = nodeQuery("/substitution/metavariable!");
11
+ const frameNodeQuery = nodeQuery("/substitution/frame[0]"),
12
+ metavariableNodeQuery = nodeQuery("/substitution/frame[1]/metavariable!"),
13
+ substitutionNodeQuery = nodeQuery("/statement/substitution"),
14
+ frameMetavariableNodeQuery = nodeQuery("/frame/metavariable");
12
15
 
13
16
  export default class FrameForMetavariableSubstitution extends Substitution {
14
- constructor(string, frameNode, metavariableNode, substitutionNode) {
17
+ constructor(string, frameNode, metavariableNode, substitutionNode, substitutionTokens) {
15
18
  super(string);
16
19
 
17
20
  this.frameNode = frameNode;
18
21
  this.metavariableNode = metavariableNode;
19
22
  this.substitutionNode = substitutionNode;
23
+ this.substitutionTokens = substitutionTokens;
20
24
  }
21
25
 
22
26
  getFrameNode() {
@@ -31,36 +35,40 @@ export default class FrameForMetavariableSubstitution extends Substitution {
31
35
  return this.substitutionNode;
32
36
  }
33
37
 
34
- transformed(substitutions) {
35
- let transformedSubstitution = null;
38
+ getSubstitutionTokens() {
39
+ return this.substitutionTokens;
40
+ }
36
41
 
37
- const transformedFrameNode = transformFrameNode(this.frameNode, substitutions),
38
- transformedMetavariableNode = transformMetavariableNode(this.metavariableNode, substitutions);
42
+ getMetavariableName() {
43
+ const metavariableName = metavariableNameFromMetavariableNode(this.metavariableNode);
39
44
 
40
- if ((transformedFrameNode !== null) && (transformedMetavariableNode !== null)) {
41
- const string = null, ///
42
- frameNode = transformedFrameNode, ///
43
- metavariableNode = transformedMetavariableNode, ///
44
- substitutionNode = null,
45
- frameForMetavariableSubstitution = new FrameForMetavariableSubstitution(string, frameNode, metavariableNode, substitutionNode);
45
+ return metavariableName;
46
+ }
46
47
 
47
- transformedSubstitution = frameForMetavariableSubstitution; ///
48
- }
48
+ setSubstitutionNode() {
49
+ this.substitutionNode = substitutionNodeFromSubstitutionTokens(this.substitutionTokens);
50
+ }
49
51
 
50
- return transformedSubstitution;
52
+ setSubstitutionTokens() {
53
+ const frameMetavariableNode = frameMetavariableNodeQuery(this.frameNode),
54
+ frameMetavariableName = metavariableNameFromMetavariableNode(frameMetavariableNode),
55
+ metavariableName = metavariableNameFromMetavariableNode(this.metavariableNode),
56
+ substitutionString = `[[${frameMetavariableName}] for [${metavariableName}]]`;
57
+
58
+ this.substitutionTokens = substitutionTokensFromSubstitutionString(substitutionString);
51
59
  }
52
60
 
53
61
  isEqualTo(substitution) {
54
62
  let equalTo = false;
55
63
 
56
64
  const frameNode = substitution.getFrameNode(),
57
- metavariableNode = substitution.getMetavariableNode();
65
+ metavariableName = substitution.getMetavariableName();
58
66
 
59
- if ((frameNode !== null) && (metavariableNode !== null)) {
67
+ if ((frameNode !== null) && (metavariableName !== null)) {
60
68
  const frameNodeMatches = this.matchFrameNode(frameNode),
61
- metavariableNodeMatches = this.matchMetavariableNode(metavariableNode);
69
+ metavariableNameMatches = this.matchMetavariableName(metavariableName);
62
70
 
63
- equalTo = (frameNodeMatches && metavariableNodeMatches);
71
+ equalTo = (frameNodeMatches && metavariableNameMatches);
64
72
  }
65
73
 
66
74
  return equalTo;
@@ -72,24 +80,42 @@ export default class FrameForMetavariableSubstitution extends Substitution {
72
80
  return frameNodeMatches;
73
81
  }
74
82
 
75
- matchMetavariableNode(metavariableNode) {
76
- const metavariableNodeMatches = this.metavariableNode.match(metavariableNode);
83
+ matchMetavariableName(metavariableName) {
84
+ let metavariableNameMatches;
85
+
86
+ const metavariableNameA = metavariableName; ///
87
+
88
+ metavariableName = metavariableNameFromMetavariableNode(this.metavariableNode);
89
+
90
+ const metavariableNameB = metavariableName; ///
77
91
 
78
- return metavariableNodeMatches;
92
+ metavariableNameMatches = (metavariableNameA === metavariableNameB);
93
+
94
+ return metavariableNameMatches;
79
95
  }
80
96
 
81
97
  matchSubstitutionNode(substitutionNode) {
82
- const substitutionNodeMatches = this.substitutionNode.match(substitutionNode);
98
+ let substitutionNodeMatches;
99
+
100
+ if ((substitutionNode === null) && (this.substitutionNode === null)) {
101
+ substitutionNodeMatches = true;
102
+ } else if ((substitutionNode === null) && (this.substitutionNode !== null)) {
103
+ substitutionNodeMatches = false;
104
+ } else if ((substitutionNode !== null) && (this.substitutionNode === null)) {
105
+ substitutionNodeMatches = false;
106
+ } else {
107
+ substitutionNodeMatches = this.substitutionNode.match(substitutionNode);
108
+ }
83
109
 
84
110
  return substitutionNodeMatches;
85
111
  }
86
112
 
87
- matchMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode) {
88
- const metavariableNodeMatches = this.matchMetavariableNode(metavariableNode),
113
+ matchMetavariableNameAndSubstitutionNode(metavariableName, substitutionNode) {
114
+ const metavariableNameMatches = this.matchMetavariableName(metavariableName),
89
115
  substitutionNodeMatches = this.matchSubstitutionNode(substitutionNode),
90
- metavariableNodeAndSubstitutionNodeMatches = (metavariableNodeMatches && substitutionNodeMatches);
116
+ metavariableNameAndSubstitutionNodeMatches = (metavariableNameMatches && substitutionNodeMatches);
91
117
 
92
- return metavariableNodeAndSubstitutionNodeMatches;
118
+ return metavariableNameAndSubstitutionNodeMatches;
93
119
  }
94
120
 
95
121
  static fromStatementNode(statementNode, localContext) {
@@ -98,18 +124,17 @@ export default class FrameForMetavariableSubstitution extends Substitution {
98
124
  const substitutionNode = substitutionNodeQuery(statementNode);
99
125
 
100
126
  if (substitutionNode !== null) {
101
- let substitutionFrameNode = substitutionFrameNodeQuery(substitutionNode);
127
+ const frameNode = frameNodeQuery(substitutionNode),
128
+ metavariableNode = metavariableNodeQuery(substitutionNode);
102
129
 
103
- if (substitutionFrameNode !== null) {
130
+ if ((frameNode !== null) && (metavariableNode !== null)) {
104
131
  const { Frame, Metavariable } = shim,
105
- substitutionMetavariableNode = substitutionMetavariableNodeQuery(substitutionNode),
106
- metavariableNode = substitutionMetavariableNode, ///
107
- frameNode = substitutionFrameNode, ///
108
- frame = Frame.fromTermNode(frameNode, localContext),
132
+ frame = Frame.fromFrameNode(frameNode, localContext),
109
133
  variable = Metavariable.fromMetavariableNode(metavariableNode, localContext),
110
- string = stringFromFrameAndMetavariable(frame, variable, localContext);
134
+ string = stringFromFrameAndMetavariable(frame, variable, localContext),
135
+ substitutionTokens = localContext.nodeAsTokens(substitutionNode);
111
136
 
112
- frameForMetavariableSubstitution = new FrameForMetavariableSubstitution(string, frameNode, metavariableNode, substitutionNode);
137
+ frameForMetavariableSubstitution = new FrameForMetavariableSubstitution(string, frameNode, metavariableNode, substitutionNode, substitutionTokens);
113
138
  }
114
139
  }
115
140
 
@@ -121,57 +146,13 @@ export default class FrameForMetavariableSubstitution extends Substitution {
121
146
  frameNode = frame.getNode(),
122
147
  metavariableNode = metavariable.getNode(),
123
148
  substitutionNode = null,
124
- statementForMetavariableSubstitution = new FrameForMetavariableSubstitution(string, frameNode, metavariableNode, substitutionNode);
149
+ substitutionTokens = null,
150
+ statementForMetavariableSubstitution = new FrameForMetavariableSubstitution(string, frameNode, metavariableNode, substitutionNode, substitutionTokens);
125
151
 
126
152
  return statementForMetavariableSubstitution;
127
153
  }
128
154
  }
129
155
 
130
- function transformFrameNode(frameNode, substitutions) {
131
- let transformedFrameNode = null;
132
-
133
- const frameMetavariableNode = frameMetavariableNodeQuery(frameNode);
134
-
135
- if (frameMetavariableNode !== null) {
136
- const metavariableNode = frameMetavariableNode; ///
137
-
138
- substitutions.someSubstitution((substitution) => {
139
- const metavariableNodeMatches = substitution.matchMetavariableNode(metavariableNode);
140
-
141
- if (metavariableNodeMatches) {
142
- const frameNode = substitution.getFrameNode();
143
-
144
- transformedFrameNode = frameNode; ////
145
-
146
- return true;
147
- }
148
- });
149
- }
150
-
151
- return transformedFrameNode;
152
- }
153
-
154
- function transformMetavariableNode(metavariableNode, substitutions) {
155
- let transformedMetavariableNode = null;
156
-
157
- substitutions.someSubstitution((substitution) => {
158
- const metavariableNodeMatches = substitution.matchMetavariableNode(metavariableNode);
159
-
160
- if (metavariableNodeMatches) {
161
- const frameNode = substitution.getFrameNode(),
162
- frameMetavariableNode = frameMetavariableNodeQuery(frameNode);
163
-
164
- if (frameMetavariableNode !== null) {
165
- transformedMetavariableNode = frameMetavariableNode; ///
166
-
167
- return true;
168
- }
169
- }
170
- });
171
-
172
- return transformedMetavariableNode;
173
- }
174
-
175
156
  function stringFromFrameAndMetavariable(frame, metavariable, localContext) {
176
157
  const frameNode = frame.getNode(),
177
158
  frameString = localContext.nodeAsString(frameNode),
@@ -2,7 +2,9 @@
2
2
 
3
3
  import shim from "../shim";
4
4
  import Substitution from "../substitution";
5
+ import LocalContext from "../context/local";
5
6
  import Substitutions from "../substitutions";
7
+ import metaLevelUnifier from "../unifier/metaLevel";
6
8
 
7
9
  import { stripBracketsFromStatement } from "../utilities/brackets";
8
10
 
@@ -39,76 +41,105 @@ export default class StatementForMetavariableSubstitution extends Substitution {
39
41
  return metavariableNode;
40
42
  }
41
43
 
44
+ getMetavariableName() {
45
+ const metavariableName = this.metavariable.getName();
46
+
47
+ return metavariableName;
48
+ }
49
+
42
50
  isSimple() {
43
51
  const simple = (this.substitution === null);
44
52
 
45
53
  return simple;
46
54
  }
47
55
 
48
- resolve(substitutions, localContext) {
56
+ resolve(substitutions, localContextA, localContextB) {
49
57
  let resolved = false;
50
58
 
51
59
  const substitutionString = this.string;
52
60
 
53
- localContext.trace(`Resolving the ${substitutionString} substitution...`);
61
+ localContextB.trace(`Resolving the ${substitutionString} substitution...`);
54
62
 
55
- const metavariableNode = this.getMetavariableNode(),
56
- simpleSubstitution = substitutions.findSimpleSubstitutionByMetavariableNode(metavariableNode);
63
+ const metavariableName = this.getMetavariableName(),
64
+ simpleSubstitution = substitutions.findSimpleSubstitutionByMetavariableName(metavariableName);
57
65
 
58
66
  if (simpleSubstitution !== null) {
59
67
  const substitution = simpleSubstitution, ///
60
- substitutionResolved = substitution.resolveSubstitution(this.substitution, this.statement, substitutions, localContext);
68
+ substitutionResolved = substitution.resolveSubstitution(this.substitution, this.statement, substitutions, localContextA, localContextB);
61
69
 
62
70
  resolved = substitutionResolved; ///
63
71
  }
64
72
 
65
73
  if (resolved) {
66
- localContext.debug(`...resolved the ${substitutionString} substitution.`);
74
+ localContextB.debug(`...resolved the ${substitutionString} substitution.`);
67
75
  }
68
76
 
69
77
  return resolved;
70
78
  }
71
79
 
72
- resolveSubstitution(substitution, statement, substitutions, localContext) {
80
+ resolveSubstitution(substitution, statement, substitutions, localContextA, localContextB) {
73
81
  let substitutionResolved = false;
74
82
 
75
83
  const substitutionString = substitution.getString();
76
84
 
77
- localContext.trace(`Resolving the ${substitutionString} substitution...`);
85
+ localContextB.trace(`Resolving the ${substitutionString} substitution...`);
78
86
 
79
- const transformedSubstitution = substitution.transformed(substitutions, localContext);
87
+ const substitutionA = substitution; ///
80
88
 
81
- if (transformedSubstitution !== null) {
82
- const transformedSubstitutionString = transformedSubstitution.getString();
89
+ substitution = this.unifyStatement(statement, localContextA, localContextB);
83
90
 
84
- localContext.trace(`Transformed the substitution to ${transformedSubstitutionString}...`);
91
+ if (substitution !== null) {
92
+ substitutions.snapshot();
85
93
 
86
- substitutions = Substitutions.fromNothing(); ///
94
+ const substitutionTokens = substitution.getSubstitutionTokens(),
95
+ tokens = substitutionTokens; ///
87
96
 
88
- const localContextA = localContext, ///
89
- localContextB = localContext, ///
90
- statementUnified = this.statement.unifyStatement(statement, substitutions, localContextA, localContextB);
97
+ localContextB = LocalContext.fromLocalContextAndTokens(localContextB, tokens); ///
91
98
 
92
- if (statementUnified) {
93
- const substitutionsLength = substitutions.getLength();
99
+ const substitutionB = substitution, ///
100
+ nodeA = substitutionA.getSubstitutionNode(), ///
101
+ nodeB = substitutionB.getSubstitutionNode(), ///
102
+ unifiedAtMetaLevel = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
94
103
 
95
- if (substitutionsLength === 1) {
96
- const firstSubstitution = substitutions.getFirstSubstitution(),
97
- substitution = firstSubstitution, ///
98
- substitutionEqualToTransformedSubstitution = substitution.isEqualTo(transformedSubstitution);
104
+ unifiedAtMetaLevel ?
105
+ substitutions.continue() :
106
+ substitutions.rollback(localContextB);
99
107
 
100
- substitutionResolved = substitutionEqualToTransformedSubstitution; ///
101
- }
102
- }
108
+ substitutionResolved = unifiedAtMetaLevel; ///
103
109
  }
104
110
 
105
111
  if (substitutionResolved) {
106
- localContext.debug(`...resolved the ${substitutionString} substitution.`);
112
+ localContextB.debug(`...resolved the ${substitutionString} substitution.`);
107
113
  }
108
114
 
109
115
  return substitutionResolved;
110
116
  }
111
117
 
118
+ unifyStatement(statement, localContextA, localContextB) {
119
+ let substitution = null;
120
+
121
+ localContextA = localContextB; ///
122
+
123
+ const substitutions = Substitutions.fromNothing(),
124
+ statementUnified = this.statement.unifyStatement(statement, substitutions, localContextA, localContextB);
125
+
126
+ if (statementUnified) {
127
+ const substitutionsLength = substitutions.getLength();
128
+
129
+ if (substitutionsLength === 1) {
130
+ const firstSubstitution = substitutions.getFirstSubstitution();
131
+
132
+ substitution = firstSubstitution; ///
133
+
134
+ substitution.setSubstitutionTokens();
135
+
136
+ substitution.setSubstitutionNode();
137
+ }
138
+ }
139
+
140
+ return substitution;
141
+ }
142
+
112
143
  matchStatementNode(statementNode) {
113
144
  statementNode = stripBracketsFromStatement(statementNode); ///
114
145
 
@@ -117,7 +148,7 @@ export default class StatementForMetavariableSubstitution extends Substitution {
117
148
  return statementNodeMatches;
118
149
  }
119
150
 
120
- matchMetavariableNode(metavariableNode) { return this.metavariable.matchMetavariableNode(metavariableNode); }
151
+ matchMetavariableName(metavariableName) { return this.metavariable.matchMetavariableName(metavariableName); }
121
152
 
122
153
  matchSubstitutionNode(substitutionNode) {
123
154
  let substitutionNodeMatches;
@@ -135,12 +166,12 @@ export default class StatementForMetavariableSubstitution extends Substitution {
135
166
  return substitutionNodeMatches;
136
167
  }
137
168
 
138
- matchMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode) {
139
- const metavariableNodeMatches = this.matchMetavariableNode(metavariableNode),
169
+ matchMetavariableNameAndSubstitutionNode(metavariableName, substitutionNode) {
170
+ const metavariableNameMatches = this.matchMetavariableName(metavariableName),
140
171
  substitutionNodeMatches = this.matchSubstitutionNode(substitutionNode),
141
- metavariableNodeAndSubstitutionNodeMatches = (metavariableNodeMatches && substitutionNodeMatches);
172
+ metavariableNameAndSubstitutionNodeMatches = (metavariableNameMatches && substitutionNodeMatches);
142
173
 
143
- return metavariableNodeAndSubstitutionNodeMatches;
174
+ return metavariableNameAndSubstitutionNodeMatches;
144
175
  }
145
176
 
146
177
  static fromStatementMetavariableAndSubstitution(statement, metavariable, substitution, localContext) {
@@ -175,4 +206,4 @@ function stringFromStatementMetavariableAndSubstitution(statement, metavariable,
175
206
  }
176
207
 
177
208
  return string;
178
- }
209
+ }
@@ -5,19 +5,23 @@ import Substitution from "../substitution";
5
5
 
6
6
  import { nodeQuery } from "../utilities/query";
7
7
  import { stripBracketsFromTerm } from "../utilities/brackets";
8
+ import { variableNameFromVariableNode } from "../utilities/name";
9
+ import { substitutionNodeFromSubstitutionTokens } from "../utilities/node";
10
+ import { substitutionTokensFromSubstitutionString } from "../utilities/tokens";
8
11
 
9
- const substitutionNodeQuery = nodeQuery("/statement/substitution"),
10
- termVariableNodeQuery = nodeQuery("/term/variable!"),
11
- substitutionTermNodeQuery = nodeQuery("/substitution/term!"),
12
- substitutionsVariableNodeQuery = nodeQuery("/substitution/variable!");
12
+ const termNodeQuery = nodeQuery("/substitution/term[0]"),
13
+ variableNodeQuery = nodeQuery("/substitution/term[1]/variable!"),
14
+ termVariableNodeQuery = nodeQuery("/term/variable"),
15
+ substitutionNodeQuery = nodeQuery("/statement/substitution");
13
16
 
14
17
  export default class TermForVariableSubstitution extends Substitution {
15
- constructor(string, termNode, variableNode, substitutionNode) {
18
+ constructor(string, termNode, variableNode, substitutionNode, substitutionTokens) {
16
19
  super(string);
17
20
 
18
21
  this.termNode = termNode;
19
22
  this.variableNode = variableNode;
20
23
  this.substitutionNode = substitutionNode;
24
+ this.substitutionTokens = substitutionTokens;
21
25
  }
22
26
 
23
27
  getTermNode() {
@@ -32,25 +36,27 @@ export default class TermForVariableSubstitution extends Substitution {
32
36
  return this.substitutionNode;
33
37
  }
34
38
 
35
- transformed(substitutions, localContext) {
36
- let transformedSubstitution = null;
39
+ getSubstitutionTokens() {
40
+ return this.substitutionTokens;
41
+ }
37
42
 
38
- const transformedTermNode = transformTermNode(this.termNode, substitutions),
39
- transformedVariableNode = transformVariableNode(this.variableNode, substitutions);
43
+ getVariableName() {
44
+ const variableName = variableNameFromVariableNode(this.variableNode);
40
45
 
41
- if ((transformedTermNode !== null) && (transformedVariableNode !== null)) {
42
- const termNode = transformedTermNode, ///
43
- variableNode = transformedVariableNode, ///
44
- termString = localContext.nodeAsString(termNode),
45
- variableString = localContext.nodeAsString(variableNode),
46
- string = `[${termString} for ${variableString}]`,
47
- substitutionNode = null,
48
- termForVariableSubstitution = new TermForVariableSubstitution(string, termNode, variableNode, substitutionNode);
46
+ return variableName;
47
+ }
49
48
 
50
- transformedSubstitution = termForVariableSubstitution; ///
51
- }
49
+ setSubstitutionNode() {
50
+ this.substitutionNode = substitutionNodeFromSubstitutionTokens(this.substitutionTokens);
51
+ }
52
52
 
53
- return transformedSubstitution;
53
+ setSubstitutionTokens() {
54
+ const termVariableNode = termVariableNodeQuery(this.termNode),
55
+ termVariableName = variableNameFromVariableNode(termVariableNode),
56
+ variableName = variableNameFromVariableNode(this.variableNode),
57
+ substitutionString = `[${termVariableName} for ${variableName}]`;
58
+
59
+ this.substitutionTokens = substitutionTokensFromSubstitutionString(substitutionString);
54
60
  }
55
61
 
56
62
  isEqualTo(substitution) {
@@ -77,14 +83,32 @@ export default class TermForVariableSubstitution extends Substitution {
77
83
  return termNodeMatches;
78
84
  }
79
85
 
80
- matchVariableNode(variableNode) {
81
- const variableNodeMatches = this.variableNode.match(variableNode);
86
+ matchVariableName(variableName) {
87
+ let variableNameMatches;
88
+
89
+ const variableNameA = variableName; ///
90
+
91
+ variableName = variableNameFromVariableNode(this.variableNode);
92
+
93
+ const variableNameB = variableName; ///
82
94
 
83
- return variableNodeMatches;
95
+ variableNameMatches = (variableNameA === variableNameB);
96
+
97
+ return variableNameMatches;
84
98
  }
85
99
 
86
100
  matchSubstitutionNode(substitutionNode) {
87
- const substitutionNodeMatches = this.substitutionNode.match(substitutionNode);
101
+ let substitutionNodeMatches;
102
+
103
+ if ((substitutionNode === null) && (this.substitutionNode === null)) {
104
+ substitutionNodeMatches = true;
105
+ } else if ((substitutionNode === null) && (this.substitutionNode !== null)) {
106
+ substitutionNodeMatches = false;
107
+ } else if ((substitutionNode !== null) && (this.substitutionNode === null)) {
108
+ substitutionNodeMatches = false;
109
+ } else {
110
+ substitutionNodeMatches = this.substitutionNode.match(substitutionNode);
111
+ }
88
112
 
89
113
  return substitutionNodeMatches;
90
114
  }
@@ -111,18 +135,17 @@ export default class TermForVariableSubstitution extends Substitution {
111
135
  const substitutionNode = substitutionNodeQuery(statementNode);
112
136
 
113
137
  if (substitutionNode !== null) {
114
- let substitutionTermNode = substitutionTermNodeQuery(substitutionNode);
138
+ const termNode = termNodeQuery(substitutionNode),
139
+ variableNode = variableNodeQuery(substitutionNode);
115
140
 
116
- if (substitutionTermNode !== null) {
141
+ if ((termNode !== null) && (variableNode !== null)) {
117
142
  const { Term, Variable } = shim,
118
- substitutionVariableNode = substitutionsVariableNodeQuery(substitutionNode),
119
- variableNode = substitutionVariableNode, ///
120
- termNode = substitutionTermNode, ///
121
143
  term = Term.fromTermNode(termNode, localContext),
122
144
  variable = Variable.fromVariableNode(variableNode, localContext),
123
- string = stringFromTermAndVariable(term, variable, localContext);
145
+ string = stringFromTermAndVariable(term, variable, localContext),
146
+ substitutionTokens = localContext.nodeAsTokens(substitutionNode);
124
147
 
125
- termForVariableSubstitution = new TermForVariableSubstitution(string, termNode, variableNode, substitutionNode);
148
+ termForVariableSubstitution = new TermForVariableSubstitution(string, termNode, variableNode, substitutionNode, substitutionTokens);
126
149
  }
127
150
  }
128
151
 
@@ -137,57 +160,13 @@ export default class TermForVariableSubstitution extends Substitution {
137
160
  const string = stringFromTermAndVariable(term, variable, localContext),
138
161
  variableNode = variable.getNode(),
139
162
  substitutionNode = null,
140
- termForVariableSubstitution = new TermForVariableSubstitution(string, termNode, variableNode, substitutionNode);
163
+ substitutionTokens = null,
164
+ termForVariableSubstitution = new TermForVariableSubstitution(string, termNode, variableNode, substitutionNode, substitutionTokens);
141
165
 
142
166
  return termForVariableSubstitution;
143
167
  }
144
168
  }
145
169
 
146
- function transformTermNode(termNode, substitutions) {
147
- let transformedTermNode = null;
148
-
149
- const termVariableNode = termVariableNodeQuery(termNode);
150
-
151
- if (termVariableNode !== null) {
152
- const variableNode = termVariableNode; ///
153
-
154
- substitutions.someSubstitution((substitution) => {
155
- const substitutionMatchesVariableNode = substitution.matchVariableNode(variableNode);
156
-
157
- if (substitutionMatchesVariableNode) {
158
- const termNode = substitution.getTermNode();
159
-
160
- transformedTermNode = termNode; ////
161
-
162
- return true;
163
- }
164
- });
165
- }
166
-
167
- return transformedTermNode;
168
- }
169
-
170
- function transformVariableNode(variableNode, substitutions) {
171
- let transformedVariableNode = null;
172
-
173
- substitutions.someSubstitution((substitution) => {
174
- const variableNodeMatches = substitution.matchVariableNode(variableNode);
175
-
176
- if (variableNodeMatches) {
177
- const termNode = substitution.getTermNode(),
178
- termVariableNode = termVariableNodeQuery(termNode);
179
-
180
- if (termVariableNode !== null) {
181
- transformedVariableNode = termVariableNode; ///
182
-
183
- return true;
184
- }
185
- }
186
- });
187
-
188
- return transformedVariableNode;
189
- }
190
-
191
170
  function stringFromTermAndVariable(term, variable, localContext) {
192
171
  const termNode = term.getNode(),
193
172
  termString = localContext.nodeAsString(termNode),
@@ -27,22 +27,22 @@ export default class Substitution {
27
27
  return statementNode;
28
28
  }
29
29
 
30
- getVariableNode() {
31
- const variableNode = null;
30
+ getSubstitutionNode() {
31
+ const substitutionNode = null;
32
32
 
33
- return variableNode;
33
+ return substitutionNode;
34
34
  }
35
35
 
36
- getMetavariableNode() {
37
- const metavariableNode = null;
36
+ getVariableName() {
37
+ const variableName = null;
38
38
 
39
- return metavariableNode;
39
+ return variableName;
40
40
  }
41
41
 
42
- getSubstitutionNode() {
43
- const substitutionNode = null;
42
+ getMetavariableName() {
43
+ const metavariableName = null;
44
44
 
45
- return substitutionNode;
45
+ return metavariableName;
46
46
  }
47
47
 
48
48
  isSimple() {
@@ -82,28 +82,28 @@ export default class Substitution {
82
82
  return frameNodeMatches;
83
83
  }
84
84
 
85
- matchVariableNode(variableNode) {
86
- const variableNodeMatches = false;
87
-
88
- return variableNodeMatches;
89
- }
90
-
91
85
  matchStatementNode(statementNode) {
92
86
  const statementNodeMatches = false;
93
87
 
94
88
  return statementNodeMatches;
95
89
  }
96
90
 
97
- matchMetavariableNode(metavariableNode) {
98
- const metavariableNodeMatches = false;
91
+ matchVariableName(variableName) {
92
+ const variableNameMatches = false;
93
+
94
+ return variableNameMatches;
95
+ }
96
+
97
+ matchMetavariableName(metavariableName) {
98
+ const metavariableNameMatches = false;
99
99
 
100
- return metavariableNodeMatches;
100
+ return metavariableNameMatches;
101
101
  }
102
102
 
103
- matchMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode) {
104
- const metavariableNodeAndSubstitutionNodeMatches = false;
103
+ matchMetavariableNameAndSubstitutionNode(metavariableName, substitutionNode) {
104
+ const metavariableNameAndSubstitutionNodeMatches = false;
105
105
 
106
- return metavariableNodeAndSubstitutionNodeMatches;
106
+ return metavariableNameAndSubstitutionNodeMatches;
107
107
  }
108
108
 
109
109
  unifyWithEquivalence(equivalence, substitutions, localContextA, localContextB) {