occam-verify-cli 0.0.524 → 0.0.525

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/equality.js CHANGED
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
 
3
3
  import { nodeQuery } from "./utilities/query";
4
+ import { TERM_RULE_NAME } from "./ruleNames";
4
5
 
5
- const leftTermNodeQuery = nodeQuery("/statement/term[0]"),
6
- rightTermNodeQuery = nodeQuery("/statement/term[1]");
6
+ const leftTermNodeQuery = nodeQuery("/statement/argument[0]/term!"),
7
+ rightTermNodeQuery = nodeQuery("/statement/argument[1]/term!");
7
8
 
8
9
  export default class Equality {
9
10
  constructor(leftTermNode, rightTermNode) {
@@ -11,7 +12,7 @@ export default class Equality {
11
12
  this.rightTermNode = rightTermNode;
12
13
  }
13
14
 
14
- getLdftTermNode() {
15
+ getLeftTermNode() {
15
16
  return this.leftTermNode;
16
17
  }
17
18
 
@@ -19,8 +20,79 @@ export default class Equality {
19
20
  return this.rightTermNode;
20
21
  }
21
22
 
22
- assert(proofContext) {
23
- debugger
23
+ match(equality, equalities) {
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) {
47
+ let leftTermNodeAndRightTermNodeMatch = true;
48
+
49
+ if (leftTermNodeAndRightTermNodeMatch) {
50
+ const leftNonTerminalNode = reversed ?
51
+ this.rightTermNode :
52
+ this.leftTermNode, ///
53
+ rightNonTerminalNode = leftTermNode, ///
54
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities);
55
+
56
+ leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
57
+ }
58
+
59
+ if (leftTermNodeAndRightTermNodeMatch) {
60
+ const leftNonTerminalNode = reversed ?
61
+ this.leftTermNode :
62
+ this.rightTermNode, ///
63
+ rightNonTerminalNode = rightTermNode, ///
64
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities);
65
+
66
+ leftTermNodeAndRightTermNodeMatch = nonTerminalNodeEquates; ///
67
+ }
68
+
69
+ return leftTermNodeAndRightTermNodeMatch;
70
+ }
71
+
72
+ equate(equalities) {
73
+ const leftNonTerminalNode = this.leftTermNode, ///
74
+ rightNonTerminalNode = this.rightTermNode, ///
75
+ nonTerminalNodeEquates = equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities),
76
+ equates = nonTerminalNodeEquates; ///
77
+
78
+ return equates;
79
+ }
80
+
81
+ static fromProofStep(proofStep) {
82
+ let equality = null;
83
+
84
+ const statementNode = proofStep.getStatementNode();
85
+
86
+ if (statementNode !== null) {
87
+ const leftTermNode = leftTermNodeQuery(statementNode),
88
+ rightTermNode = rightTermNodeQuery(statementNode);
89
+
90
+ if ((leftTermNode !== null) && (rightTermNode !== null)) {
91
+ equality = new Equality(leftTermNode, rightTermNode);
92
+ }
93
+ }
94
+
95
+ return equality;
24
96
  }
25
97
 
26
98
  static fromStatementNode(statementNode) {
@@ -30,4 +102,129 @@ export default class Equality {
30
102
 
31
103
  return equality;
32
104
  }
105
+
106
+ static fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode) {
107
+ const equality = new Equality(leftTermNode, rightTermNode);
108
+
109
+ return equality;
110
+ }
111
+ }
112
+
113
+ function equateNode(nodeA, nodeB, equalities) {
114
+ let nodeEquates = false;
115
+
116
+ const nodeATerminalNode = nodeA.isTerminalNode(),
117
+ nodeBTerminalNode = nodeB.isTerminalNode();
118
+
119
+ if (nodeATerminalNode === nodeBTerminalNode) {
120
+ if (nodeATerminalNode) {
121
+ const terminalNodeA = nodeA, ///
122
+ terminalNodeB = nodeB, ///
123
+ terminalNodeEquates = equateTerminalNode(terminalNodeA, terminalNodeB, equalities);
124
+
125
+ nodeEquates = terminalNodeEquates; ///
126
+ } else {
127
+ const nonTerminalNodeA = nodeA, ///
128
+ nonTerminalNodeB = nodeB, ///
129
+ nonTerminalNodeEquates = equateNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, equalities);
130
+
131
+ nodeEquates = nonTerminalNodeEquates; ///
132
+ }
133
+ }
134
+
135
+ return nodeEquates;
136
+ }
137
+
138
+ function equateNodes(leftNodes, rightNodes, equalities) {
139
+ let nodesEquate = false;
140
+
141
+ const leftNodesLength = leftNodes.length,
142
+ rightNodesLength = rightNodes.length;
143
+
144
+ if (leftNodesLength === rightNodesLength) {
145
+ nodesEquate = leftNodes.every((LeftNode, index) => {
146
+ const rightNode = rightNodes[index],
147
+ nodeEquates = equateNode(LeftNode, rightNode, equalities);
148
+
149
+ if (nodeEquates) {
150
+ return true;
151
+ }
152
+ });
153
+ }
154
+
155
+ return nodesEquate;
156
+ }
157
+
158
+ function equateTerminalNode(terminalNodeA, terminalNodeB, equalities) {
159
+ const matches = terminalNodeA.match(terminalNodeB),
160
+ terminalNodeEquates = matches; ///
161
+
162
+ return terminalNodeEquates;
163
+ }
164
+
165
+ function equateNonTerminalNode(leftNonTerminalNode, rightNonTerminalNode, equalities) {
166
+ let nonTerminalNodeEquates = false;
167
+
168
+ const leftNonTerminalNodeRuleName = leftNonTerminalNode.getRuleName(),
169
+ rightNonTerminalNodeRuleName = rightNonTerminalNode.getRuleName();
170
+
171
+ if (leftNonTerminalNodeRuleName === rightNonTerminalNodeRuleName) {
172
+ const ruleName = leftNonTerminalNodeRuleName, ///
173
+ ruleNameTermRuleName = (ruleName === TERM_RULE_NAME);
174
+
175
+ if (ruleNameTermRuleName) {
176
+ const leftTermNode = leftNonTerminalNode, ///
177
+ rightTermNode = rightNonTerminalNode, ///
178
+ termNodeEquates = equateTermNode(leftTermNode, rightTermNode, equalities);
179
+
180
+ nonTerminalNodeEquates = termNodeEquates; ///
181
+ }
182
+
183
+ if (!nonTerminalNodeEquates) {
184
+ const leftNonTerminalNodeChildNodes = leftNonTerminalNode.getChildNodes(),
185
+ rightNonTerminalNodeChildNodes = rightNonTerminalNode.getChildNodes(),
186
+ leftNodes = leftNonTerminalNodeChildNodes, ///
187
+ rightNodes = rightNonTerminalNodeChildNodes, ///
188
+ nodesEquate = equateNodes(leftNodes, rightNodes, equalities);
189
+
190
+ nonTerminalNodeEquates = nodesEquate; ///
191
+ }
192
+ }
193
+
194
+ return nonTerminalNodeEquates;
195
+ }
196
+
197
+ function equateTermNode(leftTermNode, rightTermNode, equalities) {
198
+ const equality = Equality.fromLeftTermNodeAndRightTermNode(leftTermNode, rightTermNode),
199
+ equalityA = equality, ///
200
+ equalityMatches = equalities.some((equality) => { ///
201
+ let equalitiesB = equalities; ///
202
+
203
+ const equalityB = equality; ///
204
+
205
+ equalitiesB = filterEqualities(equalitiesB, equalityB); ///
206
+
207
+ const equalityAMatchesEqualityB = equalityA.match(equalityB, equalitiesB);
208
+
209
+ if (equalityAMatchesEqualityB) {
210
+ return true;
211
+ }
212
+ }),
213
+ termNodeEquates = equalityMatches; ///
214
+
215
+ return termNodeEquates;
216
+ }
217
+
218
+ function filterEqualities(equalities, equality) {
219
+ const equalityA = equality; ///
220
+
221
+ equalities = equalities.filter((equality) => {
222
+ const equalityB = equality; ///
223
+
224
+ if (equalityA !== equalityB) {
225
+ return true;
226
+ }
227
+ });
228
+
229
+ return equalities;
33
230
  }
