occam-verify-cli 0.0.678 → 0.0.680

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 (141) hide show
  1. package/bin/action/verify.js +13 -3
  2. package/lib/axiomLemmaTheoremConjecture.js +3 -3
  3. package/lib/conclusion.js +16 -5
  4. package/lib/consequent.js +11 -3
  5. package/lib/context/file.js +73 -3
  6. package/lib/context/release.js +7 -2
  7. package/lib/equality.js +13 -199
  8. package/lib/premise.js +24 -7
  9. package/lib/supposition.js +15 -4
  10. package/lib/type.js +3 -8
  11. package/lib/utilities/array.js +5 -2
  12. package/lib/utilities/string.js +26 -13
  13. package/lib/verifier/node/metastatement.js +176 -0
  14. package/lib/verifier/node/statementAsCombinator.js +186 -0
  15. package/lib/verifier/node/termAsConstructor.js +224 -0
  16. package/lib/verifier/node.js +158 -0
  17. package/lib/verifier/nodes/equality.js +155 -0
  18. package/lib/verifier/{metastatementForMetavariable → nodes/metastatementForMetavariable}/conclusion.js +13 -12
  19. package/lib/verifier/{metastatementForMetavariable → nodes/metastatementForMetavariable}/premise.js +13 -12
  20. package/lib/verifier/nodes/metastatementForMetavariable.js +198 -0
  21. package/lib/verifier/nodes/statement.js +200 -0
  22. package/lib/verifier/{statementForMetavariable → nodes/statementForMetavariable}/conclusion.js +13 -12
  23. package/lib/verifier/{statementForMetavariable → nodes/statementForMetavariable}/premise.js +13 -12
  24. package/lib/verifier/nodes/statementForMetavariable.js +203 -0
  25. package/lib/verifier/nodes/term.js +210 -0
  26. package/lib/verifier/{termForVariable/supposition.js → nodes/termForVariable/consequent.js} +13 -12
  27. package/lib/verifier/{termForVariable/consequent.js → nodes/termForVariable/supposition.js} +13 -12
  28. package/lib/verifier/nodes/termForVariable.js +217 -0
  29. package/lib/verifier/nodes.js +175 -0
  30. package/lib/verify/axiom.js +3 -3
  31. package/lib/verify/conclusion.js +3 -3
  32. package/lib/verify/conjecture.js +3 -3
  33. package/lib/verify/consequent.js +3 -3
  34. package/lib/verify/declaration/combinator.js +7 -2
  35. package/lib/verify/declaration/constructor.js +8 -2
  36. package/lib/verify/declaration/metavariable.js +7 -2
  37. package/lib/verify/declaration/type.js +7 -2
  38. package/lib/verify/declaration/variable.js +8 -2
  39. package/lib/verify/file.js +3 -3
  40. package/lib/verify/label.js +9 -4
  41. package/lib/verify/lemma.js +3 -3
  42. package/lib/verify/metastatement/qualified.js +5 -6
  43. package/lib/verify/metastatement/unqualified.js +9 -7
  44. package/lib/verify/metastatement.js +36 -156
  45. package/lib/verify/metavariable.js +6 -4
  46. package/lib/verify/premise.js +3 -3
  47. package/lib/verify/release.js +3 -3
  48. package/lib/verify/rule.js +3 -3
  49. package/lib/verify/statement/qualified.js +5 -6
  50. package/lib/verify/statement/unqualified.js +9 -7
  51. package/lib/verify/statement.js +86 -332
  52. package/lib/verify/statementAsCombinator.js +8 -82
  53. package/lib/verify/supposition.js +3 -3
  54. package/lib/verify/term.js +79 -215
  55. package/lib/verify/termAsConstructor.js +15 -89
  56. package/lib/verify/terms.js +45 -0
  57. package/lib/verify/theorem.js +3 -3
  58. package/lib/verify/type.js +7 -5
  59. package/lib/verify/typeAssertion.js +124 -0
  60. package/lib/verify/variable.js +7 -5
  61. package/package.json +5 -5
  62. package/src/axiomLemmaTheoremConjecture.js +2 -2
  63. package/src/conclusion.js +13 -4
  64. package/src/consequent.js +9 -2
  65. package/src/context/file.js +9 -2
  66. package/src/context/release.js +9 -2
  67. package/src/equality.js +17 -143
  68. package/src/premise.js +23 -6
  69. package/src/supposition.js +12 -3
  70. package/src/type.js +3 -8
  71. package/src/utilities/array.js +1 -1
  72. package/src/utilities/string.js +34 -23
  73. package/src/verifier/node/metastatement.js +61 -0
  74. package/src/verifier/node/statementAsCombinator.js +80 -0
  75. package/src/verifier/node/termAsConstructor.js +124 -0
  76. package/src/verifier/node.js +85 -0
  77. package/src/verifier/nodes/equality.js +68 -0
  78. package/src/verifier/nodes/metastatementForMetavariable/conclusion.js +11 -0
  79. package/src/verifier/nodes/metastatementForMetavariable/premise.js +11 -0
  80. package/src/verifier/{metastatementForMetavariable.js → nodes/metastatementForMetavariable.js} +13 -13
  81. package/src/verifier/nodes/statement.js +100 -0
  82. package/src/verifier/nodes/statementForMetavariable/conclusion.js +11 -0
  83. package/src/verifier/nodes/statementForMetavariable/premise.js +11 -0
  84. package/src/verifier/{statementForMetavariable.js → nodes/statementForMetavariable.js} +10 -10
  85. package/src/verifier/nodes/term.js +106 -0
  86. package/src/verifier/nodes/termForVariable/consequent.js +11 -0
  87. package/src/verifier/nodes/termForVariable/supposition.js +11 -0
  88. package/src/verifier/{termForVariable.js → nodes/termForVariable.js} +42 -30
  89. package/src/verifier/nodes.js +111 -0
  90. package/src/verify/axiom.js +2 -2
  91. package/src/verify/conclusion.js +2 -2
  92. package/src/verify/conjecture.js +2 -2
  93. package/src/verify/consequent.js +2 -2
  94. package/src/verify/declaration/combinator.js +9 -1
  95. package/src/verify/declaration/constructor.js +15 -1
  96. package/src/verify/declaration/metavariable.js +9 -1
  97. package/src/verify/declaration/type.js +14 -1
  98. package/src/verify/declaration/variable.js +15 -1
  99. package/src/verify/file.js +2 -2
  100. package/src/verify/label.js +10 -2
  101. package/src/verify/lemma.js +4 -4
  102. package/src/verify/metastatement/qualified.js +4 -6
  103. package/src/verify/metastatement/unqualified.js +9 -7
  104. package/src/verify/metastatement.js +35 -56
  105. package/src/verify/metavariable.js +6 -3
  106. package/src/verify/premise.js +2 -2
  107. package/src/verify/release.js +2 -2
  108. package/src/verify/rule.js +2 -2
  109. package/src/verify/statement/qualified.js +4 -6
  110. package/src/verify/statement/unqualified.js +9 -7
  111. package/src/verify/statement.js +109 -302
  112. package/src/verify/statementAsCombinator.js +9 -129
  113. package/src/verify/supposition.js +2 -2
  114. package/src/verify/term.js +99 -156
  115. package/src/verify/termAsConstructor.js +20 -135
  116. package/src/verify/terms.js +54 -0
  117. package/src/verify/theorem.js +2 -2
  118. package/src/verify/type.js +7 -4
  119. package/src/verify/typeAssertion.js +164 -0
  120. package/src/verify/variable.js +7 -4
  121. package/lib/node/statement/combinator/equality.js +0 -21
  122. package/lib/ocmbinator/equality.js +0 -126
  123. package/lib/tokens/statement/combinator/equality.js +0 -17
  124. package/lib/verifier/metastatementForMetavariable.js +0 -198
  125. package/lib/verifier/statementForMetavariable.js +0 -203
  126. package/lib/verifier/termForVariable.js +0 -209
  127. package/lib/verifier.js +0 -138
  128. package/lib/verify/assertion/type.js +0 -115
  129. package/lib/verify/typeInference.js +0 -132
  130. package/src/node/statement/combinator/equality.js +0 -9
  131. package/src/ocmbinator/equality.js +0 -23
  132. package/src/tokens/statement/combinator/equality.js +0 -10
  133. package/src/verifier/metastatementForMetavariable/conclusion.js +0 -9
  134. package/src/verifier/metastatementForMetavariable/premise.js +0 -9
  135. package/src/verifier/statementForMetavariable/conclusion.js +0 -9
  136. package/src/verifier/statementForMetavariable/premise.js +0 -9
  137. package/src/verifier/termForVariable/consequent.js +0 -9
  138. package/src/verifier/termForVariable/supposition.js +0 -9
  139. package/src/verifier.js +0 -74
  140. package/src/verify/assertion/type.js +0 -153
  141. package/src/verify/typeInference.js +0 -146
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+
3
+ import verifyTerm from "../../verify/term";
4
+ import NodeVerifier from "../../verifier/node";
5
+
6
+ import { nodeQuery, typeNameFromTypeNode } from "../../utilities/query";
7
+ import { TERM_RULE_NAME, ARGUMENT_RULE_NAME } from "../../ruleNames";
8
+
9
+ const typeNodeQuery = nodeQuery("/argument/type"),
10
+ termNodeQuery = nodeQuery("/argument/term");
11
+
12
+ class TermAsConstructorNodeVerifier extends NodeVerifier {
13
+ verifyNonTerminalNode(nonTerminalNode, fileContext, verifyAhead) {
14
+ let nonTerminalNodeVerified;
15
+
16
+ const ruleName = nonTerminalNode.getRuleName();
17
+
18
+ switch (ruleName) {
19
+ case TERM_RULE_NAME: {
20
+ const termNode = nonTerminalNode, ///
21
+ standaloneTermVerified = verifyStandaloneTerm(termNode, fileContext, verifyAhead),
22
+ termNodeVerified = standaloneTermVerified; ///
23
+
24
+ nonTerminalNodeVerified = termNodeVerified; ///
25
+
26
+ break;
27
+ }
28
+
29
+ case ARGUMENT_RULE_NAME: {
30
+ const argumentNode = nonTerminalNode, ///
31
+ argumentVerified = verifyArgument(argumentNode, fileContext, verifyAhead),
32
+ argumentNodeVerified = argumentVerified; ///
33
+
34
+ nonTerminalNodeVerified = argumentNodeVerified; ///
35
+
36
+ break;
37
+ }
38
+
39
+ default: {
40
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNode, fileContext, verifyAhead);
41
+
42
+ break;
43
+ }
44
+ }
45
+
46
+ return nonTerminalNodeVerified;
47
+ }
48
+ }
49
+
50
+ const termAsConstructorNodeVerifier = new TermAsConstructorNodeVerifier();
51
+
52
+ export default termAsConstructorNodeVerifier;
53
+
54
+ export function verifyStandaloneTerm(termNode, fileContext, verifyAhead) {
55
+ let standaloneTermVerified;
56
+
57
+ const termString = fileContext.nodeAsString(termNode);
58
+
59
+ fileContext.trace(`Verifying the '${termString}' standalone term...`, termNode);
60
+
61
+ const types = [],
62
+ context = fileContext, ///
63
+ termVerified = verifyTerm(termNode, types, context, verifyAhead);
64
+
65
+ standaloneTermVerified = termVerified; ///
66
+
67
+ if (standaloneTermVerified) {
68
+ fileContext.debug(`...verified the '${termString}' standalone term.`, termNode);
69
+ }
70
+
71
+ return standaloneTermVerified;
72
+ }
73
+
74
+ export function verifyType(typeNode, fileContext, verifyAhead) {
75
+ let typeVerified = false;
76
+
77
+ const typeString = fileContext.nodeAsString(typeNode);
78
+
79
+ fileContext.trace(`Verifying the '${typeString}' type...`, typeNode);
80
+
81
+ const typeName = typeNameFromTypeNode(typeNode),
82
+ typePresent = fileContext.isTypePresentByTypeName(typeName);
83
+
84
+ if (!typePresent) {
85
+ fileContext.debug(`The type '${typeName}' is not present.`, typeNode);
86
+ } else {
87
+ fileContext.debug(`...verified the '${typeString}' type.`, typeNode);
88
+
89
+ const verifiedAhead = verifyAhead();
90
+
91
+ typeVerified = verifiedAhead; ///
92
+ }
93
+
94
+ return typeVerified;
95
+ }
96
+
97
+ function verifyArgument(argumentNode, fileContext, verifyAhead) {
98
+ let argumentVerified;
99
+
100
+ const argumentString = fileContext.nodeAsString(argumentNode);
101
+
102
+ fileContext.trace(`Verifying the '${argumentString}' argument...`, argumentNode);
103
+
104
+ const typeNode = typeNodeQuery(argumentNode),
105
+ termNode = termNodeQuery(argumentNode);
106
+
107
+ if (typeNode !== null) {
108
+ const typeVerified = verifyType(typeNode, fileContext, verifyAhead);
109
+
110
+ argumentVerified = typeVerified; ///
111
+ }
112
+
113
+ if (termNode !== null) {
114
+ const standaloneTermVerified = verifyStandaloneTerm(termNode, fileContext, verifyAhead);
115
+
116
+ argumentVerified = standaloneTermVerified; ///
117
+ }
118
+
119
+ if (argumentVerified) {
120
+ fileContext.debug(`...verified the '${argumentString}' argument.`, argumentNode);
121
+ }
122
+
123
+ return argumentVerified;
124
+ }
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+
3
+ export default class NodeVerifier {
4
+ verifyNode(node, ...remainingArguments) {
5
+ let nodeVerified;
6
+
7
+ const nodeTerminalNode = node.isTerminalNode();
8
+
9
+ if (nodeTerminalNode) {
10
+ const terminalNode = node, ///
11
+ terminalNodeVerified = this.verifyTerminalNode(terminalNode, ...remainingArguments);
12
+
13
+ nodeVerified = terminalNodeVerified; ///
14
+ } else {
15
+ const nonTerminalNode = node, ///
16
+ nonTerminalNodeVerified = this.verifyNonTerminalNode(nonTerminalNode, ...remainingArguments);
17
+
18
+ nodeVerified = nonTerminalNodeVerified; ///
19
+ }
20
+
21
+ return nodeVerified;
22
+ }
23
+
24
+ verifyChildNodes(childNodes, ...remainingArguments) {
25
+ let childNodesVerify;
26
+
27
+ const index = 0,
28
+ childNodesVerifyAhead = this.verifyChildNodesAhead(index, childNodes, ...remainingArguments);
29
+
30
+ childNodesVerify = childNodesVerifyAhead; ///
31
+
32
+ return childNodesVerify;
33
+ }
34
+
35
+ verifyChildNodesAhead(index, childNodes, ...remainingArguments) {
36
+ let childNodesVerify;
37
+
38
+ const verifyAhead = remainingArguments.pop(), ///
39
+ childNodesLength = childNodes.length;
40
+
41
+ if (index === childNodesLength) {
42
+ const verifiedAhead = verifyAhead();
43
+
44
+ childNodesVerify = verifiedAhead; ///
45
+ } else {
46
+ const childNode = childNodes[index],
47
+ node = childNode, ///
48
+ nodeVerified = this.verifyNode(node, ...remainingArguments, () => {
49
+ index++;
50
+
51
+ remainingArguments.push(verifyAhead);
52
+
53
+ const childNodesVerifyAhead = this.verifyChildNodesAhead(index, childNodes, ...remainingArguments);
54
+
55
+ return childNodesVerifyAhead;
56
+ });
57
+
58
+ childNodesVerify = nodeVerified; ///
59
+ }
60
+
61
+ return childNodesVerify;
62
+ }
63
+
64
+ verifyTerminalNode(terminalNode, ...remainingArguments) {
65
+ let terminalNodeVerified;
66
+
67
+ const verifyAhead = remainingArguments.pop(), ///
68
+ verifiedAhead = verifyAhead(); ///
69
+
70
+ terminalNodeVerified = verifiedAhead; ///
71
+
72
+ return terminalNodeVerified;
73
+ }
74
+
75
+ verifyNonTerminalNode(nonTerminalNode, ...remainingArguments) {
76
+ let nonTerminalNodeVerified;
77
+
78
+ const childNodes = nonTerminalNode.getChildNodes(), ///
79
+ childNodesVerify = this.verifyChildNodes(childNodes, ...remainingArguments);
80
+
81
+ nonTerminalNodeVerified = childNodesVerify; ///
82
+
83
+ return nonTerminalNodeVerified;
84
+ }
85
+ }
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ import Equality from "../../equality";
4
+ import verifyTerms from "../../verify/terms";
5
+ import NodesVerifier from "../../verifier/nodes";
6
+
7
+ import { TERM_RULE_NAME } from "../../ruleNames";
8
+
9
+ class EqualityNodesVerifier extends NodesVerifier {
10
+ verifyNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context, verifyAhead) {
11
+ let nonTerminalNodeVerified = false;
12
+
13
+ const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
14
+ rightNonTerminalNodeRuleName = rightNonTerminalNode.getRuleName();
15
+
16
+ if (leftNonTerminalNodeRuleName === rightNonTerminalNodeRuleName) {
17
+ const leftNonTerminalNodeRuleNameTermRuleName = (leftNonTerminalNodeRuleName === TERM_RULE_NAME),
18
+ rightNonTerminalNodeRuleNameTermRuleName = (rightNonTerminalNodeRuleName === TERM_RULE_NAME);
19
+
20
+ if (leftNonTerminalNodeRuleNameTermRuleName && rightNonTerminalNodeRuleNameTermRuleName) {
21
+ const leftTermNode = leftNonTerminalNode, ///
22
+ rightTermNode = rightNonTerminalNode, ///
23
+ termNodeVerified = this.verifyTermNode(leftTermNode, rightTermNode, equalities, context, verifyAhead);
24
+
25
+ nonTerminalNodeVerified = termNodeVerified; ///
26
+ }
27
+
28
+ if (!nonTerminalNodeVerified) {
29
+ const leftNonTerminalNodeChildNodes = leftNonTerminalNode.getChildNodes(),
30
+ rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(),
31
+ leftChildNodes = leftNonTerminalNodeChildNodes, ///
32
+ rightChildNodes = rightNonTerminalNodeChildNodes, ///
33
+ childNodesVerified = this.verifyChildNodes(leftChildNodes, rightChildNodes, equalities, context, verifyAhead);
34
+
35
+ nonTerminalNodeVerified = childNodesVerified; ///
36
+ }
37
+ }
38
+
39
+ return nonTerminalNodeVerified;
40
+ }
41
+
42
+ verifyTermNode(leftTermNode, rightTermNode, equalities, context, verifyAhead) {
43
+ let termNodeVerified = false;
44
+
45
+ const termsVerified = verifyTerms(leftTermNode, rightTermNode, context, verifyAhead);
46
+
47
+ if (termsVerified) {
48
+ const equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode),
49
+ equalityA = equality, ///
50
+ equalitiesB = equalities, ///
51
+ equalityMatches = equalitiesB.some((equalityB) => { ///
52
+ const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB, context);
53
+
54
+ if (equalityAMatchesEqualityB) {
55
+ return true;
56
+ }
57
+ });
58
+
59
+ termNodeVerified = equalityMatches; ///
60
+ }
61
+
62
+ return termNodeVerified;
63
+ }
64
+ }
65
+
66
+ const equalityNodesVerifier = new EqualityNodesVerifier();
67
+
68
+ export default equalityNodesVerifier;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ import MetastatementForMetavariableNodesVerifier from "../../../verifier/nodes/metastatementForMetavariable";
4
+
5
+ class ConclusionMetastatementForMetavariableNodesVerifier extends MetastatementForMetavariableNodesVerifier {
6
+ static createSubstitutions = false;
7
+ }
8
+
9
+ const conclusionMetastatementForMetavariableNodesVerifier = new ConclusionMetastatementForMetavariableNodesVerifier();
10
+
11
+ export default conclusionMetastatementForMetavariableNodesVerifier;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ import MetastatementForMetavariableNodesVerifier from "../../../verifier/nodes/metastatementForMetavariable";
4
+
5
+ class PremiseMetastatementForMetavariableNodesVerifier extends MetastatementForMetavariableNodesVerifier {
6
+ static createSubstitutions = true;
7
+ }
8
+
9
+ const premiseMetastatementForMetavariableNodesVerifier = new PremiseMetastatementForMetavariableNodesVerifier();
10
+
11
+ export default premiseMetastatementForMetavariableNodesVerifier;
@@ -1,16 +1,16 @@
1
1
  "use strict";
