occam-verify-cli 0.0.526 → 0.0.529

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 (221) hide show
  1. package/README.md +4 -0
  2. package/bin/abbreviations.js +5 -1
  3. package/bin/action/help.js +4 -0
  4. package/bin/action/verify.js +35 -13
  5. package/bin/actions.js +11 -6
  6. package/bin/defaults.js +4 -0
  7. package/bin/options.js +4 -0
  8. package/bin/utilities/releaseContext.js +5 -7
  9. package/lib/assertion/type.js +10 -40
  10. package/lib/axiom.js +8 -8
  11. package/lib/axiomLemmaTheoremConjecture.js +190 -0
  12. package/lib/combinator.js +4 -3
  13. package/lib/conclusion.js +8 -7
  14. package/lib/conjecture.js +141 -0
  15. package/lib/consequence.js +6 -5
  16. package/lib/constants.js +11 -27
  17. package/lib/constructor.js +5 -4
  18. package/lib/context/file.js +88 -73
  19. package/lib/context/metaproof.js +51 -20
  20. package/lib/context/proof.js +48 -114
  21. package/lib/context/release/directory.js +25 -6
  22. package/lib/context/release/file.js +38 -25
  23. package/lib/context/release.js +32 -51
  24. package/lib/equality.js +79 -51
  25. package/lib/index.js +4 -16
  26. package/lib/kinds.js +5 -1
  27. package/lib/label.js +4 -3
  28. package/lib/lemma.js +8 -8
  29. package/lib/log.js +146 -0
  30. package/lib/matcher.js +25 -75
  31. package/lib/metaTypeNames.js +13 -0
  32. package/lib/mixins/file.js +62 -2
  33. package/lib/mixins/logging.js +13 -13
  34. package/lib/node/metastatement/bracketed.js +16 -0
  35. package/lib/node/statement/bracketed.js +16 -0
  36. package/lib/node/statement/combinator/bracketed.js +17 -0
  37. package/lib/node/statement/combinator/equality.js +17 -0
  38. package/lib/node/statement/equality.js +16 -0
  39. package/lib/ocmbinator/bracketed.js +3 -4
  40. package/lib/ocmbinator/equality.js +3 -4
  41. package/lib/premise.js +13 -12
  42. package/lib/rule.js +5 -5
  43. package/lib/ruleNames.js +1 -9
  44. package/lib/step/metaproof.js +28 -25
  45. package/lib/step/proof.js +23 -1
  46. package/lib/substitution/metastatementForMetavariable.js +16 -13
  47. package/lib/substitution/statementForMetavariable.js +16 -13
  48. package/lib/substitution/termForVariable.js +76 -0
  49. package/lib/supposition.js +7 -6
  50. package/lib/theorem.js +8 -8
  51. package/lib/type.js +12 -5
  52. package/lib/utilities/metaproof.js +60 -0
  53. package/lib/utilities/node.js +56 -0
  54. package/lib/utilities/proof.js +60 -0
  55. package/lib/utilities/releaseContext.js +24 -12
  56. package/lib/utilities/string.js +3 -38
  57. package/lib/variable.js +4 -38
  58. package/lib/{matcher → verifier}/metastatementForMetavariable/conclusion.js +12 -12
  59. package/lib/{matcher → verifier}/metastatementForMetavariable/premise.js +12 -12
  60. package/lib/verifier/metastatementForMetavariable.js +198 -0
  61. package/lib/{matcher → verifier}/statementForMetavariable/conclusion.js +12 -12
  62. package/lib/{matcher → verifier}/statementForMetavariable/premise.js +12 -12
  63. package/lib/verifier/statementForMetavariable.js +203 -0
  64. package/lib/{matcher/statementForVariable → verifier/termForVariable}/consequence.js +13 -13
  65. package/lib/{matcher/statementForVariable → verifier/termForVariable}/supposition.js +13 -13
  66. package/lib/verifier/termForVariable.js +198 -0
  67. package/lib/verifier.js +92 -0
  68. package/lib/verify/assertion/type.js +62 -41
  69. package/lib/verify/axiom.js +3 -6
  70. package/lib/verify/conclusion.js +2 -4
  71. package/lib/verify/conjecture.js +54 -0
  72. package/lib/verify/consequence.js +2 -4
  73. package/lib/verify/declaration/combinator.js +1 -3
  74. package/lib/verify/declaration/constructor.js +1 -3
  75. package/lib/verify/declaration/topLevel.js +7 -5
  76. package/lib/verify/declaration/type.js +1 -3
  77. package/lib/verify/declaration/variable.js +1 -3
  78. package/lib/verify/derivation.js +1 -5
  79. package/lib/verify/label.js +1 -3
  80. package/lib/verify/lemma.js +3 -6
  81. package/lib/verify/metastatement/qualified.js +2 -5
  82. package/lib/verify/metastatement/unqualified.js +2 -5
  83. package/lib/verify/metastatement.js +1 -3
  84. package/lib/verify/premise.js +2 -4
  85. package/lib/verify/proof.js +3 -5
  86. package/lib/verify/rule.js +3 -6
  87. package/lib/verify/ruleDerivation.js +1 -5
  88. package/lib/verify/ruleProof.js +3 -5
  89. package/lib/verify/statement/qualified.js +40 -13
  90. package/lib/verify/statement/unqualified.js +2 -5
  91. package/lib/verify/statement.js +56 -62
  92. package/lib/verify/statementAsCombinator.js +4 -6
  93. package/lib/verify/supposition.js +2 -4
  94. package/lib/verify/term.js +4 -10
  95. package/lib/verify/termAsConstructor.js +6 -9
  96. package/lib/verify/theorem.js +3 -6
  97. package/lib/verify/type.js +5 -9
  98. package/lib/verify/variable.js +5 -9
  99. package/package.json +1 -1
  100. package/src/assertion/type.js +7 -32
  101. package/src/axiom.js +4 -4
  102. package/src/{axiomLemmaTheorem.js → axiomLemmaTheoremConjecture.js} +9 -9
  103. package/src/combinator.js +3 -3
  104. package/src/conclusion.js +7 -7
  105. package/src/conjecture.js +13 -0
  106. package/src/consequence.js +5 -5
  107. package/src/constants.js +3 -7
  108. package/src/constructor.js +4 -4
  109. package/src/context/file.js +85 -65
  110. package/src/context/metaproof.js +55 -15
  111. package/src/context/proof.js +53 -50
  112. package/src/context/release/directory.js +31 -7
  113. package/src/context/release/file.js +47 -31
  114. package/src/context/release.js +23 -32
  115. package/src/equality.js +108 -61
  116. package/src/index.js +2 -4
  117. package/src/kinds.js +1 -0
  118. package/src/label.js +3 -3
  119. package/src/lemma.js +4 -4
  120. package/src/log.js +116 -0
  121. package/src/matcher.js +32 -24
  122. package/src/metaTypeNames.js +3 -0
  123. package/src/mixins/file.js +46 -1
  124. package/src/mixins/logging.js +6 -6
  125. package/src/node/metastatement/bracketed.js +9 -0
  126. package/src/node/statement/bracketed.js +9 -0
  127. package/src/node/statement/combinator/bracketed.js +10 -0
  128. package/src/node/statement/combinator/equality.js +11 -0
  129. package/src/node/statement/equality.js +10 -0
  130. package/src/ocmbinator/bracketed.js +2 -5
  131. package/src/ocmbinator/equality.js +2 -5
  132. package/src/premise.js +13 -13
  133. package/src/rule.js +4 -4
  134. package/src/ruleNames.js +0 -2
  135. package/src/step/metaproof.js +32 -29
  136. package/src/step/proof.js +28 -0
  137. package/src/substitution/metastatementForMetavariable.js +10 -15
  138. package/src/substitution/statementForMetavariable.js +11 -16
  139. package/src/substitution/termForVariable.js +36 -0
  140. package/src/supposition.js +6 -6
  141. package/src/theorem.js +4 -4
  142. package/src/type.js +17 -7
  143. package/src/utilities/metaproof.js +62 -0
  144. package/src/utilities/node.js +73 -0
  145. package/src/utilities/proof.js +62 -0
  146. package/src/utilities/releaseContext.js +30 -12
  147. package/src/utilities/string.js +4 -53
  148. package/src/variable.js +4 -37
  149. package/src/verifier/metastatementForMetavariable/conclusion.js +9 -0
  150. package/src/verifier/metastatementForMetavariable/premise.js +9 -0
  151. package/src/verifier/metastatementForMetavariable.js +89 -0
  152. package/src/verifier/statementForMetavariable/conclusion.js +9 -0
  153. package/src/verifier/statementForMetavariable/premise.js +9 -0
  154. package/src/verifier/statementForMetavariable.js +105 -0
  155. package/src/verifier/termForVariable/consequence.js +9 -0
  156. package/src/verifier/termForVariable/supposition.js +9 -0
  157. package/src/verifier/termForVariable.js +89 -0
  158. package/src/verifier.js +74 -0
  159. package/src/verify/assertion/type.js +74 -74
  160. package/src/verify/axiom.js +2 -9
  161. package/src/verify/conclusion.js +1 -7
  162. package/src/verify/conjecture.js +67 -0
  163. package/src/verify/consequence.js +1 -7
  164. package/src/verify/declaration/combinator.js +0 -6
  165. package/src/verify/declaration/constructor.js +0 -6
  166. package/src/verify/declaration/topLevel.js +7 -6
  167. package/src/verify/declaration/type.js +0 -6
  168. package/src/verify/declaration/variable.js +0 -6
  169. package/src/verify/derivation.js +0 -12
  170. package/src/verify/label.js +0 -6
  171. package/src/verify/lemma.js +4 -11
  172. package/src/verify/metastatement/qualified.js +1 -8
  173. package/src/verify/metastatement/unqualified.js +1 -8
  174. package/src/verify/metastatement.js +0 -6
  175. package/src/verify/premise.js +1 -7
  176. package/src/verify/proof.js +1 -7
  177. package/src/verify/rule.js +2 -9
  178. package/src/verify/ruleDerivation.js +0 -12
  179. package/src/verify/ruleProof.js +1 -7
  180. package/src/verify/statement/qualified.js +54 -20
  181. package/src/verify/statement/unqualified.js +1 -8
  182. package/src/verify/statement.js +65 -95
  183. package/src/verify/statementAsCombinator.js +3 -9
  184. package/src/verify/supposition.js +1 -7
  185. package/src/verify/term.js +3 -21
  186. package/src/verify/termAsConstructor.js +5 -13
  187. package/src/verify/theorem.js +2 -9
  188. package/src/verify/type.js +4 -13
  189. package/src/verify/variable.js +4 -13
  190. package/bin/callbacks.js +0 -48
  191. package/lib/axiomLemmaTheorem.js +0 -190
  192. package/lib/callbacks.js +0 -75
  193. package/lib/context/release/combinator.js +0 -64
  194. package/lib/jsonTypes.js +0 -30
  195. package/lib/matcher/metastatementForMetavariable.js +0 -201
  196. package/lib/matcher/statementForMetavariable.js +0 -201
  197. package/lib/matcher/statementForVariable.js +0 -201
  198. package/lib/mixins/callbacks.js +0 -27
  199. package/lib/substitution/statementForVariable.js +0 -86
  200. package/lib/utilities/json.js +0 -187
  201. package/lib/utilities/substitution.js +0 -61
  202. package/lib/utilities/version.js +0 -32
  203. package/lib/versionChanges.js +0 -34
  204. package/src/callbacks.js +0 -39
  205. package/src/context/release/combinator.js +0 -39
  206. package/src/jsonTypes.js +0 -6
  207. package/src/matcher/metastatementForMetavariable/conclusion.js +0 -9
  208. package/src/matcher/metastatementForMetavariable/premise.js +0 -9
  209. package/src/matcher/metastatementForMetavariable.js +0 -99
  210. package/src/matcher/statementForMetavariable/conclusion.js +0 -9
  211. package/src/matcher/statementForMetavariable/premise.js +0 -9
  212. package/src/matcher/statementForMetavariable.js +0 -99
  213. package/src/matcher/statementForVariable/consequence.js +0 -9
  214. package/src/matcher/statementForVariable/supposition.js +0 -9
  215. package/src/matcher/statementForVariable.js +0 -99
  216. package/src/mixins/callbacks.js +0 -15
  217. package/src/substitution/statementForVariable.js +0 -64
  218. package/src/utilities/json.js +0 -264
  219. package/src/utilities/substitution.js +0 -79
  220. package/src/utilities/version.js +0 -30
  221. package/src/versionChanges.js +0 -11
