occam-verify-cli 0.0.477 → 0.0.479
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 +113 -29
- package/lib/metaSubstitution.js +5 -5
- package/lib/premise.js +145 -39
- package/lib/rule.js +74 -16
- package/lib/ruleNames.js +13 -9
- package/lib/substitution.js +12 -12
- package/lib/type.js +22 -21
- package/lib/variable.js +12 -19
- package/lib/verify/assertion/type.js +3 -2
- package/lib/verify/equality.js +85 -20
- package/lib/verify/statement/qualified.js +6 -3
- package/lib/verify/statement.js +7 -4
- package/package.json +3 -3
- package/src/conclusion.js +181 -32
- package/src/metaSubstitution.js +2 -2
- package/src/premise.js +233 -45
- package/src/rule.js +96 -16
- package/src/ruleNames.js +3 -2
- package/src/substitution.js +8 -8
- package/src/type.js +26 -20
- package/src/variable.js +10 -16
- package/src/verify/assertion/type.js +5 -2
- package/src/verify/equality.js +79 -35
- package/src/verify/statement/qualified.js +7 -2
- package/src/verify/statement.js +6 -4
package/src/premise.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import Substitution from "./substitution";
|
|
3
4
|
import MetaSubstitution from "./metaSubstitution";
|
|
4
5
|
|
|
5
6
|
import { first } from "./utilities/array";
|
|
@@ -7,11 +8,13 @@ import { nodeAsString } from "./utilities/string";
|
|
|
7
8
|
import { nodeQuery, nodesQuery } from "./utilities/query";
|
|
8
9
|
import { metavariableNameFromMetavariableNode } from "./utilities/query";
|
|
9
10
|
import { metastatementNodeFromMetastatementString } from "./utilities/string";
|
|
10
|
-
import {
|
|
11
|
+
import { STATEMENT_RULE_NAME, METASTATEMENT_RULE_NAME, METAVARIABLE_RULE_NAME } from "./ruleNames";
|
|
11
12
|
|
|
12
13
|
const metastatementNodesQuery = nodesQuery("/metaSubproofAssertion/metastatement"),
|
|
13
14
|
metaSubproofAssertionNodeQuery = nodeQuery("/metastatement/metaSubproofAssertion!"),
|
|
15
|
+
unqualifiedStatementStatementNodesQuery = nodesQuery("/subproof/unqualifiedStatement/statement!"),
|
|
14
16
|
unqualifiedMetastatementMetastatementNodesQuery = nodesQuery("/metaSubproof/unqualifiedMetastatement/metastatement!"),
|
|
17
|
+
qualifiedOrUnqualifiedStatementStatementNodeQuery = nodeQuery("/subproof/derivation|abridgedDerivation/qualifiedStatement|unqualifiedStatement[-1]/statement!"),
|
|
15
18
|
qualifiedOrUnqualifiedMetastatementMetastatementNodeQuery = nodeQuery("/metaSubproof/metaDerivation|abridgedMetaDerivation/qualifiedMetastatement|unqualifiedMetastatement[-1]/metastatement!");
|
|
16
19
|
|
|
17
20
|
export default class Premise {
|
|
@@ -23,6 +26,48 @@ export default class Premise {
|
|
|
23
26
|
return this.metastatementNode;
|
|
24
27
|
}
|
|
25
28
|
|
|
29
|
+
matchSubproofNode(subproofNode, substitutions) {
|
|
30
|
+
let subproofNodeMatches = false;
|
|
31
|
+
|
|
32
|
+
const subproofAssertionNode = metaSubproofAssertionNodeQuery(this.metastatementNode);
|
|
33
|
+
|
|
34
|
+
if (subproofAssertionNode !== null) {
|
|
35
|
+
const metaSubproofAssertionMetastatementNodes = metastatementNodesQuery(subproofAssertionNode),
|
|
36
|
+
unqualifiedStatementStatementNodes = unqualifiedStatementStatementNodesQuery(subproofNode),
|
|
37
|
+
qualifiedOrUnqualifiedStatementStatementNode = qualifiedOrUnqualifiedStatementStatementNodeQuery(subproofNode),
|
|
38
|
+
statementNodes = [
|
|
39
|
+
...unqualifiedStatementStatementNodes,
|
|
40
|
+
qualifiedOrUnqualifiedStatementStatementNode
|
|
41
|
+
],
|
|
42
|
+
statementNodesLength = statementNodes.length,
|
|
43
|
+
metaSubproofAssertionMetastatementNodesLength = metaSubproofAssertionMetastatementNodes.length;
|
|
44
|
+
|
|
45
|
+
if (statementNodesLength === metaSubproofAssertionMetastatementNodesLength) {
|
|
46
|
+
subproofNodeMatches = metaSubproofAssertionMetastatementNodes.every((metaSubproofAssertionMetastatementNode, index) => {
|
|
47
|
+
const statementNode = statementNodes[index],
|
|
48
|
+
nonTerminalNode = statementNode, ///
|
|
49
|
+
premiseNonTerminalNode = metaSubproofAssertionMetastatementNode, ///
|
|
50
|
+
premiseNonTerminalNodeMatches = matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, substitutions);
|
|
51
|
+
|
|
52
|
+
if (premiseNonTerminalNodeMatches) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return subproofNodeMatches;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
matchStatementNode(statementNode, substitutions) {
|
|
63
|
+
const nonTerminalNode = statementNode, ///
|
|
64
|
+
premiseNonTerminalNode = this.metastatementNode, ///
|
|
65
|
+
premiseNonTerminalNodeMatches = matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, substitutions),
|
|
66
|
+
statementNodeMatches = premiseNonTerminalNodeMatches; ///
|
|
67
|
+
|
|
68
|
+
return statementNodeMatches;
|
|
69
|
+
}
|
|
70
|
+
|
|
26
71
|
matchMetaSubproofNode(metaSubproofNode, metaSubstitutions) {
|
|
27
72
|
let metaSubproofNodeMatches = false;
|
|
28
73
|
|
|
@@ -44,7 +89,7 @@ export default class Premise {
|
|
|
44
89
|
const metastatementNode = metastatementNodes[index],
|
|
45
90
|
nonTerminalNode = metastatementNode, ///
|
|
46
91
|
premiseNonTerminalNode = metaSubproofAssertionMetastatementNode, ///
|
|
47
|
-
premiseNonTerminalNodeMatches =
|
|
92
|
+
premiseNonTerminalNodeMatches = metaMatchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions);
|
|
48
93
|
|
|
49
94
|
if (premiseNonTerminalNodeMatches) {
|
|
50
95
|
return true;
|
|
@@ -59,7 +104,7 @@ export default class Premise {
|
|
|
59
104
|
matchMetastatementNode(metastatementNode, metaSubstitutions) {
|
|
60
105
|
const nonTerminalNode = metastatementNode, ///
|
|
61
106
|
premiseNonTerminalNode = this.metastatementNode, ///
|
|
62
|
-
premiseNonTerminalNodeMatches =
|
|
107
|
+
premiseNonTerminalNodeMatches = metaMatchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions),
|
|
63
108
|
metastatementNodeMatches = premiseNonTerminalNodeMatches; ///
|
|
64
109
|
|
|
65
110
|
return metastatementNodeMatches;
|
|
@@ -91,23 +136,23 @@ export default class Premise {
|
|
|
91
136
|
}
|
|
92
137
|
}
|
|
93
138
|
|
|
94
|
-
function matchPremiseNode(premiseNode, node,
|
|
139
|
+
function matchPremiseNode(premiseNode, node, substitutions) {
|
|
95
140
|
let premiseNodeMatches = false;
|
|
96
141
|
|
|
97
142
|
const nodeTerminalNode = node.isTerminalNode(),
|
|
98
|
-
|
|
143
|
+
ruleNodeTerminalNode = premiseNode.isTerminalNode();
|
|
99
144
|
|
|
100
145
|
if (nodeTerminalNode === ruleNodeTerminalNode) {
|
|
101
146
|
if (nodeTerminalNode) {
|
|
102
147
|
const terminalNode = node, ///
|
|
103
148
|
premiseTerminalNode = premiseNode, ///
|
|
104
|
-
premiseTerminalNodeMatches = matchPremiseTerminalNode(premiseTerminalNode, terminalNode,
|
|
149
|
+
premiseTerminalNodeMatches = matchPremiseTerminalNode(premiseTerminalNode, terminalNode, substitutions);
|
|
105
150
|
|
|
106
151
|
premiseNodeMatches = premiseTerminalNodeMatches; ///
|
|
107
152
|
} else {
|
|
108
153
|
const nonTerminalNode = node, ///
|
|
109
154
|
premiseNonTerminalNode = premiseNode, ///
|
|
110
|
-
premiseNonTerminalNodeMatches = matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode,
|
|
155
|
+
premiseNonTerminalNodeMatches = matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, substitutions);
|
|
111
156
|
|
|
112
157
|
premiseNodeMatches = premiseNonTerminalNodeMatches; ///
|
|
113
158
|
}
|
|
@@ -116,7 +161,7 @@ function matchPremiseNode(premiseNode, node, metaSubstitutions) {
|
|
|
116
161
|
return premiseNodeMatches;
|
|
117
162
|
}
|
|
118
163
|
|
|
119
|
-
function matchPremiseNodes(premiseNodes, nodes,
|
|
164
|
+
function matchPremiseNodes(premiseNodes, nodes, substitutions) {
|
|
120
165
|
let premiseNodesMatches = false;
|
|
121
166
|
|
|
122
167
|
const nodesLength = nodes.length,
|
|
@@ -125,7 +170,7 @@ function matchPremiseNodes(premiseNodes, nodes, metaSubstitutions) {
|
|
|
125
170
|
if (nodesLength === premiseNodesLength) {
|
|
126
171
|
premiseNodesMatches = nodes.every((node, index) => {
|
|
127
172
|
const premiseNode = premiseNodes[index],
|
|
128
|
-
premiseNodeMatches = matchPremiseNode(premiseNode, node,
|
|
173
|
+
premiseNodeMatches = matchPremiseNode(premiseNode, node, substitutions);
|
|
129
174
|
|
|
130
175
|
if (premiseNodeMatches) {
|
|
131
176
|
return true;
|
|
@@ -136,81 +181,224 @@ function matchPremiseNodes(premiseNodes, nodes, metaSubstitutions) {
|
|
|
136
181
|
return premiseNodesMatches;
|
|
137
182
|
}
|
|
138
183
|
|
|
139
|
-
function
|
|
140
|
-
|
|
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
|
+
ruleNameStatementRuleName = (ruleName === STATEMENT_RULE_NAME),
|
|
199
|
+
premiseNonTerminalNodeRuleNameMetastatementRuleName = (premiseNonTerminalNodeRuleName === METASTATEMENT_RULE_NAME);
|
|
200
|
+
|
|
201
|
+
if (ruleNameStatementRuleName && premiseNonTerminalNodeRuleNameMetastatementRuleName) {
|
|
202
|
+
const statementNode = nonTerminalNode, ///
|
|
203
|
+
premiseMetastatementNode = premiseNonTerminalNode, ///
|
|
204
|
+
premiseMetastatementNodeMatches = matchPremiseMetastatementNode(premiseMetastatementNode, statementNode, substitutions);
|
|
205
|
+
|
|
206
|
+
if (premiseMetastatementNodeMatches) {
|
|
207
|
+
premiseNonTerminalNodeMatches = true;
|
|
208
|
+
} else {
|
|
209
|
+
const nodes = childNodes, ///
|
|
210
|
+
premiseNodes = premiseNonTerminalNodeChildNodes, ///
|
|
211
|
+
premiseNonTerminalNodeChildNodesMatches = matchPremiseNodes(premiseNodes, nodes, substitutions);
|
|
212
|
+
|
|
213
|
+
premiseNonTerminalNodeMatches = premiseNonTerminalNodeChildNodesMatches; ///
|
|
214
|
+
}
|
|
215
|
+
} else if (ruleName === premiseNonTerminalNodeRuleName) {
|
|
216
|
+
const nodes = childNodes, ///
|
|
217
|
+
premiseNodes = premiseNonTerminalNodeChildNodes, ///
|
|
218
|
+
premiseNonTerminalNodeChildNodesMatches = matchPremiseNodes(premiseNodes, nodes, substitutions);
|
|
219
|
+
|
|
220
|
+
premiseNonTerminalNodeMatches = premiseNonTerminalNodeChildNodesMatches; ///
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return premiseNonTerminalNodeMatches;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function matchPremiseMetavariableNode(premiseMetavariableNode, nodes, substitutions) {
|
|
227
|
+
let premiseMetavariableNodeMatches;
|
|
141
228
|
|
|
142
229
|
const premiseMetavariableName = metavariableNameFromMetavariableNode(premiseMetavariableNode),
|
|
143
|
-
|
|
144
|
-
const metavariableName =
|
|
230
|
+
substitution = substitutions.find((substitution) => {
|
|
231
|
+
const metavariableName = substitution.getMetavariableName();
|
|
145
232
|
|
|
146
233
|
if (metavariableName === premiseMetavariableName) {
|
|
147
234
|
return true;
|
|
148
235
|
}
|
|
149
236
|
}) || null;
|
|
150
237
|
|
|
151
|
-
if (
|
|
152
|
-
const
|
|
238
|
+
if (substitution !== null) {
|
|
239
|
+
const substitutionNodesMatch = substitution.matchNodes(nodes);
|
|
153
240
|
|
|
154
|
-
|
|
241
|
+
premiseMetavariableNodeMatches = substitutionNodesMatch; ///
|
|
155
242
|
} else {
|
|
156
243
|
const metavariableName = premiseMetavariableName, ///
|
|
157
|
-
|
|
244
|
+
substitution = Substitution.fromMetavariableNameAndNodes(metavariableName, nodes);
|
|
158
245
|
|
|
159
|
-
|
|
246
|
+
substitutions.push(substitution);
|
|
160
247
|
|
|
161
|
-
|
|
248
|
+
premiseMetavariableNodeMatches = true;
|
|
162
249
|
}
|
|
163
250
|
|
|
164
|
-
return
|
|
251
|
+
return premiseMetavariableNodeMatches;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function matchPremiseMetastatementNode(premiseMetastatementNode, statementNode, substitutions) {
|
|
255
|
+
let premiseMetastatementNodeMatches = false;
|
|
256
|
+
|
|
257
|
+
const premiseNonTerminalNode = premiseMetastatementNode, ///
|
|
258
|
+
premiseNonTerminalNodeChildNodes = premiseNonTerminalNode.getChildNodes(),
|
|
259
|
+
premiseNonTerminalNodeChildNodesLength = premiseNonTerminalNodeChildNodes.length;
|
|
260
|
+
|
|
261
|
+
if (premiseNonTerminalNodeChildNodesLength === 1) {
|
|
262
|
+
const firstPremiseChildNode = first(premiseNonTerminalNodeChildNodes),
|
|
263
|
+
premiseChildNode = firstPremiseChildNode, ///
|
|
264
|
+
premiseChildNodeNonTerminalNode = premiseChildNode.isNonTerminalNode();
|
|
265
|
+
|
|
266
|
+
if (premiseChildNodeNonTerminalNode) {
|
|
267
|
+
const premiseNonTerminalChildNode = premiseChildNode, ///
|
|
268
|
+
premiseNonTerminalChildNodeRuleName = premiseNonTerminalChildNode.getRuleName(),
|
|
269
|
+
premiseNonTerminalChildNodeRuleNameMetavariableRuleName = (premiseNonTerminalChildNodeRuleName === METAVARIABLE_RULE_NAME);
|
|
270
|
+
|
|
271
|
+
if (premiseNonTerminalChildNodeRuleNameMetavariableRuleName) {
|
|
272
|
+
const premiseMetavariableNode = premiseNonTerminalChildNode, ///
|
|
273
|
+
nonTerminalNode = statementNode, ///
|
|
274
|
+
childNodes = nonTerminalNode.getChildNodes(),
|
|
275
|
+
nodes = childNodes, ///
|
|
276
|
+
premiseMetaVariableNodeMatches = matchPremiseMetavariableNode(premiseMetavariableNode, nodes, substitutions);
|
|
277
|
+
|
|
278
|
+
premiseMetastatementNodeMatches = premiseMetaVariableNodeMatches; ///
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
return premiseMetastatementNodeMatches;
|
|
165
284
|
}
|
|
166
285
|
|
|
167
|
-
function
|
|
286
|
+
function metaMatchPremiseNode(premiseNode, node, metaSubstitutions) {
|
|
287
|
+
let premiseNodeMatches = false;
|
|
288
|
+
|
|
289
|
+
const nodeTerminalNode = node.isTerminalNode(),
|
|
290
|
+
ruleNodeTerminalNode = premiseNode.isTerminalNode();
|
|
291
|
+
|
|
292
|
+
if (nodeTerminalNode === ruleNodeTerminalNode) {
|
|
293
|
+
if (nodeTerminalNode) {
|
|
294
|
+
const terminalNode = node, ///
|
|
295
|
+
premiseTerminalNode = premiseNode, ///
|
|
296
|
+
premiseTerminalNodeMatches = metaMatchPremiseTerminalNode(premiseTerminalNode, terminalNode, metaSubstitutions);
|
|
297
|
+
|
|
298
|
+
premiseNodeMatches = premiseTerminalNodeMatches; ///
|
|
299
|
+
} else {
|
|
300
|
+
const nonTerminalNode = node, ///
|
|
301
|
+
premiseNonTerminalNode = premiseNode, ///
|
|
302
|
+
premiseNonTerminalNodeMatches = metaMatchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions);
|
|
303
|
+
|
|
304
|
+
premiseNodeMatches = premiseNonTerminalNodeMatches; ///
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return premiseNodeMatches;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function metaMatchPremiseNodes(premiseNodes, nodes, metaSubstitutions) {
|
|
312
|
+
let premiseNodesMatches = false;
|
|
313
|
+
|
|
314
|
+
const nodesLength = nodes.length,
|
|
315
|
+
premiseNodesLength = premiseNodes.length;
|
|
316
|
+
|
|
317
|
+
if (nodesLength === premiseNodesLength) {
|
|
318
|
+
premiseNodesMatches = nodes.every((node, index) => {
|
|
319
|
+
const premiseNode = premiseNodes[index],
|
|
320
|
+
premiseNodeMatches = metaMatchPremiseNode(premiseNode, node, metaSubstitutions);
|
|
321
|
+
|
|
322
|
+
if (premiseNodeMatches) {
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return premiseNodesMatches;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
function metaMatchPremiseTerminalNode(premiseTerminalNode, terminalNode, metaSubstitutions) {
|
|
168
332
|
const matches = premiseTerminalNode.match(terminalNode),
|
|
169
333
|
premiseTerminalNodeMatches = matches;
|
|
170
334
|
|
|
171
335
|
return premiseTerminalNodeMatches;
|
|
172
336
|
}
|
|
173
337
|
|
|
174
|
-
function
|
|
338
|
+
function metaMatchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions) {
|
|
175
339
|
let premiseNonTerminalNodeMatches = false;
|
|
176
340
|
|
|
177
341
|
const ruleName = nonTerminalNode.getRuleName(),
|
|
178
|
-
|
|
342
|
+
premiseNonTerminalNodeRuleName = premiseNonTerminalNode.getRuleName(),
|
|
343
|
+
ruleNameMetastatementRuleName = (ruleName === METASTATEMENT_RULE_NAME),
|
|
344
|
+
premiseNonTerminalNodeRuleNameMetastatementRuleName = (premiseNonTerminalNodeRuleName === METASTATEMENT_RULE_NAME);
|
|
345
|
+
|
|
346
|
+
if (ruleNameMetastatementRuleName && premiseNonTerminalNodeRuleNameMetastatementRuleName) {
|
|
347
|
+
const metastatementNode = nonTerminalNode, ///
|
|
348
|
+
premiseMetastatementNode = premiseNonTerminalNode, ///
|
|
349
|
+
premiseMetastatementNodeMatches = metaMatchPremiseMetastatementNode(premiseMetastatementNode, metastatementNode, metaSubstitutions);
|
|
179
350
|
|
|
180
|
-
|
|
351
|
+
premiseNonTerminalNodeMatches = premiseMetastatementNodeMatches; ///
|
|
352
|
+
} else if (ruleName === premiseNonTerminalNodeRuleName) {
|
|
181
353
|
const childNodes = nonTerminalNode.getChildNodes(),
|
|
182
|
-
|
|
354
|
+
premiseNonTerminalNodeChildNodes = premiseNonTerminalNode.getChildNodes(), ///
|
|
183
355
|
nodes = childNodes, ///
|
|
184
|
-
premiseNodes =
|
|
185
|
-
|
|
356
|
+
premiseNodes = premiseNonTerminalNodeChildNodes, ///
|
|
357
|
+
premiseNonTerminalNodeChildNodesMatches = metaMatchPremiseNodes(premiseNodes, nodes, metaSubstitutions);
|
|
186
358
|
|
|
187
|
-
premiseNonTerminalNodeMatches =
|
|
359
|
+
premiseNonTerminalNodeMatches = premiseNonTerminalNodeChildNodesMatches; ///
|
|
360
|
+
}
|
|
188
361
|
|
|
189
|
-
|
|
190
|
-
|
|
362
|
+
return premiseNonTerminalNodeMatches;
|
|
363
|
+
}
|
|
191
364
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
premiseMetastatementNode = premiseNonTerminalNode, ///
|
|
195
|
-
premiseMetastatementNodeMatches = matchPremiseMetastatementNode(premiseMetastatementNode, metastatementNode, metaSubstitutions);
|
|
365
|
+
function metaMatchPremiseMetavariableNode(premiseMetavariableNode, nodes, metaSubstitutions) {
|
|
366
|
+
let premiseMetavariableNodeMatches;
|
|
196
367
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
368
|
+
const premiseMetavariableName = metavariableNameFromMetavariableNode(premiseMetavariableNode),
|
|
369
|
+
metaSubstitution = metaSubstitutions.find((metaSubstitution) => {
|
|
370
|
+
const metavariableName = metaSubstitution.getMetavariableName();
|
|
371
|
+
|
|
372
|
+
if (metavariableName === premiseMetavariableName) {
|
|
373
|
+
return true;
|
|
374
|
+
}
|
|
375
|
+
}) || null;
|
|
376
|
+
|
|
377
|
+
if (metaSubstitution !== null) {
|
|
378
|
+
const metaSubstitutionNodesMatch = metaSubstitution.matchNodes(nodes);
|
|
379
|
+
|
|
380
|
+
premiseMetavariableNodeMatches = metaSubstitutionNodesMatch; ///
|
|
381
|
+
} else {
|
|
382
|
+
const metavariableName = premiseMetavariableName, ///
|
|
383
|
+
metaSubstitution = MetaSubstitution.fromMetavariableNameAndNodes(metavariableName, nodes);
|
|
384
|
+
|
|
385
|
+
metaSubstitutions.push(metaSubstitution);
|
|
386
|
+
|
|
387
|
+
premiseMetavariableNodeMatches = true;
|
|
200
388
|
}
|
|
201
389
|
|
|
202
|
-
return
|
|
390
|
+
return premiseMetavariableNodeMatches;
|
|
203
391
|
}
|
|
204
392
|
|
|
205
|
-
function
|
|
393
|
+
function metaMatchPremiseMetastatementNode(premiseMetastatementNode, metastatementNode, metaSubstitutions) {
|
|
206
394
|
let premiseMetastatementNodeMatches = false;
|
|
207
395
|
|
|
208
396
|
const premiseNonTerminalNode = premiseMetastatementNode, ///
|
|
209
|
-
|
|
210
|
-
|
|
397
|
+
premiseNonTerminalNodeChildNodes = premiseNonTerminalNode.getChildNodes(),
|
|
398
|
+
premiseNonTerminalNodeChildNodesLength = premiseNonTerminalNodeChildNodes.length;
|
|
211
399
|
|
|
212
|
-
if (
|
|
213
|
-
const firstPremiseChildNode = first(
|
|
400
|
+
if (premiseNonTerminalNodeChildNodesLength === 1) {
|
|
401
|
+
const firstPremiseChildNode = first(premiseNonTerminalNodeChildNodes),
|
|
214
402
|
premiseChildNode = firstPremiseChildNode, ///
|
|
215
403
|
premiseChildNodeNonTerminalNode = premiseChildNode.isNonTerminalNode();
|
|
216
404
|
|
|
@@ -224,9 +412,9 @@ function matchPremiseMetastatementNode(premiseMetastatementNode, metastatementNo
|
|
|
224
412
|
nonTerminalNode = metastatementNode, ///
|
|
225
413
|
childNodes = nonTerminalNode.getChildNodes(),
|
|
226
414
|
nodes = childNodes, ///
|
|
227
|
-
|
|
415
|
+
premiseMetaVariableNodeMatches = metaMatchPremiseMetavariableNode(premiseMetavariableNode, nodes, metaSubstitutions);
|
|
228
416
|
|
|
229
|
-
premiseMetastatementNodeMatches =
|
|
417
|
+
premiseMetastatementNodeMatches = premiseMetaVariableNodeMatches; ///
|
|
230
418
|
}
|
|
231
419
|
}
|
|
232
420
|
}
|
package/src/rule.js
CHANGED
|
@@ -40,6 +40,40 @@ export default class Rule {
|
|
|
40
40
|
return matchesLabelName;
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
matchStatement(statementNode, proofContext) {
|
|
44
|
+
let statementNatches;
|
|
45
|
+
|
|
46
|
+
const premisesLength = this.premises.length;
|
|
47
|
+
|
|
48
|
+
if (premisesLength === 0) {
|
|
49
|
+
const substitutions = [],
|
|
50
|
+
conclusionMatches = matchConclusion(this.conclusion, statementNode, substitutions);
|
|
51
|
+
|
|
52
|
+
statementNatches = conclusionMatches; ///
|
|
53
|
+
} else {
|
|
54
|
+
const proofSteps = proofContext.getProofSteps();
|
|
55
|
+
|
|
56
|
+
statementNatches = someSubArray(proofSteps, premisesLength, (proofSteps) => {
|
|
57
|
+
let premisesMatchConclusion = false;
|
|
58
|
+
|
|
59
|
+
const substitutions = [],
|
|
60
|
+
premisesMatch = matchPremises(this.premises, proofSteps, substitutions);
|
|
61
|
+
|
|
62
|
+
if (premisesMatch) {
|
|
63
|
+
const conclusionMatches = matchConclusion(this.conclusion, statementNode, substitutions);
|
|
64
|
+
|
|
65
|
+
premisesMatchConclusion = conclusionMatches; ///
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (premisesMatchConclusion) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return statementNatches;
|
|
75
|
+
}
|
|
76
|
+
|
|
43
77
|
matchMetastatement(metastatementNode, metaproofContext) {
|
|
44
78
|
let metastatementNatches;
|
|
45
79
|
|
|
@@ -47,7 +81,7 @@ export default class Rule {
|
|
|
47
81
|
|
|
48
82
|
if (premisesLength === 0) {
|
|
49
83
|
const metaSubstitutions = [],
|
|
50
|
-
conclusionMatches =
|
|
84
|
+
conclusionMatches = metaMatchConclusion(this.conclusion, metastatementNode, metaSubstitutions);
|
|
51
85
|
|
|
52
86
|
metastatementNatches = conclusionMatches; ///
|
|
53
87
|
} else {
|
|
@@ -57,10 +91,10 @@ export default class Rule {
|
|
|
57
91
|
let premisesMatchConclusion = false;
|
|
58
92
|
|
|
59
93
|
const metaSubstitutions = [],
|
|
60
|
-
|
|
94
|
+
premisesMatch = metaMatchPremises(this.premises, metaproofSteps, metaSubstitutions);
|
|
61
95
|
|
|
62
|
-
if (
|
|
63
|
-
const conclusionMatches =
|
|
96
|
+
if (premisesMatch) {
|
|
97
|
+
const conclusionMatches = metaMatchConclusion(this.conclusion, metastatementNode, metaSubstitutions);
|
|
64
98
|
|
|
65
99
|
premisesMatchConclusion = conclusionMatches; ///
|
|
66
100
|
}
|
|
@@ -145,23 +179,69 @@ export default class Rule {
|
|
|
145
179
|
}
|
|
146
180
|
}
|
|
147
181
|
|
|
148
|
-
function matchPremise(premise,
|
|
182
|
+
function matchPremise(premise, proofSteps, substitutions) {
|
|
183
|
+
const proofStep = prune(proofSteps, (proofStep) => {
|
|
184
|
+
const subproofNode = proofStep.getSubproofNode(),
|
|
185
|
+
statementNode = proofStep.getStatementNode()
|
|
186
|
+
|
|
187
|
+
if (subproofNode !== null) {
|
|
188
|
+
const subProofNodeMatches = premise.matchSubproofNode(subproofNode, substitutions);
|
|
189
|
+
|
|
190
|
+
if (!subProofNodeMatches) { ///
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (statementNode !== null) {
|
|
196
|
+
const statementNodeMatches = premise.matchStatementNode(statementNode, substitutions);
|
|
197
|
+
|
|
198
|
+
if (!statementNodeMatches) { ///
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}) || null;
|
|
203
|
+
|
|
204
|
+
const premiseMatches = (proofStep !== null);
|
|
205
|
+
|
|
206
|
+
return premiseMatches;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function matchPremises(premise, proofSteps, substitutions) {
|
|
210
|
+
const premisesMatch = premise.every((premise) => {
|
|
211
|
+
const premiseMatches = matchPremise(premise, proofSteps, substitutions);
|
|
212
|
+
|
|
213
|
+
if (premiseMatches) {
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
return premisesMatch;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function matchConclusion(conclusion, statementNode, substitutions) {
|
|
222
|
+
const statementNodeMatches = conclusion.matchStatementNode(statementNode, substitutions),
|
|
223
|
+
conclusionMatches = statementNodeMatches; ///
|
|
224
|
+
|
|
225
|
+
return conclusionMatches;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function metaMatchPremise(premise, metaproofSteps, metaSubstitutions) {
|
|
149
229
|
const metaproofStep = prune(metaproofSteps, (metaproofStep) => {
|
|
150
230
|
const metaSubproofNode = metaproofStep.getMetaSubproofNode(),
|
|
151
231
|
metastatementNode = metaproofStep.getMetastatementNode()
|
|
152
232
|
|
|
153
233
|
if (metaSubproofNode !== null) {
|
|
154
|
-
const
|
|
234
|
+
const metaSubProofNodeMatches = premise.matchMetaSubproofNode(metaSubproofNode, metaSubstitutions);
|
|
155
235
|
|
|
156
|
-
if (!
|
|
236
|
+
if (!metaSubProofNodeMatches) { ///
|
|
157
237
|
return true;
|
|
158
238
|
}
|
|
159
239
|
}
|
|
160
240
|
|
|
161
241
|
if (metastatementNode !== null) {
|
|
162
|
-
const
|
|
242
|
+
const metastatementNodeMatches = premise.matchMetastatementNode(metastatementNode, metaSubstitutions);
|
|
163
243
|
|
|
164
|
-
if (!
|
|
244
|
+
if (!metastatementNodeMatches) { ///
|
|
165
245
|
return true;
|
|
166
246
|
}
|
|
167
247
|
}
|
|
@@ -172,21 +252,21 @@ function matchPremise(premise, metaproofSteps, metaSubstitutions) {
|
|
|
172
252
|
return premiseMatches;
|
|
173
253
|
}
|
|
174
254
|
|
|
175
|
-
function
|
|
176
|
-
const
|
|
177
|
-
const premiseMatches =
|
|
255
|
+
function metaMatchPremises(premise, metaproofSteps, metaSubstitutions) {
|
|
256
|
+
const premisesMatch = premise.every((premise) => {
|
|
257
|
+
const premiseMatches = metaMatchPremise(premise, metaproofSteps, metaSubstitutions);
|
|
178
258
|
|
|
179
259
|
if (premiseMatches) {
|
|
180
260
|
return true;
|
|
181
261
|
}
|
|
182
262
|
});
|
|
183
263
|
|
|
184
|
-
return
|
|
264
|
+
return premisesMatch;
|
|
185
265
|
}
|
|
186
266
|
|
|
187
|
-
function
|
|
188
|
-
const
|
|
189
|
-
conclusionMatches =
|
|
267
|
+
function metaMatchConclusion(conclusion, metastatementNode, metaSubstitutions) {
|
|
268
|
+
const metastatementNodeMatches = conclusion.matchMetastatementNode(metastatementNode, metaSubstitutions),
|
|
269
|
+
conclusionMatches = metastatementNodeMatches; ///
|
|
190
270
|
|
|
191
271
|
return conclusionMatches;
|
|
192
272
|
}
|
package/src/ruleNames.js
CHANGED
|
@@ -4,12 +4,13 @@ export const TERM_RULE_NAME = "term";
|
|
|
4
4
|
export const TYPE_RULE_NAME = "type";
|
|
5
5
|
export const LABEL_RULE_NAME = "label";
|
|
6
6
|
export const ARGUMENT_RULE_NAME = "argument";
|
|
7
|
+
export const SUBPROOF_RULE_NAME = "subproof";
|
|
8
|
+
export const STATEMENT_RULE_NAME = "statement";
|
|
7
9
|
export const METAVARIABLE_RULE_NAME = "metavariable";
|
|
8
10
|
export const METASTATEMENT_RULE_NAME = "metastatement";
|
|
9
11
|
export const META_SUBPROOF_RULE_NAME = "metaSubproof";
|
|
12
|
+
export const QUALIFIED_STATEMENT_RULE_NAME = "qualifiedStatement";
|
|
10
13
|
export const UNQUALIFIED_STATEMENT_RULE_NAME = "unqualifiedStatement";
|
|
11
14
|
export const CONDITIONAL_INDICATIVE_RULE_NAME = "conditionalIndicative";
|
|
12
|
-
export const COMBINATOR_DECLARATION_RULE_NAME = "combinatorDeclaration";
|
|
13
|
-
export const CONSTRUCTOR_DECLARATION_RULE_NAME = "constructorDeclaration";
|
|
14
15
|
export const QUALIFIED_METASTATEMENT_RULE_NAME = "qualifiedMetastatement";
|
|
15
16
|
export const UNQUALIFIED_METASTATEMENT_RULE_NAME = "unqualifiedMetastatement";
|
package/src/substitution.js
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
import { matchNodes, bracketedChildNodeFromChildNodes } from "./utilities/node";
|
|
4
4
|
|
|
5
5
|
export default class Substitution {
|
|
6
|
-
constructor(
|
|
7
|
-
this.
|
|
6
|
+
constructor(metavariableName, nodes) {
|
|
7
|
+
this.metavariableName = metavariableName;
|
|
8
8
|
this.nodes = nodes;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
return this.
|
|
11
|
+
getMetavariableName() {
|
|
12
|
+
return this.metavariableName;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
getNodes() {
|
|
@@ -21,9 +21,9 @@ export default class Substitution {
|
|
|
21
21
|
|
|
22
22
|
const nodesA = this.nodes, ///
|
|
23
23
|
nodesB = nodes,
|
|
24
|
-
|
|
24
|
+
nodesMatch = matchNodes(nodesA, nodesB);
|
|
25
25
|
|
|
26
|
-
matches =
|
|
26
|
+
matches = nodesMatch; ///
|
|
27
27
|
|
|
28
28
|
if (!matches) {
|
|
29
29
|
const childNodes = nodes, ///
|
|
@@ -42,7 +42,7 @@ export default class Substitution {
|
|
|
42
42
|
return matches;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
static fromMetavariableNameAndNodes(
|
|
45
|
+
static fromMetavariableNameAndNodes(metavariableName, nodes) {
|
|
46
46
|
const bracketedChildNode = bracketedChildNodeFromChildNodes(nodes);
|
|
47
47
|
|
|
48
48
|
if (bracketedChildNode !== null) {
|
|
@@ -52,7 +52,7 @@ export default class Substitution {
|
|
|
52
52
|
nodes = childNodes; ///
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
const metaSubstitution = new Substitution(
|
|
55
|
+
const metaSubstitution = new Substitution(metavariableName, nodes);
|
|
56
56
|
|
|
57
57
|
return metaSubstitution;
|
|
58
58
|
}
|