2
2
 
3
- import Verifier from "../verifier";
4
- import MetastatementForMetavariableSubstitution from "../substitution/metastatementForMetavariable";
3
+ import NodesVerifier from "../../verifier/nodes";
4
+ import MetastatementForMetavariableSubstitution from "../../substitution/metastatementForMetavariable";
5
5
 
6
- import { nodeQuery } from "../utilities/query";
7
- import { METASTATEMENT_RULE_NAME } from "../ruleNames";
8
- import { metavariableNameFromMetavariableNode } from "../utilities/query";
6
+ import { nodeQuery } from "../../utilities/query";
7
+ import { METASTATEMENT_RULE_NAME } from "../../ruleNames";
8
+ import { metavariableNameFromMetavariableNode } from "../../utilities/query";
9
9
 
10
10
  const metavariableNodeQuery = nodeQuery('/metastatement/metavariable!');
11
11
 
12
- export default class MetastatementForMetavariableVerifier extends Verifier {
13
- verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB) {
12
+ export default class MetastatementForMetavariableNodesVerifier extends NodesVerifier {
13
+ verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead) {
14
14
  let nonTerminalNodeVerified = false;
15
15
 
16
16
  const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
@@ -23,28 +23,28 @@ export default class MetastatementForMetavariableVerifier extends Verifier {
23
23
  if (nonTerminalNodeARuleNameMetastatementRuleName && nonTerminalNodeBRuleNameMetastatementRuleName) {
24
24
  const metastatementNodeA = nonTerminalNodeA, ///
25
25
  metastatementNodeB = nonTerminalNodeB, ///
26
- metastatementNodeVerified = this.verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB);
26
+ metastatementNodeVerified = this.verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead);
27
27
 
28
28
  if (metastatementNodeVerified) {
29
29
  nonTerminalNodeVerified = true; ///
30
30
  } else {
31
- nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB);
31
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead);
32
32
  }
