kibi-swipl-linux-x64-gnu 1.0.0

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 (550) hide show
  1. package/README.md +29 -0
  2. package/bin/swipl +0 -0
  3. package/bin/swipl-win +0 -0
  4. package/build-manifest.json +70 -0
  5. package/lib/cmake/swipl/SWIPLConfig.cmake +21 -0
  6. package/lib/cmake/swipl/SWIPLConfigVersion.cmake +65 -0
  7. package/lib/cmake/swipl/SWIPLTargets-release.cmake +28 -0
  8. package/lib/cmake/swipl/SWIPLTargets.cmake +109 -0
  9. package/lib/swipl/ABI +1 -0
  10. package/lib/swipl/LICENSE +41 -0
  11. package/lib/swipl/README.md +116 -0
  12. package/lib/swipl/app/README.md +25 -0
  13. package/lib/swipl/app/app.pl +87 -0
  14. package/lib/swipl/app/pack.pl +350 -0
  15. package/lib/swipl/app/qlf.pl +521 -0
  16. package/lib/swipl/app/splfr.pl +177 -0
  17. package/lib/swipl/app/sys.pl +310 -0
  18. package/lib/swipl/bin/swipl.home +1 -0
  19. package/lib/swipl/boot/apply.pl +73 -0
  20. package/lib/swipl/boot/attvar.pl +344 -0
  21. package/lib/swipl/boot/autoload.pl +1226 -0
  22. package/lib/swipl/boot/bags.pl +283 -0
  23. package/lib/swipl/boot/dcg.pl +388 -0
  24. package/lib/swipl/boot/dicts.pl +193 -0
  25. package/lib/swipl/boot/dwim.pl +485 -0
  26. package/lib/swipl/boot/engines.pl +152 -0
  27. package/lib/swipl/boot/expand.pl +1628 -0
  28. package/lib/swipl/boot/gc.pl +65 -0
  29. package/lib/swipl/boot/history.pl +304 -0
  30. package/lib/swipl/boot/init.pl +4682 -0
  31. package/lib/swipl/boot/iri.pl +64 -0
  32. package/lib/swipl/boot/license.pl +390 -0
  33. package/lib/swipl/boot/load.pl +81 -0
  34. package/lib/swipl/boot/messages.pl +2521 -0
  35. package/lib/swipl/boot/packs.pl +306 -0
  36. package/lib/swipl/boot/predopts.pl +154 -0
  37. package/lib/swipl/boot/qlf.pl +141 -0
  38. package/lib/swipl/boot/rc.pl +263 -0
  39. package/lib/swipl/boot/syspred.pl +1634 -0
  40. package/lib/swipl/boot/tabling.pl +2321 -0
  41. package/lib/swipl/boot/threads.pl +42 -0
  42. package/lib/swipl/boot/toplevel.pl +2248 -0
  43. package/lib/swipl/boot/topvars.pl +261 -0
  44. package/lib/swipl/boot.prc +0 -0
  45. package/lib/swipl/cmake/swipl.cmake +131 -0
  46. package/lib/swipl/customize/README.md +23 -0
  47. package/lib/swipl/customize/edit +101 -0
  48. package/lib/swipl/customize/init.pl +164 -0
  49. package/lib/swipl/demo/README.md +33 -0
  50. package/lib/swipl/demo/likes.pl +44 -0
  51. package/lib/swipl/doc/packages/examples/chr/bool.chr +281 -0
  52. package/lib/swipl/doc/packages/examples/chr/chrdif.chr +87 -0
  53. package/lib/swipl/doc/packages/examples/chr/chrfreeze.chr +6 -0
  54. package/lib/swipl/doc/packages/examples/chr/family.chr +116 -0
  55. package/lib/swipl/doc/packages/examples/chr/fib.chr +24 -0
  56. package/lib/swipl/doc/packages/examples/chr/fibonacci.chr +31 -0
  57. package/lib/swipl/doc/packages/examples/chr/gcd.chr +28 -0
  58. package/lib/swipl/doc/packages/examples/chr/leq.chr +34 -0
  59. package/lib/swipl/doc/packages/examples/chr/listdom.chr +138 -0
  60. package/lib/swipl/doc/packages/examples/chr/primes.chr +29 -0
  61. package/lib/swipl/doc/packages/examples/http/README.md +98 -0
  62. package/lib/swipl/doc/packages/examples/http/calc.pl +92 -0
  63. package/lib/swipl/doc/packages/examples/http/demo_body.pl +232 -0
  64. package/lib/swipl/doc/packages/examples/http/demo_client.pl +165 -0
  65. package/lib/swipl/doc/packages/examples/http/demo_daemon.pl +38 -0
  66. package/lib/swipl/doc/packages/examples/http/demo_files.pl +50 -0
  67. package/lib/swipl/doc/packages/examples/http/demo_hello.pl +15 -0
  68. package/lib/swipl/doc/packages/examples/http/demo_login.pl +280 -0
  69. package/lib/swipl/doc/packages/examples/http/demo_openid.pl +177 -0
  70. package/lib/swipl/doc/packages/examples/http/demo_pwp.pl +20 -0
  71. package/lib/swipl/doc/packages/examples/http/demo_rest.pl +56 -0
  72. package/lib/swipl/doc/packages/examples/http/demo_threads.pl +52 -0
  73. package/lib/swipl/doc/packages/examples/http/linux-init-script +126 -0
  74. package/lib/swipl/doc/packages/examples/http/pwp/context.pwp +23 -0
  75. package/lib/swipl/doc/packages/examples/http/pwp/index.pwp +25 -0
  76. package/lib/swipl/doc/packages/examples/http/pwp/pwp1.pwp +12 -0
  77. package/lib/swipl/doc/packages/examples/http/pwp/pwp2.pwp +10 -0
  78. package/lib/swipl/doc/packages/examples/http/pwp/pwp3.pwp +25 -0
  79. package/lib/swipl/doc/packages/examples/http/pwp/pwp4.pwp +23 -0
  80. package/lib/swipl/doc/packages/examples/http/pwp/pwp5.pwp +11 -0
  81. package/lib/swipl/doc/packages/examples/http/pwp/pwp6.pwp +3 -0
  82. package/lib/swipl/doc/packages/examples/http/pwp/pwp7.pwp +3 -0
  83. package/lib/swipl/doc/packages/examples/http/pwp/pwp8.pwp +3 -0
  84. package/lib/swipl/doc/packages/examples/http/pwp/pwpdb.pl +12 -0
  85. package/lib/swipl/doc/packages/examples/http/systemd-script.service +18 -0
  86. package/lib/swipl/doc/packages/examples/http/upstart-script.conf +20 -0
  87. package/lib/swipl/doc/packages/examples/plunit/read.pl +17 -0
  88. package/lib/swipl/doc/packages/examples/plunit/simple.pl +33 -0
  89. package/lib/swipl/doc/packages/examples/ssl/client.pl +83 -0
  90. package/lib/swipl/doc/packages/examples/ssl/etc/README +52 -0
  91. package/lib/swipl/doc/packages/examples/ssl/etc/client/client-cert.p12 +0 -0
  92. package/lib/swipl/doc/packages/examples/ssl/etc/client/client-cert.pem +85 -0
  93. package/lib/swipl/doc/packages/examples/ssl/etc/client/client-key.pem +30 -0
  94. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/cacert.pem +82 -0
  95. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/careq.pem +18 -0
  96. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/crlnumber +1 -0
  97. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/index.txt +3 -0
  98. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/index.txt.attr +1 -0
  99. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/newcerts/9DC08797A0F63F7C.pem +85 -0
  100. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/newcerts/9DC08797A0F63F7D.pem +85 -0
  101. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/private/cakey.pem +30 -0
  102. package/lib/swipl/doc/packages/examples/ssl/etc/demoCA/serial +1 -0
  103. package/lib/swipl/doc/packages/examples/ssl/etc/server/server-cert.pem +85 -0
  104. package/lib/swipl/doc/packages/examples/ssl/etc/server/server-key.pem +30 -0
  105. package/lib/swipl/doc/packages/examples/ssl/https.pl +267 -0
  106. package/lib/swipl/doc/packages/examples/ssl/server.pl +106 -0
  107. package/lib/swipl/include/SWI-Prolog.h +1544 -0
  108. package/lib/swipl/include/SWI-Stream.h +537 -0
  109. package/lib/swipl/include/Yap/YapInterface.h +283 -0
  110. package/lib/swipl/include/sicstus/sicstus.h +452 -0
  111. package/lib/swipl/lib/x86_64-linux/cgi.so +0 -0
  112. package/lib/swipl/lib/x86_64-linux/crypt.so +0 -0
  113. package/lib/swipl/lib/x86_64-linux/crypto4pl.so +0 -0
  114. package/lib/swipl/lib/x86_64-linux/double_metaphone.so +0 -0
  115. package/lib/swipl/lib/x86_64-linux/files.so +0 -0
  116. package/lib/swipl/lib/x86_64-linux/hashstream.so +0 -0
  117. package/lib/swipl/lib/x86_64-linux/http_stream.so +0 -0
  118. package/lib/swipl/lib/x86_64-linux/isub.so +0 -0
  119. package/lib/swipl/lib/x86_64-linux/json.so +0 -0
  120. package/lib/swipl/lib/x86_64-linux/libswipl.so.10 +0 -0
  121. package/lib/swipl/lib/x86_64-linux/mallocinfo.so +0 -0
  122. package/lib/swipl/lib/x86_64-linux/md54pl.so +0 -0
  123. package/lib/swipl/lib/x86_64-linux/memfile.so +0 -0
  124. package/lib/swipl/lib/x86_64-linux/ntriples.so +0 -0
  125. package/lib/swipl/lib/x86_64-linux/pcre4pl.so +0 -0
  126. package/lib/swipl/lib/x86_64-linux/porter_stem.so +0 -0
  127. package/lib/swipl/lib/x86_64-linux/process.so +0 -0
  128. package/lib/swipl/lib/x86_64-linux/prolog_stream.so +0 -0
  129. package/lib/swipl/lib/x86_64-linux/rdf_db.so +0 -0
  130. package/lib/swipl/lib/x86_64-linux/readutil.so +0 -0
  131. package/lib/swipl/lib/x86_64-linux/rlimit.so +0 -0
  132. package/lib/swipl/lib/x86_64-linux/sched.so +0 -0
  133. package/lib/swipl/lib/x86_64-linux/sgml2pl.so +0 -0
  134. package/lib/swipl/lib/x86_64-linux/sha4pl.so +0 -0
  135. package/lib/swipl/lib/x86_64-linux/snowball.so +0 -0
  136. package/lib/swipl/lib/x86_64-linux/socket.so +0 -0
  137. package/lib/swipl/lib/x86_64-linux/ssl4pl.so +0 -0
  138. package/lib/swipl/lib/x86_64-linux/streaminfo.so +0 -0
  139. package/lib/swipl/lib/x86_64-linux/syslog.so +0 -0
  140. package/lib/swipl/lib/x86_64-linux/time.so +0 -0
  141. package/lib/swipl/lib/x86_64-linux/turtle.so +0 -0
  142. package/lib/swipl/lib/x86_64-linux/uid.so +0 -0
  143. package/lib/swipl/lib/x86_64-linux/unix.so +0 -0
  144. package/lib/swipl/lib/x86_64-linux/uri.so +0 -0
  145. package/lib/swipl/lib/x86_64-linux/websocket.so +0 -0
  146. package/lib/swipl/lib/x86_64-linux/zlib4pl.so +0 -0
  147. package/lib/swipl/library/INDEX.pl +1020 -0
  148. package/lib/swipl/library/aggregate.pl +755 -0
  149. package/lib/swipl/library/ansi_term.pl +653 -0
  150. package/lib/swipl/library/apply.pl +426 -0
  151. package/lib/swipl/library/apply_macros.pl +497 -0
  152. package/lib/swipl/library/arithmetic.pl +320 -0
  153. package/lib/swipl/library/assoc.pl +522 -0
  154. package/lib/swipl/library/atom.pl +169 -0
  155. package/lib/swipl/library/backcomp.pl +688 -0
  156. package/lib/swipl/library/base32.pl +291 -0
  157. package/lib/swipl/library/base64.pl +441 -0
  158. package/lib/swipl/library/broadcast.pl +161 -0
  159. package/lib/swipl/library/build/cmake.pl +137 -0
  160. package/lib/swipl/library/build/conan.pl +232 -0
  161. package/lib/swipl/library/build/make.pl +168 -0
  162. package/lib/swipl/library/build/tools.pl +825 -0
  163. package/lib/swipl/library/charsio.pl +195 -0
  164. package/lib/swipl/library/check.pl +1097 -0
  165. package/lib/swipl/library/check_installation.pl +912 -0
  166. package/lib/swipl/library/clp/INDEX.pl +157 -0
  167. package/lib/swipl/library/clp/bounds.pl +2036 -0
  168. package/lib/swipl/library/clp/clp_distinct.pl +263 -0
  169. package/lib/swipl/library/clp/clp_events.pl +92 -0
  170. package/lib/swipl/library/clp/clpb.pl +1896 -0
  171. package/lib/swipl/library/clp/clpfd.pl +7906 -0
  172. package/lib/swipl/library/clp/simplex.pl +1580 -0
  173. package/lib/swipl/library/codesio.pl +182 -0
  174. package/lib/swipl/library/coinduction.pl +183 -0
  175. package/lib/swipl/library/console_input.pl +289 -0
  176. package/lib/swipl/library/csv.pl +611 -0
  177. package/lib/swipl/library/ctypes.pl +161 -0
  178. package/lib/swipl/library/date.pl +370 -0
  179. package/lib/swipl/library/dcg/INDEX.pl +35 -0
  180. package/lib/swipl/library/dcg/basics.pl +514 -0
  181. package/lib/swipl/library/dcg/high_order.pl +227 -0
  182. package/lib/swipl/library/debug.pl +499 -0
  183. package/lib/swipl/library/dialect/bim.pl +186 -0
  184. package/lib/swipl/library/dialect/commons.pl +77 -0
  185. package/lib/swipl/library/dialect/eclipse/test_util_iso.pl +355 -0
  186. package/lib/swipl/library/dialect/hprolog/format.pl +44 -0
  187. package/lib/swipl/library/dialect/hprolog.pl +314 -0
  188. package/lib/swipl/library/dialect/ifprolog.pl +1317 -0
  189. package/lib/swipl/library/dialect/iso/iso_predicates.pl +277 -0
  190. package/lib/swipl/library/dialect/sicstus/README.TXT +1 -0
  191. package/lib/swipl/library/dialect/sicstus/arrays.pl +121 -0
  192. package/lib/swipl/library/dialect/sicstus/block.pl +278 -0
  193. package/lib/swipl/library/dialect/sicstus/lists.pl +167 -0
  194. package/lib/swipl/library/dialect/sicstus/ordsets.pl +52 -0
  195. package/lib/swipl/library/dialect/sicstus/sockets.pl +174 -0
  196. package/lib/swipl/library/dialect/sicstus/system.pl +262 -0
  197. package/lib/swipl/library/dialect/sicstus/terms.pl +57 -0
  198. package/lib/swipl/library/dialect/sicstus/timeout.pl +92 -0
  199. package/lib/swipl/library/dialect/sicstus.pl +582 -0
  200. package/lib/swipl/library/dialect/sicstus4/aggregate.pl +60 -0
  201. package/lib/swipl/library/dialect/sicstus4/between.pl +62 -0
  202. package/lib/swipl/library/dialect/sicstus4/clpfd.pl +75 -0
  203. package/lib/swipl/library/dialect/sicstus4/file_systems.pl +413 -0
  204. package/lib/swipl/library/dialect/sicstus4/lists.pl +274 -0
  205. package/lib/swipl/library/dialect/sicstus4/ordsets.pl +54 -0
  206. package/lib/swipl/library/dialect/sicstus4/samsort.pl +86 -0
  207. package/lib/swipl/library/dialect/sicstus4/sets.pl +124 -0
  208. package/lib/swipl/library/dialect/sicstus4/sockets.pl +164 -0
  209. package/lib/swipl/library/dialect/sicstus4/system.pl +80 -0
  210. package/lib/swipl/library/dialect/sicstus4/terms.pl +89 -0
  211. package/lib/swipl/library/dialect/sicstus4/timeout.pl +43 -0
  212. package/lib/swipl/library/dialect/sicstus4/types.pl +103 -0
  213. package/lib/swipl/library/dialect/sicstus4.pl +200 -0
  214. package/lib/swipl/library/dialect/swi/syspred_options.pl +250 -0
  215. package/lib/swipl/library/dialect/xsb/README.md +20 -0
  216. package/lib/swipl/library/dialect/xsb/basics.pl +318 -0
  217. package/lib/swipl/library/dialect/xsb/consult.pl +87 -0
  218. package/lib/swipl/library/dialect/xsb/curr_sym.pl +57 -0
  219. package/lib/swipl/library/dialect/xsb/error_handler.pl +111 -0
  220. package/lib/swipl/library/dialect/xsb/gensym.pl +53 -0
  221. package/lib/swipl/library/dialect/xsb/gpp.pl +138 -0
  222. package/lib/swipl/library/dialect/xsb/intern.pl +48 -0
  223. package/lib/swipl/library/dialect/xsb/lists.pl +47 -0
  224. package/lib/swipl/library/dialect/xsb/machine.pl +295 -0
  225. package/lib/swipl/library/dialect/xsb/ordsets.pl +53 -0
  226. package/lib/swipl/library/dialect/xsb/setof.pl +54 -0
  227. package/lib/swipl/library/dialect/xsb/source.pl +308 -0
  228. package/lib/swipl/library/dialect/xsb/standard.pl +169 -0
  229. package/lib/swipl/library/dialect/xsb/storage.pl +70 -0
  230. package/lib/swipl/library/dialect/xsb/string.pl +76 -0
  231. package/lib/swipl/library/dialect/xsb/thread.pl +62 -0
  232. package/lib/swipl/library/dialect/xsb/timed_call.pl +158 -0
  233. package/lib/swipl/library/dialect/xsb.pl +688 -0
  234. package/lib/swipl/library/dialect/yap/README.TXT +8 -0
  235. package/lib/swipl/library/dialect/yap.pl +283 -0
  236. package/lib/swipl/library/dialect.pl +123 -0
  237. package/lib/swipl/library/dicts.pl +399 -0
  238. package/lib/swipl/library/dif.pl +426 -0
  239. package/lib/swipl/library/edinburgh.pl +138 -0
  240. package/lib/swipl/library/edit.pl +783 -0
  241. package/lib/swipl/library/error.pl +495 -0
  242. package/lib/swipl/library/exceptions.pl +231 -0
  243. package/lib/swipl/library/explain.pl +543 -0
  244. package/lib/swipl/library/ext/RDF/INDEX.pl +25 -0
  245. package/lib/swipl/library/ext/RDF/rdf.pl +450 -0
  246. package/lib/swipl/library/ext/RDF/rdf_parser.pl +649 -0
  247. package/lib/swipl/library/ext/RDF/rdf_triple.pl +448 -0
  248. package/lib/swipl/library/ext/RDF/rdf_write.pl +701 -0
  249. package/lib/swipl/library/ext/RDF/rewrite_term.pl +177 -0
  250. package/lib/swipl/library/ext/chr/chr/a_star.pl +80 -0
  251. package/lib/swipl/library/ext/chr/chr/binomialheap.pl +142 -0
  252. package/lib/swipl/library/ext/chr/chr/builtins.pl +629 -0
  253. package/lib/swipl/library/ext/chr/chr/chr_compiler_errors.pl +179 -0
  254. package/lib/swipl/library/ext/chr/chr/chr_compiler_options.pl +382 -0
  255. package/lib/swipl/library/ext/chr/chr/chr_compiler_utility.pl +338 -0
  256. package/lib/swipl/library/ext/chr/chr/chr_debug.pl +59 -0
  257. package/lib/swipl/library/ext/chr/chr/chr_hashtable_store.pl +425 -0
  258. package/lib/swipl/library/ext/chr/chr/chr_integertable_store.pl +139 -0
  259. package/lib/swipl/library/ext/chr/chr/chr_messages.pl +176 -0
  260. package/lib/swipl/library/ext/chr/chr/chr_op.pl +53 -0
  261. package/lib/swipl/library/ext/chr/chr/chr_runtime.pl +1016 -0
  262. package/lib/swipl/library/ext/chr/chr/chr_translate.pl +25424 -0
  263. package/lib/swipl/library/ext/chr/chr/clean_code.pl +252 -0
  264. package/lib/swipl/library/ext/chr/chr/find.pl +78 -0
  265. package/lib/swipl/library/ext/chr/chr/guard_entailment.pl +19432 -0
  266. package/lib/swipl/library/ext/chr/chr/listmap.pl +108 -0
  267. package/lib/swipl/library/ext/chr/chr/pairlist.pl +78 -0
  268. package/lib/swipl/library/ext/chr/chr.pl +686 -0
  269. package/lib/swipl/library/ext/clib/INDEX.pl +158 -0
  270. package/lib/swipl/library/ext/clib/cgi.pl +86 -0
  271. package/lib/swipl/library/ext/clib/crypt.pl +44 -0
  272. package/lib/swipl/library/ext/clib/filesex.pl +644 -0
  273. package/lib/swipl/library/ext/clib/hash_stream.pl +119 -0
  274. package/lib/swipl/library/ext/clib/mallocinfo.pl +138 -0
  275. package/lib/swipl/library/ext/clib/md5.pl +68 -0
  276. package/lib/swipl/library/ext/clib/memfile.pl +61 -0
  277. package/lib/swipl/library/ext/clib/process.pl +573 -0
  278. package/lib/swipl/library/ext/clib/prolog_server.pl +157 -0
  279. package/lib/swipl/library/ext/clib/prolog_stream.pl +80 -0
  280. package/lib/swipl/library/ext/clib/rlimit.pl +54 -0
  281. package/lib/swipl/library/ext/clib/sched.pl +85 -0
  282. package/lib/swipl/library/ext/clib/sha.pl +162 -0
  283. package/lib/swipl/library/ext/clib/socket.pl +1102 -0
  284. package/lib/swipl/library/ext/clib/streaminfo.pl +103 -0
  285. package/lib/swipl/library/ext/clib/streampool.pl +136 -0
  286. package/lib/swipl/library/ext/clib/syslog.pl +180 -0
  287. package/lib/swipl/library/ext/clib/time.pl +194 -0
  288. package/lib/swipl/library/ext/clib/udp_broadcast.pl +975 -0
  289. package/lib/swipl/library/ext/clib/uid.pl +220 -0
  290. package/lib/swipl/library/ext/clib/unix.pl +317 -0
  291. package/lib/swipl/library/ext/clib/uri.pl +530 -0
  292. package/lib/swipl/library/ext/clib/uuid.pl +207 -0
  293. package/lib/swipl/library/ext/http/http/INDEX.pl +266 -0
  294. package/lib/swipl/library/ext/http/http/README.md +34 -0
  295. package/lib/swipl/library/ext/http/http/ax.pl +189 -0
  296. package/lib/swipl/library/ext/http/http/dcg_basics.pl +49 -0
  297. package/lib/swipl/library/ext/http/http/graphql.pl +1367 -0
  298. package/lib/swipl/library/ext/http/http/html_decl.pl +416 -0
  299. package/lib/swipl/library/ext/http/http/html_head.pl +654 -0
  300. package/lib/swipl/library/ext/http/http/html_quasiquotations.pl +120 -0
  301. package/lib/swipl/library/ext/http/http/html_write.pl +1425 -0
  302. package/lib/swipl/library/ext/http/http/htmx.pl +139 -0
  303. package/lib/swipl/library/ext/http/http/http_authenticate.pl +364 -0
  304. package/lib/swipl/library/ext/http/http/http_client.pl +412 -0
  305. package/lib/swipl/library/ext/http/http/http_cookie.pl +245 -0
  306. package/lib/swipl/library/ext/http/http/http_cors.pl +176 -0
  307. package/lib/swipl/library/ext/http/http/http_digest.pl +820 -0
  308. package/lib/swipl/library/ext/http/http/http_dirindex.pl +296 -0
  309. package/lib/swipl/library/ext/http/http/http_dispatch.pl +1552 -0
  310. package/lib/swipl/library/ext/http/http/http_dyn_workers.pl +214 -0
  311. package/lib/swipl/library/ext/http/http/http_error.pl +126 -0
  312. package/lib/swipl/library/ext/http/http/http_exception.pl +225 -0
  313. package/lib/swipl/library/ext/http/http/http_files.pl +163 -0
  314. package/lib/swipl/library/ext/http/http/http_header.pl +2820 -0
  315. package/lib/swipl/library/ext/http/http/http_hook.pl +106 -0
  316. package/lib/swipl/library/ext/http/http/http_host.pl +204 -0
  317. package/lib/swipl/library/ext/http/http/http_load.pl +113 -0
  318. package/lib/swipl/library/ext/http/http/http_log.pl +738 -0
  319. package/lib/swipl/library/ext/http/http/http_multipart_plugin.pl +232 -0
  320. package/lib/swipl/library/ext/http/http/http_open.pl +1821 -0
  321. package/lib/swipl/library/ext/http/http/http_openid.pl +1561 -0
  322. package/lib/swipl/library/ext/http/http/http_parameters.pl +504 -0
  323. package/lib/swipl/library/ext/http/http/http_path.pl +380 -0
  324. package/lib/swipl/library/ext/http/http/http_proxy.pl +80 -0
  325. package/lib/swipl/library/ext/http/http/http_pwp.pl +351 -0
  326. package/lib/swipl/library/ext/http/http/http_redis_plugin.pl +332 -0
  327. package/lib/swipl/library/ext/http/http/http_server.pl +105 -0
  328. package/lib/swipl/library/ext/http/http/http_server_files.pl +126 -0
  329. package/lib/swipl/library/ext/http/http/http_server_health.pl +186 -0
  330. package/lib/swipl/library/ext/http/http/http_session.pl +1040 -0
  331. package/lib/swipl/library/ext/http/http/http_sgml_plugin.pl +137 -0
  332. package/lib/swipl/library/ext/http/http/http_stream.pl +376 -0
  333. package/lib/swipl/library/ext/http/http/http_unix_daemon.pl +989 -0
  334. package/lib/swipl/library/ext/http/http/http_wrapper.pl +559 -0
  335. package/lib/swipl/library/ext/http/http/hub.pl +600 -0
  336. package/lib/swipl/library/ext/http/http/js_write.pl +461 -0
  337. package/lib/swipl/library/ext/http/http/mimepack.pl +224 -0
  338. package/lib/swipl/library/ext/http/http/mimetype.pl +276 -0
  339. package/lib/swipl/library/ext/http/http/term_html.pl +797 -0
  340. package/lib/swipl/library/ext/http/http/thread_httpd.pl +1181 -0
  341. package/lib/swipl/library/ext/http/http/web/css/dirindex.css +24 -0
  342. package/lib/swipl/library/ext/http/http/web/css/openid.css +57 -0
  343. package/lib/swipl/library/ext/http/http/web/icons/back.png +0 -0
  344. package/lib/swipl/library/ext/http/http/web/icons/c.png +0 -0
  345. package/lib/swipl/library/ext/http/http/web/icons/compressed.png +0 -0
  346. package/lib/swipl/library/ext/http/http/web/icons/folder.png +0 -0
  347. package/lib/swipl/library/ext/http/http/web/icons/generic.png +0 -0
  348. package/lib/swipl/library/ext/http/http/web/icons/layout.png +0 -0
  349. package/lib/swipl/library/ext/http/http/web/icons/openid-logo-square.png +0 -0
  350. package/lib/swipl/library/ext/http/http/web/icons/openid-logo-tiny.png +0 -0
  351. package/lib/swipl/library/ext/http/http/websocket.pl +729 -0
  352. package/lib/swipl/library/ext/http/http/yadis.pl +205 -0
  353. package/lib/swipl/library/ext/json/INDEX.pl +36 -0
  354. package/lib/swipl/library/ext/json/http/INDEX.pl +16 -0
  355. package/lib/swipl/library/ext/json/http/http_json.pl +490 -0
  356. package/lib/swipl/library/ext/json/http/js_grammar.pl +53 -0
  357. package/lib/swipl/library/ext/json/http/json.pl +48 -0
  358. package/lib/swipl/library/ext/json/http/json_convert.pl +48 -0
  359. package/lib/swipl/library/ext/json/json.pl +1215 -0
  360. package/lib/swipl/library/ext/json/json_convert.pl +681 -0
  361. package/lib/swipl/library/ext/json/json_grammar.pl +349 -0
  362. package/lib/swipl/library/ext/json/json_rpc_client.pl +423 -0
  363. package/lib/swipl/library/ext/json/json_rpc_common.pl +104 -0
  364. package/lib/swipl/library/ext/json/json_rpc_server.pl +489 -0
  365. package/lib/swipl/library/ext/json/json_schema.pl +2111 -0
  366. package/lib/swipl/library/ext/nlp/INDEX.pl +15 -0
  367. package/lib/swipl/library/ext/nlp/double_metaphone.pl +86 -0
  368. package/lib/swipl/library/ext/nlp/isub.pl +162 -0
  369. package/lib/swipl/library/ext/nlp/porter_stem.pl +50 -0
  370. package/lib/swipl/library/ext/nlp/snowball.pl +97 -0
  371. package/lib/swipl/library/ext/pcre/INDEX.pl +17 -0
  372. package/lib/swipl/library/ext/pcre/pcre.pl +974 -0
  373. package/lib/swipl/library/ext/plunit/INDEX.pl +20 -0
  374. package/lib/swipl/library/ext/plunit/plunit.pl +2631 -0
  375. package/lib/swipl/library/ext/plunit/test_wizard.pl +249 -0
  376. package/lib/swipl/library/ext/semweb/semweb/INDEX.pl +288 -0
  377. package/lib/swipl/library/ext/semweb/semweb/rdf11.pl +2106 -0
  378. package/lib/swipl/library/ext/semweb/semweb/rdf11_containers.pl +299 -0
  379. package/lib/swipl/library/ext/semweb/semweb/rdf_cache.pl +278 -0
  380. package/lib/swipl/library/ext/semweb/semweb/rdf_compare.pl +132 -0
  381. package/lib/swipl/library/ext/semweb/semweb/rdf_db.pl +3468 -0
  382. package/lib/swipl/library/ext/semweb/semweb/rdf_edit.pl +1145 -0
  383. package/lib/swipl/library/ext/semweb/semweb/rdf_http_plugin.pl +274 -0
  384. package/lib/swipl/library/ext/semweb/semweb/rdf_library.pl +1021 -0
  385. package/lib/swipl/library/ext/semweb/semweb/rdf_litindex.pl +1035 -0
  386. package/lib/swipl/library/ext/semweb/semweb/rdf_ntriples.pl +422 -0
  387. package/lib/swipl/library/ext/semweb/semweb/rdf_persistency.pl +1576 -0
  388. package/lib/swipl/library/ext/semweb/semweb/rdf_portray.pl +182 -0
  389. package/lib/swipl/library/ext/semweb/semweb/rdf_prefixes.pl +681 -0
  390. package/lib/swipl/library/ext/semweb/semweb/rdf_sandbox.pl +153 -0
  391. package/lib/swipl/library/ext/semweb/semweb/rdf_turtle.pl +54 -0
  392. package/lib/swipl/library/ext/semweb/semweb/rdf_turtle_write.pl +1587 -0
  393. package/lib/swipl/library/ext/semweb/semweb/rdf_zlib_plugin.pl +52 -0
  394. package/lib/swipl/library/ext/semweb/semweb/rdfa.pl +1510 -0
  395. package/lib/swipl/library/ext/semweb/semweb/rdfs.pl +475 -0
  396. package/lib/swipl/library/ext/semweb/semweb/sparql_client.pl +643 -0
  397. package/lib/swipl/library/ext/semweb/semweb/turtle.pl +455 -0
  398. package/lib/swipl/library/ext/sgml/DTD/HTML4.dcl +88 -0
  399. package/lib/swipl/library/ext/sgml/DTD/HTML4.dtd +1092 -0
  400. package/lib/swipl/library/ext/sgml/DTD/HTML4.soc +6 -0
  401. package/lib/swipl/library/ext/sgml/DTD/HTML5.dtd +906 -0
  402. package/lib/swipl/library/ext/sgml/DTD/HTMLlat1.ent +195 -0
  403. package/lib/swipl/library/ext/sgml/DTD/HTMLspec.ent +77 -0
  404. package/lib/swipl/library/ext/sgml/DTD/HTMLsym.ent +241 -0
  405. package/lib/swipl/library/ext/sgml/INDEX.pl +64 -0
  406. package/lib/swipl/library/ext/sgml/c14n2.pl +203 -0
  407. package/lib/swipl/library/ext/sgml/iso_639.pl +631 -0
  408. package/lib/swipl/library/ext/sgml/pwp.pl +705 -0
  409. package/lib/swipl/library/ext/sgml/sgml.pl +815 -0
  410. package/lib/swipl/library/ext/sgml/sgml_write.pl +1003 -0
  411. package/lib/swipl/library/ext/sgml/xpath.pl +620 -0
  412. package/lib/swipl/library/ext/sgml/xsdp_types.pl +232 -0
  413. package/lib/swipl/library/ext/ssl/INDEX.pl +60 -0
  414. package/lib/swipl/library/ext/ssl/crypto.pl +1015 -0
  415. package/lib/swipl/library/ext/ssl/http/INDEX.pl +5 -0
  416. package/lib/swipl/library/ext/ssl/http/http_ssl_plugin.pl +296 -0
  417. package/lib/swipl/library/ext/ssl/saml.pl +609 -0
  418. package/lib/swipl/library/ext/ssl/ssl.pl +647 -0
  419. package/lib/swipl/library/ext/ssl/xmldsig.pl +391 -0
  420. package/lib/swipl/library/ext/ssl/xmlenc.pl +354 -0
  421. package/lib/swipl/library/ext/zlib/INDEX.pl +8 -0
  422. package/lib/swipl/library/ext/zlib/zlib.pl +112 -0
  423. package/lib/swipl/library/fastrw.pl +105 -0
  424. package/lib/swipl/library/files.pl +80 -0
  425. package/lib/swipl/library/gensym.pl +111 -0
  426. package/lib/swipl/library/git.pl +1027 -0
  427. package/lib/swipl/library/hashtable.pl +365 -0
  428. package/lib/swipl/library/heaps.pl +252 -0
  429. package/lib/swipl/library/hotfix.pl +239 -0
  430. package/lib/swipl/library/http/jquery.pl +103 -0
  431. package/lib/swipl/library/http/web/js/jquery-3.6.0.min.js +2 -0
  432. package/lib/swipl/library/increval.pl +217 -0
  433. package/lib/swipl/library/intercept.pl +263 -0
  434. package/lib/swipl/library/iostream.pl +237 -0
  435. package/lib/swipl/library/iri_scheme/file.pl +70 -0
  436. package/lib/swipl/library/lazy_lists.pl +481 -0
  437. package/lib/swipl/library/listing.pl +1362 -0
  438. package/lib/swipl/library/lists.pl +860 -0
  439. package/lib/swipl/library/lynx/INDEX.pl +14 -0
  440. package/lib/swipl/library/lynx/format.pl +380 -0
  441. package/lib/swipl/library/lynx/html_style.pl +129 -0
  442. package/lib/swipl/library/lynx/html_text.pl +865 -0
  443. package/lib/swipl/library/lynx/pldoc_style.pl +87 -0
  444. package/lib/swipl/library/macros.pl +451 -0
  445. package/lib/swipl/library/main.pl +1200 -0
  446. package/lib/swipl/library/make.pl +197 -0
  447. package/lib/swipl/library/modules.pl +129 -0
  448. package/lib/swipl/library/nb_rbtrees.pl +267 -0
  449. package/lib/swipl/library/nb_set.pl +203 -0
  450. package/lib/swipl/library/obfuscate.pl +115 -0
  451. package/lib/swipl/library/occurs.pl +241 -0
  452. package/lib/swipl/library/operators.pl +182 -0
  453. package/lib/swipl/library/option.pl +388 -0
  454. package/lib/swipl/library/optparse.pl +966 -0
  455. package/lib/swipl/library/ordsets.pl +518 -0
  456. package/lib/swipl/library/oset.pl +160 -0
  457. package/lib/swipl/library/pairs.pl +187 -0
  458. package/lib/swipl/library/persistency.pl +713 -0
  459. package/lib/swipl/library/pio.pl +47 -0
  460. package/lib/swipl/library/portray_text.pl +277 -0
  461. package/lib/swipl/library/pprint.pl +940 -0
  462. package/lib/swipl/library/predicate_options.pl +975 -0
  463. package/lib/swipl/library/prolog_autoload.pl +233 -0
  464. package/lib/swipl/library/prolog_breakpoints.pl +396 -0
  465. package/lib/swipl/library/prolog_clause.pl +1104 -0
  466. package/lib/swipl/library/prolog_code.pl +416 -0
  467. package/lib/swipl/library/prolog_codewalk.pl +1248 -0
  468. package/lib/swipl/library/prolog_colour.pl +3301 -0
  469. package/lib/swipl/library/prolog_colour.qlf +0 -0
  470. package/lib/swipl/library/prolog_config.pl +154 -0
  471. package/lib/swipl/library/prolog_coverage.pl +1333 -0
  472. package/lib/swipl/library/prolog_debug.pl +404 -0
  473. package/lib/swipl/library/prolog_deps.pl +675 -0
  474. package/lib/swipl/library/prolog_evaluable.pl +234 -0
  475. package/lib/swipl/library/prolog_format.pl +219 -0
  476. package/lib/swipl/library/prolog_history.pl +161 -0
  477. package/lib/swipl/library/prolog_jiti.pl +333 -0
  478. package/lib/swipl/library/prolog_locale.pl +61 -0
  479. package/lib/swipl/library/prolog_metainference.pl +307 -0
  480. package/lib/swipl/library/prolog_pack.pl +3906 -0
  481. package/lib/swipl/library/prolog_profile.pl +346 -0
  482. package/lib/swipl/library/prolog_qlfmake.pl +533 -0
  483. package/lib/swipl/library/prolog_source.pl +1188 -0
  484. package/lib/swipl/library/prolog_stack.pl +794 -0
  485. package/lib/swipl/library/prolog_trace.pl +365 -0
  486. package/lib/swipl/library/prolog_versions.pl +347 -0
  487. package/lib/swipl/library/prolog_wrap.pl +164 -0
  488. package/lib/swipl/library/prolog_xref.pl +3090 -0
  489. package/lib/swipl/library/prolog_xref.qlf +0 -0
  490. package/lib/swipl/library/pure_input.pl +266 -0
  491. package/lib/swipl/library/qpforeign.pl +695 -0
  492. package/lib/swipl/library/qsave.pl +1516 -0
  493. package/lib/swipl/library/quasi_quotations.pl +300 -0
  494. package/lib/swipl/library/quintus.pl +437 -0
  495. package/lib/swipl/library/random.pl +459 -0
  496. package/lib/swipl/library/rbtrees.pl +1153 -0
  497. package/lib/swipl/library/readln.pl +256 -0
  498. package/lib/swipl/library/readutil.pl +304 -0
  499. package/lib/swipl/library/record.pl +544 -0
  500. package/lib/swipl/library/rwlocks.pl +172 -0
  501. package/lib/swipl/library/sandbox.pl +1384 -0
  502. package/lib/swipl/library/semweb/dc.rdfs +198 -0
  503. package/lib/swipl/library/semweb/eor.rdfs +95 -0
  504. package/lib/swipl/library/semweb/owl.owl +287 -0
  505. package/lib/swipl/library/semweb/rdf_library.ttl +90 -0
  506. package/lib/swipl/library/semweb/rdfs.rdfs +251 -0
  507. package/lib/swipl/library/settings.pl +755 -0
  508. package/lib/swipl/library/shell.pl +462 -0
  509. package/lib/swipl/library/shlib.pl +670 -0
  510. package/lib/swipl/library/solution_sequences.pl +439 -0
  511. package/lib/swipl/library/sort.pl +119 -0
  512. package/lib/swipl/library/statistics.pl +541 -0
  513. package/lib/swipl/library/streams.pl +118 -0
  514. package/lib/swipl/library/strings.pl +469 -0
  515. package/lib/swipl/library/system.pl +95 -0
  516. package/lib/swipl/library/tables.pl +381 -0
  517. package/lib/swipl/library/tableutil.pl +771 -0
  518. package/lib/swipl/library/tabling.pl +42 -0
  519. package/lib/swipl/library/terms.pl +457 -0
  520. package/lib/swipl/library/theme/auto.pl +61 -0
  521. package/lib/swipl/library/theme/dark.pl +455 -0
  522. package/lib/swipl/library/theme/light.pl +45 -0
  523. package/lib/swipl/library/thread.pl +810 -0
  524. package/lib/swipl/library/thread_pool.pl +508 -0
  525. package/lib/swipl/library/threadutil.pl +574 -0
  526. package/lib/swipl/library/tty.pl +316 -0
  527. package/lib/swipl/library/ugraphs.pl +644 -0
  528. package/lib/swipl/library/unicode/INDEX.pl +6 -0
  529. package/lib/swipl/library/unicode/blocks.pl +414 -0
  530. package/lib/swipl/library/url.pl +1129 -0
  531. package/lib/swipl/library/utf8.pl +145 -0
  532. package/lib/swipl/library/varnumbers.pl +221 -0
  533. package/lib/swipl/library/vm.pl +251 -0
  534. package/lib/swipl/library/wfs.pl +205 -0
  535. package/lib/swipl/library/when.pl +263 -0
  536. package/lib/swipl/library/writef.pl +278 -0
  537. package/lib/swipl/library/www_browser.pl +251 -0
  538. package/lib/swipl/library/yall.pl +574 -0
  539. package/lib/swipl/library/zip.pl +211 -0
  540. package/lib/swipl/swipl.home +1 -0
  541. package/lib/vendor/libcrypto.so.3 +0 -0
  542. package/lib/vendor/libpcre2-8.so.0 +0 -0
  543. package/lib/vendor/libssl.so.3 +0 -0
  544. package/lib/vendor/libz.so.1 +0 -0
  545. package/licenses/OpenSSL-LICENSE.txt +177 -0
  546. package/licenses/PCRE2-COPYING +5 -0
  547. package/licenses/README.md +12 -0
  548. package/licenses/SWI-Prolog-LICENSE +41 -0
  549. package/licenses/zlib-LICENSE +22 -0
  550. package/package.json +27 -0
