occam-verify-cli 0.0.932 → 0.0.933
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 +181 -3
- package/lib/equality.js +4 -4
- package/lib/metaLemma.js +4 -4
- package/lib/metatheorem.js +4 -4
- package/lib/premise.js +6 -6
- package/lib/substitution/statementForMetavariable.js +2 -2
- package/lib/supposition.js +6 -6
- package/lib/unifier/equality.js +216 -0
- package/lib/unifier/metaLevel.js +231 -0
- package/lib/unifier/statementAgainstCombinator.js +231 -0
- package/lib/unifier/termAgainstConstructor.js +211 -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 +3 -3
- package/lib/verify/frame.js +9 -12
- package/lib/verify/judgement.js +2 -2
- package/lib/verify/statement/qualified.js +6 -3
- package/lib/verify/statement/unqualified.js +2 -1
- package/lib/verify/statement.js +26 -19
- package/lib/verify/statementAsCombinator.js +2 -2
- package/lib/verify/term.js +6 -6
- 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 +60 -3
- package/src/equality.js +3 -3
- package/src/metaLemma.js +1 -1
- package/src/metatheorem.js +1 -1
- package/src/premise.js +5 -5
- package/src/substitution/statementForMetavariable.js +2 -2
- package/src/supposition.js +5 -5
- package/src/unifier/equality.js +84 -0
- package/src/unifier/metaLevel.js +109 -0
- package/src/unifier/statementAgainstCombinator.js +104 -0
- package/src/unifier/termAgainstConstructor.js +76 -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 +3 -3
- package/src/verify/frame.js +10 -13
- package/src/verify/judgement.js +1 -1
- package/src/verify/statement/qualified.js +12 -3
- package/src/verify/statement/unqualified.js +2 -1
- package/src/verify/statement.js +30 -25
- package/src/verify/statementAsCombinator.js +2 -2
- package/src/verify/term.js +6 -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,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import Unifier from "../unifier";
|
|
4
|
+
import unifyVariableAgainstTerm from "../unify/variableAgainstTerm";
|
|
5
|
+
import unifyMetavariableAgainstStatement from "../unify/metavariableAgainstStatement";
|
|
6
|
+
|
|
7
|
+
import { unify } from "../unifier";
|
|
8
|
+
import { nodeQuery } from "../utilities/query";
|
|
9
|
+
|
|
10
|
+
const termNodeQuery = nodeQuery("/term!"),
|
|
11
|
+
statementNodeQuery = nodeQuery("/statement!"),
|
|
12
|
+
nonTerminalNodeQuery = nodeQuery("/*"),
|
|
13
|
+
termVariableNodeQuery = nodeQuery("/term/variable!"),
|
|
14
|
+
statementSubstitutionNodeQuery = nodeQuery("/statement/substitution!"),
|
|
15
|
+
statementMetavariableNodeQuery = nodeQuery("/statement/metavariable!");
|
|
16
|
+
|
|
17
|
+
class MetaLevelUnifier extends Unifier {
|
|
18
|
+
unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, unifyAhead) {
|
|
19
|
+
let nonTerminalNodeUnified;
|
|
20
|
+
|
|
21
|
+
const nodeQueryMaps = [
|
|
22
|
+
{
|
|
23
|
+
nodeQueryA: statementMetavariableNodeQuery,
|
|
24
|
+
nodeQueryB: statementNodeQuery,
|
|
25
|
+
unify: (nodeA, nodeB, substitutions, localContextA, localContextB, unifyAhead) => {
|
|
26
|
+
let nonTerminalNodeUnified;
|
|
27
|
+
|
|
28
|
+
const statementNodeA = nonTerminalNodeA, ///
|
|
29
|
+
statementNodeB = nodeB, ///
|
|
30
|
+
statementMetavariableNodeA = nodeA, ///
|
|
31
|
+
statementSubstitutionNodeA = statementSubstitutionNodeQuery(statementNodeA),
|
|
32
|
+
metavariableNodeUnifiedAgainstStatementNode =
|
|
33
|
+
|
|
34
|
+
this.unifyStatementMetavariableNodeAgainstStatementNode(statementMetavariableNodeA, statementSubstitutionNodeA, statementNodeB, substitutions, localContextA, localContextB, unifyAhead);
|
|
35
|
+
|
|
36
|
+
nonTerminalNodeUnified = metavariableNodeUnifiedAgainstStatementNode; ///
|
|
37
|
+
|
|
38
|
+
return nonTerminalNodeUnified;
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
nodeQueryA: termVariableNodeQuery,
|
|
43
|
+
nodeQueryB: termNodeQuery,
|
|
44
|
+
unify: (nodeA, nodeB, substitutions, localContextA, localContextB, unifyAhead) => {
|
|
45
|
+
let nonTerminalNodeUnified;
|
|
46
|
+
|
|
47
|
+
const termNodeB = nodeB, ///
|
|
48
|
+
termVariableNodeA = nodeA, ///
|
|
49
|
+
termVariableNodeUnifiedAgainstTermNode =
|
|
50
|
+
|
|
51
|
+
this.unifyTermVariableNodeAgainstTermNode(termVariableNodeA, termNodeB, substitutions, localContextA, localContextB, unifyAhead);
|
|
52
|
+
|
|
53
|
+
nonTerminalNodeUnified = termVariableNodeUnifiedAgainstTermNode; ///
|
|
54
|
+
|
|
55
|
+
return nonTerminalNodeUnified;
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
nodeQueryA: nonTerminalNodeQuery,
|
|
60
|
+
nodeQueryB: nonTerminalNodeQuery,
|
|
61
|
+
unify: (nodeA, nodeB, substitutions, localContextA, localContextB, unifyAhead) => {
|
|
62
|
+
let nonTerminalNodeUnified;
|
|
63
|
+
|
|
64
|
+
const nonTerminalNodeA = nodeA, ///
|
|
65
|
+
nonTerminalNodeB = nodeB; ///
|
|
66
|
+
|
|
67
|
+
nonTerminalNodeUnified =
|
|
68
|
+
|
|
69
|
+
super.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, unifyAhead);
|
|
70
|
+
|
|
71
|
+
return nonTerminalNodeUnified;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
];
|
|
75
|
+
|
|
76
|
+
const nodesUnified = unify(nodeQueryMaps, nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB, unifyAhead);
|
|
77
|
+
|
|
78
|
+
nonTerminalNodeUnified = nodesUnified; ///
|
|
79
|
+
|
|
80
|
+
return nonTerminalNodeUnified;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
unifyStatementMetavariableNodeAgainstStatementNode(statementMetavariableNodeA, statementSubstitutionNodeA, statementNodeB, substitutions, localContextA, localContextB, unifyAhead) {
|
|
84
|
+
let metavariableNodeUnifiedAgainstStatementNode;
|
|
85
|
+
|
|
86
|
+
const substitutionNode = statementSubstitutionNodeA, ///
|
|
87
|
+
metavariableNodeA = statementMetavariableNodeA, ///
|
|
88
|
+
metavariableUnifiedAgainstStatement = unifyMetavariableAgainstStatement(metavariableNodeA, statementNodeB, substitutionNode, substitutions, localContextA, localContextB, unifyAhead);
|
|
89
|
+
|
|
90
|
+
metavariableNodeUnifiedAgainstStatementNode = metavariableUnifiedAgainstStatement; ///
|
|
91
|
+
|
|
92
|
+
return metavariableNodeUnifiedAgainstStatementNode;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
unifyTermVariableNodeAgainstTermNode(termVariableNodeA, termNodeB, substitutions, localContextA, localContextB, unifyAhead) {
|
|
96
|
+
let termVariableNodeUnifiedAgainstTermNode;
|
|
97
|
+
|
|
98
|
+
const variableNodeA = termVariableNodeA, ///
|
|
99
|
+
termUnifiedAgainstVariable = unifyVariableAgainstTerm(variableNodeA, termNodeB, substitutions, localContextA, localContextB, unifyAhead);
|
|
100
|
+
|
|
101
|
+
termVariableNodeUnifiedAgainstTermNode = termUnifiedAgainstVariable; ///
|
|
102
|
+
|
|
103
|
+
return termVariableNodeUnifiedAgainstTermNode;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const metaLevelUnifier = new MetaLevelUnifier();
|
|
108
|
+
|
|
109
|
+
export default metaLevelUnifier;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import Unifier from "../unifier";
|
|
4
|
+
import unifyArgumentAgainstArgument from "../unify/argumentAgainstArgument";
|
|
5
|
+
import unifyStatementAgainstMetaType from "../unify/statementAgainstMetaType";
|
|
6
|
+
|
|
7
|
+
import { unify } from "../unifier";
|
|
8
|
+
import { nodeQuery } from "../utilities/query";
|
|
9
|
+
|
|
10
|
+
const argumentNodeQuery = nodeQuery("/argument!"),
|
|
11
|
+
metaTypeNodeQuery = nodeQuery("/metaType!"),
|
|
12
|
+
statementNodeQuery = nodeQuery("/statement!"),
|
|
13
|
+
nonTerminalNodeQuery = nodeQuery("/*");
|
|
14
|
+
|
|
15
|
+
class StatementAgainstCombinatorUnifier extends Unifier {
|
|
16
|
+
unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext, unifyAhead) {
|
|
17
|
+
let nonTerminalNodeUnified;
|
|
18
|
+
|
|
19
|
+
const nodeQueryMaps = [
|
|
20
|
+
{
|
|
21
|
+
nodeQueryA: statementNodeQuery,
|
|
22
|
+
nodeQueryB: metaTypeNodeQuery,
|
|
23
|
+
unify: (nodeA, nodeB, localContext, unifyAhead) => {
|
|
24
|
+
let nonTerminalNodeUnified;
|
|
25
|
+
|
|
26
|
+
const metaTypeNodeB = nodeB, ///
|
|
27
|
+
statementNodeA = nodeA, ///
|
|
28
|
+
statementUnifiedAgainstMetaType =
|
|
29
|
+
|
|
30
|
+
this.unifyMetaArgumentStatementAgainstMetaType(statementNodeA, metaTypeNodeB, localContext, unifyAhead);
|
|
31
|
+
|
|
32
|
+
nonTerminalNodeUnified = statementUnifiedAgainstMetaType; ///
|
|
33
|
+
|
|
34
|
+
return nonTerminalNodeUnified;
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
nodeQueryA: argumentNodeQuery,
|
|
39
|
+
nodeQueryB: argumentNodeQuery,
|
|
40
|
+
unify: (nodeA, nodeB, localContext, unifyAhead) => {
|
|
41
|
+
let nonTerminalNodeUnified;
|
|
42
|
+
|
|
43
|
+
const argumentNodeA = nodeA, ///
|
|
44
|
+
argumentNodeB = nodeB, ///
|
|
45
|
+
argumentNodeUnifiedAgainstArgumentNode =
|
|
46
|
+
|
|
47
|
+
this.unifyArgumentNodeAgainstArgumentNode(argumentNodeA, argumentNodeB, localContext, unifyAhead);
|
|
48
|
+
|
|
49
|
+
nonTerminalNodeUnified = argumentNodeUnifiedAgainstArgumentNode; ///
|
|
50
|
+
|
|
51
|
+
return nonTerminalNodeUnified;
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
nodeQueryA: nonTerminalNodeQuery,
|
|
56
|
+
nodeQueryB: nonTerminalNodeQuery,
|
|
57
|
+
unify: (nodeA, nodeB, localContext, unifyAhead) => {
|
|
58
|
+
let nonTerminalNodeUnified;
|
|
59
|
+
|
|
60
|
+
const nonTerminalNodeA = nodeA, ///
|
|
61
|
+
nonTerminalNodeB = nodeB; ///
|
|
62
|
+
|
|
63
|
+
nonTerminalNodeUnified =
|
|
64
|
+
|
|
65
|
+
super.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext, unifyAhead);
|
|
66
|
+
|
|
67
|
+
return nonTerminalNodeUnified;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
];
|
|
71
|
+
|
|
72
|
+
const nodesUnified = unify(nodeQueryMaps, nonTerminalNodeA, nonTerminalNodeB, localContext, unifyAhead);
|
|
73
|
+
|
|
74
|
+
nonTerminalNodeUnified = nodesUnified; ///
|
|
75
|
+
|
|
76
|
+
return nonTerminalNodeUnified;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
unifyMetaArgumentStatementAgainstMetaType(statementNodeA, metaTypeNodeB, localContext, unifyAhead) {
|
|
80
|
+
let statementUnifiedAgainstMetaType;
|
|
81
|
+
|
|
82
|
+
const { verifyStatement } = this,
|
|
83
|
+
metaTypeNode = metaTypeNodeB, ///
|
|
84
|
+
statementNode = statementNodeA; ///
|
|
85
|
+
|
|
86
|
+
statementUnifiedAgainstMetaType = unifyStatementAgainstMetaType(statementNode, metaTypeNode, localContext, unifyAhead, verifyStatement);
|
|
87
|
+
|
|
88
|
+
return statementUnifiedAgainstMetaType;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
unifyArgumentNodeAgainstArgumentNode(argumentNodeA, argumentNodeB, localContext, unifyAhead) {
|
|
92
|
+
let argumentNodeUnifiedAgainstArgumentNode;
|
|
93
|
+
|
|
94
|
+
const argumentUnifiedAgainstArgument = unifyArgumentAgainstArgument(argumentNodeA, argumentNodeB, localContext, unifyAhead);
|
|
95
|
+
|
|
96
|
+
argumentNodeUnifiedAgainstArgumentNode = argumentUnifiedAgainstArgument; ///
|
|
97
|
+
|
|
98
|
+
return argumentNodeUnifiedAgainstArgumentNode;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const statementAgainstCombinatorUnifier = new StatementAgainstCombinatorUnifier();
|
|
103
|
+
|
|
104
|
+
export default statementAgainstCombinatorUnifier;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import Unifier from "../unifier";
|
|
4
|
+
import unifyTermAgainstType from "../unify/termAgainstType";
|
|
5
|
+
|
|
6
|
+
import { unify } from "../unifier";
|
|
7
|
+
import { nodeQuery } from "../utilities/query";
|
|
8
|
+
|
|
9
|
+
const termNodeQuery = nodeQuery("/argument/term!"),
|
|
10
|
+
typeNodeQuery = nodeQuery("/argument/type!"),
|
|
11
|
+
nonTerminalNodeQuery = nodeQuery("/*");
|
|
12
|
+
|
|
13
|
+
class TermAgainstConstructorUnifier extends Unifier {
|
|
14
|
+
unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext, unifyAhead) {
|
|
15
|
+
let nonTerminalNodUnified;
|
|
16
|
+
|
|
17
|
+
const nodeQueryMaps = [
|
|
18
|
+
{
|
|
19
|
+
nodeQueryA: termNodeQuery,
|
|
20
|
+
nodeQueryB: typeNodeQuery,
|
|
21
|
+
unify: (nodeA, nodeB, localContext, unifyAhead) => {
|
|
22
|
+
let nonTerminalNodUnified;
|
|
23
|
+
|
|
24
|
+
const termNodeA = nodeA, ///
|
|
25
|
+
typeNodeB = nodeB, ///
|
|
26
|
+
termNodUnifiedAgainstTypeNode =
|
|
27
|
+
|
|
28
|
+
this.unifyTermNodeAgainstTypeNode(termNodeA, typeNodeB, localContext, unifyAhead);
|
|
29
|
+
|
|
30
|
+
nonTerminalNodUnified = termNodUnifiedAgainstTypeNode; ///
|
|
31
|
+
|
|
32
|
+
return nonTerminalNodUnified;
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
nodeQueryA: nonTerminalNodeQuery,
|
|
37
|
+
nodeQueryB: nonTerminalNodeQuery,
|
|
38
|
+
unify: (nodeA, nodeB, localContext, unifyAhead) => {
|
|
39
|
+
let nonTerminalNodUnified;
|
|
40
|
+
|
|
41
|
+
const nonTerminalNodeA = nodeA, ///
|
|
42
|
+
nonTerminalNodeB = nodeB; ///
|
|
43
|
+
|
|
44
|
+
nonTerminalNodUnified =
|
|
45
|
+
|
|
46
|
+
super.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext, unifyAhead);
|
|
47
|
+
|
|
48
|
+
return nonTerminalNodUnified;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
const nodesVerified = unify(nodeQueryMaps, nonTerminalNodeA, nonTerminalNodeB, localContext, unifyAhead);
|
|
54
|
+
|
|
55
|
+
nonTerminalNodUnified = nodesVerified; ///
|
|
56
|
+
|
|
57
|
+
return nonTerminalNodUnified;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
unifyTermNodeAgainstTypeNode(termNodeA, typeNodeB, localContext, unifyAhead) {
|
|
61
|
+
let termNodUnifiedAgainstTypeNode;
|
|
62
|
+
|
|
63
|
+
const { verifyTerm } = this,
|
|
64
|
+
termNode = termNodeA, ///
|
|
65
|
+
typeNode = typeNodeB, ///
|
|
66
|
+
typeUnifiedAgainstTerm = unifyTermAgainstType(termNode, typeNode, localContext, unifyAhead, verifyTerm);
|
|
67
|
+
|
|
68
|
+
termNodUnifiedAgainstTypeNode = typeUnifiedAgainstTerm; ///
|
|
69
|
+
|
|
70
|
+
return termNodUnifiedAgainstTypeNode;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const termAgainstConstructorUnifier = new TermAgainstConstructorUnifier();
|
|
75
|
+
|
|
76
|
+
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
|
}
|