occam-verify-cli 1.0.587 → 1.0.602
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/ephemeral.js +74 -2
- package/lib/context/file/nominal.js +11 -9
- package/lib/context/liminal.js +161 -24
- package/lib/context/literal.js +8 -2
- package/lib/context/scoped.js +4 -28
- package/lib/context/synthetic.js +146 -0
- package/lib/context.js +170 -1
- package/lib/element/assertion/contained.js +21 -15
- package/lib/element/assertion/defined.js +45 -65
- package/lib/element/assertion/property.js +25 -19
- package/lib/element/assertion/satisfies.js +14 -8
- package/lib/element/assertion/subproof.js +12 -6
- package/lib/element/assertion.js +47 -1
- package/lib/element/assumption.js +12 -12
- package/lib/element/conclusion.js +2 -2
- package/lib/element/deduction.js +2 -2
- package/lib/element/frame.js +61 -29
- package/lib/element/judgement.js +7 -1
- package/lib/element/label.js +8 -8
- package/lib/element/metavariable.js +71 -59
- package/lib/element/procedureCall.js +24 -8
- package/lib/element/proof.js +43 -35
- package/lib/element/proofAssertion/premise.js +122 -97
- package/lib/element/proofAssertion/step.js +161 -115
- package/lib/element/proofAssertion/supposition.js +157 -118
- package/lib/element/proofAssertion.js +3 -3
- package/lib/element/reference.js +40 -7
- package/lib/element/rule.js +227 -95
- package/lib/element/signature.js +2 -1
- package/lib/element/statement.js +67 -34
- package/lib/element/substitution/frame.js +36 -16
- package/lib/element/substitution/reference.js +36 -16
- package/lib/element/substitution/statement.js +94 -55
- package/lib/element/substitution/term.js +36 -16
- package/lib/element/substitution.js +54 -17
- package/lib/element/substitutions.js +4 -276
- package/lib/element/term.js +60 -31
- package/lib/element/topLevelAssertion/axiom.js +13 -4
- package/lib/element/topLevelAssertion/conjecture.js +7 -2
- package/lib/element/topLevelAssertion/theorem.js +7 -2
- package/lib/element/topLevelAssertion.js +201 -134
- package/lib/element/topLevelMetaAssertion.js +310 -51
- package/lib/element/variable.js +15 -6
- package/lib/node/substitution/statement.js +33 -1
- package/lib/process/unify.js +6 -6
- package/lib/utilities/context.js +10 -25
- package/lib/utilities/element.js +34 -9
- package/lib/utilities/statement.js +1 -8
- package/lib/utilities/string.js +12 -1
- package/lib/utilities/substitutions.js +42 -16
- package/lib/utilities/unification.js +3 -1
- package/lib/utilities/validation.js +2 -2
- package/package.json +4 -4
- package/src/context/ephemeral.js +73 -1
- package/src/context/file/nominal.js +14 -11
- package/src/context/liminal.js +180 -25
- package/src/context/literal.js +3 -1
- package/src/context/scoped.js +3 -35
- package/src/context/synthetic.js +49 -0
- package/src/context.js +163 -1
- package/src/element/assertion/contained.js +28 -20
- package/src/element/assertion/defined.js +62 -34
- package/src/element/assertion/property.js +27 -19
- package/src/element/assertion/satisfies.js +15 -7
- package/src/element/assertion/subproof.js +13 -5
- package/src/element/assertion.js +35 -0
- package/src/element/assumption.js +5 -5
- package/src/element/conclusion.js +2 -4
- package/src/element/deduction.js +2 -4
- package/src/element/frame.js +71 -39
- package/src/element/judgement.js +2 -0
- package/src/element/label.js +4 -4
- package/src/element/metavariable.js +94 -75
- package/src/element/procedureCall.js +6 -6
- package/src/element/proof.js +6 -6
- package/src/element/proofAssertion/premise.js +101 -69
- package/src/element/proofAssertion/step.js +78 -39
- package/src/element/proofAssertion/supposition.js +141 -115
- package/src/element/proofAssertion.js +3 -2
- package/src/element/reference.js +52 -10
- package/src/element/rule.js +138 -76
- package/src/element/signature.js +2 -0
- package/src/element/statement.js +76 -45
- package/src/element/substitution/frame.js +44 -15
- package/src/element/substitution/reference.js +44 -15
- package/src/element/substitution/statement.js +124 -72
- package/src/element/substitution/term.js +43 -15
- package/src/element/substitution.js +55 -18
- package/src/element/substitutions.js +1 -258
- package/src/element/term.js +65 -34
- package/src/element/topLevelAssertion/axiom.js +1 -1
- package/src/element/topLevelAssertion/conjecture.js +1 -1
- package/src/element/topLevelAssertion/theorem.js +1 -1
- package/src/element/topLevelAssertion.js +128 -48
- package/src/element/topLevelMetaAssertion.js +86 -32
- package/src/element/variable.js +15 -5
- package/src/node/substitution/statement.js +33 -0
- package/src/process/unify.js +6 -8
- package/src/utilities/context.js +9 -8
- package/src/utilities/element.js +37 -10
- package/src/utilities/statement.js +0 -7
- package/src/utilities/string.js +14 -0
- package/src/utilities/substitutions.js +59 -17
- package/src/utilities/unification.js +4 -0
- package/src/utilities/validation.js +3 -1
|
@@ -7,46 +7,9 @@ import { define } from "../elements";
|
|
|
7
7
|
import { EMPTY_STRING } from "../constants";
|
|
8
8
|
import { substitutionsStringFromSubstitutions } from "../utilities/string";
|
|
9
9
|
|
|
10
|
-
const {
|
|
10
|
+
const { first, extract, correlate } = arrayUtilities;
|
|
11
11
|
|
|
12
12
|
export default define(class Substitutions extends Element {
|
|
13
|
-
constructor(context, string, node, array, savedArray) {
|
|
14
|
-
super(context, string, node);
|
|
15
|
-
|
|
16
|
-
this.array = array;
|
|
17
|
-
this.savedArray = savedArray;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
getArray() {
|
|
21
|
-
return this.array;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
getSavedArray() {
|
|
25
|
-
return this.savedArray;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
getMetavariables() {
|
|
29
|
-
const metavariables = [];
|
|
30
|
-
|
|
31
|
-
this.forEachSubstitution((substitution) => {
|
|
32
|
-
const metavariable = substitution.getMetavariable();
|
|
33
|
-
|
|
34
|
-
if (metavariable !== null) {
|
|
35
|
-
metavariables.push(metavariable);
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
compress(metavariables, (metavariableA, metavariableB) => {
|
|
40
|
-
const metavariableAEqualToMetavariableB = metavariableB.isEqualTo(metavariableA);
|
|
41
|
-
|
|
42
|
-
if (!metavariableAEqualToMetavariableB) {
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
return metavariables;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
13
|
getNonTrivialLength() {
|
|
51
14
|
const nonTrivialLength = this.reduceSubstitution((nonTrivialLength, substitution) => {
|
|
52
15
|
const substitutionTrivial = substitution.isTrivial();
|
|
@@ -73,124 +36,8 @@ export default define(class Substitutions extends Element {
|
|
|
73
36
|
return firstSubstitution;
|
|
74
37
|
}
|
|
75
38
|
|
|
76
|
-
getLength() { return this.array.length; }
|
|
77
|
-
|
|
78
|
-
mapSubstitution(callback) { return this.array.map(callback); }
|
|
79
|
-
|
|
80
|
-
someSubstitution(callback) { return this.array.some(callback); }
|
|
81
|
-
|
|
82
|
-
everySubstitution(callback) { return this.array.every(callback); }
|
|
83
|
-
|
|
84
|
-
reduceSubstitution(callback, initialValue) { return this.array.reduce(callback, initialValue); }
|
|
85
|
-
|
|
86
|
-
forEachSubstitution(callback) { this.array.forEach(callback); }
|
|
87
|
-
|
|
88
39
|
extractSubstitution(callbcak) { return extract(this.array, callbcak); }
|
|
89
40
|
|
|
90
|
-
findSubstitutions(callback) {
|
|
91
|
-
let string;
|
|
92
|
-
|
|
93
|
-
const array = find(this.array, callback),
|
|
94
|
-
context = null;
|
|
95
|
-
|
|
96
|
-
string = null;
|
|
97
|
-
|
|
98
|
-
const node = null,
|
|
99
|
-
savedArray = [],
|
|
100
|
-
substitutions = new Substitutions(context, string, node, array, savedArray);
|
|
101
|
-
|
|
102
|
-
string = substitutions.asString();
|
|
103
|
-
|
|
104
|
-
substitutions.setString(string);
|
|
105
|
-
|
|
106
|
-
return substitutions;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
findSubstitutionByVariable(variable) {
|
|
110
|
-
const substitution = this.findSubstitution((substitution) => {
|
|
111
|
-
const substitutionVariable = substitution.getVariable();
|
|
112
|
-
|
|
113
|
-
if (substitutionVariable !== null) {
|
|
114
|
-
const substitutionVariableEqualToVariable = substitutionVariable.isEqualTo(variable);
|
|
115
|
-
|
|
116
|
-
if (substitutionVariableEqualToVariable) {
|
|
117
|
-
return true;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}) || null;
|
|
121
|
-
|
|
122
|
-
return substitution;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
findSubstitutionsByMetavariable(metavariable) {
|
|
126
|
-
const substitutions = this.findSubstitutions((substitution) => {
|
|
127
|
-
const substitutionMetavariableEqualToMetavariable = substitution.isMetavariableEqualToMetavariable(metavariable);
|
|
128
|
-
|
|
129
|
-
if (substitutionMetavariableEqualToMetavariable) {
|
|
130
|
-
return true;
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
return substitutions;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
findComplexSubstitutionsByMetavariable(metavariable) {
|
|
138
|
-
const complexSubstitutions = this.findSubstitutions((substitution) => {
|
|
139
|
-
const substitutionComplex = substitution.isComplex();
|
|
140
|
-
|
|
141
|
-
if (substitutionComplex) {
|
|
142
|
-
const complexSubstitution = substitution, ///
|
|
143
|
-
complexSubstitutionMetavariableEqualToMetavariable = complexSubstitution.isMetavariableEqualToMetavariable(metavariable);
|
|
144
|
-
|
|
145
|
-
if (complexSubstitutionMetavariableEqualToMetavariable) {
|
|
146
|
-
return true;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
return complexSubstitutions;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
isSubstitutionPresentByVariable(variable) {
|
|
155
|
-
const substitution = this.findSubstitutionByVariable(variable),
|
|
156
|
-
substitutionPresent = (substitution !== null);
|
|
157
|
-
|
|
158
|
-
return substitutionPresent;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
addSubstitution(substitution, context) {
|
|
162
|
-
const substitutionString = substitution.getString(),
|
|
163
|
-
substitutionsString = this.asString(); ///
|
|
164
|
-
|
|
165
|
-
this.array.push(substitution);
|
|
166
|
-
|
|
167
|
-
const string = this.asString();
|
|
168
|
-
|
|
169
|
-
this.setString(string);
|
|
170
|
-
|
|
171
|
-
context.trace(`Added the '${substitutionString}' substitution to the '${substitutionsString}' substitutions.`);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
removeSubstitution(substitution, context) {
|
|
175
|
-
const substitutionA = substitution; ///
|
|
176
|
-
|
|
177
|
-
prune(this.array, (substitution) => {
|
|
178
|
-
const substitutionB = substitution; ///
|
|
179
|
-
|
|
180
|
-
if (substitutionA !== substitutionB) {
|
|
181
|
-
return true;
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
const string = this.asString(),
|
|
186
|
-
substitutionString = substitution.getString(),
|
|
187
|
-
substitutionsString = string; ///
|
|
188
|
-
|
|
189
|
-
this.setString(string);
|
|
190
|
-
|
|
191
|
-
context.trace(`Removed the '${substitutionString}' substitution from the '${substitutionsString}' substitutions.`);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
41
|
correlateSubstitutions(substitutions) {
|
|
195
42
|
const array = substitutions.getArray(),
|
|
196
43
|
arrayA = array, ///
|
|
@@ -206,100 +53,6 @@ export default define(class Substitutions extends Element {
|
|
|
206
53
|
return correlates;
|
|
207
54
|
}
|
|
208
55
|
|
|
209
|
-
clear() {
|
|
210
|
-
clear(this.array);
|
|
211
|
-
|
|
212
|
-
this.savedArray = null;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
resolve(context) {
|
|
216
|
-
const metavariables = this.getMetavariables();
|
|
217
|
-
|
|
218
|
-
metavariables.forEach((metavariable) => {
|
|
219
|
-
const complexSubstitutions = this.findComplexSubstitutionsByMetavariable(metavariable),
|
|
220
|
-
complexSubstitutionsResolved = complexSubstitutions.everySubstitution((complexSubstitution) => {
|
|
221
|
-
let resolved;
|
|
222
|
-
|
|
223
|
-
const substitutions = this, ///
|
|
224
|
-
substitution = complexSubstitution; ///
|
|
225
|
-
|
|
226
|
-
resolved = substitution.isResolved();
|
|
227
|
-
|
|
228
|
-
if (!resolved) {
|
|
229
|
-
substitution.resolve(substitutions, context);
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
if (complexSubstitutionsResolved) {
|
|
234
|
-
return true;
|
|
235
|
-
}
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
areResolved() {
|
|
240
|
-
const metavariables = this.getMetavariables(),
|
|
241
|
-
resolved = metavariables.every((metavariable) => {
|
|
242
|
-
const complexSubstitutions = this.findComplexSubstitutionsByMetavariable(metavariable),
|
|
243
|
-
complexSubstitutionsResolved = complexSubstitutions.everySubstitution((complexSubstitution) => {
|
|
244
|
-
const complexSubstitutionResolved = complexSubstitution.isResolved();
|
|
245
|
-
|
|
246
|
-
if (complexSubstitutionResolved) {
|
|
247
|
-
return true;
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
if (complexSubstitutionsResolved) {
|
|
252
|
-
return true;
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
|
|
256
|
-
return resolved;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
snapshot(context) {
|
|
260
|
-
const substitutionsString = this.getString(); ///
|
|
261
|
-
|
|
262
|
-
context.trace(`Taking a snapshot of the '${substitutionsString}' substitutions.`);
|
|
263
|
-
|
|
264
|
-
this.savedArray = [
|
|
265
|
-
...this.array
|
|
266
|
-
];
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
rollback(context) {
|
|
270
|
-
const substitutionsString = this.getString(); ///
|
|
271
|
-
|
|
272
|
-
context.trace(`Rolling back the '${substitutionsString}' substitutions.`);
|
|
273
|
-
|
|
274
|
-
const array = [
|
|
275
|
-
...this.array
|
|
276
|
-
];
|
|
277
|
-
|
|
278
|
-
leftDifference(array, this.savedArray);
|
|
279
|
-
|
|
280
|
-
array.forEach((substitution) => {
|
|
281
|
-
this.removeSubstitution(substitution, context);
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
this.array = [
|
|
285
|
-
...this.savedArray
|
|
286
|
-
];
|
|
287
|
-
|
|
288
|
-
this.savedArray = null;
|
|
289
|
-
|
|
290
|
-
const string = this.asString();
|
|
291
|
-
|
|
292
|
-
this.setString(string);
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
continue(context) {
|
|
296
|
-
const substitutionsString = this.getString(); ///
|
|
297
|
-
|
|
298
|
-
context.trace(`Continuing with the '${substitutionsString}' substitutions.`);
|
|
299
|
-
|
|
300
|
-
this.savedArray = null;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
56
|
asString() {
|
|
304
57
|
let string;
|
|
305
58
|
|
|
@@ -329,13 +82,3 @@ export default define(class Substitutions extends Element {
|
|
|
329
82
|
return substitutions;
|
|
330
83
|
}
|
|
331
84
|
});
|
|
332
|
-
|
|
333
|
-
function leftDifference(arrayA, arrayB) {
|
|
334
|
-
filter(arrayA, (elementA) => {
|
|
335
|
-
const arrayBIncludesElementA = arrayB.includes(elementA);
|
|
336
|
-
|
|
337
|
-
if (!arrayBIncludesElementA) {
|
|
338
|
-
return true;
|
|
339
|
-
}
|
|
340
|
-
});
|
|
341
|
-
}
|
package/src/element/term.js
CHANGED
|
@@ -24,15 +24,47 @@ export default define(class Term extends Element {
|
|
|
24
24
|
this.type = type;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
getTermNode() {
|
|
28
28
|
const node = this.getNode(),
|
|
29
|
-
termNode = node
|
|
30
|
-
singular = termNode.isSingular();
|
|
29
|
+
termNode = node; ///
|
|
31
30
|
|
|
32
|
-
return
|
|
31
|
+
return termNode;
|
|
33
32
|
}
|
|
34
33
|
|
|
35
|
-
|
|
34
|
+
getVariableIdentifier() {
|
|
35
|
+
const termNode = this.getTermNode(),
|
|
36
|
+
variableIdentifier = termNode.getVariableIdentifier();
|
|
37
|
+
|
|
38
|
+
return variableIdentifier;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
matchTermNode(termNode) {
|
|
42
|
+
const termNodeA = termNode; ///
|
|
43
|
+
|
|
44
|
+
termNode = this.getTermNode();
|
|
45
|
+
|
|
46
|
+
const termNodeB = termNode, ///
|
|
47
|
+
termNodeAAMatchesTermBNodeB = termNodeA.match(termNodeB),
|
|
48
|
+
equalTo = termNodeAAMatchesTermBNodeB; ///
|
|
49
|
+
|
|
50
|
+
return equalTo;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
isValid(context) {
|
|
54
|
+
const termNode = this.getTermNode(),
|
|
55
|
+
termPresent = context.isTermPresentByTermNode(termNode),
|
|
56
|
+
valid = termPresent; ///
|
|
57
|
+
|
|
58
|
+
return valid;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
isEqualTo(term) {
|
|
62
|
+
const termNode = term.getNode(),
|
|
63
|
+
termNodeMatches = this.matchTermNode(termNode),
|
|
64
|
+
equalTo = termNodeMatches; ///
|
|
65
|
+
|
|
66
|
+
return equalTo;
|
|
67
|
+
}
|
|
36
68
|
|
|
37
69
|
isGrounded(definedVariables, context) {
|
|
38
70
|
const term = this, ///
|
|
@@ -53,6 +85,15 @@ export default define(class Term extends Element {
|
|
|
53
85
|
return grounded;
|
|
54
86
|
}
|
|
55
87
|
|
|
88
|
+
isSingular() {
|
|
89
|
+
const termNode = this.getTermNode(),
|
|
90
|
+
singular = termNode.isSingular();
|
|
91
|
+
|
|
92
|
+
return singular;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
isProvisional() { return this.type.isProvisional(); }
|
|
96
|
+
|
|
56
97
|
isInitiallyGrounded(context) {
|
|
57
98
|
const term = this, ///
|
|
58
99
|
variables = variablesFromTerm(term, context),
|
|
@@ -69,24 +110,6 @@ export default define(class Term extends Element {
|
|
|
69
110
|
return implicitlyGrounded;
|
|
70
111
|
}
|
|
71
112
|
|
|
72
|
-
getVariableIdentifier() {
|
|
73
|
-
const node = this.getNode(),
|
|
74
|
-
variableIdentifier = node.getVariableIdentifier();
|
|
75
|
-
|
|
76
|
-
return variableIdentifier;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
isEqualTo(term) {
|
|
80
|
-
const termA = this, ///
|
|
81
|
-
termB = term, ///
|
|
82
|
-
termANode = termA.getNode(),
|
|
83
|
-
termBNode = termB.getNode(),
|
|
84
|
-
termANodeMatchesTermBNode = termANode.match(termBNode),
|
|
85
|
-
equalTo = termANodeMatchesTermBNode; ///
|
|
86
|
-
|
|
87
|
-
return equalTo;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
113
|
compareParameter(parameter) {
|
|
91
114
|
let comparesToParamter = false;
|
|
92
115
|
|
|
@@ -114,21 +137,29 @@ export default define(class Term extends Element {
|
|
|
114
137
|
|
|
115
138
|
context.trace(`Validating the '${termString}' term...`);
|
|
116
139
|
|
|
117
|
-
|
|
118
|
-
const term = this, ///
|
|
119
|
-
termValidates = validateTerm(term, context, verifyForwards);
|
|
140
|
+
const valid = this.isValid(context);
|
|
120
141
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
});
|
|
142
|
+
if (valid) {
|
|
143
|
+
validates = true;
|
|
125
144
|
|
|
126
|
-
|
|
127
|
-
|
|
145
|
+
context.debug(`...the '${termString}' term is already valid.`);
|
|
146
|
+
} else {
|
|
147
|
+
validates = validateTerms.some((validateTerm) => { ///
|
|
148
|
+
const term = this, ///
|
|
149
|
+
termValidates = validateTerm(term, context, verifyForwards);
|
|
150
|
+
|
|
151
|
+
if (termValidates) {
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
if (validates) {
|
|
157
|
+
const term = this; ///
|
|
128
158
|
|
|
129
|
-
|
|
159
|
+
context.addTerm(term);
|
|
130
160
|
|
|
131
|
-
|
|
161
|
+
context.debug(`...validated the '${termString}' term.`);
|
|
162
|
+
}
|
|
132
163
|
}
|
|
133
164
|
|
|
134
165
|
return validates;
|
|
@@ -16,7 +16,7 @@ export default define(class Conjecture extends TopLevelAssertion {
|
|
|
16
16
|
|
|
17
17
|
context.trace(`Verifying the '${conjectureString}' conjecture...`);
|
|
18
18
|
|
|
19
|
-
verifies = super.verify();
|
|
19
|
+
verifies = await super.verify();
|
|
20
20
|
|
|
21
21
|
if (verifies) {
|
|
22
22
|
const conjecture = this; ///
|