occam-verify-cli 0.0.678 → 0.0.680

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 (141) hide show
  1. package/bin/action/verify.js +13 -3
  2. package/lib/axiomLemmaTheoremConjecture.js +3 -3
  3. package/lib/conclusion.js +16 -5
  4. package/lib/consequent.js +11 -3
  5. package/lib/context/file.js +73 -3
  6. package/lib/context/release.js +7 -2
  7. package/lib/equality.js +13 -199
  8. package/lib/premise.js +24 -7
  9. package/lib/supposition.js +15 -4
  10. package/lib/type.js +3 -8
  11. package/lib/utilities/array.js +5 -2
  12. package/lib/utilities/string.js +26 -13
  13. package/lib/verifier/node/metastatement.js +176 -0
  14. package/lib/verifier/node/statementAsCombinator.js +186 -0
  15. package/lib/verifier/node/termAsConstructor.js +224 -0
  16. package/lib/verifier/node.js +158 -0
  17. package/lib/verifier/nodes/equality.js +155 -0
  18. package/lib/verifier/{metastatementForMetavariable → nodes/metastatementForMetavariable}/conclusion.js +13 -12
  19. package/lib/verifier/{metastatementForMetavariable → nodes/metastatementForMetavariable}/premise.js +13 -12
  20. package/lib/verifier/nodes/metastatementForMetavariable.js +198 -0
  21. package/lib/verifier/nodes/statement.js +200 -0
  22. package/lib/verifier/{statementForMetavariable → nodes/statementForMetavariable}/conclusion.js +13 -12
  23. package/lib/verifier/{statementForMetavariable → nodes/statementForMetavariable}/premise.js +13 -12
  24. package/lib/verifier/nodes/statementForMetavariable.js +203 -0
  25. package/lib/verifier/nodes/term.js +210 -0
  26. package/lib/verifier/{termForVariable/supposition.js → nodes/termForVariable/consequent.js} +13 -12
  27. package/lib/verifier/{termForVariable/consequent.js → nodes/termForVariable/supposition.js} +13 -12
  28. package/lib/verifier/nodes/termForVariable.js +217 -0
  29. package/lib/verifier/nodes.js +175 -0
  30. package/lib/verify/axiom.js +3 -3
  31. package/lib/verify/conclusion.js +3 -3
  32. package/lib/verify/conjecture.js +3 -3
  33. package/lib/verify/consequent.js +3 -3
  34. package/lib/verify/declaration/combinator.js +7 -2
  35. package/lib/verify/declaration/constructor.js +8 -2
  36. package/lib/verify/declaration/metavariable.js +7 -2
  37. package/lib/verify/declaration/type.js +7 -2
  38. package/lib/verify/declaration/variable.js +8 -2
  39. package/lib/verify/file.js +3 -3
  40. package/lib/verify/label.js +9 -4
  41. package/lib/verify/lemma.js +3 -3
  42. package/lib/verify/metastatement/qualified.js +5 -6
  43. package/lib/verify/metastatement/unqualified.js +9 -7
  44. package/lib/verify/metastatement.js +36 -156
  45. package/lib/verify/metavariable.js +6 -4
  46. package/lib/verify/premise.js +3 -3
  47. package/lib/verify/release.js +3 -3
  48. package/lib/verify/rule.js +3 -3
  49. package/lib/verify/statement/qualified.js +5 -6
  50. package/lib/verify/statement/unqualified.js +9 -7
  51. package/lib/verify/statement.js +86 -332
  52. package/lib/verify/statementAsCombinator.js +8 -82
  53. package/lib/verify/supposition.js +3 -3
  54. package/lib/verify/term.js +79 -215
  55. package/lib/verify/termAsConstructor.js +15 -89
  56. package/lib/verify/terms.js +45 -0
  57. package/lib/verify/theorem.js +3 -3
  58. package/lib/verify/type.js +7 -5
  59. package/lib/verify/typeAssertion.js +124 -0
  60. package/lib/verify/variable.js +7 -5
  61. package/package.json +5 -5
  62. package/src/axiomLemmaTheoremConjecture.js +2 -2
  63. package/src/conclusion.js +13 -4
  64. package/src/consequent.js +9 -2
  65. package/src/context/file.js +9 -2
  66. package/src/context/release.js +9 -2
  67. package/src/equality.js +17 -143
  68. package/src/premise.js +23 -6
  69. package/src/supposition.js +12 -3
  70. package/src/type.js +3 -8
  71. package/src/utilities/array.js +1 -1
  72. package/src/utilities/string.js +34 -23
  73. package/src/verifier/node/metastatement.js +61 -0
  74. package/src/verifier/node/statementAsCombinator.js +80 -0
  75. package/src/verifier/node/termAsConstructor.js +124 -0
  76. package/src/verifier/node.js +85 -0
  77. package/src/verifier/nodes/equality.js +68 -0
  78. package/src/verifier/nodes/metastatementForMetavariable/conclusion.js +11 -0
  79. package/src/verifier/nodes/metastatementForMetavariable/premise.js +11 -0
  80. package/src/verifier/{metastatementForMetavariable.js → nodes/metastatementForMetavariable.js} +13 -13
  81. package/src/verifier/nodes/statement.js +100 -0
  82. package/src/verifier/nodes/statementForMetavariable/conclusion.js +11 -0
  83. package/src/verifier/nodes/statementForMetavariable/premise.js +11 -0
  84. package/src/verifier/{statementForMetavariable.js → nodes/statementForMetavariable.js} +10 -10
  85. package/src/verifier/nodes/term.js +106 -0
  86. package/src/verifier/nodes/termForVariable/consequent.js +11 -0
  87. package/src/verifier/nodes/termForVariable/supposition.js +11 -0
  88. package/src/verifier/{termForVariable.js → nodes/termForVariable.js} +42 -30
  89. package/src/verifier/nodes.js +111 -0
  90. package/src/verify/axiom.js +2 -2
  91. package/src/verify/conclusion.js +2 -2
  92. package/src/verify/conjecture.js +2 -2
  93. package/src/verify/consequent.js +2 -2
  94. package/src/verify/declaration/combinator.js +9 -1
  95. package/src/verify/declaration/constructor.js +15 -1
  96. package/src/verify/declaration/metavariable.js +9 -1
  97. package/src/verify/declaration/type.js +14 -1
  98. package/src/verify/declaration/variable.js +15 -1
  99. package/src/verify/file.js +2 -2
  100. package/src/verify/label.js +10 -2
  101. package/src/verify/lemma.js +4 -4
  102. package/src/verify/metastatement/qualified.js +4 -6
  103. package/src/verify/metastatement/unqualified.js +9 -7
  104. package/src/verify/metastatement.js +35 -56
  105. package/src/verify/metavariable.js +6 -3
  106. package/src/verify/premise.js +2 -2
  107. package/src/verify/release.js +2 -2
  108. package/src/verify/rule.js +2 -2
  109. package/src/verify/statement/qualified.js +4 -6
  110. package/src/verify/statement/unqualified.js +9 -7
  111. package/src/verify/statement.js +109 -302
  112. package/src/verify/statementAsCombinator.js +9 -129
  113. package/src/verify/supposition.js +2 -2
  114. package/src/verify/term.js +99 -156
  115. package/src/verify/termAsConstructor.js +20 -135
  116. package/src/verify/terms.js +54 -0
  117. package/src/verify/theorem.js +2 -2
  118. package/src/verify/type.js +7 -4
  119. package/src/verify/typeAssertion.js +164 -0
  120. package/src/verify/variable.js +7 -4
  121. package/lib/node/statement/combinator/equality.js +0 -21
  122. package/lib/ocmbinator/equality.js +0 -126
  123. package/lib/tokens/statement/combinator/equality.js +0 -17
  124. package/lib/verifier/metastatementForMetavariable.js +0 -198
  125. package/lib/verifier/statementForMetavariable.js +0 -203
  126. package/lib/verifier/termForVariable.js +0 -209
  127. package/lib/verifier.js +0 -138
  128. package/lib/verify/assertion/type.js +0 -115
  129. package/lib/verify/typeInference.js +0 -132
  130. package/src/node/statement/combinator/equality.js +0 -9
  131. package/src/ocmbinator/equality.js +0 -23
  132. package/src/tokens/statement/combinator/equality.js +0 -10
  133. package/src/verifier/metastatementForMetavariable/conclusion.js +0 -9
  134. package/src/verifier/metastatementForMetavariable/premise.js +0 -9
  135. package/src/verifier/statementForMetavariable/conclusion.js +0 -9
  136. package/src/verifier/statementForMetavariable/premise.js +0 -9
  137. package/src/verifier/termForVariable/consequent.js +0 -9
  138. package/src/verifier/termForVariable/supposition.js +0 -9
  139. package/src/verifier.js +0 -74
  140. package/src/verify/assertion/type.js +0 -153
  141. package/src/verify/typeInference.js +0 -146
