occam-verify-cli 0.0.837 → 0.0.839

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 (50) hide show
  1. package/lib/constants.js +5 -1
  2. package/lib/context/file.js +24 -9
  3. package/lib/context/local.js +77 -39
  4. package/lib/context/localMeta.js +3 -3
  5. package/lib/context/release.js +4 -5
  6. package/lib/equality.js +2 -2
  7. package/lib/equivalence.js +244 -0
  8. package/lib/log.js +3 -3
  9. package/lib/term.js +40 -1
  10. package/lib/utilities/array.js +5 -5
  11. package/lib/utilities/equivalences.js +169 -0
  12. package/lib/verifier/node/metastatement.js +12 -31
  13. package/lib/verifier/node/statementAsCombinator.js +4 -4
  14. package/lib/verifier/node/termAsConstructor.js +7 -27
  15. package/lib/verifier/nodes/equality.js +8 -8
  16. package/lib/verifier/nodes/metaLevelToIntrinsicLevel.js +22 -6
  17. package/lib/verify/containment.js +22 -12
  18. package/lib/verify/defining.js +38 -0
  19. package/lib/verify/metavariable.js +26 -4
  20. package/lib/verify/statement.js +62 -45
  21. package/lib/verify/term.js +6 -6
  22. package/lib/verify/type.js +7 -7
  23. package/lib/verify/variable.js +26 -4
  24. package/package.json +1 -1
  25. package/src/constants.js +1 -0
  26. package/src/context/file.js +35 -8
  27. package/src/context/local.js +113 -44
  28. package/src/context/localMeta.js +3 -3
  29. package/src/context/release.js +6 -9
  30. package/src/equality.js +2 -2
  31. package/src/{collection.js → equivalence.js} +84 -28
  32. package/src/log.js +2 -2
  33. package/src/term.js +48 -0
  34. package/src/utilities/array.js +1 -1
  35. package/src/utilities/equivalences.js +152 -0
  36. package/src/verifier/node/metastatement.js +23 -51
  37. package/src/verifier/node/statementAsCombinator.js +9 -6
  38. package/src/verifier/node/termAsConstructor.js +13 -44
  39. package/src/verifier/nodes/equality.js +7 -7
  40. package/src/verifier/nodes/metaLevelToIntrinsicLevel.js +38 -12
  41. package/src/verify/containment.js +31 -20
  42. package/src/verify/defining.js +43 -0
  43. package/src/verify/metavariable.js +22 -0
  44. package/src/verify/statement.js +88 -54
  45. package/src/verify/term.js +4 -5
  46. package/src/verify/type.js +6 -7
  47. package/src/verify/variable.js +22 -0
  48. package/lib/collection.js +0 -192
  49. package/lib/utilities/collection.js +0 -121
  50. package/src/utilities/collection.js +0 -103
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+
3
+ import { push, filter, compress, separate } from "../utilities/array";
4
+
5
+ export function areTermNodesEqual(leftTermNode, rightTermNode, equivalences) {
6
+ let termNodesEqual;
7
+
8
+ const leftTermNodeMatchesRightTermNode = leftTermNode.match(rightTermNode);
9
+
10
+ if (leftTermNodeMatchesRightTermNode) {
11
+ termNodesEqual = true;
12
+ } else {
13
+ const termNodes = [
14
+ leftTermNode,
15
+ rightTermNode
16
+ ],
17
+ equivalence = findEquivalenceByTermNodes(equivalences, termNodes);
18
+
19
+ termNodesEqual = (equivalence !== null);
20
+ }
21
+
22
+ return termNodesEqual;
23
+ }
24
+
25
+ export function findEquivalenceByType(equivalences, type, localContext) {
26
+ const equivalence = equivalences.find((equivalence) => {
27
+ const equivalenceMatchesType = equivalence.matchType(type, localContext);
28
+
29
+ if (equivalenceMatchesType) {
30
+ return true;
31
+ }
32
+ }) || null;
33
+
34
+ return equivalence;
35
+ }
36
+
37
+ export function findEquivalenceByTerm(equivalences, term) {
38
+ const equivalence = equivalences.find((equivalence) => {
39
+ const equivalenceMatchesTerm = equivalence.matchTerm(term);
40
+
41
+ if (equivalenceMatchesTerm) {
42
+ return true;
43
+ }
44
+ }) || null;
45
+
46
+ return equivalence;
47
+ }
48
+
49
+ export function mergeEquivalences(equivalencesA, equivalencesB, localContext) {
50
+ const typesA = typesFromEquivalences(equivalencesA, localContext),
51
+ typesB = typesFromEquivalences(equivalencesB, localContext),
52
+ types = [
53
+ ...typesA,
54
+ ...typesB
55
+ ];
56
+
57
+ compress(types, (typeA, typeB) => {
58
+ if (typeA === typeB) {
59
+ return true;
60
+ }
61
+ });
62
+
63
+ const equivalences = types.map((type) => {
64
+ let equivalence;
65
+
66
+ const equivalenceA = findEquivalenceByType(equivalencesA, type, localContext),
67
+ equivalenceB = findEquivalenceByType(equivalencesB, type, localContext);
68
+
69
+ if ((equivalenceA !== null) && (equivalenceB !== null)) {
70
+ const leftEquivalence = equivalenceA, ///
71
+ rightEquivalence = equivalenceB; ///
72
+
73
+ equivalence = Equivalence.merge(leftEquivalence, rightEquivalence);
74
+ } else if (equivalenceA !== null) {
75
+ equivalence = equivalenceA; ///
76
+ } else if (equivalenceB !== null) {
77
+ equivalence = equivalenceB; ///
78
+ }
79
+
80
+ return equivalence;
81
+ });
82
+
83
+ return equivalences;
84
+ }
85
+
86
+ export function separateEquivalences(equivalences, remainingEquivalences, initiallyGroundedEquivalences) {
87
+ separate(equivalences, remainingEquivalences, initiallyGroundedEquivalences, (equivalence) => {
88
+ const equivalenceInitiallyGrounded = equivalence.isInitiallyGrounded();
89
+
90
+ if (!equivalenceInitiallyGrounded) {
91
+ return true;
92
+ }
93
+ });
94
+ }
95
+
96
+ export function compressDefinedVariables(definedVariables) {
97
+ compress(definedVariables, (definedVariableA, definedVariableB) => {
98
+ if (definedVariableA === definedVariableB) {
99
+ return true;
100
+ }
101
+ });
102
+ }
103
+
104
+ export function definedVariablesFromGroundedEquivalences(groundedEquivalences, definedVariables, context) {
105
+ groundedEquivalences.forEach((groundedEquivalence) => {
106
+ const variables = groundedEquivalence.getVariables(context);
107
+
108
+ push(definedVariables, variables);
109
+ });
110
+ }
111
+
112
+ export function implicitlyGroundedEquivalencesFromRemainingEquivalencesAndDefinedVariables(remainingEquivalences, definedVariables) {
113
+ const implicitlyGroundedEquivalences = [];
114
+
115
+ filter(remainingEquivalences, (remainingEquivalence) => {
116
+ const remainingEquivalenceImplicitlyGrounded = remainingEquivalence.isImplicitlyGrounded(definedVariables);
117
+
118
+ if (remainingEquivalenceImplicitlyGrounded) {
119
+ const implicitlyGroundedEquivalence = remainingEquivalence; ///
120
+
121
+ implicitlyGroundedEquivalences.push(implicitlyGroundedEquivalence);
122
+ }
123
+
124
+ if (!remainingEquivalenceImplicitlyGrounded) {
125
+ return true;
126
+ }
127
+ });
128
+
129
+ return implicitlyGroundedEquivalences;
130
+ }
131
+
132
+ function findEquivalenceByTermNodes(equivalences, termNodes) {
133
+ const equivalence = equivalences.find((equivalence) => {
134
+ const equivalenceMatchesTerms = equivalence.matchTermNodes(termNodes);
135
+
136
+ if (equivalenceMatchesTerms) {
137
+ return true;
138
+ }
139
+ }) || null;
140
+
141
+ return equivalence;
142
+ }
143
+
144
+ function typesFromEquivalences(equivalences, localContext) {
145
+ const types = equivalences.map((equivalence) => {
146
+ const type = equivalence.getType(localContext);
147
+
148
+ return type;
149
+ });
150
+
151
+ return types;
152
+ }
@@ -2,7 +2,10 @@
2
2
 
