occam-verify-cli 0.0.941 → 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 (109) 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/frame.js +2 -2
  7. package/lib/metavariable.js +12 -4
  8. package/lib/premise.js +11 -12
  9. package/lib/proofStep.js +14 -18
  10. package/lib/rule.js +6 -32
  11. package/lib/substitution/statementForMetavariable.js +15 -1
  12. package/lib/substitution/termForVariable.js +17 -3
  13. package/lib/substitutions.js +208 -0
  14. package/lib/supposition.js +11 -12
  15. package/lib/topLevelAssertion.js +9 -41
  16. package/lib/unifier/equality.js +6 -8
  17. package/lib/unifier/metaLevel.js +7 -10
  18. package/lib/unifier/statementAgainstCombinator.js +6 -9
  19. package/lib/unifier/termAgainstConstructor.js +5 -5
  20. package/lib/unifier.js +34 -13
  21. package/lib/unify/conclusionAgainstStatement.js +34 -0
  22. package/lib/unify/consequentAgainstStatement.js +34 -0
  23. package/lib/unify/metavariableAgainstStatement.js +24 -16
  24. package/lib/unify/premiseAgainstProofStep.js +41 -0
  25. package/lib/unify/premisesAgainstProofSteps.js +31 -0
  26. package/lib/unify/statementAgainstMetaType.js +5 -9
  27. package/lib/unify/suppositionAgainstProofStep.js +41 -0
  28. package/lib/unify/suppositionsAgainstProofSteps.js +31 -0
  29. package/lib/unify/termAgainstTerm.js +4 -5
  30. package/lib/unify/termAgainstType.js +7 -7
  31. package/lib/unify/variableAgainstTerm.js +12 -28
  32. package/lib/utilities/arguments.js +27 -0
  33. package/lib/utilities/array.js +17 -2
  34. package/lib/utilities/unify.js +19 -0
  35. package/lib/verifier/metaLevel.js +8 -11
  36. package/lib/verifier/statementAsCombinator.js +13 -22
  37. package/lib/verifier/topLevel.js +3 -6
  38. package/lib/verifier.js +28 -8
  39. package/lib/verify/assertion/type.js +3 -7
  40. package/lib/verify/axiom.js +3 -2
  41. package/lib/verify/conjecture.js +5 -3
  42. package/lib/verify/declaration/metavariable.js +1 -1
  43. package/lib/verify/equality.js +3 -7
  44. package/lib/verify/lemma.js +4 -3
  45. package/lib/verify/metaLemma.js +3 -2
  46. package/lib/verify/metatheorem.js +3 -2
  47. package/lib/verify/metavariable.js +26 -63
  48. package/lib/verify/rule.js +3 -2
  49. package/lib/verify/statement/qualified.js +54 -54
  50. package/lib/verify/statement/unqualified.js +2 -2
  51. package/lib/verify/statement.js +35 -30
  52. package/lib/verify/term.js +26 -32
  53. package/lib/verify/theorem.js +4 -3
  54. package/lib/verify/variable.js +3 -4
  55. package/package.json +4 -4
  56. package/src/conclusion.js +2 -6
  57. package/src/consequent.js +2 -6
  58. package/src/constants.js +1 -0
  59. package/src/context/file.js +5 -5
  60. package/src/context/local.js +20 -9
  61. package/src/frame.js +1 -1
  62. package/src/metavariable.js +1 -1
  63. package/src/premise.js +18 -24
  64. package/src/proofStep.js +16 -20
  65. package/src/rule.js +12 -50
  66. package/src/substitution/statementForMetavariable.js +16 -0
  67. package/src/substitution/termForVariable.js +18 -2
  68. package/src/substitutions.js +143 -0
  69. package/src/supposition.js +18 -24
  70. package/src/topLevelAssertion.js +15 -62
  71. package/src/unifier/equality.js +7 -8
  72. package/src/unifier/metaLevel.js +6 -10
  73. package/src/unifier/statementAgainstCombinator.js +9 -9
  74. package/src/unifier/termAgainstConstructor.js +6 -4
  75. package/src/unifier.js +35 -11
  76. package/src/unify/conclusionAgainstStatement.js +34 -0
  77. package/src/unify/consequentAgainstStatement.js +34 -0
  78. package/src/unify/metavariableAgainstStatement.js +33 -23
  79. package/src/unify/premiseAgainstProofStep.js +54 -0
  80. package/src/unify/premisesAgainstProofSteps.js +23 -0
  81. package/src/unify/statementAgainstMetaType.js +3 -11
  82. package/src/unify/suppositionAgainstProofStep.js +54 -0
  83. package/src/unify/suppositionsAgainstProofSteps.js +23 -0
  84. package/src/unify/termAgainstTerm.js +3 -7
  85. package/src/unify/termAgainstType.js +5 -6
  86. package/src/unify/variableAgainstTerm.js +18 -48
  87. package/src/utilities/arguments.js +18 -0
  88. package/src/utilities/array.js +16 -1
  89. package/src/utilities/unify.js +18 -0
  90. package/src/verifier/metaLevel.js +7 -11
  91. package/src/verifier/statementAsCombinator.js +15 -28
  92. package/src/verifier/topLevel.js +13 -17
  93. package/src/verifier.js +28 -6
  94. package/src/verify/assertion/type.js +2 -6
  95. package/src/verify/axiom.js +2 -1
  96. package/src/verify/conjecture.js +5 -2
  97. package/src/verify/declaration/metavariable.js +9 -9
  98. package/src/verify/equality.js +2 -6
  99. package/src/verify/lemma.js +3 -2
  100. package/src/verify/metaLemma.js +2 -1
  101. package/src/verify/metatheorem.js +2 -1
  102. package/src/verify/metavariable.js +31 -91
  103. package/src/verify/rule.js +2 -1
  104. package/src/verify/statement/qualified.js +53 -53
  105. package/src/verify/statement/unqualified.js +1 -1
  106. package/src/verify/statement.js +37 -31
  107. package/src/verify/term.js +25 -31
  108. package/src/verify/theorem.js +3 -2
  109. 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
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ import Substitutions from "./substitutions";
3
4
  import metaLevelUnifier from "./unifier/metaLevel";
