occam-verify-cli 0.0.492 → 0.0.495
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/metaAntecedent.js +214 -0
- package/lib/premise.js +2 -2
- package/lib/utilities/releaseContext.js +20 -16
- package/lib/verify/antecedent.js +2 -2
- package/lib/verify/assertion/type.js +81 -0
- package/lib/verify/derivation.js +11 -14
- package/lib/verify/metaAntecedent.js +41 -0
- package/lib/verify/metaDerivation.js +11 -14
- package/lib/verify/metaproof.js +5 -18
- package/lib/verify/metastatement.js +19 -0
- package/lib/verify/proof.js +5 -18
- package/lib/verify/statement.js +9 -9
- package/package.json +1 -1
- package/src/metaAntecedent.js +235 -0
- package/src/premise.js +2 -2
- package/src/utilities/releaseContext.js +32 -28
- package/src/verify/antecedent.js +1 -1
- package/src/verify/{statementTypeAssertion.js → assertion/type.js} +29 -34
- package/src/verify/derivation.js +14 -19
- package/src/verify/metaAntecedent.js +44 -0
- package/src/verify/metaDerivation.js +14 -19
- package/src/verify/metaproof.js +3 -25
- package/src/verify/metastatement.js +15 -0
- package/src/verify/proof.js +3 -25
- package/src/verify/statement.js +10 -9
- package/lib/equality.js +0 -190
- package/lib/verify/statementAsEquality.js +0 -76
- package/lib/verify/statementTypeAssertion.js +0 -84
- package/src/equality.js +0 -231
- package/src/verify/statementAsEquality.js +0 -101
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import MetaSubstitution from "./metaSubstitution";
|
|
4
|
+
|
|
5
|
+
import { first } from "./utilities/array";
|
|
6
|
+
import { nodeAsString } from "./utilities/string";
|
|
7
|
+
import { nodeQuery, nodesQuery } from "./utilities/query";
|
|
8
|
+
import { metavariableNameFromMetavariableNode } from "./utilities/query";
|
|
9
|
+
import { metastatementNodeFromMetastatementString } from "./utilities/string";
|
|
10
|
+
import { METAVARIABLE_RULE_NAME, METASTATEMENT_RULE_NAME } from "./ruleNames";
|
|
11
|
+
|
|
12
|
+
const metastatementNodesQuery = nodesQuery("/metaSubproofAssertion/metastatement"),
|
|
13
|
+
metaSubproofAssertionNodeQuery = nodeQuery("/metastatement/metaSubproofAssertion!"),
|
|
14
|
+
unqualifiedMetastatementMetastatementNodesQuery = nodesQuery("/metaSubproof/unqualifiedMetastatement/metastatement!"),
|
|
15
|
+
qualifiedOrUnqualifiedMetastatementMetastatementNodeQuery = nodeQuery("/metaSubproof/subDerivation/qualifiedMetastatement|unqualifiedMetastatement[-1]/metastatement!");
|
|
16
|
+
|
|
17
|
+
export default class MetaAntecedent {
|
|
18
|
+
constructor(metastatementNode) {
|
|
19
|
+
this.metastatementNode = metastatementNode;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
getMetastatementNode() {
|
|
23
|
+
return this.metastatementNode;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
matchSubproofNode(metaSubproofNode, metaSubstitutions) {
|
|
27
|
+
let metaSubproofNodeMatches = false;
|
|
28
|
+
|
|
29
|
+
const metaSubproofAssertionNode = metaSubproofAssertionNodeQuery(this.metastatementNode);
|
|
30
|
+
|
|
31
|
+
if (metaSubproofAssertionNode !== null) {
|
|
32
|
+
const metaSubproofAssertionMetastatementNodes = metastatementNodesQuery(metaSubproofAssertionNode),
|
|
33
|
+
unqualifiedMetastatementMetastatementNodes = unqualifiedMetastatementMetastatementNodesQuery(metaSubproofNode),
|
|
34
|
+
qualifiedOrUnqualifiedMetastatementMetastatementNode = qualifiedOrUnqualifiedMetastatementMetastatementNodeQuery(metaSubproofNode),
|
|
35
|
+
metastatementNodes = [
|
|
36
|
+
...unqualifiedMetastatementMetastatementNodes,
|
|
37
|
+
qualifiedOrUnqualifiedMetastatementMetastatementNode
|
|
38
|
+
],
|
|
39
|
+
metastatementNodesLength = metastatementNodes.length,
|
|
40
|
+
metaSubproofAssertionMetastatementNodesLength = metaSubproofAssertionMetastatementNodes.length;
|
|
41
|
+
|
|
42
|
+
if (metastatementNodesLength === metaSubproofAssertionMetastatementNodesLength) {
|
|
43
|
+
metaSubproofNodeMatches = metaSubproofAssertionMetastatementNodes.every((metaSubproofAssertionMetastatementNode, index) => {
|
|
44
|
+
const metastatementNode = metastatementNodes[index],
|
|
45
|
+
nonTerminalNode = metastatementNode, ///
|
|
46
|
+
metaAntecedentNonTerminalNode = metaSubproofAssertionMetastatementNode, ///
|
|
47
|
+
metaAntecedentNonTerminalNodeMatches = matchMetaAntecedentNonTerminalNode(metaAntecedentNonTerminalNode, nonTerminalNode, metaSubstitutions);
|
|
48
|
+
|
|
49
|
+
if (metaAntecedentNonTerminalNodeMatches) {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return metaSubproofNodeMatches;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
matchMetastatementNode(metastatementNode, metaSubstitutions) {
|
|
60
|
+
const nonTerminalNode = metastatementNode, ///
|
|
61
|
+
metaAntecedentNonTerminalNode = this.metastatementNode, ///
|
|
62
|
+
metaAntecedentNonTerminalNodeMatches = matchMetaAntecedentNonTerminalNode(metaAntecedentNonTerminalNode, nonTerminalNode, metaSubstitutions),
|
|
63
|
+
metastatementNodeMatches = metaAntecedentNonTerminalNodeMatches; ///
|
|
64
|
+
|
|
65
|
+
return metastatementNodeMatches;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
toJSON() {
|
|
69
|
+
const metastatementString = nodeAsString(this.metastatementNode),
|
|
70
|
+
metastatement = metastatementString, ///
|
|
71
|
+
json = {
|
|
72
|
+
metastatement
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
return json;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
static fromJSON(json, releaseContext) {
|
|
79
|
+
const { metastatement } = json,
|
|
80
|
+
metastatementString = metastatement, ///
|
|
81
|
+
metastatementNode = metastatementNodeFromMetastatementString(metastatementString, releaseContext),
|
|
82
|
+
metaAntecedent = new MetaAntecedent(metastatementNode);
|
|
83
|
+
|
|
84
|
+
return metaAntecedent;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
static fromMetastatementNode(metastatementNode) {
|
|
88
|
+
const metaAntecedent = new MetaAntecedent(metastatementNode);
|
|
89
|
+
|
|
90
|
+
return metaAntecedent;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function matchMetaAntecedentNode(metaAntecedentNode, node, metaSubstitutions) {
|
|
95
|
+
let metaAntecedentNodeMatches = false;
|
|
96
|
+
|
|
97
|
+
const nodeTerminalNode = node.isTerminalNode(),
|
|
98
|
+
ruleNodeTerminalNode = metaAntecedentNode.isTerminalNode();
|
|
99
|
+
|
|
100
|
+
if (nodeTerminalNode === ruleNodeTerminalNode) {
|
|
101
|
+
if (nodeTerminalNode) {
|
|
102
|
+
const terminalNode = node, ///
|
|
103
|
+
metaAntecedentTerminalNode = metaAntecedentNode, ///
|
|
104
|
+
metaAntecedentTerminalNodeMatches = matchMetaAntecedentTerminalNode(metaAntecedentTerminalNode, terminalNode, metaSubstitutions);
|
|
105
|
+
|
|
106
|
+
metaAntecedentNodeMatches = metaAntecedentTerminalNodeMatches; ///
|
|
107
|
+
} else {
|
|
108
|
+
const nonTerminalNode = node, ///
|
|
109
|
+
metaAntecedentNonTerminalNode = metaAntecedentNode, ///
|
|
110
|
+
metaAntecedentNonTerminalNodeMatches = matchMetaAntecedentNonTerminalNode(metaAntecedentNonTerminalNode, nonTerminalNode, metaSubstitutions);
|
|
111
|
+
|
|
112
|
+
metaAntecedentNodeMatches = metaAntecedentNonTerminalNodeMatches; ///
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return metaAntecedentNodeMatches;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function matchMetaAntecedentNodes(metaAntecedentNodes, nodes, metaSubstitutions) {
|
|
120
|
+
let metaAntecedentNodesMatches = false;
|
|
121
|
+
|
|
122
|
+
const nodesLength = nodes.length,
|
|
123
|
+
metaAntecedentNodesLength = metaAntecedentNodes.length;
|
|
124
|
+
|
|
125
|
+
if (nodesLength === metaAntecedentNodesLength) {
|
|
126
|
+
metaAntecedentNodesMatches = nodes.every((node, index) => {
|
|
127
|
+
const metaAntecedentNode = metaAntecedentNodes[index],
|
|
128
|
+
metaAntecedentNodeMatches = matchMetaAntecedentNode(metaAntecedentNode, node, metaSubstitutions);
|
|
129
|
+
|
|
130
|
+
if (metaAntecedentNodeMatches) {
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return metaAntecedentNodesMatches;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function matchMetaAntecedentMetavariable(metaAntecedentMetavariableNode, nodes, metaSubstitutions) {
|
|
140
|
+
let metaAntecedentMetavariableMatches;
|
|
141
|
+
|
|
142
|
+
const metaAntecedentMetavariableName = metavariableNameFromMetavariableNode(metaAntecedentMetavariableNode),
|
|
143
|
+
metaSubstitution = metaSubstitutions.find((metaSubstitution) => {
|
|
144
|
+
const metavariableName = metaSubstitution.getMetavariableName();
|
|
145
|
+
|
|
146
|
+
if (metavariableName === metaAntecedentMetavariableName) {
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
}) || null;
|
|
150
|
+
|
|
151
|
+
if (metaSubstitution !== null) {
|
|
152
|
+
const metaSubstitutionNodesMatch = metaSubstitution.matchNodes(nodes);
|
|
153
|
+
|
|
154
|
+
metaAntecedentMetavariableMatches = metaSubstitutionNodesMatch; ///
|
|
155
|
+
} else {
|
|
156
|
+
const metavariableName = metaAntecedentMetavariableName, ///
|
|
157
|
+
metaSubstitution = MetaSubstitution.fromMetavariableNameAndNodes(metavariableName, nodes);
|
|
158
|
+
|
|
159
|
+
metaSubstitutions.push(metaSubstitution);
|
|
160
|
+
|
|
161
|
+
metaAntecedentMetavariableMatches = true;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return metaAntecedentMetavariableMatches;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function matchMetaAntecedentTerminalNode(metaAntecedentTerminalNode, terminalNode, metaSubstitutions) {
|
|
168
|
+
const matches = metaAntecedentTerminalNode.match(terminalNode),
|
|
169
|
+
metaAntecedentTerminalNodeMatches = matches;
|
|
170
|
+
|
|
171
|
+
return metaAntecedentTerminalNodeMatches;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function matchMetaAntecedentNonTerminalNode(metaAntecedentNonTerminalNode, nonTerminalNode, metaSubstitutions) {
|
|
175
|
+
let metaAntecedentNonTerminalNodeMatches = false;
|
|
176
|
+
|
|
177
|
+
const ruleName = nonTerminalNode.getRuleName(),
|
|
178
|
+
metaAntecedentRuleName = metaAntecedentNonTerminalNode.getRuleName(); ///
|
|
179
|
+
|
|
180
|
+
if (ruleName === metaAntecedentRuleName) {
|
|
181
|
+
const childNodes = nonTerminalNode.getChildNodes(),
|
|
182
|
+
metaAntecedentChildNodes = metaAntecedentNonTerminalNode.getChildNodes(),
|
|
183
|
+
nodes = childNodes, ///
|
|
184
|
+
metaAntecedentNodes = metaAntecedentChildNodes, ///
|
|
185
|
+
metaAntecedentChildNodesMatches = matchMetaAntecedentNodes(metaAntecedentNodes, nodes, metaSubstitutions);
|
|
186
|
+
|
|
187
|
+
metaAntecedentNonTerminalNodeMatches = metaAntecedentChildNodesMatches; ///
|
|
188
|
+
|
|
189
|
+
if (!metaAntecedentNonTerminalNodeMatches) {
|
|
190
|
+
const ruleNameMetastatementRuleName = (ruleName === METASTATEMENT_RULE_NAME);
|
|
191
|
+
|
|
192
|
+
if (ruleNameMetastatementRuleName) {
|
|
193
|
+
const metastatementNode = nonTerminalNode, ///
|
|
194
|
+
metaAntecedentMetastatementNode = metaAntecedentNonTerminalNode, ///
|
|
195
|
+
metaAntecedentMetastatementNodeMatches = matchMetaAntecedentMetastatementNode(metaAntecedentMetastatementNode, metastatementNode, metaSubstitutions);
|
|
196
|
+
|
|
197
|
+
metaAntecedentNonTerminalNodeMatches = metaAntecedentMetastatementNodeMatches; ///
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return metaAntecedentNonTerminalNodeMatches;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function matchMetaAntecedentMetastatementNode(metaAntecedentMetastatementNode, metastatementNode, metaSubstitutions) {
|
|
206
|
+
let metaAntecedentMetastatementNodeMatches = false;
|
|
207
|
+
|
|
208
|
+
const metaAntecedentNonTerminalNode = metaAntecedentMetastatementNode, ///
|
|
209
|
+
metaAntecedentChildNodes = metaAntecedentNonTerminalNode.getChildNodes(),
|
|
210
|
+
metaAntecedentChildNodesLength = metaAntecedentChildNodes.length;
|
|
211
|
+
|
|
212
|
+
if (metaAntecedentChildNodesLength === 1) {
|
|
213
|
+
const firstMetaAntecedentChildNode = first(metaAntecedentChildNodes),
|
|
214
|
+
metaAntecedentChildNode = firstMetaAntecedentChildNode, ///
|
|
215
|
+
metaAntecedentChildNodeNonTerminalNode = metaAntecedentChildNode.isNonTerminalNode();
|
|
216
|
+
|
|
217
|
+
if (metaAntecedentChildNodeNonTerminalNode) {
|
|
218
|
+
const metaAntecedentNonTerminalChildNode = metaAntecedentChildNode, ///
|
|
219
|
+
metaAntecedentNonTerminalChildNodeRuleName = metaAntecedentNonTerminalChildNode.getRuleName(),
|
|
220
|
+
metaAntecedentNonTerminalChildNodeRuleNameMetavariableRuleName = (metaAntecedentNonTerminalChildNodeRuleName === METAVARIABLE_RULE_NAME);
|
|
221
|
+
|
|
222
|
+
if (metaAntecedentNonTerminalChildNodeRuleNameMetavariableRuleName) {
|
|
223
|
+
const metaAntecedentMetavariableNode = metaAntecedentNonTerminalChildNode, ///
|
|
224
|
+
nonTerminalNode = metastatementNode, ///
|
|
225
|
+
childNodes = nonTerminalNode.getChildNodes(),
|
|
226
|
+
nodes = childNodes, ///
|
|
227
|
+
metaAntecedentMetavariableMatches = matchMetaAntecedentMetavariable(metaAntecedentMetavariableNode, nodes, metaSubstitutions);
|
|
228
|
+
|
|
229
|
+
metaAntecedentMetastatementNodeMatches = metaAntecedentMetavariableMatches; ///
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return metaAntecedentMetastatementNodeMatches;
|
|
235
|
+
}
|
package/src/premise.js
CHANGED
|
@@ -12,8 +12,8 @@ import { STATEMENT_RULE_NAME, METASTATEMENT_RULE_NAME, METAVARIABLE_RULE_NAME }
|
|
|
12
12
|
|
|
13
13
|
const metastatementNodesQuery = nodesQuery("/metaSubproofAssertion/metastatement"),
|
|
14
14
|
metaSubproofAssertionNodeQuery = nodeQuery("/metastatement/metaSubproofAssertion!"),
|
|
15
|
-
unqualifiedStatementStatementNodesQuery = nodesQuery("/subproof/unqualifiedStatement
|
|
16
|
-
unqualifiedMetastatementMetastatementNodesQuery = nodesQuery("/metaSubproof/unqualifiedMetastatement
|
|
15
|
+
unqualifiedStatementStatementNodesQuery = nodesQuery("/subproof/antecedent/unqualifiedStatement!/statement!"),
|
|
16
|
+
unqualifiedMetastatementMetastatementNodesQuery = nodesQuery("/metaSubproof/metaAntecedent/unqualifiedMetastatement!/metastatement!"),
|
|
17
17
|
qualifiedOrUnqualifiedStatementStatementNodeQuery = nodeQuery("/subproof/subDerivation/qualifiedStatement|unqualifiedStatement[-1]/statement!"),
|
|
18
18
|
qualifiedOrUnqualifiedMetastatementMetastatementNodeQuery = nodeQuery("/metaSubproof/metaSubDerivation/qualifiedMetastatement|unqualifiedMetastatement[-1]/metastatement!");
|
|
19
19
|
|
|
@@ -9,7 +9,7 @@ export function createReleaseContext(dependency, dependentNames, context, callba
|
|
|
9
9
|
releaseContext = releaseContextMap[releaseName] || null;
|
|
10
10
|
|
|
11
11
|
if (releaseContext !== null) {
|
|
12
|
-
const error =
|
|
12
|
+
const error = checkReleaseMatchesDependency(dependency, dependentNames, releaseContext);
|
|
13
13
|
|
|
14
14
|
callback(error);
|
|
15
15
|
|
|
@@ -33,18 +33,9 @@ export function createReleaseContext(dependency, dependentNames, context, callba
|
|
|
33
33
|
return;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (!releaseMatchesDependency) {
|
|
39
|
-
const version = releaseContext.getVersion(),
|
|
40
|
-
versionString = version.toString(),
|
|
41
|
-
lastDependentName = last(dependentNames),
|
|
42
|
-
dependentName = lastDependentName, ///
|
|
43
|
-
dependencyName = dependency.getName(),
|
|
44
|
-
shortenedVersion = dependency.getShortedVersion(),
|
|
45
|
-
shortenedVersionString = shortenedVersion.toString(),
|
|
46
|
-
error = `Version mismatch: '${dependentName}' requires '${dependencyName}' to be version ${shortenedVersionString}.0 or higher but version ${versionString} has been supplied.`;
|
|
36
|
+
error = checkReleaseMatchesDependency(dependency, dependentNames, releaseContext);
|
|
47
37
|
|
|
38
|
+
if (error !== null) {
|
|
48
39
|
callback(error);
|
|
49
40
|
|
|
50
41
|
return;
|
|
@@ -78,7 +69,7 @@ export function initialiseReleaseContext(dependency, dependentName, verified, co
|
|
|
78
69
|
if (!releaseContextVerified) {
|
|
79
70
|
const { log } = context;
|
|
80
71
|
|
|
81
|
-
log
|
|
72
|
+
log.error(`Unable to initialise the '${releaseName}' dependency's context because its '${dependentName}' dependent is a package.`);
|
|
82
73
|
|
|
83
74
|
return;
|
|
84
75
|
}
|
|
@@ -105,15 +96,28 @@ export default {
|
|
|
105
96
|
};
|
|
106
97
|
|
|
107
98
|
function checkCyclicDependencyExists(dependency, dependentNames) {
|
|
99
|
+
let error = null;
|
|
100
|
+
|
|
108
101
|
const dependencyName = dependency.getName(),
|
|
109
102
|
dependentNamesIncludesDependencyName = dependentNames.includes(dependencyName),
|
|
110
103
|
cyclicDependencyExists = dependentNamesIncludesDependencyName; ///
|
|
111
104
|
|
|
112
|
-
|
|
105
|
+
if (cyclicDependencyExists) {
|
|
106
|
+
const firstDependentName = first(dependentNames),
|
|
107
|
+
dependencyNames = [ ///
|
|
108
|
+
...dependentNames,
|
|
109
|
+
firstDependentName
|
|
110
|
+
],
|
|
111
|
+
dependencyNamesString = dependencyNames.join(`' -> '`);
|
|
112
|
+
|
|
113
|
+
error =`There is a cyclic dependency: '${dependencyNamesString}'.`;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return error;
|
|
113
117
|
}
|
|
114
118
|
|
|
115
|
-
function checkReleaseMatchesDependency(dependency, dependentNames, releaseContext
|
|
116
|
-
let
|
|
119
|
+
function checkReleaseMatchesDependency(dependency, dependentNames, releaseContext) {
|
|
120
|
+
let error = null;
|
|
117
121
|
|
|
118
122
|
const entries = releaseContext.getEntries(),
|
|
119
123
|
shortenedVersion = dependency.getShortedVersion();
|
|
@@ -122,11 +126,19 @@ function checkReleaseMatchesDependency(dependency, dependentNames, releaseContex
|
|
|
122
126
|
const entriesMatchShortenedVersion = entries.matchShortenedVersion(shortenedVersion);
|
|
123
127
|
|
|
124
128
|
if (!entriesMatchShortenedVersion) {
|
|
125
|
-
|
|
129
|
+
const version = releaseContext.getVersion(),
|
|
130
|
+
versionString = version.toString(),
|
|
131
|
+
lastDependentName = last(dependentNames),
|
|
132
|
+
dependentName = lastDependentName, ///
|
|
133
|
+
dependencyName = dependency.getName(),
|
|
134
|
+
shortenedVersion = dependency.getShortedVersion(),
|
|
135
|
+
shortenedVersionString = shortenedVersion.toString();
|
|
136
|
+
|
|
137
|
+
error = `Version mismatch: '${dependentName}' requires '${dependencyName}' to be version ${shortenedVersionString}.0 or higher but version ${versionString} has been supplied.`;
|
|
126
138
|
}
|
|
127
139
|
}
|
|
128
140
|
|
|
129
|
-
return
|
|
141
|
+
return error;
|
|
130
142
|
}
|
|
131
143
|
|
|
132
144
|
function createDependencyReleaseContexts(dependency, dependentNames, context, callback) {
|
|
@@ -139,17 +151,9 @@ function createDependencyReleaseContexts(dependency, dependentNames, context, ca
|
|
|
139
151
|
dependentNames = [ ...dependentNames, dependencyName ]; ///
|
|
140
152
|
|
|
141
153
|
dependencies.asynchronousForEachDependency((dependency, next, done) => {
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
if (cyclicDependencyExists) {
|
|
145
|
-
const firstDependentName = first(dependentNames),
|
|
146
|
-
dependencyNames = [ ///
|
|
147
|
-
...dependentNames,
|
|
148
|
-
firstDependentName
|
|
149
|
-
],
|
|
150
|
-
dependencyNamesString = dependencyNames.join(`' -> '`),
|
|
151
|
-
error =`There is a cyclic dependency: '${dependencyNamesString}'.`;
|
|
154
|
+
const error = checkCyclicDependencyExists(dependency, dependentNames);
|
|
152
155
|
|
|
156
|
+
if (error !== null) {
|
|
153
157
|
callback(error);
|
|
154
158
|
|
|
155
159
|
return;
|
package/src/verify/antecedent.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
import ProofStep from "../step/proof";
|
|
4
4
|
import Antecedent from "../antecedent";
|
|
5
|
+
import verifyStatement from "./statement";
|
|
5
6
|
|
|
6
7
|
import { nodeQuery } from "../utilities/query";
|
|
7
8
|
import { nodeAsString } from "../utilities/string";
|
|
8
|
-
import verifyStatement from "./statement";
|
|
9
9
|
|
|
10
10
|
const statementNodeQuery = nodeQuery("/antecedent/unqualifiedStatement!/statement!");
|
|
11
11
|
|
|
@@ -1,58 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import Variable from "
|
|
3
|
+
import Variable from "../../variable";
|
|
4
4
|
|
|
5
|
-
import { first } from "
|
|
6
|
-
import { nodeAsString } from "
|
|
7
|
-
import { nodeQuery, typeNameFromTypeNode } from "
|
|
8
|
-
import { verifyTermAsVariable, verifyTermAgainstConstructors } from "
|
|
5
|
+
import { first } from "../../utilities/array";
|
|
6
|
+
import { nodeAsString } from "../../utilities/string";
|
|
7
|
+
import { nodeQuery, typeNameFromTypeNode } from "../../utilities/query";
|
|
8
|
+
import { verifyTermAsVariable, verifyTermAgainstConstructors } from "../../verify/term";
|
|
9
9
|
|
|
10
10
|
const termNodeQuery = nodeQuery("/typeAssertion/term"),
|
|
11
|
-
typeNodeQuery = nodeQuery("/typeAssertion/type")
|
|
12
|
-
typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!");
|
|
11
|
+
typeNodeQuery = nodeQuery("/typeAssertion/type");
|
|
13
12
|
|
|
14
|
-
export default function verifyStatementTypeAssertion(
|
|
15
|
-
let
|
|
13
|
+
export default function verifyStatementTypeAssertion(typeAssertionNode, qualified, proofContext) {
|
|
14
|
+
let typeAssertionVerified = false;
|
|
16
15
|
|
|
17
|
-
proofContext.begin(
|
|
16
|
+
proofContext.begin(typeAssertionNode);
|
|
18
17
|
|
|
19
|
-
const statementString = nodeAsString(
|
|
18
|
+
const statementString = nodeAsString(typeAssertionNode);
|
|
20
19
|
|
|
21
|
-
proofContext.debug(`Verifying the '${statementString}'
|
|
20
|
+
proofContext.debug(`Verifying the '${statementString}' type assertion...`);
|
|
22
21
|
|
|
23
|
-
const
|
|
22
|
+
const typeNode = typeNodeQuery(typeAssertionNode),
|
|
23
|
+
typeName = typeNameFromTypeNode(typeNode),
|
|
24
|
+
typePresent = proofContext.isTypePresentByTypeName(typeName);
|
|
24
25
|
|
|
25
|
-
if (
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
if (!typePresent) {
|
|
31
|
-
proofContext.error(`The ${typeName} type is not present.`);
|
|
32
|
-
} else {
|
|
33
|
-
if (!statementTypeAssertionVerified) {
|
|
34
|
-
const variableTypeAssertionVerified = verifyVariableTypeAssertion(typeAssertionNode, qualified, proofContext);
|
|
26
|
+
if (!typePresent) {
|
|
27
|
+
proofContext.error(`The ${typeName} type is not present.`);
|
|
28
|
+
} else {
|
|
29
|
+
if (!typeAssertionVerified) {
|
|
30
|
+
const variableTypeAssertionVerified = verifyVariableTypeAssertion(typeAssertionNode, qualified, proofContext);
|
|
35
31
|
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
typeAssertionVerified = variableTypeAssertionVerified; ///
|
|
33
|
+
}
|
|
38
34
|
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
if (!typeAssertionVerified) {
|
|
36
|
+
const termTypeAssertionVerified = verifyTermTypeAssertion(typeAssertionNode, qualified, proofContext);
|
|
41
37
|
|
|
42
|
-
|
|
43
|
-
}
|
|
38
|
+
typeAssertionVerified = termTypeAssertionVerified; ///
|
|
44
39
|
}
|
|
45
40
|
}
|
|
46
41
|
|
|
47
|
-
if (
|
|
42
|
+
if (typeAssertionVerified) {
|
|
48
43
|
proofContext.info(`Verified the '${statementString}' statement type assertion.`);
|
|
49
44
|
}
|
|
50
45
|
|
|
51
|
-
|
|
52
|
-
proofContext.complete(
|
|
53
|
-
proofContext.halt(
|
|
46
|
+
typeAssertionVerified ?
|
|
47
|
+
proofContext.complete(typeAssertionNode) :
|
|
48
|
+
proofContext.halt(typeAssertionNode);
|
|
54
49
|
|
|
55
|
-
return
|
|
50
|
+
return typeAssertionVerified;
|
|
56
51
|
}
|
|
57
52
|
|
|
58
53
|
function verifyVariableTypeAssertion(typeAssertionNode, qualified, proofContext) {
|
package/src/verify/derivation.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import ProofStep from "../step/proof";
|
|
4
4
|
import ProofContext from "../context/proof";
|
|
5
|
+
import verifyAntecedent from "./antecedent";
|
|
5
6
|
import verifyQualifiedStatement from "../verify/statement/qualified";
|
|
6
7
|
import verifyUnqualifiedStatement from "../verify/statement/unqualified";
|
|
7
8
|
|
|
@@ -10,8 +11,8 @@ import { SUBPROOF_RULE_NAME, QUALIFIED_STATEMENT_RULE_NAME, UNQUALIFIED_STATEMEN
|
|
|
10
11
|
|
|
11
12
|
const childNodesQuery = nodesQuery("/derivation|subDerivation/*"),
|
|
12
13
|
statementNodeQuery = nodeQuery("/qualifiedStatement|unqualifiedStatement/statement!"),
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
antecedentNodesQuery = nodesQuery("/subproof/antecedent"),
|
|
15
|
+
subDerivationNodeQuery = nodeQuery("/subproof/subDerivation");
|
|
15
16
|
|
|
16
17
|
export default function verifyDerivation(derivationNode, proofContext) {
|
|
17
18
|
let derivationVerified;
|
|
@@ -20,7 +21,7 @@ export default function verifyDerivation(derivationNode, proofContext) {
|
|
|
20
21
|
|
|
21
22
|
const childNodes = childNodesQuery(derivationNode);
|
|
22
23
|
|
|
23
|
-
derivationVerified = childNodes.every((childNode) => {
|
|
24
|
+
derivationVerified = childNodes.every((childNode) => {
|
|
24
25
|
const childVerified = verifyChild(childNode, proofContext);
|
|
25
26
|
|
|
26
27
|
if (childVerified) {
|
|
@@ -36,13 +37,13 @@ export default function verifyDerivation(derivationNode, proofContext) {
|
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
function verifySubDerivation(subDerivationNode, proofContext) {
|
|
39
|
-
let
|
|
40
|
+
let subDerivationVerified;
|
|
40
41
|
|
|
41
42
|
proofContext.begin(subDerivationNode);
|
|
42
43
|
|
|
43
44
|
const childNodes = childNodesQuery(subDerivationNode);
|
|
44
45
|
|
|
45
|
-
|
|
46
|
+
subDerivationVerified = childNodes.every((childNode) => {
|
|
46
47
|
const childVerified = verifyChild(childNode, proofContext);
|
|
47
48
|
|
|
48
49
|
if (childVerified) {
|
|
@@ -50,11 +51,11 @@ function verifySubDerivation(subDerivationNode, proofContext) {
|
|
|
50
51
|
}
|
|
51
52
|
});
|
|
52
53
|
|
|
53
|
-
|
|
54
|
+
subDerivationVerified ?
|
|
54
55
|
proofContext.complete(subDerivationNode) :
|
|
55
56
|
proofContext.halt(subDerivationNode);
|
|
56
57
|
|
|
57
|
-
return
|
|
58
|
+
return subDerivationVerified;
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
function verifySubproof(subproofNode, proofContext) {
|
|
@@ -62,23 +63,17 @@ function verifySubproof(subproofNode, proofContext) {
|
|
|
62
63
|
|
|
63
64
|
proofContext = ProofContext.fromProofContext(proofContext); ///
|
|
64
65
|
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
const antecedents = [],
|
|
67
|
+
antecedentNodes = antecedentNodesQuery(subproofNode),
|
|
68
|
+
antecedentsVerified = antecedentNodes.every((antecedentNode) => {
|
|
69
|
+
const antecedentVerified = verifyAntecedent(antecedentNode, antecedents, proofContext);
|
|
68
70
|
|
|
69
|
-
if (
|
|
71
|
+
if (antecedentVerified) {
|
|
70
72
|
return true;
|
|
71
73
|
}
|
|
72
74
|
});
|
|
73
75
|
|
|
74
|
-
if (
|
|
75
|
-
unqualifiedStatementNodes.forEach((unqualifiedStatementNode) => {
|
|
76
|
-
const statementNode = statementNodeQuery(unqualifiedStatementNode),
|
|
77
|
-
proofStep = ProofStep.fromStatementNode(statementNode);
|
|
78
|
-
|
|
79
|
-
proofContext.addProofStep(proofStep);
|
|
80
|
-
});
|
|
81
|
-
|
|
76
|
+
if (antecedentsVerified) {
|
|
82
77
|
const subDerivationNode = subDerivationNodeQuery(subproofNode),
|
|
83
78
|
subDerivationVerified = verifySubDerivation(subDerivationNode, proofContext);
|
|
84
79
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import MetaproofStep from "../step/metaproof";
|
|
4
|
+
import MetaAntecedent from "../metaAntecedent";
|
|
5
|
+
import verifyMetastatement from "./metastatement";
|
|
6
|
+
|
|
7
|
+
import { nodeQuery } from "../utilities/query";
|
|
8
|
+
import { nodeAsString } from "../utilities/string";
|
|
9
|
+
|
|
10
|
+
const metastatementNodeQuery = nodeQuery("/metaAntecedent/unqualifiedMetastatement!/metastatement!");
|
|
11
|
+
|
|
12
|
+
export default function verifyMetaAntecedent(metaAntecedentNode, metaAntecedents, metaproofContext) {
|
|
13
|
+
let metaAntecedentVerified;
|
|
14
|
+
|
|
15
|
+
metaproofContext.begin(metaAntecedentNode);
|
|
16
|
+
|
|
17
|
+
const metaAntecedentString = nodeAsString(metaAntecedentNode);
|
|
18
|
+
|
|
19
|
+
metaproofContext.debug(`Verifying the ${metaAntecedentString} metaAntecedent...`);
|
|
20
|
+
|
|
21
|
+
const metastatementNode = metastatementNodeQuery(metaAntecedentNode);
|
|
22
|
+
|
|
23
|
+
if (metastatementNode !== null) {
|
|
24
|
+
const qualified = false,
|
|
25
|
+
metastatementVerified = verifyMetastatement(metastatementNode, qualified, metaproofContext);
|
|
26
|
+
|
|
27
|
+
if (metastatementVerified) {
|
|
28
|
+
const metaproofStep = MetaproofStep.fromMetastatementNode(metastatementNode),
|
|
29
|
+
metaAntecedent = MetaAntecedent.fromMetastatementNode(metastatementNode);
|
|
30
|
+
|
|
31
|
+
metaAntecedents.push(metaAntecedent);
|
|
32
|
+
|
|
33
|
+
metaproofContext.addMetaproofStep(metaproofStep);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
metaAntecedentVerified = true;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
metaAntecedentVerified ?
|
|
40
|
+
metaproofContext.complete(metaAntecedentNode) :
|
|
41
|
+
metaproofContext.halt(metaAntecedentNode);
|
|
42
|
+
|
|
43
|
+
return metaAntecedentVerified;
|
|
44
|
+
}
|