occam-verify-cli 1.0.438 → 1.0.444

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 (216) hide show
  1. package/lib/context/file.js +38 -35
  2. package/lib/context/local.js +10 -10
  3. package/lib/context/release.js +6 -6
  4. package/lib/context/temporary.js +14 -14
  5. package/lib/element/assertion/contained.js +45 -45
  6. package/lib/element/assertion/defined.js +13 -13
  7. package/lib/element/assertion/property.js +23 -22
  8. package/lib/element/assertion/satisfies.js +7 -6
  9. package/lib/element/assertion/subproof.js +20 -17
  10. package/lib/element/assertion/type.js +3 -2
  11. package/lib/element/assertion.js +1 -23
  12. package/lib/element/assumption.js +24 -22
  13. package/lib/element/axiom.js +9 -12
  14. package/lib/element/axiomLemmaTheoremConjecture.js +32 -32
  15. package/lib/element/{statement/combinator → combinator}/bracketed.js +16 -16
  16. package/lib/element/combinator.js +229 -0
  17. package/lib/element/conclusion.js +11 -9
  18. package/lib/element/{term/constructor → constructor}/bracketed.js +5 -5
  19. package/lib/element/constructor.js +232 -0
  20. package/lib/element/declaration/combinator.js +2 -16
  21. package/lib/element/declaration/complexType.js +12 -12
  22. package/lib/element/declaration/constructor.js +13 -11
  23. package/lib/element/declaration/simpleType.js +4 -4
  24. package/lib/element/declaration/typePrefix.js +2 -2
  25. package/lib/element/declaration/variable.js +3 -3
  26. package/lib/element/deduction.js +11 -9
  27. package/lib/element/derivation.js +7 -10
  28. package/lib/element/equivalence.js +10 -10
  29. package/lib/element/equivalences.js +5 -5
  30. package/lib/element/frame.js +32 -38
  31. package/lib/element/hypothesis.js +3 -3
  32. package/lib/element/judgement.js +6 -4
  33. package/lib/element/label.js +8 -8
  34. package/lib/element/metaLemmaMetatheorem.js +5 -5
  35. package/lib/element/metaType.js +17 -80
  36. package/lib/element/metavariable.js +34 -34
  37. package/lib/element/parameter.js +3 -3
  38. package/lib/element/premise.js +49 -58
  39. package/lib/element/property.js +9 -9
  40. package/lib/element/propertyRelation.js +13 -13
  41. package/lib/element/reference.js +14 -17
  42. package/lib/element/rule.js +21 -21
  43. package/lib/element/signature.js +11 -11
  44. package/lib/element/statement.js +18 -18
  45. package/lib/element/step.js +83 -55
  46. package/lib/element/subDerivation.js +7 -10
  47. package/lib/element/subproof.js +6 -14
  48. package/lib/element/substitution/frame.js +1 -7
  49. package/lib/element/substitution/reference.js +2 -3
  50. package/lib/element/substitution/statement.js +44 -15
  51. package/lib/element/substitution/term.js +10 -57
  52. package/lib/element/substitution.js +5 -11
  53. package/lib/element/substitutions.js +29 -29
  54. package/lib/element/supposition.js +63 -55
  55. package/lib/element/term.js +21 -34
  56. package/lib/element/type.js +47 -60
  57. package/lib/element/typePrefix.js +5 -5
  58. package/lib/element/variable.js +9 -9
  59. package/lib/element.js +9 -3
  60. package/lib/metaTypes.js +52 -0
  61. package/lib/node/axiomLemmaTheoremConjecture.js +9 -9
  62. package/lib/node/body/axiom.js +2 -25
  63. package/lib/node/body/conjecture.js +2 -25
  64. package/lib/node/body/lemma.js +2 -25
  65. package/lib/node/body/metaLemma.js +2 -25
  66. package/lib/node/body/metatheorem.js +2 -25
  67. package/lib/node/body/rule.js +15 -1
  68. package/lib/node/body/theorem.js +2 -25
  69. package/lib/node/body.js +25 -2
  70. package/lib/node/combinator.js +11 -2
  71. package/lib/node/constructor.js +11 -2
  72. package/lib/node/declaration/combinator.js +5 -5
  73. package/lib/node/declaration/constructor.js +8 -8
  74. package/lib/node/declaration/property.js +15 -15
  75. package/lib/node/declaration/simpleType.js +31 -31
  76. package/lib/node/declaration/variable.js +8 -8
  77. package/lib/node/equality.js +8 -8
  78. package/lib/node/frame.js +20 -20
  79. package/lib/node/header.js +22 -22
  80. package/lib/node/metaLemmaMetaTheorem.js +16 -16
  81. package/lib/node/metavariable.js +15 -15
  82. package/lib/node/property.js +8 -8
  83. package/lib/node/propertyRelation.js +8 -8
  84. package/lib/node/rule.js +16 -16
  85. package/lib/node/statement.js +12 -12
  86. package/lib/node/step.js +22 -22
  87. package/lib/node/subproof.js +8 -8
  88. package/lib/node/substitution/frame.js +19 -19
  89. package/lib/node/substitution/statement.js +19 -19
  90. package/lib/node/substitution/term.js +19 -19
  91. package/lib/node/term.js +35 -35
  92. package/lib/preamble.js +5 -5
  93. package/lib/process/instantiate.js +20 -2
  94. package/lib/process/unify.js +39 -42
  95. package/lib/process/validate.js +431 -0
  96. package/lib/process/verify.js +44 -135
  97. package/lib/types.js +27 -0
  98. package/lib/utilities/brackets.js +4 -4
  99. package/lib/utilities/element.js +91 -55
  100. package/lib/utilities/instance.js +18 -18
  101. package/lib/utilities/statement.js +2 -2
  102. package/lib/utilities/string.js +21 -10
  103. package/lib/utilities/unification.js +237 -0
  104. package/lib/utilities/validation.js +251 -0
  105. package/package.json +6 -6
  106. package/src/context/file.js +37 -31
  107. package/src/context/local.js +8 -8
  108. package/src/context/release.js +9 -6
  109. package/src/context/temporary.js +11 -11
  110. package/src/element/assertion/contained.js +19 -20
  111. package/src/element/assertion/defined.js +11 -12
  112. package/src/element/assertion/property.js +20 -20
  113. package/src/element/assertion/satisfies.js +6 -6
  114. package/src/element/assertion/subproof.js +17 -15
  115. package/src/element/assertion/type.js +2 -2
  116. package/src/element/assertion.js +0 -2
  117. package/src/element/assumption.js +22 -19
  118. package/src/element/axiom.js +7 -11
  119. package/src/element/axiomLemmaTheoremConjecture.js +36 -36
  120. package/src/element/{statement/combinator → combinator}/bracketed.js +7 -7
  121. package/src/element/combinator.js +90 -0
  122. package/src/element/conclusion.js +12 -10
  123. package/src/element/{term/constructor → constructor}/bracketed.js +5 -5
  124. package/src/element/{term/constructor.js → constructor.js} +17 -25
  125. package/src/element/declaration/combinator.js +1 -22
  126. package/src/element/declaration/complexType.js +11 -11
  127. package/src/element/declaration/constructor.js +13 -10
  128. package/src/element/declaration/simpleType.js +3 -3
  129. package/src/element/declaration/typePrefix.js +1 -1
  130. package/src/element/declaration/variable.js +2 -2
  131. package/src/element/deduction.js +12 -9
  132. package/src/element/derivation.js +6 -10
  133. package/src/element/equivalence.js +8 -8
  134. package/src/element/equivalences.js +4 -4
  135. package/src/element/frame.js +28 -30
  136. package/src/element/hypothesis.js +2 -2
  137. package/src/element/judgement.js +6 -3
  138. package/src/element/label.js +4 -4
  139. package/src/element/metaLemmaMetatheorem.js +4 -3
  140. package/src/element/metaType.js +9 -45
  141. package/src/element/metavariable.js +29 -31
  142. package/src/element/parameter.js +2 -2
  143. package/src/element/premise.js +55 -62
  144. package/src/element/property.js +6 -6
  145. package/src/element/propertyRelation.js +11 -11
  146. package/src/element/reference.js +12 -21
  147. package/src/element/rule.js +17 -16
  148. package/src/element/signature.js +10 -9
  149. package/src/element/statement.js +16 -18
  150. package/src/element/step.js +93 -55
  151. package/src/element/subDerivation.js +6 -10
  152. package/src/element/subproof.js +4 -12
  153. package/src/element/substitution/frame.js +0 -2
  154. package/src/element/substitution/reference.js +1 -5
  155. package/src/element/substitution/statement.js +44 -14
  156. package/src/element/substitution/term.js +10 -13
  157. package/src/element/substitution.js +3 -5
  158. package/src/element/substitutions.js +48 -30
  159. package/src/element/supposition.js +88 -70
  160. package/src/element/term.js +18 -28
  161. package/src/element/type.js +42 -36
  162. package/src/element/typePrefix.js +3 -3
  163. package/src/element/variable.js +7 -7
  164. package/src/element.js +3 -1
  165. package/src/metaTypes.js +42 -0
  166. package/src/node/axiomLemmaTheoremConjecture.js +6 -6
  167. package/src/node/body/axiom.js +0 -21
  168. package/src/node/body/conjecture.js +0 -23
  169. package/src/node/body/lemma.js +0 -23
  170. package/src/node/body/metaLemma.js +0 -23
  171. package/src/node/body/metatheorem.js +0 -23
  172. package/src/node/body/rule.js +12 -0
  173. package/src/node/body/theorem.js +0 -23
  174. package/src/node/body.js +23 -0
  175. package/src/node/combinator.js +9 -0
  176. package/src/node/constructor.js +9 -0
  177. package/src/node/declaration/combinator.js +5 -5
  178. package/src/node/declaration/constructor.js +8 -8
  179. package/src/node/declaration/property.js +14 -14
  180. package/src/node/declaration/simpleType.js +31 -31
  181. package/src/node/declaration/variable.js +7 -7
  182. package/src/node/equality.js +7 -7
  183. package/src/node/frame.js +21 -21
  184. package/src/node/header.js +22 -22
  185. package/src/node/metaLemmaMetaTheorem.js +14 -14
  186. package/src/node/metavariable.js +14 -14
  187. package/src/node/property.js +7 -7
  188. package/src/node/propertyRelation.js +7 -7
  189. package/src/node/rule.js +15 -15
  190. package/src/node/statement.js +12 -12
  191. package/src/node/step.js +21 -21
  192. package/src/node/subproof.js +7 -7
  193. package/src/node/substitution/frame.js +18 -18
  194. package/src/node/substitution/statement.js +18 -18
  195. package/src/node/substitution/term.js +18 -18
  196. package/src/node/term.js +34 -34
  197. package/src/preamble.js +4 -4
  198. package/src/process/instantiate.js +12 -0
  199. package/src/process/unify.js +53 -57
  200. package/src/process/validate.js +316 -0
  201. package/src/process/verify.js +50 -138
  202. package/src/types.js +18 -0
  203. package/src/utilities/brackets.js +10 -6
  204. package/src/utilities/element.js +125 -82
  205. package/src/utilities/instance.js +18 -18
  206. package/src/utilities/statement.js +2 -2
  207. package/src/utilities/string.js +34 -20
  208. package/src/{mixins/step/unify.js → utilities/unification.js} +82 -68
  209. package/src/{mixins/statement/validate.js → utilities/validation.js} +143 -69
  210. package/lib/element/statement/combinator.js +0 -105
  211. package/lib/element/term/constructor.js +0 -172
  212. package/lib/mixins/statement/validate.js +0 -198
  213. package/lib/mixins/step/unify.js +0 -228
  214. package/lib/mixins/term/verify.js +0 -65
  215. package/src/element/statement/combinator.js +0 -59
  216. package/src/mixins/term/verify.js +0 -81
