occam-verify-cli 0.0.679 → 0.0.680

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 (63) hide show
  1. package/lib/axiomLemmaTheoremConjecture.js +3 -3
  2. package/lib/conclusion.js +9 -3
  3. package/lib/consequent.js +5 -2
  4. package/lib/context/file.js +2 -2
  5. package/lib/equality.js +13 -199
  6. package/lib/premise.js +17 -5
  7. package/lib/supposition.js +9 -3
  8. package/lib/utilities/array.js +5 -2
  9. package/lib/verifier/node/metastatement.js +9 -6
  10. package/lib/verifier/node/termAsConstructor.js +2 -2
  11. package/lib/verifier/nodes/equality.js +155 -0
  12. package/lib/verifier/nodes/metastatementForMetavariable.js +8 -8
  13. package/lib/verifier/nodes/statement.js +6 -5
  14. package/lib/verifier/nodes/term.js +3 -5
  15. package/lib/verifier/nodes/termForVariable.js +24 -16
  16. package/lib/verify/file.js +2 -2
  17. package/lib/verify/label.js +2 -2
  18. package/lib/verify/metastatement.js +8 -5
  19. package/lib/verify/metavariable.js +2 -2
  20. package/lib/verify/statement.js +39 -80
  21. package/lib/verify/term.js +16 -8
  22. package/lib/verify/termAsConstructor.js +2 -2
  23. package/lib/verify/terms.js +45 -0
  24. package/lib/verify/type.js +3 -3
  25. package/lib/verify/typeAssertion.js +124 -0
  26. package/lib/verify/variable.js +3 -3
  27. package/package.json +2 -2
  28. package/src/axiomLemmaTheoremConjecture.js +2 -2
  29. package/src/conclusion.js +10 -2
  30. package/src/consequent.js +7 -1
  31. package/src/context/file.js +2 -2
  32. package/src/equality.js +15 -141
  33. package/src/premise.js +20 -4
  34. package/src/supposition.js +10 -2
  35. package/src/utilities/array.js +1 -1
  36. package/src/verifier/node/metastatement.js +9 -5
  37. package/src/verifier/node/termAsConstructor.js +1 -1
  38. package/src/verifier/nodes/equality.js +68 -0
  39. package/src/verifier/nodes/metastatementForMetavariable.js +7 -7
  40. package/src/verifier/nodes/statement.js +6 -4
  41. package/src/verifier/nodes/term.js +1 -6
  42. package/src/verifier/nodes/termForVariable.js +34 -22
  43. package/src/verify/file.js +1 -1
  44. package/src/verify/label.js +1 -1
  45. package/src/verify/metastatement.js +8 -4
  46. package/src/verify/metavariable.js +1 -1
  47. package/src/verify/statement.js +50 -119
  48. package/src/verify/term.js +20 -12
  49. package/src/verify/termAsConstructor.js +1 -1
  50. package/src/verify/terms.js +54 -0
  51. package/src/verify/type.js +2 -2
  52. package/src/verify/typeAssertion.js +164 -0
  53. package/src/verify/variable.js +2 -2
  54. package/lib/node/statement/combinator/equality.js +0 -21
  55. package/lib/ocmbinator/equality.js +0 -126
  56. package/lib/tokens/statement/combinator/equality.js +0 -17
  57. package/lib/verify/assertion/type.js +0 -125
  58. package/lib/verify/typeInference.js +0 -132
  59. package/src/node/statement/combinator/equality.js +0 -9
  60. package/src/ocmbinator/equality.js +0 -23
  61. package/src/tokens/statement/combinator/equality.js +0 -10
  62. package/src/verify/assertion/type.js +0 -169
  63. package/src/verify/typeInference.js +0 -146
package/src/equality.js CHANGED
@@ -1,14 +1,10 @@
1
1
  "use strict";
2
2
 
3
- import verifyTerm from "./verify/term";
4
- import NodesVerifier from "./verifier/nodes";
5
3
  import equalityStatementNode from "./node/statement/equality";
4
+ import equalityNodesVerifier from "./verifier/nodes/equality";
6
5
 
7
6
  import { nodeQuery } from "./utilities/query";
8
- import { first, second } from "./utilities/array";
9
- import { TERM_RULE_NAME } from "./ruleNames";
10
7
  import { EQUALITY_DEPTH } from "./constants";
11
- import { verifyTermAsVariable } from "./verify/term";
12
8
 
