occam-verify-cli 0.0.526 → 0.0.527

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 (106) hide show
  1. package/lib/assertion/type.js +10 -40
  2. package/lib/axiom.js +7 -7
  3. package/lib/axiomLemmaTheoremConjecture.js +190 -0
  4. package/lib/conjecture.js +141 -0
  5. package/lib/consequence.js +3 -3
  6. package/lib/constants.js +4 -16
  7. package/lib/context/file.js +76 -39
  8. package/lib/context/metaproof.js +40 -10
  9. package/lib/context/proof.js +38 -105
  10. package/lib/context/release/directory.js +20 -1
  11. package/lib/context/release/file.js +27 -3
  12. package/lib/equality.js +78 -51
  13. package/lib/index.js +1 -13
  14. package/lib/kinds.js +5 -1
  15. package/lib/lemma.js +7 -7
  16. package/lib/matcher/metastatementForMetavariable.js +16 -19
  17. package/lib/matcher/statementForMetavariable.js +22 -20
  18. package/lib/matcher/{statementForVariable → termForVariable}/consequence.js +13 -13
  19. package/lib/matcher/{statementForVariable → termForVariable}/supposition.js +13 -13
  20. package/lib/matcher/termForVariable.js +198 -0
  21. package/lib/matcher.js +23 -64
  22. package/lib/mixins/file.js +62 -2
  23. package/lib/premise.js +4 -4
  24. package/lib/ruleNames.js +1 -9
  25. package/lib/step/proof.js +22 -1
  26. package/lib/substitution/statementForMetavariable.js +12 -8
  27. package/lib/substitution/termForVariable.js +86 -0
  28. package/lib/supposition.js +4 -4
  29. package/lib/theorem.js +7 -7
  30. package/lib/type.js +9 -2
  31. package/lib/utilities/string.js +3 -7
  32. package/lib/utilities/substitution.js +4 -5
  33. package/lib/variable.js +4 -38
  34. package/lib/verify/assertion/type.js +59 -36
  35. package/lib/verify/axiom.js +1 -2
  36. package/lib/verify/conjecture.js +56 -0
  37. package/lib/verify/declaration/topLevel.js +7 -3
  38. package/lib/verify/lemma.js +1 -2
  39. package/lib/verify/metastatement/qualified.js +1 -2
  40. package/lib/verify/metastatement/unqualified.js +1 -2
  41. package/lib/verify/rule.js +1 -2
  42. package/lib/verify/statement/qualified.js +39 -10
  43. package/lib/verify/statement/unqualified.js +1 -2
  44. package/lib/verify/statement.js +44 -47
  45. package/lib/verify/theorem.js +1 -2
  46. package/package.json +1 -1
  47. package/src/assertion/type.js +7 -32
  48. package/src/axiom.js +4 -4
  49. package/src/{axiomLemmaTheorem.js → axiomLemmaTheoremConjecture.js} +5 -5
  50. package/src/conjecture.js +13 -0
  51. package/src/consequence.js +2 -2
  52. package/src/constants.js +1 -4
  53. package/src/context/file.js +81 -37
  54. package/src/context/metaproof.js +42 -5
  55. package/src/context/proof.js +42 -41
  56. package/src/context/release/directory.js +24 -0
  57. package/src/context/release/file.js +34 -3
  58. package/src/equality.js +110 -61
  59. package/src/index.js +0 -3
  60. package/src/kinds.js +1 -0
  61. package/src/lemma.js +4 -4
  62. package/src/matcher/metastatementForMetavariable.js +22 -32
  63. package/src/matcher/statementForMetavariable.js +40 -34
  64. package/src/matcher/termForVariable/consequence.js +9 -0
  65. package/src/matcher/termForVariable/supposition.js +9 -0
  66. package/src/matcher/termForVariable.js +89 -0
  67. package/src/matcher.js +28 -22
  68. package/src/mixins/file.js +46 -1
  69. package/src/premise.js +4 -4
  70. package/src/ruleNames.js +0 -2
  71. package/src/step/proof.js +27 -0
  72. package/src/substitution/statementForMetavariable.js +17 -10
  73. package/src/substitution/termForVariable.js +64 -0
  74. package/src/supposition.js +3 -3
  75. package/src/theorem.js +4 -4
  76. package/src/type.js +14 -4
  77. package/src/utilities/string.js +4 -6
  78. package/src/utilities/substitution.js +6 -4
  79. package/src/variable.js +4 -37
  80. package/src/verify/assertion/type.js +70 -64
  81. package/src/verify/axiom.js +0 -1
  82. package/src/verify/conjecture.js +73 -0
  83. package/src/verify/declaration/topLevel.js +7 -0
  84. package/src/verify/lemma.js +0 -1
  85. package/src/verify/metastatement/qualified.js +0 -1
  86. package/src/verify/metastatement/unqualified.js +0 -1
  87. package/src/verify/rule.js +0 -1
  88. package/src/verify/statement/qualified.js +53 -13
  89. package/src/verify/statement/unqualified.js +0 -1
  90. package/src/verify/statement.js +46 -66
  91. package/src/verify/theorem.js +0 -1
  92. package/lib/axiomLemmaTheorem.js +0 -190
  93. package/lib/jsonTypes.js +0 -30
  94. package/lib/matcher/statementForVariable.js +0 -201
  95. package/lib/substitution/statementForVariable.js +0 -86
  96. package/lib/utilities/json.js +0 -187
  97. package/lib/utilities/version.js +0 -32
  98. package/lib/versionChanges.js +0 -34
  99. package/src/jsonTypes.js +0 -6
  100. package/src/matcher/statementForVariable/consequence.js +0 -9
  101. package/src/matcher/statementForVariable/supposition.js +0 -9
  102. package/src/matcher/statementForVariable.js +0 -99
  103. package/src/substitution/statementForVariable.js +0 -64
  104. package/src/utilities/json.js +0 -264
  105. package/src/utilities/version.js +0 -30
  106. package/src/versionChanges.js +0 -11
