occam-verify-cli 0.0.942 → 0.0.944
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/equality.js +14 -1
- 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 +17 -3
- package/lib/substitution/termForVariable.js +16 -2
- package/lib/substitution.js +14 -1
- package/lib/substitutions.js +28 -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 +12 -25
- package/lib/verify/metavariable.js +26 -63
- package/lib/verify/statement/qualified.js +55 -58
- package/lib/verify/statement/unqualified.js +3 -6
- package/lib/verify/statement.js +36 -34
- package/lib/verify/term.js +26 -32
- package/lib/verify/type.js +4 -7
- 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/equality.js +22 -0
- package/src/metavariable.js +1 -1
- package/src/premise.js +18 -24
- package/src/proofStep.js +16 -21
- package/src/rule.js +11 -65
- package/src/substitution/statementForMetavariable.js +17 -3
- package/src/substitution/termForVariable.js +17 -1
- package/src/substitution.js +12 -0
- package/src/substitutions.js +41 -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 +12 -40
- package/src/verify/metavariable.js +31 -91
- package/src/verify/statement/qualified.js +54 -58
- package/src/verify/statement/unqualified.js +2 -6
- package/src/verify/statement.js +38 -36
- package/src/verify/term.js +25 -31
- package/src/verify/type.js +3 -7
- package/src/verify/variable.js +2 -4
package/src/premise.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 Premise {
|
|
|
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 Premise {
|
|
|
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/proofStep.js
CHANGED
|
@@ -17,7 +17,7 @@ export default class ProofStep {
|
|
|
17
17
|
return this.statementNode;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
unifyStatement(statementNode, equivalences,
|
|
20
|
+
unifyStatement(statementNode, equivalences, localContextA, localContextB) {
|
|
21
21
|
let statementUnified = false;
|
|
22
22
|
|
|
23
23
|
if (this.statementNode !== null) {
|
|
@@ -27,14 +27,14 @@ export default class ProofStep {
|
|
|
27
27
|
const statementNodeA = statementNode, ///
|
|
28
28
|
statementNodeB = this.statementNode; ///
|
|
29
29
|
|
|
30
|
-
statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences,
|
|
30
|
+
statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContextA, localContextB);
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
if (!statementUnifiedAgainstStatement) {
|
|
34
34
|
const statementNodeA = statementNode, ///
|
|
35
35
|
statementNodeB = this.statementNode; ///
|
|
36
36
|
|
|
37
|
-
statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences,
|
|
37
|
+
statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContextA, localContextB);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
statementUnified = statementUnifiedAgainstStatement; ///
|
|
@@ -58,32 +58,27 @@ export default class ProofStep {
|
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
function unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences,
|
|
61
|
+
function unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContextA, localContextB) {
|
|
62
62
|
let statementUnifiedAgainstStatement = false;
|
|
63
63
|
|
|
64
|
-
const
|
|
64
|
+
const statementStringA = localContextA.nodeAsString(statementNodeA),
|
|
65
|
+
statementStringB = localContextB.nodeAsString(statementNodeB);
|
|
66
|
+
|
|
67
|
+
localContextB.trace(`Unifying the '${statementStringB}' statement against the '${statementStringA}' statement...`, statementNodeB);
|
|
68
|
+
|
|
69
|
+
const substitutions = Substitutions.fromNothing(),
|
|
70
|
+
nodeA = statementNodeA, ///
|
|
65
71
|
nodeB = statementNodeB, ///
|
|
66
|
-
localContextA = localContext, ///
|
|
67
|
-
localContextB = localContext, ///
|
|
68
|
-
substitutions = Substitutions.fromNothing(),
|
|
69
72
|
unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
|
|
70
73
|
|
|
71
74
|
if (unified) {
|
|
72
|
-
const
|
|
73
|
-
const substitutionUnified = equivalences.some((equivalence) => {
|
|
74
|
-
const substitutionUnifiedAgainstEquivalence = substitution.unifyAgainstEquivalence(equivalence, substitutions, localContext);
|
|
75
|
-
|
|
76
|
-
if (substitutionUnifiedAgainstEquivalence) {
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
});
|
|
75
|
+
const substitutionsUnifiedAgainstEquivalences = substitutions.unifyAgainstEquivalences(equivalences, localContextA, localContextB);
|
|
80
76
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
});
|
|
77
|
+
statementUnifiedAgainstStatement = substitutionsUnifiedAgainstEquivalences; ///
|
|
78
|
+
}
|
|
85
79
|
|
|
86
|
-
|
|
80
|
+
if (statementUnifiedAgainstStatement) {
|
|
81
|
+
localContextB.debug(`...unified the '${statementStringB}' statement against the '${statementStringA}' statement.`, statementNodeB);
|
|
87
82
|
}
|
|
88
83
|
|
|
89
84
|
return statementUnifiedAgainstStatement;
|
package/src/rule.js
CHANGED
|
@@ -4,8 +4,8 @@ import Label from "./label";
|
|
|
4
4
|
import Premise from "./premise";
|
|
5
5
|
import Conclusion from "./conclusion";
|
|
6
6
|
import Substitutions from "./substitutions";
|
|
7
|
-
|
|
8
|
-
import
|
|
7
|
+
import unifyPremisesAgainstProofSteps from "./unify/premisesAgainstProofSteps";
|
|
8
|
+
import unifyConclusionAgainstStatement from "./unify/conclusionAgainstStatement";
|
|
9
9
|
|
|
10
10
|
export default class Rule {
|
|
11
11
|
constructor(labels, premises, conclusion, fileContext) {
|
|
@@ -34,12 +34,17 @@ export default class Rule {
|
|
|
34
34
|
unifyStatement(statementNode, localContext) {
|
|
35
35
|
let statementUnified = false;
|
|
36
36
|
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
const substitutions = Substitutions.fromNothing(),
|
|
38
|
+
proofSteps = localContext.getProofSteps(),
|
|
39
|
+
premisesA = this.premises,
|
|
40
|
+
proofStepsB = proofSteps, ///
|
|
41
|
+
fileContextA = this.fileContext, ///
|
|
42
|
+
localContextB = localContext, ///
|
|
43
|
+
premisesUnified = unifyPremisesAgainstProofSteps(premisesA, proofStepsB, substitutions, fileContextA, localContextB);
|
|
40
44
|
|
|
41
45
|
if (premisesUnified) {
|
|
42
|
-
const
|
|
46
|
+
const conclusionA = this.conclusion, ///
|
|
47
|
+
conclusionUnified = unifyConclusionAgainstStatement(conclusionA, statementNode, substitutions, fileContextA, localContextB);
|
|
43
48
|
|
|
44
49
|
statementUnified = conclusionUnified; ///
|
|
45
50
|
}
|
|
@@ -127,62 +132,3 @@ export default class Rule {
|
|
|
127
132
|
return rule;
|
|
128
133
|
}
|
|
129
134
|
}
|
|
130
|
-
|
|
131
|
-
function matchPremise(premise, proofStep, substitutions, fileContext, localContext) {
|
|
132
|
-
let premiseUnified = false;
|
|
133
|
-
|
|
134
|
-
const subproofNode = proofStep.getSubproofNode(),
|
|
135
|
-
statementNode = proofStep.getStatementNode();
|
|
136
|
-
|
|
137
|
-
substitutions.snapshot();
|
|
138
|
-
|
|
139
|
-
if (subproofNode !== null) {
|
|
140
|
-
const subproofUnified = premise.unifySubproof(subproofNode, substitutions, fileContext, localContext);
|
|
141
|
-
|
|
142
|
-
premiseUnified = subproofUnified; ///
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (statementNode !== null) {
|
|
146
|
-
const statementUnified = premise.unifyStatement(statementNode, substitutions, fileContext, localContext);
|
|
147
|
-
|
|
148
|
-
premiseUnified = statementUnified; ///
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
premiseUnified ?
|
|
152
|
-
substitutions.continue() :
|
|
153
|
-
substitutions.rollback();
|
|
154
|
-
|
|
155
|
-
return premiseUnified;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
function unifyPremises(premises, proofSteps, substitutions, fileContext, localContext) {
|
|
159
|
-
premises = reverse(premises); ///
|
|
160
|
-
|
|
161
|
-
proofSteps = reverse(proofSteps); ///
|
|
162
|
-
|
|
163
|
-
const premisesUnified = correlate(premises, proofSteps, (premise, proofStep) => {
|
|
164
|
-
const premiseUnified = matchPremise(premise, proofStep, substitutions, fileContext, localContext);
|
|
165
|
-
|
|
166
|
-
if (premiseUnified) {
|
|
167
|
-
return true;
|
|
168
|
-
}
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
return premisesUnified;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
function unifyConclusion(conclusion, statementNode, substitutions, fileContext, localContext) {
|
|
175
|
-
let conclusionUnified;
|
|
176
|
-
|
|
177
|
-
substitutions.snapshot();
|
|
178
|
-
|
|
179
|
-
const statementUnified = conclusion.unifyStatement(statementNode, substitutions, fileContext, localContext);
|
|
180
|
-
|
|
181
|
-
conclusionUnified = statementUnified; ///
|
|
182
|
-
|
|
183
|
-
conclusionUnified ?
|
|
184
|
-
substitutions.continue() :
|
|
185
|
-
substitutions.rollback();
|
|
186
|
-
|
|
187
|
-
return conclusionUnified;
|
|
188
|
-
}
|
|
@@ -32,6 +32,12 @@ export default class StatementForMetavariableSubstitution extends Substitution {
|
|
|
32
32
|
return this.substitution;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
getNode() {
|
|
36
|
+
const node = this.statementNode; ///
|
|
37
|
+
|
|
38
|
+
return node;
|
|
39
|
+
}
|
|
40
|
+
|
|
35
41
|
matchStatementNode(statementNode, substitutions, localContextA, localContextB) {
|
|
36
42
|
let statementNodeMatches;
|
|
37
43
|
|
|
@@ -60,7 +66,7 @@ export default class StatementForMetavariableSubstitution extends Substitution {
|
|
|
60
66
|
return matchesMetavariableNode;
|
|
61
67
|
}
|
|
62
68
|
|
|
63
|
-
unifyAgainstEquivalence(equivalence, substitutions,
|
|
69
|
+
unifyAgainstEquivalence(equivalence, substitutions, localContextA, localContextB) {
|
|
64
70
|
let unifiedAgainstEquivalence = false; ///
|
|
65
71
|
|
|
66
72
|
const metavariableNode = metavariableNodeQuery(this.statementNode);
|
|
@@ -73,8 +79,6 @@ export default class StatementForMetavariableSubstitution extends Substitution {
|
|
|
73
79
|
const { metaLevelUnifier } = shim,
|
|
74
80
|
nodeA = this.metavariableNode, ///
|
|
75
81
|
nodeB = metavariableNode, ///
|
|
76
|
-
localContextA = localContext, ///
|
|
77
|
-
localContextB = localContext, ///
|
|
78
82
|
unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
|
|
79
83
|
|
|
80
84
|
unifiedAgainstEquivalence = unified; ///
|
|
@@ -83,6 +87,16 @@ export default class StatementForMetavariableSubstitution extends Substitution {
|
|
|
83
87
|
return unifiedAgainstEquivalence;
|
|
84
88
|
}
|
|
85
89
|
|
|
90
|
+
asString(localContextA, localContextB) {
|
|
91
|
+
const statementNodeB = this.statementNode, ///
|
|
92
|
+
statementStringB = localContextB.nodeAsString(statementNodeB),
|
|
93
|
+
metavariableNodeA = this.metavariableNode, ///
|
|
94
|
+
metavariableStringA = localContextA.nodeAsString(metavariableNodeA),
|
|
95
|
+
string = `[${statementStringB} for ${metavariableStringA}]`;
|
|
96
|
+
|
|
97
|
+
return string;
|
|
98
|
+
}
|
|
99
|
+
|
|
86
100
|
static fromJSONAndFileContext(json, fileContext) {
|
|
87
101
|
const { metavariable, statement } = json,
|
|
88
102
|
metavariableString = metavariable, ///
|
|
@@ -23,6 +23,12 @@ export default class TermForVariableSubstitution extends Substitution {
|
|
|
23
23
|
return this.termNode;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
getNode() {
|
|
27
|
+
const node = this.termNode; ///
|
|
28
|
+
|
|
29
|
+
return node;
|
|
30
|
+
}
|
|
31
|
+
|
|
26
32
|
isTransformed(substitution) {
|
|
27
33
|
const termNod = substitution.getTermNode(),
|
|
28
34
|
variableNode = substitution.getVariableNode(),
|
|
@@ -45,7 +51,7 @@ export default class TermForVariableSubstitution extends Substitution {
|
|
|
45
51
|
return matchesVariableNode;
|
|
46
52
|
}
|
|
47
53
|
|
|
48
|
-
unifyAgainstEquivalence(equivalence, substitutions,
|
|
54
|
+
unifyAgainstEquivalence(equivalence, substitutions, localContextA, localContextB) {
|
|
49
55
|
let unifiedAgainstEquivalence;
|
|
50
56
|
|
|
51
57
|
const equivalenceMatchesVariableNode = equivalence.matchVariableNode(this.variableNode);
|
|
@@ -61,6 +67,16 @@ export default class TermForVariableSubstitution extends Substitution {
|
|
|
61
67
|
return unifiedAgainstEquivalence;
|
|
62
68
|
}
|
|
63
69
|
|
|
70
|
+
asString(localContextA, localContextB) {
|
|
71
|
+
const termNodeB = this.termNode, ///
|
|
72
|
+
termStringB = localContextB.nodeAsString(termNodeB),
|
|
73
|
+
variableNodeA = this.variableNode, ///
|
|
74
|
+
variableStringA = localContextA.nodeAsString(variableNodeA),
|
|
75
|
+
string = `[${termStringB} for ${variableStringA}]`;
|
|
76
|
+
|
|
77
|
+
return string;
|
|
78
|
+
}
|
|
79
|
+
|
|
64
80
|
static fromSubstitutionNode(substitutionNode) {
|
|
65
81
|
const termNode = termNodeQuery(substitutionNode),
|
|
66
82
|
variableNode = variableNodeQuery(substitutionNode),
|
package/src/substitution.js
CHANGED
|
@@ -24,4 +24,16 @@ export default class Substitution {
|
|
|
24
24
|
|
|
25
25
|
return matchesMetavariableNode;
|
|
26
26
|
}
|
|
27
|
+
|
|
28
|
+
unifyAgainstEquivalences(equivalences, substitutions, localContextA, localContextB) {
|
|
29
|
+
const unifiedAgainstEquivalences = equivalences.some((equivalence) => {
|
|
30
|
+
const substitutionUnifiedAgainstEquivalence = this.unifyAgainstEquivalence(equivalence, substitutions, localContextA, localContextB);
|
|
31
|
+
|
|
32
|
+
if (substitutionUnifiedAgainstEquivalence) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
return unifiedAgainstEquivalences;
|
|
38
|
+
}
|
|
27
39
|
}
|
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,24 @@ 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 unifiedAgainstEquivalences = this.everySubstitution((substitution) => {
|
|
62
|
+
const substitutions = this, ///
|
|
63
|
+
substitutionUnifiedAgainstEquivalence = substitution.unifyAgainstEquivalences(equivalences, substitutions, localContextA, localContextB);
|
|
64
|
+
|
|
65
|
+
if (substitutionUnifiedAgainstEquivalence) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
return unifiedAgainstEquivalences;
|
|
46
71
|
}
|
|
47
72
|
|
|
48
73
|
snapshot() {
|
|
@@ -51,11 +76,20 @@ export default class Substitutions {
|
|
|
51
76
|
];
|
|
52
77
|
}
|
|
53
78
|
|
|
54
|
-
rollback() {
|
|
55
|
-
const
|
|
56
|
-
|
|
79
|
+
rollback(localContextA, localContextB) {
|
|
80
|
+
const array = [
|
|
81
|
+
...this.array
|
|
82
|
+
];
|
|
57
83
|
|
|
58
|
-
this.
|
|
84
|
+
rightDifference(this.savedArray, array);
|
|
85
|
+
|
|
86
|
+
array.forEach((substitution) => {
|
|
87
|
+
this.removeSubstitution(substitution, localContextA, localContextB);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
this.array = [
|
|
91
|
+
...this.savedArray
|
|
92
|
+
];
|
|
59
93
|
|
|
60
94
|
this.savedArray = null;
|
|
61
95
|
}
|
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
|
}
|