package/src/equality.js CHANGED
@@ -1,7 +1,15 @@
1
1
  "use strict";
2
2
 
3
+ import matcher from "./matcher";
4
+ import verifyTerm from "./verify/term";
5
+ import equalityCombinator from "./ocmbinator/equality";
6
+ import equalityStatementNode from "./node/statement/equality";
7
+
3
8
  import { nodeQuery } from "./utilities/query";
9
+ import { first, second } from "./utilities/array";
10
+ import { EQUALITY_DEPTH } from "./constants";
4
11
  import { TERM_RULE_NAME } from "./ruleNames";
12
+ import { verifyStatementAgainstCombinator } from "./verify/statement";
5
13
 
6
14
  const leftTermNodeQuery = nodeQuery("/statement/argument[0]/term!"),
7
15
  rightTermNodeQuery = nodeQuery("/statement/argument[1]/term!");
@@ -20,30 +28,7 @@ export default class Equality {
20
28
  return this.rightTermNode;
21
29
  }
22
30
 
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) {
31
+ matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context) {
47
32
  let leftTermNodeAndRightTermNodeMatch = true;
48
33
 
49
34
  if (leftTermNodeAndRightTermNodeMatch) {
@@ -51,7 +36,7 @@ export default class Equality {
51
36
  this.rightTermNode :
52
37
  this.leftTermNode, ///
53
38
  rightNonTerminalNode = leftTermNode, ///
54
- nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities);
39
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context);
55
40
 
56
41
  leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
57
42
  }
