occam-verify-cli 0.0.524 → 0.0.525
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/equality.js +130 -7
- package/lib/verify/derivation.js +3 -3
- package/lib/verify/metastatement/qualified.js +6 -7
- package/lib/verify/metastatement/unqualified.js +2 -2
- package/lib/verify/metastatement.js +2 -2
- package/lib/verify/ruleDerivation.js +3 -3
- package/lib/verify/statement/qualified.js +3 -3
- package/lib/verify/statement/unqualified.js +2 -2
- package/lib/verify/statement.js +53 -35
- package/lib/verify/statementAsCombinator.js +27 -16
- package/lib/verify/termAsConstructor.js +17 -17
- package/package.json +1 -1
- package/src/equality.js +202 -5
- package/src/verify/derivation.js +4 -2
- package/src/verify/metastatement/qualified.js +5 -8
- package/src/verify/metastatement/unqualified.js +1 -1
- package/src/verify/metastatement.js +1 -1
- package/src/verify/ruleDerivation.js +4 -2
- package/src/verify/statement/qualified.js +3 -3
- package/src/verify/statement/unqualified.js +2 -1
- package/src/verify/statement.js +64 -35
- package/src/verify/statementAsCombinator.js +47 -24
- package/src/verify/termAsConstructor.js +22 -23
package/src/equality.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import { nodeQuery } from "./utilities/query";
|
|
4
|
+
import { TERM_RULE_NAME } from "./ruleNames";
|
|
4
5
|
|
|
5
|
-
const leftTermNodeQuery = nodeQuery("/statement/
|
|
6
|
-
rightTermNodeQuery = nodeQuery("/statement/
|
|
6
|
+
const leftTermNodeQuery = nodeQuery("/statement/argument[0]/term!"),
|
|
7
|
+
rightTermNodeQuery = nodeQuery("/statement/argument[1]/term!");
|
|
7
8
|
|
|
8
9
|
export default class Equality {
|
|
9
10
|
constructor(leftTermNode, rightTermNode) {
|
|
@@ -11,7 +12,7 @@ export default class Equality {
|
|
|
11
12
|
this.rightTermNode = rightTermNode;
|
|
12
13
|
}
|
|
13
14
|
|
|
14
|
-
|
|
15
|
+
getLeftTermNode() {
|
|
15
16
|
return this.leftTermNode;
|
|
16
17
|
}
|
|
17
18
|
|
|
@@ -19,8 +20,79 @@ export default class Equality {
|
|
|
19
20
|
return this.rightTermNode;
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
match(equality, equalities) {
|
|
24
|
+
let matches = false;
|
|
25
|
+
|
|
26
|
+
const leftTermNode = equality.getLeftTermNode(),
|
|
27
|
+
rightTermNode = equality.getRightTermNode();
|
|
28
|
+
|
|
29
|
+
if (!matches) {
|
|
30
|
+
const reversed = false,
|
|
31
|
+
leftTermNodeAndRightTermNodeMatch = this.matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities);
|
|
32
|
+
|
|
33
|
+
matches = leftTermNodeAndRightTermNodeMatch; ///
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (!matches) {
|
|
37
|
+
const reversed = true,
|
|
38
|
+
leftTermNodeAndRightTermNodeMatch = this.matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities);
|
|
39
|
+
|
|
40
|
+
matches = leftTermNodeAndRightTermNodeMatch; ///
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return matches;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities) {
|
|
47
|
+
let leftTermNodeAndRightTermNodeMatch = true;
|
|
48
|
+
|
|
49
|
+
if (leftTermNodeAndRightTermNodeMatch) {
|
|
50
|
+
const leftNonTerminalNode = reversed ?
|
|
51
|
+
this.rightTermNode :
|
|
52
|
+
this.leftTermNode, ///
|
|
53
|
+
rightNonTerminalNode = leftTermNode, ///
|
|
54
|
+
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities);
|
|
55
|
+
|
|
56
|
+
leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (leftTermNodeAndRightTermNodeMatch) {
|
|
60
|
+
const leftNonTerminalNode = reversed ?
|
|
61
|
+
this.leftTermNode :
|
|
62
|
+
this.rightTermNode, ///
|
|
63
|
+
rightNonTerminalNode = rightTermNode, ///
|
|
64
|
+
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities);
|
|
65
|
+
|
|
66
|
+
leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return leftTermNodeAndRightTermNodeMatch;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
equate(equalities) {
|
|
73
|
+
const leftNonTerminalNode = this.leftTermNode, ///
|
|
74
|
+
rightNonTerminalNode = this.rightTermNode, ///
|
|
75
|
+
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities),
|
|
76
|
+
equates = nonTerminalNodeEquates; ///
|
|
77
|
+
|
|
78
|
+
return equates;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
static fromProofStep(proofStep) {
|
|
82
|
+
let equality = null;
|
|
83
|
+
|
|
84
|
+
const statementNode = proofStep.getStatementNode();
|
|
85
|
+
|
|
86
|
+
if (statementNode !== null) {
|
|
87
|
+
const leftTermNode = leftTermNodeQuery(statementNode),
|
|
88
|
+
rightTermNode = rightTermNodeQuery(statementNode);
|
|
89
|
+
|
|
90
|
+
if ((leftTermNode !== null) && (rightTermNode !== null)) {
|
|
91
|
+
equality = new Equality(leftTermNode, rightTermNode);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return equality;
|
|
24
96
|
}
|
|
25
97
|
|
|
26
98
|
static fromStatementNode(statementNode) {
|
|
@@ -30,4 +102,129 @@ export default class Equality {
|
|
|
30
102
|
|
|
31
103
|
return equality;
|
|
32
104
|
}
|
|
105
|
+
|
|
106
|
+
static fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode) {
|
|
107
|
+
const equality = new Equality(leftTermNode, rightTermNode);
|
|
108
|
+
|
|
109
|
+
return equality;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function equateNode(nodeA, nodeB, equalities) {
|
|
114
|
+
let nodeEquates = false;
|
|
115
|
+
|
|
116
|
+
const nodeATerminalNode = nodeA.isTerminalNode(),
|
|
117
|
+
nodeBTerminalNode = nodeB.isTerminalNode();
|
|
118
|
+
|
|
119
|
+
if (nodeATerminalNode === nodeBTerminalNode) {
|
|
120
|
+
if (nodeATerminalNode) {
|
|
121
|
+
const terminalNodeA = nodeA, ///
|
|
122
|
+
terminalNodeB = nodeB, ///
|
|
123
|
+
terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, equalities);
|
|
124
|
+
|
|
125
|
+
nodeEquates = terminalNodeEquates; ///
|
|
126
|
+
} else {
|
|
127
|
+
const nonTerminalNodeA = nodeA, ///
|
|
128
|
+
nonTerminalNodeB = nodeB, ///
|
|
129
|
+
nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equalities);
|
|
130
|
+
|
|
131
|
+
nodeEquates = nonTerminalNodeEquates; ///
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return nodeEquates;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function equateNodes(leftNodes, rightNodes, equalities) {
|
|
139
|
+
let nodesEquate = false;
|
|
140
|
+
|
|
141
|
+
const leftNodesLength = leftNodes.length,
|
|
142
|
+
rightNodesLength = rightNodes.length;
|
|
143
|
+
|
|
144
|
+
if (leftNodesLength === rightNodesLength) {
|
|
145
|
+
nodesEquate = leftNodes.every((LeftNode, index) => {
|
|
146
|
+
const rightNode = rightNodes[index],
|
|
147
|
+
nodeEquates = equateNode(LeftNode, rightNode, equalities);
|
|
148
|
+
|
|
149
|
+
if (nodeEquates) {
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return nodesEquate;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function equateTerminalNode(terminalNodeA, terminalNodeB, equalities) {
|
|
159
|
+
const matches = terminalNodeA.match(terminalNodeB),
|
|
160
|
+
terminalNodeEquates = matches; ///
|
|
161
|
+
|
|
162
|
+
return terminalNodeEquates;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities) {
|
|
166
|
+
let nonTerminalNodeEquates = false;
|
|
167
|
+
|
|
168
|
+
const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
|
|
169
|
+
rightNonTerminalNodeRuleName = rightNonTerminalNode.getRuleName();
|
|
170
|
+
|
|
171
|
+
if (leftNonTerminalNodeRuleName === rightNonTerminalNodeRuleName) {
|
|
172
|
+
const ruleName = leftNonTerminalNodeRuleName, ///
|
|
173
|
+
ruleNameTermRuleName = (ruleName === TERM_RULE_NAME);
|
|
174
|
+
|
|
175
|
+
if (ruleNameTermRuleName) {
|
|
176
|
+
const leftTermNode = leftNonTerminalNode, ///
|
|
177
|
+
rightTermNode = rightNonTerminalNode, ///
|
|
178
|
+
termNodeEquates = equateTermNode(leftTermNode, rightTermNode, equalities);
|
|
179
|
+
|
|
180
|
+
nonTerminalNodeEquates = termNodeEquates; ///
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (!nonTerminalNodeEquates) {
|
|
184
|
+
const leftNonTerminalNodeChildNodes = leftNonTerminalNode.getChildNodes(),
|
|
185
|
+
rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(),
|
|
186
|
+
leftNodes = leftNonTerminalNodeChildNodes, ///
|
|
187
|
+
rightNodes = rightNonTerminalNodeChildNodes, ///
|
|
188
|
+
nodesEquate = equateNodes(leftNodes, rightNodes, equalities);
|
|
189
|
+
|
|
190
|
+
nonTerminalNodeEquates = nodesEquate; ///
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return nonTerminalNodeEquates;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function equateTermNode(leftTermNode, rightTermNode, equalities) {
|
|
198
|
+
const equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode),
|
|
199
|
+
equalityA = equality, ///
|
|
200
|
+
equalityMatches = equalities.some((equality) => { ///
|
|
201
|
+
let equalitiesB = equalities; ///
|
|
202
|
+
|
|
203
|
+
const equalityB = equality; ///
|
|
204
|
+
|
|
205
|
+
equalitiesB = filterEqualities(equalitiesB, equalityB); ///
|
|
206
|
+
|
|
207
|
+
const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB);
|
|
208
|
+
|
|
209
|
+
if (equalityAMatchesEqualityB) {
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
}),
|
|
213
|
+
termNodeEquates = equalityMatches; ///
|
|
214
|
+
|
|
215
|
+
return termNodeEquates;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function filterEqualities(equalities, equality) {
|
|
219
|
+
const equalityA = equality; ///
|
|
220
|
+
|
|
221
|
+
equalities = equalities.filter((equality) => {
|
|
222
|
+
const equalityB = equality; ///
|
|
223
|
+
|
|
224
|
+
if (equalityA !== equalityB) {
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
return equalities;
|
|
33
230
|
}
|
package/src/verify/derivation.js
CHANGED
|
@@ -107,8 +107,10 @@ function verifyChild(childNode, proofContext) {
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
case QUALIFIED_STATEMENT_RULE_NAME: {
|
|
110
|
-
const
|
|
111
|
-
|
|
110
|
+
const derived = true,
|
|
111
|
+
assertions = [],
|
|
112
|
+
qualifiedStatementNode = childNode, ///
|
|
113
|
+
qualifiedStatementVerified = verifyQualifiedStatement(qualifiedStatementNode, assertions, derived, proofContext);
|
|
112
114
|
|
|
113
115
|
if (qualifiedStatementVerified) {
|
|
114
116
|
const statementNode = statementNodeQuery(qualifiedStatementNode),
|
|
@@ -8,7 +8,7 @@ import { nodeQuery, referenceNameFromReferenceNode } from "../../utilities/query
|
|
|
8
8
|
const referenceNodeQuery = nodeQuery("/qualifiedMetastatement/qualification!/reference!"),
|
|
9
9
|
metastatementNodeQuery = nodeQuery("/qualifiedMetastatement/metastatement!");
|
|
10
10
|
|
|
11
|
-
export default function verifyQualifiedMetastatement(qualifiedMetastatementNode, metaproofContext) {
|
|
11
|
+
export default function verifyQualifiedMetastatement(qualifiedMetastatementNode, assertions, derived, metaproofContext) {
|
|
12
12
|
let qualifiedMetastatementVerified = false;
|
|
13
13
|
|
|
14
14
|
metaproofContext.begin(qualifiedMetastatementNode);
|
|
@@ -20,7 +20,7 @@ export default function verifyQualifiedMetastatement(qualifiedMetastatementNode,
|
|
|
20
20
|
|
|
21
21
|
metaproofContext.debug(`Verifying the ${metastatementString} qualified metastatement...`);
|
|
22
22
|
|
|
23
|
-
let
|
|
23
|
+
let ruleMatchesMetastatement = true;
|
|
24
24
|
|
|
25
25
|
const referenceNode = referenceNodeQuery(qualifiedMetastatementNode);
|
|
26
26
|
|
|
@@ -29,15 +29,12 @@ export default function verifyQualifiedMetastatement(qualifiedMetastatementNode,
|
|
|
29
29
|
rule = metaproofContext.findRuleByReferenceName(referenceName);
|
|
30
30
|
|
|
31
31
|
if (rule !== null) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
qualifiedMetastatementVerified = ruleMatchesStatement; ///
|
|
32
|
+
ruleMatchesMetastatement = rule.matchMetastatement(metastatementNode, metaproofContext);
|
|
35
33
|
}
|
|
36
34
|
}
|
|
37
35
|
|
|
38
|
-
if (
|
|
39
|
-
const
|
|
40
|
-
metastatementVerified = verifyMetastatement(metastatementNode, assertions, metaproofContext);
|
|
36
|
+
if (ruleMatchesMetastatement) {
|
|
37
|
+
const metastatementVerified = verifyMetastatement(metastatementNode, assertions, derived, metaproofContext);
|
|
41
38
|
|
|
42
39
|
qualifiedMetastatementVerified = metastatementVerified; ///
|
|
43
40
|
}
|
|
@@ -26,7 +26,7 @@ export default function verifyUnqualifiedMetastatement(unqualifiedMetastatementN
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
if (metastatementMatches) {
|
|
29
|
-
const metastatementVerified = verifyMetastatement(metastatementNode, assertions, metaproofContext);
|
|
29
|
+
const metastatementVerified = verifyMetastatement(metastatementNode, assertions, derived, metaproofContext);
|
|
30
30
|
|
|
31
31
|
unqualifiedMetastatementVerified = metastatementVerified; ///
|
|
32
32
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
export default function verifyMetastatement(metastatementNode, assertions, metaproofContext) {
|
|
3
|
+
export default function verifyMetastatement(metastatementNode, assertions, derived, metaproofContext) {
|
|
4
4
|
let metastatementVerified = true; ///
|
|
5
5
|
|
|
6
6
|
metaproofContext.begin(metastatementNode);
|
|
@@ -107,8 +107,10 @@ function verifyChild(childNode, metaproofContext) {
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
case QUALIFIED_METASTATEMENT_RULE_NAME: {
|
|
110
|
-
const
|
|
111
|
-
|
|
110
|
+
const derived = true,
|
|
111
|
+
assertions = [],
|
|
112
|
+
qualifiedMetastatementNode = childNode, ///
|
|
113
|
+
qualifiedMetastatementVerified = verifyQualifiedMetastatement(qualifiedMetastatementNode, assertions, derived, metaproofContext);
|
|
112
114
|
|
|
113
115
|
if (qualifiedMetastatementVerified) {
|
|
114
116
|
const metastatementNode = metastatementNodeQuery(qualifiedMetastatementNode),
|
|
@@ -8,7 +8,7 @@ import { nodeQuery, referenceNameFromReferenceNode } from "../../utilities/query
|
|
|
8
8
|
const referenceNodeQuery = nodeQuery("/qualifiedStatement/qualification!/reference!"),
|
|
9
9
|
statementNodeQuery = nodeQuery("/qualifiedStatement/statement!");
|
|
10
10
|
|
|
11
|
-
export default function verifyQualifiedStatement(qualifiedStatementNode, proofContext) {
|
|
11
|
+
export default function verifyQualifiedStatement(qualifiedStatementNode, assertions, derived, proofContext) {
|
|
12
12
|
let qualifiedStatementVerified = false;
|
|
13
13
|
|
|
14
14
|
proofContext.begin(qualifiedStatementNode);
|
|
@@ -34,8 +34,8 @@ export default function verifyQualifiedStatement(qualifiedStatementNode, proofCo
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
if (ruleMatchesStatement) {
|
|
37
|
-
const
|
|
38
|
-
statementVerified = verifyStatement(statementNode, assertions,
|
|
37
|
+
const context = proofContext,
|
|
38
|
+
statementVerified = verifyStatement(statementNode, assertions, derived, context);
|
|
39
39
|
|
|
40
40
|
qualifiedStatementVerified = statementVerified; ///
|
|
41
41
|
}
|
|
@@ -26,7 +26,8 @@ export default function verifyUnqualifiedStatement(unqualifiedStatementNode, ass
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
if (statementMatches) {
|
|
29
|
-
const
|
|
29
|
+
const context = proofContext, ///
|
|
30
|
+
statementVerified = verifyStatement(statementNode, assertions, derived, context);
|
|
30
31
|
|
|
31
32
|
unqualifiedStatementVerified = statementVerified; ///
|
|
32
33
|
}
|
package/src/verify/statement.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import Equality from "../equality";
|
|
3
4
|
import verifyTerm from "../verify/term";
|
|
4
5
|
import equalityCombinator from "../ocmbinator/equality";
|
|
5
6
|
import bracketedCombinator from "../ocmbinator/bracketed";
|
|
@@ -10,6 +11,7 @@ import { objectType } from "../type";
|
|
|
10
11
|
import { nodeAsString } from "../utilities/string";
|
|
11
12
|
import { OBJECT_TYPE_NAME } from "../typeNames";
|
|
12
13
|
import { STATEMENT_META_TYPE } from "../metaTypes";
|
|
14
|
+
import { MAXIMUM_INDEXES_LENGTH } from "../constants";
|
|
13
15
|
import { nodeQuery, typeNameFromTypeNode } from "../utilities/query";
|
|
14
16
|
import { ARGUMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../ruleNames";
|
|
15
17
|
|
|
@@ -19,56 +21,65 @@ const termNodeQuery = nodeQuery("/argument/term!"),
|
|
|
19
21
|
statementNodeQuery = nodeQuery("/metaArgument/statement!"),
|
|
20
22
|
typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!");
|
|
21
23
|
|
|
22
|
-
export default function verifyStatement(statementNode, assertions,
|
|
24
|
+
export default function verifyStatement(statementNode, assertions, derived, context) {
|
|
23
25
|
let statementVerified = false;
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
context.begin(statementNode);
|
|
26
28
|
|
|
27
29
|
if (!statementVerified) {
|
|
28
|
-
const statementVerifiedAsEquality = verifyStatementAsEquality(statementNode,
|
|
30
|
+
const statementVerifiedAsEquality = verifyStatementAsEquality(statementNode, derived, context);
|
|
29
31
|
|
|
30
32
|
statementVerified = statementVerifiedAsEquality; //
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
if (!statementVerified) {
|
|
34
|
-
const statementVerifiedAsTypeAssertion = verifyStatementAsTypeAssertion(statementNode, assertions,
|
|
36
|
+
const statementVerifiedAsTypeAssertion = verifyStatementAsTypeAssertion(statementNode, assertions, context);
|
|
35
37
|
|
|
36
38
|
statementVerified = statementVerifiedAsTypeAssertion; ///
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
if (!statementVerified) {
|
|
40
|
-
const statementVerifiedAgainstCombinators = verifyStatementAgainstCombinators(statementNode,
|
|
42
|
+
const statementVerifiedAgainstCombinators = verifyStatementAgainstCombinators(statementNode, context);
|
|
41
43
|
|
|
42
44
|
statementVerified = statementVerifiedAgainstCombinators; ///
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
statementVerified ?
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
context.complete(statementNode) :
|
|
49
|
+
context.halt(statementNode);
|
|
48
50
|
|
|
49
51
|
return statementVerified;
|
|
50
52
|
}
|
|
51
53
|
|
|
52
|
-
function verifyStatementAsEquality(statementNode,
|
|
54
|
+
function verifyStatementAsEquality(statementNode, derived, context) {
|
|
53
55
|
let statementVerifiedAsEquality = false;
|
|
54
56
|
|
|
55
57
|
const combinator = equalityCombinator, ///
|
|
56
|
-
statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator,
|
|
58
|
+
statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
|
|
57
59
|
|
|
58
60
|
if (statementVerifiedAgainstCombinator) {
|
|
59
61
|
statementVerifiedAsEquality = true;
|
|
62
|
+
|
|
63
|
+
if (derived) {
|
|
64
|
+
const equality = Equality.fromStatementNode(statementNode),
|
|
65
|
+
proofSteps = context.getProofSteps(),
|
|
66
|
+
equalities = equalitiesFromProofSteps(proofSteps),
|
|
67
|
+
equalityEquates = equality.equate(equalities);
|
|
68
|
+
|
|
69
|
+
statementVerifiedAsEquality = equalityEquates; ///
|
|
70
|
+
}
|
|
60
71
|
}
|
|
61
72
|
|
|
62
73
|
return statementVerifiedAsEquality;
|
|
63
74
|
}
|
|
64
75
|
|
|
65
|
-
function verifyStatementAsTypeAssertion(statementNode, assertions,
|
|
76
|
+
function verifyStatementAsTypeAssertion(statementNode, assertions, context) {
|
|
66
77
|
let statementVerifiedAsTypeAssertion = false;
|
|
67
78
|
|
|
68
79
|
const typeAssertionNode = typeAssertionNodeQuery(statementNode);
|
|
69
80
|
|
|
70
81
|
if (typeAssertionNode !== null) {
|
|
71
|
-
const typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assertions,
|
|
82
|
+
const typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assertions, context);
|
|
72
83
|
|
|
73
84
|
statementVerifiedAsTypeAssertion = typeAssertionVerified; ///
|
|
74
85
|
}
|
|
@@ -76,10 +87,10 @@ function verifyStatementAsTypeAssertion(statementNode, assertions, proofContext)
|
|
|
76
87
|
return statementVerifiedAsTypeAssertion;
|
|
77
88
|
}
|
|
78
89
|
|
|
79
|
-
function verifyStatementAgainstCombinators(statementNode,
|
|
90
|
+
function verifyStatementAgainstCombinators(statementNode, context) {
|
|
80
91
|
let statementVerifiedAgainstCombinators = false;
|
|
81
92
|
|
|
82
|
-
let combinators =
|
|
93
|
+
let combinators = context.getCombinators();
|
|
83
94
|
|
|
84
95
|
combinators = [ ///
|
|
85
96
|
bracketedCombinator,
|
|
@@ -87,7 +98,7 @@ function verifyStatementAgainstCombinators(statementNode, proofContext) {
|
|
|
87
98
|
];
|
|
88
99
|
|
|
89
100
|
const combinator = combinators.find((combinator) => {
|
|
90
|
-
const statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator,
|
|
101
|
+
const statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
|
|
91
102
|
|
|
92
103
|
if (statementVerifiedAgainstCombinator) {
|
|
93
104
|
return true;
|
|
@@ -101,17 +112,17 @@ function verifyStatementAgainstCombinators(statementNode, proofContext) {
|
|
|
101
112
|
return statementVerifiedAgainstCombinators;
|
|
102
113
|
}
|
|
103
114
|
|
|
104
|
-
function verifyStatementAgainstCombinator(statementNode, combinator,
|
|
115
|
+
function verifyStatementAgainstCombinator(statementNode, combinator, context) {
|
|
105
116
|
const combinatorStatementNode = combinator.getStatementNode(),
|
|
106
117
|
node = statementNode, ///
|
|
107
118
|
combinatorNode = combinatorStatementNode, ///
|
|
108
|
-
nodeVerified = verifyNode(node, combinatorNode,
|
|
119
|
+
nodeVerified = verifyNode(node, combinatorNode, context),
|
|
109
120
|
statementVerifiedAgainstCombinator = nodeVerified; ///
|
|
110
121
|
|
|
111
122
|
return statementVerifiedAgainstCombinator;
|
|
112
123
|
}
|
|
113
124
|
|
|
114
|
-
function verifyNode(node, combinatorNode,
|
|
125
|
+
function verifyNode(node, combinatorNode, context) {
|
|
115
126
|
let nodeVerified;
|
|
116
127
|
|
|
117
128
|
const nodeTerminalNode = node.isTerminalNode(),
|
|
@@ -121,13 +132,13 @@ function verifyNode(node, combinatorNode, proofContext) {
|
|
|
121
132
|
if (nodeTerminalNode) {
|
|
122
133
|
const terminalNode = node, ///
|
|
123
134
|
combinatorTerminalNode = combinatorNode, ///
|
|
124
|
-
terminalNodeVerified = verifyTerminalNode(terminalNode, combinatorTerminalNode,
|
|
135
|
+
terminalNodeVerified = verifyTerminalNode(terminalNode, combinatorTerminalNode, context);
|
|
125
136
|
|
|
126
137
|
nodeVerified = terminalNodeVerified; ///
|
|
127
138
|
} else {
|
|
128
139
|
const nonTerminalNode = node, ///
|
|
129
140
|
combinatorNonTerminalNode = combinatorNode, ///
|
|
130
|
-
nonTerminalNodeVerified = verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode,
|
|
141
|
+
nonTerminalNodeVerified = verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode, context);
|
|
131
142
|
|
|
132
143
|
nodeVerified = nonTerminalNodeVerified; ///
|
|
133
144
|
}
|
|
@@ -136,7 +147,7 @@ function verifyNode(node, combinatorNode, proofContext) {
|
|
|
136
147
|
return nodeVerified;
|
|
137
148
|
}
|
|
138
149
|
|
|
139
|
-
function verifyNodes(nodes, combinatorNodes,
|
|
150
|
+
function verifyNodes(nodes, combinatorNodes, context) {
|
|
140
151
|
let nodesVerified = false;
|
|
141
152
|
|
|
142
153
|
const nodesLength = nodes.length,
|
|
@@ -145,7 +156,7 @@ function verifyNodes(nodes, combinatorNodes, proofContext) {
|
|
|
145
156
|
if (nodesLength === combinatorNodesLength) {
|
|
146
157
|
nodesVerified = nodes.every((node, index) => {
|
|
147
158
|
const combinatorNode = combinatorNodes[index],
|
|
148
|
-
nodeVerified = verifyNode(node, combinatorNode,
|
|
159
|
+
nodeVerified = verifyNode(node, combinatorNode, context);
|
|
149
160
|
|
|
150
161
|
if (nodeVerified) {
|
|
151
162
|
return true;
|
|
@@ -156,7 +167,7 @@ function verifyNodes(nodes, combinatorNodes, proofContext) {
|
|
|
156
167
|
return nodesVerified;
|
|
157
168
|
}
|
|
158
169
|
|
|
159
|
-
function verifyTerminalNode(terminalNode, combinatorTerminalNode,
|
|
170
|
+
function verifyTerminalNode(terminalNode, combinatorTerminalNode, context) {
|
|
160
171
|
let terminalNodeVerified = false;
|
|
161
172
|
|
|
162
173
|
const matches = terminalNode.match(combinatorTerminalNode);
|
|
@@ -168,7 +179,7 @@ function verifyTerminalNode(terminalNode, combinatorTerminalNode, proofContext)
|
|
|
168
179
|
return terminalNodeVerified;
|
|
169
180
|
}
|
|
170
181
|
|
|
171
|
-
function verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode,
|
|
182
|
+
function verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode, context) {
|
|
172
183
|
let nonTerminalNodeVerified = false;
|
|
173
184
|
|
|
174
185
|
const ruleName = nonTerminalNode.getRuleName(), ///
|
|
@@ -179,7 +190,7 @@ function verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode, proof
|
|
|
179
190
|
case ARGUMENT_RULE_NAME: {
|
|
180
191
|
const argumentNode = nonTerminalNode, ///
|
|
181
192
|
combinatorArgumentNode = combinatorNonTerminalNode, ///
|
|
182
|
-
argumentNodeVerified = verifyArgumentNode(argumentNode, combinatorArgumentNode,
|
|
193
|
+
argumentNodeVerified = verifyArgumentNode(argumentNode, combinatorArgumentNode, context);
|
|
183
194
|
|
|
184
195
|
nonTerminalNodeVerified = argumentNodeVerified; ///
|
|
185
196
|
|
|
@@ -189,7 +200,7 @@ function verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode, proof
|
|
|
189
200
|
case META_ARGUMENT_RULE_NAME: {
|
|
190
201
|
const metaArgumentNode = nonTerminalNode, ///
|
|
191
202
|
combinatorMetaargumentNode = combinatorNonTerminalNode, ///
|
|
192
|
-
metaArgumentNodeVerified = verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode,
|
|
203
|
+
metaArgumentNodeVerified = verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, context);
|
|
193
204
|
|
|
194
205
|
nonTerminalNodeVerified = metaArgumentNodeVerified; ///
|
|
195
206
|
|
|
@@ -201,7 +212,7 @@ function verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode, proof
|
|
|
201
212
|
combinatorChildNodes = combinatorNonTerminalNode.getChildNodes(),
|
|
202
213
|
nodes = childNodes, ///
|
|
203
214
|
combinatorNodes = combinatorChildNodes, ///
|
|
204
|
-
nodesVerified = verifyNodes(nodes, combinatorNodes,
|
|
215
|
+
nodesVerified = verifyNodes(nodes, combinatorNodes, context);
|
|
205
216
|
|
|
206
217
|
nonTerminalNodeVerified = nodesVerified; ///
|
|
207
218
|
|
|
@@ -213,7 +224,7 @@ function verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode, proof
|
|
|
213
224
|
return nonTerminalNodeVerified;
|
|
214
225
|
}
|
|
215
226
|
|
|
216
|
-
function verifyArgumentNode(argumentNode, combinatorArgumentNode,
|
|
227
|
+
function verifyArgumentNode(argumentNode, combinatorArgumentNode, context) {
|
|
217
228
|
let argumentNodeVerified = false;
|
|
218
229
|
|
|
219
230
|
const termNode = termNodeQuery(argumentNode);
|
|
@@ -221,10 +232,9 @@ function verifyArgumentNode(argumentNode, combinatorArgumentNode, proofContext)
|
|
|
221
232
|
if (termNode === null) {
|
|
222
233
|
const argumentString = nodeAsString(argumentNode);
|
|
223
234
|
|
|
224
|
-
|
|
235
|
+
context.error(`The ${argumentString} argument should be a term, not a type`);
|
|
225
236
|
} else {
|
|
226
237
|
const types = [],
|
|
227
|
-
context = proofContext, ///
|
|
228
238
|
termVerified = verifyTerm(termNode, types, context);
|
|
229
239
|
|
|
230
240
|
if (termVerified) {
|
|
@@ -234,7 +244,7 @@ function verifyArgumentNode(argumentNode, combinatorArgumentNode, proofContext)
|
|
|
234
244
|
typeName = typeNameFromTypeNode(typeNode),
|
|
235
245
|
type = (typeName === OBJECT_TYPE_NAME) ?
|
|
236
246
|
objectType : ///
|
|
237
|
-
|
|
247
|
+
context.findTypeByTypeName(typeName),
|
|
238
248
|
statementTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(type);
|
|
239
249
|
|
|
240
250
|
if (statementTypeEqualToOrSubTypeOfType) {
|
|
@@ -246,7 +256,7 @@ function verifyArgumentNode(argumentNode, combinatorArgumentNode, proofContext)
|
|
|
246
256
|
return argumentNodeVerified;
|
|
247
257
|
}
|
|
248
258
|
|
|
249
|
-
function verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode,
|
|
259
|
+
function verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, context) {
|
|
250
260
|
let metaArgumentNodeVerified = false;
|
|
251
261
|
|
|
252
262
|
const statementNode = statementNodeQuery(metaArgumentNode);
|
|
@@ -254,10 +264,11 @@ function verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, pr
|
|
|
254
264
|
if (statementNode === null) {
|
|
255
265
|
const metaArgumentString = nodeAsString(metaArgumentNode);
|
|
256
266
|
|
|
257
|
-
|
|
267
|
+
context.error(`The '${metaArgumentString}' meta-argument should be a statement, not a meta-type.`);
|
|
258
268
|
} else {
|
|
259
|
-
const
|
|
260
|
-
|
|
269
|
+
const derived = false,
|
|
270
|
+
assertions = null,
|
|
271
|
+
statementVerified = verifyStatement(statementNode, assertions, derived, context);
|
|
261
272
|
|
|
262
273
|
if (statementVerified) {
|
|
263
274
|
const combinatorMetaTYpeNode = metaTypeNodeQuery(combinatorMetaargumentNode);
|
|
@@ -273,10 +284,28 @@ function verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, pr
|
|
|
273
284
|
if (!metaArgumentNodeVerified) {
|
|
274
285
|
const combinatorMetaargumentString = nodeAsString(combinatorMetaargumentNode);
|
|
275
286
|
|
|
276
|
-
|
|
287
|
+
context.error(`The '${combinatorMetaargumentString}' combinator meta-argument should be the 'Statement' meta-type.`);
|
|
277
288
|
}
|
|
278
289
|
}
|
|
279
290
|
}
|
|
280
291
|
|
|
281
292
|
return metaArgumentNodeVerified;
|
|
282
293
|
}
|
|
294
|
+
|
|
295
|
+
function equalitiesFromProofSteps(proofSteps) {
|
|
296
|
+
const start = -MAXIMUM_INDEXES_LENGTH; ///
|
|
297
|
+
|
|
298
|
+
proofSteps = proofSteps.slice(start); ///
|
|
299
|
+
|
|
300
|
+
const equalities = proofSteps.reduce((equalities, proofStep, index) => {
|
|
301
|
+
const equality = Equality.fromProofStep(proofStep);
|
|
302
|
+
|
|
303
|
+
if (equality !== null) {
|
|
304
|
+
equalities.push(equality);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
return equalities;
|
|
308
|
+
}, []);
|
|
309
|
+
|
|
310
|
+
return equalities;
|
|
311
|
+
}
|