@@ -1,189 +1,51 @@
1
1
  "use strict";
2
2
 
3
- import Verifier from "../verifier";
4
3
  import Equality from "../equality";
5
- import verifyTerm from "../verify/term";
6
- import equalityCombinator from "../ocmbinator/equality";
4
+ import verifyTerms from "../verify/terms";
7
5
  import bracketedCombinator from "../ocmbinator/bracketed";
8
- import verifyTypeInference from "../verify/typeInference";
9
- import verifyTypeAssertion from "../verify/assertion/type";
10
-
11
- import { objectType } from "../type";
12
- import { termVerifier } from "../verify/term";
13
- 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);
6
+ import verifyTypeAssertion from "../verify/typeAssertion";
7
+ import statementNodesVerifier from "../verifier/nodes/statement";
81
8
 
82
- if (termNode === null) {
83
- const argumentString = context.nodeAsString(argumentNode);
9
+ import { nodeQuery } from "../utilities/query";
84
10
 
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);
11
+ const typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!");
89
12
 
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
-
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();
142
-
143
- export default function verifyStatement(statementNode, assignments, derived, context) {
144
- let statementVerified = false;
13
+ function verifyStatement(statementNode, assignments, derived, context, verifyAhead) {
14
+ let statementVerified;
145
15
 
146
16
  const statementString = context.nodeAsString(statementNode);
147
17
 
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);
158
-
159
- statementVerified = statementVerifiedAsTypeInference; ///
160
- }
161
-
162
- if (!statementVerified) {
163
- const statementVerifiedAsTypeAssertion = verifyStatementAsTypeAssertion(statementNode, assignments, derived, context);
18
+ context.trace(`Verifying the '${statementString}' statement...`, statementNode);
164
19
 
165
- statementVerified = statementVerifiedAsTypeAssertion; ///
166
- }
20
+ const verifyStatementFunctions = [
21
+ verifyStatementAsEquality,
22
+ verifyStatementAsTypeAssertion,
23
+ verifyStatementAgainstCombinators
24
+ ];
167
25
 
