occam-furtle 2.0.1 → 2.0.3
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/README.md +38 -23
- package/example/Free and bound variables.ftl +1 -1
- package/lib/example/utilities/values.js +6 -5
- package/lib/example.js +10 -10
- package/package.json +1 -1
- package/src/example/utilities/values.js +9 -5
- package/src/example.js +10 -9
package/README.md
CHANGED
|
@@ -6,52 +6,67 @@
|
|
|
6
6
|
|
|
7
7
|
- [Introduction](#introduction)
|
|
8
8
|
- [Installation](#installation)
|
|
9
|
-
- [
|
|
10
|
-
- [Usage](#usage)
|
|
9
|
+
- [Example](#example)
|
|
11
10
|
- [Building](#building)
|
|
12
11
|
- [Contact](#contact)
|
|
13
12
|
|
|
14
13
|
## Introduction
|
|
15
14
|
|
|
16
|
-
Furtle is a dynamically but nonetheless strictly typed language for traversing parse trees.
|
|
15
|
+
Furtle is a dynamically but nonetheless strictly typed, procedural language meant primarily for traversing parse trees.
|
|
16
|
+
It is called from Nominal thus...
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
```
|
|
19
|
+
Rule (FreeVariable)
|
|
20
|
+
Premise
|
|
21
|
+
@isVariableFree(u, P)
|
|
22
|
+
Conclusion
|
|
23
|
+
u is free in P
|
|
24
|
+
```
|
|
21
25
|
|
|
22
|
-
|
|
26
|
+
...and looks as follows:
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
```
|
|
29
|
+
Boolean isVariableFree(Node termNode, Node statementNode) {
|
|
30
|
+
Boolean variableFree = true;
|
|
25
31
|
|
|
26
|
-
|
|
32
|
+
Boolean variableBound = isVariableBound(termNode, statementNode);
|
|
27
33
|
|
|
28
|
-
|
|
34
|
+
If (variableBound) {
|
|
35
|
+
variableFree = false;
|
|
36
|
+
}
|
|
29
37
|
|
|
30
|
-
|
|
38
|
+
Return variableFree;
|
|
39
|
+
}
|
|
40
|
+
```
|
|
31
41
|
|
|
32
|
-
|
|
42
|
+
The above procedure ascertains whether or not the given term's sole variable is bound in the given statement.
|
|
43
|
+
Boundedness is usually defined by induction over the structure of statements, however Occam's custom grammars make this practically unworkable.
|
|
44
|
+
Hence Furtle fulfills this role procedurally, so to speak.
|
|
33
45
|
|
|
34
|
-
##
|
|
46
|
+
## Installation
|
|
35
47
|
|
|
36
|
-
|
|
48
|
+
With [npm](https://www.npmjs.com/):
|
|
37
49
|
|
|
38
|
-
npm
|
|
50
|
+
npm install occam-furtle
|
|
39
51
|
|
|
40
|
-
|
|
52
|
+
You can also clone the repository with [Git](https://git-scm.com/)...
|
|
41
53
|
|
|
42
|
-
|
|
54
|
+
git clone https://github.com/djalbat/occam-furtle.git
|
|
43
55
|
|
|
44
|
-
|
|
56
|
+
...and then install the dependencies with npm from within the project's root directory:
|
|
45
57
|
|
|
46
|
-
npm
|
|
58
|
+
npm install
|
|
47
59
|
|
|
48
|
-
|
|
60
|
+
## Example
|
|
49
61
|
|
|
50
|
-
|
|
62
|
+
The example runs directly on Node:
|
|
51
63
|
|
|
52
|
-
|
|
64
|
+
```
|
|
65
|
+
node example.js
|
|
66
|
+
```
|
|
53
67
|
|
|
54
|
-
|
|
68
|
+
The `Free and bound variables.ftl` file in the `example/` directory can be changed and the example can be rebuilt, see below.
|
|
69
|
+
Obviously one thing to try is changing the value of the `free` variable.
|
|
55
70
|
|
|
56
71
|
## Building
|
|
57
72
|
|
|
@@ -61,7 +61,7 @@ String boundVariableNameFromStatementNode(Node statementNode) {
|
|
|
61
61
|
If ((content == "∀") || (content == "∃")) {
|
|
62
62
|
[ _, Node argumentNode ] = childNodes;
|
|
63
63
|
|
|
64
|
-
Node boundVariableNameTerminalNode = nodeQuery(argumentNode, /argument/term/variable
|
|
64
|
+
Node boundVariableNameTerminalNode = nodeQuery(argumentNode, /argument/term/variable!/@name);
|
|
65
65
|
|
|
66
66
|
If (boundVariableNameTerminalNode != null) {
|
|
67
67
|
{ String content } = boundVariableNameTerminalNode;
|
|
@@ -12,17 +12,18 @@ var _occamquery = require("occam-query");
|
|
|
12
12
|
var _index = require("../../index");
|
|
13
13
|
var _necessary = require("necessary");
|
|
14
14
|
var first = _necessary.arrayUtilities.first;
|
|
15
|
-
var
|
|
15
|
+
var freeTermNodeQuery = _occamquery.Query.fromExpressionString("//term[1]"), boundTermNodeQuery = _occamquery.Query.fromExpressionString("//term[0]");
|
|
16
16
|
function valuesFromFileContext(fileContext) {
|
|
17
|
-
var
|
|
17
|
+
var free = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
|
|
18
|
+
var context = fileContext, nodes = nodesFromFileContext(fileContext, free), values = _index.Values.fromNodes(nodes, context);
|
|
18
19
|
return values;
|
|
19
20
|
}
|
|
20
|
-
function nodesFromFileContext(fileContext) {
|
|
21
|
-
var node = fileContext.getNode(), termNodes = termNodeQuery.execute(node), firstTermNode = first(termNodes), termNode = firstTermNode, statementNode = node, nodes = [
|
|
21
|
+
function nodesFromFileContext(fileContext, free) {
|
|
22
|
+
var termNodeQuery = free ? freeTermNodeQuery : boundTermNodeQuery, node = fileContext.getNode(), termNodes = termNodeQuery.execute(node), firstTermNode = first(termNodes), termNode = firstTermNode, statementNode = node, nodes = [
|
|
22
23
|
termNode,
|
|
23
24
|
statementNode
|
|
24
25
|
];
|
|
25
26
|
return nodes;
|
|
26
27
|
}
|
|
27
28
|
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leGFtcGxlL3V0aWxpdGllcy92YWx1ZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSBcIm9jY2FtLXF1ZXJ5XCI7XG5pbXBvcnQgeyBWYWx1ZXMgfSBmcm9tIFwiLi4vLi4vaW5kZXhcIjsgLy8vXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuY29uc3QgeyBmaXJzdCB9ID0gYXJyYXlVdGlsaXRpZXM7XG5cbmNvbnN0IGZyZWVUZXJtTm9kZVF1ZXJ5ID0gUXVlcnkuZnJvbUV4cHJlc3Npb25TdHJpbmcoXCIvL3Rlcm1bMV1cIiksXG4gICAgICBib3VuZFRlcm1Ob2RlUXVlcnkgPSBRdWVyeS5mcm9tRXhwcmVzc2lvblN0cmluZyhcIi8vdGVybVswXVwiKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlc0Zyb21GaWxlQ29udGV4dChmaWxlQ29udGV4dCwgZnJlZSA9IHRydWUpIHtcbiAgY29uc3QgY29udGV4dCA9IGZpbGVDb250ZXh0LCAgLy8vXG4gICAgICAgIG5vZGVzID0gbm9kZXNGcm9tRmlsZUNvbnRleHQoZmlsZUNvbnRleHQsIGZyZWUpLFxuICAgICAgICB2YWx1ZXMgPSBWYWx1ZXMuZnJvbU5vZGVzKG5vZGVzLCBjb250ZXh0KTtcblxuICByZXR1cm4gdmFsdWVzO1xufVxuXG5mdW5jdGlvbiBub2Rlc0Zyb21GaWxlQ29udGV4dChmaWxlQ29udGV4dCwgZnJlZSkge1xuICBjb25zdCB0ZXJtTm9kZVF1ZXJ5ID0gZnJlZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVUZXJtTm9kZVF1ZXJ5IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZFRlcm1Ob2RlUXVlcnksXG4gICAgICAgIG5vZGUgPSBmaWxlQ29udGV4dC5nZXROb2RlKCksXG4gICAgICAgIHRlcm1Ob2RlcyA9IHRlcm1Ob2RlUXVlcnkuZXhlY3V0ZShub2RlKSxcbiAgICAgICAgZmlyc3RUZXJtTm9kZSA9IGZpcnN0KHRlcm1Ob2RlcyksXG4gICAgICAgIHRlcm1Ob2RlID0gZmlyc3RUZXJtTm9kZSwgLy8vXG4gICAgICAgIHN0YXRlbWVudE5vZGUgPSBub2RlLCAvLy9cbiAgICAgICAgbm9kZXMgPSBbXG4gICAgICAgICAgdGVybU5vZGUsXG4gICAgICAgICAgc3RhdGVtZW50Tm9kZVxuICAgICAgICBdO1xuXG4gIHJldHVybiBub2Rlcztcbn1cbiJdLCJuYW1lcyI6WyJ2YWx1ZXNGcm9tRmlsZUNvbnRleHQiLCJmaXJzdCIsImFycmF5VXRpbGl0aWVzIiwiZnJlZVRlcm1Ob2RlUXVlcnkiLCJRdWVyeSIsImZyb21FeHByZXNzaW9uU3RyaW5nIiwiYm91bmRUZXJtTm9kZVF1ZXJ5IiwiZmlsZUNvbnRleHQiLCJmcmVlIiwiY29udGV4dCIsIm5vZGVzIiwibm9kZXNGcm9tRmlsZUNvbnRleHQiLCJ2YWx1ZXMiLCJWYWx1ZXMiLCJmcm9tTm9kZXMiLCJ0ZXJtTm9kZVF1ZXJ5Iiwibm9kZSIsImdldE5vZGUiLCJ0ZXJtTm9kZXMiLCJleGVjdXRlIiwiZmlyc3RUZXJtTm9kZSIsInRlcm1Ob2RlIiwic3RhdGVtZW50Tm9kZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7K0JBV2dCQTs7O2VBQUFBOzs7MEJBVE07cUJBQ0M7eUJBQ1E7QUFFL0IsSUFBTSxBQUFFQyxRQUFVQyx5QkFBYyxDQUF4QkQ7QUFFUixJQUFNRSxvQkFBb0JDLGlCQUFLLENBQUNDLG9CQUFvQixDQUFDLGNBQy9DQyxxQkFBcUJGLGlCQUFLLENBQUNDLG9CQUFvQixDQUFDO0FBRS9DLFNBQVNMLHNCQUFzQk8sV0FBVztRQUFFQyxPQUFBQSxpRUFBTztJQUN4RCxJQUFNQyxVQUFVRixhQUNWRyxRQUFRQyxxQkFBcUJKLGFBQWFDLE9BQzFDSSxTQUFTQyxhQUFNLENBQUNDLFNBQVMsQ0FBQ0osT0FBT0Q7SUFFdkMsT0FBT0c7QUFDVDtBQUVBLFNBQVNELHFCQUFxQkosV0FBVyxFQUFFQyxJQUFJO0lBQzdDLElBQU1PLGdCQUFnQlAsT0FDRUwsb0JBQ0VHLG9CQUNwQlUsT0FBT1QsWUFBWVUsT0FBTyxJQUMxQkMsWUFBWUgsY0FBY0ksT0FBTyxDQUFDSCxPQUNsQ0ksZ0JBQWdCbkIsTUFBTWlCLFlBQ3RCRyxXQUFXRCxlQUNYRSxnQkFBZ0JOLE1BQ2hCTixRQUFRO1FBQ05XO1FBQ0FDO0tBQ0Q7SUFFUCxPQUFPWjtBQUNUIn0=
|
package/lib/example.js
CHANGED
|
@@ -11,15 +11,15 @@ var _nominal = require("./example/utilities/nominal");
|
|
|
11
11
|
var releaseContext = _release.ReleaseContext.fromNothing(), furtleFile = (0, _furtle.furtleFileFromNothing)(), file = furtleFile; ///
|
|
12
12
|
releaseContext.addFile(file);
|
|
13
13
|
releaseContext.verify();
|
|
14
|
-
var nominalFileContext = (0, _nominal.nominalFileContextFromReleaseContext)(releaseContext), fileContext = nominalFileContext
|
|
14
|
+
var nominalFileContext = (0, _nominal.nominalFileContextFromReleaseContext)(releaseContext), fileContext = nominalFileContext; ///
|
|
15
15
|
releaseContext.addFileContext(fileContext);
|
|
16
|
-
var procedure = (0, _procedure.procedureFromReleaseContext)(releaseContext);
|
|
17
|
-
|
|
18
|
-
var value = procedure.call(values, fileContext), boolean = value.getBoolean(),
|
|
19
|
-
console.log(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
16
|
+
var free = true, values = (0, _values.valuesFromFileContext)(fileContext, free), procedure = (0, _procedure.procedureFromReleaseContext)(releaseContext);
|
|
17
|
+
try {
|
|
18
|
+
var value = procedure.call(values, fileContext), boolean = value.getBoolean(), free1 = boolean; ///
|
|
19
|
+
console.log(free1);
|
|
20
|
+
} catch (exception) {
|
|
21
|
+
var message = exception.getMessage();
|
|
22
|
+
console.log(message);
|
|
23
|
+
}
|
|
24
24
|
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9leGFtcGxlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgXCIuL2luZGV4XCI7XG5cbmltcG9ydCB7IFJlbGVhc2VDb250ZXh0IH0gZnJvbSBcIi4vZXhhbXBsZS9jb250ZXh0L3JlbGVhc2VcIjtcblxuaW1wb3J0IHsgZnVydGxlRmlsZUZyb21Ob3RoaW5nIH0gZnJvbSBcIi4vZXhhbXBsZS91dGlsaXRpZXMvZnVydGxlXCI7XG5pbXBvcnQgeyB2YWx1ZXNGcm9tRmlsZUNvbnRleHQgfSBmcm9tIFwiLi9leGFtcGxlL3V0aWxpdGllcy92YWx1ZXNcIjtcbmltcG9ydCB7IHByb2NlZHVyZUZyb21SZWxlYXNlQ29udGV4dCB9IGZyb20gXCIuL2V4YW1wbGUvdXRpbGl0aWVzL3Byb2NlZHVyZVwiO1xuaW1wb3J0IHsgbm9taW5hbEZpbGVDb250ZXh0RnJvbVJlbGVhc2VDb250ZXh0IH0gZnJvbSBcIi4vZXhhbXBsZS91dGlsaXRpZXMvbm9taW5hbFwiO1xuXG5jb25zdCByZWxlYXNlQ29udGV4dCA9IFJlbGVhc2VDb250ZXh0LmZyb21Ob3RoaW5nKCksXG4gICAgICBmdXJ0bGVGaWxlID0gZnVydGxlRmlsZUZyb21Ob3RoaW5nKCksXG4gICAgICBmaWxlID0gZnVydGxlRmlsZTsgIC8vL1xuXG5yZWxlYXNlQ29udGV4dC5hZGRGaWxlKGZpbGUpO1xuXG5yZWxlYXNlQ29udGV4dC52ZXJpZnkoKTtcblxuY29uc3Qgbm9taW5hbEZpbGVDb250ZXh0ID0gbm9taW5hbEZpbGVDb250ZXh0RnJvbVJlbGVhc2VDb250ZXh0KHJlbGVhc2VDb250ZXh0KSxcbiAgICAgIGZpbGVDb250ZXh0ID0gbm9taW5hbEZpbGVDb250ZXh0OyAvLy9cblxucmVsZWFzZUNvbnRleHQuYWRkRmlsZUNvbnRleHQoZmlsZUNvbnRleHQpO1xuXG5jb25zdCBmcmVlID0gdHJ1ZSxcbiAgICAgIHZhbHVlcyA9IHZhbHVlc0Zyb21GaWxlQ29udGV4dChmaWxlQ29udGV4dCwgZnJlZSksXG4gICAgICBwcm9jZWR1cmUgPSBwcm9jZWR1cmVGcm9tUmVsZWFzZUNvbnRleHQocmVsZWFzZUNvbnRleHQpO1xuXG50cnkge1xuICBjb25zdCB2YWx1ZSA9IHByb2NlZHVyZS5jYWxsKHZhbHVlcywgZmlsZUNvbnRleHQpLFxuICAgICAgICBib29sZWFuID0gdmFsdWUuZ2V0Qm9vbGVhbigpLFxuICAgICAgICBmcmVlID0gYm9vbGVhbjsgLy8vXG5cbiAgY29uc29sZS5sb2coZnJlZSk7XG59IGNhdGNoIChleGNlcHRpb24pIHtcbiAgY29uc3QgbWVzc2FnZSA9IGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCk7XG5cbiAgY29uc29sZS5sb2cobWVzc2FnZSk7XG59XG4iXSwibmFtZXMiOlsicmVsZWFzZUNvbnRleHQiLCJSZWxlYXNlQ29udGV4dCIsImZyb21Ob3RoaW5nIiwiZnVydGxlRmlsZSIsImZ1cnRsZUZpbGVGcm9tTm90aGluZyIsImZpbGUiLCJhZGRGaWxlIiwidmVyaWZ5Iiwibm9taW5hbEZpbGVDb250ZXh0Iiwibm9taW5hbEZpbGVDb250ZXh0RnJvbVJlbGVhc2VDb250ZXh0IiwiZmlsZUNvbnRleHQiLCJhZGRGaWxlQ29udGV4dCIsImZyZWUiLCJ2YWx1ZXMiLCJ2YWx1ZXNGcm9tRmlsZUNvbnRleHQiLCJwcm9jZWR1cmUiLCJwcm9jZWR1cmVGcm9tUmVsZWFzZUNvbnRleHQiLCJ2YWx1ZSIsImNhbGwiLCJib29sZWFuIiwiZ2V0Qm9vbGVhbiIsImNvbnNvbGUiLCJsb2ciLCJleGNlcHRpb24iLCJtZXNzYWdlIiwiZ2V0TWVzc2FnZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7UUFFTzt1QkFFd0I7c0JBRU87c0JBQ0E7eUJBQ007dUJBQ1M7QUFFckQsSUFBTUEsaUJBQWlCQyx1QkFBYyxDQUFDQyxXQUFXLElBQzNDQyxhQUFhQyxJQUFBQSw2QkFBcUIsS0FDbENDLE9BQU9GLFlBQWEsR0FBRztBQUU3QkgsZUFBZU0sT0FBTyxDQUFDRDtBQUV2QkwsZUFBZU8sTUFBTTtBQUVyQixJQUFNQyxxQkFBcUJDLElBQUFBLDZDQUFvQyxFQUFDVCxpQkFDMURVLGNBQWNGLG9CQUFvQixHQUFHO0FBRTNDUixlQUFlVyxjQUFjLENBQUNEO0FBRTlCLElBQU1FLE9BQU8sTUFDUEMsU0FBU0MsSUFBQUEsNkJBQXFCLEVBQUNKLGFBQWFFLE9BQzVDRyxZQUFZQyxJQUFBQSxzQ0FBMkIsRUFBQ2hCO0FBRTlDLElBQUk7SUFDRixJQUFNaUIsUUFBUUYsVUFBVUcsSUFBSSxDQUFDTCxRQUFRSCxjQUMvQlMsVUFBVUYsTUFBTUcsVUFBVSxJQUMxQlIsUUFBT08sU0FBUyxHQUFHO0lBRXpCRSxRQUFRQyxHQUFHLENBQUNWO0FBQ2QsRUFBRSxPQUFPVyxXQUFXO0lBQ2xCLElBQU1DLFVBQVVELFVBQVVFLFVBQVU7SUFFcENKLFFBQVFDLEdBQUcsQ0FBQ0U7QUFDZCJ9
|
package/package.json
CHANGED
|
@@ -6,18 +6,22 @@ import { arrayUtilities } from "necessary";
|
|
|
6
6
|
|
|
7
7
|
const { first } = arrayUtilities;
|
|
8
8
|
|
|
9
|
-
const
|
|
9
|
+
const freeTermNodeQuery = Query.fromExpressionString("//term[1]"),
|
|
10
|
+
boundTermNodeQuery = Query.fromExpressionString("//term[0]");
|
|
10
11
|
|
|
11
|
-
export function valuesFromFileContext(fileContext) {
|
|
12
|
+
export function valuesFromFileContext(fileContext, free = true) {
|
|
12
13
|
const context = fileContext, ///
|
|
13
|
-
nodes = nodesFromFileContext(fileContext),
|
|
14
|
+
nodes = nodesFromFileContext(fileContext, free),
|
|
14
15
|
values = Values.fromNodes(nodes, context);
|
|
15
16
|
|
|
16
17
|
return values;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
|
-
function nodesFromFileContext(fileContext) {
|
|
20
|
-
const
|
|
20
|
+
function nodesFromFileContext(fileContext, free) {
|
|
21
|
+
const termNodeQuery = free ?
|
|
22
|
+
freeTermNodeQuery :
|
|
23
|
+
boundTermNodeQuery,
|
|
24
|
+
node = fileContext.getNode(),
|
|
21
25
|
termNodes = termNodeQuery.execute(node),
|
|
22
26
|
firstTermNode = first(termNodes),
|
|
23
27
|
termNode = firstTermNode, ///
|
package/src/example.js
CHANGED
|
@@ -18,21 +18,22 @@ releaseContext.addFile(file);
|
|
|
18
18
|
releaseContext.verify();
|
|
19
19
|
|
|
20
20
|
const nominalFileContext = nominalFileContextFromReleaseContext(releaseContext),
|
|
21
|
-
fileContext = nominalFileContext
|
|
22
|
-
values = valuesFromFileContext(fileContext);
|
|
21
|
+
fileContext = nominalFileContext; ///
|
|
23
22
|
|
|
24
23
|
releaseContext.addFileContext(fileContext);
|
|
25
24
|
|
|
26
|
-
const
|
|
25
|
+
const free = true,
|
|
26
|
+
values = valuesFromFileContext(fileContext, free),
|
|
27
|
+
procedure = procedureFromReleaseContext(releaseContext);
|
|
27
28
|
|
|
28
|
-
|
|
29
|
+
try {
|
|
29
30
|
const value = procedure.call(values, fileContext),
|
|
30
31
|
boolean = value.getBoolean(),
|
|
31
32
|
free = boolean; ///
|
|
32
33
|
|
|
33
34
|
console.log(free);
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
} catch (exception) {
|
|
36
|
+
const message = exception.getMessage();
|
|
37
|
+
|
|
38
|
+
console.log(message);
|
|
39
|
+
}
|