occam-verify-cli 0.0.835 → 0.0.836
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
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import verifyTerm from "../../verify/term";
|
|
4
|
+
import TermForVariableSubstitution from "../../substitution/termForVariable";
|
|
5
|
+
|
|
6
|
+
import { first } from "../../utilities/array";
|
|
7
|
+
|
|
8
|
+
function verifyVariableNode(variableNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead) {
|
|
9
|
+
let variableNodeVerified = false;
|
|
10
|
+
|
|
11
|
+
const substitution = substitutions.find((substitution) => {
|
|
12
|
+
const substitutionMatchesVariableNodeA = substitution.matchVariableNode(variableNodeA);
|
|
13
|
+
|
|
14
|
+
if (substitutionMatchesVariableNodeA) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
}) || null;
|
|
18
|
+
|
|
19
|
+
if (substitution !== null) {
|
|
20
|
+
const termNode = termNodeB, ///
|
|
21
|
+
termNodeMatches = substitution.matchTermNode(termNode);
|
|
22
|
+
|
|
23
|
+
if (termNodeMatches) {
|
|
24
|
+
const verifiedAhead = verifyAhead();
|
|
25
|
+
|
|
26
|
+
variableNodeVerified = verifiedAhead; ///
|
|
27
|
+
}
|
|
28
|
+
} else {
|
|
29
|
+
const variableNode = variableNodeA, ///
|
|
30
|
+
localContext = localContextA, ///
|
|
31
|
+
variable = localContext.findVariableByVariableNode(variableNode);
|
|
32
|
+
|
|
33
|
+
if (variable !== null) {
|
|
34
|
+
const terms = [],
|
|
35
|
+
context = localContextB, ///
|
|
36
|
+
termNode = termNodeB, ///
|
|
37
|
+
termVerified = verifyTerm(termNode, terms, context, () => {
|
|
38
|
+
let verifiedAhead = false;
|
|
39
|
+
|
|
40
|
+
const firstTerm = first(terms),
|
|
41
|
+
term = firstTerm, ///
|
|
42
|
+
termType = term.getType(),
|
|
43
|
+
variableType = variable.getType(),
|
|
44
|
+
variableTypeEqualToOrSuperTypeOfTermType = variableType.isEqualToOrSuperTypeOf(termType);
|
|
45
|
+
|
|
46
|
+
if (variableTypeEqualToOrSuperTypeOfTermType) {
|
|
47
|
+
const termForVariableSubstitution = TermForVariableSubstitution.fromVariableNodeAndTermNode(variableNode, termNode),
|
|
48
|
+
substitution = termForVariableSubstitution; ///
|
|
49
|
+
|
|
50
|
+
substitutions.push(substitution);
|
|
51
|
+
|
|
52
|
+
verifiedAhead = verifyAhead();
|
|
53
|
+
|
|
54
|
+
if (!verifiedAhead) {
|
|
55
|
+
substitutions.pop();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return verifiedAhead;
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
variableNodeVerified = termVerified; ///
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return variableNodeVerified;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const intrinsicLevelNodesVerifierMixins = {
|
|
70
|
+
verifyVariableNode
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export default intrinsicLevelNodesVerifierMixins;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import MetastatementForMetavariableSubstitution from "../../substitution/metastatementForMetavariable";
|
|
4
|
+
|
|
5
|
+
function verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead) {
|
|
6
|
+
let metavariableNodeVerified;
|
|
7
|
+
|
|
8
|
+
const substitution = substitutions.find((substitution) => {
|
|
9
|
+
const substitutionMatchesMetavariableNodeA = substitution.matchMetavariableNode(metavariableNodeA);
|
|
10
|
+
|
|
11
|
+
if (substitutionMatchesMetavariableNodeA) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
}) || null;
|
|
15
|
+
|
|
16
|
+
if (substitution !== null) {
|
|
17
|
+
const metastatementNode = metastatementNodeB, ///
|
|
18
|
+
metastatementNodeMatches = substitution.matchMetastatementNode(metastatementNode);
|
|
19
|
+
|
|
20
|
+
metavariableNodeVerified = metastatementNodeMatches; ///
|
|
21
|
+
} else {
|
|
22
|
+
const metavariableNode = metavariableNodeA, ///
|
|
23
|
+
metastatementNode = metastatementNodeB, ///
|
|
24
|
+
metastatementForMetavariableSubstitution = MetastatementForMetavariableSubstitution.fromMetavariableNodeAndMetastatementNode(metavariableNode, metastatementNode),
|
|
25
|
+
substitution = metastatementForMetavariableSubstitution; ///
|
|
26
|
+
|
|
27
|
+
substitutions.push(substitution);
|
|
28
|
+
|
|
29
|
+
metavariableNodeVerified = true;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return metavariableNodeVerified;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const metaLevelNodesVerifierMixins = {
|
|
36
|
+
verifyMetavariableNode
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export default metaLevelNodesVerifierMixins;
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import Substitution from "../substitution";
|
|
4
|
+
|
|
3
5
|
import { bracketedMetastatementChildNodeFromMetastatementNode } from "../utilities/metaproof";
|
|
4
6
|
|
|
5
|
-
export default class MetastatementForMetavariableSubstitution {
|
|
7
|
+
export default class MetastatementForMetavariableSubstitution extends Substitution {
|
|
6
8
|
constructor(metavariableNode, metastatementNode) {
|
|
9
|
+
super();
|
|
10
|
+
|
|
7
11
|
this.metavariableNode = metavariableNode;
|
|
8
12
|
this.metastatementNode = metastatementNode;
|
|
9
13
|
}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import Substitution from "../substitution";
|
|
4
|
+
|
|
3
5
|
import { bracketedStatementChildNodeFromStatementNode } from "../utilities/proof";
|
|
4
6
|
|
|
5
|
-
export default class StatementForMetavariableSubstitution {
|
|
7
|
+
export default class StatementForMetavariableSubstitution extends Substitution {
|
|
6
8
|
constructor(metavariableNode, statementNode) {
|
|
9
|
+
super();
|
|
10
|
+
|
|
7
11
|
this.metavariableNode = metavariableNode;
|
|
8
12
|
this.statementNode = statementNode;
|
|
9
13
|
}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import Substitution from "../substitution";
|
|
4
|
+
|
|
5
|
+
export default class TermForVariableSubstitution extends Substitution {
|
|
4
6
|
constructor(variableNode, termNode) {
|
|
7
|
+
super();
|
|
8
|
+
|
|
5
9
|
this.variableNode = variableNode;
|
|
6
10
|
this.termNode = termNode;
|
|
7
11
|
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
export default class Substitution {
|
|
4
|
+
matchTermNode(termNode) {
|
|
5
|
+
const termNodeMatches = false;
|
|
6
|
+
|
|
7
|
+
return termNodeMatches;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
matchVariableNode(variableNode) {
|
|
11
|
+
const variableNodeMatches = false;
|
|
12
|
+
|
|
13
|
+
return variableNodeMatches;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
matchStatementNode(statementNode) {
|
|
17
|
+
const statementNodeMatches = false;
|
|
18
|
+
|
|
19
|
+
return statementNodeMatches;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
matchMetavariableNode(metavariableNode) {
|
|
23
|
+
const metavariableNodeMatches = false;
|
|
24
|
+
|
|
25
|
+
return metavariableNodeMatches;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
matchMetastatementNode(metastatementNode) {
|
|
29
|
+
const metastatementNodeMatches = false;
|
|
30
|
+
|
|
31
|
+
return metastatementNodeMatches;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -5,7 +5,7 @@ import bracketedMetastatementNode from "../node/metastatement/bracketed";
|
|
|
5
5
|
import { nodeQuery } from "../utilities/query";
|
|
6
6
|
import { BRACKETED_METASTATEMENT_DEPTH } from "../constants";
|
|
7
7
|
|
|
8
|
-
const bracketedMetastatementChildNodeQuery = nodeQuery(
|
|
8
|
+
const bracketedMetastatementChildNodeQuery = nodeQuery("/metastatement/metastatement!");
|
|
9
9
|
|
|
10
10
|
export function matchMetastatementModuloBrackets(metastatementNodeA, metastatementNodeB) {
|
|
11
11
|
let metastatementMatchesModuloBrackets = false;
|
package/src/utilities/proof.js
CHANGED
|
@@ -5,7 +5,7 @@ import bracketedStatementNode from "../node/statement/bracketed";
|
|
|
5
5
|
import { nodeQuery } from "../utilities/query";
|
|
6
6
|
import { BRACKETED_STATEMENT_DEPTH } from "../constants";
|
|
7
7
|
|
|
8
|
-
const bracketedStatementChildNodeQuery = nodeQuery(
|
|
8
|
+
const bracketedStatementChildNodeQuery = nodeQuery("/statement/metaArgument!/statement!");
|
|
9
9
|
|
|
10
10
|
export function matchStatementModuloBrackets(statementNodeA, statementNodeB) {
|
|
11
11
|
let statementMatchesModuloBrackets = false;
|
|
@@ -14,12 +14,12 @@ class StatementAsCombinatorNodeVerifier extends NodeVerifier {
|
|
|
14
14
|
const ruleName = nonTerminalNode.getRuleName();
|
|
15
15
|
|
|
16
16
|
switch (ruleName) {
|
|
17
|
-
case
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
case STATEMENT_RULE_NAME: {
|
|
18
|
+
const statementNode = nonTerminalNode, ///
|
|
19
|
+
standaloneStatementVerified = verifyStandaloneStatement(statementNode, fileContext, verifyAhead),
|
|
20
|
+
statementNodeVerified = standaloneStatementVerified; ///
|
|
21
21
|
|
|
22
|
-
nonTerminalNodeVerified =
|
|
22
|
+
nonTerminalNodeVerified = statementNodeVerified; ///
|
|
23
23
|
|
|
24
24
|
break;
|
|
25
25
|
}
|
|
@@ -34,12 +34,12 @@ class StatementAsCombinatorNodeVerifier extends NodeVerifier {
|
|
|
34
34
|
break;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
case
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
case TYPE_RULE_NAME: {
|
|
38
|
+
const typeNode = nonTerminalNode, ///
|
|
39
|
+
standaloneTypeVerified = verifyStandaloneType(typeNode, fileContext, verifyAhead),
|
|
40
|
+
typeNodeVerified = standaloneTypeVerified; ///
|
|
41
41
|
|
|
42
|
-
nonTerminalNodeVerified =
|
|
42
|
+
nonTerminalNodeVerified = typeNodeVerified; ///
|
|
43
43
|
|
|
44
44
|
break;
|
|
45
45
|
}
|
|
@@ -58,4 +58,3 @@ class StatementAsCombinatorNodeVerifier extends NodeVerifier {
|
|
|
58
58
|
const statementAsCombinatorNodeVerifier = new StatementAsCombinatorNodeVerifier();
|
|
59
59
|
|
|
60
60
|
export default statementAsCombinatorNodeVerifier;
|
|
61
|
-
|
|
@@ -17,16 +17,6 @@ class TermAsConstructorNodeVerifier extends NodeVerifier {
|
|
|
17
17
|
const ruleName = nonTerminalNode.getRuleName();
|
|
18
18
|
|
|
19
19
|
switch (ruleName) {
|
|
20
|
-
case TERM_RULE_NAME: {
|
|
21
|
-
const termNode = nonTerminalNode, ///
|
|
22
|
-
standaloneTermVerified = verifyStandaloneTerm(termNode, fileContext, verifyAhead),
|
|
23
|
-
termNodeVerified = standaloneTermVerified; ///
|
|
24
|
-
|
|
25
|
-
nonTerminalNodeVerified = termNodeVerified; ///
|
|
26
|
-
|
|
27
|
-
break;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
20
|
case ARGUMENT_RULE_NAME: {
|
|
31
21
|
const argumentNode = nonTerminalNode, ///
|
|
32
22
|
argumentVerified = verifyArgument(argumentNode, fileContext, verifyAhead),
|
|
@@ -37,6 +27,16 @@ class TermAsConstructorNodeVerifier extends NodeVerifier {
|
|
|
37
27
|
break;
|
|
38
28
|
}
|
|
39
29
|
|
|
30
|
+
case TERM_RULE_NAME: {
|
|
31
|
+
const termNode = nonTerminalNode, ///
|
|
32
|
+
standaloneTermVerified = verifyStandaloneTerm(termNode, fileContext, verifyAhead),
|
|
33
|
+
termNodeVerified = standaloneTermVerified; ///
|
|
34
|
+
|
|
35
|
+
nonTerminalNodeVerified = termNodeVerified; ///
|
|
36
|
+
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
40
|
default: {
|
|
41
41
|
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNode, fileContext, verifyAhead);
|
|
42
42
|
|
|
@@ -52,7 +52,7 @@ const termAsConstructorNodeVerifier = new TermAsConstructorNodeVerifier();
|
|
|
52
52
|
|
|
53
53
|
export default termAsConstructorNodeVerifier;
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
function verifyArgument(argumentNode, fileContext, verifyAhead) {
|
|
56
56
|
let argumentVerified;
|
|
57
57
|
|
|
58
58
|
const argumentString = fileContext.nodeAsString(argumentNode);
|
|
@@ -15,17 +15,11 @@ class EqualityNodesVerifier extends NodesVerifier {
|
|
|
15
15
|
if (ruleNameA === ruleNameB) {
|
|
16
16
|
switch (ruleNameA) {
|
|
17
17
|
case TERM_RULE_NAME: {
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
const termNodeA = nonTerminalNodeA, ///
|
|
19
|
+
termNodeB = nonTerminalNodeB, ///
|
|
20
|
+
termNodeVerified = this.verifyTermNode(termNodeA, termNodeB, collections, localContext, verifyAhead);
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
const verifiedAhead = verifyAhead();
|
|
24
|
-
|
|
25
|
-
nonTerminalNodeVerified = verifiedAhead; ///
|
|
26
|
-
} else {
|
|
27
|
-
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, collections, localContext, verifyAhead);
|
|
28
|
-
}
|
|
22
|
+
nonTerminalNodeVerified = termNodeVerified; ///
|
|
29
23
|
|
|
30
24
|
break;
|
|
31
25
|
}
|
|
@@ -40,6 +34,27 @@ class EqualityNodesVerifier extends NodesVerifier {
|
|
|
40
34
|
|
|
41
35
|
return nonTerminalNodeVerified;
|
|
42
36
|
}
|
|
37
|
+
|
|
38
|
+
verifyTermNode(termNodeA, termNodeB, collections, localContext, verifyAhead) {
|
|
39
|
+
let termNodeVerified;
|
|
40
|
+
|
|
41
|
+
const leftTermNode = termNodeA, ///
|
|
42
|
+
rightTermNode = termNodeB, ///
|
|
43
|
+
termNodesEqual = areTermNodesEqual(leftTermNode, rightTermNode, collections);
|
|
44
|
+
|
|
45
|
+
if (termNodesEqual) {
|
|
46
|
+
const verifiedAhead = verifyAhead();
|
|
47
|
+
|
|
48
|
+
termNodeVerified = verifiedAhead; ///
|
|
49
|
+
} else {
|
|
50
|
+
const nonTerminalNodeA = termNodeA, ///
|
|
51
|
+
nonTerminalNodeB = termNodeB; ///
|
|
52
|
+
|
|
53
|
+
termNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, collections, localContext, verifyAhead);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return termNodeVerified;
|
|
57
|
+
}
|
|
43
58
|
}
|
|
44
59
|
|
|
45
60
|
const equalityNodesVerifier = new EqualityNodesVerifier();
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import verifyTerm from "../../verify/term";
|
|
4
3
|
import NodesVerifier from "../../verifier/nodes";
|
|
5
|
-
import
|
|
4
|
+
import intrinsicLevelNodesVerifierMixins from "../../mixins/nodesVerifier/intrinsiclevel";
|
|
6
5
|
|
|
7
|
-
import { first } from "../../utilities/array";
|
|
8
6
|
import { nodeQuery } from "../../utilities/query";
|
|
9
7
|
import { TERM_RULE_NAME } from "../../ruleNames";
|
|
10
8
|
|
|
11
|
-
const variableNodeQuery = nodeQuery(
|
|
9
|
+
const variableNodeQuery = nodeQuery("/term/variable!");
|
|
12
10
|
|
|
13
11
|
class IntrinsicLevelNodesVerifier extends NodesVerifier {
|
|
14
12
|
verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, verifyAhead) {
|
|
@@ -26,11 +24,7 @@ class IntrinsicLevelNodesVerifier extends NodesVerifier {
|
|
|
26
24
|
termNodeB = nonTerminalNodeB, ///
|
|
27
25
|
termNodeVerified = this.verifyTermNode(termNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead);
|
|
28
26
|
|
|
29
|
-
|
|
30
|
-
nonTerminalNodeVerified = true; ///
|
|
31
|
-
} else {
|
|
32
|
-
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, verifyAhead);
|
|
33
|
-
}
|
|
27
|
+
nonTerminalNodeVerified = termNodeVerified; ///
|
|
34
28
|
|
|
35
29
|
break;
|
|
36
30
|
}
|
|
@@ -47,81 +41,28 @@ class IntrinsicLevelNodesVerifier extends NodesVerifier {
|
|
|
47
41
|
}
|
|
48
42
|
|
|
49
43
|
verifyTermNode(termNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead) {
|
|
50
|
-
let termNodeVerified
|
|
44
|
+
let termNodeVerified;
|
|
51
45
|
|
|
52
46
|
const variableNodeA = variableNodeQuery(termNodeA);
|
|
53
47
|
|
|
54
48
|
if (variableNodeA !== null) {
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
termNodeVerified = variableVerified; ///
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return termNodeVerified;
|
|
61
|
-
}
|
|
49
|
+
const variableNodeVerified = this.verifyVariableNode(variableNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead);
|
|
62
50
|
|
|
63
|
-
|
|
64
|
-
let variableVerified = false;
|
|
65
|
-
|
|
66
|
-
const substitution = substitutions.find((substitution) => {
|
|
67
|
-
const substitutionMatchesVariableNodeA = substitution.matchVariableNode(variableNodeA);
|
|
68
|
-
|
|
69
|
-
if (substitutionMatchesVariableNodeA) {
|
|
70
|
-
return true;
|
|
71
|
-
}
|
|
72
|
-
}) || null;
|
|
73
|
-
|
|
74
|
-
if (substitution !== null) {
|
|
75
|
-
const termNode = termNodeB, ///
|
|
76
|
-
substitutionNodesVerified = substitution.matchTermNode(termNode);
|
|
77
|
-
|
|
78
|
-
if (substitutionNodesVerified) {
|
|
79
|
-
const verifiedAhead = verifyAhead();
|
|
80
|
-
|
|
81
|
-
variableVerified = verifiedAhead; ///
|
|
82
|
-
}
|
|
51
|
+
termNodeVerified = variableNodeVerified; ///
|
|
83
52
|
} else {
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
if (variable !== null) {
|
|
89
|
-
const terms = [],
|
|
90
|
-
context = localContextB, ///
|
|
91
|
-
termNode = termNodeB, ///
|
|
92
|
-
termVerified = verifyTerm(termNode, terms, context, () => {
|
|
93
|
-
let verifiedAhead = false;
|
|
94
|
-
|
|
95
|
-
const firstTerm = first(terms),
|
|
96
|
-
term = firstTerm, ///
|
|
97
|
-
termType = term.getType(),
|
|
98
|
-
variableType = variable.getType(),
|
|
99
|
-
variableTypeEqualToOrSuperTypeOfTermType = variableType.isEqualToOrSuperTypeOf(termType);
|
|
100
|
-
|
|
101
|
-
if (variableTypeEqualToOrSuperTypeOfTermType) {
|
|
102
|
-
const termForVariableSubstitution = TermForVariableSubstitution.fromVariableNodeAndTermNode(variableNode, termNode),
|
|
103
|
-
substitution = termForVariableSubstitution; ///
|
|
104
|
-
|
|
105
|
-
substitutions.push(substitution);
|
|
106
|
-
|
|
107
|
-
verifiedAhead = verifyAhead();
|
|
108
|
-
|
|
109
|
-
if (!verifiedAhead) {
|
|
110
|
-
substitutions.pop();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return verifiedAhead;
|
|
115
|
-
});
|
|
53
|
+
const nonTerminalNodeA = termNodeA, ///
|
|
54
|
+
nonTerminalNodeB = termNodeB, ///
|
|
55
|
+
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, verifyAhead);
|
|
116
56
|
|
|
117
|
-
|
|
118
|
-
}
|
|
57
|
+
termNodeVerified = nonTerminalNodeVerified; ///
|
|
119
58
|
}
|
|
120
59
|
|
|
121
|
-
return
|
|
60
|
+
return termNodeVerified;
|
|
122
61
|
}
|
|
123
62
|
}
|
|
124
63
|
|
|
64
|
+
Object.assign(IntrinsicLevelNodesVerifier.prototype, intrinsicLevelNodesVerifierMixins);
|
|
65
|
+
|
|
125
66
|
const intrinsicLevelNodesVerifier = new IntrinsicLevelNodesVerifier();
|
|
126
67
|
|
|
127
68
|
export default intrinsicLevelNodesVerifier;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import NodesVerifier from "../../verifier/nodes";
|
|
4
|
-
import
|
|
4
|
+
import metaLevelNodesVerifierMixins from "../../mixins/nodesVerifier/metaLevel";
|
|
5
5
|
|
|
6
6
|
import { nodeQuery } from "../../utilities/query";
|
|
7
7
|
import { METASTATEMENT_RULE_NAME } from "../../ruleNames";
|
|
8
8
|
|
|
9
|
-
const metavariableNodeQuery = nodeQuery(
|
|
9
|
+
const metavariableNodeQuery = nodeQuery("/metastatement/metavariable!");
|
|
10
10
|
|
|
11
11
|
class MetaLevelNodesVerifier extends NodesVerifier {
|
|
12
12
|
verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead) {
|
|
@@ -24,11 +24,7 @@ class MetaLevelNodesVerifier extends NodesVerifier {
|
|
|
24
24
|
metastatementNodeB = nonTerminalNodeB, ///
|
|
25
25
|
metastatementNodeVerified = this.verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead);
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
nonTerminalNodeVerified = true; ///
|
|
29
|
-
} else {
|
|
30
|
-
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead);
|
|
31
|
-
}
|
|
27
|
+
nonTerminalNodeVerified = metastatementNodeVerified; ///
|
|
32
28
|
|
|
33
29
|
break;
|
|
34
30
|
}
|
|
@@ -45,7 +41,7 @@ class MetaLevelNodesVerifier extends NodesVerifier {
|
|
|
45
41
|
}
|
|
46
42
|
|
|
47
43
|
verifyMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead) {
|
|
48
|
-
let metastatementNodeVerified
|
|
44
|
+
let metastatementNodeVerified;
|
|
49
45
|
|
|
50
46
|
const metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
|
|
51
47
|
|
|
@@ -53,42 +49,20 @@ class MetaLevelNodesVerifier extends NodesVerifier {
|
|
|
53
49
|
const metaVariableNodeVerified = this.verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead);
|
|
54
50
|
|
|
55
51
|
metastatementNodeVerified = metaVariableNodeVerified; ///
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
return metastatementNodeVerified;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
verifyMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead) {
|
|
62
|
-
let metavariableNodeVerified;
|
|
63
|
-
|
|
64
|
-
const substitution = substitutions.find((substitution) => {
|
|
65
|
-
const substitutionMatchesMetavariableNodeA = substitution.matchMetavariableNode(metavariableNodeA);
|
|
66
|
-
|
|
67
|
-
if (substitutionMatchesMetavariableNodeA) {
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
}) || null;
|
|
71
|
-
|
|
72
|
-
if (substitution !== null) {
|
|
73
|
-
const metastatementNode = metastatementNodeB, ///
|
|
74
|
-
metastatementNodeMatches = substitution.matchMetastatementNode(metastatementNode);
|
|
75
|
-
|
|
76
|
-
metavariableNodeVerified = metastatementNodeMatches; ///
|
|
77
52
|
} else {
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
substitution = metastatementForMetavariableSubstitution; ///
|
|
82
|
-
|
|
83
|
-
substitutions.push(substitution);
|
|
53
|
+
const nonTerminalNodeA = metastatementNodeA, ///
|
|
54
|
+
nonTerminalNodeB = metastatementNodeB, ///
|
|
55
|
+
nonTerminalNodeVerified = super.verifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, fileContextA, localMetaContextB, verifyAhead);
|
|
84
56
|
|
|
85
|
-
|
|
57
|
+
metastatementNodeVerified = nonTerminalNodeVerified; ///
|
|
86
58
|
}
|
|
87
59
|
|
|
88
|
-
return
|
|
60
|
+
return metastatementNodeVerified;
|
|
89
61
|
}
|
|
90
62
|
}
|
|
91
63
|
|
|
64
|
+
Object.assign(MetaLevelNodesVerifier.prototype, metaLevelNodesVerifierMixins);
|
|
65
|
+
|
|
92
66
|
const metaLevelNodesVerifier = new MetaLevelNodesVerifier();
|
|
93
67
|
|
|
94
68
|
export default metaLevelNodesVerifier;
|