occam-verify-cli 1.0.800 → 1.0.806
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/lib/context/branching.js +2 -2
- package/lib/context/ephemeral.js +186 -69
- package/lib/context/file/nominal.js +87 -52
- package/lib/context/liminal.js +2 -2
- package/lib/context/proof.js +55 -55
- package/lib/context/synthetic.js +151 -74
- package/lib/context.js +57 -17
- package/lib/element/assertion/defined.js +3 -3
- package/lib/element/assumption/metaLevel.js +6 -4
- package/lib/element/combinator.js +4 -2
- package/lib/element/conclusion.js +4 -2
- package/lib/element/constructor.js +4 -2
- package/lib/element/declaration/metavariable.js +10 -9
- package/lib/element/declaration/variable.js +7 -7
- package/lib/element/deduction.js +4 -2
- package/lib/element/label.js +9 -5
- package/lib/element/metavariable.js +34 -34
- package/lib/element/proofAssertion/premise.js +4 -3
- package/lib/element/proofAssertion/step.js +4 -2
- package/lib/element/reference.js +6 -4
- package/lib/element/statement.js +9 -1
- package/lib/element/substitution/frame.js +43 -29
- package/lib/element/substitution/reference.js +38 -28
- package/lib/element/substitution/statement.js +46 -38
- package/lib/element/substitution/term.js +49 -35
- package/lib/element/variable.js +6 -7
- package/lib/preamble.js +1 -2
- package/lib/process/assign.js +11 -10
- package/lib/process/equate.js +3 -2
- package/lib/process/unify.js +7 -7
- package/lib/utilities/context.js +13 -5
- package/lib/utilities/element.js +1 -1
- package/lib/utilities/equivalences.js +131 -0
- package/lib/utilities/json.js +59 -1
- package/lib/utilities/validation.js +4 -3
- package/package.json +2 -2
- package/src/context/branching.js +2 -2
- package/src/context/ephemeral.js +421 -237
- package/src/context/file/nominal.js +127 -77
- package/src/context/liminal.js +2 -2
- package/src/context/proof.js +81 -82
- package/src/context/synthetic.js +198 -88
- package/src/context.js +81 -20
- package/src/element/assertion/defined.js +4 -4
- package/src/element/assumption/metaLevel.js +8 -6
- package/src/element/combinator.js +4 -2
- package/src/element/conclusion.js +4 -2
- package/src/element/constructor.js +4 -2
- package/src/element/declaration/metavariable.js +10 -8
- package/src/element/declaration/variable.js +8 -7
- package/src/element/deduction.js +4 -2
- package/src/element/label.js +11 -7
- package/src/element/metavariable.js +11 -11
- package/src/element/proofAssertion/premise.js +4 -4
- package/src/element/proofAssertion/step.js +4 -2
- package/src/element/reference.js +7 -5
- package/src/element/statement.js +14 -0
- package/src/element/substitution/frame.js +47 -32
- package/src/element/substitution/reference.js +44 -34
- package/src/element/substitution/statement.js +63 -54
- package/src/element/substitution/term.js +53 -38
- package/src/element/variable.js +6 -7
- package/src/preamble.js +0 -1
- package/src/process/assign.js +17 -14
- package/src/process/equate.js +3 -1
- package/src/process/unify.js +10 -13
- package/src/utilities/context.js +13 -6
- package/src/utilities/element.js +1 -0
- package/src/utilities/equivalences.js +158 -0
- package/src/utilities/json.js +66 -0
- package/src/utilities/validation.js +6 -5
- package/lib/element/equivalences.js +0 -173
- package/src/element/equivalences.js +0 -237
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "default", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return _default;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _occamlanguages = require("occam-languages");
|
|
12
|
-
const _necessary = require("necessary");
|
|
13
|
-
const _elements = require("../elements");
|
|
14
|
-
const _constants = require("../constants");
|
|
15
|
-
const _equivalence = require("../utilities/equivalence");
|
|
16
|
-
const { push, separate } = _necessary.arrayUtilities;
|
|
17
|
-
const _default = (0, _elements.define)(class Equivalences extends _occamlanguages.Element {
|
|
18
|
-
constructor(context, string, node, array){
|
|
19
|
-
super(context, string, node);
|
|
20
|
-
this.array = array;
|
|
21
|
-
}
|
|
22
|
-
getArray() {
|
|
23
|
-
return this.array;
|
|
24
|
-
}
|
|
25
|
-
getEquivalencesNode() {
|
|
26
|
-
const node = this.getNode(), equivalencesNode = node; ///
|
|
27
|
-
return equivalencesNode;
|
|
28
|
-
}
|
|
29
|
-
getLength() {
|
|
30
|
-
return this.array.length;
|
|
31
|
-
}
|
|
32
|
-
getTypes() {
|
|
33
|
-
const types = this.array.map((equivalence)=>{
|
|
34
|
-
const type = equivalence.getType();
|
|
35
|
-
return type;
|
|
36
|
-
});
|
|
37
|
-
return types;
|
|
38
|
-
}
|
|
39
|
-
addEquivalence(equivalence) {
|
|
40
|
-
this.array.push(equivalence);
|
|
41
|
-
}
|
|
42
|
-
addEquivalences(equivalences) {
|
|
43
|
-
const array = equivalences.getArray();
|
|
44
|
-
push(this.array, array);
|
|
45
|
-
}
|
|
46
|
-
someEquivalence(callback) {
|
|
47
|
-
return this.array.some(callback);
|
|
48
|
-
}
|
|
49
|
-
everyEquivalence(callback) {
|
|
50
|
-
return this.array.every(callback);
|
|
51
|
-
}
|
|
52
|
-
forEachEquivalence(callback) {
|
|
53
|
-
this.array.forEach(callback);
|
|
54
|
-
}
|
|
55
|
-
findEquivalenceByTerm(term) {
|
|
56
|
-
const equivalence = this.array.find((equivalence)=>{
|
|
57
|
-
const equivalenceComparesToTerm = equivalence.compareTerm(term);
|
|
58
|
-
if (equivalenceComparesToTerm) {
|
|
59
|
-
return true;
|
|
60
|
-
}
|
|
61
|
-
}) || null;
|
|
62
|
-
return equivalence;
|
|
63
|
-
}
|
|
64
|
-
findEquivalenceByTermNodes(termNodes) {
|
|
65
|
-
const equivalence = this.array.find((equivalence)=>{
|
|
66
|
-
const termNodeMatches = equivalence.matchTermNodes(termNodes);
|
|
67
|
-
if (termNodeMatches) {
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
}) || null;
|
|
71
|
-
return equivalence;
|
|
72
|
-
}
|
|
73
|
-
mergedWith(equivalences, context) {
|
|
74
|
-
let mergedEquivalences = this.clone(context); ///
|
|
75
|
-
equivalences.forEachEquivalence((equivalence)=>{
|
|
76
|
-
mergedEquivalences = mergedEquivalences.mergedWithEquivalence(equivalence, context);
|
|
77
|
-
});
|
|
78
|
-
return mergedEquivalences;
|
|
79
|
-
}
|
|
80
|
-
mergedWithEquivalence(equivalence, context) {
|
|
81
|
-
const equivalences = Equivalences.fromNothing(context);
|
|
82
|
-
let mergedEquivalence = equivalence; ///
|
|
83
|
-
this.forEachEquivalence((equivalence)=>{
|
|
84
|
-
const mergedEquivalenceDisjointFromEquivalence = mergedEquivalence.isDisjointFrom(equivalence);
|
|
85
|
-
if (mergedEquivalenceDisjointFromEquivalence) {
|
|
86
|
-
equivalences.addEquivalence(equivalence);
|
|
87
|
-
} else {
|
|
88
|
-
mergedEquivalence = mergedEquivalence.mergedWith(equivalence, context);
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
equivalence = mergedEquivalence; ///
|
|
92
|
-
equivalences.addEquivalence(equivalence);
|
|
93
|
-
return equivalences;
|
|
94
|
-
}
|
|
95
|
-
separateEquivalences(equivalencesA, equivalencesB, callback) {
|
|
96
|
-
const equivalencesAArray = equivalencesA.getArray(), equivalencesBArray = equivalencesB.getArray();
|
|
97
|
-
separate(this.array, equivalencesAArray, equivalencesBArray, callback);
|
|
98
|
-
}
|
|
99
|
-
separateInitiallyGroundedEquivalences(remainingEquivalences, initiallyGroundedEquivalences, context) {
|
|
100
|
-
this.separateEquivalences(remainingEquivalences, initiallyGroundedEquivalences, (equivalence)=>{
|
|
101
|
-
const equivalenceInitiallyGrounded = equivalence.isInitiallyGrounded(context);
|
|
102
|
-
if (!equivalenceInitiallyGrounded) {
|
|
103
|
-
return true;
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
separateImplicitlyGroundedEquivalences(remainingEquivalences, implicitlyGroundedEquivalences, definedVariables, context) {
|
|
108
|
-
this.separateEquivalences(remainingEquivalences, implicitlyGroundedEquivalences, (equivalence)=>{
|
|
109
|
-
const equivalenceImplicitlyGrounded = equivalence.isImplicitlyGrounded(definedVariables, context);
|
|
110
|
-
if (!equivalenceImplicitlyGrounded) {
|
|
111
|
-
return true;
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
separateGroundedTermsAndDefinedVariables(groundedTerms, definedVariables, context) {
|
|
116
|
-
let equivalences = this, groundedEquivalences, remainingEquivalences, initiallyGroundedEquivalences, implicitlyGroundedEquivalences;
|
|
117
|
-
remainingEquivalences = Equivalences.fromNothing(context);
|
|
118
|
-
initiallyGroundedEquivalences = Equivalences.fromNothing(context);
|
|
119
|
-
equivalences.separateInitiallyGroundedEquivalences(remainingEquivalences, initiallyGroundedEquivalences, context);
|
|
120
|
-
const initiallyGroundedEquivalencesLength = initiallyGroundedEquivalences.getLength();
|
|
121
|
-
if (initiallyGroundedEquivalencesLength > 0) {
|
|
122
|
-
groundedEquivalences = initiallyGroundedEquivalences; ///
|
|
123
|
-
let implicitlyGroundedEquivalencesLength = 1;
|
|
124
|
-
while(implicitlyGroundedEquivalencesLength > 0){
|
|
125
|
-
let definedVariablesLength = 0, previousDefinedVariablesLength = -1;
|
|
126
|
-
while(definedVariablesLength > previousDefinedVariablesLength){
|
|
127
|
-
previousDefinedVariablesLength = definedVariablesLength; ///
|
|
128
|
-
groundedTermsFromGroundedEquivalencesAndDefinedVariables(groundedEquivalences, definedVariables, groundedTerms, context);
|
|
129
|
-
definedVariablesFromGroundedTerms(groundedTerms, definedVariables, context);
|
|
130
|
-
definedVariablesLength = definedVariables.length;
|
|
131
|
-
}
|
|
132
|
-
equivalences = remainingEquivalences; ///
|
|
133
|
-
remainingEquivalences = [];
|
|
134
|
-
implicitlyGroundedEquivalences = [];
|
|
135
|
-
equivalences.separateImplicitlyGroundedEquivalences(remainingEquivalences, implicitlyGroundedEquivalences, definedVariables, context);
|
|
136
|
-
groundedEquivalences.addEquivalences(implicitlyGroundedEquivalences);
|
|
137
|
-
implicitlyGroundedEquivalencesLength = implicitlyGroundedEquivalences.getLength(); ///
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
clone(context) {
|
|
142
|
-
const string = _constants.EMPTY_STRING, node = null, array = [
|
|
143
|
-
...this.array
|
|
144
|
-
], equivalences = new Equivalences(context, string, node, array);
|
|
145
|
-
return equivalences;
|
|
146
|
-
}
|
|
147
|
-
static name = "Equivalences";
|
|
148
|
-
static fromNothing(context) {
|
|
149
|
-
const string = _constants.EMPTY_STRING, node = null, array = [];
|
|
150
|
-
context = null;
|
|
151
|
-
const equivalences = new Equivalences(context, string, node, array);
|
|
152
|
-
return equivalences;
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
function definedVariablesFromGroundedTerms(groundedTerms, definedVariables, context) {
|
|
156
|
-
groundedTerms.forEach((groundedTerm)=>{
|
|
157
|
-
const term = groundedTerm, variables = (0, _equivalence.variablesFromTerm)(term, context);
|
|
158
|
-
variables.forEach((variable)=>{
|
|
159
|
-
const definedVariablesIncludesTermVariable = definedVariables.includes(variable);
|
|
160
|
-
if (!definedVariablesIncludesTermVariable) {
|
|
161
|
-
const definedVariable = variable; ///
|
|
162
|
-
definedVariables.push(definedVariable);
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
function groundedTermsFromGroundedEquivalencesAndDefinedVariables(groundedEquivalences, definedVariables, groundedTerms, context) {
|
|
168
|
-
groundedEquivalences.forEachEquivalence((groundedEquivalence)=>{
|
|
169
|
-
groundedEquivalence.getGroundedTerms(definedVariables, groundedTerms, context);
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L2VxdWl2YWxlbmNlcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gXCJvY2NhbS1sYW5ndWFnZXNcIjtcbmltcG9ydCB7IGFycmF5VXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuXG5pbXBvcnQgeyBkZWZpbmUgfSBmcm9tIFwiLi4vZWxlbWVudHNcIjtcbmltcG9ydCB7IEVNUFRZX1NUUklORyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHZhcmlhYmxlc0Zyb21UZXJtIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9lcXVpdmFsZW5jZVwiO1xuXG5jb25zdCB7IHB1c2gsIHNlcGFyYXRlIH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lKGNsYXNzIEVxdWl2YWxlbmNlcyBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGFycmF5KSB7XG4gICAgc3VwZXIoY29udGV4dCwgc3RyaW5nLCBub2RlKTtcblxuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbiAgfVxuXG4gIGdldEFycmF5KCkge1xuICAgIHJldHVybiB0aGlzLmFycmF5O1xuICB9XG5cbiAgZ2V0RXF1aXZhbGVuY2VzTm9kZSgpIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5nZXROb2RlKCksXG4gICAgICAgICAgZXF1aXZhbGVuY2VzTm9kZSA9IG5vZGU7ICAvLy9cblxuICAgIHJldHVybiBlcXVpdmFsZW5jZXNOb2RlO1xuICB9XG5cbiAgZ2V0TGVuZ3RoKCkgeyByZXR1cm4gdGhpcy5hcnJheS5sZW5ndGg7IH1cblxuICBnZXRUeXBlcygpIHtcbiAgICBjb25zdCB0eXBlcyA9IHRoaXMuYXJyYXkubWFwKChlcXVpdmFsZW5jZSkgPT4ge1xuICAgICAgY29uc3QgdHlwZSA9IGVxdWl2YWxlbmNlLmdldFR5cGUoKTtcblxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHlwZXM7XG4gIH1cblxuICBhZGRFcXVpdmFsZW5jZShlcXVpdmFsZW5jZSkge1xuICAgIHRoaXMuYXJyYXkucHVzaChlcXVpdmFsZW5jZSk7XG4gIH1cblxuICBhZGRFcXVpdmFsZW5jZXMoZXF1aXZhbGVuY2VzKSB7XG4gICAgY29uc3QgYXJyYXkgPSBlcXVpdmFsZW5jZXMuZ2V0QXJyYXkoKTtcblxuICAgIHB1c2godGhpcy5hcnJheSwgYXJyYXkpO1xuICB9XG5cbiAgc29tZUVxdWl2YWxlbmNlKGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLmFycmF5LnNvbWUoY2FsbGJhY2spOyB9XG5cbiAgZXZlcnlFcXVpdmFsZW5jZShjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5hcnJheS5ldmVyeShjYWxsYmFjayk7IH1cblxuICBmb3JFYWNoRXF1aXZhbGVuY2UoY2FsbGJhY2spIHsgdGhpcy5hcnJheS5mb3JFYWNoKGNhbGxiYWNrKTsgfVxuXG4gIGZpbmRFcXVpdmFsZW5jZUJ5VGVybSh0ZXJtKSB7XG4gICAgY29uc3QgZXF1aXZhbGVuY2UgPSB0aGlzLmFycmF5LmZpbmQoKGVxdWl2YWxlbmNlKSA9PiB7XG4gICAgICBjb25zdCBlcXVpdmFsZW5jZUNvbXBhcmVzVG9UZXJtID0gZXF1aXZhbGVuY2UuY29tcGFyZVRlcm0odGVybSk7XG5cbiAgICAgIGlmIChlcXVpdmFsZW5jZUNvbXBhcmVzVG9UZXJtKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pIHx8IG51bGw7XG5cbiAgICByZXR1cm4gZXF1aXZhbGVuY2U7XG4gIH1cblxuICBmaW5kRXF1aXZhbGVuY2VCeVRlcm1Ob2Rlcyh0ZXJtTm9kZXMpIHtcbiAgICBjb25zdCBlcXVpdmFsZW5jZSA9IHRoaXMuYXJyYXkuZmluZCgoZXF1aXZhbGVuY2UpID0+IHtcbiAgICAgIGNvbnN0IHRlcm1Ob2RlTWF0Y2hlcyA9IGVxdWl2YWxlbmNlLm1hdGNoVGVybU5vZGVzKHRlcm1Ob2Rlcyk7XG5cbiAgICAgIGlmICh0ZXJtTm9kZU1hdGNoZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSkgfHwgbnVsbDtcblxuICAgIHJldHVybiBlcXVpdmFsZW5jZTtcbiAgfVxuXG4gIG1lcmdlZFdpdGgoZXF1aXZhbGVuY2VzLCBjb250ZXh0KSB7XG4gICAgbGV0ICBtZXJnZWRFcXVpdmFsZW5jZXMgPSB0aGlzLmNsb25lKGNvbnRleHQpOyAvLy9cblxuICAgIGVxdWl2YWxlbmNlcy5mb3JFYWNoRXF1aXZhbGVuY2UoKGVxdWl2YWxlbmNlKSA9PiB7XG4gICAgICBtZXJnZWRFcXVpdmFsZW5jZXMgPSBtZXJnZWRFcXVpdmFsZW5jZXMubWVyZ2VkV2l0aEVxdWl2YWxlbmNlKGVxdWl2YWxlbmNlLCBjb250ZXh0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtZXJnZWRFcXVpdmFsZW5jZXM7XG4gIH1cblxuICBtZXJnZWRXaXRoRXF1aXZhbGVuY2UoZXF1aXZhbGVuY2UsIGNvbnRleHQpIHtcbiAgICBjb25zdCBlcXVpdmFsZW5jZXMgPSBFcXVpdmFsZW5jZXMuZnJvbU5vdGhpbmcoY29udGV4dCk7XG5cbiAgICBsZXQgbWVyZ2VkRXF1aXZhbGVuY2UgPSBlcXVpdmFsZW5jZTsgLy8vXG5cbiAgICB0aGlzLmZvckVhY2hFcXVpdmFsZW5jZSgoZXF1aXZhbGVuY2UpID0+IHtcbiAgICAgIGNvbnN0IG1lcmdlZEVxdWl2YWxlbmNlRGlzam9pbnRGcm9tRXF1aXZhbGVuY2UgPSBtZXJnZWRFcXVpdmFsZW5jZS5pc0Rpc2pvaW50RnJvbShlcXVpdmFsZW5jZSk7XG5cbiAgICAgIGlmIChtZXJnZWRFcXVpdmFsZW5jZURpc2pvaW50RnJvbUVxdWl2YWxlbmNlKSB7XG4gICAgICAgIGVxdWl2YWxlbmNlcy5hZGRFcXVpdmFsZW5jZShlcXVpdmFsZW5jZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXJnZWRFcXVpdmFsZW5jZSA9IG1lcmdlZEVxdWl2YWxlbmNlLm1lcmdlZFdpdGgoZXF1aXZhbGVuY2UsIGNvbnRleHQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZXF1aXZhbGVuY2UgPSBtZXJnZWRFcXVpdmFsZW5jZTsgIC8vL1xuXG4gICAgZXF1aXZhbGVuY2VzLmFkZEVxdWl2YWxlbmNlKGVxdWl2YWxlbmNlKTtcblxuICAgIHJldHVybiBlcXVpdmFsZW5jZXM7XG4gIH1cblxuICBzZXBhcmF0ZUVxdWl2YWxlbmNlcyhlcXVpdmFsZW5jZXNBLCBlcXVpdmFsZW5jZXNCLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGVxdWl2YWxlbmNlc0FBcnJheSA9IGVxdWl2YWxlbmNlc0EuZ2V0QXJyYXkoKSxcbiAgICAgICAgICBlcXVpdmFsZW5jZXNCQXJyYXkgPSBlcXVpdmFsZW5jZXNCLmdldEFycmF5KCk7XG5cbiAgICBzZXBhcmF0ZSh0aGlzLmFycmF5LCBlcXVpdmFsZW5jZXNBQXJyYXksIGVxdWl2YWxlbmNlc0JBcnJheSwgY2FsbGJhY2spO1xuICB9XG5cbiAgc2VwYXJhdGVJbml0aWFsbHlHcm91bmRlZEVxdWl2YWxlbmNlcyhyZW1haW5pbmdFcXVpdmFsZW5jZXMsIGluaXRpYWxseUdyb3VuZGVkRXF1aXZhbGVuY2VzLCBjb250ZXh0KSB7XG4gICAgdGhpcy5zZXBhcmF0ZUVxdWl2YWxlbmNlcyhyZW1haW5pbmdFcXVpdmFsZW5jZXMsIGluaXRpYWxseUdyb3VuZGVkRXF1aXZhbGVuY2VzLCAoZXF1aXZhbGVuY2UpID0+IHtcbiAgICAgIGNvbnN0IGVxdWl2YWxlbmNlSW5pdGlhbGx5R3JvdW5kZWQgPSBlcXVpdmFsZW5jZS5pc0luaXRpYWxseUdyb3VuZGVkKGNvbnRleHQpO1xuXG4gICAgICBpZiAoIWVxdWl2YWxlbmNlSW5pdGlhbGx5R3JvdW5kZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXBhcmF0ZUltcGxpY2l0bHlHcm91bmRlZEVxdWl2YWxlbmNlcyhyZW1haW5pbmdFcXVpdmFsZW5jZXMsIGltcGxpY2l0bHlHcm91bmRlZEVxdWl2YWxlbmNlcywgZGVmaW5lZFZhcmlhYmxlcywgY29udGV4dCkge1xuICAgIHRoaXMuc2VwYXJhdGVFcXVpdmFsZW5jZXMocmVtYWluaW5nRXF1aXZhbGVuY2VzLCBpbXBsaWNpdGx5R3JvdW5kZWRFcXVpdmFsZW5jZXMsIChlcXVpdmFsZW5jZSkgPT4ge1xuICAgICAgY29uc3QgZXF1aXZhbGVuY2VJbXBsaWNpdGx5R3JvdW5kZWQgPSBlcXVpdmFsZW5jZS5pc0ltcGxpY2l0bHlHcm91bmRlZChkZWZpbmVkVmFyaWFibGVzLCBjb250ZXh0KTtcblxuICAgICAgaWYgKCFlcXVpdmFsZW5jZUltcGxpY2l0bHlHcm91bmRlZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNlcGFyYXRlR3JvdW5kZWRUZXJtc0FuZERlZmluZWRWYXJpYWJsZXMoZ3JvdW5kZWRUZXJtcywgZGVmaW5lZFZhcmlhYmxlcywgY29udGV4dCkge1xuICAgIGxldCBlcXVpdmFsZW5jZXMgPSB0aGlzLCAgLy8vXG4gICAgICAgIGdyb3VuZGVkRXF1aXZhbGVuY2VzLFxuICAgICAgICByZW1haW5pbmdFcXVpdmFsZW5jZXMsXG4gICAgICAgIGluaXRpYWxseUdyb3VuZGVkRXF1aXZhbGVuY2VzLFxuICAgICAgICBpbXBsaWNpdGx5R3JvdW5kZWRFcXVpdmFsZW5jZXM7XG5cbiAgICByZW1haW5pbmdFcXVpdmFsZW5jZXMgPUVxdWl2YWxlbmNlcy5mcm9tTm90aGluZyhjb250ZXh0KTtcblxuICAgIGluaXRpYWxseUdyb3VuZGVkRXF1aXZhbGVuY2VzID0gRXF1aXZhbGVuY2VzLmZyb21Ob3RoaW5nKGNvbnRleHQpO1xuXG4gICAgZXF1aXZhbGVuY2VzLnNlcGFyYXRlSW5pdGlhbGx5R3JvdW5kZWRFcXVpdmFsZW5jZXMocmVtYWluaW5nRXF1aXZhbGVuY2VzLCBpbml0aWFsbHlHcm91bmRlZEVxdWl2YWxlbmNlcywgY29udGV4dCk7XG5cbiAgICBjb25zdCBpbml0aWFsbHlHcm91bmRlZEVxdWl2YWxlbmNlc0xlbmd0aCA9IGluaXRpYWxseUdyb3VuZGVkRXF1aXZhbGVuY2VzLmdldExlbmd0aCgpO1xuXG4gICAgaWYgKGluaXRpYWxseUdyb3VuZGVkRXF1aXZhbGVuY2VzTGVuZ3RoID4gMCkge1xuICAgICAgZ3JvdW5kZWRFcXVpdmFsZW5jZXMgPSBpbml0aWFsbHlHcm91bmRlZEVxdWl2YWxlbmNlczsgLy8vXG5cbiAgICAgIGxldCBpbXBsaWNpdGx5R3JvdW5kZWRFcXVpdmFsZW5jZXNMZW5ndGggPSAxO1xuXG4gICAgICB3aGlsZSAoaW1wbGljaXRseUdyb3VuZGVkRXF1aXZhbGVuY2VzTGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgZGVmaW5lZFZhcmlhYmxlc0xlbmd0aCA9IDAsXG4gICAgICAgICAgICBwcmV2aW91c0RlZmluZWRWYXJpYWJsZXNMZW5ndGggPSAtMTtcblxuICAgICAgICB3aGlsZSAoZGVmaW5lZFZhcmlhYmxlc0xlbmd0aCA+IHByZXZpb3VzRGVmaW5lZFZhcmlhYmxlc0xlbmd0aCkge1xuICAgICAgICAgIHByZXZpb3VzRGVmaW5lZFZhcmlhYmxlc0xlbmd0aCA9IGRlZmluZWRWYXJpYWJsZXNMZW5ndGg7ICAvLy9cblxuICAgICAgICAgIGdyb3VuZGVkVGVybXNGcm9tR3JvdW5kZWRFcXVpdmFsZW5jZXNBbmREZWZpbmVkVmFyaWFibGVzKGdyb3VuZGVkRXF1aXZhbGVuY2VzLCBkZWZpbmVkVmFyaWFibGVzLCBncm91bmRlZFRlcm1zLCBjb250ZXh0KTtcblxuICAgICAgICAgIGRlZmluZWRWYXJpYWJsZXNGcm9tR3JvdW5kZWRUZXJtcyhncm91bmRlZFRlcm1zLCBkZWZpbmVkVmFyaWFibGVzLCBjb250ZXh0KTtcblxuICAgICAgICAgIGRlZmluZWRWYXJpYWJsZXNMZW5ndGggPSBkZWZpbmVkVmFyaWFibGVzLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGVxdWl2YWxlbmNlcyA9IHJlbWFpbmluZ0VxdWl2YWxlbmNlczsgLy8vXG5cbiAgICAgICAgcmVtYWluaW5nRXF1aXZhbGVuY2VzID0gW107XG5cbiAgICAgICAgaW1wbGljaXRseUdyb3VuZGVkRXF1aXZhbGVuY2VzID0gW107XG5cbiAgICAgICAgZXF1aXZhbGVuY2VzLnNlcGFyYXRlSW1wbGljaXRseUdyb3VuZGVkRXF1aXZhbGVuY2VzKHJlbWFpbmluZ0VxdWl2YWxlbmNlcywgaW1wbGljaXRseUdyb3VuZGVkRXF1aXZhbGVuY2VzLCBkZWZpbmVkVmFyaWFibGVzLCBjb250ZXh0KTtcblxuICAgICAgICBncm91bmRlZEVxdWl2YWxlbmNlcy5hZGRFcXVpdmFsZW5jZXMoaW1wbGljaXRseUdyb3VuZGVkRXF1aXZhbGVuY2VzKTtcblxuICAgICAgICBpbXBsaWNpdGx5R3JvdW5kZWRFcXVpdmFsZW5jZXNMZW5ndGggPSBpbXBsaWNpdGx5R3JvdW5kZWRFcXVpdmFsZW5jZXMuZ2V0TGVuZ3RoKCk7ICAvLy9cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjbG9uZShjb250ZXh0KSB7XG4gICAgY29uc3Qgc3RyaW5nID0gRU1QVFlfU1RSSU5HLFxuICAgICAgICAgIG5vZGUgPSBudWxsLFxuICAgICAgICAgIGFycmF5ID0gW1xuICAgICAgICAgICAgLi4udGhpcy5hcnJheVxuICAgICAgICAgIF0sXG4gICAgICAgICAgZXF1aXZhbGVuY2VzID0gbmV3IEVxdWl2YWxlbmNlcyhjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGFycmF5KTtcblxuICAgIHJldHVybiBlcXVpdmFsZW5jZXM7XG4gIH1cblxuICBzdGF0aWMgbmFtZSA9IFwiRXF1aXZhbGVuY2VzXCI7XG5cbiAgc3RhdGljIGZyb21Ob3RoaW5nKGNvbnRleHQpIHtcbiAgICBjb25zdCBzdHJpbmcgPSBFTVBUWV9TVFJJTkcsXG4gICAgICAgICAgbm9kZSA9IG51bGwsXG4gICAgICAgICAgYXJyYXkgPSBbXTtcblxuICAgIGNvbnRleHQgPSBudWxsO1xuXG4gICAgY29uc3QgZXF1aXZhbGVuY2VzID0gbmV3IEVxdWl2YWxlbmNlcyhjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGFycmF5KTtcblxuICAgIHJldHVybiBlcXVpdmFsZW5jZXM7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBkZWZpbmVkVmFyaWFibGVzRnJvbUdyb3VuZGVkVGVybXMoZ3JvdW5kZWRUZXJtcywgZGVmaW5lZFZhcmlhYmxlcywgY29udGV4dCkge1xuICBncm91bmRlZFRlcm1zLmZvckVhY2goKGdyb3VuZGVkVGVybSkgPT4ge1xuICAgIGNvbnN0IHRlcm0gPSBncm91bmRlZFRlcm0sICAvLy9cbiAgICAgICAgICB2YXJpYWJsZXMgPSB2YXJpYWJsZXNGcm9tVGVybSh0ZXJtLCBjb250ZXh0KTtcblxuICAgIHZhcmlhYmxlcy5mb3JFYWNoKCh2YXJpYWJsZSkgPT4ge1xuICAgICAgY29uc3QgZGVmaW5lZFZhcmlhYmxlc0luY2x1ZGVzVGVybVZhcmlhYmxlID0gZGVmaW5lZFZhcmlhYmxlcy5pbmNsdWRlcyh2YXJpYWJsZSk7XG5cbiAgICAgIGlmICghZGVmaW5lZFZhcmlhYmxlc0luY2x1ZGVzVGVybVZhcmlhYmxlKSB7XG4gICAgICAgIGNvbnN0IGRlZmluZWRWYXJpYWJsZSA9IHZhcmlhYmxlOyAgLy8vXG5cbiAgICAgICAgZGVmaW5lZFZhcmlhYmxlcy5wdXNoKGRlZmluZWRWYXJpYWJsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBncm91bmRlZFRlcm1zRnJvbUdyb3VuZGVkRXF1aXZhbGVuY2VzQW5kRGVmaW5lZFZhcmlhYmxlcyhncm91bmRlZEVxdWl2YWxlbmNlcywgZGVmaW5lZFZhcmlhYmxlcywgZ3JvdW5kZWRUZXJtcywgY29udGV4dCkge1xuICBncm91bmRlZEVxdWl2YWxlbmNlcy5mb3JFYWNoRXF1aXZhbGVuY2UoKGdyb3VuZGVkRXF1aXZhbGVuY2UpID0+IHtcbiAgICBncm91bmRlZEVxdWl2YWxlbmNlLmdldEdyb3VuZGVkVGVybXMoZGVmaW5lZFZhcmlhYmxlcywgZ3JvdW5kZWRUZXJtcywgY29udGV4dCk7XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbInB1c2giLCJzZXBhcmF0ZSIsImFycmF5VXRpbGl0aWVzIiwiZGVmaW5lIiwiRXF1aXZhbGVuY2VzIiwiRWxlbWVudCIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwiYXJyYXkiLCJnZXRBcnJheSIsImdldEVxdWl2YWxlbmNlc05vZGUiLCJnZXROb2RlIiwiZXF1aXZhbGVuY2VzTm9kZSIsImdldExlbmd0aCIsImxlbmd0aCIsImdldFR5cGVzIiwidHlwZXMiLCJtYXAiLCJlcXVpdmFsZW5jZSIsInR5cGUiLCJnZXRUeXBlIiwiYWRkRXF1aXZhbGVuY2UiLCJhZGRFcXVpdmFsZW5jZXMiLCJlcXVpdmFsZW5jZXMiLCJzb21lRXF1aXZhbGVuY2UiLCJjYWxsYmFjayIsInNvbWUiLCJldmVyeUVxdWl2YWxlbmNlIiwiZXZlcnkiLCJmb3JFYWNoRXF1aXZhbGVuY2UiLCJmb3JFYWNoIiwiZmluZEVxdWl2YWxlbmNlQnlUZXJtIiwidGVybSIsImZpbmQiLCJlcXVpdmFsZW5jZUNvbXBhcmVzVG9UZXJtIiwiY29tcGFyZVRlcm0iLCJmaW5kRXF1aXZhbGVuY2VCeVRlcm1Ob2RlcyIsInRlcm1Ob2RlcyIsInRlcm1Ob2RlTWF0Y2hlcyIsIm1hdGNoVGVybU5vZGVzIiwibWVyZ2VkV2l0aCIsIm1lcmdlZEVxdWl2YWxlbmNlcyIsImNsb25lIiwibWVyZ2VkV2l0aEVxdWl2YWxlbmNlIiwiZnJvbU5vdGhpbmciLCJtZXJnZWRFcXVpdmFsZW5jZSIsIm1lcmdlZEVxdWl2YWxlbmNlRGlzam9pbnRGcm9tRXF1aXZhbGVuY2UiLCJpc0Rpc2pvaW50RnJvbSIsInNlcGFyYXRlRXF1aXZhbGVuY2VzIiwiZXF1aXZhbGVuY2VzQSIsImVxdWl2YWxlbmNlc0IiLCJlcXVpdmFsZW5jZXNBQXJyYXkiLCJlcXVpdmFsZW5jZXNCQXJyYXkiLCJzZXBhcmF0ZUluaXRpYWxseUdyb3VuZGVkRXF1aXZhbGVuY2VzIiwicmVtYWluaW5nRXF1aXZhbGVuY2VzIiwiaW5pdGlhbGx5R3JvdW5kZWRFcXVpdmFsZW5jZXMiLCJlcXVpdmFsZW5jZUluaXRpYWxseUdyb3VuZGVkIiwiaXNJbml0aWFsbHlHcm91bmRlZCIsInNlcGFyYXRlSW1wbGljaXRseUdyb3VuZGVkRXF1aXZhbGVuY2VzIiwiaW1wbGljaXRseUdyb3VuZGVkRXF1aXZhbGVuY2VzIiwiZGVmaW5lZFZhcmlhYmxlcyIsImVxdWl2YWxlbmNlSW1wbGljaXRseUdyb3VuZGVkIiwiaXNJbXBsaWNpdGx5R3JvdW5kZWQiLCJzZXBhcmF0ZUdyb3VuZGVkVGVybXNBbmREZWZpbmVkVmFyaWFibGVzIiwiZ3JvdW5kZWRUZXJtcyIsImdyb3VuZGVkRXF1aXZhbGVuY2VzIiwiaW5pdGlhbGx5R3JvdW5kZWRFcXVpdmFsZW5jZXNMZW5ndGgiLCJpbXBsaWNpdGx5R3JvdW5kZWRFcXVpdmFsZW5jZXNMZW5ndGgiLCJkZWZpbmVkVmFyaWFibGVzTGVuZ3RoIiwicHJldmlvdXNEZWZpbmVkVmFyaWFibGVzTGVuZ3RoIiwiZ3JvdW5kZWRUZXJtc0Zyb21Hcm91bmRlZEVxdWl2YWxlbmNlc0FuZERlZmluZWRWYXJpYWJsZXMiLCJkZWZpbmVkVmFyaWFibGVzRnJvbUdyb3VuZGVkVGVybXMiLCJFTVBUWV9TVFJJTkciLCJuYW1lIiwiZ3JvdW5kZWRUZXJtIiwidmFyaWFibGVzIiwidmFyaWFibGVzRnJvbVRlcm0iLCJ2YXJpYWJsZSIsImRlZmluZWRWYXJpYWJsZXNJbmNsdWRlc1Rlcm1WYXJpYWJsZSIsImluY2x1ZGVzIiwiZGVmaW5lZFZhcmlhYmxlIiwiZ3JvdW5kZWRFcXVpdmFsZW5jZSIsImdldEdyb3VuZGVkVGVybXMiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQVdBOzs7ZUFBQTs7O2dDQVR3QjsyQkFDTzswQkFFUjsyQkFDTTs2QkFDSztBQUVsQyxNQUFNLEVBQUVBLElBQUksRUFBRUMsUUFBUSxFQUFFLEdBQUdDLHlCQUFjO01BRXpDLFdBQWVD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
|
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import { Element } from "occam-languages";
|
|
4
|
-
import { arrayUtilities } from "necessary";
|
|
5
|
-
|
|
6
|
-
import { define } from "../elements";
|
|
7
|
-
import { EMPTY_STRING } from "../constants";
|
|
8
|
-
import { variablesFromTerm } from "../utilities/equivalence";
|
|
9
|
-
|
|
10
|
-
const { push, separate } = arrayUtilities;
|
|
11
|
-
|
|
12
|
-
export default define(class Equivalences extends Element {
|
|
13
|
-
constructor(context, string, node, array) {
|
|
14
|
-
super(context, string, node);
|
|
15
|
-
|
|
16
|
-
this.array = array;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
getArray() {
|
|
20
|
-
return this.array;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
getEquivalencesNode() {
|
|
24
|
-
const node = this.getNode(),
|
|
25
|
-
equivalencesNode = node; ///
|
|
26
|
-
|
|
27
|
-
return equivalencesNode;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
getLength() { return this.array.length; }
|
|
31
|
-
|
|
32
|
-
getTypes() {
|
|
33
|
-
const types = this.array.map((equivalence) => {
|
|
34
|
-
const type = equivalence.getType();
|
|
35
|
-
|
|
36
|
-
return type;
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
return types;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
addEquivalence(equivalence) {
|
|
43
|
-
this.array.push(equivalence);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
addEquivalences(equivalences) {
|
|
47
|
-
const array = equivalences.getArray();
|
|
48
|
-
|
|
49
|
-
push(this.array, array);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
someEquivalence(callback) { return this.array.some(callback); }
|
|
53
|
-
|
|
54
|
-
everyEquivalence(callback) { return this.array.every(callback); }
|
|
55
|
-
|
|
56
|
-
forEachEquivalence(callback) { this.array.forEach(callback); }
|
|
57
|
-
|
|
58
|
-
findEquivalenceByTerm(term) {
|
|
59
|
-
const equivalence = this.array.find((equivalence) => {
|
|
60
|
-
const equivalenceComparesToTerm = equivalence.compareTerm(term);
|
|
61
|
-
|
|
62
|
-
if (equivalenceComparesToTerm) {
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
}) || null;
|
|
66
|
-
|
|
67
|
-
return equivalence;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
findEquivalenceByTermNodes(termNodes) {
|
|
71
|
-
const equivalence = this.array.find((equivalence) => {
|
|
72
|
-
const termNodeMatches = equivalence.matchTermNodes(termNodes);
|
|
73
|
-
|
|
74
|
-
if (termNodeMatches) {
|
|
75
|
-
return true;
|
|
76
|
-
}
|
|
77
|
-
}) || null;
|
|
78
|
-
|
|
79
|
-
return equivalence;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
mergedWith(equivalences, context) {
|
|
83
|
-
let mergedEquivalences = this.clone(context); ///
|
|
84
|
-
|
|
85
|
-
equivalences.forEachEquivalence((equivalence) => {
|
|
86
|
-
mergedEquivalences = mergedEquivalences.mergedWithEquivalence(equivalence, context);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
return mergedEquivalences;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
mergedWithEquivalence(equivalence, context) {
|
|
93
|
-
const equivalences = Equivalences.fromNothing(context);
|
|
94
|
-
|
|
95
|
-
let mergedEquivalence = equivalence; ///
|
|
96
|
-
|
|
97
|
-
this.forEachEquivalence((equivalence) => {
|
|
98
|
-
const mergedEquivalenceDisjointFromEquivalence = mergedEquivalence.isDisjointFrom(equivalence);
|
|
99
|
-
|
|
100
|
-
if (mergedEquivalenceDisjointFromEquivalence) {
|
|
101
|
-
equivalences.addEquivalence(equivalence);
|
|
102
|
-
} else {
|
|
103
|
-
mergedEquivalence = mergedEquivalence.mergedWith(equivalence, context);
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
equivalence = mergedEquivalence; ///
|
|
108
|
-
|
|
109
|
-
equivalences.addEquivalence(equivalence);
|
|
110
|
-
|
|
111
|
-
return equivalences;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
separateEquivalences(equivalencesA, equivalencesB, callback) {
|
|
115
|
-
const equivalencesAArray = equivalencesA.getArray(),
|
|
116
|
-
equivalencesBArray = equivalencesB.getArray();
|
|
117
|
-
|
|
118
|
-
separate(this.array, equivalencesAArray, equivalencesBArray, callback);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
separateInitiallyGroundedEquivalences(remainingEquivalences, initiallyGroundedEquivalences, context) {
|
|
122
|
-
this.separateEquivalences(remainingEquivalences, initiallyGroundedEquivalences, (equivalence) => {
|
|
123
|
-
const equivalenceInitiallyGrounded = equivalence.isInitiallyGrounded(context);
|
|
124
|
-
|
|
125
|
-
if (!equivalenceInitiallyGrounded) {
|
|
126
|
-
return true;
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
separateImplicitlyGroundedEquivalences(remainingEquivalences, implicitlyGroundedEquivalences, definedVariables, context) {
|
|
132
|
-
this.separateEquivalences(remainingEquivalences, implicitlyGroundedEquivalences, (equivalence) => {
|
|
133
|
-
const equivalenceImplicitlyGrounded = equivalence.isImplicitlyGrounded(definedVariables, context);
|
|
134
|
-
|
|
135
|
-
if (!equivalenceImplicitlyGrounded) {
|
|
136
|
-
return true;
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
separateGroundedTermsAndDefinedVariables(groundedTerms, definedVariables, context) {
|
|
142
|
-
let equivalences = this, ///
|
|
143
|
-
groundedEquivalences,
|
|
144
|
-
remainingEquivalences,
|
|
145
|
-
initiallyGroundedEquivalences,
|
|
146
|
-
implicitlyGroundedEquivalences;
|
|
147
|
-
|
|
148
|
-
remainingEquivalences =Equivalences.fromNothing(context);
|
|
149
|
-
|
|
150
|
-
initiallyGroundedEquivalences = Equivalences.fromNothing(context);
|
|
151
|
-
|
|
152
|
-
equivalences.separateInitiallyGroundedEquivalences(remainingEquivalences, initiallyGroundedEquivalences, context);
|
|
153
|
-
|
|
154
|
-
const initiallyGroundedEquivalencesLength = initiallyGroundedEquivalences.getLength();
|
|
155
|
-
|
|
156
|
-
if (initiallyGroundedEquivalencesLength > 0) {
|
|
157
|
-
groundedEquivalences = initiallyGroundedEquivalences; ///
|
|
158
|
-
|
|
159
|
-
let implicitlyGroundedEquivalencesLength = 1;
|
|
160
|
-
|
|
161
|
-
while (implicitlyGroundedEquivalencesLength > 0) {
|
|
162
|
-
let definedVariablesLength = 0,
|
|
163
|
-
previousDefinedVariablesLength = -1;
|
|
164
|
-
|
|
165
|
-
while (definedVariablesLength > previousDefinedVariablesLength) {
|
|
166
|
-
previousDefinedVariablesLength = definedVariablesLength; ///
|
|
167
|
-
|
|
168
|
-
groundedTermsFromGroundedEquivalencesAndDefinedVariables(groundedEquivalences, definedVariables, groundedTerms, context);
|
|
169
|
-
|
|
170
|
-
definedVariablesFromGroundedTerms(groundedTerms, definedVariables, context);
|
|
171
|
-
|
|
172
|
-
definedVariablesLength = definedVariables.length;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
equivalences = remainingEquivalences; ///
|
|
176
|
-
|
|
177
|
-
remainingEquivalences = [];
|
|
178
|
-
|
|
179
|
-
implicitlyGroundedEquivalences = [];
|
|
180
|
-
|
|
181
|
-
equivalences.separateImplicitlyGroundedEquivalences(remainingEquivalences, implicitlyGroundedEquivalences, definedVariables, context);
|
|
182
|
-
|
|
183
|
-
groundedEquivalences.addEquivalences(implicitlyGroundedEquivalences);
|
|
184
|
-
|
|
185
|
-
implicitlyGroundedEquivalencesLength = implicitlyGroundedEquivalences.getLength(); ///
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
clone(context) {
|
|
191
|
-
const string = EMPTY_STRING,
|
|
192
|
-
node = null,
|
|
193
|
-
array = [
|
|
194
|
-
...this.array
|
|
195
|
-
],
|
|
196
|
-
equivalences = new Equivalences(context, string, node, array);
|
|
197
|
-
|
|
198
|
-
return equivalences;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
static name = "Equivalences";
|
|
202
|
-
|
|
203
|
-
static fromNothing(context) {
|
|
204
|
-
const string = EMPTY_STRING,
|
|
205
|
-
node = null,
|
|
206
|
-
array = [];
|
|
207
|
-
|
|
208
|
-
context = null;
|
|
209
|
-
|
|
210
|
-
const equivalences = new Equivalences(context, string, node, array);
|
|
211
|
-
|
|
212
|
-
return equivalences;
|
|
213
|
-
}
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
function definedVariablesFromGroundedTerms(groundedTerms, definedVariables, context) {
|
|
217
|
-
groundedTerms.forEach((groundedTerm) => {
|
|
218
|
-
const term = groundedTerm, ///
|
|
219
|
-
variables = variablesFromTerm(term, context);
|
|
220
|
-
|
|
221
|
-
variables.forEach((variable) => {
|
|
222
|
-
const definedVariablesIncludesTermVariable = definedVariables.includes(variable);
|
|
223
|
-
|
|
224
|
-
if (!definedVariablesIncludesTermVariable) {
|
|
225
|
-
const definedVariable = variable; ///
|
|
226
|
-
|
|
227
|
-
definedVariables.push(definedVariable);
|
|
228
|
-
}
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
function groundedTermsFromGroundedEquivalencesAndDefinedVariables(groundedEquivalences, definedVariables, groundedTerms, context) {
|
|
234
|
-
groundedEquivalences.forEachEquivalence((groundedEquivalence) => {
|
|
235
|
-
groundedEquivalence.getGroundedTerms(definedVariables, groundedTerms, context);
|
|
236
|
-
});
|
|
237
|
-
}
|