4
5
 
5
6
  export default class ProofStep {
@@ -16,7 +17,7 @@ export default class ProofStep {
16
17
  return this.statementNode;
17
18
  }
18
19
 
19
- unifyStatement(statementNode, equivalences, localContext) {
20
+ unifyStatement(statementNode, equivalences, localContextA, localContextB) {
20
21
  let statementUnified = false;
21
22
 
22
23
  if (this.statementNode !== null) {
@@ -26,14 +27,14 @@ export default class ProofStep {
26
27
  const statementNodeA = statementNode, ///
27
28
  statementNodeB = this.statementNode; ///
28
29
 
29
- statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContext);
30
+ statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContextA, localContextB);
30
31
  }
31
32
 
32
33
  if (!statementUnifiedAgainstStatement) {
33
34
  const statementNodeA = statementNode, ///
34
35
  statementNodeB = this.statementNode; ///
35
36
 
36
- statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContext);
37
+ statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContextA, localContextB);
37
38
  }
38
39
 
39
40
  statementUnified = statementUnifiedAgainstStatement; ///
@@ -57,32 +58,27 @@ export default class ProofStep {
57
58
  }
58
59
  }
59
60
 
60
- function unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContext) {
61
+ function unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContextA, localContextB) {
61
62
  let statementUnifiedAgainstStatement = false;
62
63
 
63
64
  const nodeA = statementNodeA, ///
64
65
  nodeB = statementNodeB, ///
65
- localContextA = localContext, ///
66
- localContextB = localContext, ///
67
- substitutions = [],
66
+ statementStringA = localContextA.nodeAsString(statementNodeA),
67
+ statementStringB = localContextB.nodeAsString(statementNodeB);
68
+
69
+ localContextB.trace(`Unifying the '${statementStringB}' statement against the '${statementStringA}' statement...`, statementNodeB);
70
+
71
+ const substitutions = Substitutions.fromNothing(),
68
72
  unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
69
73
 
70
74
  if (unified) {
71
- const substitutionsUnified = substitutions.every((substitution) => {
72
- const substitutionUnified = equivalences.some((equivalence) => {
73
- const substitutionUnifiedAgainstEquivalence = substitution.unifyAgainstEquivalence(equivalence, substitutions, localContext);
74
-
75
- if (substitutionUnifiedAgainstEquivalence) {
76
- return true;
77
- }
78
- });
75
+ const substitutionsUnifiedAgainstEquivalences = substitutions.unifyAgainstEquivalences(equivalences, localContextA, localContextB);
79
76
 
80
- if (substitutionUnified) {
81
- return true;
82
- }
83
- });
77
+ statementUnifiedAgainstStatement = substitutionsUnifiedAgainstEquivalences; ///
78
+ }
84
79
 
85
- statementUnifiedAgainstStatement = substitutionsUnified; ///
80
+ if (statementUnifiedAgainstStatement) {
81
+ localContextB.debug(`...unified the '${statementStringB}' statement against the '${statementStringA}' statement.`, statementNodeB);
86
82
  }
87
83
 
88
84
  return statementUnifiedAgainstStatement;
package/src/rule.js CHANGED
@@ -3,8 +3,9 @@
3
3
  import Label from "./label";
4
4
  import Premise from "./premise";
5
5
  import Conclusion from "./conclusion";
6
-
7
- import { reverse, correlate } from "./utilities/array";
6
+ import Substitutions from "./substitutions";
7
+ import unifyPremisesAgainstProofSteps from "./unify/premisesAgainstProofSteps";
8
+ import unifyConclusionAgainstStatement from "./unify/conclusionAgainstStatement";
8
9
 
9
10
  export default class Rule {
10
11
  constructor(labels, premises, conclusion, fileContext) {
@@ -33,12 +34,17 @@ export default class Rule {
33
34
  unifyStatement(statementNode, localContext) {
34
35
  let statementUnified = false;
35
36
 
36
- const proofSteps = localContext.getProofSteps(),
37
- substitutions = [],
38
- 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);
39
44
 
40
45
  if (premisesUnified) {
41
- const conclusionUnified = unifyConclusion(this.conclusion, statementNode, substitutions, this.fileContext, localContext);
46
+ const conclusionA = this.conclusion, ///
47
+ conclusionUnified = unifyConclusionAgainstStatement(conclusionA, statementNode, substitutions, fileContextA, localContextB);
42
48
 
43
49
  statementUnified = conclusionUnified; ///
44
50
  }
@@ -126,47 +132,3 @@ export default class Rule {
126
132
  return rule;
127
133
  }
128
134
  }
129
-
130
- function matchPremise(premise, proofStep, substitutions, fileContext, localContext) {
131
- let premiseUnified = false;
132
-
133
- const subproofNode = proofStep.getSubproofNode(),
134
- statementNode = proofStep.getStatementNode();
135
-
136
- if (subproofNode !== null) {
137
- const subproofUnified = premise.unifySubproof(subproofNode, substitutions, fileContext, localContext);
138
-
139
- premiseUnified = subproofUnified; ///
140
- }
141
-
142
- if (statementNode !== null) {
143
- const statementUnified = premise.unifyStatement(statementNode, substitutions, fileContext, localContext);
144
-
145
- premiseUnified = statementUnified; ///
146
- }
147
-
148
- return premiseUnified;
149
- }
150
-
151
- function unifyPremises(premises, proofSteps, substitutions, fileContext, localContext) {
152
- premises = reverse(premises); ///
153
-
154
- proofSteps = reverse(proofSteps); ///
155
-
156
- const premisesUnified = correlate(premises, proofSteps, (premise, proofStep) => {
157
- const premiseUnified = matchPremise(premise, proofStep, substitutions, fileContext, localContext);
158
-
159
- if (premiseUnified) {
160
- return true;
161
- }
162
- });
163
-
164
- return premisesUnified;
165
- }
166
-
167
- function unifyConclusion(conclusion, statementNode, substitutions, fileContext, localContext) {
168
- const statementUnified = conclusion.unifyStatement(statementNode, substitutions, fileContext, localContext),
169
- conclusionUnified = statementUnified; ///
170
-
171
- return conclusionUnified;
172
- }
@@ -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
 
@@ -83,6 +89,16 @@ export default class StatementForMetavariableSubstitution extends Substitution {
83
89
  return unifiedAgainstEquivalence;
84
90
  }
85
91
 
92
+ asString(localContextA, localContextB) {
93
+ const statementNodeB = this.statementNode, ///
94
+ statementStringB = localContextB.nodeAsString(statementNodeB),
95
+ metavariableNodeA = this.metavariableNode, ///
96
+ metavariableStringA = localContextA.nodeAsString(metavariableNodeA),
97
+ string = `[${statementStringB} for ${metavariableStringA}]`;
98
+
99
+ return string;
100
+ }
101
+
86
102
  static fromJSONAndFileContext(json, fileContext) {
87
103
  const { metavariable, statement } = json,
88
104
  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(),
@@ -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),
@@ -106,7 +122,7 @@ function substituteTermNode(termNode, substitutions) {
106
122
  const termVariableNode = variableNodeQuery(termNode);
107
123
 
108
124
  if (termVariableNode !== null) {
109
- substitutions.some((substitution) => {
125
+ substitutions.someSubstitution((substitution) => {
110
126
  const substitutionMatchesVariableNode = substitution.matchVariableNode(termVariableNode);
111
127
 
112
128
  if (substitutionMatchesVariableNode) {
@@ -121,7 +137,7 @@ function substituteTermNode(termNode, substitutions) {
121
137
  }
122
138
 
123
139
  function substituteVariableNode(variableNode, substitutions) {
124
- substitutions.some((substitution) => {
140
+ substitutions.someSubstitution((substitution) => {
125
141
  const substitutionMatchesVariableNode = substitution.matchVariableNode(variableNode);
126
142
 
127
143
  if (substitutionMatchesVariableNode) {
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+
3
+ import StatementForMetavariableSubstitution from "./substitution/statementForMetavariable";
4
+
5
+ import { prune, compare, rightDifference } from "./utilities/array";
6
+
7
+ export default class Substitutions {
8
+ constructor(array, savedArray) {
9
+ this.array = array;
10
+ this.savedArray = savedArray;
11
+ }
12
+
13
+ getArray() {
14
+ return this.array;
15
+ }
16
+
17
+ getSavedArray() {
18
+ return this.savedArray;
19
+ }
20
+
21
+ hasChanged() {
22
+ const compares = compare(this.array, this.savedArray),
23
+ changed = !compares; ///
24
+
25
+ return changed;
26
+ }
27
+
28
+ findSubstitution(callback) { return this.array.find(callback); }
29
+
30
+ someSubstitution(callback) { return this.array.some(callback); }
31
+
32
+ everySubstitution(callback) { return this.array.every(callback); }
33
+
34
+ addSubstitution(substitution, localContextA, localContextB) {
35
+ this.array.push(substitution);
36
+
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) {
44
+ const substitutionA = substitution; ///
45
+
46
+ prune(this.array, (substitution) => {
47
+ const substitutionB = substitution; ///
48
+
49
+ if (substitutionA !== substitutionB) {
50
+ return true;
51
+ }
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;
77
+ }
78
+
79
+ snapshot() {
80
+ this.savedArray = [
81
+ ...this.array
82
+ ];
83
+ }
84
+
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
+ });
95
+
96
+ this.array = [
97
+ ...this.savedArray
98
+ ];
99
+
100
+ this.savedArray = null;
101
+ }
102
+
103
+ continue() {
104
+ this.savedArray = null;
105
+ }
106
+
107
+ transform() {
108
+ ///
109
+ }
110
+
111
+ toJSON(tokens) {
112
+ const json = this.array.map((substitution) => {
113
+ const substitutionJSON = substitution.toJSON(tokens);
114
+
115
+ return substitutionJSON;
116
+ });
117
+
118
+ return json;
119
+ }
120
+
121
+ static fromNothing() {
122
+ const array = [],
123
+ savedArray = null,
124
+ substitutions = new Substitutions(array, savedArray);
125
+
126
+ return substitutions;
127
+ }
128
+
129
+ static fromJSONAndFileContext(json, fileContext) {
130
+ const substitutionsJSON = json, ///
131
+ array = substitutionsJSON.map((substitutionJSON) => {
132
+ const json = substitutionJSON, ///
133
+ statementForMetavariableSubstitution = StatementForMetavariableSubstitution.fromJSONAndFileContext(json, fileContext),
134
+ substitution = statementForMetavariableSubstitution; ///
135
+
136
+ return substitution;
137
+ }),
138
+ savedArray = null,
139
+ substitutions = new Substitutions(array, savedArray);
140
+
141
+ return substitutions;
142
+ }
143
+ }
@@ -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) {
@@ -3,9 +3,9 @@
3
3
  import Label from "./label";
4
4
  import Consequent from "./consequent";
5
5
  import Supposition from "./supposition";
6
- import StatementForMetavariableSubstitution from "./substitution/statementForMetavariable";
7
-
8
- import { reverse, correlate } from "./utilities/array";
6
+ import Substitutions from "./substitutions";
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 = [],
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
  }
@@ -76,11 +81,7 @@ export default class TopLevelAssertion {
76
81
  return suppositionJSON;
77
82
  }),
78
83
  consequentJSON = this.consequent.toJSON(tokens),
79
- substitutionsJSON = this.substitutions.map((substitution) => {
80
- const substitutionJSON = substitution.toJSON();
81
-
82
- return substitutionJSON;
83
- }),
84
+ substitutionsJSON = this.substitutions.toJSON(tokens),
84
85
  labels = labelsJSON, ///
85
86
  suppositions = suppositionsJSON, ///
86
87
  consequent = consequentJSON, ///
@@ -126,60 +127,12 @@ export default class TopLevelAssertion {
126
127
 
127
128
  const substitutionsJSON = substitutions; ///
128
129
 
129
- substitutions = substitutionsJSON.map((substitutionJSON) => {
130
- const json = substitutionJSON, ///
131
- statementForMetavariableSubstitution = StatementForMetavariableSubstitution.fromJSONAndFileContext(json, fileContext),
132
- substitution = statementForMetavariableSubstitution; ///
130
+ json = substitutionsJSON; ///
133
131
 
134
- return substitution;
135
- });
132
+ substitutions = Substitutions.fromJSONAndFileContext(json, fileContext);
136
133
 
137
134
  return new Class(labels, suppositions, consequent, substitutions, fileContext); ///
138
135
  }
139
136
 
140
137
  static fromLabelsSuppositionsConsequentSubstitutionsAndFileContext(Class, labels, suppositions, consequent, substitutions, fileContext) { return new Class(labels, suppositions, consequent, substitutions, fileContext); }
141
138
  }
142
-
143
- function unifySuppositions(suppositions, proofSteps, substitutions, fileContext, localContext) {
144
- suppositions = reverse(suppositions); ///
145
-
146
- proofSteps = reverse(proofSteps); ///
147
-
148
- const suppositionsUnified = correlate(suppositions, proofSteps, (supposition, proofStep) => {
149
- const suppositionUnified = unifySupposition(supposition, proofStep, substitutions, fileContext, localContext);
150
-
151
- if (suppositionUnified) {
152
- return true;
153
- }
154
- });
155
-
156
- return suppositionsUnified;
157
- }
158
-
159
- function unifySupposition(supposition, proofStep, substitutions, fileContext, localContext) {
160
- let suppositionUnified = false;
161
-
162
- const subproofNode = proofStep.getSubproofNode(),
163
- statementNode = proofStep.getStatementNode();
164
-
165
- if (subproofNode !== null) {
166
- const subproofUnified = supposition.unifySubproof(subproofNode, substitutions, fileContext, localContext);
167
-
168
- suppositionUnified = subproofUnified; ///
169
- }
170
-
171
- if (statementNode !== null) {
172
- const statementUnified = supposition.unifyStatement(statementNode, substitutions, fileContext, localContext);
173
-
174
- suppositionUnified = statementUnified; ///
175
- }
176
-
177
- return suppositionUnified;
178
- }
179
-
180
- function unifyConsequent(consequent, statementNode, substitutions, fileContext, localContext) {
181
- const statementUnified = consequent.unifyStatement(statementNode, substitutions, fileContext, localContext),
182
- consequentUnified = statementUnified; ///
183
-
184
- return consequentUnified;
185
- }
@@ -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
  }