13
9
  const leftTermNodeQuery = nodeQuery("/statement/argument[0]/term!"),
14
10
  rightTermNodeQuery = nodeQuery("/statement/argument[1]/term!");
@@ -78,10 +74,10 @@ export default class Equality {
78
74
  return matches;
79
75
  }
80
76
 
81
- verify(equalities, context) {
77
+ verify(equalities, context, verifyAhead) {
82
78
  const leftNonTerminalNode = this.leftTermNode, ///
83
79
  rightNonTerminalNode = this.rightTermNode, ///
84
- nonTerminalNodeVerified = equalityNodesVerifier.verifyNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context),
80
+ nonTerminalNodeVerified = equalityNodesVerifier.verifyNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context, verifyAhead),
85
81
  verified = nonTerminalNodeVerified; ///
86
82
 
87
83
  return verified;
@@ -93,157 +89,35 @@ export default class Equality {
93
89
  const statementNode = proofStep.getStatementNode();
94
90
 
95
91
  if (statementNode !== null) {
96
- const depth = EQUALITY_DEPTH,
97
- statementNodeMatchesEqualityStatementNode = statementNode.match(equalityStatementNode, depth);
98
-
99
- if (statementNodeMatchesEqualityStatementNode) {
100
- const leftTermNode = leftTermNodeQuery(statementNode),
101
- rightTermNode = rightTermNodeQuery(statementNode);
102
-
103
- equality = new Equality(leftTermNode, rightTermNode);
104
- }
92
+ equality = Equality.fromStatementNode(statementNode);
105
93
  }
106
94
 
107
95
  return equality;
108
96
  }
109
97
 
