occam-verify-cli 1.0.404 → 1.0.414

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 (122) hide show
  1. package/lib/context/file.js +3 -3
  2. package/lib/context/local.js +3 -3
  3. package/lib/context/release.js +2 -2
  4. package/lib/context/temporary.js +103 -54
  5. package/lib/mixins/statement/verify.js +2 -2
  6. package/lib/mixins/step/unify.js +2 -2
  7. package/lib/node/argument.js +2 -2
  8. package/lib/node/assumption.js +6 -6
  9. package/lib/node/frame.js +19 -7
  10. package/lib/node/judgement.js +8 -1
  11. package/lib/node/statement.js +34 -15
  12. package/lib/node/substitution/term.js +3 -11
  13. package/lib/node/term.js +20 -8
  14. package/lib/nonTerminalNode.js +3 -3
  15. package/lib/ontology/assertion/contained.js +7 -7
  16. package/lib/ontology/assertion/defined.js +8 -8
  17. package/lib/ontology/assertion/subproof.js +3 -3
  18. package/lib/ontology/assumption.js +49 -45
  19. package/lib/ontology/combinator.js +3 -3
  20. package/lib/ontology/constructor.js +3 -3
  21. package/lib/ontology/equality.js +4 -4
  22. package/lib/ontology/equivalence.js +2 -2
  23. package/lib/ontology/frame.js +37 -12
  24. package/lib/ontology/judgement.js +13 -6
  25. package/lib/ontology/metavariable.js +75 -76
  26. package/lib/ontology/propertyRelation.js +2 -2
  27. package/lib/ontology/reference.js +33 -4
  28. package/lib/ontology/signature.js +2 -2
  29. package/lib/ontology/statement.js +33 -8
  30. package/lib/ontology/step.js +4 -4
  31. package/lib/ontology/substitution/frame.js +13 -15
  32. package/lib/ontology/substitution/statement.js +31 -32
  33. package/lib/ontology/substitution/term.js +26 -25
  34. package/lib/ontology/substitution.js +2 -2
  35. package/lib/ontology/substitutions.js +4 -4
  36. package/lib/ontology/term.js +26 -12
  37. package/lib/ontology/variable.js +2 -2
  38. package/lib/process/equate.js +322 -0
  39. package/lib/process/unify.js +623 -0
  40. package/lib/process/verify.js +332 -0
  41. package/lib/utilities/brackets.js +3 -8
  42. package/lib/utilities/context.js +4 -14
  43. package/lib/utilities/json.js +18 -1
  44. package/lib/utilities/pass.js +68 -0
  45. package/lib/utilities/substitutions.js +11 -16
  46. package/package.json +7 -7
  47. package/src/context/file.js +2 -2
  48. package/src/context/local.js +2 -2
  49. package/src/context/release.js +1 -1
  50. package/src/context/temporary.js +124 -54
  51. package/src/mixins/statement/verify.js +3 -1
  52. package/src/mixins/step/unify.js +0 -1
  53. package/src/node/argument.js +1 -1
  54. package/src/node/assumption.js +4 -4
  55. package/src/node/frame.js +19 -5
  56. package/src/node/judgement.js +7 -0
  57. package/src/node/statement.js +35 -13
  58. package/src/node/substitution/term.js +4 -14
  59. package/src/node/term.js +20 -6
  60. package/src/nonTerminalNode.js +1 -1
  61. package/src/ontology/assertion/contained.js +6 -6
  62. package/src/ontology/assertion/defined.js +7 -7
  63. package/src/ontology/assertion/subproof.js +1 -1
  64. package/src/ontology/assumption.js +52 -57
  65. package/src/ontology/combinator.js +1 -1
  66. package/src/ontology/constructor.js +1 -1
  67. package/src/ontology/equality.js +3 -3
  68. package/src/ontology/equivalence.js +1 -1
  69. package/src/ontology/frame.js +44 -10
  70. package/src/ontology/judgement.js +8 -3
  71. package/src/ontology/metavariable.js +108 -102
  72. package/src/ontology/propertyRelation.js +3 -2
  73. package/src/ontology/reference.js +39 -1
  74. package/src/ontology/signature.js +3 -3
  75. package/src/ontology/statement.js +38 -4
  76. package/src/ontology/step.js +7 -7
  77. package/src/ontology/substitution/frame.js +13 -17
  78. package/src/ontology/substitution/statement.js +45 -48
  79. package/src/ontology/substitution/term.js +19 -19
  80. package/src/ontology/substitution.js +3 -2
  81. package/src/ontology/substitutions.js +3 -3
  82. package/src/ontology/term.js +26 -5
  83. package/src/ontology/variable.js +3 -2
  84. package/src/process/equate.js +212 -0
  85. package/src/process/unify.js +634 -0
  86. package/src/process/verify.js +204 -0
  87. package/src/utilities/brackets.js +2 -11
  88. package/src/utilities/context.js +1 -21
  89. package/src/utilities/json.js +19 -0
  90. package/src/utilities/{unifier.js → pass.js} +17 -1
  91. package/src/utilities/substitutions.js +10 -20
  92. package/lib/unifier/equantional.js +0 -170
  93. package/lib/unifier/intrinsicLevel.js +0 -144
  94. package/lib/unifier/metaLevel.js +0 -197
  95. package/lib/unifier/metavariable.js +0 -140
  96. package/lib/unifier/statementWithCombinator.js +0 -177
  97. package/lib/unifier/termWithConstructor.js +0 -145
  98. package/lib/unifier.js +0 -241
  99. package/lib/utilities/arguments.js +0 -28
  100. package/lib/utilities/frame.js +0 -18
  101. package/lib/utilities/metavariable.js +0 -18
  102. package/lib/utilities/statement.js +0 -18
  103. package/lib/utilities/unification.js +0 -109
  104. package/lib/utilities/unifier.js +0 -51
  105. package/lib/utilities/variable.js +0 -18
  106. package/lib/verifier/combinator.js +0 -158
  107. package/lib/verifier.js +0 -219
  108. package/src/unifier/equantional.js +0 -90
  109. package/src/unifier/intrinsicLevel.js +0 -52
  110. package/src/unifier/metaLevel.js +0 -151
  111. package/src/unifier/metavariable.js +0 -50
  112. package/src/unifier/statementWithCombinator.js +0 -114
  113. package/src/unifier/termWithConstructor.js +0 -56
  114. package/src/unifier.js +0 -183
  115. package/src/utilities/arguments.js +0 -21
  116. package/src/utilities/frame.js +0 -13
  117. package/src/utilities/metavariable.js +0 -13
  118. package/src/utilities/statement.js +0 -13
  119. package/src/utilities/unification.js +0 -136
  120. package/src/utilities/variable.js +0 -13
  121. package/src/verifier/combinator.js +0 -72
  122. package/src/verifier.js +0 -150