168
- if (!statementVerified) {
169
- const statementVerifiedAsEquality = verifyStatementAsEquality(statementNode, derived, context);
26
+ statementVerified = verifyStatementFunctions.some((verifyStatementFunction) => {
27
+ const statementVerified = verifyStatementFunction(statementNode, assignments, derived, context, verifyAhead);
170
28
 
171
- statementVerified = statementVerifiedAsEquality; //
172
- }
29
+ if (statementVerified) {
30
+ return true;
31
+ }
32
+ });
173
33
 
174
34
  if (statementVerified) {
175
- context.debug(`Verified the '${statementString}' statement.`, statementNode);
35
+ context.debug(`...verified the '${statementString}' statement.`, statementNode);
176
36
  }
177
37
 
178
38
  return statementVerified;
179
39
  }
180
40
 
181
- export function verifyStatementAgainstCombinators(statementNode, context) {
182
- let statementVerifiedAgainstCombinators = false;
41
+ Object.assign(verifyStatement, {
42
+ statementNodesVerifier
43
+ });
183
44
 
184
- const statementString = context.nodeAsString(statementNode);
45
+ export default verifyStatement;
185
46
 
186
- context.trace(`Verifying the '${statementString}' statement against combinators.`, statementNode);
47
+ export function verifyStatementAgainstCombinators(statementNode, assignments, derived, context, verifyAhead) {
48
+ let statementVerifiedAgainstCombinators;
187
49
 
188
50
  let combinators = context.getCombinators();
189
51
 
@@ -192,186 +54,131 @@ export function verifyStatementAgainstCombinators(statementNode, context) {
192
54
  ...combinators
193
55
  ];
194
56
 
195
- const combinator = combinators.find((combinator, index) => {
196
- const statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
57
+ statementVerifiedAgainstCombinators = combinators.some((combinator) => {
58
+ const statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context, verifyAhead);
197
59
 
198
60
  if (statementVerifiedAgainstCombinator) {
199
61
  return true;
200
62
  }
201
- }) || null;
202
-
203
- if (combinator !== null) {
204
- statementVerifiedAgainstCombinators = true;
205
- }
63
+ });
206
64
 
207
65
  return statementVerifiedAgainstCombinators;
208
66
  }