110
98
  static fromStatementNode(statementNode) {
111
- const leftTermNode = leftTermNodeQuery(statementNode),
112
- rightTermNode = rightTermNodeQuery(statementNode),
113
- equality = new Equality(leftTermNode, rightTermNode);
114
-
115
- return equality;
116
- }
117
-
118
- static fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode) {
119
- const equality = new Equality(leftTermNode, rightTermNode);
120
-
121
- return equality;
122
- }
123
- }
124
-
125
- class EqualityNodesVerifier extends NodesVerifier {
126
- verifyNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context) {
127
- let nonTerminalNodeVerified = false;
128
-
129
- const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
130
- rightNonTerminalNodeRuleName = rightNonTerminalNode.getRuleName();
131
-
132
- if (leftNonTerminalNodeRuleName === rightNonTerminalNodeRuleName) {
133
- const ruleName = leftNonTerminalNodeRuleName, ///
134
- ruleNameTermRuleName = (ruleName === TERM_RULE_NAME);
135
-
136
- if (ruleNameTermRuleName) {
137
- const leftTermNode = leftNonTerminalNode, ///
138
- rightTermNode = rightNonTerminalNode, ///
139
- termNodeVerified = this.verifyTermNode(leftTermNode, rightTermNode, equalities, context);
99
+ let equality = null;
140
100
 
141
- nonTerminalNodeVerified = termNodeVerified; ///
142
- }
101
+ const depth = EQUALITY_DEPTH,
102
+ statementNodeMatchesEqualityStatementNode = statementNode.match(equalityStatementNode, depth);
143
103
 
144
- if (!nonTerminalNodeVerified) {
145
- const leftNonTerminalNodeChildNodes = leftNonTerminalNode.getChildNodes(),
146
- rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(),
147
- leftChildNodes = leftNonTerminalNodeChildNodes, ///
148
- rightChildNodes = rightNonTerminalNodeChildNodes, ///
149
- childNodesVerified = this.verifyChildNodes(leftChildNodes, rightChildNodes, equalities, context);
104
+ if (statementNodeMatchesEqualityStatementNode) {
105
+ const leftTermNode = leftTermNodeQuery(statementNode),
106
+ rightTermNode = rightTermNodeQuery(statementNode);
150
107
 
151
- nonTerminalNodeVerified = childNodesVerified; ///
152
- }
108
+ equality = new Equality(leftTermNode, rightTermNode);
153
109
  }
154
110
 
155
- return nonTerminalNodeVerified;
111
+ return equality;
156
112
  }
157
113
 
158
- verifyTermNode(leftTermNode, rightTermNode, equalities, context) {
159
- let termNodeVerified = false;
160
-
161
- const variables = [],
162
- leftTermVerifiedAsVariable = verifyTermAsVariable(leftTermNode, variables, context),
163
- rightTermVerifiedAsVariable = verifyTermAsVariable(rightTermNode, variables, context);
164
-
165
- let equality = null;
166
-
167
- if (leftTermVerifiedAsVariable && rightTermVerifiedAsVariable) {
168
- const firstVariable = first(variables),
169
- secondVariable = second(variables),
170
- leftVariable = firstVariable, ///
171
- rightVariable = secondVariable, ///
172
- leftVariableType = leftVariable.getType(),
173
- rightVariableType = rightVariable.getType(),
174
- leftVariableTypeEqualToOrSubTypeOfOfSuperTypeOfRightVariableType = leftVariableType.isEqualToOrSubTypeOfOfSuperTypeOf(rightVariableType);
175
-
176
- if (leftVariableTypeEqualToOrSubTypeOfOfSuperTypeOfRightVariableType) {
177
- equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode);
178
- }
179
- } else if (leftTermVerifiedAsVariable) {
180
- const types = [];
181
-
182
- verifyTerm(rightTermNode, types, context);
183
-
184
- const firstType = first(types),
185
- firstVariable = first(variables),
186
- leftVariable = firstVariable, ///
187
- rightTermType = firstType, ///
188
- leftVariableType = leftVariable.getType(),
189
- leftVariableTypeEqualToOrSuperTypeOfRightTermType = leftVariableType.isEqualToOrSuperTypeOf(rightTermType);
190
-
191
- if (leftVariableTypeEqualToOrSuperTypeOfRightTermType) {
192
- equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode);
193
- }
194
- } else if (rightTermVerifiedAsVariable) {
195
- const types = [];
196
-
197
- verifyTerm(leftTermNode, types, context);
198
-
199
- const firstType = first(types),
200
- firstVariable = first(variables),
201
- leftTermType = firstType, ///
202
- rightVariable = firstVariable, ///
203
- rightVariableType = rightVariable.getType(),
204
- rightVariableTypeEqualToOrSuperTypeOfRightTermType = rightVariableType.isEqualToOrSuperTypeOf(leftTermType);
205
-
206
- if (rightVariableTypeEqualToOrSuperTypeOfRightTermType) {
207
- equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode);
208
- }
209
- } else {
210
- const types = [];
211
-
212
- verifyTerm(leftTermNode, types, context);
213
-
214
- verifyTerm(rightTermNode, types, context);
215
-
216
- const firstType = first(types),
217
- secondType = second(types),
218
- leftTermType = firstType, ///
219
- rightTermType = secondType, ///
220
- leftTermTypeEqualToOrSubTypeOfOfSuperTypeOfRightTermType = leftTermType.isEqualToOrSubTypeOfOfSuperTypeOf(rightTermType);
221
-
222
- if (leftTermTypeEqualToOrSubTypeOfOfSuperTypeOfRightTermType) {
223
- equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode);
224
- }
225
- }
226
-
227
- if (equality !== null) {
228
- const equalityA = equality, ///
229
- equalitiesB = equalities, ///
230
- equalityMatches = equalitiesB.some((equalityB) => { ///
231
- const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB, context);
232
-
233
- if (equalityAMatchesEqualityB) {
234
- return true;
235
- }
236
- });
237
-
238
- termNodeVerified = equalityMatches; ///
239
- }
114
+ static fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode) {
115
+ const equality = new Equality(leftTermNode, rightTermNode);
240
116
 
241
- return termNodeVerified;
117
+ return equality;
242
118
  }
243
119
  }
244
120
 
245
- const equalityNodesVerifier = new EqualityNodesVerifier();
246
-
247
121
  function filterEqualities(equalities, equality) {
248
122
  const equalityA = equality; ///
249
123
 
package/src/premise.js CHANGED
@@ -46,7 +46,11 @@ export default class Premise {
46
46
  nonTerminalNodeB = subproofStatementNode, ///
47
47
  fileContextA = fileContext, ///
48
48
  proofContextB = statementProofContext, ///
49
- nonTerminalNodeVerified = premiseStatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, proofContextB);
49
+ nonTerminalNodeVerified = premiseStatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, proofContextB, () => {
50
+ const verifiedAhead = true;
51
+
52
+ return verifiedAhead;
53
+ });
50
54
 
