occam-verify-cli 0.0.835 → 0.0.837

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.
Files changed (37) hide show
  1. package/lib/mixins/nodesVerifier/intrinsiclevel.js +59 -0
  2. package/lib/mixins/nodesVerifier/metaLevel.js +40 -0
  3. package/lib/substitution/metastatementForMetavariable.js +82 -5
  4. package/lib/substitution/statementForMetavariable.js +82 -5
  5. package/lib/substitution/termForVariable.js +82 -5
  6. package/lib/substitution.js +74 -0
  7. package/lib/utilities/metaproof.js +2 -2
  8. package/lib/utilities/proof.js +2 -2
  9. package/lib/verifier/node/statementAsCombinator.js +7 -7
  10. package/lib/verifier/node/termAsConstructor.js +10 -18
  11. package/lib/verifier/nodes/equality.js +18 -8
  12. package/lib/verifier/nodes/intrinsicLevel.js +11 -51
  13. package/lib/verifier/nodes/metaLevel.js +9 -30
  14. package/lib/verifier/nodes/metaLevelToIntrinsicLevel.js +85 -31
  15. package/lib/verifier/nodes/statement.js +2 -3
  16. package/lib/verifier/nodes/term.js +2 -3
  17. package/lib/verify/containment.js +5 -14
  18. package/lib/verify/statement.js +23 -62
  19. package/package.json +2 -2
  20. package/src/mixins/nodesVerifier/intrinsiclevel.js +73 -0
  21. package/src/mixins/nodesVerifier/metaLevel.js +39 -0
  22. package/src/substitution/metastatementForMetavariable.js +5 -1
  23. package/src/substitution/statementForMetavariable.js +5 -1
  24. package/src/substitution/termForVariable.js +5 -1
  25. package/src/substitution.js +33 -0
  26. package/src/utilities/metaproof.js +1 -1
  27. package/src/utilities/proof.js +1 -1
  28. package/src/verifier/node/statementAsCombinator.js +10 -11
  29. package/src/verifier/node/termAsConstructor.js +11 -11
  30. package/src/verifier/nodes/equality.js +25 -10
  31. package/src/verifier/nodes/intrinsicLevel.js +13 -72
  32. package/src/verifier/nodes/metaLevel.js +11 -37
  33. package/src/verifier/nodes/metaLevelToIntrinsicLevel.js +115 -49
  34. package/src/verifier/nodes/statement.js +2 -3
  35. package/src/verifier/nodes/term.js +2 -3
  36. package/src/verify/containment.js +2 -3
  37. package/src/verify/statement.js +24 -25
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+
3
+ import verifyTerm from "../../verify/term";
4
+ import TermForVariableSubstitution from "../../substitution/termForVariable";
5
+
6
+ import { first } from "../../utilities/array";
7
+
8
+ function verifyVariableNode(variableNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead) {
9
+ let variableNodeVerified = false;
10
+
11
+ const substitution = substitutions.find((substitution) => {
12
+ const substitutionMatchesVariableNodeA = substitution.matchVariableNode(variableNodeA);
13
+
14
+ if (substitutionMatchesVariableNodeA) {
15
+ return true;
16
+ }
17
+ }) || null;
18
+
19
+ if (substitution !== null) {
20
+ const termNode = termNodeB, ///
21
+ termNodeMatches = substitution.matchTermNode(termNode);
22
+
23
+ if (termNodeMatches) {
24
+ const verifiedAhead = verifyAhead();
25
+
26
+ variableNodeVerified = verifiedAhead; ///
27
+ }
28
+ } else {
29
+ const variableNode = variableNodeA, ///
30
+ localContext = localContextA, ///
31
+ variable = localContext.findVariableByVariableNode(variableNode);
32
+
33
+ if (variable !== null) {
34
+ const terms = [],
35
+ context = localContextB, ///
36
+ termNode = termNodeB, ///
37
+ termVerified = verifyTerm(termNode, terms, context, () => {
38
+ let verifiedAhead = false;
39
+
40
+ const firstTerm = first(terms),
41
+ term = firstTerm, ///
42
+ termType = term.getType(),
43
+ variableType = variable.getType(),
44
+ variableTypeEqualToOrSuperTypeOfTermType = variableType.isEqualToOrSuperTypeOf(termType);
45
+
46
+ if (variableTypeEqualToOrSuperTypeOfTermType) {
47
+ const termForVariableSubstitution = TermForVariableSubstitution.fromVariableNodeAndTermNode(variableNode, termNode),
48
+ substitution = termForVariableSubstitution; ///
49
+
50
+ substitutions.push(substitution);
51
+
52
+ verifiedAhead = verifyAhead();
53
+
54
+ if (!verifiedAhead) {
55
+ substitutions.pop();
56
+ }
57
+ }
58
+
59
+ return verifiedAhead;
60
+ });
61
+
62
+ variableNodeVerified = termVerified; ///
63
+ }
64
+ }
65
+
66
+ return variableNodeVerified;
67
+ }
68
+
69
+ const intrinsicLevelNodesVerifierMixins = {
70
+ verifyVariableNode
71
+ };
72
+
73
+ export default intrinsicLevelNodesVerifierMixins;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ import MetastatementForMetavariableSubstitution from "../../substitution/metastatementForMetavariable";
4
+
5
+ function verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead) {
6
+ let metavariableNodeVerified;
7
+
8
+ const substitution = substitutions.find((substitution) => {
9
+ const substitutionMatchesMetavariableNodeA = substitution.matchMetavariableNode(metavariableNodeA);
10
+
11
+ if (substitutionMatchesMetavariableNodeA) {
12
+ return true;
13
+ }
14
+ }) || null;
15
+
16
+ if (substitution !== null) {
17
+ const metastatementNode = metastatementNodeB, ///
18
+ metastatementNodeMatches = substitution.matchMetastatementNode(metastatementNode);
19
+
20
+ metavariableNodeVerified = metastatementNodeMatches; ///
21
+ } else {
22
+ const metavariableNode = metavariableNodeA, ///
23
+ metastatementNode = metastatementNodeB, ///
24
+ metastatementForMetavariableSubstitution = MetastatementForMetavariableSubstitution.fromMetavariableNodeAndMetastatementNode(metavariableNode, metastatementNode),
25
+ substitution = metastatementForMetavariableSubstitution; ///
26
+
27
+ substitutions.push(substitution);
28
+
29
+ metavariableNodeVerified = true;
30
+ }
31
+
32
+ return metavariableNodeVerified;
33
+ }
34
+
35
+ const metaLevelNodesVerifierMixins = {
36
+ verifyMetavariableNode
37
+ };
38
+
39
+ export default metaLevelNodesVerifierMixins;
@@ -1,9 +1,13 @@
1
1
  "use strict";
