occam-verify-cli 0.0.1036 → 0.0.1038

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.
Files changed (67) hide show
  1. package/lib/assertion/subproof.js +80 -49
  2. package/lib/assertion/type.js +5 -5
  3. package/lib/context/file.js +6 -20
  4. package/lib/context/release.js +24 -84
  5. package/lib/equality.js +5 -5
  6. package/lib/metavariable.js +92 -6
  7. package/lib/mixins/statement/verify.js +3 -3
  8. package/lib/premise.js +25 -34
  9. package/lib/ruleNames.js +5 -1
  10. package/lib/statement.js +17 -4
  11. package/lib/substitution/frameForMetavariable.js +4 -4
  12. package/lib/substitution/statement.js +139 -0
  13. package/lib/substitution/statementForMetavariable.js +39 -22
  14. package/lib/substitution/termForVariable.js +17 -16
  15. package/lib/supposition.js +48 -57
  16. package/lib/unifier/intrinsicLevel.js +4 -4
  17. package/lib/unifier/metaLevel.js +22 -20
  18. package/lib/unifier/statementWithCombinator.js +1 -2
  19. package/lib/utilities/node.js +15 -1
  20. package/lib/utilities/tokens.js +8 -1
  21. package/lib/variable.js +13 -6
  22. package/lib/verifier/intrinsicLevel.js +2 -2
  23. package/lib/verifier/metaLevel.js +2 -2
  24. package/lib/verify/assertion/subproof.js +1 -49
  25. package/package.json +1 -1
  26. package/src/assertion/subproof.js +102 -56
  27. package/src/assertion/type.js +4 -4
  28. package/src/context/file.js +2 -48
  29. package/src/context/release.js +27 -65
  30. package/src/equality.js +4 -4
  31. package/src/metavariable.js +115 -6
  32. package/src/mixins/statement/verify.js +3 -2
  33. package/src/premise.js +33 -47
  34. package/src/ruleNames.js +1 -0
  35. package/src/statement.js +21 -4
  36. package/src/substitution/frameForMetavariable.js +3 -2
  37. package/src/substitution/statement.js +52 -0
  38. package/src/substitution/statementForMetavariable.js +50 -22
  39. package/src/substitution/termForVariable.js +21 -19
  40. package/src/supposition.js +64 -78
  41. package/src/unifier/intrinsicLevel.js +6 -7
  42. package/src/unifier/metaLevel.js +33 -26
  43. package/src/unifier/statementWithCombinator.js +0 -1
  44. package/src/utilities/node.js +16 -0
  45. package/src/utilities/tokens.js +7 -0
  46. package/src/variable.js +12 -5
  47. package/src/verifier/intrinsicLevel.js +3 -3
  48. package/src/verifier/metaLevel.js +3 -3
  49. package/src/verify/assertion/subproof.js +0 -63
  50. package/lib/unify/conclusionWithStatement.js +0 -34
  51. package/lib/unify/consequentWithStatement.js +0 -34
  52. package/lib/unify/metavariableWithStatement.js +0 -40
  53. package/lib/unify/metavariableWithStatementGivenSubstitution.js +0 -40
  54. package/lib/unify/suppositionWithProffStep.js +0 -41
  55. package/lib/unify/suppositionsWithProofSteps.js +0 -31
  56. package/lib/unify/unqualifiedStatement.js +0 -25
  57. package/lib/verify/file.js +0 -35
  58. package/lib/verify/subDerivation.js +0 -31
  59. package/src/unify/conclusionWithStatement.js +0 -34
  60. package/src/unify/consequentWithStatement.js +0 -34
  61. package/src/unify/metavariableWithStatement.js +0 -40
  62. package/src/unify/metavariableWithStatementGivenSubstitution.js +0 -41
  63. package/src/unify/suppositionWithProffStep.js +0 -54
  64. package/src/unify/suppositionsWithProofSteps.js +0 -23
  65. package/src/unify/unqualifiedStatement.js +0 -24
  66. package/src/verify/file.js +0 -29
  67. package/src/verify/subDerivation.js +0 -24
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ import Substitution from "../substitution";
4
+
5
+ import { nodeQuery } from "../utilities/query";
6
+ import { substitutionNodeFromSubstitutionString } from "../utilities/node";
7
+
8
+ const substitutionNodeQuery = nodeQuery("/statement/substitution");
9
+
10
+ export default class StatementSubstitution extends Substitution {
11
+ constructor(string, node) {
12
+ super(string);
13
+
14
+ this.node = node;
15
+ }
16
+
17
+ getNode() {
18
+ return this.node;
19
+ }
20
+
21
+ static fromJSON(json, fileContext) {
22
+ let statementSubstitution = null;
23
+
24
+ if (json !== null) {
25
+ const { string } = json,
26
+ lexer = fileContext.getLexer(),
27
+ parser = fileContext.getParser(),
28
+ substitutionString = string, ///
29
+ substitutionNode = substitutionNodeFromSubstitutionString(substitutionString, lexer, parser),
30
+ node = substitutionNode;
31
+
32
+ statementSubstitution = new Substitution(string, node);
33
+ }
34
+
35
+ return statementSubstitution;
36
+ }
37
+
38
+ static fromStatementNode(statementNode, fileContext) {
39
+ let statementSubstitution = null;
40
+
41
+ const substitutionNode = substitutionNodeQuery(statementNode);
42
+
43
+ if (substitutionNode) {
44
+ const node = substitutionNode,
45
+ string = fileContext.nodeAsString(substitutionNode);
46
+
47
+ statementSubstitution = new Substitution(string, node);
48
+ }
49
+
50
+ return statementSubstitution;
51
+ }
52
+ }
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
 