51
55
  if (nonTerminalNodeVerified) {
52
56
  return true;
@@ -63,7 +67,11 @@ export default class Premise {
63
67
  nonTerminalNodeB = statementNode, ///
64
68
  fileContextA = fileContext, ///
65
69
  proofContextB = statementProofContext, ///
66
- nonTerminalNodeVerified = premiseStatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, proofContextB),
70
+ nonTerminalNodeVerified = premiseStatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, proofContextB, () => {
71
+ const verifiedAhead = true;
72
+
73
+ return verifiedAhead;
74
+ }),
67
75
  statementNodeMatches = nonTerminalNodeVerified; ///
68
76
 
69
77
  return statementNodeMatches;
@@ -92,7 +100,11 @@ export default class Premise {
92
100
  nonTerminalNodeB = ruleSubproofMetastatementNode, ///
93
101
  fileContextA = fileContext, ///
94
102
  metaproofContextB = metastatementMetaproofContext, ///
95
- nonTerminalNodeVerified = premiseMetastatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB);
103
+ nonTerminalNodeVerified = premiseMetastatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB, () => {
104
+ const verifiedAhead = true;
105
+
106
+ return verifiedAhead;
107
+ });
96
108
 
97
109
  if (nonTerminalNodeVerified) {
98
110
  return true;
@@ -109,7 +121,11 @@ export default class Premise {
109
121
  nonTerminalNodeB = metastatementNode, ///
110
122
  fileContextA = fileContext, ///
111
123
  metaproofContextB = metastatementMetaproofContext, ///
112
- nonTerminalNodeVerified = premiseMetastatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB),
124
+ nonTerminalNodeVerified = premiseMetastatementForMetavariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB, () => {
125
+ const verifiedAhead = true;
126
+
127
+ return verifiedAhead;
128
+ }),
113
129
  metastatementNodeMatches = nonTerminalNodeVerified; ///
114
130
 
115
131
  return metastatementNodeMatches;
@@ -43,7 +43,11 @@ export default class Supposition {
43
43
  nonTerminalNodeB = subproofStatementNode, ///
44
44
  proofContextA = proofContext, ///
45
45
  proofContextB = statementProofContext, ///
46
- nonTerminalNodeVerified = suppositionTermForVariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB);
46
+ nonTerminalNodeVerified = suppositionTermForVariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB, () => {
47
+ const verifiedAhead = true;
48
+
49
+ return verifiedAhead;
50
+ });
47
51
 
48
52
  if (nonTerminalNodeVerified) {
49
53
  return true;
@@ -60,7 +64,11 @@ export default class Supposition {
60
64
  nonTerminalNodeB = statementNode, ///
61
65
  proofContextA = proofContext, ///
62
66
  proofContextB = statementProofContext, ///
63
- nonTerminalNodeVerified = suppositionTermForVariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB),
67
+ nonTerminalNodeVerified = suppositionTermForVariableNodesVerifier.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB, () => {
68
+ const verifiedAhead = true;
69
+
70
+ return verifiedAhead;
71
+ }),
64
72
  statementNodeMatches = nonTerminalNodeVerified; ///
65
73
 
66
74
  return statementNodeMatches;
@@ -6,7 +6,7 @@ import permutationsMatrix from "../permutationsMatrix";
6
6
 
7
7
  import { MAXIMUM_INDEXES_LENGTH, MAXIMUM_PERMUTATION_LENGTH } from "../constants";
8
8
 
9
- export const { first, second, last, push, prune, filter } = arrayUtilities;
9
+ export const { first, second, last, push, prune, filter, clear } = arrayUtilities;
10
10
 