@@ -9,15 +9,16 @@ import Type from "../../type";
9
9
  import Axiom from "../../axiom";
10
10
  import Lemma from "../../lemma";
11
11
  import Theorem from "../../theorem";
12
+ import Conjecture from "../../conjecture";
12
13
  import Combinator from "../../combinator";
13
14
  import Constructor from "../../constructor";
14
15
 
15
16
  import { push } from "../../utilities/array";
16
17
  import { customGrammarFromNameAndEntries } from "../../utilities/customGrammar";
17
- import { RULE_KIND, TYPE_KIND, AXIOM_KIND, LEMMA_KIND, THEOREM_KIND, COMBINATOR_KIND, CONSTRUCTOR_KIND } from "../../kinds";
18
+ import { RULE_KIND, TYPE_KIND, AXIOM_KIND, LEMMA_KIND, THEOREM_KIND, CONJECTURE_KIND, COMBINATOR_KIND, CONSTRUCTOR_KIND } from "../../kinds";
18
19
 
19
20
  export default class FileReleaseContext extends ReleaseContext {
20
- constructor(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts, contextJSON, types, rules, axioms, lemmas, theorems, combinators, constructors) {
21
+ constructor(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts, contextJSON, types, rules, axioms, lemmas, theorems, conjectures, combinators, constructors) {
21
22
  super(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts);
22
23
 
23
24
  this.types = types;
@@ -25,8 +26,10 @@ export default class FileReleaseContext extends ReleaseContext {
25
26
  this.axioms = axioms;
26
27
  this.lemmas = lemmas;
27
28
  this.theorems = theorems;
29
+ this.conjectures = conjectures;
28
30
  this.combinators = combinators;
29
31
  this.constructors = constructors;
32
+
30
33
  this.contextJSON = contextJSON;
31
34
  }
32
35
 
@@ -153,6 +156,25 @@ export default class FileReleaseContext extends ReleaseContext {
153
156
  return theorems;
154
157
  }
155
158
 
159
+ getConjectures(includeDependencies = true) {
160
+ const conjectures = [];
161
+
162
+ push(conjectures, this.conjectures);
163
+
164
+ if (includeDependencies) {
165
+ const dependencyReleaseContexts = this.getDependencyReleaseContexts();
166
+
167
+ dependencyReleaseContexts.forEach((releaseContext) => {
168
+ const includeDependencies = false,
169
+ releaseContextConjectures = releaseContext.getConjectures(includeDependencies);
170
+
171
+ push(conjectures, releaseContextConjectures);
172
+ });
173
+ }
174
+
175
+ return conjectures;
176
+ }
177
+
156
178
  getCombinators(includeDependencies = true) {
157
179
  const combinators = [];
158
180
 
@@ -252,6 +274,14 @@ export default class FileReleaseContext extends ReleaseContext {
252
274
  break;
253
275
  }
254
276
 
277
+ case CONJECTURE_KIND: {
278
+ const conjecture = Conjecture.fromJSON(json, releaseContext);
279
+
280
+ this.conjectures.push(conjecture);
281
+
282
+ break;
283
+ }
284
+
255
285
  case COMBINATOR_KIND: {
256
286
  const combinator = Combinator.fromJSON(json, releaseContext);
257
287
 
@@ -288,9 +318,10 @@ export default class FileReleaseContext extends ReleaseContext {
288
318
  axioms = [],
289
319
  lemmas = [],
290
320
  theorems = [],
321
+ conjectures = [],
291
322
  combinators = [],
292
323
  constructors = [],
293
- releaseContext = new FileReleaseContext(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts, contextJSON, types, rules, axioms, lemmas, theorems, combinators, constructors);
324
+ releaseContext = new FileReleaseContext(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts, contextJSON, types, rules, axioms, lemmas, theorems, conjectures, combinators, constructors);
294
325
 
295
326
  return releaseContext;
296
327
  }
package/src/equality.js CHANGED
@@ -1,7 +1,14 @@
1
1
  "use strict";
2
2
 
3
+ import verifyTerm from "./verify/term";
4
+ import equalityCombinator from "./ocmbinator/equality";
5
+
6
+ import { matcher } from "./matcher";
3
7
  import { nodeQuery } from "./utilities/query";
8
+ import { first, second } from "./utilities/array";
9
+ import { EQUALITY_DEPTH } from "./constants";
4
10
  import { TERM_RULE_NAME } from "./ruleNames";
11
+ import { verifyStatementAgainstCombinator } from "./verify/statement";
5
12
 
6
13
  const leftTermNodeQuery = nodeQuery("/statement/argument[0]/term!"),
7
14
  rightTermNodeQuery = nodeQuery("/statement/argument[1]/term!");
@@ -20,30 +27,7 @@ export default class Equality {
20
27
  return this.rightTermNode;
21
28
  }
22
29
 
23
- match(equality, equalities) {
24
- let matches = false;
25
-
26
- const leftTermNode = equality.getLeftTermNode(),
27
- rightTermNode = equality.getRightTermNode();
28
-
29
- if (!matches) {
30
- const reversed = false,
31
- leftTermNodeAndRightTermNodeMatch = this.matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities);
32
-
33
- matches = leftTermNodeAndRightTermNodeMatch; ///
34
- }
35
-
36
- if (!matches) {
37
- const reversed = true,
38
- leftTermNodeAndRightTermNodeMatch = this.matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities);
39
-
40
- matches = leftTermNodeAndRightTermNodeMatch; ///
41
- }
42
-
43
- return matches;
44
- }
45
-
46
- matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities) {
30
+ matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context) {
47
31
  let leftTermNodeAndRightTermNodeMatch = true;
48
32
 
49
33
  if (leftTermNodeAndRightTermNodeMatch) {
@@ -51,7 +35,7 @@ export default class Equality {
51
35
  this.rightTermNode :
52
36
  this.leftTermNode, ///
53
37
  rightNonTerminalNode = leftTermNode, ///
54
- nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities);
38
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context);
55
39
 
56
40
  leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
57
41
  }
@@ -61,7 +45,7 @@ export default class Equality {
61
45
  this.leftTermNode :
62
46
  this.rightTermNode, ///
63
47
  rightNonTerminalNode = rightTermNode, ///
64
- nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities);
48
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context);
65
49
 
66
50
  leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
67
51
  }
