occam-verify-cli 0.0.465 → 0.0.467

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 (44) hide show
  1. package/lib/antecedent.js +214 -0
  2. package/lib/axiom.js +93 -78
  3. package/lib/axiomLemmaTheorem.js +190 -0
  4. package/lib/consequent.js +157 -0
  5. package/lib/constants.js +9 -1
  6. package/lib/lemma.js +93 -78
  7. package/lib/ruleNames.js +4 -4
  8. package/lib/substitution.js +123 -0
  9. package/lib/theorem.js +93 -78
  10. package/lib/utilities/statement.js +45 -0
  11. package/lib/utilities/string.js +6 -6
  12. package/lib/verify/antecedentOrAntecedents.js +38 -0
  13. package/lib/verify/axiom.js +15 -14
  14. package/lib/verify/conditinalIndicative.js +32 -0
  15. package/lib/verify/{indicativeConditional.js → conditionalIndicative.js} +10 -10
  16. package/lib/verify/consequent.js +36 -0
  17. package/lib/verify/lemma.js +25 -19
  18. package/lib/verify/metaproof.js +3 -3
  19. package/lib/verify/rule.js +2 -3
  20. package/lib/verify/theorem.js +21 -18
  21. package/lib/verify/unconditionalIndicative.js +28 -0
  22. package/package.json +3 -3
  23. package/src/antecedent.js +235 -0
  24. package/src/axiom.js +5 -95
  25. package/src/axiomLemmaTheorem.js +190 -0
  26. package/src/consequent.js +187 -0
  27. package/src/constants.js +2 -0
  28. package/src/lemma.js +5 -95
  29. package/src/ruleNames.js +1 -1
  30. package/src/substitution.js +130 -0
  31. package/src/theorem.js +5 -95
  32. package/src/utilities/statement.js +50 -0
  33. package/src/utilities/string.js +6 -6
  34. package/src/verify/antecedentOrAntecedents.js +40 -0
  35. package/src/verify/axiom.js +21 -16
  36. package/src/verify/conditinalIndicative.js +31 -0
  37. package/src/verify/conditionalIndicative.js +29 -0
  38. package/src/verify/consequent.js +36 -0
  39. package/src/verify/lemma.js +38 -21
  40. package/src/verify/metaproof.js +2 -1
  41. package/src/verify/rule.js +1 -3
  42. package/src/verify/theorem.js +28 -22
  43. package/src/verify/unconditionalIndicative.js +24 -0
  44. package/src/verify/indicativeConditional.js +0 -29
package/src/theorem.js CHANGED
@@ -1,103 +1,13 @@
1
1
  "use strict";
2
2
 
3
- import Label from "./label";
3
+ import AxiomLemmaTheorem from "./axiomLemmaTheorem";
4
4
 
5
5
  import { THEOREM_KIND } from "./kinds";
6
- import { nodeAsString } from "./utilities/string";
7
6
 
