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
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ import { subproofNodeAsSubproofString } from "../utilities/unify";
4
+
5
+ export default function unifyPremiseAgainstProofStep(premiseA, proofStepB, substitutions, localContextA, localContextB) {
6
+ let premiseUnified = false;
7
+
8
+ const premiseAStatementNode = premiseA.getStatementNode();
9
+
10
+ if (premiseAStatementNode !== null) {
11
+ const proofStepBSubproofNode = proofStepB.getSubproofNode(),
12
+ proofStepBStatementNode = proofStepB.getStatementNode(),
13
+ subproofNodeB = proofStepBSubproofNode, ///
14
+ statementNodeB = proofStepBStatementNode, ///
15
+ statementNodeA = premiseAStatementNode, ///
16
+ statementStringA = localContextA.nodeAsString(statementNodeA)
17
+
18
+ substitutions.snapshot();
19
+
20
+ if (subproofNodeB !== null) {
21
+ const subproofStringB = subproofNodeAsSubproofString(subproofNodeB, localContextB);
22
+
23
+ localContextB.trace(`Unifying the '${subproofStringB}' subproof against the premise's '${statementStringA}' statement...`, subproofNodeB);
24
+
25
+ const subproofUnified = premiseA.unifySubproof(subproofNodeB, substitutions, localContextA, localContextB);
26
+
27
+ if (subproofUnified) {
28
+ localContextB.debug(`...unified the '${subproofStringB}' subproof against the premise's '${statementStringA}' statement.`, subproofNodeB);
29
+
30
+ premiseUnified = true;
31
+ }
32
+ }
33
+
34
+ if (statementNodeB !== null) {
35
+ const statementStringB = localContextB.nodeAsString(statementNodeB);
36
+
37
+ localContextB.trace(`Unifying the '${statementStringB}' statement against the premise's '${statementStringA}' statement...`, statementNodeB);
38
+
39
+ const statementUnified = premiseA.unifyStatement(statementNodeB, substitutions, localContextA, localContextB);
40
+
41
+ if (statementUnified) {
42
+ localContextB.debug(`...unified the '${statementStringB}' statement against the premise's '${statementStringA}' statement.`, statementNodeB);
43
+
44
+ premiseUnified = true;
45
+ }
46
+ }
47
+
48
+ premiseUnified ?
49
+ substitutions.continue() :
50
+ substitutions.rollback(localContextA, localContextB);
51
+ }
52
+
53
+ return premiseUnified;
54
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ import LocalContext from "../context/local";
4
+ import unifyPremiseAgainstProofStep from "../unify/premiseAgainstProofStep";
5
+
6
+ import { reverse, correlate } from "../utilities/array";
7
+
8
+ export default function unifyPremisesAgainstProofSteps(premisesA, proofStepsB, substitutions, fileContextA, localContextB) {
9
+ premisesA = reverse(premisesA); ///
10
+
11
+ proofStepsB = reverse(proofStepsB); ///
12
+
13
+ const premisesUnified = correlate(premisesA, proofStepsB, (premiseA, proofStepB) => {
14
+ const localContextA = LocalContext.fromFileContext(fileContextA),
15
+ premiseUnified = unifyPremiseAgainstProofStep(premiseA, proofStepB, substitutions, localContextA, localContextB);
16
+
17
+ if (premiseUnified) {
18
+ return true;
19
+ }
20
+ });
21
+
22
+ return premisesUnified;
23
+ }
@@ -7,27 +7,19 @@ import { STATEMENT_META_TYPE_NAME } from "../metaTypeNames";
7
7
 
8
8
  const metaTypeTerminalNodeQuery = nodeQuery("/metaType/@meta-type!");
9
9
 
10
- export default function unifyStatementAgainstMetaType(statementNodeA, metaTypeNodeB, localContext, unifyAhead) {
10
+ export default function unifyStatementAgainstMetaType(statementNode, metaTypeNode, localContext) {
11
11
  let statementVerifiedAgainstMetaType = false;
12
12
 
13
- const metaTypeNode = metaTypeNodeB, ///
14
- metaTypeTerminalNode = metaTypeTerminalNodeQuery(metaTypeNode),
13
+ const metaTypeTerminalNode = metaTypeTerminalNodeQuery(metaTypeNode),
15
14
  content = metaTypeTerminalNode.getContent();
16
15
 
17
16
  if (content === STATEMENT_META_TYPE_NAME) {
18
- let unifiedAhead = false;
19
-
20
17
  const { verifyStatement } = shim,
21
18
  derived = false,
22
19
  assignments = [],
23
- statementNode = statementNodeA, ///
24
20
  statementVerified = verifyStatement(statementNode, assignments, derived, localContext);
25
21
 
26
- if (statementVerified) {
27
- unifiedAhead = unifyAhead();
28
- }
29
-
30
- statementVerifiedAgainstMetaType = unifiedAhead; ///
22
+ statementVerifiedAgainstMetaType = statementVerified;
31
23
  }
32
24
 
33
25
  return statementVerifiedAgainstMetaType;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ import { subproofNodeAsSubproofString } from "../utilities/unify";
4
+
5
+ export default function unifySuppositionAgainstProofStep(suppositionA, proofStepB, substitutions, localContextA, localContextB) {
6
+ let suppositionUnified = false;
7
+
8
+ const suppositionAStatementNode = suppositionA.getStatementNode();
9
+
10
+ if (suppositionAStatementNode !== null) {
11
+ const proofStepBSubproofNode = proofStepB.getSubproofNode(),
12
+ proofStepBStatementNode = proofStepB.getStatementNode(),
13
+ subproofNodeB = proofStepBSubproofNode, ///
14
+ statementNodeB = proofStepBStatementNode, ///
15
+ statementNodeA = suppositionAStatementNode, ///
16
+ statementStringA = localContextA.nodeAsString(statementNodeA)
17
+
18
+ substitutions.snapshot();
19
+
20
+ if (subproofNodeB !== null) {
21
+ const subproofStringB = subproofNodeAsSubproofString(subproofNodeB, localContextB);
22
+
23
+ localContextB.trace(`Unifying the '${subproofStringB}' subproof against the supposition's '${statementStringA}' statement...`, subproofNodeB);
24
+
25
+ const subproofUnified = suppositionA.unifySubproof(subproofNodeB, substitutions, localContextA, localContextB);
26
+
27
+ if (subproofUnified) {
28
+ localContextB.debug(`...unified the '${subproofStringB}' subproof against the supposition's '${statementStringA}' statement.`, subproofNodeB);
29
+
30
+ suppositionUnified = true;
31
+ }
32
+ }
33
+
34
+ if (statementNodeB !== null) {
35
+ const statementStringB = localContextB.nodeAsString(statementNodeB);
36
+
37
+ localContextB.trace(`Unifying the '${statementStringB}' statement against the supposition's '${statementStringA}' statement...`, statementNodeB);
38
+
39
+ const statementUnified = suppositionA.unifyStatement(statementNodeB, substitutions, localContextA, localContextB);
40
+
41
+ if (statementUnified) {
42
+ localContextB.debug(`...unified the '${statementStringB}' statement against the supposition's '${statementStringA}' statement.`, statementNodeB);
43
+
44
+ suppositionUnified = true;
45
+ }
46
+ }
47
+
48
+ suppositionUnified ?
49
+ substitutions.continue() :
50
+ substitutions.rollback(localContextA, localContextB);
51
+ }
52
+
53
+ return suppositionUnified;
54
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ import LocalContext from "../context/local";
4
+ import unifySuppositionAgainstProofStep from "./suppositionAgainstProofStep";
5
+
6
+ import { reverse, correlate } from "../utilities/array";
7
+
8
+ export default function unifySuppositionsAgainstProofSteps(suppositionsA, proofStepsB, substitutions, fileContextA, localContextB) {
9
+ suppositionsA = reverse(suppositionsA); ///
10
+
11
+ proofStepsB = reverse(proofStepsB); ///
12
+
13
+ const suppositionsUnified = correlate(suppositionsA, proofStepsB, (suppositionA, proofStepB) => {
14
+ const localContextA = LocalContext.fromFileContext(fileContextA),
15
+ suppositionUnified = unifySuppositionAgainstProofStep(suppositionA, proofStepB, substitutions, localContextA, localContextB);
16
+
17
+ if (suppositionUnified) {
18
+ return true;
19
+ }
20
+ });
21
+
22
+ return suppositionsUnified;
23
+ }
@@ -2,18 +2,14 @@
2
2
 
3
3
  import { areTermNodesEqual } from "../utilities/equivalences";
4
4
 
5
- export default function unifyTermAgainstTerm(termNodeA, termNodeB, localContext, unifyAhead) {
5
+ export default function unifyTermAgainstTerm(leftTermNode, rightTermNode, localContext) {
6
6
  let termUnifiedAgainstTerm = false;
7
7
 
8
- const leftTermNode = termNodeA, ///
9
- rightTermNode = termNodeB, ///
10
- equivalences = localContext.getEquivalences(),
8
+ const equivalences = localContext.getEquivalences(),
11
9
  termNodesEqual = areTermNodesEqual(leftTermNode, rightTermNode, equivalences);
12
10
 
13
11
  if (termNodesEqual) {
14
- const unifiedAhead = unifyAhead();
15
-
16
- termUnifiedAgainstTerm = unifiedAhead; ///
12
+ termUnifiedAgainstTerm = true;
17
13
  }
18
14
 
19
15
  return termUnifiedAgainstTerm;
@@ -4,26 +4,25 @@ import shim from "../shim";
4
4
 
5
5
  import { first } from "../utilities/array";
6
6
 
7
- export default function unifyTermAgainstType(termNodeA, typeNodeB, localContext, unifyAhead) {
7
+ export default function unifyTermAgainstType(termNode, typeNode, localContext) {
8
8
  let termUnifiedAgainstType;
9
9
 
10
10
  const { verifyTerm } = shim,
11
11
  terms = [],
12
- termVerified = verifyTerm(termNodeA, terms, localContext, () => {
13
- let unifiedAhead = false;
12
+ termVerified = verifyTerm(termNode, terms, localContext, () => {
13
+ let verifiedAhead = false;
14
14
 
15
15
  const firstTerm = first(terms),
16
16
  term = firstTerm, ///
17
17
  termType = term.getType(),
18
- typeNode = typeNodeB, ///
19
18
  type = localContext.findTypeByTypeNode(typeNode),
20
19
  termTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(type);
21
20
 
22
21
  if (termTypeEqualToOrSubTypeOfType) {
23
- unifiedAhead = unifyAhead();
22
+ verifiedAhead = true;
24
23
  }
25
24
 
26
- return unifiedAhead;
25
+ return verifiedAhead;
27
26
  });
28
27
 
29
28
  termUnifiedAgainstType = termVerified; ///
@@ -1,14 +1,12 @@
1
1
  "use strict";
2
2
 
3
- import verifyTerm from "../verify/term";
4
3
  import TermForVariableSubstitution from "../substitution/termForVariable";
5
4
 
6
- import { first } from "../utilities/array";
7
5
  import { nodeQuery } from "../utilities/query";
8
6
 
9
7
  const variableNodeQuery = nodeQuery("/term/variable");
10
8
 
11
- export default function unifyVariableAgainstTerm(variableNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead) {
9
+ export default function unifyVariableAgainstTerm(variableNodeA, termNodeB, substitutions, localContextA, localContextB) {
12
10
  let variableUnifiedAgainstTerm = false;
13
11
 
14
12
  const substitution = substitutions.findSubstitution((substitution) => {
@@ -23,66 +21,38 @@ export default function unifyVariableAgainstTerm(variableNodeA, termNodeB, subst
23
21
  const substitutionMatchesTermNodeB = substitution.matchTermNode(termNodeB);
24
22
 
25
23
  if (substitutionMatchesTermNodeB) {
26
- const verifiedAhead = verifyAhead();
27
-
28
- variableUnifiedAgainstTerm = verifiedAhead; ///
24
+ variableUnifiedAgainstTerm = true;
29
25
  }
30
26
  } else {
31
27
  const variableA = localContextA.findVariableByVariableNode(variableNodeA);
32
28
 
33
29
  if (variableA !== null) {
34
- const terms = [],
35
- termUnified = verifyTerm(termNodeB, terms, localContextB, () => {
36
- let verifiedAhead = false;
37
-
38
- const firstTerm = first(terms),
39
- termB = firstTerm, ///
40
- variableB = variableFromTerm(termB, localContextB);
41
-
42
- if (variableA === variableB) {
43
- verifiedAhead = verifyAhead();
44
- } else {
45
- const term = termB, ///
46
- variable = variableA, ///
47
- termType = term.getType(),
48
- variableType = variable.getType(),
49
- variableTypeEqualToOrSuperTypeOfTermType = variableType.isEqualToOrSuperTypeOf(termType);
50
-
51
- if (variableTypeEqualToOrSuperTypeOfTermType) {
52
- const termNode = termNodeB, ///
53
- variableNode = variableNodeA, ///
54
- termForVariableSubstitution = TermForVariableSubstitution.fromVariableNodeAndTermNode(variableNode, termNode),
55
- substitution = termForVariableSubstitution; ///
56
-
57
- substitutions.addSubstitution(substitution);
58
-
59
- verifiedAhead = verifyAhead();
60
-
61
- if (!verifiedAhead) {
62
- substitutions.removeSubstitution(substitution);
63
- }
64
- }
65
- }
66
-
67
- return verifiedAhead;
68
- });
69
-
70
- variableUnifiedAgainstTerm = termUnified; ///
30
+ const variableB = variableFromTermNode(termNodeB, localContextB);
31
+
32
+ if (variableA !== variableB) {
33
+ const termNode = termNodeB, ///
34
+ variableNode = variableNodeA, ///
35
+ termForVariableSubstitution = TermForVariableSubstitution.fromVariableNodeAndTermNode(variableNode, termNode),
36
+ substitution = termForVariableSubstitution; ///
37
+
38
+ substitutions.addSubstitution(substitution, localContextA, localContextB);
39
+ }
40
+
41
+ variableUnifiedAgainstTerm = true;
71
42
  }
72
43
  }
73
44
 
74
45
  return variableUnifiedAgainstTerm;
75
46
  }
76
47
 
77
- function variableFromTerm(term, localContext) {
48
+ function variableFromTermNode(termNode, localContext) {
78
49
  let variable = null;
79
50
 
80
- const termNode = term.getNode(),
81
- variableNode = variableNodeQuery(termNode);
51
+ const variableNode = variableNodeQuery(termNode);
82
52
 
83
53
  if (variableNode !== null) {
84
54
  variable = localContext.findVariableByVariableNode(variableNode);
85
55
  }
86
56
 
87
57
  return variable;
88
- }
58
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ import { last } from "./array";
4
+ import { FUNCTION } from "../constants";
5
+
6
+ export function isLastRemainingArgumentFunction(remainingArguments) {
7
+ let lastRemainingArgumentFunction = false;
8
+
9
+ const remainingArgumentsLength = remainingArguments.length;
10
+
11
+ if (remainingArgumentsLength > 0) {
12
+ const lastRemainingArgument = last(remainingArguments);
13
+
14
+ lastRemainingArgumentFunction = (typeof lastRemainingArgument === FUNCTION);
15
+ }
16
+
17
+ return lastRemainingArgumentFunction;
18
+ }
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { arrayUtilities } from "necessary";
4
4
 
5
- export const { first, second, last, extract, push, match, filter, compress, separate } = arrayUtilities;
5
+ export const { first, second, last, extract, push, match, prune, filter, compress, separate } = arrayUtilities;
6
6
 
7
7
  export function reverse(array) {
8
8
  array = [ ///
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ import { nodeQuery, nodesQuery } from "./query";
4
+ import { nodeAsString, nodesAsString } from "./string";
5
+
6
+ const subproofSuppositionStatementNodesQuery = nodesQuery("/subproof/supposition/unqualifiedStatement/statement!"),
7
+ subproofLastProofStepStatementNodeQuery = nodeQuery("/subproof/subDerivation/lastProofStep/unqualifiedStatement|qualifiedStatement/statement!");
8
+
9
+ export function subproofNodeAsSubproofString(subproofNode, localContext) {
10
+ const tokens = localContext.getTokens(),
11
+ subproofSuppositionStatementNodes = subproofSuppositionStatementNodesQuery(subproofNode),
12
+ subproofLastProofStepStatementNode = subproofLastProofStepStatementNodeQuery(subproofNode),
13
+ subproofSuppositionStatementsString = nodesAsString(subproofSuppositionStatementNodes, tokens),
14
+ subproofLastProofStepStatementString = nodeAsString(subproofLastProofStepStatementNode, tokens),
15
+ subproofString = `[${subproofSuppositionStatementsString}]...${subproofLastProofStepStatementString}`;
16
+
17
+ return subproofString;
18
+ }
@@ -16,11 +16,7 @@ class MetaLevelVerifier extends Verifier {
16
16
  let verified;
17
17
 
18
18
  const nonTerminalNode = node, ///
19
- nonTerminalNodeVerified = this.verifyNonTerminalNode(nonTerminalNode, localContext, () => {
20
- const verifiedAhead = true;
21
-
22
- return verifiedAhead;
23
- });
19
+ nonTerminalNodeVerified = this.verifyNonTerminalNode(nonTerminalNode, localContext);
24
20
 
25
21
  verified = nonTerminalNodeVerified; ///
26
22
 
@@ -30,25 +26,25 @@ class MetaLevelVerifier extends Verifier {
30
26
  static maps = [
31
27
  {
32
28
  nodeQuery: metavariableNodeQuery,
33
- verify: (metavariableNode, localContext, verifyAhead) => {
34
- const metavariableVerified = verifyMetavariable(metavariableNode, localContext, verifyAhead);
29
+ verify: (metavariableNode, localContext) => {
30
+ const metavariableVerified = verifyMetavariable(metavariableNode, localContext);
35
31
 
36
32
  return metavariableVerified;
37
33
  }
38
34
  },
39
35
  {
40
36
  nodeQuery: variableNodeQuery,
41
- verify: (variableNode, localContext, verifyAhead) => {
42
- const variableVerified = verifyVariable(variableNode, localContext, verifyAhead);
37
+ verify: (variableNode, localContext) => {
38
+ const variableVerified = verifyVariable(variableNode, localContext);
43
39
 
44
40
  return variableVerified;
45
41
  }
46
42
  },
47
43
  {
48
44
  nodeQuery: termNodeQuery,
49
- verify: (termNode, localContext, verifyAhead) => {
45
+ verify: (termNode, localContext) => {
50
46
  const terms = [],
51
- termVerified = verifyTerm(termNode, terms, localContext, verifyAhead);
47
+ termVerified = verifyTerm(termNode, terms, localContext);
52
48
 
53
49
  return termVerified;
54
50
  }
@@ -17,11 +17,7 @@ class StatementAsCombinatorVerifier extends Verifier {
17
17
 
18
18
  const nonTerminalNode = statementNode, ///
19
19
  childNodes = nonTerminalNode.getChildNodes(),
20
- childNodesVerified = this.verifyChildNodes(childNodes, fileContext, () => {
21
- const verifiedAhead = true;
22
-
23
- return verifiedAhead;
24
- });
20
+ childNodesVerified = this.verifyChildNodes(childNodes, fileContext);
25
21
 
26
22
  statementVerifiedAsCombinator = childNodesVerified; ///
27
23
 
@@ -29,41 +25,32 @@ class StatementAsCombinatorVerifier extends Verifier {
29
25
  }
30
26
 
31
27
  static maps = [
28
+ {
29
+ nodeQuery: statementNodeQuery,
30
+ verify: (statementNode, localContext) => {
31
+ const derived = false,
32
+ assignments = [],
33
+ statementVerified = verifyStatement(statementNode, assignments, derived, localContext);
34
+
35
+ return statementVerified;
36
+ }
37
+ },
32
38
  {
33
39
  nodeQuery: termNodeQuery,
34
- verify: (termNode, localContext, verifyAhead) => {
40
+ verify: (termNode, localContext) => {
35
41
  const terms = [],
36
- termVerified = verifyTerm(termNode, terms, localContext, verifyAhead);
42
+ termVerified = verifyTerm(termNode, terms, localContext);
37
43
 
38
44
  return termVerified;
39
45
  }
40
46
  },
41
47
  {
42
48
  nodeQuery: typeNodeQuery,
43
- verify: (typeNode, localContext, verifyAhead) => {
44
- const typeVerified = verifyType(typeNode, localContext, verifyAhead);
49
+ verify: (typeNode, localContext) => {
50
+ const typeVerified = verifyType(typeNode, localContext);
45
51
 
46
52
  return typeVerified;
47
53
  }
48
- },
49
- {
50
- nodeQuery: statementNodeQuery,
51
- verify: (statementNode, localContext, verifyAhead) => {
52
- let statementVerified;
53
-
54
- const derived = false,
55
- assignments = [];
56
-
57
- statementVerified = verifyStatement(statementNode, assignments, derived, localContext);
58
-
59
- if (statementVerified) {
60
- const verifiedAhead = verifyAhead();
61
-
62
- statementVerified = verifiedAhead; ///
63
- }
64
-
65
- return statementVerified;
66
- }
67
54
  }
68
55
  ];
69
56
  }
@@ -18,29 +18,25 @@ import verifyMetavariableDeclaration from "../verify/declaration/metavariable";
18
18
  import { nodeQuery } from "../utilities/query";
19
19
 
20
20
  const errorNodeQuery = nodeQuery("/error"),
21
- ruleNodeQuery = nodeQuery("/rule!"),
22
- axiomNodeQuery = nodeQuery("/axiom!"),
23
- lemmaNodeQuery = nodeQuery("/lemma!"),
24
- theoremNodeQuery = nodeQuery("/theorem!"),
25
- metaLemmaNodeQuery = nodeQuery("/metaLemma!"),
26
- conjectureNodeQuery = nodeQuery("/conjecture!"),
27
- metatheoremNodeQuery = nodeQuery("/metatheorem!"),
28
- typeDeclarationNodeQuery = nodeQuery("/typeDeclaration!"),
29
- variableDeclarationNodeQuery = nodeQuery("/variableDeclaration!"),
30
- combinatorDeclarationNodeQuery = nodeQuery("/combinatorDeclaration!"),
31
- constructorDeclarationNodeQuery = nodeQuery("/constructorDeclaration!"),
32
- metavariableDeclarationNodeQuery = nodeQuery("/metavariableDeclaration!");
21
+ ruleNodeQuery = nodeQuery("/rule"),
22
+ axiomNodeQuery = nodeQuery("/axiom"),
23
+ lemmaNodeQuery = nodeQuery("/lemma"),
24
+ theoremNodeQuery = nodeQuery("/theorem"),
25
+ metaLemmaNodeQuery = nodeQuery("/metaLemma"),
26
+ conjectureNodeQuery = nodeQuery("/conjecture"),
27
+ metatheoremNodeQuery = nodeQuery("/metatheorem"),
28
+ typeDeclarationNodeQuery = nodeQuery("/typeDeclaration"),
29
+ variableDeclarationNodeQuery = nodeQuery("/variableDeclaration"),
30
+ combinatorDeclarationNodeQuery = nodeQuery("/combinatorDeclaration"),
31
+ constructorDeclarationNodeQuery = nodeQuery("/constructorDeclaration"),
32
+ metavariableDeclarationNodeQuery = nodeQuery("/metavariableDeclaration");
33
33
 
34
34
  class TopLevelVerifier extends Verifier {
35
35
  verify(node, fileContext) {
36
36
  let verified;
37
37
 
38
38
  const nonTerminalNode = node, ///
39
- nonTerminalNodeVerified = this.verifyNonTerminalNode(nonTerminalNode, fileContext, () => {
40
- const verifiedAhead = true;
41
-
42
- return verifiedAhead;
43
- });
39
+ nonTerminalNodeVerified = this.verifyNonTerminalNode(nonTerminalNode, fileContext);
44
40
 
45
41
  verified = nonTerminalNodeVerified; ///
46
42
 
package/src/verifier.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import { nodeQuery } from "./utilities/query";
4
+ import { isLastRemainingArgumentFunction } from "./utilities/arguments";
4
5
 
5
6
  const nonTerminalNodeQuery = nodeQuery("/*");
6
7
 
@@ -38,10 +39,23 @@ export default class Verifier {
38
39
  verifyChildNodes(childNodes, ...remainingArguments) {
39
40
  let childNodesVerify;
40
41
 
41
- const index = 0,
42
- childNodesVerifyAhead = this.verifyChildNodesAhead(index, childNodes, ...remainingArguments);
42
+ const lastRemainingArgumentFunction = isLastRemainingArgumentFunction(remainingArguments);
43
43
 
44
- childNodesVerify = childNodesVerifyAhead; ///
44
+ if (lastRemainingArgumentFunction) {
45
+ const index = 0,
46
+ childNodesVerifyAhead = this.verifyChildNodesAhead(index, childNodes, ...remainingArguments);
47
+
48
+ childNodesVerify = childNodesVerifyAhead; ///
49
+ } else {
50
+ childNodesVerify = childNodes.every((childNode) => {
51
+ const node = childNode,
52
+ nodeVerified = this.verifyNode(node, ...remainingArguments);
53
+
54
+ if (nodeVerified) {
55
+ return true;
56
+ }
57
+ });
58
+ }
45
59
 
46
60
  return childNodesVerify;
47
61
  }
@@ -49,10 +63,18 @@ export default class Verifier {
49
63
  verifyTerminalNode(terminalNode, ...remainingArguments) {
50
64
  let terminalNodeVerified;
51
65
 
52
- const verifyAhead = remainingArguments.pop(), ///
53
- verifiedAhead = verifyAhead(); ///
66
+ const lastRemainingArgumentFunction = isLastRemainingArgumentFunction(remainingArguments);
67
+
68
+ if (lastRemainingArgumentFunction) {
69
+ const verifyAhead = remainingArguments.pop(), ///
70
+ verifiedAhead = verifyAhead();
71
+
72
+ terminalNodeVerified = verifiedAhead; ///
54
73
 
55
- terminalNodeVerified = verifiedAhead; ///
74
+ remainingArguments.push(verifyAhead);
75
+ } else {
76
+ terminalNodeVerified = true;
77
+ }
56
78
 
57
79
  return terminalNodeVerified;
58
80
  }
@@ -77,9 +77,7 @@ function verifyDerivedTypeAssertion(typeAssertionNode, assignments, derived, loc
77
77
 
78
78
  verifiedAhead = true;
79
79
 
80
- if (!verifiedAhead) {
81
- assignments.pop();
82
- }
80
+ assignments.pop();
83
81
  }
84
82
  }
85
83
  }
@@ -136,9 +134,7 @@ function verifyStatedTypeAssertion(typeAssertionNode, assignments, derived, loca
136
134
 
137
135
  verifiedAhead = true;
138
136
 
139
- if (!verifiedAhead) {
140
- assignments.pop();
141
- }
137
+ assignments.pop();
142
138
  }
143
139
  }
144
140
  }
@@ -47,14 +47,14 @@ function verifyMetavariable(metavariableNode, metaTypeNode, fileContext) {
47
47
  fileContext.debug(`The metavariable '${metavariableString}' is already present.`, metavariableNode);
48
48
  } else {
49
49
  const termTypes = [],
50
- metaTypes = [],
51
- argumentNode = argumentNodeQuery(metavariableNode),
52
- argumentVerified = verifyArgument(argumentNode, termTypes, fileContext),
53
- metaTypeVerified = verifyMetaType(metaTypeNode, metaTypes, fileContext);
50
+ metaTypes = [],
51
+ argumentNode = argumentNodeQuery(metavariableNode),
52
+ argumentVerified = verifyArgument(argumentNode, termTypes, fileContext),
53
+ metaTypeVerified = verifyMetaType(metaTypeNode, metaTypes, fileContext);
54
54
 
55
55
  if (argumentVerified && metaTypeVerified) {
56
56
  let termType,
57
- metaType;
57
+ metaType;
58
58
 
59
59
  const firstMetaType = first(metaTypes);
60
60
 
@@ -71,10 +71,10 @@ function verifyMetavariable(metavariableNode, metaTypeNode, fileContext) {
71
71
  }
72
72
 
73
73
  const node = metavariableNode, ///
74
- name = nameFromMetavariableNode(metavariableNode),
75
- metavariable = Metavariable.fromNodeNameTermTypeAndMetaType(node, name, termType, metaType),
76
- metavariableAssignment = MetavariableAssignment.fromMetavariable(metavariable),
77
- metavariableAssigned = metavariableAssignment.assign(fileContext);
74
+ name = nameFromMetavariableNode(metavariableNode),
75
+ metavariable = Metavariable.fromNodeNameTermTypeAndMetaType(node, name, termType, metaType),
76
+ metavariableAssignment = MetavariableAssignment.fromMetavariable(metavariable),
77
+ metavariableAssigned = metavariableAssignment.assign(fileContext);
78
78
 
79
79
  if (metavariableAssigned) {
80
80
  metavariableVerified = true;