33
33
  } else {
34
- nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB);
34
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead);
35
35
  }
36
36
  }
37
37
 
38
38
  return nonTerminalNodeVerified;
39
39
  }
40
40
 
41
- verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB) {
41
+ verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead) {
42
42
  let metastatementNodeVerified = false;
43
43
 
44
44
  const metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
45
45
 
46
46
  if (metavariableNodeA !== null) {
47
- const metaVariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB);
47
+ const metaVariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead);
48
48
 
49
49
  metastatementNodeVerified = metaVariableNodeVerified; ///
50
50
  }
@@ -52,7 +52,7 @@ export default class MetastatementForMetavariableVerifier extends Verifier {
52
52
  return metastatementNodeVerified;
53
53
  }
54
54
 
55
- verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB) {
55
+ verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, metaproofContextB, verifyAhead) {
56
56
  let metavariableNodeVerified;
57
57
 
58
58
  const metavariableNameA = metavariableNameFromMetavariableNode(metavariableNodeA),
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+
3
+ import NodesVerifier from "../../verifier/nodes";
4
+
5
+ import { nodeQuery } from "../../utilities/query";
6
+ import { verifyArgument } from "../../verifier/nodes/term";
7
+ import { STATEMENT_META_TYPE } from "../../metaTypes";
8
+ import { ARGUMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../../ruleNames";
9
+
10
+ const metaTypeNodeQuery = nodeQuery("/metaArgument/metaType!"),
11
+ statementNodeQuery = nodeQuery("/metaArgument/statement!"),
12
+ metaTypeTerminalNodeQuery = nodeQuery("/metaType/@meta-type");
13
+
14
+ class StatementNodesVerifier extends NodesVerifier {
15
+ verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context, verifyAhead) {
16
+ let nonTerminalNodeVerified = false;
17
+
18
+ const nonTerminalNode = nonTerminalNodeA, ///
19
+ combinatorNonTerminalNode = nonTerminalNodeB; ///
20
+
21
+ const ruleName = nonTerminalNode.getRuleName(), ///
22
+ combinatorRuleName = combinatorNonTerminalNode.getRuleName(); ///
23
+
24
+ if (ruleName === combinatorRuleName) {
25
+ switch (ruleName) {
26
+ case ARGUMENT_RULE_NAME: {
27
+ const argumentNode = nonTerminalNode, ///
28
+ constructorArgumentNode = combinatorNonTerminalNode, ///
29
+ argumentVerified = verifyArgument(argumentNode, constructorArgumentNode, context, verifyAhead);
30
+
31
+ nonTerminalNodeVerified = argumentVerified; ///
32
+
33
+ break;
34
+ }
35
+
36
+ case META_ARGUMENT_RULE_NAME: {
37
+ const metaArgumentNode = nonTerminalNode, ///
38
+ combinatorMetaargumentNode = combinatorNonTerminalNode, ///
39
+ metaArgumentVerified = verifyMetaargument(metaArgumentNode, combinatorMetaargumentNode, context, verifyAhead),
40
+ metaArgumentNodeVerified = metaArgumentVerified; ///
41
+
42
+ nonTerminalNodeVerified = metaArgumentNodeVerified; ///
43
+
44
+ break;
45
+ }
46
+
47
+ default: {
48
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, context, verifyAhead);
49
+
50
+ break;
51
+ }
52
+ }
53
+ }
54
+
55
+ return nonTerminalNodeVerified;
56
+ }
57
+ }
58
+
59
+ const statementNodesVerifier = new StatementNodesVerifier();
60
+
61
+ export default statementNodesVerifier;
62
+
63
+ function verifyMetaargument(metaArgumentNode, combinatorMetaargumentNode, context, verifyAhead) {
64
+ let metaArgumentVerified = false;
65
+
66
+ const metaArgumentString = context.nodeAsString(metaArgumentNode);
67
+
68
+ context.trace(`Verifying the '${metaArgumentString}' metaargument...`, metaArgumentNode);
69
+
70
+ const statementNode = statementNodeQuery(metaArgumentNode),
71
+ combinatorMetaTYpeNode = metaTypeNodeQuery(combinatorMetaargumentNode);
72
+
73
+ if (statementNode === null) {
74
+ context.debug(`Expected a statement but got a '${metaArgumentString}' meta-type.`, metaArgumentNode);
75
+ } else {
76
+ if (combinatorMetaTYpeNode === null) {
77
+ const combinatorMetaargumentString = context.nodeAsString(combinatorMetaargumentNode);
78
+
79
+ context.debug(`Expected a meta-type but got a '${combinatorMetaargumentString}' statement.`, metaArgumentNode);
80
+ } else {
81
+ const combinatorMetaTypeTerminalNode = metaTypeTerminalNodeQuery(combinatorMetaTYpeNode),
82
+ content = combinatorMetaTypeTerminalNode.getContent(),
83
+ contentStatementMetaType = (content === STATEMENT_META_TYPE);
84
+
85
+ if (!contentStatementMetaType) {
86
+ context.debug(`Expected the meta-type of the combinator to be '${STATEMENT_META_TYPE}' but got '${content}' instead.`, metaArgumentNode);
87
+ } else {
88
+ const verifiedAhead = verifyAhead();
89
+
90
+ metaArgumentVerified = verifiedAhead; ///
91
+ }
92
+ }
93
+ }
94
+
95
+ if (metaArgumentVerified) {
96
+ context.debug(`...verified the '${metaArgumentString}' metaargument.`, metaArgumentNode);
97
+ }
98
+
99
+ return metaArgumentVerified;
100
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ import StatementForMetavariableNodesVerifier from "../../../verifier/nodes/statementForMetavariable";
4
+
5
+ class ConclusionStatementForMetavariableNodesVerifier extends StatementForMetavariableNodesVerifier {
6
+ static createSubstitutions = false;
7
+ }
8
+
9
+ const conclusionStatementForMetavariableNodesVerifier = new ConclusionStatementForMetavariableNodesVerifier();
10
+
11
+ export default conclusionStatementForMetavariableNodesVerifier;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ import StatementForMetavariableNodesVerifier from "../../../verifier/nodes/statementForMetavariable";
4
+
5
+ class PremiseStatementForMetavariableNodesVerifier extends StatementForMetavariableNodesVerifier {
6
+ static createSubstitutions = true;
7
+ }
8
+
9
+ const premiseStatementForMetavariableNodesVerifier = new PremiseStatementForMetavariableNodesVerifier();
10
+
11
+ export default premiseStatementForMetavariableNodesVerifier;
@@ -1,16 +1,16 @@
1
1
  "use strict";
2
2
 
3
- import Verifier from "../verifier";
4
- import StatementForMetavariableSubstitution from "../substitution/statementForMetavariable";
3
+ import NodesVerifier from "../../verifier/nodes";
4
+ import StatementForMetavariableSubstitution from "../../substitution/statementForMetavariable";
5
5
 
6
- import { nodeQuery } from "../utilities/query";
7
- import { metavariableNameFromMetavariableNode } from "../utilities/query";
8
- import { STATEMENT_RULE_NAME, METASTATEMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../ruleNames";
6
+ import { nodeQuery } from "../../utilities/query";
7
+ import { metavariableNameFromMetavariableNode } from "../../utilities/query";
8
+ import { STATEMENT_RULE_NAME, METASTATEMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../../ruleNames";
9
9
 
10
10
  const metavariableNodeQuery = nodeQuery('/metastatement/metavariable!'),
11
11
  metaArgumentChildNodeNodeQuery = nodeQuery('/metaArgument/*!');
12
12
 
13
- export default class StatementForMetavariableVerifier extends Verifier {
13
+ export default class StatementForMetavariableNodesVerifier extends NodesVerifier {
14
14
  verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, proofContextB) {
15
15
  let nonTerminalNodeVerified = false;
16
16
 
@@ -40,11 +40,11 @@ export default class StatementForMetavariableVerifier extends Verifier {
40
40
  } else {
41
41
  const nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
42
42
  nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
43
- nodesA = nonTerminalNodeAChildNodes, ///
44
- nodesB = nonTerminalNodeBChildNodes, ///
45
- nodesMatch = this.verifyNodes(nodesA, nodesB, substitutions, fileContextA, proofContextB);
43
+ childNodesA = nonTerminalNodeAChildNodes, ///
44
+ childNodesB = nonTerminalNodeBChildNodes, ///
45
+ childNodesVerified = this.verifyChildNodes(childNodesA, childNodesB, substitutions, fileContextA, proofContextB);
46
46
 
47
- nonTerminalNodeVerified = nodesMatch; ///
47
+ nonTerminalNodeVerified = childNodesVerified; ///
48
48
  }
49
49
  } else if (nonTerminalNodeBRuleName === nonTerminalNodeARuleName) {
50
50
  nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, proofContextB);
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+
3
+ import NodesVerifier from "../../verifier/nodes";
4
+
5
+ import { first } from "../../utilities/array";
6
+ import { ARGUMENT_RULE_NAME } from "../../ruleNames";
7
+ import { nodeQuery, typeNameFromTypeNode } from "../../utilities/query";
8
+
9
+ const termNodeQuery = nodeQuery("/argument/term!"),
10
+ typeNodeQuery = nodeQuery("/argument/type!");
11
+
12
+ class TermNodesVerifier extends NodesVerifier {
13
+ verifyNonTerminalNode(nonTerminalNode, constructorNonTerminalNode, context, verifyAhead) {
14
+ let nonTerminalNodeVerified = false;
15
+
16
+ const ruleName = nonTerminalNode.getRuleName(), ///
17
+ constructorRuleName = constructorNonTerminalNode.getRuleName(); ///
18
+
19
+ if (ruleName === constructorRuleName) {
20
+ switch (ruleName) {
21
+ case ARGUMENT_RULE_NAME: {
22
+ const argumentNode = nonTerminalNode, ///
23
+ constructorArgumentNode = constructorNonTerminalNode, ///
24
+ argumentVerified = verifyArgument(argumentNode, constructorArgumentNode, context, verifyAhead),
25
+ argumentNodeVerified = argumentVerified; ///
26
+
27
+ nonTerminalNodeVerified = argumentNodeVerified; ///
28
+
29
+ break;
30
+ }
31
+
32
+ default: {
33
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNode, constructorNonTerminalNode, context, verifyAhead);
34
+
35
+ break;
36
+ }
37
+ }
38
+ }
39
+
40
+ return nonTerminalNodeVerified;
41
+ }
42
+ }
43
+
44
+ const termNodesVerifier = new TermNodesVerifier();
45
+
46
+ export default termNodesVerifier;
47
+
48
+ export function verifyArgument(argumentNode, constructorArgumentNode, context, verifyAhead) {
49
+ let argumentVerified = false;
50
+
51
+ const argumentString = context.nodeAsString(argumentNode);
52
+
53
+ context.trace(`Verifying the '${argumentString}' argument...`, argumentNode);
54
+
55
+ const typeNode = typeNodeQuery(argumentNode);
56
+
57
+ if (typeNode !== null) {
58
+ context.debug(`The '${argumentString}' argument should be a term, not a type.`, argumentNode);
59
+ } else {
60
+ const termNode = termNodeQuery(argumentNode);
61
+
62
+ if (!argumentVerified) {
63
+ const constructorTermNode = termNodeQuery(constructorArgumentNode);
64
+
65
+ if (constructorTermNode !== null) {
66
+ const node = termNode, ///
67
+ constructorNode = constructorTermNode, ///
68
+ nodeVerified = this.verifyNode(node, constructorNode, context, verifyAhead);
69
+
70
+ argumentVerified = nodeVerified; ///
71
+ }
72
+ }
73
+
74
+ if (!argumentVerified) {
75
+ const constructorTypeNode = typeNodeQuery(constructorArgumentNode);
76
+
77
+ if (constructorTypeNode !== null) {
78
+ const { verifyTerm } = termNodesVerifier,
79
+ types = [],
80
+ termVerified = verifyTerm(termNode, types, context, () => {
81
+ let verifiedAhead = false;
82
+
83
+ const constructorTypeName = typeNameFromTypeNode(constructorTypeNode),
84
+ firstType = first(types),
85
+ termType = firstType, ///
86
+ constructorType = context.findTypeByTypeName(constructorTypeName),
87
+ termTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(constructorType);
88
+
89
+ if (termTypeEqualToOrSubTypeOfType) {
90
+ verifiedAhead = verifyAhead();
91
+ }
92
+
93
+ return verifiedAhead;
94
+ });
95
+
96
+ argumentVerified = termVerified; ///
97
+ }
98
+ }
99
+ }
100
+
101
+ if (argumentVerified) {
102
+ context.debug(`...verified the '${argumentString}' argument.`, argumentNode);
103
+ }
104
+
105
+ return argumentVerified;
106
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ import TermForVariableNodesVerifier from "../../../verifier/nodes/termForVariable";
4
+
5
+ class ConsequentTermForVariableNodesVerifier extends TermForVariableNodesVerifier {
6
+ static createSubstitutions = false;
7
+ }
8
+
9
+ const consequentTermForVariableNodesVerifier = new ConsequentTermForVariableNodesVerifier();
10
+
11
+ export default consequentTermForVariableNodesVerifier;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ import TermForVariableNodesVerifier from "../../../verifier/nodes/termForVariable";
4
+
5
+ class SuppositionTermForVariableNodesVerifier extends TermForVariableNodesVerifier {
6
+ static createSubstitutions = true;
7
+ }
8
+
9
+ const suppositionTermForVariableNodesVerifier = new SuppositionTermForVariableNodesVerifier();
10
+
11
+ export default suppositionTermForVariableNodesVerifier;