occam-verify-cli 0.0.526 → 0.0.527
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/assertion/type.js +10 -40
- package/lib/axiom.js +7 -7
- package/lib/axiomLemmaTheoremConjecture.js +190 -0
- package/lib/conjecture.js +141 -0
- package/lib/consequence.js +3 -3
- package/lib/constants.js +4 -16
- package/lib/context/file.js +76 -39
- package/lib/context/metaproof.js +40 -10
- package/lib/context/proof.js +38 -105
- package/lib/context/release/directory.js +20 -1
- package/lib/context/release/file.js +27 -3
- package/lib/equality.js +78 -51
- package/lib/index.js +1 -13
- package/lib/kinds.js +5 -1
- package/lib/lemma.js +7 -7
- package/lib/matcher/metastatementForMetavariable.js +16 -19
- package/lib/matcher/statementForMetavariable.js +22 -20
- package/lib/matcher/{statementForVariable → termForVariable}/consequence.js +13 -13
- package/lib/matcher/{statementForVariable → termForVariable}/supposition.js +13 -13
- package/lib/matcher/termForVariable.js +198 -0
- package/lib/matcher.js +23 -64
- package/lib/mixins/file.js +62 -2
- package/lib/premise.js +4 -4
- package/lib/ruleNames.js +1 -9
- package/lib/step/proof.js +22 -1
- package/lib/substitution/statementForMetavariable.js +12 -8
- package/lib/substitution/termForVariable.js +86 -0
- package/lib/supposition.js +4 -4
- package/lib/theorem.js +7 -7
- package/lib/type.js +9 -2
- package/lib/utilities/string.js +3 -7
- package/lib/utilities/substitution.js +4 -5
- package/lib/variable.js +4 -38
- package/lib/verify/assertion/type.js +59 -36
- package/lib/verify/axiom.js +1 -2
- package/lib/verify/conjecture.js +56 -0
- package/lib/verify/declaration/topLevel.js +7 -3
- package/lib/verify/lemma.js +1 -2
- package/lib/verify/metastatement/qualified.js +1 -2
- package/lib/verify/metastatement/unqualified.js +1 -2
- package/lib/verify/rule.js +1 -2
- package/lib/verify/statement/qualified.js +39 -10
- package/lib/verify/statement/unqualified.js +1 -2
- package/lib/verify/statement.js +44 -47
- package/lib/verify/theorem.js +1 -2
- package/package.json +1 -1
- package/src/assertion/type.js +7 -32
- package/src/axiom.js +4 -4
- package/src/{axiomLemmaTheorem.js → axiomLemmaTheoremConjecture.js} +5 -5
- package/src/conjecture.js +13 -0
- package/src/consequence.js +2 -2
- package/src/constants.js +1 -4
- package/src/context/file.js +81 -37
- package/src/context/metaproof.js +42 -5
- package/src/context/proof.js +42 -41
- package/src/context/release/directory.js +24 -0
- package/src/context/release/file.js +34 -3
- package/src/equality.js +110 -61
- package/src/index.js +0 -3
- package/src/kinds.js +1 -0
- package/src/lemma.js +4 -4
- package/src/matcher/metastatementForMetavariable.js +22 -32
- package/src/matcher/statementForMetavariable.js +40 -34
- package/src/matcher/termForVariable/consequence.js +9 -0
- package/src/matcher/termForVariable/supposition.js +9 -0
- package/src/matcher/termForVariable.js +89 -0
- package/src/matcher.js +28 -22
- package/src/mixins/file.js +46 -1
- package/src/premise.js +4 -4
- package/src/ruleNames.js +0 -2
- package/src/step/proof.js +27 -0
- package/src/substitution/statementForMetavariable.js +17 -10
- package/src/substitution/termForVariable.js +64 -0
- package/src/supposition.js +3 -3
- package/src/theorem.js +4 -4
- package/src/type.js +14 -4
- package/src/utilities/string.js +4 -6
- package/src/utilities/substitution.js +6 -4
- package/src/variable.js +4 -37
- package/src/verify/assertion/type.js +70 -64
- package/src/verify/axiom.js +0 -1
- package/src/verify/conjecture.js +73 -0
- package/src/verify/declaration/topLevel.js +7 -0
- package/src/verify/lemma.js +0 -1
- package/src/verify/metastatement/qualified.js +0 -1
- package/src/verify/metastatement/unqualified.js +0 -1
- package/src/verify/rule.js +0 -1
- package/src/verify/statement/qualified.js +53 -13
- package/src/verify/statement/unqualified.js +0 -1
- package/src/verify/statement.js +46 -66
- package/src/verify/theorem.js +0 -1
- package/lib/axiomLemmaTheorem.js +0 -190
- package/lib/jsonTypes.js +0 -30
- package/lib/matcher/statementForVariable.js +0 -201
- package/lib/substitution/statementForVariable.js +0 -86
- package/lib/utilities/json.js +0 -187
- package/lib/utilities/version.js +0 -32
- package/lib/versionChanges.js +0 -34
- package/src/jsonTypes.js +0 -6
- package/src/matcher/statementForVariable/consequence.js +0 -9
- package/src/matcher/statementForVariable/supposition.js +0 -9
- package/src/matcher/statementForVariable.js +0 -99
- package/src/substitution/statementForVariable.js +0 -64
- package/src/utilities/json.js +0 -264
- package/src/utilities/version.js +0 -30
- package/src/versionChanges.js +0 -11
|
@@ -9,15 +9,16 @@ import Type from "../../type";
|
|
|
9
9
|
import Axiom from "../../axiom";
|
|
10
10
|
import Lemma from "../../lemma";
|
|
11
11
|
import Theorem from "../../theorem";
|
|
12
|
+
import Conjecture from "../../conjecture";
|
|
12
13
|
import Combinator from "../../combinator";
|
|
13
14
|
import Constructor from "../../constructor";
|
|
14
15
|
|
|
15
16
|
import { push } from "../../utilities/array";
|
|
16
17
|
import { customGrammarFromNameAndEntries } from "../../utilities/customGrammar";
|
|
17
|
-
import { RULE_KIND, TYPE_KIND, AXIOM_KIND, LEMMA_KIND, THEOREM_KIND, COMBINATOR_KIND, CONSTRUCTOR_KIND } from "../../kinds";
|
|
18
|
+
import { RULE_KIND, TYPE_KIND, AXIOM_KIND, LEMMA_KIND, THEOREM_KIND, CONJECTURE_KIND, COMBINATOR_KIND, CONSTRUCTOR_KIND } from "../../kinds";
|
|
18
19
|
|
|
19
20
|
export default class FileReleaseContext extends ReleaseContext {
|
|
20
|
-
constructor(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts, contextJSON, types, rules, axioms, lemmas, theorems, combinators, constructors) {
|
|
21
|
+
constructor(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts, contextJSON, types, rules, axioms, lemmas, theorems, conjectures, combinators, constructors) {
|
|
21
22
|
super(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts);
|
|
22
23
|
|
|
23
24
|
this.types = types;
|
|
@@ -25,8 +26,10 @@ export default class FileReleaseContext extends ReleaseContext {
|
|
|
25
26
|
this.axioms = axioms;
|
|
26
27
|
this.lemmas = lemmas;
|
|
27
28
|
this.theorems = theorems;
|
|
29
|
+
this.conjectures = conjectures;
|
|
28
30
|
this.combinators = combinators;
|
|
29
31
|
this.constructors = constructors;
|
|
32
|
+
|
|
30
33
|
this.contextJSON = contextJSON;
|
|
31
34
|
}
|
|
32
35
|
|
|
@@ -153,6 +156,25 @@ export default class FileReleaseContext extends ReleaseContext {
|
|
|
153
156
|
return theorems;
|
|
154
157
|
}
|
|
155
158
|
|
|
159
|
+
getConjectures(includeDependencies = true) {
|
|
160
|
+
const conjectures = [];
|
|
161
|
+
|
|
162
|
+
push(conjectures, this.conjectures);
|
|
163
|
+
|
|
164
|
+
if (includeDependencies) {
|
|
165
|
+
const dependencyReleaseContexts = this.getDependencyReleaseContexts();
|
|
166
|
+
|
|
167
|
+
dependencyReleaseContexts.forEach((releaseContext) => {
|
|
168
|
+
const includeDependencies = false,
|
|
169
|
+
releaseContextConjectures = releaseContext.getConjectures(includeDependencies);
|
|
170
|
+
|
|
171
|
+
push(conjectures, releaseContextConjectures);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return conjectures;
|
|
176
|
+
}
|
|
177
|
+
|
|
156
178
|
getCombinators(includeDependencies = true) {
|
|
157
179
|
const combinators = [];
|
|
158
180
|
|
|
@@ -252,6 +274,14 @@ export default class FileReleaseContext extends ReleaseContext {
|
|
|
252
274
|
break;
|
|
253
275
|
}
|
|
254
276
|
|
|
277
|
+
case CONJECTURE_KIND: {
|
|
278
|
+
const conjecture = Conjecture.fromJSON(json, releaseContext);
|
|
279
|
+
|
|
280
|
+
this.conjectures.push(conjecture);
|
|
281
|
+
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
|
|
255
285
|
case COMBINATOR_KIND: {
|
|
256
286
|
const combinator = Combinator.fromJSON(json, releaseContext);
|
|
257
287
|
|
|
@@ -288,9 +318,10 @@ export default class FileReleaseContext extends ReleaseContext {
|
|
|
288
318
|
axioms = [],
|
|
289
319
|
lemmas = [],
|
|
290
320
|
theorems = [],
|
|
321
|
+
conjectures = [],
|
|
291
322
|
combinators = [],
|
|
292
323
|
constructors = [],
|
|
293
|
-
releaseContext = new FileReleaseContext(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts, contextJSON, types, rules, axioms, lemmas, theorems, combinators, constructors);
|
|
324
|
+
releaseContext = new FileReleaseContext(log, name, entries, callbacks, verified, customGrammar, florenceLexer, florenceParser, dependencyReleaseContexts, contextJSON, types, rules, axioms, lemmas, theorems, conjectures, combinators, constructors);
|
|
294
325
|
|
|
295
326
|
return releaseContext;
|
|
296
327
|
}
|
package/src/equality.js
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import verifyTerm from "./verify/term";
|
|
4
|
+
import equalityCombinator from "./ocmbinator/equality";
|
|
5
|
+
|
|
6
|
+
import { matcher } from "./matcher";
|
|
3
7
|
import { nodeQuery } from "./utilities/query";
|
|
8
|
+
import { first, second } from "./utilities/array";
|
|
9
|
+
import { EQUALITY_DEPTH } from "./constants";
|
|
4
10
|
import { TERM_RULE_NAME } from "./ruleNames";
|
|
11
|
+
import { verifyStatementAgainstCombinator } from "./verify/statement";
|
|
5
12
|
|
|
6
13
|
const leftTermNodeQuery = nodeQuery("/statement/argument[0]/term!"),
|
|
7
14
|
rightTermNodeQuery = nodeQuery("/statement/argument[1]/term!");
|
|
@@ -20,30 +27,7 @@ export default class Equality {
|
|
|
20
27
|
return this.rightTermNode;
|
|
21
28
|
}
|
|
22
29
|
|
|
23
|
-
|
|
24
|
-
let matches = false;
|
|
25
|
-
|
|
26
|
-
const leftTermNode = equality.getLeftTermNode(),
|
|
27
|
-
rightTermNode = equality.getRightTermNode();
|
|
28
|
-
|
|
29
|
-
if (!matches) {
|
|
30
|
-
const reversed = false,
|
|
31
|
-
leftTermNodeAndRightTermNodeMatch = this.matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities);
|
|
32
|
-
|
|
33
|
-
matches = leftTermNodeAndRightTermNodeMatch; ///
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (!matches) {
|
|
37
|
-
const reversed = true,
|
|
38
|
-
leftTermNodeAndRightTermNodeMatch = this.matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities);
|
|
39
|
-
|
|
40
|
-
matches = leftTermNodeAndRightTermNodeMatch; ///
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return matches;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
matchLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, reversed, equalities) {
|
|
30
|
+
matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context) {
|
|
47
31
|
let leftTermNodeAndRightTermNodeMatch = true;
|
|
48
32
|
|
|
49
33
|
if (leftTermNodeAndRightTermNodeMatch) {
|
|
@@ -51,7 +35,7 @@ export default class Equality {
|
|
|
51
35
|
this.rightTermNode :
|
|
52
36
|
this.leftTermNode, ///
|
|
53
37
|
rightNonTerminalNode = leftTermNode, ///
|
|
54
|
-
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities);
|
|
38
|
+
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context);
|
|
55
39
|
|
|
56
40
|
leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
|
|
57
41
|
}
|
|
@@ -61,7 +45,7 @@ export default class Equality {
|
|
|
61
45
|
this.leftTermNode :
|
|
62
46
|
this.rightTermNode, ///
|
|
63
47
|
rightNonTerminalNode = rightTermNode, ///
|
|
64
|
-
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities);
|
|
48
|
+
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context);
|
|
65
49
|
|
|
66
50
|
leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
|
|
67
51
|
}
|
|
@@ -69,10 +53,35 @@ export default class Equality {
|
|
|
69
53
|
return leftTermNodeAndRightTermNodeMatch;
|
|
70
54
|
}
|
|
71
55
|
|
|
72
|
-
|
|
56
|
+
match(equality, equalities, context) {
|
|
57
|
+
let matches = false;
|
|
58
|
+
|
|
59
|
+
const leftTermNode = equality.getLeftTermNode(),
|
|
60
|
+
rightTermNode = equality.getRightTermNode();
|
|
61
|
+
|
|
62
|
+
equalities = filterEqualities(equalities, equality); ///
|
|
63
|
+
|
|
64
|
+
if (!matches) {
|
|
65
|
+
const reversed = false,
|
|
66
|
+
leftTermNodeAndRightTermNodeMatch = this.matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context);
|
|
67
|
+
|
|
68
|
+
matches = leftTermNodeAndRightTermNodeMatch; ///
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (!matches) {
|
|
72
|
+
const reversed = true,
|
|
73
|
+
leftTermNodeAndRightTermNodeMatch = this.matchTermNodes(leftTermNode, rightTermNode, reversed, equalities, context);
|
|
74
|
+
|
|
75
|
+
matches = leftTermNodeAndRightTermNodeMatch; ///
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return matches;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
equate(equalities, context) {
|
|
73
82
|
const leftNonTerminalNode = this.leftTermNode, ///
|
|
74
83
|
rightNonTerminalNode = this.rightTermNode, ///
|
|
75
|
-
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities),
|
|
84
|
+
nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context),
|
|
76
85
|
equates = nonTerminalNodeEquates; ///
|
|
77
86
|
|
|
78
87
|
return equates;
|
|
@@ -84,10 +93,18 @@ export default class Equality {
|
|
|
84
93
|
const statementNode = proofStep.getStatementNode();
|
|
85
94
|
|
|
86
95
|
if (statementNode !== null) {
|
|
87
|
-
const
|
|
88
|
-
|
|
96
|
+
const combinator = equalityCombinator, ///
|
|
97
|
+
combinatorStatementNode = combinator.getStatementNode(), ///
|
|
98
|
+
substitutions = null,
|
|
99
|
+
depth = EQUALITY_DEPTH,
|
|
100
|
+
nodeA = statementNode, ///
|
|
101
|
+
nodeB = combinatorStatementNode, ///
|
|
102
|
+
nodeMatches = matcher.matchNode(nodeA, nodeB, substitutions, depth);
|
|
103
|
+
|
|
104
|
+
if (nodeMatches) {
|
|
105
|
+
const leftTermNode = leftTermNodeQuery(statementNode),
|
|
106
|
+
rightTermNode = rightTermNodeQuery(statementNode);
|
|
89
107
|
|
|
90
|
-
if ((leftTermNode !== null) && (rightTermNode !== null)) {
|
|
91
108
|
equality = new Equality(leftTermNode, rightTermNode);
|
|
92
109
|
}
|
|
93
110
|
}
|
|
@@ -95,22 +112,24 @@ export default class Equality {
|
|
|
95
112
|
return equality;
|
|
96
113
|
}
|
|
97
114
|
|
|
98
|
-
static fromStatementNode(statementNode) {
|
|
99
|
-
|
|
100
|
-
rightTermNode = rightTermNodeQuery(statementNode),
|
|
101
|
-
equality = new Equality(leftTermNode, rightTermNode);
|
|
115
|
+
static fromStatementNode(statementNode, context) {
|
|
116
|
+
let equality = null;
|
|
102
117
|
|
|
103
|
-
|
|
104
|
-
|
|
118
|
+
const combinator = equalityCombinator, ///
|
|
119
|
+
statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
|
|
105
120
|
|
|
106
|
-
|
|
107
|
-
|
|
121
|
+
if (statementVerifiedAgainstCombinator) {
|
|
122
|
+
const leftTermNode = leftTermNodeQuery(statementNode),
|
|
123
|
+
rightTermNode = rightTermNodeQuery(statementNode);
|
|
124
|
+
|
|
125
|
+
equality = new Equality(leftTermNode, rightTermNode);
|
|
126
|
+
}
|
|
108
127
|
|
|
109
128
|
return equality;
|
|
110
129
|
}
|
|
111
130
|
}
|
|
112
131
|
|
|
113
|
-
function equateNode(nodeA, nodeB, equalities) {
|
|
132
|
+
function equateNode(nodeA, nodeB, equalities, context) {
|
|
114
133
|
let nodeEquates = false;
|
|
115
134
|
|
|
116
135
|
const nodeATerminalNode = nodeA.isTerminalNode(),
|
|
@@ -120,13 +139,13 @@ function equateNode(nodeA, nodeB, equalities) {
|
|
|
120
139
|
if (nodeATerminalNode) {
|
|
121
140
|
const terminalNodeA = nodeA, ///
|
|
122
141
|
terminalNodeB = nodeB, ///
|
|
123
|
-
terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, equalities);
|
|
142
|
+
terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, equalities, context);
|
|
124
143
|
|
|
125
144
|
nodeEquates = terminalNodeEquates; ///
|
|
126
145
|
} else {
|
|
127
146
|
const nonTerminalNodeA = nodeA, ///
|
|
128
147
|
nonTerminalNodeB = nodeB, ///
|
|
129
|
-
nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equalities);
|
|
148
|
+
nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equalities, context);
|
|
130
149
|
|
|
131
150
|
nodeEquates = nonTerminalNodeEquates; ///
|
|
132
151
|
}
|
|
@@ -135,7 +154,7 @@ function equateNode(nodeA, nodeB, equalities) {
|
|
|
135
154
|
return nodeEquates;
|
|
136
155
|
}
|
|
137
156
|
|
|
138
|
-
function equateNodes(leftNodes, rightNodes, equalities) {
|
|
157
|
+
function equateNodes(leftNodes, rightNodes, equalities, context) {
|
|
139
158
|
let nodesEquate = false;
|
|
140
159
|
|
|
141
160
|
const leftNodesLength = leftNodes.length,
|
|
@@ -144,7 +163,7 @@ function equateNodes(leftNodes, rightNodes, equalities) {
|
|
|
144
163
|
if (leftNodesLength === rightNodesLength) {
|
|
145
164
|
nodesEquate = leftNodes.every((LeftNode, index) => {
|
|
146
165
|
const rightNode = rightNodes[index],
|
|
147
|
-
nodeEquates = equateNode(LeftNode, rightNode, equalities);
|
|
166
|
+
nodeEquates = equateNode(LeftNode, rightNode, equalities, context);
|
|
148
167
|
|
|
149
168
|
if (nodeEquates) {
|
|
150
169
|
return true;
|
|
@@ -155,14 +174,14 @@ function equateNodes(leftNodes, rightNodes, equalities) {
|
|
|
155
174
|
return nodesEquate;
|
|
156
175
|
}
|
|
157
176
|
|
|
158
|
-
function equateTerminalNode(terminalNodeA, terminalNodeB, equalities) {
|
|
177
|
+
function equateTerminalNode(terminalNodeA, terminalNodeB, equalities, context) {
|
|
159
178
|
const matches = terminalNodeA.match(terminalNodeB),
|
|
160
179
|
terminalNodeEquates = matches; ///
|
|
161
180
|
|
|
162
181
|
return terminalNodeEquates;
|
|
163
182
|
}
|
|
164
183
|
|
|
165
|
-
function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities) {
|
|
184
|
+
function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities, context) {
|
|
166
185
|
let nonTerminalNodeEquates = false;
|
|
167
186
|
|
|
168
187
|
const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
|
|
@@ -175,7 +194,7 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
|
|
|
175
194
|
if (ruleNameTermRuleName) {
|
|
176
195
|
const leftTermNode = leftNonTerminalNode, ///
|
|
177
196
|
rightTermNode = rightNonTerminalNode, ///
|
|
178
|
-
termNodeEquates = equateTermNode(leftTermNode, rightTermNode, equalities);
|
|
197
|
+
termNodeEquates = equateTermNode(leftTermNode, rightTermNode, equalities, context);
|
|
179
198
|
|
|
180
199
|
nonTerminalNodeEquates = termNodeEquates; ///
|
|
181
200
|
}
|
|
@@ -185,7 +204,7 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
|
|
|
185
204
|
rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(),
|
|
186
205
|
leftNodes = leftNonTerminalNodeChildNodes, ///
|
|
187
206
|
rightNodes = rightNonTerminalNodeChildNodes, ///
|
|
188
|
-
nodesEquate = equateNodes(leftNodes, rightNodes, equalities);
|
|
207
|
+
nodesEquate = equateNodes(leftNodes, rightNodes, equalities, context);
|
|
189
208
|
|
|
190
209
|
nonTerminalNodeEquates = nodesEquate; ///
|
|
191
210
|
}
|
|
@@ -194,23 +213,24 @@ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equali
|
|
|
194
213
|
return nonTerminalNodeEquates;
|
|
195
214
|
}
|
|
196
215
|
|
|
197
|
-
function equateTermNode(leftTermNode, rightTermNode, equalities) {
|
|
198
|
-
|
|
199
|
-
equalityA = equality, ///
|
|
200
|
-
equalityMatches = equalities.some((equality) => { ///
|
|
201
|
-
let equalitiesB = equalities; ///
|
|
216
|
+
function equateTermNode(leftTermNode, rightTermNode, equalities, context) {
|
|
217
|
+
let termNodeEquates = false;
|
|
202
218
|
|
|
203
|
-
|
|
219
|
+
const equality = equalityFromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, context);
|
|
204
220
|
|
|
205
|
-
|
|
221
|
+
if (equality !== null) {
|
|
222
|
+
const equalityA = equality, ///
|
|
223
|
+
equalitiesB = equalities, ///
|
|
224
|
+
equalityMatches = equalitiesB.some((equalityB) => { ///
|
|
225
|
+
const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB, context);
|
|
206
226
|
|
|
207
|
-
|
|
227
|
+
if (equalityAMatchesEqualityB) {
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
});
|
|
208
231
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
}
|
|
212
|
-
}),
|
|
213
|
-
termNodeEquates = equalityMatches; ///
|
|
232
|
+
termNodeEquates = equalityMatches; ///
|
|
233
|
+
}
|
|
214
234
|
|
|
215
235
|
return termNodeEquates;
|
|
216
236
|
}
|
|
@@ -228,3 +248,32 @@ function filterEqualities(equalities, equality) {
|
|
|
228
248
|
|
|
229
249
|
return equalities;
|
|
230
250
|
}
|
|
251
|
+
|
|
252
|
+
function equalityFromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode, context) {
|
|
253
|
+
let equality = null;
|
|
254
|
+
|
|
255
|
+
const types = [],
|
|
256
|
+
leftTermVerified = verifyTerm(leftTermNode, types, context),
|
|
257
|
+
rightTermVerified = verifyTerm(rightTermNode, types, context);
|
|
258
|
+
|
|
259
|
+
if (leftTermVerified && rightTermVerified) {
|
|
260
|
+
const firstType = first(types),
|
|
261
|
+
secondType = second(types),
|
|
262
|
+
leftTermType = firstType, ///
|
|
263
|
+
rightTermType = secondType, ///
|
|
264
|
+
leftTermTypeEqualToRightTermType = leftTermType.isEqualTo(rightTermType);
|
|
265
|
+
|
|
266
|
+
if (leftTermTypeEqualToRightTermType) {
|
|
267
|
+
equality = new Equality(leftTermNode, rightTermNode);
|
|
268
|
+
} else {
|
|
269
|
+
const leftTermString = context.nodeAsString(leftTermNode),
|
|
270
|
+
rightTermString = context.nodeAsString(rightTermNode),
|
|
271
|
+
leftTermTypeName = leftTermType.getName(),
|
|
272
|
+
rightTermTypeName = rightTermType.getName();
|
|
273
|
+
|
|
274
|
+
context.error(`The left '${leftTermString}' term's '${leftTermTypeName}' type is not equal to the right '${rightTermString}' term's '${rightTermTypeName}' type.'`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return equality;
|
|
279
|
+
}
|
package/src/index.js
CHANGED
|
@@ -3,11 +3,8 @@
|
|
|
3
3
|
export { default as Callbacks } from "./callbacks";
|
|
4
4
|
export { default as verifyRelease } from "./verify/release";
|
|
5
5
|
export { default as ReleaseContext } from "./context/release";
|
|
6
|
-
export { default as versionChanges } from "./versionChanges";
|
|
7
6
|
export { default as FileReleaseContext } from "./context/release/file";
|
|
8
7
|
export { default as DirectoryReleaseContext } from "./context/release/directory";
|
|
9
8
|
|
|
10
|
-
export { default as jsonUtilities } from "./utilities/json";
|
|
11
|
-
export { default as versionUtilities } from "./utilities/version";
|
|
12
9
|
export { default as customGrammarUtilities } from "./utilities/customGrammar";
|
|
13
10
|
export { default as releaseContextUtilities } from "./utilities/releaseContext";
|
package/src/kinds.js
CHANGED
|
@@ -5,5 +5,6 @@ export const RULE_KIND = "rule";
|
|
|
5
5
|
export const AXIOM_KIND = "axiom";
|
|
6
6
|
export const LEMMA_KIND = "lemma";
|
|
7
7
|
export const THEOREM_KIND = "theorem";
|
|
8
|
+
export const CONJECTURE_KIND = "conjecture";
|
|
8
9
|
export const COMBINATOR_KIND = "combinator";
|
|
9
10
|
export const CONSTRUCTOR_KIND = "constructor";
|
package/src/lemma.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import AxiomLemmaTheoremConjecture from "./axiomLemmaTheoremConjecture";
|
|
4
4
|
|
|
5
5
|
import { LEMMA_KIND } from "./kinds";
|
|
6
6
|
|
|
7
|
-
export default class Lemma extends
|
|
7
|
+
export default class Lemma extends AxiomLemmaTheoremConjecture {
|
|
8
8
|
static kind = LEMMA_KIND;
|
|
9
9
|
|
|
10
|
-
static fromJSON(json, releaseContext) { return
|
|
10
|
+
static fromJSON(json, releaseContext) { return AxiomLemmaTheoremConjecture.fromJSON(Lemma, json, releaseContext); }
|
|
11
11
|
|
|
12
|
-
static fromLabelsSuppositionsAndConsequence(labels, suppositions, consequence) { return
|
|
12
|
+
static fromLabelsSuppositionsAndConsequence(labels, suppositions, consequence) { return AxiomLemmaTheoremConjecture.fromLabelsSuppositionsAndConsequence(Lemma, labels, suppositions, consequence); }
|
|
13
13
|
}
|
|
@@ -3,31 +3,36 @@
|
|
|
3
3
|
import Matcher from "../matcher";
|
|
4
4
|
import MetastatementForMetavariableSubstitution from "../substitution/metastatementForMetavariable";
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { nodeQuery } from "../utilities/query";
|
|
7
|
+
import { METASTATEMENT_RULE_NAME } from "../ruleNames";
|
|
7
8
|
import { metavariableNameFromMetavariableNode } from "../utilities/query";
|
|
8
|
-
|
|
9
|
+
|
|
10
|
+
const metavariableNodeQuery = nodeQuery('/metastatement/metavariable!');
|
|
9
11
|
|
|
10
12
|
export default class MetastatementForMetavariableMatcher extends Matcher {
|
|
11
13
|
matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions) {
|
|
12
14
|
let nonTerminalNodeMatches = false;
|
|
13
15
|
|
|
14
16
|
const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
|
|
15
|
-
nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName()
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName();
|
|
18
|
+
|
|
19
|
+
if (nonTerminalNodeBRuleName === nonTerminalNodeARuleName) {
|
|
20
|
+
const nonTerminalNodeARuleNameMetastatementRuleName = (nonTerminalNodeARuleName === METASTATEMENT_RULE_NAME),
|
|
21
|
+
nonTerminalNodeBRuleNameMetastatementRuleName = (nonTerminalNodeBRuleName === METASTATEMENT_RULE_NAME);
|
|
18
22
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
if (nonTerminalNodeARuleNameMetastatementRuleName && nonTerminalNodeBRuleNameMetastatementRuleName) {
|
|
24
|
+
const metastatementNodeA = nonTerminalNodeA, ///
|
|
25
|
+
metastatementNodeB = nonTerminalNodeB, ///
|
|
26
|
+
metastatementNodeMatches = this.matchMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions);
|
|
23
27
|
|
|
24
|
-
|
|
25
|
-
|
|
28
|
+
if (metastatementNodeMatches) {
|
|
29
|
+
nonTerminalNodeMatches = true; ///
|
|
30
|
+
} else {
|
|
31
|
+
nonTerminalNodeMatches = super.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
|
|
32
|
+
}
|
|
26
33
|
} else {
|
|
27
34
|
nonTerminalNodeMatches = super.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
|
|
28
35
|
}
|
|
29
|
-
} else if (nonTerminalNodeBRuleName === nonTerminalNodeARuleName) {
|
|
30
|
-
nonTerminalNodeMatches = super.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
|
|
31
36
|
}
|
|
32
37
|
|
|
33
38
|
return nonTerminalNodeMatches;
|
|
@@ -36,27 +41,12 @@ export default class MetastatementForMetavariableMatcher extends Matcher {
|
|
|
36
41
|
matchMetastatementNode(metastatementNodeA, metastatementNodeB, substitutions) {
|
|
37
42
|
let metastatementNodeMatches = false;
|
|
38
43
|
|
|
39
|
-
const
|
|
40
|
-
nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
|
|
41
|
-
nonTerminalNodeAChildNodesLength = nonTerminalNodeAChildNodes.length;
|
|
42
|
-
|
|
43
|
-
if (nonTerminalNodeAChildNodesLength === 1) {
|
|
44
|
-
const firstNonTerminalNodeAChildNode = first(nonTerminalNodeAChildNodes),
|
|
45
|
-
cChildNodeA = firstNonTerminalNodeAChildNode, ///
|
|
46
|
-
cChildNodeANonTerminalNode = cChildNodeA.isNonTerminalNode();
|
|
44
|
+
const metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
|
|
47
45
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
|
|
51
|
-
nonTerminalNodeARuleNameMetavariableRuleName = (nonTerminalNodeARuleName === METAVARIABLE_RULE_NAME);
|
|
46
|
+
if (metavariableNodeA !== null) {
|
|
47
|
+
const metaVariableNodeMatches = this.matchMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions);
|
|
52
48
|
|
|
53
|
-
|
|
54
|
-
const metavariableNodeA = nonTerminalNodeA, ///
|
|
55
|
-
metaVariableNodeMatches = this.matchMetavariableNode(metavariableNodeA, metastatementNodeB, substitutions);
|
|
56
|
-
|
|
57
|
-
metastatementNodeMatches = metaVariableNodeMatches; ///
|
|
58
|
-
}
|
|
59
|
-
}
|
|
49
|
+
metastatementNodeMatches = metaVariableNodeMatches; ///
|
|
60
50
|
}
|
|
61
51
|
|
|
62
52
|
return metastatementNodeMatches;
|
|
@@ -3,31 +3,52 @@
|
|
|
3
3
|
import Matcher from "../matcher";
|
|
4
4
|
import StatementForMetavariableSubstitution from "../substitution/statementForMetavariable";
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { nodeQuery } from "../utilities/query";
|
|
7
7
|
import { metavariableNameFromMetavariableNode } from "../utilities/query";
|
|
8
|
-
import {
|
|
8
|
+
import { STATEMENT_RULE_NAME, METASTATEMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../ruleNames";
|
|
9
|
+
|
|
10
|
+
const metavariableNodeQuery = nodeQuery('/metastatement/metavariable!'),
|
|
11
|
+
metaArgumentChildNodeNodeQuery = nodeQuery('/metaArgument/*!');
|
|
9
12
|
|
|
10
13
|
export default class StatementForMetavariableMatcher extends Matcher {
|
|
11
14
|
matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions) {
|
|
12
15
|
let nonTerminalNodeMatches = false;
|
|
13
16
|
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
const nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName(),
|
|
18
|
+
nonTerminalNodeBRuleNameMetaArgumentRuleName = (nonTerminalNodeBRuleName === META_ARGUMENT_RULE_NAME);
|
|
19
|
+
|
|
20
|
+
if (nonTerminalNodeBRuleNameMetaArgumentRuleName) {
|
|
21
|
+
const metaArgumentNodeB = nonTerminalNodeB, ///
|
|
22
|
+
metaArgumentChildNodeB = metaArgumentChildNodeNodeQuery(metaArgumentNodeB);
|
|
18
23
|
|
|
19
|
-
|
|
20
|
-
const metastatementNodeA = nonTerminalNodeA, ///
|
|
21
|
-
statementNodeB = nonTerminalNodeB, ///
|
|
22
|
-
statementNodeMatches = this.matchStatementNode(metastatementNodeA, statementNodeB, substitutions);
|
|
24
|
+
nonTerminalNodeB = metaArgumentChildNodeB; ///
|
|
23
25
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
nonTerminalNodeMatches = this.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
|
|
27
|
+
} else {
|
|
28
|
+
const nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
|
|
29
|
+
nonTerminalNodeBRuleName = nonTerminalNodeB.getRuleName(),
|
|
30
|
+
nonTerminalNodeARuleNameMetastatementRuleName = (nonTerminalNodeARuleName === METASTATEMENT_RULE_NAME),
|
|
31
|
+
nonTerminalNodeBRuleNameStatementRuleName = (nonTerminalNodeBRuleName === STATEMENT_RULE_NAME);
|
|
32
|
+
|
|
33
|
+
if (nonTerminalNodeARuleNameMetastatementRuleName && nonTerminalNodeBRuleNameStatementRuleName) {
|
|
34
|
+
const metastatementNodeA = nonTerminalNodeA, ///
|
|
35
|
+
statementNodeB = nonTerminalNodeB, ///
|
|
36
|
+
statementNodeMatches = this.matchStatementNode(metastatementNodeA, statementNodeB, substitutions);
|
|
37
|
+
|
|
38
|
+
if (statementNodeMatches) {
|
|
39
|
+
nonTerminalNodeMatches = true; ///
|
|
40
|
+
} else {
|
|
41
|
+
const nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
|
|
42
|
+
nonTerminalNodeBChildNodes = nonTerminalNodeB.getChildNodes(),
|
|
43
|
+
nodesA = nonTerminalNodeAChildNodes, ///
|
|
44
|
+
nodesB = nonTerminalNodeBChildNodes, ///
|
|
45
|
+
nodesMatch = this.matchNodes(nodesA, nodesB, substitutions);
|
|
46
|
+
|
|
47
|
+
nonTerminalNodeMatches = nodesMatch; ///
|
|
48
|
+
}
|
|
49
|
+
} else if (nonTerminalNodeBRuleName === nonTerminalNodeARuleName) {
|
|
27
50
|
nonTerminalNodeMatches = super.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
|
|
28
51
|
}
|
|
29
|
-
} else if (nonTerminalNodeBRuleName === nonTerminalNodeARuleName) {
|
|
30
|
-
nonTerminalNodeMatches = super.matchNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, substitutions);
|
|
31
52
|
}
|
|
32
53
|
|
|
33
54
|
return nonTerminalNodeMatches;
|
|
@@ -36,27 +57,12 @@ export default class StatementForMetavariableMatcher extends Matcher {
|
|
|
36
57
|
matchStatementNode(metastatementNodeA, statementNodeB, substitutions) {
|
|
37
58
|
let statementNodeMatches = false;
|
|
38
59
|
|
|
39
|
-
const
|
|
40
|
-
nonTerminalNodeAChildNodes = nonTerminalNodeA.getChildNodes(),
|
|
41
|
-
nonTerminalNodeAChildNodesLength = nonTerminalNodeAChildNodes.length;
|
|
60
|
+
const metavariableNodeA = metavariableNodeQuery(metastatementNodeA);
|
|
42
61
|
|
|
43
|
-
if (
|
|
44
|
-
const
|
|
45
|
-
cChildNodeA = firstNonTerminalNodeAChildNode, ///
|
|
46
|
-
cChildNodeANonTerminalNode = cChildNodeA.isNonTerminalNode();
|
|
62
|
+
if (metavariableNodeA !== null) {
|
|
63
|
+
const metavariableNodeMatches = this.matchMetavariableNode(metavariableNodeA, statementNodeB, substitutions);
|
|
47
64
|
|
|
48
|
-
|
|
49
|
-
const nonTerminalNodeA = cChildNodeA, ///
|
|
50
|
-
nonTerminalNodeARuleName = nonTerminalNodeA.getRuleName(),
|
|
51
|
-
nonTerminalNodeARuleNameMetavariableRuleName = (nonTerminalNodeARuleName === METAVARIABLE_RULE_NAME);
|
|
52
|
-
|
|
53
|
-
if (nonTerminalNodeARuleNameMetavariableRuleName) {
|
|
54
|
-
const metavariableNodeA = nonTerminalNodeA, ///
|
|
55
|
-
metaVariableNodeMatches = this.matchMetavariableNode(metavariableNodeA, statementNodeB, substitutions);
|
|
56
|
-
|
|
57
|
-
statementNodeMatches = metaVariableNodeMatches; ///
|
|
58
|
-
}
|
|
59
|
-
}
|
|
65
|
+
statementNodeMatches = metavariableNodeMatches; ///
|
|
60
66
|
}
|
|
61
67
|
|
|
62
68
|
return statementNodeMatches;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import TermForVariableMatcher from "../../matcher/termForVariable";
|
|
4
|
+
|
|
5
|
+
class ConsequenceTermForVariableMatcher extends TermForVariableMatcher {
|
|
6
|
+
static createSubstitutions = false;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const consequenceTermForVariableMatcher = new ConsequenceTermForVariableMatcher();
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import TermForVariableMatcher from "../../matcher/termForVariable";
|
|
4
|
+
|
|
5
|
+
class SuppositionTermForVariableMatcher extends TermForVariableMatcher {
|
|
6
|
+
static createSubstitutions = true;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const suppositionTermForVariableMatcher = new SuppositionTermForVariableMatcher();
|