occam-verify-cli 0.0.475 → 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
  }
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
  }