occam-verify-cli 0.0.679 → 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/lib/axiomLemmaTheoremConjecture.js +3 -3
- package/lib/conclusion.js +9 -3
- package/lib/consequent.js +5 -2
- package/lib/context/file.js +2 -2
- package/lib/equality.js +13 -199
- package/lib/premise.js +17 -5
- package/lib/supposition.js +9 -3
- package/lib/utilities/array.js +5 -2
- package/lib/verifier/node/metastatement.js +9 -6
- package/lib/verifier/node/termAsConstructor.js +2 -2
- package/lib/verifier/nodes/equality.js +155 -0
- package/lib/verifier/nodes/metastatementForMetavariable.js +8 -8
- package/lib/verifier/nodes/statement.js +6 -5
- package/lib/verifier/nodes/term.js +3 -5
- package/lib/verifier/nodes/termForVariable.js +24 -16
- package/lib/verify/file.js +2 -2
- package/lib/verify/label.js +2 -2
- package/lib/verify/metastatement.js +8 -5
- package/lib/verify/metavariable.js +2 -2
- package/lib/verify/statement.js +39 -80
- package/lib/verify/term.js +16 -8
- package/lib/verify/termAsConstructor.js +2 -2
- package/lib/verify/terms.js +45 -0
- package/lib/verify/type.js +3 -3
- package/lib/verify/typeAssertion.js +124 -0
- package/lib/verify/variable.js +3 -3
- package/package.json +2 -2
- package/src/axiomLemmaTheoremConjecture.js +2 -2
- package/src/conclusion.js +10 -2
- package/src/consequent.js +7 -1
- package/src/context/file.js +2 -2
- package/src/equality.js +15 -141
- package/src/premise.js +20 -4
- package/src/supposition.js +10 -2
- package/src/utilities/array.js +1 -1
- package/src/verifier/node/metastatement.js +9 -5
- package/src/verifier/node/termAsConstructor.js +1 -1
- package/src/verifier/nodes/equality.js +68 -0
- package/src/verifier/nodes/metastatementForMetavariable.js +7 -7
- package/src/verifier/nodes/statement.js +6 -4
- package/src/verifier/nodes/term.js +1 -6
- package/src/verifier/nodes/termForVariable.js +34 -22
- package/src/verify/file.js +1 -1
- package/src/verify/label.js +1 -1
- package/src/verify/metastatement.js +8 -4
- package/src/verify/metavariable.js +1 -1
- package/src/verify/statement.js +50 -119
- package/src/verify/term.js +20 -12
- package/src/verify/termAsConstructor.js +1 -1
- package/src/verify/terms.js +54 -0
- package/src/verify/type.js +2 -2
- package/src/verify/typeAssertion.js +164 -0
- package/src/verify/variable.js +2 -2
- 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/verify/assertion/type.js +0 -125
- 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/verify/assertion/type.js +0 -169
- package/src/verify/typeInference.js +0 -146
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import Variable from "../../variable";
|
|
4
|
-
import Assignment from "../../assignment";
|
|
5
|
-
|
|
6
|
-
import { first } from "../../utilities/array";
|
|
7
|
-
import { nodeQuery, typeNameFromTypeNode } from "../../utilities/query";
|
|
8
|
-
import { verifyTermAsVariable, verifyTermAgainstConstructors } from "../../verify/term";
|
|
9
|
-
|
|
10
|
-
const termNodeQuery = nodeQuery("/typeAssertion/term!"),
|
|
11
|
-
typeNodeQuery = nodeQuery("/typeAssertion/type!");
|
|
12
|
-
|
|
13
|
-
export default function verifyTypeAssertion(typeAssertionNode, assignments, derived, context) {
|
|
14
|
-
let typeAssertionVerified = false;
|
|
15
|
-
|
|
16
|
-
const typeAssertionString = context.nodeAsString(typeAssertionNode);
|
|
17
|
-
|
|
18
|
-
context.trace(`Verifying the '${typeAssertionString}' type assertion...`, typeAssertionNode);
|
|
19
|
-
|
|
20
|
-
const typeNode = typeNodeQuery(typeAssertionNode),
|
|
21
|
-
typeName = typeNameFromTypeNode(typeNode),
|
|
22
|
-
typePresent = context.isTypePresentByTypeName(typeName);
|
|
23
|
-
|
|
24
|
-
if (!typePresent) {
|
|
25
|
-
context.info(`The '${typeName}' type is not present.`, typeAssertionNode);
|
|
26
|
-
} else {
|
|
27
|
-
if (!typeAssertionVerified) {
|
|
28
|
-
const variableTypeAssertionVerified = verifyVariableTypeAssertion(typeAssertionNode, assignments, derived, context);
|
|
29
|
-
|
|
30
|
-
typeAssertionVerified = variableTypeAssertionVerified; ///
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
if (!typeAssertionVerified) {
|
|
34
|
-
const termTypeAssertionVerified = verifyTermTypeAssertion(typeAssertionNode, derived, context);
|
|
35
|
-
|
|
36
|
-
typeAssertionVerified = termTypeAssertionVerified; ///
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (typeAssertionVerified) {
|
|
41
|
-
context.debug(`...verified the '${typeAssertionString}' statement type assertion.`, typeAssertionNode);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return typeAssertionVerified;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export function verifyVariableTypeAssertion(typeAssertionNode, assignments, derived, context) {
|
|
48
|
-
let variableTypeAssertionVerified = false;
|
|
49
|
-
|
|
50
|
-
const variables = [],
|
|
51
|
-
termNode = termNodeQuery(typeAssertionNode),
|
|
52
|
-
termVerifiedAsVariable = verifyTermAsVariable(termNode, variables, context);
|
|
53
|
-
|
|
54
|
-
if (termVerifiedAsVariable) {
|
|
55
|
-
const typeAssertionString = context.nodeAsString(typeAssertionNode);
|
|
56
|
-
|
|
57
|
-
context.trace(`Verifying the '${typeAssertionString}' variable type assertion...`, typeAssertionNode);
|
|
58
|
-
|
|
59
|
-
const typeNode = typeNodeQuery(typeAssertionNode),
|
|
60
|
-
typeName = typeNameFromTypeNode(typeNode),
|
|
61
|
-
assertedTypeName = typeName, ///
|
|
62
|
-
assertedType = context.findTypeByTypeName(assertedTypeName);
|
|
63
|
-
|
|
64
|
-
if (assertedType === null) {
|
|
65
|
-
context.info(`The '${assertedTypeName}' asserted type is not present.`, typeAssertionNode);
|
|
66
|
-
} else {
|
|
67
|
-
const firstVariable = first(variables),
|
|
68
|
-
variable = firstVariable, ///
|
|
69
|
-
variableName = variable.getName(),
|
|
70
|
-
variableType = variable.getType();
|
|
71
|
-
|
|
72
|
-
if (derived) {
|
|
73
|
-
const assertedTypeEqualToOrSuperTypeOfVariableType = assertedType.isEqualToOrSuperTypeOf(variableType);
|
|
74
|
-
|
|
75
|
-
if (!assertedTypeEqualToOrSuperTypeOfVariableType) {
|
|
76
|
-
const assertedTypeName = assertedType.getName(),
|
|
77
|
-
variableTypeName = variableType.getName();
|
|
78
|
-
|
|
79
|
-
context.info(`The '${assertedTypeName}' asserted type is not equal to or a super-type of the '${variableName}' variable's '${variableTypeName}' type.`, typeAssertionNode);
|
|
80
|
-
} else {
|
|
81
|
-
variableTypeAssertionVerified = true;
|
|
82
|
-
}
|
|
83
|
-
} else {
|
|
84
|
-
const assertedTypeEqualToOrSubTypeOfVariableType = assertedType.isEqualToOrSubTypeOf(variableType);
|
|
85
|
-
|
|
86
|
-
if (!assertedTypeEqualToOrSubTypeOfVariableType) {
|
|
87
|
-
const assertedTypeName = assertedType.getName(),
|
|
88
|
-
variableTypeName = variableType.getName();
|
|
89
|
-
|
|
90
|
-
context.info(`The '${assertedTypeName}' asserted type is not equal to or a sub-type of the '${variableName}' variable's '${variableTypeName}' type.`, typeAssertionNode);
|
|
91
|
-
} else {
|
|
92
|
-
const name = variableName, ///
|
|
93
|
-
type = assertedType, ///
|
|
94
|
-
variable = Variable.fromNameAndType(name, type),
|
|
95
|
-
assignment = Assignment.fromVariable(variable);
|
|
96
|
-
|
|
97
|
-
assignments.push(assignment);
|
|
98
|
-
|
|
99
|
-
variableTypeAssertionVerified = true;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (variableTypeAssertionVerified) {
|
|
105
|
-
context.debug(`...verified the '${typeAssertionString}' variable type assertion.`, typeAssertionNode);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return variableTypeAssertionVerified;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
function verifyTermTypeAssertion(typeAssertionNode, derived, context) {
|
|
113
|
-
let termTypeAssertionVerified = false;
|
|
114
|
-
|
|
115
|
-
const types = [],
|
|
116
|
-
termNode = termNodeQuery(typeAssertionNode),
|
|
117
|
-
termVerifiedAgainstConstructors = verifyTermAgainstConstructors(termNode, types, context);
|
|
118
|
-
|
|
119
|
-
if (termVerifiedAgainstConstructors) {
|
|
120
|
-
const typeAssertionString = context.nodeAsString(typeAssertionNode);
|
|
121
|
-
|
|
122
|
-
context.trace(`Verifying the '${typeAssertionString}' term type assertion...`, typeAssertionNode);
|
|
123
|
-
|
|
124
|
-
const typeNode = typeNodeQuery(typeAssertionNode),
|
|
125
|
-
typeName = typeNameFromTypeNode(typeNode),
|
|
126
|
-
assertedTypeName = typeName, ///
|
|
127
|
-
assertedType = context.findTypeByTypeName(assertedTypeName);
|
|
128
|
-
|
|
129
|
-
if (assertedType === null) {
|
|
130
|
-
context.info(`The '${assertedTypeName}' asserted type is not present.`, typeAssertionNode);
|
|
131
|
-
} else {
|
|
132
|
-
const firstType = first(types),
|
|
133
|
-
termType = firstType; ///
|
|
134
|
-
|
|
135
|
-
if (derived) {
|
|
136
|
-
const assertedTypeIsEqualToOrSuperTypeOfTermType = assertedType.isEqualToOrSuperTypeOf(termType);
|
|
137
|
-
|
|
138
|
-
if (!assertedTypeIsEqualToOrSuperTypeOfTermType) {
|
|
139
|
-
const termString = context.nodeAsString(termNode),
|
|
140
|
-
termTypeName = termType.getName(),
|
|
141
|
-
assertedTypeName = assertedType.getName();
|
|
142
|
-
|
|
143
|
-
context.info(`The '${assertedTypeName}' asserted type is not equal to or a super-type of the '${termString}' term's '${termTypeName}' type.`, typeAssertionNode);
|
|
144
|
-
} else {
|
|
145
|
-
termTypeAssertionVerified = true;
|
|
146
|
-
}
|
|
147
|
-
} else {
|
|
148
|
-
const assertedTypeIsEqualToOrSubTypeOfTermType = assertedType.isEqualToOrSubTypeOf(termType);
|
|
149
|
-
|
|
150
|
-
if (!assertedTypeIsEqualToOrSubTypeOfTermType) {
|
|
151
|
-
const termString = context.nodeAsString(termNode),
|
|
152
|
-
termTypeName = termType.getName(),
|
|
153
|
-
assertedTypeName = assertedType.getName();
|
|
154
|
-
|
|
155
|
-
context.info(`The '${assertedTypeName}' asserted type is not equal to or a sub-type of the '${termString}' term's '${termTypeName}' type.`, typeAssertionNode);
|
|
156
|
-
} else {
|
|
157
|
-
termTypeAssertionVerified = true;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if (termTypeAssertionVerified) {
|
|
163
|
-
context.debug(`...verified the '${typeAssertionString}' term type assertion.`, typeAssertionNode);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return termTypeAssertionVerified;
|
|
168
|
-
}
|
|
169
|
-
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import Equality from "../equality";
|
|
4
|
-
import verifyTerm from "./term";
|
|
5
|
-
import equalityCombinator from "../ocmbinator/equality";
|
|
6
|
-
|
|
7
|
-
import { nodeQuery } from "../utilities/query";
|
|
8
|
-
import { first, second } from "../utilities/array";
|
|
9
|
-
import { verifyTermAsVariable } from "./term";
|
|
10
|
-
import { verifyVariableTypeAssertion } from "./assertion/type";
|
|
11
|
-
import { verifyStatementAgainstCombinator } from "../verify/statement";
|
|
12
|
-
import { bracketedStatementChildNodeFromStatementNode } from "../utilities/proof";
|
|
13
|
-
|
|
14
|
-
const statementNodeQuery = nodeQuery("/typeInference/statement!"),
|
|
15
|
-
typeAssertionNodeQuery = nodeQuery("/typeInference/typeAssertion!");
|
|
16
|
-
|
|
17
|
-
export default function verifyTypeInference(typeInferenceNode, context) {
|
|
18
|
-
let typeInferenceVerified = false;
|
|
19
|
-
|
|
20
|
-
const typeInferenceString = context.nodeAsString(typeInferenceNode);
|
|
21
|
-
|
|
22
|
-
context.trace(`Verifying the '${typeInferenceString}' type inference...`, typeInferenceNode);
|
|
23
|
-
|
|
24
|
-
let statementNode = statementNodeQuery(typeInferenceNode);
|
|
25
|
-
|
|
26
|
-
const bracketedStatementChildNode = bracketedStatementChildNodeFromStatementNode(statementNode);
|
|
27
|
-
|
|
28
|
-
if (bracketedStatementChildNode !== null) {
|
|
29
|
-
statementNode = bracketedStatementChildNode; ///
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const statementString = context.nodeAsString(statementNode),
|
|
33
|
-
statementMatches = context.matchStatement(statementNode);
|
|
34
|
-
|
|
35
|
-
if (!statementMatches) {
|
|
36
|
-
context.info(`The '${statementString}' statement is not present in the context.`, typeInferenceNode);
|
|
37
|
-
} else {
|
|
38
|
-
const combinator = equalityCombinator, ///
|
|
39
|
-
statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
|
|
40
|
-
|
|
41
|
-
if (!statementVerifiedAgainstCombinator) {
|
|
42
|
-
context.info(`The '${statementString}' statement is not an equality.`, typeInferenceNode);
|
|
43
|
-
} else {
|
|
44
|
-
const derived = false, ///
|
|
45
|
-
equality = Equality.fromStatementNode(statementNode),
|
|
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 = equality.getLeftTermNode(),
|
|
55
|
-
rightTermNode = equality.getRightTermNode(),
|
|
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.debug(`...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
|
-
}
|