3
+ import shim from "../shim";
3
4
  import Substitution from "../substitution";
4
5
  import TermForVariableSubstitution from "../substitution/termForVariable";
5
6
  import FrameForMetavariableSubstitution from "../substitution/frameForMetavariable";
@@ -53,50 +54,77 @@ export default class StatementForMetavariableSubstitution extends Substitution {
53
54
  return metavariableNodeMatches;
54
55
  }
55
56
 
56
- static fromStatementNodeAndMetavariableNode(statementNode, metavariableNode, localContextA, localContextB) {
57
+ static fromStatementAndMetavariable(statement, metavariable, localContext) {
58
+ let statementNode = statement.getNode();
59
+
57
60
  statementNode = stripBracketsFromStatement(statementNode); ///
58
61
 
59
- const substitution = null,
60
- string = stringFromStatementNodeMetavariableNodeAndSubstitution(statementNode, metavariableNode, substitution, localContextA, localContextB),
62
+ const { Statement } = shim;
63
+
64
+ statement = Statement.fromStatementNode(statementNode, localContext); ///
65
+
66
+ const string = stringFromStatementAndMetavariable(statement, metavariable),
67
+ substitution = null,
68
+ metavariableNode = metavariable.getNode(),
61
69
  statementForMetavariableSubstitution = new StatementForMetavariableSubstitution(string, statementNode, metavariableNode, substitution);
62
70
 
63
71
  return statementForMetavariableSubstitution;
64
72
  }
65
73
 
66
- static fromStatementNodeMetavariableNodeAndSubstitutionNode(statementNode, metavariableNode, substitutionNode, localContextA, localContextB) {
74
+ static fromStatementMetavariableAndSubstitution(statement, metavariable, substitution, localContext) {
75
+ let statementNode = statement.getNode();
76
+
67
77
  statementNode = stripBracketsFromStatement(statementNode); ///
68
78
 
69
- const substitution = substitutionFromSubstitutionNode(substitutionNode, localContextA, localContextB),
70
- string = stringFromStatementNodeMetavariableNodeAndSubstitution(statementNode, metavariableNode, substitution, localContextA, localContextB),
71
- statementForMetavariableSubstitution = new StatementForMetavariableSubstitution(string, statementNode, metavariableNode, substitution);
79
+ const { Statement } = shim;
80
+
81
+ statement = Statement.fromStatementNode(statementNode, localContext); ///
82
+
83
+ const metavariableNode = metavariable.getNode(),
84
+ string = stringFromStatementMetavariableAndSubstitution(statement, metavariable, substitution, localContext);
85
+
86
+ substitution = substitutionFromSubstitution(substitution, localContext);
87
+
88
+ const statementForMetavariableSubstitution = new StatementForMetavariableSubstitution(string, statementNode, metavariableNode, substitution);
72
89
 
73
90
  return statementForMetavariableSubstitution;
74
91
  }
75
92
  }
76
93
 
77
- function substitutionFromSubstitutionNode(substitutionNode, localContextA, localContextB) {
78
- let substitution = null;
94
+ function stringFromStatementAndMetavariable(statement, metavariable) {
95
+ const statementString = statement.getString(),
96
+ metavariableString = metavariable.getString(),
97
+ string = `[${statementString} for ${metavariableString}]`;
79
98
 
80
- if (substitution === null) {
81
- const termForVariableSubstitution = TermForVariableSubstitution.fromSubstitutionNode(substitutionNode, localContextA, localContextB);
99
+ return string;
100
+ }
82
101
 
83
- if (termForVariableSubstitution !== null) {
84
- substitution = termForVariableSubstitution; ///
85
- }
86
- }
87
102
 
88
- if (substitution === null) {
89
- const frameForMetavariableSubstitution = FrameForMetavariableSubstitution.fromSubstitutionNode(substitutionNode, localContextA, localContextB);
103
+ function substitutionFromSubstitution(substitution, localContextA, localContextB) {
104
+ // let substitution = null;
90
105
 
91
- if (frameForMetavariableSubstitution !== null) {
92
- substitution = frameForMetavariableSubstitution; ///
93
- }
94
- }
106
+ debugger
107
+
108
+ // if (substitution === null) {
109
+ // const termForVariableSubstitution = TermForVariableSubstitution.fromSubstitution(substitutionNode, localContextA, localContextB);
110
+ //
111
+ // if (termForVariableSubstitution !== null) {
112
+ // substitution = termForVariableSubstitution; ///
113
+ // }
114
+ // }
115
+ //
116
+ // if (substitution === null) {
117
+ // const frameForMetavariableSubstitution = FrameForMetavariableSubstitution.fromSubstitution(substitutionNode, localContextA, localContextB);
118
+ //
119
+ // if (frameForMetavariableSubstitution !== null) {
120
+ // substitution = frameForMetavariableSubstitution; ///
121
+ // }
122
+ // }
95
123
 
96
124
  return substitution;
97
125
  }
98
126
 
99
- function stringFromStatementNodeMetavariableNodeAndSubstitution(statementNode, metavariableNode, substitution, localContextA, localContextB) {
127
+ function stringFromStatementMetavariableAndSubstitution(statementNode, metavariableNode, substitution, localContextA, localContextB) {
100
128
  let string;
101
129
 
102
130
  const statementNodeB = statementNode, ///
@@ -7,7 +7,7 @@ import { nodeQuery } from "../utilities/query";
7
7
  import { stripBracketsFromTerm } from "../utilities/brackets";
8
8
 
9
9
  const termVariableNodeQuery = nodeQuery("/term/variable!"),
10
- substitutionTermmNodeQuery = nodeQuery("/substitution/term!"),
10
+ substitutionTermNodeQuery = nodeQuery("/substitution/term!"),
11
11
  substitutionsVariableNodeQuery = nodeQuery("/substitution/variable!");
12
12
 
13
13
  export default class TermForVariableSubstitution extends Substitution {
@@ -83,26 +83,12 @@ export default class TermForVariableSubstitution extends Substitution {
83
83
  return unifiedWithEquivalence;
84
84
  }
85
85
 
86
- static fromTernAndVariable(term, variable, localContext) {
87
- let termNode = term.getNode();
88
-
89
- termNode = stripBracketsFromTerm(termNode); ///
90
-
91
- const { Term } = shim;
92
-
93
- term = Term.fromTermNode(termNode, localContext)
94
-
95
- const string = stringFromTermAndVariable(term, variable),
96
- variableNode = variable.getNode(),
97
- termForVariableSubstitution = new TermForVariableSubstitution(string, termNode, variableNode);
98
-
99
- return termForVariableSubstitution;
100
- }
101
-
102
- static fromSubstitutionNode(substitutionNode) {
86
+ static fromSubstitution(substitution) {
103
87
  let termForVariableSubstitution = null;
104
88
 
105
- let substitutionTermNode = substitutionTermmNodeQuery(substitutionNode);
89
+ const substitutionNode = substitution.getNode();
90
+
91
+ let substitutionTermNode = substitutionTermNodeQuery(substitutionNode);
106
92
 
107
93
  if (substitutionTermNode !== null) {
108
94
  let termNode = substitutionTermNode; ///
@@ -117,6 +103,22 @@ export default class TermForVariableSubstitution extends Substitution {
117
103
 
118
104
  return termForVariableSubstitution;
119
105
  }
106
+
107
+ static fromTernAndVariable(term, variable, localContext) {
108
+ let termNode = term.getNode();
109
+
110
+ termNode = stripBracketsFromTerm(termNode); ///
111
+
112
+ const { Term } = shim;
113
+
114
+ term = Term.fromTermNode(termNode, localContext); ///
115
+
116
+ const string = stringFromTermAndVariable(term, variable),
117
+ variableNode = variable.getNode(),
118
+ termForVariableSubstitution = new TermForVariableSubstitution(string, termNode, variableNode);
119
+
120
+ return termForVariableSubstitution;
121
+ }
120
122
  }
121
123
 
122
124
  function transformTermNode(termNode, substitutions) {
@@ -12,9 +12,8 @@ import { assignAssignments } from "./utilities/assignments";
12
12
  const unqualifiedStatementNodeQuery = nodeQuery("/supposition/unqualifiedStatement");
13
13
 
14
14
  export default class Supposition {
15
- constructor(fileContext, subproofAssertion, unqualifiedStatement) {
15
+ constructor(fileContext, unqualifiedStatement) {
16
16
  this.fileContext = fileContext;
17
- this.subproofAssertion = subproofAssertion;
18
17
  this.unqualifiedStatement = unqualifiedStatement;
19
18
  }
20
19
 
@@ -22,10 +21,6 @@ export default class Supposition {
22
21
  return this.fileContext;
23
22
  }
24
23
 
25
- getSubproofAssertion() {
26
- return this.subproofAssertion;
27
- }
28
-
29
24
  getUnqualifiedStatement() {
30
25
  return this.unqualifiedStatement;
31
26
  }
@@ -34,6 +29,65 @@ export default class Supposition {
34
29
 
35
30
  getStatement() { return this.unqualifiedStatement.getStatement(); }
36
31
 
32
+ verify(localContext) {
33
+ let verified = false;
34
+
35
+ const suppositionString = this.getString(); ///
36
+
37
+ if (this.unqualifiedStatement !== null) {
38
+ localContext.trace(`Verifying the '${suppositionString}' supposition...`);
39
+
40
+ const stated = true,
41
+ assignments = [],
42
+ unqualifiedStatementVerified = this.unqualifiedStatement.verify(assignments, stated, localContext);
43
+
44
+ if (unqualifiedStatementVerified) {
45
+ const assignmentsAssigned = assignAssignments(assignments, localContext);
46
+
47
+ if (assignmentsAssigned) {
48
+ const { ProofStep } = shim,
49
+ proofStep = ProofStep.fromUnqualifiedStatement(this.unqualifiedStatement);
50
+
51
+ localContext.addProofStep(proofStep);
52
+
53
+ verified = true;
54
+ }
55
+ }
56
+
57
+ if (verified) {
58
+ localContext.debug(`...verified the '${suppositionString}' supposition.`);
59
+ }
60
+ } else {
61
+ localContext.debug(`The '${suppositionString}' supposition cannot be verified because it is nonsense.`);
62
+ }
63
+
64
+ return verified;
65
+ }
66
+
67
+ unifySubproof(subproof, substitutions, localContext) {
68
+ let subproofUnified = false;
69
+
70
+ const supposition = this, ///
71
+ subproofString = subproof.getString(),
72
+ suppositionStatement = supposition.getStatement(),
73
+ suppositionStatementString = suppositionStatement.getString();
74
+
75
+ localContext.trace(`Unifying the '${subproofString}' subproof with the supposition's '${suppositionStatementString}' statement...`);
76
+
77
+ const statement = this.unqualifiedStatement.getStatement(),
78
+ subproofAssertion = SubproofAssertion.fromStatement(statement, this.fileContext);
79
+
80
+ if (subproofAssertion !== null) {
81
+ subproofUnified = subproofAssertion.unifySubproof(subproof, substitutions, this.fileContext, localContext);
82
+ }
83
+
84
+ if (subproofUnified) {
85
+ localContext.debug(`...unified the '${subproofString}' subproof with the supposition's '${suppositionStatementString}' statement.`);
86
+ }
87
+
88
+ return subproofUnified;
89
+ }
90
+
37
91
  unifyProofStep(proofStep, substitutions, localContext) {
38
92
  let proofStepUnified = false;
39
93
 
@@ -85,91 +139,24 @@ export default class Supposition {
85
139
  return statementUnified;
86
140
  }
87
141
 
88
- unifySubproof(subproof, substitutions, localContext) {
89
- let subproofUnified = false;
90
-
91
- const supposition = this, ///
92
- subproofString = subproof.getString(),
93
- suppositionStatement = supposition.getStatement(),
94
- suppositionStatementString = suppositionStatement.getString();
95
-
96
- localContext.trace(`Unifying the '${subproofString}' subproof with the supposition's '${suppositionStatementString}' statement...`);
97
-
98
- if (this.subproofAssertion !== null) {
99
- subproofUnified = this.subproofAssertion.unifySubproof(subproof, substitutions, localContext);
100
- }
101
-
102
- if (subproofUnified) {
103
- localContext.debug(`...unified the '${subproofString}' subproof with the supposition's '${suppositionStatementString}' statement.`);
104
- }
105
-
106
- return subproofUnified;
107
- }
108
-
109
- verify(localContext) {
110
- let verified = false;
111
-
112
- const suppositionString = this.getString(); ///
113
-
114
- if (this.unqualifiedStatement !== null) {
115
- localContext.trace(`Verifying the '${suppositionString}' supposition...`);
116
-
117
- const stated = true,
118
- assignments = [],
119
- unqualifiedStatementVerified = this.unqualifiedStatement.verify(assignments, stated, localContext);
120
-
121
- if (unqualifiedStatementVerified) {
122
- const assignmentsAssigned = assignAssignments(assignments, localContext);
123
-
124
- if (assignmentsAssigned) {
125
- const { ProofStep } = shim,
126
- proofStep = ProofStep.fromUnqualifiedStatement(this.unqualifiedStatement);
127
-
128
- localContext.addProofStep(proofStep);
129
-
130
- verified = true;
131
- }
132
- }
133
-
134
- if (verified) {
135
- localContext.debug(`...verified the '${suppositionString}' supposition.`);
136
- }
137
- } else {
138
- localContext.debug(`The '${suppositionString}' supposition cannot be verified because it is nonsense.`);
139
- }
140
-
141
- return verified;
142
- }
143
-
144
142
  toJSON() {
145
143
  const unqualifiedStatementJSON = this.unqualifiedStatement.toJSON(),
146
- subproofAssertionJSON = (this.subproofAssertion !== null) ?
147
- this.subproofAssertion.toJSON() :
148
- null,
149
144
  unqualifiedStatement = unqualifiedStatementJSON, ///
150
- subproofAssertion = subproofAssertionJSON, ///
151
145
  json = {
152
- unqualifiedStatement,
153
- subproofAssertion
146
+ unqualifiedStatement
154
147
  };
155
148
 
156
149
  return json;
157
150
  }
158
151
 
159
152
  static fromJSON(json, fileContext) {
160
- let { subproofAssertion, unqualifiedStatement } = json;
153
+ let { unqualifiedStatement } = json;
161
154
 
162
155
  json = unqualifiedStatement; ///
163
156
 
164
157
  unqualifiedStatement = UnqualifiedStatement.fromJSON(json, fileContext);
165
158
 
166
- json = subproofAssertion; ///
167
-
168
- subproofAssertion = (json !== null) ?
169
- SubproofAssertion.fromJSON(json, fileContext) :
170
- null;
171
-
172
- const supposition = new Supposition(fileContext, subproofAssertion, unqualifiedStatement);
159
+ const supposition = new Supposition(fileContext, unqualifiedStatement);
173
160
 
174
161
  return supposition;
175
162
  }
@@ -177,8 +164,7 @@ export default class Supposition {
177
164
  static fromSuppositionNode(suppositionNode, fileContext) {
178
165
  const unqualifiedStatementNode = unqualifiedStatementNodeQuery(suppositionNode),
179
166
  unqualifiedStatement = UnqualifiedStatement.fromUnqualifiedStatementNode(unqualifiedStatementNode, fileContext),
180
- subproofAssertion = SubproofAssertion.fromUnqualifiedStatementNode(unqualifiedStatementNode, fileContext),
181
- supposition = new Supposition(fileContext, subproofAssertion, unqualifiedStatement);
167
+ supposition = new Supposition(fileContext, unqualifiedStatement);
182
168
 
183
169
  return supposition
184
170
  }
@@ -29,16 +29,15 @@ class IntrinsicLevelUnifier extends Unifier {
29
29
  unify: (termVariableNodeA, termNodeB, substitutions, localContextA, localContextB) => {
30
30
  let termUnified = false;
31
31
 
32
- const variableNodeA = termVariableNodeA, ///
33
- variableNameA = variableNameFromVariableNode(variableNodeA),
34
- variableA = localContextA.findVariableByVariableName(variableNameA);
32
+ const variableNode = termVariableNodeA, ///
33
+ variableName = variableNameFromVariableNode(variableNode),
34
+ variable = localContextA.findVariableByVariableName(variableName);
35
35
 
36
- if (variableA !== null) {
36
+ if (variable !== null) {
37
37
  const { Term } = shim,
38
- termB = Term.fromTermNode(termNodeB, localContextB),
39
38
  localContext = localContextB, ///
40
- variable = variableA, ///
41
- term = termB; ///
39
+ termNode = termNodeB, ///
40
+ term = Term.fromTermNode(termNode, localContextB);
42
41
 
43
42
  termUnified = variable.unifyTerm(term, substitutions, localContext);
44
43
  }
@@ -3,18 +3,15 @@
3
3
  import shim from "../shim";
4
4
  import Unifier from "../unifier";
5
5
  import unifyMetavariableWithFrame from "../unify/metavariableWithFrame";
6
- import unifyMetavariableWithStatement from "../unify/metavariableWithStatement";
7
- import unifyMetavariableWithStatementGivenSubstitution from "../unify/metavariableWithStatementGivenSubstitution";
8
6
 
9
7
  import { nodeQuery } from "../utilities/query";
10
- import { variableNameFromVariableNode } from "../utilities/name";
8
+ import { variableNameFromVariableNode, metavariableNameFromMetavariableNode } from "../utilities/name";
11
9
 
12
10
  const termNodeQuery = nodeQuery("/term!"),
13
11
  frameNodeQuery = nodeQuery("/frame!"),
14
12
  statementNodeQuery = nodeQuery("/statement!"),
15
13
  termVariableNodeQuery = nodeQuery("/term/variable!"),
16
14
  frameMetavariableNodeQuery = nodeQuery("/frame/metavariable!"),
17
- statementSubstitutionNodeQuery = nodeQuery("/statement/substitution!"),
18
15
  statementMetavariableNodeQuery = nodeQuery("/statement/metavariable!");
19
16
 
20
17
  class MetaLevelUnifier extends Unifier {
@@ -35,35 +32,46 @@ class MetaLevelUnifier extends Unifier {
35
32
  nodeQueryA: statementNodeQuery,
36
33
  nodeQueryB: statementNodeQuery,
37
34
  unify: (statementNodeA, statementNodeB, substitutions, localContextA, localContextB) => {
38
- let statementUnifiedWithStatement;
35
+ let statementUnified;
39
36
 
40
37
  const matches = statementNodeA.match(statementNodeB);
41
38
 
42
39
  if (matches) {
43
- statementUnifiedWithStatement = true;
40
+ statementUnified = true;
44
41
  } else {
45
- const statementMetavariableNodeA = statementMetavariableNodeQuery(statementNodeA);
42
+ const { Statement } = shim,
43
+ statementB = Statement.fromStatementNode(statementNodeB, localContextB),
44
+ statementMetavariableNodeA = statementMetavariableNodeQuery(statementNodeA);
46
45
 
47
46
  if (statementMetavariableNodeA !== null) {
48
- const metavariableNodeA = statementMetavariableNodeA, ///
49
- statementSubstitutionNodeA = statementSubstitutionNodeQuery(statementNodeA);
47
+ let statement;
50
48
 
51
- if (statementSubstitutionNodeA === null) {
52
- const metavariableUnifiedWithStatement = unifyMetavariableWithStatement(metavariableNodeA, statementNodeB, substitutions, localContextA, localContextB);
49
+ const statementA = Statement.fromStatementNode(statementNodeA, localContextA);
53
50
 
54
- statementUnifiedWithStatement = metavariableUnifiedWithStatement; ///
51
+ statement = statementA; ///
52
+
53
+ const substitution = statement.getSubstitution();
54
+
55
+ statement = statementB; ///
56
+
57
+ const localContext = localContextB, ///
58
+ metavariableNode = statementMetavariableNodeA, ///
59
+ metavariableName = metavariableNameFromMetavariableNode(metavariableNode),
60
+ metavariable = localContextA.findMetavariableByMetavariableName(metavariableName);
61
+
62
+ if (substitution === null) {
63
+ statementUnified = metavariable.unifyStatement(statement, substitutions, localContext);
55
64
  } else {
56
- const substitutionNodeA = statementSubstitutionNodeA, ///
57
- metavariableUnifiedWithStatementGivenSubstitution = unifyMetavariableWithStatementGivenSubstitution(metavariableNodeA, statementNodeB, substitutionNodeA, substitutions, localContextA, localContextB);
65
+ const statementUnifiedGivenSubstitution = metavariableNode.unifyStatementGivenSubstitution(statement, substitution, substitutions, localContext);
58
66
 
59
- statementUnifiedWithStatement = metavariableUnifiedWithStatementGivenSubstitution; ///
67
+ statementUnified = statementUnifiedGivenSubstitution; ///
60
68
  }
61
69
  } else {
62
- statementUnifiedWithStatement = unifyStatementWithStatement(statementNodeA, statementNodeB, substitutions, localContextA, localContextB);
70
+ statementUnified = unifyStatementWithStatement(statementNodeA, statementNodeB, substitutions, localContextA, localContextB);
63
71
  }
64
72
  }
65
73
 
66
- return statementUnifiedWithStatement;
74
+ return statementUnified;
67
75
  }
68
76
  },
69
77
  {
@@ -84,16 +92,15 @@ class MetaLevelUnifier extends Unifier {
84
92
  unify: (termVariableNodeA, termNodeB, substitutions, localContextA, localContextB) => {
85
93
  let termUnified = false;
86
94
 
87
- const variableNodeA = termVariableNodeA, ///
88
- variableNameA = variableNameFromVariableNode(variableNodeA),
89
- variableA = localContextA.findVariableByVariableName(variableNameA);
95
+ const variableNode = termVariableNodeA, ///
96
+ variableName = variableNameFromVariableNode(variableNode),
97
+ variable = localContextA.findVariableByVariableName(variableName);
90
98
 
91
- if (variableA !== null) {
99
+ if (variable !== null) {
92
100
  const { Term } = shim,
93
- termB = Term.fromTermNode(termNodeB, localContextB),
94
101
  localContext = localContextB, ///
95
- variable = variableA, ///
96
- term = termB; ///
102
+ termNode = termNodeB, ///
103
+ term = Term.fromTermNode(termNode, localContextB);
97
104
 
98
105
  termUnified = variable.unifyTerm(term, substitutions, localContext);
99
106
  }
@@ -116,7 +123,7 @@ function unifyStatementWithStatement(statementNodeA, statementNodeB, substitutio
116
123
  childNodesA = nonTerminalNodeAChildNodes, ///
117
124
  childNodesB = nonTerminalNodeBChildNodes, ///
118
125
  childNodesVerified = metaLevelUnifier.unifyChildNodes(childNodesA, childNodesB, substitutions, localContextA, localContextB),
119
- statementUnifiedWithStatement = childNodesVerified; ///
126
+ statementUnified = childNodesVerified; ///
120
127
 
121
- return statementUnifiedWithStatement;
128
+ return statementUnified;
122
129
  }
@@ -5,7 +5,6 @@ import Unifier from "../unifier";
5
5
 
6
6
  import { nodeQuery } from "../utilities/query";
7
7
  import { typeNameFromTypeNode } from "../utilities/name";
8
- import local from "../context/local";
9
8
 
10
9
  const termNodeQuery = nodeQuery("/term!"),
11
10
  typeNodeQuery = nodeQuery("/type!"),
@@ -6,10 +6,12 @@ import { nodeQuery } from "../utilities/query";
6
6
  import { combinedCustomGrammarFromNothing } from "./customGrammar";
7
7
  import { VARIABLE_RULE_NAME,
8
8
  METAVARIABLE_RULE_NAME,
9
+ SUBSTITUTION_RULE_NAME,
9
10
  UNQUALIFIED_STATEMENT_RULE_NAME,
10
11
  CONSTRUCTOR_DECLARATION_RULE_NAME } from "../ruleNames";
11
12
  import { variableTokensFromVariableString,
12
13
  metavariableTokensFromMetavariableString,
14
+ substitutionTokensFromSubstitutionString,
13
15
  unqualifiedStatementTokensFromUnqualifiedStatementString,
14
16
  constructorDeclarationTokensFromConstructorDeclarationString } from "../utilities/tokens";
15
17
 
@@ -55,6 +57,13 @@ export function metavariableNodeFromMetavariableString(metavariableString, lexer
55
57
  return metavariableNode;
56
58
  }
57
59
 
60
+ export function substitutionNodeFromSubstitutionString(substitutionString, lexer, parser) {
61
+ const substitutionTokens = substitutionTokensFromSubstitutionString(substitutionString, lexer),
62
+ substitutionNode = substitutionNodeFromSubstitutionTokens(substitutionTokens, parser);
63
+
64
+ return substitutionNode;
65
+ }
66
+
58
67
  export function variableNodeFromVariableTokens(variableTokens, parser) {
59
68
  const ruleName = VARIABLE_RULE_NAME,
60
69
  variableNode = nodeFromTokensRuleNameAndParser(variableTokens, ruleName, parser);
@@ -69,6 +78,13 @@ export function metavariableNodeFromMetavariableTokens(metavariableTokens, parse
69
78
  return metavariableNode;
70
79
  }
71
80
 
81
+ export function substitutionNodeFromSubstitutionTokens(substitutionTokens, parser) {
82
+ const ruleName = SUBSTITUTION_RULE_NAME,
83
+ substitutionNode = nodeFromTokensRuleNameAndParser(substitutionTokens, ruleName, parser);
84
+
85
+ return substitutionNode;
86
+ }
87
+
72
88
  export function unqualifiedStatementNodeFromUnqualifiedStatementTokens(unqualifiedStatementTokens, parser) {
73
89
  const tokens = unqualifiedStatementTokens, ///
74
90
  ruleName = UNQUALIFIED_STATEMENT_RULE_NAME,
@@ -23,6 +23,13 @@ export function metavariableTokensFromMetavariableString(metavariableString, lex
23
23
  return metavariableTokens;
24
24
  }
25
25
 
26
+ export function substitutionTokensFromSubstitutionString(substitutionString, lexer) {
27
+ const substitutionContent = `${substitutionString}`,
28
+ substitutionTokens = tokensFromContentAndLexer(substitutionContent, lexer);
29
+
30
+ return substitutionTokens;
31
+ }
32
+
26
33
  export function unqualifiedStatementTokensFromUnqualifiedStatementString(unqualifiedStatementString, lexer) {
27
34
  const content = unqualifiedStatementString, ///
28
35
  unqualifiedStatementTokens = tokensFromContentAndLexer(content, lexer);