@@ -69,10 +53,35 @@ export default class Equality {
69
53
  return leftTermNodeAndRightTermNodeMatch;
70
54
  }
71
55
 
72
- equate(equalities) {
56
+ match(equality, equalities, context) {
57
+ let matches = false;
58
+
59
+ const leftTermNode = equality.getLeftTermNode(),
60
+ rightTermNode = equality.getRightTermNode();
61
+
62
+ equalities = filterEqualities(equalities, equality); ///
63
+
64
+ if (!matches) {
65
+ const reversed = false,
66
+ leftTermNodeAndRightTermNodeMatch = this.matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context);
67
+
68
+ matches = leftTermNodeAndRightTermNodeMatch; ///
69
+ }
70
+
71
+ if (!matches) {
72
+ const reversed = true,
73
+ leftTermNodeAndRightTermNodeMatch = this.matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context);
74
+
75
+ matches = leftTermNodeAndRightTermNodeMatch; ///
76
+ }
77
+
78
+ return matches;
79
+ }
80
+
81
+ equate(equalities, context) {
73
82
  const leftNonTerminalNode = this.leftTermNode, ///
74
83
  rightNonTerminalNode = this.rightTermNode, ///
75
- nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities),
84
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context),
76
85
  equates = nonTerminalNodeEquates; ///
