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.
- package/lib/mixins/nodesVerifier/intrinsiclevel.js +59 -0
- package/lib/mixins/nodesVerifier/metaLevel.js +40 -0
- package/lib/substitution/metastatementForMetavariable.js +82 -5
- package/lib/substitution/statementForMetavariable.js +82 -5
- package/lib/substitution/termForVariable.js +82 -5
- package/lib/substitution.js +74 -0
- package/lib/utilities/metaproof.js +2 -2
- package/lib/utilities/proof.js +2 -2
- package/lib/verifier/node/statementAsCombinator.js +7 -7
- package/lib/verifier/node/termAsConstructor.js +10 -18
- package/lib/verifier/nodes/equality.js +18 -8
- package/lib/verifier/nodes/intrinsicLevel.js +11 -51
- package/lib/verifier/nodes/metaLevel.js +9 -30
- package/lib/verifier/nodes/metaLevelToIntrinsicLevel.js +85 -31
- package/lib/verifier/nodes/statement.js +2 -3
- package/lib/verifier/nodes/term.js +2 -3
- package/lib/verify/containment.js +5 -14
- package/lib/verify/statement.js +23 -62
- package/package.json +2 -2
- package/src/mixins/nodesVerifier/intrinsiclevel.js +73 -0
- package/src/mixins/nodesVerifier/metaLevel.js +39 -0
- package/src/substitution/metastatementForMetavariable.js +5 -1
- package/src/substitution/statementForMetavariable.js +5 -1
- package/src/substitution/termForVariable.js +5 -1
- package/src/substitution.js +33 -0
- package/src/utilities/metaproof.js +1 -1
- package/src/utilities/proof.js +1 -1
- package/src/verifier/node/statementAsCombinator.js +10 -11
- package/src/verifier/node/termAsConstructor.js +11 -11
- package/src/verifier/nodes/equality.js +25 -10
- package/src/verifier/nodes/intrinsicLevel.js +13 -72
- package/src/verifier/nodes/metaLevel.js +11 -37
- package/src/verifier/nodes/metaLevelToIntrinsicLevel.js +115 -49
- package/src/verifier/nodes/statement.js +2 -3
- package/src/verifier/nodes/term.js +2 -3
- package/src/verify/containment.js +2 -3
- 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
|
|
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
|
|
11
|
-
|
|
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,
|
|
15
|
-
let nonTerminalNodeVerified
|
|
16
|
+
verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localContextB, verifyAhead) {
|
|
17
|
+
let nonTerminalNodeVerified;
|
|
16
18
|
|
|
17
|
-
const
|
|
18
|
-
nonTerminalNodeBRuleNameMetaArgumentRuleName = (nonTerminalNodeBRuleName === META_ARGUMENT_RULE_NAME);
|
|
19
|
+
const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName();
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
26
|
+
nonTerminalNodeVerified = metaArgumentNodeVerified; ///
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
58
|
-
let
|
|
48
|
+
verifyMetastatementNode(metastatementNodeA, nonTerminalNodeB, substitutions, fileContextA, localContextB, verifyAhead) {
|
|
49
|
+
let metastatementNodeVerified;
|
|
50
|
+
|
|
51
|
+
const nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName();
|
|
59
52
|
|
|
60
|
-
|
|
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
|
-
|
|
63
|
-
|
|
58
|
+
metastatementNodeVerified = metaArgumentNodeVerified; ///
|
|
59
|
+
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
64
62
|
|
|
65
|
-
|
|
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
|
|
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,
|
|
91
|
+
verifyMetavariableNode(metavariableNodeA, statementNodeB, substitutions, fileContextA, localContextB, verifyAhead) {
|
|
72
92
|
let metavariableNodeVerified;
|
|
73
93
|
|
|
74
94
|
const substitution = substitutions.find((substitution) => {
|
|
75
|
-
|
|
95
|
+
const substitutionMatchesMetavariableNodeA = substitution.matchMetavariableNode(metavariableNodeA);
|
|
76
96
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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;
|
package/src/verify/statement.js
CHANGED
|
@@ -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
|
-
|
|
122
|
+
const statementString = context.nodeAsString(statementNode);
|
|
124
123
|
|
|
125
|
-
|
|
126
|
-
containmentVariableNode = containmentVariableNodeQuery(containmentNode),
|
|
127
|
-
containmentVariableString = context.nodeAsString(containmentVariableNode);
|
|
124
|
+
statementNode = statementNodeQuery(statementNode); ///
|
|
128
125
|
|
|
129
|
-
|
|
126
|
+
if (statementNode !== null) {
|
|
127
|
+
context.trace(`Verifying the '${statementString}' statement with containment...`, statementNode);
|
|
130
128
|
|
|
131
|
-
|
|
129
|
+
const containmentVerified = verifyContainment(containmentNode, statementNode);
|
|
132
130
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
131
|
+
if (containmentVerified) {
|
|
132
|
+
const verifyStatementFunctions = [
|
|
133
|
+
verifyStatementAsEquality,
|
|
134
|
+
verifyStatementAgainstCombinators
|
|
135
|
+
];
|
|
138
136
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
137
|
+
const statementVerified = verifyStatementFunctions.some((verifyStatementFunction) => {
|
|
138
|
+
const derived = false,
|
|
139
|
+
assignments = [],
|
|
140
|
+
statementVerified = verifyStatementFunction(statementNode, assignments, derived, context, verifyAhead);
|
|
143
141
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
142
|
+
if (statementVerified) {
|
|
143
|
+
return true;
|
|
144
|
+
}
|
|
145
|
+
});
|
|
148
146
|
|
|
149
|
-
|
|
150
|
-
|
|
147
|
+
statementVerifiedWithContainment = statementVerified; ///
|
|
148
|
+
}
|
|
151
149
|
|
|
152
|
-
|
|
153
|
-
|
|
150
|
+
if (statementVerifiedWithContainment) {
|
|
151
|
+
context.debug(`...verified the '${statementString}' statement with containment.`, statementNode);
|
|
152
|
+
}
|
|
154
153
|
}
|
|
155
154
|
}
|
|
156
155
|
|