occam-verify-cli 0.0.549 → 0.0.550

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.
@@ -1,12 +1,11 @@
1
1
  "use strict";
2
2
 
3
3
  import Verifier from "../verifier";
4
- import Variable from "../variable";
5
4
  import Equality from "../equality";
6
- import Assignment from "../assignment";
7
5
  import verifyTerm from "../verify/term";
8
6
  import equalityCombinator from "../ocmbinator/equality";
9
7
  import bracketedCombinator from "../ocmbinator/bracketed";
8
+ import verifyTypeInference from "../verify/typeInference";
10
9
  import verifyTypeAssertion from "../verify/assertion/type";
11
10
 
12
11
  import { objectType } from "../type";
@@ -21,6 +20,7 @@ const termNodeQuery = nodeQuery("/argument/term!"),
21
20
  typeNodeQuery = nodeQuery("/argument/type!"),
22
21
  metaTypeNodeQuery = nodeQuery("/metaArgument/metaType!"),
23
22
  statementNodeQuery = nodeQuery("/metaArgument/statement!"),
23
+ typeInferenceNodeQuery = nodeQuery("/statement/typeInference!"),
24
24
  typeAssertionNodeQuery = nodeQuery("/statement/typeAssertion!"),
25
25
  metaTypeTerminalNodeQuery = nodeQuery("/metaType/@meta-type");
26
26
 
@@ -33,6 +33,12 @@ export default function verifyStatement(statementNode, assignments, derived, con
33
33
  statementVerified = statementVerifiedAgainstCombinators; ///
34
34
  }
35
35
 
