occam-verify-cli 0.0.942 → 0.0.944

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 (99) 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/equality.js +14 -1
  7. package/lib/metavariable.js +12 -4
  8. package/lib/premise.js +11 -12
  9. package/lib/proofStep.js +13 -18
  10. package/lib/rule.js +5 -38
  11. package/lib/substitution/statementForMetavariable.js +17 -3
  12. package/lib/substitution/termForVariable.js +16 -2
  13. package/lib/substitution.js +14 -1
  14. package/lib/substitutions.js +28 -10
  15. package/lib/supposition.js +11 -12
  16. package/lib/topLevelAssertion.js +5 -38
  17. package/lib/unifier/equality.js +6 -8
  18. package/lib/unifier/metaLevel.js +7 -10
  19. package/lib/unifier/statementAgainstCombinator.js +6 -9
  20. package/lib/unifier/termAgainstConstructor.js +5 -5
  21. package/lib/unifier.js +34 -13
  22. package/lib/unify/conclusionAgainstStatement.js +34 -0
  23. package/lib/unify/consequentAgainstStatement.js +34 -0
  24. package/lib/unify/metavariableAgainstStatement.js +23 -15
  25. package/lib/unify/premiseAgainstProofStep.js +41 -0
  26. package/lib/unify/premisesAgainstProofSteps.js +31 -0
  27. package/lib/unify/statementAgainstMetaType.js +5 -9
  28. package/lib/unify/suppositionAgainstProofStep.js +41 -0
  29. package/lib/unify/suppositionsAgainstProofSteps.js +31 -0
  30. package/lib/unify/termAgainstTerm.js +4 -5
  31. package/lib/unify/termAgainstType.js +7 -7
  32. package/lib/unify/variableAgainstTerm.js +11 -27
  33. package/lib/utilities/arguments.js +27 -0
  34. package/lib/utilities/array.js +5 -2
  35. package/lib/utilities/unify.js +19 -0
  36. package/lib/verifier/metaLevel.js +8 -11
  37. package/lib/verifier/statementAsCombinator.js +13 -22
  38. package/lib/verifier/topLevel.js +3 -6
  39. package/lib/verifier.js +28 -8
  40. package/lib/verify/assertion/type.js +3 -7
  41. package/lib/verify/declaration/metavariable.js +1 -1
  42. package/lib/verify/equality.js +12 -25
  43. package/lib/verify/metavariable.js +26 -63
  44. package/lib/verify/statement/qualified.js +55 -58
  45. package/lib/verify/statement/unqualified.js +3 -6
  46. package/lib/verify/statement.js +36 -34
  47. package/lib/verify/term.js +26 -32
  48. package/lib/verify/type.js +4 -7
  49. package/lib/verify/variable.js +3 -4
  50. package/package.json +1 -1
  51. package/src/conclusion.js +2 -6
  52. package/src/consequent.js +2 -6
  53. package/src/constants.js +1 -0
  54. package/src/context/file.js +5 -5
  55. package/src/context/local.js +20 -9
  56. package/src/equality.js +22 -0
  57. package/src/metavariable.js +1 -1
  58. package/src/premise.js +18 -24
  59. package/src/proofStep.js +16 -21
  60. package/src/rule.js +11 -65
  61. package/src/substitution/statementForMetavariable.js +17 -3
  62. package/src/substitution/termForVariable.js +17 -1
  63. package/src/substitution.js +12 -0
  64. package/src/substitutions.js +41 -7
  65. package/src/supposition.js +18 -24
  66. package/src/topLevelAssertion.js +11 -65
  67. package/src/unifier/equality.js +7 -8
  68. package/src/unifier/metaLevel.js +6 -10
  69. package/src/unifier/statementAgainstCombinator.js +9 -9
  70. package/src/unifier/termAgainstConstructor.js +6 -4
  71. package/src/unifier.js +35 -11
  72. package/src/unify/conclusionAgainstStatement.js +34 -0
  73. package/src/unify/consequentAgainstStatement.js +34 -0
  74. package/src/unify/metavariableAgainstStatement.js +32 -22
  75. package/src/unify/premiseAgainstProofStep.js +54 -0
  76. package/src/unify/premisesAgainstProofSteps.js +23 -0
  77. package/src/unify/statementAgainstMetaType.js +3 -11
  78. package/src/unify/suppositionAgainstProofStep.js +54 -0
  79. package/src/unify/suppositionsAgainstProofSteps.js +23 -0
  80. package/src/unify/termAgainstTerm.js +3 -7
  81. package/src/unify/termAgainstType.js +5 -6
  82. package/src/unify/variableAgainstTerm.js +17 -47
  83. package/src/utilities/arguments.js +18 -0
  84. package/src/utilities/array.js +1 -1
  85. package/src/utilities/unify.js +18 -0
  86. package/src/verifier/metaLevel.js +7 -11
  87. package/src/verifier/statementAsCombinator.js +15 -28
  88. package/src/verifier/topLevel.js +13 -17
  89. package/src/verifier.js +28 -6
  90. package/src/verify/assertion/type.js +2 -6
  91. package/src/verify/declaration/metavariable.js +9 -9
  92. package/src/verify/equality.js +12 -40
  93. package/src/verify/metavariable.js +31 -91
  94. package/src/verify/statement/qualified.js +54 -58
  95. package/src/verify/statement/unqualified.js +2 -6
  96. package/src/verify/statement.js +38 -36
  97. package/src/verify/term.js +25 -31
  98. package/src/verify/type.js +3 -7
  99. package/src/verify/variable.js +2 -4