@@ -107,8 +107,10 @@ function verifyChild(childNode, proofContext) {
107
107
  }
108
108
 
109
109
  case QUALIFIED_STATEMENT_RULE_NAME: {
110
- const qualifiedStatementNode = childNode, ///
111
- qualifiedStatementVerified = verifyQualifiedStatement(qualifiedStatementNode, proofContext);
110
+ const derived = true,
111
+ assertions = [],
112
+ qualifiedStatementNode = childNode, ///
113
+ qualifiedStatementVerified = verifyQualifiedStatement(qualifiedStatementNode, assertions, derived, proofContext);
112
114
 
113
115
  if (qualifiedStatementVerified) {
114
116
  const statementNode = statementNodeQuery(qualifiedStatementNode),
@@ -8,7 +8,7 @@ import { nodeQuery, referenceNameFromReferenceNode } from "../../utilities/query
8
8
  const referenceNodeQuery = nodeQuery("/qualifiedMetastatement/qualification!/reference!"),
9
9
  metastatementNodeQuery = nodeQuery("/qualifiedMetastatement/metastatement!");
10
10
 
11
- export default function verifyQualifiedMetastatement(qualifiedMetastatementNode, metaproofContext) {
11
+ export default function verifyQualifiedMetastatement(qualifiedMetastatementNode, assertions, derived, metaproofContext) {
12
12
  let qualifiedMetastatementVerified = false;
13
13
 
14
14
  metaproofContext.begin(qualifiedMetastatementNode);
@@ -20,7 +20,7 @@ export default function verifyQualifiedMetastatement(qualifiedMetastatementNode,
20
20
 
21
21
  metaproofContext.debug(`Verifying the ${metastatementString} qualified metastatement...`);
22
22
 
23
- let ruleMatchesStatement = true;
23
+ let ruleMatchesMetastatement = true;
24
24
 
25
25
  const referenceNode = referenceNodeQuery(qualifiedMetastatementNode);
26
26
 
@@ -29,15 +29,12 @@ export default function verifyQualifiedMetastatement(qualifiedMetastatementNode,
29
29
  rule = metaproofContext.findRuleByReferenceName(referenceName);
30
30
 
31
31
  if (rule !== null) {
32
- const ruleMatchesStatement = rule.matchMetastatement(metastatementNode, metaproofContext);
33
-
34
- qualifiedMetastatementVerified = ruleMatchesStatement; ///
32
+ ruleMatchesMetastatement = rule.matchMetastatement(metastatementNode, metaproofContext);
35
33
  }
36
34
  }
37
35
 
38
- if (ruleMatchesStatement) {
39
- const assertions = [],
40
- metastatementVerified = verifyMetastatement(metastatementNode, assertions, metaproofContext);
36
+ if (ruleMatchesMetastatement) {
37
+ const metastatementVerified = verifyMetastatement(metastatementNode, assertions, derived, metaproofContext);
41
38
 
42
39
  qualifiedMetastatementVerified = metastatementVerified; ///
43
40
  }
@@ -26,7 +26,7 @@ export default function verifyUnqualifiedMetastatement(unqualifiedMetastatementN
26
26
  }
27
27
 
28
28
  if (metastatementMatches) {
29
- const metastatementVerified = verifyMetastatement(metastatementNode, assertions, metaproofContext);
29
+ const metastatementVerified = verifyMetastatement(metastatementNode, assertions, derived, metaproofContext);
30
30
 
31
31
  unqualifiedMetastatementVerified = metastatementVerified; ///
32
32
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
 
3
- export default function verifyMetastatement(metastatementNode, assertions, metaproofContext) {
3
+ export default function verifyMetastatement(metastatementNode, assertions, derived, metaproofContext) {
4
4
  let metastatementVerified = true; ///
5
5
 
6
6
  metaproofContext.begin(metastatementNode);
@@ -107,8 +107,10 @@ function verifyChild(childNode, metaproofContext) {
107
107
  }
108
108
 
109
109
  case QUALIFIED_METASTATEMENT_RULE_NAME: {
110
- const qualifiedMetastatementNode = childNode, ///
111
- qualifiedMetastatementVerified = verifyQualifiedMetastatement(qualifiedMetastatementNode, metaproofContext);
110
+ const derived = true,
111
+ assertions = [],
112
+ qualifiedMetastatementNode = childNode, ///
113
+ qualifiedMetastatementVerified = verifyQualifiedMetastatement(qualifiedMetastatementNode, assertions, derived, metaproofContext);
112
114
 
113
115
  if (qualifiedMetastatementVerified) {
114
116
  const metastatementNode = metastatementNodeQuery(qualifiedMetastatementNode),
@@ -8,7 +8,7 @@ import { nodeQuery, referenceNameFromReferenceNode } from "../../utilities/query
8
8
  const referenceNodeQuery = nodeQuery("/qualifiedStatement/qualification!/reference!"),
9
9
  statementNodeQuery = nodeQuery("/qualifiedStatement/statement!");
10
10
 
11
- export default function verifyQualifiedStatement(qualifiedStatementNode, proofContext) {
11
+ export default function verifyQualifiedStatement(qualifiedStatementNode, assertions, derived, proofContext) {
12
12
  let qualifiedStatementVerified = false;
13
13
 
14
14
  proofContext.begin(qualifiedStatementNode);
@@ -34,8 +34,8 @@ export default function verifyQualifiedStatement(qualifiedStatementNode, proofCo
34
34
  }
35
35
 
36
36
  if (ruleMatchesStatement) {
37
- const assertions = [],
38
- statementVerified = verifyStatement(statementNode, assertions, proofContext);
37
+ const context = proofContext,
38
+ statementVerified = verifyStatement(statementNode, assertions, derived, context);
39
39
 
40
40
  qualifiedStatementVerified = statementVerified; ///
41
41
  }
@@ -26,7 +26,8 @@ export default function verifyUnqualifiedStatement(unqualifiedStatementNode, ass
26
26
  }
27
27
 
28
28
  if (statementMatches) {
29
- const statementVerified = verifyStatement(statementNode, assertions, proofContext);
29
+ const context = proofContext, ///
30
+ statementVerified = verifyStatement(statementNode, assertions, derived, context);
30
31
 
31
32
  unqualifiedStatementVerified = statementVerified; ///
32
33
  }
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ import Equality from "../equality";
3
4
  import verifyTerm from "../verify/term";
4
5
  import equalityCombinator from "../ocmbinator/equality";
5
6
  import bracketedCombinator from "../ocmbinator/bracketed";
@@ -10,6 +11,7 @@ import { objectType } from "../type";
10
11
  import { nodeAsString } from "../utilities/string";
11
12
  import { OBJECT_TYPE_NAME } from "../typeNames";
12
13
  import { STATEMENT_META_TYPE } from "../metaTypes";
14
+ import { MAXIMUM_INDEXES_LENGTH } from "../constants";
13
15
  import { nodeQuery, typeNameFromTypeNode } from "../utilities/query";
14
16
  import { ARGUMENT_RULE_NAME, META_ARGUMENT_RULE_NAME } from "../ruleNames";
15
17
 
@@ -19,56 +21,65 @@ const termNodeQuery = nodeQuery("/argument/term!"),
19
21
  statementNodeQuery = nodeQuery("/metaArgument/statement!"),
20
22
  typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!");
21
23
 
22
- export default function verifyStatement(statementNode, assertions, proofContext) {
24
+ export default function verifyStatement(statementNode, assertions, derived, context) {
23
25
  let statementVerified = false;
24
26
 
25
- proofContext.begin(statementNode);
27
+ context.begin(statementNode);
26
28
 
27
29
  if (!statementVerified) {
28
- const statementVerifiedAsEquality = verifyStatementAsEquality(statementNode, proofContext);
30
+ const statementVerifiedAsEquality = verifyStatementAsEquality(statementNode, derived, context);
29
31
 
30
32
  statementVerified = statementVerifiedAsEquality; //
31
33
  }
32
34
 
33
35
  if (!statementVerified) {
34
- const statementVerifiedAsTypeAssertion = verifyStatementAsTypeAssertion(statementNode, assertions, proofContext);
36
+ const statementVerifiedAsTypeAssertion = verifyStatementAsTypeAssertion(statementNode, assertions, context);
35
37
 
36
38
  statementVerified = statementVerifiedAsTypeAssertion; ///
37
39
  }
38
40
 
39
41
  if (!statementVerified) {
40
- const statementVerifiedAgainstCombinators = verifyStatementAgainstCombinators(statementNode, proofContext);
42
+ const statementVerifiedAgainstCombinators = verifyStatementAgainstCombinators(statementNode, context);
41
43
 
42
44
  statementVerified = statementVerifiedAgainstCombinators; ///
43
45
  }
44
46
 
45
47
  statementVerified ?
46
- proofContext.complete(statementNode) :
47
- proofContext.halt(statementNode);
48
+ context.complete(statementNode) :
49
+ context.halt(statementNode);
48
50
 
49
51
  return statementVerified;
50
52
  }
51
53
 
52
- function verifyStatementAsEquality(statementNode, proofContext) {
54
+ function verifyStatementAsEquality(statementNode, derived, context) {
53
55
  let statementVerifiedAsEquality = false;
54
56
 
55
57
  const combinator = equalityCombinator, ///
56
- statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, proofContext);
58
+ statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
57
59
 
58
60
  if (statementVerifiedAgainstCombinator) {
59
61
  statementVerifiedAsEquality = true;
62
+
63
+ if (derived) {
64
+ const equality = Equality.fromStatementNode(statementNode),
65
+ proofSteps = context.getProofSteps(),
66
+ equalities = equalitiesFromProofSteps(proofSteps),
67
+ equalityEquates = equality.equate(equalities);
68
+
69
+ statementVerifiedAsEquality = equalityEquates; ///
70
+ }
60
71
  }
61
72
 
62
73
  return statementVerifiedAsEquality;
63
74
  }
64
75
 
65
- function verifyStatementAsTypeAssertion(statementNode, assertions, proofContext) {
76
+ function verifyStatementAsTypeAssertion(statementNode, assertions, context) {
66
77
  let statementVerifiedAsTypeAssertion = false;
67
78
 
68
79
  const typeAssertionNode = typeAssertionNodeQuery(statementNode);
69
80
 
70
81
  if (typeAssertionNode !== null) {
71
- const typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assertions, proofContext);
82
+ const typeAssertionVerified = verifyTypeAssertion(typeAssertionNode, assertions, context);
72
83
 
73
84
  statementVerifiedAsTypeAssertion = typeAssertionVerified; ///
74
85
  }
@@ -76,10 +87,10 @@ function verifyStatementAsTypeAssertion(statementNode, assertions, proofContext)
76
87
  return statementVerifiedAsTypeAssertion;
77
88
  }
78
89
 
79
- function verifyStatementAgainstCombinators(statementNode, proofContext) {
90
+ function verifyStatementAgainstCombinators(statementNode, context) {
80
91
  let statementVerifiedAgainstCombinators = false;
81
92
 
82
- let combinators = proofContext.getCombinators();
93
+ let combinators = context.getCombinators();
83
94
 
84
95
  combinators = [ ///
85
96
  bracketedCombinator,
@@ -87,7 +98,7 @@ function verifyStatementAgainstCombinators(statementNode, proofContext) {
87
98
  ];
88
99
 
89
100
  const combinator = combinators.find((combinator) => {
90
- const statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, proofContext);
101
+ const statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
91
102
 
92
103
  if (statementVerifiedAgainstCombinator) {
93
104
  return true;
@@ -101,17 +112,17 @@ function verifyStatementAgainstCombinators(statementNode, proofContext) {
101
112
  return statementVerifiedAgainstCombinators;
102
113
  }
103
114
 
104
- function verifyStatementAgainstCombinator(statementNode, combinator, proofContext) {
115
+ function verifyStatementAgainstCombinator(statementNode, combinator, context) {
105
116
  const combinatorStatementNode = combinator.getStatementNode(),
106
117
  node = statementNode, ///
107
118
  combinatorNode = combinatorStatementNode, ///
108
- nodeVerified = verifyNode(node, combinatorNode, proofContext),
119
+ nodeVerified = verifyNode(node, combinatorNode, context),
109
120
  statementVerifiedAgainstCombinator = nodeVerified; ///
110
121
 
111
122
  return statementVerifiedAgainstCombinator;
112
123
  }
113
124
 
114
- function verifyNode(node, combinatorNode, proofContext) {
125
+ function verifyNode(node, combinatorNode, context) {
115
126
  let nodeVerified;
116
127
 
117
128
  const nodeTerminalNode = node.isTerminalNode(),
@@ -121,13 +132,13 @@ function verifyNode(node, combinatorNode, proofContext) {
121
132
  if (nodeTerminalNode) {
122
133
  const terminalNode = node, ///
123
134
  combinatorTerminalNode = combinatorNode, ///
124
- terminalNodeVerified = verifyTerminalNode(terminalNode, combinatorTerminalNode, proofContext);
135
+ terminalNodeVerified = verifyTerminalNode(terminalNode, combinatorTerminalNode, context);
125
136
 
126
137
  nodeVerified = terminalNodeVerified; ///
127
138
  } else {
128
139
  const nonTerminalNode = node, ///
129
140
  combinatorNonTerminalNode = combinatorNode, ///
130
- nonTerminalNodeVerified = verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode, proofContext);
141
+ nonTerminalNodeVerified = verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode, context);
131
142
 
132
143
  nodeVerified = nonTerminalNodeVerified; ///
133
144
  }
@@ -136,7 +147,7 @@ function verifyNode(node, combinatorNode, proofContext) {
136
147
  return nodeVerified;
137
148
  }
138
149
 
139
- function verifyNodes(nodes, combinatorNodes, proofContext) {
150
+ function verifyNodes(nodes, combinatorNodes, context) {
140
151
  let nodesVerified = false;
141
152
 
142
153
  const nodesLength = nodes.length,
@@ -145,7 +156,7 @@ function verifyNodes(nodes, combinatorNodes, proofContext) {
145
156
  if (nodesLength === combinatorNodesLength) {
146
157
  nodesVerified = nodes.every((node, index) => {
147
158
  const combinatorNode = combinatorNodes[index],
148
- nodeVerified = verifyNode(node, combinatorNode, proofContext);
159
+ nodeVerified = verifyNode(node, combinatorNode, context);
149
160
 
150
161
  if (nodeVerified) {
151
162
  return true;
@@ -156,7 +167,7 @@ function verifyNodes(nodes, combinatorNodes, proofContext) {
156
167
  return nodesVerified;
157
168
  }
158
169
 
159
- function verifyTerminalNode(terminalNode, combinatorTerminalNode, proofContext) {
170
+ function verifyTerminalNode(terminalNode, combinatorTerminalNode, context) {
160
171
  let terminalNodeVerified = false;
161
172
 
162
173
  const matches = terminalNode.match(combinatorTerminalNode);
@@ -168,7 +179,7 @@ function verifyTerminalNode(terminalNode, combinatorTerminalNode, proofContext)
168
179
  return terminalNodeVerified;
169
180
  }
170
181
 
171
- function verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode, proofContext) {
182
+ function verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode, context) {
172
183
  let nonTerminalNodeVerified = false;
173
184
 
174
185
  const ruleName = nonTerminalNode.getRuleName(), ///
@@ -179,7 +190,7 @@ function verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode, proof
179
190
  case ARGUMENT_RULE_NAME: {
180
191
  const argumentNode = nonTerminalNode, ///
181
192
  combinatorArgumentNode = combinatorNonTerminalNode, ///
182
- argumentNodeVerified = verifyArgumentNode(argumentNode, combinatorArgumentNode, proofContext);
193
+ argumentNodeVerified = verifyArgumentNode(argumentNode, combinatorArgumentNode, context);
183
194
 
184
195
  nonTerminalNodeVerified = argumentNodeVerified; ///
185
196
 
@@ -189,7 +200,7 @@ function verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode, proof
189
200
  case META_ARGUMENT_RULE_NAME: {
190
201
  const metaArgumentNode = nonTerminalNode, ///
191
202
  combinatorMetaargumentNode = combinatorNonTerminalNode, ///
192
- metaArgumentNodeVerified = verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, proofContext);
203
+ metaArgumentNodeVerified = verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, context);
193
204
 
194
205
  nonTerminalNodeVerified = metaArgumentNodeVerified; ///
195
206
 
@@ -201,7 +212,7 @@ function verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode, proof
201
212
  combinatorChildNodes = combinatorNonTerminalNode.getChildNodes(),
202
213
  nodes = childNodes, ///
203
214
  combinatorNodes = combinatorChildNodes, ///
204
- nodesVerified = verifyNodes(nodes, combinatorNodes, proofContext);
215
+ nodesVerified = verifyNodes(nodes, combinatorNodes, context);
205
216
 
206
217
  nonTerminalNodeVerified = nodesVerified; ///
207
218
 
@@ -213,7 +224,7 @@ function verifyNonTerminalNode(nonTerminalNode, combinatorNonTerminalNode, proof
213
224
  return nonTerminalNodeVerified;
214
225
  }
215
226
 
216
- function verifyArgumentNode(argumentNode, combinatorArgumentNode, proofContext) {
227
+ function verifyArgumentNode(argumentNode, combinatorArgumentNode, context) {
217
228
  let argumentNodeVerified = false;
218
229
 
219
230
  const termNode = termNodeQuery(argumentNode);
@@ -221,10 +232,9 @@ function verifyArgumentNode(argumentNode, combinatorArgumentNode, proofContext)
221
232
  if (termNode === null) {
222
233
  const argumentString = nodeAsString(argumentNode);
223
234
 
224
- proofContext.error(`The ${argumentString} argument should be a term, not a type`);
235
+ context.error(`The ${argumentString} argument should be a term, not a type`);
225
236
  } else {
226
237
  const types = [],
227
- context = proofContext, ///
228
238
  termVerified = verifyTerm(termNode, types, context);
229
239
 
230
240
  if (termVerified) {
@@ -234,7 +244,7 @@ function verifyArgumentNode(argumentNode, combinatorArgumentNode, proofContext)
234
244
  typeName = typeNameFromTypeNode(typeNode),
235
245
  type = (typeName === OBJECT_TYPE_NAME) ?
236
246
  objectType : ///
237
- proofContext.findTypeByTypeName(typeName),
247
+ context.findTypeByTypeName(typeName),
238
248
  statementTypeEqualToOrSubTypeOfType = termType.isEqualToOrSubTypeOf(type);
239
249
 
240
250
  if (statementTypeEqualToOrSubTypeOfType) {
@@ -246,7 +256,7 @@ function verifyArgumentNode(argumentNode, combinatorArgumentNode, proofContext)
246
256
  return argumentNodeVerified;
247
257
  }
248
258
 
249
- function verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, proofContext) {
259
+ function verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, context) {
250
260
  let metaArgumentNodeVerified = false;
251
261
 
252
262
  const statementNode = statementNodeQuery(metaArgumentNode);
@@ -254,10 +264,11 @@ function verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, pr
254
264
  if (statementNode === null) {
255
265
  const metaArgumentString = nodeAsString(metaArgumentNode);
256
266
 
257
- proofContext.error(`The '${metaArgumentString}' meta-argument should be a statement, not a meta-type.`);
267
+ context.error(`The '${metaArgumentString}' meta-argument should be a statement, not a meta-type.`);
258
268
  } else {
259
- const assertions = null,
260
- statementVerified = verifyStatement(statementNode, assertions, proofContext);
269
+ const derived = false,
270
+ assertions = null,
271
+ statementVerified = verifyStatement(statementNode, assertions, derived, context);
261
272
 
262
273
  if (statementVerified) {
263
274
  const combinatorMetaTYpeNode = metaTypeNodeQuery(combinatorMetaargumentNode);
@@ -273,10 +284,28 @@ function verifyMetaargumentNode(metaArgumentNode, combinatorMetaargumentNode, pr
273
284
  if (!metaArgumentNodeVerified) {
274
285
  const combinatorMetaargumentString = nodeAsString(combinatorMetaargumentNode);
275
286
 
276
- proofContext.error(`The '${combinatorMetaargumentString}' combinator meta-argument should be the 'Statement' meta-type.`);
287
+ context.error(`The '${combinatorMetaargumentString}' combinator meta-argument should be the 'Statement' meta-type.`);
277
288
  }
278
289
  }
279
290
  }
280
291
 
281
292
  return metaArgumentNodeVerified;
282
293
  }
294
+
295
+ function equalitiesFromProofSteps(proofSteps) {
296
+ const start = -MAXIMUM_INDEXES_LENGTH; ///
297
+
298
+ proofSteps = proofSteps.slice(start); ///
299
+
300
+ const equalities = proofSteps.reduce((equalities, proofStep, index) => {
301
+ const equality = Equality.fromProofStep(proofStep);
302
+
303
+ if (equality !== null) {
304
+ equalities.push(equality);
305
+ }
306
+
307
+ return equalities;
308
+ }, []);
309
+
310
+ return equalities;
311
+ }