occam-verify-cli 0.0.700 → 0.0.702

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 (84) hide show
  1. package/lib/assignment/equality.js +2 -2
  2. package/lib/assignment/metavariable.js +2 -2
  3. package/lib/assignment/variable.js +2 -2
  4. package/lib/collection.js +44 -6
  5. package/lib/conclusion.js +6 -6
  6. package/lib/consequent.js +4 -4
  7. package/lib/context/file.js +9 -2
  8. package/lib/context/local.js +27 -64
  9. package/lib/context/localMeta.js +8 -1
  10. package/lib/equality.js +20 -4
  11. package/lib/premise.js +9 -9
  12. package/lib/supposition.js +4 -4
  13. package/lib/utilities/collection.js +27 -13
  14. package/lib/verifier/node/statementAsCombinator.js +4 -1
  15. package/lib/verifier/node/termAsConstructor.js +4 -20
  16. package/lib/verifier/nodes/equality.js +169 -0
  17. package/lib/verifier/nodes/metastatementForMetavariable.js +6 -7
  18. package/lib/verifier/nodes/statement.js +12 -4
  19. package/lib/verifier/nodes/statementForMetavariable.js +6 -7
  20. package/lib/verifier/nodes/termForVariable.js +19 -20
  21. package/lib/verify/consequent.js +3 -3
  22. package/lib/verify/derivation.js +28 -6
  23. package/lib/verify/equality.js +9 -4
  24. package/lib/verify/givenType.js +32 -0
  25. package/lib/verify/metastatement.js +3 -3
  26. package/lib/verify/statement/qualified.js +135 -37
  27. package/lib/verify/statement.js +34 -42
  28. package/lib/verify/supposition.js +13 -8
  29. package/lib/verify/suppositions.js +2 -11
  30. package/lib/verify/term.js +25 -59
  31. package/lib/verify/termAndGivenType.js +39 -0
  32. package/lib/verify/termAsGivenVariable.js +36 -0
  33. package/lib/verify/typeAssertion.js +35 -22
  34. package/package.json +1 -1
  35. package/src/assignment/equality.js +2 -2
  36. package/src/assignment/metavariable.js +2 -2
  37. package/src/assignment/variable.js +2 -2
  38. package/src/collection.js +55 -5
  39. package/src/conclusion.js +6 -6
  40. package/src/consequent.js +4 -4
  41. package/src/context/file.js +7 -1
  42. package/src/context/local.js +33 -78
  43. package/src/context/localMeta.js +6 -0
  44. package/src/equality.js +23 -2
  45. package/src/premise.js +10 -10
  46. package/src/supposition.js +3 -3
  47. package/src/utilities/collection.js +31 -11
  48. package/src/verifier/node/statementAsCombinator.js +6 -0
  49. package/src/verifier/node/termAsConstructor.js +5 -26
  50. package/src/verifier/nodes/equality.js +47 -0
  51. package/src/verifier/nodes/metastatementForMetavariable.js +10 -10
  52. package/src/verifier/nodes/statement.js +1 -1
  53. package/src/verifier/nodes/statementForMetavariable.js +10 -10
  54. package/src/verifier/nodes/termForVariable.js +30 -30
  55. package/src/verify/consequent.js +4 -4
  56. package/src/verify/derivation.js +37 -8
  57. package/src/verify/equality.js +12 -3
  58. package/src/verify/{standaloneType.js → givenType.js} +7 -7
  59. package/src/verify/metastatement.js +2 -2
  60. package/src/verify/statement/qualified.js +194 -39
  61. package/src/verify/statement.js +47 -47
  62. package/src/verify/supposition.js +15 -8
  63. package/src/verify/suppositions.js +1 -13
  64. package/src/verify/term.js +26 -62
  65. package/src/verify/termAndGivenType.js +37 -0
  66. package/src/verify/termAsGivenVariable.js +39 -0
  67. package/src/verify/typeAssertion.js +50 -28
  68. package/lib/verifier/nodes/metastatementForMetavariable/conclusion.js +0 -114
  69. package/lib/verifier/nodes/metastatementForMetavariable/premise.js +0 -114
  70. package/lib/verifier/nodes/statementForMetavariable/conclusion.js +0 -114
  71. package/lib/verifier/nodes/statementForMetavariable/premise.js +0 -114
  72. package/lib/verifier/nodes/termForVariable/consequent.js +0 -114
  73. package/lib/verifier/nodes/termForVariable/supposition.js +0 -114
  74. package/lib/verify/standaloneType.js +0 -32
  75. package/lib/verify/termAndStandaloneType.js +0 -39
  76. package/lib/verify/termAsVariableAndStandaloneType.js +0 -39
  77. package/src/verifier/nodes/metastatementForMetavariable/conclusion.js +0 -11
  78. package/src/verifier/nodes/metastatementForMetavariable/premise.js +0 -11
  79. package/src/verifier/nodes/statementForMetavariable/conclusion.js +0 -11
  80. package/src/verifier/nodes/statementForMetavariable/premise.js +0 -11
  81. package/src/verifier/nodes/termForVariable/consequent.js +0 -11
  82. package/src/verifier/nodes/termForVariable/supposition.js +0 -11
  83. package/src/verify/termAndStandaloneType.js +0 -37
  84. package/src/verify/termAsVariableAndStandaloneType.js +0 -38
