occam-verify-cli 0.0.677 → 0.0.679

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 (125) hide show
  1. package/bin/action/verify.js +14 -4
  2. package/lib/conclusion.js +10 -5
  3. package/lib/consequent.js +8 -3
  4. package/lib/context/file.js +74 -4
  5. package/lib/context/release.js +7 -2
  6. package/lib/equality.js +16 -16
  7. package/lib/premise.js +12 -7
  8. package/lib/supposition.js +9 -4
  9. package/lib/type.js +3 -8
  10. package/lib/utilities/string.js +26 -13
  11. package/lib/verifier/node/metastatement.js +173 -0
  12. package/lib/verifier/node/statementAsCombinator.js +186 -0
  13. package/lib/verifier/node/termAsConstructor.js +224 -0
  14. package/lib/verifier/node.js +158 -0
  15. package/lib/verifier/{metastatementForMetavariable → nodes/metastatementForMetavariable}/conclusion.js +13 -12
  16. package/lib/verifier/{metastatementForMetavariable → nodes/metastatementForMetavariable}/premise.js +13 -12
  17. package/lib/verifier/nodes/metastatementForMetavariable.js +198 -0
  18. package/lib/verifier/nodes/statement.js +199 -0
  19. package/lib/verifier/{statementForMetavariable → nodes/statementForMetavariable}/conclusion.js +13 -12
  20. package/lib/verifier/{statementForMetavariable → nodes/statementForMetavariable}/premise.js +13 -12
  21. package/lib/verifier/nodes/statementForMetavariable.js +203 -0
  22. package/lib/verifier/nodes/term.js +212 -0
  23. package/lib/verifier/{termForVariable/supposition.js → nodes/termForVariable/consequent.js} +13 -12
  24. package/lib/verifier/{termForVariable/consequent.js → nodes/termForVariable/supposition.js} +13 -12
  25. package/lib/verifier/nodes/termForVariable.js +209 -0
  26. package/lib/verifier/nodes.js +175 -0
  27. package/lib/verify/assertion/type.js +20 -10
  28. package/lib/verify/axiom.js +3 -3
  29. package/lib/verify/conclusion.js +3 -3
  30. package/lib/verify/conjecture.js +3 -3
  31. package/lib/verify/consequent.js +3 -3
  32. package/lib/verify/declaration/combinator.js +7 -2
  33. package/lib/verify/declaration/constructor.js +8 -2
  34. package/lib/verify/declaration/metavariable.js +7 -2
  35. package/lib/verify/declaration/type.js +7 -2
  36. package/lib/verify/declaration/variable.js +8 -2
  37. package/lib/verify/file.js +3 -3
  38. package/lib/verify/label.js +9 -4
  39. package/lib/verify/lemma.js +3 -3
  40. package/lib/verify/metastatement/qualified.js +5 -6
  41. package/lib/verify/metastatement/unqualified.js +9 -7
  42. package/lib/verify/metastatement.js +34 -157
  43. package/lib/verify/metavariable.js +6 -4
  44. package/lib/verify/premise.js +3 -3
  45. package/lib/verify/release.js +3 -3
  46. package/lib/verify/rule.js +3 -3
  47. package/lib/verify/statement/qualified.js +5 -6
  48. package/lib/verify/statement/unqualified.js +9 -7
  49. package/lib/verify/statement.js +112 -317
  50. package/lib/verify/statementAsCombinator.js +8 -82
  51. package/lib/verify/supposition.js +3 -3
  52. package/lib/verify/term.js +69 -213
  53. package/lib/verify/termAsConstructor.js +15 -89
  54. package/lib/verify/theorem.js +3 -3
  55. package/lib/verify/type.js +7 -5
  56. package/lib/verify/typeInference.js +5 -5
  57. package/lib/verify/variable.js +7 -5
  58. package/package.json +5 -5
  59. package/src/conclusion.js +5 -4
  60. package/src/consequent.js +3 -2
  61. package/src/context/file.js +11 -4
  62. package/src/context/release.js +9 -2
  63. package/src/equality.js +10 -10
  64. package/src/premise.js +7 -6
  65. package/src/supposition.js +4 -3
  66. package/src/type.js +3 -8
  67. package/src/utilities/string.js +34 -23
  68. package/src/verifier/node/metastatement.js +57 -0
  69. package/src/verifier/node/statementAsCombinator.js +80 -0
  70. package/src/verifier/node/termAsConstructor.js +124 -0
  71. package/src/verifier/node.js +85 -0
  72. package/src/verifier/nodes/metastatementForMetavariable/conclusion.js +11 -0
  73. package/src/verifier/nodes/metastatementForMetavariable/premise.js +11 -0
  74. package/src/verifier/{metastatementForMetavariable.js → nodes/metastatementForMetavariable.js} +6 -6
  75. package/src/verifier/nodes/statement.js +98 -0
  76. package/src/verifier/nodes/statementForMetavariable/conclusion.js +11 -0
  77. package/src/verifier/nodes/statementForMetavariable/premise.js +11 -0
  78. package/src/verifier/{statementForMetavariable.js → nodes/statementForMetavariable.js} +10 -10
  79. package/src/verifier/nodes/term.js +111 -0
  80. package/src/verifier/nodes/termForVariable/consequent.js +11 -0
  81. package/src/verifier/nodes/termForVariable/supposition.js +11 -0
  82. package/src/verifier/{termForVariable.js → nodes/termForVariable.js} +9 -9
  83. package/src/verifier/nodes.js +111 -0
  84. package/src/verify/assertion/type.js +25 -9
  85. package/src/verify/axiom.js +2 -2
  86. package/src/verify/conclusion.js +2 -2
  87. package/src/verify/conjecture.js +2 -2
  88. package/src/verify/consequent.js +2 -2
  89. package/src/verify/declaration/combinator.js +9 -1
  90. package/src/verify/declaration/constructor.js +15 -1
  91. package/src/verify/declaration/metavariable.js +9 -1
  92. package/src/verify/declaration/type.js +14 -1
  93. package/src/verify/declaration/variable.js +15 -1
  94. package/src/verify/file.js +2 -2
  95. package/src/verify/label.js +10 -2
  96. package/src/verify/lemma.js +4 -4
  97. package/src/verify/metastatement/qualified.js +4 -6
  98. package/src/verify/metastatement/unqualified.js +9 -7
  99. package/src/verify/metastatement.js +32 -57
  100. package/src/verify/metavariable.js +6 -3
  101. package/src/verify/premise.js +2 -2
  102. package/src/verify/release.js +2 -2
  103. package/src/verify/rule.js +2 -2
  104. package/src/verify/statement/qualified.js +4 -6
  105. package/src/verify/statement/unqualified.js +9 -7
  106. package/src/verify/statement.js +159 -283
  107. package/src/verify/statementAsCombinator.js +9 -129
  108. package/src/verify/supposition.js +2 -2
  109. package/src/verify/term.js +94 -159
  110. package/src/verify/termAsConstructor.js +20 -135
  111. package/src/verify/theorem.js +2 -2
  112. package/src/verify/type.js +7 -4
  113. package/src/verify/typeInference.js +4 -4
  114. package/src/verify/variable.js +7 -4
  115. package/lib/verifier/metastatementForMetavariable.js +0 -198
  116. package/lib/verifier/statementForMetavariable.js +0 -203
  117. package/lib/verifier/termForVariable.js +0 -209
  118. package/lib/verifier.js +0 -138
  119. package/src/verifier/metastatementForMetavariable/conclusion.js +0 -9
  120. package/src/verifier/metastatementForMetavariable/premise.js +0 -9
  121. package/src/verifier/statementForMetavariable/conclusion.js +0 -9
  122. package/src/verifier/statementForMetavariable/premise.js +0 -9
  123. package/src/verifier/termForVariable/consequent.js +0 -9
  124. package/src/verifier/termForVariable/supposition.js +0 -9
  125. package/src/verifier.js +0 -74
