occam-verify-cli 0.0.942 → 0.0.943

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 (93) hide show
  1. package/lib/conclusion.js +3 -4
  2. package/lib/consequent.js +3 -4
  3. package/lib/constants.js +5 -1
  4. package/lib/context/file.js +1 -1
  5. package/lib/context/local.js +15 -5
  6. package/lib/metavariable.js +12 -4
  7. package/lib/premise.js +11 -12
  8. package/lib/proofStep.js +13 -18
  9. package/lib/rule.js +5 -38
  10. package/lib/substitution/statementForMetavariable.js +15 -1
  11. package/lib/substitution/termForVariable.js +15 -1
  12. package/lib/substitutions.js +32 -10
  13. package/lib/supposition.js +11 -12
  14. package/lib/topLevelAssertion.js +5 -38
  15. package/lib/unifier/equality.js +6 -8
  16. package/lib/unifier/metaLevel.js +7 -10
  17. package/lib/unifier/statementAgainstCombinator.js +6 -9
  18. package/lib/unifier/termAgainstConstructor.js +5 -5
  19. package/lib/unifier.js +34 -13
  20. package/lib/unify/conclusionAgainstStatement.js +34 -0
  21. package/lib/unify/consequentAgainstStatement.js +34 -0
  22. package/lib/unify/metavariableAgainstStatement.js +23 -15
  23. package/lib/unify/premiseAgainstProofStep.js +41 -0
  24. package/lib/unify/premisesAgainstProofSteps.js +31 -0
  25. package/lib/unify/statementAgainstMetaType.js +5 -9
  26. package/lib/unify/suppositionAgainstProofStep.js +41 -0
  27. package/lib/unify/suppositionsAgainstProofSteps.js +31 -0
  28. package/lib/unify/termAgainstTerm.js +4 -5
  29. package/lib/unify/termAgainstType.js +7 -7
  30. package/lib/unify/variableAgainstTerm.js +11 -27
  31. package/lib/utilities/arguments.js +27 -0
  32. package/lib/utilities/array.js +5 -2
  33. package/lib/utilities/unify.js +19 -0
  34. package/lib/verifier/metaLevel.js +8 -11
  35. package/lib/verifier/statementAsCombinator.js +13 -22
  36. package/lib/verifier/topLevel.js +3 -6
  37. package/lib/verifier.js +28 -8
  38. package/lib/verify/assertion/type.js +3 -7
  39. package/lib/verify/declaration/metavariable.js +1 -1
  40. package/lib/verify/equality.js +3 -7
  41. package/lib/verify/metavariable.js +26 -63
  42. package/lib/verify/statement/qualified.js +54 -54
  43. package/lib/verify/statement/unqualified.js +2 -2
  44. package/lib/verify/statement.js +35 -30
  45. package/lib/verify/term.js +26 -32
  46. package/lib/verify/variable.js +3 -4
  47. package/package.json +1 -1
  48. package/src/conclusion.js +2 -6
  49. package/src/consequent.js +2 -6
  50. package/src/constants.js +1 -0
  51. package/src/context/file.js +5 -5
  52. package/src/context/local.js +20 -9
  53. package/src/metavariable.js +1 -1
  54. package/src/premise.js +18 -24
  55. package/src/proofStep.js +15 -20
  56. package/src/rule.js +11 -65
  57. package/src/substitution/statementForMetavariable.js +16 -0
  58. package/src/substitution/termForVariable.js +16 -0
  59. package/src/substitutions.js +47 -7
  60. package/src/supposition.js +18 -24
  61. package/src/topLevelAssertion.js +11 -65
  62. package/src/unifier/equality.js +7 -8
  63. package/src/unifier/metaLevel.js +6 -10
  64. package/src/unifier/statementAgainstCombinator.js +9 -9
  65. package/src/unifier/termAgainstConstructor.js +6 -4
  66. package/src/unifier.js +35 -11
  67. package/src/unify/conclusionAgainstStatement.js +34 -0
  68. package/src/unify/consequentAgainstStatement.js +34 -0
  69. package/src/unify/metavariableAgainstStatement.js +32 -22
  70. package/src/unify/premiseAgainstProofStep.js +54 -0
  71. package/src/unify/premisesAgainstProofSteps.js +23 -0
  72. package/src/unify/statementAgainstMetaType.js +3 -11
  73. package/src/unify/suppositionAgainstProofStep.js +54 -0
  74. package/src/unify/suppositionsAgainstProofSteps.js +23 -0
  75. package/src/unify/termAgainstTerm.js +3 -7
  76. package/src/unify/termAgainstType.js +5 -6
  77. package/src/unify/variableAgainstTerm.js +17 -47
  78. package/src/utilities/arguments.js +18 -0
  79. package/src/utilities/array.js +1 -1
  80. package/src/utilities/unify.js +18 -0
  81. package/src/verifier/metaLevel.js +7 -11
  82. package/src/verifier/statementAsCombinator.js +15 -28
  83. package/src/verifier/topLevel.js +13 -17
  84. package/src/verifier.js +28 -6
  85. package/src/verify/assertion/type.js +2 -6
  86. package/src/verify/declaration/metavariable.js +9 -9
  87. package/src/verify/equality.js +2 -6
  88. package/src/verify/metavariable.js +31 -91
  89. package/src/verify/statement/qualified.js +53 -53
  90. package/src/verify/statement/unqualified.js +1 -1
  91. package/src/verify/statement.js +37 -31
  92. package/src/verify/term.js +25 -31
  93. package/src/verify/variable.js +2 -4