11
11
  export function someSubArray(array, subArrayLength, callback) {
12
12
  let found = false;
@@ -6,7 +6,7 @@ import { METAVARIABLE_RULE_NAME } from "../../ruleNames";
6
6
  import { metavariableNameFromMetavariableNode } from "../../utilities/query";
7
7
 
8
8
  class MetastatementNodeVerifier extends NodeVerifier {
9
- verifyNonTerminalNode(nonTerminalNode, metaproofContext) {
9
+ verifyNonTerminalNode(nonTerminalNode, metaproofContext, verifyAhead) {
10
10
  let nonTerminalNodeVerified;
11
11
 
12
12
  const ruleName = nonTerminalNode.getRuleName(); ///
@@ -14,7 +14,7 @@ class MetastatementNodeVerifier extends NodeVerifier {
14
14
  switch (ruleName) {
15
15
  case METAVARIABLE_RULE_NAME: {
16
16
  const metavariableNode = nonTerminalNode, ///
17
- metavariableVerified = verifyMetavariable(metavariableNode, metaproofContext),
17
+ metavariableVerified = verifyMetavariable(metavariableNode, metaproofContext, verifyAhead),
18
18
  metavariableNodeVerified = metavariableVerified; ///
19
19
 
20
20
  nonTerminalNodeVerified = metavariableNodeVerified; ///
@@ -23,7 +23,7 @@ class MetastatementNodeVerifier extends NodeVerifier {
23
23
  }
24
24
 
25
25
  default: {
26
- nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNode, metaproofContext);
26
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNode, metaproofContext, verifyAhead);
27
27
 
28
28
  break;
29
29
  }
@@ -37,7 +37,7 @@ const metastatementNodeVerifier = new MetastatementNodeVerifier();
37
37
 
38
38
  export default metastatementNodeVerifier;
39
39
 
40
- function verifyMetavariable(metavariableNode, metaproofContext) {
40
+ function verifyMetavariable(metavariableNode, metaproofContext, verifyAhead) {
41
41
  let metavariableVerified;
42
42
 
43
43
  const metavariableString = metaproofContext.nodeAsString(metavariableNode);
@@ -47,7 +47,11 @@ function verifyMetavariable(metavariableNode, metaproofContext) {
47
47
  const metavariableName = metavariableNameFromMetavariableNode(metavariableNode),
48
48
  metavariablePresent = metaproofContext.isMetavariablePresentByMetavariableName(metavariableName);
49
49
 
50
- metavariableVerified = metavariablePresent;
50
+ if (metavariablePresent) {
51
+ const verifiedAhead = verifyAhead();
52
+
53
+ metavariableVerified = verifiedAhead; ///
54
+ }
51
55
 
52
56
  if (metavariableVerified) {
53
57
  metaproofContext.debug(`...verified the '${metavariableString}' metavariable.`, metavariableNode);
@@ -82,7 +82,7 @@ export function verifyType(typeNode, fileContext, verifyAhead) {
82
82
  typePresent = fileContext.isTypePresentByTypeName(typeName);
83
83
 
84
84
  if (!typePresent) {
85
- fileContext.info(`The type '${typeName}' is not present.`, typeNode);
85
+ fileContext.debug(`The type '${typeName}' is not present.`, typeNode);
86
86
  } else {
87
87
  fileContext.debug(`...verified the '${typeString}' type.`, typeNode);
88
88
 
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ import Equality from "../../equality";
4
+ import verifyTerms from "../../verify/terms";
5
+ import NodesVerifier from "../../verifier/nodes";
6
+
7
+ import { TERM_RULE_NAME } from "../../ruleNames";
8
+
9
+ class EqualityNodesVerifier extends NodesVerifier {
10
+ verifyNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context, verifyAhead) {
11
+ let nonTerminalNodeVerified = false;
12
+
13
+ const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
14
+ rightNonTerminalNodeRuleName = rightNonTerminalNode.getRuleName();
15
+
16
+ if (leftNonTerminalNodeRuleName === rightNonTerminalNodeRuleName) {
17
+ const leftNonTerminalNodeRuleNameTermRuleName = (leftNonTerminalNodeRuleName === TERM_RULE_NAME),
18
+ rightNonTerminalNodeRuleNameTermRuleName = (rightNonTerminalNodeRuleName === TERM_RULE_NAME);
19
+
20
+ if (leftNonTerminalNodeRuleNameTermRuleName && rightNonTerminalNodeRuleNameTermRuleName) {
21
+ const leftTermNode = leftNonTerminalNode, ///
22
+ rightTermNode = rightNonTerminalNode, ///
23
+ termNodeVerified = this.verifyTermNode(leftTermNode, rightTermNode, equalities, context, verifyAhead);
24
+
25
+ nonTerminalNodeVerified = termNodeVerified; ///
26
+ }
27
+
28
+ if (!nonTerminalNodeVerified) {
29
+ const leftNonTerminalNodeChildNodes = leftNonTerminalNode.getChildNodes(),
30
+ rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(),
31
+ leftChildNodes = leftNonTerminalNodeChildNodes, ///
32
+ rightChildNodes = rightNonTerminalNodeChildNodes, ///
33
+ childNodesVerified = this.verifyChildNodes(leftChildNodes, rightChildNodes, equalities, context, verifyAhead);
34
+
35
+ nonTerminalNodeVerified = childNodesVerified; ///
36
+ }
37
+ }
38
+
39
+ return nonTerminalNodeVerified;
40
+ }
41
+
42
+ verifyTermNode(leftTermNode, rightTermNode, equalities, context, verifyAhead) {
43
+ let termNodeVerified = false;
44
+
45
+ const termsVerified = verifyTerms(leftTermNode, rightTermNode, context, verifyAhead);
46
+
47
+ if (termsVerified) {
48
+ const equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode),
49
+ equalityA = equality, ///
50
+ equalitiesB = equalities, ///
51
+ equalityMatches = equalitiesB.some((equalityB) => { ///
52
+ const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB, context);
53
+
54
+ if (equalityAMatchesEqualityB) {
55
+ return true;
56
+ }
57
+ });
58
+
59
+ termNodeVerified = equalityMatches; ///
60
+ }
61
+
62
+ return termNodeVerified;
63
+ }
64
+ }
65
+
66
+ const equalityNodesVerifier = new EqualityNodesVerifier();
67
+
68
+ export default equalityNodesVerifier;
@@ -10,7 +10,7 @@ import { metavariableNameFromMetavariableNode } from "../../utilities/query";
10
10
  const metavariableNodeQuery = nodeQuery('/metastatement/metavariable!');
11
11
 
12
12
  export default class MetastatementForMetavariableNodesVerifier extends NodesVerifier {
13
- verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB) {
13
+ verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead) {
14
14
  let nonTerminalNodeVerified = false;
15
15
 
16
16
  const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
@@ -23,28 +23,28 @@ export default class MetastatementForMetavariableNodesVerifier extends NodesVeri
23
23
  if (nonTerminalNodeARuleNameMetastatementRuleName && nonTerminalNodeBRuleNameMetastatementRuleName) {
24
24
  const metastatementNodeA = nonTerminalNodeA, ///
25
25
  metastatementNodeB = nonTerminalNodeB, ///
26
- metastatementNodeVerified = this.verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB);
26
+ metastatementNodeVerified = this.verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead);
27
27
 
28
28
  if (metastatementNodeVerified) {
29
29
  nonTerminalNodeVerified = true; ///
30
30
  } else {
31
- nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB);
31
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead);
32
32
  }
33
33
  } else {
34
- nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB);
34
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead);
35
35
  }
36
36
  }
37
37
 
38
38
  return nonTerminalNodeVerified;
39
39
  }
40
40
 
41
- verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB) {
41
+ verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead) {
42
42
  let metastatementNodeVerified = false;
43
43
 
44
44
  const metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
45
45
 
46
46
  if (metavariableNodeA !== null) {
47
- const metaVariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB);
47
+ const metaVariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead);
48
48
 
