occam-verify-cli 0.0.533 → 0.0.535

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 (54) hide show
  1. package/lib/assignment.js +60 -0
  2. package/lib/conclusion.js +3 -3
  3. package/lib/consequence.js +2 -2
  4. package/lib/equality.js +22 -113
  5. package/lib/log.js +3 -2
  6. package/lib/premise.js +7 -7
  7. package/lib/supposition.js +4 -4
  8. package/lib/verifier/metastatementForMetavariable.js +23 -23
  9. package/lib/verifier/statement.js +199 -0
  10. package/lib/verifier/statementForMetavariable.js +25 -25
  11. package/lib/verifier/termForVariable.js +23 -23
  12. package/lib/verifier.js +27 -26
  13. package/lib/verify/assertion/type.js +7 -7
  14. package/lib/verify/conclusion.js +2 -2
  15. package/lib/verify/consequence.js +2 -2
  16. package/lib/verify/derivation.js +3 -3
  17. package/lib/verify/metastatement/qualified.js +3 -3
  18. package/lib/verify/metastatement/unqualified.js +3 -3
  19. package/lib/verify/metastatement.js +2 -2
  20. package/lib/verify/premise.js +2 -2
  21. package/lib/verify/ruleDerivation.js +3 -3
  22. package/lib/verify/statement/qualified.js +3 -3
  23. package/lib/verify/statement/unqualified.js +3 -3
  24. package/lib/verify/statement.js +21 -121
  25. package/lib/verify/statementAsCombinator.js +2 -2
  26. package/lib/verify/supposition.js +4 -4
  27. package/package.json +1 -1
  28. package/src/{assertion.js → assignment.js} +4 -4
  29. package/src/conclusion.js +4 -4
  30. package/src/consequence.js +2 -2
  31. package/src/equality.js +20 -105
  32. package/src/log.js +1 -1
  33. package/src/premise.js +15 -15
  34. package/src/supposition.js +11 -11
  35. package/src/verifier/metastatementForMetavariable.js +19 -19
  36. package/src/verifier/statement.js +135 -0
  37. package/src/verifier/statementForMetavariable.js +21 -21
  38. package/src/verifier/termForVariable.js +19 -19
  39. package/src/verifier.js +21 -21
  40. package/src/verify/assertion/type.js +6 -6
  41. package/src/verify/conclusion.js +2 -2
  42. package/src/verify/consequence.js +2 -2
  43. package/src/verify/derivation.js +4 -4
  44. package/src/verify/metastatement/qualified.js +2 -2
  45. package/src/verify/metastatement/unqualified.js +2 -2
  46. package/src/verify/metastatement.js +1 -1
  47. package/src/verify/premise.js +2 -2
  48. package/src/verify/ruleDerivation.js +4 -4
  49. package/src/verify/statement/qualified.js +2 -2
  50. package/src/verify/statement/unqualified.js +2 -2
  51. package/src/verify/statement.js +26 -193
  52. package/src/verify/statementAsCombinator.js +2 -2
  53. package/src/verify/supposition.js +4 -4
  54. package/lib/assertion.js +0 -60
package/src/equality.js CHANGED
@@ -1,15 +1,6 @@
1
1
  "use strict";
2
2
 
3
- import Variable from "./variable";
4
- import verifyTerm from "./verify/term";
5
-
6
- import { nodeQuery } from "./utilities/query";
7
- import { first, second } from "./utilities/array";
8
3
  import { TERM_RULE_NAME } from "./ruleNames";
9
- import { verifyTermAsVariable } from "./verify/term";
10
-
11
- const leftTermNodeQuery = nodeQuery("/statement/argument[0]/term!"),
12
- rightTermNodeQuery = nodeQuery("/statement/argument[1]/term!");
13
4
 