209
67
 
210
- export function verifyStatementAgainstCombinator(statementNode, combinator, context) {
68
+ function verifyStatementAgainstCombinator(statementNode, combinator, context, verifyAhead) {
69
+ let statementVerifiedAgainstCombinator;
70
+
211
71
  const statementString = context.nodeAsString(statementNode),
212
72
  combinatorString = combinator.getString();
213
73
 
214
- context.trace(`Verifying the '${statementString}' statement against the '${combinatorString}' combinator.`, statementNode);
74
+ context.trace(`Verifying the '${statementString}' statement against the '${combinatorString}' combinator...`, statementNode);
215
75
 
216
76
  const combinatorStatementNode = combinator.getStatementNode(),
217
77
  nonTerminalNodeA = statementNode, ///
218
78
  nonTerminalNodeB = combinatorStatementNode, ///
219
- nonTerminalNodeVerified = statementVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context),
220
- statementVerifiedAgainstCombinator = nonTerminalNodeVerified; ///
79
+ nonTerminalNodeVerified = statementNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context, verifyAhead);
221
80
 
222
- return statementVerifiedAgainstCombinator;
223
- }
224
-
225
- function verifyStatementAsTypeInference(statementNode, derived, context) {
226
- let statementVerifiedAsTypeInference = false;
227
-
228
- const typeInferenceNode = typeInferenceNodeQuery(statementNode);
229
-
230
- if (typeInferenceNode !== null) {
231
- if (!derived) {
232
- const typeInferenceString = context.nodeAsString(typeInferenceNode);
233
-
234
- context.error(`The '${typeInferenceString}' type inference can only be derived.`, typeInferenceNode);
235
- } else {
236
- const typeInferenceVerified = verifyTypeInference(typeInferenceNode, context);
81
+ statementVerifiedAgainstCombinator = nonTerminalNodeVerified; ///
237
82
 
238
- statementVerifiedAsTypeInference = typeInferenceVerified; ///
239
- }
83
+ if (statementVerifiedAgainstCombinator) {
84
+ context.debug(`...verified the '${statementString}' statement against the '${combinatorString}' combinator.`, statementNode);
240
85
  }
241
86
 
242
- return statementVerifiedAsTypeInference;
87
+ return statementVerifiedAgainstCombinator;
243
88
  }
244
89
 
245
- function verifyStatementAsTypeAssertion(statementNode, assignments, derived, context) {
90
+ function verifyStatementAsTypeAssertion(statementNode, assignments, derived, context, verifyAhead) {
246
91
  let statementVerifiedAsTypeAssertion = false;
247
92
 
248
93
  const typeAssertionNode = typeAssertionNodeQuery(statementNode);
249
94
 
250
95
  if (typeAssertionNode !== null) {
251
- const typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assignments, derived, context);
96
+ const statementString = context.nodeAsString(statementNode);
97
+
98
+ context.trace(`Verifying the '${statementString}' statement as a type assertion...`, statementNode);
99
+
100
+ const typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assignments, derived, context, verifyAhead);
252
101
 
253
102
  statementVerifiedAsTypeAssertion = typeAssertionVerified; ///
103
+
104
+ if (statementVerifiedAsTypeAssertion) {
105
+ context.debug(`...verified the '${statementString}' statement as a type assertion.`, statementNode);
106
+ }
254
107
  }
255
108
 
256
109
  return statementVerifiedAsTypeAssertion;
257
110
  }