package/src/premise.js CHANGED
@@ -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 Premise {
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 Premise {
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) {
package/src/proofStep.js CHANGED
@@ -17,7 +17,7 @@ export default class ProofStep {
17
17
  return this.statementNode;
18
18
  }
19
19
 
20
- unifyStatement(statementNode, equivalences, localContext) {
20
+ unifyStatement(statementNode, equivalences, localContextA, localContextB) {
21
21
  let statementUnified = false;
22
22
 
23
23
  if (this.statementNode !== null) {
@@ -27,14 +27,14 @@ export default class ProofStep {
27
27
  const statementNodeA = statementNode, ///
28
28
  statementNodeB = this.statementNode; ///
29
29
 
30
- statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContext);
30
+ statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContextA, localContextB);
31
31
  }
32
32
 
33
33
  if (!statementUnifiedAgainstStatement) {
34
34
  const statementNodeA = statementNode, ///
35
35
  statementNodeB = this.statementNode; ///
36
36
 
37
- statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContext);
37
+ statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContextA, localContextB);
38
38
  }
39
39
 
40
40
  statementUnified = statementUnifiedAgainstStatement; ///
@@ -58,32 +58,27 @@ export default class ProofStep {
58
58
  }
59
59
  }
60
60
 
61
- function unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContext) {
61
+ function unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContextA, localContextB) {
62
62
  let statementUnifiedAgainstStatement = false;
63
63
 
64
- const nodeA = statementNodeA, ///
64
+ const statementStringA = localContextA.nodeAsString(statementNodeA),
65
+ statementStringB = localContextB.nodeAsString(statementNodeB);
66
+
67
+ localContextB.trace(`Unifying the '${statementStringB}' statement against the '${statementStringA}' statement...`, statementNodeB);
68
+
69
+ const substitutions = Substitutions.fromNothing(),
70
+ nodeA = statementNodeA, ///
65
71
  nodeB = statementNodeB, ///
66
- localContextA = localContext, ///
67
- localContextB = localContext, ///
68
- substitutions = Substitutions.fromNothing(),
69
72
  unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
70
73
 
71
74
  if (unified) {
72
- const substitutionsUnified = substitutions.everySubstitution((substitution) => {
73
- const substitutionUnified = equivalences.some((equivalence) => {
74
- const substitutionUnifiedAgainstEquivalence = substitution.unifyAgainstEquivalence(equivalence, substitutions, localContext);
75
-
76
- if (substitutionUnifiedAgainstEquivalence) {
77
- return true;
78
- }
79
- });
75
+ const substitutionsUnifiedAgainstEquivalences = substitutions.unifyAgainstEquivalences(equivalences, localContextA, localContextB);
80
76
 
81
- if (substitutionUnified) {
82
- return true;
83
- }
84
- });
77
+ statementUnifiedAgainstStatement = substitutionsUnifiedAgainstEquivalences; ///
78
+ }
85
79
 
86
- statementUnifiedAgainstStatement = substitutionsUnified; ///
80
+ if (statementUnifiedAgainstStatement) {
81
+ localContextB.debug(`...unified the '${statementStringB}' statement against the '${statementStringA}' statement.`, statementNodeB);
87
82
  }
88
83
 
89
84
  return statementUnifiedAgainstStatement;
package/src/rule.js CHANGED
@@ -4,8 +4,8 @@ import Label from "./label";
4
4
  import Premise from "./premise";
5
5
  import Conclusion from "./conclusion";
6
6
  import Substitutions from "./substitutions";
7
-
8
- import { reverse, correlate } from "./utilities/array";
7
+ import unifyPremisesAgainstProofSteps from "./unify/premisesAgainstProofSteps";
8
+ import unifyConclusionAgainstStatement from "./unify/conclusionAgainstStatement";
9
9
 
10
10
  export default class Rule {
11
11
  constructor(labels, premises, conclusion, fileContext) {
@@ -34,12 +34,17 @@ export default class Rule {
34
34
  unifyStatement(statementNode, localContext) {
35
35
  let statementUnified = false;
36
36
 
37
- const proofSteps = localContext.getProofSteps(),
38
- substitutions = Substitutions.fromNothing(),
39
- premisesUnified = unifyPremises(this.premises, proofSteps, substitutions, this.fileContext, localContext);
37
+ const substitutions = Substitutions.fromNothing(),
38
+ proofSteps = localContext.getProofSteps(),
39
+ premisesA = this.premises,
40
+ proofStepsB = proofSteps, ///
41
+ fileContextA = this.fileContext, ///
42
+ localContextB = localContext, ///
43
+ premisesUnified = unifyPremisesAgainstProofSteps(premisesA, proofStepsB, substitutions, fileContextA, localContextB);
40
44
 
41
45
  if (premisesUnified) {
42
- const conclusionUnified = unifyConclusion(this.conclusion, statementNode, substitutions, this.fileContext, localContext);
46
+ const conclusionA = this.conclusion, ///
47
+ conclusionUnified = unifyConclusionAgainstStatement(conclusionA, statementNode, substitutions, fileContextA, localContextB);
43
48
 
44
49
  statementUnified = conclusionUnified; ///
45
50
  }
@@ -127,62 +132,3 @@ export default class Rule {
127
132
  return rule;
128
133
  }
129
134
  }
130
-
131
- function matchPremise(premise, proofStep, substitutions, fileContext, localContext) {
132
- let premiseUnified = false;
133
-
134
- const subproofNode = proofStep.getSubproofNode(),
135
- statementNode = proofStep.getStatementNode();
136
-
137
- substitutions.snapshot();
138
-
139
- if (subproofNode !== null) {
140
- const subproofUnified = premise.unifySubproof(subproofNode, substitutions, fileContext, localContext);
141
-
142
- premiseUnified = subproofUnified; ///
143
- }
144
-
145
- if (statementNode !== null) {
146
- const statementUnified = premise.unifyStatement(statementNode, substitutions, fileContext, localContext);
147
-
148
- premiseUnified = statementUnified; ///
149
- }
150
-
151
- premiseUnified ?
152
- substitutions.continue() :
153
- substitutions.rollback();
154
-
155
- return premiseUnified;
156
- }
157
-
158
- function unifyPremises(premises, proofSteps, substitutions, fileContext, localContext) {
159
- premises = reverse(premises); ///
160
-
161
- proofSteps = reverse(proofSteps); ///
162
-
163
- const premisesUnified = correlate(premises, proofSteps, (premise, proofStep) => {
164
- const premiseUnified = matchPremise(premise, proofStep, substitutions, fileContext, localContext);
165
-
166
- if (premiseUnified) {
167
- return true;
168
- }
169
- });
170
-
171
- return premisesUnified;
172
- }
173
-
174
- function unifyConclusion(conclusion, statementNode, substitutions, fileContext, localContext) {
175
- let conclusionUnified;
176
-
177
- substitutions.snapshot();
178
-
179
- const statementUnified = conclusion.unifyStatement(statementNode, substitutions, fileContext, localContext);
180
-
181
- conclusionUnified = statementUnified; ///
182
-
183
- conclusionUnified ?
184
- substitutions.continue() :
185
- substitutions.rollback();
186
-
187
- return conclusionUnified;
188
- }
@@ -32,6 +32,12 @@ export default class StatementForMetavariableSubstitution extends Substitution {
32
32
  return this.substitution;
33
33
  }
34
34
 
35
+ getNode() {
36
+ const node = this.statementNode; ///
37
+
38
+ return node;
39
+ }
40
+
35
41
  matchStatementNode(statementNode, substitutions, localContextA, localContextB) {
36
42
  let statementNodeMatches;
37
43
 
@@ -60,7 +66,7 @@ export default class StatementForMetavariableSubstitution extends Substitution {
60
66
  return matchesMetavariableNode;
61
67
  }
62
68
 
63
- unifyAgainstEquivalence(equivalence, substitutions, localContext) {
69
+ unifyAgainstEquivalence(equivalence, substitutions, localContextA, localContextB) {
64
70
  let unifiedAgainstEquivalence = false; ///
65
71
 
66
72
  const metavariableNode = metavariableNodeQuery(this.statementNode);
@@ -73,8 +79,6 @@ export default class StatementForMetavariableSubstitution extends Substitution {
73
79
  const { metaLevelUnifier } = shim,
74
80
  nodeA = this.metavariableNode, ///
75
81
  nodeB = metavariableNode, ///
76
- localContextA = localContext, ///
77
- localContextB = localContext, ///
78
82
  unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
79
83
 
80
84
  unifiedAgainstEquivalence = unified; ///
@@ -83,6 +87,16 @@ export default class StatementForMetavariableSubstitution extends Substitution {
83
87
  return unifiedAgainstEquivalence;
84
88
  }
85
89
 
90
+ asString(localContextA, localContextB) {
91
+ const statementNodeB = this.statementNode, ///
92
+ statementStringB = localContextB.nodeAsString(statementNodeB),
93
+ metavariableNodeA = this.metavariableNode, ///
94
+ metavariableStringA = localContextA.nodeAsString(metavariableNodeA),
95
+ string = `[${statementStringB} for ${metavariableStringA}]`;
96
+
97
+ return string;
98
+ }
99
+
86
100
  static fromJSONAndFileContext(json, fileContext) {
87
101
  const { metavariable, statement } = json,
88
102
  metavariableString = metavariable, ///
@@ -23,6 +23,12 @@ export default class TermForVariableSubstitution extends Substitution {
23
23
  return this.termNode;
24
24
  }
25
25
 
26
+ getNode() {
27
+ const node = this.termNode; ///
28
+
29
+ return node;
30
+ }
31
+
26
32
  isTransformed(substitution) {
27
33
  const termNod = substitution.getTermNode(),
28
34
  variableNode = substitution.getVariableNode(),
@@ -45,7 +51,7 @@ export default class TermForVariableSubstitution extends Substitution {
45
51
  return matchesVariableNode;
46
52
  }
47
53
 
48
- unifyAgainstEquivalence(equivalence, substitutions, localContext) {
54
+ unifyAgainstEquivalence(equivalence, substitutions, localContextA, localContextB) {
49
55
  let unifiedAgainstEquivalence;
50
56
 
51
57
  const equivalenceMatchesVariableNode = equivalence.matchVariableNode(this.variableNode);
@@ -61,6 +67,16 @@ export default class TermForVariableSubstitution extends Substitution {
61
67
  return unifiedAgainstEquivalence;
62
68
  }
63
69
 
70
+ asString(localContextA, localContextB) {
71
+ const termNodeB = this.termNode, ///
72
+ termStringB = localContextB.nodeAsString(termNodeB),
73
+ variableNodeA = this.variableNode, ///
74
+ variableStringA = localContextA.nodeAsString(variableNodeA),
75
+ string = `[${termStringB} for ${variableStringA}]`;
76
+
77
+ return string;
78
+ }
79
+
64
80
  static fromSubstitutionNode(substitutionNode) {
65
81
  const termNode = termNodeQuery(substitutionNode),
66
82
  variableNode = variableNodeQuery(substitutionNode),
@@ -24,4 +24,16 @@ export default class Substitution {
24
24
 
25
25
  return matchesMetavariableNode;
26
26
  }
27
+
28
+ unifyAgainstEquivalences(equivalences, substitutions, localContextA, localContextB) {
29
+ const unifiedAgainstEquivalences = equivalences.some((equivalence) => {
30
+ const substitutionUnifiedAgainstEquivalence = this.unifyAgainstEquivalence(equivalence, substitutions, localContextA, localContextB);
31
+
32
+ if (substitutionUnifiedAgainstEquivalence) {
33
+ return true;
34
+ }
35
+ });
36
+
37
+ return unifiedAgainstEquivalences;
38
+ }
27
39
  }
@@ -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,24 @@ 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 unifiedAgainstEquivalences = this.everySubstitution((substitution) => {
62
+ const substitutions = this, ///
63
+ substitutionUnifiedAgainstEquivalence = substitution.unifyAgainstEquivalences(equivalences, substitutions, localContextA, localContextB);
64
+
65
+ if (substitutionUnifiedAgainstEquivalence) {
66
+ return true;
67
+ }
68
+ });
69
+
70
+ return unifiedAgainstEquivalences;
46
71
  }
47
72
 
48
73
  snapshot() {
@@ -51,11 +76,20 @@ export default class Substitutions {
51
76
  ];
52
77
  }
53
78
 
54
- rollback() {
55
- const start = 0,
56
- end = Infinity;
79
+ rollback(localContextA, localContextB) {
80
+ const array = [
81
+ ...this.array
82
+ ];
57
83
 
58
- this.array.splice(start, end, ...this.savedArray);
84
+ rightDifference(this.savedArray, array);
85
+
86
+ array.forEach((substitution) => {
87
+ this.removeSubstitution(substitution, localContextA, localContextB);
88
+ });
89
+
90
+ this.array = [
91
+ ...this.savedArray
92
+ ];
59
93
 
60
94
  this.savedArray = null;
61
95
  }
@@ -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
  }