occam-verify-cli 0.0.678 → 0.0.680
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/action/verify.js +13 -3
- package/lib/axiomLemmaTheoremConjecture.js +3 -3
- package/lib/conclusion.js +16 -5
- package/lib/consequent.js +11 -3
- package/lib/context/file.js +73 -3
- package/lib/context/release.js +7 -2
- package/lib/equality.js +13 -199
- package/lib/premise.js +24 -7
- package/lib/supposition.js +15 -4
- package/lib/type.js +3 -8
- package/lib/utilities/array.js +5 -2
- package/lib/utilities/string.js +26 -13
- package/lib/verifier/node/metastatement.js +176 -0
- package/lib/verifier/node/statementAsCombinator.js +186 -0
- package/lib/verifier/node/termAsConstructor.js +224 -0
- package/lib/verifier/node.js +158 -0
- package/lib/verifier/nodes/equality.js +155 -0
- package/lib/verifier/{metastatementForMetavariable → nodes/metastatementForMetavariable}/conclusion.js +13 -12
- package/lib/verifier/{metastatementForMetavariable → nodes/metastatementForMetavariable}/premise.js +13 -12
- package/lib/verifier/nodes/metastatementForMetavariable.js +198 -0
- package/lib/verifier/nodes/statement.js +200 -0
- package/lib/verifier/{statementForMetavariable → nodes/statementForMetavariable}/conclusion.js +13 -12
- package/lib/verifier/{statementForMetavariable → nodes/statementForMetavariable}/premise.js +13 -12
- package/lib/verifier/nodes/statementForMetavariable.js +203 -0
- package/lib/verifier/nodes/term.js +210 -0
- package/lib/verifier/{termForVariable/supposition.js → nodes/termForVariable/consequent.js} +13 -12
- package/lib/verifier/{termForVariable/consequent.js → nodes/termForVariable/supposition.js} +13 -12
- package/lib/verifier/nodes/termForVariable.js +217 -0
- package/lib/verifier/nodes.js +175 -0
- package/lib/verify/axiom.js +3 -3
- package/lib/verify/conclusion.js +3 -3
- package/lib/verify/conjecture.js +3 -3
- package/lib/verify/consequent.js +3 -3
- package/lib/verify/declaration/combinator.js +7 -2
- package/lib/verify/declaration/constructor.js +8 -2
- package/lib/verify/declaration/metavariable.js +7 -2
- package/lib/verify/declaration/type.js +7 -2
- package/lib/verify/declaration/variable.js +8 -2
- package/lib/verify/file.js +3 -3
- package/lib/verify/label.js +9 -4
- package/lib/verify/lemma.js +3 -3
- package/lib/verify/metastatement/qualified.js +5 -6
- package/lib/verify/metastatement/unqualified.js +9 -7
- package/lib/verify/metastatement.js +36 -156
- package/lib/verify/metavariable.js +6 -4
- package/lib/verify/premise.js +3 -3
- package/lib/verify/release.js +3 -3
- package/lib/verify/rule.js +3 -3
- package/lib/verify/statement/qualified.js +5 -6
- package/lib/verify/statement/unqualified.js +9 -7
- package/lib/verify/statement.js +86 -332
- package/lib/verify/statementAsCombinator.js +8 -82
- package/lib/verify/supposition.js +3 -3
- package/lib/verify/term.js +79 -215
- package/lib/verify/termAsConstructor.js +15 -89
- package/lib/verify/terms.js +45 -0
- package/lib/verify/theorem.js +3 -3
- package/lib/verify/type.js +7 -5
- package/lib/verify/typeAssertion.js +124 -0
- package/lib/verify/variable.js +7 -5
- package/package.json +5 -5
- package/src/axiomLemmaTheoremConjecture.js +2 -2
- package/src/conclusion.js +13 -4
- package/src/consequent.js +9 -2
- package/src/context/file.js +9 -2
- package/src/context/release.js +9 -2
- package/src/equality.js +17 -143
- package/src/premise.js +23 -6
- package/src/supposition.js +12 -3
- package/src/type.js +3 -8
- package/src/utilities/array.js +1 -1
- package/src/utilities/string.js +34 -23
- package/src/verifier/node/metastatement.js +61 -0
- package/src/verifier/node/statementAsCombinator.js +80 -0
- package/src/verifier/node/termAsConstructor.js +124 -0
- package/src/verifier/node.js +85 -0
- package/src/verifier/nodes/equality.js +68 -0
- package/src/verifier/nodes/metastatementForMetavariable/conclusion.js +11 -0
- package/src/verifier/nodes/metastatementForMetavariable/premise.js +11 -0
- package/src/verifier/{metastatementForMetavariable.js → nodes/metastatementForMetavariable.js} +13 -13
- package/src/verifier/nodes/statement.js +100 -0
- package/src/verifier/nodes/statementForMetavariable/conclusion.js +11 -0
- package/src/verifier/nodes/statementForMetavariable/premise.js +11 -0
- package/src/verifier/{statementForMetavariable.js → nodes/statementForMetavariable.js} +10 -10
- package/src/verifier/nodes/term.js +106 -0
- package/src/verifier/nodes/termForVariable/consequent.js +11 -0
- package/src/verifier/nodes/termForVariable/supposition.js +11 -0
- package/src/verifier/{termForVariable.js → nodes/termForVariable.js} +42 -30
- package/src/verifier/nodes.js +111 -0
- package/src/verify/axiom.js +2 -2
- package/src/verify/conclusion.js +2 -2
- package/src/verify/conjecture.js +2 -2
- package/src/verify/consequent.js +2 -2
- package/src/verify/declaration/combinator.js +9 -1
- package/src/verify/declaration/constructor.js +15 -1
- package/src/verify/declaration/metavariable.js +9 -1
- package/src/verify/declaration/type.js +14 -1
- package/src/verify/declaration/variable.js +15 -1
- package/src/verify/file.js +2 -2
- package/src/verify/label.js +10 -2
- package/src/verify/lemma.js +4 -4
- package/src/verify/metastatement/qualified.js +4 -6
- package/src/verify/metastatement/unqualified.js +9 -7
- package/src/verify/metastatement.js +35 -56
- package/src/verify/metavariable.js +6 -3
- package/src/verify/premise.js +2 -2
- package/src/verify/release.js +2 -2
- package/src/verify/rule.js +2 -2
- package/src/verify/statement/qualified.js +4 -6
- package/src/verify/statement/unqualified.js +9 -7
- package/src/verify/statement.js +109 -302
- package/src/verify/statementAsCombinator.js +9 -129
- package/src/verify/supposition.js +2 -2
- package/src/verify/term.js +99 -156
- package/src/verify/termAsConstructor.js +20 -135
- package/src/verify/terms.js +54 -0
- package/src/verify/theorem.js +2 -2
- package/src/verify/type.js +7 -4
- package/src/verify/typeAssertion.js +164 -0
- package/src/verify/variable.js +7 -4
- package/lib/node/statement/combinator/equality.js +0 -21
- package/lib/ocmbinator/equality.js +0 -126
- package/lib/tokens/statement/combinator/equality.js +0 -17
- package/lib/verifier/metastatementForMetavariable.js +0 -198
- package/lib/verifier/statementForMetavariable.js +0 -203
- package/lib/verifier/termForVariable.js +0 -209
- package/lib/verifier.js +0 -138
- package/lib/verify/assertion/type.js +0 -115
- package/lib/verify/typeInference.js +0 -132
- package/src/node/statement/combinator/equality.js +0 -9
- package/src/ocmbinator/equality.js +0 -23
- package/src/tokens/statement/combinator/equality.js +0 -10
- package/src/verifier/metastatementForMetavariable/conclusion.js +0 -9
- package/src/verifier/metastatementForMetavariable/premise.js +0 -9
- package/src/verifier/statementForMetavariable/conclusion.js +0 -9
- package/src/verifier/statementForMetavariable/premise.js +0 -9
- package/src/verifier/termForVariable/consequent.js +0 -9
- package/src/verifier/termForVariable/supposition.js +0 -9
- package/src/verifier.js +0 -74
- package/src/verify/assertion/type.js +0 -153
- package/src/verify/typeInference.js +0 -146
package/src/verify/statement.js
CHANGED
|
@@ -1,189 +1,51 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import Verifier from "../verifier";
|
|
4
3
|
import Equality from "../equality";
|
|
5
|
-
import
|
|
6
|
-
import equalityCombinator from "../ocmbinator/equality";
|
|
4
|
+
import verifyTerms from "../verify/terms";
|
|
7
5
|
import bracketedCombinator from "../ocmbinator/bracketed";
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
|
|
11
|
-
import { objectType } from "../type";
|
|
12
|
-
import { termVerifier } from "../verify/term";
|
|
13
|
-
import { first, second } from "../utilities/array";
|
|
14
|
-
import { OBJECT_TYPE_NAME } from "../typeNames";
|
|
15
|
-
import { STATEMENT_META_TYPE } from "../metaTypes";
|
|
16
|
-
import { verifyTermAsVariable } from "../verify/term";
|
|
17
|
-
import { nodeQuery, typeNameFromTypeNode } from "../utilities/query";
|
|
18
|
-
import { ARGUMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../ruleNames";
|
|
19
|
-
|
|
20
|
-
const termNodeQuery = nodeQuery("/argument/term!"),
|
|
21
|
-
typeNodeQuery = nodeQuery("/argument/type!"),
|
|
22
|
-
metaTypeNodeQuery = nodeQuery("/metaArgument/metaType!"),
|
|
23
|
-
statementNodeQuery = nodeQuery("/metaArgument/statement!"),
|
|
24
|
-
typeInferenceNodeQuery = nodeQuery("/statement/typeInference!"),
|
|
25
|
-
typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!"),
|
|
26
|
-
metaTypeTerminalNodeQuery = nodeQuery("/metaType/@meta-type");
|
|
27
|
-
|
|
28
|
-
class StatementVerifier extends Verifier {
|
|
29
|
-
verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context) {
|
|
30
|
-
let nonTerminalNodeVerified = false;
|
|
31
|
-
|
|
32
|
-
const nonTerminalNode = nonTerminalNodeA, ///
|
|
33
|
-
combinatorNonTerminalNode = nonTerminalNodeB; ///
|
|
34
|
-
|
|
35
|
-
const ruleName = nonTerminalNode.getRuleName(), ///
|
|
36
|
-
combinatorRuleName = combinatorNonTerminalNode.getRuleName(); ///
|
|
37
|
-
|
|
38
|
-
if (ruleName === combinatorRuleName) {
|
|
39
|
-
switch (ruleName) {
|
|
40
|
-
case ARGUMENT_RULE_NAME: {
|
|
41
|
-
const argumentNode = nonTerminalNode, ///
|
|
42
|
-
constructorArgumentNode = combinatorNonTerminalNode, ///
|
|
43
|
-
argumentNodeVerified = termVerifier.verifyArgumentNode(argumentNode, constructorArgumentNode, context);
|
|
44
|
-
|
|
45
|
-
nonTerminalNodeVerified = argumentNodeVerified; ///
|
|
46
|
-
|
|
47
|
-
break;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
case META_ARGUMENT_RULE_NAME: {
|
|
51
|
-
const metaArgumentNode = nonTerminalNode, ///
|
|
52
|
-
combinatorMetaargumentNode = combinatorNonTerminalNode, ///
|
|
53
|
-
metaArgumentNodeVerified = this.verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, context);
|
|
54
|
-
|
|
55
|
-
nonTerminalNodeVerified = metaArgumentNodeVerified; ///
|
|
56
|
-
|
|
57
|
-
break;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
default: {
|
|
61
|
-
const childNodes = nonTerminalNode.getChildNodes(),
|
|
62
|
-
combinatorChildNodes = combinatorNonTerminalNode.getChildNodes(),
|
|
63
|
-
nodesA = childNodes, ///
|
|
64
|
-
nodesB = combinatorChildNodes, ///
|
|
65
|
-
nodesVerified = this.verifyNodes(nodesA, nodesB, context);
|
|
66
|
-
|
|
67
|
-
nonTerminalNodeVerified = nodesVerified; ///
|
|
68
|
-
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return nonTerminalNodeVerified;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
verifyArgumentNode(argumentNode, combinatorArgumentNode, context) {
|
|
78
|
-
let argumentNodeVerified = false;
|
|
79
|
-
|
|
80
|
-
const termNode = termNodeQuery(argumentNode);
|
|
6
|
+
import verifyTypeAssertion from "../verify/typeAssertion";
|
|
7
|
+
import statementNodesVerifier from "../verifier/nodes/statement";
|
|
81
8
|
|
|
82
|
-
|
|
83
|
-
const argumentString = context.nodeAsString(argumentNode);
|
|
9
|
+
import { nodeQuery } from "../utilities/query";
|
|
84
10
|
|
|
85
|
-
|
|
86
|
-
} else {
|
|
87
|
-
const types = [],
|
|
88
|
-
termVerified = verifyTerm(termNode, types, context);
|
|
11
|
+
const typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!");
|
|
89
12
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
termType = firstType, ///
|
|
93
|
-
typeNode = typeNodeQuery(combinatorArgumentNode),
|
|
94
|
-
typeName = typeNameFromTypeNode(typeNode),
|
|
95
|
-
type = (typeName === OBJECT_TYPE_NAME) ?
|
|
96
|
-
objectType : ///
|
|
97
|
-
context.findTypeByTypeName(typeName),
|
|
98
|
-
statementTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(type);
|
|
99
|
-
|
|
100
|
-
if (statementTypeEqualToOrSubTypeOfType) {
|
|
101
|
-
argumentNodeVerified = true;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return argumentNodeVerified;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, context) {
|
|
110
|
-
let metaArgumentNodeVerified = false;
|
|
111
|
-
|
|
112
|
-
const statementNode = statementNodeQuery(metaArgumentNode),
|
|
113
|
-
combinatorMetaTYpeNode = metaTypeNodeQuery(combinatorMetaargumentNode);
|
|
114
|
-
|
|
115
|
-
if (statementNode === null) {
|
|
116
|
-
const metaArgumentString = context.nodeAsString(metaArgumentNode);
|
|
117
|
-
|
|
118
|
-
context.error(`Expected a statement but got a '${metaArgumentString}' meta-type.`, metaArgumentNode);
|
|
119
|
-
} else {
|
|
120
|
-
if (combinatorMetaTYpeNode === null) {
|
|
121
|
-
const combinatorMetaargumentString = context.nodeAsString(combinatorMetaargumentNode);
|
|
122
|
-
|
|
123
|
-
context.error(`Expected a meta-type but got a '${combinatorMetaargumentString}' statement.`, metaArgumentNode);
|
|
124
|
-
} else {
|
|
125
|
-
const combinatorMetaTypeTerminalNode = metaTypeTerminalNodeQuery(combinatorMetaTYpeNode),
|
|
126
|
-
content = combinatorMetaTypeTerminalNode.getContent(),
|
|
127
|
-
contentStatementMetaType = (content === STATEMENT_META_TYPE);
|
|
128
|
-
|
|
129
|
-
if (!contentStatementMetaType) {
|
|
130
|
-
context.error(`Expected the meta-type to be 'Statement' but got '${content}'.`, metaArgumentNode);
|
|
131
|
-
} else {
|
|
132
|
-
metaArgumentNodeVerified = true;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
return metaArgumentNodeVerified;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
export const statementVerifier = new StatementVerifier();
|
|
142
|
-
|
|
143
|
-
export default function verifyStatement(statementNode, assignments, derived, context) {
|
|
144
|
-
let statementVerified = false;
|
|
13
|
+
function verifyStatement(statementNode, assignments, derived, context, verifyAhead) {
|
|
14
|
+
let statementVerified;
|
|
145
15
|
|
|
146
16
|
const statementString = context.nodeAsString(statementNode);
|
|
147
17
|
|
|
148
|
-
context.
|
|
149
|
-
|
|
150
|
-
if (!statementVerified) {
|
|
151
|
-
const statementVerifiedAgainstCombinators = verifyStatementAgainstCombinators(statementNode, context);
|
|
152
|
-
|
|
153
|
-
statementVerified = statementVerifiedAgainstCombinators; ///
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
if (!statementVerified) {
|
|
157
|
-
const statementVerifiedAsTypeInference = verifyStatementAsTypeInference(statementNode, derived, context);
|
|
158
|
-
|
|
159
|
-
statementVerified = statementVerifiedAsTypeInference; ///
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (!statementVerified) {
|
|
163
|
-
const statementVerifiedAsTypeAssertion = verifyStatementAsTypeAssertion(statementNode, assignments, derived, context);
|
|
18
|
+
context.trace(`Verifying the '${statementString}' statement...`, statementNode);
|
|
164
19
|
|
|
165
|
-
|
|
166
|
-
|
|
20
|
+
const verifyStatementFunctions = [
|
|
21
|
+
verifyStatementAsEquality,
|
|
22
|
+
verifyStatementAsTypeAssertion,
|
|
23
|
+
verifyStatementAgainstCombinators
|
|
24
|
+
];
|
|
167
25
|
|
|
168
|
-
|
|
169
|
-
const
|
|
26
|
+
statementVerified = verifyStatementFunctions.some((verifyStatementFunction) => {
|
|
27
|
+
const statementVerified = verifyStatementFunction(statementNode, assignments, derived, context, verifyAhead);
|
|
170
28
|
|
|
171
|
-
statementVerified
|
|
172
|
-
|
|
29
|
+
if (statementVerified) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
173
33
|
|
|
174
34
|
if (statementVerified) {
|
|
175
|
-
context.debug(
|
|
35
|
+
context.debug(`...verified the '${statementString}' statement.`, statementNode);
|
|
176
36
|
}
|
|
177
37
|
|
|
178
38
|
return statementVerified;
|
|
179
39
|
}
|
|
180
40
|
|
|
181
|
-
|
|
182
|
-
|
|
41
|
+
Object.assign(verifyStatement, {
|
|
42
|
+
statementNodesVerifier
|
|
43
|
+
});
|
|
183
44
|
|
|
184
|
-
|
|
45
|
+
export default verifyStatement;
|
|
185
46
|
|
|
186
|
-
|
|
47
|
+
export function verifyStatementAgainstCombinators(statementNode, assignments, derived, context, verifyAhead) {
|
|
48
|
+
let statementVerifiedAgainstCombinators;
|
|
187
49
|
|
|
188
50
|
let combinators = context.getCombinators();
|
|
189
51
|
|
|
@@ -192,186 +54,131 @@ export function verifyStatementAgainstCombinators(statementNode, context) {
|
|
|
192
54
|
...combinators
|
|
193
55
|
];
|
|
194
56
|
|
|
195
|
-
|
|
196
|
-
const statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
|
|
57
|
+
statementVerifiedAgainstCombinators = combinators.some((combinator) => {
|
|
58
|
+
const statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context, verifyAhead);
|
|
197
59
|
|
|
198
60
|
if (statementVerifiedAgainstCombinator) {
|
|
199
61
|
return true;
|
|
200
62
|
}
|
|
201
|
-
})
|
|
202
|
-
|
|
203
|
-
if (combinator !== null) {
|
|
204
|
-
statementVerifiedAgainstCombinators = true;
|
|
205
|
-
}
|
|
63
|
+
});
|
|
206
64
|
|
|
207
65
|
return statementVerifiedAgainstCombinators;
|
|
208
66
|
}
|
|
209
67
|
|
|
210
|
-
|
|
68
|
+
function verifyStatementAgainstCombinator(statementNode, combinator, context, verifyAhead) {
|
|
69
|
+
let statementVerifiedAgainstCombinator;
|
|
70
|
+
|
|
211
71
|
const statementString = context.nodeAsString(statementNode),
|
|
212
72
|
combinatorString = combinator.getString();
|
|
213
73
|
|
|
214
|
-
context.trace(`Verifying the '${statementString}' statement against the '${combinatorString}' combinator
|
|
74
|
+
context.trace(`Verifying the '${statementString}' statement against the '${combinatorString}' combinator...`, statementNode);
|
|
215
75
|
|
|
216
76
|
const combinatorStatementNode = combinator.getStatementNode(),
|
|
217
77
|
nonTerminalNodeA = statementNode, ///
|
|
218
78
|
nonTerminalNodeB = combinatorStatementNode, ///
|
|
219
|
-
nonTerminalNodeVerified =
|
|
220
|
-
statementVerifiedAgainstCombinator = nonTerminalNodeVerified; ///
|
|
79
|
+
nonTerminalNodeVerified = statementNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context, verifyAhead);
|
|
221
80
|
|
|
222
|
-
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
function verifyStatementAsTypeInference(statementNode, derived, context) {
|
|
226
|
-
let statementVerifiedAsTypeInference = false;
|
|
227
|
-
|
|
228
|
-
const typeInferenceNode = typeInferenceNodeQuery(statementNode);
|
|
229
|
-
|
|
230
|
-
if (typeInferenceNode !== null) {
|
|
231
|
-
if (!derived) {
|
|
232
|
-
const typeInferenceString = context.nodeAsString(typeInferenceNode);
|
|
233
|
-
|
|
234
|
-
context.error(`The '${typeInferenceString}' type inference can only be derived.`, typeInferenceNode);
|
|
235
|
-
} else {
|
|
236
|
-
const typeInferenceVerified = verifyTypeInference(typeInferenceNode, context);
|
|
81
|
+
statementVerifiedAgainstCombinator = nonTerminalNodeVerified; ///
|
|
237
82
|
|
|
238
|
-
|
|
239
|
-
}
|
|
83
|
+
if (statementVerifiedAgainstCombinator) {
|
|
84
|
+
context.debug(`...verified the '${statementString}' statement against the '${combinatorString}' combinator.`, statementNode);
|
|
240
85
|
}
|
|
241
86
|
|
|
242
|
-
return
|
|
87
|
+
return statementVerifiedAgainstCombinator;
|
|
243
88
|
}
|
|
244
89
|
|
|
245
|
-
function verifyStatementAsTypeAssertion(statementNode, assignments, derived, context) {
|
|
90
|
+
function verifyStatementAsTypeAssertion(statementNode, assignments, derived, context, verifyAhead) {
|
|
246
91
|
let statementVerifiedAsTypeAssertion = false;
|
|
247
92
|
|
|
248
93
|
const typeAssertionNode = typeAssertionNodeQuery(statementNode);
|
|
249
94
|
|
|
250
95
|
if (typeAssertionNode !== null) {
|
|
251
|
-
const
|
|
96
|
+
const statementString = context.nodeAsString(statementNode);
|
|
97
|
+
|
|
98
|
+
context.trace(`Verifying the '${statementString}' statement as a type assertion...`, statementNode);
|
|
99
|
+
|
|
100
|
+
const typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assignments, derived, context, verifyAhead);
|
|
252
101
|
|
|
253
102
|
statementVerifiedAsTypeAssertion = typeAssertionVerified; ///
|
|
103
|
+
|
|
104
|
+
if (statementVerifiedAsTypeAssertion) {
|
|
105
|
+
context.debug(`...verified the '${statementString}' statement as a type assertion.`, statementNode);
|
|
106
|
+
}
|
|
254
107
|
}
|
|
255
108
|
|
|
256
109
|
return statementVerifiedAsTypeAssertion;
|
|
257
110
|
}
|
|
258
111
|
|
|
259
|
-
function verifyStatementAsEquality(statementNode, derived, context) {
|
|
112
|
+
function verifyStatementAsEquality(statementNode, assignments, derived, context, verifyAhead) {
|
|
260
113
|
let statementVerifiedAsEquality = false;
|
|
261
114
|
|
|
262
|
-
const
|
|
263
|
-
statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
|
|
115
|
+
const equality = Equality.fromStatementNode(statementNode);
|
|
264
116
|
|
|
265
|
-
if (
|
|
266
|
-
const
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
if (leftTermVerifiedAsVariable && rightTermVerifiedAsVariable) {
|
|
281
|
-
const firstVariable = first(variables),
|
|
282
|
-
secondVariable = second(variables),
|
|
283
|
-
leftVariable = firstVariable, ///
|
|
284
|
-
rightVariable = secondVariable, ///
|
|
285
|
-
leftVariableName = leftVariable.getName(),
|
|
286
|
-
leftVariableType = leftVariable.getType(),
|
|
287
|
-
rightVariableName = rightVariable.getName(),
|
|
288
|
-
rightVariableType = rightVariable.getType(),
|
|
289
|
-
leftVariableTypeEqualToOrSubTypeOfOfSuperTypeOfRightVariableType = leftVariableType.isEqualToOrSubTypeOfOfSuperTypeOf(rightVariableType);
|
|
290
|
-
|
|
291
|
-
if (!leftVariableTypeEqualToOrSubTypeOfOfSuperTypeOfRightVariableType) {
|
|
292
|
-
const leftVariableTypeName = leftVariableType.getName(),
|
|
293
|
-
rightVariableTypeName = rightVariableType.getName();
|
|
294
|
-
|
|
295
|
-
context.error(`The left '${leftVariableName}' variable's '${leftVariableTypeName}' type is not equal to, a sub-type of or a super-type of the right '${rightVariableName}' variable's '${rightVariableTypeName}' type.`, statementNode);
|
|
296
|
-
} else {
|
|
297
|
-
statementVerifiedAsEquality = true;
|
|
298
|
-
}
|
|
299
|
-
} else if (leftTermVerifiedAsVariable) {
|
|
300
|
-
const types = [];
|
|
301
|
-
|
|
302
|
-
verifyTerm(rightTermNode, types, context);
|
|
303
|
-
|
|
304
|
-
const firstType = first(types),
|
|
305
|
-
firstVariable = first(variables),
|
|
306
|
-
leftVariable = firstVariable, ///
|
|
307
|
-
rightTermType = firstType, ///
|
|
308
|
-
leftVariableName = leftVariable.getName(),
|
|
309
|
-
leftVariableType = leftVariable.getType(),
|
|
310
|
-
leftVariableTypeEqualToOrSuperTypeOfRightTermType = leftVariableType.isEqualToOrSuperTypeOf(rightTermType);
|
|
311
|
-
|
|
312
|
-
if (!leftVariableTypeEqualToOrSuperTypeOfRightTermType) {
|
|
313
|
-
const rightTermString = context.nodeAsString(rightTermNode),
|
|
314
|
-
rightTermTypeName = rightTermType.getName(),
|
|
315
|
-
leftVariableTypeName = leftVariableType.getName();
|
|
316
|
-
|
|
317
|
-
context.error(`The left '${leftVariableName}' variable's '${leftVariableTypeName}' type is not equal to or a super-type of the right '${rightTermString}' term's '${rightTermTypeName}' type.`, statementNode);
|
|
318
|
-
} else {
|
|
319
|
-
statementVerifiedAsEquality = true;
|
|
320
|
-
}
|
|
321
|
-
} else if (rightTermVerifiedAsVariable) {
|
|
322
|
-
const types = [];
|
|
323
|
-
|
|
324
|
-
verifyTerm(leftTermNode, types, context);
|
|
325
|
-
|
|
326
|
-
const firstType = first(types),
|
|
327
|
-
firstVariable = first(variables),
|
|
328
|
-
leftTermType = firstType, ///
|
|
329
|
-
rightVariable = firstVariable, ///
|
|
330
|
-
rightVariableName = rightVariable.getName(),
|
|
331
|
-
rightVariableType = rightVariable.getType(),
|
|
332
|
-
rightVariableTypeEqualToOrSuperTypeOfRightTermType = rightVariableType.isEqualToOrSuperTypeOf(leftTermType);
|
|
333
|
-
|
|
334
|
-
if (!rightVariableTypeEqualToOrSuperTypeOfRightTermType) {
|
|
335
|
-
const leftTermString = context.nodeAsString(leftTermNode),
|
|
336
|
-
leftTermTypeName = leftTermType.getName(),
|
|
337
|
-
rightVariableTypeName = rightVariableType.getName();
|
|
338
|
-
|
|
339
|
-
context.error(`The right '${rightVariableName}' variable's '${rightVariableTypeName}' type is not equal to or a super-type of the left '${leftTermString}' term's '${leftTermTypeName}' type.`, statementNode);
|
|
340
|
-
} else {
|
|
341
|
-
statementVerifiedAsEquality = true;
|
|
342
|
-
}
|
|
343
|
-
} else {
|
|
344
|
-
const types = [];
|
|
345
|
-
|
|
346
|
-
verifyTerm(leftTermNode, types, context);
|
|
347
|
-
|
|
348
|
-
verifyTerm(rightTermNode, types, context);
|
|
349
|
-
|
|
350
|
-
const firstType = first(types),
|
|
351
|
-
secondType = second(types),
|
|
352
|
-
leftTermType = firstType, ///
|
|
353
|
-
rightTermType = secondType, ///
|
|
354
|
-
leftTermTypeEqualToOrSubTypeOfOfSuperTypeOf = leftTermType.isEqualToOrSubTypeOfOfSuperTypeOf(rightTermType);
|
|
355
|
-
|
|
356
|
-
if (!leftTermTypeEqualToOrSubTypeOfOfSuperTypeOf) {
|
|
357
|
-
const leftTermString = context.nodeAsString(leftTermNode),
|
|
358
|
-
rightTermString = context.nodeAsString(rightTermNode),
|
|
359
|
-
leftTermTypeName = leftTermType.getName(),
|
|
360
|
-
rightTermTypeName = rightTermType.getName();
|
|
361
|
-
|
|
362
|
-
context.error(`The left '${leftTermString}' term's '${leftTermTypeName}' type is not equal to, a sub-type of or a super-type of the right '${rightTermString}' term's '${rightTermTypeName}' type.`, statementNode);
|
|
363
|
-
} else {
|
|
364
|
-
statementVerifiedAsEquality = true;
|
|
365
|
-
}
|
|
117
|
+
if (equality !== null) {
|
|
118
|
+
const statementString = context.nodeAsString(statementNode);
|
|
119
|
+
|
|
120
|
+
context.trace(`Verifying the '${statementString}' statement as an equality...`, statementNode);
|
|
121
|
+
|
|
122
|
+
const verifyStatementAsEqualityFunctions = [
|
|
123
|
+
verifyStatementAsDerivedEquality,
|
|
124
|
+
verifyStatementAsStandaloneEquality
|
|
125
|
+
];
|
|
126
|
+
|
|
127
|
+
statementVerifiedAsEquality = verifyStatementAsEqualityFunctions.some((verifyStatementAsEqualityFunction) => {
|
|
128
|
+
const statementVerified = verifyStatementAsEqualityFunction(statementNode, equality, derived, context, verifyAhead);
|
|
129
|
+
|
|
130
|
+
if (statementVerified) {
|
|
131
|
+
return true;
|
|
366
132
|
}
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
if (statementVerifiedAsEquality) {
|
|
136
|
+
context.debug(`...verified the '${statementString}' statement as an equality.`, statementNode);
|
|
367
137
|
}
|
|
368
138
|
}
|
|
369
139
|
|
|
370
|
-
|
|
140
|
+
return statementVerifiedAsEquality;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function verifyStatementAsDerivedEquality(statementNode, equality, derived, context, verifyAhead) {
|
|
144
|
+
let verifiedStatementAsDerivedEquality = false;
|
|
145
|
+
|
|
146
|
+
if (derived) {
|
|
371
147
|
const statementString = context.nodeAsString(statementNode);
|
|
372
148
|
|
|
373
|
-
context.
|
|
149
|
+
context.trace(`Verifying the '${statementString}' derived equality...`, statementNode);
|
|
150
|
+
|
|
151
|
+
const equalities = context.getEqualities(),
|
|
152
|
+
equalityVerified = equality.verify(equalities, context, verifyAhead);
|
|
153
|
+
|
|
154
|
+
verifiedStatementAsDerivedEquality = equalityVerified; ///
|
|
155
|
+
|
|
156
|
+
if (verifiedStatementAsDerivedEquality) {
|
|
157
|
+
context.debug(`...verified the '${statementString}' derived equality.`, statementNode);
|
|
158
|
+
}
|
|
374
159
|
}
|
|
375
160
|
|
|
376
|
-
return
|
|
161
|
+
return verifiedStatementAsDerivedEquality;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function verifyStatementAsStandaloneEquality(statementNode, equality, derived, context, verifyAhead) {
|
|
165
|
+
let statementVerifiedAsStandaloneEquality = false;
|
|
166
|
+
|
|
167
|
+
if (!derived) {
|
|
168
|
+
const statementString = context.nodeAsString(statementNode);
|
|
169
|
+
|
|
170
|
+
context.trace(`Verifying the '${statementString}' statement as a standalone equality...`, statementNode);
|
|
171
|
+
|
|
172
|
+
const leftTermNode = equality.getLeftTermNode(),
|
|
173
|
+
rightTermNode = equality.getRightTermNode(),
|
|
174
|
+
termsVerified = verifyTerms(leftTermNode, rightTermNode, context, verifyAhead);
|
|
175
|
+
|
|
176
|
+
statementVerifiedAsStandaloneEquality = termsVerified; ///
|
|
177
|
+
|
|
178
|
+
if (statementVerifiedAsStandaloneEquality) {
|
|
179
|
+
context.trace(`...verified the '${statementString}' statement as a standalone equality.`, statementNode);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return statementVerifiedAsStandaloneEquality;
|
|
377
184
|
}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import Combinator from "../combinator";
|
|
4
|
-
import
|
|
5
|
-
import verifyStatement from "../verify/statement";
|
|
6
|
-
|
|
7
|
-
import { typeNameFromTypeNode } from "../utilities/query";
|
|
8
|
-
import { TYPE_RULE_NAME, TERM_RULE_NAME, STATEMENT_RULE_NAME } from "../ruleNames";
|
|
4
|
+
import statementAsCombinatorNodeVerifier from "../verifier/node/statementAsCombinator";
|
|
9
5
|
|
|
10
6
|
export default function verifyStatementAsCombinator(statementNode, fileContext) {
|
|
11
7
|
let statementVerifiedAsCombinator = false;
|
|
12
8
|
|
|
13
9
|
const statementString = fileContext.nodeAsString(statementNode);
|
|
14
10
|
|
|
15
|
-
fileContext.
|
|
11
|
+
fileContext.trace(`Verifying the '${statementString}' statement as a combinator....`, statementNode);
|
|
16
12
|
|
|
17
|
-
const nonTerminalNode = statementNode,
|
|
13
|
+
const nonTerminalNode = statementNode, ///
|
|
18
14
|
childNodes = nonTerminalNode.getChildNodes(),
|
|
19
|
-
childNodesVerified = verifyChildNodes(childNodes, fileContext)
|
|
15
|
+
childNodesVerified = statementAsCombinatorNodeVerifier.verifyChildNodes(childNodes, fileContext, () => {
|
|
16
|
+
const verifiedAhead = true;
|
|
17
|
+
|
|
18
|
+
return verifiedAhead;
|
|
19
|
+
});
|
|
20
20
|
|
|
21
21
|
if (childNodesVerified) {
|
|
22
22
|
const tokens = fileContext.getTokens(),
|
|
@@ -28,128 +28,8 @@ export default function verifyStatementAsCombinator(statementNode, fileContext)
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
if (statementVerifiedAsCombinator) {
|
|
31
|
-
fileContext.
|
|
31
|
+
fileContext.debug(`...verified the '${statementString}' statement as a combinator.`, statementNode);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
return statementVerifiedAsCombinator;
|
|
35
35
|
}
|
|
36
|
-
|
|
37
|
-
function verifyNode(node, fileContext) {
|
|
38
|
-
let nodeVerified;
|
|
39
|
-
|
|
40
|
-
const nodeTerminalNode = node.isTerminalNode();
|
|
41
|
-
|
|
42
|
-
if (nodeTerminalNode) {
|
|
43
|
-
const terminalNode = node, ///
|
|
44
|
-
terminalNodeVerified = verifyTerminalNode(terminalNode, fileContext);
|
|
45
|
-
|
|
46
|
-
nodeVerified = terminalNodeVerified; ///
|
|
47
|
-
} else {
|
|
48
|
-
const nonTerminalNode = node, ///
|
|
49
|
-
nonTerminalNodeVerified = verifyNonTerminalNode(nonTerminalNode, fileContext);
|
|
50
|
-
|
|
51
|
-
nodeVerified = nonTerminalNodeVerified; ///
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
return nodeVerified;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function verifyChildNodes(childNodes, fileContext) {
|
|
58
|
-
const childNodesVerified = childNodes.every((childNode) => {
|
|
59
|
-
const node = childNode, ///
|
|
60
|
-
nodeVerified = verifyNode(node, fileContext);
|
|
61
|
-
|
|
62
|
-
if (nodeVerified) {
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
return childNodesVerified;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function verifyTerminalNode(terminalNode, fileContext) {
|
|
71
|
-
const terminalNodeVerified = true;
|
|
72
|
-
|
|
73
|
-
return terminalNodeVerified;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function verifyNonTerminalNode(nonTerminalNode, fileContext) {
|
|
77
|
-
let nonTerminalNodeVerified;
|
|
78
|
-
|
|
79
|
-
const ruleName = nonTerminalNode.getRuleName();
|
|
80
|
-
|
|
81
|
-
switch (ruleName) {
|
|
82
|
-
case TYPE_RULE_NAME: {
|
|
83
|
-
const typeNode = nonTerminalNode, ///
|
|
84
|
-
typeNodeVerified = verifyTypeNode(typeNode, fileContext);
|
|
85
|
-
|
|
86
|
-
nonTerminalNodeVerified = typeNodeVerified; ///
|
|
87
|
-
|
|
88
|
-
break;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
case TERM_RULE_NAME: {
|
|
92
|
-
const termNode = nonTerminalNode, ///
|
|
93
|
-
termNodeVerified = verifyTermNode(termNode, fileContext);
|
|
94
|
-
|
|
95
|
-
nonTerminalNodeVerified = termNodeVerified; ///
|
|
96
|
-
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
case STATEMENT_RULE_NAME: {
|
|
101
|
-
const statmentNode = nonTerminalNode, ///
|
|
102
|
-
statmentNodeVerified = verifyStatementNode(statmentNode, fileContext);
|
|
103
|
-
|
|
104
|
-
nonTerminalNodeVerified = statmentNodeVerified; ///
|
|
105
|
-
|
|
106
|
-
break;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
default: {
|
|
110
|
-
const childNodes = nonTerminalNode.getChildNodes(),
|
|
111
|
-
childNodesVerified = verifyChildNodes(childNodes, fileContext);
|
|
112
|
-
|
|
113
|
-
nonTerminalNodeVerified = childNodesVerified; ///
|
|
114
|
-
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return nonTerminalNodeVerified;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function verifyTypeNode(typeNode, fileContext) {
|
|
123
|
-
let typeNodeVerified = false;
|
|
124
|
-
|
|
125
|
-
const typeName = typeNameFromTypeNode(typeNode),
|
|
126
|
-
typePresent = fileContext.isTypePresentByTypeName(typeName);
|
|
127
|
-
|
|
128
|
-
if (!typePresent) {
|
|
129
|
-
fileContext.error(`The type '${typeName}' not present.`, typeNode);
|
|
130
|
-
} else {
|
|
131
|
-
typeNodeVerified = true;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
return typeNodeVerified;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function verifyTermNode(termNode, fileContext) {
|
|
138
|
-
const types = [],
|
|
139
|
-
context = fileContext, ///
|
|
140
|
-
termVerified = verifyTerm(termNode, types, context),
|
|
141
|
-
termNodeVerified = termVerified; ///
|
|
142
|
-
|
|
143
|
-
return termNodeVerified;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
function verifyStatementNode(statementNode, fileContext) {
|
|
147
|
-
const context = fileContext, ///
|
|
148
|
-
derived = false,
|
|
149
|
-
assignments = [],
|
|
150
|
-
statementVerified = verifyStatement(statementNode, assignments, derived, context),
|
|
151
|
-
statementNodeVerified = statementVerified; ///
|
|
152
|
-
|
|
153
|
-
return statementNodeVerified;
|
|
154
|
-
}
|
|
155
|
-
|
|
@@ -14,7 +14,7 @@ export default function verifySupposition(suppositionNode, suppositions, proofCo
|
|
|
14
14
|
|
|
15
15
|
const suppositionString = proofContext.nodeAsString(suppositionNode);
|
|
16
16
|
|
|
17
|
-
proofContext.
|
|
17
|
+
proofContext.trace(`Verifying the '${suppositionString}' supposition...`, suppositionNode);
|
|
18
18
|
|
|
19
19
|
const derived = false,
|
|
20
20
|
assignments = [],
|
|
@@ -38,7 +38,7 @@ export default function verifySupposition(suppositionNode, suppositions, proofCo
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
if (suppositionVerified) {
|
|
41
|
-
proofContext.
|
|
41
|
+
proofContext.debug(`...verified the '${suppositionString}' supposition.`, suppositionNode);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
return suppositionVerified;
|