occam-verify-cli 0.0.532 → 0.0.534

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 (62) 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/constants.js +1 -5
  5. package/lib/context/proof.js +1 -20
  6. package/lib/equality.js +22 -81
  7. package/lib/log.js +3 -2
  8. package/lib/premise.js +7 -7
  9. package/lib/supposition.js +4 -4
  10. package/lib/variable.js +23 -3
  11. package/lib/verifier/metastatementForMetavariable.js +23 -23
  12. package/lib/verifier/statement.js +199 -0
  13. package/lib/verifier/statementForMetavariable.js +25 -25
  14. package/lib/verifier/termForVariable.js +23 -23
  15. package/lib/verifier.js +27 -26
  16. package/lib/verify/assertion/type.js +56 -68
  17. package/lib/verify/conclusion.js +2 -2
  18. package/lib/verify/consequence.js +2 -2
  19. package/lib/verify/derivation.js +3 -3
  20. package/lib/verify/metastatement/qualified.js +3 -3
  21. package/lib/verify/metastatement/unqualified.js +3 -3
  22. package/lib/verify/metastatement.js +2 -2
  23. package/lib/verify/premise.js +2 -2
  24. package/lib/verify/ruleDerivation.js +3 -3
  25. package/lib/verify/statement/qualified.js +3 -3
  26. package/lib/verify/statement/unqualified.js +3 -3
  27. package/lib/verify/statement.js +87 -132
  28. package/lib/verify/statementAsCombinator.js +2 -2
  29. package/lib/verify/supposition.js +4 -4
  30. package/package.json +1 -1
  31. package/src/{assertion/type.js → assignment.js} +4 -4
  32. package/src/conclusion.js +4 -4
  33. package/src/consequence.js +2 -2
  34. package/src/constants.js +0 -1
  35. package/src/context/proof.js +0 -25
  36. package/src/equality.js +20 -109
  37. package/src/log.js +1 -1
  38. package/src/premise.js +15 -15
  39. package/src/supposition.js +11 -11
  40. package/src/variable.js +18 -2
  41. package/src/verifier/metastatementForMetavariable.js +19 -19
  42. package/src/verifier/statement.js +135 -0
  43. package/src/verifier/statementForMetavariable.js +21 -21
  44. package/src/verifier/termForVariable.js +19 -19
  45. package/src/verifier.js +21 -21
  46. package/src/verify/assertion/type.js +83 -82
  47. package/src/verify/conclusion.js +2 -2
  48. package/src/verify/consequence.js +2 -2
  49. package/src/verify/derivation.js +4 -4
  50. package/src/verify/metastatement/qualified.js +2 -2
  51. package/src/verify/metastatement/unqualified.js +2 -2
  52. package/src/verify/metastatement.js +1 -1
  53. package/src/verify/premise.js +2 -2
  54. package/src/verify/ruleDerivation.js +4 -4
  55. package/src/verify/statement/qualified.js +2 -2
  56. package/src/verify/statement/unqualified.js +2 -2
  57. package/src/verify/statement.js +87 -200
  58. package/src/verify/statementAsCombinator.js +2 -2
  59. package/src/verify/supposition.js +4 -4
  60. package/lib/assertion/type.js +0 -60
  61. package/lib/node/statement/equality.js +0 -16
  62. package/src/node/statement/equality.js +0 -10
package/src/equality.js CHANGED
@@ -1,18 +1,6 @@
1
1
  "use strict";
2
2
 
3
- import matcher from "./matcher";
4
- import verifyTerm from "./verify/term";
5
- import equalityCombinator from "./ocmbinator/equality";
6
- import equalityStatementNode from "./node/statement/equality";
7
-
8
- import { nodeQuery } from "./utilities/query";
9
- import { first, second } from "./utilities/array";
10
- import { EQUALITY_DEPTH } from "./constants";
11
3
  import { TERM_RULE_NAME } from "./ruleNames";
