occam-verify-cli 1.0.768 → 1.0.776

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/context/file/nominal.js +11 -11
  2. package/lib/context/illative.js +28 -0
  3. package/lib/context/nested.js +27 -0
  4. package/lib/context/proof.js +232 -0
  5. package/lib/context/thetic.js +28 -0
  6. package/lib/context.js +15 -21
  7. package/lib/element/assertion/contained.js +24 -22
  8. package/lib/element/assertion/defined.js +20 -19
  9. package/lib/element/assertion/property.js +14 -13
  10. package/lib/element/assertion/satisfies.js +8 -9
  11. package/lib/element/assertion/subproof.js +23 -26
  12. package/lib/element/assertion/type.js +9 -11
  13. package/lib/element/assumption.js +32 -39
  14. package/lib/element/combinator/bracketed.js +3 -3
  15. package/lib/element/combinator.js +20 -20
  16. package/lib/element/conclusion.js +33 -29
  17. package/lib/element/constructor.js +19 -18
  18. package/lib/element/deduction.js +33 -29
  19. package/lib/element/equality.js +13 -15
  20. package/lib/element/equivalence.js +59 -52
  21. package/lib/element/frame.js +41 -34
  22. package/lib/element/hypothesis.js +7 -5
  23. package/lib/element/judgement.js +32 -73
  24. package/lib/element/label.js +22 -22
  25. package/lib/element/metavariable.js +23 -7
  26. package/lib/element/proofAssertion/premise.js +48 -35
  27. package/lib/element/proofAssertion/step.js +35 -20
  28. package/lib/element/proofAssertion/supposition.js +48 -34
  29. package/lib/element/proofAssertion.js +1 -14
  30. package/lib/element/reference.js +80 -53
  31. package/lib/element/signature.js +44 -3
  32. package/lib/element/statement.js +28 -29
  33. package/lib/element/subproof.js +2 -2
  34. package/lib/element/substitution/frame.js +24 -19
  35. package/lib/element/substitution/metaLevel.js +31 -27
  36. package/lib/element/substitution/reference.js +11 -10
  37. package/lib/element/substitution/statement.js +30 -23
  38. package/lib/element/substitution/term.js +11 -10
  39. package/lib/element/term.js +24 -20
  40. package/lib/element/topLevelMetaAssertion.js +2 -2
  41. package/lib/element/variable.js +6 -2
  42. package/lib/process/assign.js +10 -4
  43. package/lib/process/unify.js +8 -8
  44. package/lib/process/validate.js +10 -8
  45. package/lib/utilities/context.js +68 -23
  46. package/lib/utilities/element.js +55 -27
  47. package/lib/utilities/json.js +8 -8
  48. package/lib/utilities/statement.js +1 -8
  49. package/lib/utilities/string.js +12 -1
  50. package/lib/utilities/unification.js +9 -7
  51. package/lib/utilities/validation.js +39 -31
  52. package/package.json +1 -1
  53. package/src/context/file/nominal.js +14 -16
  54. package/src/context/illative.js +17 -0
  55. package/src/context/nested.js +15 -0
  56. package/src/context/{scoped.js → proof.js} +73 -73
  57. package/src/context/thetic.js +17 -0
  58. package/src/context.js +23 -36
  59. package/src/element/assertion/contained.js +28 -28
  60. package/src/element/assertion/defined.js +23 -23
  61. package/src/element/assertion/property.js +15 -14
  62. package/src/element/assertion/satisfies.js +7 -9
  63. package/src/element/assertion/subproof.js +26 -31
  64. package/src/element/assertion/type.js +10 -12
  65. package/src/element/assumption.js +33 -54
  66. package/src/element/combinator/bracketed.js +2 -2
  67. package/src/element/combinator.js +23 -29
  68. package/src/element/conclusion.js +37 -40
  69. package/src/element/constructor.js +29 -34
  70. package/src/element/deduction.js +36 -39
  71. package/src/element/equality.js +16 -18
  72. package/src/element/equivalence.js +76 -67
  73. package/src/element/frame.js +42 -34
  74. package/src/element/hypothesis.js +7 -6
  75. package/src/element/judgement.js +34 -44
  76. package/src/element/label.js +25 -31
  77. package/src/element/metavariable.js +32 -12
  78. package/src/element/proofAssertion/premise.js +63 -49
  79. package/src/element/proofAssertion/step.js +43 -23
  80. package/src/element/proofAssertion/supposition.js +64 -50
  81. package/src/element/proofAssertion.js +0 -22
  82. package/src/element/reference.js +119 -80
  83. package/src/element/signature.js +5 -2
  84. package/src/element/statement.js +30 -35
  85. package/src/element/subproof.js +1 -1
  86. package/src/element/substitution/frame.js +27 -26
  87. package/src/element/substitution/metaLevel.js +38 -42
  88. package/src/element/substitution/reference.js +13 -14
  89. package/src/element/substitution/statement.js +35 -33
  90. package/src/element/substitution/term.js +13 -14
  91. package/src/element/term.js +42 -34
  92. package/src/element/topLevelMetaAssertion.js +1 -1
  93. package/src/element/variable.js +8 -1
  94. package/src/process/assign.js +9 -3
  95. package/src/process/unify.js +7 -7
  96. package/src/process/validate.js +9 -8
  97. package/src/utilities/context.js +82 -31
  98. package/src/utilities/element.js +68 -31
  99. package/src/utilities/json.js +13 -13
  100. package/src/utilities/statement.js +1 -9
  101. package/src/utilities/string.js +16 -2
  102. package/src/utilities/unification.js +10 -9
  103. package/src/utilities/validation.js +50 -38
  104. package/lib/context/scoped.js +0 -232
  105. package/lib/utilities/term.js +0 -17
  106. package/src/utilities/term.js +0 -10
