occam-verify-cli 0.0.972 → 0.0.975
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/bin/action/verify.js +30 -0
- package/bin/main.js +0 -27
- package/lib/context/file.js +1 -8
- package/lib/frame.js +3 -3
- package/lib/judgement.js +4 -4
- package/lib/metavariable.js +4 -28
- package/lib/resolve/complexSubstitutionAgainstSimpleSubstitution.js +76 -0
- package/lib/resolve/substitution.js +27 -0
- package/lib/resolve/substitutions.js +8 -70
- package/lib/rule.js +11 -1
- package/lib/substitution/statementForMetavariable.js +2 -2
- package/lib/substitution.js +8 -1
- package/lib/substitutions.js +19 -7
- package/lib/topLevelAssertion.js +11 -1
- package/lib/type.js +3 -3
- package/lib/unifier/metavariable.js +142 -0
- package/lib/unify/complexSubstitutionStatementWithSimpleSubstitutionStatement.js +26 -0
- package/lib/unify/qualifiedStatement.js +136 -0
- package/lib/unify/statementWithCombinator.js +29 -0
- package/lib/unify/statementWithCombinators.js +5 -14
- package/lib/unify/termWithBracketedConstructor.js +3 -3
- package/lib/unify/termWithConstructor.js +37 -0
- package/lib/unify/termWithConstructors.js +6 -33
- package/lib/unify/unqualifiedStatement.js +25 -0
- package/lib/verifier/statementAsCombinator.js +2 -2
- package/lib/verify/assertion/contained.js +2 -2
- package/lib/verify/assertion/defined.js +7 -4
- package/lib/verify/assertion/type.js +5 -3
- package/lib/verify/conclusion.js +2 -2
- package/lib/verify/consequent.js +2 -2
- package/lib/verify/declaration.js +14 -26
- package/lib/verify/equality.js +11 -7
- package/lib/verify/frame.js +39 -32
- package/lib/verify/judgement.js +28 -49
- package/lib/verify/metavariableGivenMetaType.js +44 -0
- package/lib/verify/premise.js +3 -3
- package/lib/verify/statement/qualified.js +3 -3
- package/lib/verify/statement/unqualified.js +9 -53
- package/lib/verify/statement.js +27 -62
- package/lib/verify/statementGivenMetaType.js +3 -2
- package/lib/verify/term.js +11 -5
- package/package.json +4 -4
- package/src/context/file.js +0 -6
- package/src/frame.js +1 -1
- package/src/judgement.js +1 -1
- package/src/metavariable.js +3 -32
- package/src/resolve/complexSubstitutionAgainstSimpleSubstitution.js +94 -0
- package/src/resolve/substitution.js +19 -0
- package/src/resolve/substitutions.js +9 -112
- package/src/rule.js +10 -0
- package/src/substitution/statementForMetavariable.js +1 -1
- package/src/substitution.js +6 -0
- package/src/substitutions.js +17 -6
- package/src/topLevelAssertion.js +10 -0
- package/src/type.js +3 -3
- package/src/unifier/metavariable.js +46 -0
- package/src/unify/complexSubstitutionStatementWithSimpleSubstitutionStatement.js +18 -0
- package/src/unify/{statement/qualified.js → qualifiedStatement.js} +61 -31
- package/src/unify/statementWithCombinator.js +22 -0
- package/src/unify/statementWithCombinators.js +5 -20
- package/src/unify/termWithBracketedConstructor.js +1 -1
- package/src/unify/termWithConstructor.js +39 -0
- package/src/unify/termWithConstructors.js +1 -37
- package/src/unify/{statement/unqualified.js → unqualifiedStatement.js} +1 -1
- package/src/verifier/statementAsCombinator.js +2 -2
- package/src/verify/assertion/contained.js +1 -1
- package/src/verify/assertion/defined.js +10 -3
- package/src/verify/assertion/type.js +6 -4
- package/src/verify/conclusion.js +1 -1
- package/src/verify/consequent.js +1 -1
- package/src/verify/declaration.js +25 -36
- package/src/verify/equality.js +12 -8
- package/src/verify/frame.js +52 -39
- package/src/verify/judgement.js +43 -75
- package/src/verify/metavariableGivenMetaType.js +45 -0
- package/src/verify/premise.js +3 -3
- package/src/verify/statement/qualified.js +1 -1
- package/src/verify/statement/unqualified.js +8 -13
- package/src/verify/statement.js +25 -69
- package/src/verify/statementGivenMetaType.js +3 -1
- package/src/verify/term.js +13 -6
- package/lib/unify/statement/qualified.js +0 -117
- package/lib/unify/statement/unqualified.js +0 -25
- package/lib/verify/metavariable.js +0 -51
- package/src/verify/metavariable.js +0 -58
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
import LocalContext from "../context/local";
|
|
4
|
-
import
|
|
5
|
-
import metaLevelUnifier from "../unifier/metaLevel";
|
|
4
|
+
import resolveSubstitution from "../resolve/substitution";
|
|
6
5
|
|
|
7
6
|
export default function resolveSubstitutions(substitutions, fileContextA, localContextB) {
|
|
8
7
|
let substitutionsResolved = substitutions.areResolved();
|
|
@@ -13,7 +12,14 @@ export default function resolveSubstitutions(substitutions, fileContextA, localC
|
|
|
13
12
|
|
|
14
13
|
substitutionsResolved = metavariableNodes.every((metavariableNode) => {
|
|
15
14
|
const complexSubstitutions = substitutions.findComplexSubstitutionsByMetavariableNode(metavariableNode),
|
|
16
|
-
complexSubstitutionsResolved =
|
|
15
|
+
complexSubstitutionsResolved = complexSubstitutions.everySubstitution((complexSubstitution) => {
|
|
16
|
+
const substitution = complexSubstitution, ///
|
|
17
|
+
complexSubstitutionResolved = resolveSubstitution(substitution, substitutions, localContextA, localContextB);
|
|
18
|
+
|
|
19
|
+
if (complexSubstitutionResolved) {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
});
|
|
17
23
|
|
|
18
24
|
if (complexSubstitutionsResolved) {
|
|
19
25
|
return true;
|
|
@@ -23,112 +29,3 @@ export default function resolveSubstitutions(substitutions, fileContextA, localC
|
|
|
23
29
|
|
|
24
30
|
return substitutionsResolved;
|
|
25
31
|
}
|
|
26
|
-
|
|
27
|
-
function resolveComplexSubstitution(complexSubstitution, substitutions, localContextA, localContextB) {
|
|
28
|
-
let complexSubstitutionResolved = false;
|
|
29
|
-
|
|
30
|
-
const metavariableNode = complexSubstitution.getMetavariableNode(),
|
|
31
|
-
simpleSubstitution = substitutions.findSimpleSubstitutionByMetavariableNode(metavariableNode);
|
|
32
|
-
|
|
33
|
-
if (simpleSubstitution !== null) {
|
|
34
|
-
const complexSubstitutionResolvedAgainstSimpleSubstitution = resolveComplexSubstitutionAgainstSimpleSubstitution(complexSubstitution, simpleSubstitution, substitutions, localContextA, localContextB);
|
|
35
|
-
|
|
36
|
-
complexSubstitutionResolved = complexSubstitutionResolvedAgainstSimpleSubstitution; ///
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return complexSubstitutionResolved;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function resolveComplexSubstitutions(complexSubstitutions, substitutions, localContextA, localContextB) {
|
|
43
|
-
const complexSubstitutionsResolved = complexSubstitutions.everySubstitution((complexSubstitution) => {
|
|
44
|
-
const complexSubstitutionResolved = resolveComplexSubstitution(complexSubstitution, substitutions, localContextA, localContextB);
|
|
45
|
-
|
|
46
|
-
if (complexSubstitutionResolved) {
|
|
47
|
-
return true;
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
return complexSubstitutionsResolved;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function resolveComplexSubstitutionAgainstSimpleSubstitution(complexSubstitution, simpleSubstitution, substitutions, localContextA, localContextB) {
|
|
55
|
-
let complexSubstitutionResolvedAgainstSimpleSubstitution = false;
|
|
56
|
-
|
|
57
|
-
const statementNode = complexSubstitution.getStatementNode(),
|
|
58
|
-
simpleSubstitutionString = simpleSubstitution.asString(localContextA, localContextB),
|
|
59
|
-
complexSubstitutionString = complexSubstitution.asString(localContextA, localContextB);
|
|
60
|
-
|
|
61
|
-
localContextB.trace(`Resolving the complex ${complexSubstitutionString} substitution against the simple ${simpleSubstitutionString} substitution...`, statementNode);
|
|
62
|
-
|
|
63
|
-
const transformedSubstitution = transformedSubstitutionFromComplexSubstitutionSimpleSubstitutionAndSubstitutions(complexSubstitution, simpleSubstitution, substitutions, localContextA, localContextB);
|
|
64
|
-
|
|
65
|
-
if (transformedSubstitution !== null) {
|
|
66
|
-
const variableNode = transformedSubstitution.getVariableNode(),
|
|
67
|
-
substitution = substitutions.findSubstitutionByVariableNode(variableNode);
|
|
68
|
-
|
|
69
|
-
if (substitution === null) {
|
|
70
|
-
simpleSubstitution = transformedSubstitution; ///
|
|
71
|
-
|
|
72
|
-
substitutions.addSubstitution(simpleSubstitution, localContextA, localContextB);
|
|
73
|
-
|
|
74
|
-
substitutions.removeSubstitution(complexSubstitution, localContextA, localContextB);
|
|
75
|
-
|
|
76
|
-
complexSubstitutionResolvedAgainstSimpleSubstitution = true;
|
|
77
|
-
} else {
|
|
78
|
-
const termNode = transformedSubstitution.getTermNode(),
|
|
79
|
-
termNodeMatches = substitution.matchTermNode(termNode);
|
|
80
|
-
|
|
81
|
-
if (termNodeMatches) {
|
|
82
|
-
substitutions.removeSubstitution(complexSubstitution, localContextA, localContextB);
|
|
83
|
-
|
|
84
|
-
complexSubstitutionResolvedAgainstSimpleSubstitution = true;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (complexSubstitutionResolvedAgainstSimpleSubstitution) {
|
|
90
|
-
localContextB.debug(`...resolved the complex ${complexSubstitutionString} substitution against the simple ${simpleSubstitutionString} substitution.`, statementNode);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return complexSubstitutionResolvedAgainstSimpleSubstitution;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function unifyComplexSubstitutionStatementWithSimpleSubstitutionStatement(complexSubstitutionStatementNode, simpleSubstitutionStatementNode, substitutions, localContextA, localContextB) {
|
|
97
|
-
let complexSubstitutionStatementWithSimpleSubstitutionStatement;
|
|
98
|
-
|
|
99
|
-
const nodeA = complexSubstitutionStatementNode, ///
|
|
100
|
-
nodeB = simpleSubstitutionStatementNode; ///
|
|
101
|
-
|
|
102
|
-
localContextA = localContextB; ///
|
|
103
|
-
|
|
104
|
-
const unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
|
|
105
|
-
|
|
106
|
-
complexSubstitutionStatementWithSimpleSubstitutionStatement = unified; ///
|
|
107
|
-
|
|
108
|
-
return complexSubstitutionStatementWithSimpleSubstitutionStatement;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function transformedSubstitutionFromComplexSubstitutionSimpleSubstitutionAndSubstitutions(complexSubstitution, simpleSubstitution, substitutions, localContextA, localContextB) {
|
|
112
|
-
let transformedSubstitution;
|
|
113
|
-
|
|
114
|
-
const substitution = complexSubstitution.getSubstitution();
|
|
115
|
-
|
|
116
|
-
transformedSubstitution = substitution.transformed(substitutions);
|
|
117
|
-
|
|
118
|
-
if (transformedSubstitution !== null) {
|
|
119
|
-
const simpleSubstitutionStatementNode = simpleSubstitution.getStatementNode(),
|
|
120
|
-
complexSubstitutionStatementNode = complexSubstitution.getStatementNode();
|
|
121
|
-
|
|
122
|
-
substitutions = Substitutions.fromNothing(); ///
|
|
123
|
-
|
|
124
|
-
const complexSubstitutionStatementWithSimpleSubstitutionStatement = unifyComplexSubstitutionStatementWithSimpleSubstitutionStatement(complexSubstitutionStatementNode, simpleSubstitutionStatementNode, substitutions, localContextA, localContextB);
|
|
125
|
-
|
|
126
|
-
if (complexSubstitutionStatementWithSimpleSubstitutionStatement) {
|
|
127
|
-
const substitution = transformedSubstitution; ///
|
|
128
|
-
|
|
129
|
-
transformedSubstitution = substitution.transformed(substitutions);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return transformedSubstitution;
|
|
134
|
-
}
|
package/src/rule.js
CHANGED
|
@@ -29,6 +29,16 @@ export default class Rule {
|
|
|
29
29
|
return this.fileContext;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
getLabelMetavariableNodes() {
|
|
33
|
+
const labelMetavariableNodes = this.labels.map((label) => {
|
|
34
|
+
const labelMetavariableNode = label.getMetavariableNode();
|
|
35
|
+
|
|
36
|
+
return labelMetavariableNode;
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
return labelMetavariableNodes;
|
|
40
|
+
}
|
|
41
|
+
|
|
32
42
|
unifyStatement(statementNode, localContext) {
|
|
33
43
|
let statementUnified = false;
|
|
34
44
|
|
|
@@ -163,7 +163,7 @@ function transformStatementNode(statementNode, substitutions) {
|
|
|
163
163
|
|
|
164
164
|
if (metavariableNode !== null) {
|
|
165
165
|
substitutions.someSubstitution((substitution) => {
|
|
166
|
-
const substitutionMatchesVariableNode = substitution.
|
|
166
|
+
const substitutionMatchesVariableNode = substitution.matchMetavariableNode(metavariableNode);
|
|
167
167
|
|
|
168
168
|
if (substitutionMatchesVariableNode) {
|
|
169
169
|
const statementNode = substitution.getStatementNode();
|
package/src/substitution.js
CHANGED
package/src/substitutions.js
CHANGED
|
@@ -87,9 +87,9 @@ export default class Substitutions {
|
|
|
87
87
|
|
|
88
88
|
findSubstitutionByVariableNode(variableNode) {
|
|
89
89
|
const substitution = this.findSubstitution((substitution) => {
|
|
90
|
-
const
|
|
90
|
+
const variableNodeMatches = substitution.matchVariableNode(variableNode);
|
|
91
91
|
|
|
92
|
-
if (
|
|
92
|
+
if (variableNodeMatches) {
|
|
93
93
|
return true;
|
|
94
94
|
}
|
|
95
95
|
});
|
|
@@ -97,11 +97,22 @@ export default class Substitutions {
|
|
|
97
97
|
return substitution;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
+
findSubstitutionByMetavariableNode(metavariableNode) {
|
|
101
|
+
const substitution = this.findSubstitution((substitution) => {
|
|
102
|
+
const metavariableNodeMatches = substitution.matchMetavariableNode(metavariableNode);
|
|
103
|
+
|
|
104
|
+
if (metavariableNodeMatches) {
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
return substitution;
|
|
110
|
+
}
|
|
100
111
|
findSubstitutionsByMetavariableNode(metavariableNode) {
|
|
101
112
|
const substitutions = this.findSubstitutions((substitution) => {
|
|
102
|
-
const
|
|
113
|
+
const metavariableNodeMatches = substitution.matchMetavariableNode(metavariableNode);
|
|
103
114
|
|
|
104
|
-
if (
|
|
115
|
+
if (metavariableNodeMatches) {
|
|
105
116
|
return true;
|
|
106
117
|
}
|
|
107
118
|
});
|
|
@@ -139,9 +150,9 @@ export default class Substitutions {
|
|
|
139
150
|
|
|
140
151
|
findSubstitutionsByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode) {
|
|
141
152
|
const substitutions = this.findSubstitutions((substitution) => {
|
|
142
|
-
const
|
|
153
|
+
const metavariableNodeAndSubstitutionNodeMatch = substitution.matchMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode);
|
|
143
154
|
|
|
144
|
-
if (
|
|
155
|
+
if (metavariableNodeAndSubstitutionNodeMatch) {
|
|
145
156
|
return true;
|
|
146
157
|
}
|
|
147
158
|
});
|
package/src/topLevelAssertion.js
CHANGED
|
@@ -34,6 +34,16 @@ export default class TopLevelAssertion {
|
|
|
34
34
|
return this.fileContext;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
getLabelMetavariableNodes() {
|
|
38
|
+
const labelMetavariableNodes = this.labels.map((label) => {
|
|
39
|
+
const labelMetavariableNode = label.getMetavariableNode();
|
|
40
|
+
|
|
41
|
+
return labelMetavariableNode;
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return labelMetavariableNodes;
|
|
45
|
+
}
|
|
46
|
+
|
|
37
47
|
unifyStatement(statementNode, localContext) {
|
|
38
48
|
let statementUnified = false;
|
|
39
49
|
|
package/src/type.js
CHANGED
|
@@ -105,10 +105,10 @@ export default class Type {
|
|
|
105
105
|
|
|
106
106
|
matchTypeNode(typeNode) {
|
|
107
107
|
const typeName = typeNameFromTypeNode(typeNode),
|
|
108
|
-
|
|
109
|
-
|
|
108
|
+
typeNameMatches = this.matchTypeName(typeName),
|
|
109
|
+
typeNodeMatches = typeNameMatches; ///
|
|
110
110
|
|
|
111
|
-
return
|
|
111
|
+
return typeNodeMatches;
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
asString(tokens, noSuperType = false) {
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import shim from "../shim";
|
|
4
|
+
import Unifier from "../unifier";
|
|
5
|
+
|
|
6
|
+
import { nodeQuery } from "../utilities/query";
|
|
7
|
+
import unifyTermWithType from "../unify/termWithType";
|
|
8
|
+
|
|
9
|
+
const typeNodeQuery = nodeQuery("/type!"),
|
|
10
|
+
termNodeQuery = nodeQuery("/term!");
|
|
11
|
+
|
|
12
|
+
class MetavariableUnifier extends Unifier {
|
|
13
|
+
unify(metavariableNodeA, metavariableNodeB, localContext) {
|
|
14
|
+
let unified;
|
|
15
|
+
|
|
16
|
+
const nonTerminalNodeA = metavariableNodeA, ///
|
|
17
|
+
nonTerminalNodeB = metavariableNodeB, ///
|
|
18
|
+
nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext);
|
|
19
|
+
|
|
20
|
+
unified = nonTerminalNodeUnified; ///
|
|
21
|
+
|
|
22
|
+
return unified;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
static maps = [
|
|
26
|
+
{
|
|
27
|
+
nodeQueryA: termNodeQuery,
|
|
28
|
+
nodeQueryB: typeNodeQuery,
|
|
29
|
+
unify: (termNodeA, typeNodeB, localContext) => {
|
|
30
|
+
const termNode = termNodeA, ///
|
|
31
|
+
typeNode = typeNodeB, ///
|
|
32
|
+
termUnifiedWithType = unifyTermWithType(termNode, typeNode, localContext);
|
|
33
|
+
|
|
34
|
+
return termUnifiedWithType;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const metavariableUnifier = new MetavariableUnifier();
|
|
41
|
+
|
|
42
|
+
Object.assign(shim, {
|
|
43
|
+
metavariableUnifier
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
export default metavariableUnifier;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import metaLevelUnifier from "../unifier/metaLevel";
|
|
4
|
+
|
|
5
|
+
export default function unifyComplexSubstitutionStatementWithSimpleSubstitutionStatement(complexSubstitutionStatementNode, simpleSubstitutionStatementNode, substitutions, localContextA, localContextB) {
|
|
6
|
+
let complexSubstitutionStatementWithSimpleSubstitutionStatement;
|
|
7
|
+
|
|
8
|
+
const nodeA = complexSubstitutionStatementNode, ///
|
|
9
|
+
nodeB = simpleSubstitutionStatementNode; ///
|
|
10
|
+
|
|
11
|
+
localContextA = localContextB; ///
|
|
12
|
+
|
|
13
|
+
const unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
|
|
14
|
+
|
|
15
|
+
complexSubstitutionStatementWithSimpleSubstitutionStatement = unified; ///
|
|
16
|
+
|
|
17
|
+
return complexSubstitutionStatementWithSimpleSubstitutionStatement;
|
|
18
|
+
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import metavariableUnifier from "../unifier/metavariable";
|
|
4
|
+
import StatementForMetavariableSubstitution from "../substitution/statementForMetavariable";
|
|
5
|
+
|
|
6
|
+
import { nodeQuery } from "../utilities/query";
|
|
7
|
+
import { metavariableNameFromMetavariableNode } from "../utilities/name";
|
|
4
8
|
|
|
5
9
|
const statementNodeQuery = nodeQuery("/qualifiedStatement/statement!"),
|
|
6
10
|
metavariableNodeQuery = nodeQuery("/qualifiedStatement/reference/metavariable!");
|
|
@@ -42,17 +46,18 @@ function unifyQualifiedStatementAWithRule(qualifiedStatementNode, substitutions,
|
|
|
42
46
|
|
|
43
47
|
if (rule !== null) {
|
|
44
48
|
const statementNode = statementNodeQuery(qualifiedStatementNode),
|
|
45
|
-
|
|
46
|
-
qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode)
|
|
49
|
+
labelMetavariableNodes = rule.getLabelMetavariableNodes(),
|
|
50
|
+
qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode),
|
|
51
|
+
labelMetavariableNodesString = localContext.nodesAsString(labelMetavariableNodes);
|
|
47
52
|
|
|
48
|
-
localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${
|
|
53
|
+
localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' rule...`, qualifiedStatementNode);
|
|
49
54
|
|
|
50
55
|
const statementUnified = rule.unifyStatement(statementNode, localContext);
|
|
51
56
|
|
|
52
57
|
qualifiedStatementUnifiedWithRule = statementUnified; ///
|
|
53
58
|
|
|
54
59
|
if (qualifiedStatementUnifiedWithRule) {
|
|
55
|
-
localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${
|
|
60
|
+
localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' rule.`, qualifiedStatementNode);
|
|
56
61
|
}
|
|
57
62
|
}
|
|
58
63
|
|
|
@@ -67,17 +72,18 @@ function unifyQualifiedStatementAWithAxiom(qualifiedStatementNode, substitutions
|
|
|
67
72
|
|
|
68
73
|
if (axiom !== null) {
|
|
69
74
|
const statementNode = statementNodeQuery(qualifiedStatementNode),
|
|
70
|
-
|
|
71
|
-
qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode)
|
|
75
|
+
labelMetavariableNodes = axiom.getLabelMetavariableNodes(),
|
|
76
|
+
qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode),
|
|
77
|
+
labelMetavariableNodesString = localContext.nodesAsString(labelMetavariableNodes);
|
|
72
78
|
|
|
73
|
-
localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${
|
|
79
|
+
localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' axiom...`, qualifiedStatementNode);
|
|
74
80
|
|
|
75
81
|
const statementUnified = axiom.unifyStatement(statementNode, localContext);
|
|
76
82
|
|
|
77
83
|
qualifiedStatementUnifiedWithAxiom = statementUnified; ///
|
|
78
84
|
|
|
79
85
|
if (qualifiedStatementUnifiedWithAxiom) {
|
|
80
|
-
localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${
|
|
86
|
+
localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' axiom.`, qualifiedStatementNode);
|
|
81
87
|
}
|
|
82
88
|
}
|
|
83
89
|
|
|
@@ -92,17 +98,18 @@ function unifyQualifiedStatementAWithLemma(qualifiedStatementNode, substitutions
|
|
|
92
98
|
|
|
93
99
|
if (lemma !== null) {
|
|
94
100
|
const statementNode = statementNodeQuery(qualifiedStatementNode),
|
|
95
|
-
|
|
96
|
-
qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode)
|
|
101
|
+
labelMetavariableNodes = lemma.getLabelMetavariableNodes(),
|
|
102
|
+
qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode),
|
|
103
|
+
labelMetavariableNodesString = localContext.nodesAsString(labelMetavariableNodes);
|
|
97
104
|
|
|
98
|
-
localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${
|
|
105
|
+
localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' lemma...`, qualifiedStatementNode);
|
|
99
106
|
|
|
100
107
|
const statementUnified = lemma.unifyStatement(statementNode, localContext);
|
|
101
108
|
|
|
102
109
|
qualifiedStatementUnifiedWithLemma = statementUnified; ///
|
|
103
110
|
|
|
104
111
|
if (qualifiedStatementUnifiedWithLemma) {
|
|
105
|
-
localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${
|
|
112
|
+
localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' lemma.`, qualifiedStatementNode);
|
|
106
113
|
}
|
|
107
114
|
}
|
|
108
115
|
|
|
@@ -117,17 +124,18 @@ function unifyQualifiedStatementAWithTheorem(qualifiedStatementNode, substitutio
|
|
|
117
124
|
|
|
118
125
|
if (theorem !== null) {
|
|
119
126
|
const statementNode = statementNodeQuery(qualifiedStatementNode),
|
|
120
|
-
|
|
121
|
-
qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode)
|
|
127
|
+
labelMetavariableNodes = theorem.getLabelMetavariableNodes(),
|
|
128
|
+
qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode),
|
|
129
|
+
labelMetavariableNodesString = localContext.nodesAsString(labelMetavariableNodes);
|
|
122
130
|
|
|
123
|
-
localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${
|
|
131
|
+
localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' theorem...`, qualifiedStatementNode);
|
|
124
132
|
|
|
125
133
|
const statementUnified = theorem.unifyStatement(statementNode, localContext);
|
|
126
134
|
|
|
127
135
|
qualifiedStatementUnifiedWithTheorem = statementUnified; ///
|
|
128
136
|
|
|
129
137
|
if (qualifiedStatementUnifiedWithTheorem) {
|
|
130
|
-
localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${
|
|
138
|
+
localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' theorem.`, qualifiedStatementNode);
|
|
131
139
|
}
|
|
132
140
|
}
|
|
133
141
|
|
|
@@ -142,17 +150,18 @@ function unifyQualifiedStatementAWithConjecture(qualifiedStatementNode, substitu
|
|
|
142
150
|
|
|
143
151
|
if (conjecture !== null) {
|
|
144
152
|
const statementNode = statementNodeQuery(qualifiedStatementNode),
|
|
145
|
-
|
|
146
|
-
qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode)
|
|
153
|
+
labelMetavariableNodes = conjecture.getLabelMetavariableNodes(),
|
|
154
|
+
qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode),
|
|
155
|
+
labelMetavariableNodesString = localContext.nodesAsString(labelMetavariableNodes);
|
|
147
156
|
|
|
148
|
-
localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${
|
|
157
|
+
localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' conjecture...`, qualifiedStatementNode);
|
|
149
158
|
|
|
150
159
|
const statementUnified = conjecture.unifyStatement(statementNode, localContext);
|
|
151
160
|
|
|
152
161
|
qualifiedStatementUnifiedWithConjecture = statementUnified; ///
|
|
153
162
|
|
|
154
163
|
if (qualifiedStatementUnifiedWithConjecture) {
|
|
155
|
-
localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${
|
|
164
|
+
localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' conjecture.`, qualifiedStatementNode);
|
|
156
165
|
}
|
|
157
166
|
}
|
|
158
167
|
|
|
@@ -162,21 +171,42 @@ function unifyQualifiedStatementAWithConjecture(qualifiedStatementNode, substitu
|
|
|
162
171
|
function unifyQualifiedStatementAWithReference(qualifiedStatementNode, substitutions, localContext) {
|
|
163
172
|
let qualifiedStatementUnifiedWithReference = false;
|
|
164
173
|
|
|
165
|
-
|
|
166
|
-
metavariableString = localContext.nodeAsString(metavariableNode),
|
|
167
|
-
metavariablePresent = localContext.isMetavariablePresentByMetavariableNode(metavariableNode),
|
|
168
|
-
qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode);
|
|
174
|
+
let metavariableNode = metavariableNodeQuery(qualifiedStatementNode);
|
|
169
175
|
|
|
170
|
-
|
|
176
|
+
const metavariableName = metavariableNameFromMetavariableNode(metavariableNode),
|
|
177
|
+
metavariable = localContext.findMetavariableByMetavariableName(metavariableName);
|
|
171
178
|
|
|
172
|
-
if (
|
|
179
|
+
if (metavariable !== null) {
|
|
180
|
+
const statementNode = statementNodeQuery(qualifiedStatementNode),
|
|
181
|
+
statementString = localContext.nodeAsString(statementNode),
|
|
182
|
+
metavariableString = localContext.nodeAsString(metavariableNode);
|
|
173
183
|
|
|
174
|
-
|
|
184
|
+
localContext.trace(`Unifying the '${statementString}' qualified statement with the '${metavariableString}' reference...`, qualifiedStatementNode);
|
|
175
185
|
|
|
176
|
-
|
|
186
|
+
const metavariableNodeA = metavariableNode; ///
|
|
187
|
+
|
|
188
|
+
metavariableNode = metavariable.getNode();
|
|
189
|
+
|
|
190
|
+
const metavariableNodeB = metavariableNode; ///
|
|
191
|
+
|
|
192
|
+
const unified = metavariableUnifier.unify(metavariableNodeA, metavariableNodeB, localContext);
|
|
177
193
|
|
|
178
|
-
|
|
179
|
-
|
|
194
|
+
if (unified) {
|
|
195
|
+
metavariableNode = metavariableNodeA; ///
|
|
196
|
+
|
|
197
|
+
const statementForMetavariableSubstitution = StatementForMetavariableSubstitution.fromStatementNodeAndMetavariableNode(statementNode, metavariableNode),
|
|
198
|
+
substitution = statementForMetavariableSubstitution, ///
|
|
199
|
+
localContextA = localContext, ///
|
|
200
|
+
localContextB = localContext; ///
|
|
201
|
+
|
|
202
|
+
substitutions.addSubstitution(substitution, localContextA, localContextB);
|
|
203
|
+
|
|
204
|
+
qualifiedStatementUnifiedWithReference = true;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (qualifiedStatementUnifiedWithReference) {
|
|
208
|
+
localContext.debug(`...unified the '${statementString}' qualified statement with the '${metavariableString}' reference.`, qualifiedStatementNode);
|
|
209
|
+
}
|
|
180
210
|
}
|
|
181
211
|
|
|
182
212
|
return qualifiedStatementUnifiedWithReference;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import statementWithCombinatorUnifier from "../unifier/statementWithCombinator";
|
|
4
|
+
|
|
5
|
+
export default function unifyStatementWithCombinator(statementNode, combinator, assignments, stated, localContext) {
|
|
6
|
+
let statementUnifiedWithCombinator;
|
|
7
|
+
|
|
8
|
+
const statementString = localContext.nodeAsString(statementNode),
|
|
9
|
+
combinatorString = combinator.getString();
|
|
10
|
+
|
|
11
|
+
localContext.trace(`Unifying the '${statementString}' statement with the '${combinatorString}' combinator...`, statementNode);
|
|
12
|
+
|
|
13
|
+
const combinatorStatementNode = combinator.getStatementNode();
|
|
14
|
+
|
|
15
|
+
statementUnifiedWithCombinator = statementWithCombinatorUnifier.unify(statementNode, combinatorStatementNode, assignments, stated, localContext);
|
|
16
|
+
|
|
17
|
+
if (statementUnifiedWithCombinator) {
|
|
18
|
+
localContext.debug(`...unified the '${statementString}' statement with the '${combinatorString}' combinator.`, statementNode);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return statementUnifiedWithCombinator;
|
|
22
|
+
}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import unifyStatementWithCombinator from "../unify/statementWithCombinator";
|
|
4
4
|
|
|
5
5
|
export default function unifyStatementWithCombinators(statementNode, assignments, stated, localContext) {
|
|
6
6
|
let statementUnifiedWithCombinators;
|
|
7
7
|
|
|
8
8
|
const combinators = localContext.getCombinators();
|
|
9
9
|
|
|
10
|
+
assignments = null; ///
|
|
11
|
+
|
|
12
|
+
stated = true; ///
|
|
13
|
+
|
|
10
14
|
statementUnifiedWithCombinators = combinators.some((combinator) => {
|
|
11
15
|
const statementUnifiedWithCombinator = unifyStatementWithCombinator(statementNode, combinator, assignments, stated, localContext);
|
|
12
16
|
|
|
@@ -17,22 +21,3 @@ export default function unifyStatementWithCombinators(statementNode, assignments
|
|
|
17
21
|
|
|
18
22
|
return statementUnifiedWithCombinators;
|
|
19
23
|
}
|
|
20
|
-
|
|
21
|
-
function unifyStatementWithCombinator(statementNode, combinator, assignments, stated, localContext) {
|
|
22
|
-
let statementUnifiedWithCombinator;
|
|
23
|
-
|
|
24
|
-
const statementString = localContext.nodeAsString(statementNode),
|
|
25
|
-
combinatorString = combinator.getString();
|
|
26
|
-
|
|
27
|
-
localContext.trace(`Unifying the '${statementString}' statement with the '${combinatorString}' combinator...`, statementNode);
|
|
28
|
-
|
|
29
|
-
const combinatorStatementNode = combinator.getStatementNode();
|
|
30
|
-
|
|
31
|
-
statementUnifiedWithCombinator = statementWithCombinatorUnifier.unify(statementNode, combinatorStatementNode, assignments, stated, localContext);
|
|
32
|
-
|
|
33
|
-
if (statementUnifiedWithCombinator) {
|
|
34
|
-
localContext.debug(`...unified the '${statementString}' statement with the '${combinatorString}' combinator.`, statementNode);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return statementUnifiedWithCombinator;
|
|
38
|
-
}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
import shim from "../shim";
|
|
4
4
|
import bracketedConstructor from "../constructor/bracketed";
|
|
5
|
+
import unifyTermWithConstructor from "../unify/termWithConstructor";
|
|
5
6
|
|
|
6
7
|
import { nodeQuery } from "../utilities/query";
|
|
7
|
-
import { unifyTermWithConstructor } from "../unify/termWithConstructors";
|
|
8
8
|
|
|
9
9
|
const termNodeQuery = nodeQuery("/term/argument/term");
|
|
10
10
|
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import Term from "../term";
|
|
4
|
+
import termWithConstructorUnifier from "../unifier/termWithConstructor";
|
|
5
|
+
|
|
6
|
+
export default function unifyTermWithConstructor(termNode, terms, constructor, localContext, verifyAhead) {
|
|
7
|
+
let termUnifiedWithConstructor = false;
|
|
8
|
+
|
|
9
|
+
const termString = localContext.nodeAsString(termNode),
|
|
10
|
+
constructorString = constructor.getString(),
|
|
11
|
+
constructorTermNode = constructor.getTermNode();
|
|
12
|
+
|
|
13
|
+
localContext.trace(`Unifying the '${termString}' term with the '${constructorString}' constructor...`, termNode);
|
|
14
|
+
|
|
15
|
+
const termNodeA = termNode, ///
|
|
16
|
+
constructorTermNodeB = constructorTermNode, ///
|
|
17
|
+
unified = termWithConstructorUnifier.unify(termNodeA, constructorTermNodeB, localContext);
|
|
18
|
+
|
|
19
|
+
if (unified) {
|
|
20
|
+
let verifiedAhead;
|
|
21
|
+
|
|
22
|
+
const type = constructor.getType(),
|
|
23
|
+
term = Term.fromTermNodeAndType(termNode, type);
|
|
24
|
+
|
|
25
|
+
terms.push(term);
|
|
26
|
+
|
|
27
|
+
verifiedAhead = verifyAhead();
|
|
28
|
+
|
|
29
|
+
terms.pop();
|
|
30
|
+
|
|
31
|
+
termUnifiedWithConstructor = verifiedAhead; ///
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (termUnifiedWithConstructor) {
|
|
35
|
+
localContext.debug(`...unified the '${termString}' term with the '${constructorString}' constructor.`, termNode);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return termUnifiedWithConstructor;
|
|
39
|
+
}
|