@@ -0,0 +1,634 @@
1
+ "use strict";
2
+
3
+ import ontology from "../ontology";
4
+
5
+ import { nodeQuery } from "../utilities/query";
6
+ import { terminalNodeMapFromNodes, areTerminalNodeMapsEqual, isLastRemainingArgumentFunction } from "../utilities/pass";
7
+
8
+ const nonTerminalNodeQuery = nodeQuery("/*");
9
+
10
+ const typeNodeQuery = nodeQuery("/type"),
11
+ termNodeQuery = nodeQuery("/term"),
12
+ frameNodeQuery = nodeQuery("/frame"),
13
+ metaTypeNodeQuery = nodeQuery("/metaType"),
14
+ statementNodeQuery = nodeQuery("/statement"),
15
+ termVariableNodeQuery = nodeQuery("/term/variable!"),
16
+ statementMetavariableNodeQuery = nodeQuery("/statement/metavariable!"),
17
+ assumptionMetavariableNodeQuery = nodeQuery("/assumption/metavariable!"),
18
+ frameAssumptionMetavariableNodeQuery = nodeQuery("/frame/assumption!/metavariable!");
19
+
20
+ class Pass {
21
+ run(generalNode, specificNode, ...remainingArguments) {
22
+ let success;
23
+
24
+ const visited = this.visitNode(generalNode, specificNode, ...remainingArguments);
25
+
26
+ success = visited; ///
27
+
28
+ return success;
29
+ }
30
+
31
+ descend(generalChildNodes, specificChildNodes, ...remainingArguments) {
32
+ let descendedAhead = false;
33
+
34
+ const generalChildNodesLength = generalChildNodes.length,
35
+ specificChildNodesLength = specificChildNodes.length;
36
+
37
+ if (generalChildNodesLength === specificChildNodesLength) {
38
+ const specificTerminalNodeMap = terminalNodeMapFromNodes(specificChildNodes),
39
+ generalTerminalNodeMap = terminalNodeMapFromNodes(generalChildNodes),
40
+ terminalNodeMapsEqual = areTerminalNodeMapsEqual(generalTerminalNodeMap, specificTerminalNodeMap);
41
+
42
+ if (terminalNodeMapsEqual) {
43
+ const lastRemainingArgumentFunction = isLastRemainingArgumentFunction(remainingArguments);
44
+
45
+ if (lastRemainingArgumentFunction) {
46
+ const index = 0;
47
+
48
+ descendedAhead = this.descendAhead(index, generalChildNodes, specificChildNodes,...remainingArguments);
49
+ } else {
50
+ const visited = generalChildNodes.every((generalChildNode, index) => {
51
+ const specificChildNode = specificChildNodes[index],
52
+ specificNode = specificChildNode, ///
53
+ generalNode = generalChildNode, ///
54
+ visited = this.visitNode(generalNode, specificNode, ...remainingArguments);
55
+
56
+ if (visited) {
57
+ return true;
58
+ }
59
+ });
60
+
61
+ if (visited) {
62
+ descendedAhead = true;
63
+ }
64
+ }
65
+ }
66
+ }
67
+
68
+ return descendedAhead;
69
+ }
70
+
71
+ descendAhead(index, generalChildNodes, specificChildNodes, ...remainingArguments) {
72
+ let descendedAhead = false;
73
+
74
+ const descendAhead = remainingArguments.pop(), ///
75
+ generalChildNodesLength = generalChildNodes.length;
76
+
77
+ if (index === generalChildNodesLength) {
78
+ descendedAhead = descendAhead();
79
+ } else {
80
+ const generalChildNode = generalChildNodes[index],
81
+ specificChildNode = specificChildNodes[index],
82
+ generalNode = generalChildNode, ///
83
+ specificNode = specificChildNode, ///
84
+ visited = this.visitNode(generalNode, specificNode, ...remainingArguments, () => {
85
+ remainingArguments.push(descendAhead); ///
86
+
87
+ const aheadIndex = index + 1,
88
+ descendedAhead = this.descendAhead(aheadIndex, generalChildNodes, specificChildNodes, ...remainingArguments);
89
+
90
+ return descendedAhead;
91
+ });
92
+
93
+ if (visited) {
94
+ descendedAhead = true;
95
+ }
96
+ }
97
+
98
+ return descendedAhead;
99
+ }
100
+
101
+ visitNode(generalNode, specificNode, ...remainingArguments) {
102
+ let visited = false;
103
+
104
+ const generalNodeTerminalNode = generalNode.isTerminalNode(),
105
+ specificNodeTerminalNode = specificNode.isTerminalNode(),
106
+ generalNodeNonTerminalNode = generalNode.isNonTerminalNode(),
107
+ specificNodeNonTerminalNode = specificNode.isNonTerminalNode();
108
+
109
+ if (false) {
110
+ ///
111
+ } else if (generalNodeTerminalNode && specificNodeTerminalNode) {
112
+ const generalTerminalNode = generalNode, ///
113
+ specificTerminalNode = specificNode; ///
114
+
115
+ visited = this.visitTerminalNode(generalTerminalNode, specificTerminalNode, ...remainingArguments);
116
+ } else if (generalNodeNonTerminalNode && specificNodeNonTerminalNode) {
117
+ const generalNonTerminalNode = generalNode, ///
118
+ specificNonTerminalNode = specificNode; ///
119
+
120
+ visited = this.visitNonTerminalNode(generalNonTerminalNode, specificNonTerminalNode, ...remainingArguments);
121
+ }
122
+
123
+ return visited;
124
+ }
125
+
126
+ visitTerminalNode(generalTerminalNode, specificTerminalNode, ...remainingArguments) { ///
127
+ let visited = false;
128
+
129
+ const lastRemainingArgumentFunction = isLastRemainingArgumentFunction(remainingArguments);
130
+
131
+ if (lastRemainingArgumentFunction) {
132
+ const descendAhead = remainingArguments.pop(),
133
+ descendedAhead = descendAhead();
134
+
135
+ if (descendAhead) {
136
+ visited = descendedAhead; ///
137
+ }
138
+
139
+ remainingArguments.push(descendAhead);
140
+ } else {
141
+ visited = true;
142
+ }
143
+
144
+ return visited;
145
+ }
146
+
147
+ visitNonTerminalNode(generalNonTerminalNode, specificNonTerminalNode, ...remainingArguments) {
148
+ let visited = false;
149
+
150
+ let { maps } = this.constructor;
151
+
152
+ maps = [ ///
153
+ ...maps,
154
+ {
155
+ generalNodeQuery: nonTerminalNodeQuery,
156
+ specificNodeQuery: nonTerminalNodeQuery,
157
+ run: (generalNode, specificNode, ...remainingArguments) => {
158
+ let visited = false;
159
+
160
+ const generalNonTerminalNodeRuleName = generalNonTerminalNode.getRuleName(), ///
161
+ specificNonTerminalNodeRuleName = specificNonTerminalNode.getRuleName(); ///
162
+
163
+ if (generalNonTerminalNodeRuleName === specificNonTerminalNodeRuleName) {
164
+ const generalNonTerminalNodeChildNodes = generalNonTerminalNode.getChildNodes(),
165
+ specificNonTerminalNodeChildNodes = specificNonTerminalNode.getChildNodes(),
166
+ generalChildNodes = generalNonTerminalNodeChildNodes, ///
167
+ specificChildNodes = specificNonTerminalNodeChildNodes, ///
168
+ descended = this.descend(generalChildNodes, specificChildNodes, ...remainingArguments);
169
+
170
+ if (descended) {
171
+ visited = true;
172
+ }
173
+ }
174
+
175
+ return visited;
176
+ }
177
+ }
178
+ ]
179
+
180
+ maps.some((map) => {
181
+ const { generalNodeQuery, specificNodeQuery, run } = map;
182
+
183
+ const generalNode = generalNodeQuery(generalNonTerminalNode), ///
184
+ specificNode = specificNodeQuery(specificNonTerminalNode); ///
185
+
186
+ if ((generalNode !== null) && (specificNode !== null)) {
187
+ const success = run(generalNode, specificNode, ...remainingArguments);
188
+
189
+ visited = success; ///
190
+
191
+ return true;
192
+ }
193
+ });
194
+
195
+ return visited;
196
+ }
197
+ }
198
+
199
+ class MetaLevelPass extends Pass {
200
+ static maps = [
201
+ {
202
+ generalNodeQuery: assumptionMetavariableNodeQuery,
203
+ specificNodeQuery: assumptionMetavariableNodeQuery,
204
+ run: (generalAssumptionMetavariableNode, specificAssumptionMetavariableNode, substitutions, generalContext, specificContext) => {
205
+ let success = false;
206
+
207
+ let context,
208
+ metavariableNode;
209
+
210
+ context = generalContext; ///
211
+
212
+ metavariableNode = generalAssumptionMetavariableNode; ///
213
+
214
+ const metavariableName = metavariableNode.getMetavariableName(),
215
+ metavariable = context.findMetavariableByMetavariableName(metavariableName);
216
+
217
+ context = specificContext; ///
218
+
219
+ metavariableNode = specificAssumptionMetavariableNode; ///
220
+
221
+ const reference = context.findReferenceByMetavariableNode(metavariableNode),
222
+ referenceUnifies = metavariable.unifyReference(reference, substitutions, generalContext, specificContext);
223
+
224
+ if (referenceUnifies) {
225
+ success = true;
226
+ }
227
+
228
+ return success;
229
+ }
230
+ },
231
+ {
232
+ generalNodeQuery: statementMetavariableNodeQuery,
233
+ specificNodeQuery: statementNodeQuery,
234
+ run: (generalStatementMetavariableNode, specificStatementNode, substitutions, generalContext, specificContext) => {
235
+ let success = false;
236
+
237
+ let context,
238
+ statementNode;
239
+
240
+ context = generalContext; ///
241
+
242
+ const metavariableNode = generalStatementMetavariableNode, ///
243
+ metavariableName = metavariableNode.getMetavariableName(),
244
+ metavariable = context.findMetavariableByMetavariableName(metavariableName),
245
+ metavariableNodeParentNode = metavariableNode.getParentNode();
246
+
247
+ statementNode = metavariableNodeParentNode; ///
248
+
249
+ const frameSubstitutionNode = statementNode.getFrameSubstitutionNode(),
250
+ termSubstitutionNode = statementNode.getTermSubstitutionNode(),
251
+ substitutionNode = (frameSubstitutionNode || termSubstitutionNode),
252
+ substitution = (substitutionNode !== null) ?
253
+ context.findSubstitutionBySubstitutionNode(substitutionNode) :
254
+ null;
255
+
256
+ context = specificContext; ///
257
+
258
+ statementNode = specificStatementNode; ///
259
+
260
+ const statement = context.findStatementByStatementNode(statementNode),
261
+ statementUnifies = metavariable.unifyStatement(statement, substitution, substitutions, generalContext, specificContext);
262
+
263
+ if (statementUnifies) {
264
+ success = true;
265
+ }
266
+
267
+ return success;
268
+ }
269
+ },
270
+ {
271
+ generalNodeQuery: frameAssumptionMetavariableNodeQuery,
272
+ specificNodeQuery: frameNodeQuery,
273
+ run: (generalFrameAssumptionMetavariableNode, specificFrameNode, substitutions, generalContext, specificContext) => {
274
+ let success = false;
275
+
276
+ const frameNode = specificFrameNode, ///
277
+ metavariableNode = generalFrameAssumptionMetavariableNode, ///
278
+ metavariableName = metavariableNode.getMetavariableName();
279
+
280
+ let context;
281
+
282
+ context = generalContext; ///
283
+
284
+ const metavariable = context.findMetavariableByMetavariableName(metavariableName);
285
+
286
+ context = specificContext; ///
287
+
288
+ const frame = context.findFrameByFrameNode(frameNode),
289
+ frameUnifies = metavariable.unifyFrame(frame, substitutions, generalContext, specificContext);
290
+
291
+ if (frameUnifies) {
292
+ success = true;
293
+ }
294
+
295
+ return success;
296
+ }
297
+ },
298
+ {
299
+ generalNodeQuery: termVariableNodeQuery,
300
+ specificNodeQuery: termNodeQuery,
301
+ run: (generalTermVariableNode, specificTermNode, substitutions, generalContext, specificContext) => {
302
+ let success = false;
303
+
304
+ const termNode = specificTermNode, ///
305
+ variableNode = generalTermVariableNode, ///
306
+ variableIdentifier = variableNode.getVariableIdentifier();
307
+
308
+ let context;
309
+
310
+ context = generalContext; ///
311
+
312
+ const variable = context.findVariableByVariableIdentifier(variableIdentifier);
313
+
314
+ context = specificContext; ///
315
+
316
+ const term = context.findTermByTermNode(termNode),
317
+ termUnifies = variable.unifyTerm(term, substitutions, generalContext, specificContext);
318
+
319
+ if (termUnifies) {
320
+ success = true;
321
+ }
322
+
323
+ return success;
324
+ }
325
+ }
326
+ ];
327
+ }
328
+
329
+ class CombinatorPass extends Pass {
330
+ static maps = [
331
+ {
332
+ generalNodeQuery: metaTypeNodeQuery,
333
+ specificNodeQuery: statementNodeQuery,
334
+ run: (generalMetaTypeNode, specificStatementNode, assignments, stated, generalContext, specificContext) => {
335
+ let success = false;
336
+
337
+ const metaTypeNode = generalMetaTypeNode, ///
338
+ statementNode = specificStatementNode; ///
339
+
340
+ let context;
341
+
342
+ context = generalContext; ///
343
+
344
+ const metaTypeName = metaTypeNode.getMetaTypeName(),
345
+ metaType = context.findMetaTypeByMetaTypeName(metaTypeName);
346
+
347
+ context = specificContext; ///
348
+
349
+ const { Statement } = ontology,
350
+ statement = Statement.fromStatementNode(statementNode, context),
351
+ statementVerifiesGivenType = statement.verifyGivenMetaType(metaType, assignments, stated, context);
352
+
353
+ if (statementVerifiesGivenType) {
354
+ success = true;
355
+ }
356
+
357
+ return success;
358
+ }
359
+ },
360
+ {
361
+ generalNodeQuery: metaTypeNodeQuery,
362
+ specificNodeQuery: frameNodeQuery,
363
+ run: (generalMetaTypeNode, specificFrameNode, assignments, stated, generalContext, specificContext) => {
364
+ let success = false;
365
+
366
+ const metaTypeNode = generalMetaTypeNode, ///
367
+ frameNode = specificFrameNode; ///
368
+
369
+ let context;
370
+
371
+ context = generalContext; ///
372
+
373
+ const metaTypeName = metaTypeNode.getMetaTypeName(),
374
+ metaType = context.findMetaTypeByMetaTypeName(metaTypeName);
375
+
376
+ context = specificContext; ///
377
+
378
+ const { Frame } = ontology,
379
+ frame = Frame.fromFrameNode(frameNode, context),
380
+ frameVerifiesGivenType = frame.verifyGivenMetaType(metaType, assignments, stated, context);
381
+
382
+ if (frameVerifiesGivenType) {
383
+ success = true;
384
+ }
385
+
386
+ return success;
387
+ }
388
+ },
389
+ {
390
+ generalNodeQuery: typeNodeQuery,
391
+ specificNodeQuery: termNodeQuery,
392
+ run: (generalTypeNode, specificTermNode, assignments, stated, generalContext, specificContext) => {
393
+ let success = false;
394
+
395
+ const typeNode = generalTypeNode, ///
396
+ termNode = specificTermNode, ///
397
+ nominalTypeName = typeNode.getNominalTypeName();
398
+
399
+ let context;
400
+
401
+ context = generalContext; ///
402
+
403
+ const type = context.findTypeByNominalTypeName(nominalTypeName);
404
+
405
+ if (type !== null) {
406
+ context = specificContext; ///
407
+
408
+ const { Term } = ontology,
409
+ term = Term.fromTermNode(termNode, context),
410
+ termVerifiesGivenType = term.verifyGivenType(type, generalContext, specificContext);
411
+
412
+ if (termVerifiesGivenType) {
413
+ success = true;
414
+ }
415
+ }
416
+
417
+ return success;
418
+ }
419
+ }
420
+ ];
421
+ }
422
+
423
+ class ConstructorPass extends Pass {
424
+ static maps = [
425
+ {
426
+ generalNodeQuery: typeNodeQuery,
427
+ specificNodeQuery: termNodeQuery,
428
+ run: (generalTypeNode, specificTermNode, generalContext, specificContext) => {
429
+ let success = false;
430
+
431
+ const typeNode = generalTypeNode, ///
432
+ termNode = specificTermNode, ///
433
+ nominalTypeName = typeNode.getNominalTypeName();
434
+
435
+ let context;
436
+
437
+ context = generalContext; ///
438
+
439
+ const type = context.findTypeByNominalTypeName(nominalTypeName);
440
+
441
+ if (type !== null) {
442
+ context = specificContext; ///
443
+
444
+ const { Term } = ontology,
445
+ term = Term.fromTermNode(termNode, context),
446
+ termVerifiesGivenType = term.verifyGivenType(type, generalContext, specificContext);
447
+
448
+ if (termVerifiesGivenType) {
449
+ success = true;
450
+ }
451
+ }
452
+
453
+ return success;
454
+ }
455
+ }
456
+ ];
457
+ }
458
+
459
+ class MetavariablePass extends Pass {
460
+ static maps = [
461
+ {
462
+ generalNodeQuery: typeNodeQuery,
463
+ specificNodeQuery: termNodeQuery,
464
+ run: (generalTypeNode, specificTermNode, generalContext, specificContext) => {
465
+ let success = false;
466
+
467
+ const typeNode = generalTypeNode, ///
468
+ termNode = specificTermNode, ///
469
+ nominalTypeName = typeNode.getNominalTypeName(),
470
+ type = generalContext.findTypeByNominalTypeName(nominalTypeName),
471
+ context = specificContext, ///
472
+ term = context.findTermByTermNode(termNode),
473
+ termVerifiesGivenType = term.verifyGivenType(type, generalContext, specificContext);
474
+
475
+ if (termVerifiesGivenType) {
476
+ success = true;
477
+ }
478
+
479
+ return success;
480
+ }
481
+ }
482
+ ];
483
+ }
484
+
485
+ class IntrinsicLevelPass extends Pass {
486
+ static maps = [
487
+ {
488
+ generalNodeQuery: termVariableNodeQuery,
489
+ specificNodeQuery: termNodeQuery,
490
+ run: (generalTermVariableNode, specificTermNode, substitutions, generalContext, specificContext) => {
491
+ let success = false;
492
+
493
+ const termNode = specificTermNode, ///
494
+ variableNode = generalTermVariableNode, ///
495
+ variableIdentifier = variableNode.getVariableIdentifier();
496
+
497
+ let context;
498
+
499
+ context = generalContext; ///
500
+
501
+ const variable = context.findVariableByVariableIdentifier(variableIdentifier);
502
+
503
+ context = specificContext; ///
504
+
505
+ const term = context.findTermByTermNode(termNode),
506
+ termUnifies = variable.unifyTerm(term, substitutions, generalContext, specificContext);
507
+
508
+ if (termUnifies) {
509
+ success = true;
510
+ }
511
+
512
+ return success;
513
+ }
514
+ }
515
+ ];
516
+ }
517
+
518
+ const metaLevelPass = new MetaLevelPass(),
519
+ combinatorPass = new CombinatorPass(),
520
+ constructorPass = new ConstructorPass(),
521
+ metavariablePass = new MetavariablePass(),
522
+ intrinsicLevelPass = new IntrinsicLevelPass();
523
+
524
+ export function unifyStatement(generalStatement, specificStatement, substitutions, generalContext, specificContext) {
525
+ let statementUnifies = false;
526
+
527
+ const generalStatementNode = generalStatement.getNode(),
528
+ specificStatementNode = specificStatement.getNode(),
529
+ generalNode = generalStatementNode, ///
530
+ specificNode = specificStatementNode, ///
531
+ success = metaLevelPass.run(generalNode, specificNode, substitutions, generalContext, specificContext);
532
+
533
+ if (success) {
534
+ statementUnifies = true;
535
+ }
536
+
537
+ return statementUnifies;
538
+ }
539
+
540
+ export function unifySubstitution(generalSubstitution, specificSubstitution, substitutions, generalContext, specificContext) {
541
+ let substitutionUnifies = false;
542
+
543
+ const generalSubstitutionNode = generalSubstitution.getNode(),
544
+ specificSubstitutionNode = specificSubstitution.getNode(),
545
+ generalNode = generalSubstitutionNode, ///
546
+ specificNode = specificSubstitutionNode, ///
547
+ success = metaLevelPass.run(generalNode, specificNode, substitutions, generalContext, specificContext);
548
+
549
+ if (success) {
550
+ substitutionUnifies = true;
551
+ }
552
+
553
+ return substitutionUnifies;
554
+ }
555
+
556
+ export function unifyMetavariable(generalMetavariable, specificMetavariable, generalContext, specificContext) {
557
+ let metavariableUnifies = false;
558
+
559
+ const generalMetavariableNode = generalMetavariable.getNode(),
560
+ specificMetavariableNode = specificMetavariable.getNode(),
561
+ success = metavariablePass.run(generalMetavariableNode, specificMetavariableNode, generalContext, specificContext);
562
+
563
+ if (success) {
564
+ metavariableUnifies = true;
565
+ }
566
+
567
+ return metavariableUnifies;
568
+ }
569
+
570
+ export function unifyTermWithConstructor(term, constructor, context) {
571
+ let termUnifiesWithConstructor = false;
572
+
573
+ const termNode = term.getNode(),
574
+ generalContext = context, ///
575
+ specificContext = context, ///
576
+ constructorTerm = constructor.getTerm(),
577
+ constructorTermNode = constructorTerm.getNode(),
578
+ success = constructorPass.run(constructorTermNode, termNode, generalContext, specificContext);
579
+
580
+ if (success) {
581
+ termUnifiesWithConstructor = true;
582
+ }
583
+
584
+ return termUnifiesWithConstructor;
585
+ }
586
+
587
+ export function unifyStatementIntrinsically(generalStatement, specificStatement, substitutions, generalContext, specificContext) {
588
+ let statementUnifiesIntrinsically = false;
589
+
590
+ const generalStatementNode = generalStatement.getNode(),
591
+ specificStatementNode = specificStatement.getNode(),
592
+ generalNode = generalStatementNode, ///
593
+ specificNode = specificStatementNode, ///
594
+ success = intrinsicLevelPass.run(generalNode, specificNode, substitutions, generalContext, specificContext);
595
+
596
+ if (success) {
597
+ statementUnifiesIntrinsically = true;
598
+ }
599
+
600
+ return statementUnifiesIntrinsically;
601
+ }
602
+
603
+ export function unifyStatementWithCombinator(statement, combinator, assignments, stated, context) {
604
+ let statementUnifiesWithCombinator = false;
605
+
606
+ const statementNode = statement.getNode(),
607
+ generalContext = context, ///
608
+ specificContext = context, ///
609
+ combinatorStatement = combinator.getStatement(),
610
+ combinatorStatementNode = combinatorStatement.getNode(),
611
+ success = combinatorPass.run(combinatorStatementNode, statementNode, assignments, stated, generalContext, specificContext);
612
+
613
+ if (success) {
614
+ statementUnifiesWithCombinator = true;
615
+ }
616
+
617
+ return statementUnifiesWithCombinator;
618
+ }
619
+
620
+ export function unifyMetavariableIntrinsically(generalMetavariable, specificMetavariable, substitutions, generalContext, specificContext) {
621
+ let metavariableUnifiesIntrinsically = false;
622
+
623
+ const generalMetavariableNode = generalMetavariable.getNode(),
624
+ specificMetavariableNode = specificMetavariable.getNode(),
625
+ generalNode = generalMetavariableNode, ///
626
+ specificNode = specificMetavariableNode, ///
627
+ success = intrinsicLevelPass.run(generalNode, specificNode, substitutions, generalContext, specificContext);
628
+
629
+ if (success) {
630
+ metavariableUnifiesIntrinsically = true;
631
+ }
632
+
633
+ return metavariableUnifiesIntrinsically;
634
+ }