{"id":20660982,"url":"https://github.com/liatemplates/tau-prolog","last_synced_at":"2026-04-24T04:32:58.509Z","repository":{"id":107256847,"uuid":"125924107","full_name":"LiaTemplates/Tau-Prolog","owner":"LiaTemplates","description":"Template for integrating the Tau-Prolog interpreter into LiaScript","archived":false,"fork":false,"pushed_at":"2026-02-16T22:19:46.000Z","size":268,"stargazers_count":2,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-02-17T04:11:09.319Z","etag":null,"topics":["liascript","liascript-template","online-compiler","prolog","tau"],"latest_commit_sha":null,"homepage":"https://liascript.github.io/course/?https://raw.githubusercontent.com/liaTemplates/tau-prolog/master/README.md","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LiaTemplates.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-03-19T21:42:43.000Z","updated_at":"2026-02-16T22:19:49.000Z","dependencies_parsed_at":null,"dependency_job_id":"00097fb3-2b2a-42b8-89b6-2dd7d513b391","html_url":"https://github.com/LiaTemplates/Tau-Prolog","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/LiaTemplates/Tau-Prolog","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiaTemplates%2FTau-Prolog","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiaTemplates%2FTau-Prolog/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiaTemplates%2FTau-Prolog/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiaTemplates%2FTau-Prolog/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LiaTemplates","download_url":"https://codeload.github.com/LiaTemplates/Tau-Prolog/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiaTemplates%2FTau-Prolog/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32209893,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T03:15:14.334Z","status":"ssl_error","status_checked_at":"2026-04-24T03:15:11.608Z","response_time":64,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["liascript","liascript-template","online-compiler","prolog","tau"],"created_at":"2024-11-16T19:06:43.364Z","updated_at":"2026-04-24T04:32:58.503Z","avatar_url":"https://github.com/LiaTemplates.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!--\nauthor:    Andre Dietrich\nemail:     andre.dietrich@ovgu.de\nversion:   0.3.1\nlanguage:  en\nnarrator:  US English Female\n\nscript:    js/tau-prolog.min.js\n\nlogo:      http://tau-prolog.org/logo/tauprolog256.png\n\ncomment:   Template for integrating the [Tau-Prolog](http://tau-prolog.org/)\n           interpreter, which runs on JavaScript, into LiaScript courses.\n           Includes macros for loading programs, querying, appending rules,\n           and checking quiz answers.\n\nattribute: [Tau-Prolog](http://tau-prolog.org/)\n           by [José Antonio Riaza Valverde](http://jariaza.es)\n           is licensed under [BSD-3 Clause](http://tau-prolog.org/license)\n\n\n@Tau.program\n\u003cscript\u003e\n  var db = `@'input`;\n  window['@0'] = {\n    session: window.pl.create(),\n    query: null,\n    rslt: \"\",\n    query_str: \"\",\n    db: db\n  };\n  \n  var result = null;\n  window['@0']['session'].consult(db, {\n    success: function() {\n      result = \"database '@0' loaded\";\n    },\n    error: function(err) {\n      var c_err = window.pl.flatten_error(err);\n      var error = new LiaError(\"parsing program '@0' =\u003e \" + err.args[0], 1);\n      error.add_detail(0, c_err.type + \" =\u003e \" + c_err.found + \"; expected =\u003e \" + c_err.expected, \"error\", c_err.line - 1, c_err.column);\n      throw error;\n    }\n  });\n  \n  result;\n\u003c/script\u003e\n@end\n\n@Tau.program_append\n\u003cscript\u003e\n  var additional_db = `@'input`;\n  \n  try {\n    var session = window['@0']['session'];\n    if (!session) {\n      throw {message: \"'@0' has not been initialized. Use @Tau.program first.\"};\n    }\n  }\n  catch(e) {\n    throw {message: \"'@0' has not been consulted. Use @Tau.program first.\"};\n  }\n  \n  var result = null;\n  session.consult(additional_db, {\n    success: function() {\n      // Append to stored database for @Tau.check compatibility\n      window['@0']['db'] += \"\\n\" + additional_db;\n      result = \"additional rules appended to '@0'\";\n    },\n    error: function(err) {\n      var c_err = window.pl.flatten_error(err);\n      var error = new LiaError(\"parsing additional program for '@0' =\u003e \" + err.args[0], 1);\n      error.add_detail(0, c_err.type + \" =\u003e \" + c_err.found + \"; expected =\u003e \" + c_err.expected, \"error\", c_err.line - 1, c_err.column);\n      throw error;\n    }\n  });\n  \n  result;\n\u003c/script\u003e\n@end\n\n@Tau.query\n\u003cscript\u003e\n  var query = `@'input`;\n  \n  try {\n    // Create a new output buffer for this query execution\n    var output_buffer = \"\";\n    var custom_output = {\n      put: function(text, stream) {\n        output_buffer += text;\n        return true;\n      },\n      flush: function() { return true; }\n    };\n    \n    // Override the session's user_output stream\n    window['@0']['session'].streams['user_output'].stream = custom_output;\n    \n    if(window['@0']['query'] == null || window['@0']['query_str'] != query) {\n      window['@0']['query_str'] = query;\n      window['@0']['query'] = null;\n      window['@0']['rslt'] = \"\"; // Reset results for new query\n      \n      window['@0']['session'].query(query, {\n        success: function(goal) {\n          window['@0']['query'] = goal;\n          // Get answer immediately after successful query\n          window['@0']['session'].answer({\n            success: function(answer) {\n              if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n              window['@0']['rslt'] += window.pl.format_answer(answer) + \".\\n\";\n              send.lia(window['@0']['rslt'].trim());\n            },\n            fail: function() {\n              if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n              window['@0']['rslt'] += \"false.\\n\";\n              send.lia(window['@0']['rslt'].trim());\n            },\n            error: function(err) {\n              if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n              var c_err = window.pl.flatten_error(err);\n              window['@0']['rslt'] += \"Error: \" + c_err.type + \"\\n\";\n              send.lia(window['@0']['rslt'].trim());\n            },\n            limit: function() {\n              if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n              window['@0']['rslt'] += \"Limit exceeded.\\n\";\n              send.lia(window['@0']['rslt'].trim());\n            }\n          });\n        },\n        error: function(err) {\n          var c_err = window.pl.flatten_error(err);\n          var error = new LiaError(\"parsing query for '@0' =\u003e \" + err.args[0], 1);\n          error.add_detail(0, c_err.type + \" =\u003e \" + c_err.found + \"; expected =\u003e \" + c_err.expected, \"error\", c_err.line - 1, c_err.column);\n          throw error;\n        }\n      });\n    } else {\n      // Query already executed, get next answer\n      window['@0']['session'].answer({\n        success: function(answer) {\n          if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n          window['@0']['rslt'] += window.pl.format_answer(answer) + \".\\n\";\n          send.lia(window['@0']['rslt'].trim());\n        },\n        fail: function() {\n          if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n          window['@0']['rslt'] += \"false.\\n\";\n          send.lia(window['@0']['rslt'].trim());\n        },\n        error: function(err) {\n          if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n          var c_err = window.pl.flatten_error(err);\n          window['@0']['rslt'] += \"Error: \" + c_err.type + \"\\n\";\n          send.lia(window['@0']['rslt'].trim());\n        },\n        limit: function() {\n          if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n          window['@0']['rslt'] += \"Limit exceeded.\\n\";\n          send.lia(window['@0']['rslt'].trim());\n        }\n      });\n    }\n  }\n  catch(e) {\n    throw {message: \"'@0' has not been consulted\"};\n  }\n  \n  \"LIA: wait\";\n\u003c/script\u003e\n@end\n\n@Tau.check\n\u003cscript\u003e\n  var db = null;\n  try {\n    db = window['@0']['db'];\n  }\n  catch(e) {\n    throw {message: \"'@0' has not been consulted\"};\n  }\n  var session = window.pl.create();\n  \n  session.consult(db, {\n    success: function() {\n      session.query(`@1`.replace(/[.]/g, \"\") + \".\", {\n        success: function(goal) {\n          session.answer({\n            success: function(answer) {\n              var rslt = window.pl.format_answer(answer);\n              send.lia(rslt);\n            },\n            fail: function() {\n              send.lia(\"false\");\n            },\n            error: function(err) {\n              send.lia(err.message);\n            },\n            limit: function() {\n              send.lia(\"false\");\n            }\n          });\n        },\n        error: function(err) {\n          throw {message: \"parsing query for '@0' =\u003e \" + err.args[0]};\n        }\n      });\n    },\n    error: function(err) {\n      throw {message: \"parsing program '@0' =\u003e \" + err.args[0]};\n    }\n  });\n  \n  \"LIA: wait\";\n\u003c/script\u003e\n@end\n\n@Tau\n```prolog @0\n@2\n```\n@Tau.program(@0)\n\n\n```prolog Query:\n@1\n```\n@Tau.query(@0)\n@end\n\n--\u003e\n\n# Tau-Prolog - Template\n\n\n                         --{{0}}--\nThis document defines some basic macros for applying the JavaScript\n[Tau-Prolog](http://tau-prolog.org) interpreter in\n[LiaScript](https://LiaScript.github.io) to make Prolog programs in Markdown\nexecuteable and editable.\n\n__Try it on LiaScript:__\n\nhttps://liascript.github.io/course/?https://raw.githubusercontent.com/liaTemplates/tau-prolog/master/README.md\n\n__See the project on Github:__\n\nhttps://github.com/liaTemplates/tau-prolog\n\n                         --{{1}}--\nThere are three ways to use this template. The easiest way is to use the\n`import` statement and the url of the raw text-file of the master branch or any\nother branch or version. But you can also copy the required functionionality\ndirectly into the header of your Markdown document, see therefor the\n[last slide](#5). And of course, you could also clone this project and change\nit, as you wish.\n\n  {{1}}\n1. Load the macros via\n\n   `import: https://raw.githubusercontent.com/liaTemplates/tau-prolog/master/README.md`\n\n2. Copy the definitions into your Project\n\n3. Clone this repository on GitHub\n\n\n## `@Tau.program/query`\n\n                         --{{0}}--\nTo use the [Tau-Prolog](http://tau-prolog.org) interpreter, two macros are\nnecessary. The first one is `@Tau.program`, which is called with a unique\nidentifier. It defines the basic Prolog-program with all rules and definitions.\n\n```prolog bouquet.pro\nred(rose).\nyellow(tulip).\nwhite(carnation).\nblue(myosotis).\nblue(viola).\n```\n@Tau.program(bouquet.pro)\n\n                         --{{1}}--\n`@Tau.query`, as the name suggests, allows it to query your program, therefor it\nhas to be called with the unique identifier, that was used to refere to the\nprogram.\n\n                           {{1}}\n```prolog\nred(rose).\n```\n@Tau.query(bouquet.pro)\n\n                         --{{2}}--\nThis way it is possible to define multiple separated queries, at different\nplaces, which make use of the same Prolog-program, as in this case\n`bouquet.pro`.\n\n                           {{2}}\n```prolog\nblue(Flower).\n```\n@Tau.query(bouquet.pro)\n\n### `use_module`\n\n                         --{{0}}--\nTau-Prolog includes several library modules that extend its functionality. You\ncan load modules using the `use_module/1` directive. The `library(lists)` provides\ncommon list manipulation predicates.\n\n                         --{{1}}--\nYou can also use `library(lists)` for common list operations like `append/3`,\n`member/2`, `reverse/2`, and `length/2`.\n\n                           {{1}}\n```prolog lists_demo.pro\n:- use_module(library(lists)).\n\ncombine_lists(L1, L2, Result) :-\n    append(L1, L2, Result).\n\nlist_length(List, N) :-\n    length(List, N).\n```\n@Tau.program(lists_demo.pro)\n\n                         --{{2}}--\nNow you can query the list operations. The `append/3` predicate concatenates\ntwo lists, and `length/2` determines the length of a list.\n\n                           {{2}}\n```prolog\ncombine_lists([1,2,3], [4,5,6], Result).\n```\n@Tau.query(lists_demo.pro)\n\n                         --{{3}}--\nYou can also check if an element is a member of a list using the `member/2`\npredicate from the lists module.\n\n                           {{3}}\n```prolog\nmember(X, [apple, banana, cherry]).\n```\n@Tau.query(lists_demo.pro)\n\n## `@Tau.program_append`\n\n                         --{{0}}--\nSometimes you want to add additional rules or facts to an existing Prolog\ndatabase without creating a new session. The `@Tau.program_append` macro allows\nyou to append code to an already loaded program. This is useful for incrementally\nbuilding up a knowledge base or adding new rules based on previous definitions.\n\n```prolog animals.pro\n% Basic animal facts\nanimal(cat).\nanimal(dog).\nanimal(bird).\n\n% Initial classification\nmammal(cat).\nmammal(dog).\n```\n@Tau.program(animals.pro)\n\n                         --{{1}}--\nAfter loading the initial program, you can query it to see the basic facts.\n\n                           {{1}}\n```prolog\nanimal(X).\n```\n@Tau.query(animals.pro)\n\n                         --{{2}}--\nNow we can append additional rules to the same session using `@Tau.program_append`.\nThis adds new facts and rules without replacing the existing database.\n\n                           {{2}}\n```prolog\n% Add more animals\nanimal(fish).\nanimal(snake).\n\n% Add more classifications\ncan_fly(bird).\ncan_swim(fish).\n\n% Add a rule based on existing facts\npet(X) :- mammal(X).\n```\n@Tau.program_append(animals.pro)\n\n                         --{{3}}--\nThe appended code is now part of the session. You can query both old and new\npredicates together.\n\n                           {{3}}\n```prolog\npet(X).\n```\n@Tau.query(animals.pro)\n\n                         --{{4}}--\nYou can also query the newly added predicates.\n\n                           {{4}}\n```prolog\ncan_fly(X).\n```\n@Tau.query(animals.pro)\n\n## `@Tau`\n\n                         --{{0}}--\nIf you want to use the previous macros in combination, by creating the program\nmodule and query module with one call, you can use the following notation. The\n`@Tau` macro in the header is used to define a block-macro, whereby the\nidentifier and an initial value for the query are defined within. The code-block\ndefines the third parameter, which is used to define the program.\n\n```` markdown\n```prolog @Tau(holiday.pro,`% goes_to(Who, france).`)\ngoes_to(axel,england).\ngoes_to(beate,greece).\ngoes_to(beate,turkey).\ngoes_to(clemens,france).\ngoes_to(dagmar,italy).\ngoes_to(elmar,france).\ngoes_to(frederike,france).\n```\n````\n\n                         --{{1}}--\nThus, on\n[LiaScript](https://liascript.github.io/course/?https://raw.githubusercontent.com/liaTemplates/tau-prolog/master/README.md#4)\nyou should see two executable code-blocks and on\n[Github](https://github.com/liaTemplates/tau-prolog) you should at least see a\ncode-block with prolog syntax higlighting.\n\n                           {{1}}\n```prolog @Tau(holiday.pro,`% goes_to(Who, france).`)\ngoes_to(axel,england).\ngoes_to(beate,greece).\ngoes_to(beate,turkey).\ngoes_to(clemens,france).\ngoes_to(dagmar,italy).\ngoes_to(elmar,france).\ngoes_to(frederike,france).\n```\n\n## `@Tau.check`\n\n                         --{{0}}--\nYou can use `@Tau.check` to check the input of a text quiz input for example.\n\n```prolog genealogy.pro\nmale(adam).\nmale(alfred).\nmale(anton).\nmale(arthur).\nmale(baldur).\nmale(bernd).\nmale(boris).\n\nfemale(adele).\nfemale(alwine).\nfemale(anna).\nfemale(ariadne).\nfemale(barbara).\nfemale(berta).\n\n/* parent(X,Y) means: Y is a parent of X */\n\nparent(baldur,adam).\nparent(baldur,adele).\nparent(barbara,alfred).\nparent(barbara,alwine).\nparent(bernd,anton).\nparent(bernd,anna).\nparent(berta,arthur).\nparent(berta,ariadne).\nparent(boris,arthur).\nparent(boris,ariadne).\n```\n@Tau.program(genealogy.pro)\n\n---\n\n__Type in the Prolog-query for identifying the parents of barbara.__\n\n    [[parent(barbara, X).]]\n@Tau.check(genealogy.pro,`setof(X, @'input, [alfred, alwine])`)\n\n## Implementation\n\n                         --{{0}}--\nThe code shows how the macros were implemented by using a minified version of\nthe Tau-Prolog JavaScript interpreter. If you want to host your own version of\nthis library, you will have to change the url.\nSince [rawgit](https://raw.githubusercontent.com) is going to stop its service,\nI recommend [jsDelivr](https://www.jsdelivr.com).\n\n`````` markdown\n@Tau.program\n\u003cscript\u003e\n  var db = `@'input`;\n  window['@0'] = {\n    session: window.pl.create(),\n    query: null,\n    rslt: \"\",\n    query_str: \"\",\n    db: db\n  };\n  \n  var result = null;\n  window['@0']['session'].consult(db, {\n    success: function() {\n      result = \"database '@0' loaded\";\n    },\n    error: function(err) {\n      var c_err = window.pl.flatten_error(err);\n      var error = new LiaError(\"parsing program '@0' =\u003e \" + err.args[0], 1);\n      error.add_detail(0, c_err.type + \" =\u003e \" + c_err.found + \"; expected =\u003e \" + c_err.expected, \"error\", c_err.line - 1, c_err.column);\n      throw error;\n    }\n  });\n  \n  result;\n\u003c/script\u003e\n@end\n\n@Tau.program_append\n\u003cscript\u003e\n  var additional_db = `@'input`;\n  \n  try {\n    var session = window['@0']['session'];\n    if (!session) {\n      throw {message: \"'@0' has not been initialized. Use @Tau.program first.\"};\n    }\n  }\n  catch(e) {\n    throw {message: \"'@0' has not been consulted. Use @Tau.program first.\"};\n  }\n  \n  var result = null;\n  session.consult(additional_db, {\n    success: function() {\n      // Append to stored database for @Tau.check compatibility\n      window['@0']['db'] += \"\\n\" + additional_db;\n      result = \"additional rules appended to '@0'\";\n    },\n    error: function(err) {\n      var c_err = window.pl.flatten_error(err);\n      var error = new LiaError(\"parsing additional program for '@0' =\u003e \" + err.args[0], 1);\n      error.add_detail(0, c_err.type + \" =\u003e \" + c_err.found + \"; expected =\u003e \" + c_err.expected, \"error\", c_err.line - 1, c_err.column);\n      throw error;\n    }\n  });\n  \n  result;\n\u003c/script\u003e\n@end\n\n@Tau.query\n\u003cscript\u003e\n  var query = `@'input`;\n  \n  try {\n    // Create a new output buffer for this query execution\n    var output_buffer = \"\";\n    var custom_output = {\n      put: function(text, stream) {\n        output_buffer += text;\n        return true;\n      },\n      flush: function() { return true; }\n    };\n    \n    // Override the session's user_output stream\n    window['@0']['session'].streams['user_output'].stream = custom_output;\n    \n    if(window['@0']['query'] == null || window['@0']['query_str'] != query) {\n      window['@0']['query_str'] = query;\n      window['@0']['query'] = null;\n      window['@0']['rslt'] = \"\"; // Reset results for new query\n      \n      window['@0']['session'].query(query, {\n        success: function(goal) {\n          window['@0']['query'] = goal;\n          // Get answer immediately after successful query\n          window['@0']['session'].answer({\n            success: function(answer) {\n              if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n              window['@0']['rslt'] += window.pl.format_answer(answer) + \".\\n\";\n              send.lia(window['@0']['rslt'].trim());\n            },\n            fail: function() {\n              if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n              window['@0']['rslt'] += \"false.\\n\";\n              send.lia(window['@0']['rslt'].trim());\n            },\n            error: function(err) {\n              if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n              var c_err = window.pl.flatten_error(err);\n              window['@0']['rslt'] += \"Error: \" + c_err.type + \"\\n\";\n              send.lia(window['@0']['rslt'].trim());\n            },\n            limit: function() {\n              if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n              window['@0']['rslt'] += \"Limit exceeded.\\n\";\n              send.lia(window['@0']['rslt'].trim());\n            }\n          });\n        },\n        error: function(err) {\n          var c_err = window.pl.flatten_error(err);\n          var error = new LiaError(\"parsing query for '@0' =\u003e \" + err.args[0], 1);\n          error.add_detail(0, c_err.type + \" =\u003e \" + c_err.found + \"; expected =\u003e \" + c_err.expected, \"error\", c_err.line - 1, c_err.column);\n          throw error;\n        }\n      });\n    } else {\n      // Query already executed, get next answer\n      window['@0']['session'].answer({\n        success: function(answer) {\n          if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n          window['@0']['rslt'] += window.pl.format_answer(answer) + \".\\n\";\n          send.lia(window['@0']['rslt'].trim());\n        },\n        fail: function() {\n          if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n          window['@0']['rslt'] += \"false.\\n\";\n          send.lia(window['@0']['rslt'].trim());\n        },\n        error: function(err) {\n          if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n          var c_err = window.pl.flatten_error(err);\n          window['@0']['rslt'] += \"Error: \" + c_err.type + \"\\n\";\n          send.lia(window['@0']['rslt'].trim());\n        },\n        limit: function() {\n          if(output_buffer) window['@0']['rslt'] += output_buffer + \"\\n\";\n          window['@0']['rslt'] += \"Limit exceeded.\\n\";\n          send.lia(window['@0']['rslt'].trim());\n        }\n      });\n    }\n  }\n  catch(e) {\n    throw {message: \"'@0' has not been consulted\"};\n  }\n  \n  \"LIA: wait\";\n\u003c/script\u003e\n@end\n\n@Tau.check\n\u003cscript\u003e\n  var db = null;\n  try {\n    db = window['@0']['db'];\n  }\n  catch(e) {\n    throw {message: \"'@0' has not been consulted\"};\n  }\n  var session = window.pl.create();\n  \n  session.consult(db, {\n    success: function() {\n      session.query(`@1`.replace(/[.]/g, \"\") + \".\", {\n        success: function(goal) {\n          session.answer({\n            success: function(answer) {\n              var rslt = window.pl.format_answer(answer);\n              send.lia(rslt);\n            },\n            fail: function() {\n              send.lia(\"false\");\n            },\n            error: function(err) {\n              send.lia(err.message);\n            },\n            limit: function() {\n              send.lia(\"false\");\n            }\n          });\n        },\n        error: function(err) {\n          throw {message: \"parsing query for '@0' =\u003e \" + err.args[0]};\n        }\n      });\n    },\n    error: function(err) {\n      throw {message: \"parsing program '@0' =\u003e \" + err.args[0]};\n    }\n  });\n  \n  \"LIA: wait\";\n\u003c/script\u003e\n@end\n\n@Tau\n```prolog @0\n@2\n```\n@Tau.program(@0)\n\n\n```prolog Query:\n@1\n```\n@Tau.query(@0)\n@end\n``````\n                         --{{1}}--\nIf you want to minimize loading effort in your LiaScript project, you can also\ncopy this code and paste it into your main comment header, see the code in the\nraw file of this document.\n\n{{1}} https://raw.githubusercontent.com/liaTemplates/tau-prolog/master/README.md\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliatemplates%2Ftau-prolog","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliatemplates%2Ftau-prolog","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliatemplates%2Ftau-prolog/lists"}