occam-verify-cli 0.0.972 → 0.0.975

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 (85) hide show
  1. package/bin/action/verify.js +30 -0
  2. package/bin/main.js +0 -27
  3. package/lib/context/file.js +1 -8
  4. package/lib/frame.js +3 -3
  5. package/lib/judgement.js +4 -4
  6. package/lib/metavariable.js +4 -28
  7. package/lib/resolve/complexSubstitutionAgainstSimpleSubstitution.js +76 -0
  8. package/lib/resolve/substitution.js +27 -0
  9. package/lib/resolve/substitutions.js +8 -70
  10. package/lib/rule.js +11 -1
  11. package/lib/substitution/statementForMetavariable.js +2 -2
  12. package/lib/substitution.js +8 -1
  13. package/lib/substitutions.js +19 -7
  14. package/lib/topLevelAssertion.js +11 -1
  15. package/lib/type.js +3 -3
  16. package/lib/unifier/metavariable.js +142 -0
  17. package/lib/unify/complexSubstitutionStatementWithSimpleSubstitutionStatement.js +26 -0
  18. package/lib/unify/qualifiedStatement.js +136 -0
  19. package/lib/unify/statementWithCombinator.js +29 -0
  20. package/lib/unify/statementWithCombinators.js +5 -14
  21. package/lib/unify/termWithBracketedConstructor.js +3 -3
  22. package/lib/unify/termWithConstructor.js +37 -0
  23. package/lib/unify/termWithConstructors.js +6 -33
  24. package/lib/unify/unqualifiedStatement.js +25 -0
  25. package/lib/verifier/statementAsCombinator.js +2 -2
  26. package/lib/verify/assertion/contained.js +2 -2
  27. package/lib/verify/assertion/defined.js +7 -4
  28. package/lib/verify/assertion/type.js +5 -3
  29. package/lib/verify/conclusion.js +2 -2
  30. package/lib/verify/consequent.js +2 -2
  31. package/lib/verify/declaration.js +14 -26
  32. package/lib/verify/equality.js +11 -7
  33. package/lib/verify/frame.js +39 -32
  34. package/lib/verify/judgement.js +28 -49
  35. package/lib/verify/metavariableGivenMetaType.js +44 -0
  36. package/lib/verify/premise.js +3 -3
  37. package/lib/verify/statement/qualified.js +3 -3
  38. package/lib/verify/statement/unqualified.js +9 -53
  39. package/lib/verify/statement.js +27 -62
  40. package/lib/verify/statementGivenMetaType.js +3 -2
  41. package/lib/verify/term.js +11 -5
  42. package/package.json +4 -4
  43. package/src/context/file.js +0 -6
  44. package/src/frame.js +1 -1
  45. package/src/judgement.js +1 -1
  46. package/src/metavariable.js +3 -32
  47. package/src/resolve/complexSubstitutionAgainstSimpleSubstitution.js +94 -0
  48. package/src/resolve/substitution.js +19 -0
  49. package/src/resolve/substitutions.js +9 -112
  50. package/src/rule.js +10 -0
  51. package/src/substitution/statementForMetavariable.js +1 -1
  52. package/src/substitution.js +6 -0
  53. package/src/substitutions.js +17 -6
  54. package/src/topLevelAssertion.js +10 -0
  55. package/src/type.js +3 -3
  56. package/src/unifier/metavariable.js +46 -0
  57. package/src/unify/complexSubstitutionStatementWithSimpleSubstitutionStatement.js +18 -0
  58. package/src/unify/{statement/qualified.js → qualifiedStatement.js} +61 -31
  59. package/src/unify/statementWithCombinator.js +22 -0
  60. package/src/unify/statementWithCombinators.js +5 -20
  61. package/src/unify/termWithBracketedConstructor.js +1 -1
  62. package/src/unify/termWithConstructor.js +39 -0
  63. package/src/unify/termWithConstructors.js +1 -37
  64. package/src/unify/{statement/unqualified.js → unqualifiedStatement.js} +1 -1
  65. package/src/verifier/statementAsCombinator.js +2 -2
  66. package/src/verify/assertion/contained.js +1 -1
  67. package/src/verify/assertion/defined.js +10 -3
  68. package/src/verify/assertion/type.js +6 -4
  69. package/src/verify/conclusion.js +1 -1
  70. package/src/verify/consequent.js +1 -1
  71. package/src/verify/declaration.js +25 -36
  72. package/src/verify/equality.js +12 -8
  73. package/src/verify/frame.js +52 -39
  74. package/src/verify/judgement.js +43 -75
  75. package/src/verify/metavariableGivenMetaType.js +45 -0
  76. package/src/verify/premise.js +3 -3
  77. package/src/verify/statement/qualified.js +1 -1
  78. package/src/verify/statement/unqualified.js +8 -13
  79. package/src/verify/statement.js +25 -69
  80. package/src/verify/statementGivenMetaType.js +3 -1
  81. package/src/verify/term.js +13 -6
  82. package/lib/unify/statement/qualified.js +0 -117
  83. package/lib/unify/statement/unqualified.js +0 -25
  84. package/lib/verify/metavariable.js +0 -51
  85. package/src/verify/metavariable.js +0 -58
