occam-verify-cli 0.0.270 → 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.
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+
3
+ const { nodeQuery } = require("./utilities/query");
4
+
5
+ const statementNodeQuery = nodeQuery("/*/statement!");
6
+
7
+ class Assertion {
8
+ constructor(subproofNode, statementNode) {
9
+ this.subproofNode = subproofNode;
10
+ this.statementNode = statementNode;
11
+ }
12
+
13
+ getNonTerminalNode() {
14
+ const nonTerminalNode = (this.statementNode !== null) ?
15
+ this.statementNode :
16
+ null;
17
+
18
+ return nonTerminalNode;
19
+ }
20
+
21
+ getSubproofNode() {
22
+ return this.subproofNode;
23
+ }
24
+
25
+ getStatementNode() {
26
+ return this.statementNode;
27
+ }
28
+
29
+ match(assertion) {
30
+ let matches = false;
31
+
32
+ const statementNode = assertion.getstatementNode();
33
+
34
+ if ((statementNode !== null) && (this.statementNode !== null)) {
35
+ const nonTerminalNode = this.statementNode, ///
36
+ assertionNonTerminalNode = statementNode, ///
37
+ assertionNonTerminalNodeMatches = matchAssertionNonTerminalNode(assertionNonTerminalNode, nonTerminalNode);
38
+
39
+ matches = assertionNonTerminalNodeMatches; ///
40
+ }
41
+
42
+ return matches;
43
+ }
44
+
45
+ static fromSubproofNode(subproofNode) {
46
+ const statementNode = null,
47
+ assertion = new Assertion(subproofNode, statementNode);
48
+
49
+ return assertion;
50
+ }
51
+
52
+ static fromQualifiedStatementNode(qualifiedStatementNode) {
53
+ const subproofNode = null,
54
+ statementNode = statementNodeQuery(qualifiedStatementNode),
55
+ assertion = new Assertion(subproofNode, statementNode);
56
+
57
+ return assertion;
58
+ }
59
+
60
+ static fromUnqualifiedStatementNode(unqualifiedStatementNode) {
61
+ const subproofNode = null,
62
+ statementNode = statementNodeQuery(unqualifiedStatementNode),
63
+ assertion = new Assertion(subproofNode, statementNode);
64
+
65
+ return assertion;
66
+ }
67
+ }
68
+
69
+ module.exports = Assertion;
70
+
71
+ function matchAssertionNode(assertionNode, node) {
72
+ let assertionNodeMatches = false;
73
+
74
+ const nodeTerminalNode = node.isTerminalNode(),
75
+ ruleNodeTerminalNode = assertionNode.isTerminalNode();
76
+
77
+ if (nodeTerminalNode === ruleNodeTerminalNode) {
78
+ if (nodeTerminalNode) {
79
+ const terminalNode = node, ///
80
+ assertionTerminalNode = assertionNode, ///
81
+ assertionTerminalNodeMatches = matchAssertionTerminalNode(assertionTerminalNode, terminalNode);
82
+
83
+ assertionNodeMatches = assertionTerminalNodeMatches; ///
84
+ } else {
85
+ const nonTerminalNode = node, ///
86
+ assertionNonTerminalNode = assertionNode, ///
87
+ assertionNonTerminalNodeMatches = matchAssertionNonTerminalNode(assertionNonTerminalNode, nonTerminalNode);
88
+
89
+ assertionNodeMatches = assertionNonTerminalNodeMatches; ///
90
+ }
91
+ }
92
+
93
+ return assertionNodeMatches;
94
+ }
95
+
96
+ function matchAssertionChildNodes(assertionChildNodes, childNodes) {
97
+ let assertionChildNodesMatches = false;
98
+
99
+ const childNodesLength = childNodes.length,
100
+ assertionChildNodesLength = assertionChildNodes.length;
101
+
102
+ if (childNodesLength === assertionChildNodesLength) {
103
+ assertionChildNodesMatches = childNodes.every((childNode, index) => {
104
+ const assertionChildNode = assertionChildNodes[index],
105
+ assertionNode = assertionChildNode, ///
106
+ node = childNode, ///
107
+ assertionNodeMatches = matchAssertionNode(assertionNode, node);
108
+
109
+ if (assertionNodeMatches) {
110
+ return true;
111
+ }
112
+ })
113
+ }
114
+
115
+ return assertionChildNodesMatches;
116
+ }
117
+
118
+ function matchAssertionTerminalNode(assertionTerminalNode, terminalNode) {
119
+ let assertionTerminalNodeMatches = false;
120
+
121
+ const matches = assertionTerminalNode.match(terminalNode);
122
+
123
+ if (matches) {
124
+ assertionTerminalNodeMatches = true;
125
+ }
126
+
127
+ return assertionTerminalNodeMatches;
128
+ }
129
+
130
+ function matchAssertionNonTerminalNode(assertionNonTerminalNode, nonTerminalNode) {
131
+ let assertionNonTerminalNodeMatches = false;
132
+
133
+ const ruleName = nonTerminalNode.getRuleName(),
134
+ assertionRuleName = assertionNonTerminalNode.getRuleName(); ///
135
+
136
+ if (ruleName === assertionRuleName) {
137
+ const childNodes = nonTerminalNode.getChildNodes(),
138
+ assertionChildNodes = assertionNonTerminalNode.getChildNodes(),
139
+ assertionChildNodesMatches = matchAssertionChildNodes(assertionChildNodes, childNodes);
140
+
141
+ assertionNonTerminalNodeMatches = assertionChildNodesMatches; ///
142
+ }
143
+
144
+ return assertionNonTerminalNodeMatches;
145
+ }
package/bin/conclusion.js CHANGED
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
 
