occam-verify-cli 0.0.474 → 0.0.477

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.
package/src/equality.js CHANGED
@@ -1,8 +1,233 @@
1
1
  "use strict";
2
2
 
3
+ import { nodeQuery } from "./utilities/query";
4
+ import { TERM_RULE_NAME } from "./ruleNames";
5
+
6
+ const equalityNodeQuery = nodeQuery("/statement/equality!"),
7
+ leftTermNodeQuery = nodeQuery("/equality/term[0]"),
8
+ rightTermNodeQuery = nodeQuery("/equality/term[1]");
9
+
3
10
  export default class Equality {
4
- constructor(termNodeA, termNodeB) {
5
- this.termNodeA = termNodeA;
6
- this.termNodeB = termNodeB;
11
+ constructor(leftTermNode, rightTermNode) {
12
+ this.leftTermNode = leftTermNode;
13
+ this.rightTermNode = rightTermNode;
14
+ }
15
+
16
+ getLeftTermNode() {
17
+ return this.leftTermNode;
18
+ }
19
+
20
+ getRightTermNode() {
21
+ return this.rightTermNode;
22
+ }
23
+
24
+ match(equality, equalities, proofContext) {
25
+ let matches = false;
26
+
27
+ const leftTermNode = equality.getLeftTermNode(),
28
+ rightTermNode = equality.getRightTermNode();
29
+
30
+ if (!matches) {
31
+ const reversed = false,
32
+ leftTermNodeAndRightTermNodeMatch = this.matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities, proofContext);
33
+
34
+ matches = leftTermNodeAndRightTermNodeMatch; ///
35
+ }
36
+
37
+ if (!matches) {
38
+ const reversed = true,
39
+ leftTermNodeAndRightTermNodeMatch = this.matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities, proofContext);
40
+
41
+ matches = leftTermNodeAndRightTermNodeMatch; ///
42
+ }
43
+
44
+ return matches;
7
45
  }