77
86
 
78
87
  return equates;
@@ -84,10 +93,18 @@ export default class Equality {
84
93
  const statementNode = proofStep.getStatementNode();
85
94
 
86
95
  if (statementNode !== null) {
87
- const leftTermNode = leftTermNodeQuery(statementNode),
88
- rightTermNode = rightTermNodeQuery(statementNode);
96
+ const combinator = equalityCombinator, ///
97
+ combinatorStatementNode = combinator.getStatementNode(), ///
98
+ substitutions = null,
99
+ depth = EQUALITY_DEPTH,
100
+ nodeA = statementNode, ///
101
+ nodeB = combinatorStatementNode, ///
102
+ nodeMatches = matcher.matchNode(nodeA, nodeB, substitutions, depth);
103
+
104
+ if (nodeMatches) {
105
+ const leftTermNode = leftTermNodeQuery(statementNode),
106
+ rightTermNode = rightTermNodeQuery(statementNode);
89
107
 
90
- if ((leftTermNode !== null) && (rightTermNode !== null)) {
91
108
  equality = new Equality(leftTermNode, rightTermNode);
92
109
  }
93
110
  }
@@ -95,22 +112,24 @@ export default class Equality {
95
112
  return equality;
96
113
  }
97
114
 
98
- static fromStatementNode(statementNode) {
99
- const leftTermNode = leftTermNodeQuery(statementNode),
100
- rightTermNode = rightTermNodeQuery(statementNode),
101
- equality = new Equality(leftTermNode, rightTermNode);
115
+ static fromStatementNode(statementNode, context) {
116
+ let equality = null;
102
117
 
103
- return equality;
104
- }
118
+ const combinator = equalityCombinator, ///
119
+ statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
105
120
 
106
- static fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode) {
107
- const equality = new Equality(leftTermNode, rightTermNode);
121
+ if (statementVerifiedAgainstCombinator) {
122
+ const leftTermNode = leftTermNodeQuery(statementNode),
123
+ rightTermNode = rightTermNodeQuery(statementNode);
124
+
125
+ equality = new Equality(leftTermNode, rightTermNode);
126
+ }
108
127
 
109
128
  return equality;
110
129
  }
111
130
  }
112
131
 
113
- function equateNode(nodeA, nodeB, equalities) {
132
+ function equateNode(nodeA, nodeB, equalities, context) {
114
133
  let nodeEquates = false;
115
134
 
116
135
  const nodeATerminalNode = nodeA.isTerminalNode(),
@@ -120,13 +139,13 @@ function equateNode(nodeA, nodeB, equalities) {
120
139
  if (nodeATerminalNode) {
121
140
  const terminalNodeA = nodeA, ///
122
141
  terminalNodeB = nodeB, ///
123
- terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, equalities);
142
+ terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, equalities, context);
124
143
 
125
144
  nodeEquates = terminalNodeEquates; ///
126
145
  } else {
127
146
  const nonTerminalNodeA = nodeA, ///
128
147
  nonTerminalNodeB = nodeB, ///
129
- nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equalities);
148
+ nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equalities, context);
130
149
 
131
150
  nodeEquates = nonTerminalNodeEquates; ///
132
151
  }
@@ -135,7 +154,7 @@ function equateNode(nodeA, nodeB, equalities) {
135
154
  return nodeEquates;
136
155
  }
137
156
 
