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,333 @@
1
+ /* Part of SWI-Prolog
2
+
3
+ Author: Jan Wielemaker
4
+ E-mail: J.Wielemaker@vu.nl
5
+ WWW: http://www.swi-prolog.org
6
+ Copyright (c) 2017-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(prolog_jiti,
38
+ [ jiti_list/0,
39
+ jiti_list/1, % +Spec
40
+ jiti_suggest_modes/1, % :Spec
41
+ jiti_suggest_modes/0
42
+ ]).
43
+ :- autoload(library(apply), [maplist/2, foldl/4, convlist/3]).
44
+ :- autoload(library(dcg/basics), [number//1]).
45
+ :- autoload(library(ansi_term), [ansi_format/3, ansi_hyperlink/3]).
46
+ :- autoload(library(prolog_code), [pi_head/2, most_general_goal/2]).
47
+ :- autoload(library(listing), [portray_clause/1]).
48
+ :- autoload(library(lists), [append/2]).
49
+ :- autoload(library(ordsets), [ord_subtract/3]).
50
+
51
+
52
+ :- meta_predicate
53
+ jiti_list(:),
54
+ jiti_suggest_modes(:).
55
+
56
+ /** <module> Just In Time Indexing (JITI) utilities
57
+
58
+ This module provides utilities to examine just-in-time indexes created
59
+ by the system and can help diagnosing space and performance issues.
60
+
61
+ @tbd Use print_message/2 and dynamically figure out the column width.
62
+ */
63
+
64
+
65
+ %! jiti_list is det.
66
+ %! jiti_list(:Spec) is det.
67
+ %
68
+ % List the JITI (Just In Time Indexes) of selected predicates. The
69
+ % predicate jiti_list/0 list all just-in-time indexed predicates. The
70
+ % predicate jiti_list/1 takes one of the patterns below. All parts
71
+ % except for Name can be variables. The last pattern takes an
72
+ % arbitrary number of arguments.
73
+ %
74
+ % - Module:Head
75
+ % - Module:Name/Arity
76
+ % - Module:Name
77
+ %
78
+ % The columns use the following notation:
79
+ %
80
+ % - The _Indexed_ column describes the argument(s) indexed:
81
+ % - A plain integer refers to a 1-based argument number
82
+ % - ``A+B`` is a multi-argument index on the arguments `A` and `B`.
83
+ % - ``P:L`` is a deep-index `L` on sub-argument `P`. For example,
84
+ % ``1/2:2+3`` is an index of the 2nd and 3rd argument of the
85
+ % 2nd argument of a compound on the first argument of the predicate.
86
+ % This implies `x` and `y` in the head p(f(_,g(_,x,y)))
87
+ % - The `Buckets` specifies the number of buckets of the hash table
88
+ % - The `Speedup` specifies the selectivity of the index
89
+ % - The `Flags` describes additional properties, currently:
90
+ % - ``L`` denotes that the index contains multiple compound
91
+ % terms with the same name/arity that may be used to create
92
+ % deep indexes. The deep indexes themselves are created
93
+ % as just-in-time indexes.
94
+ % - ``V`` denotes the index is _virtual_, i.e., it has not yet
95
+ % been materialized.
96
+
97
+ jiti_list :-
98
+ jiti_list(_:_).
99
+
100
+ jiti_list(Spec) :-
101
+ spec_head(Spec, Head),
102
+ !,
103
+ jiti_list(Head).
104
+ jiti_list(Head) :-
105
+ tty_width(TTYW),
106
+ findall(PI-Indexed,
107
+ ( predicate_property(Head, indexed(Indexed)),
108
+ \+ predicate_property(Head, imported_from(_)),
109
+ pi_head(PI, Head)
110
+ ), Pairs0),
111
+ sort(Pairs0, Pairs),
112
+ PredColW is TTYW-47,
113
+ TableWidth is TTYW-1,
114
+ ansi_format(bold, 'Predicate~*|~w ~t~10+~w ~t~w~14+ ~t~w~9+ ~t~w~6+ ~t~w~6+~n',
115
+ [PredColW, '#Clauses', 'Index','Buckets','Speedup','Coll','Flags']),
116
+ format('~`\u2015t~*|~n', [TableWidth]),
117
+ maplist(print_indexes(PredColW), Pairs).
118
+
119
+ print_indexes(PredColW, PI-List) :-
120
+ foldl(print_index(PredColW, PI), List, 1, _).
121
+
122
+ :- det(print_index/5).
123
+ print_index(PredColW, PI0, Dict, N, N1) :-
124
+ pi_head(PI0, Head),
125
+ head_pi(Head, PI), % Create DCG PI
126
+ N1 is N+1,
127
+ _{arguments:Args, position:Pos,
128
+ buckets:Buckets, speedup:Speedup, list:List, realised:R,
129
+ collisions:Collisions0} :< Dict,
130
+ predicate_property(Head, number_of_clauses(CCount)),
131
+ phrase(iarg_spec(Pos, Args), ArgsS),
132
+ phrase(iflags(List, R), Flags),
133
+ istyle(R, Style),
134
+ icoll(R, List, Collisions0, Collisions),
135
+ CCountColZ is PredColW+8,
136
+ ( N == 1
137
+ -> format_pi(PI),
138
+ format(' ~t~D~*| ', [CCount, CCountColZ])
139
+ ; format(' ~t~*| ', [CCountColZ])
140
+ ),
141
+ ansi_format(Style, '~|~s ~t~D~14+ ~t~1f~9+ ~t~w~6+ ~s~n',
142
+ [ArgsS,Buckets,Speedup,Collisions,Flags]).
143
+
144
+ format_pi(PI) :-
145
+ pi_head(PI, Head),
146
+ predicate_property(Head, file(File)),
147
+ predicate_property(Head, line_count(Line)),
148
+ !,
149
+ format(string(Label), '~q', [PI]),
150
+ ansi_hyperlink(user_output, File:Line, Label).
151
+ format_pi(PI) :-
152
+ format('~q', [PI]).
153
+
154
+ %! iarg_spec(+Position, +Args)//
155
+
156
+ iarg_spec([], [N]) ==>
157
+ number(N).
158
+ iarg_spec([], List) ==>
159
+ plus_list(List).
160
+ iarg_spec(Deep, Args) ==>
161
+ deep_list(Deep),
162
+ iarg_spec([], Args).
163
+
164
+ plus_list([H|T]) -->
165
+ number(H),
166
+ ( {T==[]}
167
+ -> []
168
+ ; "+",
169
+ plus_list(T)
170
+ ).
171
+
172
+ deep_list([Last]) -->
173
+ !,
174
+ number(Last),
175
+ ":".
176
+ deep_list([H|T]) -->
177
+ number(H),
178
+ "/",
179
+ deep_list(T).
180
+
181
+
182
+ iflags(true, R) ==> "L", irealised(R).
183
+ iflags(false, R) ==> "", irealised(R).
184
+
185
+ irealised(false) ==> "V".
186
+ irealised(true) ==> "".
187
+
188
+ istyle(true, code).
189
+ istyle(false, comment).
190
+
191
+ icoll(true, false, Collisions0, Collisions) =>
192
+ Collisions = Collisions0.
193
+ icoll(_, _, _, Collisions) =>
194
+ Collisions = '-'.
195
+
196
+ head_pi(Head, PI) :-
197
+ predicate_property(Head, non_terminal),
198
+ !,
199
+ pi_head(PI0, Head),
200
+ dcg_pi(PI0, PI).
201
+ head_pi(Head, PI) :-
202
+ pi_head(PI, Head).
203
+
204
+ dcg_pi(M:Name/Arity, DCG) =>
205
+ Arity2 is Arity-2,
206
+ DCG = M:Name//Arity2.
207
+ dcg_pi(Name/Arity, DCG) =>
208
+ Arity2 is Arity-2,
209
+ DCG = Name//Arity2.
210
+
211
+
212
+ /*******************************
213
+ * MODES *
214
+ *******************************/
215
+
216
+ %! jiti_suggest_modes is det.
217
+ %! jiti_suggest_modes(:Spec) is det.
218
+ %
219
+ % Propose modes for the predicates referenced by Spec. This utility
220
+ % may be executed _after_ a clean load of your program and after
221
+ % running the program. It searches for static predicates that have
222
+ % been called and (thus) have been examined for candidate indexes. If
223
+ % candidate indexes have not been materialized this implies that the
224
+ % predicate was never called with a nonvar value for the corresponding
225
+ % argument. Adding a mode/1 declaration may be used to inform the
226
+ % system thereof. The system will never examine arguments for indexing
227
+ % that have been declared as mode `-`.
228
+ %
229
+ % __Note:__ This predicate merely detects that some predicate is never
230
+ % called with instantiated specific arguments __during this run__. The
231
+ % user should verify whether the suggested `-` arguments are correct
232
+ % and typically complete the mode by changing `?` into `+` (or `-`)
233
+ % where applicable. Currently, in SWI-Prolog, mode/1 declarations have
234
+ % no effect on the semantics of the code. In particular, a predicate
235
+ % that declares some argument as `-` may be called with this argument
236
+ % instantiated. This may change in the future.
237
+ %
238
+ % @arg Spec uses the same conventions as jiti_list/1.
239
+
240
+ jiti_suggest_modes :-
241
+ jiti_suggest_modes(_:_).
242
+
243
+ jiti_suggest_modes(Partial) :-
244
+ spec_head(Partial, Head),
245
+ !,
246
+ jiti_suggest_modes(Head).
247
+ jiti_suggest_modes(Head) :-
248
+ Head = M:_,
249
+ freeze(M, module_property(M, class(user))),
250
+ findall(Head-Indexed,
251
+ ( predicate_property(Head, indexed(Indexed)),
252
+ \+ predicate_property(Head, imported_from(_))
253
+ ), Pairs),
254
+ convlist(suggest_mode, Pairs, Modes),
255
+ ( Modes == []
256
+ -> print_message(informational, jiti(no_modes(Head)))
257
+ ; maplist(portray_clause, Modes)
258
+ ).
259
+
260
+ suggest_mode((M:Head)-Indexes, (:- mode(M:GenHead))) :-
261
+ convlist(not_realised_index_arg, Indexes, FArgs),
262
+ convlist(realised_index_arg, Indexes, ArgsL),
263
+ append(ArgsL, Realised),
264
+ sort(FArgs, Sargs),
265
+ sort(Realised, RArgs),
266
+ ord_subtract(Sargs, RArgs, Args),
267
+ Args \== [],
268
+ !,
269
+ most_general_goal(Head, GenHead),
270
+ make_mode(Args, GenHead).
271
+
272
+ not_realised_index_arg(Index, Arg) :-
273
+ _{ arguments:[Arg], position:[], realised:false } :< Index.
274
+
275
+ realised_index_arg(Index, Args) :-
276
+ _{ arguments:Args, position:[], realised:true } :< Index.
277
+
278
+ make_mode([], GenHead) =>
279
+ functor(GenHead, _, Arity),
280
+ set_any(1, Arity, GenHead).
281
+ make_mode([H|T], GenHead) =>
282
+ arg(H, GenHead, -),
283
+ make_mode(T, GenHead).
284
+
285
+ set_any(I, Arity, GenHead), arg(I, GenHead, Var) =>
286
+ ( var(Var)
287
+ -> Var = '?'
288
+ ; true
289
+ ),
290
+ I2 is I+1,
291
+ set_any(I2, Arity, GenHead).
292
+ set_any(_, _, _) =>
293
+ true.
294
+
295
+
296
+ /*******************************
297
+ * SPECIFY PREDICATES *
298
+ *******************************/
299
+
300
+ spec_head(Module:Name/Arity, Head), atom(Name), integer(Arity) =>
301
+ Head = Module:Head0,
302
+ functor(Head0, Name, Arity).
303
+ spec_head(Module:Name/Arity, Head), atom(Name), var(Arity) =>
304
+ Head = Module:Head0,
305
+ freeze(Head0, functor(Head0, Name, _)).
306
+ spec_head(Module:Name, Head), atom(Name) =>
307
+ Head = Module:Head0,
308
+ freeze(Head0, functor(Head0, Name, _)).
309
+ spec_head(_, _) =>
310
+ fail.
311
+
312
+ /*******************************
313
+ * OUTPUT *
314
+ *******************************/
315
+
316
+ tty_width(W) :-
317
+ catch(tty_size(_, TtyW), _, fail),
318
+ !,
319
+ W is max(65, TtyW).
320
+ tty_width(80).
321
+
322
+ /*******************************
323
+ * MESSAGES *
324
+ *******************************/
325
+
326
+ :- multifile prolog:message//1.
327
+
328
+ prolog:message(jiti(no_modes(M:Head))) -->
329
+ { var(Head) },
330
+ [ 'No mode suggestions for predicates in module ~p'-[M] ].
331
+ prolog:message(jiti(no_modes(Head))) -->
332
+ { numbervars(Head, 0, _, [singletons(true)]) },
333
+ [ 'No mode suggestions for ~p'-[Head] ].
@@ -0,0 +1,61 @@
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) 2024, 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_locale,
36
+ [ setup_prolog_integer_grouping/0
37
+ ]).
38
+
39
+ /** <module> Tweak the locale for Prolog development
40
+ */
41
+
42
+ %! setup_prolog_integer_grouping is det.
43
+ %
44
+ % This sets up the Prolog toplevel and debugger to write numbers with
45
+ % grouping. I.e., after running setup_prolog_integer_grouping/0, we
46
+ % get:
47
+ %
48
+ % ```
49
+ % ?- A is 1<<100.
50
+ % A = 1_267_650_600_228_229_401_496_703_205_376.
51
+ % ```
52
+
53
+ setup_prolog_integer_grouping :-
54
+ add_write_option(answer_write_options, integer_format('~:D')),
55
+ add_write_option(debugger_write_options, integer_format('~:D')),
56
+ add_write_option(print_write_options, integer_format('~:D')).
57
+
58
+ add_write_option(Set, Option),
59
+ current_prolog_flag(Set, List) =>
60
+ set_prolog_flag(Set, [Option|List]).
61
+
@@ -0,0 +1,307 @@
1
+ /* Part of SWI-Prolog
2
+
3
+ Author: Eva Stoewe, Guenter Kniesel and Jan Wielemaker
4
+ E-mail: pdt@lists.iai.uni-bonn.de
5
+ WWW: http://sewiki.iai.uni-bonn.de/research/pdt/start
6
+ Copyright (c) 2004-2012, CS Dept. III, University of Bonn
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_metainference,
36
+ [ infer_meta_predicate/2, % :Head, -MetaSpec
37
+ inferred_meta_predicate/2 % :Head, ?MetaSpec
38
+ ]).
39
+ :- autoload(library(apply),[maplist/4]).
40
+ :- autoload(library(lists),[append/3]).
41
+
42
+
43
+ :- meta_predicate
44
+ inferred_meta_predicate(:, ?),
45
+ infer_meta_predicate(:, -).
46
+
47
+ :- dynamic
48
+ inferred_meta_pred/3. % Head, Module, Meta
49
+
50
+ /** <module> Infer meta-predicate properties
51
+
52
+ This module infers meta-predicate properties by inspecting the clauses
53
+ of predicates that call other predicates. This is extremely useful for
54
+ program analysis and refactoring because many programs `in the wild'
55
+ have incomplete or incorrect meta-predicate information.
56
+
57
+ @see This library is used by prolog_walk_code/1 to improve the
58
+ accuracy of this analysis.
59
+ @tbd Re-introduce some alias-analysis
60
+ @tbd Not all missing meta-declarations are interesting. Notably,
61
+ meta-predicates that are private and only pass meta-arguments
62
+ on behalve of a public meta-predicates do not need a declaration.
63
+ */
64
+
65
+
66
+ %! inferred_meta_predicate(:Head, ?MetaSpec) is nondet.
67
+ %
68
+ % True when MetaSpec is an inferred meta-predicate specification
69
+ % for Head.
70
+
71
+ inferred_meta_predicate(M:Head, MetaSpec) :-
72
+ inferred_meta_pred(Head, M, MetaSpec).
73
+ inferred_meta_predicate(M:Head, MetaSpec) :-
74
+ predicate_property(M:Head, imported_from(From)),
75
+ inferred_meta_pred(Head, From, MetaSpec).
76
+
77
+
78
+ %! infer_meta_predicate(:Head, -MetaSpec) is semidet
79
+ %
80
+ % True when MetaSpec is a meta-predicate specifier for the
81
+ % predicate Head. Derived meta-predicates are collected and made
82
+ % available through inferred_meta_predicate/2.
83
+
84
+ infer_meta_predicate(Head, MetaSpec) :-
85
+ inferred_meta_predicate(Head, MetaSpec),
86
+ !.
87
+ infer_meta_predicate(M:Head, MetaSpec) :-
88
+ predicate_property(M:Head, imported_from(From)),
89
+ !,
90
+ do_infer_meta_predicate(From:Head, MetaSpec),
91
+ assertz(inferred_meta_pred(Head, From, MetaSpec)).
92
+ infer_meta_predicate(M:Head, MetaSpec) :-
93
+ do_infer_meta_predicate(M:Head, MetaSpec),
94
+ assertz(inferred_meta_pred(Head, M, MetaSpec)).
95
+
96
+ :- meta_predicate
97
+ do_infer_meta_predicate(:, -).
98
+
99
+ do_infer_meta_predicate(Module:AHead, MetaSpec):-
100
+ functor(AHead, Functor, Arity),
101
+ functor(Head, Functor, Arity), % Generalise the head
102
+ findall(MetaSpec,
103
+ meta_pred_args_in_clause(Module, Head, MetaSpec),
104
+ MetaSpecs),
105
+ MetaSpecs \== [],
106
+ combine_meta_args(MetaSpecs, MetaSpec).
107
+
108
+
109
+ %! meta_pred_args_in_clause(+Module, +Head, -MetaSpec) is nondet.
110
+
111
+ meta_pred_args_in_clause(Module, Head, MetaArgs) :-
112
+ clause(Module:Head, Body),
113
+ annotate_meta_vars_in_body(Body, Module),
114
+ meta_annotation(Head, MetaArgs).
115
+
116
+
117
+ %! annotate_meta_vars_in_body(+Term, +Module) is det
118
+ %
119
+ % Annotate variables in Term if they appear as meta-arguments.
120
+ %
121
+ % @tbd Aliasing. Previous code detected aliasing for
122
+ % - =/2
123
+ % - functor/3
124
+ % - atom_concat/3
125
+ % - =../2
126
+ % - arg/3
127
+ % @tbd We can make this nondet, exploring multiple aliasing
128
+ % paths in disjunctions.
129
+
130
+ annotate_meta_vars_in_body(A, _) :-
131
+ atomic(A),
132
+ !.
133
+ annotate_meta_vars_in_body(Var, _) :-
134
+ var(Var),
135
+ !,
136
+ annotate(Var, 0).
137
+ annotate_meta_vars_in_body(Module:Term, _) :-
138
+ !,
139
+ ( atom(Module)
140
+ -> annotate_meta_vars_in_body(Term, Module)
141
+ ; var(Module)
142
+ -> annotate(Module, m)
143
+ ; true % may continue if Term is a system
144
+ ). % predicate?
145
+ annotate_meta_vars_in_body((TermA, TermB), Module) :-
146
+ !,
147
+ annotate_meta_vars_in_body(TermB, Module),
148
+ annotate_meta_vars_in_body(TermA, Module).
149
+ annotate_meta_vars_in_body((TermA; TermB), Module) :-
150
+ !,
151
+ annotate_meta_vars_in_body(TermB, Module),
152
+ annotate_meta_vars_in_body(TermA, Module).
153
+ annotate_meta_vars_in_body((TermA->TermB), Module) :-
154
+ !,
155
+ annotate_meta_vars_in_body(TermB, Module),
156
+ annotate_meta_vars_in_body(TermA, Module).
157
+ annotate_meta_vars_in_body((TermA*->TermB), Module) :-
158
+ !,
159
+ annotate_meta_vars_in_body(TermB, Module),
160
+ annotate_meta_vars_in_body(TermA, Module).
161
+ annotate_meta_vars_in_body(A=B, _) :-
162
+ var(A), var(B),
163
+ !,
164
+ A = B.
165
+ annotate_meta_vars_in_body(Goal, Module) :- % TBD: do we trust this?
166
+ predicate_property(Module:Goal, meta_predicate(Head)),
167
+ !,
168
+ functor(Goal, _, Arity),
169
+ annotate_meta_args(1, Arity, Goal, Head, Module).
170
+ annotate_meta_vars_in_body(Goal, Module) :-
171
+ inferred_meta_predicate(Module:Goal, Head),
172
+ !,
173
+ functor(Goal, _, Arity),
174
+ annotate_meta_args(1, Arity, Goal, Head, Module).
175
+ annotate_meta_vars_in_body(_, _).
176
+
177
+
178
+ %! annotate_meta_args(+Arg, +Arity, +Goal, +MetaSpec, +Module)
179
+
180
+ annotate_meta_args(I, Arity, Goal, MetaSpec, Module) :-
181
+ I =< Arity,
182
+ !,
183
+ arg(I, MetaSpec, MetaArg),
184
+ arg(I, Goal, Arg),
185
+ annotate_meta_arg(MetaArg, Arg, Module),
186
+ I2 is I + 1,
187
+ annotate_meta_args(I2, Arity, Goal, MetaSpec, Module).
188
+ annotate_meta_args(_, _, _, _, _).
189
+
190
+ annotate_meta_arg(Spec, Arg, _) :-
191
+ var(Arg),
192
+ !,
193
+ annotate(Arg, Spec).
194
+ annotate_meta_arg(0, Arg, Module) :-
195
+ !,
196
+ annotate_meta_vars_in_body(Arg, Module).
197
+ annotate_meta_arg(N, Arg, Module) :-
198
+ integer(N),
199
+ callable(Arg),
200
+ !,
201
+ Arg =.. List,
202
+ length(Extra, N),
203
+ append(List, Extra, ListX),
204
+ ArgX =.. ListX,
205
+ annotate_meta_vars_in_body(ArgX, Module).
206
+ annotate_meta_arg(Spec, Arg, _) :-
207
+ is_meta(Spec),
208
+ compound(Arg),
209
+ Arg = Module:_,
210
+ var(Module),
211
+ !,
212
+ annotate(Module, m).
213
+ annotate_meta_arg(_,_,_).
214
+
215
+ annotate(Var, Annotation) :-
216
+ get_attr(Var, prolog_metainference, Annot0),
217
+ !,
218
+ join_annotation(Annot0, Annotation, Joined),
219
+ put_attr(Var, prolog_metainference, Joined).
220
+ annotate(Var, Annotation) :-
221
+ put_attr(Var, prolog_metainference, Annotation).
222
+
223
+ join_annotation(A, A, A) :- !.
224
+ join_annotation(A, B, C) :-
225
+ ( is_meta(A), \+ is_meta(B)
226
+ -> C = A
227
+ ; \+ is_meta(A), is_meta(B)
228
+ -> C = B
229
+ ; is_meta(A), is_meta(B)
230
+ -> C = (:)
231
+ ; C = *
232
+ ).
233
+
234
+ attr_unify_hook(A0, Other) :-
235
+ get_attr(Other, prolog_metainference, A1),
236
+ !,
237
+ join_annotation(A0, A1, A),
238
+ put_attr(Other, prolog_metainference, A).
239
+
240
+
241
+ %! meta_annotation(+Head, -Annotation) is semidet.
242
+ %
243
+ % True when Annotation is an appropriate meta-specification for
244
+ % Head.
245
+
246
+ meta_annotation(Head, Meta) :-
247
+ functor(Head, Name, Arity),
248
+ functor(Meta, Name, Arity),
249
+ meta_args(1, Arity, Head, Meta, HasMeta),
250
+ HasMeta == true.
251
+
252
+ meta_args(I, Arity, Head, Meta, HasMeta) :-
253
+ I =< Arity,
254
+ !,
255
+ arg(I, Head, HeadArg),
256
+ arg(I, Meta, MetaArg),
257
+ meta_arg(HeadArg, MetaArg),
258
+ ( is_meta(MetaArg)
259
+ -> HasMeta = true
260
+ ; true
261
+ ),
262
+ I2 is I + 1,
263
+ meta_args(I2, Arity, Head, Meta, HasMeta).
264
+ meta_args(_, _, _, _, _).
265
+
266
+ is_meta(I) :- integer(I), !.
267
+ is_meta(:).
268
+ is_meta(^).
269
+ is_meta(//).
270
+
271
+ %! meta_arg(+AnnotatedArg, -MetaSpec) is det.
272
+ %
273
+ % True when MetaSpec is a proper annotation for the argument
274
+ % AnnotatedArg. This is simple if the argument is a plain argument
275
+ % in the head (first clause). If it is a compound term, it must
276
+ % unify to _:_, otherwise there is no point turning it into a meta
277
+ % argument. If the module part is then passed to a module
278
+ % sensitive predicate, we assume it is a meta-predicate.
279
+
280
+ meta_arg(HeadArg, MetaArg) :-
281
+ get_attr(HeadArg, prolog_metainference, MetaArg),
282
+ MetaArg \== m,
283
+ !.
284
+ meta_arg(HeadArg, :) :-
285
+ compound(HeadArg),
286
+ HeadArg = M:_,
287
+ get_attr(M, prolog_metainference, m),
288
+ !.
289
+ meta_arg(_, *).
290
+
291
+ %! combine_meta_args(+Heads, -Head) is det.
292
+ %
293
+ % Combine multiple meta-specifications.
294
+
295
+ combine_meta_args([], []) :- !.
296
+ combine_meta_args([List], List) :- !.
297
+ combine_meta_args([Spec,Spec|Specs], CombinedArgs) :-
298
+ !,
299
+ combine_meta_args([Spec|Specs], CombinedArgs).
300
+ combine_meta_args([Spec1,Spec2|Specs], CombinedArgs) :-
301
+ Spec1 =.. [Name|Args1],
302
+ Spec2 =.. [Name|Args2],
303
+ maplist(join_annotation, Args1, Args2, Args),
304
+ Spec =.. [Name|Args],
305
+ combine_meta_args([Spec|Specs], CombinedArgs).
306
+
307
+