occam-verify-cli 0.0.269 → 0.0.271
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/bin/assertion.js +145 -0
- package/bin/conclusion.js +67 -41
- package/bin/constants.js +11 -1
- package/bin/context/file.js +9 -3
- package/bin/context/metaproof.js +17 -8
- package/bin/metaAssertion.js +130 -20
- package/bin/metaSubstitution.js +45 -30
- package/bin/permutations.js +3 -0
- package/bin/permutationsMatrix.js +6 -0
- package/bin/premise.js +110 -48
- package/bin/rule.js +36 -28
- package/bin/ruleNames.js +4 -0
- package/bin/utilities/array.js +54 -71
- package/bin/utilities/metastatement.js +44 -0
- package/bin/utilities/permutations.js +148 -0
- package/bin/verify/antecedent.js +7 -18
- package/bin/verify/{typeAssertion.js → assertion/type.js} +4 -4
- package/bin/verify/conditinalInference.js +15 -12
- package/bin/verify/metaAntecedent.js +7 -14
- package/bin/verify/metaDerivation.js +1 -0
- package/bin/verify/metaproof.js +90 -20
- package/bin/verify/metastatement/qualified.js +2 -6
- package/bin/verify/metastatement/unqualified.js +4 -4
- package/bin/verify/rule.js +28 -16
- package/bin/verify/statement.js +1 -1
- package/bin/verify/unconditionalInference.js +9 -5
- package/package.json +3 -3
- package/bin/antecedent.js +0 -19
package/bin/premise.js
CHANGED
|
@@ -2,8 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
const MetaSubstitution = require("./metaSubstitution");
|
|
4
4
|
|
|
5
|
-
const {
|
|
6
|
-
{
|
|
5
|
+
const { first, second } = require("./utilities/array"),
|
|
6
|
+
{ nodeQuery, nodesQuery } = require("./utilities/query"),
|
|
7
|
+
{ metavariableNameFromMetavariableNode } = require("./utilities/query"),
|
|
8
|
+
{ METAVARIABLE_RULE_NAME, METASTATEMENT_RULE_NAME } = require("./ruleNames");
|
|
9
|
+
|
|
10
|
+
const metastatementNodesQuery = nodesQuery("/metaSubproofAssertion/metastatement"),
|
|
11
|
+
metaSubproofAssertionNodeQuery = nodeQuery("/metastatement/metaSubproofAssertion!"),
|
|
12
|
+
qualifiedOrUnqualifiedMetastatementMetastatementNodesQuery = nodesQuery("/metaSubproof/qualifiedMetastatement|unqualifiedMetastatement/metastatement!");
|
|
7
13
|
|
|
8
14
|
class Premise {
|
|
9
15
|
constructor(metastatementNode) {
|
|
@@ -14,12 +20,43 @@ class Premise {
|
|
|
14
20
|
return this.metastatementNode;
|
|
15
21
|
}
|
|
16
22
|
|
|
17
|
-
|
|
18
|
-
|
|
23
|
+
matchMetaSubproofNode(metaSubproofNode, metaSubstitutions) {
|
|
24
|
+
let metaSubproofNodeMatches = false;
|
|
25
|
+
|
|
26
|
+
const metaSubproofAssertionNode = metaSubproofAssertionNodeQuery(this.metastatementNode);
|
|
27
|
+
|
|
28
|
+
if (metaSubproofAssertionNode !== null) {
|
|
29
|
+
const metaSubproofAssertionMetastatementNodes = metastatementNodesQuery(metaSubproofAssertionNode),
|
|
30
|
+
firstMetaSubproofAssertionMetastatementNode = first(metaSubproofAssertionMetastatementNodes),
|
|
31
|
+
qualifiedOrUnqualifiedMetastatementMetastatementNodes = qualifiedOrUnqualifiedMetastatementMetastatementNodesQuery(metaSubproofNode),
|
|
32
|
+
firstQualifiedOrUnqualifiedMetastatementMetastatementNode = first(qualifiedOrUnqualifiedMetastatementMetastatementNodes);
|
|
33
|
+
|
|
34
|
+
const nonTerminalNode = firstQualifiedOrUnqualifiedMetastatementMetastatementNode, ///
|
|
35
|
+
premiseNonTerminalNode = firstMetaSubproofAssertionMetastatementNode, ///
|
|
36
|
+
premiseNonTerminalNodeMatches = matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions);
|
|
37
|
+
|
|
38
|
+
if (premiseNonTerminalNodeMatches) {
|
|
39
|
+
const secondMetaSubproofAssertionMetastatementNode = second(metaSubproofAssertionMetastatementNodes),
|
|
40
|
+
secondQualifiedOrUnqualifiedMetastatementMetastatementNode = second(qualifiedOrUnqualifiedMetastatementMetastatementNodes);
|
|
41
|
+
|
|
42
|
+
const nonTerminalNode = secondQualifiedOrUnqualifiedMetastatementMetastatementNode, ///
|
|
43
|
+
premiseNonTerminalNode = secondMetaSubproofAssertionMetastatementNode, ///
|
|
44
|
+
premiseNonTerminalNodeMatches = matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions);
|
|
45
|
+
|
|
46
|
+
metaSubproofNodeMatches = premiseNonTerminalNodeMatches; ///
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return metaSubproofNodeMatches;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
matchMetastatementNode(metastatementNode, metaSubstitutions) {
|
|
54
|
+
const nonTerminalNode = metastatementNode, ///
|
|
55
|
+
premiseNonTerminalNode = this.metastatementNode, ///
|
|
19
56
|
premiseNonTerminalNodeMatches = matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions),
|
|
20
|
-
|
|
57
|
+
metastatementNodeMatches = premiseNonTerminalNodeMatches; ///
|
|
21
58
|
|
|
22
|
-
return
|
|
59
|
+
return metastatementNodeMatches;
|
|
23
60
|
}
|
|
24
61
|
|
|
25
62
|
static fromMetastatementNode(metastatementNode) {
|
|
@@ -56,47 +93,45 @@ function matchPremiseNode(premiseNode, node, metaSubstitutions) {
|
|
|
56
93
|
return premiseNodeMatches;
|
|
57
94
|
}
|
|
58
95
|
|
|
59
|
-
function
|
|
60
|
-
let
|
|
96
|
+
function matchPremiseNodes(premiseNodes, nodes, metaSubstitutions) {
|
|
97
|
+
let premiseNodesMatches = false;
|
|
61
98
|
|
|
62
|
-
const
|
|
63
|
-
|
|
99
|
+
const nodesLength = nodes.length,
|
|
100
|
+
premiseNodesLength = premiseNodes.length;
|
|
64
101
|
|
|
65
|
-
if (
|
|
66
|
-
|
|
67
|
-
const
|
|
68
|
-
premiseNode = premiseChildNode, ///
|
|
69
|
-
node = childNode, ///
|
|
102
|
+
if (nodesLength === premiseNodesLength) {
|
|
103
|
+
premiseNodesMatches = nodes.every((node, index) => {
|
|
104
|
+
const premiseNode = premiseNodes[index],
|
|
70
105
|
premiseNodeMatches = matchPremiseNode(premiseNode, node, metaSubstitutions);
|
|
71
106
|
|
|
72
107
|
if (premiseNodeMatches) {
|
|
73
108
|
return true;
|
|
74
109
|
}
|
|
75
|
-
})
|
|
110
|
+
});
|
|
76
111
|
}
|
|
77
112
|
|
|
78
|
-
return
|
|
113
|
+
return premiseNodesMatches;
|
|
79
114
|
}
|
|
80
115
|
|
|
81
|
-
function matchPremiseMetavariable(premiseMetavariableNode,
|
|
116
|
+
function matchPremiseMetavariable(premiseMetavariableNode, nodes, metaSubstitutions) {
|
|
82
117
|
let premiseMetavariableMatches;
|
|
83
118
|
|
|
84
119
|
const premiseMetavariableName = metavariableNameFromMetavariableNode(premiseMetavariableNode),
|
|
85
120
|
metaSubstitution = metaSubstitutions.find((metaSubstitution) => {
|
|
86
|
-
|
|
121
|
+
const metavariableName = metaSubstitution.getMetavariableName();
|
|
87
122
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
123
|
+
if (metavariableName === premiseMetavariableName) {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
}) || null;
|
|
92
127
|
|
|
93
128
|
if (metaSubstitution !== null) {
|
|
94
|
-
const
|
|
129
|
+
const metaSubstitutionNodesMatch = metaSubstitution.matchNodes(nodes);
|
|
95
130
|
|
|
96
|
-
premiseMetavariableMatches =
|
|
131
|
+
premiseMetavariableMatches = metaSubstitutionNodesMatch; ///
|
|
97
132
|
} else {
|
|
98
133
|
const metavariableName = premiseMetavariableName, ///
|
|
99
|
-
metaSubstitution = MetaSubstitution.
|
|
134
|
+
metaSubstitution = MetaSubstitution.fromMetavariableNameAndNodes(metavariableName, nodes);
|
|
100
135
|
|
|
101
136
|
metaSubstitutions.push(metaSubstitution);
|
|
102
137
|
|
|
@@ -107,13 +142,8 @@ function matchPremiseMetavariable(premiseMetavariableNode, nonTerminalNode, meta
|
|
|
107
142
|
}
|
|
108
143
|
|
|
109
144
|
function matchPremiseTerminalNode(premiseTerminalNode, terminalNode, metaSubstitutions) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
const matches = premiseTerminalNode.match(terminalNode);
|
|
113
|
-
|
|
114
|
-
if (matches) {
|
|
115
|
-
premiseTerminalNodeMatches = true;
|
|
116
|
-
}
|
|
145
|
+
const matches = premiseTerminalNode.match(terminalNode),
|
|
146
|
+
premiseTerminalNodeMatches = matches;
|
|
117
147
|
|
|
118
148
|
return premiseTerminalNodeMatches;
|
|
119
149
|
}
|
|
@@ -121,30 +151,62 @@ function matchPremiseTerminalNode(premiseTerminalNode, terminalNode, metaSubstit
|
|
|
121
151
|
function matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions) {
|
|
122
152
|
let premiseNonTerminalNodeMatches = false;
|
|
123
153
|
|
|
124
|
-
const
|
|
154
|
+
const ruleName = nonTerminalNode.getRuleName(),
|
|
155
|
+
premiseRuleName = premiseNonTerminalNode.getRuleName(); ///
|
|
156
|
+
|
|
157
|
+
if (ruleName === premiseRuleName) {
|
|
158
|
+
const childNodes = nonTerminalNode.getChildNodes(),
|
|
159
|
+
premiseChildNodes = premiseNonTerminalNode.getChildNodes(),
|
|
160
|
+
nodes = childNodes, ///
|
|
161
|
+
premiseNodes = premiseChildNodes, ///
|
|
162
|
+
premiseChildNodesMatches = matchPremiseNodes(premiseNodes, nodes, metaSubstitutions);
|
|
163
|
+
|
|
164
|
+
premiseNonTerminalNodeMatches = premiseChildNodesMatches; ///
|
|
125
165
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const premiseMetavariableNode = premiseNonTerminalNode, ///
|
|
129
|
-
premiseMetavariableMatches = matchPremiseMetavariable(premiseMetavariableNode, nonTerminalNode, metaSubstitutions);
|
|
166
|
+
if (!premiseNonTerminalNodeMatches) {
|
|
167
|
+
const ruleNameMetastatementRuleName = (ruleName === METASTATEMENT_RULE_NAME);
|
|
130
168
|
|
|
131
|
-
|
|
169
|
+
if (ruleNameMetastatementRuleName) {
|
|
170
|
+
const metastatementNode = nonTerminalNode, ///
|
|
171
|
+
premiseMetastatementNode = premiseNonTerminalNode, ///
|
|
172
|
+
premiseMetastatementNodeMatches = matchPremiseMetastatementNode(premiseMetastatementNode, metastatementNode, metaSubstitutions);
|
|
132
173
|
|
|
133
|
-
|
|
174
|
+
premiseNonTerminalNodeMatches = premiseMetastatementNodeMatches; ///
|
|
175
|
+
}
|
|
134
176
|
}
|
|
177
|
+
}
|
|
135
178
|
|
|
136
|
-
|
|
137
|
-
|
|
179
|
+
return premiseNonTerminalNodeMatches;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function matchPremiseMetastatementNode(premiseMetastatementNode, metastatementNode, metaSubstitutions) {
|
|
183
|
+
let premiseMetastatementNodeMatches = false;
|
|
184
|
+
|
|
185
|
+
const premiseNonTerminalNode = premiseMetastatementNode, ///
|
|
186
|
+
premiseChildNodes = premiseNonTerminalNode.getChildNodes(),
|
|
187
|
+
premiseChildNodesLength = premiseChildNodes.length;
|
|
138
188
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
189
|
+
if (premiseChildNodesLength === 1) {
|
|
190
|
+
const firstPremiseChildNode = first(premiseChildNodes),
|
|
191
|
+
premiseChildNode = firstPremiseChildNode, ///
|
|
192
|
+
premiseChildNodeNonTerminalNode = premiseChildNode.isNonTerminalNode();
|
|
143
193
|
|
|
144
|
-
|
|
194
|
+
if (premiseChildNodeNonTerminalNode) {
|
|
195
|
+
const premiseNonTerminalChildNode = premiseChildNode, ///
|
|
196
|
+
premiseNonTerminalChildNodeRuleName = premiseNonTerminalChildNode.getRuleName(),
|
|
197
|
+
premiseNonTerminalChildNodeRuleNameMetavariableRuleName = (premiseNonTerminalChildNodeRuleName === METAVARIABLE_RULE_NAME);
|
|
198
|
+
|
|
199
|
+
if (premiseNonTerminalChildNodeRuleNameMetavariableRuleName) {
|
|
200
|
+
const premiseMetavariableNode = premiseNonTerminalChildNode, ///
|
|
201
|
+
nonTerminalNode = metastatementNode, ///
|
|
202
|
+
childNodes = nonTerminalNode.getChildNodes(),
|
|
203
|
+
nodes = childNodes, ///
|
|
204
|
+
premiseMetaVariableMatches = matchPremiseMetavariable(premiseMetavariableNode, nodes, metaSubstitutions);
|
|
205
|
+
|
|
206
|
+
premiseMetastatementNodeMatches = premiseMetaVariableMatches; ///
|
|
145
207
|
}
|
|
146
208
|
}
|
|
147
209
|
}
|
|
148
210
|
|
|
149
|
-
return
|
|
211
|
+
return premiseMetastatementNodeMatches;
|
|
150
212
|
}
|
package/bin/rule.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
const {
|
|
4
|
-
{
|
|
3
|
+
const { prune } = require("./utilities/array"),
|
|
4
|
+
{ someSubArray } = require("./utilities/array"),
|
|
5
|
+
{ labelsAsString } = require("./utilities/string");
|
|
5
6
|
|
|
6
7
|
class Rule {
|
|
7
8
|
constructor(labels, premises, conclusion) {
|
|
@@ -23,20 +24,15 @@ class Rule {
|
|
|
23
24
|
}
|
|
24
25
|
|
|
25
26
|
matchMetastatement(metastatementNode, context) {
|
|
26
|
-
|
|
27
|
+
const metaAssertions = context.getMetaAssertions(),
|
|
28
|
+
premisesLength = this.premises.length,
|
|
29
|
+
matchesMetastatement = someSubArray(metaAssertions, premisesLength, (metaAssertions) => {
|
|
30
|
+
const premisesMatchConclusion = matchPremisesAndConclusion(this.premises, this.conclusion, metaAssertions, metastatementNode);
|
|
27
31
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const matchesMetastatement = someCombination(metastatementNodes, (metastatementNodes) => {
|
|
34
|
-
const premisesMatchConclusion = matchPremisesAndConclusion(this.premises, this.conclusion, metastatementNodes, metastatementNode);
|
|
35
|
-
|
|
36
|
-
if (premisesMatchConclusion) {
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
});
|
|
32
|
+
if (premisesMatchConclusion) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
40
36
|
|
|
41
37
|
return matchesMetastatement;
|
|
42
38
|
}
|
|
@@ -56,24 +52,37 @@ class Rule {
|
|
|
56
52
|
|
|
57
53
|
module.exports = Rule;
|
|
58
54
|
|
|
59
|
-
function matchPremise(premise,
|
|
60
|
-
const
|
|
61
|
-
const
|
|
62
|
-
|
|
55
|
+
function matchPremise(premise, metaAssertions, metaSubstitutions) {
|
|
56
|
+
const metaAssertion = prune(metaAssertions, (metaAssertion) => {
|
|
57
|
+
const metaSubproofNode = metaAssertion.getMetaSubproofNode(),
|
|
58
|
+
metastatementNode = metaAssertion.getMetastatementNode()
|
|
63
59
|
|
|
64
|
-
if (
|
|
65
|
-
|
|
60
|
+
if (metaSubproofNode !== null) {
|
|
61
|
+
const metaSubProofMatches = premise.matchMetaSubproofNode(metaSubproofNode, metaSubstitutions);
|
|
62
|
+
|
|
63
|
+
if (!metaSubProofMatches) { ///
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
66
|
}
|
|
67
|
+
|
|
68
|
+
if (metastatementNode !== null) {
|
|
69
|
+
const metastatementMatches = premise.matchMetastatementNode(metastatementNode, metaSubstitutions);
|
|
70
|
+
|
|
71
|
+
if (!metastatementMatches) { ///
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
67
76
|
}) || null;
|
|
68
77
|
|
|
69
|
-
const premiseMatches = (
|
|
78
|
+
const premiseMatches = (metaAssertion !== null);
|
|
70
79
|
|
|
71
80
|
return premiseMatches;
|
|
72
81
|
}
|
|
73
82
|
|
|
74
|
-
function matchPremises(premise,
|
|
83
|
+
function matchPremises(premise, metaAssertions, metaSubstitutions) {
|
|
75
84
|
const premisesMatches = premise.every((premise) => {
|
|
76
|
-
const premiseMatches = matchPremise(premise,
|
|
85
|
+
const premiseMatches = matchPremise(premise, metaAssertions, metaSubstitutions);
|
|
77
86
|
|
|
78
87
|
if (premiseMatches) {
|
|
79
88
|
return true;
|
|
@@ -84,18 +93,17 @@ function matchPremises(premise, metastatementNodes, metaSubstitutions) {
|
|
|
84
93
|
}
|
|
85
94
|
|
|
86
95
|
function matchConclusion(conclusion, metastatementNode, metaSubstitutions) {
|
|
87
|
-
const
|
|
88
|
-
nonTerminalNodeMatches = conclusion.matchNonTerminalNode(nonTerminalNode, metaSubstitutions),
|
|
96
|
+
const nonTerminalNodeMatches = conclusion.matchMetastatementNode(metastatementNode, metaSubstitutions),
|
|
89
97
|
conclusionMatches = nonTerminalNodeMatches; ///
|
|
90
98
|
|
|
91
99
|
return conclusionMatches;
|
|
92
100
|
}
|
|
93
101
|
|
|
94
|
-
function matchPremisesAndConclusion(premises, conclusion,
|
|
102
|
+
function matchPremisesAndConclusion(premises, conclusion, metaAssertions, metastatementNode) {
|
|
95
103
|
let premisesMatchConclusion = false;
|
|
96
104
|
|
|
97
105
|
const metaSubstitutions = [],
|
|
98
|
-
premisesMatches = matchPremises(premises,
|
|
106
|
+
premisesMatches = matchPremises(premises, metaAssertions, metaSubstitutions);
|
|
99
107
|
|
|
100
108
|
if (premisesMatches) {
|
|
101
109
|
const conclusionMatches = matchConclusion(conclusion, metastatementNode, metaSubstitutions);
|
package/bin/ruleNames.js
CHANGED
|
@@ -4,7 +4,9 @@ const TERM_RULE_NAME = "term",
|
|
|
4
4
|
TYPE_RULE_NAME = "type",
|
|
5
5
|
ARGUMENT_RULE_NAME = "argument",
|
|
6
6
|
METAVARIABLE_RULE_NAME = "metavariable",
|
|
7
|
+
METASTATEMENT_RULE_NAME = "metastatement",
|
|
7
8
|
META_SUBPROOF_RULE_NAME = "metaSubproof",
|
|
9
|
+
META_SUBPROOF_ASSERTION_RULE_NAME = "metaSubproofAssertion",
|
|
8
10
|
QUALIFIED_METASTATEMENT_RULE_NAME = "qualifiedMetastatement",
|
|
9
11
|
UNQUALIFIED_METASTATEMENT_RULE_NAME = "unqualifiedMetastatement";
|
|
10
12
|
|
|
@@ -13,7 +15,9 @@ module.exports = {
|
|
|
13
15
|
TYPE_RULE_NAME,
|
|
14
16
|
ARGUMENT_RULE_NAME,
|
|
15
17
|
METAVARIABLE_RULE_NAME,
|
|
18
|
+
METASTATEMENT_RULE_NAME,
|
|
16
19
|
META_SUBPROOF_RULE_NAME,
|
|
20
|
+
META_SUBPROOF_ASSERTION_RULE_NAME,
|
|
17
21
|
QUALIFIED_METASTATEMENT_RULE_NAME,
|
|
18
22
|
UNQUALIFIED_METASTATEMENT_RULE_NAME
|
|
19
23
|
};
|
package/bin/utilities/array.js
CHANGED
|
@@ -2,7 +2,49 @@
|
|
|
2
2
|
|
|
3
3
|
const { arrayUtilities } = require("necessary");
|
|
4
4
|
|
|
5
|
-
const
|
|
5
|
+
const permutationsMatrix = require("../permutationsMatrix");
|
|
6
|
+
|
|
7
|
+
const { MAXIMUM_INDEXES_LENGTH, MAXIMUM_PERMUTATION_LENGTH } = require("../constants");
|
|
8
|
+
|
|
9
|
+
const { push, last, prune, first, third, second, filter } = arrayUtilities;
|
|
10
|
+
|
|
11
|
+
function someSubArray(array, subArrayLength, callback) {
|
|
12
|
+
let found = false;
|
|
13
|
+
|
|
14
|
+
const arrayLength = array.length,
|
|
15
|
+
indexesLength = arrayLength, ///
|
|
16
|
+
permutationLength = subArrayLength; ///
|
|
17
|
+
|
|
18
|
+
if (permutationLength <= MAXIMUM_PERMUTATION_LENGTH) {
|
|
19
|
+
const offset = (indexesLength <= MAXIMUM_INDEXES_LENGTH) ?
|
|
20
|
+
0 :
|
|
21
|
+
indexesLength - MAXIMUM_INDEXES_LENGTH,
|
|
22
|
+
permutations = permutationsMatrix[indexesLength][permutationLength];
|
|
23
|
+
|
|
24
|
+
if (permutations !== null) {
|
|
25
|
+
found = permutations.some((permutation) => {
|
|
26
|
+
if (permutation !== null) {
|
|
27
|
+
const subArray = [];
|
|
28
|
+
|
|
29
|
+
for (let position = 0; position < permutationLength; position++) {
|
|
30
|
+
const index = permutation[position] + offset,
|
|
31
|
+
element = array[index];
|
|
32
|
+
|
|
33
|
+
subArray.push(element);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const passed = callback(subArray);
|
|
37
|
+
|
|
38
|
+
if (passed) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return found;
|
|
47
|
+
}
|
|
6
48
|
|
|
7
49
|
function leftDifference(arrayA, arrayB) {
|
|
8
50
|
filter(arrayA, (elementA) => {
|
|
@@ -14,84 +56,25 @@ function leftDifference(arrayA, arrayB) {
|
|
|
14
56
|
});
|
|
15
57
|
}
|
|
16
58
|
|
|
17
|
-
function
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const array = combination, ///
|
|
21
|
-
passed = callback(array);
|
|
59
|
+
function rightDifference(arrayA, arrayB) {
|
|
60
|
+
filter(arrayB, (elementB) => {
|
|
61
|
+
const arrayAIncludesElementB = arrayA.includes(elementB);
|
|
22
62
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return found;
|
|
63
|
+
if (!arrayAIncludesElementB) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
29
67
|
}
|
|
30
68
|
|
|
31
69
|
module.exports = {
|
|
32
70
|
push,
|
|
71
|
+
last,
|
|
33
72
|
prune,
|
|
34
73
|
first,
|
|
74
|
+
third,
|
|
35
75
|
second,
|
|
36
76
|
filter,
|
|
77
|
+
someSubArray,
|
|
37
78
|
leftDifference,
|
|
38
|
-
|
|
79
|
+
rightDifference
|
|
39
80
|
};
|
|
40
|
-
|
|
41
|
-
function combinationsFromArray(array) {
|
|
42
|
-
const arrayLength = array.length,
|
|
43
|
-
indexCombinations = indexCombinationsFromArrayLength(arrayLength),
|
|
44
|
-
combinations = indexCombinations.map((indexCombination) => {
|
|
45
|
-
const elements = [];
|
|
46
|
-
|
|
47
|
-
for (let position = 0; position < arrayLength; position++) {
|
|
48
|
-
const index = indexCombination[position],
|
|
49
|
-
element = array[index];
|
|
50
|
-
|
|
51
|
-
elements.push(element);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const combination = elements; ///
|
|
55
|
-
|
|
56
|
-
return combination;
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
return combinations;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function indexCombinationsFromArrayLength(arrayLength) {
|
|
63
|
-
let indexCombinations;
|
|
64
|
-
|
|
65
|
-
if (arrayLength === 0) {
|
|
66
|
-
indexCombinations = [];
|
|
67
|
-
} else if (arrayLength === 1) {
|
|
68
|
-
const indexCombination = [
|
|
69
|
-
0
|
|
70
|
-
];
|
|
71
|
-
|
|
72
|
-
indexCombinations = [
|
|
73
|
-
indexCombination
|
|
74
|
-
];
|
|
75
|
-
} else {
|
|
76
|
-
const innerArrayLength = arrayLength - 1,
|
|
77
|
-
innerIndexCombinations = indexCombinationsFromArrayLength(innerArrayLength);
|
|
78
|
-
|
|
79
|
-
indexCombinations = [];
|
|
80
|
-
|
|
81
|
-
innerIndexCombinations.forEach((innerIndexCombination) => {
|
|
82
|
-
const outerIndex = innerArrayLength; ///
|
|
83
|
-
|
|
84
|
-
for (let position = innerArrayLength; position >= 0; position--) {
|
|
85
|
-
const indexCombination = innerIndexCombination.slice(),
|
|
86
|
-
start = position, ///
|
|
87
|
-
deleteCount = 0;
|
|
88
|
-
|
|
89
|
-
indexCombination.splice(start, deleteCount, outerIndex);
|
|
90
|
-
|
|
91
|
-
indexCombinations.push(indexCombination);
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return indexCombinations;
|
|
97
|
-
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const { first, second, third } = require("../utilities/array"),
|
|
4
|
+
{ METASTATEMENT_RULE_NAME } = require("../ruleNames"),
|
|
5
|
+
{ LEFT_BRACKET, RIGHT_BRACKET, BRACKETED_METASTATEMENT_CHILD_NODES_LENGTH } = require("../constants");
|
|
6
|
+
|
|
7
|
+
function matchBracketedMetastatementChildNode(childNodes, callback) {
|
|
8
|
+
let bracketedMetastatementChildNodeMatches = false;
|
|
9
|
+
|
|
10
|
+
const childNodesLength = childNodes.length;
|
|
11
|
+
|
|
12
|
+
if (childNodesLength === BRACKETED_METASTATEMENT_CHILD_NODES_LENGTH) {
|
|
13
|
+
const firstChildNode = first(childNodes),
|
|
14
|
+
thirdChildNode = third(childNodes),
|
|
15
|
+
secondChildNode = second(childNodes),
|
|
16
|
+
firstChildNodeTerminalNode = firstChildNode.isTerminalNode(),
|
|
17
|
+
thirdChildNodeTerminalNode = thirdChildNode.isTerminalNode(),
|
|
18
|
+
secondChildNodeNonTerminalNode = secondChildNode.isNonTerminalNode();
|
|
19
|
+
|
|
20
|
+
if (firstChildNodeTerminalNode && secondChildNodeNonTerminalNode && thirdChildNodeTerminalNode) {
|
|
21
|
+
const nonTerminalNode = secondChildNode, ///
|
|
22
|
+
firstTerminalNode = firstChildNode, ///
|
|
23
|
+
secondTerminalNode = thirdChildNode, ///
|
|
24
|
+
nonTerminalNodeRuleName = nonTerminalNode.getRuleName(),
|
|
25
|
+
firstTerminalNodeContent = firstTerminalNode.getContent(),
|
|
26
|
+
secondTerminalNodeContent = secondTerminalNode.getContent(),
|
|
27
|
+
firstTerminalNodeContentLeftBracket = (firstTerminalNodeContent === LEFT_BRACKET),
|
|
28
|
+
secondTerminalNodeContentRightBracket = (secondTerminalNodeContent === RIGHT_BRACKET),
|
|
29
|
+
nonTerminalNodeRuleNameMetastatementRuleName = (nonTerminalNodeRuleName === METASTATEMENT_RULE_NAME);
|
|
30
|
+
|
|
31
|
+
if (firstTerminalNodeContentLeftBracket && nonTerminalNodeRuleNameMetastatementRuleName && secondTerminalNodeContentRightBracket) {
|
|
32
|
+
const bracketedMetastatementChildNode = nonTerminalNode; ///
|
|
33
|
+
|
|
34
|
+
bracketedMetastatementChildNodeMatches = callback(bracketedMetastatementChildNode);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return bracketedMetastatementChildNodeMatches;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
module.exports = {
|
|
43
|
+
matchBracketedMetastatementChildNode
|
|
44
|
+
};
|