@@ -1,189 +1,58 @@
1
1
  "use strict";
2
2
 
3
- import Verifier from "../verifier";
4
3
  import Equality from "../equality";
5
4
  import verifyTerm from "../verify/term";
6
5
  import equalityCombinator from "../ocmbinator/equality";
7
6
  import bracketedCombinator from "../ocmbinator/bracketed";
8
7
  import verifyTypeInference from "../verify/typeInference";
9
8
  import verifyTypeAssertion from "../verify/assertion/type";
9
+ import statementNodesVerifier from "../verifier/nodes/statement";
10
10
 
11
- import { objectType } from "../type";
12
- import { termVerifier } from "../verify/term";
11
+ import { nodeQuery } from "../utilities/query";
13
12
  import { first, second } from "../utilities/array";
14
- import { OBJECT_TYPE_NAME } from "../typeNames";
15
- import { STATEMENT_META_TYPE } from "../metaTypes";
16
- import { verifyTermAsVariable } from "../verify/term";
17
- import { nodeQuery, typeNameFromTypeNode } from "../utilities/query";
18
- import { ARGUMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../ruleNames";
19
-
20
- const termNodeQuery = nodeQuery("/argument/term!"),
21
- typeNodeQuery = nodeQuery("/argument/type!"),
22
- metaTypeNodeQuery = nodeQuery("/metaArgument/metaType!"),
23
- statementNodeQuery = nodeQuery("/metaArgument/statement!"),
24
- typeInferenceNodeQuery = nodeQuery("/statement/typeInference!"),
25
- typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!"),
26
- metaTypeTerminalNodeQuery = nodeQuery("/metaType/@meta-type");
27
-
28
- class StatementVerifier extends Verifier {
29
- verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context) {
30
- let nonTerminalNodeVerified = false;
31
-
32
- const nonTerminalNode = nonTerminalNodeA, ///
33
- combinatorNonTerminalNode = nonTerminalNodeB; ///
34
-
35
- const ruleName = nonTerminalNode.getRuleName(), ///
36
- combinatorRuleName = combinatorNonTerminalNode.getRuleName(); ///
37
-
38
- if (ruleName === combinatorRuleName) {
39
- switch (ruleName) {
40
- case ARGUMENT_RULE_NAME: {
41
- const argumentNode = nonTerminalNode, ///
42
- constructorArgumentNode = combinatorNonTerminalNode, ///
43
- argumentNodeVerified = termVerifier.verifyArgumentNode(argumentNode, constructorArgumentNode, context);
44
-
45
- nonTerminalNodeVerified = argumentNodeVerified; ///
46
-
47
- break;
48
- }
49
-
50
- case META_ARGUMENT_RULE_NAME: {
51
- const metaArgumentNode = nonTerminalNode, ///
52
- combinatorMetaargumentNode = combinatorNonTerminalNode, ///
53
- metaArgumentNodeVerified = this.verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, context);
54
-
55
- nonTerminalNodeVerified = metaArgumentNodeVerified; ///
56
-
57
- break;
58
- }
59
-
60
- default: {
61
- const childNodes = nonTerminalNode.getChildNodes(),
62
- combinatorChildNodes = combinatorNonTerminalNode.getChildNodes(),
63
- nodesA = childNodes, ///
64
- nodesB = combinatorChildNodes, ///
65
- nodesVerified = this.verifyNodes(nodesA, nodesB, context);
66
-
67
- nonTerminalNodeVerified = nodesVerified; ///
68
-
69
- break;
70
- }
71
- }
72
- }
73
-
74
- return nonTerminalNodeVerified;
75
- }
76
-
77
- verifyArgumentNode(argumentNode, combinatorArgumentNode, context) {
78
- let argumentNodeVerified = false;
79
-
80
- const termNode = termNodeQuery(argumentNode);
81
-
82
- if (termNode === null) {
83
- const argumentString = context.nodeAsString(argumentNode);
84
-
85
- context.error(`The '${argumentString}' argument should be a term, not a type`, argumentNode);
86
- } else {
87
- const types = [],
88
- termVerified = verifyTerm(termNode, types, context);
89
-
90
- if (termVerified) {
91
- const firstType = first(types),
92
- termType = firstType, ///
93
- typeNode = typeNodeQuery(combinatorArgumentNode),
94
- typeName = typeNameFromTypeNode(typeNode),
95
- type = (typeName === OBJECT_TYPE_NAME) ?
96
- objectType : ///
97
- context.findTypeByTypeName(typeName),
98
- statementTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(type);
99
-
100
- if (statementTypeEqualToOrSubTypeOfType) {
101
- argumentNodeVerified = true;
102
- }
103
- }
104
- }
105
-
106
- return argumentNodeVerified;
107
- }
108
-
109
- verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, context) {
110
- let metaArgumentNodeVerified = false;
111
-
112
- const statementNode = statementNodeQuery(metaArgumentNode),
113
- combinatorMetaTYpeNode = metaTypeNodeQuery(combinatorMetaargumentNode);
114
13
 
115
- if (statementNode === null) {
116
- const metaArgumentString = context.nodeAsString(metaArgumentNode);
117
-
118
- context.error(`Expected a statement but got a '${metaArgumentString}' meta-type.`, metaArgumentNode);
119
- } else {
120
- if (combinatorMetaTYpeNode === null) {
121
- const combinatorMetaargumentString = context.nodeAsString(combinatorMetaargumentNode);
122
-
123
- context.error(`Expected a meta-type but got a '${combinatorMetaargumentString}' statement.`, metaArgumentNode);
124
- } else {
125
- const combinatorMetaTypeTerminalNode = metaTypeTerminalNodeQuery(combinatorMetaTYpeNode),
126
- content = combinatorMetaTypeTerminalNode.getContent(),
127
- contentStatementMetaType = (content === STATEMENT_META_TYPE);
128
-
129
- if (!contentStatementMetaType) {
130
- context.error(`Expected the meta-type to be 'Statement' but got '${content}'.`, metaArgumentNode);
131
- } else {
132
- metaArgumentNodeVerified = true;
133
- }
134
- }
135
- }
136
-
137
- return metaArgumentNodeVerified;
138
- }
139
- }
140
-
141
- export const statementVerifier = new StatementVerifier();
14
+ const leftTermNodeQuery = nodeQuery("/statement/argument[0]/term!"),
15
+ rightTermNodeQuery = nodeQuery("/statement/argument[1]/term!"),
16
+ typeInferenceNodeQuery = nodeQuery("/statement/typeInference!"),
17
+ typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!");
142
18
 