49
49
  metastatementNodeVerified = metaVariableNodeVerified; ///
50
50
  }
@@ -52,7 +52,7 @@ export default class MetastatementForMetavariableNodesVerifier extends NodesVeri
52
52
  return metastatementNodeVerified;
53
53
  }
54
54
 
55
- verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB) {
55
+ verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead) {
56
56
  let metavariableNodeVerified;
57
57
 
58
58
  const metavariableNameA = metavariableNameFromMetavariableNode(metavariableNodeA),
@@ -71,21 +71,23 @@ function verifyMetaargument(metaArgumentNode, combinatorMetaargumentNode, contex
71
71
  combinatorMetaTYpeNode = metaTypeNodeQuery(combinatorMetaargumentNode);
72
72
 
73
73
  if (statementNode === null) {
74
- context.info(`Expected a statement but got a '${metaArgumentString}' meta-type.`, metaArgumentNode);
74
+ context.debug(`Expected a statement but got a '${metaArgumentString}' meta-type.`, metaArgumentNode);
75
75
  } else {
76
76
  if (combinatorMetaTYpeNode === null) {
77
77
  const combinatorMetaargumentString = context.nodeAsString(combinatorMetaargumentNode);
78
78
 
79
- context.info(`Expected a meta-type but got a '${combinatorMetaargumentString}' statement.`, metaArgumentNode);
79
+ context.debug(`Expected a meta-type but got a '${combinatorMetaargumentString}' statement.`, metaArgumentNode);
80
80
  } else {
81
81
  const combinatorMetaTypeTerminalNode = metaTypeTerminalNodeQuery(combinatorMetaTYpeNode),
82
82
  content = combinatorMetaTypeTerminalNode.getContent(),
83
83
  contentStatementMetaType = (content === STATEMENT_META_TYPE);
84
84
 
85
85
  if (!contentStatementMetaType) {
86
- context.info(`Expected the meta-type to be 'Statement' but got '${content}'.`, metaArgumentNode);
86
+ context.debug(`Expected the meta-type of the combinator to be '${STATEMENT_META_TYPE}' but got '${content}' instead.`, metaArgumentNode);
87
87
  } else {
88
- metaArgumentVerified = true;
88
+ const verifiedAhead = verifyAhead();
89
+
90
+ metaArgumentVerified = verifiedAhead; ///
89
91
  }
90
92
  }
91
93
  }
@@ -55,7 +55,7 @@ export function verifyArgument(argumentNode, constructorArgumentNode, context, v
55
55
  const typeNode = typeNodeQuery(argumentNode);
56
56
 
57
57
  if (typeNode !== null) {
58
- context.info(`The '${argumentString}' argument should be a term, not a type`, argumentNode);
58
+ context.debug(`The '${argumentString}' argument should be a term, not a type.`, argumentNode);
59
59
  } else {
60
60
  const termNode = termNodeQuery(argumentNode);
61
61
 
@@ -83,15 +83,10 @@ export function verifyArgument(argumentNode, constructorArgumentNode, context, v
83
83
  const constructorTypeName = typeNameFromTypeNode(constructorTypeNode),
84
84
  firstType = first(types),
85
85
  termType = firstType, ///
86
- termTypeName = termType.getName(),
87
86
  constructorType = context.findTypeByTypeName(constructorTypeName),
88
87
  termTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(constructorType);
89
88
 
90
89
  if (termTypeEqualToOrSubTypeOfType) {
91
- const termString = context.nodeAsString(termNode);
92
-
93
- context.trace(`The '${termTypeName}' type of the '${termString}' term is equal to or a sub-type of the '${constructorTypeName}' type in the constructor.`, argumentNode);
94
-
95
90
  verifiedAhead = verifyAhead();
96
91
  }
97
92
 
@@ -12,7 +12,7 @@ import { variableNameFromVariableNode } from "../../utilities/query";
12
12
  const variableNodeQuery = nodeQuery('/term/variable!');
13
13
 
14
14
  export default class TermForVariableNodesVerifier extends NodesVerifier {
15
- verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB) {
15
+ verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB, verifyAhead) {
16
16
  let nonTerminalNodeVerified = false;
17
17
 
18
18
  const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
@@ -25,28 +25,28 @@ export default class TermForVariableNodesVerifier extends NodesVerifier {
25
25
  if (nonTerminalNodeARuleNameTermRuleName && nonTerminalNodeBRuleNameTermRuleName) {
26
26
  const termNodeA = nonTerminalNodeA, ///
27
27
  termNodeB = nonTerminalNodeB, ///
28
- termNodeVerified = this.verifyTermNode(termNodeA, termNodeB, substitutions, proofContextA, proofContextB);
28
+ termNodeVerified = this.verifyTermNode(termNodeA, termNodeB, substitutions, proofContextA, proofContextB, verifyAhead);
29
29
 
30
30
  if (termNodeVerified) {
31
31
  nonTerminalNodeVerified = true; ///
32
32
  } else {
33
- nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB);
33
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB, verifyAhead);
34
34
  }
35
35
  } else {
36
- nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB);
36
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, proofContextA, proofContextB, verifyAhead);
37
37
  }
38
38
  }
39
39
 
40
40
  return nonTerminalNodeVerified;
41
41
  }
42
42
 
43
- verifyTermNode(termNodeA, termNodeB, substitutions, proofContextA, proofContextB) {
43
+ verifyTermNode(termNodeA, termNodeB, substitutions, proofContextA, proofContextB, verifyAhead) {
44
44
  let termNodeVerified = false;
45
45
 
46
46
  const variableNodeA = variableNodeQuery(termNodeA);
47
47
 
48
48
  if (variableNodeA !== null) {
49
- const variableVerified = this.verifyVariableNode(variableNodeA, termNodeB, substitutions, proofContextA, proofContextB);
49
+ const variableVerified = this.verifyVariableNode(variableNodeA, termNodeB, substitutions, proofContextA, proofContextB, verifyAhead);
50
50
 
51
51
  termNodeVerified = variableVerified; ///
52
52
  }
@@ -54,8 +54,8 @@ export default class TermForVariableNodesVerifier extends NodesVerifier {
54
54
  return termNodeVerified;
55
55
  }
56
56
 
57
- verifyVariableNode(variableNodeA, termNodeB, substitutions, proofContextA, proofContextB) {
58
- let variableVerified;
57
+ verifyVariableNode(variableNodeA, termNodeB, substitutions, proofContextA, proofContextB, verifyAhead) {
58
+ let variableVerified = false;
59
59
 
60
60
  const variableNameA = variableNameFromVariableNode(variableNodeA),
61
61
  substitution = substitutions.find((substitution) => {
@@ -70,7 +70,11 @@ export default class TermForVariableNodesVerifier extends NodesVerifier {
70
70
  const termNode = termNodeB, ///
71
71
  substitutionNodesVerified = substitution.matchTermNode(termNode);
72
72
 
73
- variableVerified = substitutionNodesVerified; ///
73
+ if (substitutionNodesVerified) {
74
+ const verifiedAhead = verifyAhead();
75
+
76
+ variableVerified = verifiedAhead; ///
77
+ }
74
78
  } else {
75
79
  const { createSubstitutions } = this.constructor;
76
80
 
@@ -83,23 +87,31 @@ export default class TermForVariableNodesVerifier extends NodesVerifier {
83
87
  const types = [],
84
88
  context = proofContextB, ///
85
89
  termNode = termNodeB, ///
86
- termVerified = verifyTerm(termNode, types, context, verifyAhead);
90
+ termVerified = verifyTerm(termNode, types, context, () => {
91
+ let verifiedAhead = false;
87
92
 
88
- if (termVerified) {
89
- const firstType = first(types),
90
- termType = firstType,
91
- variableType = variable.getType(),
92
- variableTypeEqualToOrSuperTypeOfTermType = variableType.isEqualToOrSuperTypeOf(termType);
93
+ const firstType = first(types),
94
+ termType = firstType,
95
+ variableType = variable.getType(),
96
+ variableTypeEqualToOrSuperTypeOfTermType = variableType.isEqualToOrSuperTypeOf(termType);
93
97
 
94
- if (variableTypeEqualToOrSuperTypeOfTermType) {
95
- const termForVariableSubstitution = TermForVariableSubstitution.fromVariableNameAndTermNode(variableName, termNode),
96
- substitution = termForVariableSubstitution; ///
98
+ if (variableTypeEqualToOrSuperTypeOfTermType) {
99
+ const termForVariableSubstitution = TermForVariableSubstitution.fromVariableNameAndTermNode(variableName, termNode),
100
+ substitution = termForVariableSubstitution; ///
97
101
 
98
- substitutions.push(substitution);
102
+ substitutions.push(substitution);
99
103
 
100
- variableVerified = true;
101
- }
102
- }
104
+ verifiedAhead = verifyAhead();
105
+
106
+ if (!verifiedAhead) {
107
+ substitutions.pop();
108
+ }
109
+ }
110
+
111
+ return verifiedAhead;
112
+ });
113
+
114
+ variableVerified = termVerified; ///
103
115
  }
104
116
  }
105
117
  }
@@ -23,7 +23,7 @@ export default function verifyFile(filePath, releaseContext) {
23
23
  errorNodesLength = errorNodes.length;
24
24
 
25
25
  if (errorNodesLength > 0) {
26
- releaseContext.info(`The '${filePath}' file cannot be verified because it contains errors.`);
26
+ releaseContext.warning(`The '${filePath}' file cannot be verified because it contains errors.`);
27
27
  } else {
28
28
  const topLevelDeclarationNodes = topLevelDeclarationNodesQuery(node),
29
29
  topLevelDeclarationsVerified = topLevelDeclarationNodes.every((topLevelDeclarationNode) => {
@@ -17,7 +17,7 @@ export default function verifyLabel(labelNode, labels, fileContext) {
17
17
  if (labelPresent) {
18
18
  const labelString = fileContext.nodeAsString(labelNode);
19
19
 
20
- fileContext.info(`The '${labelString}' label is already present.`, labelNode);
20
+ fileContext.debug(`The '${labelString}' label is already present.`, labelNode);
21
21
  } else {
22
22
  const label = Label.fromLabelNode(labelNode);
23
23