@@ -2,11 +2,13 @@
2
2
 
3
3
  import Element from "../element";
4
4
  import elements from "../elements";
5
- import unifyMixins from "../mixins/step/unify";
6
5
  import TemporaryContext from "../context/temporary";
7
6
 
8
7
  import { define } from "../elements";
8
+ import { instantiateStep } from "../process/instantiate";
9
+ import { unifyStatements } from "../utilities/unification";
9
10
  import { equateStatements } from "../process/equate";
11
+ import { stepFromStepNode } from "../utilities/element";
10
12
  import { propertyAssertionFromStatement } from "../utilities/statement";
11
13
 
12
14
  export default define(class Step extends Element {
@@ -55,96 +57,121 @@ export default define(class Step extends Element {
55
57
  return step;
56
58
  }
57
59
 
58
- matchTermAndPropertyRelation(term, propertyRelation, context) {
59
- let termAndPropertyRelationMatch = false;
60
+ compareTermAndPropertyRelation(term, propertyRelation, context) {
61
+ let comparesToTermAndPropertyRelation = false;
60
62
 
61
63
  const propertyAssertion = propertyAssertionFromStatement(this.statement, context);
62
64
 
63
65
  if (propertyAssertion !== null) {
64
- termAndPropertyRelationMatch = propertyAssertion.matchTermAndPropertyRelation(term, propertyRelation, context);
66
+ comparesToTermAndPropertyRelation = propertyAssertion.compareTermAndPropertyRelation(term, propertyRelation, context);
65
67
  }
66
68
 
67
- return termAndPropertyRelationMatch;
69
+ return comparesToTermAndPropertyRelation;
68
70
  }
69
71
 
70
- validate(substitutions, assignments, context) {
71
- let validates = false;
72
+ verify(substitutions, assignments, context) {
73
+ let verifies = false;
72
74
 
73
75
  const temporaryContext = TemporaryContext.fromNothing(context);
74
76
 
75
77
  context = temporaryContext; ///
76
78
 
77
- const stepString = this.string; ///
79
+ const node = this.getNode(),
80
+ stepString = this.getString(); ///
78
81
 
79
- context.trace(`Validating the '${stepString}' step...`, this.node);
82
+ context.trace(`Verifying the '${stepString}' step...`, node);
80
83
 
81
- if (this.statement !== null) {
82
- const stated = this.isStated(),
83
- statementVerifies = this.statement.validate(assignments, stated, context);
84
+ if (this.statement === null) {
85
+ context.debug(`Unable to verify the '${stepString}' step because it is nonsense.`, node);
86
+ } else {
87
+ const referenceVerifies = this.verifyReference(context);
84
88
 
85
- if (statementVerifies) {
86
- const qualified = this.isQualified(),
87
- satisfied = this.isSatisfied();
89
+ if (referenceVerifies) {
90
+ const satisfiesAssertioVeriries = this.verifySatisfiesAssertion(context);
88
91
 
89
- if (false) {
90
- ///
91
- } else if (qualified) {
92
- const referenceVerifies = this.reference.validate(context);
92
+ if (satisfiesAssertioVeriries) {
93
+ const stated = this.isStated(),
94
+ statementValidates = this.statement.validate(assignments, stated, context);
93
95
 
94
- if (referenceVerifies) {
95
- validates = true;
96
- }
97
- } else if (satisfied) {
98
- const stated = true,
99
- assignments = null,
100
- satisfiesAssertionVerifies = this.satisfiesAssertion.validate(assignments, stated, context);
96
+ if (statementValidates) {
97
+ const statementUnifies = unifyStatements.some((unifyStatement) => {
98
+ const statementUnifies = unifyStatement(this.statement, this.reference, this.satisfiesAssertion, substitutions, context);
99
+
100
+ if (statementUnifies) {
101
+ return true;
102
+ }
103
+ });
104
+
105
+ if (statementUnifies) {
106
+ const { Step } = elements,
107
+ step = Step.fromStatement(this.statement, context),
108
+ stepOrSubproof = step; ///
109
+
110
+ context.addStepOrSubproof(stepOrSubproof);
111
+
112
+ this.setContext(context);
101
113
 
102
- if (satisfiesAssertionVerifies) {
103
- validates = true;
114
+ verifies = true;
115
+ }
104
116
  }
105
- } else {
106
- validates = true;
107
117
  }
108
118
  }
109
- } else {
110
- context.debug(`Cannot validate the '${stepString}' step because it is nonsense.`, this.node);
111
119
  }
112
120
 
113
- if (validates) {
114
- this.context = context;
115
-
116
- context.debug(`...verified the '${stepString}' step.`, this.node);
121
+ if (verifies) {
122
+ context.debug(`...verified the '${stepString}' step.`, node);
117
123
  }
118
124
 
119
- return validates;
125
+ return verifies;
120
126
  }
121
127
 
122
- unify(substitutions, context) {
123
- let unifies;
128
+ verifyReference(context) {
129
+ let referenceVeriries;
124
130
 
125
- context = this.context;
131
+ const node = this.getNode(),
132
+ stepString = this.getString(); ///
126
133
 
127
- const stepString = this.string; ///
134
+ context.trace(`Verifying the '${stepString}' step's reference... `, node);
128
135
 
129
- context.trace(`Unifying the '${stepString}' step...`, this.node);
136
+ if (this.reference !== null) {
137
+ referenceVeriries = this.reference.verify(context);
138
+ } else {
139
+ referenceVeriries = true;
140
+ }
130
141
 
131
- unifies = unifyMixins.some((unifyMixin) => {
132
- const unifies = unifyMixin(this.statement, this.reference, this.satisfiesAssertion, substitutions, context);
142
+ if (referenceVeriries) {
143
+ context.debug(`...verified the '${stepString}' step's reference. `, node);
144
+ }
133
145
 
134
- if (unifies) {
135
- return true;
136
- }
137
- });
146
+ return referenceVeriries;
147
+ }
148
+
149
+ verifySatisfiesAssertion(context) {
150
+ let satisfiesAssertionVerifies;
151
+
152
+ const node = this.getNode(),
153
+ stepString = this.getString(); ///
138
154
 
139
- if (unifies) {
140
- context.debug(`...unified the '${stepString}' step.`, this.node);
155
+ context.trace(`Verifying the '${stepString}' step's satisfies assertion... `, node);
156
+
157
+ if (this.satisfiesAssertion !== null) {
158
+ const stated = true,
159
+ assignments = null;
160
+
161
+ satisfiesAssertionVerifies = this.satisfiesAssertion.validate(assignments, stated, context);
162
+ } else {
163
+ satisfiesAssertionVerifies = true;
141
164
  }
142
165
 
143
- return unifies;
166
+ if (satisfiesAssertionVerifies) {
167
+ context.debug(`...verified the '${stepString}' step's satisfies assertion. `, node);
168
+ }
169
+
170
+ return satisfiesAssertionVerifies;
144
171
  }
145
172
 
146
- equateWithStatement(statement, context) {
147
- let statementEquates;
173
+ compareStatment(statement, context) {
174
+ let comparesToStatement;
148
175
 
149
176
  const leftStatement = statement, ///
150
177
  rightStatement = this.statement, ///
@@ -152,9 +179,9 @@ export default define(class Step extends Element {
152
179
  rightStatementNode = rightStatement.getNode(),
153
180
  statementsEquate = equateStatements(leftStatementNode, rightStatementNode, context);
154
181
 
155
- statementEquates = statementsEquate; ///
182
+ comparesToStatement = statementsEquate; ///
156
183
 
157
- return statementEquates;
184
+ return comparesToStatement;
158
185
  }
159
186
 
160
187
  unifyWithSatisfiesAssertion(satisfiesAssertion, context) {
@@ -191,4 +218,15 @@ export default define(class Step extends Element {
191
218
  }
192
219
 
193
220
  static name = "Step";
221
+
222
+ static fromStatement(statement, context) {
223
+ const statementString = statement.getString(),
224
+ stepString = statementString, ///
225
+ string = `${stepString}
226
+ `,
227
+ stepNode = instantiateStep(string, context),
228
+ step = stepFromStepNode(stepNode, context);
229
+
230
+ return step;;
231
+ }
194
232
  });
@@ -32,19 +32,15 @@ export default define(class SubDerivation extends Element {
32
32
 
33
33
  verifies = this.stepsOrSubproofs.every((stepOrSubproof) => { ///
34
34
  const assignments = [],
35
- stepOrSubproofValidates = stepOrSubproof.validate(substitutions, assignments, context);
35
+ stepOrSubproofVarifies = stepOrSubproof.verify(substitutions, assignments, context);
36
36
 
37
- if (stepOrSubproofValidates) {
38
- const stepOrSubproofUnifies = stepOrSubproof.unify(substitutions, context);
37
+ if (stepOrSubproofVarifies) {
38
+ const assignmentsAssigned = assignAssignments(assignments, context);
39
39
 
40
- if (stepOrSubproofUnifies) {
41
- const assignmentsAssigned = assignAssignments(assignments, context);
40
+ if (assignmentsAssigned) {
41
+ context.addStepOrSubproof(stepOrSubproof);
42
42
 
43
- if (assignmentsAssigned) {
44
- context.addStepOrSubproof(stepOrSubproof);
45
-
46
- return true;
47
- }
43
+ return true;
48
44
  }
49
45
  }
50
46
  });
@@ -46,16 +46,8 @@ export default define(class Subproof extends Element {
46
46
  return sStep;
47
47
  }
48
48
 
49
- unify(substitutions, context) {
50
- let unifies;
51
-
52
- unifies = true; ///
53
-
54
- return unifies;
55
- }
56
-
57
49
  verify(substitutions, assignments, context) {
58
- let subproofVerifies = false;
50
+ let verifies = false;
59
51
 
60
52
  const localContext = LocalContext.fromNothing(context); ///
61
53
 
@@ -73,14 +65,14 @@ export default define(class Subproof extends Element {
73
65
  const subDerivationVerifies = this.subDerivation.verify(substitutions, context);
74
66
 
75
67
  if (subDerivationVerifies) {
76
- subproofVerifies = true;
68
+ verifies = true;
77
69
  }
78
70
  }
79
71
 
80
- return subproofVerifies;
72
+ return verifies;
81
73
  }
82
74
 
83
- equateWithStatement(statement, context) {
75
+ compareStatement(statement, context) {
84
76
  const statementUnifies = false;
85
77
 
86
78
  return statementUnifies;
@@ -33,8 +33,6 @@ export default define(class FrameSubstitution extends Substitution {
33
33
 
34
34
  isMetavariableEqualToMetavariable(metavariable) { return this.metavariable.isEqualTo(metavariable); }
35
35
 
36
- matchParameter(parameter) { return this.metavariable.matchParameter(parameter); }
37
-
38
36
  verify(context) {
39
37
  let verifies = false;
40
38
 
@@ -22,11 +22,7 @@ export default define(class ReferenceSubstitution extends Substitution {
22
22
  return this.metavariable;
23
23
  }
24
24
 
25
- isReferenceEqualToReference(reference) {
26
- const referenceEqualToReference = this.reference.isEqualTo(reference);
27
-
28
- return referenceEqualToReference;
29
- }
25
+ isReferenceEqualToReference(reference) { return this.reference.isEqualTo(reference); }
30
26
 
31
27
  static name = "ReferenceSubstitution";
32
28
 
@@ -43,18 +43,16 @@ export default define(class StatementSubstitution extends Substitution {
43
43
  return replacementNode;
44
44
  }
45
45
 
46
- isSimple() {
47
- const simple = (this.substitution === null);
48
-
49
- return simple;
46
+ setStatement(statement) {
47
+ this.statement = statement;
50
48
  }
51
49
 
52
- isStatementEqualToStatement(statement, context) {
53
- statement = stripBracketsFromStatement(statement, context); ///
54
-
55
- const statementEqualToStatement = this.statement.isEqualTo(statement);
50
+ setMetavariable(metavariable) {
51
+ this.metavariable = metavariable;
52
+ }
56
53
 
57
- return statementEqualToStatement;
54
+ setSubstitution(substitution) {
55
+ this.substitution = substitution;
58
56
  }
59
57
 
60
58
  isMetavariableEqualToMetavariable(metavariable) { return this.metavariable.isEqualTo(metavariable); }
@@ -75,7 +73,19 @@ export default define(class StatementSubstitution extends Substitution {
75
73
  return substitutionEqualToSubstitution;
76
74
  }
77
75
 
78
- matchParameter(parameter) { return this.metavariable.matchParameter(parameter); }
76
+ isStatementEqualToStatement(statement, context) {
77
+ statement = stripBracketsFromStatement(statement, context); ///
78
+
79
+ const statementEqualToStatement = this.statement.isEqualTo(statement);
80
+
81
+ return statementEqualToStatement;
82
+ }
83
+
84
+ isSimple() {
85
+ const simple = (this.substitution === null);
86
+
87
+ return simple;
88
+ }
79
89
 
80
90
  unifyStatement(statement, context) {
81
91
  let substitution = null;
@@ -205,8 +215,17 @@ export default define(class StatementSubstitution extends Substitution {
205
215
  statement = stripBracketsFromStatement(statement, context); ///
206
216
 
207
217
  const string = stringFromStatementAndMetavariable(statement, metavariable),
208
- statementSubstitutionNode = instantiateStatementSubstitution(string, context),
209
- statementSubstitution = statementSubstitutionFromStatementSubstitutionNode(statementSubstitutionNode, context);
218
+ statementSubstitutionNode = instantiateStatementSubstitution(string, context);
219
+
220
+ context = {
221
+ nodeAsString: () => string
222
+ };
223
+
224
+ const statementSubstitution = statementSubstitutionFromStatementSubstitutionNode(statementSubstitutionNode, context);
225
+
226
+ statementSubstitution.setStatement(statement);
227
+
228
+ statementSubstitution.setMetavariable(metavariable);
210
229
 
211
230
  return statementSubstitution;
212
231
  }
@@ -215,8 +234,19 @@ export default define(class StatementSubstitution extends Substitution {
215
234
  statement = stripBracketsFromStatement(statement, context); ///
216
235
 
217
236
  const string = stringFromStatementMetavariableAndSubstitution(statement, metavariable, substitution, context),
218
- statementSubstitutionNode = instantiateStatementSubstitution(string, context),
219
- statementSubstitution = statementSubstitutionFromStatementSubstitutionNode(statementSubstitutionNode, substitution, context);
237
+ statementSubstitutionNode = instantiateStatementSubstitution(string, context);
238
+
239
+ context = {
240
+ nodeAsString: () => string
241
+ };
242
+
243
+ const statementSubstitution = statementSubstitutionFromStatementSubstitutionNode(statementSubstitutionNode, context);
244
+
245
+ statementSubstitution.setStatement(statement);
246
+
247
+ statementSubstitution.setMetavariable(metavariable);
248
+
249
+ statementSubstitution.setSubstitution(substitution);
220
250
 
221
251
  return statementSubstitution;
222
252
  }
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
 
3
- import elements from "../../elements";
4
3
  import Substitution from "../substitution";
5
4
 
6
5
  import { define } from "../../elements";
@@ -31,28 +30,26 @@ export default define(class TermSubstitution extends Substitution {
31
30
  return replacementNode;
32
31
  }
33
32
 
33
+ isTermEqualToTerm(term, context) {
34
+ term = stripBracketsFromTerm(term, context); ///
35
+
36
+ const termEqualToTerm = this.term.isEqualTo(term);
37
+
38
+ return termEqualToTerm;
39
+ }
40
+
34
41
  isTrivial() {
35
42
  let trivial = false;
36
43
 
37
- const termEqualToVariable = this.term.isEqualToVariable(this.variable);
44
+ const termComparesToVaraible = this.term.compareVariable(this.variable);
38
45
 
39
- if (termEqualToVariable) {
46
+ if (termComparesToVaraible) {
40
47
  trivial = true;
41
48
  }
42
49
 
43
50
  return trivial;
44
51
  }
45
52
 
46
- isTermEqualToTerm(term, context) {
47
- term = stripBracketsFromTerm(term, context); ///
48
-
49
- const termEqualToTerm = this.term.isEqualTo(term);
50
-
51
- return termEqualToTerm;
52
- }
53
-
54
- matchParameter(parameter) { return this.variable.matchParameter(parameter); }
55
-
56
53
  verify(context) {
57
54
  let verifies = false;
58
55
 
@@ -110,14 +110,12 @@ export default class Substitution extends Element {
110
110
  return substitutionEqualToSubstitution;
111
111
  }
112
112
 
113
- matchParameter(parameter) {
114
- const parameterMatches = false;
113
+ compareParameter(parameter) {
114
+ const comparesToParameter = false;
115
115
 
116
- return parameterMatches;
116
+ return comparesToParameter;
117
117
  }
118
118
 
119
- matchSubstitutionNode(substitutionNode) { return this.node.match(substitutionNode); }
120
-
121
119
  resolve(substitutions, context) {
122
120
  const resolved = true;
123
121
 
@@ -6,6 +6,7 @@ import Element from "../element";
6
6
 
7
7
  import { define } from "../elements";
8
8
  import { EMPTY_STRING } from "../constants";
9
+ import { substitutionsStringFromSubstitutions } from "../utilities/string";
9
10
 
10
11
  const { find, first, clear, prune, filter, compress, correlate } = arrayUtilities;
11
12
 
@@ -25,8 +26,6 @@ export default define(class Substitutions extends Element {
25
26
  return this.savedArray;
26
27
  }
27
28
 
28
- getLength() { return this.array.length; }
29
-
30
29
  getMetavariables() {
31
30
  const metavariables = [];
32
31
 
@@ -75,6 +74,8 @@ export default define(class Substitutions extends Element {
75
74
  return firstSubstitution;
76
75
  }
77
76
 
77
+ getLength() { return this.array.length; }
78
+
78
79
  mapSubstitution(callback) { return this.array.map(callback); }
79
80
 
80
81
  findSubstitution(callback) { return this.array.find(callback) || null; } ///
@@ -200,9 +201,13 @@ export default define(class Substitutions extends Element {
200
201
  addSubstitution(substitution, context) {
201
202
  this.array.push(substitution);
202
203
 
203
- const substitutionString = substitution.getString();
204
+ const string = this.asString(),
205
+ substitutionString = substitution.getString(),
206
+ substitutionsString = string; ///
204
207
 
205
- context.trace(`Added the '${substitutionString}' substitution.`);
208
+ this.setString(string);
209
+
210
+ context.trace(`Added the '${substitutionString}' substitution to the '${substitutionsString}' substitutions.`);
206
211
  }
207
212
 
208
213
  removeSubstitution(substitution, context) {
@@ -216,9 +221,13 @@ export default define(class Substitutions extends Element {
216
221
  }
217
222
  });
218
223
 
219
- const substitutionString = substitution.getString();
224
+ const string = this.asString(),
225
+ substitutionString = substitution.getString(),
226
+ substitutionsString = string; ///
227
+
228
+ this.setString(string);
220
229
 
221
- context.trace(`Removed the '${substitutionString}' substitution.`);
230
+ context.trace(`Removed the '${substitutionString}' substitution from the '${substitutionsString}' substitutions.`);
222
231
  }
223
232
 
224
233
  correlateSubstitutions(substitutions) {
@@ -236,16 +245,6 @@ export default define(class Substitutions extends Element {
236
245
  return correlates;
237
246
  }
238
247
 
239
- removeTrivialSubstitutions() {
240
- filter(this.array, (substitution) => {
241
- const trivial = substitution.isTrivial();
242
-
243
- if (!trivial) {
244
- return true;
245
- }
246
- });
247
- }
248
-
249
248
  clear() {
250
249
  clear(this.array);
251
250
 
@@ -318,6 +317,10 @@ export default define(class Substitutions extends Element {
318
317
  ];
319
318
 
320
319
  this.savedArray = null;
320
+
321
+ const string = this.asString();
322
+
323
+ this.setString(string);
321
324
  }
322
325
 
323
326
  continue() {
@@ -332,15 +335,8 @@ export default define(class Substitutions extends Element {
332
335
  if (length === 0) {
333
336
  string = EMPTY_STRING;
334
337
  } else {
335
- const substitutionsString = this.array.reduce((substitutionsString, substitution) => {
336
- const substitutionString = substitution.getString();
337
-
338
- substitutionsString = (substitutionsString === null) ?
339
- substitutionString :
340
- `${substitutionsString}, ${substitutionString}`;
341
-
342
- return substitutionsString;
343
- }, null);
338
+ const substitutions = this.array, ///
339
+ substitutionsString = substitutionsStringFromSubstitutions(substitutions);
344
340
 
345
341
  string = substitutionsString; ///
346
342
  }
@@ -349,16 +345,38 @@ export default define(class Substitutions extends Element {
349
345
  }
350
346
 
351
347
  static fromArray(array) {
352
- const savedArray = [],
353
- substitutions = new Substitutions(array, savedArray);
348
+ let string;
349
+
350
+ const context = null;
351
+
352
+ string = null;
353
+
354
+ const node = null,
355
+ savedArray = [],
356
+ substitutions = new Substitutions(context, string, node, array, savedArray);
357
+
358
+ string = substitutions.asString();
359
+
360
+ substitutions.setString(string);
354
361
 
355
362
  return substitutions;
356
363
  }
357
364
 
358
365
  static fromNothing() {
359
- const array = [],
360
- savedArray = null,
361
- substitutions = new Substitutions(array, savedArray);
366
+ let string;
367
+
368
+ const context = null;
369
+
370
+ string = null;
371
+
372
+ const node = null,
373
+ array = [],
374
+ savedArray = [],
375
+ substitutions = new Substitutions(context, string, node, array, savedArray);
376
+
377
+ string = substitutions.asString();
378
+
379
+ substitutions.setString(string);
362
380
 
363
381
  return substitutions;
364
382
  }