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,365 @@
1
+ /* Part of SWI-Prolog
2
+
3
+ Author: Jan Wielemaker
4
+ E-mail: jan@swi-prolog.org
5
+ WWW: http://www.swi-prolog.org
6
+ Copyright (c) 2019-2024, CWI, Amsterdam
7
+ SWI-Prolog Solutions b.v.
8
+ All rights reserved.
9
+
10
+ Redistribution and use in source and binary forms, with or without
11
+ modification, are permitted provided that the following conditions
12
+ are met:
13
+
14
+ 1. Redistributions of source code must retain the above copyright
15
+ notice, this list of conditions and the following disclaimer.
16
+
17
+ 2. Redistributions in binary form must reproduce the above copyright
18
+ notice, this list of conditions and the following disclaimer in
19
+ the documentation and/or other materials provided with the
20
+ distribution.
21
+
22
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33
+ POSSIBILITY OF SUCH DAMAGE.
34
+ */
35
+
36
+ :- module(prolog_trace,
37
+ [ trace/1, % :Spec
38
+ trace/2, % :Spec, +Ports
39
+ tracing/2, % :Spec, -Ports
40
+ list_tracing/0,
41
+ notraceall/0
42
+ ]).
43
+ :- autoload(library(apply),[maplist/2]).
44
+ :- autoload(library(error),[instantiation_error/1]).
45
+ :- autoload(library(prolog_wrap),[wrap_predicate/4]).
46
+ :- autoload(library(prolog_code), [pi_head/2]).
47
+
48
+
49
+ /** <module> Print access to predicates
50
+
51
+ This library prints accesses to specified predicates by wrapping the
52
+ predicate.
53
+
54
+ @see library(debug) for adding conditional print statements to a
55
+ program.
56
+ */
57
+
58
+ :- meta_predicate
59
+ trace(:),
60
+ trace(:, +),
61
+ tracing(:, -).
62
+
63
+ :- dynamic tracing_mask/2 as volatile. % :Head, Bitmask
64
+ :- dynamic trace_condition/3 as volatile. % :Head, Port, Cond
65
+
66
+ %! trace(:Pred) is det.
67
+ %! trace(:Pred, +PortSpec) is det.
68
+ %
69
+ % Print passes through _ports_ of specified predicates. Pred is a,
70
+ % possible partial, specification of a predicate as it is also used be
71
+ % spy/1 and similar predicates. Where a full predicate specification
72
+ % is of the shape `Module:Name/Arity` (or `//Arity for non-terminals),
73
+ % both the module and arity may be omitted in which case Pred refers
74
+ % to all matching predicates. PortSpec is either a single port
75
+ % (`call`, `exit`, `fail` or `redo`), preceded with `+` or `-` or a
76
+ % list of these. The predicate modifies the current trace
77
+ % specification and then installs a suitable wrapper for the predicate
78
+ % using wrap_predicate/4. For example:
79
+ %
80
+ % ```
81
+ % ?- trace(append).
82
+ % % lists:append/2: [all]
83
+ % % lists:append/3: [all]
84
+ % % append/1: [all]
85
+ % true.
86
+ %
87
+ % ?- append([a,b], [c], L).
88
+ % T [10] Call: lists:append([a, b], [c], _18032)
89
+ % T [19] Call: lists:append([b], [c], _19410)
90
+ % T [28] Call: lists:append([], [c], _20400)
91
+ % T [28 +0.1ms] Exit: lists:append([], [c], [c])
92
+ % T [19 +0.2ms] Exit: lists:append([b], [c], [b, c])
93
+ % T [10 +0.5ms] Exit: lists:append([a, b], [c], [a, b, c])
94
+ % L = [a, b, c].
95
+ %
96
+ % ?- trace(append, -all).
97
+ % % lists:append/2: Not tracing
98
+ % % lists:append/3: Not tracing
99
+ % % append/1: Not tracing
100
+ % ```
101
+ %
102
+ % The text between [] indicates the call depth (first number) and for
103
+ % all ports except the `call` port the _wall_ time since the start
104
+ % (call port) in milliseconds. Note that the instrumentation and print
105
+ % time is included in the time. In the example above the actual time
106
+ % is about 0.00001ms on todays hardware.
107
+ %
108
+ % In addition, __conditions__ may be specified. In this case the the
109
+ % specification takes the shape ``trace(:Head, Port(Condition))``. For
110
+ % example:
111
+ %
112
+ % ?- trace(current_prolog_flag(Flag, Value), call(var(Flag))).
113
+ % ?- list_tracing.
114
+ % % Trace points (see trace/1,2) on:
115
+ % % system:current_prolog_flag(A,_): [call(var(A))]
116
+ %
117
+ % This specification will only print the goal if the registered
118
+ % condition succeeds. Note that we can use the condition for its side
119
+ % effect and then fail to avoid printing the event. Clearing the trace
120
+ % event on all relevant ports removes the condition. There is
121
+ % currently no way to modify the condition without clearing the trace
122
+ % point first.
123
+
124
+ trace(Pred) :-
125
+ trace(Pred, +all).
126
+
127
+ trace(Pred, Spec) :-
128
+ Pred = Ctx:_,
129
+ '$find_predicate'(Pred, Preds),
130
+ Preds \== [],
131
+ maplist(set_trace_pi(Spec, Pred, Ctx), Preds).
132
+
133
+ set_trace_pi(Spec, PredSpec, Ctx, Pred) :-
134
+ pi_head(Pred, Head0),
135
+ resolve_predicate(Head0, Head),
136
+ bind_head(PredSpec, Head),
137
+ set_trace(Spec, Head, Ctx).
138
+
139
+ bind_head(Head, Head) :- !.
140
+ bind_head(_:Head, _:Head) :- !.
141
+ bind_head(_, _).
142
+
143
+ set_trace(Spec, Head, Ctx) :-
144
+ ( tracing_mask(Head, Spec0)
145
+ -> true
146
+ ; Spec0 = 0
147
+ ),
148
+ modify(Spec, Head, Spec0, Spec1, Ctx),
149
+ retractall(tracing_mask(Head, _)),
150
+ ( Spec1 == [] ; Spec1 == 0
151
+ -> true
152
+ ; asserta(tracing_mask(Head, Spec1))
153
+ ),
154
+ mask_ports(Spec1, Ports),
155
+ ( Spec1 == 0
156
+ -> unwrap_predicate(Head, trace),
157
+ print_message(informational, trace(Head, Ports))
158
+ ; wrapper(Spec1, Head, Wrapped, Wrapper),
159
+ wrap_predicate(Head, trace, Wrapped, Wrapper),
160
+ print_message(informational, trace(Head, Ports))
161
+ ).
162
+
163
+ resolve_predicate(Head0, Head) :-
164
+ ( predicate_property(Head0, imported_from(M))
165
+ -> requalify(Head0, M, Head)
166
+ ; Head = Head0
167
+ ).
168
+
169
+ requalify(Term, M, M:Plain) :-
170
+ strip_module(Term, _, Plain).
171
+
172
+ modify(Var, _, _, _, _) :-
173
+ var(Var),
174
+ !,
175
+ instantiation_error(Var).
176
+ modify([], _, Spec, Spec, _) :-
177
+ !.
178
+ modify([H|T], Head, Spec0, Spec, Ctx) :-
179
+ !,
180
+ modify(H, Head, Spec0, Spec1, Ctx),
181
+ modify(T, Head, Spec1, Spec, Ctx).
182
+ modify(+PortSpec, Head, Spec0, Spec, Ctx) :-
183
+ !,
184
+ port_spec(PortSpec, Head, Port, Ctx),
185
+ port_mask(Port, Mask),
186
+ Spec is Spec0 \/ Mask.
187
+ modify(-Port, Head, Spec0, Spec, _) :-
188
+ !,
189
+ port_mask(Port, Mask),
190
+ remove_condition(Head, Mask),
191
+ Spec is Spec0 /\ \Mask.
192
+ modify(Port, Head, Spec0, Spec, Ctx) :-
193
+ modify(+Port, Head, Spec0, Spec, Ctx).
194
+
195
+ port_spec(Spec, _, Port, _), atom(Spec) =>
196
+ Port = Spec.
197
+ port_spec(Spec, Head, Port, Ctx),
198
+ compound(Spec),
199
+ compound_name_arguments(Spec, Name, [Cond]) =>
200
+ Port = Name,
201
+ port_mask(Port, Mask),
202
+ strip_module(Ctx:Cond, M, PCond),
203
+ ( predicate_property(M:PCond, iso)
204
+ -> TheCond = PCond
205
+ ; TheCond = M:PCond
206
+ ),
207
+ asserta(trace_condition(Head, Mask, TheCond)).
208
+
209
+ remove_condition(Head, Mask) :-
210
+ ( trace_condition(Head, TraceMask, TheCond),
211
+ Mask /\ TraceMask =:= TraceMask,
212
+ retractall(trace_condition(Head, TraceMask, TheCond)),
213
+ fail
214
+ ; true
215
+ ).
216
+
217
+ port_mask(all, 0x0f).
218
+ port_mask(call, 0x01).
219
+ port_mask(exit, 0x02).
220
+ port_mask(redo, 0x04).
221
+ port_mask(fail, 0x08).
222
+
223
+ mask_ports(0, []) :-
224
+ !.
225
+ mask_ports(Pattern, [H|T]) :-
226
+ is_masked(Pattern, H, Pattern1),
227
+ mask_ports(Pattern1, T).
228
+
229
+ %! wrapper(+Ports:integer, :Head, -Wrapped, -Wrapper) is det.
230
+ %! wrapper(+Ports:integer, :Head, +Id, -Wrapped, -Wrapper) is det.
231
+ %
232
+ % Adds calls to
233
+ %
234
+ % print_message(debug, frame(Head, trace(Port, Id)))
235
+ %
236
+ % @arg Id is a term `#{frame:Frame, level:Level, start:Start}`, where
237
+ % `Frame` is the (fragile) frame identifier, `Level` is the stack
238
+ % depth and `Start` is the wall-time when the call was started.
239
+
240
+ wrapper(Ports, Head, Wrapped, Wrapper) :-
241
+ wrapper(Ports, Head,
242
+ #{frame:Frame, level:Level, start:Start},
243
+ Wrapped, Wrapped1),
244
+ Wrapper = ( prolog_current_frame(Frame),
245
+ prolog_frame_attribute(Frame, level, Level),
246
+ get_time(Start),
247
+ Wrapped1
248
+ ).
249
+
250
+ wrapper(0, _, _, Wrapped, Wrapped) :-
251
+ !.
252
+ wrapper(Pattern, Head, Id, Wrapped, Call) :-
253
+ is_masked(Pattern, call, Pattern1),
254
+ !,
255
+ wrapper(Pattern1, Head, Id, Wrapped, Call0),
256
+ Call = ( prolog_trace:on_port(call, Head, Id),
257
+ Call0
258
+ ).
259
+ wrapper(Pattern, Head, Id, Wrapped, Call) :-
260
+ is_masked(Pattern, exit, Pattern1),
261
+ !,
262
+ wrapper(Pattern1, Head, Id, Wrapped, Call0),
263
+ Call = ( Call0,
264
+ prolog_trace:on_port(exit, Head, Id)
265
+ ).
266
+ wrapper(Pattern, Head, Id, Wrapped, Call) :-
267
+ is_masked(Pattern, redo, Pattern1),
268
+ !,
269
+ wrapper(Pattern1, Head, Id, Wrapped, Call0),
270
+ Call = ( call_cleanup(Call0, Det = true),
271
+ ( Det == true
272
+ -> true
273
+ ; true
274
+ ; prolog_trace:on_port(redo, Head, Id),
275
+ fail
276
+ )
277
+ ).
278
+ wrapper(Pattern, Head, Id, Wrapped, Call) :-
279
+ is_masked(Pattern, fail, Pattern1),
280
+ !,
281
+ wrapper(Pattern1, Head, Id, Wrapped, Call0),
282
+ Call = call(( call_cleanup(Call0, Det = true),
283
+ ( Det == true
284
+ -> !
285
+ ; true
286
+ )
287
+ ; prolog_trace:on_port(fail, Head, Id),
288
+ fail
289
+ )).
290
+
291
+ is_masked(Pattern0, Port, Pattern) :-
292
+ port_mask(Port, Mask),
293
+ Pattern0 /\ Mask =:= Mask,
294
+ !,
295
+ Pattern is Pattern0 /\ \Mask.
296
+
297
+ % on_port(+Port, +Head, +Id)
298
+ %
299
+ % Called on the various ports. Succeeds on the `call` and `exit` ports
300
+ % and fails otherwise.
301
+
302
+ :- public on_port/3.
303
+ on_port(Port, Head, Id) :-
304
+ ( do_trace(Port, Head)
305
+ -> print_message(debug, frame(Head, trace(Port, Id)))
306
+ ; true
307
+ ),
308
+ success_port(Port).
309
+
310
+ do_trace(Port, Head) :-
311
+ forall(active_trace_condition(Port, Head, Cond),
312
+ Cond).
313
+
314
+ active_trace_condition(Port, Head, Cond) :-
315
+ trace_condition(Head, Mask, Cond),
316
+ port_mask(Port, PortMask),
317
+ Mask /\ PortMask =\= 0.
318
+
319
+ success_port(call). % on the other ports we must fail.
320
+ success_port(exit).
321
+
322
+ %! tracing(:Spec, -Ports)
323
+ %
324
+ % True if Spec is traced using Ports. Spec is a fully qualified head
325
+ % term.
326
+
327
+ tracing(Spec, Ports) :-
328
+ tracing_mask(Spec, Mask),
329
+ mask_ports(Mask, Ports0),
330
+ maplist(add_condition(Spec), Ports0, Ports).
331
+
332
+ add_condition(Head, Port, PortCond) :-
333
+ trace_condition(Head, Mask, Cond),
334
+ port_mask(Port, PortMask),
335
+ Mask /\ PortMask =\= 0,
336
+ !,
337
+ PortCond =.. [Port,Cond].
338
+ add_condition(_, Port, Port).
339
+
340
+
341
+ %! list_tracing.
342
+ %
343
+ % List predicates we are currently tracing
344
+
345
+ list_tracing :-
346
+ Head = _:_,
347
+ findall(trace(Head, Ports), tracing(Head, Ports), Tracing),
348
+ print_message(informational, tracing(Tracing)).
349
+
350
+ :- multifile
351
+ prolog_debug_tools:debugging_hook/1.
352
+
353
+ prolog_debug_tools:debugging_hook(_DebugMode) :-
354
+ ( tracing(_:_, _)
355
+ -> list_tracing
356
+ ).
357
+
358
+
359
+ %! notraceall is det.
360
+ %
361
+ % Remove all trace points
362
+
363
+ notraceall :-
364
+ forall(tracing(M:Spec, _Ports),
365
+ trace(M:Spec, -all)).
@@ -0,0 +1,347 @@
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) 2023, SWI-Prolog Solutions b.v.
7
+ All rights reserved.
8
+
9
+ Redistribution and use in source and binary forms, with or without
10
+ modification, are permitted provided that the following conditions
11
+ are met:
12
+
13
+ 1. Redistributions of source code must retain the above copyright
14
+ notice, this list of conditions and the following disclaimer.
15
+
16
+ 2. Redistributions in binary form must reproduce the above copyright
17
+ notice, this list of conditions and the following disclaimer in
18
+ the documentation and/or other materials provided with the
19
+ distribution.
20
+
21
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32
+ POSSIBILITY OF SUCH DAMAGE.
33
+ */
34
+
35
+ :- module(prolog_versions,
36
+ [ require_prolog_version/2, % +Required, +Features:list
37
+ require_version/3, % +Component, +Available, +Required
38
+ cmp_versions/3 % ?Cmp, +Version1, +Version2
39
+ ]).
40
+ :- autoload(library(apply), [maplist/2, maplist/3]).
41
+ :- autoload(library(error), [domain_error/2, existence_error/2, type_error/2]).
42
+
43
+ /** <module> Demand specific (Prolog) versions
44
+
45
+ This library is provided to make it easier to reason about software
46
+ versions, in particular require that that hosting Prolog system is of
47
+ the right version and provides the features required by the library or
48
+ application.
49
+
50
+ @tbd Not only provide a minimal version but a more version ranges,
51
+ exclude certain versions, etc.
52
+ @tbd More features and better messages to help the user resolving
53
+ problems.
54
+ */
55
+
56
+ %! require_prolog_version(+Required, +Features:list) is det.
57
+ %
58
+ % Claim that the running Prolog version is at least version Required
59
+ % and provides the requested Features. Required is an expression of
60
+ % versions. At the lowest level, a version is an atom or string that
61
+ % provides the version as
62
+ %
63
+ % Major.Minor[[.Patch][[-GitRev],-GitHash]]]
64
+ %
65
+ % Example strings are '8.5', '8.5.0', '8.5.0-50',
66
+ % '8.5.0-69-gad38e8ad8`. The last two require fetching the sources
67
+ % from git or using the Windows daily builds.
68
+ %
69
+ % Versions may be embedded in a comparison operator (`<`, `=<`, `=`,
70
+ % `>=` or `>`), e.g., `=<('9.1')`. Versions are considered to compare
71
+ % equal only on the components of the Required version. I.e., `'9.1'`
72
+ % compares equal to `'9.1.2'`.
73
+ %
74
+ % Version expressions can be constructed from the Prolog operators
75
+ % ','/2, ';'/2 and '\+'/1. An example of a complicated expression is
76
+ % below, which demands major version 9, but considers 9.1.2 not
77
+ % suitable.
78
+ %
79
+ % (>=('9'), \+(=('9.1.2')))
80
+ %
81
+ % Features is a list of required or preferred features. Individual
82
+ % features are:
83
+ %
84
+ % - warning(Feature)
85
+ % Only print a warning instead of throwing an error.
86
+ % - library(Lib)
87
+ % Demand library(Lib) to be present. Thde library not being
88
+ % there may indicate an incomplete installation. For example
89
+ % library(pce) to demand xpce graphics support.
90
+ % - Flag
91
+ % Demand current_prolog_flag(Flag, true) to be true.
92
+ % - FlagValue
93
+ % If FlagValue is Flag(Value), demand current_prolog_flag(Flag,
94
+ % Value) to be true.
95
+ %
96
+ % @error version_error('SWI-Prolog', PrologVersion, Cmp, Required)
97
+ % @error existence_error(prolog_feature, Feature)
98
+
99
+ require_prolog_version(Required, Features) :-
100
+ require_prolog_version(Required),
101
+ maplist(check_feature, Features).
102
+
103
+ require_prolog_version(Required) :-
104
+ prolog_version(Available),
105
+ require_version('SWI-Prolog', Available, Required).
106
+
107
+ prolog_version(Version) :-
108
+ current_prolog_flag(version_git, Version),
109
+ !.
110
+ prolog_version(Version) :-
111
+ current_prolog_flag(version_data, swi(Major, Minor, Patch, _)),
112
+ VNumbers = [Major, Minor, Patch],
113
+ atomic_list_concat(VNumbers, '.', Version).
114
+
115
+ %! require_version(+Component, +Available, +CmpRequired) is det.
116
+ %
117
+ % Require Component to have version CmpRequired, while Component is
118
+ % know to have version Available.
119
+ %
120
+ % @error version_error(Component, Required, Cmp, Available)
121
+
122
+ require_version(Component, Available, CmpRequired) :-
123
+ parse_version(Available, AvlNumbers, AvlGit),
124
+ ( require_version_(AvlNumbers, AvlGit, CmpRequired)
125
+ -> true
126
+ ; throw(error(version_error(Component, Available, CmpRequired), _))
127
+ ).
128
+
129
+ require_version_(AvlNumbers, AvlGit, (V1;V2)) =>
130
+ ( require_version_(AvlNumbers, AvlGit, V1)
131
+ -> true
132
+ ; require_version_(AvlNumbers, AvlGit, V2)
133
+ ).
134
+ require_version_(AvlNumbers, AvlGit, (V1,V2)) =>
135
+ ( require_version_(AvlNumbers, AvlGit, V1)
136
+ ; require_version_(AvlNumbers, AvlGit, V2)
137
+ ).
138
+ require_version_(AvlNumbers, AvlGit, \+V1) =>
139
+ \+ require_version_(AvlNumbers, AvlGit, V1).
140
+ require_version_(AvlNumbers, AvlGit, Required) =>
141
+ parse_version(Required, ReqNumbers, ReqGit, Cmp, _),
142
+ cmp_versions(Cmp, AvlNumbers, AvlGit, ReqNumbers, ReqGit).
143
+
144
+ %! cmp_versions(?Cmp, +V1, +V2) is semidet.
145
+ %
146
+ % Compare to versions. Cmp is one of `<`, `=<`, `=`, `>=` or `>`. If
147
+ % Cmp is unbound we check whether `<` or `>` hold or else bind Cmp to
148
+ % `=`.
149
+ %
150
+ % When comparing for equality (`=`), the versions are considered equal
151
+ % if they compare equal up to the detail level of the least specified.
152
+ % E.g, '9.1.2' is considered equal to '9.1'.
153
+
154
+ cmp_versions(Cmp, V1, V2) :-
155
+ parse_version(V1, V1_Numbers, V1_Git),
156
+ parse_version(V2, V2_Numbers, V2_Git),
157
+ ( nonvar(Cmp)
158
+ -> cmp_versions(Cmp, V1_Numbers, V1_Git, V2_Numbers, V2_Git)
159
+ ; cmp_versions(<, V1_Numbers, V1_Git, V2_Numbers, V2_Git)
160
+ -> Cmp = (<)
161
+ ; cmp_versions(>, V1_Numbers, V1_Git, V2_Numbers, V2_Git)
162
+ -> Cmp = (<)
163
+ ; Cmp = (=)
164
+ ).
165
+
166
+ cmp_versions(=<, V1_Numbers, V1_Git, V2_Numbers, V2_Git) =>
167
+ ( cmp_versions(<, V1_Numbers, V1_Git, V2_Numbers, V2_Git)
168
+ -> true
169
+ ; cmp_versions(=, V1_Numbers, V1_Git, V2_Numbers, V2_Git)
170
+ ).
171
+ cmp_versions(>=, V1_Numbers, V1_Git, V2_Numbers, V2_Git) =>
172
+ ( cmp_versions(>, V1_Numbers, V1_Git, V2_Numbers, V2_Git)
173
+ -> true
174
+ ; cmp_versions(=, V1_Numbers, V1_Git, V2_Numbers, V2_Git)
175
+ ).
176
+ cmp_versions(<, V1_Numbers, V1_Git, V2_Numbers, V2_Git) =>
177
+ ( cmp_num_version(<, V1_Numbers, V2_Numbers)
178
+ -> true
179
+ ; V1_Numbers == V2_Numbers,
180
+ cmp_git_version(<, V1_Git, V2_Git)
181
+ ).
182
+ cmp_versions(>, V1_Numbers, V1_Git, V2_Numbers, V2_Git) =>
183
+ ( cmp_num_version(>, V1_Numbers, V2_Numbers)
184
+ -> true
185
+ ; V1_Numbers == V2_Numbers,
186
+ cmp_git_version(>, V1_Git, V2_Git)
187
+ ).
188
+ cmp_versions(=, V1_Numbers, V1_Git, V2_Numbers, V2_Git) =>
189
+ cmp_num_version(=, V1_Numbers, V2_Numbers),
190
+ cmp_git_version(=, V1_Git, V2_Git).
191
+
192
+ cmp_num_version(Cmp, V1_Numbers, V2_Numbers) :-
193
+ shortest(V1_Numbers, V2_Numbers, V1, V2),
194
+ compare(Cmp, V1, V2).
195
+
196
+ shortest([H1|T1], [H2|T2], [H1|R1], [H2|R2]) :-
197
+ !,
198
+ shortest(T1, T2, R1, R2).
199
+ shortest(_,_, [], []).
200
+
201
+
202
+ cmp_git_version(<, -, -) => fail.
203
+ cmp_git_version(>, -, -) => fail.
204
+ cmp_git_version(=, -, -) => true.
205
+ cmp_git_version(<, _, -) => true.
206
+ cmp_git_version(>, -, _) => true.
207
+ cmp_git_version(=, -, _) => true.
208
+ cmp_git_version(=, _, -) => true.
209
+ cmp_git_version(=, git(V,-), git(V,_)) => true.
210
+ cmp_git_version(=, git(V,_), git(V,-)) => true.
211
+ cmp_git_version(<, git(V1, _V1_Hash), git(V2, _V2_Hash)) =>
212
+ V1 < V2.
213
+ cmp_git_version(>, git(V1, _V1_Hash), git(V2, _V2_Hash)) =>
214
+ V1 > V2.
215
+ cmp_git_version(=, V1, V2) => V1 == V2.
216
+
217
+ %! parse_version(+Spec, -Version:list(integer), -GIT, -Cmp, -Plain) is det.
218
+
219
+ parse_version(Spec, VNumbers, GitVersion, Cmp, VString) :-
220
+ spec_cmp_version(Spec, Cmp, VString),
221
+ parse_version(VString, VNumbers, GitVersion).
222
+
223
+ spec_cmp_version(Spec, Cmp, Version),
224
+ compound(Spec), compound_name_arity(Spec, Cmp, 1) =>
225
+ ( is_cmp(Cmp)
226
+ -> true
227
+ ; domain_error(comparison_operator, Cmp)
228
+ ),
229
+ arg(1, Spec, Version).
230
+ spec_cmp_version(Spec, Cmp, Version), atom(Spec) =>
231
+ Cmp = (>=),
232
+ Version = Spec.
233
+ spec_cmp_version(Spec, Cmp, Version), string(Spec) =>
234
+ Cmp = (>=),
235
+ atom_string(Version, Spec).
236
+ spec_cmp_version(Spec, _Cmp, _Version) =>
237
+ type_error(version, Spec).
238
+
239
+ is_cmp(=<).
240
+ is_cmp(<).
241
+ is_cmp(>=).
242
+ is_cmp(>).
243
+ is_cmp(=).
244
+ is_cmp(>=).
245
+
246
+ parse_version(String, VNumbers, VGit) :-
247
+ ( parse_version_(String, VNumbers, VGit)
248
+ -> true
249
+ ; domain_error(version_string, String)
250
+ ).
251
+
252
+ parse_version_(String, VNumbers, git(GitRev, GitHash)) :-
253
+ split_string(String, "-", "", [NumberS,GitRevS|Hash]),
254
+ !,
255
+ split_string(NumberS, ".", "", List),
256
+ maplist(number_string, VNumbers, List),
257
+ ( GitRevS == "DIRTY"
258
+ -> GitRev = 0,
259
+ GitHash = 'DIRTY'
260
+ ; number_string(GitRev, GitRevS),
261
+ ( Hash = [HashS]
262
+ -> atom_string(GitHash, HashS)
263
+ ; GitHash = '-'
264
+ )
265
+ ).
266
+ parse_version_(String, VNumbers, -) :-
267
+ split_string(String, ".", "", List),
268
+ maplist(number_string, VNumbers, List).
269
+
270
+ %! check_feature(+Feature) is det.
271
+ %
272
+ % Verify that the running Prolog process has a certain feature.
273
+
274
+ check_feature(warning(Flag)) :-
275
+ !,
276
+ ( has_feature(Flag)
277
+ -> true
278
+ ; print_message(
279
+ warning,
280
+ error(existence_error(prolog_feature, warning(Flag)), _))
281
+ ).
282
+ check_feature(Flag) :-
283
+ has_feature(Flag),
284
+ !.
285
+ check_feature(Flag) :-
286
+ existence_error(prolog_feature, Flag).
287
+
288
+ has_feature(rational) =>
289
+ current_prolog_flag(bounded, false).
290
+ has_feature(library(Lib)) =>
291
+ exists_source(library(Lib)).
292
+ has_feature(Flag), atom(Flag) =>
293
+ current_prolog_flag(Flag, true).
294
+ has_feature(Flag), Flag =.. [Name|Arg] =>
295
+ current_prolog_flag(Name, Arg).
296
+
297
+ /*******************************
298
+ * MESSAGES *
299
+ *******************************/
300
+
301
+ :- multifile
302
+ prolog:error_message//1.
303
+
304
+ prolog:error_message(version_error(Component, Found, Required)) -->
305
+ { current_prolog_flag(executable, Exe) },
306
+ [ 'Application requires ~w '-[Component] ], req_msg(Required),
307
+ [ ',', nl, ' ',
308
+ ansi(code, '~w', [Exe]), ' has version ',
309
+ ansi(code, '~w', [Found])
310
+ ].
311
+ prolog:error_message(existence_error(prolog_feature, Feature)) -->
312
+ missing_feature(Feature).
313
+
314
+ req_msg((A,B)) --> req_msg(A), [' and '], req_msg(B).
315
+ req_msg((A;B)) --> req_msg(A), [' or '], req_msg(B).
316
+ req_msg(\+(A)) --> ['not '], req_msg(A).
317
+ req_msg(V) --> { spec_cmp_version(V, Cmp, Version) }, !, cmp_msg(Cmp), [' '],
318
+ [ ansi(code, '~w', [Version]) ].
319
+
320
+ cmp_msg(<) --> ['before'].
321
+ cmp_msg(=<) --> ['at most'].
322
+ cmp_msg(=) --> ['exactly'].
323
+ cmp_msg(>=) --> ['at least'].
324
+ cmp_msg(>) --> ['after'].
325
+
326
+ missing_feature(warning(Feature)) -->
327
+ [ 'This version of SWI-Prolog does not optimally support your \c
328
+ application because',
329
+ nl, ' '
330
+ ],
331
+ missing_feature_(Feature).
332
+ missing_feature(warning(Feature)) -->
333
+ [ 'This version of SWI-Prolog cannot run your application because',
334
+ nl, ' '
335
+ ],
336
+ missing_feature_(Feature).
337
+
338
+ missing_feature_(threads) -->
339
+ [ 'multi-threading is not available' ].
340
+ missing_feature_(rational) -->
341
+ [ 'it has no support for rational numbers' ].
342
+ missing_feature_(bounded(false)) -->
343
+ [ 'it has no support for unbounded arithmetic' ].
344
+ missing_feature_(library(Lib)) -->
345
+ [ 'it does not provide library(~q)'-[Lib] ].
346
+ missing_feature_(Feature) -->
347
+ [ 'it does not support ~p'-[Feature] ].