14
5
  export default class Equality {
15
6
  constructor(leftTermNode, rightTermNode) {
@@ -25,7 +16,7 @@ export default class Equality {
25
16
  return this.rightTermNode;
26
17
  }
27
18
 
28
- matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context) {
19
+ matchTermNodes(leftTermNode, rightTermNode, reversed, context) {
29
20
  let leftTermNodeAndRightTermNodeMatch = true;
30
21
 
31
22
  if (leftTermNodeAndRightTermNodeMatch) {
@@ -33,7 +24,7 @@ export default class Equality {
33
24
  this.rightTermNode :
34
25
  this.leftTermNode, ///
35
26
  rightNonTerminalNode = leftTermNode, ///
36
- nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context);
27
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, context);
37
28
 
38
29
  leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
39
30
  }
@@ -43,7 +34,7 @@ export default class Equality {
43
34
  this.leftTermNode :
44
35
  this.rightTermNode, ///
45
36
  rightNonTerminalNode = rightTermNode, ///
46
- nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context);
37
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, context);
47
38
 
48
39
  leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
49
40
  }
@@ -51,24 +42,22 @@ export default class Equality {
51
42
  return leftTermNodeAndRightTermNodeMatch;
52
43
  }
53
44
 
54
- match(equality, equalities, context) {
45
+ match(equality, context) {
55
46
  let matches = false;
56
47
 
57
48
  const leftTermNode = equality.getLeftTermNode(),
58
49
  rightTermNode = equality.getRightTermNode();
59
50
 
60
- equalities = filterEqualities(equalities, equality); ///
61
-
62
51
  if (!matches) {
63
52
  const reversed = false,
64
- leftTermNodeAndRightTermNodeMatch = this.matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context);
53
+ leftTermNodeAndRightTermNodeMatch = this.matchTermNodes(leftTermNode, rightTermNode, reversed, context);
65
54
 
66
55
  matches = leftTermNodeAndRightTermNodeMatch; ///
67
56
  }
68
57
 
69
58
  if (!matches) {
70
59
  const reversed = true,
71
- leftTermNodeAndRightTermNodeMatch = this.matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context);
60
+ leftTermNodeAndRightTermNodeMatch = this.matchTermNodes(leftTermNode, rightTermNode, reversed, context);
72
61
 
73
62
  matches = leftTermNodeAndRightTermNodeMatch; ///
74
63
  }
@@ -76,25 +65,23 @@ export default class Equality {
76
65
  return matches;
77
66
  }
78
67
 
79
- equate(equalities, context) {
68
+ equate(context) {
80
69
  const leftNonTerminalNode = this.leftTermNode, ///
81
70
  rightNonTerminalNode = this.rightTermNode, ///
82
- nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context),
71
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, context),
83
72
  equates = nonTerminalNodeEquates; ///
84
73
 
85
74
  return equates;
86
75
  }
87
76
 
88
- static fromStatementNode(statementNode, context) {
89
- const leftTermNode = leftTermNodeQuery(statementNode),
90
- rightTermNode = rightTermNodeQuery(statementNode),
91
- equality = equalityFromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, context);
77
+ static fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode) {
78
+ const equality = new Equality(leftTermNode, rightTermNode);
92
79
 
93
80
  return equality;
94
81
  }
95
82
  }
96
83
 
97
- function equateNode(nodeA, nodeB, equalities, context) {
84
+ function equateNode(nodeA, nodeB, context) {
98
85
  let nodeEquates = false;
99
86
 
100
87
  const nodeATerminalNode = nodeA.isTerminalNode(),
@@ -104,13 +91,13 @@ function equateNode(nodeA, nodeB, equalities, context) {
104
91
  if (nodeATerminalNode) {
105
92
  const terminalNodeA = nodeA, ///
106
93
  terminalNodeB = nodeB, ///
107
- terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, equalities, context);
94
+ terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, context);
108
95
 
109
96
  nodeEquates = terminalNodeEquates; ///
110
97
  } else {
111
98
  const nonTerminalNodeA = nodeA, ///
112
99
  nonTerminalNodeB = nodeB, ///
113
- nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equalities, context);
100
+ nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context);
114
101
 
115
102
  nodeEquates = nonTerminalNodeEquates; ///
116
103
  }
@@ -119,7 +106,7 @@ function equateNode(nodeA, nodeB, equalities, context) {
119
106
  return nodeEquates;
120
107
  }
121
108
 