@@ -61,7 +46,7 @@ export default class Equality {
61
46
  this.leftTermNode :
62
47
  this.rightTermNode, ///
63
48
  rightNonTerminalNode = rightTermNode, ///
64
- nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities);
49
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context);
65
50
 
66
51
  leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
67
52
  }
@@ -69,10 +54,35 @@ export default class Equality {
69
54
  return leftTermNodeAndRightTermNodeMatch;
70
55
  }
71
56
 
72
- equate(equalities) {
57
+ match(equality, equalities, context) {
58
+ let matches = false;
59
+
60
+ const leftTermNode = equality.getLeftTermNode(),
61
+ rightTermNode = equality.getRightTermNode();
62
+
63
+ equalities = filterEqualities(equalities, equality); ///
64
+
65
+ if (!matches) {
66
+ const reversed = false,
67
+ leftTermNodeAndRightTermNodeMatch = this.matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context);
68
+
69
+ matches = leftTermNodeAndRightTermNodeMatch; ///
70
+ }
71
+
72
+ if (!matches) {
73
+ const reversed = true,
74
+ leftTermNodeAndRightTermNodeMatch = this.matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context);
75
+
76
+ matches = leftTermNodeAndRightTermNodeMatch; ///
77
+ }
78
+
79
+ return matches;
80
+ }
81
+
82
+ equate(equalities, context) {
73
83
  const leftNonTerminalNode = this.leftTermNode, ///
74
84
  rightNonTerminalNode = this.rightTermNode, ///
75
- nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities),
85
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context),
76
86
  equates = nonTerminalNodeEquates; ///