46
+
47
+ matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities, proofContext) {
48
+ let leftTermNodeAndRightTermNodeMatch = true;
49
+
50
+ if (leftTermNodeAndRightTermNodeMatch) {
51
+ const leftNonTerminalNode = reversed ?
52
+ this.rightTermNode :
53
+ this.leftTermNode, ///
54
+ rightNonTerminalNode = leftTermNode, ///
55
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, proofContext);
56
+
57
+ leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
58
+ }
59
+
60
+ if (leftTermNodeAndRightTermNodeMatch) {
61
+ const leftNonTerminalNode = reversed ?
62
+ this.leftTermNode :
63
+ this.rightTermNode, ///
64
+ rightNonTerminalNode = rightTermNode, ///
65
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, proofContext);
66
+
67
+ leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
68
+ }
69
+
70
+ return leftTermNodeAndRightTermNodeMatch;
71
+ }
72
+
73
+ equate(equalities, proofContext) {
74
+ const leftNonTerminalNode = this.leftTermNode, ///
75
+ rightNonTerminalNode = this.rightTermNode, ///
76
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, proofContext),
77
+ equates = nonTerminalNodeEquates; ///
78
+
79
+ return equates;
80
+ }
81
+
82
+ static fromProofStep(proofStep) {
83
+ let equality = null;
84
+
85
+ const statementNode = proofStep.getStatementNode();
86
+
87
+ if (statementNode !== null) {
88
+ const equalityNode = equalityNodeQuery(statementNode);
89
+
90
+ if (equalityNode !== null) {
91
+ const leftTermNode = leftTermNodeQuery(equalityNode),
92
+ rightTermNode = rightTermNodeQuery(equalityNode);
93
+
94
+ equality = new Equality(leftTermNode, rightTermNode);
95
+ }
96
+ }
97
+
98
+ return equality;
99
+ }
100
+
101
+ static fromEqualityNode(equalityNode) {
102
+ const leftTermNode = leftTermNodeQuery(equalityNode),
103
+ rightTermNode = rightTermNodeQuery(equalityNode),
104
+ equality = new Equality(leftTermNode, rightTermNode);
105
+
106
+ return equality;
107
+ }
108
+
109
+ static fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode) {
110
+ const equality = new Equality(leftTermNode, rightTermNode);
111
+
112
+ return equality;
113
+ }
114
+ }
115
+
116
+ function equateNode(nodeA, nodeB, equalities, proofContext) {
117
+ let nodeEquates = false;
118
+
119
+ const nodeATerminalNode = nodeA.isTerminalNode(),
120
+ nodeBTerminalNode = nodeB.isTerminalNode();
121
+
122
+ if (nodeATerminalNode === nodeBTerminalNode) {
123
+ if (nodeATerminalNode) {
124
+ const terminalNodeA = nodeA, ///
125
+ terminalNodeB = nodeB, ///
126
+ terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, equalities, proofContext);
127
+
128
+ nodeEquates = terminalNodeEquates; ///
129
+ } else {
130
+ const nonTerminalNodeA = nodeA, ///
131
+ nonTerminalNodeB = nodeB, ///
132
+ nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equalities, proofContext);
133
+
134
+ nodeEquates = nonTerminalNodeEquates; ///
135
+ }
136
+ }
137
+
138
+ return nodeEquates;
139
+ }
140
+
141
+ function equateNodes(leftNodes, rightNodes, equalities, proofContext) {
142
+ let nodesEquate = false;
143
+
144
+ const leftNodesLength = leftNodes.length,
145
+ rightNodesLength = rightNodes.length;
146
+
147
+ if (leftNodesLength === rightNodesLength) {
148
+ nodesEquate = leftNodes.every((LeftNode, index) => {
149
+ const rightNode = rightNodes[index],
150
+ nodeEquates = equateNode(LeftNode, rightNode, equalities, proofContext);
151
+
152
+ if (nodeEquates) {
153
+ return true;
154
+ }
155
+ });
156
+ }
157
+
158
+ return nodesEquate;
159
+ }
160
+
161
+ function equateTerminalNode(terminalNodeA, terminalNodeB, equalities, proofContext) {
162
+ const matches = terminalNodeA.match(terminalNodeB),
163
+ terminalNodeEquates = matches; ///
164
+
165
+ return terminalNodeEquates;
166
+ }
167
+
168
+ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, proofContext) {
169
+ let nonTerminalNodeEquates = false;
170
+
171
+ const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
172
+ rightNonTerminalNodeRuleName = rightNonTerminalNode.getRuleName();
173
+
174
+ if (leftNonTerminalNodeRuleName === rightNonTerminalNodeRuleName) {
175
+ const ruleName = leftNonTerminalNodeRuleName, ///
176
+ ruleNameTermRuleName = (ruleName === TERM_RULE_NAME);
177
+
178
+ if (ruleNameTermRuleName) {
179
+ const leftTermNode = leftNonTerminalNode, ///
180
+ rightTermNode = rightNonTerminalNode, ///
181
+ termNodeEquates = equateTermNode(leftTermNode, rightTermNode, equalities, proofContext);
182
+
183
+ nonTerminalNodeEquates = termNodeEquates; ///
184
+ }
185
+
186
+ if (!nonTerminalNodeEquates) {
187
+ const leftNonTerminalNodeChildNodes = leftNonTerminalNode.getChildNodes(),
188
+ rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(),
189
+ leftNodes = leftNonTerminalNodeChildNodes, ///
190
+ rightNodes = rightNonTerminalNodeChildNodes, ///
191
+ nodesEquate = equateNodes(leftNodes, rightNodes, equalities, proofContext);
192
+
193
+ nonTerminalNodeEquates = nodesEquate; ///
194
+ }
195
+ }
196
+
197
+ return nonTerminalNodeEquates;
198
+ }
199
+
200
+ function equateTermNode(leftTermNode, rightTermNode, equalities, proofContext) {
201
+ const equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode),
202
+ equalityA = equality, ///
203
+ equalityMatches = equalities.some((equality) => { ///
204
+ let equalitiesB = equalities; ///
205
+
206
+ const equalityB = equality; ///
207
+
208
+ equalitiesB = pruneEqualities(equalitiesB, equalityB); ///
209
+
210
+ const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB, proofContext);
211
+
212
+ if (equalityAMatchesEqualityB) {
213
+ return true;
214
+ }
215
+ }),
216
+ termNodeEquates = equalityMatches; ///
217
+
218
+ return termNodeEquates;
219
+ }
220
+
221
+ function pruneEqualities(equalities, equality) {
222
+ const equalityA = equality; ///
223
+
224
+ equalities = equalities.filter((equality) => {
225
+ const equalityB = equality; ///
226
+
227
+ if (equalityA !== equalityB) {
228
+ return true;
229
+ }
230
+ });
231
+
232
+ return equalities;
8
233
  }
