occam-verify-cli 0.0.506 → 0.0.507
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/conclusion.js +5 -160
- package/lib/consequence.js +3 -81
- package/lib/matcher/conclusion.js +194 -0
- package/lib/matcher/consequence.js +194 -0
- package/lib/matcher/premise.js +199 -0
- package/lib/matcher/supposition.js +199 -0
- package/lib/matcher.js +36 -0
- package/lib/metaMatcher/conclusion.js +194 -0
- package/lib/metaMatcher/premise.js +199 -0
- package/lib/metaMatcher.js +36 -0
- package/lib/metaSubstitution.js +7 -6
- package/lib/mixins/matcher.js +109 -0
- package/lib/premise.js +9 -178
- package/lib/ruleNames.js +5 -1
- package/lib/step/metaproof.js +5 -5
- package/lib/substitution.js +7 -6
- package/lib/supposition.js +5 -92
- package/lib/utilities/substitution.js +61 -0
- package/lib/verify/metaproof.js +3 -3
- package/lib/verify/proof.js +3 -3
- package/lib/verify/ruleProof.js +3 -3
- package/package.json +1 -1
- package/src/conclusion.js +6 -277
- package/src/consequence.js +3 -141
- package/src/matcher/conclusion.js +86 -0
- package/src/matcher/consequence.js +89 -0
- package/src/matcher/premise.js +94 -0
- package/src/matcher/supposition.js +97 -0
- package/src/matcher.js +9 -0
- package/src/metaMatcher/conclusion.js +86 -0
- package/src/metaMatcher/premise.js +94 -0
- package/src/metaMatcher.js +9 -0
- package/src/metaSubstitution.js +4 -3
- package/src/mixins/matcher.js +81 -0
- package/src/premise.js +10 -298
- package/src/ruleNames.js +1 -0
- package/src/step/metaproof.js +1 -1
- package/src/substitution.js +3 -2
- package/src/supposition.js +12 -159
- package/src/utilities/{node.js → substitution.js} +4 -74
- package/src/verify/metaproof.js +2 -2
- package/src/verify/proof.js +2 -2
- package/src/verify/ruleProof.js +2 -2
- package/lib/metaSupposition.js +0 -167
- package/lib/utilities/node.js +0 -106
- package/lib/verify/metaSupposition.js +0 -41
- package/src/metaSupposition.js +0 -196
- package/src/verify/metaSupposition.js +0 -44
package/src/premise.js
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import Substitution from "./substitution";
|
|
4
|
-
import MetaSubstitution from "./metaSubstitution";
|
|
5
|
-
|
|
6
|
-
import { first } from "./utilities/array";
|
|
7
3
|
import { nodeAsString } from "./utilities/string";
|
|
4
|
+
import { premiseMatcher } from "./matcher/premise";
|
|
5
|
+
import { premiseMetaMatcher } from "./metaMatcher/premise";
|
|
8
6
|
import { nodeQuery, nodesQuery } from "./utilities/query";
|
|
9
|
-
import { metavariableNameFromMetavariableNode } from "./utilities/query";
|
|
10
7
|
import { metastatementNodeFromMetastatementString } from "./utilities/string";
|
|
11
|
-
import { STATEMENT_RULE_NAME, METAVARIABLE_RULE_NAME, METASTATEMENT_RULE_NAME } from "./ruleNames";
|
|
12
8
|
|
|
13
9
|
const metastatementNodesQuery = nodesQuery("/ruleSubproofAssertion/metastatement"),
|
|
14
10
|
ruleSubproofAssertionNodeQuery = nodeQuery("/metastatement/ruleSubproofAssertion!"),
|
|
@@ -47,9 +43,9 @@ export default class Premise {
|
|
|
47
43
|
const statementNode = statementNodes[index],
|
|
48
44
|
nonTerminalNode = statementNode, ///
|
|
49
45
|
premiseNonTerminalNode = ruleSubproofAssertionMetastatementNode, ///
|
|
50
|
-
|
|
46
|
+
nonTerminalNodeMatches = premiseMatcher.matchNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, substitutions);
|
|
51
47
|
|
|
52
|
-
if (
|
|
48
|
+
if (nonTerminalNodeMatches) {
|
|
53
49
|
return true;
|
|
54
50
|
}
|
|
55
51
|
});
|
|
@@ -62,8 +58,8 @@ export default class Premise {
|
|
|
62
58
|
matchStatementNode(statementNode, substitutions) {
|
|
63
59
|
const nonTerminalNode = statementNode, ///
|
|
64
60
|
premiseNonTerminalNode = this.metastatementNode, ///
|
|
65
|
-
|
|
66
|
-
statementNodeMatches =
|
|
61
|
+
nonTerminalNodeMatches = premiseMatcher.matchNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, substitutions),
|
|
62
|
+
statementNodeMatches = nonTerminalNodeMatches; ///
|
|
67
63
|
|
|
68
64
|
return statementNodeMatches;
|
|
69
65
|
}
|
|
@@ -89,9 +85,9 @@ export default class Premise {
|
|
|
89
85
|
const metastatementNode = metastatementNodes[index],
|
|
90
86
|
nonTerminalNode = metastatementNode, ///
|
|
91
87
|
premiseNonTerminalNode = ruleSubproofAssertionMetastatementNode, ///
|
|
92
|
-
|
|
88
|
+
nonTerminalNodeMatches = premiseMetaMatcher.matchNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions);
|
|
93
89
|
|
|
94
|
-
if (
|
|
90
|
+
if (nonTerminalNodeMatches) {
|
|
95
91
|
return true;
|
|
96
92
|
}
|
|
97
93
|
});
|
|
@@ -104,8 +100,8 @@ export default class Premise {
|
|
|
104
100
|
matchMetastatementNode(metastatementNode, metaSubstitutions) {
|
|
105
101
|
const nonTerminalNode = metastatementNode, ///
|
|
106
102
|
premiseNonTerminalNode = this.metastatementNode, ///
|
|
107
|
-
|
|
108
|
-
metastatementNodeMatches =
|
|
103
|
+
nonTerminalNodeMatches = premiseMetaMatcher.matchNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions),
|
|
104
|
+
metastatementNodeMatches = nonTerminalNodeMatches; ///
|
|
109
105
|
|
|
110
106
|
return metastatementNodeMatches;
|
|
111
107
|
}
|
|
@@ -135,287 +131,3 @@ export default class Premise {
|
|
|
135
131
|
return premise;
|
|
136
132
|
}
|
|
137
133
|
}
|
|
138
|
-
|
|
139
|
-
function matchPremiseNode(premiseNode, node, substitutions) {
|
|
140
|
-
let premiseNodeMatches = false;
|
|
141
|
-
|
|
142
|
-
const nodeTerminalNode = node.isTerminalNode(),
|
|
143
|
-
ruleNodeTerminalNode = premiseNode.isTerminalNode();
|
|
144
|
-
|
|
145
|
-
if (nodeTerminalNode === ruleNodeTerminalNode) {
|
|
146
|
-
if (nodeTerminalNode) {
|
|
147
|
-
const terminalNode = node, ///
|
|
148
|
-
premiseTerminalNode = premiseNode, ///
|
|
149
|
-
premiseTerminalNodeMatches = matchPremiseTerminalNode(premiseTerminalNode, terminalNode, substitutions);
|
|
150
|
-
|
|
151
|
-
premiseNodeMatches = premiseTerminalNodeMatches; ///
|
|
152
|
-
} else {
|
|
153
|
-
const nonTerminalNode = node, ///
|
|
154
|
-
premiseNonTerminalNode = premiseNode, ///
|
|
155
|
-
premiseNonTerminalNodeMatches = matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, substitutions);
|
|
156
|
-
|
|
157
|
-
premiseNodeMatches = premiseNonTerminalNodeMatches; ///
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
return premiseNodeMatches;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
function matchPremiseNodes(premiseNodes, nodes, substitutions) {
|
|
165
|
-
let premiseNodesMatches = false;
|
|
166
|
-
|
|
167
|
-
const nodesLength = nodes.length,
|
|
168
|
-
premiseNodesLength = premiseNodes.length;
|
|
169
|
-
|
|
170
|
-
if (nodesLength === premiseNodesLength) {
|
|
171
|
-
premiseNodesMatches = nodes.every((node, index) => {
|
|
172
|
-
const premiseNode = premiseNodes[index],
|
|
173
|
-
premiseNodeMatches = matchPremiseNode(premiseNode, node, substitutions);
|
|
174
|
-
|
|
175
|
-
if (premiseNodeMatches) {
|
|
176
|
-
return true;
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
return premiseNodesMatches;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
function matchPremiseTerminalNode(premiseTerminalNode, terminalNode, substitutions) {
|
|
185
|
-
const matches = premiseTerminalNode.match(terminalNode),
|
|
186
|
-
premiseTerminalNodeMatches = matches;
|
|
187
|
-
|
|
188
|
-
return premiseTerminalNodeMatches;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
function matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, substitutions) {
|
|
192
|
-
let premiseNonTerminalNodeMatches = false;
|
|
193
|
-
|
|
194
|
-
const ruleName = nonTerminalNode.getRuleName(),
|
|
195
|
-
childNodes = nonTerminalNode.getChildNodes(),
|
|
196
|
-
premiseNonTerminalNodeRuleName = premiseNonTerminalNode.getRuleName(),
|
|
197
|
-
premiseNonTerminalNodeChildNodes = premiseNonTerminalNode.getChildNodes(),
|
|
198
|
-
nodes = childNodes, ///
|
|
199
|
-
premiseNodes = premiseNonTerminalNodeChildNodes, ///
|
|
200
|
-
ruleNameStatementRuleName = (ruleName === STATEMENT_RULE_NAME),
|
|
201
|
-
premiseNonTerminalNodeRuleNameMetastatementRuleName = (premiseNonTerminalNodeRuleName === METASTATEMENT_RULE_NAME);
|
|
202
|
-
|
|
203
|
-
if (ruleNameStatementRuleName && premiseNonTerminalNodeRuleNameMetastatementRuleName) {
|
|
204
|
-
const statementNode = nonTerminalNode, ///
|
|
205
|
-
premiseMetastatementNode = premiseNonTerminalNode, ///
|
|
206
|
-
premiseMetastatementNodeMatches = matchPremiseMetastatementNode(premiseMetastatementNode, statementNode, substitutions);
|
|
207
|
-
|
|
208
|
-
if (premiseMetastatementNodeMatches) {
|
|
209
|
-
premiseNonTerminalNodeMatches = true;
|
|
210
|
-
} else {
|
|
211
|
-
const premiseNonTerminalNodeChildNodesMatches = matchPremiseNodes(premiseNodes, nodes, substitutions);
|
|
212
|
-
|
|
213
|
-
premiseNonTerminalNodeMatches = premiseNonTerminalNodeChildNodesMatches; ///
|
|
214
|
-
}
|
|
215
|
-
} else if (ruleName === premiseNonTerminalNodeRuleName) {
|
|
216
|
-
const premiseNonTerminalNodeChildNodesMatches = matchPremiseNodes(premiseNodes, nodes, substitutions);
|
|
217
|
-
|
|
218
|
-
premiseNonTerminalNodeMatches = premiseNonTerminalNodeChildNodesMatches; ///
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
return premiseNonTerminalNodeMatches;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
function matchPremiseMetavariableNode(premiseMetavariableNode, statementNode, substitutions) {
|
|
225
|
-
let premiseMetavariableNodeMatches;
|
|
226
|
-
|
|
227
|
-
const premiseMetavariableName = metavariableNameFromMetavariableNode(premiseMetavariableNode),
|
|
228
|
-
substitution = substitutions.find((substitution) => {
|
|
229
|
-
const metavariableName = substitution.getMetavariableName();
|
|
230
|
-
|
|
231
|
-
if (metavariableName === premiseMetavariableName) {
|
|
232
|
-
return true;
|
|
233
|
-
}
|
|
234
|
-
}) || null;
|
|
235
|
-
|
|
236
|
-
if (substitution !== null) {
|
|
237
|
-
const substitutionNodesMatch = substitution.matchStatementNode(statementNode);
|
|
238
|
-
|
|
239
|
-
premiseMetavariableNodeMatches = substitutionNodesMatch; ///
|
|
240
|
-
} else {
|
|
241
|
-
const metavariableName = premiseMetavariableName, ///
|
|
242
|
-
substitution = Substitution.fromMetavariableNameAndStatementNode(metavariableName, statementNode);
|
|
243
|
-
|
|
244
|
-
substitutions.push(substitution);
|
|
245
|
-
|
|
246
|
-
premiseMetavariableNodeMatches = true;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
return premiseMetavariableNodeMatches;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
function matchPremiseMetastatementNode(premiseMetastatementNode, statementNode, substitutions) {
|
|
253
|
-
let premiseMetastatementNodeMatches = false;
|
|
254
|
-
|
|
255
|
-
const premiseNonTerminalNode = premiseMetastatementNode, ///
|
|
256
|
-
premiseNonTerminalNodeChildNodes = premiseNonTerminalNode.getChildNodes(),
|
|
257
|
-
premiseNonTerminalNodeChildNodesLength = premiseNonTerminalNodeChildNodes.length;
|
|
258
|
-
|
|
259
|
-
if (premiseNonTerminalNodeChildNodesLength === 1) {
|
|
260
|
-
const firstPremiseChildNode = first(premiseNonTerminalNodeChildNodes),
|
|
261
|
-
premiseChildNode = firstPremiseChildNode, ///
|
|
262
|
-
premiseChildNodeNonTerminalNode = premiseChildNode.isNonTerminalNode();
|
|
263
|
-
|
|
264
|
-
if (premiseChildNodeNonTerminalNode) {
|
|
265
|
-
const premiseNonTerminalChildNode = premiseChildNode, ///
|
|
266
|
-
premiseNonTerminalChildNodeRuleName = premiseNonTerminalChildNode.getRuleName(),
|
|
267
|
-
premiseNonTerminalChildNodeRuleNameMetavariableRuleName = (premiseNonTerminalChildNodeRuleName === METAVARIABLE_RULE_NAME);
|
|
268
|
-
|
|
269
|
-
if (premiseNonTerminalChildNodeRuleNameMetavariableRuleName) {
|
|
270
|
-
const premiseMetavariableNode = premiseNonTerminalChildNode, ///
|
|
271
|
-
premiseMetaVariableNodeMatches = matchPremiseMetavariableNode(premiseMetavariableNode, statementNode, substitutions);
|
|
272
|
-
|
|
273
|
-
premiseMetastatementNodeMatches = premiseMetaVariableNodeMatches; ///
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
return premiseMetastatementNodeMatches;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
function metaMatchPremiseNode(premiseNode, node, metaSubstitutions) {
|
|
282
|
-
let premiseNodeMatches = false;
|
|
283
|
-
|
|
284
|
-
const nodeTerminalNode = node.isTerminalNode(),
|
|
285
|
-
ruleNodeTerminalNode = premiseNode.isTerminalNode();
|
|
286
|
-
|
|
287
|
-
if (nodeTerminalNode === ruleNodeTerminalNode) {
|
|
288
|
-
if (nodeTerminalNode) {
|
|
289
|
-
const terminalNode = node, ///
|
|
290
|
-
premiseTerminalNode = premiseNode, ///
|
|
291
|
-
premiseTerminalNodeMatches = metaMatchPremiseTerminalNode(premiseTerminalNode, terminalNode, metaSubstitutions);
|
|
292
|
-
|
|
293
|
-
premiseNodeMatches = premiseTerminalNodeMatches; ///
|
|
294
|
-
} else {
|
|
295
|
-
const nonTerminalNode = node, ///
|
|
296
|
-
premiseNonTerminalNode = premiseNode, ///
|
|
297
|
-
premiseNonTerminalNodeMatches = metaMatchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions);
|
|
298
|
-
|
|
299
|
-
premiseNodeMatches = premiseNonTerminalNodeMatches; ///
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
return premiseNodeMatches;
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
function metaMatchPremiseNodes(premiseNodes, nodes, metaSubstitutions) {
|
|
307
|
-
let premiseNodesMatches = false;
|
|
308
|
-
|
|
309
|
-
const nodesLength = nodes.length,
|
|
310
|
-
premiseNodesLength = premiseNodes.length;
|
|
311
|
-
|
|
312
|
-
if (nodesLength === premiseNodesLength) {
|
|
313
|
-
premiseNodesMatches = nodes.every((node, index) => {
|
|
314
|
-
const premiseNode = premiseNodes[index],
|
|
315
|
-
premiseNodeMatches = metaMatchPremiseNode(premiseNode, node, metaSubstitutions);
|
|
316
|
-
|
|
317
|
-
if (premiseNodeMatches) {
|
|
318
|
-
return true;
|
|
319
|
-
}
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
return premiseNodesMatches;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
function metaMatchPremiseTerminalNode(premiseTerminalNode, terminalNode, metaSubstitutions) {
|
|
327
|
-
const matches = premiseTerminalNode.match(terminalNode),
|
|
328
|
-
premiseTerminalNodeMatches = matches;
|
|
329
|
-
|
|
330
|
-
return premiseTerminalNodeMatches;
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
function metaMatchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions) {
|
|
334
|
-
let premiseNonTerminalNodeMatches = false;
|
|
335
|
-
|
|
336
|
-
const ruleName = nonTerminalNode.getRuleName(),
|
|
337
|
-
childNodes = nonTerminalNode.getChildNodes(),
|
|
338
|
-
premiseNonTerminalNodeRuleName = premiseNonTerminalNode.getRuleName(),
|
|
339
|
-
premiseNonTerminalNodeChildNodes = premiseNonTerminalNode.getChildNodes(),
|
|
340
|
-
nodes = childNodes, ///
|
|
341
|
-
premiseNodes = premiseNonTerminalNodeChildNodes, ///
|
|
342
|
-
ruleNameMetastatementRuleName = (ruleName === METASTATEMENT_RULE_NAME),
|
|
343
|
-
premiseNonTerminalNodeRuleNameMetastatementRuleName = (premiseNonTerminalNodeRuleName === METASTATEMENT_RULE_NAME);
|
|
344
|
-
|
|
345
|
-
if (ruleNameMetastatementRuleName && premiseNonTerminalNodeRuleNameMetastatementRuleName) {
|
|
346
|
-
const metastatementNode = nonTerminalNode, ///
|
|
347
|
-
premiseMetastatementNode = premiseNonTerminalNode, ///
|
|
348
|
-
premiseMetastatementNodeMatches = metaMatchPremiseMetastatementNode(premiseMetastatementNode, metastatementNode, metaSubstitutions);
|
|
349
|
-
|
|
350
|
-
if (premiseMetastatementNodeMatches) {
|
|
351
|
-
premiseNonTerminalNodeMatches = true;
|
|
352
|
-
} else {
|
|
353
|
-
const premiseNonTerminalNodeChildNodesMatches = metaMatchPremiseNodes(premiseNodes, nodes, metaSubstitutions);
|
|
354
|
-
|
|
355
|
-
premiseNonTerminalNodeMatches = premiseNonTerminalNodeChildNodesMatches; ///
|
|
356
|
-
}
|
|
357
|
-
} else if (ruleName === premiseNonTerminalNodeRuleName) {
|
|
358
|
-
const premiseNonTerminalNodeChildNodesMatches = metaMatchPremiseNodes(premiseNodes, nodes, metaSubstitutions);
|
|
359
|
-
|
|
360
|
-
premiseNonTerminalNodeMatches = premiseNonTerminalNodeChildNodesMatches; ///
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
return premiseNonTerminalNodeMatches;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
function metaMatchPremiseMetavariableNode(premiseMetavariableNode, metastatementNode, metaSubstitutions) {
|
|
367
|
-
let premiseMetavariableNodeMatches;
|
|
368
|
-
|
|
369
|
-
const premiseMetavariableName = metavariableNameFromMetavariableNode(premiseMetavariableNode),
|
|
370
|
-
metaSubstitution = metaSubstitutions.find((metaSubstitution) => {
|
|
371
|
-
const metavariableName = metaSubstitution.getMetavariableName();
|
|
372
|
-
|
|
373
|
-
if (metavariableName === premiseMetavariableName) {
|
|
374
|
-
return true;
|
|
375
|
-
}
|
|
376
|
-
}) || null;
|
|
377
|
-
|
|
378
|
-
if (metaSubstitution !== null) {
|
|
379
|
-
const metaSubstitutionNodesMatch = metaSubstitution.matchMetastatementNode(metastatementNode);
|
|
380
|
-
|
|
381
|
-
premiseMetavariableNodeMatches = metaSubstitutionNodesMatch; ///
|
|
382
|
-
} else {
|
|
383
|
-
const metavariableName = premiseMetavariableName, ///
|
|
384
|
-
metaSubstitution = MetaSubstitution.fromMetavariableNameAndMetastatementNode(metavariableName, metastatementNode);
|
|
385
|
-
|
|
386
|
-
metaSubstitutions.push(metaSubstitution);
|
|
387
|
-
|
|
388
|
-
premiseMetavariableNodeMatches = true;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
return premiseMetavariableNodeMatches;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
function metaMatchPremiseMetastatementNode(premiseMetastatementNode, metastatementNode, metaSubstitutions) {
|
|
395
|
-
let premiseMetastatementNodeMatches = false;
|
|
396
|
-
|
|
397
|
-
const premiseNonTerminalNode = premiseMetastatementNode, ///
|
|
398
|
-
premiseNonTerminalNodeChildNodes = premiseNonTerminalNode.getChildNodes(),
|
|
399
|
-
premiseNonTerminalNodeChildNodesLength = premiseNonTerminalNodeChildNodes.length;
|
|
400
|
-
|
|
401
|
-
if (premiseNonTerminalNodeChildNodesLength === 1) {
|
|
402
|
-
const firstPremiseChildNode = first(premiseNonTerminalNodeChildNodes),
|
|
403
|
-
premiseChildNode = firstPremiseChildNode, ///
|
|
404
|
-
premiseChildNodeNonTerminalNode = premiseChildNode.isNonTerminalNode();
|
|
405
|
-
|
|
406
|
-
if (premiseChildNodeNonTerminalNode) {
|
|
407
|
-
const premiseNonTerminalChildNode = premiseChildNode, ///
|
|
408
|
-
premiseNonTerminalChildNodeRuleName = premiseNonTerminalChildNode.getRuleName(),
|
|
409
|
-
premiseNonTerminalChildNodeRuleNameMetavariableRuleName = (premiseNonTerminalChildNodeRuleName === METAVARIABLE_RULE_NAME);
|
|
410
|
-
|
|
411
|
-
if (premiseNonTerminalChildNodeRuleNameMetavariableRuleName) {
|
|
412
|
-
const premiseMetavariableNode = premiseNonTerminalChildNode, ///
|
|
413
|
-
premiseMetaVariableNodeMatches = metaMatchPremiseMetavariableNode(premiseMetavariableNode, metastatementNode, metaSubstitutions);
|
|
414
|
-
|
|
415
|
-
premiseMetastatementNodeMatches = premiseMetaVariableNodeMatches; ///
|
|
416
|
-
}
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
return premiseMetastatementNodeMatches;
|
|
421
|
-
}
|
package/src/ruleNames.js
CHANGED
|
@@ -5,6 +5,7 @@ export const TYPE_RULE_NAME = "type";
|
|
|
5
5
|
export const LABEL_RULE_NAME = "label";
|
|
6
6
|
export const ARGUMENT_RULE_NAME = "argument";
|
|
7
7
|
export const SUBPROOF_RULE_NAME = "subproof";
|
|
8
|
+
export const VARIABLE_RULE_NAME = "variable";
|
|
8
9
|
export const STATEMENT_RULE_NAME = "statement";
|
|
9
10
|
export const METAVARIABLE_RULE_NAME = "metavariable";
|
|
10
11
|
export const METASTATEMENT_RULE_NAME = "metastatement";
|
package/src/step/metaproof.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { first, second } from "../utilities/array";
|
|
4
4
|
import { nodeQuery, nodesQuery } from "../utilities/query";
|
|
5
|
-
import { matchBracketedNonTerminalNode } from "../utilities/
|
|
5
|
+
import { matchBracketedNonTerminalNode } from "../utilities/substitution";
|
|
6
6
|
|
|
7
7
|
const metastatementNodesQuery = nodesQuery("/ruleSubproofAssertion/metastatement"),
|
|
8
8
|
ruleSubproofAssertionNodeQuery = nodeQuery("/metastatement/ruleSubproofAssertion"),
|
package/src/substitution.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import { matcher } from "./matcher";
|
|
3
4
|
import { STATEMENT_RULE_NAME } from "./ruleNames";
|
|
4
|
-
import {
|
|
5
|
+
import { bracketedNonTerminalChildNodeFromChildNodes } from "./utilities/substitution";
|
|
5
6
|
|
|
6
7
|
export default class Substitution {
|
|
7
8
|
constructor(metavariableName, statementNode) {
|
|
@@ -22,7 +23,7 @@ export default class Substitution {
|
|
|
22
23
|
|
|
23
24
|
const nodeA = this.statementNode, ///
|
|
24
25
|
nodeB = statementNode,
|
|
25
|
-
nodeMatches = matchNode(nodeA, nodeB);
|
|
26
|
+
nodeMatches = matcher.matchNode(nodeA, nodeB);
|
|
26
27
|
|
|
27
28
|
matchesStatementNode = nodeMatches; ///
|
|
28
29
|
|
package/src/supposition.js
CHANGED
|
@@ -1,13 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import Substitution from "./substitution";
|
|
4
|
-
|
|
5
|
-
import { first } from "./utilities/array";
|
|
6
3
|
import { nodeAsString } from "./utilities/string";
|
|
4
|
+
import { suppositionMatcher } from "./matcher/supposition";
|
|
7
5
|
import { nodeQuery, nodesQuery } from "./utilities/query";
|
|
8
|
-
import { variableNameFromVariableNode } from "./utilities/query";
|
|
9
6
|
import { statementNodeFromStatementString } from "./utilities/string";
|
|
10
|
-
import { VARIABLE_RULE_NAME, STATEMENT_RULE_NAME } from "./ruleNames";
|
|
11
7
|
|
|
12
8
|
const statementNodesQuery = nodesQuery("/subproofAssertion/statement"),
|
|
13
9
|
subproofAssertionNodeQuery = nodeQuery("/statement/subproofAssertion!"),
|
|
@@ -41,15 +37,15 @@ export default class Supposition {
|
|
|
41
37
|
|
|
42
38
|
if (statementNodesLength === subproofAssertionStatementNodesLength) {
|
|
43
39
|
subproofNodeMatches = subproofAssertionStatementNodes.every((subproofAssertionStatementNode, index) => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
40
|
+
const statementNode = statementNodes[index],
|
|
41
|
+
nonTerminalNode = statementNode, ///
|
|
42
|
+
suppositionNonTerminalNode = subproofAssertionStatementNode, ///
|
|
43
|
+
nonTerminalNodeMatches = suppositionMatcher.matchNonTerminalNode(suppositionNonTerminalNode, nonTerminalNode, substitutions);
|
|
44
|
+
|
|
45
|
+
if (nonTerminalNodeMatches) {
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
53
49
|
}
|
|
54
50
|
}
|
|
55
51
|
|
|
@@ -59,8 +55,8 @@ export default class Supposition {
|
|
|
59
55
|
matchStatementNode(statementNode, substitutions) {
|
|
60
56
|
const nonTerminalNode = statementNode, ///
|
|
61
57
|
suppositionNonTerminalNode = this.statementNode, ///
|
|
62
|
-
|
|
63
|
-
statementNodeMatches =
|
|
58
|
+
nonTerminalNodeMatches = suppositionMatcher.matchNonTerminalNode(suppositionNonTerminalNode, nonTerminalNode, substitutions),
|
|
59
|
+
statementNodeMatches = nonTerminalNodeMatches; ///
|
|
64
60
|
|
|
65
61
|
return statementNodeMatches;
|
|
66
62
|
}
|
|
@@ -90,146 +86,3 @@ export default class Supposition {
|
|
|
90
86
|
return supposition;
|
|
91
87
|
}
|
|
92
88
|
}
|
|
93
|
-
|
|
94
|
-
function matchSuppositionNode(suppositionNode, node, substitutions) {
|
|
95
|
-
let suppositionNodeMatches = false;
|
|
96
|
-
|
|
97
|
-
const nodeTerminalNode = node.isTerminalNode(),
|
|
98
|
-
ruleNodeTerminalNode = suppositionNode.isTerminalNode();
|
|
99
|
-
|
|
100
|
-
if (nodeTerminalNode === ruleNodeTerminalNode) {
|
|
101
|
-
if (nodeTerminalNode) {
|
|
102
|
-
const terminalNode = node, ///
|
|
103
|
-
suppositionTerminalNode = suppositionNode, ///
|
|
104
|
-
suppositionTerminalNodeMatches = matchSuppositionTerminalNode(suppositionTerminalNode, terminalNode, substitutions);
|
|
105
|
-
|
|
106
|
-
suppositionNodeMatches = suppositionTerminalNodeMatches; ///
|
|
107
|
-
} else {
|
|
108
|
-
const nonTerminalNode = node, ///
|
|
109
|
-
suppositionNonTerminalNode = suppositionNode, ///
|
|
110
|
-
suppositionNonTerminalNodeMatches = matchSuppositionNonTerminalNode(suppositionNonTerminalNode, nonTerminalNode, substitutions);
|
|
111
|
-
|
|
112
|
-
suppositionNodeMatches = suppositionNonTerminalNodeMatches; ///
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
return suppositionNodeMatches;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
function matchSuppositionNodes(suppositionNodes, nodes, substitutions) {
|
|
120
|
-
let suppositionNodesMatches = false;
|
|
121
|
-
|
|
122
|
-
const nodesLength = nodes.length,
|
|
123
|
-
suppositionNodesLength = suppositionNodes.length;
|
|
124
|
-
|
|
125
|
-
if (nodesLength === suppositionNodesLength) {
|
|
126
|
-
suppositionNodesMatches = nodes.every((node, index) => {
|
|
127
|
-
const suppositionNode = suppositionNodes[index],
|
|
128
|
-
suppositionNodeMatches = matchSuppositionNode(suppositionNode, node, substitutions);
|
|
129
|
-
|
|
130
|
-
if (suppositionNodeMatches) {
|
|
131
|
-
return true;
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return suppositionNodesMatches;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function matchSuppositionVariable(suppositionVariableNode, nodes, substitutions) {
|
|
140
|
-
let suppositionVariableMatches;
|
|
141
|
-
|
|
142
|
-
const suppositionVariableName = variableNameFromVariableNode(suppositionVariableNode),
|
|
143
|
-
substitution = substitutions.find((substitution) => {
|
|
144
|
-
const variableName = substitution.getVariableName();
|
|
145
|
-
|
|
146
|
-
if (variableName === suppositionVariableName) {
|
|
147
|
-
return true;
|
|
148
|
-
}
|
|
149
|
-
}) || null;
|
|
150
|
-
|
|
151
|
-
if (substitution !== null) {
|
|
152
|
-
const substitutionNodesMatch = substitution.matchNodes(nodes);
|
|
153
|
-
|
|
154
|
-
suppositionVariableMatches = substitutionNodesMatch; ///
|
|
155
|
-
} else {
|
|
156
|
-
const variableName = suppositionVariableName, ///
|
|
157
|
-
substitution = Substitution.fromVariableNameAndNodes(variableName, nodes);
|
|
158
|
-
|
|
159
|
-
substitutions.push(substitution);
|
|
160
|
-
|
|
161
|
-
suppositionVariableMatches = true;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
return suppositionVariableMatches;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
function matchSuppositionTerminalNode(suppositionTerminalNode, terminalNode, substitutions) {
|
|
168
|
-
const matches = suppositionTerminalNode.match(terminalNode),
|
|
169
|
-
suppositionTerminalNodeMatches = matches;
|
|
170
|
-
|
|
171
|
-
return suppositionTerminalNodeMatches;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
function matchSuppositionNonTerminalNode(suppositionNonTerminalNode, nonTerminalNode, substitutions) {
|
|
175
|
-
let suppositionNonTerminalNodeMatches = false;
|
|
176
|
-
|
|
177
|
-
const ruleName = nonTerminalNode.getRuleName(),
|
|
178
|
-
suppositionRuleName = suppositionNonTerminalNode.getRuleName(); ///
|
|
179
|
-
|
|
180
|
-
if (ruleName === suppositionRuleName) {
|
|
181
|
-
const childNodes = nonTerminalNode.getChildNodes(),
|
|
182
|
-
suppositionChildNodes = suppositionNonTerminalNode.getChildNodes(),
|
|
183
|
-
nodes = childNodes, ///
|
|
184
|
-
suppositionNodes = suppositionChildNodes, ///
|
|
185
|
-
suppositionChildNodesMatches = matchSuppositionNodes(suppositionNodes, nodes, substitutions);
|
|
186
|
-
|
|
187
|
-
suppositionNonTerminalNodeMatches = suppositionChildNodesMatches; ///
|
|
188
|
-
|
|
189
|
-
if (!suppositionNonTerminalNodeMatches) {
|
|
190
|
-
const ruleNameStatementRuleName = (ruleName === STATEMENT_RULE_NAME);
|
|
191
|
-
|
|
192
|
-
if (ruleNameStatementRuleName) {
|
|
193
|
-
const statementNode = nonTerminalNode, ///
|
|
194
|
-
suppositionStatementNode = suppositionNonTerminalNode, ///
|
|
195
|
-
suppositionStatementNodeMatches = matchSuppositionStatementNode(suppositionStatementNode, statementNode, substitutions);
|
|
196
|
-
|
|
197
|
-
suppositionNonTerminalNodeMatches = suppositionStatementNodeMatches; ///
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
return suppositionNonTerminalNodeMatches;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
function matchSuppositionStatementNode(suppositionStatementNode, statementNode, substitutions) {
|
|
206
|
-
let suppositionStatementNodeMatches = false;
|
|
207
|
-
|
|
208
|
-
const suppositionNonTerminalNode = suppositionStatementNode, ///
|
|
209
|
-
suppositionChildNodes = suppositionNonTerminalNode.getChildNodes(),
|
|
210
|
-
suppositionChildNodesLength = suppositionChildNodes.length;
|
|
211
|
-
|
|
212
|
-
if (suppositionChildNodesLength === 1) {
|
|
213
|
-
const firstSuppositionChildNode = first(suppositionChildNodes),
|
|
214
|
-
suppositionChildNode = firstSuppositionChildNode, ///
|
|
215
|
-
suppositionChildNodeNonTerminalNode = suppositionChildNode.isNonTerminalNode();
|
|
216
|
-
|
|
217
|
-
if (suppositionChildNodeNonTerminalNode) {
|
|
218
|
-
const suppositionNonTerminalChildNode = suppositionChildNode, ///
|
|
219
|
-
suppositionNonTerminalChildNodeRuleName = suppositionNonTerminalChildNode.getRuleName(),
|
|
220
|
-
suppositionNonTerminalChildNodeRuleNameVariableRuleName = (suppositionNonTerminalChildNodeRuleName === VARIABLE_RULE_NAME);
|
|
221
|
-
|
|
222
|
-
if (suppositionNonTerminalChildNodeRuleNameVariableRuleName) {
|
|
223
|
-
const suppositionVariableNode = suppositionNonTerminalChildNode, ///
|
|
224
|
-
nonTerminalNode = statementNode, ///
|
|
225
|
-
childNodes = nonTerminalNode.getChildNodes(),
|
|
226
|
-
nodes = childNodes, ///
|
|
227
|
-
suppositionVariableMatches = matchSuppositionVariable(suppositionVariableNode, nodes, substitutions);
|
|
228
|
-
|
|
229
|
-
suppositionStatementNodeMatches = suppositionVariableMatches; ///
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
return suppositionStatementNodeMatches;
|
|
235
|
-
}
|
|
@@ -1,59 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { matcher } from "../matcher";
|
|
4
|
+
import { first, second, third } from "../utilities/array";
|
|
4
5
|
import { METASTATEMENT_RULE_NAME } from "../ruleNames";
|
|
5
6
|
import { BRACKETED_CHILD_NODES_LENGTH, LEFT_BRACKET, RIGHT_BRACKET } from "../constants";
|
|
6
7
|
|
|
7
|
-
export function matchNode(nodeA, nodeB) {
|
|
8
|
-
let nodeMatches = false;
|
|
9
|
-
|
|
10
|
-
const nodeATerminalNode = nodeA.isTerminalNode(),
|
|
11
|
-
nodeBTerminalNode = nodeB.isTerminalNode();
|
|
12
|
-
|
|
13
|
-
if (nodeATerminalNode === nodeBTerminalNode) {
|
|
14
|
-
if (nodeATerminalNode) {
|
|
15
|
-
const terminalNodeA = nodeA, ///
|
|
16
|
-
terminalNodeB = nodeB, ///
|
|
17
|
-
terminalNodeMatches = matchTerminalNode(terminalNodeA, terminalNodeB);
|
|
18
|
-
|
|
19
|
-
nodeMatches = terminalNodeMatches; ///
|
|
20
|
-
} else {
|
|
21
|
-
const nonTerminalNodeA = nodeA, ///
|
|
22
|
-
nonTerminalNodeB = nodeB, ///
|
|
23
|
-
nonTerminalNodeMatches = matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB);
|
|
24
|
-
|
|
25
|
-
nodeMatches = nonTerminalNodeMatches; ///
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return nodeMatches;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function matchNodes(nodesA, nodesB) {
|
|
33
|
-
let nodesMatch = false;
|
|
34
|
-
|
|
35
|
-
const nodesALength = nodesA.length,
|
|
36
|
-
nodesBLength = nodesB.length;
|
|
37
|
-
|
|
38
|
-
if (nodesALength === nodesBLength) {
|
|
39
|
-
nodesMatch = nodesA.every((nodeA, index) => {
|
|
40
|
-
const nodeB = nodesB[index],
|
|
41
|
-
nodeMatches = matchNode(nodeA, nodeB);
|
|
42
|
-
|
|
43
|
-
if (nodeMatches) {
|
|
44
|
-
return true;
|
|
45
|
-
}
|
|
46
|
-
})
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return nodesMatch;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
8
|
export function matchBracketedNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB) {
|
|
53
9
|
let bracketedNodeMatches = false;
|
|
54
10
|
|
|
55
11
|
if (!bracketedNodeMatches) {
|
|
56
|
-
const nonTerminalNodeMatches = matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB);
|
|
12
|
+
const nonTerminalNodeMatches = matcher.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB);
|
|
57
13
|
|
|
58
14
|
bracketedNodeMatches = nonTerminalNodeMatches; ///
|
|
59
15
|
}
|
|
@@ -66,7 +22,7 @@ export function matchBracketedNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB
|
|
|
66
22
|
if (bracketedNonTerminalChildNodeA !== null) {
|
|
67
23
|
const nodeA = bracketedNonTerminalChildNodeA, ///
|
|
68
24
|
nodeB = nonTerminalNodeB, ///
|
|
69
|
-
nodeMatches = matchNode(nodeA, nodeB);
|
|
25
|
+
nodeMatches = matcher.matchNode(nodeA, nodeB);
|
|
70
26
|
|
|
71
27
|
bracketedNodeMatches = nodeMatches; ///
|
|
72
28
|
}
|
|
@@ -121,29 +77,3 @@ export function bracketedNonTerminalChildNodeFromChildNodes(childNodes, ruleName
|
|
|
121
77
|
|
|
122
78
|
return bracketedNonTerminalChildNode;
|
|
123
79
|
}
|
|
124
|
-
|
|
125
|
-
function matchTerminalNode(terminalNodeA, terminalNodeB) {
|
|
126
|
-
const matches = terminalNodeA.match(terminalNodeB),
|
|
127
|
-
terminalNodeMatches = matches; ///
|
|
128
|
-
|
|
129
|
-
return terminalNodeMatches;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB) {
|
|
133
|
-
let nonTerminalNodeMatches = false;
|
|
134
|
-
|
|
135
|
-
const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(), ///
|
|
136
|
-
nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName(); ///
|
|
137
|
-
|
|
138
|
-
if (nonTerminalNodeARuleName === nonTerminalNodeBRuleName) {
|
|
139
|
-
const nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
|
|
140
|
-
nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
|
|
141
|
-
nodesA = nonTerminalNodeAChildNodes, ///
|
|
142
|
-
nodesB = nonTerminalNodeBChildNodes, ///
|
|
143
|
-
nodesMatch = matchNodes(nodesA, nodesB);
|
|
144
|
-
|
|
145
|
-
nonTerminalNodeMatches = nodesMatch; ///
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return nonTerminalNodeMatches;
|
|
149
|
-
}
|