occam-verify-cli 0.0.1066 → 0.0.1068

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 (89) hide show
  1. package/lib/assertion/contained.js +3 -2
  2. package/lib/assertion/defined.js +3 -2
  3. package/lib/assignment/judgement.js +3 -3
  4. package/lib/conclusion.js +8 -4
  5. package/lib/consequent.js +8 -4
  6. package/lib/context/file.js +7 -7
  7. package/lib/context/local.js +12 -25
  8. package/lib/declaration.js +90 -3
  9. package/lib/frame.js +109 -48
  10. package/lib/judgement.js +84 -5
  11. package/lib/metaType.js +24 -3
  12. package/lib/metavariable.js +94 -65
  13. package/lib/mixins/statement/unify.js +1 -1
  14. package/lib/mixins/statement/verify.js +14 -23
  15. package/lib/premise.js +14 -6
  16. package/lib/proofStep.js +22 -13
  17. package/lib/reference.js +11 -9
  18. package/lib/rule.js +9 -2
  19. package/lib/ruleNames.js +5 -1
  20. package/lib/statement/qualified.js +30 -17
  21. package/lib/statement/unqualified.js +30 -6
  22. package/lib/statement.js +20 -9
  23. package/lib/subproof.js +1 -1
  24. package/lib/substitution/frameForMetavariable.js +80 -71
  25. package/lib/substitution/statementForMetavariable.js +118 -56
  26. package/lib/substitution/termForVariable.js +75 -75
  27. package/lib/substitution.js +68 -33
  28. package/lib/substitutions.js +58 -49
  29. package/lib/supposition.js +8 -4
  30. package/lib/unifier/intrinsicLevel.js +4 -4
  31. package/lib/unifier/metaLevel.js +23 -16
  32. package/lib/unifier/statementWithCombinator.js +2 -2
  33. package/lib/utilities/node.js +24 -10
  34. package/lib/utilities/tokens.js +8 -1
  35. package/lib/variable.js +17 -13
  36. package/package.json +2 -2
  37. package/src/assertion/contained.js +3 -1
  38. package/src/assertion/defined.js +3 -1
  39. package/src/assignment/judgement.js +3 -4
  40. package/src/conclusion.js +10 -3
  41. package/src/consequent.js +10 -3
  42. package/src/context/file.js +6 -8
  43. package/src/context/local.js +12 -33
  44. package/src/declaration.js +57 -4
  45. package/src/frame.js +149 -90
  46. package/src/judgement.js +109 -3
  47. package/src/metaType.js +29 -3
  48. package/src/metavariable.js +140 -87
  49. package/src/mixins/statement/unify.js +1 -0
  50. package/src/mixins/statement/verify.js +16 -28
  51. package/src/premise.js +19 -5
  52. package/src/proofStep.js +28 -12
  53. package/src/reference.js +11 -7
  54. package/src/rule.js +13 -1
  55. package/src/ruleNames.js +1 -0
  56. package/src/statement/qualified.js +38 -21
  57. package/src/statement/unqualified.js +35 -5
  58. package/src/statement.js +20 -12
  59. package/src/subproof.js +0 -1
  60. package/src/substitution/frameForMetavariable.js +90 -104
  61. package/src/substitution/statementForMetavariable.js +133 -61
  62. package/src/substitution/termForVariable.js +83 -113
  63. package/src/substitution.js +55 -26
  64. package/src/substitutions.js +59 -47
  65. package/src/supposition.js +10 -3
  66. package/src/unifier/intrinsicLevel.js +4 -3
  67. package/src/unifier/metaLevel.js +42 -24
  68. package/src/unifier/statementWithCombinator.js +1 -1
  69. package/src/utilities/node.js +26 -10
  70. package/src/utilities/tokens.js +7 -0
  71. package/src/variable.js +20 -11
  72. package/lib/resolve/complexSubstitutionAgainstSimpleSubstitution.js +0 -62
  73. package/lib/resolve/substitution.js +0 -27
  74. package/lib/resolve/substitutions.js +0 -37
  75. package/lib/unify/metavariableWithFrame.js +0 -40
  76. package/lib/unify/simpleSubstitutionStatementWithComplexSubstitutionStatement.js +0 -31
  77. package/lib/verify/declaration.js +0 -83
  78. package/lib/verify/frame.js +0 -120
  79. package/lib/verify/judgement.js +0 -88
  80. package/lib/verify/metavariableGivenMetaType.js +0 -44
  81. package/src/resolve/complexSubstitutionAgainstSimpleSubstitution.js +0 -79
  82. package/src/resolve/substitution.js +0 -19
  83. package/src/resolve/substitutions.js +0 -31
  84. package/src/unify/metavariableWithFrame.js +0 -40
  85. package/src/unify/simpleSubstitutionStatementWithComplexSubstitutionStatement.js +0 -27
  86. package/src/verify/declaration.js +0 -113
  87. package/src/verify/frame.js +0 -157
  88. package/src/verify/judgement.js +0 -127
  89. package/src/verify/metavariableGivenMetaType.js +0 -45
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
 