@@ -25,12 +25,8 @@ export function createReleaseContext(dependency, dependentNames, context, callba
25
25
  return;
26
26
  }
27
27
 
28
- releaseContextMap[releaseName] = releaseContext;
29
-
30
- const { log } = context;
31
-
32
28
  if (releaseContext === null) {
33
- log.error(`The '${releaseName}' package could not be created.`);
29
+ const error = `The '${releaseName}' package could not be created.`;
34
30
 
35
31
  callback(error);
36
32
 
@@ -39,24 +35,23 @@ export function createReleaseContext(dependency, dependentNames, context, callba
39
35
 
40
36
  const releaseMatchesDependency = checkReleaseMatchesDependency(dependency, dependentNames, releaseContext, context);
41
37
 
42
- if (!releaseMatchesDependency) {
38
+ if (!releaseMatchesDependency) {
43
39
  const version = releaseContext.getVersion(),
44
40
  versionString = version.toString(),
45
41
  lastDependentName = last(dependentNames),
46
42
  dependentName = lastDependentName, ///
47
43
  dependencyName = dependency.getName(),
48
44
  shortenedVersion = dependency.getShortedVersion(),
49
- shortenedVersionString = shortenedVersion.toString();
50
-
51
- error = `Version mismatch: '${dependentName}' requires '${dependencyName}' to be version ${shortenedVersionString}.0 or higher but version ${versionString} has been supplied.`;
52
-
53
- log.error(error);
45
+ shortenedVersionString = shortenedVersion.toString(),
46
+ error = `Version mismatch: '${dependentName}' requires '${dependencyName}' to be version ${shortenedVersionString}.0 or higher but version ${versionString} has been supplied.`;
54
47
 
55
48
  callback(error);
56
49
 
57
50
  return;
58
51
  }
59
52
 
53
+ releaseContextMap[releaseName] = releaseContext;
54
+
60
55
  createDependencyReleaseContexts(dependency, dependentNames, context, callback);
61
56
  }, context);
62
57
  }
@@ -109,23 +104,11 @@ export default {
109
104
  initialiseReleaseContext
110
105
  };
111
106
 
