occam-verify-cli 0.0.262 → 0.0.264
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/conclusion.js +123 -0
- package/bin/metaSubstitution.js +84 -0
- package/bin/premise.js +137 -6
- package/bin/rule.js +70 -27
- package/bin/ruleNames.js +2 -2
- package/bin/verify/metaAntecedent.js +4 -17
- package/bin/verify/metaConsequent.js +3 -12
- package/bin/verify/metaDerivation.js +31 -32
- package/bin/verify/metaproof.js +12 -10
- package/bin/verify/metastatement/qualified.js +3 -5
- package/bin/verify/{premise.js → premiseOrPremises.js} +11 -13
- package/bin/verify/rule/inferenceConditional.js +14 -36
- package/bin/verify/rule/unqualifiedMetastatement.js +10 -18
- package/bin/verify/rule.js +16 -6
- package/package.json +3 -3
- package/bin/metaAntecedent.js +0 -19
- package/bin/metaConsequent.js +0 -19
- package/bin/utilities/rule.js +0 -279
package/bin/conclusion.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
const { METAVARIABLE_RULE_NAME } = require("./ruleNames"),
|
|
4
|
+
{ metavariableNameFromMetavariableNode } = require("./utilities/query");
|
|
5
|
+
|
|
3
6
|
class Conclusion {
|
|
4
7
|
constructor(metastatementNode) {
|
|
5
8
|
this.metastatementNode = metastatementNode;
|
|
@@ -9,6 +12,15 @@ class Conclusion {
|
|
|
9
12
|
return this.metastatementNode;
|
|
10
13
|
}
|
|
11
14
|
|
|
15
|
+
matchNonTerminalNode(metastatementNode, metaSubstitutions) {
|
|
16
|
+
const nonTerminalNode = metastatementNode, ///
|
|
17
|
+
conclusionNonTerminalNode = this.metastatementNode, ///
|
|
18
|
+
conclusionNonTerminalNodeMatches = matchConclusionNonTerminalNode(conclusionNonTerminalNode, nonTerminalNode, metaSubstitutions),
|
|
19
|
+
nonTerminalNodeMatches = conclusionNonTerminalNodeMatches; ///
|
|
20
|
+
|
|
21
|
+
return nonTerminalNodeMatches;
|
|
22
|
+
}
|
|
23
|
+
|
|
12
24
|
static fromMetastatementNode(metastatementNode) {
|
|
13
25
|
const conclusion = new Conclusion(metastatementNode);
|
|
14
26
|
|
|
@@ -17,3 +29,114 @@ class Conclusion {
|
|
|
17
29
|
}
|
|
18
30
|
|
|
19
31
|
module.exports = Conclusion;
|
|
32
|
+
|
|
33
|
+
function matchConclusionNode(conclusionNode, node, metaSubstitutions) {
|
|
34
|
+
let conclusionNodeMatches = false;
|
|
35
|
+
|
|
36
|
+
const nodeTerminalNode = node.isTerminalNode(),
|
|
37
|
+
ruleNodeTerminalNode = conclusionNode.isTerminalNode();
|
|
38
|
+
|
|
39
|
+
if (nodeTerminalNode === ruleNodeTerminalNode) {
|
|
40
|
+
if (nodeTerminalNode) {
|
|
41
|
+
const terminalNode = node, ///
|
|
42
|
+
conclusionTerminalNode = conclusionNode, ///
|
|
43
|
+
conclusionTerminalNodeMatches = matchConclusionTerminalNode(conclusionTerminalNode, terminalNode, metaSubstitutions);
|
|
44
|
+
|
|
45
|
+
conclusionNodeMatches = conclusionTerminalNodeMatches; ///
|
|
46
|
+
} else {
|
|
47
|
+
const nonTerminalNode = node, ///
|
|
48
|
+
conclusionNonTerminalNode = conclusionNode, ///
|
|
49
|
+
conclusionNonTerminalNodeMatches = matchConclusionNonTerminalNode(conclusionNonTerminalNode, nonTerminalNode, metaSubstitutions);
|
|
50
|
+
|
|
51
|
+
conclusionNodeMatches = conclusionNonTerminalNodeMatches; ///
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return conclusionNodeMatches;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function matchConclusionChildNodes(conclusionChildNodes, childNodes, metaSubstitutions) {
|
|
59
|
+
let conclusionChildNodesMatches = false;
|
|
60
|
+
|
|
61
|
+
const childNodesLength = childNodes.length,
|
|
62
|
+
conclusionChildNodesLength = conclusionChildNodes.length;
|
|
63
|
+
|
|
64
|
+
if (childNodesLength === conclusionChildNodesLength) {
|
|
65
|
+
conclusionChildNodesMatches = childNodes.every((childNode, index) => {
|
|
66
|
+
const conclusionChildNode = conclusionChildNodes[index],
|
|
67
|
+
conclusionNode = conclusionChildNode, ///
|
|
68
|
+
node = childNode, ///
|
|
69
|
+
conclusionNodeMatches = matchConclusionNode(conclusionNode, node, metaSubstitutions);
|
|
70
|
+
|
|
71
|
+
if (conclusionNodeMatches) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return conclusionChildNodesMatches;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function matchConclusionMetavariable(conclusionMetavariableNode, nonTerminalNode, metaSubstitutions) {
|
|
81
|
+
let conclusionMetavariableMatches = true;
|
|
82
|
+
|
|
83
|
+
const conclusionMetavariableName = metavariableNameFromMetavariableNode(conclusionMetavariableNode),
|
|
84
|
+
metaSubstitution = metaSubstitutions.find((metaSubstitution) => {
|
|
85
|
+
const metavariableName = metaSubstitution.getMetavariableName();
|
|
86
|
+
|
|
87
|
+
if (metavariableName === conclusionMetavariableName) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}) || null;
|
|
91
|
+
|
|
92
|
+
if (metaSubstitution !== null) {
|
|
93
|
+
const metaSubstitutionNonTerminalNodeMatches = metaSubstitution.matchNonTerminalNode(nonTerminalNode);
|
|
94
|
+
|
|
95
|
+
conclusionMetavariableMatches = metaSubstitutionNonTerminalNodeMatches; ///
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return conclusionMetavariableMatches;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function matchConclusionTerminalNode(conclusionTerminalNode, terminalNode, metaSubstitutions) {
|
|
102
|
+
let conclusionTerminalNodeMatches = false;
|
|
103
|
+
|
|
104
|
+
const matches = conclusionTerminalNode.match(terminalNode);
|
|
105
|
+
|
|
106
|
+
if (matches) {
|
|
107
|
+
conclusionTerminalNodeMatches = true;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return conclusionTerminalNodeMatches;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function matchConclusionNonTerminalNode(conclusionNonTerminalNode, nonTerminalNode, metaSubstitutions) {
|
|
114
|
+
let conclusionNonTerminalNodeMatches = false;
|
|
115
|
+
|
|
116
|
+
const conclusionRuleName = conclusionNonTerminalNode.getRuleName(); ///
|
|
117
|
+
|
|
118
|
+
switch (conclusionRuleName) {
|
|
119
|
+
case METAVARIABLE_RULE_NAME: {
|
|
120
|
+
const conclusionMetavariableNode = conclusionNonTerminalNode, ///
|
|
121
|
+
conclusionMetavariableMatches = matchConclusionMetavariable(conclusionMetavariableNode, nonTerminalNode, metaSubstitutions);
|
|
122
|
+
|
|
123
|
+
conclusionNonTerminalNodeMatches = conclusionMetavariableMatches;
|
|
124
|
+
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
default: {
|
|
129
|
+
const ruleName = nonTerminalNode.getRuleName();
|
|
130
|
+
|
|
131
|
+
if (ruleName === conclusionRuleName) {
|
|
132
|
+
const childNodes = nonTerminalNode.getChildNodes(),
|
|
133
|
+
conclusionChildNodes = conclusionNonTerminalNode.getChildNodes(),
|
|
134
|
+
conclusionChildNodesMatches = matchConclusionChildNodes(conclusionChildNodes, childNodes, metaSubstitutions);
|
|
135
|
+
|
|
136
|
+
conclusionNonTerminalNodeMatches = conclusionChildNodesMatches; ///
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return conclusionNonTerminalNodeMatches;
|
|
142
|
+
}
|
package/bin/metaSubstitution.js
CHANGED
|
@@ -14,6 +14,14 @@ class MetaSubstitution {
|
|
|
14
14
|
return this.nonTerminalNode;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
matchNonTerminalNode(nonTerminalNode) {
|
|
18
|
+
const metaSubstitutionNonTerminalNode = this.nonTerminalNode,
|
|
19
|
+
metaSubstitutionNonTerminalNodeMatches = matchMetaSubstitutionNonTerminalNode(metaSubstitutionNonTerminalNode, nonTerminalNode),
|
|
20
|
+
nonTerminalNodeMatches = metaSubstitutionNonTerminalNodeMatches; ///
|
|
21
|
+
|
|
22
|
+
return nonTerminalNodeMatches;
|
|
23
|
+
}
|
|
24
|
+
|
|
17
25
|
static fromMetavariableNameAndNonTerminalNode(metavariableName, nonTerminalNode) {
|
|
18
26
|
const metaSubstitution = new MetaSubstitution(metavariableName, nonTerminalNode);
|
|
19
27
|
|
|
@@ -22,3 +30,79 @@ class MetaSubstitution {
|
|
|
22
30
|
}
|
|
23
31
|
|
|
24
32
|
module.exports = MetaSubstitution;
|
|
33
|
+
|
|
34
|
+
function matchMetaSubstitutionNode(metaSubstitutionNode, node) {
|
|
35
|
+
let metaSubstitutionNodeMatches = false;
|
|
36
|
+
|
|
37
|
+
const nodeTerminalNode = node.isTerminalNode(),
|
|
38
|
+
ruleNodeTerminalNode = metaSubstitutionNode.isTerminalNode();
|
|
39
|
+
|
|
40
|
+
if (nodeTerminalNode === ruleNodeTerminalNode) {
|
|
41
|
+
if (nodeTerminalNode) {
|
|
42
|
+
const terminalNode = node, ///
|
|
43
|
+
metaSubstitutionTerminalNode = metaSubstitutionNode, ///
|
|
44
|
+
metaSubstitutionTerminalNodeMatches = matchMetaSubstitutionTerminalNode(metaSubstitutionTerminalNode, terminalNode);
|
|
45
|
+
|
|
46
|
+
metaSubstitutionNodeMatches = metaSubstitutionTerminalNodeMatches; ///
|
|
47
|
+
} else {
|
|
48
|
+
const nonTerminalNode = node, ///
|
|
49
|
+
metaSubstitutionNonTerminalNode = metaSubstitutionNode, ///
|
|
50
|
+
metaSubstitutionNonTerminalNodeMatches = matchMetaSubstitutionNonTerminalNode(metaSubstitutionNonTerminalNode, nonTerminalNode);
|
|
51
|
+
|
|
52
|
+
metaSubstitutionNodeMatches = metaSubstitutionNonTerminalNodeMatches; ///
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return metaSubstitutionNodeMatches;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function matchMetaSubstitutionChildNodes(metaSubstitutionChildNodes, childNodes) {
|
|
60
|
+
let metaSubstitutionChildNodesMatches = false;
|
|
61
|
+
|
|
62
|
+
const childNodesLength = childNodes.length,
|
|
63
|
+
metaSubstitutionChildNodesLength = metaSubstitutionChildNodes.length;
|
|
64
|
+
|
|
65
|
+
if (childNodesLength === metaSubstitutionChildNodesLength) {
|
|
66
|
+
metaSubstitutionChildNodesMatches = childNodes.every((childNode, index) => {
|
|
67
|
+
const metaSubstitutionChildNode = metaSubstitutionChildNodes[index],
|
|
68
|
+
metaSubstitutionNode = metaSubstitutionChildNode, ///
|
|
69
|
+
node = childNode, ///
|
|
70
|
+
metaSubstitutionNodeMatches = matchMetaSubstitutionNode(metaSubstitutionNode, node);
|
|
71
|
+
|
|
72
|
+
if (metaSubstitutionNodeMatches) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return metaSubstitutionChildNodesMatches;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function matchMetaSubstitutionTerminalNode(metaSubstitutionTerminalNode, terminalNode) {
|
|
82
|
+
let metaSubstitutionTerminalNodeMatches = false;
|
|
83
|
+
|
|
84
|
+
const matches = metaSubstitutionTerminalNode.match(terminalNode);
|
|
85
|
+
|
|
86
|
+
if (matches) {
|
|
87
|
+
metaSubstitutionTerminalNodeMatches = true;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return metaSubstitutionTerminalNodeMatches;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function matchMetaSubstitutionNonTerminalNode(metaSubstitutionNonTerminalNode, nonTerminalNode) {
|
|
94
|
+
let metaSubstitutionNonTerminalNodeMatches = false;
|
|
95
|
+
|
|
96
|
+
const ruleName = nonTerminalNode.getRuleName(),
|
|
97
|
+
metaSubstitutionRuleName = metaSubstitutionNonTerminalNode.getRuleName(); ///
|
|
98
|
+
|
|
99
|
+
if (ruleName === metaSubstitutionRuleName) {
|
|
100
|
+
const childNodes = nonTerminalNode.getChildNodes(),
|
|
101
|
+
metaSubstitutionChildNodes = metaSubstitutionNonTerminalNode.getChildNodes(),
|
|
102
|
+
metaSubstitutionChildNodesMatches = matchMetaSubstitutionChildNodes(metaSubstitutionChildNodes, childNodes);
|
|
103
|
+
|
|
104
|
+
metaSubstitutionNonTerminalNodeMatches = metaSubstitutionChildNodesMatches; ///
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return metaSubstitutionNonTerminalNodeMatches;
|
|
108
|
+
}
|
package/bin/premise.js
CHANGED
|
@@ -1,19 +1,150 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
const MetaSubstitution = require("./metaSubstitution");
|
|
4
|
+
|
|
5
|
+
const { METAVARIABLE_RULE_NAME } = require("./ruleNames"),
|
|
6
|
+
{ metavariableNameFromMetavariableNode } = require("./utilities/query");
|
|
7
|
+
|
|
3
8
|
class Premise {
|
|
4
|
-
constructor(
|
|
5
|
-
this.
|
|
9
|
+
constructor(metastatementNode) {
|
|
10
|
+
this.metastatementNode = metastatementNode;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
getMetastatementNode() {
|
|
14
|
+
return this.metastatementNode;
|
|
6
15
|
}
|
|
7
16
|
|
|
8
|
-
|
|
9
|
-
|
|
17
|
+
matchNonTerminalNode(nonTerminalNode, metaSubstitutions) {
|
|
18
|
+
const premiseNonTerminalNode = this.metastatementNode, ///
|
|
19
|
+
premiseNonTerminalNodeMatches = matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions),
|
|
20
|
+
nonTerminalNodeMatches = premiseNonTerminalNodeMatches; ///
|
|
21
|
+
|
|
22
|
+
return nonTerminalNodeMatches;
|
|
10
23
|
}
|
|
11
24
|
|
|
12
|
-
static
|
|
13
|
-
const premise = new Premise(
|
|
25
|
+
static fromMetastatementNode(metastatementNode) {
|
|
26
|
+
const premise = new Premise(metastatementNode);
|
|
14
27
|
|
|
15
28
|
return premise;
|
|
16
29
|
}
|
|
17
30
|
}
|
|
18
31
|
|
|
19
32
|
module.exports = Premise;
|
|
33
|
+
|
|
34
|
+
function matchPremiseNode(premiseNode, node, metaSubstitutions) {
|
|
35
|
+
let premiseNodeMatches = false;
|
|
36
|
+
|
|
37
|
+
const nodeTerminalNode = node.isTerminalNode(),
|
|
38
|
+
ruleNodeTerminalNode = premiseNode.isTerminalNode();
|
|
39
|
+
|
|
40
|
+
if (nodeTerminalNode === ruleNodeTerminalNode) {
|
|
41
|
+
if (nodeTerminalNode) {
|
|
42
|
+
const terminalNode = node, ///
|
|
43
|
+
premiseTerminalNode = premiseNode, ///
|
|
44
|
+
premiseTerminalNodeMatches = matchPremiseTerminalNode(premiseTerminalNode, terminalNode, metaSubstitutions);
|
|
45
|
+
|
|
46
|
+
premiseNodeMatches = premiseTerminalNodeMatches; ///
|
|
47
|
+
} else {
|
|
48
|
+
const nonTerminalNode = node, ///
|
|
49
|
+
premiseNonTerminalNode = premiseNode, ///
|
|
50
|
+
premiseNonTerminalNodeMatches = matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions);
|
|
51
|
+
|
|
52
|
+
premiseNodeMatches = premiseNonTerminalNodeMatches; ///
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return premiseNodeMatches;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function matchPremiseChildNodes(premiseChildNodes, childNodes, metaSubstitutions) {
|
|
60
|
+
let premiseChildNodesMatches = false;
|
|
61
|
+
|
|
62
|
+
const childNodesLength = childNodes.length,
|
|
63
|
+
premiseChildNodesLength = premiseChildNodes.length;
|
|
64
|
+
|
|
65
|
+
if (childNodesLength === premiseChildNodesLength) {
|
|
66
|
+
premiseChildNodesMatches = childNodes.every((childNode, index) => {
|
|
67
|
+
const premiseChildNode = premiseChildNodes[index],
|
|
68
|
+
premiseNode = premiseChildNode, ///
|
|
69
|
+
node = childNode, ///
|
|
70
|
+
premiseNodeMatches = matchPremiseNode(premiseNode, node, metaSubstitutions);
|
|
71
|
+
|
|
72
|
+
if (premiseNodeMatches) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return premiseChildNodesMatches;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function matchPremiseMetavariable(premiseMetavariableNode, nonTerminalNode, metaSubstitutions) {
|
|
82
|
+
let premiseMetavariableMatches;
|
|
83
|
+
|
|
84
|
+
const premiseMetavariableName = metavariableNameFromMetavariableNode(premiseMetavariableNode),
|
|
85
|
+
metaSubstitution = metaSubstitutions.find((metaSubstitution) => {
|
|
86
|
+
const metavariableName = metaSubstitution.getMetavariableName();
|
|
87
|
+
|
|
88
|
+
if (metavariableName === premiseMetavariableName) {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
}) || null;
|
|
92
|
+
|
|
93
|
+
if (metaSubstitution !== null) {
|
|
94
|
+
const nonTerminalNodeMatches = metaSubstitution.matchNonTerminalNode(nonTerminalNode);
|
|
95
|
+
|
|
96
|
+
premiseMetavariableMatches = nonTerminalNodeMatches; ///
|
|
97
|
+
} else {
|
|
98
|
+
const metavariableName = premiseMetavariableName, ///
|
|
99
|
+
metaSubstitution = MetaSubstitution.fromMetavariableNameAndNonTerminalNode(metavariableName, nonTerminalNode);
|
|
100
|
+
|
|
101
|
+
metaSubstitutions.push(metaSubstitution);
|
|
102
|
+
|
|
103
|
+
premiseMetavariableMatches = true;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return premiseMetavariableMatches;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function matchPremiseTerminalNode(premiseTerminalNode, terminalNode, metaSubstitutions) {
|
|
110
|
+
let premiseTerminalNodeMatches = false;
|
|
111
|
+
|
|
112
|
+
const matches = premiseTerminalNode.match(terminalNode);
|
|
113
|
+
|
|
114
|
+
if (matches) {
|
|
115
|
+
premiseTerminalNodeMatches = true;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return premiseTerminalNodeMatches;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function matchPremiseNonTerminalNode(premiseNonTerminalNode, nonTerminalNode, metaSubstitutions) {
|
|
122
|
+
let premiseNonTerminalNodeMatches = false;
|
|
123
|
+
|
|
124
|
+
const premiseRuleName = premiseNonTerminalNode.getRuleName(); ///
|
|
125
|
+
|
|
126
|
+
switch (premiseRuleName) {
|
|
127
|
+
case METAVARIABLE_RULE_NAME: {
|
|
128
|
+
const premiseMetavariableNode = premiseNonTerminalNode, ///
|
|
129
|
+
premiseMetavariableMatches = matchPremiseMetavariable(premiseMetavariableNode, nonTerminalNode, metaSubstitutions);
|
|
130
|
+
|
|
131
|
+
premiseNonTerminalNodeMatches = premiseMetavariableMatches;
|
|
132
|
+
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
default: {
|
|
137
|
+
const ruleName = nonTerminalNode.getRuleName();
|
|
138
|
+
|
|
139
|
+
if (ruleName === premiseRuleName) {
|
|
140
|
+
const childNodes = nonTerminalNode.getChildNodes(),
|
|
141
|
+
premiseChildNodes = premiseNonTerminalNode.getChildNodes(),
|
|
142
|
+
premiseChildNodesMatches = matchPremiseChildNodes(premiseChildNodes, childNodes, metaSubstitutions);
|
|
143
|
+
|
|
144
|
+
premiseNonTerminalNodeMatches = premiseChildNodesMatches; ///
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return premiseNonTerminalNodeMatches;
|
|
150
|
+
}
|
package/bin/rule.js
CHANGED
|
@@ -1,41 +1,44 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
const { labelsAsString } = require("./utilities/string")
|
|
3
|
+
const { labelsAsString } = require("./utilities/string"),
|
|
4
|
+
{ prune, someCombination } = require("./utilities/array");
|
|
4
5
|
|
|
5
6
|
class Rule {
|
|
6
|
-
constructor(labels,
|
|
7
|
+
constructor(labels, premises, conclusion) {
|
|
7
8
|
this.labels = labels;
|
|
8
|
-
this.
|
|
9
|
+
this.premises = premises;
|
|
9
10
|
this.conclusion = conclusion;
|
|
10
|
-
this.metastatementNode = metastatementNode;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
getLabels() {
|
|
14
14
|
return this.labels;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
return this.
|
|
17
|
+
getPremises() {
|
|
18
|
+
return this.premises;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
getConclusion() {
|
|
22
22
|
return this.conclusion;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
this.premise.getMetastatementNodes() :
|
|
28
|
-
[];
|
|
25
|
+
matchMetastatement(metastatementNode, context) {
|
|
26
|
+
let metastatementNodes = context.getMetastatementNodes();
|
|
29
27
|
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
const premisesLength = this.premises.length,
|
|
29
|
+
start = -premisesLength;
|
|
30
|
+
|
|
31
|
+
metastatementNodes = metastatementNodes.slice(start); ///
|
|
32
|
+
|
|
33
|
+
const matchesMetastatement = someCombination(metastatementNodes, (metastatementNodes) => {
|
|
34
|
+
const premisesMatchConclusion = matchPremisesAndConclusion(this.premises, this.conclusion, metastatementNodes, metastatementNode);
|
|
32
35
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
if (premisesMatchConclusion) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
37
40
|
|
|
38
|
-
return
|
|
41
|
+
return matchesMetastatement;
|
|
39
42
|
}
|
|
40
43
|
|
|
41
44
|
asString() {
|
|
@@ -44,21 +47,61 @@ class Rule {
|
|
|
44
47
|
return string;
|
|
45
48
|
}
|
|
46
49
|
|
|
47
|
-
static
|
|
48
|
-
const
|
|
49
|
-
conclusion = null,
|
|
50
|
-
rule = new Rule(labels, premise, conclusion, metastatementNode);
|
|
50
|
+
static fromPremisesConclusionAndLabels(premises, conclusion, labels) {
|
|
51
|
+
const rule = new Rule(labels, premises, conclusion);
|
|
51
52
|
|
|
52
53
|
return rule;
|
|
53
54
|
}
|
|
55
|
+
}
|
|
54
56
|
|
|
55
|
-
|
|
56
|
-
const metastatementNode = null,
|
|
57
|
-
rule = new Rule(labels, premise, conclusion, metastatementNode);
|
|
57
|
+
module.exports = Rule;
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
function matchPremise(premise, metastatementNodes, metaSubstitutions) {
|
|
60
|
+
const metastatementNode = prune(metastatementNodes, (metastatementNode) => {
|
|
61
|
+
const nonTerminalNode = metastatementNode, ///
|
|
62
|
+
nonTerminalNodeMatches = premise.matchNonTerminalNode(nonTerminalNode, metaSubstitutions);
|
|
63
|
+
|
|
64
|
+
if (!nonTerminalNodeMatches) { ///
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
}) || null;
|
|
68
|
+
|
|
69
|
+
const premiseMatches = (metastatementNode !== null);
|
|
70
|
+
|
|
71
|
+
return premiseMatches;
|
|
61
72
|
}
|
|
62
73
|
|
|
63
|
-
|
|
74
|
+
function matchPremises(premise, metastatementNodes, metaSubstitutions) {
|
|
75
|
+
const premisesMatches = premise.every((premise) => {
|
|
76
|
+
const premiseMatches = matchPremise(premise, metastatementNodes, metaSubstitutions);
|
|
77
|
+
|
|
78
|
+
if (premiseMatches) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
});
|
|
64
82
|
|
|
83
|
+
return premisesMatches;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function matchConclusion(conclusion, metastatementNode, metaSubstitutions) {
|
|
87
|
+
const nonTerminalNode = metastatementNode, ///
|
|
88
|
+
nonTerminalNodeMatches = conclusion.matchNonTerminalNode(nonTerminalNode, metaSubstitutions),
|
|
89
|
+
conclusionMatches = nonTerminalNodeMatches; ///
|
|
90
|
+
|
|
91
|
+
return conclusionMatches;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function matchPremisesAndConclusion(premises, conclusion, metastatementNodes, metastatementNode) {
|
|
95
|
+
let premisesMatchConclusion = false;
|
|
96
|
+
|
|
97
|
+
const metaSubstitutions = [],
|
|
98
|
+
premisesMatches = matchPremises(premises, metastatementNodes, metaSubstitutions);
|
|
99
|
+
|
|
100
|
+
if (premisesMatches) {
|
|
101
|
+
const conclusionMatches = matchConclusion(conclusion, metastatementNode, metaSubstitutions);
|
|
102
|
+
|
|
103
|
+
premisesMatchConclusion = conclusionMatches; ///
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return premisesMatchConclusion;
|
|
107
|
+
}
|
package/bin/ruleNames.js
CHANGED
|
@@ -4,7 +4,7 @@ const TERM_RULE_NAME = "term",
|
|
|
4
4
|
TYPE_RULE_NAME = "type",
|
|
5
5
|
ARGUMENT_RULE_NAME = "argument",
|
|
6
6
|
METAVARIABLE_RULE_NAME = "metavariable",
|
|
7
|
-
|
|
7
|
+
META_CONDITIONAL_PROOF_RULE_NAME = "metaConditionalProof",
|
|
8
8
|
QUALIFIED_METASTATEMENT_RULE_NAME = "qualifiedMetastatement",
|
|
9
9
|
UNQUALIFIED_METASTATEMENT_RULE_NAME = "unqualifiedMetastatement";
|
|
10
10
|
|
|
@@ -13,7 +13,7 @@ module.exports = {
|
|
|
13
13
|
TYPE_RULE_NAME,
|
|
14
14
|
ARGUMENT_RULE_NAME,
|
|
15
15
|
METAVARIABLE_RULE_NAME,
|
|
16
|
-
|
|
16
|
+
META_CONDITIONAL_PROOF_RULE_NAME,
|
|
17
17
|
QUALIFIED_METASTATEMENT_RULE_NAME,
|
|
18
18
|
UNQUALIFIED_METASTATEMENT_RULE_NAME
|
|
19
19
|
};
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
verifyUnqualifiedMetastatement = require("../verify/metastatement/unqualified");
|
|
3
|
+
const verifyUnqualifiedMetastatement = require("../verify/metastatement/unqualified");
|
|
5
4
|
|
|
6
|
-
const {
|
|
5
|
+
const { nodesQuery } = require("../utilities/query");
|
|
7
6
|
|
|
8
|
-
const
|
|
9
|
-
unqualifiedMetastatementNodesQuery = nodesQuery("/metaAntecedent/unqualifiedMetastatement");
|
|
7
|
+
const unqualifiedMetastatementNodesQuery = nodesQuery("/metaAntecedent/unqualifiedMetastatement");
|
|
10
8
|
|
|
11
|
-
function verifyMetaAntecedent(metaAntecedentNode,
|
|
9
|
+
function verifyMetaAntecedent(metaAntecedentNode, context) {
|
|
12
10
|
const unqualifiedMetastatementNodes = unqualifiedMetastatementNodesQuery(metaAntecedentNode),
|
|
13
11
|
metaAntecedentVerified = unqualifiedMetastatementNodes.every((unqualifiedMetastatementNode) => {
|
|
14
12
|
const unqualifiedMetastatementVerified = verifyUnqualifiedMetastatement(unqualifiedMetastatementNode, context);
|
|
@@ -18,17 +16,6 @@ function verifyMetaAntecedent(metaAntecedentNode, metaAntecedents, context) {
|
|
|
18
16
|
}
|
|
19
17
|
});
|
|
20
18
|
|
|
21
|
-
if (metaAntecedentVerified) {
|
|
22
|
-
const metastatementNodes = unqualifiedMetastatementNodes.map((unqualifiedMetastatementNode) => {
|
|
23
|
-
const metastatementNode = metastatementNodeQuery(unqualifiedMetastatementNode);
|
|
24
|
-
|
|
25
|
-
return metastatementNode;
|
|
26
|
-
}),
|
|
27
|
-
metaAntecedent = MetaAntecedent.fromMetastatementNodes(metastatementNodes);
|
|
28
|
-
|
|
29
|
-
metaAntecedents.push(metaAntecedent);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
19
|
return metaAntecedentVerified;
|
|
33
20
|
}
|
|
34
21
|
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
verifyUnqualifiedMetaStatement = require("../verify/metastatement/unqualified");
|
|
3
|
+
const verifyUnqualifiedMetaStatement = require("../verify/metastatement/unqualified");
|
|
5
4
|
|
|
6
5
|
const { nodeQuery } = require("../utilities/query");
|
|
7
6
|
|
|
8
|
-
const
|
|
9
|
-
unqualifiedMetaStatementNodeQuery = nodeQuery("/metaConsequent/unqualifiedMetaStatement!");
|
|
7
|
+
const unqualifiedMetaStatementNodeQuery = nodeQuery("/metaConsequent/unqualifiedMetaStatement!");
|
|
10
8
|
|
|
11
9
|
function verifyMetaConsequent(metaConsequentNode, metaConsequents, context) {
|
|
12
10
|
let metaConsequentVerified = false;
|
|
@@ -16,14 +14,7 @@ function verifyMetaConsequent(metaConsequentNode, metaConsequents, context) {
|
|
|
16
14
|
if (unqualifiedMetaStatementNode !== null) {
|
|
17
15
|
const unqualifiedMetaStatementVerified = verifyUnqualifiedMetaStatement(unqualifiedMetaStatementNode, context);
|
|
18
16
|
|
|
19
|
-
|
|
20
|
-
const metastatementNode = metastatementNodeQuery(unqualifiedMetaStatementNode),
|
|
21
|
-
metaConsequent = MetaConsequent.fromMetaStatementNode(metastatementNode);
|
|
22
|
-
|
|
23
|
-
metaConsequents.push(metaConsequent);
|
|
24
|
-
|
|
25
|
-
metaConsequentVerified = true;
|
|
26
|
-
}
|
|
17
|
+
metaConsequentVerified = unqualifiedMetaStatementVerified;
|
|
27
18
|
}
|
|
28
19
|
|
|
29
20
|
return metaConsequentVerified;
|