77
87
 
78
88
  return equates;
@@ -84,10 +94,15 @@ export default class Equality {
84
94
  const statementNode = proofStep.getStatementNode();
85
95
 
86
96
  if (statementNode !== null) {
87
- const leftTermNode = leftTermNodeQuery(statementNode),
88
- rightTermNode = rightTermNodeQuery(statementNode);
97
+ const nodeA = statementNode, ///
98
+ nodeB = equalityStatementNode, ///
99
+ depth = EQUALITY_DEPTH,
100
+ nodeMatches = matcher.matchNode(nodeA, nodeB, depth);
101
+
102
+ if (nodeMatches) {
103
+ const leftTermNode = leftTermNodeQuery(statementNode),
104
+ rightTermNode = rightTermNodeQuery(statementNode);
89
105
 
90
- if ((leftTermNode !== null) && (rightTermNode !== null)) {
91
106
  equality = new Equality(leftTermNode, rightTermNode);
92
107
  }
93
108
  }
@@ -95,22 +110,24 @@ export default class Equality {
95
110
  return equality;
96
111
  }
97
112
 
98
- static fromStatementNode(statementNode) {
99
- const leftTermNode = leftTermNodeQuery(statementNode),
100
- rightTermNode = rightTermNodeQuery(statementNode),
101
- equality = new Equality(leftTermNode, rightTermNode);
113
+ static fromStatementNode(statementNode, context) {
114
+ let equality = null;
102
115
 
103
- return equality;
104
- }
116
+ const combinator = equalityCombinator, ///
117
+ statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
105
118
 
106
- static fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode) {
107
- const equality = new Equality(leftTermNode, rightTermNode);
119
+ if (statementVerifiedAgainstCombinator) {
120
+ const leftTermNode = leftTermNodeQuery(statementNode),
121
+ rightTermNode = rightTermNodeQuery(statementNode);
122
+
123
+ equality = new Equality(leftTermNode, rightTermNode);
124
+ }
108
125
 
109
126
  return equality;
110
127
  }
111
128
  }
112
129
 
113
- function equateNode(nodeA, nodeB, equalities) {
130
+ function equateNode(nodeA, nodeB, equalities, context) {
114
131
  let nodeEquates = false;
115
132
 
116
133
  const nodeATerminalNode = nodeA.isTerminalNode(),
@@ -120,13 +137,13 @@ function equateNode(nodeA, nodeB, equalities) {
120
137
  if (nodeATerminalNode) {
121
138
  const terminalNodeA = nodeA, ///
122
139
  terminalNodeB = nodeB, ///
123
- terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, equalities);
140
+ terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, equalities, context);
124
141
 
125
142
  nodeEquates = terminalNodeEquates; ///
126
143
  } else {
127
144
  const nonTerminalNodeA = nodeA, ///
128
145
  nonTerminalNodeB = nodeB, ///
129
- nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equalities);
146
+ nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equalities, context);
130
147
 
131
148
  nodeEquates = nonTerminalNodeEquates; ///
132
149
  }
@@ -135,7 +152,7 @@ function equateNode(nodeA, nodeB, equalities) {
135
152
  return nodeEquates;
136
153
  }
137
154
 
