occam-verify-cli 0.0.835 → 0.0.837

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 (37) hide show
  1. package/lib/mixins/nodesVerifier/intrinsiclevel.js +59 -0
  2. package/lib/mixins/nodesVerifier/metaLevel.js +40 -0
  3. package/lib/substitution/metastatementForMetavariable.js +82 -5
  4. package/lib/substitution/statementForMetavariable.js +82 -5
  5. package/lib/substitution/termForVariable.js +82 -5
  6. package/lib/substitution.js +74 -0
  7. package/lib/utilities/metaproof.js +2 -2
  8. package/lib/utilities/proof.js +2 -2
  9. package/lib/verifier/node/statementAsCombinator.js +7 -7
  10. package/lib/verifier/node/termAsConstructor.js +10 -18
  11. package/lib/verifier/nodes/equality.js +18 -8
  12. package/lib/verifier/nodes/intrinsicLevel.js +11 -51
  13. package/lib/verifier/nodes/metaLevel.js +9 -30
  14. package/lib/verifier/nodes/metaLevelToIntrinsicLevel.js +85 -31
  15. package/lib/verifier/nodes/statement.js +2 -3
  16. package/lib/verifier/nodes/term.js +2 -3
  17. package/lib/verify/containment.js +5 -14
  18. package/lib/verify/statement.js +23 -62
  19. package/package.json +2 -2
  20. package/src/mixins/nodesVerifier/intrinsiclevel.js +73 -0
  21. package/src/mixins/nodesVerifier/metaLevel.js +39 -0
  22. package/src/substitution/metastatementForMetavariable.js +5 -1
  23. package/src/substitution/statementForMetavariable.js +5 -1
  24. package/src/substitution/termForVariable.js +5 -1
  25. package/src/substitution.js +33 -0
  26. package/src/utilities/metaproof.js +1 -1
  27. package/src/utilities/proof.js +1 -1
  28. package/src/verifier/node/statementAsCombinator.js +10 -11
  29. package/src/verifier/node/termAsConstructor.js +11 -11
  30. package/src/verifier/nodes/equality.js +25 -10
  31. package/src/verifier/nodes/intrinsicLevel.js +13 -72
  32. package/src/verifier/nodes/metaLevel.js +11 -37
  33. package/src/verifier/nodes/metaLevelToIntrinsicLevel.js +115 -49
  34. package/src/verifier/nodes/statement.js +2 -3
  35. package/src/verifier/nodes/term.js +2 -3
  36. package/src/verify/containment.js +2 -3
  37. package/src/verify/statement.js +24 -25
@@ -1,83 +1,103 @@
1
1
  "use strict";
2
2
 
3
+ import LocalContext from "../../context/local";
3
4
  import NodesVerifier from "../../verifier/nodes";
4
- import TermForVariableSubstitution from "../../substitution/termForVariable";
5
+ import intrinsicLevelNodesVerifierMixins from "../../mixins/nodesVerifier/intrinsiclevel";
5
6
  import StatementForMetavariableSubstitution from "../../substitution/statementForMetavariable";
6
7
 
7
8
  import { nodeQuery } from "../../utilities/query";