12
- import { verifyStatementAgainstCombinator } from "./verify/statement";
13
-
14
- const leftTermNodeQuery = nodeQuery("/statement/argument[0]/term!"),
15
- rightTermNodeQuery = nodeQuery("/statement/argument[1]/term!");
16
4
 
17
5
  export default class Equality {
18
6
  constructor(leftTermNode, rightTermNode) {
@@ -28,7 +16,7 @@ export default class Equality {
28
16
  return this.rightTermNode;
29
17
  }
30
18
 
31
- matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context) {
19
+ matchTermNodes(leftTermNode, rightTermNode, reversed, context) {
32
20
  let leftTermNodeAndRightTermNodeMatch = true;
33
21
 
34
22
  if (leftTermNodeAndRightTermNodeMatch) {
@@ -36,7 +24,7 @@ export default class Equality {
36
24
  this.rightTermNode :
37
25
  this.leftTermNode, ///
38
26
  rightNonTerminalNode = leftTermNode, ///
39
- nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context);
27
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, context);
40
28
 
41
29
  leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
42
30
  }
@@ -46,7 +34,7 @@ export default class Equality {
46
34
  this.leftTermNode :
47
35
  this.rightTermNode, ///
48
36
  rightNonTerminalNode = rightTermNode, ///
49
- nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context);
37
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, context);
50
38
 
51
39
  leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
52
40
  }
@@ -54,24 +42,22 @@ export default class Equality {
54
42
  return leftTermNodeAndRightTermNodeMatch;
55
43
  }
56
44
 
57
- match(equality, equalities, context) {
45
+ match(equality, context) {
58
46
  let matches = false;
59
47
 
60
48
  const leftTermNode = equality.getLeftTermNode(),
61
49
  rightTermNode = equality.getRightTermNode();
62
50
 
63
- equalities = filterEqualities(equalities, equality); ///
64
-
65
51
  if (!matches) {
66
52
  const reversed = false,
67
- leftTermNodeAndRightTermNodeMatch = this.matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context);
53
+ leftTermNodeAndRightTermNodeMatch = this.matchTermNodes(leftTermNode, rightTermNode, reversed, context);
68
54
 
69
55
  matches = leftTermNodeAndRightTermNodeMatch; ///
70
56
  }
71
57
 
72
58
  if (!matches) {
73
59
  const reversed = true,
74
- leftTermNodeAndRightTermNodeMatch = this.matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context);
60
+ leftTermNodeAndRightTermNodeMatch = this.matchTermNodes(leftTermNode, rightTermNode, reversed, context);
75
61
 
76
62
  matches = leftTermNodeAndRightTermNodeMatch; ///
77
63
  }
@@ -79,55 +65,23 @@ export default class Equality {
79
65
  return matches;
80
66
  }
81
67
 
82
- equate(equalities, context) {
68
+ equate(context) {
83
69
  const leftNonTerminalNode = this.leftTermNode, ///
84
70
  rightNonTerminalNode = this.rightTermNode, ///
85
- nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context),
71
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, context),
86
72
  equates = nonTerminalNodeEquates; ///
87
73
 
88
74
  return equates;
89
75
  }
90
76
 
91
- static fromProofStep(proofStep) {
92
- let equality = null;
93
-
94
- const statementNode = proofStep.getStatementNode();
95
-
96
- if (statementNode !== null) {
97
- const nodeA = statementNode, ///
98
- nodeB = equalityStatementNode, ///
99
- depth = EQUALITY_DEPTH,
100
- nodeMatches = matcher.matchNode(nodeA, nodeB, depth);
101
-
102
- if (nodeMatches) {
103
- const leftTermNode = leftTermNodeQuery(statementNode),
104
- rightTermNode = rightTermNodeQuery(statementNode);
105
-
106
- equality = new Equality(leftTermNode, rightTermNode);
107
- }
108
- }
109
-
110
- return equality;
111
- }
112
-
113
- static fromStatementNode(statementNode, context) {
114
- let equality = null;
115
-
116
- const combinator = equalityCombinator, ///
117
- statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
118
-
119
- if (statementVerifiedAgainstCombinator) {
120
- const leftTermNode = leftTermNodeQuery(statementNode),
121
- rightTermNode = rightTermNodeQuery(statementNode);
122
-
123
- equality = new Equality(leftTermNode, rightTermNode);
124
- }
77
+ static fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode) {
78
+ const equality = new Equality(leftTermNode, rightTermNode);
125
79
 
126
80
  return equality;
127
81
  }