138
- function equateNodes(leftNodes, rightNodes, equalities) {
155
+ function equateNodes(leftNodes, rightNodes, equalities, context) {
139
156
  let nodesEquate = false;
140
157
 
141
158
  const leftNodesLength = leftNodes.length,
@@ -144,7 +161,7 @@ function equateNodes(leftNodes, rightNodes, equalities) {
144
161
  if (leftNodesLength === rightNodesLength) {
145
162
  nodesEquate = leftNodes.every((LeftNode, index) => {
146
163
  const rightNode = rightNodes[index],
147
- nodeEquates = equateNode(LeftNode, rightNode, equalities);
164
+ nodeEquates = equateNode(LeftNode, rightNode, equalities, context);
148
165
 
149
166
  if (nodeEquates) {
150
167
  return true;
@@ -155,14 +172,14 @@ function equateNodes(leftNodes, rightNodes, equalities) {
155
172
  return nodesEquate;
156
173
  }
157
174
 
158
- function equateTerminalNode(terminalNodeA, terminalNodeB, equalities) {
175
+ function equateTerminalNode(terminalNodeA, terminalNodeB, equalities, context) {
159
176
  const matches = terminalNodeA.match(terminalNodeB),
160
177
  terminalNodeEquates = matches; ///
161
178
 
162
179
  return terminalNodeEquates;
163
180
  }
164
181
 
165
- function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities) {
182
+ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context) {
166
183
  let nonTerminalNodeEquates = false;
167
184
 
168
185
  const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
@@ -175,7 +192,7 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
175
192
  if (ruleNameTermRuleName) {
176
193
  const leftTermNode = leftNonTerminalNode, ///
177
194
  rightTermNode = rightNonTerminalNode, ///
178
- termNodeEquates = equateTermNode(leftTermNode, rightTermNode, equalities);
195
+ termNodeEquates = equateTermNode(leftTermNode, rightTermNode, equalities, context);
179
196
 
180
197
  nonTerminalNodeEquates = termNodeEquates; ///
181
198
  }
@@ -185,7 +202,7 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
185
202
  rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(),
186
203
  leftNodes = leftNonTerminalNodeChildNodes, ///
187
204
  rightNodes = rightNonTerminalNodeChildNodes, ///
188
- nodesEquate = equateNodes(leftNodes, rightNodes, equalities);
205
+ nodesEquate = equateNodes(leftNodes, rightNodes, equalities, context);
189
206
 
190
207
  nonTerminalNodeEquates = nodesEquate; ///
191
208
  }
@@ -194,23 +211,24 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
194
211
  return nonTerminalNodeEquates;
195
212
  }
196
213
 
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; ///
214
+ function equateTermNode(leftTermNode, rightTermNode, equalities, context) {
215
+ let termNodeEquates = false;
202
216
 
203
- const equalityB = equality; ///
217
+ const equality = equalityFromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, context);
204
218
 
205
- equalitiesB = filterEqualities(equalitiesB, equalityB); ///
219
+ if (equality !== null) {
220
+ const equalityA = equality, ///
221
+ equalitiesB = equalities, ///
222
+ equalityMatches = equalitiesB.some((equalityB) => { ///
223
+ const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB, context);
206
224
 
207
- const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB);
225
+ if (equalityAMatchesEqualityB) {
226
+ return true;
227
+ }
228
+ });
208
229
 
209
- if (equalityAMatchesEqualityB) {
210
- return true;
211
- }
212
- }),
213
- termNodeEquates = equalityMatches; ///
230
+ termNodeEquates = equalityMatches; ///
231
+ }
214
232
 
215
233
  return termNodeEquates;
216
234
  }
@@ -228,3 +246,32 @@ function filterEqualities(equalities, equality) {
228
246
 
229
247
  return equalities;
230
248
  }
249
+
250
+ function equalityFromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, context) {
251
+ let equality = null;
252
+
253
+ const types = [],
254
+ leftTermVerified = verifyTerm(leftTermNode, types, context),
255
+ rightTermVerified = verifyTerm(rightTermNode, types, context);
256
+
257
+ if (leftTermVerified && rightTermVerified) {
258
+ const firstType = first(types),
259
+ secondType = second(types),
260
+ leftTermType = firstType, ///
261
+ rightTermType = secondType, ///
262
+ leftTermTypeEqualToRightTermType = leftTermType.isEqualTo(rightTermType);
263
+
264
+ if (leftTermTypeEqualToRightTermType) {
265
+ equality = new Equality(leftTermNode, rightTermNode);
266
+ } else {
267
+ const leftTermString = context.nodeAsString(leftTermNode),
268
+ rightTermString = context.nodeAsString(rightTermNode),
269
+ leftTermTypeName = leftTermType.getName(),
270
+ rightTermTypeName = rightTermType.getName();
271
+
272
+ context.error(`The left '${leftTermString}' term's '${leftTermTypeName}' type is not equal to the right '${rightTermString}' term's '${rightTermTypeName}' type.'`, leftTermNode);
273
+ }
274
+ }
275
+
276
+ return equality;
277
+ }
package/src/index.js CHANGED
@@ -1,13 +1,11 @@
1
1
  "use strict";