122
- function equateNodes(leftNodes, rightNodes, equalities, context) {
109
+ function equateNodes(leftNodes, rightNodes, context) {
123
110
  let nodesEquate = false;
124
111
 
125
112
  const leftNodesLength = leftNodes.length,
@@ -128,7 +115,7 @@ function equateNodes(leftNodes, rightNodes, equalities, context) {
128
115
  if (leftNodesLength === rightNodesLength) {
129
116
  nodesEquate = leftNodes.every((LeftNode, index) => {
130
117
  const rightNode = rightNodes[index],
131
- nodeEquates = equateNode(LeftNode, rightNode, equalities, context);
118
+ nodeEquates = equateNode(LeftNode, rightNode, context);
132
119
 
133
120
  if (nodeEquates) {
134
121
  return true;
@@ -139,14 +126,14 @@ function equateNodes(leftNodes, rightNodes, equalities, context) {
139
126
  return nodesEquate;
140
127
  }
141
128
 
142
- function equateTerminalNode(terminalNodeA, terminalNodeB, equalities, context) {
129
+ function equateTerminalNode(terminalNodeA, terminalNodeB, context) {
143
130
  const matches = terminalNodeA.match(terminalNodeB),
144
131
  terminalNodeEquates = matches; ///
145
132
 
146
133
  return terminalNodeEquates;
147
134
  }
148
135
 
149
- function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context) {
136
+ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, context) {
150
137
  let nonTerminalNodeEquates = false;
151
138
 
152
139
  const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
@@ -159,7 +146,7 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
159
146
  if (ruleNameTermRuleName) {
160
147
  const leftTermNode = leftNonTerminalNode, ///
161
148
  rightTermNode = rightNonTerminalNode, ///
162
- termNodeEquates = equateTermNode(leftTermNode, rightTermNode, equalities, context);
149
+ termNodeEquates = equateTermNode(leftTermNode, rightTermNode, context);
163
150
 
164
151
  nonTerminalNodeEquates = termNodeEquates; ///
165
152
  }
@@ -169,7 +156,7 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
169
156
  rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(),
170
157
  leftNodes = leftNonTerminalNodeChildNodes, ///
171
158
  rightNodes = rightNonTerminalNodeChildNodes, ///
172
- nodesEquate = equateNodes(leftNodes, rightNodes, equalities, context);
159
+ nodesEquate = equateNodes(leftNodes, rightNodes, context);
173
160
 
174
161
  nonTerminalNodeEquates = nodesEquate; ///
175
162
  }
@@ -178,7 +165,7 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
178
165
  return nonTerminalNodeEquates;
179
166
  }
180
167
 
181
- function equateTermNode(leftTermNode, rightTermNode, equalities, context) {
168
+ function equateTermNode(leftTermNode, rightTermNode, context) {
182
169
  let termNodeEquates = false;
183
170
 
184
171
  const equality = equalityFromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, context);
@@ -199,75 +186,3 @@ function equateTermNode(leftTermNode, rightTermNode, equalities, context) {
199
186
 
200
187
  return termNodeEquates;
201
188
  }
202
-
203
- function filterEqualities(equalities, equality) {
204
- const equalityA = equality; ///
205
-
206
- equalities = equalities.filter((equality) => {
207
- const equalityB = equality; ///
208
-
209
- if (equalityA !== equalityB) {
210
- return true;
211
- }
212
- });
213
-
214
- return equalities;
215
- }
216
-
217
- function equalityFromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, context) {
218
- let equality = null;
219
-
220
- const types = [],
221
- leftTermVerified = verifyTerm(leftTermNode, types, context),
222
- rightTermVerified = verifyTerm(rightTermNode, types, context);
223
-
224
- if (leftTermVerified && rightTermVerified) {
225
- const firstType = first(types),
226
- secondType = second(types),
227
- leftTermType = firstType, ///
228
- rightTermType = secondType, ///
229
- leftTermTypeEqualToRightTermType = leftTermType.isEqualTo(rightTermType);
230
-
231
- if (leftTermTypeEqualToRightTermType) {
232
- equality = new Equality(leftTermNode, rightTermNode);
233
- } else {
234
- const leftTermTypeSubTypeOfRightTermType = leftTermType.isSubTypeOf(rightTermType);
235
-
236
- if (false) {
237
- ///
238
- } else if (leftTermTypeSubTypeOfRightTermType) {
239
- const variables = [],
240
- rightTermVerifiedAsVariable = verifyTermAsVariable(rightTermNode, variables, context);
241
-
242
- if (rightTermVerifiedAsVariable) {
243
- let rightVariable;
244
-
245
- const firstVariable = first(variables);
246
-
247
- rightVariable = firstVariable; ///
248
-
249
- const rightVariableName = rightVariable.getName(),
250
- rightName = rightVariableName, ///
251
- rightType = leftTermType; ///
252
-
253
- rightVariable = Variable.fromTypeAndName(rightType, rightName);
254
-
255
- context.addVariable(rightVariable);
256
-
257
- equality = new Equality(leftTermNode, rightTermNode);
258
- }
259
- }
260
- }
261
-
262
- if (equality === null) {
263
- const leftTermString = context.nodeAsString(leftTermNode),
264
- rightTermString = context.nodeAsString(rightTermNode),
265
- leftTermTypeName = leftTermType.getName(),
266
- rightTermTypeName = rightTermType.getName();
267
-
268
- context.error(`The left '${leftTermString}' term's '${leftTermTypeName}' type is not equal to the right '${rightTermString}' term's '${rightTermTypeName}' type and neither can be inferred.'`, leftTermNode);
269
- }
270
- }
271
-
272
- return equality;
273
- }
package/src/log.js CHANGED
@@ -103,7 +103,7 @@ export default class Log {
103
103
  }
104
104
  }
105
105
 
106
- function formatMessage(level, message, node, tokens, filePath) {
106
+ function formatMessage(level, message, node = null, tokens = null, filePath = null) {
107
107
  const upperCaseLevel = level.toUpperCase();
108
108
 
109
109
  if (node === null) {
package/src/premise.js CHANGED
@@ -43,9 +43,9 @@ export default class Premise {
43
43
  const subproofStatementNode = subproofStatementNodes[index],
44
44
  nonTerminalNodeA = ruleSubproofAssertionMetastatementNode, ///
45
45
  nonTerminalNodeB = subproofStatementNode, ///
46
- nonTerminalNodeMatches = premiseStatementForMetavariableVerifier.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
46
+ nonTerminalNodeVerifies = premiseStatementForMetavariableVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
47
47
 
48
- if (nonTerminalNodeMatches) {
48
+ if (nonTerminalNodeVerifies) {
49
49
  return true;
50
50
  }
51
51
  });
@@ -58,8 +58,8 @@ export default class Premise {
58
58
  matchStatementNode(statementNode, substitutions) {
59
59
  const nonTerminalNodeA = this.metastatementNode, ///
60
60
  nonTerminalNodeB = statementNode, ///
61
- nonTerminalNodeMatches = premiseStatementForMetavariableVerifier.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions),
62
- statementNodeMatches = nonTerminalNodeMatches; ///
61
+ nonTerminalNodeVerifies = premiseStatementForMetavariableVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions),
62
+ statementNodeMatches = nonTerminalNodeVerifies; ///
63
63
 
64
64
  return statementNodeMatches;
65
65
  }
@@ -82,15 +82,15 @@ export default class Premise {
82
82
 
83
83
  if (ruleSubproofMetastatementNodesLength === ruleSubproofAssertionMetastatementNodesLength) {
84
84
  ruleSubproofNodeMatches = ruleSubproofAssertionMetastatementNodes.every((ruleSubproofAssertionMetastatementNode, index) => {
85
- const ruleSubproofMetastatementNode = ruleSubproofMetastatementNodes[index],
86
- nonTerminalNodeA = ruleSubproofAssertionMetastatementNode, ///
87
- nonTerminalNodeB = ruleSubproofMetastatementNode, ///
88
- nonTerminalNodeMatches = premiseMetastatementForMetavariableVerifier.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
89
-
90
- if (nonTerminalNodeMatches) {
91
- return true;
92
- }
93
- });
85
+ const ruleSubproofMetastatementNode = ruleSubproofMetastatementNodes[index],
86
+ nonTerminalNodeA = ruleSubproofAssertionMetastatementNode, ///
87
+ nonTerminalNodeB = ruleSubproofMetastatementNode, ///
88
+ nonTerminalNodeVerifies = premiseMetastatementForMetavariableVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
89
+
90
+ if (nonTerminalNodeVerifies) {
91
+ return true;
92
+ }
93
+ });
94
94
  }
95
95
  }
96
96
 
@@ -100,8 +100,8 @@ export default class Premise {
100
100
  matchMetastatementNode(metastatementNode, substitutions) {
101
101
  const nonTerminalNodeA = this.metastatementNode, ///
102
102
  nonTerminalNodeB = metastatementNode, ///
103
- nonTerminalNodeMatches = premiseMetastatementForMetavariableVerifier.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions),
104
- metastatementNodeMatches = nonTerminalNodeMatches; ///
103
+ nonTerminalNodeVerifies = premiseMetastatementForMetavariableVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions),
104
+ metastatementNodeMatches = nonTerminalNodeVerifies; ///
105
105
 
106
106
  return metastatementNodeMatches;
107
107
  }
@@ -37,15 +37,15 @@ export default class Supposition {
37
37
 
38
38
  if (subproofStatementNodesLength === subproofAssertionStatementNodesLength) {
39
39
  subproofNodeMatches = subproofAssertionStatementNodes.every((subproofAssertionStatementNode, index) => {
40
- const subproofStatementNode = subproofStatementNodes[index],
41
- nonTerminalNodeA = subproofAssertionStatementNode, ///
42
- nonTerminalNodeB = subproofStatementNode, ///
43
- nonTerminalNodeMatches = suppositionTermForVariableVerifier.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
44
-
45
- if (nonTerminalNodeMatches) {
46
- return true;
47
- }
48
- });
40
+ const subproofStatementNode = subproofStatementNodes[index],
41
+ nonTerminalNodeA = subproofAssertionStatementNode, ///
42
+ nonTerminalNodeB = subproofStatementNode, ///
43
+ nonTerminalNodeVerifies = suppositionTermForVariableVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
44
+
45
+ if (nonTerminalNodeVerifies) {
46
+ return true;
47
+ }
48
+ });
49
49
  }
50
50
  }
51
51
 
@@ -55,8 +55,8 @@ export default class Supposition {
55
55
  matchStatementNode(statementNode, substitutions) {
56
56
  const nonTerminalNodeA = this.statementNode, ///
57
57
  nonTerminalNodeB = statementNode, ///
58
- nonTerminalNodeMatches = suppositionTermForVariableVerifier.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions),
59
- statementNodeMatches = nonTerminalNodeMatches; ///
58
+ nonTerminalNodeVerifies = suppositionTermForVariableVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions),
59
+ statementNodeMatches = nonTerminalNodeVerifies; ///
60
60
 
61
61
  return statementNodeMatches;
62
62
  }
@@ -10,8 +10,8 @@ import { metavariableNameFromMetavariableNode } from "../utilities/query";
10
10
  const metavariableNodeQuery = nodeQuery('/metastatement/metavariable!');
11
11
 
12
12
  export default class MetastatementForMetavariableVerifier extends Verifier {
13
- matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions) {
14
- let nonTerminalNodeMatches = false;
13
+ verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions) {
14
+ let nonTerminalNodeVerifies = false;
15
15
 
16
16
  const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
17
17
  nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName();
@@ -23,37 +23,37 @@ export default class MetastatementForMetavariableVerifier extends Verifier {
23
23
  if (nonTerminalNodeARuleNameMetastatementRuleName && nonTerminalNodeBRuleNameMetastatementRuleName) {
24
24
  const metastatementNodeA = nonTerminalNodeA, ///
25
25
  metastatementNodeB = nonTerminalNodeB, ///
26
- metastatementNodeMatches = this.matchMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions);
26
+ metastatementNodeVerifies = this.verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions);
27
27
 
28
- if (metastatementNodeMatches) {
29
- nonTerminalNodeMatches = true; ///
28
+ if (metastatementNodeVerifies) {
29
+ nonTerminalNodeVerifies = true; ///
30
30
  } else {
31
- nonTerminalNodeMatches = super.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
31
+ nonTerminalNodeVerifies = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
32
32
  }
33
33
  } else {
34
- nonTerminalNodeMatches = super.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
34
+ nonTerminalNodeVerifies = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
35
35
  }
36
36
  }
37
37
 
38
- return nonTerminalNodeMatches;
38
+ return nonTerminalNodeVerifies;
39
39
  }