128
82
  }
129
83
 
130
- function equateNode(nodeA, nodeB, equalities, context) {
84
+ function equateNode(nodeA, nodeB, context) {
131
85
  let nodeEquates = false;
132
86
 
133
87
  const nodeATerminalNode = nodeA.isTerminalNode(),
@@ -137,13 +91,13 @@ function equateNode(nodeA, nodeB, equalities, context) {
137
91
  if (nodeATerminalNode) {
138
92
  const terminalNodeA = nodeA, ///
139
93
  terminalNodeB = nodeB, ///
140
- terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, equalities, context);
94
+ terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, context);
141
95
 
142
96
  nodeEquates = terminalNodeEquates; ///
143
97
  } else {
144
98
  const nonTerminalNodeA = nodeA, ///
145
99
  nonTerminalNodeB = nodeB, ///
146
- nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equalities, context);
100
+ nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context);
147
101
 
148
102
  nodeEquates = nonTerminalNodeEquates; ///
149
103
  }
@@ -152,7 +106,7 @@ function equateNode(nodeA, nodeB, equalities, context) {
152
106
  return nodeEquates;
153
107
  }
154
108
 
155
- function equateNodes(leftNodes, rightNodes, equalities, context) {
109
+ function equateNodes(leftNodes, rightNodes, context) {
156
110
  let nodesEquate = false;
157
111
 
158
112
  const leftNodesLength = leftNodes.length,
@@ -161,7 +115,7 @@ function equateNodes(leftNodes, rightNodes, equalities, context) {
161
115
  if (leftNodesLength === rightNodesLength) {
162
116
  nodesEquate = leftNodes.every((LeftNode, index) => {
163
117
  const rightNode = rightNodes[index],
164
- nodeEquates = equateNode(LeftNode, rightNode, equalities, context);
118
+ nodeEquates = equateNode(LeftNode, rightNode, context);
165
119
 
166
120
  if (nodeEquates) {
167
121
  return true;
@@ -172,14 +126,14 @@ function equateNodes(leftNodes, rightNodes, equalities, context) {
172
126
  return nodesEquate;
173
127
  }
174
128
 
175
- function equateTerminalNode(terminalNodeA, terminalNodeB, equalities, context) {
129
+ function equateTerminalNode(terminalNodeA, terminalNodeB, context) {
176
130
  const matches = terminalNodeA.match(terminalNodeB),
177
131
  terminalNodeEquates = matches; ///
178
132
 
179
133
  return terminalNodeEquates;
180
134
  }
181
135
 
182
- function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context) {
136
+ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, context) {
183
137
  let nonTerminalNodeEquates = false;
184
138
 
185
139
  const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
@@ -192,7 +146,7 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
192
146
  if (ruleNameTermRuleName) {
193
147
  const leftTermNode = leftNonTerminalNode, ///
194
148
  rightTermNode = rightNonTerminalNode, ///
195
- termNodeEquates = equateTermNode(leftTermNode, rightTermNode, equalities, context);
149
+ termNodeEquates = equateTermNode(leftTermNode, rightTermNode, context);
196
150
 
197
151
  nonTerminalNodeEquates = termNodeEquates; ///
198
152
  }
@@ -202,7 +156,7 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
202
156
  rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(),
203
157
  leftNodes = leftNonTerminalNodeChildNodes, ///
204
158
  rightNodes = rightNonTerminalNodeChildNodes, ///
205
- nodesEquate = equateNodes(leftNodes, rightNodes, equalities, context);
159
+ nodesEquate = equateNodes(leftNodes, rightNodes, context);
206
160
 
207
161
  nonTerminalNodeEquates = nodesEquate; ///
208
162
  }
@@ -211,7 +165,7 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
211
165
  return nonTerminalNodeEquates;
212
166
  }
213
167
 
214
- function equateTermNode(leftTermNode, rightTermNode, equalities, context) {
168
+ function equateTermNode(leftTermNode, rightTermNode, context) {
215
169
  let termNodeEquates = false;
216
170
 
217
171
  const equality = equalityFromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, context);
@@ -232,46 +186,3 @@ function equateTermNode(leftTermNode, rightTermNode, equalities, context) {
232
186
 
233
187
  return termNodeEquates;
234
188
  }
235
-
236
- function filterEqualities(equalities, equality) {
237
- const equalityA = equality; ///
238
-
239
- equalities = equalities.filter((equality) => {
240
- const equalityB = equality; ///
241
-
242
- if (equalityA !== equalityB) {
243
- return true;
244
- }
245
- });
246
-
247
- return equalities;
248
- }
249
-
250
- function equalityFromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, context) {
251
- let equality = null;
252
-
253
- const types = [],
254
- leftTermVerified = verifyTerm(leftTermNode, types, context),
255
- rightTermVerified = verifyTerm(rightTermNode, types, context);
256
-
257
- if (leftTermVerified && rightTermVerified) {
258
- const firstType = first(types),
259
- secondType = second(types),
260
- leftTermType = firstType, ///
261
- rightTermType = secondType, ///
262
- leftTermTypeEqualToRightTermType = leftTermType.isEqualTo(rightTermType);
263
-
264
- if (leftTermTypeEqualToRightTermType) {
265
- equality = new Equality(leftTermNode, rightTermNode);
266
- } else {
267
- const leftTermString = context.nodeAsString(leftTermNode),
268
- rightTermString = context.nodeAsString(rightTermNode),
269
- leftTermTypeName = leftTermType.getName(),
270
- rightTermTypeName = rightTermType.getName();
271
-
272
- context.error(`The left '${leftTermString}' term's '${leftTermTypeName}' type is not equal to the right '${rightTermString}' term's '${rightTermTypeName}' type.'`, leftTermNode);
273
- }
274
- }
275
-
276
- return equality;
277
- }
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
  }
package/src/variable.js CHANGED
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
 
3
3
  export default class Variable {
4
- constructor(type, name) {
4
+ constructor(type, name, termNode) {
5
5
  this.type = type;
6
6
  this.name = name;
7
+ this.termNode = termNode;
7
8
  }
8
9
 
9
10
  getType() {
@@ -14,6 +15,14 @@ export default class Variable {
14
15
  return this.name;
15
16
  }
16
17
 
18
+ getTermNode() {
19
+ return this.termNode;
20
+ }
21
+
22
+ isUndefined() {
23
+ return (this.termNode === null);
24
+ }
25
+
17
26
  matchName(name) {
18
27
  const matchesName = (this.name === name);
19
28
 
@@ -28,7 +37,14 @@ export default class Variable {
28
37
  }
29
38
 
30
39
  static fromTypeAndName(type, name) {
31
- const variable = new Variable(type, name);
40
+ const termNode = null,
41
+ variable = new Variable(type, name, termNode);
42
+
43
+ return variable;
44
+ }
45
+
46
+ static fromTypeNameAndTermNode(type, name, termNode) {
47
+ const variable = new Variable(type, name, termNode);
32
48
 
33
49
  return variable;
34
50
  }
@@ -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
+ substitutionNodesMatch = substitution.verifyMetastatementNode(metastatementNode);
70
70
 
71
- metavariableNodeMatches = substitutionNodesMatch; ///
71
+ metavariableNodeVerifies = substitutionNodesMatch; ///
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
+