occam-verify-cli 0.0.548 → 0.0.550
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 +15 -1
- package/lib/axiomLemmaTheoremConjecture.js +3 -3
- package/lib/metaType.js +5 -5
- package/lib/metavariable.js +3 -3
- package/lib/rule.js +3 -3
- package/lib/step/metaproof.js +11 -11
- package/lib/step/proof.js +6 -6
- package/lib/substitution/metastatementForMetavariable.js +6 -6
- package/lib/substitution/statementForMetavariable.js +6 -6
- package/lib/substitution/termForVariable.js +4 -4
- package/lib/type.js +6 -6
- package/lib/variable.js +24 -3
- package/lib/verify/assertion/type.js +13 -5
- package/lib/verify/proof.js +3 -1
- package/lib/verify/ruleProof.js +3 -1
- package/lib/verify/statement.js +37 -22
- package/lib/verify/typeInference.js +129 -0
- package/package.json +3 -3
- package/src/assignment.js +15 -0
- package/src/axiomLemmaTheoremConjecture.js +2 -2
- package/src/metaType.js +4 -4
- package/src/metavariable.js +2 -2
- package/src/rule.js +2 -2
- package/src/step/metaproof.js +10 -10
- package/src/step/proof.js +5 -5
- package/src/substitution/metastatementForMetavariable.js +5 -5
- package/src/substitution/statementForMetavariable.js +5 -5
- package/src/substitution/termForVariable.js +3 -3
- package/src/type.js +5 -8
- package/src/variable.js +26 -2
- package/src/verify/assertion/type.js +3 -3
- package/src/verify/proof.js +3 -0
- package/src/verify/ruleProof.js +3 -0
- package/src/verify/statement.js +32 -41
- package/src/verify/typeInference.js +146 -0
package/src/verify/statement.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import Verifier from "../verifier";
|
|
4
|
-
import Variable from "../variable";
|
|
5
4
|
import Equality from "../equality";
|
|
6
|
-
import Assignment from "../assignment";
|
|
7
5
|
import verifyTerm from "../verify/term";
|
|
8
6
|
import equalityCombinator from "../ocmbinator/equality";
|
|
9
7
|
import bracketedCombinator from "../ocmbinator/bracketed";
|
|
8
|
+
import verifyTypeInference from "../verify/typeInference";
|
|
10
9
|
import verifyTypeAssertion from "../verify/assertion/type";
|
|
11
10
|
|
|
12
11
|
import { objectType } from "../type";
|
|
@@ -21,6 +20,7 @@ const termNodeQuery = nodeQuery("/argument/term!"),
|
|
|
21
20
|
typeNodeQuery = nodeQuery("/argument/type!"),
|
|
22
21
|
metaTypeNodeQuery = nodeQuery("/metaArgument/metaType!"),
|
|
23
22
|
statementNodeQuery = nodeQuery("/metaArgument/statement!"),
|
|
23
|
+
typeInferenceNodeQuery = nodeQuery("/statement/typeInference!"),
|
|
24
24
|
typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!"),
|
|
25
25
|
metaTypeTerminalNodeQuery = nodeQuery("/metaType/@meta-type");
|
|
26
26
|
|
|
@@ -33,6 +33,12 @@ export default function verifyStatement(statementNode, assignments, derived, con
|
|
|
33
33
|
statementVerified = statementVerifiedAgainstCombinators; ///
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
if (!statementVerified) {
|
|
37
|
+
const statementVerifiedAsTypeInference = verifyStatementAsTypeInference(statementNode, derived, context);
|
|
38
|
+
|
|
39
|
+
statementVerified = statementVerifiedAsTypeInference; ///
|
|
40
|
+
}
|
|
41
|
+
|
|
36
42
|
if (!statementVerified) {
|
|
37
43
|
const statementVerifiedAsTypeAssertion = verifyStatementAsTypeAssertion(statementNode, assignments, derived, context);
|
|
38
44
|
|
|
@@ -40,7 +46,7 @@ export default function verifyStatement(statementNode, assignments, derived, con
|
|
|
40
46
|
}
|
|
41
47
|
|
|
42
48
|
if (!statementVerified) {
|
|
43
|
-
const statementVerifiedAsEquality = verifyStatementAsEquality(statementNode,
|
|
49
|
+
const statementVerifiedAsEquality = verifyStatementAsEquality(statementNode, derived, context);
|
|
44
50
|
|
|
45
51
|
statementVerified = statementVerifiedAsEquality; //
|
|
46
52
|
}
|
|
@@ -163,7 +169,7 @@ class StatementVerifier extends Verifier {
|
|
|
163
169
|
|
|
164
170
|
const statementVerifier = new StatementVerifier();
|
|
165
171
|
|
|
166
|
-
function verifyStatementAgainstCombinators(statementNode, context) {
|
|
172
|
+
export function verifyStatementAgainstCombinators(statementNode, context) {
|
|
167
173
|
let statementVerifiedAgainstCombinators = false;
|
|
168
174
|
|
|
169
175
|
let combinators = context.getCombinators();
|
|
@@ -188,7 +194,7 @@ function verifyStatementAgainstCombinators(statementNode, context) {
|
|
|
188
194
|
return statementVerifiedAgainstCombinators;
|
|
189
195
|
}
|
|
190
196
|
|
|
191
|
-
function verifyStatementAgainstCombinator(statementNode, combinator, context) {
|
|
197
|
+
export function verifyStatementAgainstCombinator(statementNode, combinator, context) {
|
|
192
198
|
const combinatorStatementNode = combinator.getStatementNode(),
|
|
193
199
|
nonTerminalNodeA = statementNode, ///
|
|
194
200
|
nonTerminalNodeB = combinatorStatementNode, ///
|
|
@@ -198,6 +204,26 @@ function verifyStatementAgainstCombinator(statementNode, combinator, context) {
|
|
|
198
204
|
return statementVerifiedAgainstCombinator;
|
|
199
205
|
}
|
|
200
206
|
|
|
207
|
+
function verifyStatementAsTypeInference(statementNode, derived, context) {
|
|
208
|
+
let statementVerifiedAsTypeInference = false;
|
|
209
|
+
|
|
210
|
+
const typeInferenceNode = typeInferenceNodeQuery(statementNode);
|
|
211
|
+
|
|
212
|
+
if (typeInferenceNode !== null) {
|
|
213
|
+
if (!derived) {
|
|
214
|
+
const typeInferenceString = context.nodeAsString(typeInferenceNode);
|
|
215
|
+
|
|
216
|
+
context.error(`The '${typeInferenceString}' type inference can only be derived.`, typeInferenceNode);
|
|
217
|
+
} else {
|
|
218
|
+
const typeInferenceVerified = verifyTypeInference(typeInferenceNode, context);
|
|
219
|
+
|
|
220
|
+
statementVerifiedAsTypeInference = typeInferenceVerified; ///
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return statementVerifiedAsTypeInference;
|
|
225
|
+
}
|
|
226
|
+
|
|
201
227
|
function verifyStatementAsTypeAssertion(statementNode, assignments, derived, context) {
|
|
202
228
|
let statementVerifiedAsTypeAssertion = false;
|
|
203
229
|
|
|
@@ -212,7 +238,7 @@ function verifyStatementAsTypeAssertion(statementNode, assignments, derived, con
|
|
|
212
238
|
return statementVerifiedAsTypeAssertion;
|
|
213
239
|
}
|
|
214
240
|
|
|
215
|
-
function verifyStatementAsEquality(statementNode,
|
|
241
|
+
function verifyStatementAsEquality(statementNode, derived, context) {
|
|
216
242
|
let statementVerifiedAsEquality = false;
|
|
217
243
|
|
|
218
244
|
const combinator = equalityCombinator, ///
|
|
@@ -250,27 +276,6 @@ function verifyStatementAsEquality(statementNode, assignments, derived, context)
|
|
|
250
276
|
|
|
251
277
|
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);
|
|
252
278
|
} else {
|
|
253
|
-
const leftVariableTypeSuperTypeOfRightVariableType = leftVariableType.isSuperTypeOf(rightVariableType),
|
|
254
|
-
rightVariableTypeSuperTypeOfLeftVariableType = rightVariableType.isSuperTypeOf(leftVariableType);
|
|
255
|
-
|
|
256
|
-
if (leftVariableTypeSuperTypeOfRightVariableType) {
|
|
257
|
-
const name = leftVariableName, ///
|
|
258
|
-
type = rightVariableType, ///
|
|
259
|
-
variable = Variable.fromNameAndType(name, type),
|
|
260
|
-
assignment = Assignment.fromVariable(variable);
|
|
261
|
-
|
|
262
|
-
assignments.push(assignment);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
if (rightVariableTypeSuperTypeOfLeftVariableType) {
|
|
266
|
-
const name = rightVariableName, ///
|
|
267
|
-
type = leftVariableType, ///
|
|
268
|
-
variable = Variable.fromNameAndType(name, type),
|
|
269
|
-
assignment = Assignment.fromVariable(variable);
|
|
270
|
-
|
|
271
|
-
assignments.push(assignment);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
279
|
statementVerifiedAsEquality = true;
|
|
275
280
|
}
|
|
276
281
|
} else if (leftTermVerifiedAsVariable) {
|
|
@@ -293,13 +298,6 @@ function verifyStatementAsEquality(statementNode, assignments, derived, context)
|
|
|
293
298
|
|
|
294
299
|
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);
|
|
295
300
|
} else {
|
|
296
|
-
const name = leftVariableName, ///
|
|
297
|
-
type = rightTermType, ///
|
|
298
|
-
variable = Variable.fromNameAndType(name, type),
|
|
299
|
-
assignment = Assignment.fromVariable(variable);
|
|
300
|
-
|
|
301
|
-
assignments.push(assignment);
|
|
302
|
-
|
|
303
301
|
statementVerifiedAsEquality = true;
|
|
304
302
|
}
|
|
305
303
|
} else if (rightTermVerifiedAsVariable) {
|
|
@@ -322,13 +320,6 @@ function verifyStatementAsEquality(statementNode, assignments, derived, context)
|
|
|
322
320
|
|
|
323
321
|
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);
|
|
324
322
|
} else {
|
|
325
|
-
const name = rightVariableName, ///
|
|
326
|
-
type = leftTermType, ///
|
|
327
|
-
variable = Variable.fromNameAndType(name, type),
|
|
328
|
-
assignment = Assignment.fromVariable(variable);
|
|
329
|
-
|
|
330
|
-
assignments.push(assignment);
|
|
331
|
-
|
|
332
323
|
statementVerifiedAsEquality = true;
|
|
333
324
|
}
|
|
334
325
|
} else {
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import verifyTerm from "./term";
|
|
4
|
+
import equalityCombinator from "../ocmbinator/equality";
|
|
5
|
+
|
|
6
|
+
import { nodeQuery } from "../utilities/query";
|
|
7
|
+
import { first, second } from "../utilities/array";
|
|
8
|
+
import { verifyTermAsVariable } from "./term";
|
|
9
|
+
import { verifyVariableTypeAssertion } from "./assertion/type";
|
|
10
|
+
import { verifyStatementAgainstCombinator } from "../verify/statement";
|
|
11
|
+
import { bracketedStatementChildNodeFromStatementNode } from "../utilities/proof";
|
|
12
|
+
|
|
13
|
+
const leftTermNodeQuery = nodeQuery("/statement/argument[0]/term!"),
|
|
14
|
+
rightTermNodeQuery = nodeQuery("/statement/argument[1]/term!"),
|
|
15
|
+
statementNodeQuery = nodeQuery("/typeInference/statement!"),
|
|
16
|
+
typeAssertionNodeQuery = nodeQuery("/typeInference/typeAssertion!");
|
|
17
|
+
|
|
18
|
+
export default function verifyTypeInference(typeInferenceNode, context) {
|
|
19
|
+
let typeInferenceVerified = false;
|
|
20
|
+
|
|
21
|
+
const typeInferenceString = context.nodeAsString(typeInferenceNode);
|
|
22
|
+
|
|
23
|
+
context.debug(`Verifying the '${typeInferenceString}' type inference...`, typeInferenceNode);
|
|
24
|
+
|
|
25
|
+
let statementNode = statementNodeQuery(typeInferenceNode);
|
|
26
|
+
|
|
27
|
+
const bracketedStatementChildNode = bracketedStatementChildNodeFromStatementNode(statementNode);
|
|
28
|
+
|
|
29
|
+
if (bracketedStatementChildNode !== null) {
|
|
30
|
+
statementNode = bracketedStatementChildNode; ///
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const statementString = context.nodeAsString(statementNode),
|
|
34
|
+
statementMatches = context.matchStatement(statementNode);
|
|
35
|
+
|
|
36
|
+
if (!statementMatches) {
|
|
37
|
+
context.error(`The '${statementString}' statement is not present in the context.`, typeInferenceNode);
|
|
38
|
+
} else {
|
|
39
|
+
const combinator = equalityCombinator, ///
|
|
40
|
+
statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
|
|
41
|
+
|
|
42
|
+
if (!statementVerifiedAgainstCombinator) {
|
|
43
|
+
context.error(`The '${statementString}' statement is not an equality.`, typeInferenceNode);
|
|
44
|
+
} else {
|
|
45
|
+
const derived = false, ///
|
|
46
|
+
assignments = [],
|
|
47
|
+
typeAssertionNode = typeAssertionNodeQuery(typeInferenceNode),
|
|
48
|
+
variableTypeAssertionVerified = verifyVariableTypeAssertion(typeAssertionNode, assignments, derived, context)
|
|
49
|
+
|
|
50
|
+
if (variableTypeAssertionVerified) {
|
|
51
|
+
const firstAssignment = first(assignments),
|
|
52
|
+
assignment = firstAssignment, ///
|
|
53
|
+
variables = [],
|
|
54
|
+
leftTermNode = leftTermNodeQuery(statementNode),
|
|
55
|
+
rightTermNode = rightTermNodeQuery(statementNode),
|
|
56
|
+
leftTermVerifiedAsVariable = verifyTermAsVariable(leftTermNode, variables, context),
|
|
57
|
+
rightTermVerifiedAsVariable = verifyTermAsVariable(rightTermNode, variables, context);
|
|
58
|
+
|
|
59
|
+
if (leftTermVerifiedAsVariable && rightTermVerifiedAsVariable) {
|
|
60
|
+
const firstVariable = first(variables),
|
|
61
|
+
secondVariable = second(variables),
|
|
62
|
+
leftVariable = firstVariable, ///
|
|
63
|
+
rightVariable = secondVariable, ///
|
|
64
|
+
leftVariableName = leftVariable.getName(),
|
|
65
|
+
leftVariableType = leftVariable.getType(),
|
|
66
|
+
rightVariableName = rightVariable.getName(),
|
|
67
|
+
rightVariableType = rightVariable.getType(),
|
|
68
|
+
leftVariableTypeEqualToOrSubTypeOfOfSuperTypeOfRightVariableType = leftVariableType.isEqualToOrSubTypeOfOfSuperTypeOf(rightVariableType);
|
|
69
|
+
|
|
70
|
+
if (leftVariableTypeEqualToOrSubTypeOfOfSuperTypeOfRightVariableType) {
|
|
71
|
+
const leftVariableTypeSuperTypeOfRightVariableType = leftVariableType.isSuperTypeOf(rightVariableType),
|
|
72
|
+
rightVariableTypeSuperTypeOfLeftVariableType = rightVariableType.isSuperTypeOf(leftVariableType);
|
|
73
|
+
|
|
74
|
+
if (leftVariableTypeSuperTypeOfRightVariableType) {
|
|
75
|
+
const name = leftVariableName, ///
|
|
76
|
+
type = rightVariableType; ///
|
|
77
|
+
|
|
78
|
+
assignAssignment(name, type, assignment, context);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (rightVariableTypeSuperTypeOfLeftVariableType) {
|
|
82
|
+
const name = rightVariableName, ///
|
|
83
|
+
type = leftVariableType; ///
|
|
84
|
+
|
|
85
|
+
assignAssignment(name, type, assignment, context);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
} else if (leftTermVerifiedAsVariable) {
|
|
89
|
+
const types = [];
|
|
90
|
+
|
|
91
|
+
verifyTerm(rightTermNode, types, context);
|
|
92
|
+
|
|
93
|
+
const firstType = first(types),
|
|
94
|
+
firstVariable = first(variables),
|
|
95
|
+
leftVariable = firstVariable, ///
|
|
96
|
+
rightTermType = firstType, ///
|
|
97
|
+
leftVariableName = leftVariable.getName(),
|
|
98
|
+
leftVariableType = leftVariable.getType(),
|
|
99
|
+
leftVariableTypeEqualToOrSuperTypeOfRightTermType = leftVariableType.isEqualToOrSuperTypeOf(rightTermType);
|
|
100
|
+
|
|
101
|
+
if (leftVariableTypeEqualToOrSuperTypeOfRightTermType) {
|
|
102
|
+
const name = leftVariableName, ///
|
|
103
|
+
type = rightTermType; ///
|
|
104
|
+
|
|
105
|
+
assignAssignment(name, type, assignment, context);
|
|
106
|
+
}
|
|
107
|
+
} else if (rightTermVerifiedAsVariable) {
|
|
108
|
+
const types = [];
|
|
109
|
+
|
|
110
|
+
verifyTerm(leftTermNode, types, context);
|
|
111
|
+
|
|
112
|
+
const firstType = first(types),
|
|
113
|
+
firstVariable = first(variables),
|
|
114
|
+
leftTermType = firstType, ///
|
|
115
|
+
rightVariable = firstVariable, ///
|
|
116
|
+
rightVariableName = rightVariable.getName(),
|
|
117
|
+
rightVariableType = rightVariable.getType(),
|
|
118
|
+
rightVariableTypeEqualToOrSuperTypeOfRightTermType = rightVariableType.isEqualToOrSuperTypeOf(leftTermType);
|
|
119
|
+
|
|
120
|
+
if (rightVariableTypeEqualToOrSuperTypeOfRightTermType) {
|
|
121
|
+
const name = rightVariableName, ///
|
|
122
|
+
type = leftTermType; ///
|
|
123
|
+
|
|
124
|
+
assignAssignment(name, type, assignment, context);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
typeInferenceVerified = true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (typeInferenceVerified) {
|
|
134
|
+
context.info(`Verified the '${typeInferenceString}' type inference.`, typeInferenceNode);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return typeInferenceVerified;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function assignAssignment(name, type, assignment, context) {
|
|
141
|
+
const assignmentMatchesNameAndType = assignment.matchNameAndType(name, type);
|
|
142
|
+
|
|
143
|
+
if (assignmentMatchesNameAndType) {
|
|
144
|
+
assignment.assign(context);
|
|
145
|
+
}
|
|
146
|
+
}
|