143
- export default function verifyStatement(statementNode, assignments, derived, context) {
144
- let statementVerified = false;
19
+ function verifyStatement(statementNode, assignments, derived, context, verifyAhead) {
20
+ let statementVerified;
145
21
 
146
22
  const statementString = context.nodeAsString(statementNode);
147
23
 
148
- context.debug(`Verifying the '${statementString}' statement...`, statementNode);
149
-
150
- if (!statementVerified) {
151
- const statementVerifiedAgainstCombinators = verifyStatementAgainstCombinators(statementNode, context);
152
-
153
- statementVerified = statementVerifiedAgainstCombinators; ///
154
- }
155
-
156
- if (!statementVerified) {
157
- const statementVerifiedAsTypeInference = verifyStatementAsTypeInference(statementNode, derived, context);
24
+ context.trace(`Verifying the '${statementString}' statement...`, statementNode);
158
25
 
159
- statementVerified = statementVerifiedAsTypeInference; ///
160
- }
161
-
162
- if (!statementVerified) {
163
- const statementVerifiedAsTypeAssertion = verifyStatementAsTypeAssertion(statementNode, assignments, derived, context);
164
-
165
- statementVerified = statementVerifiedAsTypeAssertion; ///
166
- }
26
+ const verifyStatementFunctions = [
27
+ verifyStatementAsEquality,
28
+ verifyStatementAsTypeInference,
29
+ verifyStatementAsTypeAssertion,
30
+ verifyStatementAgainstCombinators
31
+ ];
167
32
 
168
- if (!statementVerified) {
169
- const statementVerifiedAsEquality = verifyStatementAsEquality(statementNode, derived, context);
33
+ statementVerified = verifyStatementFunctions.some((verifyStatementFunction) => {
34
+ const statementVerified = verifyStatementFunction(statementNode, assignments, derived, context, verifyAhead);
170
35
 
171
- statementVerified = statementVerifiedAsEquality; //
172
- }
36
+ if (statementVerified) {
37
+ return true;
38
+ }
39
+ });
173
40
 
174
41
  if (statementVerified) {
175
- context.debug(`Verified the '${statementString}' statement.`, statementNode);
42
+ context.debug(`...verified the '${statementString}' statement.`, statementNode);
176
43
  }
177
44
 
178
45
  return statementVerified;
179
46
  }
180
47
 
181
- export function verifyStatementAgainstCombinators(statementNode, context) {
182
- let statementVerifiedAgainstCombinators = false;
48
+ Object.assign(verifyStatement, {
49
+ statementNodesVerifier
50
+ });
183
51
 
184
- const statementString = context.nodeAsString(statementNode);
52
+ export default verifyStatement;
185
53
 
186
- context.trace(`Verifying the '${statementString}' statement against combinators.`, statementNode);
54
+ export function verifyStatementAgainstCombinators(statementNode, assignments, derived, context, verifyAhead) {
55
+ let statementVerifiedAgainstCombinators;
187
56
 
188
57
  let combinators = context.getCombinators();
189
58
 
@@ -192,186 +61,193 @@ export function verifyStatementAgainstCombinators(statementNode, context) {
192
61
  ...combinators
193
62
  ];
194
63
 
195
- const combinator = combinators.find((combinator, index) => {
196
- const statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
64
+ statementVerifiedAgainstCombinators = combinators.some((combinator) => {
65
+ const statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context, verifyAhead);
197
66
 
198
67
  if (statementVerifiedAgainstCombinator) {
199
68
  return true;
200
69
  }
201
- }) || null;
202
-
203
- if (combinator !== null) {
204
- statementVerifiedAgainstCombinators = true;
205
- }
70
+ });
206
71
 
207
72
  return statementVerifiedAgainstCombinators;
208
73
  }
209
74
 
210
- export function verifyStatementAgainstCombinator(statementNode, combinator, context) {
75
+ export function verifyStatementAgainstCombinator(statementNode, combinator, context, verifyAhead) {
76
+ let statementVerifiedAgainstCombinator;
77
+
211
78
  const statementString = context.nodeAsString(statementNode),
212
79
  combinatorString = combinator.getString();
213
80
 
214
- context.trace(`Verifying the '${statementString}' statement against the '${combinatorString}' combinator.`, statementNode);
81
+ context.trace(`Verifying the '${statementString}' statement against the '${combinatorString}' combinator...`, statementNode);
215
82
 
216
83
  const combinatorStatementNode = combinator.getStatementNode(),
217
84
  nonTerminalNodeA = statementNode, ///
218
85
  nonTerminalNodeB = combinatorStatementNode, ///
219
- nonTerminalNodeVerified = statementVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context),
220
- statementVerifiedAgainstCombinator = nonTerminalNodeVerified; ///
86
+ nonTerminalNodeVerified = statementNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context, verifyAhead);
87
+
88
+ statementVerifiedAgainstCombinator = nonTerminalNodeVerified; ///
89
+
90
+ if (statementVerifiedAgainstCombinator) {
91
+ context.debug(`...verified the '${statementString}' statement against the '${combinatorString}' combinator.`, statementNode);
92
+ }
221
93
 
222
94
  return statementVerifiedAgainstCombinator;
223
95
  }