@@ -3,11 +3,10 @@
3
3
  import { Element } from "occam-languages";
4
4
 
5
5
  import { define } from "../elements";
6
- import { attempt, instantiate } from "../utilities/context";
7
6
  import { instantiateConclusion } from "../process/instantiate";
8
- import { ephemeralContextFromJSON, ephemeralContextToEphemeralContextJSON } from "../utilities/json";
7
+ import { declare, attempt, descend, serialise, unserialise, instantiate } from "../utilities/context";
9
8
 
10
- export default define(class Conclusion extends Element {
9
+ export default define(class Conclusion extends Element {
11
10
  constructor(context, string, node, statement) {
12
11
  super(context, string, node);
13
12
 
@@ -58,14 +57,16 @@ export default define(class Conclusion extends Element {
58
57
 
59
58
  context.trace(`Validating the '${conclusionString}' conclusion...`);
60
59
 
61
- attempt((context) => {
62
- const statementValidates = this.validateStatement(context);
60
+ declare((context) => {
61
+ attempt((context) => {
62
+ const statementValidates = this.validateStatement(context);
63
63
 
64
- if (statementValidates) {
65
- context.commit(this);
64
+ if (statementValidates) {
65
+ context.commit(this);
66
66
 
67
- validates = true;
68
- }
67
+ validates = true;
68
+ }
69
+ }, context);
69
70
  }, context);
70
71
 
71
72
  if (validates) {
@@ -76,19 +77,20 @@ export default define(class Conclusion extends Element {
76
77
  }
77
78
 
78
79
  validateStatement(context) {
79
- let statementValidates;
80
+ let statementValidates = false;
80
81
 
81
82
  const statementString = this.statement.getString(),
82
83
  conclusionString = this.getString(); ///
83
84
 
84
85
  context.trace(`Validating the '${conclusionString}' conclusion's '${statementString}' statement...`);
85
86
 
86
- const stated = true,
87
- statement = this.statement.validate(stated, context);
87
+ descend((context) => {
88
+ const statement = this.statement.validate(context);
88
89
 
89
- if (statement !== null) {
90
- statementValidates = true;
91
- }
90
+ if (statement !== null) {
91
+ statementValidates = true;
92
+ }
93
+ }, context);
92
94
 
93
95
  if (statementValidates) {
94
96
  context.trace(`...validated the '${conclusionString}' conclusion's '${statementString}' statement.`);
@@ -123,41 +125,36 @@ export default define(class Conclusion extends Element {
123
125
  }
124
126
 
125
127
  toJSON() {
126
- let context;
127
-
128
- context = this.getContext();
129
-
130
- const ephemeralContext = context, ///
131
- ephemeralContextJSON = ephemeralContextToEphemeralContextJSON(ephemeralContext),
132
- contextJSON = ephemeralContextJSON; ///
133
-
134
- context = contextJSON; ///
128
+ const context = this.getContext();
135
129
 
136
- const string = this.getString(),
137
- json = {
138
- context,
139
- string
140
- };
130
+ return serialise((context) => {
131
+ const string = this.getString(),
132
+ json = {
133
+ context,
134
+ string
135
+ };
141
136
 
142
- return json;
137
+ return json;
138
+ }, context);
143
139
  }
144
140
 
145
141
  static name = "Conclusion";
146
142
 
147
143
  static fromJSON(json, context) {
148
- const ephemeralContext = ephemeralContextFromJSON(json, context);
144
+ let conclusion;
149
145
 
150
- context = ephemeralContext; ///
146
+ unserialise((json, context) => {
147
+ instantiate((context) => {
148
+ const { string } = json,
149
+ conclusionNode = instantiateConclusion(string, context),
150
+ node = conclusionNode, ///
151
+ statement = statementFromConclusionNode(conclusionNode, context);
151
152
 
152
- return instantiate((context) => {
153
- const { string } = json,
154
- conclusionNode = instantiateConclusion(string, context),
155
- node = conclusionNode, ///
156
- statement = statementFromConclusionNode(conclusionNode, context),
157
- conclusion = new Conclusion(context, string, node, statement);
153
+ conclusion = new Conclusion(context, string, node, statement);
154
+ }, context);
155
+ }, json, context);
158
156
 
159
- return conclusion;
160
- }, context);
157
+ return conclusion;
161
158
  }
162
159
  });
163
160
 
@@ -3,12 +3,12 @@
3
3
  import { Element } from "occam-languages";
4
4
 
5
5
  import { define } from "../elements";
6
- import { attempt, instantiate } from "../utilities/context";
7
6
  import { instantiateConstructor } from "../process/instantiate";
8
7
  import { termFromConstructorNode } from "../utilities/element";
9
8
  import { unifyTermWithConstructor } from "../process/unify";
10
9
  import { validateTermAsConstructor } from "../process/validate";
11
- import { typeFromJSON, typeToTypeJSON, ephemeralContextFromJSON, ephemeralContextToEphemeralContextJSON } from "../utilities/json";
10
+ import { typeFromJSON, typeToTypeJSON } from "../utilities/json";
11
+ import { attempt, serialise, unserialise, instantiate } from "../utilities/context";
12
12
 
13
13
  export default define(class Constructor extends Element {
14
14
  constructor(context, string, node, term, type) {
@@ -143,45 +143,40 @@ export default define(class Constructor extends Element {
143
143
  }
144
144
 
145
145
  toJSON() {
146
- let context;
147
-
148
- context = this.getContext();
149
-
150
- const ephemeralContext = context, ///
151
- ephemeralContextJSON = ephemeralContextToEphemeralContextJSON(ephemeralContext),
152
- contextJSON = ephemeralContextJSON; ///
153
-
154
- context = contextJSON; ///
155
-
156
- const includeType = false,
157
- typeJSON = typeToTypeJSON(this.type),
158
- string = this.getString(includeType),
159
- type = typeJSON, ///
160
- json = {
161
- context,
162
- string,
163
- type
164
- };
165
-
166
- return json;
146
+ const context = this.getContext();
147
+
148
+ return serialise((context) => {
149
+ const includeType = false,
150
+ typeJSON = typeToTypeJSON(this.type),
151
+ string = this.getString(includeType),
152
+ type = typeJSON, ///
153
+ json = {
154
+ context,
155
+ string,
156
+ type
157
+ };
158
+
159
+ return json;
160
+ }, context);
167
161
  }
168
162
 
169
163
  static name = "Constructor";
170
164
 
171
165
  static fromJSON(json, context) {
172
- const ephemeralContext = ephemeralContextFromJSON(json, context);
166
+ let constructor;
173
167
 
174
- context = ephemeralContext; ///
168
+ unserialise((json, context) => {
169
+ instantiate((context) => {
170
+ const { string } = json,
171
+ constructorNode = instantiateConstructor(string, context),
172
+ node = constructorNode, ///
173
+ term = termFromConstructorNode(constructorNode, context),
174
+ type = typeFromJSON(json, context);
175
175
 
176
- return instantiate((context) => {
177
- const { string } = json,
178
- constructorNode = instantiateConstructor(string, context),
179
- node = constructorNode, ///
180
- term = termFromConstructorNode(constructorNode, context),
181
- type = typeFromJSON(json, context),
182
- constructor = new Constructor(context, string, node, term, type);
176
+ constructor = new Constructor(context, string, node, term, type);
177
+ }, context);
178
+ }, json, context);
183
179
 
184
- return constructor;
185
- }, context);
180
+ return constructor;
186
181
  }
187
182
  });
@@ -3,9 +3,8 @@
3
3
  import { Element } from "occam-languages";
4
4
 
5
5
  import { define } from "../elements";
6
- import { attempt, instantiate } from "../utilities/context";
7
6
  import { instantiateDeduction } from "../process/instantiate";
8
- import { ephemeralContextFromJSON, ephemeralContextToEphemeralContextJSON } from "../utilities/json";
7
+ import { declare, attempt, descend, serialise, unserialise, instantiate } from "../utilities/context";
9
8
 
10
9
  export default define(class Deduction extends Element {
11
10
  constructor(context, string, node, statement) {
@@ -58,14 +57,16 @@ export default define(class Deduction extends Element {
58
57
 
59
58
  context.trace(`Validating the '${deductionString}' deduction...`);
60
59
 
61
- attempt((context) => {
62
- const statementValidates = this.validateStatement(context);
60
+ declare((context) => {
61
+ attempt((context) => {
62
+ const statementValidates = this.validateStatement(context);
63
63
 
64
- if (statementValidates) {
65
- context.commit(this);
64
+ if (statementValidates) {
65
+ context.commit(this);
66
66
 
67
- validates = true;
68
- }
67
+ validates = true;
68
+ }
69
+ }, context);
69
70
  }, context);
70
71
 
71
72
  if (validates) {
@@ -76,19 +77,20 @@ export default define(class Deduction extends Element {
76
77
  }
77
78
 
78
79
  validateStatement(context) {
79
- let statementValidates;
80
+ let statementValidates = false;
80
81
 
81
82
  const statementString = this.statement.getString(),
82
83
  deductionnString = this.getString(); ///
83
84
 
84
85
  context.trace(`Validating the '${deductionnString}' deductionn's '${statementString}' statement...`);
85
86
 
86
- const stated = true,
87
- statement = this.statement.validate(stated, context);
87
+ descend((context) => {
88
+ const statement = this.statement.validate(context);
88
89
 
89
- if (statement !== null) {
90
- statementValidates = true;
91
- }
90
+ if (statement !== null) {
91
+ statementValidates = true;
92
+ }
93
+ }, context);
92
94
 
93
95
  if (statementValidates) {
94
96
  context.trace(`...validated the '${deductionnString}' deductionn's '${statementString}' statement.`);
@@ -148,41 +150,36 @@ export default define(class Deduction extends Element {
148
150
  }
149
151
 
150
152
  toJSON() {
151
- let context;
152
-
153
- context = this.getContext();
154
-
155
- const ephemeralContext = context, ///
156
- ephemeralContextJSON = ephemeralContextToEphemeralContextJSON(ephemeralContext),
157
- contextJSON = ephemeralContextJSON; ///
158
-
159
- context = contextJSON; ///
153
+ const context = this.getContext();
160
154
 
161
- const string = this.getString(),
162
- json = {
163
- context,
164
- string
165
- };
155
+ return serialise((context) => {
156
+ const string = this.getString(),
157
+ json = {
158
+ context,
159
+ string
160
+ };
166
161
 
167
- return json;
162
+ return json;
163
+ }, context);
168
164
  }
169
165
 
170
166
  static name = "Deduction";
171
167
 
172
168
  static fromJSON(json, context) {
173
- const ephemeralContext = ephemeralContextFromJSON(json, context);
169
+ let deduction;
174
170
 
175
- context = ephemeralContext; ///
171
+ unserialise((json, context) => {
172
+ instantiate((context) => {
173
+ const { string } = json,
174
+ deductionNode = instantiateDeduction(string, context),
175
+ node = deductionNode, ///
176
+ statement = statementFromDeductionNode(deductionNode, context);
176
177
 
177
- return instantiate((context) => {
178
- const { string } = json,
179
- deductionNode = instantiateDeduction(string, context),
180
- node = deductionNode, ///
181
- statement = statementFromDeductionNode(deductionNode, context),
182
- deduction = new Deduction(context, string, node, statement);
178
+ deduction = new Deduction(context, string, node, statement);
179
+ }, context);
180
+ }, json, context);
183
181
 
184
- return deduction;
185
- }, context);
182
+ return deduction;
186
183
  }
187
184
  });
188
185
 
@@ -6,6 +6,7 @@ import { define } from "../elements";
6
6
  import { instantiate } from "../utilities/context";
7
7
  import { equateTerms } from "../process/equate";
8
8
  import { instantiateEquality } from "../process/instantiate";
9
+ import { equalityFromStatementNode } from "../utilities/element";
9
10
  import { equalityAssignmentFromEquality, leftVariableAssignmentFromEquality, rightVariableAssignmentFromEquality } from "../process/assign";
10
11
 
11
12
  export default define(class Equality extends Element {
@@ -115,7 +116,7 @@ export default define(class Equality extends Element {
115
116
  return validEquality;
116
117
  }
117
118
 
118
- validate(stated, context) {
119
+ validate(context) {
119
120
  let equality = null;
120
121
 
121
122
  const equalityString = this.getString(); ///
@@ -134,6 +135,8 @@ export default define(class Equality extends Element {
134
135
  const termsValidate = this.validateTerms(context);
135
136
 
136
137
  if (termsValidate) {
138
+ const stated = context.isStated();
139
+
137
140
  let validatesWhenStated = false,
138
141
  validatesWhenDerived = false;
139
142
 
@@ -151,7 +154,7 @@ export default define(class Equality extends Element {
151
154
  if (validates) {
152
155
  equality = this; ///
153
156
 
154
- this.assign(stated, context);
157
+ this.assign(context);
155
158
 
156
159
  context.addEquality(equality);
157
160
 
@@ -243,29 +246,17 @@ export default define(class Equality extends Element {
243
246
  return validatesWhenDerived;
244
247
  }
245
248
 
246
- assign(stated, context) {
249
+ assign(context) {
247
250
  const equality = this, ///
248
251
  equalityAssignment = equalityAssignmentFromEquality(equality, context),
249
252
  leftVariableAssignment = leftVariableAssignmentFromEquality(equality, context),
250
253
  rightVariableAssignment = rightVariableAssignmentFromEquality(equality, context);
251
254
 
252
- let assignment;
253
-
254
- assignment = equalityAssignment; ///
255
-
256
- context.addAssignment(assignment);
257
-
258
- if (leftVariableAssignment !== null) {
259
- assignment = leftVariableAssignment; ///
260
-
261
- context.addAssignment(assignment);
262
- }
255
+ context.addAssignment(equalityAssignment);
263
256
 
264
- if (rightVariableAssignment !== null) {
265
- assignment = rightVariableAssignment; ///
257
+ context.addAssignment(leftVariableAssignment);
266
258
 
267
- context.addAssignment(assignment);
268
- }
259
+ context.addAssignment(rightVariableAssignment);
269
260
  }
270
261
 
271
262
  static name = "Equality";
@@ -294,6 +285,13 @@ export default define(class Equality extends Element {
294
285
  return equality;
295
286
  }, context);
296
287
  }
288
+
289
+ static fromStatement(statement, context) {
290
+ const statementNode = statement.getNode(),
291
+ equality = equalityFromStatementNode(statementNode, context);
292
+
293
+ return equality;
294
+ }
297
295
  });
298
296
 
299
297
  function leftTermFromEqualityNode(equalityNode, context) {
@@ -4,25 +4,38 @@ import { Element } from "occam-languages";
4
4
  import { arrayUtilities } from "necessary";
5
5
 
6
6
  import { define } from "../elements";
7
+ import { instantiate } from "../utilities/context";
7
8
  import { instantiateEquivalence } from "../process/instantiate";
8
9
  import { stripBracketsFromTermNode } from "../utilities/brackets";
9
10
  import { equivalenceStringFromTerms } from "../utilities/string";
10
11
  import { equivalenceFromEquivalenceNode } from "../utilities/element";
11
- import { instantiate, sanitisedContextFromContext } from "../utilities/context";
12
12
 
13
13
  const { compress } = arrayUtilities;
14
14
 
15
15
  export default define(class Equivalence extends Element {
16
- constructor(context, string, node, terms) {
16
+ constructor(context, string, node, type, terms) {
17
17
  super(context, string, node);
18
18
 
19
+ this.type = type;
19
20
  this.terms = terms;
20
21
  }
21
22
 
23
+ getType() {
24
+ return this.type;
25
+ }
26
+
22
27
  getTerms() {
23
28
  return this.terms;
24
29
  }
25
30
 
31
+ setType(type) {
32
+ this.type = type;
33
+ }
34
+
35
+ setTerms(terms) {
36
+ this.terms = terms;
37
+ }
38
+
26
39
  getEquivalenceNode() {
27
40
  const node = this.getNode(),
28
41
  equivalenceNode = node; ///
@@ -30,26 +43,6 @@ export default define(class Equivalence extends Element {
30
43
  return equivalenceNode;
31
44
  }
32
45
 
33
- getType() {
34
- const type = this.terms.reduce((type, term) => {
35
- const termType = term.getType();
36
-
37
- if (type === null) {
38
- type = termType; ///
39
- } else {
40
- const termTypeSubTypeOfType = termType.isSubTypeOf(type);
41
-
42
- if (termTypeSubTypeOfType) {
43
- type = termType; ///
44
- }
45
- }
46
-
47
- return type;
48
- }, null);
49
-
50
- return type;
51
- }
52
-
53
46
  getGroundedTerms(definedVariables, groundedTerms, context) {
54
47
  this.terms.forEach((term) => {
55
48
  const termGrounded = term.isGrounded(definedVariables, context);
@@ -133,20 +126,6 @@ export default define(class Equivalence extends Element {
133
126
  return implicitlyGrounded;
134
127
  }
135
128
 
136
- compareTerm(term) {
137
- const termA = term, ///
138
- comparesToTerm = this.someTerm((term) => {
139
- const termB = term, ///
140
- termAEqualToTermB = termA.isEqualTo(termB);
141
-
142
- if (termAEqualToTermB) {
143
- return true;
144
- }
145
- });
146
-
147
- return comparesToTerm;
148
- }
149
-
150
129
  matchTermNode(termNode) {
151
130
  termNode = stripBracketsFromTermNode(termNode); ///
152
131
 
@@ -173,36 +152,31 @@ export default define(class Equivalence extends Element {
173
152
  return termNodesMatch;
174
153
  }
175
154
 
176
- matchVariableNode(variableNode) {
177
- const variableNodeA = variableNode, ///
178
- variableNodeMatches = this.someTerm((term) => {
179
- const termNode = term.getNode(),
180
- singularVariableNode = termNode.getSingularVariableNode();
155
+ someTerm(callback) { return this.terms.some(callback); }
181
156
 
182
- if (singularVariableNode !== null) {
183
- const variableNodeB = singularVariableNode, ///
184
- variableNodeAMatchesVariableNodeB = variableNodeA.match(variableNodeB);
157
+ everyTerm(callback) { return this.terms.every(callback); }
158
+
159
+ compareTerm(term) {
160
+ const termA = term, ///
161
+ comparesToTerm = this.someTerm((term) => {
162
+ const termB = term, ///
163
+ termAComparesToTermB = termA.compareTerm(termB);
185
164
 
186
- if (variableNodeAMatchesVariableNodeB) {
187
- return true;
188
- }
165
+ if (termAComparesToTermB) {
166
+ return true;
189
167
  }
190
168
  });
191
169
 
192
- return variableNodeMatches;
170
+ return comparesToTerm;
193
171
  }
194
172
 
195
- someTerm(callback) { return this.terms.some(callback); }
196
-
197
- everyTerm(callback) { return this.terms.every(callback); }
198
-
199
173
  someOtherTerm(term, callback) {
200
174
  const termA = term, ///
201
175
  terms = this.terms.filter((term) => {
202
176
  const termB = term, ///
203
- termAEqualToTermB = termA.isEqualTo(termB);
177
+ termAComparesToTermB = termA.compareTerm(termB);
204
178
 
205
- if (!termAEqualToTermB) {
179
+ if (!termAComparesToTermB) {
206
180
  return true;
207
181
  }
208
182
  }),
@@ -218,9 +192,9 @@ export default define(class Equivalence extends Element {
218
192
  ];
219
193
 
220
194
  compress(combinedTerms, (combinedTermA, combinedTermB) => {
221
- const combinedTermAEqualToCombinedTermB = combinedTermA.isEqualTo(combinedTermB);
195
+ const combinedTermAComparesToCombinedTermB = combinedTermA.compareTerm(combinedTermB);
222
196
 
223
- if (!combinedTermAEqualToCombinedTermB) {
197
+ if (!combinedTermAComparesToCombinedTermB) {
224
198
  return true;
225
199
  }
226
200
  });
@@ -229,35 +203,70 @@ export default define(class Equivalence extends Element {
229
203
  }
230
204
 
231
205
  mergedWith(equivalence, context) {
232
- const terms = equivalence.getTerms(),
206
+ let type;
207
+
208
+ type = equivalence.getType();
209
+
210
+ const types = [
211
+ this.type,
212
+ type
213
+ ],
214
+ terms = equivalence.getTerms(),
215
+ combinedType = combinedTypeFromTypes(types),
233
216
  combinedTerms = this.combineTerms(terms);
234
217
 
235
- return instantiate((context) => {
218
+ type = combinedType; ///
219
+
220
+ instantiate((context) => {
236
221
  const terms = combinedTerms, ///
237
222
  equivalenceString = equivalenceStringFromTerms(terms),
238
223
  string = equivalenceString, ///
239
- equivalenceNode = instantiateEquivalence(string, context),
240
- equivalence = equivalenceFromEquivalenceNode(equivalenceNode, context);
224
+ equivalenceNode = instantiateEquivalence(string, context);
241
225
 
242
- return equivalence;
226
+ equivalence = equivalenceFromEquivalenceNode(equivalenceNode, context);
243
227
  }, context);
228
+
229
+ equivalence.setType(type);
230
+
231
+ return equivalence;
244
232
  }
245
233
 
246
234
  static name = "Equivalence";
247
235
 
248
236
  static fromEquality(equality, context) {
249
- const santisedContext = sanitisedContextFromContext(context);
237
+ let equivalence;
250
238
 
251
- context = santisedContext; ///
239
+ const type = equality.getType();
252
240
 
253
- return instantiate((context) => {
241
+ instantiate((context) => {
254
242
  const terms = equality.getTerms(),
255
243
  equivalenceString = equivalenceStringFromTerms(terms),
256
244
  string = equivalenceString, ///
257
- equivalenceNode = instantiateEquivalence(string, context),
258
- equivalence = equivalenceFromEquivalenceNode(equivalenceNode, context);
245
+ equivalenceNode = instantiateEquivalence(string, context);
259
246
 
260
- return equivalence;
247
+ equivalence = equivalenceFromEquivalenceNode(equivalenceNode, context);
261
248
  }, context);
249
+
250
+ equivalence.setType(type);
251
+
252
+ return equivalence;
262
253
  }
263
254
  });
255
+
256
+ function combinedTypeFromTypes(types) {
257
+ const combinedType = types.reduce((combinedType, type) => {
258
+ if (combinedType === null) {
259
+ combinedType = type; ///
260
+ } else {
261
+ const typeSubTypeOfCombinedType = type.isSubTypeOf(combinedType);
262
+
263
+ if (typeSubTypeOfCombinedType) {
264
+ combinedType = type; ///
265
+ }
266
+ }
267
+
268
+ return combinedType;
269
+ }, null);
270
+
271
+ return combinedType;
272
+ }