@@ -10,7 +10,7 @@ import { TERM_RULE_NAME } from "../../ruleNames";
10
10
 
11
11
  const variableNodeQuery = nodeQuery('/term/variable!');
12
12
 
13
- export default class TermForVariableNodesVerifier extends NodesVerifier {
13
+ class TermForVariableNodesVerifier extends NodesVerifier {
14
14
  verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, verifyAhead) {
15
15
  let nonTerminalNodeVerified = false;
16
16
 
@@ -74,47 +74,47 @@ export default class TermForVariableNodesVerifier extends NodesVerifier {
74
74
  variableVerified = verifiedAhead; ///
75
75
  }
76
76
  } else {
77
- const { createSubstitutions } = this.constructor;
77
+ const variableNode = variableNodeA, ///
78
+ localContext = localContextA, ///
79
+ variable = localContext.findVariableByVariableNode(variableNode);
78
80
 
79
- if (createSubstitutions) {
80
- const variableNode = variableNodeA, ///
81
- localContext = localContextA, ///
82
- variable = localContext.findVariableByVariableNode(variableNode);
81
+ if (variable !== null) {
82
+ const terms = [],
83
+ context = localContextB, ///
84
+ termNode = termNodeB, ///
85
+ termVerified = verifyTerm(termNode, terms, context, () => {
86
+ let verifiedAhead = false;
83
87
 
84
- if (variable !== null) {
85
- const terms = [],
86
- context = localContextB, ///
87
- termNode = termNodeB, ///
88
- termVerified = verifyTerm(termNode, terms, context, () => {
89
- let verifiedAhead = false;
88
+ const firstTerm = first(terms),
89
+ term = firstTerm, ///
90
+ termType = term.getType(),
91
+ variableType = variable.getType(),
92
+ variableTypeEqualToOrSuperTypeOfTermType = variableType.isEqualToOrSuperTypeOf(termType);
90
93
 
91
- const firstTerm = first(terms),
92
- term = firstTerm, ///
93
- termType = term.getType(),
94
- variableType = variable.getType(),
95
- variableTypeEqualToOrSuperTypeOfTermType = variableType.isEqualToOrSuperTypeOf(termType);
94
+ if (variableTypeEqualToOrSuperTypeOfTermType) {
95
+ const termForVariableSubstitution = TermForVariableSubstitution.fromVariableNodeAndTermNode(variableNode, termNode),
96
+ substitution = termForVariableSubstitution; ///
96
97
 
97
- if (variableTypeEqualToOrSuperTypeOfTermType) {
98
- const termForVariableSubstitution = TermForVariableSubstitution.fromVariableNodeAndTermNode(variableNode, termNode),
99
- substitution = termForVariableSubstitution; ///
98
+ substitutions.push(substitution);
100
99
 
101
- substitutions.push(substitution);
100
+ verifiedAhead = verifyAhead();
102
101
 
103
- verifiedAhead = verifyAhead();
104
-
105
- if (!verifiedAhead) {
106
- substitutions.pop();
107
- }
102
+ if (!verifiedAhead) {
103
+ substitutions.pop();
108
104
  }
105
+ }
109
106
 
110
- return verifiedAhead;
111
- });
107
+ return verifiedAhead;
108
+ });
112
109
 
113
- variableVerified = termVerified; ///
114
- }
110
+ variableVerified = termVerified; ///
115
111
  }
116
112
  }
117
113
 
118
114
  return variableVerified;
119
115
  }
120
116
  }
117
+
118
+ const termForVariableNodesVerifier = new TermForVariableNodesVerifier();
119
+
120
+ export default termForVariableNodesVerifier;
@@ -21,15 +21,15 @@ export default function verifyConsequent(consequentNode, consequents, localConte
21
21
  unqualifiedStatementVerified = verifyUnqualifiedStatement(unqualifiedStatementNode, assignments, derived, localContext);
22
22
 
23
23
  if (unqualifiedStatementVerified) {
24
+ consequentVerified = true;
25
+ }
26
+
27
+ if (consequentVerified) {
24
28
  const statementNode = statementNodeQuery(unqualifiedStatementNode),
25
29
  consequent = Consequent.fromStatementNode(statementNode);
26
30
 
27
31
  consequents.push(consequent);
28
32
 
29
- consequentVerified = true;
30
- }
31
-
32
- if (consequentVerified) {
33
33
  localContext.debug(`...verified the '${consequentString}' consequent.`, consequentNode);
34
34
  }
35
35
 
@@ -68,14 +68,17 @@ function verifySubproof(subproofNode, localContext) {
68
68
  }
69
69
 
70
70
  function verifyChild(childNode, localContext) {
71
- let childVerified;
71
+ let childVerified = false;
72
72
 
73
73
  const childNodeRuleName = childNode.getRuleName();
74
74
 
75
75
  switch (childNodeRuleName) {
76
76
  case SUBPROOF_RULE_NAME: {
77
- const subproofNode = childNode, ///
78
- subproofVerified = verifySubproof(subproofNode, localContext);
77
+ let subproofVerified;
78
+
79
+ const subproofNode = childNode; ///
80
+
81
+ subproofVerified = verifySubproof(subproofNode, localContext);
79
82
 
80
83
  if (subproofVerified) {
81
84
  const proofStep = ProofStep.fromSubproofNode(subproofNode);
@@ -89,10 +92,23 @@ function verifyChild(childNode, localContext) {
89
92
  }
90
93
 
91
94
  case QUALIFIED_STATEMENT_RULE_NAME: {
95
+ let qualifiedStatementVerified;
96
+
92
97
  const derived = true,
93
98
  assignments = [],
94
- qualifiedStatementNode = childNode, ///
95
- qualifiedStatementVerified = verifyQualifiedStatement(qualifiedStatementNode, assignments, derived, localContext);
99
+ qualifiedStatementNode = childNode; ///
100
+
101
+ qualifiedStatementVerified = verifyQualifiedStatement(qualifiedStatementNode, assignments, derived, localContext);
102
+
103
+ if (qualifiedStatementVerified) {
104
+ qualifiedStatementVerified = assignments.every((assignment) => { ///
105
+ const assigned = assignment.assign(localContext);
106
+
107
+ if (assigned) {
108
+ return true;
109
+ }
110
+ });
111
+ }
96
112
 
97
113
  if (qualifiedStatementVerified) {
98
114
  const statementNode = statementNodeQuery(qualifiedStatementNode),
@@ -100,17 +116,30 @@ function verifyChild(childNode, localContext) {
100
116
 
101
117
  localContext.addProofStep(proofStep);
102
118
 
103
- childVerified = qualifiedStatementVerified; ///
119
+ childVerified = true; ///
104
120
  }
105
121
 
106
122
  break;
107
123
  }
108
124
 
109
125
  case UNQUALIFIED_STATEMENT_RULE_NAME: {
126
+ let unqualifiedStatementVerified;
127
+
110
128
  const derived = true,
111
129
  assignments = [],
112
- unqualifiedStatementNode = childNode, ///
113
- unqualifiedStatementVerified = verifyUnqualifiedStatement(unqualifiedStatementNode, assignments, derived, localContext);
130
+ unqualifiedStatementNode = childNode; ///
131
+
132
+ unqualifiedStatementVerified = verifyUnqualifiedStatement(unqualifiedStatementNode, assignments, derived, localContext);
133
+
134
+ if (unqualifiedStatementVerified) {
135
+ unqualifiedStatementVerified = assignments.every((assignment) => { ///
136
+ const assigned = assignment.assign(localContext);
137
+
138
+ if (assigned) {
139
+ return true;
140
+ }
141
+ });
142
+ }
114
143
 
115
144
  if (unqualifiedStatementVerified) {
116
145
  const statementNode = statementNodeQuery(unqualifiedStatementNode),
@@ -59,13 +59,22 @@ function verifyDerivedEquality(equalityNode, assignments, derived, context, veri
59
59
  secondTerm = second(terms),
60
60
  leftTerm = firstTerm, ///
61
61
  rightTerm = secondTerm, ///
62
- equality = Equality.fromEqualityNodeLeftTermAndRightTerm(equalityNode, leftTerm, rightTerm);
62
+ equality = Equality.fromLeftTermRightTermAndEqualityNode(leftTerm, rightTerm, equalityNode);
63
63
 
64
64
  if (equality !== null) {
65
- const equalityEqual = context.isEqualityEqual(equality);
65
+ const equalityEqual = equality.isEqual(context);
66
66
 
67
67
  if (equalityEqual) {
68
+ const equalityAssignment = EqualityAssignment.fromEquality(equality),
69
+ assignment = equalityAssignment; ///
70
+
71
+ assignments.push(assignment);
72
+
68
73
  verifiedAhead = verifyAhead();
74
+
75
+ if (!verifiedAhead) {
76
+ assignments.pop();
77
+ }
69
78
  }
70
79
  }
71
80
 
@@ -104,7 +113,7 @@ function verifyGivenEquality(equalityNode, assignments, derived, context, verify
104
113
  secondTerm = second(terms),
105
114
  leftTerm = firstTerm, ///
106
115
  rightTerm = secondTerm, ///
107
- equality = Equality.fromEqualityNodeLeftTermAndRightTerm(equalityNode, leftTerm, rightTerm);
116
+ equality = Equality.fromLeftTermRightTermAndEqualityNode(leftTerm, rightTerm, equalityNode);
108
117
 
109
118
  if (equality !== null) {
110
119
  const equalityAssignment = EqualityAssignment.fromEquality(equality),
@@ -2,12 +2,12 @@
2
2
 
3
3
  import { typeNameFromTypeNode } from "../utilities/query";
4
4
 
5
- export default function verifyStandaloneType(typeNode, types, context, verifyAhead) {
6
- let standaloneTypeVerified = false;
5
+ export default function verifyGivenType(typeNode, types, context, verifyAhead) {
6
+ let givenTypeVerified = false;
7
7
 
8
8
  const typeString = context.nodeAsString(typeNode);
9
9
 
10
- context.trace(`Verifying the standalone '${typeString}' type...`, typeNode);
10
+ context.trace(`Verifying the given '${typeString}' type...`, typeNode);
11
11
 
12
12
  const typeName = typeNameFromTypeNode(typeNode),
13
13
  type = context.findTypeByTypeName(typeName);
@@ -23,12 +23,12 @@ export default function verifyStandaloneType(typeNode, types, context, verifyAhe
23
23
  types.pop();
24
24
  }
25
25
 
26
- standaloneTypeVerified = verifiedAhead; ///
26
+ givenTypeVerified = verifiedAhead; ///
27
27
  }
28
28
 
29
- if (standaloneTypeVerified) {
30
- context.debug(`...verified the standalone '${typeString}' type.`, typeNode);
29
+ if (givenTypeVerified) {
30
+ context.debug(`...verified the given '${typeString}' type.`, typeNode);
31
31
  }
32
32
 
33
- return standaloneTypeVerified;
33
+ return givenTypeVerified;
34
34
  }
@@ -28,8 +28,8 @@ function verifyMetastatement(metastatementNode, derived, localMetaContext) {
28
28
  return metastatementVerified;
29
29
  }
30
30
 
31
- Object.assign(verifyMetastatement, {
32
- metastatementNodeVerifier
31
+ Object.assign(metastatementNodeVerifier, {
32
+ verifyMetastatement
33
33
  });
34
34
 
35
35
  export default verifyMetastatement;
@@ -1,9 +1,14 @@
1
1
  "use strict";
2
2
 
3
+ import verifyEquality from "../equality";
4
+ import verifyTypeAssertion from "../typeAssertion";
5
+
3
6
  import { nodeQuery, referenceNameFromReferenceNode } from "../../utilities/query";
4
7
 
5
- const referenceNodeQuery = nodeQuery("/qualifiedStatement/qualification!/reference!"),
6
- statementNodeQuery = nodeQuery("/qualifiedStatement/statement!");
8
+ const equalityNodeQuery = nodeQuery("/qualifiedStatement/statement/equality!"),
9
+ referenceNodeQuery = nodeQuery("/qualifiedStatement/qualification!/reference!"),
10
+ statementNodeQuery = nodeQuery("/qualifiedStatement/statement!"),
11
+ typeAssertionNodeQuery = nodeQuery("/qualifiedStatement/statement/typeAssertion!");
7
12
 
8
13
  export default function verifyQualifiedStatement(qualifiedStatementNode, assignments, derived, localContext) {
9
14
  let qualifiedStatementVerified = false;
@@ -11,68 +16,218 @@ export default function verifyQualifiedStatement(qualifiedStatementNode, assignm
11
16
  const statementNode = statementNodeQuery(qualifiedStatementNode);
12
17
 
13
18
  if (statementNode !== null) {
14
- const statementString = localContext.nodeAsString(statementNode),
15
- statementLocalContext = localContext; ///
19
+ const qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode);
16
20
 
17
- localContext.trace(`Verifying the '${statementString}' qualified statement...`, qualifiedStatementNode);
21
+ localContext.trace(`Verifying the '${qualifiedStatementString}' qualified statement...`, qualifiedStatementNode);
18
22
 
19
23
  const referenceNode = referenceNodeQuery(qualifiedStatementNode),
20
- referenceName = referenceNameFromReferenceNode(referenceNode);
24
+ referenceName = referenceNameFromReferenceNode(referenceNode),
25
+ verifyQualifiedStatementFunctions = [
26
+ verifyQualifiedStatementAAgainstRule,
27
+ verifyQualifiedStatementAAgainstAxiom,
28
+ verifyQualifiedStatementAAgainstLemma,
29
+ verifyQualifiedStatementAAgainstTheorem,
30
+ verifyQualifiedStatementAAgainstConjecture
31
+ ];
32
+
33
+ qualifiedStatementVerified = verifyQualifiedStatementFunctions.some((verifyQualifiedStatementFunction) => { ///
34
+ const qualifiedStatementVerified = verifyQualifiedStatementFunction(qualifiedStatementNode, referenceName, localContext);
35
+
36
+ if (qualifiedStatementVerified) {
37
+ return true;
38
+ }
39
+ });
21
40
 
22
- if (!qualifiedStatementVerified) {
23
- const rule = localContext.findRuleByReferenceName(referenceName);
41
+ if (qualifiedStatementVerified) {
42
+ derived = false; ///
24
43
 
25
- if (rule !== null) {
26
- const ruleMatchesStatement = rule.matchStatement(statementNode, statementLocalContext);
44
+ const context = localContext, ///
45
+ verifyQualifiedStatementFunctions = [
46
+ verifyQualifiedStatementAsEquality,
47
+ verifyQualifiedStatementAsTypeAssertion
48
+ ];
27
49
 
28
- qualifiedStatementVerified = ruleMatchesStatement; ///
29
- }
50
+ qualifiedStatementVerified = verifyQualifiedStatementFunctions.every((verifyQualifiedStatementFunction) => { ///
51
+ const qualifiedStatementVerified = verifyQualifiedStatementFunction(qualifiedStatementNode, assignments, derived, context, () => {
52
+ const verifiedAhead = true;
53
+
54
+ return verifiedAhead;
55
+ });
56
+
57
+ if (qualifiedStatementVerified) {
58
+ return true;
59
+ }
60
+ });
30
61
  }
31
62
 
32
- if (!qualifiedStatementVerified) {
33
- const axiom = localContext.findAxiomByReferenceName(referenceName);
63
+ if (qualifiedStatementVerified) {
64
+ localContext.debug(`...verified the '${qualifiedStatementString}' qualified statement.`, qualifiedStatementNode);
65
+ }
66
+ }
34
67
 
35
- if (axiom !== null) {
36
- const axiomMatchesStatement = axiom.matchStatement(statementNode, statementLocalContext);
68
+ return qualifiedStatementVerified;
69
+ }
37
70
 
38
- qualifiedStatementVerified = axiomMatchesStatement; ///
39
- }
71
+ function verifyQualifiedStatementAAgainstRule(qualifiedStatementNode, referenceName, localContext) {
72
+ let qualifiedStatementVerifiedAgainstRule = false;
73
+
74
+ const rule = localContext.findRuleByReferenceName(referenceName);
75
+
76
+ if (rule !== null) {
77
+ const statementNode = statementNodeQuery(qualifiedStatementNode),
78
+ statementLocalContext = localContext, ///
79
+ qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode);
80
+
81
+ localContext.trace(`Verifying the '${qualifiedStatementString}' qualified statement against the '${referenceName}' rule...`, statementNode);
82
+
83
+ const ruleMatchesStatement = rule.matchStatement(statementNode, statementLocalContext);
84
+
85
+ qualifiedStatementVerifiedAgainstRule = ruleMatchesStatement; ///
86
+
87
+ if (qualifiedStatementVerifiedAgainstRule) {
88
+ localContext.debug(`...verified the '${qualifiedStatementString}' qualified statement against the '${referenceName}' rule.`, statementNode);
40
89
  }
90
+ }
41
91
 
42
- if (!qualifiedStatementVerified) {
43
- const lemma = localContext.findLemmaByReferenceName(referenceName);
92
+ return qualifiedStatementVerifiedAgainstRule;
93
+ }
44
94
 
45
- if (lemma !== null) {
46
- const lemmaMatchesStatement = lemma.matchStatement(statementNode, statementLocalContext);
95
+ function verifyQualifiedStatementAAgainstAxiom(qualifiedStatementNode, referenceName, localContext) {
96
+ let qualifiedStatementVerifiedAgainstAxiom = false;
47
97
 
48
- qualifiedStatementVerified = lemmaMatchesStatement; ///
49
- }
98
+ const axiom = localContext.findAxiomByReferenceName(referenceName);
99
+
100
+ if (axiom !== null) {
101
+ const statementNode = statementNodeQuery(qualifiedStatementNode),
102
+ statementLocalContext = localContext, ///
103
+ qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode);
104
+
105
+ localContext.trace(`Verifying the '${qualifiedStatementString}' qualified statement against the '${referenceName}' axiom...`, statementNode);
106
+
107
+ const axiomMatchesStatement = axiom.matchStatement(statementNode, statementLocalContext);
108
+
109
+ qualifiedStatementVerifiedAgainstAxiom = axiomMatchesStatement; ///
110
+
111
+ if (qualifiedStatementVerifiedAgainstAxiom) {
112
+ localContext.debug(`...verified the '${qualifiedStatementString}' qualified statement against the '${referenceName}' axiom.`, statementNode);
50
113
  }
114
+ }
51
115
 
52
- if (!qualifiedStatementVerified) {
53
- const theorem = localContext.findTheoremByReferenceName(referenceName);
116
+ return qualifiedStatementVerifiedAgainstAxiom;
117
+ }
54
118
 
55
- if (theorem !== null) {
56
- const theoremMatchesStatement = theorem.matchStatement(statementNode, statementLocalContext);
119
+ function verifyQualifiedStatementAAgainstLemma(qualifiedStatementNode, referenceName, localContext) {
120
+ let qualifiedStatementVerifiedAgainstLemma = false;
57
121
 
58
- qualifiedStatementVerified = theoremMatchesStatement; ///
59
- }
122
+ const lemma = localContext.findLemmaByReferenceName(referenceName);
123
+
124
+ if (lemma !== null) {
125
+ const statementNode = statementNodeQuery(qualifiedStatementNode),
126
+ statementLocalContext = localContext, ///
127
+ qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode);
128
+
129
+ localContext.trace(`Verifying the '${qualifiedStatementString}' qualified statement against the '${referenceName}' lemma...`, statementNode);
130
+
131
+ const lemmaMatchesStatement = lemma.matchStatement(statementNode, statementLocalContext);
132
+
133
+ qualifiedStatementVerifiedAgainstLemma = lemmaMatchesStatement; ///
134
+
135
+ if (qualifiedStatementVerifiedAgainstLemma) {
136
+ localContext.debug(`...verified the '${qualifiedStatementString}' qualified statement against the '${referenceName}' lemma.`, statementNode);
60
137
  }
138
+ }
139
+
140
+ return qualifiedStatementVerifiedAgainstLemma;
141
+ }
61
142
 
62
- if (!qualifiedStatementVerified) {
63
- const conjecture = localContext.findConjectureByReferenceName(referenceName);
143
+ function verifyQualifiedStatementAAgainstTheorem(qualifiedStatementNode, referenceName, localContext) {
144
+ let qualifiedStatementVerifiedAgainstTheorem = false;
64
145
 
65
- if (conjecture !== null) {
66
- const conjectureMatchesStatement = conjecture.matchStatement(statementNode, statementLocalContext);
146
+ const theorem = localContext.findTheoremByReferenceName(referenceName);
67
147
 
68
- qualifiedStatementVerified = conjectureMatchesStatement; ///
69
- }
148
+ if (theorem !== null) {
149
+ const statementNode = statementNodeQuery(qualifiedStatementNode),
150
+ statementLocalContext = localContext, ///
151
+ qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode);
152
+
153
+ localContext.trace(`Verifying the '${qualifiedStatementString}' qualified statement against the '${referenceName}' theorem...`, statementNode);
154
+
155
+ const theoremMatchesStatement = theorem.matchStatement(statementNode, statementLocalContext);
156
+
157
+ qualifiedStatementVerifiedAgainstTheorem = theoremMatchesStatement; ///
158
+
159
+ if (qualifiedStatementVerifiedAgainstTheorem) {
160
+ localContext.debug(`...verified the '${qualifiedStatementString}' qualified statement against the '${referenceName}' theorem.`, statementNode);
70
161
  }
162
+ }
71
163
 
72
- if (qualifiedStatementVerified) {
73
- localContext.debug(`...verified the '${statementString}' qualified statement.`, qualifiedStatementNode);
164
+ return qualifiedStatementVerifiedAgainstTheorem;
165
+ }
166
+
167
+ function verifyQualifiedStatementAAgainstConjecture(qualifiedStatementNode, referenceName, localContext) {
168
+ let qualifiedStatementVerifiedAgainstConjecture = false;
169
+
170
+ const conjecture = localContext.findConjectureByReferenceName(referenceName);
171
+
172
+ if (conjecture !== null) {
173
+ const statementNode = statementNodeQuery(qualifiedStatementNode),
174
+ statementLocalContext = localContext, ///
175
+ qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode);
176
+
177
+ localContext.trace(`Verifying the '${qualifiedStatementString}' qualified statement against the '${referenceName}' conjecture...`, statementNode);
178
+
179
+ const conjectureMatchesStatement = conjecture.matchStatement(statementNode, statementLocalContext);
180
+
181
+ qualifiedStatementVerifiedAgainstConjecture = conjectureMatchesStatement; ///
182
+
183
+ if (qualifiedStatementVerifiedAgainstConjecture) {
184
+ localContext.debug(`...verified the '${qualifiedStatementString}' qualified statement against the '${referenceName}' conjecture.`, statementNode);
74
185
  }
75
186
  }
76
187
 
77
- return qualifiedStatementVerified;
188
+ return qualifiedStatementVerifiedAgainstConjecture;
189
+ }
190
+
191
+ function verifyQualifiedStatementAsEquality(qualifiedStatementNode, assignments, derived, context, verifyAhead) {
192
+ let statementVerifiedAsEquality = true; ///
193
+
194
+ const equalityNode = equalityNodeQuery(qualifiedStatementNode);
195
+
196
+ if (equalityNode !== null) {
197
+ const qualifiedStatementString = context.nodeAsString(qualifiedStatementNode);
198
+
199
+ context.trace(`Verifying the '${qualifiedStatementString}' qualified statement as an equality...`, qualifiedStatementNode);
200
+
201
+ const equalityVerified = verifyEquality(equalityNode, assignments, derived, context, verifyAhead);
202
+
203
+ statementVerifiedAsEquality = equalityVerified; ///
204
+
205
+ if (statementVerifiedAsEquality) {
206
+ context.debug(`...verified the '${qualifiedStatementString}' qualified statement as an equality.`, qualifiedStatementNode);
207
+ }
208
+ }
209
+
210
+ return statementVerifiedAsEquality;
211
+ }
212
+
213
+ function verifyQualifiedStatementAsTypeAssertion(qualifiedStatementNode, assignments, derived, context, verifyAhead) {
214
+ let statementVerifiedAsTypeAssertion = true; ///
215
+
216
+ const typeAssertionNode = typeAssertionNodeQuery(qualifiedStatementNode);
217
+
218
+ if (typeAssertionNode !== null) {
219
+ const qualifiedStatementString = context.nodeAsString(qualifiedStatementNode);
220
+
221
+ context.trace(`Verifying the '${qualifiedStatementString}' qualified statement as a type assertion...`, qualifiedStatementNode);
222
+
223
+ const typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assignments, derived, context, verifyAhead);
224
+
225
+ statementVerifiedAsTypeAssertion = typeAssertionVerified; ///
226
+
227
+ if (statementVerifiedAsTypeAssertion) {
228
+ context.debug(`...verified the '${qualifiedStatementString}' qualified statement as a type assertion.`, qualifiedStatementNode);
229
+ }
230
+ }
231
+
232
+ return statementVerifiedAsTypeAssertion;
78
233
  }