36
+ if (!statementVerified) {
37
+ const statementVerifiedAsTypeInference = verifyStatementAsTypeInference(statementNode, derived, context);
38
+
39
+ statementVerified = statementVerifiedAsTypeInference; ///
40
+ }
41
+
36
42
  if (!statementVerified) {
37
43
  const statementVerifiedAsTypeAssertion = verifyStatementAsTypeAssertion(statementNode, assignments, derived, context);
38
44
 
@@ -40,7 +46,7 @@ export default function verifyStatement(statementNode, assignments, derived, con
40
46
  }
41
47
 
42
48
  if (!statementVerified) {
43
- const statementVerifiedAsEquality = verifyStatementAsEquality(statementNode, assignments, derived, context);
49
+ const statementVerifiedAsEquality = verifyStatementAsEquality(statementNode, derived, context);
44
50
 
45
51
  statementVerified = statementVerifiedAsEquality; //
46
52
  }
@@ -163,7 +169,7 @@ class StatementVerifier extends Verifier {
163
169
 
164
170
  const statementVerifier = new StatementVerifier();
165
171
 
166
- function verifyStatementAgainstCombinators(statementNode, context) {
172
+ export function verifyStatementAgainstCombinators(statementNode, context) {
167
173
  let statementVerifiedAgainstCombinators = false;
168
174
 
169
175
  let combinators = context.getCombinators();
@@ -188,7 +194,7 @@ function verifyStatementAgainstCombinators(statementNode, context) {
188
194
  return statementVerifiedAgainstCombinators;
189
195
  }
190
196
 
191
- function verifyStatementAgainstCombinator(statementNode, combinator, context) {
197
+ export function verifyStatementAgainstCombinator(statementNode, combinator, context) {
192
198
  const combinatorStatementNode = combinator.getStatementNode(),
193
199
  nonTerminalNodeA = statementNode, ///
194
200
  nonTerminalNodeB = combinatorStatementNode, ///
@@ -198,6 +204,26 @@ function verifyStatementAgainstCombinator(statementNode, combinator, context) {
198
204
  return statementVerifiedAgainstCombinator;
199
205
  }
200
206
 
207
+ function verifyStatementAsTypeInference(statementNode, derived, context) {
208
+ let statementVerifiedAsTypeInference = false;
209
+
210
+ const typeInferenceNode = typeInferenceNodeQuery(statementNode);
211
+
212
+ if (typeInferenceNode !== null) {
213
+ if (!derived) {
214
+ const typeInferenceString = context.nodeAsString(typeInferenceNode);
215
+
216
+ context.error(`The '${typeInferenceString}' type inference can only be derived.`, typeInferenceNode);
217
+ } else {
218
+ const typeInferenceVerified = verifyTypeInference(typeInferenceNode, context);
219
+
220
+ statementVerifiedAsTypeInference = typeInferenceVerified; ///
221
+ }
222
+ }
223
+
224
+ return statementVerifiedAsTypeInference;
225
+ }
226
+
201
227
  function verifyStatementAsTypeAssertion(statementNode, assignments, derived, context) {
202
228
  let statementVerifiedAsTypeAssertion = false;
203
229
 
@@ -212,7 +238,7 @@ function verifyStatementAsTypeAssertion(statementNode, assignments, derived, con
212
238
  return statementVerifiedAsTypeAssertion;
213
239
  }
214
240
 
215
- function verifyStatementAsEquality(statementNode, assignments, derived, context) {
241
+ function verifyStatementAsEquality(statementNode, derived, context) {
216
242
  let statementVerifiedAsEquality = false;
217
243
 
218
244
  const combinator = equalityCombinator, ///
@@ -250,27 +276,6 @@ function verifyStatementAsEquality(statementNode, assignments, derived, context)
250
276
 
251
277
  context.error(`The left '${leftVariableName}' variable's '${leftVariableTypeName}' type is not equal to, a sub-type of or a super-type of the right '${rightVariableName}' variable's '${rightVariableTypeName}' type.`, statementNode);
252
278
  } else {
253
- const leftVariableTypeSuperTypeOfRightVariableType = leftVariableType.isSuperTypeOf(rightVariableType),
254
- rightVariableTypeSuperTypeOfLeftVariableType = rightVariableType.isSuperTypeOf(leftVariableType);
255
-
256
- if (leftVariableTypeSuperTypeOfRightVariableType) {
257
- const name = leftVariableName, ///
258
- type = rightVariableType, ///
259
- variable = Variable.fromNameAndType(name, type),
260
- assignment = Assignment.fromVariable(variable);
261
-
262
- assignments.push(assignment);
263
- }
264
-
265
- if (rightVariableTypeSuperTypeOfLeftVariableType) {
266
- const name = rightVariableName, ///
267
- type = leftVariableType, ///
268
- variable = Variable.fromNameAndType(name, type),
269
- assignment = Assignment.fromVariable(variable);
270
-
271
- assignments.push(assignment);
272
- }
273
-
274
279
  statementVerifiedAsEquality = true;
275
280
  }
276
281
  } else if (leftTermVerifiedAsVariable) {
@@ -293,13 +298,6 @@ function verifyStatementAsEquality(statementNode, assignments, derived, context)
293
298
 
294
299
  context.error(`The left '${leftVariableName}' variable's '${leftVariableTypeName}' type is not equal to or a super-type of the right '${rightTermString}' term's '${rightTermTypeName}' type.`, statementNode);
295
300
  } else {
296
- const name = leftVariableName, ///
297
- type = rightTermType, ///
298
- variable = Variable.fromNameAndType(name, type),
299
- assignment = Assignment.fromVariable(variable);
300
-
301
- assignments.push(assignment);
302
-
303
301
  statementVerifiedAsEquality = true;
304
302
  }
305
303
  } else if (rightTermVerifiedAsVariable) {
@@ -322,13 +320,6 @@ function verifyStatementAsEquality(statementNode, assignments, derived, context)
322
320
 
323
321
  context.error(`The right '${rightVariableName}' variable's '${rightVariableTypeName}' type is not equal to or a super-type of the left '${leftTermString}' term's '${leftTermTypeName}' type.`, statementNode);
324
322
  } else {
325
- const name = rightVariableName, ///
326
- type = leftTermType, ///
327
- variable = Variable.fromNameAndType(name, type),
328
- assignment = Assignment.fromVariable(variable);
329
-
330
- assignments.push(assignment);
331
-
332
323
  statementVerifiedAsEquality = true;
333
324
  }
334
325
  } else {
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+
3
+ import verifyTerm from "./term";
4
+ import equalityCombinator from "../ocmbinator/equality";
5
+
6
+ import { nodeQuery } from "../utilities/query";
7
+ import { first, second } from "../utilities/array";
8
+ import { verifyTermAsVariable } from "./term";
9
+ import { verifyVariableTypeAssertion } from "./assertion/type";
10
+ import { verifyStatementAgainstCombinator } from "../verify/statement";
11
+ import { bracketedStatementChildNodeFromStatementNode } from "../utilities/proof";
12
+
13
+ const leftTermNodeQuery = nodeQuery("/statement/argument[0]/term!"),
14
+ rightTermNodeQuery = nodeQuery("/statement/argument[1]/term!"),
15
+ statementNodeQuery = nodeQuery("/typeInference/statement!"),
16
+ typeAssertionNodeQuery = nodeQuery("/typeInference/typeAssertion!");
17
+
18
+ export default function verifyTypeInference(typeInferenceNode, context) {
19
+ let typeInferenceVerified = false;
20
+
21
+ const typeInferenceString = context.nodeAsString(typeInferenceNode);
22
+
23
+ context.debug(`Verifying the '${typeInferenceString}' type inference...`, typeInferenceNode);
24
+
25
+ let statementNode = statementNodeQuery(typeInferenceNode);
26
+
27
+ const bracketedStatementChildNode = bracketedStatementChildNodeFromStatementNode(statementNode);
28
+
29
+ if (bracketedStatementChildNode !== null) {
30
+ statementNode = bracketedStatementChildNode; ///
31
+ }
32
+
33
+ const statementString = context.nodeAsString(statementNode),
34
+ statementMatches = context.matchStatement(statementNode);
35
+
36
+ if (!statementMatches) {
37
+ context.error(`The '${statementString}' statement is not present in the context.`, typeInferenceNode);
38
+ } else {
39
+ const combinator = equalityCombinator, ///
40
+ statementVerifiedAgainstCombinator = verifyStatementAgainstCombinator(statementNode, combinator, context);
41
+
42
+ if (!statementVerifiedAgainstCombinator) {
43
+ context.error(`The '${statementString}' statement is not an equality.`, typeInferenceNode);
44
+ } else {
45
+ const derived = false, ///
46
+ assignments = [],
47
+ typeAssertionNode = typeAssertionNodeQuery(typeInferenceNode),
48
+ variableTypeAssertionVerified = verifyVariableTypeAssertion(typeAssertionNode, assignments, derived, context)
49
+
50
+ if (variableTypeAssertionVerified) {
51
+ const firstAssignment = first(assignments),
52
+ assignment = firstAssignment, ///
53
+ variables = [],
54
+ leftTermNode = leftTermNodeQuery(statementNode),
55
+ rightTermNode = rightTermNodeQuery(statementNode),
56
+ leftTermVerifiedAsVariable = verifyTermAsVariable(leftTermNode, variables, context),
57
+ rightTermVerifiedAsVariable = verifyTermAsVariable(rightTermNode, variables, context);
58
+
59
+ if (leftTermVerifiedAsVariable && rightTermVerifiedAsVariable) {
60
+ const firstVariable = first(variables),
61
+ secondVariable = second(variables),
62
+ leftVariable = firstVariable, ///
63
+ rightVariable = secondVariable, ///
64
+ leftVariableName = leftVariable.getName(),
65
+ leftVariableType = leftVariable.getType(),
66
+ rightVariableName = rightVariable.getName(),
67
+ rightVariableType = rightVariable.getType(),
68
+ leftVariableTypeEqualToOrSubTypeOfOfSuperTypeOfRightVariableType = leftVariableType.isEqualToOrSubTypeOfOfSuperTypeOf(rightVariableType);
69
+
70
+ if (leftVariableTypeEqualToOrSubTypeOfOfSuperTypeOfRightVariableType) {
71
+ const leftVariableTypeSuperTypeOfRightVariableType = leftVariableType.isSuperTypeOf(rightVariableType),
72
+ rightVariableTypeSuperTypeOfLeftVariableType = rightVariableType.isSuperTypeOf(leftVariableType);
73
+
74
+ if (leftVariableTypeSuperTypeOfRightVariableType) {
75
+ const name = leftVariableName, ///
76
+ type = rightVariableType; ///
77
+
78
+ assignAssignment(name, type, assignment, context);
79
+ }
80
+
81
+ if (rightVariableTypeSuperTypeOfLeftVariableType) {
82
+ const name = rightVariableName, ///
83
+ type = leftVariableType; ///
84
+
85
+ assignAssignment(name, type, assignment, context);
86
+ }
87
+ }
88
+ } else if (leftTermVerifiedAsVariable) {
89
+ const types = [];
90
+
91
+ verifyTerm(rightTermNode, types, context);
92
+
93
+ const firstType = first(types),
94
+ firstVariable = first(variables),
95
+ leftVariable = firstVariable, ///
96
+ rightTermType = firstType, ///
97
+ leftVariableName = leftVariable.getName(),
98
+ leftVariableType = leftVariable.getType(),
99
+ leftVariableTypeEqualToOrSuperTypeOfRightTermType = leftVariableType.isEqualToOrSuperTypeOf(rightTermType);
100
+
101
+ if (leftVariableTypeEqualToOrSuperTypeOfRightTermType) {
102
+ const name = leftVariableName, ///
103
+ type = rightTermType; ///
104
+
105
+ assignAssignment(name, type, assignment, context);
106
+ }
107
+ } else if (rightTermVerifiedAsVariable) {
108
+ const types = [];
109
+
110
+ verifyTerm(leftTermNode, types, context);
111
+
112
+ const firstType = first(types),
113
+ firstVariable = first(variables),
114
+ leftTermType = firstType, ///
115
+ rightVariable = firstVariable, ///
116
+ rightVariableName = rightVariable.getName(),
117
+ rightVariableType = rightVariable.getType(),
118
+ rightVariableTypeEqualToOrSuperTypeOfRightTermType = rightVariableType.isEqualToOrSuperTypeOf(leftTermType);
119
+
120
+ if (rightVariableTypeEqualToOrSuperTypeOfRightTermType) {
121
+ const name = rightVariableName, ///
122
+ type = leftTermType; ///
123
+
124
+ assignAssignment(name, type, assignment, context);
125
+ }
126
+ }
127
+
128
+ typeInferenceVerified = true;
129
+ }
130
+ }
131
+ }
132
+
133
+ if (typeInferenceVerified) {
134
+ context.info(`Verified the '${typeInferenceString}' type inference.`, typeInferenceNode);
135
+ }
136
+
137
+ return typeInferenceVerified;
138
+ }
139
+
140
+ function assignAssignment(name, type, assignment, context) {
141
+ const assignmentMatchesNameAndType = assignment.matchNameAndType(name, type);
142
+
143
+ if (assignmentMatchesNameAndType) {
144
+ assignment.assign(context);
145
+ }
146
+ }