diff --git a/.gitignore b/.gitignore index 06fafc4..f3ca41f 100644 --- a/.gitignore +++ b/.gitignore @@ -303,4 +303,137 @@ TSWLatexianTemp* # REVTeX puts footnotes in the bibliography by default, unless the nofootinbib # option is specified. Footnotes are the stored in a file with suffix Notes.bib. # Uncomment the next line to have this generated file ignored. -#*Notes.bib \ No newline at end of file +#*Notes.bib +src/runtime/node_modules/* + +# Node.js .gitignore (from https://github.com/github/gitignore/blob/main/Node.gitignore) +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* \ No newline at end of file diff --git a/data/factorial.md b/data/factorial.code similarity index 100% rename from data/factorial.md rename to data/factorial.code diff --git a/data/fibonacci.md b/data/fibonacci.code similarity index 87% rename from data/fibonacci.md rename to data/fibonacci.code index 9a9a23d..ba4008c 100644 --- a/data/fibonacci.md +++ b/data/fibonacci.code @@ -22,8 +22,9 @@ if fib is_less_than 0 repeat otherwise - - show < try a higher value of n for more fun > + + message stores < try a higher value of n for more fun > + show message move_on diff --git a/data/hello_world.code b/data/hello_world.code new file mode 100644 index 0000000..39ffd8e --- /dev/null +++ b/data/hello_world.code @@ -0,0 +1,2 @@ +greeting stores < hello world > +show greeting \ No newline at end of file diff --git a/data/quadratic_formula.md b/data/quadratic_formula.code similarity index 100% rename from data/quadratic_formula.md rename to data/quadratic_formula.code diff --git a/data/rangeCount.md b/data/range_count.code similarity index 100% rename from data/rangeCount.md rename to data/range_count.code diff --git a/data/selection-sort.md b/data/selection-sort.md deleted file mode 100644 index 25c4317..0000000 --- a/data/selection-sort.md +++ /dev/null @@ -1,10 +0,0 @@ -selection-sort with dataList -returnList equals minimum-value of dataList -fyi array operation delete minumum element -fyi keeping deleting the element from list until empty -fyi append each element to returnList -answer equals returnList - - - -minimum-value with dataList diff --git a/data/tower-of-hanoi.md b/data/tower-of-hanoi.md deleted file mode 100644 index fa45dbf..0000000 --- a/data/tower-of-hanoi.md +++ /dev/null @@ -1,11 +0,0 @@ -tower-of-hanoi disks with source with target with medium -if disks is-greater-than 0 -disks1 equals substraction of disks with 1 -tower-of-hanoi of disks1 with source with medium with target -show-value-of "Move disk " with disks with " from rod " with source with " with rod " with target -tower-of-hanoi of disks1 with medium with target with source -move-on -answer equals no-answer - -fyi example of recursion -fyi example of if blocks \ No newline at end of file diff --git a/src/runtime/command_line_executable.js b/src/runtime/command_line_executable.js index d3cac94..5bf00b0 100644 --- a/src/runtime/command_line_executable.js +++ b/src/runtime/command_line_executable.js @@ -1,36 +1,37 @@ const fs = require('fs'); -const tokenizer = require('/ide') -const tau_prolog = require('/tau-prolog') - -function readFileLoad(fileName, callback){ - - return callback(data); -} +const pl = require('tau-prolog'); +let INTERPRETER_CODE_PATH = "codeable.pl"; function tokenizeExecute(fileName){ - fs.readFile(fileName, 'utf8', (err, data) => { - if (err) { - console.error(err); - return; - } - console.log(data); - }); + var data = "" + fs.readFile(fileName, 'utf8', (err, data) => { + if (err) { + console.error(err); + return; + } + // console.log(data); let session = pl.create(); - session.consult(intermediateCode, { - success: () => { - console.log("[INFO] Loaded interpreter source code"); - loadQueryEx(session); - }, - error: (err) => { - console.log("[ERROR] Failed to load interpreter source code"); - console.log(err); - }, + session.consult(INTERPRETER_CODE_PATH, { + success: () => { + console.log("[INFO] Loaded interpreter source code"); + loadQueryEx(session, data); + }, + error: (err) => { + console.log("[ERROR] Failed to load interpreter source code"); + console.log(err); + }, }); + }); +} + +function tokenizer(fulltext) { + var tokens = fulltext.split(/\s/).filter((token) => token.length > 0); + return tokens; } // Create the query (parse the query). function loadQueryEx(session, programText) { - var tokens = tokenizer.tokenizer(programText); + var tokens = tokenizer(programText); var formattedTokens = JSON.stringify(tokens).replaceAll('"', ""); var completeQuery = `program(P, ${formattedTokens}, []), write(P), eval(P, [], EnvOut, ValueOut).`; console.log(completeQuery); @@ -52,7 +53,7 @@ function loadQueryEx(session, programText) { // Execute the query (execute the goal). session.answer({ success: function (answer) { - writeOutput(session.format_answer(answer)); + console.log("==:ANSWER:==") console.log(answer); // {X/apple} }, error: function (err) { @@ -69,4 +70,6 @@ function loadQueryEx(session, programText) { }, }); } - \ No newline at end of file + + const myArgs = process.argv.slice(2); + tokenizeExecute(myArgs[0]); diff --git a/src/runtime/jhaleAssign3.pl b/src/runtime/jhaleAssign3.pl deleted file mode 100644 index 4eb371c..0000000 --- a/src/runtime/jhaleAssign3.pl +++ /dev/null @@ -1,239 +0,0 @@ -% :- use_rendering(svgtree). % Only works in SWISH.swi-prolog.org - -/** - * codeable_version(-Major,-Minor,-Patch) is det. - */ -codeable_version(0,0,1). - -%%%%% Token Parser %%%%%% -% Parser - Numercis -number(t_number(N)) --> [N], {number(N)}. - -% v3 (Heavily inspired by M2.1 - slide 59) -% chars([X|Y]) --> char(X), chars(Y). -% chars([]) --> []. - -% char(X) --> [X], { is_char(X) }. - -% string(X) --> ['\"'], char(X), ['\"']. -% string(X) --> ['\"'], char(X), [' '], char(X), ['\"']. -% string(X) --> ['\"'], char(X), [' '], string(X), ['\"']. -identifier(id(A)) --> [a]. - -factor(factor_number(F)) --> number(F). -factor(factor_identifier(F)) --> identifier(F). -factor(factor_expression(F)) --> ['('], expr(F), [')']. - -term(term_factor(T)) --> factor(T). -term(term_times(T1, T2)) --> factor(T1), [times], term(T2). -term(term_divide(T1, T2)) --> factor(T1), [divided-by], term(T2). - -expr(expr_term(E)) --> term(E). -expr(expr_plus(E1, E2)) --> term(E1), [plus], expr(E2). -expr(expr_minus(E1, E2)) --> term(E1), [minus], expr(E2). -% expr(expr_ternary(T)) --> ternary(T). - -boolean(true) --> [true]. -boolean(false) --> [false]. -boolean(not(B)) --> [not], boolean(B). -boolean(equals(E1, E2)) --> expr(E1), [equals], expr(E2). -boolean(is_greater_than(E1, E2)) --> expr(E1), [is-greater-than], expr(E2). -boolean(is_less_than(E1, E2)) --> expr(E1), [is-less-than], expr(E2). - -assignment(assign(I, E)) --> identifier(I), [stores], expr(E). -ternary(t_ternary(B, T, F)) --> expr(T), [if], boolean(B), [otherwise], expr(F). -loop(while(B, C)) --> [while], boolean(B), command(C), [repeat]. -loop(for(I1, I2, C)) --> [for], identifier(I1), [from], identifier(I2), command(C), [repeat]. - -% show(show_char(C)) --> [show], char(C). -% show(show_string(S)) --> [show], string(S). -show(show_digit(D)) --> [show], digit(D). -show(show_identifier(I)) --> [show], identifier(I). - -command(C) --> assignment(C). -command(C) --> ternary(C). -command(C) --> loop(C). -command(C) --> show(C). -command(cmd(C1, C2)) --> assignment(C1), [;], command(C2). -command(cmd(C1, C2)) --> ternary(C1), [;], command(C2). -command(cmd(C1, C2)) --> loop(C1), [;], command(C2). -command(cmd(C1, C2)) --> show(C1), [;], command(C2). - - -program(prog(P)) --> command(P). - -% Parser - Functions - -% functions(t_functions(Id, Args,Y, Val)) --> identifier(Id), decl_a1(Args), [needs], comm(Y), [answer], [equals], result(Val). - -% Functions eval - -% function_eval(Id, Args, [(Id,t_codeable_functions(Pt))|_],Value). -% function_eval(Id, Args, [_|T],Value) :- function_eval(Id, T, Value). - -/** - * eval(+Node, +EnvIn, -EnvOut, -ValueOut) - * - * Evaluates the parse tree rooted at Node, with the environment EnvIn, - * and returns the environment EnvOut and the value ValueOut. - * - * The environment is a list of pairs (Identifier, Value) where Identifier - * is a string and Value is an integer. - * - */ -eval(prog(P), EnvIn, EnvOut, ValueOut) :- - eval(P, EnvIn, EnvOut, ValueOut). - -eval(cmd(C1, C2), EnvIn, EnvOut, ValueOut) :- - eval(C1, EnvIn, EnvTemp, _ValueOut), - eval(C2, EnvTemp, EnvOut, ValueOut). - -eval(assign(I, E), EnvIn, EnvOut, ValueOut) :- - eval(E, EnvIn, EnvTemp, ValueOut), - update(I, ValueOut, EnvTemp, EnvOut). - -eval(if(B, T, _), EnvIn, EnvOut, ValueOut) :- - eval(B, EnvIn, EnvTemp, true), - eval(T, EnvTemp, EnvOut, ValueOut). -eval(if(B, _, F), EnvIn, EnvOut, ValueOut) :- - eval(B, EnvIn, EnvTemp, false), - eval(F, EnvTemp, EnvOut, ValueOut). - -eval(while(B, C), EnvIn, EnvOut, ValueOut) :- - eval(B, EnvIn, EnvTemp, true), - eval(C, EnvTemp, EnvTemp2, _ValueOut), - eval(while(B, C), EnvTemp2, EnvOut, ValueOut). -eval(while(B, _), EnvIn, EnvOut, _ValueOut) :- - eval(B, EnvIn, EnvOut, false). - -eval(expr_plus(Term, Expression), EnvIn, EnvOut, ValueOut) :- - eval(Term, EnvIn, EnvTemp, ValTerm), - eval(Expression, EnvTemp, EnvOut, ValExpr), - ValueOut is ValTerm + ValExpr. -eval(expr_minus(Term, Expression), EnvIn, EnvOut, ValueOut) :- - eval(Term, EnvIn, EnvTemp, ValTerm), - eval(Expression, EnvTemp, EnvOut, ValExpr), - ValueOut is ValTerm + (0 - ValExpr). -eval(expr_term(T), EnvIn, EnvOut, ValueOut) :- - eval(T, EnvIn, EnvOut, ValueOut). -eval(expr_assign(A), EnvIn, EnvOut, ValueOut) :- - eval(A, EnvIn, EnvOut, ValueOut). - -eval(term_times(Factor, Term), EnvIn, Env2Out, ValueOut) :- - eval(Factor, EnvIn, Env1Out, Val1Out), - eval(Term, Env1Out, Env2Out, Val2Out), - ValueOut is Val1Out * Val2Out. -eval(term_divide(Factor, Term), EnvIn, Env2Out, ValueOut) :- - eval(Factor, EnvIn, Env1Out, Val1Out), - eval(Term, Env1Out, Env2Out, Val2Out), - ValueOut is Val1Out * (1 / Val2Out). -eval(term_factor(F), EnvIn, EnvOut, ValueOut) :- - eval(F, EnvIn, EnvOut, ValueOut). - -eval(factor_digit(D), EnvIn, EnvIn, D). -eval(factor_identifier(I), EnvIn, EnvIn, Value) :- - lookup(I, EnvIn, Value). -eval(factor_expression(E), EnvIn, EnvOut, Value) :- - eval(E, EnvIn, EnvOut, Value). - -eval(true, EnvIn, EnvIn, true). -eval(false, EnvIn, EnvIn, false). -eval(not(B), EnvIn, EnvOut, false) :- - eval(B, EnvIn, EnvOut, true). -eval(not(B), EnvIn, EnvOut, true) :- - eval(B, EnvIn, EnvOut, false). -eval(equals(E1, E2), EnvIn, EnvOut, true) :- - eval(E1, EnvIn, EnvTemp, ValueOut), - eval(E2, EnvTemp, EnvOut, ValueOut). -eval(equals(E1, E2), EnvIn, EnvOut, false) :- - eval(E1, EnvIn, EnvTemp, ValueOut1), - eval(E2, EnvTemp, EnvOut, ValueOut2), - ValueOut1 =\= ValueOut2. - -eval(show_char(C), EnvIn, EnvIn, _ValueOut) :-write([output, C]). -eval(show_string(S), EnvIn, EnvIn, _ValueOut) :- write([output, S]). -eval(show_digit(D), EnvIn, EnvIn, _ValueOut) :- write([output, D]). -eval(show_identifier(I), EnvIn, EnvIn, _ValueOut) :- - lookup(I, EnvIn, Value), - write([output, Value]). - -/** - * lookup(+Identifier, +Env, -Value) - * - * Looks up the Value of Identifier in Env. - */ -lookup(Identifier, [(Identifier, Value) | _], Value). -lookup(Identifier, [(OtherIdentifier, _) | RemainingEnvironment], Value) :- - Identifier \= OtherIdentifier, - lookup(Identifier, RemainingEnvironment, Value). - -/** - * declare(+Identifier, +EnvIn, -EnvOut) - * - * Adds a new binding (Identifier, _) to EnvIn and returns EnvOut. - * - * If Identifier is already bound in EnvIn, it is not rebound. - */ -declare(Identifier, [], [(Identifier, _)]). -declare( - Identifier, - [(Identifier, Value) | RemainingEnvironment], - [(Identifier, Value) | RemainingEnvironment] -). -declare(Identifier, [H | RemainingEnvironment], [H | NewEnvironment]) :- - declare(Identifier, RemainingEnvironment, NewEnvironment). - -/** - * update(+Identifier, +Value, +EnvIn, -EnvOut) - * - * Updates the binding of Identifier in EnvIn to Value and returns EnvOut. - */ -update(Identifier, Value, [], [(Identifier, Value)]). -update( - Identifier, - Value, - [(Identifier, _) | RemainingEnvironment], - [(Identifier, Value) | RemainingEnvironment] -). -update( - Identifier, - Value, - [(OtherIdentifier, OtherValue) | RemainingEnvironment], - [(OtherIdentifier, OtherValue) | NewEnvironment] -) :- - Identifier \= OtherIdentifier, - update(Identifier, Value, RemainingEnvironment, NewEnvironment). - - -/** - * program_eval(+Program, +InitialX, +InitialY, -FinalZ) - * - * Evaluates the Program with the initial value of X and Y - * and returns the final value of Z. - */ -program_eval(P, X, Y, Z) :- - update(x, X, [], EnvX), - update(y, Y, EnvX, EnvY), - eval(P, EnvY, EnvOut, _ValueOut), - lookup(z, EnvOut, Z). - -digit(0) --> [0]. -digit(1) --> [1]. -digit(2) --> [2]. -digit(3) --> [3]. -digit(4) --> [4]. -digit(5) --> [5]. -digit(6) --> [6]. -digit(7) --> [7]. -digit(8) --> [8]. -digit(9) --> [9]. - -% identifier(WORD) --> { var(WORD), ! }, -% chars(CHARS), { atom_codes(WORD, CHARS) }. -% identifier(WORD) --> { nonvar(WORD) }, -% { atom_codes(WORD, CHARS) }, chars(CHARS). - -% is_char(X) :- X >= 0'a, X =< 0'z, !. -% is_char(X) :- X >= 0'A, X =< 0'Z, !. -% is_char(X) :- X >= 0'0, X =< 0'9, !. -% is_char(0'_). \ No newline at end of file diff --git a/src/runtime/package-lock.json b/src/runtime/package-lock.json new file mode 100644 index 0000000..2e1ab98 --- /dev/null +++ b/src/runtime/package-lock.json @@ -0,0 +1,135 @@ +{ + "name": "runtime", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "tau-prolog": "^0.3.2" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + }, + "node_modules/node-watch": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.3.tgz", + "integrity": "sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qunit": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.18.2.tgz", + "integrity": "sha512-Ux+x9pIU38/F+r3jOl35QzGHPPupMifUvhczCqHgzYWX76fCjPg6VqM84ox1D57fhAXHtpS4Jl91EV8gDoCHPg==", + "dependencies": { + "commander": "7.2.0", + "node-watch": "0.7.3", + "tiny-glob": "0.2.9" + }, + "bin": { + "qunit": "bin/qunit.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readline-sync": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.9.tgz", + "integrity": "sha1-PtqOZfI80qF+YTAbHwADOWr17No=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tau-prolog": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tau-prolog/-/tau-prolog-0.3.2.tgz", + "integrity": "sha512-DlC8MBYtDEdfX0EdD5eNV3W7uPkqUO0vfck/fawt2lH85exj2rKiKxDkmkPa6DVg2thxnDxI+8UbxHs7rXb4Fg==", + "dependencies": { + "qunit": "^2.11.1", + "readline-sync": "1.4.9" + } + }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + } + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" + }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + }, + "node-watch": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.3.tgz", + "integrity": "sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ==" + }, + "qunit": { + "version": "2.18.2", + "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.18.2.tgz", + "integrity": "sha512-Ux+x9pIU38/F+r3jOl35QzGHPPupMifUvhczCqHgzYWX76fCjPg6VqM84ox1D57fhAXHtpS4Jl91EV8gDoCHPg==", + "requires": { + "commander": "7.2.0", + "node-watch": "0.7.3", + "tiny-glob": "0.2.9" + } + }, + "readline-sync": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.9.tgz", + "integrity": "sha1-PtqOZfI80qF+YTAbHwADOWr17No=" + }, + "tau-prolog": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tau-prolog/-/tau-prolog-0.3.2.tgz", + "integrity": "sha512-DlC8MBYtDEdfX0EdD5eNV3W7uPkqUO0vfck/fawt2lH85exj2rKiKxDkmkPa6DVg2thxnDxI+8UbxHs7rXb4Fg==", + "requires": { + "qunit": "^2.11.1", + "readline-sync": "1.4.9" + } + }, + "tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "requires": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + } + } +} diff --git a/src/runtime/package.json b/src/runtime/package.json new file mode 100644 index 0000000..d0d4d36 --- /dev/null +++ b/src/runtime/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "tau-prolog": "^0.3.2" + } +}