@@ -2,7 +2,7 @@
2
2
 
3
3
  import StatementForMetavariableSubstitution from "./substitution/statementForMetavariable";
4
4
 
5
- import { prune, compare } from "./utilities/array";
5
+ import { prune, compare, rightDifference } from "./utilities/array";
6
6
 
7
7
  export default class Substitutions {
8
8
  constructor(array, savedArray) {
@@ -31,9 +31,16 @@ export default class Substitutions {
31
31
 
32
32
  everySubstitution(callback) { return this.array.every(callback); }
33
33
 
34
- addSubstitution(substitution) { this.array.push(substitution); }
34
+ addSubstitution(substitution, localContextA, localContextB) {
35
+ this.array.push(substitution);
35
36
 
36
- removeSubstitution(substitution) {
37
+ const substitutionNode = substitution.getNode(),
38
+ substitutionString = substitution.asString(localContextA, localContextB);
39
+
40
+ localContextB.trace(`Added the '${substitutionString}' substitution.`, substitutionNode);
41
+ }
42
+
43
+ removeSubstitution(substitution, localContextA, localContextB) {
37
44
  const substitutionA = substitution; ///
38
45
 
39
46
  prune(this.array, (substitution) => {
@@ -43,6 +50,30 @@ export default class Substitutions {
43
50
  return true;
44
51
  }
45
52
  });
53
+
54
+ const substitutionNode = substitution.getNode(),
55
+ substitutionString = substitution.asString(localContextA, localContextB);
56
+
57
+ localContextB.trace(`Removed the '${substitutionString}' substitution.`, substitutionNode);
58
+ }
59
+
60
+ unifyAgainstEquivalences(equivalences, localContextA, localContextB) {
61
+ const substitutions = this, ///
62
+ unifiedAgainstEquivalences = this.everySubstitution((substitution) => {
63
+ const substitutionUnified = equivalences.some((equivalence) => {
64
+ const substitutionUnifiedAgainstEquivalence = substitution.unifyAgainstEquivalence(equivalence, substitutions, localContextA, localContextB);
65
+
66
+ if (substitutionUnifiedAgainstEquivalence) {
67
+ return true;
68
+ }
69
+ });
70
+
71
+ if (substitutionUnified) {
72
+ return true;
73
+ }
74
+ });
75
+
76
+ return unifiedAgainstEquivalences;
46
77
  }
47
78
 
48
79
  snapshot() {
@@ -51,11 +82,20 @@ export default class Substitutions {
51
82
  ];
52
83
  }
53
84
 
54
- rollback() {
55
- const start = 0,
56
- end = Infinity;
85
+ rollback(localContextA, localContextB) {
86
+ const array = [
87
+ ...this.array
88
+ ];
89
+
90
+ rightDifference(this.savedArray, array);
91
+
92
+ array.forEach((substitution) => {
93
+ this.removeSubstitution(substitution, localContextA, localContextB);
94
+ });
57
95
 
58
- this.array.splice(start, end, ...this.savedArray);
96
+ this.array = [
97
+ ...this.savedArray
98
+ ];
59
99
 
60
100
  this.savedArray = null;
61
101
  }
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
 
3
- import LocalContext from "./context/local";
4
3
  import metaLevelUnifier from "./unifier/metaLevel";
5
4
 
6
5
  import { match } from "./utilities/array";
@@ -22,15 +21,12 @@ export default class Supposition {
22
21
  return this.statementNode;
23
22
  }
24
23
 
25
- unifyStatement(statementNode, substitutions, fileContext, localContext) {
24
+ unifyStatement(statementNodeB, substitutions, localContextA, localContextB) {
26
25
  let statementUnified = false;
27
26
 
28
27
  if (this.statementNode !== null) {
29
28
  const nodeA = this.statementNode, ///
30
- nodeB = statementNode, ///
31
- fileContextA = fileContext, ///
32
- localContextA = LocalContext.fromFileContext(fileContextA),
33
- localContextB = localContext, ///
29
+ nodeB = statementNodeB, ///
34
30
  unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
35
31
 
36
32
  statementUnified = unified; ///
@@ -39,27 +35,25 @@ export default class Supposition {
39
35
  return statementUnified;
40
36
  }
41
37
 
42
- unifySubproof(subproofNode, substitutions, fileContext, localContext) {
38
+ unifySubproof(subproofNodeB, substitutions, localContextA, localContextB) {
43
39
  let subproofUnified = false;
44
40
 
45
41
  if (this.statementNode !== null) {
46
- const subproofAssertionNode = subproofAssertionNodeQuery(this.statementNode);
47
-
48
- if (subproofAssertionNode !== null) {
49
- const fileContextA = fileContext, ///
50
- localContextB = localContext, ///
51
- subproofSuppositionStatementNodes = subproofSuppositionStatementNodesQuery(subproofNode),
52
- subproofLastProofStepStatementNode = subproofLastProofStepStatementNodeQuery(subproofNode),
53
- subproofStatementNodes = [
54
- ...subproofSuppositionStatementNodes,
55
- subproofLastProofStepStatementNode
56
- ],
57
- subproofAssertionStatementNodes = subproofAssertionStatementNodesQuery(subproofAssertionNode);
58
-
59
- subproofUnified = match(subproofAssertionStatementNodes, subproofStatementNodes, (subproofAssertionStatementNode, subproofStatementNode) => {
60
- const localContextA = LocalContext.fromFileContext(fileContextA),
61
- nodeA = subproofAssertionStatementNode, ///
62
- nodeB = subproofStatementNode, ///
42
+ const statementNodeA = this.statementNode,
43
+ subproofAssertionNodeA = subproofAssertionNodeQuery(statementNodeA); ///
44
+
45
+ if (subproofAssertionNodeA !== null) {
46
+ const subproofAssertionStatementNodesA = subproofAssertionStatementNodesQuery(subproofAssertionNodeA), ///
47
+ subproofSuppositionStatementNodesB = subproofSuppositionStatementNodesQuery(subproofNodeB), ///
48
+ subproofLastProofStepStatementNodeB = subproofLastProofStepStatementNodeQuery(subproofNodeB), ///
49
+ subproofStatementNodesB = [
50
+ ...subproofSuppositionStatementNodesB,
51
+ subproofLastProofStepStatementNodeB
52
+ ];
53
+
54
+ subproofUnified = match(subproofAssertionStatementNodesA, subproofStatementNodesB, (subproofAssertionStatementNodeA, subproofStatementNodeB) => {
55
+ const nodeA = subproofAssertionStatementNodeA, ///
56
+ nodeB = subproofStatementNodeB, ///
63
57
  unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
64
58
 
65
59
  if (unified) {
@@ -4,8 +4,8 @@ import Label from "./label";
4
4
  import Consequent from "./consequent";
5
5
  import Supposition from "./supposition";
6
6
  import Substitutions from "./substitutions";
7
-
8
- import { reverse, correlate } from "./utilities/array";
7
+ import unifyConsequentAgainstStatement from "./unify/consequentAgainstStatement";
8
+ import unifySuppositionsAgainstProofSteps from "./unify/suppositionsAgainstProofSteps";
9
9
 
10
10
  export default class TopLevelAssertion {
11
11
  constructor(labels, suppositions, consequent, substitutions, fileContext) {
@@ -39,12 +39,17 @@ export default class TopLevelAssertion {
39
39
  unifyStatement(statementNode, localContext) {
40
40
  let statementUnified = false;
41
41
 
42
- const proofSteps = localContext.getProofSteps(),
43
- substitutions = Substitutions.fromNothing(),
44
- suppositionsUnified = unifySuppositions(this.suppositions, proofSteps, substitutions, this.fileContext, localContext);
42
+ const substitutions = Substitutions.fromNothing(),
43
+ proofSteps = localContext.getProofSteps(),
44
+ proofStepsB = proofSteps, ///
45
+ fileContextA = this.fileContext, ///
46
+ suppositionsA = this.suppositions, ///
47
+ localContextB = localContext, ///
48
+ suppositionsUnified = unifySuppositionsAgainstProofSteps(suppositionsA, proofStepsB, substitutions, fileContextA, localContextB);
45
49
 
46
50
  if (suppositionsUnified) {
47
- const consequentUnified = unifyConsequent(this.consequent, statementNode, substitutions, this.fileContext, localContext);
51
+ const consequentA = this.consequent, ///
52
+ consequentUnified = unifyConsequentAgainstStatement(consequentA, statementNode, substitutions, fileContextA, localContext);
48
53
 
49
54
  statementUnified = consequentUnified; ///
50
55
  }
@@ -131,62 +136,3 @@ export default class TopLevelAssertion {
131
136
 
132
137
  static fromLabelsSuppositionsConsequentSubstitutionsAndFileContext(Class, labels, suppositions, consequent, substitutions, fileContext) { return new Class(labels, suppositions, consequent, substitutions, fileContext); }
133
138
  }
134
-
135
- function unifySuppositions(suppositions, proofSteps, substitutions, fileContext, localContext) {
136
- suppositions = reverse(suppositions); ///
137
-
138
- proofSteps = reverse(proofSteps); ///
139
-
140
- const suppositionsUnified = correlate(suppositions, proofSteps, (supposition, proofStep) => {
141
- const suppositionUnified = unifySupposition(supposition, proofStep, substitutions, fileContext, localContext);
142
-
143
- if (suppositionUnified) {
144
- return true;
145
- }
146
- });
147
-
148
- return suppositionsUnified;
149
- }
150
-
151
- function unifySupposition(supposition, proofStep, substitutions, fileContext, localContext) {
152
- let suppositionUnified = false;
153
-
154
- substitutions.snapshot();
155
-
156
- const subproofNode = proofStep.getSubproofNode(),
157
- statementNode = proofStep.getStatementNode();
158
-
159
- if (subproofNode !== null) {
160
- const subproofUnified = supposition.unifySubproof(subproofNode, substitutions, fileContext, localContext);
161
-
162
- suppositionUnified = subproofUnified; ///
163
- }
164
-
165
- if (statementNode !== null) {
166
- const statementUnified = supposition.unifyStatement(statementNode, substitutions, fileContext, localContext);
167
-
168
- suppositionUnified = statementUnified; ///
169
- }
170
-
171
- suppositionUnified ?
172
- substitutions.continue() :
173
- substitutions.rollback();
174
-
175
- return suppositionUnified;
176
- }
177
-
178
- function unifyConsequent(consequent, statementNode, substitutions, fileContext, localContext) {
179
- let consequentUnified;
180
-
181
- substitutions.snapshot();
182
-
183
- const statementUnified = consequent.unifyStatement(statementNode, substitutions, fileContext, localContext);
184
-
185
- consequentUnified = statementUnified; ///
186
-
187
- consequentUnified ?
188
- substitutions.continue() :
189
- substitutions.rollback();
190
-
191
- return consequentUnified;
192
- }
@@ -13,11 +13,7 @@ class EqualityUnifier extends Unifier {
13
13
 
14
14
  const nonTerminalNodeA = leftTermNode, ///
15
15
  nonTerminalNodeB = rightTermNode, ///
16
- nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext, () => {
17
- const unifiedAhead = true;
18
-
19
- return unifiedAhead;
20
- });
16
+ nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext);
21
17
 
22
18
  equalityUnified = nonTerminalNodeUnified; ///
23
19
 
@@ -28,10 +24,13 @@ class EqualityUnifier extends Unifier {
28
24
  {
29
25
  nodeQueryA: termNodeQuery,
30
26
  nodeQueryB: termNodeQuery,
31
- unify: (termNodeA, termNodeB, localContext, unifyAhead) => {
27
+ unify: (termNodeA, termNodeB, localContext) => {
32
28
  let termVerifiedAgainstTerm;
33
29
 
34
- termVerifiedAgainstTerm = unifyTermAgainstTerm(termNodeA, termNodeB, localContext, unifyAhead);
30
+ const leftTermNode = termNodeA, ///
31
+ rightTermNode = termNodeB; ///
32
+
33
+ termVerifiedAgainstTerm = unifyTermAgainstTerm(leftTermNode, rightTermNode, localContext);
35
34
 
36
35
  if (!termVerifiedAgainstTerm) {
37
36
  const nonTerminalNodeA = termNodeA, ///
@@ -40,7 +39,7 @@ class EqualityUnifier extends Unifier {
40
39
  nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
41
40
  childNodesA = nonTerminalNodeAChildNodes, ///
42
41
  childNodesB = nonTerminalNodeBChildNodes, ///
43
- childNodesVerified = equalityUnifier.unifyChildNodes(childNodesA, childNodesB, localContext, unifyAhead);
42
+ childNodesVerified = equalityUnifier.unifyChildNodes(childNodesA, childNodesB, localContext);
44
43
 
45
44
  termVerifiedAgainstTerm = childNodesVerified; ///
46
45
  }
@@ -19,11 +19,7 @@ class MetaLevelUnifier extends Unifier {
19
19
 
20
20
  const nonTerminalNodeA = nodeA, ///
21
21
  nonTerminalNodeB = nodeB, ///
22
- nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, () => {
23
- const unifiedAhead = true;
24
-
25
- return unifiedAhead;
26
- });
22
+ nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB);
27
23
 
28
24
  unified = nonTerminalNodeUnified; ///
29
25
 
@@ -34,14 +30,14 @@ class MetaLevelUnifier extends Unifier {
34
30
  {
35
31
  nodeQueryA: statementNodeQuery,
36
32
  nodeQueryB: statementNodeQuery,
37
- unify: (statementNodeA, statementNodeB, substitutions, localContextA, localContextB, unifyAhead) => {
33
+ unify: (statementNodeA, statementNodeB, substitutions, localContextA, localContextB) => {
38
34
  let statementVerifiedAgainstStatement;
39
35
 
40
36
  const metavariableNodeA = metavariableNodeQuery(statementNodeA);
41
37
 
42
38
  if (metavariableNodeA !== null) {
43
39
  const substitutionNodeA = substitutionNodeQuery(statementNodeA),
44
- metavariableUnifiedAgainstStatement = unifyMetavariableAgainstStatement(metavariableNodeA, statementNodeB, substitutionNodeA, substitutions, localContextA, localContextB, unifyAhead);
40
+ metavariableUnifiedAgainstStatement = unifyMetavariableAgainstStatement(metavariableNodeA, statementNodeB, substitutionNodeA, substitutions, localContextA, localContextB);
45
41
 
46
42
  statementVerifiedAgainstStatement = metavariableUnifiedAgainstStatement; ///
47
43
  } else {
@@ -51,7 +47,7 @@ class MetaLevelUnifier extends Unifier {
51
47
  nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
52
48
  childNodesA = nonTerminalNodeAChildNodes, ///
53
49
  childNodesB = nonTerminalNodeBChildNodes, ///
54
- childNodesVerified = metaLevelUnifier.unifyChildNodes(childNodesA, childNodesB, substitutions, localContextA, localContextB, unifyAhead);
50
+ childNodesVerified = metaLevelUnifier.unifyChildNodes(childNodesA, childNodesB, substitutions, localContextA, localContextB);
55
51
 
56
52
  statementVerifiedAgainstStatement = childNodesVerified; ///
57
53
  }
@@ -62,9 +58,9 @@ class MetaLevelUnifier extends Unifier {
62
58
  {
63
59
  nodeQueryA: termVariableNodeQuery,
64
60
  nodeQueryB: termNodeQuery,
65
- unify: (termVariableNodeA, termNodeB, substitutions, localContextA, localContextB, unifyAhead) => {
61
+ unify: (termVariableNodeA, termNodeB, substitutions, localContextA, localContextB) => {
66
62
  const variableNodeA = termVariableNodeA, ///
67
- variableUnifiedAgainstTerm = unifyVariableAgainstTerm(variableNodeA, termNodeB, substitutions, localContextA, localContextB, unifyAhead);
63
+ variableUnifiedAgainstTerm = unifyVariableAgainstTerm(variableNodeA, termNodeB, substitutions, localContextA, localContextB);
68
64
 
69
65
  return variableUnifiedAgainstTerm;
70
66
  }
@@ -17,11 +17,7 @@ class StatementAgainstCombinatorUnifier extends Unifier {
17
17
 
18
18
  const nonTerminalNodeA = statementNode, ///
19
19
  nonTerminalNodeB = combinatorStatementNode, ///
20
- nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext, () => {
21
- const unifiedAhead = true;
22
-
23
- return unifiedAhead;
24
- });
20
+ nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext);
25
21
 
26
22
  statementUnifiedAgainstCombinator = nonTerminalNodeUnified; ///
27
23
 
@@ -32,8 +28,10 @@ class StatementAgainstCombinatorUnifier extends Unifier {
32
28
  {
33
29
  nodeQueryA: statementNodeQuery,
34
30
  nodeQueryB: metaTypeNodeQuery,
35
- unify: (statementNodeA, metaTypeNodeB, localContext, unifyAhead) => {
36
- const statementUnifiedAgainstMetaType = unifyStatementAgainstMetaType(statementNodeA, metaTypeNodeB, localContext, unifyAhead);
31
+ unify: (statementNodeA, metaTypeNodeB, localContext) => {
32
+ const metaTypeNode = metaTypeNodeB, ///
33
+ statementNode = statementNodeA, ///
34
+ statementUnifiedAgainstMetaType = unifyStatementAgainstMetaType(statementNode, metaTypeNode, localContext);
37
35
 
38
36
  return statementUnifiedAgainstMetaType;
39
37
  }
@@ -41,8 +39,10 @@ class StatementAgainstCombinatorUnifier extends Unifier {
41
39
  {
42
40
  nodeQueryA: termNodeQuery,
43
41
  nodeQueryB: typeNodeQuery,
44
- unify: (termNodeA, typeNodeB, localContext, unifyAhead) => {
45
- const termUnifiedAgainstType = unifyTermAgainstType(termNodeA, typeNodeB, localContext, unifyAhead);
42
+ unify: (termNodeA, typeNodeB, localContext) => {
43
+ const termNode = termNodeA, ///
44
+ typeNode = typeNodeB, ///
45
+ termUnifiedAgainstType = unifyTermAgainstType(termNode, typeNode, localContext);
46
46
 
47
47
  return termUnifiedAgainstType;
48
48
  }
@@ -9,12 +9,12 @@ const termNodeQuery = nodeQuery("/term"),
9
9
  typeNodeQuery = nodeQuery("/type");
10
10
 
11
11
  class TermAgainstConstructorUnifier extends Unifier {
12
- unify(termNode, constructorTermNode, localContext, unifyAhead) {
12
+ unify(termNode, constructorTermNode, localContext) {
13
13
  let termUnifiedAgainstConstructor;
14
14
 
15
15
  const nonTerminalNodeA = termNode, ///
16
16
  nonTerminalNodeB = constructorTermNode, ///
17
- nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext, unifyAhead);
17
+ nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext);
18
18
 
19
19
  termUnifiedAgainstConstructor = nonTerminalNodeUnified; ///
20
20
 
@@ -25,8 +25,10 @@ class TermAgainstConstructorUnifier extends Unifier {
25
25
  {
26
26
  nodeQueryA: termNodeQuery,
27
27
  nodeQueryB: typeNodeQuery,
28
- unify: (termNodeA, typeNodeB, localContext, unifyAhead) => {
29
- const termUnifiedAgainstType = unifyTermAgainstType(termNodeA, typeNodeB, localContext, unifyAhead);
28
+ unify: (termNodeA, typeNodeB, localContext) => {
29
+ const termNode = termNodeA, ///
30
+ typeNode = typeNodeB, ///
31
+ termUnifiedAgainstType = unifyTermAgainstType(termNode, typeNode, localContext);
30
32
 
31
33
  return termUnifiedAgainstType;
32
34
  }
package/src/unifier.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { nodeQuery } from "./utilities/query";
4
4
  import { terminalNodeMapFromNodes, areTerminalNodeMapsEqual } from "./utilities/unifier";
5
+ import {isLastRemainingArgumentFunction} from "./utilities/arguments";
5
6
 
6
7
  const nonTerminalNodeQuery = nodeQuery("/*");
7
8
 
@@ -55,10 +56,25 @@ export default class Unifier {
55
56
  terminalNodeMapsEqual = areTerminalNodeMapsEqual(childTerminalNodeMapA, childTerminalNodeMapB);
56
57
 
57
58
  if (terminalNodeMapsEqual) {
58
- const index = 0,
59
- childNodesVerifyAhead = this.unifyChildNodesAhead(index, childNodesA, childNodesB, ...remainingArguments);
60
-
61
- childNodesUnified = childNodesVerifyAhead; ///
59
+ const lastRemainingArgumentFunction = isLastRemainingArgumentFunction(remainingArguments);
60
+
61
+ if (lastRemainingArgumentFunction) {
62
+ const index = 0,
63
+ childNodesUnifiedAhead = this.unifyChildNodesAhead(index, childNodesA, childNodesB,...remainingArguments);
64
+
65
+ childNodesUnified = childNodesUnifiedAhead; ///
66
+ } else {
67
+ childNodesUnified = childNodesA.every((childNodeA, index) => {
68
+ const childNodeB = childNodesB[index],
69
+ nodeA = childNodeA, ///
70
+ nodeB = childNodeB, ///
71
+ nodeUnified = this.unifyNode(nodeA, nodeB, ...remainingArguments);
72
+
73
+ if (nodeUnified) {
74
+ return true;
75
+ }
76
+ });
77
+ }
62
78
  }
63
79
  }
64
80
 
@@ -68,10 +84,18 @@ export default class Unifier {
68
84
  unifyTerminalNode(terminalNodeA, terminalNodeB, ...remainingArguments) { ///
69
85
  let terminalNodeUnified;
70
86
 
71
- const unifyAhead = remainingArguments.pop(),
72
- unifyiedAhead = unifyAhead();
87
+ const lastRemainingArgumentFunction = isLastRemainingArgumentFunction(remainingArguments);
88
+
89
+ if (lastRemainingArgumentFunction) {
90
+ const unifyAhead = remainingArguments.pop(),
91
+ unifiedAhead = unifyAhead();
73
92
 
74
- terminalNodeUnified = unifyiedAhead; ///
93
+ terminalNodeUnified = unifiedAhead; ///
94
+
95
+ remainingArguments.push(unifiedAhead);
96
+ } else {
97
+ terminalNodeUnified = true;
98
+ }
75
99
 
76
100
  return terminalNodeUnified;
77
101
  }
@@ -134,9 +158,9 @@ export default class Unifier {
134
158
  childNodesALength = childNodesA.length;
135
159
 
136
160
  if (index === childNodesALength) {
137
- const unifyiedAhead = unifyAhead();
161
+ const unifiedAhead = unifyAhead();
138
162
 
139
- childNodesUnified = unifyiedAhead; ///
163
+ childNodesUnified = unifiedAhead; ///
140
164
  } else {
141
165
  const childNodeA = childNodesA[index],
142
166
  childNodeB = childNodesB[index],
@@ -146,9 +170,9 @@ export default class Unifier {
146
170
  remainingArguments.push(unifyAhead); ///
147
171
 
148
172
  const aheadIndex = index + 1,
149
- childNodesVerifyAhead = this.unifyChildNodesAhead(aheadIndex, childNodesA, childNodesB, ...remainingArguments);
173
+ childNodesUnifiedAhead = this.unifyChildNodesAhead(aheadIndex, childNodesA, childNodesB, ...remainingArguments);
150
174
 
151
- return childNodesVerifyAhead;
175
+ return childNodesUnifiedAhead;
152
176
  });
153
177
 
154
178
  childNodesUnified = nodeUnified; ///
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ import LocalContext from "../context/local";
4
+
5
+ export default function unifyConclusionAgainstStatement(conclusionA, statementNodeB, substitutions, fileContextA, localContextB) {
6
+ let conclusionUnified = false;
7
+
8
+ const conclusionAStatementNode = conclusionA.getStatementNode();
9
+
10
+ if (conclusionAStatementNode !== null) {
11
+ const localContextA = LocalContext.fromFileContext(fileContextA),
12
+ statementNodeA = conclusionAStatementNode, ///
13
+ statementStringA = localContextA.nodeAsString(statementNodeA),
14
+ statementStringB = localContextB.nodeAsString(statementNodeB);
15
+
16
+ substitutions.snapshot();
17
+
18
+ localContextB.trace(`Unifying the '${statementStringB}' statement against the conclusion's '${statementStringA}' statement...`, statementNodeB);
19
+
20
+ const statementUnified = conclusionA.unifyStatement(statementNodeB, substitutions, localContextA, localContextB);
21
+
22
+ conclusionUnified = statementUnified; ///
23
+
24
+ conclusionUnified ?
25
+ substitutions.continue() :
26
+ substitutions.rollback(localContextA, localContextB);
27
+
28
+ if (conclusionUnified) {
29
+ localContextB.debug(`...unified the '${statementStringB}' statement against the conclusion's '${statementStringA}' statement.`, statementNodeB);
30
+ }
31
+ }
32
+
33
+ return conclusionUnified;
34
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ import LocalContext from "../context/local";
4
+
5
+ export default function unifyConsequentAgainstStatement(consequentA, statementNodeB, substitutions, fileContextA, localContextB) {
6
+ let consequentUnified = false;
7
+
8
+ const consequentAStatementNode = consequentA.getStatementNode();
9
+
10
+ if (consequentAStatementNode !== null) {
11
+ const localContextA = LocalContext.fromFileContext(fileContextA),
12
+ statementNodeA = consequentAStatementNode, ///
13
+ statementStringA = localContextA.nodeAsString(statementNodeA),
14
+ statementStringB = localContextB.nodeAsString(statementNodeB);
15
+
16
+ substitutions.snapshot();
17
+
18
+ localContextB.trace(`Unifying the '${statementStringB}' statement against the consequent's '${statementStringA}' statement...`, statementNodeB);
19
+
20
+ const statementUnified = consequentA.unifyStatement(statementNodeB, substitutions, localContextA, localContextB);
21
+
22
+ consequentUnified = statementUnified; ///
23
+
24
+ consequentUnified ?
25
+ substitutions.continue() :
26
+ substitutions.rollback(localContextA, localContextB);
27
+
28
+ if (consequentUnified) {
29
+ localContextB.debug(`...unified the '${statementStringB}' statement against the consequent's '${statementStringA}' statement.`, statementNodeB);
30
+ }
31
+ }
32
+
33
+ return consequentUnified;
34
+ }
@@ -4,7 +4,11 @@ import TermForVariableSubstitution from "../substitution/termForVariable";
4
4
  import unifyStatementAgainstStatement from "../unify/statementAtainstStatement";
5
5
  import StatementForMetavariableSubstitution from "../substitution/statementForMetavariable";
6
6
 
7
- export default function unifyMetavariableAgainstStatement(metavariableNodeA, statementNodeB, substitutionNodeA, substitutions, localContextA, localContextB, unifyAhead) {
7
+ import { nodeQuery } from "../utilities/query";
8
+
9
+ const metavariableNodeQuery = nodeQuery("/statement/metavariable");
10
+
11
+ export default function unifyMetavariableAgainstStatement(metavariableNodeA, statementNodeB, substitutionNodeA, substitutions, localContextA, localContextB) {
8
12
  let metavariableUnifiedAgainstStatement = false;
9
13
 
10
14
  const substitution = substitutions.findSubstitution((substitution) => {
@@ -27,9 +31,7 @@ export default function unifyMetavariableAgainstStatement(metavariableNodeA, sta
27
31
  statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, substitution, substitutions, localContext, localContext);
28
32
 
29
33
  if (statementUnifiedAgainstStatement) {
30
- const unifiedAhead = unifyAhead();
31
-
32
- metavariableUnifiedAgainstStatement = unifiedAhead; ///
34
+ metavariableUnifiedAgainstStatement = true;
33
35
  }
34
36
  } else {
35
37
  const substitutionSubstitution = substitution.getSubstitution();
@@ -44,39 +46,47 @@ export default function unifyMetavariableAgainstStatement(metavariableNodeA, sta
44
46
  statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, substitution, substitutions, localContext, localContext);
45
47
 
46
48
  if (statementUnifiedAgainstStatement) {
47
- const unifiedAhead = unifyAhead();
48
-
49
- metavariableUnifiedAgainstStatement = unifiedAhead; ///
49
+ metavariableUnifiedAgainstStatement = true;
50
50
  }
51
51
  } else {
52
52
  const substitutionMatchesStatementNodeB = substitution.matchStatementNode(statementNodeB);
53
53
 
54
54
  if (substitutionMatchesStatementNodeB) {
55
- const unifiedAhead = unifyAhead();
56
-
57
- metavariableUnifiedAgainstStatement = unifiedAhead; ///
55
+ metavariableUnifiedAgainstStatement = true;
58
56
  }
59
57
  }
60
58
  }
61
59
  } else {
62
- let unifiedAhead;
60
+ const metavariableA = localContextA.findMetavariableByMetavariableNode(metavariableNodeA);
63
61
 
64
- const statementNode = statementNodeB, ///
65
- substitutionNode = substitutionNodeA, ///
66
- metavariableNode = metavariableNodeA, ///
67
- statementForMetavariableSubstitution = StatementForMetavariableSubstitution.fromMetavariableNodeStatementNodeAndSubstitutionNode(metavariableNode, statementNode, substitutionNode),
68
- substitution = statementForMetavariableSubstitution; ///
62
+ if (metavariableA !== null) {
63
+ const metavariableB = metavariableFromStatementNode(statementNodeB, localContextB);
69
64
 
70
- substitutions.addSubstitution(substitution);
65
+ if (metavariableA !== metavariableB) {
66
+ const statementNode = statementNodeB, ///
67
+ substitutionNode = substitutionNodeA, ///
68
+ metavariableNode = metavariableNodeA, ///
69
+ statementForMetavariableSubstitution = StatementForMetavariableSubstitution.fromMetavariableNodeStatementNodeAndSubstitutionNode(metavariableNode, statementNode, substitutionNode),
70
+ substitution = statementForMetavariableSubstitution; ///
71
71
 
72
- unifiedAhead = unifyAhead();
72
+ substitutions.addSubstitution(substitution, localContextA, localContextB);
73
+ }
73
74
 
74
- if (!unifiedAhead) {
75
- substitutions.removeSubstitution(substitution);
75
+ metavariableUnifiedAgainstStatement = true;
76
76
  }
77
-
78
- metavariableUnifiedAgainstStatement = unifiedAhead; ///
79
77
  }
80
78
 
81
79
  return metavariableUnifiedAgainstStatement;
82
80
  }
81
+
82
+ function metavariableFromStatementNode(statementNode, localContext) {
83
+ let metavariable = null;
84
+
85
+ const metavariableNode = metavariableNodeQuery(statementNode)
86
+
87
+ if (metavariableNode !== null) {
88
+ metavariable = localContext.findMetavariableByMetavariableNode(metavariableNode);
89
+ }
90
+
91
+ return metavariable;
92
+ }