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.
- package/lib/assignment.js +60 -0
- package/lib/conclusion.js +3 -3
- package/lib/consequence.js +2 -2
- package/lib/equality.js +22 -113
- package/lib/log.js +3 -2
- package/lib/premise.js +7 -7
- package/lib/supposition.js +4 -4
- package/lib/verifier/metastatementForMetavariable.js +23 -23
- package/lib/verifier/statement.js +199 -0
- package/lib/verifier/statementForMetavariable.js +25 -25
- package/lib/verifier/termForVariable.js +23 -23
- package/lib/verifier.js +27 -26
- package/lib/verify/assertion/type.js +7 -7
- package/lib/verify/conclusion.js +2 -2
- package/lib/verify/consequence.js +2 -2
- package/lib/verify/derivation.js +3 -3
- package/lib/verify/metastatement/qualified.js +3 -3
- package/lib/verify/metastatement/unqualified.js +3 -3
- package/lib/verify/metastatement.js +2 -2
- package/lib/verify/premise.js +2 -2
- package/lib/verify/ruleDerivation.js +3 -3
- package/lib/verify/statement/qualified.js +3 -3
- package/lib/verify/statement/unqualified.js +3 -3
- package/lib/verify/statement.js +21 -121
- package/lib/verify/statementAsCombinator.js +2 -2
- package/lib/verify/supposition.js +4 -4
- package/package.json +1 -1
- package/src/{assertion.js → assignment.js} +4 -4
- package/src/conclusion.js +4 -4
- package/src/consequence.js +2 -2
- package/src/equality.js +20 -105
- package/src/log.js +1 -1
- package/src/premise.js +15 -15
- package/src/supposition.js +11 -11
- package/src/verifier/metastatementForMetavariable.js +19 -19
- package/src/verifier/statement.js +135 -0
- package/src/verifier/statementForMetavariable.js +21 -21
- package/src/verifier/termForVariable.js +19 -19
- package/src/verifier.js +21 -21
- package/src/verify/assertion/type.js +6 -6
- package/src/verify/conclusion.js +2 -2
- package/src/verify/consequence.js +2 -2
- package/src/verify/derivation.js +4 -4
- package/src/verify/metastatement/qualified.js +2 -2
- package/src/verify/metastatement/unqualified.js +2 -2
- package/src/verify/metastatement.js +1 -1
- package/src/verify/premise.js +2 -2
- package/src/verify/ruleDerivation.js +4 -4
- package/src/verify/statement/qualified.js +2 -2
- package/src/verify/statement/unqualified.js +2 -2
- package/src/verify/statement.js +26 -193
- package/src/verify/statementAsCombinator.js +2 -2
- package/src/verify/supposition.js +4 -4
- 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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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(
|
|
68
|
+
equate(context) {
|
|
80
69
|
const leftNonTerminalNode = this.leftTermNode, ///
|
|
81
70
|
rightNonTerminalNode = this.rightTermNode, ///
|
|
82
|
-
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode,
|
|
71
|
+
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, context),
|
|
83
72
|
equates = nonTerminalNodeEquates; ///
|
|
84
73
|
|
|
85
74
|
return equates;
|
|
86
75
|
}
|
|
87
76
|
|
|
88
|
-
static
|
|
89
|
-
const
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
46
|
+
nonTerminalNodeVerifies = premiseStatementForMetavariableVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
|
|
47
47
|
|
|
48
|
-
if (
|
|
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
|
-
|
|
62
|
-
statementNodeMatches =
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
104
|
-
metastatementNodeMatches =
|
|
103
|
+
nonTerminalNodeVerifies = premiseMetastatementForMetavariableVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions),
|
|
104
|
+
metastatementNodeMatches = nonTerminalNodeVerifies; ///
|
|
105
105
|
|
|
106
106
|
return metastatementNodeMatches;
|
|
107
107
|
}
|
package/src/supposition.js
CHANGED
|
@@ -37,15 +37,15 @@ export default class Supposition {
|
|
|
37
37
|
|
|
38
38
|
if (subproofStatementNodesLength === subproofAssertionStatementNodesLength) {
|
|
39
39
|
subproofNodeMatches = subproofAssertionStatementNodes.every((subproofAssertionStatementNode, index) => {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
59
|
-
statementNodeMatches =
|
|
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
|
-
|
|
14
|
-
let
|
|
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
|
-
|
|
26
|
+
metastatementNodeVerifies = this.verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions);
|
|
27
27
|
|
|
28
|
-
if (
|
|
29
|
-
|
|
28
|
+
if (metastatementNodeVerifies) {
|
|
29
|
+
nonTerminalNodeVerifies = true; ///
|
|
30
30
|
} else {
|
|
31
|
-
|
|
31
|
+
nonTerminalNodeVerifies = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
|
|
32
32
|
}
|
|
33
33
|
} else {
|
|
34
|
-
|
|
34
|
+
nonTerminalNodeVerifies = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
return
|
|
38
|
+
return nonTerminalNodeVerifies;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
let
|
|
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
|
|
47
|
+
const metaVariableNodeVerifies = this.verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions);
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
metastatementNodeVerifies = metaVariableNodeVerifies; ///
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
return
|
|
52
|
+
return metastatementNodeVerifies;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
let
|
|
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
|
-
|
|
69
|
+
metastatementNodeMatches = substitution.matchMetastatementNode(metastatementNode);
|
|
70
70
|
|
|
71
|
-
|
|
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
|
-
|
|
84
|
+
metavariableNodeVerifies = true;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
return
|
|
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
|
+
|