3
+ import { arrayUtilities } from "necessary";
4
+
3
5
  import shim from "../shim";
4
6
  import LocalContext from "../context/local";
5
7
 
6
8
  import { trim } from "../utilities/string";
7
9
  import { nodeQuery } from "../utilities/query";
8
10
 
11
+ const { reverse } = arrayUtilities;
12
+
9
13
  const statementNodeQuery = nodeQuery("/unqualifiedStatement/statement");
10
14
 
11
15
  export default class UnqualifiedStatement {
@@ -32,7 +36,15 @@ export default class UnqualifiedStatement {
32
36
 
33
37
  const statementVerified = this.statement.verify(assignments, stated, localContext);
34
38
 
35
- verified = statementVerified; ///
39
+ if (statementVerified) {
40
+ verified = true;
41
+ } else {
42
+ const statementUnifiedWithProofSteps = this.unifyStatementWithProofSteps(this.statement, assignments, stated, localContext);
43
+
44
+ if (statementUnifiedWithProofSteps) {
45
+ verified = true;
46
+ }
47
+ }
36
48
 
37
49
  if (verified) {
38
50
  localContext.debug(`...verified the '${unqualifiedStatementString}' unqualified statement.`);
@@ -45,23 +57,41 @@ export default class UnqualifiedStatement {
45
57
  return verified;
46
58
  }
47
59
 
48
- unifyStatement(statement, substitutions, fileContext, localContext) {
60
+ unifyStatement(statement, substitutions, localContextA, localContextB) {
49
61
  let statementUnified;
50
62
 
51
63
  const statementString = statement.getString(),
52
64
  unqualifiedStatementString = this.getString(); ///
53
65
 
54
- localContext.trace(`Unifying the '${statementString}' statement with the '${unqualifiedStatementString}' unqualified statement...`);
66
+ localContextB.trace(`Unifying the '${statementString}' statement with the '${unqualifiedStatementString}' unqualified statement...`);
55
67
 
56
- statementUnified = this.statement.unifyStatement(statement, substitutions, fileContext, localContext);
68
+ statementUnified = this.statement.unifyStatement(statement, substitutions, localContextA, localContextB);
57
69
 
58
70
  if (statementUnified) {
59
- localContext.debug(`...unified the '${statementString}' statement with the '${unqualifiedStatementString}' unqualified statement.`);
71
+ localContextB.debug(`...unified the '${statementString}' statement with the '${unqualifiedStatementString}' unqualified statement.`);
60
72
  }
61
73
 
62
74
  return statementUnified;
63
75
  }
64
76
 
77
+ unifyStatementWithProofSteps(statement, assignments, stated, localContext) {
78
+ let statementUnifiedWithProofSteps;
79
+
80
+ let proofSteps = localContext.getProofSteps();
81
+
82
+ proofSteps = reverse(proofSteps); ///
83
+
84
+ statementUnifiedWithProofSteps = proofSteps.some((proofStep) => {
85
+ const statementUnified = proofStep.unifyStatement(statement, localContext);
86
+
87
+ if (statementUnified) {
88
+ return true;
89
+ }
90
+ });
91
+
92
+ return statementUnifiedWithProofSteps;
93
+ }
94
+
65
95
  toJSON() {
66
96
  const statementJSON = this.statement.toJSON(),
67
97
  statement = statementJSON, ///
package/src/statement.js CHANGED
@@ -51,7 +51,7 @@ class Statement {
51
51
  const variableString = variable.getString(),
52
52
  statementString = this.string; ///
53
53
 
54
- localContext.trace(`The '${variableString}' variable is contained in hte '${statementString}' statement...`);
54
+ localContext.trace(`Is the '${variableString}' variable contained in the '${statementString}' statement...`);
55
55
 
56
56
  const variableNode = variable.getNode(),
57
57
  statementNode = this.node,
@@ -66,7 +66,7 @@ class Statement {
66
66
  });
67
67
 
68
68
  if (variableContained) {
69
- localContext.debug(`...the '${variableString}' variable is contained in hte '${statementString}' statement.`);
69
+ localContext.debug(`...the '${variableString}' variable is contained in the '${statementString}' statement.`);
70
70
  }
71
71
 
72
72
  return variableContained;
@@ -78,7 +78,7 @@ class Statement {
78
78
  const metavariableString = metavariable.getString(),
79
79
  statementString = this.string; ///
80
80
 
81
- localContext.trace(`The '${metavariableString}' metavariable is contained in hte '${statementString}' statement...`);
81
+ localContext.trace(`Is the '${metavariableString}' metavariable contained in the '${statementString}' statement...`);
82
82
 
83
83
  const metavariableNode = metavariable.getNode(),
84
84
  statementNode = this.node,
@@ -93,13 +93,19 @@ class Statement {
93
93
  });
94
94
 
95
95
  if (metavariableContained) {
96
- localContext.debug(`...the '${metavariableString}' metavariable is contained in hte '${statementString}' statement.`);
96
+ localContext.debug(`...the '${metavariableString}' metavariable is contained in the '${statementString}' statement.`);
97
97
  }
98
98
 
99
99
  return metavariableContained;
100
100
  }
101
101
 
102
- unifyStatement(statement, substitutions, fileContext, localContext) {
102
+ matchStatementNode(statementNode) {
103
+ const statementNodeMatches = this.node.match(statementNode);
104
+
105
+ return statementNodeMatches;
106
+ }
107
+
108
+ unifyStatement(statement, substitutions, localContextA, localContextB) {
103
109
  let statementUnified;
104
110
 
105
111
  const statementA = this, ///
@@ -107,20 +113,22 @@ class Statement {
107
113
  statementAString = statementA.getString(),
108
114
  statementBString = statementB.getString();
109
115
 
110
- localContext.trace(`Unifying the '${statementBString}' statement with the '${statementAString}' statement...`);
116
+ localContextB.trace(`Unifying the '${statementBString}' statement with the '${statementAString}' statement...`);
111
117
 
112
118
  const statementANode = statementA.getNode(),
113
119
  statementBNode = statementB.getNode(),
114
120
  nodeA = statementANode, ///
115
- nodeB = statementBNode, ///
116
- fileContextA = fileContext, ///
117
- localContextA = LocalContext.fromFileContextAndTokens(fileContextA, this.tokens),
118
- localContextB = localContext, ///
119
- unifiedAtMetaLevel = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
121
+ nodeB = statementBNode; ///
122
+
123
+ localContextA = LocalContext.fromLocalContextAndTokens(localContextA, this.tokens);
124
+
125
+ const unifiedAtMetaLevel = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
120
126
 
121
127
  statementUnified = unifiedAtMetaLevel; ///
122
128
 
123
- localContext.debug(`...unified the '${statementBString}' statement with the '${statementAString}' statement.`);
129
+ if (statementUnified) {
130
+ localContextB.debug(`...unified the '${statementBString}' statement with the '${statementAString}' statement.`);
131
+ }
124
132
 
125
133
  return statementUnified;
126
134
  }
package/src/subproof.js CHANGED
@@ -51,7 +51,6 @@ export default class Subproof {
51
51
  return statements;
52
52
  }
53
53
 
54
-
55
54
  verify(substitutions, localContext) {
56
55
  let subproofVerified = false;
57
56
 
@@ -1,20 +1,26 @@
1
1
  "use strict";
2
2
 
3
+ import shim from "../shim";
3
4
  import Substitution from "../substitution";
4
5
 
5
6
  import { nodeQuery } from "../utilities/query";
7
+ import { metavariableNameFromMetavariableNode } from "../utilities/name";
8
+ import { substitutionNodeFromSubstitutionTokens } from "../utilities/node";
9
+ import { substitutionTokensFromSubstitutionString } from "../utilities/tokens";
6
10
 
7
- const substitutionNodeQuery = nodeQuery("/statement/substitution"),
8
- substitutionFrameNodeQuery = nodeQuery("/substitution/frame!"),
9
- frameMetavariableNodeQuery = nodeQuery("/frame/metavariable!"),
10
- substitutionMetavariableNodeQuery = nodeQuery("/substitution/metavariable!");
11
+ const frameNodeQuery = nodeQuery("/substitution/frame[0]"),
12
+ metavariableNodeQuery = nodeQuery("/substitution/frame[1]/metavariable!"),
13
+ substitutionNodeQuery = nodeQuery("/statement/substitution"),
14
+ frameMetavariableNodeQuery = nodeQuery("/frame/metavariable");
11
15
 
12
16
  export default class FrameForMetavariableSubstitution extends Substitution {
13
- constructor(string, frameNode, metavariableNode) {
17
+ constructor(string, frameNode, metavariableNode, substitutionNode, substitutionTokens) {
14
18
  super(string);
15
19
 
16
20
  this.frameNode = frameNode;
17
21
  this.metavariableNode = metavariableNode;
22
+ this.substitutionNode = substitutionNode;
23
+ this.substitutionTokens = substitutionTokens;
18
24
  }
19
25
 
20
26
  getFrameNode() {
@@ -25,35 +31,45 @@ export default class FrameForMetavariableSubstitution extends Substitution {
25
31
  return this.metavariableNode;
26
32
  }
27
33
 
28
- getNode() {
29
- const node = this.frameNode; ///
34
+ getSubstitutionNode() {
35
+ return this.substitutionNode;
36
+ }
30
37
 
31
- return node;
38
+ getSubstitutionTokens() {
39
+ return this.substitutionTokens;
32
40
  }
33
41
 
34
- transformed(substitutions) {
35
- let transformedSubstitution = null;
42
+ getMetavariableName() {
43
+ const metavariableName = metavariableNameFromMetavariableNode(this.metavariableNode);
36
44
 
37
- const transformedFrameNode = transformFrameNode(this.frameNode, substitutions),
38
- transformedMetavariableNode = transformMetavariableNode(this.metavariableNode, substitutions);
45
+ return metavariableName;
46
+ }
39
47
 
40
- if ((transformedFrameNode !== null) && (transformedMetavariableNode !== null)) {
41
- const frameNode = transformedFrameNode, ///
42
- metavariableNode = transformedMetavariableNode, ///
43
- frameForMetavariableSubstitution = new FrameForMetavariableSubstitution(frameNode, metavariableNode);
48
+ setSubstitutionNode() {
49
+ this.substitutionNode = substitutionNodeFromSubstitutionTokens(this.substitutionTokens);
50
+ }
44
51
 
45
- transformedSubstitution = frameForMetavariableSubstitution; ///
46
- }
52
+ setSubstitutionTokens() {
53
+ const frameMetavariableNode = frameMetavariableNodeQuery(this.frameNode),
54
+ frameMetavariableName = metavariableNameFromMetavariableNode(frameMetavariableNode),
55
+ metavariableName = metavariableNameFromMetavariableNode(this.metavariableNode),
56
+ substitutionString = `[[${frameMetavariableName}] for [${metavariableName}]]`;
47
57
 
48
- return transformedSubstitution;
58
+ this.substitutionTokens = substitutionTokensFromSubstitutionString(substitutionString);
49
59
  }
50
60
 
51
61
  isEqualTo(substitution) {
62
+ let equalTo = false;
63
+
52
64
  const frameNode = substitution.getFrameNode(),
53
- metavariableNode = substitution.getMetavariableNode(),
54
- frameNodeMatches = this.matchFrameNode(frameNode),
55
- metavariableNodeMatches = this.matchMetavariableNode(metavariableNode),
56
- equalTo = (frameNodeMatches && metavariableNodeMatches);
65
+ metavariableName = substitution.getMetavariableName();
66
+
67
+ if ((frameNode !== null) && (metavariableName !== null)) {
68
+ const frameNodeMatches = this.matchFrameNode(frameNode),
69
+ metavariableNameMatches = this.matchMetavariableName(metavariableName);
70
+
71
+ equalTo = (frameNodeMatches && metavariableNameMatches);
72
+ }
57
73
 
58
74
  return equalTo;
59
75
  }
@@ -64,28 +80,42 @@ export default class FrameForMetavariableSubstitution extends Substitution {
64
80
  return frameNodeMatches;
65
81
  }
66
82
 
67
- matchMetavariableNode(metavariableNode) {
68
- const metavariableNodeMatches = this.metavariableNode.match(metavariableNode);
83
+ matchMetavariableName(metavariableName) {
84
+ let metavariableNameMatches;
69
85
 
70
- return metavariableNodeMatches;
71
- }
86
+ const metavariableNameA = metavariableName; ///
72
87
 
73
- static fromSubstitution(substitution, localContextA, localContextB) {
74
- let frameForMetavariableSubstitution = null;
88
+ metavariableName = metavariableNameFromMetavariableNode(this.metavariableNode);
75
89
 
76
- const substitutionNode = substitution.getNode(),
77
- substitutionFrameNode = substitutionFrameNodeQuery(substitutionNode);
90
+ const metavariableNameB = metavariableName; ///
78
91
 
79
- if (substitutionFrameNode !== null) {
80
- const substitutionMetavariableNode = substitutionMetavariableNodeQuery(substitutionNode),
81
- metavariableNode = substitutionMetavariableNode, ///
82
- frameNode = substitutionFrameNode, ///
83
- string = stringFromFrameNodeAndMetavariableNode(frameNode, metavariableNode, localContextA, localContextB);
92
+ metavariableNameMatches = (metavariableNameA === metavariableNameB);
84
93
 
85
- frameForMetavariableSubstitution = new FrameForMetavariableSubstitution(string, frameNode, metavariableNode);
94
+ return metavariableNameMatches;
95
+ }
96
+
97
+ matchSubstitutionNode(substitutionNode) {
98
+ let substitutionNodeMatches;
99
+
100
+ if ((substitutionNode === null) && (this.substitutionNode === null)) {
101
+ substitutionNodeMatches = true;
102
+ } else if ((substitutionNode === null) && (this.substitutionNode !== null)) {
103
+ substitutionNodeMatches = false;
104
+ } else if ((substitutionNode !== null) && (this.substitutionNode === null)) {
105
+ substitutionNodeMatches = false;
106
+ } else {
107
+ substitutionNodeMatches = this.substitutionNode.match(substitutionNode);
86
108
  }
87
109
 
88
- return frameForMetavariableSubstitution;
110
+ return substitutionNodeMatches;
111
+ }
112
+
113
+ matchMetavariableNameAndSubstitutionNode(metavariableName, substitutionNode) {
114
+ const metavariableNameMatches = this.matchMetavariableName(metavariableName),
115
+ substitutionNodeMatches = this.matchSubstitutionNode(substitutionNode),
116
+ metavariableNameAndSubstitutionNodeMatches = (metavariableNameMatches && substitutionNodeMatches);
117
+
118
+ return metavariableNameAndSubstitutionNodeMatches;
89
119
  }
90
120
 
91
121
  static fromStatementNode(statementNode, localContext) {
@@ -94,84 +124,40 @@ export default class FrameForMetavariableSubstitution extends Substitution {
94
124
  const substitutionNode = substitutionNodeQuery(statementNode);
95
125
 
96
126
  if (substitutionNode !== null) {
97
- const substitutionFrameNode = substitutionFrameNodeQuery(substitutionNode);
127
+ const frameNode = frameNodeQuery(substitutionNode),
128
+ metavariableNode = metavariableNodeQuery(substitutionNode);
98
129
 
99
- if (substitutionFrameNode !== null) {
100
- const substitutionMetavariableNode = substitutionMetavariableNodeQuery(substitutionNode),
101
- metavariableNode = substitutionMetavariableNode, ///
102
- frameNode = substitutionFrameNode, ///
103
- localContextA = localContext, ///
104
- localContextB = localContext, ///
105
- string = stringFromFrameNodeAndMetavariableNode(frameNode, metavariableNode, localContextA, localContextB);
130
+ if ((frameNode !== null) && (metavariableNode !== null)) {
131
+ const { Frame, Metavariable } = shim,
132
+ frame = Frame.fromFrameNode(frameNode, localContext),
133
+ variable = Metavariable.fromMetavariableNode(metavariableNode, localContext),
134
+ string = stringFromFrameAndMetavariable(frame, variable, localContext),
135
+ substitutionTokens = localContext.nodeAsTokens(substitutionNode);
106
136
 
107
- frameForMetavariableSubstitution = new FrameForMetavariableSubstitution(string, frameNode, metavariableNode);
137
+ frameForMetavariableSubstitution = new FrameForMetavariableSubstitution(string, frameNode, metavariableNode, substitutionNode, substitutionTokens);
108
138
  }
109
-
110
139
  }
111
140
 
112
141
  return frameForMetavariableSubstitution;
113
142
  }
114
143
 
115
- static fromFrameNodeAndMetavariableNode(frameNode, metavariableNode, localContextA, localContextB) {
116
- const string = stringFromFrameNodeAndMetavariableNode(frameNode, metavariableNode, localContextA, localContextB),
117
- frameForMetavariableSubstitution = new FrameForMetavariableSubstitution(string, frameNode, metavariableNode);
144
+ static fromFrameAndMetavariable(frame, metavariable, localContext) {
145
+ const string = stringFromFrameAndMetavariable(frame, metavariable, localContext),
146
+ frameNode = frame.getNode(),
147
+ metavariableNode = metavariable.getNode(),
148
+ substitutionNode = null,
149
+ substitutionTokens = null,
150
+ statementForMetavariableSubstitution = new FrameForMetavariableSubstitution(string, frameNode, metavariableNode, substitutionNode, substitutionTokens);
118
151
 
119
- return frameForMetavariableSubstitution;
152
+ return statementForMetavariableSubstitution;
120
153
  }
121
154
  }
122
155
 
123
- function transformFrameNode(frameNode, substitutions) {
124
- let transformedFrameNode = null;
125
-
126
- const frameMetavariableNode = frameMetavariableNodeQuery(frameNode);
127
-
128
- if (frameMetavariableNode !== null) {
129
- const metavariableNode = frameMetavariableNode; ///
130
-
131
- substitutions.someSubstitution((substitution) => {
132
- const metavariableNodeMatches = substitution.matchMetavariableNode(metavariableNode);
133
-
134
- if (metavariableNodeMatches) {
135
- const frameNode = substitution.getFrameNode();
136
-
137
- transformedFrameNode = frameNode; ////
138
-
139
- return true;
140
- }
141
- });
142
- }
143
-
144
- return transformedFrameNode;
145
- }
146
-
147
- function transformMetavariableNode(metavariableNode, substitutions) {
148
- let transformedMetavariableNode = null;
149
-
150
- substitutions.someSubstitution((substitution) => {
151
- const metavariableNodeMatches = substitution.matchMetavariableNode(metavariableNode);
152
-
153
- if (metavariableNodeMatches) {
154
- const frameNode = substitution.getFrameNode(),
155
- frameMetavariableNode = frameMetavariableNodeQuery(frameNode);
156
-
157
- if (frameMetavariableNode !== null) {
158
- transformedMetavariableNode = frameMetavariableNode; ///
159
-
160
- return true;
161
- }
162
- }
163
- });
164
-
165
- return transformedMetavariableNode;
166
- }
167
-
168
- function stringFromFrameNodeAndMetavariableNode(frameNode, metavariableNode, localContextA, localContextB) {
169
- const frameNodeB = frameNode, ///
170
- frameStringB = localContextB.nodeAsString(frameNodeB),
171
- metavariableNodeA = metavariableNode, ///
172
- metavariableStringA = localContextA.nodeAsString(metavariableNodeA),
173
- string = `[${frameStringB} for ${metavariableStringA}]`;
156
+ function stringFromFrameAndMetavariable(frame, metavariable, localContext) {
157
+ const frameNode = frame.getNode(),
158
+ frameString = localContext.nodeAsString(frameNode),
159
+ metavariableString = metavariable.getString(),
160
+ string = `[[${frameString}] for [${metavariableString}]]`;
174
161
 
175
162
  return string;
176
163
  }
177
-