2
2
 
3
+ import Substitution from "../substitution";
4
+
3
5
  import { bracketedMetastatementChildNodeFromMetastatementNode } from "../utilities/metaproof";
4
6
 
5
- export default class MetastatementForMetavariableSubstitution {
7
+ export default class MetastatementForMetavariableSubstitution extends Substitution {
6
8
  constructor(metavariableNode, metastatementNode) {
9
+ super();
10
+
7
11
  this.metavariableNode = metavariableNode;
8
12
  this.metastatementNode = metastatementNode;
9
13
  }
@@ -1,9 +1,13 @@
1
1
  "use strict";
2
2
 
3
+ import Substitution from "../substitution";
4
+
3
5
  import { bracketedStatementChildNodeFromStatementNode } from "../utilities/proof";
4
6
 
5
- export default class StatementForMetavariableSubstitution {
7
+ export default class StatementForMetavariableSubstitution extends Substitution {
6
8
  constructor(metavariableNode, statementNode) {
9
+ super();
10
+
7
11
  this.metavariableNode = metavariableNode;
8
12
  this.statementNode = statementNode;
9
13
  }
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
 
3
- export default class TermForVariableSubstitution {
3
+ import Substitution from "../substitution";
4
+
5
+ export default class TermForVariableSubstitution extends Substitution {
4
6
  constructor(variableNode, termNode) {
7
+ super();
8
+
5
9
  this.variableNode = variableNode;
6
10
  this.termNode = termNode;
7
11
  }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ export default class Substitution {
4
+ matchTermNode(termNode) {
5
+ const termNodeMatches = false;
6
+
7
+ return termNodeMatches;
8
+ }
9
+
10
+ matchVariableNode(variableNode) {
11
+ const variableNodeMatches = false;
12
+
13
+ return variableNodeMatches;
14
+ }
15
+
16
+ matchStatementNode(statementNode) {
17
+ const statementNodeMatches = false;
18
+
19
+ return statementNodeMatches;
20
+ }
21
+
22
+ matchMetavariableNode(metavariableNode) {
23
+ const metavariableNodeMatches = false;
24
+
25
+ return metavariableNodeMatches;
26
+ }
27
+
28
+ matchMetastatementNode(metastatementNode) {
29
+ const metastatementNodeMatches = false;
30
+
31
+ return metastatementNodeMatches;
32
+ }
33
+ }
@@ -5,7 +5,7 @@ import bracketedMetastatementNode from "../node/metastatement/bracketed";
5
5
  import { nodeQuery } from "../utilities/query";
6
6
  import { BRACKETED_METASTATEMENT_DEPTH } from "../constants";
7
7
 
8
- const bracketedMetastatementChildNodeQuery = nodeQuery('/metastatement/metastatement!');
8
+ const bracketedMetastatementChildNodeQuery = nodeQuery("/metastatement/metastatement!");
9
9
 
10
10
  export function matchMetastatementModuloBrackets(metastatementNodeA, metastatementNodeB) {
11
11
  let metastatementMatchesModuloBrackets = false;
@@ -5,7 +5,7 @@ import bracketedStatementNode from "../node/statement/bracketed";
5
5
  import { nodeQuery } from "../utilities/query";
6
6
  import { BRACKETED_STATEMENT_DEPTH } from "../constants";
7
7
 
8
- const bracketedStatementChildNodeQuery = nodeQuery('/statement/metaArgument!/statement!');
8
+ const bracketedStatementChildNodeQuery = nodeQuery("/statement/metaArgument!/statement!");
9
9
 
10
10
  export function matchStatementModuloBrackets(statementNodeA, statementNodeB) {
11
11
  let statementMatchesModuloBrackets = false;
@@ -14,12 +14,12 @@ class StatementAsCombinatorNodeVerifier extends NodeVerifier {
14
14
  const ruleName = nonTerminalNode.getRuleName();
15
15
 
16
16
  switch (ruleName) {
17
- case TYPE_RULE_NAME: {
18
- const typeNode = nonTerminalNode, ///
19
- standaloneTypeVerified = verifyStandaloneType(typeNode, fileContext, verifyAhead),
20
- typeNodeVerified = standaloneTypeVerified; ///
17
+ case STATEMENT_RULE_NAME: {
18
+ const statementNode = nonTerminalNode, ///
19
+ standaloneStatementVerified = verifyStandaloneStatement(statementNode, fileContext, verifyAhead),
20
+ statementNodeVerified = standaloneStatementVerified; ///
21
21
 
22
- nonTerminalNodeVerified = typeNodeVerified; ///
22
+ nonTerminalNodeVerified = statementNodeVerified; ///
23
23
 
24
24
  break;
25
25
  }
@@ -34,12 +34,12 @@ class StatementAsCombinatorNodeVerifier extends NodeVerifier {
34
34
  break;
35
35
  }
36
36
 
37
- case STATEMENT_RULE_NAME: {
38
- const statementNode = nonTerminalNode, ///
39
- standaloneStatementVerified = verifyStandaloneStatement(statementNode, fileContext, verifyAhead),
40
- statementNodeVerified = standaloneStatementVerified; ///
37
+ case TYPE_RULE_NAME: {
38
+ const typeNode = nonTerminalNode, ///
39
+ standaloneTypeVerified = verifyStandaloneType(typeNode, fileContext, verifyAhead),
40
+ typeNodeVerified = standaloneTypeVerified; ///
41
41
 
42
- nonTerminalNodeVerified = statementNodeVerified; ///
42
+ nonTerminalNodeVerified = typeNodeVerified; ///
43
43
 
44
44
  break;
45
45
  }
@@ -58,4 +58,3 @@ class StatementAsCombinatorNodeVerifier extends NodeVerifier {
58
58
  const statementAsCombinatorNodeVerifier = new StatementAsCombinatorNodeVerifier();
59
59
 
60
60
  export default statementAsCombinatorNodeVerifier;
61
-
@@ -17,16 +17,6 @@ class TermAsConstructorNodeVerifier extends NodeVerifier {
17
17
  const ruleName = nonTerminalNode.getRuleName();
18
18
 
19
19
  switch (ruleName) {
20
- case TERM_RULE_NAME: {
21
- const termNode = nonTerminalNode, ///
22
- standaloneTermVerified = verifyStandaloneTerm(termNode, fileContext, verifyAhead),
23
- termNodeVerified = standaloneTermVerified; ///
24
-
25
- nonTerminalNodeVerified = termNodeVerified; ///
26
-
27
- break;
28
- }
29
-
30
20
  case ARGUMENT_RULE_NAME: {
31
21
  const argumentNode = nonTerminalNode, ///
32
22
  argumentVerified = verifyArgument(argumentNode, fileContext, verifyAhead),
@@ -37,6 +27,16 @@ class TermAsConstructorNodeVerifier extends NodeVerifier {
37
27
  break;
38
28
  }
39
29
 
30
+ case TERM_RULE_NAME: {
31
+ const termNode = nonTerminalNode, ///
32
+ standaloneTermVerified = verifyStandaloneTerm(termNode, fileContext, verifyAhead),
33
+ termNodeVerified = standaloneTermVerified; ///
34
+
35
+ nonTerminalNodeVerified = termNodeVerified; ///
36
+
37
+ break;
38
+ }
39
+
40
40
  default: {
41
41
  nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNode, fileContext, verifyAhead);
42
42
 
@@ -52,7 +52,7 @@ const termAsConstructorNodeVerifier = new TermAsConstructorNodeVerifier();
52
52
 
53
53
  export default termAsConstructorNodeVerifier;
54
54
 
55
- export function verifyArgument(argumentNode, fileContext, verifyAhead) {
55
+ function verifyArgument(argumentNode, fileContext, verifyAhead) {
56
56
  let argumentVerified;
57
57
 
58
58
  const argumentString = fileContext.nodeAsString(argumentNode);
@@ -15,17 +15,11 @@ class EqualityNodesVerifier extends NodesVerifier {
15
15
  if (ruleNameA === ruleNameB) {
16
16
  switch (ruleNameA) {
17
17
  case TERM_RULE_NAME: {
18
- const leftTermNode = nonTerminalNodeA, ///
19
- rightTermNode = nonTerminalNodeB, ///
20
- termNodesEqual = areTermNodesEqual(leftTermNode, rightTermNode, collections);
18
+ const termNodeA = nonTerminalNodeA, ///
19
+ termNodeB = nonTerminalNodeB, ///
20
+ termNodeVerified = this.verifyTermNode(termNodeA, termNodeB, collections, localContext, verifyAhead);
21
21
 
22
- if (termNodesEqual) {
23
- const verifiedAhead = verifyAhead();
24
-
25
- nonTerminalNodeVerified = verifiedAhead; ///
26
- } else {
27
- nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, collections, localContext, verifyAhead);
28
- }
22
+ nonTerminalNodeVerified = termNodeVerified; ///
29
23
 
30
24
  break;
31
25
  }
@@ -40,6 +34,27 @@ class EqualityNodesVerifier extends NodesVerifier {
40
34
 
41
35
  return nonTerminalNodeVerified;
42
36
  }
37
+
38
+ verifyTermNode(termNodeA, termNodeB, collections, localContext, verifyAhead) {
39
+ let termNodeVerified;
40
+
41
+ const leftTermNode = termNodeA, ///
42
+ rightTermNode = termNodeB, ///
43
+ termNodesEqual = areTermNodesEqual(leftTermNode, rightTermNode, collections);
44
+
45
+ if (termNodesEqual) {
46
+ const verifiedAhead = verifyAhead();
47
+
48
+ termNodeVerified = verifiedAhead; ///
49
+ } else {
50
+ const nonTerminalNodeA = termNodeA, ///
51
+ nonTerminalNodeB = termNodeB; ///
52
+
53
+ termNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, collections, localContext, verifyAhead);
54
+ }
55
+
56
+ return termNodeVerified;
57
+ }
43
58
  }
44
59
 
45
60
  const equalityNodesVerifier = new EqualityNodesVerifier();
@@ -1,14 +1,12 @@
1
1
  "use strict";
2
2
 
3
- import verifyTerm from "../../verify/term";
4
3
  import NodesVerifier from "../../verifier/nodes";
5
- import TermForVariableSubstitution from "../../substitution/termForVariable";
4
+ import intrinsicLevelNodesVerifierMixins from "../../mixins/nodesVerifier/intrinsiclevel";
6
5
 
7
- import { first } from "../../utilities/array";
8
6
  import { nodeQuery } from "../../utilities/query";
9
7
  import { TERM_RULE_NAME } from "../../ruleNames";
10
8
 
11
- const variableNodeQuery = nodeQuery('/term/variable!');
9
+ const variableNodeQuery = nodeQuery("/term/variable!");
12
10
 
13
11
  class IntrinsicLevelNodesVerifier extends NodesVerifier {
14
12
  verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, verifyAhead) {
@@ -26,11 +24,7 @@ class IntrinsicLevelNodesVerifier extends NodesVerifier {
26
24
  termNodeB = nonTerminalNodeB, ///
27
25
  termNodeVerified = this.verifyTermNode(termNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead);
28
26
 
29
- if (termNodeVerified) {
30
- nonTerminalNodeVerified = true; ///
31
- } else {
32
- nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, verifyAhead);
33
- }
27
+ nonTerminalNodeVerified = termNodeVerified; ///
34
28
 
35
29
  break;
36
30
  }
@@ -47,81 +41,28 @@ class IntrinsicLevelNodesVerifier extends NodesVerifier {
47
41
  }
48
42
 
49
43
  verifyTermNode(termNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead) {
50
- let termNodeVerified = false;
44
+ let termNodeVerified;
51
45
 
52
46
  const variableNodeA = variableNodeQuery(termNodeA);
53
47
 
54
48
  if (variableNodeA !== null) {
55
- const variableVerified = this.verifyVariableNode(variableNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead);
56
-
57
- termNodeVerified = variableVerified; ///
58
- }
59
-
60
- return termNodeVerified;
61
- }
49
+ const variableNodeVerified = this.verifyVariableNode(variableNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead);
62
50
 
63
- verifyVariableNode(variableNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead) {
64
- let variableVerified = false;
65
-
66
- const substitution = substitutions.find((substitution) => {
67
- const substitutionMatchesVariableNodeA = substitution.matchVariableNode(variableNodeA);
68
-
69
- if (substitutionMatchesVariableNodeA) {
70
- return true;
71
- }
72
- }) || null;
73
-
74
- if (substitution !== null) {
75
- const termNode = termNodeB, ///
76
- substitutionNodesVerified = substitution.matchTermNode(termNode);
77
-
78
- if (substitutionNodesVerified) {
79
- const verifiedAhead = verifyAhead();
80
-
81
- variableVerified = verifiedAhead; ///
82
- }
51
+ termNodeVerified = variableNodeVerified; ///
83
52
  } else {
84
- const variableNode = variableNodeA, ///
85
- localContext = localContextA, ///
86
- variable = localContext.findVariableByVariableNode(variableNode);
87
-
88
- if (variable !== null) {
89
- const terms = [],
90
- context = localContextB, ///
91
- termNode = termNodeB, ///
92
- termVerified = verifyTerm(termNode, terms, context, () => {
93
- let verifiedAhead = false;
94
-
95
- const firstTerm = first(terms),
96
- term = firstTerm, ///
97
- termType = term.getType(),
98
- variableType = variable.getType(),
99
- variableTypeEqualToOrSuperTypeOfTermType = variableType.isEqualToOrSuperTypeOf(termType);
100
-
101
- if (variableTypeEqualToOrSuperTypeOfTermType) {
102
- const termForVariableSubstitution = TermForVariableSubstitution.fromVariableNodeAndTermNode(variableNode, termNode),
103
- substitution = termForVariableSubstitution; ///
104
-
105
- substitutions.push(substitution);
106
-
107
- verifiedAhead = verifyAhead();
108
-
109
- if (!verifiedAhead) {
110
- substitutions.pop();
111
- }
112
- }
113
-
114
- return verifiedAhead;
115
- });
53
+ const nonTerminalNodeA = termNodeA, ///
54
+ nonTerminalNodeB = termNodeB, ///
55
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, verifyAhead);
116
56
 
117
- variableVerified = termVerified; ///
118
- }
57
+ termNodeVerified = nonTerminalNodeVerified; ///
119
58
  }
120
59
 
121
- return variableVerified;
60
+ return termNodeVerified;
122
61
  }
123
62
  }
124
63
 
64
+ Object.assign(IntrinsicLevelNodesVerifier.prototype, intrinsicLevelNodesVerifierMixins);
65
+
125
66
  const intrinsicLevelNodesVerifier = new IntrinsicLevelNodesVerifier();
126
67
 
127
68
  export default intrinsicLevelNodesVerifier;
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
 
3
3
  import NodesVerifier from "../../verifier/nodes";
4
- import MetastatementForMetavariableSubstitution from "../../substitution/metastatementForMetavariable";
4
+ import metaLevelNodesVerifierMixins from "../../mixins/nodesVerifier/metaLevel";
5
5
 
6
6
  import { nodeQuery } from "../../utilities/query";
7
7
  import { METASTATEMENT_RULE_NAME } from "../../ruleNames";
8
8
 
9
- const metavariableNodeQuery = nodeQuery('/metastatement/metavariable!');
9
+ const metavariableNodeQuery = nodeQuery("/metastatement/metavariable!");
10
10
 
11
11
  class MetaLevelNodesVerifier extends NodesVerifier {
12
12
  verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead) {
@@ -24,11 +24,7 @@ class MetaLevelNodesVerifier extends NodesVerifier {
24
24
  metastatementNodeB = nonTerminalNodeB, ///
25
25
  metastatementNodeVerified = this.verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead);
26
26
 
27
- if (metastatementNodeVerified) {
28
- nonTerminalNodeVerified = true; ///
29
- } else {
30
- nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead);
31
- }
27
+ nonTerminalNodeVerified = metastatementNodeVerified; ///
32
28
 
33
29
  break;
34
30
  }
@@ -45,7 +41,7 @@ class MetaLevelNodesVerifier extends NodesVerifier {
45
41
  }
46
42
 
47
43
  verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead) {
48
- let metastatementNodeVerified = false;
44
+ let metastatementNodeVerified;
49
45
 
50
46
  const metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
51
47
 
@@ -53,42 +49,20 @@ class MetaLevelNodesVerifier extends NodesVerifier {
53
49
  const metaVariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead);
54
50
 
55
51
  metastatementNodeVerified = metaVariableNodeVerified; ///
56
- }
57
-
58
- return metastatementNodeVerified;
59
- }
60
-
61
- verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead) {
62
- let metavariableNodeVerified;
63
-
64
- const substitution = substitutions.find((substitution) => {
65
- const substitutionMatchesMetavariableNodeA = substitution.matchMetavariableNode(metavariableNodeA);
66
-
67
- if (substitutionMatchesMetavariableNodeA) {
68
- return true;
69
- }
70
- }) || null;
71
-
72
- if (substitution !== null) {
73
- const metastatementNode = metastatementNodeB, ///
74
- metastatementNodeMatches = substitution.matchMetastatementNode(metastatementNode);
75
-
76
- metavariableNodeVerified = metastatementNodeMatches; ///
77
52
  } else {
78
- const metavariableNode = metavariableNodeA, ///
79
- metastatementNode = metastatementNodeB, ///
80
- metastatementForMetavariableSubstitution = MetastatementForMetavariableSubstitution.fromMetavariableNodeAndMetastatementNode(metavariableNode, metastatementNode),
81
- substitution = metastatementForMetavariableSubstitution; ///
82
-
83
- substitutions.push(substitution);
53
+ const nonTerminalNodeA = metastatementNodeA, ///
54
+ nonTerminalNodeB = metastatementNodeB, ///
55
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead);
84
56
 
85
- metavariableNodeVerified = true;
57
+ metastatementNodeVerified = nonTerminalNodeVerified; ///
86
58
  }
87
59
 
88
- return metavariableNodeVerified;
60
+ return metastatementNodeVerified;
89
61
  }
90
62
  }
91
63
 
64
+ Object.assign(MetaLevelNodesVerifier.prototype, metaLevelNodesVerifierMixins);
65
+
92
66
  const metaLevelNodesVerifier = new MetaLevelNodesVerifier();
93
67
 
94
68
  export default metaLevelNodesVerifier;