occam-verify-cli 0.0.475 → 0.0.477
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/README.md +17 -0
- package/lib/axiomLemmaTheorem.js +12 -12
- package/lib/equality.js +177 -6
- package/lib/variable.js +16 -1
- package/lib/verify/equality.js +22 -7
- package/lib/verify/term.js +11 -11
- package/license.txt +203 -40
- package/package.json +1 -1
- package/src/axiomLemmaTheorem.js +12 -12
- package/src/equality.js +228 -3
- package/src/variable.js +16 -0
- package/src/verify/equality.js +37 -10
- package/src/verify/term.js +14 -14
package/src/equality.js
CHANGED
|
@@ -1,8 +1,233 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import { nodeQuery } from "./utilities/query";
|
|
4
|
+
import { TERM_RULE_NAME } from "./ruleNames";
|
|
5
|
+
|
|
6
|
+
const equalityNodeQuery = nodeQuery("/statement/equality!"),
|
|
7
|
+
leftTermNodeQuery = nodeQuery("/equality/term[0]"),
|
|
8
|
+
rightTermNodeQuery = nodeQuery("/equality/term[1]");
|
|
9
|
+
|
|
3
10
|
export default class Equality {
|
|
4
|
-
constructor(
|
|
5
|
-
this.
|
|
6
|
-
this.
|
|
11
|
+
constructor(leftTermNode, rightTermNode) {
|
|
12
|
+
this.leftTermNode = leftTermNode;
|
|
13
|
+
this.rightTermNode = rightTermNode;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
getLeftTermNode() {
|
|
17
|
+
return this.leftTermNode;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
getRightTermNode() {
|
|
21
|
+
return this.rightTermNode;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
match(equality, equalities, proofContext) {
|
|
25
|
+
let matches = false;
|
|
26
|
+
|
|
27
|
+
const leftTermNode = equality.getLeftTermNode(),
|
|
28
|
+
rightTermNode = equality.getRightTermNode();
|
|
29
|
+
|
|
30
|
+
if (!matches) {
|
|
31
|
+
const reversed = false,
|
|
32
|
+
leftTermNodeAndRightTermNodeMatch = this.matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities, proofContext);
|
|
33
|
+
|
|
34
|
+
matches = leftTermNodeAndRightTermNodeMatch; ///
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (!matches) {
|
|
38
|
+
const reversed = true,
|
|
39
|
+
leftTermNodeAndRightTermNodeMatch = this.matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities, proofContext);
|
|
40
|
+
|
|
41
|
+
matches = leftTermNodeAndRightTermNodeMatch; ///
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return matches;
|
|
7
45
|
}
|
|
46
|
+
|
|
47
|
+
matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities, proofContext) {
|
|
48
|
+
let leftTermNodeAndRightTermNodeMatch = true;
|
|
49
|
+
|
|
50
|
+
if (leftTermNodeAndRightTermNodeMatch) {
|
|
51
|
+
const leftNonTerminalNode = reversed ?
|
|
52
|
+
this.rightTermNode :
|
|
53
|
+
this.leftTermNode, ///
|
|
54
|
+
rightNonTerminalNode = leftTermNode, ///
|
|
55
|
+
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, proofContext);
|
|
56
|
+
|
|
57
|
+
leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (leftTermNodeAndRightTermNodeMatch) {
|
|
61
|
+
const leftNonTerminalNode = reversed ?
|
|
62
|
+
this.leftTermNode :
|
|
63
|
+
this.rightTermNode, ///
|
|
64
|
+
rightNonTerminalNode = rightTermNode, ///
|
|
65
|
+
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, proofContext);
|
|
66
|
+
|
|
67
|
+
leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return leftTermNodeAndRightTermNodeMatch;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
equate(equalities, proofContext) {
|
|
74
|
+
const leftNonTerminalNode = this.leftTermNode, ///
|
|
75
|
+
rightNonTerminalNode = this.rightTermNode, ///
|
|
76
|
+
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, proofContext),
|
|
77
|
+
equates = nonTerminalNodeEquates; ///
|
|
78
|
+
|
|
79
|
+
return equates;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
static fromProofStep(proofStep) {
|
|
83
|
+
let equality = null;
|
|
84
|
+
|
|
85
|
+
const statementNode = proofStep.getStatementNode();
|
|
86
|
+
|
|
87
|
+
if (statementNode !== null) {
|
|
88
|
+
const equalityNode = equalityNodeQuery(statementNode);
|
|
89
|
+
|
|
90
|
+
if (equalityNode !== null) {
|
|
91
|
+
const leftTermNode = leftTermNodeQuery(equalityNode),
|
|
92
|
+
rightTermNode = rightTermNodeQuery(equalityNode);
|
|
93
|
+
|
|
94
|
+
equality = new Equality(leftTermNode, rightTermNode);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return equality;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
static fromEqualityNode(equalityNode) {
|
|
102
|
+
const leftTermNode = leftTermNodeQuery(equalityNode),
|
|
103
|
+
rightTermNode = rightTermNodeQuery(equalityNode),
|
|
104
|
+
equality = new Equality(leftTermNode, rightTermNode);
|
|
105
|
+
|
|
106
|
+
return equality;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
static fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode) {
|
|
110
|
+
const equality = new Equality(leftTermNode, rightTermNode);
|
|
111
|
+
|
|
112
|
+
return equality;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function equateNode(nodeA, nodeB, equalities, proofContext) {
|
|
117
|
+
let nodeEquates = false;
|
|
118
|
+
|
|
119
|
+
const nodeATerminalNode = nodeA.isTerminalNode(),
|
|
120
|
+
nodeBTerminalNode = nodeB.isTerminalNode();
|
|
121
|
+
|
|
122
|
+
if (nodeATerminalNode === nodeBTerminalNode) {
|
|
123
|
+
if (nodeATerminalNode) {
|
|
124
|
+
const terminalNodeA = nodeA, ///
|
|
125
|
+
terminalNodeB = nodeB, ///
|
|
126
|
+
terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, equalities, proofContext);
|
|
127
|
+
|
|
128
|
+
nodeEquates = terminalNodeEquates; ///
|
|
129
|
+
} else {
|
|
130
|
+
const nonTerminalNodeA = nodeA, ///
|
|
131
|
+
nonTerminalNodeB = nodeB, ///
|
|
132
|
+
nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equalities, proofContext);
|
|
133
|
+
|
|
134
|
+
nodeEquates = nonTerminalNodeEquates; ///
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return nodeEquates;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function equateNodes(leftNodes, rightNodes, equalities, proofContext) {
|
|
142
|
+
let nodesEquate = false;
|
|
143
|
+
|
|
144
|
+
const leftNodesLength = leftNodes.length,
|
|
145
|
+
rightNodesLength = rightNodes.length;
|
|
146
|
+
|
|
147
|
+
if (leftNodesLength === rightNodesLength) {
|
|
148
|
+
nodesEquate = leftNodes.every((LeftNode, index) => {
|
|
149
|
+
const rightNode = rightNodes[index],
|
|
150
|
+
nodeEquates = equateNode(LeftNode, rightNode, equalities, proofContext);
|
|
151
|
+
|
|
152
|
+
if (nodeEquates) {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return nodesEquate;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function equateTerminalNode(terminalNodeA, terminalNodeB, equalities, proofContext) {
|
|
162
|
+
const matches = terminalNodeA.match(terminalNodeB),
|
|
163
|
+
terminalNodeEquates = matches; ///
|
|
164
|
+
|
|
165
|
+
return terminalNodeEquates;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, proofContext) {
|
|
169
|
+
let nonTerminalNodeEquates = false;
|
|
170
|
+
|
|
171
|
+
const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
|
|
172
|
+
rightNonTerminalNodeRuleName = rightNonTerminalNode.getRuleName();
|
|
173
|
+
|
|
174
|
+
if (leftNonTerminalNodeRuleName === rightNonTerminalNodeRuleName) {
|
|
175
|
+
const ruleName = leftNonTerminalNodeRuleName, ///
|
|
176
|
+
ruleNameTermRuleName = (ruleName === TERM_RULE_NAME);
|
|
177
|
+
|
|
178
|
+
if (ruleNameTermRuleName) {
|
|
179
|
+
const leftTermNode = leftNonTerminalNode, ///
|
|
180
|
+
rightTermNode = rightNonTerminalNode, ///
|
|
181
|
+
termNodeEquates = equateTermNode(leftTermNode, rightTermNode, equalities, proofContext);
|
|
182
|
+
|
|
183
|
+
nonTerminalNodeEquates = termNodeEquates; ///
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (!nonTerminalNodeEquates) {
|
|
187
|
+
const leftNonTerminalNodeChildNodes = leftNonTerminalNode.getChildNodes(),
|
|
188
|
+
rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(),
|
|
189
|
+
leftNodes = leftNonTerminalNodeChildNodes, ///
|
|
190
|
+
rightNodes = rightNonTerminalNodeChildNodes, ///
|
|
191
|
+
nodesEquate = equateNodes(leftNodes, rightNodes, equalities, proofContext);
|
|
192
|
+
|
|
193
|
+
nonTerminalNodeEquates = nodesEquate; ///
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return nonTerminalNodeEquates;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function equateTermNode(leftTermNode, rightTermNode, equalities, proofContext) {
|
|
201
|
+
const equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode),
|
|
202
|
+
equalityA = equality, ///
|
|
203
|
+
equalityMatches = equalities.some((equality) => { ///
|
|
204
|
+
let equalitiesB = equalities; ///
|
|
205
|
+
|
|
206
|
+
const equalityB = equality; ///
|
|
207
|
+
|
|
208
|
+
equalitiesB = pruneEqualities(equalitiesB, equalityB); ///
|
|
209
|
+
|
|
210
|
+
const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB, proofContext);
|
|
211
|
+
|
|
212
|
+
if (equalityAMatchesEqualityB) {
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
}),
|
|
216
|
+
termNodeEquates = equalityMatches; ///
|
|
217
|
+
|
|
218
|
+
return termNodeEquates;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function pruneEqualities(equalities, equality) {
|
|
222
|
+
const equalityA = equality; ///
|
|
223
|
+
|
|
224
|
+
equalities = equalities.filter((equality) => {
|
|
225
|
+
const equalityB = equality; ///
|
|
226
|
+
|
|
227
|
+
if (equalityA !== equalityB) {
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
return equalities;
|
|
8
233
|
}
|
package/src/variable.js
CHANGED
|
@@ -35,6 +35,22 @@ export default class Variable {
|
|
|
35
35
|
return matchesName;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
isEqualTo(variable) {
|
|
39
|
+
let equalTo = false;
|
|
40
|
+
|
|
41
|
+
if (variable === this) {
|
|
42
|
+
equalTo = true;
|
|
43
|
+
} else {
|
|
44
|
+
const value = variable.getValue();
|
|
45
|
+
|
|
46
|
+
if (value === this.value) {
|
|
47
|
+
equalTo = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return equalTo;
|
|
52
|
+
}
|
|
53
|
+
|
|
38
54
|
asString() {
|
|
39
55
|
let string;
|
|
40
56
|
|
package/src/verify/equality.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import Equality from "../equality";
|
|
3
4
|
import verifyTerm from "../verify/term";
|
|
4
5
|
|
|
5
6
|
import { nodeQuery } from "../utilities/query";
|
|
6
7
|
import { nodeAsString } from "../utilities/string";
|
|
7
8
|
import { first, second } from "../utilities/array";
|
|
9
|
+
import { MAXIMUM_INDEXES_LENGTH } from "../constants";
|
|
8
10
|
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
+
const leftTermNodeQuery = nodeQuery("/equality/term[0]"),
|
|
12
|
+
rightTermNodeQuery = nodeQuery("/equality/term[1]");
|
|
11
13
|
|
|
12
14
|
export default function verifyEquality(equalityNode, proofContext) {
|
|
13
15
|
let equalityVerified = false;
|
|
@@ -24,7 +26,12 @@ export default function verifyEquality(equalityNode, proofContext) {
|
|
|
24
26
|
const derived = proofContext.isDerived();
|
|
25
27
|
|
|
26
28
|
if (derived) {
|
|
27
|
-
|
|
29
|
+
const equality = Equality.fromEqualityNode(equalityNode),
|
|
30
|
+
proofSteps = proofContext.getProofSteps(),
|
|
31
|
+
equalities = equalitiesFromProofSteps(proofSteps),
|
|
32
|
+
equalityEquates = equality.equate(equalities, proofContext);
|
|
33
|
+
|
|
34
|
+
equalityVerified = equalityEquates; ///
|
|
28
35
|
} else {
|
|
29
36
|
equalityVerified = true;
|
|
30
37
|
}
|
|
@@ -46,20 +53,40 @@ function verifyEqualityTypes(equalityNode, proofContext) {
|
|
|
46
53
|
|
|
47
54
|
const types = [],
|
|
48
55
|
context = proofContext, ///
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
56
|
+
leftTermNode = leftTermNodeQuery(equalityNode),
|
|
57
|
+
rightTermNode = rightTermNodeQuery(equalityNode),
|
|
58
|
+
leftTermVerified = verifyTerm(leftTermNode, types, context),
|
|
59
|
+
rightTermVerified = verifyTerm(rightTermNode, types, context);
|
|
53
60
|
|
|
54
|
-
if (
|
|
61
|
+
if (leftTermVerified && rightTermVerified) {
|
|
55
62
|
const firstType = first(types),
|
|
56
63
|
secondType = second(types),
|
|
57
|
-
|
|
64
|
+
leftType = firstType, ///
|
|
65
|
+
rightType = secondType, ///
|
|
66
|
+
leftTypeEqualToSubTypeOfOrSuperTypeOfRightType = leftType.isEqualToSubTypeOfOrSuperTypeOf(rightType);
|
|
58
67
|
|
|
59
|
-
if (
|
|
68
|
+
if (leftTypeEqualToSubTypeOfOrSuperTypeOfRightType) {
|
|
60
69
|
equalityTypesVerified = true;
|
|
61
70
|
}
|
|
62
71
|
}
|
|
63
72
|
|
|
64
73
|
return equalityTypesVerified;
|
|
65
74
|
}
|
|
75
|
+
|
|
76
|
+
function equalitiesFromProofSteps(proofSteps) {
|
|
77
|
+
const start = -MAXIMUM_INDEXES_LENGTH; ///
|
|
78
|
+
|
|
79
|
+
proofSteps = proofSteps.slice(start); ///
|
|
80
|
+
|
|
81
|
+
const equalities = proofSteps.reduce((equalities, proofStep, index) => {
|
|
82
|
+
const equality = Equality.fromProofStep(proofStep);
|
|
83
|
+
|
|
84
|
+
if (equality !== null) {
|
|
85
|
+
equalities.push(equality);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return equalities;
|
|
89
|
+
}, []);
|
|
90
|
+
|
|
91
|
+
return equalities;
|
|
92
|
+
}
|
package/src/verify/term.js
CHANGED
|
@@ -141,17 +141,15 @@ function verifyNode(node, constructorNode, context) {
|
|
|
141
141
|
return nodeVerified;
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
function
|
|
145
|
-
let
|
|
144
|
+
function verifyNodes(nodes, constructorNodes, context) {
|
|
145
|
+
let nodesVerified = false;
|
|
146
146
|
|
|
147
|
-
const
|
|
148
|
-
|
|
147
|
+
const nodesLength = nodes.length,
|
|
148
|
+
constructorNodesLength = constructorNodes.length;
|
|
149
149
|
|
|
150
|
-
if (
|
|
151
|
-
|
|
152
|
-
const
|
|
153
|
-
node = childNode, ///
|
|
154
|
-
constructorNode = constructorChildNode, ///
|
|
150
|
+
if (nodesLength === constructorNodesLength) {
|
|
151
|
+
nodesVerified = nodes.every((node, index) => {
|
|
152
|
+
const constructorNode = constructorNodes[index],
|
|
155
153
|
nodeVerified = verifyNode(node, constructorNode, context);
|
|
156
154
|
|
|
157
155
|
if (nodeVerified) {
|
|
@@ -160,7 +158,7 @@ function verifyChildNodes(childNodes, constructorChildNodes, context) {
|
|
|
160
158
|
});
|
|
161
159
|
}
|
|
162
160
|
|
|
163
|
-
return
|
|
161
|
+
return nodesVerified;
|
|
164
162
|
}
|
|
165
163
|
|
|
166
164
|
function verifyTerminalNode(terminalNode, constructorTerminalNode, context) {
|
|
@@ -178,8 +176,8 @@ function verifyTerminalNode(terminalNode, constructorTerminalNode, context) {
|
|
|
178
176
|
function verifyNonTerminalNode(nonTerminalNode, constructorNonTerminalNode, context) {
|
|
179
177
|
let nonTerminalNodeVerified = false;
|
|
180
178
|
|
|
181
|
-
const ruleName = nonTerminalNode.getRuleName(),
|
|
182
|
-
constructorRuleName = constructorNonTerminalNode.getRuleName();
|
|
179
|
+
const ruleName = nonTerminalNode.getRuleName(), ///
|
|
180
|
+
constructorRuleName = constructorNonTerminalNode.getRuleName(); ///
|
|
183
181
|
|
|
184
182
|
if (ruleName === constructorRuleName) {
|
|
185
183
|
switch (ruleName) {
|
|
@@ -196,9 +194,11 @@ function verifyNonTerminalNode(nonTerminalNode, constructorNonTerminalNode, cont
|
|
|
196
194
|
default: {
|
|
197
195
|
const childNodes = nonTerminalNode.getChildNodes(),
|
|
198
196
|
constructorChildNodes = constructorNonTerminalNode.getChildNodes(),
|
|
199
|
-
|
|
197
|
+
nodes = childNodes, ///
|
|
198
|
+
constructorNodes = constructorChildNodes, ///
|
|
199
|
+
nodesVerified = verifyNodes(nodes, constructorNodes, context);
|
|
200
200
|
|
|
201
|
-
nonTerminalNodeVerified =
|
|
201
|
+
nonTerminalNodeVerified = nodesVerified; ///
|
|
202
202
|
|
|
203
203
|
break;
|
|
204
204
|
}
|