224
96
 
225
- function verifyStatementAsTypeInference(statementNode, derived, context) {
97
+ function verifyStatementAsTypeInference(statementNode, assignments, derived, context, verifyAhead) {
226
98
  let statementVerifiedAsTypeInference = false;
227
99
 
100
+ const statementString = context.nodeAsString(statementNode);
101
+
102
+ context.trace(`Verifying the '${statementString}' statement as a type inference...`, statementNode);
103
+
228
104
  const typeInferenceNode = typeInferenceNodeQuery(statementNode);
229
105
 
230
106
  if (typeInferenceNode !== null) {
231
107
  if (!derived) {
232
108
  const typeInferenceString = context.nodeAsString(typeInferenceNode);
233
109
 
234
- context.error(`The '${typeInferenceString}' type inference can only be derived.`, typeInferenceNode);
110
+ context.info(`The '${typeInferenceString}' type inference can only be derived.`, typeInferenceNode);
235
111
  } else {
236
- const typeInferenceVerified = verifyTypeInference(typeInferenceNode, context);
112
+ const typeInferenceVerified = verifyTypeInference(typeInferenceNode, context, verifyAhead);
237
113
 
238
114
  statementVerifiedAsTypeInference = typeInferenceVerified; ///
239
115
  }
240
116
  }
241
117
 
118
+ if (statementVerifiedAsTypeInference) {
119
+ context.debug(`...verified the '${statementString}' statement as a type inference.`, statementNode);
120
+ }
121
+
242
122
  return statementVerifiedAsTypeInference;
243
123
  }
244
124
 
245
- function verifyStatementAsTypeAssertion(statementNode, assignments, derived, context) {
125
+ function verifyStatementAsTypeAssertion(statementNode, assignments, derived, context, verifyAhead) {
246
126
  let statementVerifiedAsTypeAssertion = false;
247
127
 
128
+ const statementString = context.nodeAsString(statementNode);
129
+
130
+ context.trace(`Verifying the '${statementString}' statement as a type assertion...`, statementNode);
131
+
248
132
  const typeAssertionNode = typeAssertionNodeQuery(statementNode);
249
133
 
250
134
  if (typeAssertionNode !== null) {
251
- const typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assignments, derived, context);
135
+ const typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assignments, derived, context, verifyAhead);
252
136
 
253
137
  statementVerifiedAsTypeAssertion = typeAssertionVerified; ///
254
138
  }
255
139
 
140
+ if (statementVerifiedAsTypeAssertion) {
141
+ context.debug(`...verified the '${statementString}' statement as a type assertion.`, statementNode);
142
+ }
143
+
256
144
  return statementVerifiedAsTypeAssertion;
257
145
  }