8
- import { STATEMENT_RULE_NAME, METASTATEMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../../ruleNames";
9
+ import { TERM_RULE_NAME, STATEMENT_RULE_NAME, METASTATEMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../../ruleNames";
9
10
 
10
- const metavariableNodeQuery = nodeQuery('/metastatement/metavariable!'),
11
- metaArgumentChildNodeNodeQuery = nodeQuery('/metaArgument/*!');
11
+ const variableNodeQuery = nodeQuery("/term/variable!"),
12
+ statementNodeQuery = nodeQuery("/metaArgument/statement"),
13
+ metavariableNodeQuery = nodeQuery("/metastatement/metavariable!");
12
14
 
13
15
  class MetaLevelToIntrinsicLevelNodesVerifier extends NodesVerifier {
14
- verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localContext) {
15
- let nonTerminalNodeVerified = false;
16
+ verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localContextB, verifyAhead) {
17
+ let nonTerminalNodeVerified;
16
18
 
17
- const nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName(),
18
- nonTerminalNodeBRuleNameMetaArgumentRuleName = (nonTerminalNodeBRuleName === META_ARGUMENT_RULE_NAME);
19
+ const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName();
19
20
 
20
- if (nonTerminalNodeBRuleNameMetaArgumentRuleName) {
21
- const metaArgumentNodeB = nonTerminalNodeB, ///
22
- metaArgumentChildNodeB = metaArgumentChildNodeNodeQuery(metaArgumentNodeB);
21
+ switch (nonTerminalNodeARuleName) {
22
+ case METASTATEMENT_RULE_NAME: {
23
+ const metastatementNodeA = nonTerminalNodeA, ///
24
+ metaArgumentNodeVerified = this.verifyMetastatementNode(metastatementNodeA, nonTerminalNodeB, substitutions, fileContextA, localContextB, verifyAhead);
23
25
 
24
- nonTerminalNodeB = metaArgumentChildNodeB; ///
26
+ nonTerminalNodeVerified = metaArgumentNodeVerified; ///
25
27
 
26
- nonTerminalNodeVerified = this.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localContext);
27
- } else {
28
- const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
29
- nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName(),
30
- nonTerminalNodeARuleNameMetastatementRuleName = (nonTerminalNodeARuleName === METASTATEMENT_RULE_NAME),
31
- nonTerminalNodeBRuleNameStatementRuleName = (nonTerminalNodeBRuleName === STATEMENT_RULE_NAME);
32
-
33
- if (nonTerminalNodeARuleNameMetastatementRuleName && nonTerminalNodeBRuleNameStatementRuleName) {
34
- const metastatementNodeA = nonTerminalNodeA, ///
35
- statementNodeB = nonTerminalNodeB, ///
36
- statementNodeVerified = this.verifyStatementNode(metastatementNodeA, statementNodeB, substitutions, fileContextA, localContext);
37
-
38
- if (statementNodeVerified) {
39
- nonTerminalNodeVerified = true; ///
40
- } else {
41
- const nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
42
- nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
43
- childNodesA = nonTerminalNodeAChildNodes, ///
44
- childNodesB = nonTerminalNodeBChildNodes, ///
45
- childNodesVerified = this.verifyChildNodes(childNodesA, childNodesB, substitutions, fileContextA, localContext);
28
+ break;
29
+ }
46
30
 
47
- nonTerminalNodeVerified = childNodesVerified; ///
48
- }
49
- } else if (nonTerminalNodeBRuleName === nonTerminalNodeARuleName) {
50
- nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localContext);
31
+ case TERM_RULE_NAME: {
32
+ const termNodeA = nonTerminalNodeA, ///
33
+ termNodeVerified = this.verifyTermNode(termNodeA, nonTerminalNodeB, substitutions, fileContextA, localContextB, verifyAhead);
34
+
35
+ nonTerminalNodeVerified = termNodeVerified; ///
36
+
37
+ break;
38
+ }
39
+
40
+ default: {
41
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localContextB, verifyAhead);
51
42
  }
52
43
  }
53
44
 
54
45
  return nonTerminalNodeVerified;
55
46
  }
56
47
 
57
- verifyStatementNode(metastatementNodeA, statementNodeB, substitutions, fileContextA, localContext) {
58
- let statementNodeVerified = false;
48
+ verifyMetastatementNode(metastatementNodeA, nonTerminalNodeB, substitutions, fileContextA, localContextB, verifyAhead) {
49
+ let metastatementNodeVerified;
50
+
51
+ const nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName();
59
52
 
60
- const metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
53
+ switch (nonTerminalNodeBRuleName) {
54
+ case META_ARGUMENT_RULE_NAME: {
55
+ const metaArgumentNodeB = nonTerminalNodeB, ///
56
+ metaArgumentNodeVerified = this.verifyMetaArgumentNode(metastatementNodeA, metaArgumentNodeB, substitutions, fileContextA, localContextB, verifyAhead);
61
57
 
62
- if (metavariableNodeA !== null) {
63
- const metavariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, statementNodeB, substitutions, fileContextA, localContext);
58
+ metastatementNodeVerified = metaArgumentNodeVerified; ///
59
+
60
+ break;
61
+ }
64
62
 
65
- statementNodeVerified = metavariableNodeVerified; ///
63
+ case STATEMENT_RULE_NAME: {
64
+ const statementNodeB = nonTerminalNodeB, ///
65
+ statementNodeVerified = this.verifyStatementNode(metastatementNodeA, statementNodeB, substitutions, fileContextA, localContextB, verifyAhead);
66
+
67
+ metastatementNodeVerified = statementNodeVerified; ///
68
+
69
+ break;
70
+ }
66
71
  }
67
72
 
68
- return statementNodeVerified;
73
+ return metastatementNodeVerified;
74
+ }
75
+
76
+ verifyMetaArgumentNode(metastatementNodeA, metaArgumentNodeB, substitutions, fileContextA, localContextB, verifyAhead) {
77
+ let metaArgumentNodeVerified = false;
78
+
79
+ const statementNodeB = statementNodeQuery(metaArgumentNodeB),
80
+ metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
81
+
82
+ if ((metavariableNodeA !== null) && (statementNodeB !== null)) {
83
+ const metavariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, statementNodeB, substitutions, fileContextA, localContextB, verifyAhead);
84
+
85
+ metaArgumentNodeVerified = metavariableNodeVerified; ///
86
+ }
87
+
88
+ return metaArgumentNodeVerified;
69
89
  }
70
90
 
71
- verifyMetavariableNode(metavariableNodeA, statementNodeB, substitutions, fileContextA, localContext) {
91
+ verifyMetavariableNode(metavariableNodeA, statementNodeB, substitutions, fileContextA, localContextB, verifyAhead) {
72
92
  let metavariableNodeVerified;
73
93
 
74
94
  const substitution = substitutions.find((substitution) => {
75
- const substitutionMatchesMetavariableNodeA = substitution.matchMetavariableNode(metavariableNodeA);
95
+ const substitutionMatchesMetavariableNodeA = substitution.matchMetavariableNode(metavariableNodeA);
76
96
 
77
- if (substitutionMatchesMetavariableNodeA) {
78
- return true;
79
- }
80
- }) || null;
97
+ if (substitutionMatchesMetavariableNodeA) {
98
+ return true;
99
+ }
100
+ }) || null;
81
101
 
82
102
  if (substitution !== null) {
83
103
  const statementNode = statementNodeB, ///
@@ -97,8 +117,54 @@ class MetaLevelToIntrinsicLevelNodesVerifier extends NodesVerifier {
97
117
 
98
118
  return metavariableNodeVerified;
99
119
  }
120
+
121
+ verifyStatementNode(metastatementNodeA, statementNodeB, substitutions, fileContextA, localContextB, verifyAhead) {
122
+ let statementNodeVerified;
123
+
124
+ const nonTerminalNodeA = metastatementNodeA, ///
125
+ nonTerminalNodeB = statementNodeB, ///
126
+ nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
127
+ nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
128
+ childNodesA = nonTerminalNodeAChildNodes, ///
129
+ childNodesB = nonTerminalNodeBChildNodes, ///
130
+ childNodesVerified = super.verifyChildNodes(childNodesA, childNodesB, substitutions, fileContextA, localContextB, verifyAhead);
131
+
132
+ statementNodeVerified = childNodesVerified; ///
133
+
134
+ return statementNodeVerified;
135
+ }
136
+
137
+ verifyTermNode(termNodeA, nonTerminalNodeB, substitutions, fileContextA, localContextB, verifyAhead) {
138
+ let termNodeVerified = false;
139
+
140
+ const nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName();
141
+
142
+ switch (nonTerminalNodeBRuleName) {
143
+ case TERM_RULE_NAME: {
144
+ const variableNodeA = variableNodeQuery(termNodeA);
145
+
146
+ if (variableNodeA !== null) {
147
+ const termNodeB = nonTerminalNodeB, ///
148
+ localContextA = LocalContext.fromFileContext(fileContextA),
149
+ variableNodeVerified = this.verifyVariableNode(variableNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead);
150
+
151
+ termNodeVerified = variableNodeVerified; ///
152
+ } else {
153
+ const nonTerminalNodeA = termNodeA, ///
154
+ nonTerminalNodeB = termNodeB, ///
155
+ nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localContextB, verifyAhead);
156
+
157
+ termNodeVerified = nonTerminalNodeVerified; ///
158
+ }
159
+ }
160
+ }
161
+
162
+ return termNodeVerified;
163
+ }
100
164
  }
