occam-verify-cli 0.0.932 → 0.0.934
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/conclusion.js +4 -4
- package/lib/consequent.js +4 -4
- package/lib/context/local.js +188 -9
- package/lib/declaration.js +2 -2
- package/lib/equality.js +4 -4
- package/lib/equivalence.js +16 -1
- package/lib/metaLemma.js +4 -4
- package/lib/metatheorem.js +4 -4
- package/lib/premise.js +6 -6
- package/lib/proofStep.js +43 -6
- package/lib/shim.js +14 -0
- package/lib/substitution/statementForMetavariable.js +46 -2
- package/lib/substitution/termForVariable.js +15 -1
- package/lib/supposition.js +6 -6
- package/lib/unifier/equality.js +216 -0
- package/lib/unifier/metaLevel.js +235 -0
- package/lib/unifier/statementAgainstCombinator.js +232 -0
- package/lib/unifier/termAgainstConstructor.js +212 -0
- package/lib/unifier.js +201 -0
- package/lib/unify/argumentAgainstArgument.js +24 -0
- package/lib/unify/metavariableAgainstStatement.js +66 -0
- package/lib/unify/statementAgainstMetaType.js +28 -0
- package/lib/unify/statementAtainstStatement.js +52 -0
- package/lib/unify/termAgainstTerm.js +22 -0
- package/lib/unify/termAgainstType.js +26 -0
- package/lib/unify/variableAgainstTerm.js +70 -0
- package/lib/verifier/metaLevel.js +236 -0
- package/lib/verifier/statementAsCombinator.js +236 -0
- package/lib/verifier/termAsConstructor.js +219 -0
- package/lib/verifier.js +182 -0
- package/lib/verify/assertion/contained.js +2 -2
- package/lib/verify/assertion/defined.js +2 -2
- package/lib/verify/declaration.js +18 -18
- package/lib/verify/frame.js +9 -12
- package/lib/verify/proofStep.js +3 -3
- package/lib/verify/statement/qualified.js +61 -10
- package/lib/verify/statement/unqualified.js +62 -50
- package/lib/verify/statement.js +36 -41
- package/lib/verify/statementAsCombinator.js +2 -2
- package/lib/verify/subDerivation.js +8 -2
- package/lib/verify/term.js +8 -7
- package/lib/verify/termAsConstructor.js +2 -2
- package/package.json +2 -2
- package/src/conclusion.js +3 -3
- package/src/consequent.js +3 -3
- package/src/context/local.js +68 -8
- package/src/declaration.js +2 -2
- package/src/equality.js +3 -3
- package/src/equivalence.js +19 -0
- package/src/metaLemma.js +1 -1
- package/src/metatheorem.js +1 -1
- package/src/premise.js +5 -5
- package/src/proofStep.js +57 -4
- package/src/shim.js +5 -0
- package/src/substitution/statementForMetavariable.js +33 -2
- package/src/substitution/termForVariable.js +16 -0
- package/src/supposition.js +5 -5
- package/src/unifier/equality.js +84 -0
- package/src/unifier/metaLevel.js +114 -0
- package/src/unifier/statementAgainstCombinator.js +105 -0
- package/src/unifier/termAgainstConstructor.js +77 -0
- package/src/unifier.js +133 -0
- package/src/unify/argumentAgainstArgument.js +15 -0
- package/src/{verify → unify}/metavariableAgainstStatement.js +18 -18
- package/src/{verify → unify}/statementAgainstMetaType.js +4 -4
- package/src/{verify → unify}/statementAtainstStatement.js +7 -7
- package/src/{verify → unify}/termAgainstTerm.js +5 -5
- package/src/{verify → unify}/termAgainstType.js +7 -7
- package/src/{verify → unify}/variableAgainstTerm.js +6 -6
- package/src/verifier/{node/metaLevel.js → metaLevel.js} +14 -14
- package/src/verifier/{node/statementAsCombinator.js → statementAsCombinator.js} +14 -14
- package/src/verifier/{node/termAsConstructor.js → termAsConstructor.js} +12 -12
- package/src/{verifier/node.js → verifier.js} +19 -1
- package/src/verify/assertion/contained.js +2 -2
- package/src/verify/assertion/defined.js +2 -2
- package/src/verify/declaration.js +20 -23
- package/src/verify/frame.js +10 -13
- package/src/verify/proofStep.js +2 -2
- package/src/verify/statement/qualified.js +95 -10
- package/src/verify/statement/unqualified.js +85 -11
- package/src/verify/statement.js +47 -45
- package/src/verify/statementAsCombinator.js +2 -2
- package/src/verify/subDerivation.js +3 -1
- package/src/verify/term.js +7 -6
- package/src/verify/termAsConstructor.js +2 -2
- package/lib/mixins/context.js +0 -135
- package/lib/mixins/nodesVerifier/intrinsiclevel.js +0 -59
- package/lib/mixins/nodesVerifier/metaLevel.js +0 -40
- package/lib/utilities/verifier.js +0 -80
- package/lib/verifier/node/metaLevel.js +0 -201
- package/lib/verifier/node/statementAsCombinator.js +0 -201
- package/lib/verifier/node/termAsConstructor.js +0 -184
- package/lib/verifier/node.js +0 -157
- package/lib/verifier/nodes/equality.js +0 -176
- package/lib/verifier/nodes/metaLevel.js +0 -191
- package/lib/verifier/nodes/statementAgainstCombinator.js +0 -191
- package/lib/verifier/nodes/termAgainstConstructor.js +0 -171
- package/lib/verifier/nodes.js +0 -175
- package/lib/verify/argumentAgainstArgument.js +0 -24
- package/lib/verify/metavariableAgainstStatement.js +0 -66
- package/lib/verify/statementAgainstMetaType.js +0 -28
- package/lib/verify/statementAtainstStatement.js +0 -52
- package/lib/verify/termAgainstTerm.js +0 -22
- package/lib/verify/termAgainstType.js +0 -26
- package/lib/verify/variableAgainstTerm.js +0 -70
- package/src/mixins/context.js +0 -96
- package/src/mixins/nodesVerifier/intrinsiclevel.js +0 -73
- package/src/mixins/nodesVerifier/metaLevel.js +0 -39
- package/src/utilities/verifier.js +0 -38
- package/src/verifier/nodes/equality.js +0 -84
- package/src/verifier/nodes/metaLevel.js +0 -109
- package/src/verifier/nodes/statementAgainstCombinator.js +0 -105
- package/src/verifier/nodes/termAgainstConstructor.js +0 -76
- package/src/verifier/nodes.js +0 -114
- package/src/verify/argumentAgainstArgument.js +0 -15
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import shim from "../shim";
|
|
4
|
+
import Unifier from "../unifier";
|
|
5
|
+
import unifyArgumentAgainstArgument from "../unify/argumentAgainstArgument";
|
|
6
|
+
import unifyStatementAgainstMetaType from "../unify/statementAgainstMetaType";
|
|
7
|
+
|
|
8
|
+
import { unify } from "../unifier";
|
|
9
|
+
import { nodeQuery } from "../utilities/query";
|
|
10
|
+
|
|
11
|
+
const argumentNodeQuery = nodeQuery("/argument!"),
|
|
12
|
+
metaTypeNodeQuery = nodeQuery("/metaType!"),
|
|
13
|
+
statementNodeQuery = nodeQuery("/statement!"),
|
|
14
|
+
nonTerminalNodeQuery = nodeQuery("/*");
|
|
15
|
+
|
|
16
|
+
class StatementAgainstCombinatorUnifier extends Unifier {
|
|
17
|
+
unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext, unifyAhead) {
|
|
18
|
+
let nonTerminalNodeUnified;
|
|
19
|
+
|
|
20
|
+
const nodeQueryMaps = [
|
|
21
|
+
{
|
|
22
|
+
nodeQueryA: statementNodeQuery,
|
|
23
|
+
nodeQueryB: metaTypeNodeQuery,
|
|
24
|
+
unify: (nodeA, nodeB, localContext, unifyAhead) => {
|
|
25
|
+
let nonTerminalNodeUnified;
|
|
26
|
+
|
|
27
|
+
const metaTypeNodeB = nodeB, ///
|
|
28
|
+
statementNodeA = nodeA, ///
|
|
29
|
+
statementUnifiedAgainstMetaType =
|
|
30
|
+
|
|
31
|
+
this.unifyMetaArgumentStatementAgainstMetaType(statementNodeA, metaTypeNodeB, localContext, unifyAhead);
|
|
32
|
+
|
|
33
|
+
nonTerminalNodeUnified = statementUnifiedAgainstMetaType; ///
|
|
34
|
+
|
|
35
|
+
return nonTerminalNodeUnified;
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
nodeQueryA: argumentNodeQuery,
|
|
40
|
+
nodeQueryB: argumentNodeQuery,
|
|
41
|
+
unify: (nodeA, nodeB, localContext, unifyAhead) => {
|
|
42
|
+
let nonTerminalNodeUnified;
|
|
43
|
+
|
|
44
|
+
const argumentNodeA = nodeA, ///
|
|
45
|
+
argumentNodeB = nodeB, ///
|
|
46
|
+
argumentNodeUnifiedAgainstArgumentNode =
|
|
47
|
+
|
|
48
|
+
this.unifyArgumentNodeAgainstArgumentNode(argumentNodeA, argumentNodeB, localContext, unifyAhead);
|
|
49
|
+
|
|
50
|
+
nonTerminalNodeUnified = argumentNodeUnifiedAgainstArgumentNode; ///
|
|
51
|
+
|
|
52
|
+
return nonTerminalNodeUnified;
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
nodeQueryA: nonTerminalNodeQuery,
|
|
57
|
+
nodeQueryB: nonTerminalNodeQuery,
|
|
58
|
+
unify: (nodeA, nodeB, localContext, unifyAhead) => {
|
|
59
|
+
let nonTerminalNodeUnified;
|
|
60
|
+
|
|
61
|
+
const nonTerminalNodeA = nodeA, ///
|
|
62
|
+
nonTerminalNodeB = nodeB; ///
|
|
63
|
+
|
|
64
|
+
nonTerminalNodeUnified =
|
|
65
|
+
|
|
66
|
+
super.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext, unifyAhead);
|
|
67
|
+
|
|
68
|
+
return nonTerminalNodeUnified;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
];
|
|
72
|
+
|
|
73
|
+
const nodesUnified = unify(nodeQueryMaps, nonTerminalNodeA, nonTerminalNodeB, localContext, unifyAhead);
|
|
74
|
+
|
|
75
|
+
nonTerminalNodeUnified = nodesUnified; ///
|
|
76
|
+
|
|
77
|
+
return nonTerminalNodeUnified;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
unifyMetaArgumentStatementAgainstMetaType(statementNodeA, metaTypeNodeB, localContext, unifyAhead) {
|
|
81
|
+
let statementUnifiedAgainstMetaType;
|
|
82
|
+
|
|
83
|
+
const { verifyStatement } = shim,
|
|
84
|
+
metaTypeNode = metaTypeNodeB, ///
|
|
85
|
+
statementNode = statementNodeA; ///
|
|
86
|
+
|
|
87
|
+
statementUnifiedAgainstMetaType = unifyStatementAgainstMetaType(statementNode, metaTypeNode, localContext, unifyAhead, verifyStatement);
|
|
88
|
+
|
|
89
|
+
return statementUnifiedAgainstMetaType;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
unifyArgumentNodeAgainstArgumentNode(argumentNodeA, argumentNodeB, localContext, unifyAhead) {
|
|
93
|
+
let argumentNodeUnifiedAgainstArgumentNode;
|
|
94
|
+
|
|
95
|
+
const argumentUnifiedAgainstArgument = unifyArgumentAgainstArgument(argumentNodeA, argumentNodeB, localContext, unifyAhead);
|
|
96
|
+
|
|
97
|
+
argumentNodeUnifiedAgainstArgumentNode = argumentUnifiedAgainstArgument; ///
|
|
98
|
+
|
|
99
|
+
return argumentNodeUnifiedAgainstArgumentNode;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const statementAgainstCombinatorUnifier = new StatementAgainstCombinatorUnifier();
|
|
104
|
+
|
|
105
|
+
export default statementAgainstCombinatorUnifier;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import shim from "../shim";
|
|
4
|
+
import Unifier from "../unifier";
|
|
5
|
+
import unifyTermAgainstType from "../unify/termAgainstType";
|
|
6
|
+
|
|
7
|
+
import { unify } from "../unifier";
|
|
8
|
+
import { nodeQuery } from "../utilities/query";
|
|
9
|
+
|
|
10
|
+
const termNodeQuery = nodeQuery("/argument/term!"),
|
|
11
|
+
typeNodeQuery = nodeQuery("/argument/type!"),
|
|
12
|
+
nonTerminalNodeQuery = nodeQuery("/*");
|
|
13
|
+
|
|
14
|
+
class TermAgainstConstructorUnifier extends Unifier {
|
|
15
|
+
unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext, unifyAhead) {
|
|
16
|
+
let nonTerminalNodUnified;
|
|
17
|
+
|
|
18
|
+
const nodeQueryMaps = [
|
|
19
|
+
{
|
|
20
|
+
nodeQueryA: termNodeQuery,
|
|
21
|
+
nodeQueryB: typeNodeQuery,
|
|
22
|
+
unify: (nodeA, nodeB, localContext, unifyAhead) => {
|
|
23
|
+
let nonTerminalNodUnified;
|
|
24
|
+
|
|
25
|
+
const termNodeA = nodeA, ///
|
|
26
|
+
typeNodeB = nodeB, ///
|
|
27
|
+
termNodUnifiedAgainstTypeNode =
|
|
28
|
+
|
|
29
|
+
this.unifyTermNodeAgainstTypeNode(termNodeA, typeNodeB, localContext, unifyAhead);
|
|
30
|
+
|
|
31
|
+
nonTerminalNodUnified = termNodUnifiedAgainstTypeNode; ///
|
|
32
|
+
|
|
33
|
+
return nonTerminalNodUnified;
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
nodeQueryA: nonTerminalNodeQuery,
|
|
38
|
+
nodeQueryB: nonTerminalNodeQuery,
|
|
39
|
+
unify: (nodeA, nodeB, localContext, unifyAhead) => {
|
|
40
|
+
let nonTerminalNodUnified;
|
|
41
|
+
|
|
42
|
+
const nonTerminalNodeA = nodeA, ///
|
|
43
|
+
nonTerminalNodeB = nodeB; ///
|
|
44
|
+
|
|
45
|
+
nonTerminalNodUnified =
|
|
46
|
+
|
|
47
|
+
super.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext, unifyAhead);
|
|
48
|
+
|
|
49
|
+
return nonTerminalNodUnified;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
const nodesVerified = unify(nodeQueryMaps, nonTerminalNodeA, nonTerminalNodeB, localContext, unifyAhead);
|
|
55
|
+
|
|
56
|
+
nonTerminalNodUnified = nodesVerified; ///
|
|
57
|
+
|
|
58
|
+
return nonTerminalNodUnified;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
unifyTermNodeAgainstTypeNode(termNodeA, typeNodeB, localContext, unifyAhead) {
|
|
62
|
+
let termNodUnifiedAgainstTypeNode;
|
|
63
|
+
|
|
64
|
+
const { verifyTerm } = shim,
|
|
65
|
+
termNode = termNodeA, ///
|
|
66
|
+
typeNode = typeNodeB, ///
|
|
67
|
+
typeUnifiedAgainstTerm = unifyTermAgainstType(termNode, typeNode, localContext, unifyAhead, verifyTerm);
|
|
68
|
+
|
|
69
|
+
termNodUnifiedAgainstTypeNode = typeUnifiedAgainstTerm; ///
|
|
70
|
+
|
|
71
|
+
return termNodUnifiedAgainstTypeNode;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const termAgainstConstructorUnifier = new TermAgainstConstructorUnifier();
|
|
76
|
+
|
|
77
|
+
export default termAgainstConstructorUnifier;
|
package/src/unifier.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { terminalNodeMapFromNodes, areTerminalNodeMapsEqual } from "./utilities/terminalNodes";
|
|
4
|
+
|
|
5
|
+
export default class Unifier {
|
|
6
|
+
unifyNode(nodeA, nodeB, ...remainingArguments) {
|
|
7
|
+
let nodeUnified = false;
|
|
8
|
+
|
|
9
|
+
const nodeATerminalNode = nodeA.isTerminalNode(),
|
|
10
|
+
nodeBTerminalNode = nodeB.isTerminalNode(),
|
|
11
|
+
nodeANonTerminalNode = nodeA.isNonTerminalNode(),
|
|
12
|
+
nodeBNonTerminalNode = nodeB.isNonTerminalNode();
|
|
13
|
+
|
|
14
|
+
if (false) {
|
|
15
|
+
///
|
|
16
|
+
} else if (nodeATerminalNode && nodeBTerminalNode) {
|
|
17
|
+
const terminalNodeA = nodeA, ///
|
|
18
|
+
terminalNodeB = nodeB, ///
|
|
19
|
+
terminalNodeUnified = this.unifyTerminalNode(terminalNodeA, terminalNodeB, ...remainingArguments);
|
|
20
|
+
|
|
21
|
+
nodeUnified = terminalNodeUnified; ///
|
|
22
|
+
} else if (nodeANonTerminalNode && nodeBNonTerminalNode) {
|
|
23
|
+
const nonTerminalNodeA = nodeA, ///
|
|
24
|
+
nonTerminalNodeB = nodeB, ///
|
|
25
|
+
nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, ...remainingArguments);
|
|
26
|
+
|
|
27
|
+
nodeUnified = nonTerminalNodeUnified; ///
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return nodeUnified;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
unifyChildNodes(childNodesA, childNodesB, ...remainingArguments) {
|
|
34
|
+
let childNodesUnified = false;
|
|
35
|
+
|
|
36
|
+
const childNodesALength = childNodesA.length,
|
|
37
|
+
childNodesBLength = childNodesB.length;
|
|
38
|
+
|
|
39
|
+
if (childNodesALength === childNodesBLength) {
|
|
40
|
+
const childTerminalNodeMapA = terminalNodeMapFromNodes(childNodesA),
|
|
41
|
+
childTerminalNodeMapB = terminalNodeMapFromNodes(childNodesB),
|
|
42
|
+
terminalNodeMapsEqual = areTerminalNodeMapsEqual(childTerminalNodeMapA, childTerminalNodeMapB);
|
|
43
|
+
|
|
44
|
+
if (terminalNodeMapsEqual) {
|
|
45
|
+
const index = 0,
|
|
46
|
+
childNodesVerifyAhead = this.unifyChildNodesAhead(index, childNodesA, childNodesB, ...remainingArguments);
|
|
47
|
+
|
|
48
|
+
childNodesUnified = childNodesVerifyAhead; ///
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return childNodesUnified;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
unifyTerminalNode(terminalNodeA, terminalNodeB, ...remainingArguments) { ///
|
|
56
|
+
let terminalNodeUnified;
|
|
57
|
+
|
|
58
|
+
const unifyAhead = remainingArguments.pop(),
|
|
59
|
+
unifyiedAhead = unifyAhead();
|
|
60
|
+
|
|
61
|
+
terminalNodeUnified = unifyiedAhead; ///
|
|
62
|
+
|
|
63
|
+
return terminalNodeUnified;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, ...remainingArguments) {
|
|
67
|
+
let nonTerminalNodeUnified = false;
|
|
68
|
+
|
|
69
|
+
const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(), ///
|
|
70
|
+
nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName(); ///
|
|
71
|
+
|
|
72
|
+
if (nonTerminalNodeARuleName === nonTerminalNodeBRuleName) {
|
|
73
|
+
const nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
|
|
74
|
+
nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
|
|
75
|
+
childNodesA = nonTerminalNodeAChildNodes, ///
|
|
76
|
+
childNodesB = nonTerminalNodeBChildNodes, ///
|
|
77
|
+
childNodesUnified = this.unifyChildNodes(childNodesA, childNodesB, ...remainingArguments);
|
|
78
|
+
|
|
79
|
+
nonTerminalNodeUnified = childNodesUnified; ///
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return nonTerminalNodeUnified;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
unifyChildNodesAhead(index, childNodesA, childNodesB, ...remainingArguments) {
|
|
86
|
+
let childNodesUnified;
|
|
87
|
+
|
|
88
|
+
const unifyAhead = remainingArguments.pop(), ///
|
|
89
|
+
childNodesALength = childNodesA.length;
|
|
90
|
+
|
|
91
|
+
if (index === childNodesALength) {
|
|
92
|
+
const unifyiedAhead = unifyAhead();
|
|
93
|
+
|
|
94
|
+
childNodesUnified = unifyiedAhead; ///
|
|
95
|
+
} else {
|
|
96
|
+
const childNodeA = childNodesA[index],
|
|
97
|
+
childNodeB = childNodesB[index],
|
|
98
|
+
nodeA = childNodeA, ///
|
|
99
|
+
nodeB = childNodeB, ///
|
|
100
|
+
nodeUnified = this.unifyNode(nodeA, nodeB, ...remainingArguments, () => {
|
|
101
|
+
remainingArguments.push(unifyAhead); ///
|
|
102
|
+
|
|
103
|
+
const aheadIndex = index + 1,
|
|
104
|
+
childNodesVerifyAhead = this.unifyChildNodesAhead(aheadIndex, childNodesA, childNodesB, ...remainingArguments);
|
|
105
|
+
|
|
106
|
+
return childNodesVerifyAhead;
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
childNodesUnified = nodeUnified; ///
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return childNodesUnified;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function unify(nodeQueryMaps, nonTerminalNodeA, nonTerminalNodeB, ...remainingArguments) {
|
|
117
|
+
let unified = false;
|
|
118
|
+
|
|
119
|
+
nodeQueryMaps.some((nodeQueryMap) => {
|
|
120
|
+
const { nodeQueryA, nodeQueryB, unify } = nodeQueryMap;
|
|
121
|
+
|
|
122
|
+
const nodeA = nodeQueryA(nonTerminalNodeA), ///
|
|
123
|
+
nodeB = nodeQueryB(nonTerminalNodeB); ///
|
|
124
|
+
|
|
125
|
+
if ((nodeA !== null) && (nodeB !== null)) {
|
|
126
|
+
unified = unify(nodeA, nodeB, ...remainingArguments);
|
|
127
|
+
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
return unified;
|
|
133
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import termAgainstConstructorUnifier from "../unifier/termAgainstConstructor";
|
|
4
|
+
|
|
5
|
+
export default function unifyArgumentAgainstArgument(argumentNodeA, argumentNodeB, localContext, unifyAhead) {
|
|
6
|
+
let argumentUnifiedAgainstArgument;
|
|
7
|
+
|
|
8
|
+
const nonTerminalNodeA = argumentNodeA, ///
|
|
9
|
+
nonTerminalNodeB = argumentNodeB, ///
|
|
10
|
+
nonTerminalNodeVerified = termAgainstConstructorUnifier.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext, unifyAhead);
|
|
11
|
+
|
|
12
|
+
argumentUnifiedAgainstArgument = nonTerminalNodeVerified; ///
|
|
13
|
+
|
|
14
|
+
return argumentUnifiedAgainstArgument;
|
|
15
|
+
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import TermForVariableSubstitution from "../substitution/termForVariable";
|
|
4
|
-
import
|
|
4
|
+
import unifyStatementAgainstStatement from "../unify/statementAtainstStatement";
|
|
5
5
|
import StatementForMetavariableSubstitution from "../substitution/statementForMetavariable";
|
|
6
6
|
|
|
7
|
-
export default function
|
|
8
|
-
let
|
|
7
|
+
export default function unifyMetavariableAgainstStatement(metavariableNodeA, statementNodeB, substitutionNode, substitutions, localContextA, localContextB, unifyAhead) {
|
|
8
|
+
let metavariableUnifiedAgainstStatement = false;
|
|
9
9
|
|
|
10
10
|
const substitution = substitutions.find((substitution) => {
|
|
11
11
|
const substitutionMatchesMetavariableNodeA = substitution.matchMetavariableNode(metavariableNodeA);
|
|
@@ -23,12 +23,12 @@ export default function verifyMetavariableAgainstStatement(metavariableNodeA, st
|
|
|
23
23
|
localContext = localContextB, ///
|
|
24
24
|
substitution = termForVariableSubstitution, ///
|
|
25
25
|
statementNodeA = substitutionStatementNode, ///
|
|
26
|
-
|
|
26
|
+
statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, substitution, substitutions, localContext, localContext);
|
|
27
27
|
|
|
28
|
-
if (
|
|
29
|
-
const
|
|
28
|
+
if (statementUnifiedAgainstStatement) {
|
|
29
|
+
const unifiedAhead = unifyAhead();
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
metavariableUnifiedAgainstStatement = unifiedAhead; ///
|
|
32
32
|
}
|
|
33
33
|
} else {
|
|
34
34
|
const substitutionSubstitution = substitution.getSubstitution();
|
|
@@ -40,25 +40,25 @@ export default function verifyMetavariableAgainstStatement(metavariableNodeA, st
|
|
|
40
40
|
|
|
41
41
|
const localContext = localContextB, ///
|
|
42
42
|
substitution = substitutionSubstitution,
|
|
43
|
-
|
|
43
|
+
statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, substitution, substitutions, localContext, localContext);
|
|
44
44
|
|
|
45
|
-
if (
|
|
46
|
-
const
|
|
45
|
+
if (statementUnifiedAgainstStatement) {
|
|
46
|
+
const unifiedAhead = unifyAhead();
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
metavariableUnifiedAgainstStatement = unifiedAhead; ///
|
|
49
49
|
}
|
|
50
50
|
} else {
|
|
51
51
|
const substitutionMatchesStatementNodeB = substitution.matchStatementNode(statementNodeB);
|
|
52
52
|
|
|
53
53
|
if (substitutionMatchesStatementNodeB) {
|
|
54
|
-
const
|
|
54
|
+
const unifiedAhead = unifyAhead();
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
metavariableUnifiedAgainstStatement = unifiedAhead; ///
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
} else {
|
|
61
|
-
let
|
|
61
|
+
let unifiedAhead;
|
|
62
62
|
|
|
63
63
|
const statementNode = statementNodeB, ///
|
|
64
64
|
metavariableNode = metavariableNodeA, ///
|
|
@@ -67,14 +67,14 @@ export default function verifyMetavariableAgainstStatement(metavariableNodeA, st
|
|
|
67
67
|
|
|
68
68
|
substitutions.push(substitution);
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
unifiedAhead = unifyAhead();
|
|
71
71
|
|
|
72
|
-
if (!
|
|
72
|
+
if (!unifiedAhead) {
|
|
73
73
|
substitutions.pop();
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
metavariableUnifiedAgainstStatement = unifiedAhead; ///
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
return
|
|
79
|
+
return metavariableUnifiedAgainstStatement;
|
|
80
80
|
}
|
|
@@ -5,24 +5,24 @@ import { STATEMENT_META_TYPE_NAME } from "../metaTypeNames";
|
|
|
5
5
|
|
|
6
6
|
const metaTypeTerminalNodeQuery = nodeQuery("/metaType/@meta-type!");
|
|
7
7
|
|
|
8
|
-
export default function
|
|
8
|
+
export default function unifyStatementAgainstMetaType(statementNode, metaTypeNode, localContext, unifyAhead, verifyStatement) {
|
|
9
9
|
let statementVerifiedAgainstMetaType = false;
|
|
10
10
|
|
|
11
11
|
const metaTypeTerminalNode = metaTypeTerminalNodeQuery(metaTypeNode),
|
|
12
12
|
content = metaTypeTerminalNode.getContent();
|
|
13
13
|
|
|
14
14
|
if (content === STATEMENT_META_TYPE_NAME) {
|
|
15
|
-
let
|
|
15
|
+
let unifiedAhead = false;
|
|
16
16
|
|
|
17
17
|
const derived = false,
|
|
18
18
|
assignments = [],
|
|
19
19
|
statementVerified = verifyStatement(statementNode, assignments, derived, localContext);
|
|
20
20
|
|
|
21
21
|
if (statementVerified) {
|
|
22
|
-
|
|
22
|
+
unifiedAhead = unifyAhead();
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
statementVerifiedAgainstMetaType =
|
|
25
|
+
statementVerifiedAgainstMetaType = unifiedAhead; ///
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
return statementVerifiedAgainstMetaType;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import metaLevelUnifier from "../unifier/metaLevel";
|
|
4
4
|
import TermForVariableSubstitution from "../substitution/termForVariable";
|
|
5
5
|
|
|
6
6
|
import { push } from "../utilities/array";
|
|
7
7
|
|
|
8
|
-
export default function
|
|
9
|
-
let
|
|
8
|
+
export default function unifyStatementAgainstStatement(statementNodeA, statementNodeB, substitution, substitutions, localContextA, localContextB) {
|
|
9
|
+
let statementUnifiedAgainstStatement = false;
|
|
10
10
|
|
|
11
11
|
const termForVariableSubstitution = TermForVariableSubstitution.fromSubstitutionAndSubstitutions(substitution, substitutions),
|
|
12
12
|
transformed = termForVariableSubstitution.isTransformed(substitution);
|
|
@@ -21,13 +21,13 @@ export default function verifyStatementAgainstStatement(statementNodeA, statemen
|
|
|
21
21
|
|
|
22
22
|
const nonTerminalNodeA = statementNodeA, ///
|
|
23
23
|
nonTerminalNodeB = statementNodeB, ///
|
|
24
|
-
|
|
24
|
+
nonTerminalNodeUnified = metaLevelUnifier.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutionsA, localContextA, localContextB, () => {
|
|
25
25
|
const verifiedAhead = true;
|
|
26
26
|
|
|
27
27
|
return verifiedAhead;
|
|
28
28
|
});
|
|
29
29
|
|
|
30
|
-
if (
|
|
30
|
+
if (nonTerminalNodeUnified) {
|
|
31
31
|
if (!transformed) {
|
|
32
32
|
const substitutionB = termForVariableSubstitution, ///
|
|
33
33
|
substitutionsB = [
|
|
@@ -39,10 +39,10 @@ export default function verifyStatementAgainstStatement(statementNodeA, statemen
|
|
|
39
39
|
push(substitutions, substitutionsA);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
statementUnifiedAgainstStatement = true;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
return
|
|
45
|
+
return statementUnifiedAgainstStatement;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
function transformSubstitutions(substitutionsA, substitutionsB) {
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
import { areTermNodesEqual } from "../utilities/equivalences";
|
|
4
4
|
|
|
5
|
-
export default function
|
|
6
|
-
let
|
|
5
|
+
export default function unifyTermAgainstTerm(termNodeA, termNodeB, localContext, unifyAhead) {
|
|
6
|
+
let termUnifiedAgainstTerm = false;
|
|
7
7
|
|
|
8
8
|
const leftTermNode = termNodeA, ///
|
|
9
9
|
rightTermNode = termNodeB, ///
|
|
@@ -11,10 +11,10 @@ export default function verifyTermAgainstTerm(termNodeA, termNodeB, localContext
|
|
|
11
11
|
termNodesEqual = areTermNodesEqual(leftTermNode, rightTermNode, equivalences);
|
|
12
12
|
|
|
13
13
|
if (termNodesEqual) {
|
|
14
|
-
const
|
|
14
|
+
const unifiedAhead = unifyAhead();
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
termUnifiedAgainstTerm = unifiedAhead; ///
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
return
|
|
19
|
+
return termUnifiedAgainstTerm;
|
|
20
20
|
}
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
import { first } from "../utilities/array";
|
|
4
4
|
|
|
5
|
-
export default function
|
|
6
|
-
let
|
|
5
|
+
export default function unifyTermAgainstType(termNode, typeNode, localContext, unifyAhead, verifyTerm) {
|
|
6
|
+
let termUnifiedAgainstType;
|
|
7
7
|
|
|
8
8
|
const terms = [],
|
|
9
9
|
termVerified = verifyTerm(termNode, terms, localContext, () => {
|
|
10
|
-
let
|
|
10
|
+
let unifiedAhead = false;
|
|
11
11
|
|
|
12
12
|
const firstTerm = first(terms),
|
|
13
13
|
term = firstTerm, ///
|
|
@@ -16,13 +16,13 @@ export default function verifyTermAgainstType(termNode, typeNode, localContext,
|
|
|
16
16
|
termTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(type);
|
|
17
17
|
|
|
18
18
|
if (termTypeEqualToOrSubTypeOfType) {
|
|
19
|
-
|
|
19
|
+
unifiedAhead = unifyAhead();
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
return
|
|
22
|
+
return unifiedAhead;
|
|
23
23
|
});
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
termUnifiedAgainstType = termVerified; ///
|
|
26
26
|
|
|
27
|
-
return
|
|
27
|
+
return termUnifiedAgainstType;
|
|
28
28
|
}
|
|
@@ -8,8 +8,8 @@ import { nodeQuery } from "../utilities/query";
|
|
|
8
8
|
|
|
9
9
|
const variableNodeQuery = nodeQuery("/term/variable");
|
|
10
10
|
|
|
11
|
-
export default function
|
|
12
|
-
let
|
|
11
|
+
export default function unifyVariableAgainstTerm(variableNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead) {
|
|
12
|
+
let variableUnifiedAgainstTerm = false;
|
|
13
13
|
|
|
14
14
|
const substitution = substitutions.find((substitution) => {
|
|
15
15
|
const substitutionMatchesVariableNodeA = substitution.matchVariableNode(variableNodeA);
|
|
@@ -25,14 +25,14 @@ export default function verifyVariableAgainstTerm(variableNodeA, termNodeB, subs
|
|
|
25
25
|
if (substitutionMatchesTermNodeB) {
|
|
26
26
|
const verifiedAhead = verifyAhead();
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
variableUnifiedAgainstTerm = verifiedAhead; ///
|
|
29
29
|
}
|
|
30
30
|
} else {
|
|
31
31
|
const variableA = localContextA.findVariableByVariableNode(variableNodeA);
|
|
32
32
|
|
|
33
33
|
if (variableA !== null) {
|
|
34
34
|
const terms = [],
|
|
35
|
-
|
|
35
|
+
termUnified = verifyTerm(termNodeB, terms, localContextB, () => {
|
|
36
36
|
let verifiedAhead = false;
|
|
37
37
|
|
|
38
38
|
const firstTerm = first(terms),
|
|
@@ -67,11 +67,11 @@ export default function verifyVariableAgainstTerm(variableNodeA, termNodeB, subs
|
|
|
67
67
|
return verifiedAhead;
|
|
68
68
|
});
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
variableUnifiedAgainstTerm = termUnified; ///
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
return
|
|
74
|
+
return variableUnifiedAgainstTerm;
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
function variableFromTerm(term, localContext) {
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import Verifier from "../verifier";
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { verifyStandaloneTerm } from "
|
|
8
|
-
import { verifyStandaloneVariable } from "
|
|
9
|
-
import { verifyStandaloneMetavariable } from "
|
|
5
|
+
import { verify } from "../verifier";
|
|
6
|
+
import { nodeQuery } from "../utilities/query";
|
|
7
|
+
import { verifyStandaloneTerm } from "../verify/term";
|
|
8
|
+
import { verifyStandaloneVariable } from "../verify/variable";
|
|
9
|
+
import { verifyStandaloneMetavariable } from "../verify/metavariable";
|
|
10
10
|
|
|
11
11
|
const termNodeQuery = nodeQuery("/term!"),
|
|
12
12
|
variableNodeQuery = nodeQuery("/variable!"),
|
|
13
13
|
nonTerminalNodeQuery = nodeQuery("/*"),
|
|
14
14
|
metavariableNodeQuery = nodeQuery("/metavariable!");
|
|
15
15
|
|
|
16
|
-
class
|
|
16
|
+
class MetaLevelVerifier extends Verifier {
|
|
17
17
|
verifyNonTerminalNode(nonTerminalNode, localContext, verifyAhead) {
|
|
18
18
|
let nonTerminalNodeVerified;
|
|
19
19
|
|
|
20
20
|
const nodeQueryMaps = [
|
|
21
21
|
{
|
|
22
22
|
nodeQuery: termNodeQuery,
|
|
23
|
-
|
|
23
|
+
verify: (node, localContext, verifyAhead) => {
|
|
24
24
|
let nonTerminalNodeVerified;
|
|
25
25
|
|
|
26
26
|
const termNode = node, ///
|
|
@@ -33,7 +33,7 @@ class MetaLevelNodeVerifier extends NodeVerifier {
|
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
nodeQuery: variableNodeQuery,
|
|
36
|
-
|
|
36
|
+
verify: (node, localContext, verifyAhead) => {
|
|
37
37
|
let nonTerminalNodeVerified;
|
|
38
38
|
|
|
39
39
|
const variableNode = node, ///
|
|
@@ -46,7 +46,7 @@ class MetaLevelNodeVerifier extends NodeVerifier {
|
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
nodeQuery: metavariableNodeQuery,
|
|
49
|
-
|
|
49
|
+
verify: (node, localContext, verifyAhead) => {
|
|
50
50
|
let nonTerminalNodeVerified;
|
|
51
51
|
|
|
52
52
|
const metavariableNode = node, ///
|
|
@@ -59,7 +59,7 @@ class MetaLevelNodeVerifier extends NodeVerifier {
|
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
nodeQuery: nonTerminalNodeQuery,
|
|
62
|
-
|
|
62
|
+
verify: (node, localContext, verifyAhead) => {
|
|
63
63
|
let nonTerminalNodeVerified;
|
|
64
64
|
|
|
65
65
|
const nonTerminalNode = node; ///
|
|
@@ -73,7 +73,7 @@ class MetaLevelNodeVerifier extends NodeVerifier {
|
|
|
73
73
|
}
|
|
74
74
|
];
|
|
75
75
|
|
|
76
|
-
const nodeVerified =
|
|
76
|
+
const nodeVerified = verify(nodeQueryMaps, nonTerminalNode, localContext, verifyAhead);
|
|
77
77
|
|
|
78
78
|
nonTerminalNodeVerified = nodeVerified; ///
|
|
79
79
|
|
|
@@ -102,6 +102,6 @@ class MetaLevelNodeVerifier extends NodeVerifier {
|
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
const
|
|
105
|
+
const metaLevelVerifier = new MetaLevelVerifier();
|
|
106
106
|
|
|
107
|
-
export default
|
|
107
|
+
export default metaLevelVerifier;
|