258
111
 
259
- function verifyStatementAsEquality(statementNode, derived, context) {
112
+ function verifyStatementAsEquality(statementNode, assignments, derived, context, verifyAhead) {
260
113
  let statementVerifiedAsEquality = false;
261
114
 
262
- const combinator = equalityCombinator, ///
263
- statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
115
+ const equality = Equality.fromStatementNode(statementNode);
264
116
 
265
- if (statementVerifiedAgainstCombinator) {
266
- const equality = Equality.fromStatementNode(statementNode);
267
-
268
- if (derived) {
269
- const equalities = context.getEqualities(),
270
- equalityVerified = equality.verify(equalities, context);
271
-
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
- }
117
+ if (equality !== null) {
118
+ const statementString = context.nodeAsString(statementNode);
119
+
120
+ context.trace(`Verifying the '${statementString}' statement as an equality...`, statementNode);
121
+
122
+ const verifyStatementAsEqualityFunctions = [
123
+ verifyStatementAsDerivedEquality,
124
+ verifyStatementAsStandaloneEquality
125
+ ];
126
+
127
+ statementVerifiedAsEquality = verifyStatementAsEqualityFunctions.some((verifyStatementAsEqualityFunction) => {
128
+ const statementVerified = verifyStatementAsEqualityFunction(statementNode, equality, derived, context, verifyAhead);
129
+
130
+ if (statementVerified) {
131
+ return true;
366
132
  }
133
+ });
134
+
135
+ if (statementVerifiedAsEquality) {
136
+ context.debug(`...verified the '${statementString}' statement as an equality.`, statementNode);
367
137
  }
368
138
  }
369
139
 
370
- if (statementVerifiedAsEquality) {
140
+ return statementVerifiedAsEquality;
141
+ }
142
+
143
+ function verifyStatementAsDerivedEquality(statementNode, equality, derived, context, verifyAhead) {
144
+ let verifiedStatementAsDerivedEquality = false;
145
+
146
+ if (derived) {
371
147
  const statementString = context.nodeAsString(statementNode);
372
148
 
373
- context.info(`Verified the '${statementString}' statement as an equality.`, statementNode);
149
+ context.trace(`Verifying the '${statementString}' derived equality...`, statementNode);
150
+
151
+ const equalities = context.getEqualities(),
152
+ equalityVerified = equality.verify(equalities, context, verifyAhead);
153
+
154
+ verifiedStatementAsDerivedEquality = equalityVerified; ///
155
+
156
+ if (verifiedStatementAsDerivedEquality) {
157
+ context.debug(`...verified the '${statementString}' derived equality.`, statementNode);
158
+ }
374
159
  }
375
160
 
376
- return statementVerifiedAsEquality;
161
+ return verifiedStatementAsDerivedEquality;
162
+ }
163
+
164
+ function verifyStatementAsStandaloneEquality(statementNode, equality, derived, context, verifyAhead) {
165
+ let statementVerifiedAsStandaloneEquality = false;
166
+
167
+ if (!derived) {
168
+ const statementString = context.nodeAsString(statementNode);
169
+
170
+ context.trace(`Verifying the '${statementString}' statement as a standalone equality...`, statementNode);
171
+
172
+ const leftTermNode = equality.getLeftTermNode(),
173
+ rightTermNode = equality.getRightTermNode(),
174
+ termsVerified = verifyTerms(leftTermNode, rightTermNode, context, verifyAhead);
175
+
176
+ statementVerifiedAsStandaloneEquality = termsVerified; ///
177
+
178
+ if (statementVerifiedAsStandaloneEquality) {
179
+ context.trace(`...verified the '${statementString}' statement as a standalone equality.`, statementNode);
180
+ }
181
+ }
182
+
183
+ return statementVerifiedAsStandaloneEquality;
377
184
  }
@@ -1,22 +1,22 @@
1
1
  "use strict";
2
2
 
3
3
  import Combinator from "../combinator";
4
- import verifyTerm from "../verify/term";
5
- import verifyStatement from "../verify/statement";
6
-
7
- import { typeNameFromTypeNode } from "../utilities/query";
8
- import { TYPE_RULE_NAME, TERM_RULE_NAME, STATEMENT_RULE_NAME } from "../ruleNames";
4
+ import statementAsCombinatorNodeVerifier from "../verifier/node/statementAsCombinator";
9
5
 
10
6
  export default function verifyStatementAsCombinator(statementNode, fileContext) {
11
7
  let statementVerifiedAsCombinator = false;
12
8
 
13
9
  const statementString = fileContext.nodeAsString(statementNode);
14
10
 
15
- fileContext.debug(`Verifying the '${statementString}' combinator....`, statementNode);
11
+ fileContext.trace(`Verifying the '${statementString}' statement as a combinator....`, statementNode);
16
12
 
17
- const nonTerminalNode = statementNode, ///
13
+ const nonTerminalNode = statementNode, ///
18
14
  childNodes = nonTerminalNode.getChildNodes(),
19
- childNodesVerified = verifyChildNodes(childNodes, fileContext);
15
+ childNodesVerified = statementAsCombinatorNodeVerifier.verifyChildNodes(childNodes, fileContext, () => {
16
+ const verifiedAhead = true;
17
+
18
+ return verifiedAhead;
19
+ });
20
20
 
21
21
  if (childNodesVerified) {
22
22
  const tokens = fileContext.getTokens(),
@@ -28,128 +28,8 @@ export default function verifyStatementAsCombinator(statementNode, fileContext)
28
28
  }
29
29
 
30
30
  if (statementVerifiedAsCombinator) {
31
- fileContext.info(`Verified the '${statementString}' combinator.`, statementNode);
31
+ fileContext.debug(`...verified the '${statementString}' statement as a combinator.`, statementNode);
32
32
  }
33
33
 
34
34
  return statementVerifiedAsCombinator;
35
35
  }
36
-
37
- function verifyNode(node, fileContext) {
38
- let nodeVerified;
39
-
40
- const nodeTerminalNode = node.isTerminalNode();
41
-
42
- if (nodeTerminalNode) {
43
- const terminalNode = node, ///
44
- terminalNodeVerified = verifyTerminalNode(terminalNode, fileContext);
45
-
46
- nodeVerified = terminalNodeVerified; ///
47
- } else {
48
- const nonTerminalNode = node, ///
49
- nonTerminalNodeVerified = verifyNonTerminalNode(nonTerminalNode, fileContext);
50
-
51
- nodeVerified = nonTerminalNodeVerified; ///
52
- }
53
-
54
- return nodeVerified;
55
- }
56
-
57
- function verifyChildNodes(childNodes, fileContext) {
58
- const childNodesVerified = childNodes.every((childNode) => {
59
- const node = childNode, ///
60
- nodeVerified = verifyNode(node, fileContext);
61
-
62
- if (nodeVerified) {
63
- return true;
64
- }
65
- });
66
-
67
- return childNodesVerified;
68
- }
69
-
70
- function verifyTerminalNode(terminalNode, fileContext) {
71
- const terminalNodeVerified = true;
72
-
73
- return terminalNodeVerified;
74
- }
75
-
76
- function verifyNonTerminalNode(nonTerminalNode, fileContext) {
77
- let nonTerminalNodeVerified;
78
-
79
- const ruleName = nonTerminalNode.getRuleName();
80
-
81
- switch (ruleName) {
82
- case TYPE_RULE_NAME: {
83
- const typeNode = nonTerminalNode, ///
84
- typeNodeVerified = verifyTypeNode(typeNode, fileContext);
85
-
86
- nonTerminalNodeVerified = typeNodeVerified; ///
87
-
88
- break;
89
- }
90
-
91
- case TERM_RULE_NAME: {
92
- const termNode = nonTerminalNode, ///
93
- termNodeVerified = verifyTermNode(termNode, fileContext);
94
-
95
- nonTerminalNodeVerified = termNodeVerified; ///
96
-
97
- break;
98
- }
99
-
100
- case STATEMENT_RULE_NAME: {
101
- const statmentNode = nonTerminalNode, ///
102
- statmentNodeVerified = verifyStatementNode(statmentNode, fileContext);
103
-
104
- nonTerminalNodeVerified = statmentNodeVerified; ///
105
-
106
- break;
107
- }
108
-
109
- default: {
110
- const childNodes = nonTerminalNode.getChildNodes(),
111
- childNodesVerified = verifyChildNodes(childNodes, fileContext);
112
-
113
- nonTerminalNodeVerified = childNodesVerified; ///
114
-
115
- break;
116
- }
117
- }
118
-
119
- return nonTerminalNodeVerified;
120
- }
121
-
122
- function verifyTypeNode(typeNode, fileContext) {
123
- let typeNodeVerified = false;
124
-
125
- const typeName = typeNameFromTypeNode(typeNode),
126
- typePresent = fileContext.isTypePresentByTypeName(typeName);
127
-
128
- if (!typePresent) {
129
- fileContext.error(`The type '${typeName}' not present.`, typeNode);
130
- } else {
131
- typeNodeVerified = true;
132
- }
133
-
134
- return typeNodeVerified;
135
- }
136
-
137
- function verifyTermNode(termNode, fileContext) {
138
- const types = [],
139
- context = fileContext, ///
140
- termVerified = verifyTerm(termNode, types, context),
141
- termNodeVerified = termVerified; ///
142
-
143
- return termNodeVerified;
144
- }
145
-
146
- function verifyStatementNode(statementNode, fileContext) {
147
- const context = fileContext, ///
148
- derived = false,
149
- assignments = [],
150
- statementVerified = verifyStatement(statementNode, assignments, derived, context),
151
- statementNodeVerified = statementVerified; ///
152
-
153
- return statementNodeVerified;
154
- }
155
-
@@ -14,7 +14,7 @@ export default function verifySupposition(suppositionNode, suppositions, proofCo
14
14
 
15
15
  const suppositionString = proofContext.nodeAsString(suppositionNode);
16
16
 
17
- proofContext.debug(`Verifying the '${suppositionString}' supposition...`, suppositionNode);
17
+ proofContext.trace(`Verifying the '${suppositionString}' supposition...`, suppositionNode);
18
18
 
19
19
  const derived = false,
20
20
  assignments = [],
@@ -38,7 +38,7 @@ export default function verifySupposition(suppositionNode, suppositions, proofCo
38
38
  }
39
39
 
40
40
  if (suppositionVerified) {
41
- proofContext.info(`Verified the '${suppositionString}' supposition.`, suppositionNode);
41
+ proofContext.debug(`...verified the '${suppositionString}' supposition.`, suppositionNode);
42
42
  }
43
43
 
44
44
  return suppositionVerified;