occam-verify-cli 0.0.492 → 0.0.494
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/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/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
package/src/equality.js
DELETED
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import { nodeQuery } from "./utilities/query";
|
|
4
|
-
import { TERM_RULE_NAME } from "./ruleNames";
|
|
5
|
-
import { EQUALS_CHARACTER } from "./constants";
|
|
6
|
-
|
|
7
|
-
const specialNodeQuery = nodeQuery("/statement/@special!"),
|
|
8
|
-
leftTermNodeQuery = nodeQuery("/statement/term[0]"),
|
|
9
|
-
rightTermNodeQuery = nodeQuery("/statement/term[1]");
|
|
10
|
-
|
|
11
|
-
export default class Equality {
|
|
12
|
-
constructor(leftTermNode, rightTermNode) {
|
|
13
|
-
this.leftTermNode = leftTermNode;
|
|
14
|
-
this.rightTermNode = rightTermNode;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
getLeftTermNode() {
|
|
18
|
-
return this.leftTermNode;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
getRightTermNode() {
|
|
22
|
-
return this.rightTermNode;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
match(equality, equalities, proofContext) {
|
|
26
|
-
let matches = false;
|
|
27
|
-
|
|
28
|
-
const leftTermNode = equality.getLeftTermNode(),
|
|
29
|
-
rightTermNode = equality.getRightTermNode();
|
|
30
|
-
|
|
31
|
-
if (!matches) {
|
|
32
|
-
const reversed = false,
|
|
33
|
-
leftTermNodeAndRightTermNodeMatch = this.matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities, proofContext);
|
|
34
|
-
|
|
35
|
-
matches = leftTermNodeAndRightTermNodeMatch; ///
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (!matches) {
|
|
39
|
-
const reversed = true,
|
|
40
|
-
leftTermNodeAndRightTermNodeMatch = this.matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities, proofContext);
|
|
41
|
-
|
|
42
|
-
matches = leftTermNodeAndRightTermNodeMatch; ///
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return matches;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities, proofContext) {
|
|
49
|
-
let leftTermNodeAndRightTermNodeMatch = true;
|
|
50
|
-
|
|
51
|
-
if (leftTermNodeAndRightTermNodeMatch) {
|
|
52
|
-
const leftNonTerminalNode = reversed ?
|
|
53
|
-
this.rightTermNode :
|
|
54
|
-
this.leftTermNode, ///
|
|
55
|
-
rightNonTerminalNode = leftTermNode, ///
|
|
56
|
-
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, proofContext);
|
|
57
|
-
|
|
58
|
-
leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (leftTermNodeAndRightTermNodeMatch) {
|
|
62
|
-
const leftNonTerminalNode = reversed ?
|
|
63
|
-
this.leftTermNode :
|
|
64
|
-
this.rightTermNode, ///
|
|
65
|
-
rightNonTerminalNode = rightTermNode, ///
|
|
66
|
-
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, proofContext);
|
|
67
|
-
|
|
68
|
-
leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return leftTermNodeAndRightTermNodeMatch;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
equate(equalities, proofContext) {
|
|
75
|
-
const leftNonTerminalNode = this.leftTermNode, ///
|
|
76
|
-
rightNonTerminalNode = this.rightTermNode, ///
|
|
77
|
-
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, proofContext),
|
|
78
|
-
equates = nonTerminalNodeEquates; ///
|
|
79
|
-
|
|
80
|
-
return equates;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
static fromProofStep(proofStep) {
|
|
84
|
-
let equality = null;
|
|
85
|
-
|
|
86
|
-
const statementNode = proofStep.getStatementNode();
|
|
87
|
-
|
|
88
|
-
if (statementNode !== null) {
|
|
89
|
-
const specialNode = specialNodeQuery(statementNode);
|
|
90
|
-
|
|
91
|
-
if (specialNode !== null) {
|
|
92
|
-
const terminalNode = specialNode, ///
|
|
93
|
-
terminalNodeContent = terminalNode.getContent();
|
|
94
|
-
|
|
95
|
-
if (terminalNodeContent === EQUALS_CHARACTER) {
|
|
96
|
-
const leftTermNode = leftTermNodeQuery(statementNode),
|
|
97
|
-
rightTermNode = rightTermNodeQuery(statementNode);
|
|
98
|
-
|
|
99
|
-
equality = new Equality(leftTermNode, rightTermNode);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return equality;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
static fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode) {
|
|
108
|
-
const equality = new Equality(leftTermNode, rightTermNode);
|
|
109
|
-
|
|
110
|
-
return equality;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
function equateNode(nodeA, nodeB, equalities, proofContext) {
|
|
115
|
-
let nodeEquates = false;
|
|
116
|
-
|
|
117
|
-
const nodeATerminalNode = nodeA.isTerminalNode(),
|
|
118
|
-
nodeBTerminalNode = nodeB.isTerminalNode();
|
|
119
|
-
|
|
120
|
-
if (nodeATerminalNode === nodeBTerminalNode) {
|
|
121
|
-
if (nodeATerminalNode) {
|
|
122
|
-
const terminalNodeA = nodeA, ///
|
|
123
|
-
terminalNodeB = nodeB, ///
|
|
124
|
-
terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, equalities, proofContext);
|
|
125
|
-
|
|
126
|
-
nodeEquates = terminalNodeEquates; ///
|
|
127
|
-
} else {
|
|
128
|
-
const nonTerminalNodeA = nodeA, ///
|
|
129
|
-
nonTerminalNodeB = nodeB, ///
|
|
130
|
-
nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equalities, proofContext);
|
|
131
|
-
|
|
132
|
-
nodeEquates = nonTerminalNodeEquates; ///
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return nodeEquates;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function equateNodes(leftNodes, rightNodes, equalities, proofContext) {
|
|
140
|
-
let nodesEquate = false;
|
|
141
|
-
|
|
142
|
-
const leftNodesLength = leftNodes.length,
|
|
143
|
-
rightNodesLength = rightNodes.length;
|
|
144
|
-
|
|
145
|
-
if (leftNodesLength === rightNodesLength) {
|
|
146
|
-
nodesEquate = leftNodes.every((LeftNode, index) => {
|
|
147
|
-
const rightNode = rightNodes[index],
|
|
148
|
-
nodeEquates = equateNode(LeftNode, rightNode, equalities, proofContext);
|
|
149
|
-
|
|
150
|
-
if (nodeEquates) {
|
|
151
|
-
return true;
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
return nodesEquate;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
function equateTerminalNode(terminalNodeA, terminalNodeB, equalities, proofContext) {
|
|
160
|
-
const matches = terminalNodeA.match(terminalNodeB),
|
|
161
|
-
terminalNodeEquates = matches; ///
|
|
162
|
-
|
|
163
|
-
return terminalNodeEquates;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, proofContext) {
|
|
167
|
-
let nonTerminalNodeEquates = false;
|
|
168
|
-
|
|
169
|
-
const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
|
|
170
|
-
rightNonTerminalNodeRuleName = rightNonTerminalNode.getRuleName();
|
|
171
|
-
|
|
172
|
-
if (leftNonTerminalNodeRuleName === rightNonTerminalNodeRuleName) {
|
|
173
|
-
const ruleName = leftNonTerminalNodeRuleName, ///
|
|
174
|
-
ruleNameTermRuleName = (ruleName === TERM_RULE_NAME);
|
|
175
|
-
|
|
176
|
-
if (ruleNameTermRuleName) {
|
|
177
|
-
const leftTermNode = leftNonTerminalNode, ///
|
|
178
|
-
rightTermNode = rightNonTerminalNode, ///
|
|
179
|
-
termNodeEquates = equateTermNode(leftTermNode, rightTermNode, equalities, proofContext);
|
|
180
|
-
|
|
181
|
-
nonTerminalNodeEquates = termNodeEquates; ///
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
if (!nonTerminalNodeEquates) {
|
|
185
|
-
const leftNonTerminalNodeChildNodes = leftNonTerminalNode.getChildNodes(),
|
|
186
|
-
rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(),
|
|
187
|
-
leftNodes = leftNonTerminalNodeChildNodes, ///
|
|
188
|
-
rightNodes = rightNonTerminalNodeChildNodes, ///
|
|
189
|
-
nodesEquate = equateNodes(leftNodes, rightNodes, equalities, proofContext);
|
|
190
|
-
|
|
191
|
-
nonTerminalNodeEquates = nodesEquate; ///
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
return nonTerminalNodeEquates;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
function equateTermNode(leftTermNode, rightTermNode, equalities, proofContext) {
|
|
199
|
-
const equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode),
|
|
200
|
-
equalityA = equality, ///
|
|
201
|
-
equalityMatches = equalities.some((equality) => { ///
|
|
202
|
-
let equalitiesB = equalities; ///
|
|
203
|
-
|
|
204
|
-
const equalityB = equality; ///
|
|
205
|
-
|
|
206
|
-
equalitiesB = pruneEqualities(equalitiesB, equalityB); ///
|
|
207
|
-
|
|
208
|
-
const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB, proofContext);
|
|
209
|
-
|
|
210
|
-
if (equalityAMatchesEqualityB) {
|
|
211
|
-
return true;
|
|
212
|
-
}
|
|
213
|
-
}),
|
|
214
|
-
termNodeEquates = equalityMatches; ///
|
|
215
|
-
|
|
216
|
-
return termNodeEquates;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
function pruneEqualities(equalities, equality) {
|
|
220
|
-
const equalityA = equality; ///
|
|
221
|
-
|
|
222
|
-
equalities = equalities.filter((equality) => {
|
|
223
|
-
const equalityB = equality; ///
|
|
224
|
-
|
|
225
|
-
if (equalityA !== equalityB) {
|
|
226
|
-
return true;
|
|
227
|
-
}
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
return equalities;
|
|
231
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import Equality from "../equality";
|
|
4
|
-
import verifyTerm from "../verify/term";
|
|
5
|
-
|
|
6
|
-
import { nodeQuery } from "../utilities/query";
|
|
7
|
-
import { nodeAsString } from "../utilities/string";
|
|
8
|
-
import { first, second } from "../utilities/array";
|
|
9
|
-
import { EQUALS_CHARACTER, MAXIMUM_INDEXES_LENGTH } from "../constants";
|
|
10
|
-
|
|
11
|
-
const specialNodeQuery = nodeQuery("/statement/@special!"),
|
|
12
|
-
leftTermNodeQuery = nodeQuery("/statement/term[0]"),
|
|
13
|
-
rightTermNodeQuery = nodeQuery("/statement/term[1]");
|
|
14
|
-
|
|
15
|
-
export default function verifyStatementAsEquality(statementNode, qualified, proofContext) {
|
|
16
|
-
let statementVerifiedAsEquality = false;
|
|
17
|
-
|
|
18
|
-
proofContext.begin(statementNode);
|
|
19
|
-
|
|
20
|
-
const statementString = nodeAsString(statementNode);
|
|
21
|
-
|
|
22
|
-
proofContext.debug(`Verifying the '${statementString}' statement as an equality...`);
|
|
23
|
-
|
|
24
|
-
const specialNode = specialNodeQuery(statementNode);
|
|
25
|
-
|
|
26
|
-
if (specialNode !== null) {
|
|
27
|
-
const terminalNode = specialNode, ///
|
|
28
|
-
terminalNodeContent = terminalNode.getContent();
|
|
29
|
-
|
|
30
|
-
if (terminalNodeContent === EQUALS_CHARACTER) {
|
|
31
|
-
const types = [],
|
|
32
|
-
context = proofContext, ///
|
|
33
|
-
leftTermNode = leftTermNodeQuery(statementNode),
|
|
34
|
-
rightTermNode = rightTermNodeQuery(statementNode),
|
|
35
|
-
leftTermVerified = verifyTerm(leftTermNode, types, context),
|
|
36
|
-
rightTermVerified = verifyTerm(rightTermNode, types, context);
|
|
37
|
-
|
|
38
|
-
if (leftTermVerified && rightTermVerified) {
|
|
39
|
-
const firstType = first(types),
|
|
40
|
-
secondType = second(types),
|
|
41
|
-
leftType = firstType, ///
|
|
42
|
-
rightType = secondType, ///
|
|
43
|
-
leftTermString = nodeAsString(leftTermNode),
|
|
44
|
-
rightTermString = nodeAsString(rightTermNode);
|
|
45
|
-
|
|
46
|
-
if ((leftType === null) && (rightType === null)) {
|
|
47
|
-
proofContext.error(`The types of the '${leftTermString}' and '${rightTermString}' terms are both undefined and therefore the terms cannot be equated.`);
|
|
48
|
-
} else if (rightType === null) {
|
|
49
|
-
proofContext.info(`The type of the right '${rightTermString}' term is undefined and therefore the types cannot be equated.`);
|
|
50
|
-
} else if (leftType === null) {
|
|
51
|
-
proofContext.info(`The type of the left '${leftTermString}' term is undefined and therefore the types cannot be equated.`);
|
|
52
|
-
} else {
|
|
53
|
-
const leftTypeMatchesRightType = leftType.match(rightType);
|
|
54
|
-
|
|
55
|
-
if (!leftTypeMatchesRightType) {
|
|
56
|
-
proofContext.error(`The types of the '${leftTermString}' and '${rightTermString}' terms do not match and therefore the terms cannot be equated.`);
|
|
57
|
-
} else {
|
|
58
|
-
if (!qualified) {
|
|
59
|
-
statementVerifiedAsEquality = true;
|
|
60
|
-
} else {
|
|
61
|
-
const equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode),
|
|
62
|
-
proofSteps = proofContext.getProofSteps(),
|
|
63
|
-
equalities = equalitiesFromProofSteps(proofSteps),
|
|
64
|
-
equalityEquates = equality.equate(equalities, proofContext);
|
|
65
|
-
|
|
66
|
-
statementVerifiedAsEquality = equalityEquates; ///
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
if (statementVerifiedAsEquality) {
|
|
75
|
-
proofContext.info(`Verified the '${statementString}' equality.`);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
statementVerifiedAsEquality ?
|
|
79
|
-
proofContext.complete(statementNode) :
|
|
80
|
-
proofContext.halt(statementNode);
|
|
81
|
-
|
|
82
|
-
return statementVerifiedAsEquality;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function equalitiesFromProofSteps(proofSteps) {
|
|
86
|
-
const start = -MAXIMUM_INDEXES_LENGTH; ///
|
|
87
|
-
|
|
88
|
-
proofSteps = proofSteps.slice(start); ///
|
|
89
|
-
|
|
90
|
-
const equalities = proofSteps.reduce((equalities, proofStep, index) => {
|
|
91
|
-
const equality = Equality.fromProofStep(proofStep);
|
|
92
|
-
|
|
93
|
-
if (equality !== null) {
|
|
94
|
-
equalities.push(equality);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return equalities;
|
|
98
|
-
}, []);
|
|
99
|
-
|
|
100
|
-
return equalities;
|
|
101
|
-
}
|