3
3
  import NodeVerifier from "../../verifier/node";
4
4
 
5
- import { VARIABLE_RULE_NAME, METAVARIABLE_RULE_NAME } from "../../ruleNames";
5
+ import { verifyStandaloneTerm } from "../../verify/term";
6
+ import { verifyStandaloneVariable } from "../../verify/variable";
7
+ import { verifyStandaloneMetavariable } from "../../verify/metavariable";
8
+ import { TERM_RULE_NAME, VARIABLE_RULE_NAME, METAVARIABLE_RULE_NAME } from "../../ruleNames";
6
9
 
7
10
  class MetastatementNodeVerifier extends NodeVerifier {
8
11
  verifyNonTerminalNode(nonTerminalNode, localMetaContext, verifyAhead) {
@@ -12,9 +15,10 @@ class MetastatementNodeVerifier extends NodeVerifier {
12
15
 
13
16
  switch (ruleName) {
14
17
  case METAVARIABLE_RULE_NAME: {
15
- const metavariableNode = nonTerminalNode, ///
16
- metavariableVerified = verifyMetavariable(metavariableNode, localMetaContext, verifyAhead),
17
- metavariableNodeVerified = metavariableVerified; ///
18
+ const context = localMetaContext, ///
19
+ metavariableNode = nonTerminalNode, ///
20
+ standaloneMetavariableVerified = verifyStandaloneMetavariable(metavariableNode, context, verifyAhead),
21
+ metavariableNodeVerified = standaloneMetavariableVerified; ///
18
22
 
19
23
  nonTerminalNodeVerified = metavariableNodeVerified; ///
20
24
 
@@ -22,15 +26,27 @@ class MetastatementNodeVerifier extends NodeVerifier {
22
26
  }
23
27
 
24
28
  case VARIABLE_RULE_NAME: {
25
- const variableNode = nonTerminalNode, ///
26
- variableVerified = verifyVariable(variableNode, localMetaContext, verifyAhead),
27
- variableNodeVerified = variableVerified; ///
29
+ const context = localMetaContext, ///
30
+ variableNode = nonTerminalNode, ///
31
+ standaloneVariableVerified = verifyStandaloneVariable(variableNode, context, verifyAhead),
32
+ variableNodeVerified = standaloneVariableVerified; ///
28
33
 
29
34
  nonTerminalNodeVerified = variableNodeVerified; ///
30
35
 
31
36
  break;
32
37
  }
33
38
 
39
+ case TERM_RULE_NAME: {
40
+ const context = localMetaContext, ///
41
+ termNode = nonTerminalNode, ///
42
+ standaloneTermVerified = verifyStandaloneTerm(termNode, context, verifyAhead),
43
+ termNodeVerified = standaloneTermVerified; ///
44
+
45
+ nonTerminalNodeVerified = termNodeVerified; ///
46
+
47
+ break;
48
+ }
49
+
34
50
  default: {
35
51
  nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNode, localMetaContext, verifyAhead);
36
52
 
@@ -45,47 +61,3 @@ class MetastatementNodeVerifier extends NodeVerifier {
45
61
  const metastatementNodeVerifier = new MetastatementNodeVerifier();
46
62
 
47
63
  export default metastatementNodeVerifier;
48
-
49
- function verifyMetavariable(metavariableNode, localMetaContext, verifyAhead) {
50
- let metavariableVerified;
51
-
52
- const metavariableString = localMetaContext.nodeAsString(metavariableNode);
53
-
54
- localMetaContext.trace(`Verifying the '${metavariableString}' metavariable...`, metavariableNode);
55
-
56
- const metavariablePresent = localMetaContext.isMetavariablePresentByMetavariableNode(metavariableNode);
57
-
58
- if (metavariablePresent) {
59
- const verifiedAhead = verifyAhead();
60
-
61
- metavariableVerified = verifiedAhead; ///
62
- }
63
-
64
- if (metavariableVerified) {
65
- localMetaContext.debug(`...verified the '${metavariableString}' metavariable.`, metavariableNode);
66
- }
67
-
68
- return metavariableVerified;
69
- }
70
-
71
- function verifyVariable(variableNode, localMetaContext, verifyAhead) {
72
- let variableVerified;
73
-
74
- const variableString = localMetaContext.nodeAsString(variableNode);
75
-
76
- localMetaContext.trace(`Verifying the '${variableString}' variable...`, variableNode);
77
-
78
- const variablePresent = localMetaContext.isVariablePresentByVariableNode(variableNode);
79
-
80
- if (variablePresent) {
81
- const verifiedAhead = verifyAhead();
82
-
83
- variableVerified = verifiedAhead; ///
84
- }
85
-
86
- if (variableVerified) {
87
- localMetaContext.debug(`...verified the '${variableString}' variable.`, variableNode);
88
- }
89
-
90
- return variableVerified;
91
- }
@@ -15,8 +15,9 @@ class StatementAsCombinatorNodeVerifier extends NodeVerifier {
15
15
 
16
16
  switch (ruleName) {
17
17
  case STATEMENT_RULE_NAME: {
18
- const statementNode = nonTerminalNode, ///
19
- standaloneStatementVerified = verifyStandaloneStatement(statementNode, fileContext, verifyAhead),
18
+ const context = fileContext, ///
19
+ statementNode = nonTerminalNode, ///
20
+ standaloneStatementVerified = verifyStandaloneStatement(statementNode, context, verifyAhead),
20
21
  statementNodeVerified = standaloneStatementVerified; ///
21
22
 
22
23
  nonTerminalNodeVerified = statementNodeVerified; ///
@@ -25,8 +26,9 @@ class StatementAsCombinatorNodeVerifier extends NodeVerifier {
25
26
  }
26
27
 
27
28
  case TERM_RULE_NAME: {
28
- const termNode = nonTerminalNode, ///
29
- standaloneTermVerified = verifyStandaloneTerm(termNode, fileContext, verifyAhead),
29
+ const context = fileContext, ///
30
+ termNode = nonTerminalNode, ///
31
+ standaloneTermVerified = verifyStandaloneTerm(termNode, context, verifyAhead),
30
32
  termNodeVerified = standaloneTermVerified; ///
31
33
 
32
34
  nonTerminalNodeVerified = termNodeVerified; ///
@@ -35,8 +37,9 @@ class StatementAsCombinatorNodeVerifier extends NodeVerifier {
35
37
  }
36
38
 
37
39
  case TYPE_RULE_NAME: {
38
- const typeNode = nonTerminalNode, ///
39
- standaloneTypeVerified = verifyStandaloneType(typeNode, fileContext, verifyAhead),
40
+ const context = fileContext, ///
41
+ typeNode = nonTerminalNode, ///
42
+ standaloneTypeVerified = verifyStandaloneType(typeNode, context, verifyAhead),
40
43
  typeNodeVerified = standaloneTypeVerified; ///
41
44
 
42
45
  nonTerminalNodeVerified = typeNodeVerified; ///
@@ -2,13 +2,9 @@
2
2
 
3
3
  import NodeVerifier from "../../verifier/node";
4
4
 
5
- import { nodeQuery } from "../../utilities/query";
6
5
  import { verifyStandaloneType } from "../../verify/type";
7
6
  import { verifyStandaloneTerm } from "../../verify/term";
8
- import { TERM_RULE_NAME, ARGUMENT_RULE_NAME } from "../../ruleNames";
9
-
10
- const typeNodeQuery = nodeQuery("/argument/type"),
11
- termNodeQuery = nodeQuery("/argument/term");
7
+ import { TERM_RULE_NAME, TYPE_RULE_NAME } from "../../ruleNames";
12
8
 
13
9
  class TermAsConstructorNodeVerifier extends NodeVerifier {
14
10
  verifyNonTerminalNode(nonTerminalNode, fileContext, verifyAhead) {
@@ -17,22 +13,24 @@ class TermAsConstructorNodeVerifier extends NodeVerifier {
17
13
  const ruleName = nonTerminalNode.getRuleName();
18
14
 
19
15
  switch (ruleName) {
20
- case ARGUMENT_RULE_NAME: {
21
- const argumentNode = nonTerminalNode, ///
22
- argumentVerified = verifyArgument(argumentNode, fileContext, verifyAhead),
23
- argumentNodeVerified = argumentVerified; ///
16
+ case TERM_RULE_NAME: {
17
+ const context = fileContext, ///
18
+ termNode = nonTerminalNode, ///
19
+ standaloneTermVerified = verifyStandaloneTerm(termNode, context, verifyAhead),
20
+ termNodeVerified = standaloneTermVerified; ///
24
21
 
25
- nonTerminalNodeVerified = argumentNodeVerified; ///
22
+ nonTerminalNodeVerified = termNodeVerified; ///
26
23
 
27
24
  break;
28
25
  }
29
26
 
30
- case TERM_RULE_NAME: {
31
- const termNode = nonTerminalNode, ///
32
- standaloneTermVerified = verifyStandaloneTerm(termNode, fileContext, verifyAhead),
33
- termNodeVerified = standaloneTermVerified; ///
27
+ case TYPE_RULE_NAME: {
28
+ const context = fileContext, ///
29
+ typeNode = nonTerminalNode, ///
30
+ standaloneTypeVerified = verifyStandaloneType(typeNode, context, verifyAhead),
31
+ typeNodeVerified = standaloneTypeVerified; ///
34
32
 
35
- nonTerminalNodeVerified = termNodeVerified; ///
33
+ nonTerminalNodeVerified = typeNodeVerified; ///
36
34
 
37
35
  break;
38
36
  }
@@ -51,32 +49,3 @@ class TermAsConstructorNodeVerifier extends NodeVerifier {
51
49
  const termAsConstructorNodeVerifier = new TermAsConstructorNodeVerifier();
52
50
 
53
51
  export default termAsConstructorNodeVerifier;
54
-
55
- function verifyArgument(argumentNode, fileContext, verifyAhead) {
56
- let argumentVerified;
57
-
58
- const argumentString = fileContext.nodeAsString(argumentNode);
59
-
60
- fileContext.trace(`Verifying the '${argumentString}' argument...`, argumentNode);
61
-
62
- const typeNode = typeNodeQuery(argumentNode),
63
- termNode = termNodeQuery(argumentNode);
64
-
65
- if (typeNode !== null) {
66
- const standaloneTypeVerified = verifyStandaloneType(typeNode, fileContext, verifyAhead);
67
-
68
- argumentVerified = standaloneTypeVerified; ///
69
- }
70
-
71
- if (termNode !== null) {
72
- const standaloneTermVerified = verifyStandaloneTerm(termNode, fileContext, verifyAhead);
73
-
74
- argumentVerified = standaloneTermVerified; ///
75
- }
76
-
77
- if (argumentVerified) {
78
- fileContext.debug(`...verified the '${argumentString}' argument.`, argumentNode);
79
- }
80
-
81
- return argumentVerified;
82
- }
@@ -3,10 +3,10 @@
3
3
  import NodesVerifier from "../../verifier/nodes";
4
4
 
5
5
  import { TERM_RULE_NAME } from "../../ruleNames";
6
- import { areTermNodesEqual } from "../../utilities/collection";
6
+ import { areTermNodesEqual } from "../../utilities/equivalences";
7
7
 
8
8
  class EqualityNodesVerifier extends NodesVerifier {
9
- verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, collections, localContext, verifyAhead) {
9
+ verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equivalences, localContext, verifyAhead) {
10
10
  let nonTerminalNodeVerified = false;
11
11
 
12
12
  const ruleNameA = nonTerminalNodeA.getRuleName(), ///
@@ -17,7 +17,7 @@ class EqualityNodesVerifier extends NodesVerifier {
17
17
  case TERM_RULE_NAME: {
18
18
  const termNodeA = nonTerminalNodeA, ///
19
19
  termNodeB = nonTerminalNodeB, ///
20
- termNodeVerified = this.verifyTermNode(termNodeA, termNodeB, collections, localContext, verifyAhead);
20
+ termNodeVerified = this.verifyTermNode(termNodeA, termNodeB, equivalences, localContext, verifyAhead);
21
21
 
22
22
  nonTerminalNodeVerified = termNodeVerified; ///
23
23
 
@@ -25,7 +25,7 @@ class EqualityNodesVerifier extends NodesVerifier {
25
25
  }
26
26
 
27
27
  default: {
28
- nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, collections, localContext, verifyAhead);
28
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equivalences, localContext, verifyAhead);
29
29
 
30
30
  break;
31
31
  }
@@ -35,12 +35,12 @@ class EqualityNodesVerifier extends NodesVerifier {
35
35
  return nonTerminalNodeVerified;
36
36
  }
37
37
 
38
- verifyTermNode(termNodeA, termNodeB, collections, localContext, verifyAhead) {
38
+ verifyTermNode(termNodeA, termNodeB, equivalences, localContext, verifyAhead) {
39
39
  let termNodeVerified;
40
40
 
41
41
  const leftTermNode = termNodeA, ///
42
42
  rightTermNode = termNodeB, ///
43
- termNodesEqual = areTermNodesEqual(leftTermNode, rightTermNode, collections);
43
+ termNodesEqual = areTermNodesEqual(leftTermNode, rightTermNode, equivalences);
44
44
 
45
45
  if (termNodesEqual) {
46
46
  const verifiedAhead = verifyAhead();
@@ -50,7 +50,7 @@ class EqualityNodesVerifier extends NodesVerifier {
50
50
  const nonTerminalNodeA = termNodeA, ///
51
51
  nonTerminalNodeB = termNodeB; ///
52
52
 
53
- termNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, collections, localContext, verifyAhead);
53
+ termNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equivalences, localContext, verifyAhead);
54
54
  }
55
55
 
56
56
  return termNodeVerified;
@@ -2,15 +2,18 @@
2
2
 
3
3
  import LocalContext from "../../context/local";
4
4
  import NodesVerifier from "../../verifier/nodes";
5
+ import TermForVariableSubstitution from "../../substitution/termForVariable";
5
6
  import intrinsicLevelNodesVerifierMixins from "../../mixins/nodesVerifier/intrinsiclevel";
6
7
  import StatementForMetavariableSubstitution from "../../substitution/statementForMetavariable";
7
8
 
8
9
  import { nodeQuery } from "../../utilities/query";
9
10
  import { TERM_RULE_NAME, STATEMENT_RULE_NAME, METASTATEMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../../ruleNames";
10
11
 
11
- const variableNodeQuery = nodeQuery("/term/variable!"),
12
+ const termNodeQuery = nodeQuery("/substitution/term!"),
13
+ variableNodeQuery = nodeQuery("/*/variable!"),
12
14
  statementNodeQuery = nodeQuery("/metaArgument/statement"),
13
- metavariableNodeQuery = nodeQuery("/metastatement/metavariable!");
15
+ metavariableNodeQuery = nodeQuery("/metastatement/metavariable!"),
16
+ substitutionNodeQuery = nodeQuery("/metastatement/substitution!");
14
17
 
15
18
  class MetaLevelToIntrinsicLevelNodesVerifier extends NodesVerifier {
16
19
  verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localContextB, verifyAhead) {
@@ -80,9 +83,24 @@ class MetaLevelToIntrinsicLevelNodesVerifier extends NodesVerifier {
80
83
  metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
81
84
 
82
85
  if ((metavariableNodeA !== null) && (statementNodeB !== null)) {
83
- const metavariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, statementNodeB, substitutions, fileContextA, localContextB, verifyAhead);
86
+ const substitutionNode = substitutionNodeQuery(metastatementNodeA);
87
+
88
+ if (substitutionNode !== null) {
89
+ const variableNode = variableNodeQuery(substitutionNode),
90
+ variable = fileContextA.findVariableByVariableNode(variableNode);
91
+
92
+ if (variable !== null) {
93
+ const termNode = termNodeQuery(substitutionNode);
94
+
95
+ debugger
96
+
97
+
98
+ }
99
+ } else {
100
+ const metavariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, statementNodeB, substitutions, fileContextA, localContextB, verifyAhead);
84
101
 
85
- metaArgumentNodeVerified = metavariableNodeVerified; ///
102
+ metaArgumentNodeVerified = metavariableNodeVerified; ///
103
+ }
86
104
  }
87
105
 
88
106
  return metaArgumentNodeVerified;
@@ -121,15 +139,23 @@ class MetaLevelToIntrinsicLevelNodesVerifier extends NodesVerifier {
121
139
  verifyStatementNode(metastatementNodeA, statementNodeB, substitutions, fileContextA, localContextB, verifyAhead) {
122
140
  let statementNodeVerified;
123
141
 
124
- const nonTerminalNodeA = metastatementNodeA, ///
125
- nonTerminalNodeB = statementNodeB, ///
126
- nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
127
- nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
128
- childNodesA = nonTerminalNodeAChildNodes, ///
129
- childNodesB = nonTerminalNodeBChildNodes, ///
130
- childNodesVerified = super.verifyChildNodes(childNodesA, childNodesB, substitutions, fileContextA, localContextB, verifyAhead);
142
+ const metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
143
+
144
+ if (metavariableNodeA !== null) {
145
+ const metavariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, statementNodeB, substitutions, fileContextA, localContextB, verifyAhead);
131
146
 
132
- statementNodeVerified = childNodesVerified; ///
147
+ statementNodeVerified = metavariableNodeVerified; ///
148
+ } else {
149
+ const nonTerminalNodeA = metastatementNodeA, ///
150
+ nonTerminalNodeB = statementNodeB, ///
151
+ nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
152
+ nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
153
+ childNodesA = nonTerminalNodeAChildNodes, ///
154
+ childNodesB = nonTerminalNodeBChildNodes, ///
155
+ childNodesVerified = super.verifyChildNodes(childNodesA, childNodesB, substitutions, fileContextA, localContextB, verifyAhead);
156
+
157
+ statementNodeVerified = childNodesVerified; ///
158
+ }
133
159
 
134
160
  return statementNodeVerified;
135
161
  }
@@ -1,37 +1,48 @@
1
1
  "use strict";
2
2
 
3
- import { third } from "../utilities/array";
3
+ import { second } from "../utilities/array";
4
4
  import { CONTAINED } from "../constants";
5
5
  import { nodeQuery, nodesQuery } from "../utilities/query";
6
6
 
7
- const statementVariableNodesQuery = nodesQuery("/statement//variable"),
8
- containmentVariableNodeQuery = nodeQuery("/containment/argument/term/variable!");
7
+ const variableNodesQuery = nodesQuery("/metaArgument//variable"),
8
+ containmentVariableNodeQuery = nodeQuery("/argument/term/variable!");
9
9
 
10
- export default function verifyContainment(containmentNode, statementNode) {
10
+ export default function verifyContainment(argumentNode, containmentNode, metaArgumentNode, context) {
11
11
  let containmentVerified = false;
12
12
 
13
- const contained = containedFromContainmendNode(containmentNode),
14
- statementVariableNodes = statementVariableNodesQuery(statementNode),
15
- containmentVariableNode = containmentVariableNodeQuery(containmentNode),
16
- containmentVariableNodeMatchesStatementVariableNode = statementVariableNodes.some((statementVariableNode) => {
17
- const containmentVariableNodeMatchesStatementVariableNode = containmentVariableNode.match(statementVariableNode);
18
-
19
- if (containmentVariableNodeMatchesStatementVariableNode) {
20
- return true;
21
- }
22
- });
23
-
24
- if (contained === containmentVariableNodeMatchesStatementVariableNode) {
25
- containmentVerified = true;
13
+ const containmentVariableNode = containmentVariableNodeQuery(argumentNode);
14
+
15
+ if (containmentVariableNode !== null) {
16
+ const contained = containedFromContainmentNode(containmentNode),
17
+ variableNodes = variableNodesQuery(metaArgumentNode),
18
+ containmentVariableNodeMatchesStatementVariableNode = variableNodes.some((statementVariableNode) => {
19
+ const containmentVariableNodeMatchesStatementVariableNode = containmentVariableNode.match(statementVariableNode);
20
+
21
+ if (containmentVariableNodeMatchesStatementVariableNode) {
22
+ return true;
23
+ }
24
+ });
25
+
26
+ if (contained) {
27
+ if (containmentVariableNodeMatchesStatementVariableNode) {
28
+ containmentVerified = true;
29
+ }
30
+ }
31
+
32
+ if (!contained) {
33
+ if (!containmentVariableNodeMatchesStatementVariableNode) {
34
+ containmentVerified = true;
35
+ }
36
+ }
26
37
  }
27
38
 
28
39
  return containmentVerified;
29
40
  }
30
41
 
31
- function containedFromContainmendNode(containmentNode) {
42
+ function containedFromContainmentNode(containmentNode) {
32
43
  const childNodes = containmentNode.getChildNodes(),
33
- thirdChildNode = third(childNodes),
34
- terminalNode = thirdChildNode, ///
44
+ secondChildNode = second(childNodes),
45
+ terminalNode = secondChildNode, ///
35
46
  content = terminalNode.getContent(),
36
47
  contained = (content === CONTAINED);
37
48
 
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ import { second } from "../utilities/array";
4
+ import { DEFINED } from "../constants";
5
+ import { nodeQuery } from "../utilities/query";
6
+
7
+ const definedVariableNodeQuery = nodeQuery("/argument/term/variable!");
8
+
9
+ export default function verifyDefining(argumentNode, definingNode, context) {
10
+ let definingVerified = false;
11
+
12
+ const definedVariableNode = definedVariableNodeQuery(argumentNode);
13
+
14
+ if (definedVariableNode !== null) {
15
+ const defined = definedFromDefiningNode(definingNode),
16
+ variableNode = definedVariableNode, ///
17
+ variableDefined = context.isVariableDefined(variableNode);
18
+
19
+ if (defined) {
20
+ if (variableDefined) {
21
+ definingVerified = true;
22
+ }
23
+ }
24
+
25
+ if (!defined) {
26
+ if (!variableDefined) {
27
+ definingVerified = true;
28
+ }
29
+ }
30
+ }
31
+
32
+ return definingVerified;
33
+ }
34
+
35
+ function definedFromDefiningNode(definingNode) {
36
+ const childNodes = definingNode.getChildNodes(),
37
+ secondChildNode = second(childNodes),
38
+ terminalNode = secondChildNode, ///
39
+ content = terminalNode.getContent(),
40
+ defined = (content === DEFINED);
41
+
42
+ return defined;
43
+ }
@@ -34,3 +34,25 @@ export default function verifyMetavariable(metavariableNode, metaTypeNode, fileC
34
34
 
35
35
  return metavariableVerified;
36
36
  }
37
+
38
+ export function verifyStandaloneMetavariable(metavariableNode, contexct, verifyAhead) {
39
+ let standaloneMetavariableVerified = false;
40
+
41
+ const metavariableString = contexct.nodeAsString(metavariableNode);
42
+
43
+ contexct.trace(`Verifying the '${metavariableString}' standalone metavariable...`, metavariableNode);
44
+
45
+ const metavariablePresent = contexct.isMetavariablePresentByMetavariableNode(metavariableNode);
46
+
47
+ if (metavariablePresent) {
48
+ const verifiedAhead = verifyAhead();
49
+
50
+ standaloneMetavariableVerified = verifiedAhead; ///
51
+ }
52
+
53
+ if (standaloneMetavariableVerified) {
54
+ contexct.debug(`...verified the '${metavariableString}' standalone metavariable.`, metavariableNode);
55
+ }
56
+
57
+ return standaloneMetavariableVerified;
58
+ }