40
40
 
41
- matchMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions) {
42
- let metastatementNodeMatches = false;
41
+ verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions) {
42
+ let metastatementNodeVerifies = false;
43
43
 
44
44
  const metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
45
45
 
46
46
  if (metavariableNodeA !== null) {
47
- const metaVariableNodeMatches = this.matchMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions);
47
+ const metaVariableNodeVerifies = this.verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions);
48
48
 
49
- metastatementNodeMatches = metaVariableNodeMatches; ///
49
+ metastatementNodeVerifies = metaVariableNodeVerifies; ///
50
50
  }
51
51
 
52
- return metastatementNodeMatches;
52
+ return metastatementNodeVerifies;
53
53
  }
54
54
 
55
- matchMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions) {
56
- let metavariableNodeMatches;
55
+ verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions) {
56
+ let metavariableNodeVerifies;
57
57
 
58
58
  const metavariableNameA = metavariableNameFromMetavariableNode(metavariableNodeA),
59
59
  substitution = substitutions.find((substitution) => {
@@ -66,9 +66,9 @@ export default class MetastatementForMetavariableVerifier extends Verifier {
66
66
 
67
67
  if (substitution !== null) {
68
68
  const metastatementNode = metastatementNodeB, ///
69
- substitutionNodesMatch = substitution.matchMetastatementNode(metastatementNode);
69
+ metastatementNodeMatches = substitution.matchMetastatementNode(metastatementNode);
70
70
 
71
- metavariableNodeMatches = substitutionNodesMatch; ///
71
+ metavariableNodeVerifies = metastatementNodeMatches; ///
72
72
  } else {
73
73
  const { createSubstitutions } = this.constructor;
74
74
 
@@ -81,9 +81,9 @@ export default class MetastatementForMetavariableVerifier extends Verifier {
81
81
  substitutions.push(substitution);
82
82
  }
83
83
 
84
- metavariableNodeMatches = true;
84
+ metavariableNodeVerifies = true;
85
85
  }
86
86
 
87
- return metavariableNodeMatches;
87
+ return metavariableNodeVerifies;
88
88
  }
89
89
  }
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+
3
+ import Verifier from "../verifier";
4
+ import verifyTerm from "../verify/term";
5
+
6
+ import { first } from "../utilities/array";
7
+ import { objectType } from "../type";
8
+ import { OBJECT_TYPE_NAME } from "../typeNames";
9
+ import { STATEMENT_META_TYPE } from "../metaTypes";
10
+ import { nodeQuery, typeNameFromTypeNode } from "../utilities/query";
11
+ import { ARGUMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../ruleNames";
12
+
13
+ const termNodeQuery = nodeQuery("/argument/term!"),
14
+ typeNodeQuery = nodeQuery("/argument/type!"),
15
+ metaTypeNodeQuery = nodeQuery("/metaArgument/metaType!"),
16
+ statementNodeQuery = nodeQuery("/metaArgument/statement!"),
17
+ metaTypeTerminalNodeQuery = nodeQuery("/metaType/@meta-type");
18
+
19
+ class StatementVerifier extends Verifier {
20
+ verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, context) {
21
+ let nonTerminalNodeVerified = false;
22
+
23
+ const nonTerminalNode = nonTerminalNodeA, ///
24
+ combinatorNonTerminalNode = nonTerminalNodeB; ///
25
+
26
+ const ruleName = nonTerminalNode.getRuleName(), ///
27
+ combinatorRuleName = combinatorNonTerminalNode.getRuleName(); ///
28
+
29
+ if (ruleName === combinatorRuleName) {
30
+ switch (ruleName) {
31
+ case ARGUMENT_RULE_NAME: {
32
+ const argumentNode = nonTerminalNode, ///
33
+ combinatorArgumentNode = combinatorNonTerminalNode, ///
34
+ argumentNodeVerified = this.verifyArgumentNode(argumentNode, combinatorArgumentNode, substitutions, context);
35
+
36
+ nonTerminalNodeVerified = argumentNodeVerified; ///
37
+
38
+ break;
39
+ }
40
+
41
+ case META_ARGUMENT_RULE_NAME: {
42
+ const metaArgumentNode = nonTerminalNode, ///
43
+ combinatorMetaargumentNode = combinatorNonTerminalNode, ///
44
+ metaArgumentNodeVerified = this.verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, substitutions, context);
45
+
46
+ nonTerminalNodeVerified = metaArgumentNodeVerified; ///
47
+
48
+ break;
49
+ }
50
+
51
+ default: {
52
+ const childNodes = nonTerminalNode.getChildNodes(),
53
+ combinatorChildNodes = combinatorNonTerminalNode.getChildNodes(),
54
+ nodesA = childNodes, ///
55
+ nodesB = combinatorChildNodes, ///
56
+ nodesVerified = this.verifyNodes(nodesA, nodesB, substitutions, context);
57
+
58
+ nonTerminalNodeVerified = nodesVerified; ///
59
+
60
+ break;
61
+ }
62
+ }
63
+ }
64
+
65
+ return nonTerminalNodeVerified;
66
+ }
67
+
68
+ verifyArgumentNode(argumentNode, combinatorArgumentNode, substitutions, context) {
69
+ let argumentNodeVerified = false;
70
+
71
+ const termNode = termNodeQuery(argumentNode);
72
+
73
+ if (termNode === null) {
74
+ const argumentString = context.nodeAsString(argumentNode);
75
+
76
+ context.error(`The ${argumentString} argument should be a term, not a type`, argumentNode);
77
+ } else {
78
+ const types = [],
79
+ termVerified = verifyTerm(termNode, types, context);
80
+
81
+ if (termVerified) {
82
+ const firstType = first(types),
83
+ termType = firstType, ///
84
+ typeNode = typeNodeQuery(combinatorArgumentNode),
85
+ typeName = typeNameFromTypeNode(typeNode),
86
+ type = (typeName === OBJECT_TYPE_NAME) ?
87
+ objectType : ///
88
+ context.findTypeByTypeName(typeName),
89
+ statementTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(type);
90
+
91
+ if (statementTypeEqualToOrSubTypeOfType) {
92
+ argumentNodeVerified = true;
93
+ }
94
+ }
95
+ }
96
+
97
+ return argumentNodeVerified;
98
+ }
99
+
100
+ verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, substitutions, context) {
101
+ let metaArgumentNodeVerified = false;
102
+
103
+ const statementNode = statementNodeQuery(metaArgumentNode),
104
+ combinatorMetaTYpeNode = metaTypeNodeQuery(combinatorMetaargumentNode);
105
+
106
+ if (statementNode === null) {
107
+ const metaArgumentString = context.nodeAsString(metaArgumentNode);
108
+
109
+ context.error(`Expected a statement but got a '${metaArgumentString}' meta-type.`, metaArgumentNode);
110
+ } else {
111
+ if (combinatorMetaTYpeNode === null) {
112
+ const combinatorMetaargumentString = context.nodeAsString(combinatorMetaargumentNode);
113
+
114
+ context.error(`Expected a meta-type but got a '${combinatorMetaargumentString}' statement.`, metaArgumentNode);
115
+ } else {
116
+ const combinatorMetaTypeTerminalNode = metaTypeTerminalNodeQuery(combinatorMetaTYpeNode),
117
+ content = combinatorMetaTypeTerminalNode.getContent(),
118
+ contentStatementMetaType = (content === STATEMENT_META_TYPE);
119
+
120
+ if (!contentStatementMetaType) {
121
+ context.error(`Expected the meta-type to be 'Statement' but got '${content}'.`, metaArgumentNode);
122
+ } else {
123
+ metaArgumentNodeVerified = true;
124
+ }
125
+ }
126
+ }
127
+
128
+ return metaArgumentNodeVerified;
129
+ }
130
+ }
131
+
132
+ const statementVerifier = new StatementVerifier();
133
+
134
+ export default statementVerifier;
135
+