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.
- package/lib/assignment.js +60 -0
- package/lib/conclusion.js +3 -3
- package/lib/consequence.js +2 -2
- package/lib/constants.js +1 -5
- package/lib/context/proof.js +1 -20
- package/lib/equality.js +22 -81
- package/lib/log.js +3 -2
- package/lib/premise.js +7 -7
- package/lib/supposition.js +4 -4
- package/lib/variable.js +23 -3
- 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 +56 -68
- 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 +87 -132
- package/lib/verify/statementAsCombinator.js +2 -2
- package/lib/verify/supposition.js +4 -4
- package/package.json +1 -1
- package/src/{assertion/type.js → assignment.js} +4 -4
- package/src/conclusion.js +4 -4
- package/src/consequence.js +2 -2
- package/src/constants.js +0 -1
- package/src/context/proof.js +0 -25
- package/src/equality.js +20 -109
- package/src/log.js +1 -1
- package/src/premise.js +15 -15
- package/src/supposition.js +11 -11
- package/src/variable.js +18 -2
- 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 +83 -82
- 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 +87 -200
- package/src/verify/statementAsCombinator.js +2 -2
- package/src/verify/supposition.js +4 -4
- package/lib/assertion/type.js +0 -60
- package/lib/node/statement/equality.js +0 -16
- 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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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(
|
|
68
|
+
equate(context) {
|
|
83
69
|
const leftNonTerminalNode = this.leftTermNode, ///
|
|
84
70
|
rightNonTerminalNode = this.rightTermNode, ///
|
|
85
|
-
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode,
|
|
71
|
+
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, context),
|
|
86
72
|
equates = nonTerminalNodeEquates; ///
|
|
87
73
|
|
|
88
74
|
return equates;
|
|
89
75
|
}
|
|
90
76
|
|
|
91
|
-
static
|
|
92
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
}
|
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
|
|
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
|
-
|
|
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
|
-
substitutionNodesMatch = substitution.
|
|
69
|
+
substitutionNodesMatch = substitution.verifyMetastatementNode(metastatementNode);
|
|
70
70
|
|
|
71
|
-
|
|
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
|
-
|
|
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
|
+
|