8
- import { unqualifiedStatementNodeFromUnqualifiedStatementString, indicativeConditionalNodeFromIndicativeConditionalString } from "./utilities/string";
7
+ export default class Theorem extends AxiomLemmaTheorem {
8
+ static kind = THEOREM_KIND;
9
9
 
10
- export default class Theorem {
11
- constructor(labels, unqualifiedStatementNode, indicativeConditionalNode) {
12
- this.labels = labels;
13
- this.unqualifiedStatementNode = unqualifiedStatementNode;
14
- this.indicativeConditionalNode = indicativeConditionalNode;
15
- }
10
+ static fromJSON(json, releaseContext) { return AxiomLemmaTheorem.fromJSON(Theorem, json, releaseContext); }
16
11
 
17
- getLabels() {
18
- return this.labels;
19
- }
20
-
21
- getUnqualifiedStatementNode() {
22
- return this.unqualifiedStatementNode;
23
- }
24
-
25
- getIndicativeConditionalNode() {
26
- return this.indicativeConditionalNode;
27
- }
28
-
29
- matchLabelName(labelName) {
30
- const matchesLabelName = this.labels.some((label) => {
31
- const name = labelName, ///
32
- labelMatchesName = label.matchName(name);
33
-
34
- if (labelMatchesName) {
35
- return true;
36
- }
37
- });
38
-
39
- return matchesLabelName;
40
- }
41
-
42
- toJSON() {
43
- const labelsJSON = this.labels.map((label) => {
44
- const labelJSON = label.toJSON();
45
-
46
- return labelJSON;
47
- }),
48
- unqualifiedStatementString = nodeAsString(this.unqalifiedStatementNode),
49
- indicativeConditionalString = nodeAsString(this.indicativeConditionalNode),
50
- kind = THEOREM_KIND,
51
- labels = labelsJSON, ///
52
- unqualifiedStatement = unqualifiedStatementString, ///
53
- indicativeConditional = indicativeConditionalString, ///
54
- json = {
55
- kind,
56
- labels,
57
- unqualifiedStatement,
58
- indicativeConditional
59
- };
60
-
61
- return json;
62
- }
63
-
64
- static fromJSON(json, releaseContext) {
65
- let { labels } = json;
66
-
67
- const labelsJSON = labels; ///
68
-
69
- labels = labelsJSON.map((labelJSON) => {
70
- const json = labelJSON, ///
71
- label = Label.fromJSON(json, releaseContext);
72
-
73
- return label;
74
- });
75
-
76
- let { unqualifiedStatement, indicativeConditional } = json;
77
-
78
- let unqualifiedStatementNode = null,
79
- indicativeConditionalNode = null;
80
-
81
- if (unqualifiedStatement !== null) {
82
- const unqualifiedStatementString = unqualifiedStatement; ///
83
-
84
- unqualifiedStatementNode = unqualifiedStatementNodeFromUnqualifiedStatementString(unqualifiedStatementString, releaseContext);
85
- }
86
-
87
- if (indicativeConditional !== null) {
88
- const indicativeConditionalString = indicativeConditional; ///
89
-
90
- indicativeConditionalNode = indicativeConditionalNodeFromIndicativeConditionalString(indicativeConditionalString, releaseContext);
91
- }
92
-
93
- const theorem = new Theorem(labels, unqualifiedStatementNode, indicativeConditionalNode);
94
-
95
- return theorem;
96
- }
97
-
98
- static fromLabelsUnqualifiedStatementNodeAndIndicativeConditionalNode(labels, unqualifiedStatementNode, indicativeConditionalNode) {
99
- const theorem = new Theorem(labels, unqualifiedStatementNode, indicativeConditionalNode);
100
-
101
- return theorem;
102
- }
12
+ static fromLabelsAntecedentsAndConsequent(labels, antecedents, consequent) { return AxiomLemmaTheorem.fromLabelsAntecedentsAndConsequent(Theorem, labels, antecedents, consequent); }
103
13
  }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ import { first, second, third } from "../utilities/array";
4
+ import { STATEMENT_RULE_NAME } from "../ruleNames";
5
+ import { LEFT_BRACKET, RIGHT_BRACKET, BRACKETED_STATEMENT_CHILD_NODES_LENGTH } from "../constants";
6
+
7
+ export function bracketedStatementChildNodeFromChildNodes(childNodes) {
8
+ let bracketedStatementChildNode = null;
9
+
10
+ const childNodesLength = childNodes.length;
11
+
12
+ if (childNodesLength === BRACKETED_STATEMENT_CHILD_NODES_LENGTH) {
13
+ const firstChildNode = first(childNodes),
14
+ thirdChildNode = third(childNodes),
15
+ secondChildNode = second(childNodes),
16
+ firstChildNodeTerminalNode = firstChildNode.isTerminalNode(),
17
+ thirdChildNodeTerminalNode = thirdChildNode.isTerminalNode(),
18
+ secondChildNodeNonTerminalNode = secondChildNode.isNonTerminalNode();
19
+
20
+ if (firstChildNodeTerminalNode && secondChildNodeNonTerminalNode && thirdChildNodeTerminalNode) {
21
+ const nonTerminalNode = secondChildNode, ///
22
+ firstTerminalNode = firstChildNode, ///
23
+ secondTerminalNode = thirdChildNode, ///
24
+ nonTerminalNodeRuleName = nonTerminalNode.getRuleName(),
25
+ firstTerminalNodeContent = firstTerminalNode.getContent(),
26
+ secondTerminalNodeContent = secondTerminalNode.getContent(),
27
+ firstTerminalNodeContentLeftBracket = (firstTerminalNodeContent === LEFT_BRACKET),
28
+ secondTerminalNodeContentRightBracket = (secondTerminalNodeContent === RIGHT_BRACKET),
29
+ nonTerminalNodeRuleNameStatementRuleName = (nonTerminalNodeRuleName === STATEMENT_RULE_NAME);
30
+
31
+ if (firstTerminalNodeContentLeftBracket && nonTerminalNodeRuleNameStatementRuleName && secondTerminalNodeContentRightBracket) {
32
+ bracketedStatementChildNode = nonTerminalNode; ///
33
+ }
34
+ }
35
+ }
36
+
37
+ return bracketedStatementChildNode;
38
+ }
39
+
40
+ export function matchBracketedStatementChildNode(childNodes, callback) {
41
+ let bracketedStatementChildNodeMatches = false;
42
+
43
+ const bracketedStatementChildNode = bracketedStatementChildNodeFromChildNodes(childNodes);
44
+
45
+ if (bracketedStatementChildNode !== null) {
46
+ bracketedStatementChildNodeMatches = callback(bracketedStatementChildNode);
47
+ }
48
+
49
+ return bracketedStatementChildNodeMatches;
50
+ }
@@ -5,7 +5,7 @@ import { nodeQuery } from "../utilities/query";
5
5
  import { TERM_RULE_NAME,
6
6
  LABEL_RULE_NAME,
7
7
  UNQUALIFIED_STATEMENT_RULE_NAME,
8
- INDICATIVE_CONDITIONAL_RULE_NAME,
8
+ CONDITIONAL_INDICATIVE_RULE_NAME,
9
9
  UNQUALIFIED_METASTATEMENT_RULE_NAME} from "../ruleNames";
10
10
 
11
11
  const statementNodeQuery = nodeQuery("/unqualifiedStatement/statement"),
@@ -104,11 +104,11 @@ export function unqualifiedStatementNodeFromUnqualifiedStatementString(unqualifi
104
104
  return unqualifiedStatementNode;
105
105
  }
106
106
 
107
- export function indicativeConditionalNodeFromIndicativeConditionalString(indicativeConditionalString, releaseContext) {
108
- const ruleName = INDICATIVE_CONDITIONAL_RULE_NAME,
109
- content = indicativeConditionalString, ///
107
+ export function conditionalIndicativeNodeFromConditionalIndicativeString(conditionalIndicativeString, releaseContext) {
108
+ const ruleName = CONDITIONAL_INDICATIVE_RULE_NAME,
109
+ content = conditionalIndicativeString, ///
110
110
  node = releaseContext.nodeFromContentAndRuleName(content, ruleName),
111
- indicativeConditionalNode = node; ///
111
+ conditionalIndicativeNode = node; ///
112
112
 
113
- return indicativeConditionalNode;
113
+ return conditionalIndicativeNode;
114
114
  }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+
3
+ import Assertion from "../assertion";
4
+ import Antecedent from "../antecedent";
5
+ import verifyUnqualifiedStatement from "../verify/statement/unqualified";
6
+
7
+ import { nodeQuery, nodesQuery } from "../utilities/query";
8
+
9
+ const statementNodeQuery = nodeQuery("/unqualifiedStatement/statement"),
10
+ unqualifiedStatementNodesQuery = nodesQuery("/antecedent|antecedents/unqualifiedStatement");
11
+
12
+ export default function verifyAntecedentOrAntecedents(antecedentOrAntecedentsNode, antecedents, proofContext) {
13
+ let antecedentOrAntecedentsVerified;
14
+
15
+ proofContext.begin(antecedentOrAntecedentsNode);
16
+
17
+ const unqualifiedStatementNodes = unqualifiedStatementNodesQuery(antecedentOrAntecedentsNode);
18
+
19
+ antecedentOrAntecedentsVerified = unqualifiedStatementNodes.every((unqualifiedStatementNode) => {
20
+ const unqualifiedStatementVerified = verifyUnqualifiedStatement(unqualifiedStatementNode, proofContext);
21
+
22
+ if (unqualifiedStatementVerified) {
23
+ const statementNode = statementNodeQuery(unqualifiedStatementNode),
24
+ assertion = Assertion.fromUnqualifiedStatementNode(unqualifiedStatementNode),
25
+ antecedent = Antecedent.fromStatementNode(statementNode);
26
+
27
+ antecedents.push(antecedent);
28
+
29
+ proofContext.addAssertion(assertion);
30
+
31
+ return true;
32
+ }
33
+ });
34
+
35
+ antecedentOrAntecedentsVerified ?
36
+ proofContext.complete(antecedentOrAntecedentsNode) :
37
+ proofContext.halt(antecedentOrAntecedentsNode);
38
+
39
+ return antecedentOrAntecedentsVerified;
40
+ }
@@ -1,17 +1,18 @@
1
1
  "use strict";
2
2
 
3
3
  import Axiom from "../axiom";
4
- import verifyLabels from "../verify/labels";
5
4
  import ProofContext from "../context/proof";
6
- import verifyUnqualifiedStatement from "../verify/statement/unqualified";
7
- import verifyIndicativeConditional from "../verify/indicativeConditional";
5
+ import verifyLabels from "../verify/labels";
6
+ import verifyConditionalIndicative from "../verify/conditinalIndicative";
7
+ import verifyUnconditionalIndicative from "../verify/unconditionalIndicative";
8
8
 
9
+ import { first } from "../utilities/array";
9
10
  import { nodesAsString } from "../utilities/string";
10
11
  import { nodeQuery, nodesQuery } from "../utilities/query";
11
12
 
12
13
  const labelNodesQuery = nodesQuery("/axiom/label"),
13
- unqualifiedStatementNodeQuery = nodeQuery("/axiom/unqualifiedStatement!"),
14
- indicativeConditionalNodeQuery = nodeQuery("/axiom/indicativeConditional!");
14
+ conditionalIndicativeNodeQuery = nodeQuery("/axiom/conditionalIndicative!"),
15
+ unconditionalIndicativeNodeQuery = nodeQuery("/axiom/unconditionalIndicative!");
15
16
 
16
17
  export default function verifyAxiom(axiomNode, fileContext) {
17
18
  let axiomVerified = false;
@@ -28,22 +29,26 @@ export default function verifyAxiom(axiomNode, fileContext) {
28
29
  labelsVerified = verifyLabels(labelNodes, labels, fileContext);
29
30
 
30
31
  if (labelsVerified) {
31
- const unqualifiedStatementNode = unqualifiedStatementNodeQuery(axiomNode),
32
- indicativeConditionalNode = indicativeConditionalNodeQuery(axiomNode);
32
+ const antecedents = [],
33
+ consequents = [],
34
+ conditionalIndicativeNode = conditionalIndicativeNodeQuery(axiomNode),
35
+ unconditionalIndicativeNode = unconditionalIndicativeNodeQuery(axiomNode);
33
36
 
34
- let unqualifiedStatementVerified = false,
35
- indicativeConditionalVerified = false;
37
+ let conditionalIndicativeVerified = false,
38
+ unconditionalIndicativeVerified = false;
36
39
 
37
- if (unqualifiedStatementNode !== null) {
38
- unqualifiedStatementVerified = verifyUnqualifiedStatement(unqualifiedStatementNode, proofContext);
40
+ if (conditionalIndicativeNode !== null) {
41
+ conditionalIndicativeVerified = verifyConditionalIndicative(conditionalIndicativeNode, antecedents, consequents, proofContext);
39
42
  }
40
43
 
41
- if (indicativeConditionalNode !== null) {
42
- indicativeConditionalVerified = verifyIndicativeConditional(indicativeConditionalNode, proofContext);
44
+ if (unconditionalIndicativeNode !== null) {
45
+ unconditionalIndicativeVerified = verifyUnconditionalIndicative(unconditionalIndicativeNode, consequents, proofContext);
43
46
  }
44
47
 
45
- if (unqualifiedStatementVerified || indicativeConditionalVerified) {
46
- const axiom = Axiom.fromLabelsUnqualifiedStatementNodeAndIndicativeConditionalNode(labels, unqualifiedStatementNode, indicativeConditionalNode);
48
+ if (conditionalIndicativeVerified || unconditionalIndicativeVerified) {
49
+ const firstConsequent = first(consequents),
50
+ consequent = firstConsequent, ///
51
+ axiom = Axiom.fromLabelsAntecedentsAndConsequent(labels, antecedents, consequent);
47
52
 
48
53
  fileContext.addAxiom(axiom);
49
54
 
@@ -57,7 +62,7 @@ export default function verifyAxiom(axiomNode, fileContext) {
57
62
 
58
63
  axiomVerified ?
59
64
  fileContext.complete(axiomNode) :
60
- fileContext.halt(axiomNode);
65
+ fileContext.complete(axiomNode);
61
66
 
62
67
  return axiomVerified;
63
68
  }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ import verifyConsequent from "../verify/consequent";
4
+ import verifyAntecedentOrAntecedents from "../verify/antecedentOrAntecedents";
5
+
6
+ import { nodeQuery } from "../utilities/query";
7
+
8
+ const consequentNodeQuery = nodeQuery("/conditionalIndicative/consequent!"),
9
+ antecedentOrAntecedentsNodeQuery = nodeQuery("/conditionalIndicative/antecedent|antecedents!");
10
+
11
+ export default function verifyConditionalIndicative(conditionalIndicativeNode, antecedents, consequents, proofContext) {
12
+ let conditionalIndicativeVerified = false;
13
+
14
+ proofContext.begin(conditionalIndicativeNode);
15
+
16
+ const consequentNode = consequentNodeQuery(conditionalIndicativeNode),
17
+ antecedentOrAntecedentsNode = antecedentOrAntecedentsNodeQuery(conditionalIndicativeNode),
18
+ antecedentOrAntecedentsVerified = verifyAntecedentOrAntecedents(antecedentOrAntecedentsNode, antecedents, proofContext);
19
+
20
+ if (antecedentOrAntecedentsVerified) {
21
+ const consequentVerified = verifyConsequent(consequentNode, consequents, proofContext);
22
+
23
+ conditionalIndicativeVerified = consequentVerified; ///
24
+ }
25
+
26
+ conditionalIndicativeVerified ?
27
+ proofContext.complete(conditionalIndicativeNode) :
28
+ proofContext.halt(conditionalIndicativeNode);
29
+
30
+ return conditionalIndicativeVerified;
31
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ import verifyUnqualifiedStatement from "../verify/statement/unqualified";
4
+
5
+ import { nodesQuery } from "../utilities/query";
6
+
7
+ const unqualifiedStatementNodesQuery = nodesQuery("/conditionalIndicative/unqualifiedStatement");
8
+
9
+ export default function verifyConditionalIndicative(conditionalIndicativeNode, proofContext) {
10
+ let conditionalIndicativeVerified;
11
+
12
+ proofContext.begin(conditionalIndicativeNode);
13
+
14
+ const unqualifiedStatementNodes = unqualifiedStatementNodesQuery(conditionalIndicativeNode);
15
+
16
+ conditionalIndicativeVerified = unqualifiedStatementNodes.every((unqualifiedStatementNode) => {
17
+ const unqualifiedStatementVerified = verifyUnqualifiedStatement(unqualifiedStatementNode, proofContext);
18
+
19
+ if (unqualifiedStatementVerified) {
20
+ return true;
21
+ }
22
+ });
23
+
24
+ conditionalIndicativeVerified ?
25
+ proofContext.complete(conditionalIndicativeNode) :
26
+ proofContext.halt(conditionalIndicativeNode);
27
+
28
+ return conditionalIndicativeVerified;
29
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ import Consequent from "../consequent";
4
+ import verifyUnqualifiedStatement from "../verify/statement/unqualified";
5
+
6
+ import { nodeQuery } from "../utilities/query";
7
+
8
+ const statementNodeQuery = nodeQuery("/*/statement!"),
9
+ unqualifiedStatementNodeQuery = nodeQuery("/consequent/unqualifiedStatement!");
10
+
11
+ export default function verifyConsequent(consequentNode, consequents, proofContext) {
12
+ let consequentVerified = false;
13
+
14
+ proofContext.begin(consequentNode);
15
+
16
+ const unqualifiedStatementNode = unqualifiedStatementNodeQuery(consequentNode);
17
+
18
+ if (unqualifiedStatementNode !== null) {
19
+ const unqualifiedStatementVerified = verifyUnqualifiedStatement(unqualifiedStatementNode, proofContext);
20
+
21
+ if (unqualifiedStatementVerified) {
22
+ const statementNode = statementNodeQuery(unqualifiedStatementNode),
23
+ consequent = Consequent.fromStatementNode(statementNode);
24
+
25
+ consequents.push(consequent);
26
+
27
+ consequentVerified = true;
28
+ }
29
+ }
30
+
31
+ consequentVerified ?
32
+ proofContext.complete(consequentNode) :
33
+ proofContext.halt(consequentNode);
34
+
35
+ return consequentVerified;
36
+ }
@@ -1,17 +1,21 @@
1
1
  "use strict";
2
2
 
3
3
  import Lemma from "../lemma";
4
- import verifyLabels from "../verify/labels";
4
+ import verifyProof from "../verify/proof";
5
5
  import ProofContext from "../context/proof";
6
- import verifyUnqualifiedStatement from "../verify/statement/unqualified";
7
- import verifyIndicativeConditional from "../verify/indicativeConditional";
6
+ import verifyLabels from "../verify/labels";
7
+ import verifyConditionalIndicative from "../verify/conditinalIndicative";
8
+ import verifyUnconditionalIndicative from "../verify/unconditionalIndicative";
8
9
 
10
+ import { first } from "../utilities/array";
11
+ import { EMPTY_STRING } from "../constants";
9
12
  import { nodesAsString } from "../utilities/string";
10
13
  import { nodeQuery, nodesQuery } from "../utilities/query";
11
14
 
12
- const labelNodesQuery = nodesQuery("/lemma/label"),
13
- unqualifiedStatementNodeQuery = nodeQuery("/lemma/unqualifiedStatement!"),
14
- indicativeConditionalNodeQuery = nodeQuery("/lemma/indicativeConditional!");
15
+ const proofNodeQuery = nodeQuery("/lemma/proof!"),
16
+ labelNodesQuery = nodesQuery("/lemma/label"),
17
+ conditionalIndicativeNodeQuery = nodeQuery("/lemma/conditionalIndicative!"),
18
+ unconditionalIndicativeNodeQuery = nodeQuery("/lemma/unconditionalIndicative!");
15
19
 
16
20
  export default function verifyLemma(lemmaNode, fileContext) {
17
21
  let lemmaVerified = false;
@@ -22,42 +26,55 @@ export default function verifyLemma(lemmaNode, fileContext) {
22
26
  labelsString = nodesAsString(labelNodes),
23
27
  proofContext = ProofContext.fromFileContext(fileContext);
24
28
 
25
- fileContext.debug(`Verifying the '${labelsString}' lemma...`);
29
+ (labelsString === EMPTY_STRING) ?
30
+ fileContext.debug(`Verifying a lemma...`) :
31
+ fileContext.debug(`Verifying the '${labelsString}' lemma...`);
26
32
 
27
33
  const labels = [],
28
34
  labelsVerified = verifyLabels(labelNodes, labels, fileContext);
29
35
 
30
36
  if (labelsVerified) {
31
- const unqualifiedStatementNode = unqualifiedStatementNodeQuery(lemmaNode),
32
- indicativeConditionalNode = indicativeConditionalNodeQuery(lemmaNode);
37
+ const antecedents = [],
38
+ consequents = [],
39
+ conditionalIndicativeNode = conditionalIndicativeNodeQuery(lemmaNode),
40
+ unconditionalIndicativeNode = unconditionalIndicativeNodeQuery(lemmaNode);
33
41
 
34
- let unqualifiedStatementVerified = false,
35
- indicativeConditionalVerified = false;
42
+ let conditionalIndicativeVerified = false,
43
+ unconditionalIndicativeVerified = false;
36
44
 
37
- if (unqualifiedStatementNode !== null) {
38
- unqualifiedStatementVerified = verifyUnqualifiedStatement(unqualifiedStatementNode, proofContext);
45
+ if (conditionalIndicativeNode !== null) {
46
+ conditionalIndicativeVerified = verifyConditionalIndicative(conditionalIndicativeNode, antecedents, consequents, proofContext);
39
47
  }
40
48
 
41
- if (indicativeConditionalNode !== null) {
42
- indicativeConditionalVerified = verifyIndicativeConditional(indicativeConditionalNode, proofContext);
49
+ if (unconditionalIndicativeNode !== null) {
50
+ unconditionalIndicativeVerified = verifyUnconditionalIndicative(unconditionalIndicativeNode, consequents, proofContext);
43
51
  }
44
52
 
45
- if (unqualifiedStatementVerified || indicativeConditionalVerified) {
46
- const lemma = Lemma.fromLabelsUnqualifiedStatementNodeAndIndicativeConditionalNode(labels, unqualifiedStatementNode, indicativeConditionalNode);
53
+ if (conditionalIndicativeVerified || unconditionalIndicativeVerified) {
54
+ const proofNode = proofNodeQuery(lemmaNode),
55
+ firstConsequent = first(consequents),
56
+ consequent = firstConsequent, ///
57
+ proofVerified = verifyProof(proofNode, consequent, proofContext);
58
+
59
+ if (proofVerified) {
60
+ const lemma = Lemma.fromLabelsAntecedentsAndConsequent(labels, antecedents, consequent);
47
61
 
48
- fileContext.addLemma(lemma);
62
+ fileContext.addLemma(lemma);
49
63
 
50
- lemmaVerified = true;
64
+ lemmaVerified = true;
65
+ }
51
66
  }
52
67
  }
53
68
 
54
69
  if (lemmaVerified) {
55
- fileContext.info(`Verified the '${labelsString}' lemma.`);
70
+ (labelsString === EMPTY_STRING) ?
71
+ fileContext.info(`Verified the lemma.`) :
72
+ fileContext.info(`Verified the '${labelsString}' lemma.`);
56
73
  }
57
74
 
58
75
  lemmaVerified ?
59
76
  fileContext.complete(lemmaNode) :
60
- fileContext.halt(lemmaNode);
77
+ fileContext.complete(lemmaNode);
61
78
 
62
79
  return lemmaVerified;
63
80
  }
@@ -9,7 +9,7 @@ import { nodeQuery } from "../utilities/query";
9
9
  const metaDerivationNodeQuery = nodeQuery("/metaproof/metaDerivation!"),
10
10
  qualifiedMetastatementNodeQuery = nodeQuery("/metaproof/qualifiedMetastatement!");
11
11
 
12
- export default function verifyMetaproof(metaproofNode, metastatementNode, metaproofContext) {
12
+ export default function verifyMetaproof(metaproofNode, conclusion, metaproofContext) {
13
13
  let metaproofVerified = false;
14
14
 
15
15
  metaproofContext.begin(metaproofNode);
@@ -37,6 +37,7 @@ export default function verifyMetaproof(metaproofNode, metastatementNode, metapr
37
37
  if (metaDerivationVerified || qualifiedMetastatementVerified) {
38
38
  const lastMetaAssertion = metaproofContext.getLastMetaAssertion(),
39
39
  metaAssertion = lastMetaAssertion, ///
40
+ metastatementNode = conclusion.getMetastatementNode(),
40
41
  metaAssertionMetastatementNode = metaAssertion.getMetastatementNode(),
41
42
  metaAssertionMetastatementNodeMatches = matchMetaProofMetastatementNode(metaAssertionMetastatementNode, metastatementNode);
42
43
 
@@ -55,9 +55,7 @@ export default function verifyRule(ruleNode, fileContext) {
55
55
  let metaproofVerified = true;
56
56
 
57
57
  if (metaproofNode !== null) {
58
- const metastatementNode = conclusion.getMetastatementNode();
59
-
60
- metaproofVerified = verifyMetaproof(metaproofNode, metastatementNode, metaproofContext);
58
+ metaproofVerified = verifyMetaproof(metaproofNode, conclusion, metaproofContext);
61
59
  }
62
60
 
63
61
  if (metaproofVerified) {
@@ -1,19 +1,20 @@
1
1
  "use strict";
2
2
 
3
3
  import Theorem from "../theorem";
4
- import verifyProof from "./proof";
5
- import verifyLabels from "../verify/labels";
4
+ import verifyProof from "../verify/proof";
6
5
  import ProofContext from "../context/proof";
7
- import verifyUnqualifiedStatement from "../verify/statement/unqualified";
8
- import verifyIndicativeConditional from "../verify/indicativeConditional";
6
+ import verifyLabels from "../verify/labels";
7
+ import verifyConditionalIndicative from "../verify/conditinalIndicative";
8
+ import verifyUnconditionalIndicative from "../verify/unconditionalIndicative";
9
9
 
10
+ import { first } from "../utilities/array";
10
11
  import { nodesAsString } from "../utilities/string";
11
12
  import { nodeQuery, nodesQuery } from "../utilities/query";
12
13
 
13
- const proofNodeQuery = nodeQuery("/theorem/proof"),
14
+ const proofNodeQuery = nodeQuery("/theorem/proof!"),
14
15
  labelNodesQuery = nodesQuery("/theorem/label"),
15
- unqualifiedStatementNodeQuery = nodeQuery("/theorem/unqualifiedStatement!"),
16
- indicativeConditionalNodeQuery = nodeQuery("/theorem/indicativeConditional!");
16
+ conditionalIndicativeNodeQuery = nodeQuery("/theorem/conditionalIndicative!"),
17
+ unconditionalIndicativeNodeQuery = nodeQuery("/theorem/unconditionalIndicative!");
17
18
 
18
19
  export default function verifyTheorem(theoremNode, fileContext) {
19
20
  let theoremVerified = false;
@@ -30,30 +31,35 @@ export default function verifyTheorem(theoremNode, fileContext) {
30
31
  labelsVerified = verifyLabels(labelNodes, labels, fileContext);
31
32
 
32
33
  if (labelsVerified) {
33
- const unqualifiedStatementNode = unqualifiedStatementNodeQuery(theoremNode),
34
- indicativeConditionalNode = indicativeConditionalNodeQuery(theoremNode);
34
+ const antecedents = [],
35
+ consequents = [],
36
+ conditionalIndicativeNode = conditionalIndicativeNodeQuery(theoremNode),
37
+ unconditionalIndicativeNode = unconditionalIndicativeNodeQuery(theoremNode);
35
38
 
36
- let unqualifiedStatementVerified = false,
37
- indicativeConditionalVerified = false;
39
+ let conditionalIndicativeVerified = false,
40
+ unconditionalIndicativeVerified = false;
38
41
 
39
- if (unqualifiedStatementNode !== null) {
40
- unqualifiedStatementVerified = verifyUnqualifiedStatement(unqualifiedStatementNode, proofContext);
42
+ if (conditionalIndicativeNode !== null) {
43
+ conditionalIndicativeVerified = verifyConditionalIndicative(conditionalIndicativeNode, antecedents, consequents, proofContext);
41
44
  }
42
45
 
43
- if (indicativeConditionalNode !== null) {
44
- indicativeConditionalVerified = verifyIndicativeConditional(indicativeConditionalNode, proofContext);
46
+ if (unconditionalIndicativeNode !== null) {
47
+ unconditionalIndicativeVerified = verifyUnconditionalIndicative(unconditionalIndicativeNode, consequents, proofContext);
45
48
  }
46
49
 
47
- if (unqualifiedStatementVerified || indicativeConditionalVerified) {
50
+ if (conditionalIndicativeVerified || unconditionalIndicativeVerified) {
48
51
  const proofNode = proofNodeQuery(theoremNode),
49
- statements =
50
- proofVerified = verifyProof(proofNode, fileContext);
52
+ firstConsequent = first(consequents),
53
+ consequent = firstConsequent, ///
54
+ proofVerified = verifyProof(proofNode, consequent, proofContext);
51
55
 
52
- const theorem = Theorem.fromLabelsUnqualifiedStatementNodeAndIndicativeConditionalNode(labels, unqualifiedStatementNode, indicativeConditionalNode);
56
+ if (proofVerified) {
57
+ const theorem = Theorem.fromLabelsAntecedentsAndConsequent(labels, antecedents, consequent);
53
58
 
54
- fileContext.addTheorem(theorem);
59
+ fileContext.addTheorem(theorem);
55
60
 
56
- theoremVerified = true;
61
+ theoremVerified = true;
62
+ }
57
63
  }
58
64
  }
59
65
 
@@ -63,7 +69,7 @@ export default function verifyTheorem(theoremNode, fileContext) {
63
69
 
64
70
  theoremVerified ?
65
71
  fileContext.complete(theoremNode) :
66
- fileContext.halt(theoremNode);
72
+ fileContext.complete(theoremNode);
67
73
 
68
74
  return theoremVerified;
69
75
  }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ import verifyConsequent from "../verify/consequent";
4
+
5
+ import { nodeQuery } from "../utilities/query";
6
+
7
+ const consequentNodeQuery = nodeQuery("/unconditionalIndicative/consequent!");
8
+
9
+ export default function verifyUnconditionalIndicative(conditionalIndicativeNode, consequents, proofContext) {
10
+ let unconditionalIndicativeVerified;
11
+
12
+ proofContext.begin(conditionalIndicativeNode);
13
+
14
+ const consequentNode = consequentNodeQuery(conditionalIndicativeNode),
15
+ consequentVerified = verifyConsequent(consequentNode, consequents, proofContext);
16
+
17
+ unconditionalIndicativeVerified = consequentVerified; ///
18
+
19
+ unconditionalIndicativeVerified ?
20
+ proofContext.complete(conditionalIndicativeNode) :
21
+ proofContext.halt(conditionalIndicativeNode);
22
+
23
+ return unconditionalIndicativeVerified;
24
+ }