occam-verify-cli 0.0.941 → 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/frame.js +2 -2
- package/lib/metavariable.js +12 -4
- package/lib/premise.js +11 -12
- package/lib/proofStep.js +14 -18
- package/lib/rule.js +6 -32
- package/lib/substitution/statementForMetavariable.js +15 -1
- package/lib/substitution/termForVariable.js +17 -3
- package/lib/substitutions.js +208 -0
- package/lib/supposition.js +11 -12
- package/lib/topLevelAssertion.js +9 -41
- 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 +24 -16
- 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 +12 -28
- package/lib/utilities/arguments.js +27 -0
- package/lib/utilities/array.js +17 -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/axiom.js +3 -2
- package/lib/verify/conjecture.js +5 -3
- package/lib/verify/declaration/metavariable.js +1 -1
- package/lib/verify/equality.js +3 -7
- package/lib/verify/lemma.js +4 -3
- package/lib/verify/metaLemma.js +3 -2
- package/lib/verify/metatheorem.js +3 -2
- package/lib/verify/metavariable.js +26 -63
- package/lib/verify/rule.js +3 -2
- 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/theorem.js +4 -3
- package/lib/verify/variable.js +3 -4
- package/package.json +4 -4
- 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/frame.js +1 -1
- package/src/metavariable.js +1 -1
- package/src/premise.js +18 -24
- package/src/proofStep.js +16 -20
- package/src/rule.js +12 -50
- package/src/substitution/statementForMetavariable.js +16 -0
- package/src/substitution/termForVariable.js +18 -2
- package/src/substitutions.js +143 -0
- package/src/supposition.js +18 -24
- package/src/topLevelAssertion.js +15 -62
- 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 +33 -23
- 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 +18 -48
- package/src/utilities/arguments.js +18 -0
- package/src/utilities/array.js +16 -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/axiom.js +2 -1
- package/src/verify/conjecture.js +5 -2
- package/src/verify/declaration/metavariable.js +9 -9
- package/src/verify/equality.js +2 -6
- package/src/verify/lemma.js +3 -2
- package/src/verify/metaLemma.js +2 -1
- package/src/verify/metatheorem.js +2 -1
- package/src/verify/metavariable.js +31 -91
- package/src/verify/rule.js +2 -1
- 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/theorem.js +3 -2
- 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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import Substitutions from "./substitutions";
|
|
3
4
|
import metaLevelUnifier from "./unifier/metaLevel";
|
|
4
5
|
|
|
5
6
|
export default class ProofStep {
|
|
@@ -16,7 +17,7 @@ export default class ProofStep {
|
|
|
16
17
|
return this.statementNode;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
|
-
unifyStatement(statementNode, equivalences,
|
|
20
|
+
unifyStatement(statementNode, equivalences, localContextA, localContextB) {
|
|
20
21
|
let statementUnified = false;
|
|
21
22
|
|
|
22
23
|
if (this.statementNode !== null) {
|
|
@@ -26,14 +27,14 @@ export default class ProofStep {
|
|
|
26
27
|
const statementNodeA = statementNode, ///
|
|
27
28
|
statementNodeB = this.statementNode; ///
|
|
28
29
|
|
|
29
|
-
statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences,
|
|
30
|
+
statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContextA, localContextB);
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
if (!statementUnifiedAgainstStatement) {
|
|
33
34
|
const statementNodeA = statementNode, ///
|
|
34
35
|
statementNodeB = this.statementNode; ///
|
|
35
36
|
|
|
36
|
-
statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences,
|
|
37
|
+
statementUnifiedAgainstStatement = unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContextA, localContextB);
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
statementUnified = statementUnifiedAgainstStatement; ///
|
|
@@ -57,32 +58,27 @@ export default class ProofStep {
|
|
|
57
58
|
}
|
|
58
59
|
}
|
|
59
60
|
|
|
60
|
-
function unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences,
|
|
61
|
+
function unifyStatementAgainstStatement(statementNodeA, statementNodeB, equivalences, localContextA, localContextB) {
|
|
61
62
|
let statementUnifiedAgainstStatement = false;
|
|
62
63
|
|
|
63
64
|
const nodeA = statementNodeA, ///
|
|
64
65
|
nodeB = statementNodeB, ///
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
statementStringA = localContextA.nodeAsString(statementNodeA),
|
|
67
|
+
statementStringB = localContextB.nodeAsString(statementNodeB);
|
|
68
|
+
|
|
69
|
+
localContextB.trace(`Unifying the '${statementStringB}' statement against the '${statementStringA}' statement...`, statementNodeB);
|
|
70
|
+
|
|
71
|
+
const substitutions = Substitutions.fromNothing(),
|
|
68
72
|
unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
|
|
69
73
|
|
|
70
74
|
if (unified) {
|
|
71
|
-
const
|
|
72
|
-
const substitutionUnified = equivalences.some((equivalence) => {
|
|
73
|
-
const substitutionUnifiedAgainstEquivalence = substitution.unifyAgainstEquivalence(equivalence, substitutions, localContext);
|
|
74
|
-
|
|
75
|
-
if (substitutionUnifiedAgainstEquivalence) {
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
78
|
-
});
|
|
75
|
+
const substitutionsUnifiedAgainstEquivalences = substitutions.unifyAgainstEquivalences(equivalences, localContextA, localContextB);
|
|
79
76
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
});
|
|
77
|
+
statementUnifiedAgainstStatement = substitutionsUnifiedAgainstEquivalences; ///
|
|
78
|
+
}
|
|
84
79
|
|
|
85
|
-
|
|
80
|
+
if (statementUnifiedAgainstStatement) {
|
|
81
|
+
localContextB.debug(`...unified the '${statementStringB}' statement against the '${statementStringA}' statement.`, statementNodeB);
|
|
86
82
|
}
|
|
87
83
|
|
|
88
84
|
return statementUnifiedAgainstStatement;
|
package/src/rule.js
CHANGED
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
import Label from "./label";
|
|
4
4
|
import Premise from "./premise";
|
|
5
5
|
import Conclusion from "./conclusion";
|
|
6
|
-
|
|
7
|
-
import
|
|
6
|
+
import Substitutions from "./substitutions";
|
|
7
|
+
import unifyPremisesAgainstProofSteps from "./unify/premisesAgainstProofSteps";
|
|
8
|
+
import unifyConclusionAgainstStatement from "./unify/conclusionAgainstStatement";
|
|
8
9
|
|
|
9
10
|
export default class Rule {
|
|
10
11
|
constructor(labels, premises, conclusion, fileContext) {
|
|
@@ -33,12 +34,17 @@ export default class Rule {
|
|
|
33
34
|
unifyStatement(statementNode, localContext) {
|
|
34
35
|
let statementUnified = false;
|
|
35
36
|
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
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);
|
|
39
44
|
|
|
40
45
|
if (premisesUnified) {
|
|
41
|
-
const
|
|
46
|
+
const conclusionA = this.conclusion, ///
|
|
47
|
+
conclusionUnified = unifyConclusionAgainstStatement(conclusionA, statementNode, substitutions, fileContextA, localContextB);
|
|
42
48
|
|
|
43
49
|
statementUnified = conclusionUnified; ///
|
|
44
50
|
}
|
|
@@ -126,47 +132,3 @@ export default class Rule {
|
|
|
126
132
|
return rule;
|
|
127
133
|
}
|
|
128
134
|
}
|
|
129
|
-
|
|
130
|
-
function matchPremise(premise, proofStep, substitutions, fileContext, localContext) {
|
|
131
|
-
let premiseUnified = false;
|
|
132
|
-
|
|
133
|
-
const subproofNode = proofStep.getSubproofNode(),
|
|
134
|
-
statementNode = proofStep.getStatementNode();
|
|
135
|
-
|
|
136
|
-
if (subproofNode !== null) {
|
|
137
|
-
const subproofUnified = premise.unifySubproof(subproofNode, substitutions, fileContext, localContext);
|
|
138
|
-
|
|
139
|
-
premiseUnified = subproofUnified; ///
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
if (statementNode !== null) {
|
|
143
|
-
const statementUnified = premise.unifyStatement(statementNode, substitutions, fileContext, localContext);
|
|
144
|
-
|
|
145
|
-
premiseUnified = statementUnified; ///
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return premiseUnified;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
function unifyPremises(premises, proofSteps, substitutions, fileContext, localContext) {
|
|
152
|
-
premises = reverse(premises); ///
|
|
153
|
-
|
|
154
|
-
proofSteps = reverse(proofSteps); ///
|
|
155
|
-
|
|
156
|
-
const premisesUnified = correlate(premises, proofSteps, (premise, proofStep) => {
|
|
157
|
-
const premiseUnified = matchPremise(premise, proofStep, substitutions, fileContext, localContext);
|
|
158
|
-
|
|
159
|
-
if (premiseUnified) {
|
|
160
|
-
return true;
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
return premisesUnified;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
function unifyConclusion(conclusion, statementNode, substitutions, fileContext, localContext) {
|
|
168
|
-
const statementUnified = conclusion.unifyStatement(statementNode, substitutions, fileContext, localContext),
|
|
169
|
-
conclusionUnified = statementUnified; ///
|
|
170
|
-
|
|
171
|
-
return conclusionUnified;
|
|
172
|
-
}
|
|
@@ -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
|
|
|
@@ -83,6 +89,16 @@ export default class StatementForMetavariableSubstitution extends Substitution {
|
|
|
83
89
|
return unifiedAgainstEquivalence;
|
|
84
90
|
}
|
|
85
91
|
|
|
92
|
+
asString(localContextA, localContextB) {
|
|
93
|
+
const statementNodeB = this.statementNode, ///
|
|
94
|
+
statementStringB = localContextB.nodeAsString(statementNodeB),
|
|
95
|
+
metavariableNodeA = this.metavariableNode, ///
|
|
96
|
+
metavariableStringA = localContextA.nodeAsString(metavariableNodeA),
|
|
97
|
+
string = `[${statementStringB} for ${metavariableStringA}]`;
|
|
98
|
+
|
|
99
|
+
return string;
|
|
100
|
+
}
|
|
101
|
+
|
|
86
102
|
static fromJSONAndFileContext(json, fileContext) {
|
|
87
103
|
const { metavariable, statement } = json,
|
|
88
104
|
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(),
|
|
@@ -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),
|
|
@@ -106,7 +122,7 @@ function substituteTermNode(termNode, substitutions) {
|
|
|
106
122
|
const termVariableNode = variableNodeQuery(termNode);
|
|
107
123
|
|
|
108
124
|
if (termVariableNode !== null) {
|
|
109
|
-
substitutions.
|
|
125
|
+
substitutions.someSubstitution((substitution) => {
|
|
110
126
|
const substitutionMatchesVariableNode = substitution.matchVariableNode(termVariableNode);
|
|
111
127
|
|
|
112
128
|
if (substitutionMatchesVariableNode) {
|
|
@@ -121,7 +137,7 @@ function substituteTermNode(termNode, substitutions) {
|
|
|
121
137
|
}
|
|
122
138
|
|
|
123
139
|
function substituteVariableNode(variableNode, substitutions) {
|
|
124
|
-
substitutions.
|
|
140
|
+
substitutions.someSubstitution((substitution) => {
|
|
125
141
|
const substitutionMatchesVariableNode = substitution.matchVariableNode(variableNode);
|
|
126
142
|
|
|
127
143
|
if (substitutionMatchesVariableNode) {
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import StatementForMetavariableSubstitution from "./substitution/statementForMetavariable";
|
|
4
|
+
|
|
5
|
+
import { prune, compare, rightDifference } from "./utilities/array";
|
|
6
|
+
|
|
7
|
+
export default class Substitutions {
|
|
8
|
+
constructor(array, savedArray) {
|
|
9
|
+
this.array = array;
|
|
10
|
+
this.savedArray = savedArray;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
getArray() {
|
|
14
|
+
return this.array;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
getSavedArray() {
|
|
18
|
+
return this.savedArray;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
hasChanged() {
|
|
22
|
+
const compares = compare(this.array, this.savedArray),
|
|
23
|
+
changed = !compares; ///
|
|
24
|
+
|
|
25
|
+
return changed;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
findSubstitution(callback) { return this.array.find(callback); }
|
|
29
|
+
|
|
30
|
+
someSubstitution(callback) { return this.array.some(callback); }
|
|
31
|
+
|
|
32
|
+
everySubstitution(callback) { return this.array.every(callback); }
|
|
33
|
+
|
|
34
|
+
addSubstitution(substitution, localContextA, localContextB) {
|
|
35
|
+
this.array.push(substitution);
|
|
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) {
|
|
44
|
+
const substitutionA = substitution; ///
|
|
45
|
+
|
|
46
|
+
prune(this.array, (substitution) => {
|
|
47
|
+
const substitutionB = substitution; ///
|
|
48
|
+
|
|
49
|
+
if (substitutionA !== substitutionB) {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
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;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
snapshot() {
|
|
80
|
+
this.savedArray = [
|
|
81
|
+
...this.array
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
|
|
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
|
+
});
|
|
95
|
+
|
|
96
|
+
this.array = [
|
|
97
|
+
...this.savedArray
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
this.savedArray = null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
continue() {
|
|
104
|
+
this.savedArray = null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
transform() {
|
|
108
|
+
///
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
toJSON(tokens) {
|
|
112
|
+
const json = this.array.map((substitution) => {
|
|
113
|
+
const substitutionJSON = substitution.toJSON(tokens);
|
|
114
|
+
|
|
115
|
+
return substitutionJSON;
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
return json;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
static fromNothing() {
|
|
122
|
+
const array = [],
|
|
123
|
+
savedArray = null,
|
|
124
|
+
substitutions = new Substitutions(array, savedArray);
|
|
125
|
+
|
|
126
|
+
return substitutions;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
static fromJSONAndFileContext(json, fileContext) {
|
|
130
|
+
const substitutionsJSON = json, ///
|
|
131
|
+
array = substitutionsJSON.map((substitutionJSON) => {
|
|
132
|
+
const json = substitutionJSON, ///
|
|
133
|
+
statementForMetavariableSubstitution = StatementForMetavariableSubstitution.fromJSONAndFileContext(json, fileContext),
|
|
134
|
+
substitution = statementForMetavariableSubstitution; ///
|
|
135
|
+
|
|
136
|
+
return substitution;
|
|
137
|
+
}),
|
|
138
|
+
savedArray = null,
|
|
139
|
+
substitutions = new Substitutions(array, savedArray);
|
|
140
|
+
|
|
141
|
+
return substitutions;
|
|
142
|
+
}
|
|
143
|
+
}
|
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
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
import Label from "./label";
|
|
4
4
|
import Consequent from "./consequent";
|
|
5
5
|
import Supposition from "./supposition";
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
import
|
|
6
|
+
import Substitutions from "./substitutions";
|
|
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
|
}
|
|
@@ -76,11 +81,7 @@ export default class TopLevelAssertion {
|
|
|
76
81
|
return suppositionJSON;
|
|
77
82
|
}),
|
|
78
83
|
consequentJSON = this.consequent.toJSON(tokens),
|
|
79
|
-
substitutionsJSON = this.substitutions.
|
|
80
|
-
const substitutionJSON = substitution.toJSON();
|
|
81
|
-
|
|
82
|
-
return substitutionJSON;
|
|
83
|
-
}),
|
|
84
|
+
substitutionsJSON = this.substitutions.toJSON(tokens),
|
|
84
85
|
labels = labelsJSON, ///
|
|
85
86
|
suppositions = suppositionsJSON, ///
|
|
86
87
|
consequent = consequentJSON, ///
|
|
@@ -126,60 +127,12 @@ export default class TopLevelAssertion {
|
|
|
126
127
|
|
|
127
128
|
const substitutionsJSON = substitutions; ///
|
|
128
129
|
|
|
129
|
-
|
|
130
|
-
const json = substitutionJSON, ///
|
|
131
|
-
statementForMetavariableSubstitution = StatementForMetavariableSubstitution.fromJSONAndFileContext(json, fileContext),
|
|
132
|
-
substitution = statementForMetavariableSubstitution; ///
|
|
130
|
+
json = substitutionsJSON; ///
|
|
133
131
|
|
|
134
|
-
|
|
135
|
-
});
|
|
132
|
+
substitutions = Substitutions.fromJSONAndFileContext(json, fileContext);
|
|
136
133
|
|
|
137
134
|
return new Class(labels, suppositions, consequent, substitutions, fileContext); ///
|
|
138
135
|
}
|
|
139
136
|
|
|
140
137
|
static fromLabelsSuppositionsConsequentSubstitutionsAndFileContext(Class, labels, suppositions, consequent, substitutions, fileContext) { return new Class(labels, suppositions, consequent, substitutions, fileContext); }
|
|
141
138
|
}
|
|
142
|
-
|
|
143
|
-
function unifySuppositions(suppositions, proofSteps, substitutions, fileContext, localContext) {
|
|
144
|
-
suppositions = reverse(suppositions); ///
|
|
145
|
-
|
|
146
|
-
proofSteps = reverse(proofSteps); ///
|
|
147
|
-
|
|
148
|
-
const suppositionsUnified = correlate(suppositions, proofSteps, (supposition, proofStep) => {
|
|
149
|
-
const suppositionUnified = unifySupposition(supposition, proofStep, substitutions, fileContext, localContext);
|
|
150
|
-
|
|
151
|
-
if (suppositionUnified) {
|
|
152
|
-
return true;
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
return suppositionsUnified;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
function unifySupposition(supposition, proofStep, substitutions, fileContext, localContext) {
|
|
160
|
-
let suppositionUnified = false;
|
|
161
|
-
|
|
162
|
-
const subproofNode = proofStep.getSubproofNode(),
|
|
163
|
-
statementNode = proofStep.getStatementNode();
|
|
164
|
-
|
|
165
|
-
if (subproofNode !== null) {
|
|
166
|
-
const subproofUnified = supposition.unifySubproof(subproofNode, substitutions, fileContext, localContext);
|
|
167
|
-
|
|
168
|
-
suppositionUnified = subproofUnified; ///
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
if (statementNode !== null) {
|
|
172
|
-
const statementUnified = supposition.unifyStatement(statementNode, substitutions, fileContext, localContext);
|
|
173
|
-
|
|
174
|
-
suppositionUnified = statementUnified; ///
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return suppositionUnified;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
function unifyConsequent(consequent, statementNode, substitutions, fileContext, localContext) {
|
|
181
|
-
const statementUnified = consequent.unifyStatement(statementNode, substitutions, fileContext, localContext),
|
|
182
|
-
consequentUnified = statementUnified; ///
|
|
183
|
-
|
|
184
|
-
return consequentUnified;
|
|
185
|
-
}
|
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
|
}
|