@@ -0,0 +1,713 @@
1
+ /* Part of SWI-Prolog
2
+
3
+ Author: Jan Wielemaker
4
+ E-mail: jan@swi-prolog.org
5
+ WWW: https://www.swi-prolog.org
6
+ Copyright (c) 2009-2025, VU University, Amsterdam
7
+ CWI, Amsterdam
8
+ SWI-Prolog Solutions b.v.
9
+ All rights reserved.
10
+
11
+ Redistribution and use in source and binary forms, with or without
12
+ modification, are permitted provided that the following conditions
13
+ are met:
14
+
15
+ 1. Redistributions of source code must retain the above copyright
16
+ notice, this list of conditions and the following disclaimer.
17
+
18
+ 2. Redistributions in binary form must reproduce the above copyright
19
+ notice, this list of conditions and the following disclaimer in
20
+ the documentation and/or other materials provided with the
21
+ distribution.
22
+
23
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
+ POSSIBILITY OF SUCH DAMAGE.
35
+ */
36
+
37
+ :- module(persistency,
38
+ [ (persistent)/1, % +Declarations
39
+ current_persistent_predicate/1, % :PI
40
+
41
+ db_attach/2, % :File, +Options
42
+ db_detach/0,
43
+ db_attached/1, % :File
44
+
45
+ db_sync/1, % :What
46
+ db_sync_all/1, % +What
47
+
48
+ op(1150, fx, (persistent))
49
+ ]).
50
+ :- autoload(library(aggregate),[aggregate_all/3]).
51
+ :- use_module(library(debug),[debug/3]).
52
+ :- autoload(library(error),
53
+ [ instantiation_error/1,
54
+ must_be/2,
55
+ permission_error/3,
56
+ existence_error/2
57
+ ]).
58
+ :- autoload(library(option),[option/3]).
59
+
60
+
61
+ :- predicate_options(db_attach/2, 2,
62
+ [ sync(oneof([close,flush,none]))
63
+ ]).
64
+
65
+ /** <module> Provide persistent dynamic predicates
66
+
67
+ This module provides simple persistent storage for one or more dynamic
68
+ predicates. A database is always associated with a module. A module that
69
+ wishes to maintain a database must declare the terms that can be placed
70
+ in the database using the directive persistent/1.
71
+
72
+ The persistent/1 expands each declaration into five predicates:
73
+
74
+ - name(Arg, ...)
75
+ - assert_name(Arg, ...)
76
+ - asserta_name(Arg, ...)
77
+ - retract_name(Arg, ...)
78
+ - retractall_name(Arg, ...)
79
+
80
+ As mentioned, a database can only be accessed from within a single
81
+ module. This limitation is on purpose, forcing the user to provide a
82
+ proper API for accessing the shared persistent data.
83
+
84
+ This module requires the same thread-synchronization as the normal
85
+ Prolog database. This implies that if each individual assert or retract
86
+ takes the database from one consistent state to the next, no additional
87
+ locking is required. If more than one elementary database operation is
88
+ required to get from one consistent state to the next, both updating and
89
+ querying the database must be locked using with_mutex/2.
90
+
91
+ Below is a simple example, where adding a user does not need locking as
92
+ it is a single _assert_, while modifying a user requires both a retract
93
+ and assert and thus needs to be locked.
94
+
95
+ ```
96
+ :- module(user_db,
97
+ [ attach_user_db/1, % +File
98
+ current_user_role/2, % ?User, ?Role
99
+ add_user/2, % +User, +Role
100
+ set_user_role/2 % +User, +Role
101
+ ]).
102
+ :- use_module(library(persistency)).
103
+
104
+ :- persistent
105
+ user_role(name:atom, role:oneof([user,administrator])).
106
+
107
+ attach_user_db(File) :-
108
+ db_attach(File, []).
109
+
110
+ %% current_user_role(+Name, -Role) is semidet.
111
+
112
+ current_user_role(Name, Role) :-
113
+ with_mutex(user_db, user_role(Name, Role)).
114
+
115
+ add_user(Name, Role) :-
116
+ assert_user_role(Name, Role).
117
+
118
+ set_user_role(Name, Role) :-
119
+ user_role(Name, Role), !.
120
+ set_user_role(Name, Role) :-
121
+ with_mutex(user_db,
122
+ ( retractall_user_role(Name, _),
123
+ assert_user_role(Name, Role))).
124
+ ```
125
+
126
+ @tbd Provide type safety while loading
127
+ @tbd Thread safety must now be provided at the user-level. Can we
128
+ provide generic thread safety? Basically, this means that we
129
+ must wrap all exported predicates. That might better be done
130
+ outside this library.
131
+ @tbd Transaction management?
132
+ @tbd Should assert_<name> only assert if the database does not
133
+ contain a variant?
134
+ @tbd Since we have prolog_listen/2, we could use direct assert/1 and
135
+ retract/1 and use the system hooks to deal with the updates.
136
+ */
137
+
138
+ :- meta_predicate
139
+ db_attach(:, +),
140
+ db_attached(:),
141
+ db_sync(:),
142
+ current_persistent_predicate(:).
143
+ :- module_transparent
144
+ db_detach/0.
145
+
146
+
147
+ /*******************************
148
+ * DB *
149
+ *******************************/
150
+
151
+ :- dynamic
152
+ db_file/5, % Module, File, Created, Modified, EndPos
153
+ db_stream/2, % Module, Stream
154
+ db_dirty/2, % Module, Deleted
155
+ db_option/2. % Module, Name(Value)
156
+
157
+ :- volatile
158
+ db_stream/2.
159
+
160
+ :- multifile
161
+ (persistent)/3, % Module, Generic, Term
162
+ prolog:generated_predicate/1.
163
+
164
+
165
+ /*******************************
166
+ * DECLARATIONS *
167
+ *******************************/
168
+
169
+ %! persistent(+Spec)
170
+ %
171
+ % Declare dynamic database terms. Declarations appear in a
172
+ % directive and have the following format:
173
+ %
174
+ % ```
175
+ % :- persistent
176
+ % <callable>,
177
+ % <callable>,
178
+ % ...
179
+ % ```
180
+ %
181
+ % Each specification is a callable term, following the conventions
182
+ % of library(record), where each argument is of the form
183
+ %
184
+ % name:type
185
+ %
186
+ % Types are defined by library(error).
187
+
188
+ persistent(Spec) :-
189
+ throw(error(context_error(nodirective, persistent(Spec)), _)).
190
+
191
+ compile_persistent(Var, _, _) -->
192
+ { var(Var),
193
+ !,
194
+ instantiation_error(Var)
195
+ }.
196
+ compile_persistent(M:Spec, _, LoadModule) -->
197
+ !,
198
+ compile_persistent(Spec, M, LoadModule).
199
+ compile_persistent((A,B), Module, LoadModule) -->
200
+ !,
201
+ compile_persistent(A, Module, LoadModule),
202
+ compile_persistent(B, Module, LoadModule).
203
+ compile_persistent(Term, Module, LoadModule) -->
204
+ { functor(Term, Name, Arity), % Validates Term as callable
205
+ functor(Generic, Name, Arity),
206
+ qualify(Module, LoadModule, Name/Arity, Dynamic)
207
+ },
208
+ [ :- dynamic(Dynamic),
209
+
210
+ persistency:persistent(Module, Generic, Term)
211
+ ],
212
+ assert_clause(asserta, Term, Module, LoadModule),
213
+ assert_clause(assert, Term, Module, LoadModule),
214
+ retract_clause(Term, Module, LoadModule),
215
+ retractall_clause(Term, Module, LoadModule).
216
+
217
+ assert_clause(Where, Term, Module, LoadModule) -->
218
+ { functor(Term, Name, Arity),
219
+ atomic_list_concat([Where,'_', Name], PredName),
220
+ length(Args, Arity),
221
+ Head =.. [PredName|Args],
222
+ Assert =.. [Name|Args],
223
+ type_checkers(Args, 1, Term, Check),
224
+ atom_concat(db_, Where, DBActionName),
225
+ DBAction =.. [DBActionName, Module:Assert],
226
+ qualify(Module, LoadModule, Head, QHead),
227
+ Clause = (QHead :- Check, persistency:DBAction)
228
+ },
229
+ [ Clause ].
230
+
231
+ type_checkers([], _, _, true).
232
+ type_checkers([A0|AL], I, Spec, Check) :-
233
+ arg(I, Spec, ArgSpec),
234
+ ( ArgSpec = _Name:Type,
235
+ nonvar(Type),
236
+ Type \== any
237
+ -> Check = (must_be(Type, A0),More)
238
+ ; More = Check
239
+ ),
240
+ I2 is I + 1,
241
+ type_checkers(AL, I2, Spec, More).
242
+
243
+ retract_clause(Term, Module, LoadModule) -->
244
+ { functor(Term, Name, Arity),
245
+ atom_concat(retract_, Name, PredName),
246
+ length(Args, Arity),
247
+ Head =.. [PredName|Args],
248
+ Retract =.. [Name|Args],
249
+ qualify(Module, LoadModule, Head, QHead),
250
+ Clause = (QHead :- persistency:db_retract(Module:Retract))
251
+ },
252
+ [ Clause ].
253
+
254
+ retractall_clause(Term, Module, LoadModule) -->
255
+ { functor(Term, Name, Arity),
256
+ atom_concat(retractall_, Name, PredName),
257
+ length(Args, Arity),
258
+ Head =.. [PredName|Args],
259
+ Retract =.. [Name|Args],
260
+ qualify(Module, LoadModule, Head, QHead),
261
+ Clause = (QHead :- persistency:db_retractall(Module:Retract))
262
+ },
263
+ [ Clause ].
264
+
265
+ qualify(Module, Module, Head, Head) :- !.
266
+ qualify(Module, _LoadModule, Head, Module:Head).
267
+
268
+
269
+ :- multifile
270
+ system:term_expansion/2.
271
+
272
+ system:term_expansion((:- persistent(Spec)), Clauses) :-
273
+ prolog_load_context(module, Module),
274
+ phrase(compile_persistent(Spec, Module, Module), Clauses).
275
+
276
+
277
+ %! current_persistent_predicate(:PI) is nondet.
278
+ %
279
+ % True if PI is a predicate that provides access to the persistent
280
+ % database DB.
281
+
282
+ current_persistent_predicate(M:PName/Arity) :-
283
+ persistency:persistent(M, Generic, _),
284
+ functor(Generic, Name, Arity),
285
+ ( Name = PName
286
+ ; atom_concat(assert_, Name, PName)
287
+ ; atom_concat(retract_, Name, PName)
288
+ ; atom_concat(retractall_, Name, PName)
289
+ ).
290
+
291
+ prolog:generated_predicate(PI) :-
292
+ current_persistent_predicate(PI).
293
+
294
+
295
+ /*******************************
296
+ * ATTACH *
297
+ *******************************/
298
+
299
+ %! db_attach(:File, +Options)
300
+ %
301
+ % Use File as persistent database for the calling module. The calling
302
+ % module must defined persistent/1 to declare the database terms.
303
+ % Defined options:
304
+ %
305
+ % - sync(+Sync)
306
+ % One of =close= (close journal after write), =flush=
307
+ % (default, flush journal after write) or =none=
308
+ % (handle as fully buffered stream).
309
+ %
310
+ % If File is already attached this operation may change the `sync`
311
+ % behaviour.
312
+
313
+ db_attach(Module:File, Options) :-
314
+ db_set_options(Module, Options),
315
+ db_attach_file(Module, File).
316
+
317
+ db_set_options(Module, Options) :-
318
+ option(sync(Sync), Options, flush),
319
+ must_be(oneof([close,flush,none]), Sync),
320
+ ( db_option(Module, sync(Sync))
321
+ -> true
322
+ ; retractall(db_option(Module, _)),
323
+ assert(db_option(Module, sync(Sync)))
324
+ ).
325
+
326
+ db_attach_file(Module, File) :-
327
+ db_file(Module, Old, _, _, _), % we already have a db
328
+ !,
329
+ ( Old == File
330
+ -> ( db_stream(Module, Stream)
331
+ -> sync(Module, Stream)
332
+ ; true
333
+ )
334
+ ; permission_error(attach, db, File)
335
+ ).
336
+ db_attach_file(Module, File) :-
337
+ db_load(Module, File),
338
+ !.
339
+ db_attach_file(Module, File) :-
340
+ assert(db_file(Module, File, 0, 0, 0)).
341
+
342
+ db_load(Module, File) :-
343
+ retractall(db_file(Module, _, _, _, _)),
344
+ debug(db, 'Loading database ~w', [File]),
345
+ catch(setup_call_cleanup(
346
+ open(File, read, In, [encoding(utf8)]),
347
+ load_db_end(In, Module, Created, EndPos),
348
+ close(In)),
349
+ error(existence_error(source_sink, File), _), fail),
350
+ debug(db, 'Loaded ~w', [File]),
351
+ time_file(File, Modified),
352
+ assert(db_file(Module, File, Created, Modified, EndPos)).
353
+
354
+ db_load_incremental(Module, File) :-
355
+ db_file(Module, File, Created, _, EndPos0),
356
+ setup_call_cleanup(
357
+ ( open(File, read, In, [encoding(utf8)]),
358
+ read_action(In, created(Created0)),
359
+ set_stream_position(In, EndPos0)
360
+ ),
361
+ ( Created0 == Created,
362
+ debug(db, 'Incremental load from ~p', [EndPos0]),
363
+ load_db_end(In, Module, _Created, EndPos)
364
+ ),
365
+ close(In)),
366
+ debug(db, 'Updated ~w', [File]),
367
+ time_file(File, Modified),
368
+ retractall(db_file(Module, File, Created, _, _)),
369
+ assert(db_file(Module, File, Created, Modified, EndPos)).
370
+
371
+ load_db_end(In, Module, Created, End) :-
372
+ read_action(In, T0),
373
+ ( T0 = created(Created)
374
+ -> read_action(In, T1)
375
+ ; T1 = T0,
376
+ Created = 0
377
+ ),
378
+ load_db(T1, In, Module),
379
+ stream_property(In, position(End)).
380
+
381
+ load_db(end_of_file, _, _) :- !.
382
+ load_db(assert(Term), In, Module) :-
383
+ persistent(Module, Term, _Types),
384
+ !,
385
+ assert(Module:Term),
386
+ read_action(In, T1),
387
+ load_db(T1, In, Module).
388
+ load_db(asserta(Term), In, Module) :-
389
+ persistent(Module, Term, _Types),
390
+ !,
391
+ asserta(Module:Term),
392
+ read_action(In, T1),
393
+ load_db(T1, In, Module).
394
+ load_db(retractall(Term, Count), In, Module) :-
395
+ persistent(Module, Term, _Types),
396
+ !,
397
+ retractall(Module:Term),
398
+ set_dirty(Module, Count),
399
+ read_action(In, T1),
400
+ load_db(T1, In, Module).
401
+ load_db(retract(Term), In, Module) :-
402
+ persistent(Module, Term, _Types),
403
+ !,
404
+ ( retract(Module:Term)
405
+ -> set_dirty(Module, 1)
406
+ ; true
407
+ ),
408
+ read_action(In, T1),
409
+ load_db(T1, In, Module).
410
+ load_db(Term, In, Module) :-
411
+ print_message(error, illegal_term(Term)),
412
+ read_action(In, T1),
413
+ load_db(T1, In, Module).
414
+
415
+ db_clean(Module) :-
416
+ retractall(db_dirty(Module, _)),
417
+ ( persistent(Module, Term, _Types),
418
+ retractall(Module:Term),
419
+ fail
420
+ ; true
421
+ ).
422
+
423
+ %! db_size(+Module, -Terms) is det.
424
+ %
425
+ % Terms is the total number of terms in the DB for Module.
426
+
427
+ db_size(Module, Total) :-
428
+ aggregate_all(sum(Count), persistent_size(Module, Count), Total).
429
+
430
+ persistent_size(Module, Count) :-
431
+ persistent(Module, Term, _Types),
432
+ predicate_property(Module:Term, number_of_clauses(Count)).
433
+
434
+ %! db_attached(:File) is semidet.
435
+ %
436
+ % True if the context module attached to the persistent database File.
437
+
438
+ db_attached(Module:File) :-
439
+ db_file(Module, File, _Created, _Modified, _EndPos).
440
+
441
+ %! db_assert(:Term) is det.
442
+ %
443
+ % Assert Term into the database and record it for persistency.
444
+ % Note that if the on-disk file has been modified it is first
445
+ % reloaded.
446
+
447
+ :- public
448
+ db_assert/1,
449
+ db_asserta/1,
450
+ db_retractall/1,
451
+ db_retract/1.
452
+
453
+ db_assert(Term) :- with_mutex('$persistency', db_assert_sync(Term)).
454
+ db_asserta(Term) :- with_mutex('$persistency', db_asserta_sync(Term)).
455
+ db_retract(Term) :- with_mutex('$persistency', db_retract_sync(Term)).
456
+ db_retractall(Term) :- with_mutex('$persistency', db_retractall_sync(Term)).
457
+
458
+ db_assert_sync(Module:Term) :-
459
+ assert(Module:Term),
460
+ persistent(Module, assert(Term)).
461
+
462
+ db_asserta_sync(Module:Term) :-
463
+ asserta(Module:Term),
464
+ persistent(Module, asserta(Term)).
465
+
466
+ persistent(Module, Action) :-
467
+ ( db_stream(Module, Stream)
468
+ -> true
469
+ ; db_file(Module, File, _Created, _Modified, _EndPos)
470
+ -> db_sync(Module, update), % Is this correct?
471
+ db_open_file(File, append, Stream),
472
+ assert(db_stream(Module, Stream))
473
+ ; existence_error(db_file, Module)
474
+ ),
475
+ write_action(Stream, Action),
476
+ sync(Module, Stream).
477
+
478
+ db_open_file(File, Mode, Stream) :-
479
+ open(File, Mode, Stream,
480
+ [ close_on_abort(false),
481
+ encoding(utf8),
482
+ lock(write)
483
+ ]),
484
+ ( size_file(File, 0)
485
+ -> get_time(Now),
486
+ write_action(Stream, created(Now))
487
+ ; true
488
+ ).
489
+
490
+
491
+ %! db_detach is det.
492
+ %
493
+ % Detach persistency from the calling module and delete all
494
+ % persistent clauses from the Prolog database. Note that the file
495
+ % is not affected. After this operation another file may be
496
+ % attached, providing it satisfies the same persistency
497
+ % declaration.
498
+
499
+ db_detach :-
500
+ context_module(Module),
501
+ db_sync(Module:detach),
502
+ db_clean(Module).
503
+
504
+
505
+ %! sync(+Module, +Stream) is det.
506
+ %
507
+ % Synchronise journal after a write. Using =close=, the journal
508
+ % file is closed, making it easier to edit the file externally.
509
+ % Using =flush= flushes the stream but does not close it. This
510
+ % provides better performance. Using =none=, the stream is not
511
+ % even flushed. This makes the journal sensitive to crashes, but
512
+ % much faster.
513
+
514
+ sync(Module, Stream) :-
515
+ db_option(Module, sync(Sync)),
516
+ ( Sync == close
517
+ -> db_sync(Module, close)
518
+ ; Sync == flush
519
+ -> flush_output(Stream)
520
+ ; true
521
+ ).
522
+
523
+ read_action(Stream, Action) :-
524
+ read_term(Stream, Action, [module(db)]).
525
+
526
+ write_action(Stream, Action) :-
527
+ \+ \+ ( numbervars(Action, 0, _, [singletons(true)]),
528
+ format(Stream, '~W.~n',
529
+ [ Action,
530
+ [ quoted(true),
531
+ numbervars(true),
532
+ module(db)
533
+ ]
534
+ ])
535
+ ).
536
+
537
+ %! db_retractall(:Term) is det.
538
+ %
539
+ % Retract all matching facts and do the same in the database. If
540
+ % Term is unbound, persistent/1 from the calling module is used as
541
+ % generator.
542
+
543
+ db_retractall_sync(Module:Term) :-
544
+ ( var(Term)
545
+ -> forall(persistent(Module, Term, _Types),
546
+ db_retractall(Module:Term))
547
+ ; State = count(0),
548
+ ( retract(Module:Term),
549
+ arg(1, State, C0),
550
+ C1 is C0+1,
551
+ nb_setarg(1, State, C1),
552
+ fail
553
+ ; arg(1, State, Count)
554
+ ),
555
+ ( Count > 0
556
+ -> set_dirty(Module, Count),
557
+ persistent(Module, retractall(Term, Count))
558
+ ; true
559
+ )
560
+ ).
561
+
562
+
563
+ %! db_retract(:Term) is nondet.
564
+ %
565
+ % Retract terms from the database one-by-one.
566
+
567
+ db_retract_sync(Module:Term) :-
568
+ ( var(Term)
569
+ -> instantiation_error(Term)
570
+ ; retract(Module:Term),
571
+ set_dirty(Module, 1),
572
+ persistent(Module, retract(Term))
573
+ ).
574
+
575
+
576
+ set_dirty(_, 0) :- !.
577
+ set_dirty(Module, Count) :-
578
+ ( retract(db_dirty(Module, C0))
579
+ -> true
580
+ ; C0 = 0
581
+ ),
582
+ C1 is C0 + Count,
583
+ assert(db_dirty(Module, C1)).
584
+
585
+ %! db_sync(:What)
586
+ %
587
+ % Synchronise database with the associated file. What is one of:
588
+ %
589
+ % * reload
590
+ % Database is reloaded from file if the file was modified
591
+ % since loaded.
592
+ % * update
593
+ % As `reload`, but use incremental loading if possible.
594
+ % This allows for two processes to examine the same database
595
+ % file, where one writes the database and the other periodycally
596
+ % calls db_sync(update) to follow the modified data.
597
+ % * gc
598
+ % Database was re-written, deleting all retractall
599
+ % statements. This is the same as gc(50).
600
+ % * gc(Percentage)
601
+ % GC DB if the number of deleted terms is greater than the given
602
+ % percentage of the total number of terms.
603
+ % * gc(always)
604
+ % GC DB without checking the percentage.
605
+ % * close
606
+ % Database stream was closed
607
+ % * detach
608
+ % Remove all registered persistency for the calling module
609
+ % * nop
610
+ % No-operation performed
611
+ %
612
+ % With unbound What, db_sync/1 reloads the database if it was
613
+ % modified on disk, gc it if it is dirty and close it if it is
614
+ % opened.
615
+
616
+ db_sync(Module:What) :-
617
+ db_sync(Module, What).
618
+
619
+
620
+ db_sync(Module, reload) :-
621
+ \+ db_stream(Module, _), % not open
622
+ db_file(Module, File, _Created, ModifiedWhenLoaded, _EndPos),
623
+ catch(time_file(File, Modified), _, fail),
624
+ Modified > ModifiedWhenLoaded, % Externally modified
625
+ !,
626
+ debug(db, 'Database ~w was externally modified; reloading', [File]),
627
+ !,
628
+ ( catch(db_load_incremental(Module, File),
629
+ E,
630
+ ( print_message(warning, E), fail ))
631
+ -> true
632
+ ; db_clean(Module),
633
+ db_load(Module, File)
634
+ ).
635
+ db_sync(Module, gc) :-
636
+ !,
637
+ db_sync(Module, gc(50)).
638
+ db_sync(Module, gc(When)) :-
639
+ ( When == always
640
+ -> true
641
+ ; db_dirty(Module, Dirty),
642
+ db_size(Module, Total),
643
+ ( Total > 0
644
+ -> Perc is (100*Dirty)/Total,
645
+ Perc > When
646
+ ; Dirty > 0
647
+ )
648
+ ),
649
+ !,
650
+ db_sync(Module, close),
651
+ db_file(Module, File, _, Modified, _),
652
+ atom_concat(File, '.new', NewFile),
653
+ debug(db, 'Database ~w is dirty; cleaning', [File]),
654
+ get_time(Created),
655
+ catch(setup_call_cleanup(
656
+ db_open_file(NewFile, write, Out),
657
+ ( persistent(Module, Term, _Types),
658
+ call(Module:Term),
659
+ write_action(Out, assert(Term)),
660
+ fail
661
+ ; stream_property(Out, position(EndPos))
662
+ ),
663
+ close(Out)),
664
+ Error,
665
+ ( catch(delete_file(NewFile),_,fail),
666
+ throw(Error))),
667
+ retractall(db_file(Module, File, _, Modified, _)),
668
+ rename_file(NewFile, File),
669
+ time_file(File, NewModified),
670
+ assert(db_file(Module, File, Created, NewModified, EndPos)).
671
+ db_sync(Module, close) :-
672
+ retract(db_stream(Module, Stream)),
673
+ !,
674
+ db_file(Module, File, Created, _, _),
675
+ debug(db, 'Database ~w is open; closing', [File]),
676
+ stream_property(Stream, position(EndPos)),
677
+ close(Stream),
678
+ time_file(File, Modified),
679
+ retractall(db_file(Module, File, _, _, _)),
680
+ assert(db_file(Module, File, Created, Modified, EndPos)).
681
+ db_sync(Module, Action) :-
682
+ Action == detach,
683
+ !,
684
+ ( retract(db_stream(Module, Stream))
685
+ -> close(Stream)
686
+ ; true
687
+ ),
688
+ retractall(db_file(Module, _, _, _, _)),
689
+ retractall(db_dirty(Module, _)),
690
+ retractall(db_option(Module, _)).
691
+ db_sync(_, nop) :- !.
692
+ db_sync(_, _).
693
+
694
+
695
+ %! db_sync_all(+What)
696
+ %
697
+ % Sync all registered databases.
698
+
699
+ db_sync_all(What) :-
700
+ must_be(oneof([reload,gc,gc(_),close]), What),
701
+ forall(db_file(Module, _, _, _, _),
702
+ db_sync(Module:What)).
703
+
704
+
705
+ /*******************************
706
+ * CLOSE *
707
+ *******************************/
708
+
709
+ close_dbs :-
710
+ forall(retract(db_stream(_Module, Stream)),
711
+ close(Stream)).
712
+
713
+ :- at_halt(close_dbs).