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
@@ -26,8 +26,8 @@ function verifyTerm(termNode, terms, localContext, verifyAhead) {
26
26
  localContext.trace("Verifying the '".concat(termString, "' term..."), termNode);
27
27
  var verifyTermFunctions = [
28
28
  verifyTermAsVariable,
29
- verifyTermAgainstConstructors,
30
- verifyTermAgainstBracketedConstructor
29
+ unifyTermAgainstConstructors,
30
+ unifyTermAgainstBracketedConstructor
31
31
  ];
32
32
  termVerified = verifyTermFunctions.some(function(verifyTermFunction) {
33
33
  var termVerified = verifyTermFunction(termNode, terms, localContext, verifyAhead);
@@ -56,9 +56,7 @@ function verifyTermAsVariable(termNode, terms, localContext, verifyAhead) {
56
56
  var type = variable.getType(), term = _term.default.fromTermNodeAndType(termNode, type);
57
57
  terms.push(term);
58
58
  verifiedAhead = verifyAhead();
59
- if (!verifiedAhead) {
60
- terms.pop();
61
- }
59
+ terms.pop();
62
60
  termVerifiedAsVariable = verifiedAhead; ///
63
61
  }
64
62
  if (termVerifiedAsVariable) {
@@ -67,24 +65,24 @@ function verifyTermAsVariable(termNode, terms, localContext, verifyAhead) {
67
65
  }
68
66
  return termVerifiedAsVariable;
69
67
  }
70
- function verifyTermAgainstConstructors(termNode, terms, localContext, verifyAhead) {
71
- var termVerifiedAgainstConstructors = false;
68
+ function unifyTermAgainstConstructors(termNode, terms, localContext, verifyAhead) {
69
+ var termUnifiedAgainstConstructors = false;
72
70
  var variableNode = variableNodeQuery(termNode);
73
71
  if (variableNode === null) {
74
72
  var constructors = localContext.getConstructors();
75
- termVerifiedAgainstConstructors = constructors.some(function(constructor) {
76
- var termVerifiedAgainstConstructor = verifyTermAgainstConstructor(termNode, terms, constructor, localContext, verifyAhead);
77
- if (termVerifiedAgainstConstructor) {
73
+ termUnifiedAgainstConstructors = constructors.some(function(constructor) {
74
+ var termUnifiedAgainstConstructor = unifyTermAgainstConstructor(termNode, terms, constructor, localContext, verifyAhead);
75
+ if (termUnifiedAgainstConstructor) {
78
76
  return true;
79
77
  }
80
78
  });
81
79
  }
82
- return termVerifiedAgainstConstructors;
80
+ return termUnifiedAgainstConstructors;
83
81
  }
84
- function verifyTermAgainstBracketedConstructor(termNode, terms, localContext, verifyAhead) {
85
- var termVerifiedAgainstBracketedConstructor;
82
+ function unifyTermAgainstBracketedConstructor(termNode, terms, localContext, verifyAhead) {
83
+ var termUnifiedAgainstBracketedConstructor;
86
84
  var termString = localContext.nodeAsString(termNode), bracketedConstructorString = _bracketed.default.getString();
87
- localContext.trace("Verifying the '".concat(termString, "' term against the '").concat(bracketedConstructorString, "' bracketed constructor..."), termNode);
85
+ localContext.trace("Unifying the '".concat(termString, "' term against the '").concat(bracketedConstructorString, "' bracketed constructor..."), termNode);
88
86
  var bracketedConstructorTermNode = _bracketed.default.getTermNode(), termNodeA = termNode, constructorTermNodeB = bracketedConstructorTermNode, unified = _termAgainstConstructor.default.unify(termNodeA, constructorTermNodeB, localContext, function() {
89
87
  var verifiedAhead;
90
88
  var bracketedTermNode = termNode; ///
@@ -105,37 +103,33 @@ function verifyTermAgainstBracketedConstructor(termNode, terms, localContext, ve
105
103
  var term = _term.default.fromTermNodeAndType(termNode, type);
106
104
  terms.push(term);
107
105
  verifiedAhead = verifyAhead();
108
- if (!verifiedAhead) {
109
- terms.pop();
110
- }
106
+ terms.pop();
111
107
  }
112
108
  return verifiedAhead;
113
109
  });
114
- termVerifiedAgainstBracketedConstructor = unified; ///
115
- if (termVerifiedAgainstBracketedConstructor) {
116
- localContext.debug("...verified the '".concat(termString, "' term against the '").concat(bracketedConstructorString, "' constructor."), termNode);
110
+ termUnifiedAgainstBracketedConstructor = unified; ///
111
+ if (termUnifiedAgainstBracketedConstructor) {
112
+ localContext.debug("...unified the '".concat(termString, "' term against the '").concat(bracketedConstructorString, "' constructor."), termNode);
117
113
  }
118
- return termVerifiedAgainstBracketedConstructor;
114
+ return termUnifiedAgainstBracketedConstructor;
119
115
  }
120
- function verifyTermAgainstConstructor(termNode, terms, constructor, localContext, verifyAhead) {
121
- var termVerifiedAgainstConstructor;
116
+ function unifyTermAgainstConstructor(termNode, terms, constructor, localContext, verifyAhead) {
117
+ var termUnifiedAgainstConstructor;
122
118
  var termString = localContext.nodeAsString(termNode), constructorString = constructor.getString();
123
- localContext.trace("Verifying the '".concat(termString, "' term against the '").concat(constructorString, "' constructor..."), termNode);
119
+ localContext.trace("Unifying the '".concat(termString, "' term against the '").concat(constructorString, "' constructor..."), termNode);
124
120
  var constructorTermNode = constructor.getTermNode(), termNodeA = termNode, constructorTermNodeB = constructorTermNode, unified = _termAgainstConstructor.default.unify(termNodeA, constructorTermNodeB, localContext, function() {
125
121
  var verifiedAhead;
126
122
  var type = constructor.getType(), term = _term.default.fromTermNodeAndType(termNode, type);
127
123
  terms.push(term);
128
124
  verifiedAhead = verifyAhead();
129
- if (!verifiedAhead) {
130
- terms.pop();
131
- }
125
+ terms.pop();
132
126
  return verifiedAhead;
133
127
  });
134
- termVerifiedAgainstConstructor = unified; ///
135
- if (termVerifiedAgainstConstructor) {
136
- localContext.debug("...verified the '".concat(termString, "' term against the '").concat(constructorString, "' constructor."), termNode);
128
+ termUnifiedAgainstConstructor = unified; ///
129
+ if (termUnifiedAgainstConstructor) {
130
+ localContext.debug("...unified the '".concat(termString, "' term against the '").concat(constructorString, "' constructor."), termNode);
137
131
  }
138
- return termVerifiedAgainstConstructor;
132
+ return termUnifiedAgainstConstructor;
139
133
  }
140
134
 
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZXJpZnkvdGVybS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHNoaW0gZnJvbSBcIi4uL3NoaW1cIjtcbmltcG9ydCBUZXJtIGZyb20gXCIuLi90ZXJtXCI7XG5pbXBvcnQgYnJhY2tldGVkQ29uc3RydWN0b3IgZnJvbSBcIi4uL2NvbnN0cnVjdG9yL2JyYWNrZXRlZFwiO1xuaW1wb3J0IHRlcm1BZ2FpbnN0Q29uc3RydWN0b3JVbmlmaWVyIGZyb20gXCIuLi91bmlmaWVyL3Rlcm1BZ2FpbnN0Q29uc3RydWN0b3JcIjtcblxuaW1wb3J0IHsgZmlyc3QgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2FycmF5XCI7XG5pbXBvcnQgeyBub2RlUXVlcnkgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3F1ZXJ5XCI7XG5cbmNvbnN0IHRlcm1Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvdGVybS9hcmd1bWVudC90ZXJtXCIpLFxuICAgICAgdmFyaWFibGVOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvdGVybS92YXJpYWJsZSFcIik7XG5cbmZ1bmN0aW9uIHZlcmlmeVRlcm0odGVybU5vZGUsIHRlcm1zLCBsb2NhbENvbnRleHQsIHZlcmlmeUFoZWFkKSB7XG4gIGxldCB0ZXJtVmVyaWZpZWQ7XG5cbiAgY29uc3QgdGVybVN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcodGVybU5vZGUpO1xuXG4gIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybS4uLmAsIHRlcm1Ob2RlKTtcblxuICBjb25zdCB2ZXJpZnlUZXJtRnVuY3Rpb25zID0gW1xuICAgIHZlcmlmeVRlcm1Bc1ZhcmlhYmxlLFxuICAgIHZlcmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3JzLFxuICAgIHZlcmlmeVRlcm1BZ2FpbnN0QnJhY2tldGVkQ29uc3RydWN0b3JcbiAgXTtcblxuICB0ZXJtVmVyaWZpZWQgPSB2ZXJpZnlUZXJtRnVuY3Rpb25zLnNvbWUoKHZlcmlmeVRlcm1GdW5jdGlvbikgPT4ge1xuICAgIGNvbnN0IHRlcm1WZXJpZmllZCA9IHZlcmlmeVRlcm1GdW5jdGlvbih0ZXJtTm9kZSwgdGVybXMsIGxvY2FsQ29udGV4dCwgdmVyaWZ5QWhlYWQpO1xuXG4gICAgaWYgKHRlcm1WZXJpZmllZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcblxuICBpZiAodGVybVZlcmlmaWVkKSB7XG4gICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0uYCwgdGVybU5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIHRlcm1WZXJpZmllZDtcbn1cblxuT2JqZWN0LmFzc2lnbihzaGltLCB7XG4gIHZlcmlmeVRlcm1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB2ZXJpZnlUZXJtO1xuXG5mdW5jdGlvbiB2ZXJpZnlUZXJtQXNWYXJpYWJsZSh0ZXJtTm9kZSwgdGVybXMsIGxvY2FsQ29udGV4dCwgdmVyaWZ5QWhlYWQpIHtcbiAgbGV0IHRlcm1WZXJpZmllZEFzVmFyaWFibGUgPSBmYWxzZTtcblxuICBjb25zdCB2YXJpYWJsZU5vZGUgPSB2YXJpYWJsZU5vZGVRdWVyeSh0ZXJtTm9kZSk7XG5cbiAgaWYgKHZhcmlhYmxlTm9kZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHRlcm1TdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHRlcm1Ob2RlKTtcblxuICAgIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSBhcyBhIHZhcmlhYmxlLi4uYCwgdGVybU5vZGUpO1xuXG4gICAgY29uc3QgdmFyaWFibGUgPSBsb2NhbENvbnRleHQuZmluZFZhcmlhYmxlQnlWYXJpYWJsZU5vZGUodmFyaWFibGVOb2RlKTtcblxuICAgIGlmICh2YXJpYWJsZSAhPT0gbnVsbCkge1xuICAgICAgbGV0IHZlcmlmaWVkQWhlYWQ7XG5cbiAgICAgIGNvbnN0IHR5cGUgPSB2YXJpYWJsZS5nZXRUeXBlKCksXG4gICAgICAgICAgICB0ZXJtID0gVGVybS5mcm9tVGVybU5vZGVBbmRUeXBlKHRlcm1Ob2RlLCB0eXBlKTtcblxuICAgICAgdGVybXMucHVzaCh0ZXJtKTtcblxuICAgICAgdmVyaWZpZWRBaGVhZCA9IHZlcmlmeUFoZWFkKCk7XG5cbiAgICAgIGlmICghdmVyaWZpZWRBaGVhZCkge1xuICAgICAgICB0ZXJtcy5wb3AoKTtcbiAgICAgIH1cblxuICAgICAgdGVybVZlcmlmaWVkQXNWYXJpYWJsZSA9IHZlcmlmaWVkQWhlYWQ7ICAvLy9cbiAgICB9XG5cbiAgICBpZiAodGVybVZlcmlmaWVkQXNWYXJpYWJsZSkge1xuICAgICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gYXMgYSB2YXJpYWJsZS5gLCB0ZXJtTm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRlcm1WZXJpZmllZEFzVmFyaWFibGU7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3JzKHRlcm1Ob2RlLCB0ZXJtcywgbG9jYWxDb250ZXh0LCB2ZXJpZnlBaGVhZCkge1xuICBsZXQgdGVybVZlcmlmaWVkQWdhaW5zdENvbnN0cnVjdG9ycyA9IGZhbHNlO1xuXG4gIGNvbnN0IHZhcmlhYmxlTm9kZSA9IHZhcmlhYmxlTm9kZVF1ZXJ5KHRlcm1Ob2RlKTtcblxuICBpZiAodmFyaWFibGVOb2RlID09PSBudWxsKSB7XG4gICAgY29uc3QgY29uc3RydWN0b3JzID0gbG9jYWxDb250ZXh0LmdldENvbnN0cnVjdG9ycygpO1xuXG4gICAgdGVybVZlcmlmaWVkQWdhaW5zdENvbnN0cnVjdG9ycyA9IGNvbnN0cnVjdG9ycy5zb21lKChjb25zdHJ1Y3RvcikgPT4ge1xuICAgICAgY29uc3QgdGVybVZlcmlmaWVkQWdhaW5zdENvbnN0cnVjdG9yID0gdmVyaWZ5VGVybUFnYWluc3RDb25zdHJ1Y3Rvcih0ZXJtTm9kZSwgdGVybXMsIGNvbnN0cnVjdG9yLCBsb2NhbENvbnRleHQsIHZlcmlmeUFoZWFkKTtcblxuICAgICAgaWYgKHRlcm1WZXJpZmllZEFnYWluc3RDb25zdHJ1Y3Rvcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0ZXJtVmVyaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3JzO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlUZXJtQWdhaW5zdEJyYWNrZXRlZENvbnN0cnVjdG9yKHRlcm1Ob2RlLCB0ZXJtcywgbG9jYWxDb250ZXh0LCB2ZXJpZnlBaGVhZCkge1xuICBsZXQgdGVybVZlcmlmaWVkQWdhaW5zdEJyYWNrZXRlZENvbnN0cnVjdG9yO1xuXG4gIGNvbnN0IHRlcm1TdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHRlcm1Ob2RlKSxcbiAgICAgICAgYnJhY2tldGVkQ29uc3RydWN0b3JTdHJpbmcgPSBicmFja2V0ZWRDb25zdHJ1Y3Rvci5nZXRTdHJpbmcoKTtcblxuICBsb2NhbENvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gYWdhaW5zdCB0aGUgJyR7YnJhY2tldGVkQ29uc3RydWN0b3JTdHJpbmd9JyBicmFja2V0ZWQgY29uc3RydWN0b3IuLi5gLCB0ZXJtTm9kZSk7XG5cbiAgY29uc3QgYnJhY2tldGVkQ29uc3RydWN0b3JUZXJtTm9kZSA9IGJyYWNrZXRlZENvbnN0cnVjdG9yLmdldFRlcm1Ob2RlKCksXG4gICAgICAgIHRlcm1Ob2RlQSA9IHRlcm1Ob2RlLCAgLy8vXG4gICAgICAgIGNvbnN0cnVjdG9yVGVybU5vZGVCID0gYnJhY2tldGVkQ29uc3RydWN0b3JUZXJtTm9kZSwgIC8vL1xuICAgICAgICB1bmlmaWVkID0gdGVybUFnYWluc3RDb25zdHJ1Y3RvclVuaWZpZXIudW5pZnkodGVybU5vZGVBLCBjb25zdHJ1Y3RvclRlcm1Ob2RlQiwgbG9jYWxDb250ZXh0LCAoKSA9PiB7XG4gICAgICAgICAgbGV0IHZlcmlmaWVkQWhlYWQ7XG5cbiAgICAgICAgICBjb25zdCBicmFja2V0ZWRUZXJtTm9kZSA9IHRlcm1Ob2RlOyAvLy9cblxuICAgICAgICAgIHRlcm1Ob2RlID0gdGVybU5vZGVRdWVyeSh0ZXJtTm9kZSk7IC8vL1xuXG4gICAgICAgICAgaWYgKHRlcm1Ob2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICB2ZXJpZmllZEFoZWFkID0gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCB0eXBlO1xuXG4gICAgICAgICAgICB2ZXJpZnlUZXJtKHRlcm1Ob2RlLCB0ZXJtcywgbG9jYWxDb250ZXh0LCAoKSA9PiB7XG4gICAgICAgICAgICAgIGxldCB2ZXJpZmllZEFoZWFkO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0VGVybSA9IGZpcnN0KHRlcm1zKSxcbiAgICAgICAgICAgICAgICAgICAgdGVybSA9IGZpcnN0VGVybTsgLy8vXG5cbiAgICAgICAgICAgICAgdHlwZSA9IHRlcm0uZ2V0VHlwZSgpO1xuXG4gICAgICAgICAgICAgIHZlcmlmaWVkQWhlYWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgIHJldHVybiB2ZXJpZmllZEFoZWFkO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRlcm1zLnBvcCgpO1xuXG4gICAgICAgICAgICB0ZXJtTm9kZSA9IGJyYWNrZXRlZFRlcm1Ob2RlOyAvLy9cblxuICAgICAgICAgICAgY29uc3QgdGVybSA9IFRlcm0uZnJvbVRlcm1Ob2RlQW5kVHlwZSh0ZXJtTm9kZSwgdHlwZSk7XG5cbiAgICAgICAgICAgIHRlcm1zLnB1c2godGVybSk7XG5cbiAgICAgICAgICAgIHZlcmlmaWVkQWhlYWQgPSB2ZXJpZnlBaGVhZCgpO1xuXG4gICAgICAgICAgICBpZiAoIXZlcmlmaWVkQWhlYWQpIHtcbiAgICAgICAgICAgICAgdGVybXMucG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZlcmlmaWVkQWhlYWQ7XG4gICAgICAgIH0pO1xuXG4gIHRlcm1WZXJpZmllZEFnYWluc3RCcmFja2V0ZWRDb25zdHJ1Y3RvciA9IHVuaWZpZWQ7ICAvLy9cblxuICBpZiAodGVybVZlcmlmaWVkQWdhaW5zdEJyYWNrZXRlZENvbnN0cnVjdG9yKSB7XG4gICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gYWdhaW5zdCB0aGUgJyR7YnJhY2tldGVkQ29uc3RydWN0b3JTdHJpbmd9JyBjb25zdHJ1Y3Rvci5gLCB0ZXJtTm9kZSk7XG4gIH1cblxuICByZXR1cm4gdGVybVZlcmlmaWVkQWdhaW5zdEJyYWNrZXRlZENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlUZXJtQWdhaW5zdENvbnN0cnVjdG9yKHRlcm1Ob2RlLCB0ZXJtcywgY29uc3RydWN0b3IsIGxvY2FsQ29udGV4dCwgdmVyaWZ5QWhlYWQpIHtcbiAgbGV0IHRlcm1WZXJpZmllZEFnYWluc3RDb25zdHJ1Y3RvcjtcblxuICBjb25zdCB0ZXJtU3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyh0ZXJtTm9kZSksXG4gICAgICAgIGNvbnN0cnVjdG9yU3RyaW5nID0gY29uc3RydWN0b3IuZ2V0U3RyaW5nKCk7XG5cbiAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3Rlcm1TdHJpbmd9JyB0ZXJtIGFnYWluc3QgdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IuLi5gLCB0ZXJtTm9kZSk7XG5cbiAgY29uc3QgY29uc3RydWN0b3JUZXJtTm9kZSA9IGNvbnN0cnVjdG9yLmdldFRlcm1Ob2RlKCksXG4gICAgICAgIHRlcm1Ob2RlQSA9IHRlcm1Ob2RlLCAgLy8vXG4gICAgICAgIGNvbnN0cnVjdG9yVGVybU5vZGVCID0gY29uc3RydWN0b3JUZXJtTm9kZSwgIC8vL1xuICAgICAgICB1bmlmaWVkID0gdGVybUFnYWluc3RDb25zdHJ1Y3RvclVuaWZpZXIudW5pZnkodGVybU5vZGVBLCBjb25zdHJ1Y3RvclRlcm1Ob2RlQiwgbG9jYWxDb250ZXh0LCAoKSA9PiB7XG4gICAgICAgICAgbGV0IHZlcmlmaWVkQWhlYWQ7XG5cbiAgICAgICAgICBjb25zdCB0eXBlID0gY29uc3RydWN0b3IuZ2V0VHlwZSgpLFxuICAgICAgICAgICAgICAgIHRlcm0gPSBUZXJtLmZyb21UZXJtTm9kZUFuZFR5cGUodGVybU5vZGUsIHR5cGUpO1xuXG4gICAgICAgICAgdGVybXMucHVzaCh0ZXJtKTtcblxuICAgICAgICAgIHZlcmlmaWVkQWhlYWQgPSB2ZXJpZnlBaGVhZCgpO1xuXG4gICAgICAgICAgaWYgKCF2ZXJpZmllZEFoZWFkKSB7XG4gICAgICAgICAgICB0ZXJtcy5wb3AoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdmVyaWZpZWRBaGVhZDtcbiAgICAgICAgfSk7XG5cbiAgdGVybVZlcmlmaWVkQWdhaW5zdENvbnN0cnVjdG9yID0gdW5pZmllZDsgIC8vL1xuXG4gIGlmICh0ZXJtVmVyaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3IpIHtcbiAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSBhZ2FpbnN0IHRoZSAnJHtjb25zdHJ1Y3RvclN0cmluZ30nIGNvbnN0cnVjdG9yLmAsIHRlcm1Ob2RlKTtcbiAgfVxuXG4gIHJldHVybiB0ZXJtVmVyaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3I7XG59XG5cbiJdLCJuYW1lcyI6WyJ0ZXJtTm9kZVF1ZXJ5Iiwibm9kZVF1ZXJ5IiwidmFyaWFibGVOb2RlUXVlcnkiLCJ2ZXJpZnlUZXJtIiwidGVybU5vZGUiLCJ0ZXJtcyIsImxvY2FsQ29udGV4dCIsInZlcmlmeUFoZWFkIiwidGVybVZlcmlmaWVkIiwidGVybVN0cmluZyIsIm5vZGVBc1N0cmluZyIsInRyYWNlIiwidmVyaWZ5VGVybUZ1bmN0aW9ucyIsInZlcmlmeVRlcm1Bc1ZhcmlhYmxlIiwidmVyaWZ5VGVybUFnYWluc3RDb25zdHJ1Y3RvcnMiLCJ2ZXJpZnlUZXJtQWdhaW5zdEJyYWNrZXRlZENvbnN0cnVjdG9yIiwic29tZSIsInZlcmlmeVRlcm1GdW5jdGlvbiIsImRlYnVnIiwiT2JqZWN0IiwiYXNzaWduIiwic2hpbSIsInRlcm1WZXJpZmllZEFzVmFyaWFibGUiLCJ2YXJpYWJsZU5vZGUiLCJ2YXJpYWJsZSIsImZpbmRWYXJpYWJsZUJ5VmFyaWFibGVOb2RlIiwidmVyaWZpZWRBaGVhZCIsInR5cGUiLCJnZXRUeXBlIiwidGVybSIsIlRlcm0iLCJmcm9tVGVybU5vZGVBbmRUeXBlIiwicHVzaCIsInBvcCIsInRlcm1WZXJpZmllZEFnYWluc3RDb25zdHJ1Y3RvcnMiLCJjb25zdHJ1Y3RvcnMiLCJnZXRDb25zdHJ1Y3RvcnMiLCJjb25zdHJ1Y3RvciIsInRlcm1WZXJpZmllZEFnYWluc3RDb25zdHJ1Y3RvciIsInZlcmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3IiLCJ0ZXJtVmVyaWZpZWRBZ2FpbnN0QnJhY2tldGVkQ29uc3RydWN0b3IiLCJicmFja2V0ZWRDb25zdHJ1Y3RvclN0cmluZyIsImJyYWNrZXRlZENvbnN0cnVjdG9yIiwiZ2V0U3RyaW5nIiwiYnJhY2tldGVkQ29uc3RydWN0b3JUZXJtTm9kZSIsImdldFRlcm1Ob2RlIiwidGVybU5vZGVBIiwiY29uc3RydWN0b3JUZXJtTm9kZUIiLCJ1bmlmaWVkIiwidGVybUFnYWluc3RDb25zdHJ1Y3RvclVuaWZpZXIiLCJ1bmlmeSIsImJyYWNrZXRlZFRlcm1Ob2RlIiwiZmlyc3RUZXJtIiwiZmlyc3QiLCJjb25zdHJ1Y3RvclN0cmluZyIsImNvbnN0cnVjdG9yVGVybU5vZGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQTZDQTs7O2VBQUE7OzsyREEzQ2lCOzJEQUNBO2dFQUNnQjs2RUFDUztxQkFFcEI7cUJBQ0k7Ozs7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
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZXJpZnkvdGVybS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHNoaW0gZnJvbSBcIi4uL3NoaW1cIjtcbmltcG9ydCBUZXJtIGZyb20gXCIuLi90ZXJtXCI7XG5pbXBvcnQgYnJhY2tldGVkQ29uc3RydWN0b3IgZnJvbSBcIi4uL2NvbnN0cnVjdG9yL2JyYWNrZXRlZFwiO1xuaW1wb3J0IHRlcm1BZ2FpbnN0Q29uc3RydWN0b3JVbmlmaWVyIGZyb20gXCIuLi91bmlmaWVyL3Rlcm1BZ2FpbnN0Q29uc3RydWN0b3JcIjtcblxuaW1wb3J0IHsgZmlyc3QgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2FycmF5XCI7XG5pbXBvcnQgeyBub2RlUXVlcnkgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3F1ZXJ5XCI7XG5cbmNvbnN0IHRlcm1Ob2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvdGVybS9hcmd1bWVudC90ZXJtXCIpLFxuICAgICAgdmFyaWFibGVOb2RlUXVlcnkgPSBub2RlUXVlcnkoXCIvdGVybS92YXJpYWJsZSFcIik7XG5cbmZ1bmN0aW9uIHZlcmlmeVRlcm0odGVybU5vZGUsIHRlcm1zLCBsb2NhbENvbnRleHQsIHZlcmlmeUFoZWFkKSB7XG4gIGxldCB0ZXJtVmVyaWZpZWQ7XG5cbiAgY29uc3QgdGVybVN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcodGVybU5vZGUpO1xuXG4gIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybS4uLmAsIHRlcm1Ob2RlKTtcblxuICBjb25zdCB2ZXJpZnlUZXJtRnVuY3Rpb25zID0gW1xuICAgIHZlcmlmeVRlcm1Bc1ZhcmlhYmxlLFxuICAgIHVuaWZ5VGVybUFnYWluc3RDb25zdHJ1Y3RvcnMsXG4gICAgdW5pZnlUZXJtQWdhaW5zdEJyYWNrZXRlZENvbnN0cnVjdG9yXG4gIF07XG5cbiAgdGVybVZlcmlmaWVkID0gdmVyaWZ5VGVybUZ1bmN0aW9ucy5zb21lKCh2ZXJpZnlUZXJtRnVuY3Rpb24pID0+IHtcbiAgICBjb25zdCB0ZXJtVmVyaWZpZWQgPSB2ZXJpZnlUZXJtRnVuY3Rpb24odGVybU5vZGUsIHRlcm1zLCBsb2NhbENvbnRleHQsIHZlcmlmeUFoZWFkKTtcblxuICAgIGlmICh0ZXJtVmVyaWZpZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHRlcm1WZXJpZmllZCkge1xuICAgIGxvY2FsQ29udGV4dC5kZWJ1ZyhgLi4udmVyaWZpZWQgdGhlICcke3Rlcm1TdHJpbmd9JyB0ZXJtLmAsIHRlcm1Ob2RlKTtcbiAgfVxuXG4gIHJldHVybiB0ZXJtVmVyaWZpZWQ7XG59XG5cbk9iamVjdC5hc3NpZ24oc2hpbSwge1xuICB2ZXJpZnlUZXJtXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgdmVyaWZ5VGVybTtcblxuZnVuY3Rpb24gdmVyaWZ5VGVybUFzVmFyaWFibGUodGVybU5vZGUsIHRlcm1zLCBsb2NhbENvbnRleHQsIHZlcmlmeUFoZWFkKSB7XG4gIGxldCB0ZXJtVmVyaWZpZWRBc1ZhcmlhYmxlID0gZmFsc2U7XG5cbiAgY29uc3QgdmFyaWFibGVOb2RlID0gdmFyaWFibGVOb2RlUXVlcnkodGVybU5vZGUpO1xuXG4gIGlmICh2YXJpYWJsZU5vZGUgIT09IG51bGwpIHtcbiAgICBjb25zdCB0ZXJtU3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyh0ZXJtTm9kZSk7XG5cbiAgICBsb2NhbENvbnRleHQudHJhY2UoYFZlcmlmeWluZyB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gYXMgYSB2YXJpYWJsZS4uLmAsIHRlcm1Ob2RlKTtcblxuICAgIGNvbnN0IHZhcmlhYmxlID0gbG9jYWxDb250ZXh0LmZpbmRWYXJpYWJsZUJ5VmFyaWFibGVOb2RlKHZhcmlhYmxlTm9kZSk7XG5cbiAgICBpZiAodmFyaWFibGUgIT09IG51bGwpIHtcbiAgICAgIGxldCB2ZXJpZmllZEFoZWFkO1xuXG4gICAgICBjb25zdCB0eXBlID0gdmFyaWFibGUuZ2V0VHlwZSgpLFxuICAgICAgICAgICAgdGVybSA9IFRlcm0uZnJvbVRlcm1Ob2RlQW5kVHlwZSh0ZXJtTm9kZSwgdHlwZSk7XG5cbiAgICAgIHRlcm1zLnB1c2godGVybSk7XG5cbiAgICAgIHZlcmlmaWVkQWhlYWQgPSB2ZXJpZnlBaGVhZCgpO1xuXG4gICAgICB0ZXJtcy5wb3AoKTtcblxuICAgICAgdGVybVZlcmlmaWVkQXNWYXJpYWJsZSA9IHZlcmlmaWVkQWhlYWQ7ICAvLy9cbiAgICB9XG5cbiAgICBpZiAodGVybVZlcmlmaWVkQXNWYXJpYWJsZSkge1xuICAgICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7dGVybVN0cmluZ30nIHRlcm0gYXMgYSB2YXJpYWJsZS5gLCB0ZXJtTm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRlcm1WZXJpZmllZEFzVmFyaWFibGU7XG59XG5cbmZ1bmN0aW9uIHVuaWZ5VGVybUFnYWluc3RDb25zdHJ1Y3RvcnModGVybU5vZGUsIHRlcm1zLCBsb2NhbENvbnRleHQsIHZlcmlmeUFoZWFkKSB7XG4gIGxldCB0ZXJtVW5pZmllZEFnYWluc3RDb25zdHJ1Y3RvcnMgPSBmYWxzZTtcblxuICBjb25zdCB2YXJpYWJsZU5vZGUgPSB2YXJpYWJsZU5vZGVRdWVyeSh0ZXJtTm9kZSk7XG5cbiAgaWYgKHZhcmlhYmxlTm9kZSA9PT0gbnVsbCkge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9ycyA9IGxvY2FsQ29udGV4dC5nZXRDb25zdHJ1Y3RvcnMoKTtcblxuICAgIHRlcm1VbmlmaWVkQWdhaW5zdENvbnN0cnVjdG9ycyA9IGNvbnN0cnVjdG9ycy5zb21lKChjb25zdHJ1Y3RvcikgPT4ge1xuICAgICAgY29uc3QgdGVybVVuaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3IgPSB1bmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3IodGVybU5vZGUsIHRlcm1zLCBjb25zdHJ1Y3RvciwgbG9jYWxDb250ZXh0LCB2ZXJpZnlBaGVhZCk7XG5cbiAgICAgIGlmICh0ZXJtVW5pZmllZEFnYWluc3RDb25zdHJ1Y3Rvcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0ZXJtVW5pZmllZEFnYWluc3RDb25zdHJ1Y3RvcnM7XG59XG5cbmZ1bmN0aW9uIHVuaWZ5VGVybUFnYWluc3RCcmFja2V0ZWRDb25zdHJ1Y3Rvcih0ZXJtTm9kZSwgdGVybXMsIGxvY2FsQ29udGV4dCwgdmVyaWZ5QWhlYWQpIHtcbiAgbGV0IHRlcm1VbmlmaWVkQWdhaW5zdEJyYWNrZXRlZENvbnN0cnVjdG9yO1xuXG4gIGNvbnN0IHRlcm1TdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHRlcm1Ob2RlKSxcbiAgICAgICAgYnJhY2tldGVkQ29uc3RydWN0b3JTdHJpbmcgPSBicmFja2V0ZWRDb25zdHJ1Y3Rvci5nZXRTdHJpbmcoKTtcblxuICBsb2NhbENvbnRleHQudHJhY2UoYFVuaWZ5aW5nIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSBhZ2FpbnN0IHRoZSAnJHticmFja2V0ZWRDb25zdHJ1Y3RvclN0cmluZ30nIGJyYWNrZXRlZCBjb25zdHJ1Y3Rvci4uLmAsIHRlcm1Ob2RlKTtcblxuICBjb25zdCBicmFja2V0ZWRDb25zdHJ1Y3RvclRlcm1Ob2RlID0gYnJhY2tldGVkQ29uc3RydWN0b3IuZ2V0VGVybU5vZGUoKSxcbiAgICAgICAgdGVybU5vZGVBID0gdGVybU5vZGUsICAvLy9cbiAgICAgICAgY29uc3RydWN0b3JUZXJtTm9kZUIgPSBicmFja2V0ZWRDb25zdHJ1Y3RvclRlcm1Ob2RlLCAgLy8vXG4gICAgICAgIHVuaWZpZWQgPSB0ZXJtQWdhaW5zdENvbnN0cnVjdG9yVW5pZmllci51bmlmeSh0ZXJtTm9kZUEsIGNvbnN0cnVjdG9yVGVybU5vZGVCLCBsb2NhbENvbnRleHQsICgpID0+IHtcbiAgICAgICAgICBsZXQgdmVyaWZpZWRBaGVhZDtcblxuICAgICAgICAgIGNvbnN0IGJyYWNrZXRlZFRlcm1Ob2RlID0gdGVybU5vZGU7IC8vL1xuXG4gICAgICAgICAgdGVybU5vZGUgPSB0ZXJtTm9kZVF1ZXJ5KHRlcm1Ob2RlKTsgLy8vXG5cbiAgICAgICAgICBpZiAodGVybU5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHZlcmlmaWVkQWhlYWQgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHR5cGU7XG5cbiAgICAgICAgICAgIHZlcmlmeVRlcm0odGVybU5vZGUsIHRlcm1zLCBsb2NhbENvbnRleHQsICgpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHZlcmlmaWVkQWhlYWQ7XG5cbiAgICAgICAgICAgICAgY29uc3QgZmlyc3RUZXJtID0gZmlyc3QodGVybXMpLFxuICAgICAgICAgICAgICAgICAgICB0ZXJtID0gZmlyc3RUZXJtOyAvLy9cblxuICAgICAgICAgICAgICB0eXBlID0gdGVybS5nZXRUeXBlKCk7XG5cbiAgICAgICAgICAgICAgdmVyaWZpZWRBaGVhZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHZlcmlmaWVkQWhlYWQ7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGVybXMucG9wKCk7XG5cbiAgICAgICAgICAgIHRlcm1Ob2RlID0gYnJhY2tldGVkVGVybU5vZGU7IC8vL1xuXG4gICAgICAgICAgICBjb25zdCB0ZXJtID0gVGVybS5mcm9tVGVybU5vZGVBbmRUeXBlKHRlcm1Ob2RlLCB0eXBlKTtcblxuICAgICAgICAgICAgdGVybXMucHVzaCh0ZXJtKTtcblxuICAgICAgICAgICAgdmVyaWZpZWRBaGVhZCA9IHZlcmlmeUFoZWFkKCk7XG5cbiAgICAgICAgICAgIHRlcm1zLnBvcCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB2ZXJpZmllZEFoZWFkO1xuICAgICAgICB9KTtcblxuICB0ZXJtVW5pZmllZEFnYWluc3RCcmFja2V0ZWRDb25zdHJ1Y3RvciA9IHVuaWZpZWQ7ICAvLy9cblxuICBpZiAodGVybVVuaWZpZWRBZ2FpbnN0QnJhY2tldGVkQ29uc3RydWN0b3IpIHtcbiAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3Rlcm1TdHJpbmd9JyB0ZXJtIGFnYWluc3QgdGhlICcke2JyYWNrZXRlZENvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IuYCwgdGVybU5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIHRlcm1VbmlmaWVkQWdhaW5zdEJyYWNrZXRlZENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiB1bmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3IodGVybU5vZGUsIHRlcm1zLCBjb25zdHJ1Y3RvciwgbG9jYWxDb250ZXh0LCB2ZXJpZnlBaGVhZCkge1xuICBsZXQgdGVybVVuaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3I7XG5cbiAgY29uc3QgdGVybVN0cmluZyA9IGxvY2FsQ29udGV4dC5ub2RlQXNTdHJpbmcodGVybU5vZGUpLFxuICAgICAgICBjb25zdHJ1Y3RvclN0cmluZyA9IGNvbnN0cnVjdG9yLmdldFN0cmluZygpO1xuXG4gIGxvY2FsQ29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3Rlcm1TdHJpbmd9JyB0ZXJtIGFnYWluc3QgdGhlICcke2NvbnN0cnVjdG9yU3RyaW5nfScgY29uc3RydWN0b3IuLi5gLCB0ZXJtTm9kZSk7XG5cbiAgY29uc3QgY29uc3RydWN0b3JUZXJtTm9kZSA9IGNvbnN0cnVjdG9yLmdldFRlcm1Ob2RlKCksXG4gICAgICAgIHRlcm1Ob2RlQSA9IHRlcm1Ob2RlLCAgLy8vXG4gICAgICAgIGNvbnN0cnVjdG9yVGVybU5vZGVCID0gY29uc3RydWN0b3JUZXJtTm9kZSwgIC8vL1xuICAgICAgICB1bmlmaWVkID0gdGVybUFnYWluc3RDb25zdHJ1Y3RvclVuaWZpZXIudW5pZnkodGVybU5vZGVBLCBjb25zdHJ1Y3RvclRlcm1Ob2RlQiwgbG9jYWxDb250ZXh0LCAoKSA9PiB7XG4gICAgICAgICAgbGV0IHZlcmlmaWVkQWhlYWQ7XG5cbiAgICAgICAgICBjb25zdCB0eXBlID0gY29uc3RydWN0b3IuZ2V0VHlwZSgpLFxuICAgICAgICAgICAgICAgIHRlcm0gPSBUZXJtLmZyb21UZXJtTm9kZUFuZFR5cGUodGVybU5vZGUsIHR5cGUpO1xuXG4gICAgICAgICAgdGVybXMucHVzaCh0ZXJtKTtcblxuICAgICAgICAgIHZlcmlmaWVkQWhlYWQgPSB2ZXJpZnlBaGVhZCgpO1xuXG4gICAgICAgICAgdGVybXMucG9wKCk7XG5cbiAgICAgICAgICByZXR1cm4gdmVyaWZpZWRBaGVhZDtcbiAgICAgICAgfSk7XG5cbiAgdGVybVVuaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3IgPSB1bmlmaWVkOyAgLy8vXG5cbiAgaWYgKHRlcm1VbmlmaWVkQWdhaW5zdENvbnN0cnVjdG9yKSB7XG4gICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHt0ZXJtU3RyaW5nfScgdGVybSBhZ2FpbnN0IHRoZSAnJHtjb25zdHJ1Y3RvclN0cmluZ30nIGNvbnN0cnVjdG9yLmAsIHRlcm1Ob2RlKTtcbiAgfVxuXG4gIHJldHVybiB0ZXJtVW5pZmllZEFnYWluc3RDb25zdHJ1Y3Rvcjtcbn1cblxuIl0sIm5hbWVzIjpbInRlcm1Ob2RlUXVlcnkiLCJub2RlUXVlcnkiLCJ2YXJpYWJsZU5vZGVRdWVyeSIsInZlcmlmeVRlcm0iLCJ0ZXJtTm9kZSIsInRlcm1zIiwibG9jYWxDb250ZXh0IiwidmVyaWZ5QWhlYWQiLCJ0ZXJtVmVyaWZpZWQiLCJ0ZXJtU3RyaW5nIiwibm9kZUFzU3RyaW5nIiwidHJhY2UiLCJ2ZXJpZnlUZXJtRnVuY3Rpb25zIiwidmVyaWZ5VGVybUFzVmFyaWFibGUiLCJ1bmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3JzIiwidW5pZnlUZXJtQWdhaW5zdEJyYWNrZXRlZENvbnN0cnVjdG9yIiwic29tZSIsInZlcmlmeVRlcm1GdW5jdGlvbiIsImRlYnVnIiwiT2JqZWN0IiwiYXNzaWduIiwic2hpbSIsInRlcm1WZXJpZmllZEFzVmFyaWFibGUiLCJ2YXJpYWJsZU5vZGUiLCJ2YXJpYWJsZSIsImZpbmRWYXJpYWJsZUJ5VmFyaWFibGVOb2RlIiwidmVyaWZpZWRBaGVhZCIsInR5cGUiLCJnZXRUeXBlIiwidGVybSIsIlRlcm0iLCJmcm9tVGVybU5vZGVBbmRUeXBlIiwicHVzaCIsInBvcCIsInRlcm1VbmlmaWVkQWdhaW5zdENvbnN0cnVjdG9ycyIsImNvbnN0cnVjdG9ycyIsImdldENvbnN0cnVjdG9ycyIsImNvbnN0cnVjdG9yIiwidGVybVVuaWZpZWRBZ2FpbnN0Q29uc3RydWN0b3IiLCJ1bmlmeVRlcm1BZ2FpbnN0Q29uc3RydWN0b3IiLCJ0ZXJtVW5pZmllZEFnYWluc3RCcmFja2V0ZWRDb25zdHJ1Y3RvciIsImJyYWNrZXRlZENvbnN0cnVjdG9yU3RyaW5nIiwiYnJhY2tldGVkQ29uc3RydWN0b3IiLCJnZXRTdHJpbmciLCJicmFja2V0ZWRDb25zdHJ1Y3RvclRlcm1Ob2RlIiwiZ2V0VGVybU5vZGUiLCJ0ZXJtTm9kZUEiLCJjb25zdHJ1Y3RvclRlcm1Ob2RlQiIsInVuaWZpZWQiLCJ0ZXJtQWdhaW5zdENvbnN0cnVjdG9yVW5pZmllciIsInVuaWZ5IiwiYnJhY2tldGVkVGVybU5vZGUiLCJmaXJzdFRlcm0iLCJmaXJzdCIsImNvbnN0cnVjdG9yU3RyaW5nIiwiY29uc3RydWN0b3JUZXJtTm9kZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBNkNBOzs7ZUFBQTs7OzJEQTNDaUI7MkRBQ0E7Z0VBQ2dCOzZFQUNTO3FCQUVwQjtxQkFDSTs7Ozs7O0FBRTFCLElBQU1BLGdCQUFnQkMsSUFBQUEsZ0JBQVMsRUFBQyx3QkFDMUJDLG9CQUFvQkQsSUFBQUEsZ0JBQVMsRUFBQztBQUVwQyxTQUFTRSxXQUFXQyxRQUFRLEVBQUVDLEtBQUssRUFBRUMsWUFBWSxFQUFFQyxXQUFXO0lBQzVELElBQUlDO0lBRUosSUFBTUMsYUFBYUgsYUFBYUksWUFBWSxD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
@@ -8,14 +8,13 @@ Object.defineProperty(exports, "default", {
8
8
  return verifyVariable;
9
9
  }
10
10
  });
11
- function verifyVariable(variableNode, localContext, verifyAhead) {
11
+ function verifyVariable(variableNode, localContext) {
12
12
  var variableVerified = false;
13
13
  var variableString = localContext.nodeAsString(variableNode);
14
14
  localContext.trace("Verifying the '".concat(variableString, "' variable..."), variableNode);
15
15
  var variablePresent = localContext.isVariablePresentByVariableNode(variableNode);
16
16
  if (variablePresent) {
17
- var verifiedAhead = verifyAhead();
18
- variableVerified = verifiedAhead; ///
17
+ variableVerified = true;
19
18
  }
20
19
  if (variableVerified) {
21
20
  localContext.debug("...verified the '".concat(variableString, "' variable."), variableNode);
@@ -23,4 +22,4 @@ function verifyVariable(variableNode, localContext, verifyAhead) {
23
22
  return variableVerified;
24
23
  }
25
24
 
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZXJpZnkvdmFyaWFibGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZlcmlmeVZhcmlhYmxlKHZhcmlhYmxlTm9kZSwgbG9jYWxDb250ZXh0LCB2ZXJpZnlBaGVhZCkge1xuICBsZXQgdmFyaWFibGVWZXJpZmllZCA9IGZhbHNlO1xuXG4gIGNvbnN0IHZhcmlhYmxlU3RyaW5nID0gbG9jYWxDb250ZXh0Lm5vZGVBc1N0cmluZyh2YXJpYWJsZU5vZGUpO1xuXG4gIGxvY2FsQ29udGV4dC50cmFjZShgVmVyaWZ5aW5nIHRoZSAnJHt2YXJpYWJsZVN0cmluZ30nIHZhcmlhYmxlLi4uYCwgdmFyaWFibGVOb2RlKTtcblxuICBjb25zdCB2YXJpYWJsZVByZXNlbnQgPSBsb2NhbENvbnRleHQuaXNWYXJpYWJsZVByZXNlbnRCeVZhcmlhYmxlTm9kZSh2YXJpYWJsZU5vZGUpO1xuXG4gIGlmICh2YXJpYWJsZVByZXNlbnQpIHtcbiAgICBjb25zdCB2ZXJpZmllZEFoZWFkID0gdmVyaWZ5QWhlYWQoKTtcblxuICAgIHZhcmlhYmxlVmVyaWZpZWQgPSB2ZXJpZmllZEFoZWFkOyAvLy9cbiAgfVxuXG4gIGlmICh2YXJpYWJsZVZlcmlmaWVkKSB7XG4gICAgbG9jYWxDb250ZXh0LmRlYnVnKGAuLi52ZXJpZmllZCB0aGUgJyR7dmFyaWFibGVTdHJpbmd9JyB2YXJpYWJsZS5gLCB2YXJpYWJsZU5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIHZhcmlhYmxlVmVyaWZpZWQ7XG59XG4iXSwibmFtZXMiOlsidmVyaWZ5VmFyaWFibGUiLCJ2YXJpYWJsZU5vZGUiLCJsb2NhbENvbnRleHQiLCJ2ZXJpZnlBaGVhZCIsInZhcmlhYmxlVmVyaWZpZWQiLCJ2YXJpYWJsZVN0cmluZyIsIm5vZGVBc1N0cmluZyIsInRyYWNlIiwidmFyaWFibGVQcmVzZW50IiwiaXNWYXJpYWJsZVByZXNlbnRCeVZhcmlhYmxlTm9kZSIsInZlcmlmaWVkQWhlYWQiLCJkZWJ1ZyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBRUE7OztlQUF3QkE7OztBQUFULFNBQVNBLGVBQWVDLFlBQVksRUFBRUMsWUFBWSxFQUFFQyxXQUFXO0lBQzVFLElBQUlDLG1CQUFtQjtJQUV2QixJQUFNQyxpQkFBaUJILGFBQWFJLFlBQVksQ0FBQ0w7SUFFakRDLGFBQWFLLEtBQUssQ0FBQyxBQUFDLGtCQUFnQyxPQUFmRixnQkFBZSxrQkFBZ0JKO0lBRXBFLElBQU1PLGtCQUFrQk4sYUFBYU8sK0JBQStCLENBQUNSO0lBRXJFLElBQUlPLGlCQUFpQjtRQUNuQixJQUFNRSxnQkFBZ0JQO1FBRXRCQyxtQkFBbUJNLGVBQWUsR0FBRztJQUN2QztJQUVBLElBQUlOLGtCQUFrQjtRQUNwQkYsYUFBYVMsS0FBSyxDQUFDLEFBQUMsb0JBQWtDLE9BQWZOLGdCQUFlLGdCQUFjSjtJQUN0RTtJQUVBLE9BQU9HO0FBQ1QifQ==
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92ZXJpZnkvdmFyaWFibGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZlcmlmeVZhcmlhYmxlKHZhcmlhYmxlTm9kZSwgbG9jYWxDb250ZXh0KSB7XG4gIGxldCB2YXJpYWJsZVZlcmlmaWVkID0gZmFsc2U7XG5cbiAgY29uc3QgdmFyaWFibGVTdHJpbmcgPSBsb2NhbENvbnRleHQubm9kZUFzU3RyaW5nKHZhcmlhYmxlTm9kZSk7XG5cbiAgbG9jYWxDb250ZXh0LnRyYWNlKGBWZXJpZnlpbmcgdGhlICcke3ZhcmlhYmxlU3RyaW5nfScgdmFyaWFibGUuLi5gLCB2YXJpYWJsZU5vZGUpO1xuXG4gIGNvbnN0IHZhcmlhYmxlUHJlc2VudCA9IGxvY2FsQ29udGV4dC5pc1ZhcmlhYmxlUHJlc2VudEJ5VmFyaWFibGVOb2RlKHZhcmlhYmxlTm9kZSk7XG5cbiAgaWYgKHZhcmlhYmxlUHJlc2VudCkge1xuICAgIHZhcmlhYmxlVmVyaWZpZWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKHZhcmlhYmxlVmVyaWZpZWQpIHtcbiAgICBsb2NhbENvbnRleHQuZGVidWcoYC4uLnZlcmlmaWVkIHRoZSAnJHt2YXJpYWJsZVN0cmluZ30nIHZhcmlhYmxlLmAsIHZhcmlhYmxlTm9kZSk7XG4gIH1cblxuICByZXR1cm4gdmFyaWFibGVWZXJpZmllZDtcbn1cbiJdLCJuYW1lcyI6WyJ2ZXJpZnlWYXJpYWJsZSIsInZhcmlhYmxlTm9kZSIsImxvY2FsQ29udGV4dCIsInZhcmlhYmxlVmVyaWZpZWQiLCJ2YXJpYWJsZVN0cmluZyIsIm5vZGVBc1N0cmluZyIsInRyYWNlIiwidmFyaWFibGVQcmVzZW50IiwiaXNWYXJpYWJsZVByZXNlbnRCeVZhcmlhYmxlTm9kZSIsImRlYnVnIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFFQTs7O2VBQXdCQTs7O0FBQVQsU0FBU0EsZUFBZUMsWUFBWSxFQUFFQyxZQUFZO0lBQy9ELElBQUlDLG1CQUFtQjtJQUV2QixJQUFNQyxpQkFBaUJGLGFBQWFHLFlBQVksQ0FBQ0o7SUFFakRDLGFBQWFJLEtBQUssQ0FBQyxBQUFDLGtCQUFnQyxPQUFmRixnQkFBZSxrQkFBZ0JIO0lBRXBFLElBQU1NLGtCQUFrQkwsYUFBYU0sK0JBQStCLENBQUNQO0lBRXJFLElBQUlNLGlCQUFpQjtRQUNuQkosbUJBQW1CO0lBQ3JCO0lBRUEsSUFBSUEsa0JBQWtCO1FBQ3BCRCxhQUFhTyxLQUFLLENBQUMsQUFBQyxvQkFBa0MsT0FBZkwsZ0JBQWUsZ0JBQWNIO0lBQ3RFO0lBRUEsT0FBT0U7QUFDVCJ9
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "occam-verify-cli",
3
3
  "author": "James Smith",
4
- "version": "0.0.942",
4
+ "version": "0.0.943",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/occam-verify-cli",
7
7
  "description": "Occam's Verifier",
package/src/conclusion.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 { nodeAsString } from "./utilities/string";
@@ -15,15 +14,12 @@ export default class Conclusion {
15
14
  return this.statementNode;
16
15
  }
17
16
 
18
- unifyStatement(statementNode, substitutions, fileContext, localContext) {
17
+ unifyStatement(statementNodeB, substitutions, localContextA, localContextB) {
19
18
  let statementUnified = false;
20
19
 
21
20
  if (this.statementNode !== null) {
22
21
  const nodeA = this.statementNode, ///
23
- nodeB = statementNode, ///
24
- fileContextA = fileContext, ///
25
- localContextA = LocalContext.fromFileContext(fileContextA),
26
- localContextB = localContext, ///
22
+ nodeB = statementNodeB, ///
27
23
  unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
28
24
 
29
25
  statementUnified = unified; ///
package/src/consequent.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 { nodeAsString } from "./utilities/string";
@@ -15,15 +14,12 @@ export default class Consequent {
15
14
  return this.statementNode;
16
15
  }
17
16
 
18
- unifyStatement(statementNode, substitutions, fileContext, localContext) {
17
+ unifyStatement(statementNodeB, substitutions, localContextA, localContextB) {
19
18
  let statementUnified = false;
20
19
 
21
20
  if (this.statementNode !== null) {
22
21
  const nodeA = this.statementNode, ///
23
- nodeB = statementNode, ///
24
- fileContextA = fileContext, ///
25
- localContextA = LocalContext.fromFileContext(fileContextA),
26
- localContextB = localContext, ///
22
+ nodeB = statementNodeB, ///
27
23
  unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
28
24
 
29
25
  statementUnified = unified; ///
package/src/constants.js CHANGED
@@ -2,5 +2,6 @@
2
2
 
3
3
  export const NOT = "not";
4
4
  export const COMMA = ",";
5
+ export const FUNCTION = "function";
5
6
  export const EMPTY_STRING = "";
6
7
  export const BRACKETED_STATEMENT_DEPTH = 3;
@@ -323,12 +323,12 @@ export default class FileContext {
323
323
  findMetavariableByName(name) {
324
324
  const metavariables = this.getMetavariables(),
325
325
  metavariable = metavariables.find((metavariable) => {
326
- const matches = metavariable.matchName(name);
326
+ const matches = metavariable.matchName(name);
327
327
 
328
- if (matches) {
329
- return true;
330
- }
331
- }) || null;
328
+ if (matches) {
329
+ return true;
330
+ }
331
+ }) || null;
332
332
 
333
333
  return metavariable;
334
334
  }
@@ -88,6 +88,8 @@ class LocalContext {
88
88
  return lastProofStep;
89
89
  }
90
90
 
91
+ getTokens() { return this.context.getTokens(); }
92
+
91
93
  getAxioms() { return this.context.getAxioms(); }
92
94
 
93
95
  getLemmas() { return this.context.getLemmas(); }
@@ -228,21 +230,30 @@ class LocalContext {
228
230
  return metavariableAdded;
229
231
  }
230
232
 
231
- unifyStatement(statementNode) {
233
+ unifyStatement(statementNode, localContext) {
232
234
  let proofSteps = this.getProofSteps();
233
235
 
234
236
  proofSteps = reverse(proofSteps); ///
235
237
 
236
- const localContext = this, ///
237
- equivalences = this.getEquivalences();
238
+ const localContextA = this, ///
239
+ localContextB = localContext, ///
240
+ statementNodeAB = statementNode, ///
241
+ statementStringB = localContextA.nodeAsString(statementNodeAB);
238
242
 
239
- const statementUnified = proofSteps.some((proofStep) => {
240
- const statementUnified = proofStep.unifyStatement(statementNode, equivalences, localContext);
243
+ localContextB.trace(`Unifying the '${statementStringB}' statement...`, statementNodeAB);
241
244
 
242
- if (statementUnified) {
243
- return true;
244
- }
245
- });
245
+ const equivalences = this.getEquivalences(),
246
+ statementUnified = proofSteps.some((proofStep) => {
247
+ const statementUnified = proofStep.unifyStatement(statementNode, equivalences, localContextA, localContextB);
248
+
249
+ if (statementUnified) {
250
+ return true;
251
+ }
252
+ });
253
+
254
+ if (statementUnified) {
255
+ localContextB.debug(`...unified the '${statementStringB}' statement.`, statementNodeAB);
256
+ }
246
257
 
247
258
  return statementUnified;
248
259
  }
@@ -128,7 +128,7 @@ export default class Metavariable {
128
128
  }
129
129
  }
130
130
 
131
- function verifyTermAgainstTermType(termNode, termType, localContext) {
131
+ export function verifyTermAgainstTermType(termNode, termType, localContext) {
132
132
  let termVerifiedAgainstTermType;
133
133
 
134
134
  const type = termType, ///
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
64
  const nodeA = statementNodeA, ///
65
65
  nodeB = statementNodeB, ///
66
- localContextA = localContext, ///
67
- localContextB = localContext, ///
68
- substitutions = Substitutions.fromNothing(),
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(),
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
 
@@ -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),