occam-verify-cli 0.0.941 → 0.0.942

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/src/rule.js CHANGED
@@ -3,6 +3,7 @@
3
3
  import Label from "./label";
4
4
  import Premise from "./premise";
5
5
  import Conclusion from "./conclusion";
6
+ import Substitutions from "./substitutions";
6
7
 
7
8
  import { reverse, correlate } from "./utilities/array";
8
9
 
@@ -34,7 +35,7 @@ export default class Rule {
34
35
  let statementUnified = false;
35
36
 
36
37
  const proofSteps = localContext.getProofSteps(),
37
- substitutions = [],
38
+ substitutions = Substitutions.fromNothing(),
38
39
  premisesUnified = unifyPremises(this.premises, proofSteps, substitutions, this.fileContext, localContext);
39
40
 
40
41
  if (premisesUnified) {
@@ -133,6 +134,8 @@ function matchPremise(premise, proofStep, substitutions, fileContext, localConte
133
134
  const subproofNode = proofStep.getSubproofNode(),
134
135
  statementNode = proofStep.getStatementNode();
135
136
 
137
+ substitutions.snapshot();
138
+
136
139
  if (subproofNode !== null) {
137
140
  const subproofUnified = premise.unifySubproof(subproofNode, substitutions, fileContext, localContext);
138
141
 
@@ -145,6 +148,10 @@ function matchPremise(premise, proofStep, substitutions, fileContext, localConte
145
148
  premiseUnified = statementUnified; ///
146
149
  }
147
150
 
151
+ premiseUnified ?
152
+ substitutions.continue() :
153
+ substitutions.rollback();
154
+
148
155
  return premiseUnified;
149
156
  }
150
157
 
@@ -165,8 +172,17 @@ function unifyPremises(premises, proofSteps, substitutions, fileContext, localCo
165
172
  }
166
173
 
167
174
  function unifyConclusion(conclusion, statementNode, substitutions, fileContext, localContext) {
168
- const statementUnified = conclusion.unifyStatement(statementNode, substitutions, fileContext, localContext),
169
- conclusionUnified = statementUnified; ///
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();
170
186
 
171
187
  return conclusionUnified;
172
188
  }
@@ -106,7 +106,7 @@ function substituteTermNode(termNode, substitutions) {
106
106
  const termVariableNode = variableNodeQuery(termNode);
107
107
 
108
108
  if (termVariableNode !== null) {
109
- substitutions.some((substitution) => {
109
+ substitutions.someSubstitution((substitution) => {
110
110
  const substitutionMatchesVariableNode = substitution.matchVariableNode(termVariableNode);
111
111
 
112
112
  if (substitutionMatchesVariableNode) {
@@ -121,7 +121,7 @@ function substituteTermNode(termNode, substitutions) {
121
121
  }
122
122
 
123
123
  function substituteVariableNode(variableNode, substitutions) {
124
- substitutions.some((substitution) => {
124
+ substitutions.someSubstitution((substitution) => {
125
125
  const substitutionMatchesVariableNode = substitution.matchVariableNode(variableNode);
126
126
 
127
127
  if (substitutionMatchesVariableNode) {
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+
3
+ import StatementForMetavariableSubstitution from "./substitution/statementForMetavariable";
4
+
5
+ import { prune, compare } 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) { this.array.push(substitution); }
35
+
36
+ removeSubstitution(substitution) {
37
+ const substitutionA = substitution; ///
38
+
39
+ prune(this.array, (substitution) => {
40
+ const substitutionB = substitution; ///
41
+
42
+ if (substitutionA !== substitutionB) {
43
+ return true;
44
+ }
45
+ });
46
+ }
47
+
48
+ snapshot() {
49
+ this.savedArray = [
50
+ ...this.array
51
+ ];
52
+ }
53
+
54
+ rollback() {
55
+ const start = 0,
56
+ end = Infinity;
57
+
58
+ this.array.splice(start, end, ...this.savedArray);
59
+
60
+ this.savedArray = null;
61
+ }
62
+
63
+ continue() {
64
+ this.savedArray = null;
65
+ }
66
+
67
+ transform() {
68
+ ///
69
+ }
70
+
71
+ toJSON(tokens) {
72
+ const json = this.array.map((substitution) => {
73
+ const substitutionJSON = substitution.toJSON(tokens);
74
+
75
+ return substitutionJSON;
76
+ });
77
+
78
+ return json;
79
+ }
80
+
81
+ static fromNothing() {
82
+ const array = [],
83
+ savedArray = null,
84
+ substitutions = new Substitutions(array, savedArray);
85
+
86
+ return substitutions;
87
+ }
88
+
89
+ static fromJSONAndFileContext(json, fileContext) {
90
+ const substitutionsJSON = json, ///
91
+ array = substitutionsJSON.map((substitutionJSON) => {
92
+ const json = substitutionJSON, ///
93
+ statementForMetavariableSubstitution = StatementForMetavariableSubstitution.fromJSONAndFileContext(json, fileContext),
94
+ substitution = statementForMetavariableSubstitution; ///
95
+
96
+ return substitution;
97
+ }),
98
+ savedArray = null,
99
+ substitutions = new Substitutions(array, savedArray);
100
+
101
+ return substitutions;
102
+ }
103
+ }
@@ -3,7 +3,7 @@
3
3
  import Label from "./label";
4
4
  import Consequent from "./consequent";
5
5
  import Supposition from "./supposition";
6
- import StatementForMetavariableSubstitution from "./substitution/statementForMetavariable";
6
+ import Substitutions from "./substitutions";
7
7
 
8
8
  import { reverse, correlate } from "./utilities/array";
9
9
 
@@ -40,7 +40,7 @@ export default class TopLevelAssertion {
40
40
  let statementUnified = false;
41
41
 
42
42
  const proofSteps = localContext.getProofSteps(),
43
- substitutions = [],
43
+ substitutions = Substitutions.fromNothing(),
44
44
  suppositionsUnified = unifySuppositions(this.suppositions, proofSteps, substitutions, this.fileContext, localContext);
45
45
 
46
46
  if (suppositionsUnified) {
@@ -76,11 +76,7 @@ export default class TopLevelAssertion {
76
76
  return suppositionJSON;
77
77
  }),
78
78
  consequentJSON = this.consequent.toJSON(tokens),
79
- substitutionsJSON = this.substitutions.map((substitution) => {
80
- const substitutionJSON = substitution.toJSON();
81
-
82
- return substitutionJSON;
83
- }),
79
+ substitutionsJSON = this.substitutions.toJSON(tokens),
84
80
  labels = labelsJSON, ///
85
81
  suppositions = suppositionsJSON, ///
86
82
  consequent = consequentJSON, ///
@@ -126,13 +122,9 @@ export default class TopLevelAssertion {
126
122
 
127
123
  const substitutionsJSON = substitutions; ///
128
124
 
129
- substitutions = substitutionsJSON.map((substitutionJSON) => {
130
- const json = substitutionJSON, ///
131
- statementForMetavariableSubstitution = StatementForMetavariableSubstitution.fromJSONAndFileContext(json, fileContext),
132
- substitution = statementForMetavariableSubstitution; ///
125
+ json = substitutionsJSON; ///
133
126
 
134
- return substitution;
135
- });
127
+ substitutions = Substitutions.fromJSONAndFileContext(json, fileContext);
136
128
 
137
129
  return new Class(labels, suppositions, consequent, substitutions, fileContext); ///
138
130
  }
@@ -159,6 +151,8 @@ function unifySuppositions(suppositions, proofSteps, substitutions, fileContext,
159
151
  function unifySupposition(supposition, proofStep, substitutions, fileContext, localContext) {
160
152
  let suppositionUnified = false;
161
153
 
154
+ substitutions.snapshot();
155
+
162
156
  const subproofNode = proofStep.getSubproofNode(),
163
157
  statementNode = proofStep.getStatementNode();
164
158
 
@@ -174,12 +168,25 @@ function unifySupposition(supposition, proofStep, substitutions, fileContext, lo
174
168
  suppositionUnified = statementUnified; ///
175
169
  }
176
170
 
171
+ suppositionUnified ?
172
+ substitutions.continue() :
173
+ substitutions.rollback();
174
+
177
175
  return suppositionUnified;
178
176
  }
179
177
 
180
178
  function unifyConsequent(consequent, statementNode, substitutions, fileContext, localContext) {
181
- const statementUnified = consequent.unifyStatement(statementNode, substitutions, fileContext, localContext),
182
- consequentUnified = statementUnified; ///
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();
183
190
 
184
191
  return consequentUnified;
185
192
  }
@@ -7,7 +7,7 @@ import StatementForMetavariableSubstitution from "../substitution/statementForMe
7
7
  export default function unifyMetavariableAgainstStatement(metavariableNodeA, statementNodeB, substitutionNodeA, substitutions, localContextA, localContextB, unifyAhead) {
8
8
  let metavariableUnifiedAgainstStatement = false;
9
9
 
10
- const substitution = substitutions.find((substitution) => {
10
+ const substitution = substitutions.findSubstitution((substitution) => {
11
11
  const substitutionMatchesMetavariableNodeA = substitution.matchMetavariableNode(metavariableNodeA);
12
12
 
13
13
  if (substitutionMatchesMetavariableNodeA) {
@@ -67,12 +67,12 @@ export default function unifyMetavariableAgainstStatement(metavariableNodeA, sta
67
67
  statementForMetavariableSubstitution = StatementForMetavariableSubstitution.fromMetavariableNodeStatementNodeAndSubstitutionNode(metavariableNode, statementNode, substitutionNode),
68
68
  substitution = statementForMetavariableSubstitution; ///
69
69
 
70
- substitutions.push(substitution);
70
+ substitutions.addSubstitution(substitution);
71
71
 
72
72
  unifiedAhead = unifyAhead();
73
73
 
74
74
  if (!unifiedAhead) {
75
- substitutions.pop();
75
+ substitutions.removeSubstitution(substitution);
76
76
  }
77
77
 
78
78
  metavariableUnifiedAgainstStatement = unifiedAhead; ///
@@ -11,7 +11,7 @@ const variableNodeQuery = nodeQuery("/term/variable");
11
11
  export default function unifyVariableAgainstTerm(variableNodeA, termNodeB, substitutions, localContextA, localContextB, verifyAhead) {
12
12
  let variableUnifiedAgainstTerm = false;
13
13
 
14
- const substitution = substitutions.find((substitution) => {
14
+ const substitution = substitutions.findSubstitution((substitution) => {
15
15
  const substitutionMatchesVariableNodeA = substitution.matchVariableNode(variableNodeA);
16
16
 
17
17
  if (substitutionMatchesVariableNodeA) {
@@ -54,12 +54,12 @@ export default function unifyVariableAgainstTerm(variableNodeA, termNodeB, subst
54
54
  termForVariableSubstitution = TermForVariableSubstitution.fromVariableNodeAndTermNode(variableNode, termNode),
55
55
  substitution = termForVariableSubstitution; ///
56
56
 
57
- substitutions.push(substitution);
57
+ substitutions.addSubstitution(substitution);
58
58
 
59
59
  verifiedAhead = verifyAhead();
60
60
 
61
61
  if (!verifiedAhead) {
62
- substitutions.pop();
62
+ substitutions.removeSubstitution(substitution);
63
63
  }
64
64
  }
65
65
  }
@@ -12,6 +12,21 @@ export function reverse(array) {
12
12
  return array;
13
13
  }
14
14
 
15
+ export function compare(arrayA, arrayB) {
16
+ let compares = false;
17
+
18
+ const arrayALength = arrayA.length,
19
+ arrayBLength = arrayB.length;
20
+
21
+ if (arrayALength === arrayBLength) {
22
+ const correlates = correlate(arrayA, arrayB);
23
+
24
+ compares = correlates; ///
25
+ }
26
+
27
+ return compares;
28
+ }
29
+
15
30
  export function correlate(arrayA, arrayB, callback) {
16
31
  arrayB = [ ///
17
32
  ...arrayB
@@ -3,6 +3,7 @@
3
3
  import Axiom from "../axiom";
4
4
  import LocalContext from "../context/local";
5
5
  import verifyLabels from "../verify/labels";
6
+ import Substitutions from "../substitutions";
6
7
  import verifyConsequent from "../verify/consequent";
7
8
  import verifySuppositions from "../verify/suppositions";
8
9
 
@@ -37,8 +38,8 @@ export default function verifyAxiom(axiomNode, fileContext) {
37
38
 
38
39
  if (consequentVerified) {
39
40
  const firstConsequent = first(consequents),
41
+ substitutions = Substitutions.fromNothing(),
40
42
  consequent = firstConsequent, ///
41
- substitutions = [],
42
43
  axiom = Axiom.fromLabelsSuppositionsConsequentSubstitutionsAndFileContext(labels, suppositions, consequent, substitutions, fileContext);
43
44
 
44
45
  fileContext.addAxiom(axiom);
@@ -4,6 +4,7 @@ import Conjecture from "../conjecture";
4
4
  import verifyProof from "../verify/proof";
5
5
  import verifyLabels from "../verify/labels";
6
6
  import LocalContext from "../context/local";
7
+ import Substitutions from "../substitutions";
7
8
  import verifyConsequent from "../verify/consequent";
8
9
  import verifySuppositions from "../verify/suppositions";
9
10
 
@@ -43,10 +44,12 @@ export default function verifyConjecture(conjectureNode, fileContext) {
43
44
  consequent = firstConsequent; ///
44
45
 
45
46
  if (proofNode !== null) {
46
- verifyProof(proofNode, consequent, localContext);
47
+ const substitutions = Substitutions.fromNothing();
48
+
49
+ verifyProof(proofNode, consequent, substitutions, localContext);
47
50
  }
48
51
 
49
- const substitutions = [],
52
+ const substitutions = Substitutions.fromNothing(),
50
53
  conjecture = Conjecture.fromLabelsSuppositionsConsequentSubstitutionsAndFileContext(labels, suppositions, consequent, substitutions, fileContext);
51
54
 
52
55
  fileContext.addConjecture(conjecture);
@@ -4,6 +4,7 @@ import Lemma from "../lemma";
4
4
  import verifyProof from "../verify/proof";
5
5
  import verifyLabels from "../verify/labels";
6
6
  import LocalContext from "../context/local";
7
+ import Substitutions from "../substitutions";
7
8
  import verifyConsequent from "../verify/consequent";
8
9
  import verifySuppositions from "../verify/suppositions";
9
10
 
@@ -45,11 +46,11 @@ export default function verifyLemma(lemmaNode, fileContext) {
45
46
  firstConsequent = first(consequents),
46
47
  consequent = firstConsequent, ///
47
48
  statementNode = consequent.getStatementNode(),
48
- substitutions = [],
49
+ substitutions = Substitutions.fromNothing(),
49
50
  proofVerified = verifyProof(proofNode, statementNode, substitutions, localContext);
50
51
 
51
52
  if (proofVerified) {
52
- const substitutions = [],
53
+ const substitutions = Substitutions.fromNothing(),
53
54
  lemma = Lemma.fromLabelsSuppositionsConsequentSubstitutionsAndFileContext(labels, suppositions, consequent, substitutions, fileContext);
54
55
 
55
56
  fileContext.addLemma(lemma);
@@ -4,6 +4,7 @@ import MetaLemma from "../metaLemma";
4
4
  import verifyProof from "../verify/proof";
5
5
  import LocalContext from "../context/local";
6
6
  import verifyLabels from "../verify/labels";
7
+ import Substitutions from "../substitutions";
7
8
  import verifyConsequent from "../verify/consequent";
8
9
  import verifySuppositions from "../verify/suppositions";
9
10
 
@@ -45,7 +46,7 @@ export default function verifyMetaLemma(metaLemmaNode, fileContext) {
45
46
  firstConsequent = first(consequents),
46
47
  consequent = firstConsequent, ///
47
48
  statementNode = consequent.getStatementNode(),
48
- substitutions = [],
49
+ substitutions = Substitutions.fromNothing(),
49
50
  proofVerified = verifyProof(proofNode, statementNode, substitutions, localContext);
50
51
 
51
52
  if (proofVerified) {
@@ -4,6 +4,7 @@ import verifyProof from "../verify/proof";
4
4
  import Metatheorem from "../metatheorem";
5
5
  import verifyLabels from "../verify/labels";
6
6
  import LocalContext from "../context/local";
7
+ import Substitutions from "../substitutions";
7
8
  import verifyConsequent from "../verify/consequent";
8
9
  import verifySuppositions from "../verify/suppositions";
9
10
 
@@ -41,7 +42,7 @@ export default function verifyMetatheorem(metatheoremNode, fileContext) {
41
42
  const proofNode = proofNodeQuery(metatheoremNode),
42
43
  firstConsequent = first(consequents),
43
44
  consequent = firstConsequent, ///
44
- substitutions = [],
45
+ substitutions = Substitutions.fromNothing(),
45
46
  statementNode = consequent.getStatementNode(),
46
47
  proofVerified = verifyProof(proofNode, statementNode, substitutions, localContext);
47
48
 
@@ -9,6 +9,7 @@ import verifyConclusion from "../verify/conclusion";
9
9
 
10
10
  import { first } from "../utilities/array";
11
11
  import { nodeQuery, nodesQuery } from "../utilities/query";
12
+ import Substitutions from "../substitutions";
12
13
 
13
14
  const proofNodeQuery = nodeQuery("/rule/proof!"),
14
15
  labelNodesQuery = nodesQuery("/rule/label"),
@@ -45,7 +46,7 @@ export default function verifyRule(ruleNode, fileContext) {
45
46
  conclusion = firstConclusion; ///
46
47
 
47
48
  if (proofNode !== null) {
48
- const substitutions = [],
49
+ const substitutions = Substitutions.fromNothing(),
49
50
  statementNode = conclusion.getStatementNode();
50
51
 
51
52
  proofVerified = verifyProof(proofNode, statementNode, substitutions, localContext);
@@ -4,6 +4,7 @@ import Theorem from "../theorem";
4
4
  import verifyProof from "../verify/proof";
5
5
  import verifyLabels from "../verify/labels";
6
6
  import LocalContext from "../context/local";
7
+ import Substitutions from "../substitutions";
7
8
  import verifyConsequent from "../verify/consequent";
8
9
  import verifySuppositions from "../verify/suppositions";
9
10
 
@@ -42,11 +43,11 @@ export default function verifyTheorem(theoremNode, fileContext) {
42
43
  firstConsequent = first(consequents),
43
44
  consequent = firstConsequent, ///
44
45
  statementNode = consequent.getStatementNode(),
45
- substitutions = [],
46
+ substitutions = Substitutions.fromNothing(),
46
47
  proofVerified = verifyProof(proofNode, statementNode, substitutions, localContext);
47
48
 
48
49
  if (proofVerified) {
49
- const substitutions = [],
50
+ const substitutions = Substitutions.fromNothing(),
50
51
  theorem = Theorem.fromLabelsSuppositionsConsequentSubstitutionsAndFileContext(labels, suppositions, consequent, substitutions, fileContext);
51
52
 
52
53
  fileContext.addTheorem(theorem);