101
165
 
166
+ Object.assign(MetaLevelToIntrinsicLevelNodesVerifier.prototype, intrinsicLevelNodesVerifierMixins);
167
+
102
168
  const metaLevelToIntrinsicLevelNodesVerifier = new MetaLevelToIntrinsicLevelNodesVerifier();
103
169
 
104
170
  export default metaLevelToIntrinsicLevelNodesVerifier;
@@ -16,9 +16,8 @@ class StatementNodesVerifier extends NodesVerifier {
16
16
  let nonTerminalNodeVerified = false;
17
17
 
18
18
  const nonTerminalNode = nonTerminalNodeA, ///
19
- combinatorNonTerminalNode = nonTerminalNodeB; ///
20
-
21
- const ruleName = nonTerminalNode.getRuleName(), ///
19
+ combinatorNonTerminalNode = nonTerminalNodeB, ///
20
+ ruleName = nonTerminalNode.getRuleName(), ///
22
21
  combinatorRuleName = combinatorNonTerminalNode.getRuleName(); ///
23
22
 
24
23
  if (ruleName === combinatorRuleName) {
@@ -14,9 +14,8 @@ class TermNodesVerifier extends NodesVerifier {
14
14
  let nonTerminalNodeVerified = false;
15
15
 
16
16
  const nonTerminalNode = nonTerminalNodeA, ///
17
- constructorNonTerminalNode = nonTerminalNodeB; ///
18
-
19
- const ruleName = nonTerminalNode.getRuleName(), ///
17
+ constructorNonTerminalNode = nonTerminalNodeB, ///
18
+ ruleName = nonTerminalNode.getRuleName(), ///
20
19
  constructorRuleName = constructorNonTerminalNode.getRuleName(); ///
21
20
 
22
21
  if (ruleName === constructorRuleName) {
@@ -4,9 +4,8 @@ import { third } from "../utilities/array";
4
4
  import { CONTAINED } from "../constants";
5
5
  import { nodeQuery, nodesQuery } from "../utilities/query";
6
6
 
7
- const statementVariableNodesQuery = nodesQuery("/statement//variable");
8
-
9
- export const containmentVariableNodeQuery = nodeQuery("/containment/argument/term/variable!");
7
+ const statementVariableNodesQuery = nodesQuery("/statement//variable"),
8
+ containmentVariableNodeQuery = nodeQuery("/containment/argument/term/variable!");
10
9
 
11
10
  export default function verifyContainment(containmentNode, statementNode) {
12
11
  let containmentVerified = false;
@@ -7,10 +7,9 @@ import verifyTypeAssertion from "../verify/typeAssertion";
7
7
  import statementNodesVerifier from "../verifier/nodes/statement";
8
8
 
9
9
  import { nodeQuery } from "../utilities/query";
10
- import { containmentVariableNodeQuery } from "../verify/containment";
11
10
 
12
11
  const equalityNodeQuery = nodeQuery("/statement/equality!"),
13
- statementNodeQuery = nodeQuery("/statement/statement!"),
12
+ statementNodeQuery = nodeQuery("/statement/metaArgument/statement!"),
14
13
  containmentNodeQuery = nodeQuery("/statement/containment!"),
15
14
  typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!");
16
15
 
@@ -120,37 +119,37 @@ function verifyStatementWithContainment(statementNode, assignments, derived, con
120
119
  const containmentNode = containmentNodeQuery(statementNode);
121
120
 
122
121
  if (containmentNode !== null) {
123
- statementNode = statementNodeQuery(statementNode); ///
122
+ const statementString = context.nodeAsString(statementNode);
124
123
 
125
- const statementString = context.nodeAsString(statementNode),
126
- containmentVariableNode = containmentVariableNodeQuery(containmentNode),
127
- containmentVariableString = context.nodeAsString(containmentVariableNode);
124
+ statementNode = statementNodeQuery(statementNode); ///
128
125
 
129
- context.trace(`Verifying that the '${containmentVariableString}' is either contained in or omitted from the '${statementString}' statement...`, statementNode);
126
+ if (statementNode !== null) {
127
+ context.trace(`Verifying the '${statementString}' statement with containment...`, statementNode);
130
128
 
131
- const containmentVerified = verifyContainment(containmentNode, statementNode);
129
+ const containmentVerified = verifyContainment(containmentNode, statementNode);
132
130
 
133
- if (containmentVerified) {
134
- const verifyStatementFunctions = [
135
- verifyStatementAsEquality,
136
- verifyStatementAgainstCombinators
137
- ];
131
+ if (containmentVerified) {
132
+ const verifyStatementFunctions = [
133
+ verifyStatementAsEquality,
134
+ verifyStatementAgainstCombinators
135
+ ];
138
136
 
139
- const statementVerified = verifyStatementFunctions.some((verifyStatementFunction) => {
140
- const derived = false,
141
- assignments = [],
142
- statementVerified = verifyStatementFunction(statementNode, assignments, derived, context, verifyAhead);
137
+ const statementVerified = verifyStatementFunctions.some((verifyStatementFunction) => {
138
+ const derived = false,
139
+ assignments = [],
140
+ statementVerified = verifyStatementFunction(statementNode, assignments, derived, context, verifyAhead);
143
141
 
144
- if (statementVerified) {
145
- return true;
146
- }
147
- });
142
+ if (statementVerified) {
143
+ return true;
144
+ }
145
+ });
148
146
 
149
- statementVerifiedWithContainment = statementVerified; ///
150
- }
147
+ statementVerifiedWithContainment = statementVerified; ///
148
+ }
151
149
 
152
- if (statementVerifiedWithContainment) {
153
- context.debug(`...verified that '${containmentVariableString}' is either contained in or omitted from the '${statementString}' statement.`, statementNode);
150
+ if (statementVerifiedWithContainment) {
151
+ context.debug(`...verified the '${statementString}' statement with containment.`, statementNode);
152
+ }
154
153
  }
155
154
  }
156
155