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
package/src/equality.js
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import verifyTerm from "./verify/term";
|
|
4
|
-
import NodesVerifier from "./verifier/nodes";
|
|
5
3
|
import equalityStatementNode from "./node/statement/equality";
|
|
4
|
+
import equalityNodesVerifier from "./verifier/nodes/equality";
|
|
6
5
|
|
|
7
6
|
import { nodeQuery } from "./utilities/query";
|
|
8
|
-
import { first, second } from "./utilities/array";
|
|
9
|
-
import { TERM_RULE_NAME } from "./ruleNames";
|
|
10
7
|
import { EQUALITY_DEPTH } from "./constants";
|
|
11
|
-
import { verifyTermAsVariable } from "./verify/term";
|
|
12
8
|
|
|
13
9
|
const leftTermNodeQuery = nodeQuery("/statement/argument[0]/term!"),
|
|
14
10
|
rightTermNodeQuery = nodeQuery("/statement/argument[1]/term!");
|
|
@@ -78,10 +74,10 @@ export default class Equality {
|
|
|
78
74
|
return matches;
|
|
79
75
|
}
|
|
80
76
|
|
|
81
|
-
verify(equalities, context) {
|
|
77
|
+
verify(equalities, context, verifyAhead) {
|
|
82
78
|
const leftNonTerminalNode = this.leftTermNode, ///
|
|
83
79
|
rightNonTerminalNode = this.rightTermNode, ///
|
|
84
|
-
nonTerminalNodeVerified = equalityNodesVerifier.verifyNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context),
|
|
80
|
+
nonTerminalNodeVerified = equalityNodesVerifier.verifyNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context, verifyAhead),
|
|
85
81
|
verified = nonTerminalNodeVerified; ///
|
|
86
82
|
|
|
87
83
|
return verified;
|
|
@@ -93,157 +89,35 @@ export default class Equality {
|
|
|
93
89
|
const statementNode = proofStep.getStatementNode();
|
|
94
90
|
|
|
95
91
|
if (statementNode !== null) {
|
|
96
|
-
|
|
97
|
-
statementNodeMatchesEqualityStatementNode = statementNode.match(equalityStatementNode, depth);
|
|
98
|
-
|
|
99
|
-
if (statementNodeMatchesEqualityStatementNode) {
|
|
100
|
-
const leftTermNode = leftTermNodeQuery(statementNode),
|
|
101
|
-
rightTermNode = rightTermNodeQuery(statementNode);
|
|
102
|
-
|
|
103
|
-
equality = new Equality(leftTermNode, rightTermNode);
|
|
104
|
-
}
|
|
92
|
+
equality = Equality.fromStatementNode(statementNode);
|
|
105
93
|
}
|
|
106
94
|
|
|
107
95
|
return equality;
|
|
108
96
|
}
|
|
109
97
|
|
|
110
98
|
static fromStatementNode(statementNode) {
|
|
111
|
-
|
|
112
|
-
rightTermNode = rightTermNodeQuery(statementNode),
|
|
113
|
-
equality = new Equality(leftTermNode, rightTermNode);
|
|
114
|
-
|
|
115
|
-
return equality;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
static fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode) {
|
|
119
|
-
const equality = new Equality(leftTermNode, rightTermNode);
|
|
120
|
-
|
|
121
|
-
return equality;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
class EqualityNodesVerifier extends NodesVerifier {
|
|
126
|
-
verifyNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context) {
|
|
127
|
-
let nonTerminalNodeVerified = false;
|
|
128
|
-
|
|
129
|
-
const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
|
|
130
|
-
rightNonTerminalNodeRuleName = rightNonTerminalNode.getRuleName();
|
|
131
|
-
|
|
132
|
-
if (leftNonTerminalNodeRuleName === rightNonTerminalNodeRuleName) {
|
|
133
|
-
const ruleName = leftNonTerminalNodeRuleName, ///
|
|
134
|
-
ruleNameTermRuleName = (ruleName === TERM_RULE_NAME);
|
|
135
|
-
|
|
136
|
-
if (ruleNameTermRuleName) {
|
|
137
|
-
const leftTermNode = leftNonTerminalNode, ///
|
|
138
|
-
rightTermNode = rightNonTerminalNode, ///
|
|
139
|
-
termNodeVerified = this.verifyTermNode(leftTermNode, rightTermNode, equalities, context);
|
|
99
|
+
let equality = null;
|
|
140
100
|
|
|
141
|
-
|
|
142
|
-
|
|
101
|
+
const depth = EQUALITY_DEPTH,
|
|
102
|
+
statementNodeMatchesEqualityStatementNode = statementNode.match(equalityStatementNode, depth);
|
|
143
103
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
leftChildNodes = leftNonTerminalNodeChildNodes, ///
|
|
148
|
-
rightChildNodes = rightNonTerminalNodeChildNodes, ///
|
|
149
|
-
childNodesVerified = this.verifyChildNodes(leftChildNodes, rightChildNodes, equalities, context);
|
|
104
|
+
if (statementNodeMatchesEqualityStatementNode) {
|
|
105
|
+
const leftTermNode = leftTermNodeQuery(statementNode),
|
|
106
|
+
rightTermNode = rightTermNodeQuery(statementNode);
|
|
150
107
|
|
|
151
|
-
|
|
152
|
-
}
|
|
108
|
+
equality = new Equality(leftTermNode, rightTermNode);
|
|
153
109
|
}
|
|
154
110
|
|
|
155
|
-
return
|
|
111
|
+
return equality;
|
|
156
112
|
}
|
|
157
113
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
const variables = [],
|
|
162
|
-
leftTermVerifiedAsVariable = verifyTermAsVariable(leftTermNode, variables, context),
|
|
163
|
-
rightTermVerifiedAsVariable = verifyTermAsVariable(rightTermNode, variables, context);
|
|
164
|
-
|
|
165
|
-
let equality = null;
|
|
166
|
-
|
|
167
|
-
if (leftTermVerifiedAsVariable && rightTermVerifiedAsVariable) {
|
|
168
|
-
const firstVariable = first(variables),
|
|
169
|
-
secondVariable = second(variables),
|
|
170
|
-
leftVariable = firstVariable, ///
|
|
171
|
-
rightVariable = secondVariable, ///
|
|
172
|
-
leftVariableType = leftVariable.getType(),
|
|
173
|
-
rightVariableType = rightVariable.getType(),
|
|
174
|
-
leftVariableTypeEqualToOrSubTypeOfOfSuperTypeOfRightVariableType = leftVariableType.isEqualToOrSubTypeOfOfSuperTypeOf(rightVariableType);
|
|
175
|
-
|
|
176
|
-
if (leftVariableTypeEqualToOrSubTypeOfOfSuperTypeOfRightVariableType) {
|
|
177
|
-
equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode);
|
|
178
|
-
}
|
|
179
|
-
} else if (leftTermVerifiedAsVariable) {
|
|
180
|
-
const types = [];
|
|
181
|
-
|
|
182
|
-
verifyTerm(rightTermNode, types, context);
|
|
183
|
-
|
|
184
|
-
const firstType = first(types),
|
|
185
|
-
firstVariable = first(variables),
|
|
186
|
-
leftVariable = firstVariable, ///
|
|
187
|
-
rightTermType = firstType, ///
|
|
188
|
-
leftVariableType = leftVariable.getType(),
|
|
189
|
-
leftVariableTypeEqualToOrSuperTypeOfRightTermType = leftVariableType.isEqualToOrSuperTypeOf(rightTermType);
|
|
190
|
-
|
|
191
|
-
if (leftVariableTypeEqualToOrSuperTypeOfRightTermType) {
|
|
192
|
-
equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode);
|
|
193
|
-
}
|
|
194
|
-
} else if (rightTermVerifiedAsVariable) {
|
|
195
|
-
const types = [];
|
|
196
|
-
|
|
197
|
-
verifyTerm(leftTermNode, types, context);
|
|
198
|
-
|
|
199
|
-
const firstType = first(types),
|
|
200
|
-
firstVariable = first(variables),
|
|
201
|
-
leftTermType = firstType, ///
|
|
202
|
-
rightVariable = firstVariable, ///
|
|
203
|
-
rightVariableType = rightVariable.getType(),
|
|
204
|
-
rightVariableTypeEqualToOrSuperTypeOfRightTermType = rightVariableType.isEqualToOrSuperTypeOf(leftTermType);
|
|
205
|
-
|
|
206
|
-
if (rightVariableTypeEqualToOrSuperTypeOfRightTermType) {
|
|
207
|
-
equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode);
|
|
208
|
-
}
|
|
209
|
-
} else {
|
|
210
|
-
const types = [];
|
|
211
|
-
|
|
212
|
-
verifyTerm(leftTermNode, types, context);
|
|
213
|
-
|
|
214
|
-
verifyTerm(rightTermNode, types, context);
|
|
215
|
-
|
|
216
|
-
const firstType = first(types),
|
|
217
|
-
secondType = second(types),
|
|
218
|
-
leftTermType = firstType, ///
|
|
219
|
-
rightTermType = secondType, ///
|
|
220
|
-
leftTermTypeEqualToOrSubTypeOfOfSuperTypeOfRightTermType = leftTermType.isEqualToOrSubTypeOfOfSuperTypeOf(rightTermType);
|
|
221
|
-
|
|
222
|
-
if (leftTermTypeEqualToOrSubTypeOfOfSuperTypeOfRightTermType) {
|
|
223
|
-
equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
if (equality !== null) {
|
|
228
|
-
const equalityA = equality, ///
|
|
229
|
-
equalitiesB = equalities, ///
|
|
230
|
-
equalityMatches = equalitiesB.some((equalityB) => { ///
|
|
231
|
-
const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB, context);
|
|
232
|
-
|
|
233
|
-
if (equalityAMatchesEqualityB) {
|
|
234
|
-
return true;
|
|
235
|
-
}
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
termNodeVerified = equalityMatches; ///
|
|
239
|
-
}
|
|
114
|
+
static fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode) {
|
|
115
|
+
const equality = new Equality(leftTermNode, rightTermNode);
|
|
240
116
|
|
|
241
|
-
return
|
|
117
|
+
return equality;
|
|
242
118
|
}
|
|
243
119
|
}
|
|
244
120
|
|
|
245
|
-
const equalityNodesVerifier = new EqualityNodesVerifier();
|
|
246
|
-
|
|
247
121
|
function filterEqualities(equalities, equality) {
|
|
248
122
|
const equalityA = equality; ///
|
|
249
123
|
|
package/src/premise.js
CHANGED
|
@@ -46,7 +46,11 @@ export default class Premise {
|
|
|
46
46
|
nonTerminalNodeB = subproofStatementNode, ///
|
|
47
47
|
fileContextA = fileContext, ///
|
|
48
48
|
proofContextB = statementProofContext, ///
|
|
49
|
-
nonTerminalNodeVerified = premiseStatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, proofContextB)
|
|
49
|
+
nonTerminalNodeVerified = premiseStatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, proofContextB, () => {
|
|
50
|
+
const verifiedAhead = true;
|
|
51
|
+
|
|
52
|
+
return verifiedAhead;
|
|
53
|
+
});
|
|
50
54
|
|
|
51
55
|
if (nonTerminalNodeVerified) {
|
|
52
56
|
return true;
|
|
@@ -63,7 +67,11 @@ export default class Premise {
|
|
|
63
67
|
nonTerminalNodeB = statementNode, ///
|
|
64
68
|
fileContextA = fileContext, ///
|
|
65
69
|
proofContextB = statementProofContext, ///
|
|
66
|
-
nonTerminalNodeVerified = premiseStatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, proofContextB)
|
|
70
|
+
nonTerminalNodeVerified = premiseStatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, proofContextB, () => {
|
|
71
|
+
const verifiedAhead = true;
|
|
72
|
+
|
|
73
|
+
return verifiedAhead;
|
|
74
|
+
}),
|
|
67
75
|
statementNodeMatches = nonTerminalNodeVerified; ///
|
|
68
76
|
|
|
69
77
|
return statementNodeMatches;
|
|
@@ -92,7 +100,11 @@ export default class Premise {
|
|
|
92
100
|
nonTerminalNodeB = ruleSubproofMetastatementNode, ///
|
|
93
101
|
fileContextA = fileContext, ///
|
|
94
102
|
metaproofContextB = metastatementMetaproofContext, ///
|
|
95
|
-
nonTerminalNodeVerified = premiseMetastatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB)
|
|
103
|
+
nonTerminalNodeVerified = premiseMetastatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB, () => {
|
|
104
|
+
const verifiedAhead = true;
|
|
105
|
+
|
|
106
|
+
return verifiedAhead;
|
|
107
|
+
});
|
|
96
108
|
|
|
97
109
|
if (nonTerminalNodeVerified) {
|
|
98
110
|
return true;
|
|
@@ -109,7 +121,11 @@ export default class Premise {
|
|
|
109
121
|
nonTerminalNodeB = metastatementNode, ///
|
|
110
122
|
fileContextA = fileContext, ///
|
|
111
123
|
metaproofContextB = metastatementMetaproofContext, ///
|
|
112
|
-
nonTerminalNodeVerified = premiseMetastatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB)
|
|
124
|
+
nonTerminalNodeVerified = premiseMetastatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB, () => {
|
|
125
|
+
const verifiedAhead = true;
|
|
126
|
+
|
|
127
|
+
return verifiedAhead;
|
|
128
|
+
}),
|
|
113
129
|
metastatementNodeMatches = nonTerminalNodeVerified; ///
|
|
114
130
|
|
|
115
131
|
return metastatementNodeMatches;
|
package/src/supposition.js
CHANGED
|
@@ -43,7 +43,11 @@ export default class Supposition {
|
|
|
43
43
|
nonTerminalNodeB = subproofStatementNode, ///
|
|
44
44
|
proofContextA = proofContext, ///
|
|
45
45
|
proofContextB = statementProofContext, ///
|
|
46
|
-
nonTerminalNodeVerified = suppositionTermForVariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB)
|
|
46
|
+
nonTerminalNodeVerified = suppositionTermForVariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB, () => {
|
|
47
|
+
const verifiedAhead = true;
|
|
48
|
+
|
|
49
|
+
return verifiedAhead;
|
|
50
|
+
});
|
|
47
51
|
|
|
48
52
|
if (nonTerminalNodeVerified) {
|
|
49
53
|
return true;
|
|
@@ -60,7 +64,11 @@ export default class Supposition {
|
|
|
60
64
|
nonTerminalNodeB = statementNode, ///
|
|
61
65
|
proofContextA = proofContext, ///
|
|
62
66
|
proofContextB = statementProofContext, ///
|
|
63
|
-
nonTerminalNodeVerified = suppositionTermForVariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB)
|
|
67
|
+
nonTerminalNodeVerified = suppositionTermForVariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB, () => {
|
|
68
|
+
const verifiedAhead = true;
|
|
69
|
+
|
|
70
|
+
return verifiedAhead;
|
|
71
|
+
}),
|
|
64
72
|
statementNodeMatches = nonTerminalNodeVerified; ///
|
|
65
73
|
|
|
66
74
|
return statementNodeMatches;
|
package/src/utilities/array.js
CHANGED
|
@@ -6,7 +6,7 @@ import permutationsMatrix from "../permutationsMatrix";
|
|
|
6
6
|
|
|
7
7
|
import { MAXIMUM_INDEXES_LENGTH, MAXIMUM_PERMUTATION_LENGTH } from "../constants";
|
|
8
8
|
|
|
9
|
-
export const { first, second, last, push, prune, filter } = arrayUtilities;
|
|
9
|
+
export const { first, second, last, push, prune, filter, clear } = arrayUtilities;
|
|
10
10
|
|
|
11
11
|
export function someSubArray(array, subArrayLength, callback) {
|
|
12
12
|
let found = false;
|
|
@@ -6,7 +6,7 @@ import { METAVARIABLE_RULE_NAME } from "../../ruleNames";
|
|
|
6
6
|
import { metavariableNameFromMetavariableNode } from "../../utilities/query";
|
|
7
7
|
|
|
8
8
|
class MetastatementNodeVerifier extends NodeVerifier {
|
|
9
|
-
verifyNonTerminalNode(nonTerminalNode, metaproofContext) {
|
|
9
|
+
verifyNonTerminalNode(nonTerminalNode, metaproofContext, verifyAhead) {
|
|
10
10
|
let nonTerminalNodeVerified;
|
|
11
11
|
|
|
12
12
|
const ruleName = nonTerminalNode.getRuleName(); ///
|
|
@@ -14,7 +14,7 @@ class MetastatementNodeVerifier extends NodeVerifier {
|
|
|
14
14
|
switch (ruleName) {
|
|
15
15
|
case METAVARIABLE_RULE_NAME: {
|
|
16
16
|
const metavariableNode = nonTerminalNode, ///
|
|
17
|
-
metavariableVerified = verifyMetavariable(metavariableNode, metaproofContext),
|
|
17
|
+
metavariableVerified = verifyMetavariable(metavariableNode, metaproofContext, verifyAhead),
|
|
18
18
|
metavariableNodeVerified = metavariableVerified; ///
|
|
19
19
|
|
|
20
20
|
nonTerminalNodeVerified = metavariableNodeVerified; ///
|
|
@@ -23,7 +23,7 @@ class MetastatementNodeVerifier extends NodeVerifier {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
default: {
|
|
26
|
-
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNode, metaproofContext);
|
|
26
|
+
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNode, metaproofContext, verifyAhead);
|
|
27
27
|
|
|
28
28
|
break;
|
|
29
29
|
}
|
|
@@ -37,7 +37,7 @@ const metastatementNodeVerifier = new MetastatementNodeVerifier();
|
|
|
37
37
|
|
|
38
38
|
export default metastatementNodeVerifier;
|
|
39
39
|
|
|
40
|
-
function verifyMetavariable(metavariableNode, metaproofContext) {
|
|
40
|
+
function verifyMetavariable(metavariableNode, metaproofContext, verifyAhead) {
|
|
41
41
|
let metavariableVerified;
|
|
42
42
|
|
|
43
43
|
const metavariableString = metaproofContext.nodeAsString(metavariableNode);
|
|
@@ -47,7 +47,11 @@ function verifyMetavariable(metavariableNode, metaproofContext) {
|
|
|
47
47
|
const metavariableName = metavariableNameFromMetavariableNode(metavariableNode),
|
|
48
48
|
metavariablePresent = metaproofContext.isMetavariablePresentByMetavariableName(metavariableName);
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
if (metavariablePresent) {
|
|
51
|
+
const verifiedAhead = verifyAhead();
|
|
52
|
+
|
|
53
|
+
metavariableVerified = verifiedAhead; ///
|
|
54
|
+
}
|
|
51
55
|
|
|
52
56
|
if (metavariableVerified) {
|
|
53
57
|
metaproofContext.debug(`...verified the '${metavariableString}' metavariable.`, metavariableNode);
|
|
@@ -82,7 +82,7 @@ export function verifyType(typeNode, fileContext, verifyAhead) {
|
|
|
82
82
|
typePresent = fileContext.isTypePresentByTypeName(typeName);
|
|
83
83
|
|
|
84
84
|
if (!typePresent) {
|
|
85
|
-
fileContext.
|
|
85
|
+
fileContext.debug(`The type '${typeName}' is not present.`, typeNode);
|
|
86
86
|
} else {
|
|
87
87
|
fileContext.debug(`...verified the '${typeString}' type.`, typeNode);
|
|
88
88
|
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import Equality from "../../equality";
|
|
4
|
+
import verifyTerms from "../../verify/terms";
|
|
5
|
+
import NodesVerifier from "../../verifier/nodes";
|
|
6
|
+
|
|
7
|
+
import { TERM_RULE_NAME } from "../../ruleNames";
|
|
8
|
+
|
|
9
|
+
class EqualityNodesVerifier extends NodesVerifier {
|
|
10
|
+
verifyNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context, verifyAhead) {
|
|
11
|
+
let nonTerminalNodeVerified = false;
|
|
12
|
+
|
|
13
|
+
const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
|
|
14
|
+
rightNonTerminalNodeRuleName = rightNonTerminalNode.getRuleName();
|
|
15
|
+
|
|
16
|
+
if (leftNonTerminalNodeRuleName === rightNonTerminalNodeRuleName) {
|
|
17
|
+
const leftNonTerminalNodeRuleNameTermRuleName = (leftNonTerminalNodeRuleName === TERM_RULE_NAME),
|
|
18
|
+
rightNonTerminalNodeRuleNameTermRuleName = (rightNonTerminalNodeRuleName === TERM_RULE_NAME);
|
|
19
|
+
|
|
20
|
+
if (leftNonTerminalNodeRuleNameTermRuleName && rightNonTerminalNodeRuleNameTermRuleName) {
|
|
21
|
+
const leftTermNode = leftNonTerminalNode, ///
|
|
22
|
+
rightTermNode = rightNonTerminalNode, ///
|
|
23
|
+
termNodeVerified = this.verifyTermNode(leftTermNode, rightTermNode, equalities, context, verifyAhead);
|
|
24
|
+
|
|
25
|
+
nonTerminalNodeVerified = termNodeVerified; ///
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (!nonTerminalNodeVerified) {
|
|
29
|
+
const leftNonTerminalNodeChildNodes = leftNonTerminalNode.getChildNodes(),
|
|
30
|
+
rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(),
|
|
31
|
+
leftChildNodes = leftNonTerminalNodeChildNodes, ///
|
|
32
|
+
rightChildNodes = rightNonTerminalNodeChildNodes, ///
|
|
33
|
+
childNodesVerified = this.verifyChildNodes(leftChildNodes, rightChildNodes, equalities, context, verifyAhead);
|
|
34
|
+
|
|
35
|
+
nonTerminalNodeVerified = childNodesVerified; ///
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return nonTerminalNodeVerified;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
verifyTermNode(leftTermNode, rightTermNode, equalities, context, verifyAhead) {
|
|
43
|
+
let termNodeVerified = false;
|
|
44
|
+
|
|
45
|
+
const termsVerified = verifyTerms(leftTermNode, rightTermNode, context, verifyAhead);
|
|
46
|
+
|
|
47
|
+
if (termsVerified) {
|
|
48
|
+
const equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode),
|
|
49
|
+
equalityA = equality, ///
|
|
50
|
+
equalitiesB = equalities, ///
|
|
51
|
+
equalityMatches = equalitiesB.some((equalityB) => { ///
|
|
52
|
+
const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB, context);
|
|
53
|
+
|
|
54
|
+
if (equalityAMatchesEqualityB) {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
termNodeVerified = equalityMatches; ///
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return termNodeVerified;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const equalityNodesVerifier = new EqualityNodesVerifier();
|
|
67
|
+
|
|
68
|
+
export default equalityNodesVerifier;
|
|
@@ -10,7 +10,7 @@ import { metavariableNameFromMetavariableNode } from "../../utilities/query";
|
|
|
10
10
|
const metavariableNodeQuery = nodeQuery('/metastatement/metavariable!');
|
|
11
11
|
|
|
12
12
|
export default class MetastatementForMetavariableNodesVerifier extends NodesVerifier {
|
|
13
|
-
verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB) {
|
|
13
|
+
verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead) {
|
|
14
14
|
let nonTerminalNodeVerified = false;
|
|
15
15
|
|
|
16
16
|
const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
|
|
@@ -23,28 +23,28 @@ export default class MetastatementForMetavariableNodesVerifier extends NodesVeri
|
|
|
23
23
|
if (nonTerminalNodeARuleNameMetastatementRuleName && nonTerminalNodeBRuleNameMetastatementRuleName) {
|
|
24
24
|
const metastatementNodeA = nonTerminalNodeA, ///
|
|
25
25
|
metastatementNodeB = nonTerminalNodeB, ///
|
|
26
|
-
metastatementNodeVerified = this.verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB);
|
|
26
|
+
metastatementNodeVerified = this.verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead);
|
|
27
27
|
|
|
28
28
|
if (metastatementNodeVerified) {
|
|
29
29
|
nonTerminalNodeVerified = true; ///
|
|
30
30
|
} else {
|
|
31
|
-
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB);
|
|
31
|
+
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead);
|
|
32
32
|
}
|
|
33
33
|
} else {
|
|
34
|
-
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB);
|
|
34
|
+
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead);
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
return nonTerminalNodeVerified;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB) {
|
|
41
|
+
verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead) {
|
|
42
42
|
let metastatementNodeVerified = false;
|
|
43
43
|
|
|
44
44
|
const metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
|
|
45
45
|
|
|
46
46
|
if (metavariableNodeA !== null) {
|
|
47
|
-
const metaVariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB);
|
|
47
|
+
const metaVariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead);
|
|
48
48
|
|
|
49
49
|
metastatementNodeVerified = metaVariableNodeVerified; ///
|
|
50
50
|
}
|
|
@@ -52,7 +52,7 @@ export default class MetastatementForMetavariableNodesVerifier extends NodesVeri
|
|
|
52
52
|
return metastatementNodeVerified;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB) {
|
|
55
|
+
verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead) {
|
|
56
56
|
let metavariableNodeVerified;
|
|
57
57
|
|
|
58
58
|
const metavariableNameA = metavariableNameFromMetavariableNode(metavariableNodeA),
|
|
@@ -71,21 +71,23 @@ function verifyMetaargument(metaArgumentNode, combinatorMetaargumentNode, contex
|
|
|
71
71
|
combinatorMetaTYpeNode = metaTypeNodeQuery(combinatorMetaargumentNode);
|
|
72
72
|
|
|
73
73
|
if (statementNode === null) {
|
|
74
|
-
context.
|
|
74
|
+
context.debug(`Expected a statement but got a '${metaArgumentString}' meta-type.`, metaArgumentNode);
|
|
75
75
|
} else {
|
|
76
76
|
if (combinatorMetaTYpeNode === null) {
|
|
77
77
|
const combinatorMetaargumentString = context.nodeAsString(combinatorMetaargumentNode);
|
|
78
78
|
|
|
79
|
-
context.
|
|
79
|
+
context.debug(`Expected a meta-type but got a '${combinatorMetaargumentString}' statement.`, metaArgumentNode);
|
|
80
80
|
} else {
|
|
81
81
|
const combinatorMetaTypeTerminalNode = metaTypeTerminalNodeQuery(combinatorMetaTYpeNode),
|
|
82
82
|
content = combinatorMetaTypeTerminalNode.getContent(),
|
|
83
83
|
contentStatementMetaType = (content === STATEMENT_META_TYPE);
|
|
84
84
|
|
|
85
85
|
if (!contentStatementMetaType) {
|
|
86
|
-
context.
|
|
86
|
+
context.debug(`Expected the meta-type of the combinator to be '${STATEMENT_META_TYPE}' but got '${content}' instead.`, metaArgumentNode);
|
|
87
87
|
} else {
|
|
88
|
-
|
|
88
|
+
const verifiedAhead = verifyAhead();
|
|
89
|
+
|
|
90
|
+
metaArgumentVerified = verifiedAhead; ///
|
|
89
91
|
}
|
|
90
92
|
}
|
|
91
93
|
}
|
|
@@ -55,7 +55,7 @@ export function verifyArgument(argumentNode, constructorArgumentNode, context, v
|
|
|
55
55
|
const typeNode = typeNodeQuery(argumentNode);
|
|
56
56
|
|
|
57
57
|
if (typeNode !== null) {
|
|
58
|
-
context.
|
|
58
|
+
context.debug(`The '${argumentString}' argument should be a term, not a type.`, argumentNode);
|
|
59
59
|
} else {
|
|
60
60
|
const termNode = termNodeQuery(argumentNode);
|
|
61
61
|
|
|
@@ -83,15 +83,10 @@ export function verifyArgument(argumentNode, constructorArgumentNode, context, v
|
|
|
83
83
|
const constructorTypeName = typeNameFromTypeNode(constructorTypeNode),
|
|
84
84
|
firstType = first(types),
|
|
85
85
|
termType = firstType, ///
|
|
86
|
-
termTypeName = termType.getName(),
|
|
87
86
|
constructorType = context.findTypeByTypeName(constructorTypeName),
|
|
88
87
|
termTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(constructorType);
|
|
89
88
|
|
|
90
89
|
if (termTypeEqualToOrSubTypeOfType) {
|
|
91
|
-
const termString = context.nodeAsString(termNode);
|
|
92
|
-
|
|
93
|
-
context.trace(`The '${termTypeName}' type of the '${termString}' term is equal to or a sub-type of the '${constructorTypeName}' type in the constructor.`, argumentNode);
|
|
94
|
-
|
|
95
90
|
verifiedAhead = verifyAhead();
|
|
96
91
|
}
|
|
97
92
|
|
|
@@ -12,7 +12,7 @@ import { variableNameFromVariableNode } from "../../utilities/query";
|
|
|
12
12
|
const variableNodeQuery = nodeQuery('/term/variable!');
|
|
13
13
|
|
|
14
14
|
export default class TermForVariableNodesVerifier extends NodesVerifier {
|
|
15
|
-
verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB) {
|
|
15
|
+
verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB, verifyAhead) {
|
|
16
16
|
let nonTerminalNodeVerified = false;
|
|
17
17
|
|
|
18
18
|
const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
|
|
@@ -25,28 +25,28 @@ export default class TermForVariableNodesVerifier extends NodesVerifier {
|
|
|
25
25
|
if (nonTerminalNodeARuleNameTermRuleName && nonTerminalNodeBRuleNameTermRuleName) {
|
|
26
26
|
const termNodeA = nonTerminalNodeA, ///
|
|
27
27
|
termNodeB = nonTerminalNodeB, ///
|
|
28
|
-
termNodeVerified = this.verifyTermNode(termNodeA, termNodeB, substitutions, proofContextA, proofContextB);
|
|
28
|
+
termNodeVerified = this.verifyTermNode(termNodeA, termNodeB, substitutions, proofContextA, proofContextB, verifyAhead);
|
|
29
29
|
|
|
30
30
|
if (termNodeVerified) {
|
|
31
31
|
nonTerminalNodeVerified = true; ///
|
|
32
32
|
} else {
|
|
33
|
-
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB);
|
|
33
|
+
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB, verifyAhead);
|
|
34
34
|
}
|
|
35
35
|
} else {
|
|
36
|
-
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB);
|
|
36
|
+
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB, verifyAhead);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
return nonTerminalNodeVerified;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
verifyTermNode(termNodeA, termNodeB, substitutions, proofContextA, proofContextB) {
|
|
43
|
+
verifyTermNode(termNodeA, termNodeB, substitutions, proofContextA, proofContextB, verifyAhead) {
|
|
44
44
|
let termNodeVerified = false;
|
|
45
45
|
|
|
46
46
|
const variableNodeA = variableNodeQuery(termNodeA);
|
|
47
47
|
|
|
48
48
|
if (variableNodeA !== null) {
|
|
49
|
-
const variableVerified = this.verifyVariableNode(variableNodeA, termNodeB, substitutions, proofContextA, proofContextB);
|
|
49
|
+
const variableVerified = this.verifyVariableNode(variableNodeA, termNodeB, substitutions, proofContextA, proofContextB, verifyAhead);
|
|
50
50
|
|
|
51
51
|
termNodeVerified = variableVerified; ///
|
|
52
52
|
}
|
|
@@ -54,8 +54,8 @@ export default class TermForVariableNodesVerifier extends NodesVerifier {
|
|
|
54
54
|
return termNodeVerified;
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
verifyVariableNode(variableNodeA, termNodeB, substitutions, proofContextA, proofContextB) {
|
|
58
|
-
let variableVerified;
|
|
57
|
+
verifyVariableNode(variableNodeA, termNodeB, substitutions, proofContextA, proofContextB, verifyAhead) {
|
|
58
|
+
let variableVerified = false;
|
|
59
59
|
|
|
60
60
|
const variableNameA = variableNameFromVariableNode(variableNodeA),
|
|
61
61
|
substitution = substitutions.find((substitution) => {
|
|
@@ -70,7 +70,11 @@ export default class TermForVariableNodesVerifier extends NodesVerifier {
|
|
|
70
70
|
const termNode = termNodeB, ///
|
|
71
71
|
substitutionNodesVerified = substitution.matchTermNode(termNode);
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
if (substitutionNodesVerified) {
|
|
74
|
+
const verifiedAhead = verifyAhead();
|
|
75
|
+
|
|
76
|
+
variableVerified = verifiedAhead; ///
|
|
77
|
+
}
|
|
74
78
|
} else {
|
|
75
79
|
const { createSubstitutions } = this.constructor;
|
|
76
80
|
|
|
@@ -83,23 +87,31 @@ export default class TermForVariableNodesVerifier extends NodesVerifier {
|
|
|
83
87
|
const types = [],
|
|
84
88
|
context = proofContextB, ///
|
|
85
89
|
termNode = termNodeB, ///
|
|
86
|
-
termVerified = verifyTerm(termNode, types, context,
|
|
90
|
+
termVerified = verifyTerm(termNode, types, context, () => {
|
|
91
|
+
let verifiedAhead = false;
|
|
87
92
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
variableTypeEqualToOrSuperTypeOfTermType = variableType.isEqualToOrSuperTypeOf(termType);
|
|
93
|
+
const firstType = first(types),
|
|
94
|
+
termType = firstType,
|
|
95
|
+
variableType = variable.getType(),
|
|
96
|
+
variableTypeEqualToOrSuperTypeOfTermType = variableType.isEqualToOrSuperTypeOf(termType);
|
|
93
97
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
98
|
+
if (variableTypeEqualToOrSuperTypeOfTermType) {
|
|
99
|
+
const termForVariableSubstitution = TermForVariableSubstitution.fromVariableNameAndTermNode(variableName, termNode),
|
|
100
|
+
substitution = termForVariableSubstitution; ///
|
|
97
101
|
|
|
98
|
-
|
|
102
|
+
substitutions.push(substitution);
|
|
99
103
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
104
|
+
verifiedAhead = verifyAhead();
|
|
105
|
+
|
|
106
|
+
if (!verifiedAhead) {
|
|
107
|
+
substitutions.pop();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return verifiedAhead;
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
variableVerified = termVerified; ///
|
|
103
115
|
}
|
|
104
116
|
}
|
|
105
117
|
}
|
package/src/verify/file.js
CHANGED
|
@@ -23,7 +23,7 @@ export default function verifyFile(filePath, releaseContext) {
|
|
|
23
23
|
errorNodesLength = errorNodes.length;
|
|
24
24
|
|
|
25
25
|
if (errorNodesLength > 0) {
|
|
26
|
-
releaseContext.
|
|
26
|
+
releaseContext.warning(`The '${filePath}' file cannot be verified because it contains errors.`);
|
|
27
27
|
} else {
|
|
28
28
|
const topLevelDeclarationNodes = topLevelDeclarationNodesQuery(node),
|
|
29
29
|
topLevelDeclarationsVerified = topLevelDeclarationNodes.every((topLevelDeclarationNode) => {
|
package/src/verify/label.js
CHANGED
|
@@ -17,7 +17,7 @@ export default function verifyLabel(labelNode, labels, fileContext) {
|
|
|
17
17
|
if (labelPresent) {
|
|
18
18
|
const labelString = fileContext.nodeAsString(labelNode);
|
|
19
19
|
|
|
20
|
-
fileContext.
|
|
20
|
+
fileContext.debug(`The '${labelString}' label is already present.`, labelNode);
|
|
21
21
|
} else {
|
|
22
22
|
const label = Label.fromLabelNode(labelNode);
|
|
23
23
|
|