138
- function equateNodes(leftNodes, rightNodes, equalities) {
157
+ function equateNodes(leftNodes, rightNodes, equalities, context) {
139
158
  let nodesEquate = false;
140
159
 
141
160
  const leftNodesLength = leftNodes.length,
@@ -144,7 +163,7 @@ function equateNodes(leftNodes, rightNodes, equalities) {
144
163
  if (leftNodesLength === rightNodesLength) {
145
164
  nodesEquate = leftNodes.every((LeftNode, index) => {
146
165
  const rightNode = rightNodes[index],
147
- nodeEquates = equateNode(LeftNode, rightNode, equalities);
166
+ nodeEquates = equateNode(LeftNode, rightNode, equalities, context);
148
167
 
149
168
  if (nodeEquates) {
150
169
  return true;
@@ -155,14 +174,14 @@ function equateNodes(leftNodes, rightNodes, equalities) {
155
174
  return nodesEquate;
156
175
  }
157
176
 
158
- function equateTerminalNode(terminalNodeA, terminalNodeB, equalities) {
177
+ function equateTerminalNode(terminalNodeA, terminalNodeB, equalities, context) {
159
178
  const matches = terminalNodeA.match(terminalNodeB),
160
179
  terminalNodeEquates = matches; ///
161
180
 
162
181
  return terminalNodeEquates;
163
182
  }
164
183
 
165
- function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities) {
184
+ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context) {
166
185
  let nonTerminalNodeEquates = false;
167
186
 
168
187
  const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
@@ -175,7 +194,7 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
175
194
  if (ruleNameTermRuleName) {
176
195
  const leftTermNode = leftNonTerminalNode, ///
177
196
  rightTermNode = rightNonTerminalNode, ///
178
- termNodeEquates = equateTermNode(leftTermNode, rightTermNode, equalities);
197
+ termNodeEquates = equateTermNode(leftTermNode, rightTermNode, equalities, context);
179
198
 
180
199
  nonTerminalNodeEquates = termNodeEquates; ///
181
200
  }
@@ -185,7 +204,7 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
185
204
  rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(),
186
205
  leftNodes = leftNonTerminalNodeChildNodes, ///
187
206
  rightNodes = rightNonTerminalNodeChildNodes, ///
188
- nodesEquate = equateNodes(leftNodes, rightNodes, equalities);
207
+ nodesEquate = equateNodes(leftNodes, rightNodes, equalities, context);
189
208
 
190
209
  nonTerminalNodeEquates = nodesEquate; ///
191
210
  }
@@ -194,23 +213,24 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
194
213
  return nonTerminalNodeEquates;
195
214
  }
196
215
 
197
- function equateTermNode(leftTermNode, rightTermNode, equalities) {
198
- const equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode),
199
- equalityA = equality, ///
200
- equalityMatches = equalities.some((equality) => { ///
201
- let equalitiesB = equalities; ///
216
+ function equateTermNode(leftTermNode, rightTermNode, equalities, context) {
217
+ let termNodeEquates = false;
202
218
 
203
- const equalityB = equality; ///
219
+ const equality = equalityFromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, context);
204
220
 
205
- equalitiesB = filterEqualities(equalitiesB, equalityB); ///
221
+ if (equality !== null) {
222
+ const equalityA = equality, ///
223
+ equalitiesB = equalities, ///
224
+ equalityMatches = equalitiesB.some((equalityB) => { ///
225
+ const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB, context);
206
226
 
207
- const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB);
227
+ if (equalityAMatchesEqualityB) {
228
+ return true;
229
+ }
230
+ });
208
231
 
209
- if (equalityAMatchesEqualityB) {
210
- return true;
211
- }
212
- }),
213
- termNodeEquates = equalityMatches; ///
232
+ termNodeEquates = equalityMatches; ///
233
+ }
214
234
 
215
235
  return termNodeEquates;
216
236
  }
@@ -228,3 +248,32 @@ function filterEqualities(equalities, equality) {
228
248
 
229
249
  return equalities;
230
250
  }
251
+
252
+ function equalityFromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, context) {
253
+ let equality = null;
254
+
255
+ const types = [],
256
+ leftTermVerified = verifyTerm(leftTermNode, types, context),
257
+ rightTermVerified = verifyTerm(rightTermNode, types, context);
258
+
259
+ if (leftTermVerified && rightTermVerified) {
260
+ const firstType = first(types),
261
+ secondType = second(types),
262
+ leftTermType = firstType, ///
263
+ rightTermType = secondType, ///
264
+ leftTermTypeEqualToRightTermType = leftTermType.isEqualTo(rightTermType);
265
+
266
+ if (leftTermTypeEqualToRightTermType) {
267
+ equality = new Equality(leftTermNode, rightTermNode);
268
+ } else {
269
+ const leftTermString = context.nodeAsString(leftTermNode),
270
+ rightTermString = context.nodeAsString(rightTermNode),
271
+ leftTermTypeName = leftTermType.getName(),
272
+ rightTermTypeName = rightTermType.getName();
273
+
274
+ context.error(`The left '${leftTermString}' term's '${leftTermTypeName}' type is not equal to the right '${rightTermString}' term's '${rightTermTypeName}' type.'`);
275
+ }
276
+ }
277
+
278
+ return equality;
279
+ }
package/src/index.js CHANGED
@@ -3,11 +3,8 @@
3
3
  export { default as Callbacks } from "./callbacks";
4
4
  export { default as verifyRelease } from "./verify/release";
5
5
  export { default as ReleaseContext } from "./context/release";
6
- export { default as versionChanges } from "./versionChanges";
7
6
  export { default as FileReleaseContext } from "./context/release/file";
8
7
  export { default as DirectoryReleaseContext } from "./context/release/directory";
9
8
 
10
- export { default as jsonUtilities } from "./utilities/json";
11
- export { default as versionUtilities } from "./utilities/version";
12
9
  export { default as customGrammarUtilities } from "./utilities/customGrammar";
13
10
  export { default as releaseContextUtilities } from "./utilities/releaseContext";
package/src/kinds.js CHANGED
@@ -5,5 +5,6 @@ export const RULE_KIND = "rule";
5
5
  export const AXIOM_KIND = "axiom";
6
6
  export const LEMMA_KIND = "lemma";
7
7
  export const THEOREM_KIND = "theorem";
8
+ export const CONJECTURE_KIND = "conjecture";
8
9
  export const COMBINATOR_KIND = "combinator";
9
10
  export const CONSTRUCTOR_KIND = "constructor";
package/src/lemma.js CHANGED
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
 
3
- import AxiomLemmaTheorem from "./axiomLemmaTheorem";
3
+ import AxiomLemmaTheoremConjecture from "./axiomLemmaTheoremConjecture";
4
4
 
5
5
  import { LEMMA_KIND } from "./kinds";
6
6
 
7
- export default class Lemma extends AxiomLemmaTheorem {
7
+ export default class Lemma extends AxiomLemmaTheoremConjecture {
8
8
  static kind = LEMMA_KIND;
9
9
 
10
- static fromJSON(json, releaseContext) { return AxiomLemmaTheorem.fromJSON(Lemma, json, releaseContext); }
10
+ static fromJSON(json, releaseContext) { return AxiomLemmaTheoremConjecture.fromJSON(Lemma, json, releaseContext); }
11
11
 
12
- static fromLabelsSuppositionsAndConsequence(labels, suppositions, consequence) { return AxiomLemmaTheorem.fromLabelsSuppositionsAndConsequence(Lemma, labels, suppositions, consequence); }
12
+ static fromLabelsSuppositionsAndConsequence(labels, suppositions, consequence) { return AxiomLemmaTheoremConjecture.fromLabelsSuppositionsAndConsequence(Lemma, labels, suppositions, consequence); }
13
13
  }
@@ -3,31 +3,36 @@
3
3
  import Matcher from "../matcher";
4
4
  import MetastatementForMetavariableSubstitution from "../substitution/metastatementForMetavariable";
5
5
 
6
- import { first } from "../utilities/array";
6
+ import { nodeQuery } from "../utilities/query";
7
+ import { METASTATEMENT_RULE_NAME } from "../ruleNames";
7
8
  import { metavariableNameFromMetavariableNode } from "../utilities/query";
8
- import { METAVARIABLE_RULE_NAME, METASTATEMENT_RULE_NAME } from "../ruleNames";
9
+
10
+ const metavariableNodeQuery = nodeQuery('/metastatement/metavariable!');
9
11
 
10
12
  export default class MetastatementForMetavariableMatcher extends Matcher {
11
13
  matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions) {
12
14
  let nonTerminalNodeMatches = false;
13
15
 
14
16
  const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
15
- nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName(),
16
- nonTerminalNodeARuleNameMetastatementRuleName = (nonTerminalNodeARuleName === METASTATEMENT_RULE_NAME),
17
- nonTerminalNodeBRuleNameMetastatementRuleName = (nonTerminalNodeBRuleName === METASTATEMENT_RULE_NAME);
17
+ nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName();
18
+
19
+ if (nonTerminalNodeBRuleName === nonTerminalNodeARuleName) {
20
+ const nonTerminalNodeARuleNameMetastatementRuleName = (nonTerminalNodeARuleName === METASTATEMENT_RULE_NAME),
21
+ nonTerminalNodeBRuleNameMetastatementRuleName = (nonTerminalNodeBRuleName === METASTATEMENT_RULE_NAME);
18
22
 
19
- if (nonTerminalNodeARuleNameMetastatementRuleName && nonTerminalNodeBRuleNameMetastatementRuleName) {
20
- const metastatementNodeA = nonTerminalNodeA, ///
21
- metastatementNodeB = nonTerminalNodeB, ///
22
- metastatementNodeMatches = this.matchMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions);
23
+ if (nonTerminalNodeARuleNameMetastatementRuleName && nonTerminalNodeBRuleNameMetastatementRuleName) {
24
+ const metastatementNodeA = nonTerminalNodeA, ///
25
+ metastatementNodeB = nonTerminalNodeB, ///
26
+ metastatementNodeMatches = this.matchMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions);
23
27
 
24
- if (metastatementNodeMatches) {
25
- nonTerminalNodeMatches = true; ///
28
+ if (metastatementNodeMatches) {
29
+ nonTerminalNodeMatches = true; ///
30
+ } else {
31
+ nonTerminalNodeMatches = super.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
32
+ }
26
33
  } else {
27
34
  nonTerminalNodeMatches = super.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
28
35
  }
29
- } else if (nonTerminalNodeBRuleName === nonTerminalNodeARuleName) {
30
- nonTerminalNodeMatches = super.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
31
36
  }
32
37
 
33
38
  return nonTerminalNodeMatches;
@@ -36,27 +41,12 @@ export default class MetastatementForMetavariableMatcher extends Matcher {
36
41
  matchMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions) {
37
42
  let metastatementNodeMatches = false;
38
43
 
39
- const nonTerminalNodeA = metastatementNodeA, ///
40
- nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
41
- nonTerminalNodeAChildNodesLength = nonTerminalNodeAChildNodes.length;
42
-
43
- if (nonTerminalNodeAChildNodesLength === 1) {
44
- const firstNonTerminalNodeAChildNode = first(nonTerminalNodeAChildNodes),
45
- cChildNodeA = firstNonTerminalNodeAChildNode, ///
46
- cChildNodeANonTerminalNode = cChildNodeA.isNonTerminalNode();
44
+ const metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
47
45
 
48
- if (cChildNodeANonTerminalNode) {
49
- const nonTerminalNodeA = cChildNodeA, ///
50
- nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
51
- nonTerminalNodeARuleNameMetavariableRuleName = (nonTerminalNodeARuleName === METAVARIABLE_RULE_NAME);
46
+ if (metavariableNodeA !== null) {
47
+ const metaVariableNodeMatches = this.matchMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions);
52
48
 
53
- if (nonTerminalNodeARuleNameMetavariableRuleName) {
54
- const metavariableNodeA = nonTerminalNodeA, ///
55
- metaVariableNodeMatches = this.matchMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions);
56
-
57
- metastatementNodeMatches = metaVariableNodeMatches; ///
58
- }
59
- }
49
+ metastatementNodeMatches = metaVariableNodeMatches; ///
60
50
  }
61
51
 
62
52
  return metastatementNodeMatches;
@@ -3,31 +3,52 @@
3
3
  import Matcher from "../matcher";
4
4
  import StatementForMetavariableSubstitution from "../substitution/statementForMetavariable";
5
5
 
6
- import { first } from "../utilities/array";
6
+ import { nodeQuery } from "../utilities/query";
7
7
  import { metavariableNameFromMetavariableNode } from "../utilities/query";
8
- import { METAVARIABLE_RULE_NAME, METASTATEMENT_RULE_NAME } from "../ruleNames";
8
+ import { STATEMENT_RULE_NAME, METASTATEMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../ruleNames";
9
+
10
+ const metavariableNodeQuery = nodeQuery('/metastatement/metavariable!'),
11
+ metaArgumentChildNodeNodeQuery = nodeQuery('/metaArgument/*!');
9
12
 
10
13
  export default class StatementForMetavariableMatcher extends Matcher {
11
14
  matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions) {
12
15
  let nonTerminalNodeMatches = false;
13
16
 
14
- const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
15
- nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName(),
16
- nonTerminalNodeARuleNameMetastatementRuleName = (nonTerminalNodeARuleName === METASTATEMENT_RULE_NAME),
17
- nonTerminalNodeBRuleNameStatementRuleName = (nonTerminalNodeBRuleName === STATEMENT_RULE_NAME);
17
+ const nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName(),
18
+ nonTerminalNodeBRuleNameMetaArgumentRuleName = (nonTerminalNodeBRuleName === META_ARGUMENT_RULE_NAME);
19
+
20
+ if (nonTerminalNodeBRuleNameMetaArgumentRuleName) {
21
+ const metaArgumentNodeB = nonTerminalNodeB, ///
22
+ metaArgumentChildNodeB = metaArgumentChildNodeNodeQuery(metaArgumentNodeB);
18
23
 
19
- if (nonTerminalNodeARuleNameMetastatementRuleName && nonTerminalNodeBRuleNameStatementRuleName) {
20
- const metastatementNodeA = nonTerminalNodeA, ///
21
- statementNodeB = nonTerminalNodeB, ///
22
- statementNodeMatches = this.matchStatementNode(metastatementNodeA, statementNodeB, substitutions);
24
+ nonTerminalNodeB = metaArgumentChildNodeB; ///
23
25
 
24
- if (statementNodeMatches) {
25
- nonTerminalNodeMatches = true; ///
26
- } else {
26
+ nonTerminalNodeMatches = this.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
27
+ } else {
28
+ const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
29
+ nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName(),
30
+ nonTerminalNodeARuleNameMetastatementRuleName = (nonTerminalNodeARuleName === METASTATEMENT_RULE_NAME),
31
+ nonTerminalNodeBRuleNameStatementRuleName = (nonTerminalNodeBRuleName === STATEMENT_RULE_NAME);
32
+
33
+ if (nonTerminalNodeARuleNameMetastatementRuleName && nonTerminalNodeBRuleNameStatementRuleName) {
34
+ const metastatementNodeA = nonTerminalNodeA, ///
35
+ statementNodeB = nonTerminalNodeB, ///
36
+ statementNodeMatches = this.matchStatementNode(metastatementNodeA, statementNodeB, substitutions);
37
+
38
+ if (statementNodeMatches) {
39
+ nonTerminalNodeMatches = true; ///
40
+ } else {
41
+ const nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
42
+ nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
43
+ nodesA = nonTerminalNodeAChildNodes, ///
44
+ nodesB = nonTerminalNodeBChildNodes, ///
45
+ nodesMatch = this.matchNodes(nodesA, nodesB, substitutions);
46
+
47
+ nonTerminalNodeMatches = nodesMatch; ///
48
+ }
49
+ } else if (nonTerminalNodeBRuleName === nonTerminalNodeARuleName) {
27
50
  nonTerminalNodeMatches = super.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
28
51
  }
29
- } else if (nonTerminalNodeBRuleName === nonTerminalNodeARuleName) {
30
- nonTerminalNodeMatches = super.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
31
52
  }
32
53
 
33
54
  return nonTerminalNodeMatches;
@@ -36,27 +57,12 @@ export default class StatementForMetavariableMatcher extends Matcher {
36
57
  matchStatementNode(metastatementNodeA, statementNodeB, substitutions) {
37
58
  let statementNodeMatches = false;
38
59
 
39
- const nonTerminalNodeA = metastatementNodeA, ///
40
- nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
41
- nonTerminalNodeAChildNodesLength = nonTerminalNodeAChildNodes.length;
60
+ const metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
42
61
 
43
- if (nonTerminalNodeAChildNodesLength === 1) {
44
- const firstNonTerminalNodeAChildNode = first(nonTerminalNodeAChildNodes),
45
- cChildNodeA = firstNonTerminalNodeAChildNode, ///
46
- cChildNodeANonTerminalNode = cChildNodeA.isNonTerminalNode();
62
+ if (metavariableNodeA !== null) {
63
+ const metavariableNodeMatches = this.matchMetavariableNode(metavariableNodeA, statementNodeB, substitutions);
47
64
 
48
- if (cChildNodeANonTerminalNode) {
49
- const nonTerminalNodeA = cChildNodeA, ///
50
- nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
51
- nonTerminalNodeARuleNameMetavariableRuleName = (nonTerminalNodeARuleName === METAVARIABLE_RULE_NAME);
52
-
53
- if (nonTerminalNodeARuleNameMetavariableRuleName) {
54
- const metavariableNodeA = nonTerminalNodeA, ///
55
- metaVariableNodeMatches = this.matchMetavariableNode(metavariableNodeA, statementNodeB, substitutions);
56
-
57
- statementNodeMatches = metaVariableNodeMatches; ///
58
- }
59
- }
65
+ statementNodeMatches = metavariableNodeMatches; ///
60
66
  }
61
67
 
62
68
  return statementNodeMatches;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ import TermForVariableMatcher from "../../matcher/termForVariable";
4
+
5
+ class ConsequenceTermForVariableMatcher extends TermForVariableMatcher {
6
+ static createSubstitutions = false;
7
+ }
8
+
9
+ export const consequenceTermForVariableMatcher = new ConsequenceTermForVariableMatcher();
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ import TermForVariableMatcher from "../../matcher/termForVariable";
4
+
5
+ class SuppositionTermForVariableMatcher extends TermForVariableMatcher {
6
+ static createSubstitutions = true;
7
+ }
8
+
9
+ export const suppositionTermForVariableMatcher = new SuppositionTermForVariableMatcher();