3
- const { METAVARIABLE_RULE_NAME } = require("./ruleNames"),
4
- { metavariableNameFromMetavariableNode } = require("./utilities/query");
3
+ const { first } = require("./utilities/array"),
4
+ { metavariableNameFromMetavariableNode } = require("./utilities/query"),
5
+ { METAVARIABLE_RULE_NAME, METASTATEMENT_RULE_NAME } = require("./ruleNames");
5
6
 
6
7
  class Conclusion {
7
8
  constructor(metastatementNode) {
@@ -12,13 +13,13 @@ class Conclusion {
12
13
  return this.metastatementNode;
13
14
  }
14
15
 
15
- matchNonTerminalNode(metastatementNode, metaSubstitutions) {
16
+ matchMetastatementNode(metastatementNode, metaSubstitutions) {
16
17
  const nonTerminalNode = metastatementNode, ///
17
18
  conclusionNonTerminalNode = this.metastatementNode, ///
18
19
  conclusionNonTerminalNodeMatches = matchConclusionNonTerminalNode(conclusionNonTerminalNode, nonTerminalNode, metaSubstitutions),
19
- nonTerminalNodeMatches = conclusionNonTerminalNodeMatches; ///
20
+ metastatementNodeMatches = conclusionNonTerminalNodeMatches; ///
20
21
 
21
- return nonTerminalNodeMatches;
22
+ return metastatementNodeMatches;
22
23
  }
23
24
 
24
25
  static fromMetastatementNode(metastatementNode) {
@@ -55,29 +56,27 @@ function matchConclusionNode(conclusionNode, node, metaSubstitutions) {
55
56
  return conclusionNodeMatches;
56
57
  }
57
58
 
58
- function matchConclusionChildNodes(conclusionChildNodes, childNodes, metaSubstitutions) {
59
- let conclusionChildNodesMatches = false;
59
+ function matchConclusionNodes(conclusionNodes, nodes, metaSubstitutions) {
60
+ let conclusionNodesMatches = false;
60
61
 
61
- const childNodesLength = childNodes.length,
62
- conclusionChildNodesLength = conclusionChildNodes.length;
62
+ const nodesLength = nodes.length,
63
+ conclusionNodesLength = conclusionNodes.length;
63
64
 
64
- if (childNodesLength === conclusionChildNodesLength) {
65
- conclusionChildNodesMatches = childNodes.every((childNode, index) => {
66
- const conclusionChildNode = conclusionChildNodes[index],
67
- conclusionNode = conclusionChildNode, ///
68
- node = childNode, ///
65
+ if (nodesLength === conclusionNodesLength) {
66
+ conclusionNodesMatches = nodes.every((node, index) => {
67
+ const conclusionNode = conclusionNodes[index],
69
68
  conclusionNodeMatches = matchConclusionNode(conclusionNode, node, metaSubstitutions);
70
69
 
71
70
  if (conclusionNodeMatches) {
72
71
  return true;
73
72
  }
74
- })
73
+ });
75
74
  }
76
75
 
77
- return conclusionChildNodesMatches;
76
+ return conclusionNodesMatches;
78
77
  }
79
78
 
80
- function matchConclusionMetavariable(conclusionMetavariableNode, nonTerminalNode, metaSubstitutions) {
79
+ function matchConclusionMetavariable(conclusionMetavariableNode, nodes, metaSubstitutions) {
81
80
  let conclusionMetavariableMatches = true;
82
81
 
83
82
  const conclusionMetavariableName = metavariableNameFromMetavariableNode(conclusionMetavariableNode),
@@ -90,22 +89,17 @@ function matchConclusionMetavariable(conclusionMetavariableNode, nonTerminalNode
90
89
  }) || null;
91
90
 
92
91
  if (metaSubstitution !== null) {
93
- const metaSubstitutionNonTerminalNodeMatches = metaSubstitution.matchNonTerminalNode(nonTerminalNode);
92
+ const metaSubstitutionNodesMatch = metaSubstitution.matchNodes(nodes);
94
93
 
95
- conclusionMetavariableMatches = metaSubstitutionNonTerminalNodeMatches; ///
94
+ conclusionMetavariableMatches = metaSubstitutionNodesMatch; ///
96
95
  }
97
96
 
98
97
  return conclusionMetavariableMatches;
99
98
  }
100
99
 
101
100
  function matchConclusionTerminalNode(conclusionTerminalNode, terminalNode, metaSubstitutions) {
102
- let conclusionTerminalNodeMatches = false;
103
-
104
- const matches = conclusionTerminalNode.match(terminalNode);
105
-
106
- if (matches) {
107
- conclusionTerminalNodeMatches = true;
108
- }
101
+ const matches = conclusionTerminalNode.match(terminalNode),
102
+ conclusionTerminalNodeMatches = matches; ///
109
103
 
110
104
  return conclusionTerminalNodeMatches;
111
105
  }
@@ -113,30 +107,62 @@ function matchConclusionTerminalNode(conclusionTerminalNode, terminalNode, metaS
113
107
  function matchConclusionNonTerminalNode(conclusionNonTerminalNode, nonTerminalNode, metaSubstitutions) {
114
108
  let conclusionNonTerminalNodeMatches = false;
115
109
 
116
- const conclusionRuleName = conclusionNonTerminalNode.getRuleName(); ///
110
+ const ruleName = nonTerminalNode.getRuleName(),
111
+ conclusionRuleName = conclusionNonTerminalNode.getRuleName(); ///
117
112
 
118
- switch (conclusionRuleName) {
119
- case METAVARIABLE_RULE_NAME: {
120
- const conclusionMetavariableNode = conclusionNonTerminalNode, ///
121
- conclusionMetavariableMatches = matchConclusionMetavariable(conclusionMetavariableNode, nonTerminalNode, metaSubstitutions);
113
+ if (ruleName === conclusionRuleName) {
114
+ const childNodes = nonTerminalNode.getChildNodes(),
115
+ conclusionChildNodes = conclusionNonTerminalNode.getChildNodes(),
116
+ nodes = childNodes, ///
117
+ conclusionNodes = conclusionChildNodes, ///
118
+ conclusionChildNodesMatches = matchConclusionNodes(conclusionNodes, nodes, metaSubstitutions);
122
119
 
123
- conclusionNonTerminalNodeMatches = conclusionMetavariableMatches;
120
+ conclusionNonTerminalNodeMatches = conclusionChildNodesMatches; ///
124
121
 
125
- break;
122
+ if (!conclusionNonTerminalNodeMatches) {
123
+ const ruleNameMetastatementRuleName = (ruleName === METASTATEMENT_RULE_NAME);
124
+
125
+ if (ruleNameMetastatementRuleName) {
126
+ const metastatementNode = nonTerminalNode, ///
127
+ conclusionMetastatementNode = conclusionNonTerminalNode, ///
128
+ conclusionMetastatementNodeMatches = matchConclusionMetastatementNode(conclusionMetastatementNode, metastatementNode, metaSubstitutions);
129
+
130
+ conclusionNonTerminalNodeMatches = conclusionMetastatementNodeMatches; ///
131
+ }
126
132
  }
133
+ }
127
134
 
128
- default: {
129
- const ruleName = nonTerminalNode.getRuleName();
135
+ return conclusionNonTerminalNodeMatches;
136
+ }
137
+
138
+ function matchConclusionMetastatementNode(conclusionMetastatementNode, metastatementNode, metaSubstitutions) {
139
+ let conclusionMetastatementNodeMatches = false;
140
+
141
+ const conclusionNonTerminalNode = conclusionMetastatementNode, ///
142
+ conclusionChildNodes = conclusionNonTerminalNode.getChildNodes(),
143
+ conclusionChildNodesLength = conclusionChildNodes.length;
144
+
145
+ if (conclusionChildNodesLength === 1) {
146
+ const firstConclusionChildNode = first(conclusionChildNodes),
147
+ conclusionChildNode = firstConclusionChildNode, ///
148
+ conclusionChildNodeNonTerminalNode = conclusionChildNode.isNonTerminalNode();
130
149
 
131
- if (ruleName === conclusionRuleName) {
132
- const childNodes = nonTerminalNode.getChildNodes(),
133
- conclusionChildNodes = conclusionNonTerminalNode.getChildNodes(),
134
- conclusionChildNodesMatches = matchConclusionChildNodes(conclusionChildNodes, childNodes, metaSubstitutions);
150
+ if (conclusionChildNodeNonTerminalNode) {
151
+ const conclusionNonTerminalChildNode = conclusionChildNode, ///
152
+ conclusionNonTerminalChildNodeRuleName = conclusionNonTerminalChildNode.getRuleName(),
153
+ conclusionNonTerminalChildNodeRuleNameMetavariableRuleName = (conclusionNonTerminalChildNodeRuleName === METAVARIABLE_RULE_NAME);
135
154
 
136
- conclusionNonTerminalNodeMatches = conclusionChildNodesMatches; ///
155
+ if (conclusionNonTerminalChildNodeRuleNameMetavariableRuleName) {
156
+ const conclusionMetavariableNode = conclusionNonTerminalChildNode, ///
157
+ nonTerminalNode = metastatementNode, ///
158
+ childNodes = nonTerminalNode.getChildNodes(),
159
+ nodes = childNodes, ///
160
+ conclusionMetaVariableMatches = matchConclusionMetavariable(conclusionMetavariableNode, nodes, metaSubstitutions);
161
+
162
+ conclusionMetastatementNodeMatches = conclusionMetaVariableMatches; ///
137
163
  }
138
164
  }
139
165
  }
140
166
 
141
- return conclusionNonTerminalNodeMatches;
167
+ return conclusionMetastatementNodeMatches;
142
168
  }
package/bin/constants.js CHANGED
@@ -2,8 +2,18 @@
2
2
 
3
3
  const COMMA = ',';
4
4
  const EMPTY_STRING = "";
5
+ const LEFT_BRACKET = "(";
6
+ const RIGHT_BRACKET = ")";
7
+ const MAXIMUM_INDEXES_LENGTH = 10;
8
+ const MAXIMUM_PERMUTATION_LENGTH = 5;
9
+ const BRACKETED_METASTATEMENT_CHILD_NODES_LENGTH = 3;
5
10
 
6
11
  module.exports = {
7
12
  COMMA,
8
- EMPTY_STRING
13
+ EMPTY_STRING,
14
+ LEFT_BRACKET,
15
+ RIGHT_BRACKET,
16
+ MAXIMUM_INDEXES_LENGTH,
17
+ MAXIMUM_PERMUTATION_LENGTH,
18
+ BRACKETED_METASTATEMENT_CHILD_NODES_LENGTH
9
19
  };
@@ -116,6 +116,12 @@ class FileContext {
116
116
  return this.packageContext;
117
117
  }
118
118
 
119
+ getMetaAssertions() {
120
+ const metaAssertions = [];
121
+
122
+ return metaAssertions;
123
+ }
124
+
119
125
  findTypeByTypeName(typeName) {
120
126
  const types = this.getTypes(),
121
127
  type = types.find((type) => {
@@ -186,10 +192,10 @@ class FileContext {
186
192
  return labelPresent;
187
193
  }
188
194
 
189
- isMetaAssertionPresent(metaAssertion) {
190
- const metaAssertionPresent = false;
195
+ matchMetaAssertion(metaAssertion) {
196
+ const metaAssertionMatches = false;
191
197
 
192
- return metaAssertionPresent;
198
+ return metaAssertionMatches;
193
199
  }
194
200
 
195
201
  isTypePresentByTypeName(typeName) {
@@ -16,7 +16,14 @@ class MetaproofContext {
16
16
  }
17
17
 
18
18
  getMetaAssertions() {
19
- return this.metaAssertions;
19
+ let metaAssertions = this.context.getMetaAssertions();
20
+
21
+ metaAssertions = [
22
+ ...metaAssertions,
23
+ ...this.metaAssertions
24
+ ];
25
+
26
+ return metaAssertions;
20
27
  }
21
28
 
22
29
  getRules() { return this.context.getRules(); }
@@ -39,11 +46,13 @@ class MetaproofContext {
39
46
 
40
47
  isTypePresentByTypeName(typeName) { return this.context.isTypePresentByTypeName(typeName); }
41
48
 
42
- isMetaAssertionPresent(metaAssertion) {
43
- const metaAssertionA = metaAssertion; ///
49
+ matchMetaAssertion(metaAssertion) {
50
+ let metaAssertionMatches;
51
+
52
+ const metaAssertionB = metaAssertion; ///
44
53
 
45
- let metaAssertionPresent = this.metaAssertions.some((metaAssertion) => {
46
- const metaAssertionB = metaAssertion, ///
54
+ metaAssertionMatches = this.metaAssertions.some((metaAssertion) => {
55
+ const metaAssertionA = metaAssertion, ///
47
56
  matches = metaAssertionA.match(metaAssertionB);
48
57
 
49
58
  if (matches) {
@@ -51,11 +60,11 @@ class MetaproofContext {
51
60
  }
52
61
  });
53
62
 
54
- if (!metaAssertionPresent) {
55
- metaAssertionPresent = this.context.isMetaAssertionPresent(metaAssertion);
63
+ if (!metaAssertionMatches) {
64
+ metaAssertionMatches = this.context.matchMetaAssertion(metaAssertion);
56
65
  }
57
66
 
58
- return metaAssertionPresent;
67
+ return metaAssertionMatches;
59
68
  }
60
69
 
61
70
  isVariablePresentByVariableName(variableName) { return this.context.isVariablePresentByVariableName(variableName); }
@@ -1,8 +1,13 @@
1
1
  "use strict";
2
2
 
3
- const { nodeQuery } = require("./utilities/query");
3
+ const { first, second } = require("./utilities/array"),
4
+ { nodeQuery, nodesQuery } = require("./utilities/query"),
5
+ { matchBracketedMetastatementChildNode } = require("./utilities/metastatement");
4
6
 
5
- const metastatementNodeQuery = nodeQuery("/*/metastatement!");
7
+ const metastatementNodeQuery = nodeQuery("/*/metastatement!"),
8
+ metastatementNodesQuery = nodesQuery("/metaSubproofAssertion/metastatement"),
9
+ metaSubproofAssertionNodeQuery = nodeQuery("/metastatement/metaSubproofAssertion"),
10
+ qualifiedOrUnqualifiedMetastatementMetastatementNodesQuery = nodesQuery("/metaSubproof/qualifiedMetastatement|unqualifiedMetastatement/metastatement!");
6
11
 
7
12
  class MetaAssertion {
8
13
  constructor(metaSubproofNode, metastatementNode) {
@@ -10,14 +15,6 @@ class MetaAssertion {
10
15
  this.metastatementNode = metastatementNode;
11
16
  }
12
17
 
13
- getNonTerminalNode() {
14
- const nonTerminalNode = (this.metastatementNode !== null) ?
15
- this.metastatementNode :
16
- null;
17
-
18
- return nonTerminalNode;
19
- }
20
-
21
18
  getMetaSubproofNode() {
22
19
  return this.metaSubproofNode;
23
20
  }
@@ -31,17 +28,65 @@ class MetaAssertion {
31
28
 
32
29
  const metastatementNode = metaAssertion.getMetastatementNode();
33
30
 
34
- if ((metastatementNode !== null) && (this.metastatementNode !== null)) {
35
- const nonTerminalNode = this.metastatementNode, ///
36
- metaAssertionNonTerminalNode = metastatementNode, ///
37
- metaAssertionNonTerminalNodeMatches = matchMetaAssertionNonTerminalNode(metaAssertionNonTerminalNode, nonTerminalNode);
31
+ if (metastatementNode !== null) {
32
+ const metaSubproofAssertionNode = metaSubproofAssertionNodeQuery(metastatementNode);
33
+
34
+ if (metaSubproofAssertionNode === null) {
35
+ const metastatementNodeMatches = this.matchMetastatementNode(metastatementNode);
36
+
37
+ matches = metastatementNodeMatches; ///
38
+ } else {
39
+ const metaSubproofAssertionNodeMatches = this.matchMetaSubproofAssertionNode(metaSubproofAssertionNode);
38
40
 
39
- matches = metaAssertionNonTerminalNodeMatches; ///
41
+ matches = metaSubproofAssertionNodeMatches; ///
42
+ }
40
43
  }
41
44
 
42
45
  return matches;
43
46
  }
44
47
 
48
+ matchMetastatementNode(metastatementNode) {
49
+ let metastatementNodeMatches = false;
50
+
51
+ if (this.metastatementNode !== null) {
52
+ const topmostMetastatementNode = metastatementNode, ///
53
+ topmostMetaAssertionMetastatementNode = this.metastatementNode, ///
54
+ topmostMetaAssertionMetastatementNodeMatches = matchTopmostMetaAssertionMetastatementNode(topmostMetaAssertionMetastatementNode, topmostMetastatementNode);
55
+
56
+ metastatementNodeMatches = topmostMetaAssertionMetastatementNodeMatches; ///
57
+ }
58
+
59
+ return metastatementNodeMatches;
60
+ }
61
+
62
+ matchMetaSubproofAssertionNode(metaSubproofAssertionNode) {
63
+ let metaSubproofAssertionNodeMatches = false;
64
+
65
+ if (this.metaSubproofNode !== null) {
66
+ const metaSubproofAssertionMetastatementNodes = metastatementNodesQuery(metaSubproofAssertionNode),
67
+ firstMetaSubproofAssertionMetastatementNode = first(metaSubproofAssertionMetastatementNodes),
68
+ qualifiedOrUnqualifiedMetastatementMetastatementNodes = qualifiedOrUnqualifiedMetastatementMetastatementNodesQuery(this.metaSubproofNode),
69
+ firstQualifiedOrUnqualifiedMetastatementMetastatementNode = first(qualifiedOrUnqualifiedMetastatementMetastatementNodes);
70
+
71
+ const topmostMetastatementNode = firstMetaSubproofAssertionMetastatementNode, ///
72
+ topmostMetaAssertionMetastatementNode = firstQualifiedOrUnqualifiedMetastatementMetastatementNode, ///
73
+ topmostMetaAssertionMetastatementNodeMatches = matchTopmostMetaAssertionMetastatementNode(topmostMetaAssertionMetastatementNode, topmostMetastatementNode);
74
+
75
+ if (topmostMetaAssertionMetastatementNodeMatches) {
76
+ const secondMetaSubproofAssertionMetastatementNode = second(metaSubproofAssertionMetastatementNodes),
77
+ secondQualifiedOrUnqualifiedMetastatementMetastatementNode = second(qualifiedOrUnqualifiedMetastatementMetastatementNodes);
78
+
79
+ const topmostMetastatementNode = secondMetaSubproofAssertionMetastatementNode, ///
80
+ topmostMetaAssertionMetastatementNode = secondQualifiedOrUnqualifiedMetastatementMetastatementNode, ///
81
+ topmostMetaAssertionMetastatementNodeMatches = matchTopmostMetaAssertionMetastatementNode(topmostMetaAssertionMetastatementNode, topmostMetastatementNode);
82
+
83
+ metaSubproofAssertionNodeMatches = topmostMetaAssertionMetastatementNodeMatches; ///
84
+ }
85
+ }
86
+
87
+ return metaSubproofAssertionNodeMatches;
88
+ }
89
+
45
90
  static fromMetaSubproofNode(metaSubproofNode) {
46
91
  const metastatementNode = null,
47
92
  metaAssertion = new MetaAssertion(metaSubproofNode, metastatementNode);
@@ -49,6 +94,13 @@ class MetaAssertion {
49
94
  return metaAssertion;
50
95
  }
51
96
 
97
+ static fromMetastatementNode(metastatementNode) {
98
+ const metaSubproofNode = null,
99
+ metaAssertion = new MetaAssertion(metaSubproofNode, metastatementNode);
100
+
101
+ return metaAssertion;
102
+ }
103
+
52
104
  static fromQualifiedMetastatementNode(qualifiedMetastatementNode) {
53
105
  const metaSubproofNode = null,
54
106
  metastatementNode = metastatementNodeQuery(qualifiedMetastatementNode),
@@ -93,26 +145,24 @@ function matchMetaAssertionNode(metaAssertionNode, node) {
93
145
  return metaAssertionNodeMatches;
94
146
  }
95
147
 
96
- function matchMetaAssertionChildNodes(metaAssertionChildNodes, childNodes) {
97
- let metaAssertionChildNodesMatches = false;
148
+ function matchMetaAssertionNodes(metaAssertionNodes, nodes) {
149
+ let metaAssertionNodesMatches = false;
98
150
 
99
- const childNodesLength = childNodes.length,
100
- metaAssertionChildNodesLength = metaAssertionChildNodes.length;
151
+ const nodesLength = nodes.length,
152
+ metaAssertionNodesLength = metaAssertionNodes.length;
101
153
 
102
- if (childNodesLength === metaAssertionChildNodesLength) {
103
- metaAssertionChildNodesMatches = childNodes.every((childNode, index) => {
104
- const metaAssertionChildNode = metaAssertionChildNodes[index],
105
- metaAssertionNode = metaAssertionChildNode, ///
106
- node = childNode, ///
154
+ if (nodesLength === metaAssertionNodesLength) {
155
+ metaAssertionNodesMatches = nodes.every((node, index) => {
156
+ const metaAssertionNode = metaAssertionNodes[index],
107
157
  metaAssertionNodeMatches = matchMetaAssertionNode(metaAssertionNode, node);
108
158
 
109
159
  if (metaAssertionNodeMatches) {
110
160
  return true;
111
161
  }
112
- })
162
+ });
113
163
  }
114
164
 
115
- return metaAssertionChildNodesMatches;
165
+ return metaAssertionNodesMatches;
116
166
  }
117
167
 
118
168
  function matchMetaAssertionTerminalNode(metaAssertionTerminalNode, terminalNode) {
@@ -135,11 +185,63 @@ function matchMetaAssertionNonTerminalNode(metaAssertionNonTerminalNode, nonTerm
135
185
 
136
186
  if (ruleName === metaAssertionRuleName) {
137
187
  const childNodes = nonTerminalNode.getChildNodes(),
188
+ nodes = childNodes, ///
138
189
  metaAssertionChildNodes = metaAssertionNonTerminalNode.getChildNodes(),
139
- metaAssertionChildNodesMatches = matchMetaAssertionChildNodes(metaAssertionChildNodes, childNodes);
190
+ metaAssertionNodes = metaAssertionChildNodes, ///
191
+ metaAssertionNodesMatches = matchMetaAssertionNodes(metaAssertionNodes, nodes);
140
192
 
141
- metaAssertionNonTerminalNodeMatches = metaAssertionChildNodesMatches; ///
193
+ metaAssertionNonTerminalNodeMatches = metaAssertionNodesMatches; ///
142
194
  }
143
195
 
144
196
  return metaAssertionNonTerminalNodeMatches;
145
197
  }
198
+
199
+ function matchMetaAssertionMetastatementNode(metaAssertionMetastatementNode, metastatementNode) {
200
+ const nonTerminalNode = metastatementNode, ///
201
+ metaAssertionNonTerminalNode = metaAssertionMetastatementNode, ///
202
+ metaAssertionNonTerminalNodeMatches = matchMetaAssertionNonTerminalNode(metaAssertionNonTerminalNode, nonTerminalNode),
203
+ metaAssertionMetastatementNodeNatches = metaAssertionNonTerminalNodeMatches; ///
204
+
205
+ return metaAssertionMetastatementNodeNatches;
206
+ }
207
+
208
+ function matchTopmostMetaAssertionMetastatementNode(topmostMetaAssertionMetastatementNode, topmostMetastatementNode) {
209
+ let metaAssertionMetastatementNodeMatches;
210
+
211
+ const metastatementNode = topmostMetastatementNode, ///
212
+ metaAssertionMetastatementNode = topmostMetaAssertionMetastatementNode; ///
213
+
214
+ metaAssertionMetastatementNodeMatches = matchMetaAssertionMetastatementNode(metaAssertionMetastatementNode, metastatementNode);
215
+
216
+ if (!metaAssertionMetastatementNodeMatches) {
217
+ const nonTerminalNode = metastatementNode, ///
218
+ childNodes = nonTerminalNode, ///
219
+ bracketedMetastatementChildNodeMatches = matchBracketedMetastatementChildNode(childNodes, (bracketedMetastatementChildNode) => {
220
+ const metastatementNode = bracketedMetastatementChildNode, ///
221
+ metaAssertionMetastatementNodeMatches = matchMetaAssertionMetastatementNode(metaAssertionMetastatementNode, metastatementNode),
222
+ bracketedMetastatementChildNodeMatches = metaAssertionMetastatementNodeMatches;
223
+
224
+ return bracketedMetastatementChildNodeMatches;
225
+ });
226
+
227
+ metaAssertionMetastatementNodeMatches = bracketedMetastatementChildNodeMatches; ///
228
+ }
229
+
230
+ if (!metaAssertionMetastatementNodeMatches) {
231
+ const metaAssertionNonTerminalNode = metaAssertionMetastatementNode, ///
232
+ metaAssertionChildNodes = metaAssertionNonTerminalNode.getChildNodes(),
233
+ bracketedMetaAssertionMetastatementChildNodeMatches = matchBracketedMetastatementChildNode(metaAssertionChildNodes, (bracketedMetaAssertionMetastatementChildNode) => {
234
+ const metaAssertionMetastatementNode = bracketedMetaAssertionMetastatementChildNode, ///
235
+ metaAssertionMetastatementNodeMatches = matchMetaAssertionMetastatementNode(metaAssertionMetastatementNode, metastatementNode),
236
+ bracketedMetaAssertionMetastatementChildNodeMatches = metaAssertionMetastatementNodeMatches;
237
+
238
+ return bracketedMetaAssertionMetastatementChildNodeMatches;
239
+ });
240
+
241
+ metaAssertionMetastatementNodeMatches = bracketedMetaAssertionMetastatementChildNodeMatches; ///
242
+ }
243
+
244
+ const topmostMetaAssertionMetastatementNodeMatches = metaAssertionMetastatementNodeMatches; ///
245
+
246
+ return topmostMetaAssertionMetastatementNodeMatches;
247
+ }