occam-verify-cli 0.0.942 → 0.0.943
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 +3 -4
- package/lib/consequent.js +3 -4
- package/lib/constants.js +5 -1
- package/lib/context/file.js +1 -1
- package/lib/context/local.js +15 -5
- package/lib/metavariable.js +12 -4
- package/lib/premise.js +11 -12
- package/lib/proofStep.js +13 -18
- package/lib/rule.js +5 -38
- package/lib/substitution/statementForMetavariable.js +15 -1
- package/lib/substitution/termForVariable.js +15 -1
- package/lib/substitutions.js +32 -10
- package/lib/supposition.js +11 -12
- package/lib/topLevelAssertion.js +5 -38
- package/lib/unifier/equality.js +6 -8
- package/lib/unifier/metaLevel.js +7 -10
- package/lib/unifier/statementAgainstCombinator.js +6 -9
- package/lib/unifier/termAgainstConstructor.js +5 -5
- package/lib/unifier.js +34 -13
- package/lib/unify/conclusionAgainstStatement.js +34 -0
- package/lib/unify/consequentAgainstStatement.js +34 -0
- package/lib/unify/metavariableAgainstStatement.js +23 -15
- package/lib/unify/premiseAgainstProofStep.js +41 -0
- package/lib/unify/premisesAgainstProofSteps.js +31 -0
- package/lib/unify/statementAgainstMetaType.js +5 -9
- package/lib/unify/suppositionAgainstProofStep.js +41 -0
- package/lib/unify/suppositionsAgainstProofSteps.js +31 -0
- package/lib/unify/termAgainstTerm.js +4 -5
- package/lib/unify/termAgainstType.js +7 -7
- package/lib/unify/variableAgainstTerm.js +11 -27
- package/lib/utilities/arguments.js +27 -0
- package/lib/utilities/array.js +5 -2
- package/lib/utilities/unify.js +19 -0
- package/lib/verifier/metaLevel.js +8 -11
- package/lib/verifier/statementAsCombinator.js +13 -22
- package/lib/verifier/topLevel.js +3 -6
- package/lib/verifier.js +28 -8
- package/lib/verify/assertion/type.js +3 -7
- package/lib/verify/declaration/metavariable.js +1 -1
- package/lib/verify/equality.js +3 -7
- package/lib/verify/metavariable.js +26 -63
- package/lib/verify/statement/qualified.js +54 -54
- package/lib/verify/statement/unqualified.js +2 -2
- package/lib/verify/statement.js +35 -30
- package/lib/verify/term.js +26 -32
- package/lib/verify/variable.js +3 -4
- package/package.json +1 -1
- package/src/conclusion.js +2 -6
- package/src/consequent.js +2 -6
- package/src/constants.js +1 -0
- package/src/context/file.js +5 -5
- package/src/context/local.js +20 -9
- package/src/metavariable.js +1 -1
- package/src/premise.js +18 -24
- package/src/proofStep.js +15 -20
- package/src/rule.js +11 -65
- package/src/substitution/statementForMetavariable.js +16 -0
- package/src/substitution/termForVariable.js +16 -0
- package/src/substitutions.js +47 -7
- package/src/supposition.js +18 -24
- package/src/topLevelAssertion.js +11 -65
- package/src/unifier/equality.js +7 -8
- package/src/unifier/metaLevel.js +6 -10
- package/src/unifier/statementAgainstCombinator.js +9 -9
- package/src/unifier/termAgainstConstructor.js +6 -4
- package/src/unifier.js +35 -11
- package/src/unify/conclusionAgainstStatement.js +34 -0
- package/src/unify/consequentAgainstStatement.js +34 -0
- package/src/unify/metavariableAgainstStatement.js +32 -22
- package/src/unify/premiseAgainstProofStep.js +54 -0
- package/src/unify/premisesAgainstProofSteps.js +23 -0
- package/src/unify/statementAgainstMetaType.js +3 -11
- package/src/unify/suppositionAgainstProofStep.js +54 -0
- package/src/unify/suppositionsAgainstProofSteps.js +23 -0
- package/src/unify/termAgainstTerm.js +3 -7
- package/src/unify/termAgainstType.js +5 -6
- package/src/unify/variableAgainstTerm.js +17 -47
- package/src/utilities/arguments.js +18 -0
- package/src/utilities/array.js +1 -1
- package/src/utilities/unify.js +18 -0
- package/src/verifier/metaLevel.js +7 -11
- package/src/verifier/statementAsCombinator.js +15 -28
- package/src/verifier/topLevel.js +13 -17
- package/src/verifier.js +28 -6
- package/src/verify/assertion/type.js +2 -6
- package/src/verify/declaration/metavariable.js +9 -9
- package/src/verify/equality.js +2 -6
- package/src/verify/metavariable.js +31 -91
- package/src/verify/statement/qualified.js +53 -53
- package/src/verify/statement/unqualified.js +1 -1
- package/src/verify/statement.js +37 -31
- package/src/verify/term.js +25 -31
- package/src/verify/variable.js +2 -4
package/src/substitutions.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import StatementForMetavariableSubstitution from "./substitution/statementForMetavariable";
|
|
4
4
|
|
|
5
|
-
import { prune, compare } from "./utilities/array";
|
|
5
|
+
import { prune, compare, rightDifference } from "./utilities/array";
|
|
6
6
|
|
|
7
7
|
export default class Substitutions {
|
|
8
8
|
constructor(array, savedArray) {
|
|
@@ -31,9 +31,16 @@ export default class Substitutions {
|
|
|
31
31
|
|
|
32
32
|
everySubstitution(callback) { return this.array.every(callback); }
|
|
33
33
|
|
|
34
|
-
addSubstitution(substitution
|
|
34
|
+
addSubstitution(substitution, localContextA, localContextB) {
|
|
35
|
+
this.array.push(substitution);
|
|
35
36
|
|
|
36
|
-
|
|
37
|
+
const substitutionNode = substitution.getNode(),
|
|
38
|
+
substitutionString = substitution.asString(localContextA, localContextB);
|
|
39
|
+
|
|
40
|
+
localContextB.trace(`Added the '${substitutionString}' substitution.`, substitutionNode);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
removeSubstitution(substitution, localContextA, localContextB) {
|
|
37
44
|
const substitutionA = substitution; ///
|
|
38
45
|
|
|
39
46
|
prune(this.array, (substitution) => {
|
|
@@ -43,6 +50,30 @@ export default class Substitutions {
|
|
|
43
50
|
return true;
|
|
44
51
|
}
|
|
45
52
|
});
|
|
53
|
+
|
|
54
|
+
const substitutionNode = substitution.getNode(),
|
|
55
|
+
substitutionString = substitution.asString(localContextA, localContextB);
|
|
56
|
+
|
|
57
|
+
localContextB.trace(`Removed the '${substitutionString}' substitution.`, substitutionNode);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
unifyAgainstEquivalences(equivalences, localContextA, localContextB) {
|
|
61
|
+
const substitutions = this, ///
|
|
62
|
+
unifiedAgainstEquivalences = this.everySubstitution((substitution) => {
|
|
63
|
+
const substitutionUnified = equivalences.some((equivalence) => {
|
|
64
|
+
const substitutionUnifiedAgainstEquivalence = substitution.unifyAgainstEquivalence(equivalence, substitutions, localContextA, localContextB);
|
|
65
|
+
|
|
66
|
+
if (substitutionUnifiedAgainstEquivalence) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
if (substitutionUnified) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
return unifiedAgainstEquivalences;
|
|
46
77
|
}
|
|
47
78
|
|
|
48
79
|
snapshot() {
|
|
@@ -51,11 +82,20 @@ export default class Substitutions {
|
|
|
51
82
|
];
|
|
52
83
|
}
|
|
53
84
|
|
|
54
|
-
rollback() {
|
|
55
|
-
const
|
|
56
|
-
|
|
85
|
+
rollback(localContextA, localContextB) {
|
|
86
|
+
const array = [
|
|
87
|
+
...this.array
|
|
88
|
+
];
|
|
89
|
+
|
|
90
|
+
rightDifference(this.savedArray, array);
|
|
91
|
+
|
|
92
|
+
array.forEach((substitution) => {
|
|
93
|
+
this.removeSubstitution(substitution, localContextA, localContextB);
|
|
94
|
+
});
|
|
57
95
|
|
|
58
|
-
this.array
|
|
96
|
+
this.array = [
|
|
97
|
+
...this.savedArray
|
|
98
|
+
];
|
|
59
99
|
|
|
60
100
|
this.savedArray = null;
|
|
61
101
|
}
|
package/src/supposition.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import LocalContext from "./context/local";
|
|
4
3
|
import metaLevelUnifier from "./unifier/metaLevel";
|
|
5
4
|
|
|
6
5
|
import { match } from "./utilities/array";
|
|
@@ -22,15 +21,12 @@ export default class Supposition {
|
|
|
22
21
|
return this.statementNode;
|
|
23
22
|
}
|
|
24
23
|
|
|
25
|
-
unifyStatement(
|
|
24
|
+
unifyStatement(statementNodeB, substitutions, localContextA, localContextB) {
|
|
26
25
|
let statementUnified = false;
|
|
27
26
|
|
|
28
27
|
if (this.statementNode !== null) {
|
|
29
28
|
const nodeA = this.statementNode, ///
|
|
30
|
-
nodeB =
|
|
31
|
-
fileContextA = fileContext, ///
|
|
32
|
-
localContextA = LocalContext.fromFileContext(fileContextA),
|
|
33
|
-
localContextB = localContext, ///
|
|
29
|
+
nodeB = statementNodeB, ///
|
|
34
30
|
unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
|
|
35
31
|
|
|
36
32
|
statementUnified = unified; ///
|
|
@@ -39,27 +35,25 @@ export default class Supposition {
|
|
|
39
35
|
return statementUnified;
|
|
40
36
|
}
|
|
41
37
|
|
|
42
|
-
unifySubproof(
|
|
38
|
+
unifySubproof(subproofNodeB, substitutions, localContextA, localContextB) {
|
|
43
39
|
let subproofUnified = false;
|
|
44
40
|
|
|
45
41
|
if (this.statementNode !== null) {
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
...
|
|
55
|
-
|
|
56
|
-
]
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
nodeA = subproofAssertionStatementNode, ///
|
|
62
|
-
nodeB = subproofStatementNode, ///
|
|
42
|
+
const statementNodeA = this.statementNode,
|
|
43
|
+
subproofAssertionNodeA = subproofAssertionNodeQuery(statementNodeA); ///
|
|
44
|
+
|
|
45
|
+
if (subproofAssertionNodeA !== null) {
|
|
46
|
+
const subproofAssertionStatementNodesA = subproofAssertionStatementNodesQuery(subproofAssertionNodeA), ///
|
|
47
|
+
subproofSuppositionStatementNodesB = subproofSuppositionStatementNodesQuery(subproofNodeB), ///
|
|
48
|
+
subproofLastProofStepStatementNodeB = subproofLastProofStepStatementNodeQuery(subproofNodeB), ///
|
|
49
|
+
subproofStatementNodesB = [
|
|
50
|
+
...subproofSuppositionStatementNodesB,
|
|
51
|
+
subproofLastProofStepStatementNodeB
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
subproofUnified = match(subproofAssertionStatementNodesA, subproofStatementNodesB, (subproofAssertionStatementNodeA, subproofStatementNodeB) => {
|
|
55
|
+
const nodeA = subproofAssertionStatementNodeA, ///
|
|
56
|
+
nodeB = subproofStatementNodeB, ///
|
|
63
57
|
unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
|
|
64
58
|
|
|
65
59
|
if (unified) {
|
package/src/topLevelAssertion.js
CHANGED
|
@@ -4,8 +4,8 @@ import Label from "./label";
|
|
|
4
4
|
import Consequent from "./consequent";
|
|
5
5
|
import Supposition from "./supposition";
|
|
6
6
|
import Substitutions from "./substitutions";
|
|
7
|
-
|
|
8
|
-
import
|
|
7
|
+
import unifyConsequentAgainstStatement from "./unify/consequentAgainstStatement";
|
|
8
|
+
import unifySuppositionsAgainstProofSteps from "./unify/suppositionsAgainstProofSteps";
|
|
9
9
|
|
|
10
10
|
export default class TopLevelAssertion {
|
|
11
11
|
constructor(labels, suppositions, consequent, substitutions, fileContext) {
|
|
@@ -39,12 +39,17 @@ export default class TopLevelAssertion {
|
|
|
39
39
|
unifyStatement(statementNode, localContext) {
|
|
40
40
|
let statementUnified = false;
|
|
41
41
|
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
const substitutions = Substitutions.fromNothing(),
|
|
43
|
+
proofSteps = localContext.getProofSteps(),
|
|
44
|
+
proofStepsB = proofSteps, ///
|
|
45
|
+
fileContextA = this.fileContext, ///
|
|
46
|
+
suppositionsA = this.suppositions, ///
|
|
47
|
+
localContextB = localContext, ///
|
|
48
|
+
suppositionsUnified = unifySuppositionsAgainstProofSteps(suppositionsA, proofStepsB, substitutions, fileContextA, localContextB);
|
|
45
49
|
|
|
46
50
|
if (suppositionsUnified) {
|
|
47
|
-
const
|
|
51
|
+
const consequentA = this.consequent, ///
|
|
52
|
+
consequentUnified = unifyConsequentAgainstStatement(consequentA, statementNode, substitutions, fileContextA, localContext);
|
|
48
53
|
|
|
49
54
|
statementUnified = consequentUnified; ///
|
|
50
55
|
}
|
|
@@ -131,62 +136,3 @@ export default class TopLevelAssertion {
|
|
|
131
136
|
|
|
132
137
|
static fromLabelsSuppositionsConsequentSubstitutionsAndFileContext(Class, labels, suppositions, consequent, substitutions, fileContext) { return new Class(labels, suppositions, consequent, substitutions, fileContext); }
|
|
133
138
|
}
|
|
134
|
-
|
|
135
|
-
function unifySuppositions(suppositions, proofSteps, substitutions, fileContext, localContext) {
|
|
136
|
-
suppositions = reverse(suppositions); ///
|
|
137
|
-
|
|
138
|
-
proofSteps = reverse(proofSteps); ///
|
|
139
|
-
|
|
140
|
-
const suppositionsUnified = correlate(suppositions, proofSteps, (supposition, proofStep) => {
|
|
141
|
-
const suppositionUnified = unifySupposition(supposition, proofStep, substitutions, fileContext, localContext);
|
|
142
|
-
|
|
143
|
-
if (suppositionUnified) {
|
|
144
|
-
return true;
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
return suppositionsUnified;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
function unifySupposition(supposition, proofStep, substitutions, fileContext, localContext) {
|
|
152
|
-
let suppositionUnified = false;
|
|
153
|
-
|
|
154
|
-
substitutions.snapshot();
|
|
155
|
-
|
|
156
|
-
const subproofNode = proofStep.getSubproofNode(),
|
|
157
|
-
statementNode = proofStep.getStatementNode();
|
|
158
|
-
|
|
159
|
-
if (subproofNode !== null) {
|
|
160
|
-
const subproofUnified = supposition.unifySubproof(subproofNode, substitutions, fileContext, localContext);
|
|
161
|
-
|
|
162
|
-
suppositionUnified = subproofUnified; ///
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
if (statementNode !== null) {
|
|
166
|
-
const statementUnified = supposition.unifyStatement(statementNode, substitutions, fileContext, localContext);
|
|
167
|
-
|
|
168
|
-
suppositionUnified = statementUnified; ///
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
suppositionUnified ?
|
|
172
|
-
substitutions.continue() :
|
|
173
|
-
substitutions.rollback();
|
|
174
|
-
|
|
175
|
-
return suppositionUnified;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
function unifyConsequent(consequent, statementNode, substitutions, fileContext, localContext) {
|
|
179
|
-
let consequentUnified;
|
|
180
|
-
|
|
181
|
-
substitutions.snapshot();
|
|
182
|
-
|
|
183
|
-
const statementUnified = consequent.unifyStatement(statementNode, substitutions, fileContext, localContext);
|
|
184
|
-
|
|
185
|
-
consequentUnified = statementUnified; ///
|
|
186
|
-
|
|
187
|
-
consequentUnified ?
|
|
188
|
-
substitutions.continue() :
|
|
189
|
-
substitutions.rollback();
|
|
190
|
-
|
|
191
|
-
return consequentUnified;
|
|
192
|
-
}
|
package/src/unifier/equality.js
CHANGED
|
@@ -13,11 +13,7 @@ class EqualityUnifier extends Unifier {
|
|
|
13
13
|
|
|
14
14
|
const nonTerminalNodeA = leftTermNode, ///
|
|
15
15
|
nonTerminalNodeB = rightTermNode, ///
|
|
16
|
-
nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext
|
|
17
|
-
const unifiedAhead = true;
|
|
18
|
-
|
|
19
|
-
return unifiedAhead;
|
|
20
|
-
});
|
|
16
|
+
nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext);
|
|
21
17
|
|
|
22
18
|
equalityUnified = nonTerminalNodeUnified; ///
|
|
23
19
|
|
|
@@ -28,10 +24,13 @@ class EqualityUnifier extends Unifier {
|
|
|
28
24
|
{
|
|
29
25
|
nodeQueryA: termNodeQuery,
|
|
30
26
|
nodeQueryB: termNodeQuery,
|
|
31
|
-
unify: (termNodeA, termNodeB, localContext
|
|
27
|
+
unify: (termNodeA, termNodeB, localContext) => {
|
|
32
28
|
let termVerifiedAgainstTerm;
|
|
33
29
|
|
|
34
|
-
|
|
30
|
+
const leftTermNode = termNodeA, ///
|
|
31
|
+
rightTermNode = termNodeB; ///
|
|
32
|
+
|
|
33
|
+
termVerifiedAgainstTerm = unifyTermAgainstTerm(leftTermNode, rightTermNode, localContext);
|
|
35
34
|
|
|
36
35
|
if (!termVerifiedAgainstTerm) {
|
|
37
36
|
const nonTerminalNodeA = termNodeA, ///
|
|
@@ -40,7 +39,7 @@ class EqualityUnifier extends Unifier {
|
|
|
40
39
|
nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
|
|
41
40
|
childNodesA = nonTerminalNodeAChildNodes, ///
|
|
42
41
|
childNodesB = nonTerminalNodeBChildNodes, ///
|
|
43
|
-
childNodesVerified = equalityUnifier.unifyChildNodes(childNodesA, childNodesB, localContext
|
|
42
|
+
childNodesVerified = equalityUnifier.unifyChildNodes(childNodesA, childNodesB, localContext);
|
|
44
43
|
|
|
45
44
|
termVerifiedAgainstTerm = childNodesVerified; ///
|
|
46
45
|
}
|
package/src/unifier/metaLevel.js
CHANGED
|
@@ -19,11 +19,7 @@ class MetaLevelUnifier extends Unifier {
|
|
|
19
19
|
|
|
20
20
|
const nonTerminalNodeA = nodeA, ///
|
|
21
21
|
nonTerminalNodeB = nodeB, ///
|
|
22
|
-
nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB
|
|
23
|
-
const unifiedAhead = true;
|
|
24
|
-
|
|
25
|
-
return unifiedAhead;
|
|
26
|
-
});
|
|
22
|
+
nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions, localContextA, localContextB);
|
|
27
23
|
|
|
28
24
|
unified = nonTerminalNodeUnified; ///
|
|
29
25
|
|
|
@@ -34,14 +30,14 @@ class MetaLevelUnifier extends Unifier {
|
|
|
34
30
|
{
|
|
35
31
|
nodeQueryA: statementNodeQuery,
|
|
36
32
|
nodeQueryB: statementNodeQuery,
|
|
37
|
-
unify: (statementNodeA, statementNodeB, substitutions, localContextA, localContextB
|
|
33
|
+
unify: (statementNodeA, statementNodeB, substitutions, localContextA, localContextB) => {
|
|
38
34
|
let statementVerifiedAgainstStatement;
|
|
39
35
|
|
|
40
36
|
const metavariableNodeA = metavariableNodeQuery(statementNodeA);
|
|
41
37
|
|
|
42
38
|
if (metavariableNodeA !== null) {
|
|
43
39
|
const substitutionNodeA = substitutionNodeQuery(statementNodeA),
|
|
44
|
-
metavariableUnifiedAgainstStatement = unifyMetavariableAgainstStatement(metavariableNodeA, statementNodeB, substitutionNodeA, substitutions, localContextA, localContextB
|
|
40
|
+
metavariableUnifiedAgainstStatement = unifyMetavariableAgainstStatement(metavariableNodeA, statementNodeB, substitutionNodeA, substitutions, localContextA, localContextB);
|
|
45
41
|
|
|
46
42
|
statementVerifiedAgainstStatement = metavariableUnifiedAgainstStatement; ///
|
|
47
43
|
} else {
|
|
@@ -51,7 +47,7 @@ class MetaLevelUnifier extends Unifier {
|
|
|
51
47
|
nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
|
|
52
48
|
childNodesA = nonTerminalNodeAChildNodes, ///
|
|
53
49
|
childNodesB = nonTerminalNodeBChildNodes, ///
|
|
54
|
-
childNodesVerified = metaLevelUnifier.unifyChildNodes(childNodesA, childNodesB, substitutions, localContextA, localContextB
|
|
50
|
+
childNodesVerified = metaLevelUnifier.unifyChildNodes(childNodesA, childNodesB, substitutions, localContextA, localContextB);
|
|
55
51
|
|
|
56
52
|
statementVerifiedAgainstStatement = childNodesVerified; ///
|
|
57
53
|
}
|
|
@@ -62,9 +58,9 @@ class MetaLevelUnifier extends Unifier {
|
|
|
62
58
|
{
|
|
63
59
|
nodeQueryA: termVariableNodeQuery,
|
|
64
60
|
nodeQueryB: termNodeQuery,
|
|
65
|
-
unify: (termVariableNodeA, termNodeB, substitutions, localContextA, localContextB
|
|
61
|
+
unify: (termVariableNodeA, termNodeB, substitutions, localContextA, localContextB) => {
|
|
66
62
|
const variableNodeA = termVariableNodeA, ///
|
|
67
|
-
variableUnifiedAgainstTerm = unifyVariableAgainstTerm(variableNodeA, termNodeB, substitutions, localContextA, localContextB
|
|
63
|
+
variableUnifiedAgainstTerm = unifyVariableAgainstTerm(variableNodeA, termNodeB, substitutions, localContextA, localContextB);
|
|
68
64
|
|
|
69
65
|
return variableUnifiedAgainstTerm;
|
|
70
66
|
}
|
|
@@ -17,11 +17,7 @@ class StatementAgainstCombinatorUnifier extends Unifier {
|
|
|
17
17
|
|
|
18
18
|
const nonTerminalNodeA = statementNode, ///
|
|
19
19
|
nonTerminalNodeB = combinatorStatementNode, ///
|
|
20
|
-
nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext
|
|
21
|
-
const unifiedAhead = true;
|
|
22
|
-
|
|
23
|
-
return unifiedAhead;
|
|
24
|
-
});
|
|
20
|
+
nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext);
|
|
25
21
|
|
|
26
22
|
statementUnifiedAgainstCombinator = nonTerminalNodeUnified; ///
|
|
27
23
|
|
|
@@ -32,8 +28,10 @@ class StatementAgainstCombinatorUnifier extends Unifier {
|
|
|
32
28
|
{
|
|
33
29
|
nodeQueryA: statementNodeQuery,
|
|
34
30
|
nodeQueryB: metaTypeNodeQuery,
|
|
35
|
-
unify: (statementNodeA, metaTypeNodeB, localContext
|
|
36
|
-
const
|
|
31
|
+
unify: (statementNodeA, metaTypeNodeB, localContext) => {
|
|
32
|
+
const metaTypeNode = metaTypeNodeB, ///
|
|
33
|
+
statementNode = statementNodeA, ///
|
|
34
|
+
statementUnifiedAgainstMetaType = unifyStatementAgainstMetaType(statementNode, metaTypeNode, localContext);
|
|
37
35
|
|
|
38
36
|
return statementUnifiedAgainstMetaType;
|
|
39
37
|
}
|
|
@@ -41,8 +39,10 @@ class StatementAgainstCombinatorUnifier extends Unifier {
|
|
|
41
39
|
{
|
|
42
40
|
nodeQueryA: termNodeQuery,
|
|
43
41
|
nodeQueryB: typeNodeQuery,
|
|
44
|
-
unify: (termNodeA, typeNodeB, localContext
|
|
45
|
-
const
|
|
42
|
+
unify: (termNodeA, typeNodeB, localContext) => {
|
|
43
|
+
const termNode = termNodeA, ///
|
|
44
|
+
typeNode = typeNodeB, ///
|
|
45
|
+
termUnifiedAgainstType = unifyTermAgainstType(termNode, typeNode, localContext);
|
|
46
46
|
|
|
47
47
|
return termUnifiedAgainstType;
|
|
48
48
|
}
|
|
@@ -9,12 +9,12 @@ const termNodeQuery = nodeQuery("/term"),
|
|
|
9
9
|
typeNodeQuery = nodeQuery("/type");
|
|
10
10
|
|
|
11
11
|
class TermAgainstConstructorUnifier extends Unifier {
|
|
12
|
-
unify(termNode, constructorTermNode, localContext
|
|
12
|
+
unify(termNode, constructorTermNode, localContext) {
|
|
13
13
|
let termUnifiedAgainstConstructor;
|
|
14
14
|
|
|
15
15
|
const nonTerminalNodeA = termNode, ///
|
|
16
16
|
nonTerminalNodeB = constructorTermNode, ///
|
|
17
|
-
nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext
|
|
17
|
+
nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext);
|
|
18
18
|
|
|
19
19
|
termUnifiedAgainstConstructor = nonTerminalNodeUnified; ///
|
|
20
20
|
|
|
@@ -25,8 +25,10 @@ class TermAgainstConstructorUnifier extends Unifier {
|
|
|
25
25
|
{
|
|
26
26
|
nodeQueryA: termNodeQuery,
|
|
27
27
|
nodeQueryB: typeNodeQuery,
|
|
28
|
-
unify: (termNodeA, typeNodeB, localContext
|
|
29
|
-
const
|
|
28
|
+
unify: (termNodeA, typeNodeB, localContext) => {
|
|
29
|
+
const termNode = termNodeA, ///
|
|
30
|
+
typeNode = typeNodeB, ///
|
|
31
|
+
termUnifiedAgainstType = unifyTermAgainstType(termNode, typeNode, localContext);
|
|
30
32
|
|
|
31
33
|
return termUnifiedAgainstType;
|
|
32
34
|
}
|
package/src/unifier.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { nodeQuery } from "./utilities/query";
|
|
4
4
|
import { terminalNodeMapFromNodes, areTerminalNodeMapsEqual } from "./utilities/unifier";
|
|
5
|
+
import {isLastRemainingArgumentFunction} from "./utilities/arguments";
|
|
5
6
|
|
|
6
7
|
const nonTerminalNodeQuery = nodeQuery("/*");
|
|
7
8
|
|
|
@@ -55,10 +56,25 @@ export default class Unifier {
|
|
|
55
56
|
terminalNodeMapsEqual = areTerminalNodeMapsEqual(childTerminalNodeMapA, childTerminalNodeMapB);
|
|
56
57
|
|
|
57
58
|
if (terminalNodeMapsEqual) {
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
const lastRemainingArgumentFunction = isLastRemainingArgumentFunction(remainingArguments);
|
|
60
|
+
|
|
61
|
+
if (lastRemainingArgumentFunction) {
|
|
62
|
+
const index = 0,
|
|
63
|
+
childNodesUnifiedAhead = this.unifyChildNodesAhead(index, childNodesA, childNodesB,...remainingArguments);
|
|
64
|
+
|
|
65
|
+
childNodesUnified = childNodesUnifiedAhead; ///
|
|
66
|
+
} else {
|
|
67
|
+
childNodesUnified = childNodesA.every((childNodeA, index) => {
|
|
68
|
+
const childNodeB = childNodesB[index],
|
|
69
|
+
nodeA = childNodeA, ///
|
|
70
|
+
nodeB = childNodeB, ///
|
|
71
|
+
nodeUnified = this.unifyNode(nodeA, nodeB, ...remainingArguments);
|
|
72
|
+
|
|
73
|
+
if (nodeUnified) {
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
62
78
|
}
|
|
63
79
|
}
|
|
64
80
|
|
|
@@ -68,10 +84,18 @@ export default class Unifier {
|
|
|
68
84
|
unifyTerminalNode(terminalNodeA, terminalNodeB, ...remainingArguments) { ///
|
|
69
85
|
let terminalNodeUnified;
|
|
70
86
|
|
|
71
|
-
const
|
|
72
|
-
|
|
87
|
+
const lastRemainingArgumentFunction = isLastRemainingArgumentFunction(remainingArguments);
|
|
88
|
+
|
|
89
|
+
if (lastRemainingArgumentFunction) {
|
|
90
|
+
const unifyAhead = remainingArguments.pop(),
|
|
91
|
+
unifiedAhead = unifyAhead();
|
|
73
92
|
|
|
74
|
-
|
|
93
|
+
terminalNodeUnified = unifiedAhead; ///
|
|
94
|
+
|
|
95
|
+
remainingArguments.push(unifiedAhead);
|
|
96
|
+
} else {
|
|
97
|
+
terminalNodeUnified = true;
|
|
98
|
+
}
|
|
75
99
|
|
|
76
100
|
return terminalNodeUnified;
|
|
77
101
|
}
|
|
@@ -134,9 +158,9 @@ export default class Unifier {
|
|
|
134
158
|
childNodesALength = childNodesA.length;
|
|
135
159
|
|
|
136
160
|
if (index === childNodesALength) {
|
|
137
|
-
const
|
|
161
|
+
const unifiedAhead = unifyAhead();
|
|
138
162
|
|
|
139
|
-
childNodesUnified =
|
|
163
|
+
childNodesUnified = unifiedAhead; ///
|
|
140
164
|
} else {
|
|
141
165
|
const childNodeA = childNodesA[index],
|
|
142
166
|
childNodeB = childNodesB[index],
|
|
@@ -146,9 +170,9 @@ export default class Unifier {
|
|
|
146
170
|
remainingArguments.push(unifyAhead); ///
|
|
147
171
|
|
|
148
172
|
const aheadIndex = index + 1,
|
|
149
|
-
|
|
173
|
+
childNodesUnifiedAhead = this.unifyChildNodesAhead(aheadIndex, childNodesA, childNodesB, ...remainingArguments);
|
|
150
174
|
|
|
151
|
-
return
|
|
175
|
+
return childNodesUnifiedAhead;
|
|
152
176
|
});
|
|
153
177
|
|
|
154
178
|
childNodesUnified = nodeUnified; ///
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import LocalContext from "../context/local";
|
|
4
|
+
|
|
5
|
+
export default function unifyConclusionAgainstStatement(conclusionA, statementNodeB, substitutions, fileContextA, localContextB) {
|
|
6
|
+
let conclusionUnified = false;
|
|
7
|
+
|
|
8
|
+
const conclusionAStatementNode = conclusionA.getStatementNode();
|
|
9
|
+
|
|
10
|
+
if (conclusionAStatementNode !== null) {
|
|
11
|
+
const localContextA = LocalContext.fromFileContext(fileContextA),
|
|
12
|
+
statementNodeA = conclusionAStatementNode, ///
|
|
13
|
+
statementStringA = localContextA.nodeAsString(statementNodeA),
|
|
14
|
+
statementStringB = localContextB.nodeAsString(statementNodeB);
|
|
15
|
+
|
|
16
|
+
substitutions.snapshot();
|
|
17
|
+
|
|
18
|
+
localContextB.trace(`Unifying the '${statementStringB}' statement against the conclusion's '${statementStringA}' statement...`, statementNodeB);
|
|
19
|
+
|
|
20
|
+
const statementUnified = conclusionA.unifyStatement(statementNodeB, substitutions, localContextA, localContextB);
|
|
21
|
+
|
|
22
|
+
conclusionUnified = statementUnified; ///
|
|
23
|
+
|
|
24
|
+
conclusionUnified ?
|
|
25
|
+
substitutions.continue() :
|
|
26
|
+
substitutions.rollback(localContextA, localContextB);
|
|
27
|
+
|
|
28
|
+
if (conclusionUnified) {
|
|
29
|
+
localContextB.debug(`...unified the '${statementStringB}' statement against the conclusion's '${statementStringA}' statement.`, statementNodeB);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return conclusionUnified;
|
|
34
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import LocalContext from "../context/local";
|
|
4
|
+
|
|
5
|
+
export default function unifyConsequentAgainstStatement(consequentA, statementNodeB, substitutions, fileContextA, localContextB) {
|
|
6
|
+
let consequentUnified = false;
|
|
7
|
+
|
|
8
|
+
const consequentAStatementNode = consequentA.getStatementNode();
|
|
9
|
+
|
|
10
|
+
if (consequentAStatementNode !== null) {
|
|
11
|
+
const localContextA = LocalContext.fromFileContext(fileContextA),
|
|
12
|
+
statementNodeA = consequentAStatementNode, ///
|
|
13
|
+
statementStringA = localContextA.nodeAsString(statementNodeA),
|
|
14
|
+
statementStringB = localContextB.nodeAsString(statementNodeB);
|
|
15
|
+
|
|
16
|
+
substitutions.snapshot();
|
|
17
|
+
|
|
18
|
+
localContextB.trace(`Unifying the '${statementStringB}' statement against the consequent's '${statementStringA}' statement...`, statementNodeB);
|
|
19
|
+
|
|
20
|
+
const statementUnified = consequentA.unifyStatement(statementNodeB, substitutions, localContextA, localContextB);
|
|
21
|
+
|
|
22
|
+
consequentUnified = statementUnified; ///
|
|
23
|
+
|
|
24
|
+
consequentUnified ?
|
|
25
|
+
substitutions.continue() :
|
|
26
|
+
substitutions.rollback(localContextA, localContextB);
|
|
27
|
+
|
|
28
|
+
if (consequentUnified) {
|
|
29
|
+
localContextB.debug(`...unified the '${statementStringB}' statement against the consequent's '${statementStringA}' statement.`, statementNodeB);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return consequentUnified;
|
|
34
|
+
}
|
|
@@ -4,7 +4,11 @@ import TermForVariableSubstitution from "../substitution/termForVariable";
|
|
|
4
4
|
import unifyStatementAgainstStatement from "../unify/statementAtainstStatement";
|
|
5
5
|
import StatementForMetavariableSubstitution from "../substitution/statementForMetavariable";
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
import { nodeQuery } from "../utilities/query";
|
|
8
|
+
|
|
9
|
+
const metavariableNodeQuery = nodeQuery("/statement/metavariable");
|
|
10
|
+
|
|
11
|
+
export default function unifyMetavariableAgainstStatement(metavariableNodeA, statementNodeB, substitutionNodeA, substitutions, localContextA, localContextB) {
|
|
8
12
|
let metavariableUnifiedAgainstStatement = false;
|
|
9
13
|
|
|
10
14
|
const substitution = substitutions.findSubstitution((substitution) => {
|
|
@@ -27,9 +31,7 @@ export default function unifyMetavariableAgainstStatement(metavariableNodeA, sta
|
|
|
27
31
|
statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, substitution, substitutions, localContext, localContext);
|
|
28
32
|
|
|
29
33
|
if (statementUnifiedAgainstStatement) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
metavariableUnifiedAgainstStatement = unifiedAhead; ///
|
|
34
|
+
metavariableUnifiedAgainstStatement = true;
|
|
33
35
|
}
|
|
34
36
|
} else {
|
|
35
37
|
const substitutionSubstitution = substitution.getSubstitution();
|
|
@@ -44,39 +46,47 @@ export default function unifyMetavariableAgainstStatement(metavariableNodeA, sta
|
|
|
44
46
|
statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, substitution, substitutions, localContext, localContext);
|
|
45
47
|
|
|
46
48
|
if (statementUnifiedAgainstStatement) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
metavariableUnifiedAgainstStatement = unifiedAhead; ///
|
|
49
|
+
metavariableUnifiedAgainstStatement = true;
|
|
50
50
|
}
|
|
51
51
|
} else {
|
|
52
52
|
const substitutionMatchesStatementNodeB = substitution.matchStatementNode(statementNodeB);
|
|
53
53
|
|
|
54
54
|
if (substitutionMatchesStatementNodeB) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
metavariableUnifiedAgainstStatement = unifiedAhead; ///
|
|
55
|
+
metavariableUnifiedAgainstStatement = true;
|
|
58
56
|
}
|
|
59
57
|
}
|
|
60
58
|
}
|
|
61
59
|
} else {
|
|
62
|
-
|
|
60
|
+
const metavariableA = localContextA.findMetavariableByMetavariableNode(metavariableNodeA);
|
|
63
61
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
metavariableNode = metavariableNodeA, ///
|
|
67
|
-
statementForMetavariableSubstitution = StatementForMetavariableSubstitution.fromMetavariableNodeStatementNodeAndSubstitutionNode(metavariableNode, statementNode, substitutionNode),
|
|
68
|
-
substitution = statementForMetavariableSubstitution; ///
|
|
62
|
+
if (metavariableA !== null) {
|
|
63
|
+
const metavariableB = metavariableFromStatementNode(statementNodeB, localContextB);
|
|
69
64
|
|
|
70
|
-
|
|
65
|
+
if (metavariableA !== metavariableB) {
|
|
66
|
+
const statementNode = statementNodeB, ///
|
|
67
|
+
substitutionNode = substitutionNodeA, ///
|
|
68
|
+
metavariableNode = metavariableNodeA, ///
|
|
69
|
+
statementForMetavariableSubstitution = StatementForMetavariableSubstitution.fromMetavariableNodeStatementNodeAndSubstitutionNode(metavariableNode, statementNode, substitutionNode),
|
|
70
|
+
substitution = statementForMetavariableSubstitution; ///
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
substitutions.addSubstitution(substitution, localContextA, localContextB);
|
|
73
|
+
}
|
|
73
74
|
|
|
74
|
-
|
|
75
|
-
substitutions.removeSubstitution(substitution);
|
|
75
|
+
metavariableUnifiedAgainstStatement = true;
|
|
76
76
|
}
|
|
77
|
-
|
|
78
|
-
metavariableUnifiedAgainstStatement = unifiedAhead; ///
|
|
79
77
|
}
|
|
80
78
|
|
|
81
79
|
return metavariableUnifiedAgainstStatement;
|
|
82
80
|
}
|
|
81
|
+
|
|
82
|
+
function metavariableFromStatementNode(statementNode, localContext) {
|
|
83
|
+
let metavariable = null;
|
|
84
|
+
|
|
85
|
+
const metavariableNode = metavariableNodeQuery(statementNode)
|
|
86
|
+
|
|
87
|
+
if (metavariableNode !== null) {
|
|
88
|
+
metavariable = localContext.findMetavariableByMetavariableNode(metavariableNode);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return metavariable;
|
|
92
|
+
}
|