112
- function checkCyclicDependencyExists(dependency, dependentNames, context) {
107
+ function checkCyclicDependencyExists(dependency, dependentNames) {
113
108
  const dependencyName = dependency.getName(),
114
109
  dependentNamesIncludesDependencyName = dependentNames.includes(dependencyName),
115
110
  cyclicDependencyExists = dependentNamesIncludesDependencyName; ///
116
111
 
117
- if (cyclicDependencyExists) {
118
- const { log } = context,
119
- firstDependentName = first(dependentNames),
120
- dependencyNames = [ ///
121
- ...dependentNames,
122
- firstDependentName
123
- ],
124
- dependencyNamesString = dependencyNames.join(`' -> '`);
125
-
126
- log.error(`There is a cyclic dependency: '${dependencyNamesString}'.`);
127
- }
128
-
129
112
  return cyclicDependencyExists;
130
113
  }
131
114
 
@@ -156,10 +139,16 @@ function createDependencyReleaseContexts(dependency, dependentNames, context, ca
156
139
  dependentNames = [ ...dependentNames, dependencyName ]; ///
157
140
 
158
141
  dependencies.asynchronousForEachDependency((dependency, next, done) => {
159
- const cyclicDependencyExists = checkCyclicDependencyExists(dependency, dependentNames, context);
142
+ const cyclicDependencyExists = checkCyclicDependencyExists(dependency, dependentNames);
160
143
 
161
144
  if (cyclicDependencyExists) {
162
- const error = null;
145
+ const firstDependentName = first(dependentNames),
146
+ dependencyNames = [ ///
147
+ ...dependentNames,
148
+ firstDependentName
149
+ ],
150
+ dependencyNamesString = dependencyNames.join(`' -> '`),
151
+ error =`There is a cyclic dependency: '${dependencyNamesString}'.`;
163
152
 
164
153
  callback(error);
165
154
 
package/src/variable.js CHANGED
@@ -35,6 +35,22 @@ export default class Variable {
35
35
  return matchesName;
36
36
  }
37
37
 
38
+ isEqualTo(variable) {
39
+ let equalTo = false;
40
+
41
+ if (variable === this) {
42
+ equalTo = true;
43
+ } else {
44
+ const value = variable.getValue();
45
+
46
+ if (value === this.value) {
47
+ equalTo = true;
48
+ }
49
+ }
50
+
51
+ return equalTo;
52
+ }
53
+
38
54
  asString() {
39
55
  let string;
40
56
 
@@ -1,13 +1,15 @@
1
1
  "use strict";
2
2
 
3
+ import Equality from "../equality";
3
4
  import verifyTerm from "../verify/term";
4
5
 
5
6
  import { nodeQuery } from "../utilities/query";
6
7
  import { nodeAsString } from "../utilities/string";
7
8
  import { first, second } from "../utilities/array";
9
+ import { MAXIMUM_INDEXES_LENGTH } from "../constants";
8
10
 
9
- const firstTermNodeQuery = nodeQuery("/equality/term[0]"),
10
- secondTermNodeQuery = nodeQuery("/equality/term[1]");
11
+ const leftTermNodeQuery = nodeQuery("/equality/term[0]"),
12
+ rightTermNodeQuery = nodeQuery("/equality/term[1]");
11
13
 
12
14
  export default function verifyEquality(equalityNode, proofContext) {
13
15
  let equalityVerified = false;
@@ -24,7 +26,12 @@ export default function verifyEquality(equalityNode, proofContext) {
24
26
  const derived = proofContext.isDerived();
25
27
 
26
28
  if (derived) {
27
- debugger
29
+ const equality = Equality.fromEqualityNode(equalityNode),
30
+ proofSteps = proofContext.getProofSteps(),
31
+ equalities = equalitiesFromProofSteps(proofSteps),
32
+ equalityEquates = equality.equate(equalities, proofContext);
33
+
34
+ equalityVerified = equalityEquates; ///
28
35
  } else {
29
36
  equalityVerified = true;
30
37
  }
@@ -46,20 +53,40 @@ function verifyEqualityTypes(equalityNode, proofContext) {
46
53
 
47
54
  const types = [],
48
55
  context = proofContext, ///
49
- firstTermNode = firstTermNodeQuery(equalityNode),
50
- secondTermNode = secondTermNodeQuery(equalityNode),
51
- firstTermVerified = verifyTerm(firstTermNode, types, context),
52
- secondTermVerified = verifyTerm(secondTermNode, types, context);
56
+ leftTermNode = leftTermNodeQuery(equalityNode),
57
+ rightTermNode = rightTermNodeQuery(equalityNode),
58
+ leftTermVerified = verifyTerm(leftTermNode, types, context),
59
+ rightTermVerified = verifyTerm(rightTermNode, types, context);
53
60
 
54
- if (firstTermVerified && secondTermVerified) {
61
+ if (leftTermVerified && rightTermVerified) {
55
62
  const firstType = first(types),
56
63
  secondType = second(types),
57
- firstTypeEqualToSubTypeOfOrSuperTypeOfSecondType = firstType.isEqualToSubTypeOfOrSuperTypeOf(secondType);
64
+ leftType = firstType, ///
65
+ rightType = secondType, ///
66
+ leftTypeEqualToSubTypeOfOrSuperTypeOfRightType = leftType.isEqualToSubTypeOfOrSuperTypeOf(rightType);
58
67
 
59
- if (firstTypeEqualToSubTypeOfOrSuperTypeOfSecondType) {
68
+ if (leftTypeEqualToSubTypeOfOrSuperTypeOfRightType) {
60
69
  equalityTypesVerified = true;
61
70
  }
62
71
  }
63
72
 
64
73
  return equalityTypesVerified;
65
74
  }
75
+
76
+ function equalitiesFromProofSteps(proofSteps) {
77
+ const start = -MAXIMUM_INDEXES_LENGTH; ///
78
+
79
+ proofSteps = proofSteps.slice(start); ///
80
+
81
+ const equalities = proofSteps.reduce((equalities, proofStep, index) => {
82
+ const equality = Equality.fromProofStep(proofStep);
83
+
84
+ if (equality !== null) {
85
+ equalities.push(equality);
86
+ }
87
+
88
+ return equalities;
89
+ }, []);
90
+
91
+ return equalities;
92
+ }
@@ -141,17 +141,15 @@ function verifyNode(node, constructorNode, context) {
141
141
  return nodeVerified;
142
142
  }
143
143
 
144
- function verifyChildNodes(childNodes, constructorChildNodes, context) {
145
- let childNodesVerified = false;
144
+ function verifyNodes(nodes, constructorNodes, context) {
145
+ let nodesVerified = false;
146
146
 
147
- const childNodesLength = childNodes.length,
148
- constructorChildNodesLength = constructorChildNodes.length;
147
+ const nodesLength = nodes.length,
148
+ constructorNodesLength = constructorNodes.length;
149
149
 
150
- if (childNodesLength === constructorChildNodesLength) {
151
- childNodesVerified = childNodes.every((childNode, index) => {
152
- const constructorChildNode = constructorChildNodes[index],
153
- node = childNode, ///
154
- constructorNode = constructorChildNode, ///
150
+ if (nodesLength === constructorNodesLength) {
151
+ nodesVerified = nodes.every((node, index) => {
152
+ const constructorNode = constructorNodes[index],
155
153
  nodeVerified = verifyNode(node, constructorNode, context);
156
154
 
157
155
  if (nodeVerified) {
@@ -160,7 +158,7 @@ function verifyChildNodes(childNodes, constructorChildNodes, context) {
160
158
  });
161
159
  }
162
160
 
163
- return childNodesVerified;
161
+ return nodesVerified;
164
162
  }
165
163
 
166
164
  function verifyTerminalNode(terminalNode, constructorTerminalNode, context) {
@@ -178,8 +176,8 @@ function verifyTerminalNode(terminalNode, constructorTerminalNode, context) {
178
176
  function verifyNonTerminalNode(nonTerminalNode, constructorNonTerminalNode, context) {
179
177
  let nonTerminalNodeVerified = false;
180
178
 
181
- const ruleName = nonTerminalNode.getRuleName(),
182
- constructorRuleName = constructorNonTerminalNode.getRuleName();
179
+ const ruleName = nonTerminalNode.getRuleName(), ///
180
+ constructorRuleName = constructorNonTerminalNode.getRuleName(); ///
183
181
 
184
182
  if (ruleName === constructorRuleName) {
185
183
  switch (ruleName) {
@@ -196,9 +194,11 @@ function verifyNonTerminalNode(nonTerminalNode, constructorNonTerminalNode, cont
196
194
  default: {
197
195
  const childNodes = nonTerminalNode.getChildNodes(),
198
196
  constructorChildNodes = constructorNonTerminalNode.getChildNodes(),
199
- childNodesVerified = verifyChildNodes(childNodes, constructorChildNodes, context);
197
+ nodes = childNodes, ///
198
+ constructorNodes = constructorChildNodes, ///
199
+ nodesVerified = verifyNodes(nodes, constructorNodes, context);
200
200
 
201
- nonTerminalNodeVerified = childNodesVerified; ///
201
+ nonTerminalNodeVerified = nodesVerified; ///
202
202
 
203
203
  break;
204
204
  }