@@ -1,8 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  import LocalContext from "../context/local";
4
- import Substitutions from "../substitutions";
5
- import metaLevelUnifier from "../unifier/metaLevel";
4
+ import resolveSubstitution from "../resolve/substitution";
6
5
 
7
6
  export default function resolveSubstitutions(substitutions, fileContextA, localContextB) {
8
7
  let substitutionsResolved = substitutions.areResolved();
@@ -13,7 +12,14 @@ export default function resolveSubstitutions(substitutions, fileContextA, localC
13
12
 
14
13
  substitutionsResolved = metavariableNodes.every((metavariableNode) => {
15
14
  const complexSubstitutions = substitutions.findComplexSubstitutionsByMetavariableNode(metavariableNode),
16
- complexSubstitutionsResolved = resolveComplexSubstitutions(complexSubstitutions, substitutions, localContextA, localContextB);
15
+ complexSubstitutionsResolved = complexSubstitutions.everySubstitution((complexSubstitution) => {
16
+ const substitution = complexSubstitution, ///
17
+ complexSubstitutionResolved = resolveSubstitution(substitution, substitutions, localContextA, localContextB);
18
+
19
+ if (complexSubstitutionResolved) {
20
+ return true;
21
+ }
22
+ });
17
23
 
18
24
  if (complexSubstitutionsResolved) {
19
25
  return true;
@@ -23,112 +29,3 @@ export default function resolveSubstitutions(substitutions, fileContextA, localC
23
29
 
24
30
  return substitutionsResolved;
25
31
  }
26
-
27
- function resolveComplexSubstitution(complexSubstitution, substitutions, localContextA, localContextB) {
28
- let complexSubstitutionResolved = false;
29
-
30
- const metavariableNode = complexSubstitution.getMetavariableNode(),
31
- simpleSubstitution = substitutions.findSimpleSubstitutionByMetavariableNode(metavariableNode);
32
-
33
- if (simpleSubstitution !== null) {
34
- const complexSubstitutionResolvedAgainstSimpleSubstitution = resolveComplexSubstitutionAgainstSimpleSubstitution(complexSubstitution, simpleSubstitution, substitutions, localContextA, localContextB);
35
-
36
- complexSubstitutionResolved = complexSubstitutionResolvedAgainstSimpleSubstitution; ///
37
- }
38
-
39
- return complexSubstitutionResolved;
40
- }
41
-
42
- function resolveComplexSubstitutions(complexSubstitutions, substitutions, localContextA, localContextB) {
43
- const complexSubstitutionsResolved = complexSubstitutions.everySubstitution((complexSubstitution) => {
44
- const complexSubstitutionResolved = resolveComplexSubstitution(complexSubstitution, substitutions, localContextA, localContextB);
45
-
46
- if (complexSubstitutionResolved) {
47
- return true;
48
- }
49
- });
50
-
51
- return complexSubstitutionsResolved;
52
- }
53
-
54
- function resolveComplexSubstitutionAgainstSimpleSubstitution(complexSubstitution, simpleSubstitution, substitutions, localContextA, localContextB) {
55
- let complexSubstitutionResolvedAgainstSimpleSubstitution = false;
56
-
57
- const statementNode = complexSubstitution.getStatementNode(),
58
- simpleSubstitutionString = simpleSubstitution.asString(localContextA, localContextB),
59
- complexSubstitutionString = complexSubstitution.asString(localContextA, localContextB);
60
-
61
- localContextB.trace(`Resolving the complex ${complexSubstitutionString} substitution against the simple ${simpleSubstitutionString} substitution...`, statementNode);
62
-
63
- const transformedSubstitution = transformedSubstitutionFromComplexSubstitutionSimpleSubstitutionAndSubstitutions(complexSubstitution, simpleSubstitution, substitutions, localContextA, localContextB);
64
-
65
- if (transformedSubstitution !== null) {
66
- const variableNode = transformedSubstitution.getVariableNode(),
67
- substitution = substitutions.findSubstitutionByVariableNode(variableNode);
68
-
69
- if (substitution === null) {
70
- simpleSubstitution = transformedSubstitution; ///
71
-
72
- substitutions.addSubstitution(simpleSubstitution, localContextA, localContextB);
73
-
74
- substitutions.removeSubstitution(complexSubstitution, localContextA, localContextB);
75
-
76
- complexSubstitutionResolvedAgainstSimpleSubstitution = true;
77
- } else {
78
- const termNode = transformedSubstitution.getTermNode(),
79
- termNodeMatches = substitution.matchTermNode(termNode);
80
-
81
- if (termNodeMatches) {
82
- substitutions.removeSubstitution(complexSubstitution, localContextA, localContextB);
83
-
84
- complexSubstitutionResolvedAgainstSimpleSubstitution = true;
85
- }
86
- }
87
- }
88
-
89
- if (complexSubstitutionResolvedAgainstSimpleSubstitution) {
90
- localContextB.debug(`...resolved the complex ${complexSubstitutionString} substitution against the simple ${simpleSubstitutionString} substitution.`, statementNode);
91
- }
92
-
93
- return complexSubstitutionResolvedAgainstSimpleSubstitution;
94
- }
95
-
96
- function unifyComplexSubstitutionStatementWithSimpleSubstitutionStatement(complexSubstitutionStatementNode, simpleSubstitutionStatementNode, substitutions, localContextA, localContextB) {
97
- let complexSubstitutionStatementWithSimpleSubstitutionStatement;
98
-
99
- const nodeA = complexSubstitutionStatementNode, ///
100
- nodeB = simpleSubstitutionStatementNode; ///
101
-
102
- localContextA = localContextB; ///
103
-
104
- const unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
105
-
106
- complexSubstitutionStatementWithSimpleSubstitutionStatement = unified; ///
107
-
108
- return complexSubstitutionStatementWithSimpleSubstitutionStatement;
109
- }
110
-
111
- function transformedSubstitutionFromComplexSubstitutionSimpleSubstitutionAndSubstitutions(complexSubstitution, simpleSubstitution, substitutions, localContextA, localContextB) {
112
- let transformedSubstitution;
113
-
114
- const substitution = complexSubstitution.getSubstitution();
115
-
116
- transformedSubstitution = substitution.transformed(substitutions);
117
-
118
- if (transformedSubstitution !== null) {
119
- const simpleSubstitutionStatementNode = simpleSubstitution.getStatementNode(),
120
- complexSubstitutionStatementNode = complexSubstitution.getStatementNode();
121
-
122
- substitutions = Substitutions.fromNothing(); ///
123
-
124
- const complexSubstitutionStatementWithSimpleSubstitutionStatement = unifyComplexSubstitutionStatementWithSimpleSubstitutionStatement(complexSubstitutionStatementNode, simpleSubstitutionStatementNode, substitutions, localContextA, localContextB);
125
-
126
- if (complexSubstitutionStatementWithSimpleSubstitutionStatement) {
127
- const substitution = transformedSubstitution; ///
128
-
129
- transformedSubstitution = substitution.transformed(substitutions);
130
- }
131
- }
132
-
133
- return transformedSubstitution;
134
- }
package/src/rule.js CHANGED
@@ -29,6 +29,16 @@ export default class Rule {
29
29
  return this.fileContext;
30
30
  }
31
31
 
32
+ getLabelMetavariableNodes() {
33
+ const labelMetavariableNodes = this.labels.map((label) => {
34
+ const labelMetavariableNode = label.getMetavariableNode();
35
+
36
+ return labelMetavariableNode;
37
+ });
38
+
39
+ return labelMetavariableNodes;
40
+ }
41
+
32
42
  unifyStatement(statementNode, localContext) {
33
43
  let statementUnified = false;
34
44
 
@@ -163,7 +163,7 @@ function transformStatementNode(statementNode, substitutions) {
163
163
 
164
164
  if (metavariableNode !== null) {
165
165
  substitutions.someSubstitution((substitution) => {
166
- const substitutionMatchesVariableNode = substitution.matchVariableNode(metavariableNode);
166
+ const substitutionMatchesVariableNode = substitution.matchMetavariableNode(metavariableNode);
167
167
 
168
168
  if (substitutionMatchesVariableNode) {
169
169
  const statementNode = substitution.getStatementNode();
@@ -21,6 +21,12 @@ export default class Substitution {
21
21
  return resolved;
22
22
  }
23
23
 
24
+ getVariableNode() {
25
+ const variableNode = null;
26
+
27
+ return variableNode;
28
+ }
29
+
24
30
  getMetavariableNode() {
25
31
  const metavariableNode = null;
26
32
 
@@ -87,9 +87,9 @@ export default class Substitutions {
87
87
 
88
88
  findSubstitutionByVariableNode(variableNode) {
89
89
  const substitution = this.findSubstitution((substitution) => {
90
- const substitutionMatchesVariableNode = substitution.matchVariableNode(variableNode);
90
+ const variableNodeMatches = substitution.matchVariableNode(variableNode);
91
91
 
92
- if (substitutionMatchesVariableNode) {
92
+ if (variableNodeMatches) {
93
93
  return true;
94
94
  }
95
95
  });
@@ -97,11 +97,22 @@ export default class Substitutions {
97
97
  return substitution;
98
98
  }
99
99
 
100
+ findSubstitutionByMetavariableNode(metavariableNode) {
101
+ const substitution = this.findSubstitution((substitution) => {
102
+ const metavariableNodeMatches = substitution.matchMetavariableNode(metavariableNode);
103
+
104
+ if (metavariableNodeMatches) {
105
+ return true;
106
+ }
107
+ });
108
+
109
+ return substitution;
110
+ }
100
111
  findSubstitutionsByMetavariableNode(metavariableNode) {
101
112
  const substitutions = this.findSubstitutions((substitution) => {
102
- const substitutionMatchesMetavariableNode = substitution.matchMetavariableNode(metavariableNode);
113
+ const metavariableNodeMatches = substitution.matchMetavariableNode(metavariableNode);
103
114
 
104
- if (substitutionMatchesMetavariableNode) {
115
+ if (metavariableNodeMatches) {
105
116
  return true;
106
117
  }
107
118
  });
@@ -139,9 +150,9 @@ export default class Substitutions {
139
150
 
140
151
  findSubstitutionsByMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode) {
141
152
  const substitutions = this.findSubstitutions((substitution) => {
142
- const substitutionMatchesMetavariableNodeAndSubstitutionNode = substitution.matchMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode);
153
+ const metavariableNodeAndSubstitutionNodeMatch = substitution.matchMetavariableNodeAndSubstitutionNode(metavariableNode, substitutionNode);
143
154
 
144
- if (substitutionMatchesMetavariableNodeAndSubstitutionNode) {
155
+ if (metavariableNodeAndSubstitutionNodeMatch) {
145
156
  return true;
146
157
  }
147
158
  });
@@ -34,6 +34,16 @@ export default class TopLevelAssertion {
34
34
  return this.fileContext;
35
35
  }
36
36
 
37
+ getLabelMetavariableNodes() {
38
+ const labelMetavariableNodes = this.labels.map((label) => {
39
+ const labelMetavariableNode = label.getMetavariableNode();
40
+
41
+ return labelMetavariableNode;
42
+ });
43
+
44
+ return labelMetavariableNodes;
45
+ }
46
+
37
47
  unifyStatement(statementNode, localContext) {
38
48
  let statementUnified = false;
39
49
 
package/src/type.js CHANGED
@@ -105,10 +105,10 @@ export default class Type {
105
105
 
106
106
  matchTypeNode(typeNode) {
107
107
  const typeName = typeNameFromTypeNode(typeNode),
108
- matchesTypeName = this.matchTypeName(typeName),
109
- matchesTypeNode = matchesTypeName; ///
108
+ typeNameMatches = this.matchTypeName(typeName),
109
+ typeNodeMatches = typeNameMatches; ///
110
110
 
111
- return matchesTypeNode;
111
+ return typeNodeMatches;
112
112
  }
113
113
 
114
114
  asString(tokens, noSuperType = false) {
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ import shim from "../shim";
4
+ import Unifier from "../unifier";
5
+
6
+ import { nodeQuery } from "../utilities/query";
7
+ import unifyTermWithType from "../unify/termWithType";
8
+
9
+ const typeNodeQuery = nodeQuery("/type!"),
10
+ termNodeQuery = nodeQuery("/term!");
11
+
12
+ class MetavariableUnifier extends Unifier {
13
+ unify(metavariableNodeA, metavariableNodeB, localContext) {
14
+ let unified;
15
+
16
+ const nonTerminalNodeA = metavariableNodeA, ///
17
+ nonTerminalNodeB = metavariableNodeB, ///
18
+ nonTerminalNodeUnified = this.unifyNonTerminalNode(nonTerminalNodeA, nonTerminalNodeB, localContext);
19
+
20
+ unified = nonTerminalNodeUnified; ///
21
+
22
+ return unified;
23
+ }
24
+
25
+ static maps = [
26
+ {
27
+ nodeQueryA: termNodeQuery,
28
+ nodeQueryB: typeNodeQuery,
29
+ unify: (termNodeA, typeNodeB, localContext) => {
30
+ const termNode = termNodeA, ///
31
+ typeNode = typeNodeB, ///
32
+ termUnifiedWithType = unifyTermWithType(termNode, typeNode, localContext);
33
+
34
+ return termUnifiedWithType;
35
+ }
36
+ }
37
+ ];
38
+ }
39
+
40
+ const metavariableUnifier = new MetavariableUnifier();
41
+
42
+ Object.assign(shim, {
43
+ metavariableUnifier
44
+ });
45
+
46
+ export default metavariableUnifier;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ import metaLevelUnifier from "../unifier/metaLevel";
4
+
5
+ export default function unifyComplexSubstitutionStatementWithSimpleSubstitutionStatement(complexSubstitutionStatementNode, simpleSubstitutionStatementNode, substitutions, localContextA, localContextB) {
6
+ let complexSubstitutionStatementWithSimpleSubstitutionStatement;
7
+
8
+ const nodeA = complexSubstitutionStatementNode, ///
9
+ nodeB = simpleSubstitutionStatementNode; ///
10
+
11
+ localContextA = localContextB; ///
12
+
13
+ const unified = metaLevelUnifier.unify(nodeA, nodeB, substitutions, localContextA, localContextB);
14
+
15
+ complexSubstitutionStatementWithSimpleSubstitutionStatement = unified; ///
16
+
17
+ return complexSubstitutionStatementWithSimpleSubstitutionStatement;
18
+ }
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
2
 
3
- import { nodeQuery } from "../../utilities/query";
3
+ import metavariableUnifier from "../unifier/metavariable";
4
+ import StatementForMetavariableSubstitution from "../substitution/statementForMetavariable";
5
+
6
+ import { nodeQuery } from "../utilities/query";
7
+ import { metavariableNameFromMetavariableNode } from "../utilities/name";
4
8
 
5
9
  const statementNodeQuery = nodeQuery("/qualifiedStatement/statement!"),
6
10
  metavariableNodeQuery = nodeQuery("/qualifiedStatement/reference/metavariable!");
@@ -42,17 +46,18 @@ function unifyQualifiedStatementAWithRule(qualifiedStatementNode, substitutions,
42
46
 
43
47
  if (rule !== null) {
44
48
  const statementNode = statementNodeQuery(qualifiedStatementNode),
45
- metavariableString = localContext.nodeAsString(metavariableNode),
46
- qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode);
49
+ labelMetavariableNodes = rule.getLabelMetavariableNodes(),
50
+ qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode),
51
+ labelMetavariableNodesString = localContext.nodesAsString(labelMetavariableNodes);
47
52
 
48
- localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${metavariableString}' rule...`, qualifiedStatementNode);
53
+ localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' rule...`, qualifiedStatementNode);
49
54
 
50
55
  const statementUnified = rule.unifyStatement(statementNode, localContext);
51
56
 
52
57
  qualifiedStatementUnifiedWithRule = statementUnified; ///
53
58
 
54
59
  if (qualifiedStatementUnifiedWithRule) {
55
- localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${metavariableString}' rule.`, qualifiedStatementNode);
60
+ localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' rule.`, qualifiedStatementNode);
56
61
  }
57
62
  }
58
63
 
@@ -67,17 +72,18 @@ function unifyQualifiedStatementAWithAxiom(qualifiedStatementNode, substitutions
67
72
 
68
73
  if (axiom !== null) {
69
74
  const statementNode = statementNodeQuery(qualifiedStatementNode),
70
- metavariableString = localContext.nodeAsString(metavariableNode),
71
- qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode);
75
+ labelMetavariableNodes = axiom.getLabelMetavariableNodes(),
76
+ qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode),
77
+ labelMetavariableNodesString = localContext.nodesAsString(labelMetavariableNodes);
72
78
 
73
- localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${metavariableString}' axiom...`, qualifiedStatementNode);
79
+ localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' axiom...`, qualifiedStatementNode);
74
80
 
75
81
  const statementUnified = axiom.unifyStatement(statementNode, localContext);
76
82
 
77
83
  qualifiedStatementUnifiedWithAxiom = statementUnified; ///
78
84
 
79
85
  if (qualifiedStatementUnifiedWithAxiom) {
80
- localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${metavariableString}' axiom.`, qualifiedStatementNode);
86
+ localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' axiom.`, qualifiedStatementNode);
81
87
  }
82
88
  }
83
89
 
@@ -92,17 +98,18 @@ function unifyQualifiedStatementAWithLemma(qualifiedStatementNode, substitutions
92
98
 
93
99
  if (lemma !== null) {
94
100
  const statementNode = statementNodeQuery(qualifiedStatementNode),
95
- metavariableString = localContext.nodeAsString(metavariableNode),
96
- qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode);
101
+ labelMetavariableNodes = lemma.getLabelMetavariableNodes(),
102
+ qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode),
103
+ labelMetavariableNodesString = localContext.nodesAsString(labelMetavariableNodes);
97
104
 
98
- localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${metavariableString}' lemma...`, qualifiedStatementNode);
105
+ localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' lemma...`, qualifiedStatementNode);
99
106
 
100
107
  const statementUnified = lemma.unifyStatement(statementNode, localContext);
101
108
 
102
109
  qualifiedStatementUnifiedWithLemma = statementUnified; ///
103
110
 
104
111
  if (qualifiedStatementUnifiedWithLemma) {
105
- localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${metavariableString}' lemma.`, qualifiedStatementNode);
112
+ localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' lemma.`, qualifiedStatementNode);
106
113
  }
107
114
  }
108
115
 
@@ -117,17 +124,18 @@ function unifyQualifiedStatementAWithTheorem(qualifiedStatementNode, substitutio
117
124
 
118
125
  if (theorem !== null) {
119
126
  const statementNode = statementNodeQuery(qualifiedStatementNode),
120
- metavariableString = localContext.nodeAsString(metavariableNode),
121
- qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode);
127
+ labelMetavariableNodes = theorem.getLabelMetavariableNodes(),
128
+ qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode),
129
+ labelMetavariableNodesString = localContext.nodesAsString(labelMetavariableNodes);
122
130
 
123
- localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${metavariableString}' theorem...`, qualifiedStatementNode);
131
+ localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' theorem...`, qualifiedStatementNode);
124
132
 
125
133
  const statementUnified = theorem.unifyStatement(statementNode, localContext);
126
134
 
127
135
  qualifiedStatementUnifiedWithTheorem = statementUnified; ///
128
136
 
129
137
  if (qualifiedStatementUnifiedWithTheorem) {
130
- localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${metavariableString}' theorem.`, qualifiedStatementNode);
138
+ localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' theorem.`, qualifiedStatementNode);
131
139
  }
132
140
  }
133
141
 
@@ -142,17 +150,18 @@ function unifyQualifiedStatementAWithConjecture(qualifiedStatementNode, substitu
142
150
 
143
151
  if (conjecture !== null) {
144
152
  const statementNode = statementNodeQuery(qualifiedStatementNode),
145
- metavariableString = localContext.nodeAsString(metavariableNode),
146
- qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode);
153
+ labelMetavariableNodes = conjecture.getLabelMetavariableNodes(),
154
+ qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode),
155
+ labelMetavariableNodesString = localContext.nodesAsString(labelMetavariableNodes);
147
156
 
148
- localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${metavariableString}' conjecture...`, qualifiedStatementNode);
157
+ localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' conjecture...`, qualifiedStatementNode);
149
158
 
150
159
  const statementUnified = conjecture.unifyStatement(statementNode, localContext);
151
160
 
152
161
  qualifiedStatementUnifiedWithConjecture = statementUnified; ///
153
162
 
154
163
  if (qualifiedStatementUnifiedWithConjecture) {
155
- localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${metavariableString}' conjecture.`, qualifiedStatementNode);
164
+ localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${labelMetavariableNodesString}' conjecture.`, qualifiedStatementNode);
156
165
  }
157
166
  }
158
167
 
@@ -162,21 +171,42 @@ function unifyQualifiedStatementAWithConjecture(qualifiedStatementNode, substitu
162
171
  function unifyQualifiedStatementAWithReference(qualifiedStatementNode, substitutions, localContext) {
163
172
  let qualifiedStatementUnifiedWithReference = false;
164
173
 
165
- const metavariableNode = metavariableNodeQuery(qualifiedStatementNode),
166
- metavariableString = localContext.nodeAsString(metavariableNode),
167
- metavariablePresent = localContext.isMetavariablePresentByMetavariableNode(metavariableNode),
168
- qualifiedStatementString = localContext.nodeAsString(qualifiedStatementNode);
174
+ let metavariableNode = metavariableNodeQuery(qualifiedStatementNode);
169
175
 
170
- localContext.trace(`Unifying the '${qualifiedStatementString}' qualified statement with the '${metavariableString}' reference...`, qualifiedStatementNode);
176
+ const metavariableName = metavariableNameFromMetavariableNode(metavariableNode),
177
+ metavariable = localContext.findMetavariableByMetavariableName(metavariableName);
171
178
 
172
- if (metavariablePresent) {
179
+ if (metavariable !== null) {
180
+ const statementNode = statementNodeQuery(qualifiedStatementNode),
181
+ statementString = localContext.nodeAsString(statementNode),
182
+ metavariableString = localContext.nodeAsString(metavariableNode);
173
183
 
174
- debugger
184
+ localContext.trace(`Unifying the '${statementString}' qualified statement with the '${metavariableString}' reference...`, qualifiedStatementNode);
175
185
 
176
- }
186
+ const metavariableNodeA = metavariableNode; ///
187
+
188
+ metavariableNode = metavariable.getNode();
189
+
190
+ const metavariableNodeB = metavariableNode; ///
191
+
192
+ const unified = metavariableUnifier.unify(metavariableNodeA, metavariableNodeB, localContext);
177
193
 
178
- if (qualifiedStatementUnifiedWithReference) {
179
- localContext.debug(`...unified the '${qualifiedStatementString}' qualified statement with the '${metavariableString}' reference.`, qualifiedStatementNode);
194
+ if (unified) {
195
+ metavariableNode = metavariableNodeA; ///
196
+
197
+ const statementForMetavariableSubstitution = StatementForMetavariableSubstitution.fromStatementNodeAndMetavariableNode(statementNode, metavariableNode),
198
+ substitution = statementForMetavariableSubstitution, ///
199
+ localContextA = localContext, ///
200
+ localContextB = localContext; ///
201
+
202
+ substitutions.addSubstitution(substitution, localContextA, localContextB);
203
+
204
+ qualifiedStatementUnifiedWithReference = true;
205
+ }
206
+
207
+ if (qualifiedStatementUnifiedWithReference) {
208
+ localContext.debug(`...unified the '${statementString}' qualified statement with the '${metavariableString}' reference.`, qualifiedStatementNode);
209
+ }
180
210
  }
181
211
 
182
212
  return qualifiedStatementUnifiedWithReference;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ import statementWithCombinatorUnifier from "../unifier/statementWithCombinator";
4
+
5
+ export default function unifyStatementWithCombinator(statementNode, combinator, assignments, stated, localContext) {
6
+ let statementUnifiedWithCombinator;
7
+
8
+ const statementString = localContext.nodeAsString(statementNode),
9
+ combinatorString = combinator.getString();
10
+
11
+ localContext.trace(`Unifying the '${statementString}' statement with the '${combinatorString}' combinator...`, statementNode);
12
+
13
+ const combinatorStatementNode = combinator.getStatementNode();
14
+
15
+ statementUnifiedWithCombinator = statementWithCombinatorUnifier.unify(statementNode, combinatorStatementNode, assignments, stated, localContext);
16
+
17
+ if (statementUnifiedWithCombinator) {
18
+ localContext.debug(`...unified the '${statementString}' statement with the '${combinatorString}' combinator.`, statementNode);
19
+ }
20
+
21
+ return statementUnifiedWithCombinator;
22
+ }
@@ -1,12 +1,16 @@
1
1
  "use strict";
2
2
 
3
- import statementWithCombinatorUnifier from "../unifier/statementWithCombinator";
3
+ import unifyStatementWithCombinator from "../unify/statementWithCombinator";
4
4
 
5
5
  export default function unifyStatementWithCombinators(statementNode, assignments, stated, localContext) {
6
6
  let statementUnifiedWithCombinators;
7
7
 
8
8
  const combinators = localContext.getCombinators();
9
9
 
10
+ assignments = null; ///
11
+
12
+ stated = true; ///
13
+
10
14
  statementUnifiedWithCombinators = combinators.some((combinator) => {
11
15
  const statementUnifiedWithCombinator = unifyStatementWithCombinator(statementNode, combinator, assignments, stated, localContext);
12
16
 
@@ -17,22 +21,3 @@ export default function unifyStatementWithCombinators(statementNode, assignments
17
21
 
18
22
  return statementUnifiedWithCombinators;
19
23
  }
20
-
21
- function unifyStatementWithCombinator(statementNode, combinator, assignments, stated, localContext) {
22
- let statementUnifiedWithCombinator;
23
-
24
- const statementString = localContext.nodeAsString(statementNode),
25
- combinatorString = combinator.getString();
26
-
27
- localContext.trace(`Unifying the '${statementString}' statement with the '${combinatorString}' combinator...`, statementNode);
28
-
29
- const combinatorStatementNode = combinator.getStatementNode();
30
-
31
- statementUnifiedWithCombinator = statementWithCombinatorUnifier.unify(statementNode, combinatorStatementNode, assignments, stated, localContext);
32
-
33
- if (statementUnifiedWithCombinator) {
34
- localContext.debug(`...unified the '${statementString}' statement with the '${combinatorString}' combinator.`, statementNode);
35
- }
36
-
37
- return statementUnifiedWithCombinator;
38
- }
@@ -2,9 +2,9 @@
2
2
 
3
3
  import shim from "../shim";
4
4
  import bracketedConstructor from "../constructor/bracketed";
5
+ import unifyTermWithConstructor from "../unify/termWithConstructor";
5
6
 
6
7
  import { nodeQuery } from "../utilities/query";
7
- import { unifyTermWithConstructor } from "../unify/termWithConstructors";
8
8
 
9
9
  const termNodeQuery = nodeQuery("/term/argument/term");
10
10
 
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ import Term from "../term";
4
+ import termWithConstructorUnifier from "../unifier/termWithConstructor";
5
+
6
+ export default function unifyTermWithConstructor(termNode, terms, constructor, localContext, verifyAhead) {
7
+ let termUnifiedWithConstructor = false;
8
+
9
+ const termString = localContext.nodeAsString(termNode),
10
+ constructorString = constructor.getString(),
11
+ constructorTermNode = constructor.getTermNode();
12
+
13
+ localContext.trace(`Unifying the '${termString}' term with the '${constructorString}' constructor...`, termNode);
14
+
15
+ const termNodeA = termNode, ///
16
+ constructorTermNodeB = constructorTermNode, ///
17
+ unified = termWithConstructorUnifier.unify(termNodeA, constructorTermNodeB, localContext);
18
+
19
+ if (unified) {
20
+ let verifiedAhead;
21
+
22
+ const type = constructor.getType(),
23
+ term = Term.fromTermNodeAndType(termNode, type);
24
+
25
+ terms.push(term);
26
+
27
+ verifiedAhead = verifyAhead();
28
+
29
+ terms.pop();
30
+
31
+ termUnifiedWithConstructor = verifiedAhead; ///
32
+ }
33
+
34
+ if (termUnifiedWithConstructor) {
35
+ localContext.debug(`...unified the '${termString}' term with the '${constructorString}' constructor.`, termNode);
36
+ }
37
+
38
+ return termUnifiedWithConstructor;
39
+ }