2
2
 
3
- export { default as Callbacks } from "./callbacks";
3
+ export { default as Log } from "./log";
4
+
4
5
  export { default as verifyRelease } from "./verify/release";
5
6
  export { default as ReleaseContext } from "./context/release";
6
- export { default as versionChanges } from "./versionChanges";
7
7
  export { default as FileReleaseContext } from "./context/release/file";
8
8
  export { default as DirectoryReleaseContext } from "./context/release/directory";
9
9
 
10
- export { default as jsonUtilities } from "./utilities/json";
11
- export { default as versionUtilities } from "./utilities/version";
12
10
  export { default as customGrammarUtilities } from "./utilities/customGrammar";
13
11
  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/label.js CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { nodeAsString } from "./utilities/string";
4
4
  import { labelNameFromLabelNode } from "./utilities/query";
5
- import { labelNodeFromLabelString } from "./utilities/string";
5
+ import { labelNodeFromLabelString } from "./utilities/node";
6
6
 
7
7
  export default class Label {
8
8
  constructor(node) {
@@ -34,9 +34,9 @@ export default class Label {
34
34
  return json;
35
35
  }
36
36
 
37
- static fromJSON(json, releaseContext) {
37
+ static fromJSON(json, lexer, parser) {
38
38
  const labelString = json, ///
39
- labelNode = labelNodeFromLabelString(labelString, releaseContext),
39
+ labelNode = labelNodeFromLabelString(labelString, lexer, parser),
40
40
  node = labelNode, ///
41
41
  label = new Label(node);
42
42
 
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, lexer, parser) { return AxiomLemmaTheoremConjecture.fromJSON(Lemma, json, lexer, parser); }
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
  }
package/src/log.js ADDED
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+
3
+ import { levels } from "necessary";
4
+
5
+ import { leastLineIndexFromNodeAndTokens, greatestLineIndexFromNodeAndTokens } from "./utilities/tokens";
6
+
7
+ const { TRACE_LEVEL, DEBUG_LEVEL, INFO_LEVEL, WARNING_LEVEL, ERROR_LEVEL, FATAL_LEVEL } = levels;
8
+
9
+ export default class Log {
10
+ constructor(messages, logLevel, follow) {
11
+ this.messages = messages;
12
+ this.logLevel = logLevel;
13
+ this.follow = follow;
14
+ }
15
+
16
+ getMessages() {
17
+ return this.messages;
18
+ }
19
+
20
+ getLogLevel() {
21
+ return this.logLevel;
22
+ }
23
+
24
+ getFollow() {
25
+ return this.follow;
26
+ }
27
+
28
+ trace(message, node, tokens, filePath) {
29
+ const level = TRACE_LEVEL;
30
+
31
+ this.write(level, message, node, tokens, filePath);
32
+ }
33
+
34
+ debug(message, node, tokens, filePath) {
35
+ const level = DEBUG_LEVEL;
36
+
37
+ this.write(level, message, node, tokens, filePath);
38
+ }
39
+
40
+ info(message, node, tokens, filePath) {
41
+ const level = INFO_LEVEL;
42
+
43
+ this.write(level, message, node, tokens, filePath);
44
+ }
45
+
46
+ warning(message, node, tokens, filePath) {
47
+ const level = WARNING_LEVEL;
48
+
49
+ this.write(level, message, node, tokens, filePath);
50
+ }
51
+
52
+ error(message, node, tokens, filePath) {
53
+ const level = ERROR_LEVEL;
54
+
55
+ this.write(level, message, node, tokens, filePath);
56
+ }
57
+
58
+ fatal(message, node, tokens, filePath) {
59
+ const level = FATAL_LEVEL;
60
+
61
+ this.write(level, message, node, tokens, filePath);
62
+ }
63
+
64
+ write(level, message, node, tokens, filePath) {
65
+ const levels = [
66
+ TRACE_LEVEL,
67
+ DEBUG_LEVEL,
68
+ INFO_LEVEL,
69
+ WARNING_LEVEL,
70
+ ERROR_LEVEL,
71
+ FATAL_LEVEL,
72
+ ],
73
+ levelIndex = levels.indexOf(level),
74
+ logLevelIndex = levels.indexOf(this.logLevel);
75
+
76
+ if (levelIndex < logLevelIndex) {
77
+ return;
78
+ }
79
+
80
+ message = formatMessage(level, message, node, tokens, filePath); ///
81
+
82
+ this.follow ?
83
+ console.log(message) :
84
+ this.messages.push(message);
85
+ }
86
+
87
+ static followAndLogLevel(follow, logLevel) {
88
+ const messages = follow ?
89
+ null :
90
+ [],
91
+ log = new Log(messages, logLevel, follow);
92
+
93
+ return log;
94
+ }
95
+ }
96
+
97
+ function formatMessage(level, message, node, tokens, filePath) {
98
+ const upperCaseLevel = level.toUpperCase();
99
+
100
+ if (node === null) {
101
+ message = `${upperCaseLevel}: ${message}`;
102
+ } else {
103
+ const leastLineIndex = leastLineIndexFromNodeAndTokens(node, tokens),
104
+ greatestLineIndex = greatestLineIndexFromNodeAndTokens(node, tokens);
105
+
106
+ if (leastLineIndex === greatestLineIndex) {
107
+ const lineIndex = leastLineIndex; ///
108
+
109
+ message = `${upperCaseLevel}: ${filePath} (${lineIndex}) - ${message}`;
110
+ } else {
111
+ message = `${upperCaseLevel}: ${filePath} (${leastLineIndex}-${greatestLineIndex}) - ${message}`;
112
+ }
113
+ }
114
+
115
+ return message;
116
+ }
package/src/matcher.js CHANGED
@@ -1,41 +1,47 @@
1
1
  "use strict";
2
2
 
3
- export default class Matcher {
4
- matchNode(nodeA, nodeB, ...remainingArguments) {
3
+ class Matcher {
4
+ matchNode(nodeA, nodeB, depth = Infinity) {
5
5
  let nodeMatches = false;
6
6
 
7
- const nodeATerminalNode = nodeA.isTerminalNode(),
8
- nodeBTerminalNode = nodeB.isTerminalNode();
9
-
10
- if (nodeATerminalNode === nodeBTerminalNode) {
11
- if (nodeATerminalNode) {
12
- const terminalNodeA = nodeA, ///
13
- terminalNodeB = nodeB, ///
14
- terminalNodeMatches = this.matchTerminalNode(terminalNodeA, terminalNodeB, ...remainingArguments);
15
-
16
- nodeMatches = terminalNodeMatches; ///
17
- } else {
18
- const nonTerminalNodeA = nodeA, ///
19
- nonTerminalNodeB = nodeB, ///
20
- nonTerminalNodeMatches = this.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, ...remainingArguments);
21
-
22
- nodeMatches = nonTerminalNodeMatches; ///
7
+ if (depth === 0) {
8
+ nodeMatches = true;
9
+ } else {
10
+ const nodeATerminalNode = nodeA.isTerminalNode(),
11
+ nodeBTerminalNode = nodeB.isTerminalNode();
12
+
13
+ if (nodeATerminalNode === nodeBTerminalNode) {
14
+ if (nodeATerminalNode) {
15
+ const terminalNodeA = nodeA, ///
16
+ terminalNodeB = nodeB, ///
17
+ terminalNodeMatches = this.matchTerminalNode(terminalNodeA, terminalNodeB);
18
+
19
+ nodeMatches = terminalNodeMatches; ///
20
+ } else {
21
+ const nonTerminalNodeA = nodeA, ///
22
+ nonTerminalNodeB = nodeB, ///
23
+ nonTerminalNodeMatches = this.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, depth);
24
+
25
+ nodeMatches = nonTerminalNodeMatches; ///
26
+ }
23
27
  }
24
28
  }
25
29
 
26
30
  return nodeMatches;
27
31
  }
28
32
 
29
- matchNodes(nodesA, nodesB, ...remainingArguments) {
33
+ matchNodes(nodesA, nodesB, depth) {
30
34
  let nodesMatch = false;
31
35
 
32
36
  const nodesALength = nodesA.length,
33
37
  nodesBLength = nodesB.length;
34
38
 
35
39
  if (nodesALength === nodesBLength) {
40
+ depth --;
41
+
36
42
  nodesMatch = nodesA.every((nodeA, index) => {
37
43
  const nodeB = nodesB[index],
38
- nodeMatches = this.matchNode(nodeA, nodeB, ...remainingArguments);
44
+ nodeMatches = this.matchNode(nodeA, nodeB, depth);
39
45
 
40
46
  if (nodeMatches) {
41
47
  return true;
@@ -46,14 +52,14 @@ export default class Matcher {
46
52
  return nodesMatch;
47
53
  }
48
54
 
49
- matchTerminalNode(terminalNodeA, terminalNodeB, ...remainingArguments) {
55
+ matchTerminalNode(terminalNodeA, terminalNodeB, depth) {
50
56
  const matches = terminalNodeA.match(terminalNodeB),
51
57
  terminalNodeMatches = matches; ///
52
58
 
53
59
  return terminalNodeMatches;
54
60
  }
55
61
 
56
- matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, ...remainingArguments) {
62
+ matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, depth) {
57
63
  let nonTerminalNodeMatches = false;
58
64
 
59
65
  const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(), ///
@@ -64,7 +70,7 @@ export default class Matcher {
64
70
  nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
65
71
  nodesA = nonTerminalNodeAChildNodes, ///
66
72
  nodesB = nonTerminalNodeBChildNodes, ///
67
- nodesMatch = this.matchNodes(nodesA, nodesB, ...remainingArguments);
73
+ nodesMatch = this.matchNodes(nodesA, nodesB, depth);
68
74
 
69
75
  nonTerminalNodeMatches = nodesMatch; ///
70
76
  }
@@ -73,4 +79,6 @@ export default class Matcher {
73
79
  }
74
80
  }
75
81
 
76
- export const matcher = new Matcher();
82
+ const matcher = new Matcher();
83
+
84
+ export default matcher;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+
3
+ export const STATEMENT_META_TYPE_NAME = "Statement";
@@ -1,12 +1,57 @@
1
1
  "use strict";
2
2
 
3
+ function getAxioms() { return this.context.getAxioms(); }
4
+
5
+ function getLemmas() { return this.context.getLemmas(); }
6
+
7
+ function getTheorems() { return this.context.getTheorems(); }
8
+
9
+ function getConjectures() { return this.context.getConjectures(); }
10
+
11
+ function getCombinators() { return this.context.getCombinators(); }
12
+
13
+ function getConstructors() { return this.context.getConstructors(); }
14
+
15
+ function findTypeByTypeName(typeName) { return this.context.findTypeByTypeName(typeName); }
16
+
17
+ function findLabelByTypeName(labelName) { return this.context.findLabelByTypeName(labelName); }
18
+
3
19
  function findRuleByReferenceName(referenceName) { return this.context.findRuleByReferenceName(referenceName); }
4
20
 
5
21
  function findAxiomByReferenceName(referenceName) { return this.context.findAxiomByReferenceName(referenceName); }
6
22
 
23
+ function findLemmaByReferenceName(referenceName) { return this.context.findLemmaByReferenceName(referenceName); }
24
+
25
+ function findTheoremByReferenceName(referenceName) { return this.context.findTheoremByReferenceName(referenceName); }
26
+
27
+ function findConjectureByReferenceName(referenceName) { return this.context.findConjectureByReferenceName(referenceName); }
28
+
29
+ function isLabelPresentByLabelName(labelName) { return this.context.isLabelPresentByLabelName(labelName); }
30
+
31
+ function isTypePresentByTypeName(typeName) { return this.context.isTypePresentByTypeName(typeName); }
32
+
33
+ function nodeAsString(node) { return this.context.nodeAsString(node); }
34
+
35
+ function nodesAsString(node) { return this.context.nodesAsString(node); }
36
+
7
37
  const fileMixins = {
38
+ getAxioms,
39
+ getLemmas,
40
+ getTheorems,
41
+ getConjectures,
42
+ getCombinators,
43
+ getConstructors,
44
+ findTypeByTypeName,
45
+ findLabelByTypeName,
8
46
  findRuleByReferenceName,
9
- findAxiomByReferenceName
47
+ findAxiomByReferenceName,
48
+ findLemmaByReferenceName,
49
+ findTheoremByReferenceName,
50
+ findConjectureByReferenceName,
51
+ isLabelPresentByLabelName,
52
+ isTypePresentByTypeName,
53
+ nodeAsString,
54
+ nodesAsString
10
55
  };
11
56
 
12
57
  export default fileMixins;
@@ -1,16 +1,16 @@
1
1
  "use strict";
2
2
 
3
- function trace(message) { this.context.trace(message); }
3
+ function trace(node, message) { this.context.trace(node, message); }
4
4
 
5
- function debug(message) { this.context.debug(message); }
5
+ function debug(node, message) { this.context.debug(node, message); }
6
6
 
7
- function info(message) { this.context.info(message); }
7
+ function info(node, message) { this.context.info(node, message); }
8
8
 
9
- function warning(message) { this.context.warning(message); }
9
+ function warning(node, message) { this.context.warning(node, message); }
10
10
 
11
- function error(message) { this.context.error(message); }
11
+ function error(node, message) { this.context.error(node, message); }
12
12
 
13
- function fatal(message) { this.context.fatal(message); }
13
+ function fatal(node, message) { this.context.fatal(node, message); }
14
14
 
15
15
  const loggingMixins = {
16
16
  trace,
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ import { metastatementNodeFromMetastatementString } from "../../utilities/node";
4
+
5
+ const bracketedMetastatementString = "(A)";
6
+
7
+ const bracketedMetastatementNode = metastatementNodeFromMetastatementString(bracketedMetastatementString);
8
+
9
+ export default bracketedMetastatementNode;