258
146
 
259
- function verifyStatementAsEquality(statementNode, derived, context) {
260
- let statementVerifiedAsEquality = false;
147
+ function verifyStatementAsEquality(statementNode, assignments, derived, context, verifyAhead) {
148
+ let statementVerifiedAsEquality;
149
+
150
+ const statementString = context.nodeAsString(statementNode);
151
+
152
+ context.trace(`Verifying the '${statementString}' statement as an equality...`, statementNode);
261
153
 
262
154
  const combinator = equalityCombinator, ///
263
- statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
155
+ statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context, () => {
156
+ let verifiedAhead;
264
157
 
265
- if (statementVerifiedAgainstCombinator) {
266
- const equality = Equality.fromStatementNode(statementNode);
158
+ const verifyStatementAsEqualityFunctions = [
159
+ verifyStatementAsDerivedEquality,
160
+ verifyStatementAsEqualTerms
161
+ ];
267
162
 
268
- if (derived) {
269
- const equalities = context.getEqualities(),
270
- equalityVerified = equality.verify(equalities, context);
163
+ verifiedAhead = verifyStatementAsEqualityFunctions.some((verifyStatementAsEqualityFunction) => {
164
+ const statementVerified = verifyStatementAsEqualityFunction(statementNode, derived, context, verifyAhead);
271
165
 
272
- statementVerifiedAsEquality = equalityVerified; ///
273
- } else {
274
- const variables = [],
275
- leftTermNode = equality.getLeftTermNode(),
276
- rightTermNode = equality.getRightTermNode(),
277
- leftTermVerifiedAsVariable = verifyTermAsVariable(leftTermNode, variables, context),
278
- rightTermVerifiedAsVariable = verifyTermAsVariable(rightTermNode, variables, context);
279
-
280
- if (leftTermVerifiedAsVariable && rightTermVerifiedAsVariable) {
281
- const firstVariable = first(variables),
282
- secondVariable = second(variables),
283
- leftVariable = firstVariable, ///
284
- rightVariable = secondVariable, ///
285
- leftVariableName = leftVariable.getName(),
286
- leftVariableType = leftVariable.getType(),
287
- rightVariableName = rightVariable.getName(),
288
- rightVariableType = rightVariable.getType(),
289
- leftVariableTypeEqualToOrSubTypeOfOfSuperTypeOfRightVariableType = leftVariableType.isEqualToOrSubTypeOfOfSuperTypeOf(rightVariableType);
290
-
291
- if (!leftVariableTypeEqualToOrSubTypeOfOfSuperTypeOfRightVariableType) {
292
- const leftVariableTypeName = leftVariableType.getName(),
293
- rightVariableTypeName = rightVariableType.getName();
294
-
295
- context.error(`The left '${leftVariableName}' variable's '${leftVariableTypeName}' type is not equal to, a sub-type of or a super-type of the right '${rightVariableName}' variable's '${rightVariableTypeName}' type.`, statementNode);
296
- } else {
297
- statementVerifiedAsEquality = true;
298
- }
299
- } else if (leftTermVerifiedAsVariable) {
300
- const types = [];
301
-
302
- verifyTerm(rightTermNode, types, context);
303
-
304
- const firstType = first(types),
305
- firstVariable = first(variables),
306
- leftVariable = firstVariable, ///
307
- rightTermType = firstType, ///
308
- leftVariableName = leftVariable.getName(),
309
- leftVariableType = leftVariable.getType(),
310
- leftVariableTypeEqualToOrSuperTypeOfRightTermType = leftVariableType.isEqualToOrSuperTypeOf(rightTermType);
311
-
312
- if (!leftVariableTypeEqualToOrSuperTypeOfRightTermType) {
313
- const rightTermString = context.nodeAsString(rightTermNode),
314
- rightTermTypeName = rightTermType.getName(),
315
- leftVariableTypeName = leftVariableType.getName();
316
-
317
- context.error(`The left '${leftVariableName}' variable's '${leftVariableTypeName}' type is not equal to or a super-type of the right '${rightTermString}' term's '${rightTermTypeName}' type.`, statementNode);
318
- } else {
319
- statementVerifiedAsEquality = true;
320
- }
321
- } else if (rightTermVerifiedAsVariable) {
322
- const types = [];
323
-
324
- verifyTerm(leftTermNode, types, context);
325
-
326
- const firstType = first(types),
327
- firstVariable = first(variables),
328
- leftTermType = firstType, ///
329
- rightVariable = firstVariable, ///
330
- rightVariableName = rightVariable.getName(),
331
- rightVariableType = rightVariable.getType(),
332
- rightVariableTypeEqualToOrSuperTypeOfRightTermType = rightVariableType.isEqualToOrSuperTypeOf(leftTermType);
333
-
334
- if (!rightVariableTypeEqualToOrSuperTypeOfRightTermType) {
335
- const leftTermString = context.nodeAsString(leftTermNode),
336
- leftTermTypeName = leftTermType.getName(),
337
- rightVariableTypeName = rightVariableType.getName();
338
-
339
- context.error(`The right '${rightVariableName}' variable's '${rightVariableTypeName}' type is not equal to or a super-type of the left '${leftTermString}' term's '${leftTermTypeName}' type.`, statementNode);
340
- } else {
341
- statementVerifiedAsEquality = true;
342
- }
343
- } else {
344
- const types = [];
345
-
346
- verifyTerm(leftTermNode, types, context);
347
-
348
- verifyTerm(rightTermNode, types, context);
349
-
350
- const firstType = first(types),
351
- secondType = second(types),
352
- leftTermType = firstType, ///
353
- rightTermType = secondType, ///
354
- leftTermTypeEqualToOrSubTypeOfOfSuperTypeOf = leftTermType.isEqualToOrSubTypeOfOfSuperTypeOf(rightTermType);
355
-
356
- if (!leftTermTypeEqualToOrSubTypeOfOfSuperTypeOf) {
357
- const leftTermString = context.nodeAsString(leftTermNode),
358
- rightTermString = context.nodeAsString(rightTermNode),
359
- leftTermTypeName = leftTermType.getName(),
360
- rightTermTypeName = rightTermType.getName();
361
-
362
- context.error(`The left '${leftTermString}' term's '${leftTermTypeName}' type is not equal to, a sub-type of or a super-type of the right '${rightTermString}' term's '${rightTermTypeName}' type.`, statementNode);
363
- } else {
364
- statementVerifiedAsEquality = true;
365
- }
366
- }
367
- }
368
- }
166
+ if (statementVerified) {
167
+ return true;
168
+ }
169
+ });
369
170
 
370
- if (statementVerifiedAsEquality) {
371
- const statementString = context.nodeAsString(statementNode);
171
+ return verifiedAhead;
172
+ });
173
+
174
+ statementVerifiedAsEquality = statementVerifiedAgainstCombinator; ///
372
175
 
373
- context.info(`Verified the '${statementString}' statement as an equality.`, statementNode);
176
+ if (statementVerifiedAsEquality) {
177
+ context.debug(`...verified the '${statementString}' statement as an equality.`, statementNode);
374
178
  }
375
179
 
376
180
  return statementVerifiedAsEquality;
377
181
  }
182
+
183
+ function verifyStatementAsDerivedEquality(statementNode, derived, context, verifyAhead) {
184
+ let verifiedStatementAsDerivedEquality = false;
185
+
186
+ const statementString = context.nodeAsString(statementNode);
187
+
188
+ context.trace(`Verifying the '${statementString}' statement as a derived equality...`, statementNode);
189
+
190
+ if (derived) {
191
+ const equality = Equality.fromStatementNode(statementNode),
192
+ equalities = context.getEqualities(),
193
+ equalityVerified = equality.verify(equalities, context, verifyAhead);
194
+
195
+ verifiedStatementAsDerivedEquality = equalityVerified; ///
196
+ }
197
+
198
+ if (verifiedStatementAsDerivedEquality) {
199
+ context.debug(`...verified the '${statementString}' statement as a derived equality.`, statementNode);
200
+ }
201
+
202
+ return verifiedStatementAsDerivedEquality;
203
+ }
204
+
205
+ function verifyStatementAsEqualTerms(statementNode, derived, context, verifyAhead) {
206
+ let statementVerifiedAsEqualTerms;
207
+
208
+ const statementString = context.nodeAsString(statementNode);
209
+
210
+ context.trace(`Verifying the '${statementString}' statement as equal terms...`, statementNode);
211
+
212
+ const types = [],
213
+ leftTermNode = leftTermNodeQuery(statementNode),
214
+ leftTermVerified = verifyTerm(leftTermNode, types, context, () => {
215
+ let verifiedAhead;
216
+
217
+ const rightTermNode = rightTermNodeQuery(statementNode),
218
+ rightTermVerified = verifyTerm(rightTermNode, types, context, () => {
219
+ let verifiedAhead = false;
220
+
221
+ const firstType = first(types),
222
+ secondType = second(types),
223
+ leftType = firstType, ///
224
+ rightType = secondType, ///
225
+ leftTypeEqualToOrSubTypeOfOfSuperTypeOfRightType = leftType.isEqualToOrSubTypeOfOfSuperTypeOf(rightType);
226
+
227
+ if (!leftTypeEqualToOrSubTypeOfOfSuperTypeOfRightType) {
228
+ const leftTypeName = leftType.getName(),
229
+ rightTypeName = rightType.getName(),
230
+ leftTermString = context.nodeAsString(leftTermNode),
231
+ rightTermString = context.nodeAsString(rightTermNode);
232
+
233
+ context.info(`The left '${leftTermString}' term's '${leftTypeName}' type is not equal to, a sub-type of nor a super-type of the right '${rightTermString}' term's '${rightTypeName}' type.`, statementNode);
234
+ } else {
235
+ verifiedAhead = verifyAhead();
236
+ }
237
+
238
+ return verifiedAhead;
239
+ });
240
+
241
+ verifiedAhead = rightTermVerified; ///
242
+
243
+ return verifiedAhead;
244
+ });
245
+
246
+ statementVerifiedAsEqualTerms = leftTermVerified; ///
247
+
248
+ if (statementVerifiedAsEqualTerms) {
249
+ context.trace(`...verified the '${statementString}' statement as equal terms.`, statementNode);
250
+ }
251
+
252
+ return statementVerifiedAsEqualTerms;
253
+ }