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,1097 @@
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) 1985-2023, University of Amsterdam
7
+ VU University Amsterdam
8
+ CWI, Amsterdam
9
+ SWI-Prolog Solutions b.v.
10
+ All rights reserved.
11
+
12
+ Redistribution and use in source and binary forms, with or without
13
+ modification, are permitted provided that the following conditions
14
+ are met:
15
+
16
+ 1. Redistributions of source code must retain the above copyright
17
+ notice, this list of conditions and the following disclaimer.
18
+
19
+ 2. Redistributions in binary form must reproduce the above copyright
20
+ notice, this list of conditions and the following disclaimer in
21
+ the documentation and/or other materials provided with the
22
+ distribution.
23
+
24
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35
+ POSSIBILITY OF SUCH DAMAGE.
36
+ */
37
+
38
+ :- module(check,
39
+ [ check/0, % run all checks
40
+ list_undefined/0, % list undefined predicates
41
+ list_undefined/1, % +Options
42
+ list_autoload/0, % list predicates that need autoloading
43
+ list_redefined/0, % list redefinitions
44
+ list_cross_module_calls/0, % List Module:Goal usage
45
+ list_cross_module_calls/1, % +Options
46
+ list_void_declarations/0, % list declarations with no clauses
47
+ list_trivial_fails/0, % list goals that trivially fail
48
+ list_trivial_fails/1, % +Options
49
+ list_format_errors/0, % list calls to format with wrong args
50
+ list_format_errors/1, % +Options
51
+ list_strings/0, % list string objects in clauses
52
+ list_strings/1, % +Options
53
+ list_rationals/0, % list rational objects in clauses
54
+ list_rationals/1 % +Options
55
+ ]).
56
+ :- autoload(library(apply),[maplist/2]).
57
+ :- autoload(library(lists),[member/2,append/3]).
58
+ :- autoload(library(occurs),[sub_term/2]).
59
+ :- autoload(library(option),[merge_options/3,option/3]).
60
+ :- autoload(library(pairs),
61
+ [group_pairs_by_key/2,map_list_to_pairs/3,pairs_values/2]).
62
+ :- autoload(library(prolog_clause),
63
+ [clause_info/4,predicate_name/2,clause_name/2]).
64
+ :- autoload(library(prolog_code),[pi_head/2]).
65
+ :- autoload(library(prolog_codewalk),
66
+ [prolog_walk_code/1,prolog_program_clause/2]).
67
+ :- autoload(library(prolog_format),[format_types/2]).
68
+ :- autoload(library(predicate_options), [check_predicate_options/0]).
69
+
70
+ :- set_prolog_flag(generate_debug_info, false).
71
+
72
+ :- multifile
73
+ trivial_fail_goal/1,
74
+ string_predicate/1,
75
+ valid_string_goal/1,
76
+ checker/2.
77
+
78
+ :- dynamic checker/2.
79
+
80
+
81
+ /** <module> Consistency checking
82
+
83
+ This library provides some consistency checks for the loaded Prolog
84
+ program. The predicate make/0 runs list_undefined/0 to find undefined
85
+ predicates in `user' modules.
86
+
87
+ @see gxref/0 provides a graphical cross referencer
88
+ @see PceEmacs performs real time consistency checks while you edit
89
+ @see library(prolog_xref) implements `offline' cross-referencing
90
+ @see library(prolog_codewalk) implements `online' analysis
91
+ */
92
+
93
+ :- predicate_options(list_undefined/1, 1,
94
+ [ module_class(list(oneof([user,library,system])))
95
+ ]).
96
+
97
+ %! check is det.
98
+ %
99
+ % Run all consistency checks defined by checker/2. Checks enabled by
100
+ % default are:
101
+ %
102
+ % * list_undefined/0 reports undefined predicates
103
+ % * list_trivial_fails/0 reports calls for which there is no
104
+ % matching clause.
105
+ % * list_format_errors/0 reports mismatches in format/2,3
106
+ % templates and the list of arguments.
107
+ % * list_redefined/0 reports predicates that have a local
108
+ % definition and a global definition. Note that these are
109
+ % __not__ errors.
110
+ % * list_void_declarations/0 reports on predicates with defined
111
+ % properties, but no clauses.
112
+ % * list_autoload/0 lists predicates that will be defined at
113
+ % runtime using the autoloader.
114
+ % * check_predicate_options/0 tests for options passed to
115
+ % predicates such as open/4 that are unknown or are used
116
+ % with an invalid argument.
117
+ %
118
+ % The checker can be expanded or restricted by modifying the dynamic
119
+ % multifile hook checker/2.
120
+ %
121
+ % The checker may be used in batch, e.g., for CI workflows by calling
122
+ % SWI-Prolog as below. Note that by using ``-l`` to load the program,
123
+ % the program is not started if it used initialization/2 of type
124
+ % `main` to start the program.
125
+ %
126
+ %
127
+ % ```
128
+ % swipl -q --on-warning=status --on-error=status \
129
+ % -g check -t halt -l myprogram.pl
130
+ % ```
131
+
132
+ check :-
133
+ checker(Checker, Message),
134
+ print_message(informational,check(pass(Message))),
135
+ catch(Checker,E,print_message(error,E)),
136
+ fail.
137
+ check.
138
+
139
+ %! list_undefined is det.
140
+ %! list_undefined(+Options) is det.
141
+ %
142
+ % Report undefined predicates. This predicate finds undefined
143
+ % predicates by decompiling and analyzing the body of all clauses.
144
+ % Options:
145
+ %
146
+ % * module_class(+Classes)
147
+ % Process modules of the given Classes. The default for
148
+ % classes is =|[user]|=. For example, to include the
149
+ % libraries into the examination, use =|[user,library]|=.
150
+ %
151
+ % @see gxref/0 provides a graphical cross-referencer.
152
+ % @see make/0 calls list_undefined/0
153
+
154
+ :- thread_local
155
+ undef/2.
156
+
157
+ list_undefined :-
158
+ list_undefined([]).
159
+
160
+ list_undefined(Options) :-
161
+ merge_options(Options,
162
+ [ module_class([user])
163
+ ],
164
+ WalkOptions),
165
+ call_cleanup(
166
+ prolog_walk_code([ undefined(trace),
167
+ on_trace(found_undef)
168
+ | WalkOptions
169
+ ]),
170
+ collect_undef(Grouped)),
171
+ ( Grouped == []
172
+ -> true
173
+ ; print_message(warning, check(undefined_procedures, Grouped))
174
+ ).
175
+
176
+ % The following predicates are used from library(prolog_autoload).
177
+
178
+ :- public
179
+ found_undef/3,
180
+ collect_undef/1.
181
+
182
+ collect_undef(Grouped) :-
183
+ findall(PI-From, retract(undef(PI, From)), Pairs),
184
+ keysort(Pairs, Sorted),
185
+ group_pairs_by_key(Sorted, Grouped).
186
+
187
+ found_undef(To, _Caller, From) :-
188
+ goal_pi(To, PI),
189
+ ( undef(PI, From)
190
+ -> true
191
+ ; compiled(PI)
192
+ -> true
193
+ ; not_always_present(PI)
194
+ -> true
195
+ ; assertz(undef(PI,From))
196
+ ).
197
+
198
+ compiled(system:'$call_cleanup'/0). % compiled to VM instructions
199
+ compiled(system:'$catch'/0).
200
+ compiled(system:'$cut'/0).
201
+ compiled(system:'$reset'/0).
202
+ compiled(system:'$call_continuation'/1).
203
+ compiled(system:'$shift'/1).
204
+ compiled(system:'$shift_for_copy'/1).
205
+ compiled('$engines':'$yield'/0).
206
+
207
+ %! not_always_present(+PI) is semidet.
208
+ %
209
+ % True when some predicate is known to be part of the state but is not
210
+ % available in this version.
211
+
212
+ not_always_present(_:win_folder/2) :-
213
+ \+ current_prolog_flag(windows, true).
214
+ not_always_present(_:win_add_dll_directory/2) :-
215
+ \+ current_prolog_flag(windows, true).
216
+ not_always_present(_:opt_help/2).
217
+ not_always_present(_:opt_type/3).
218
+ not_always_present(_:opt_meta/2).
219
+
220
+ goal_pi(M:Head, M:Name/Arity) :-
221
+ functor(Head, Name, Arity).
222
+
223
+ %! list_autoload is det.
224
+ %
225
+ % Report predicates that may be auto-loaded. These are predicates
226
+ % that are not defined, but will be loaded on demand if
227
+ % referenced.
228
+ %
229
+ % @tbd This predicate uses an older mechanism for finding
230
+ % undefined predicates. Should be synchronized with
231
+ % list undefined.
232
+ % @see autoload/0
233
+
234
+ list_autoload :-
235
+ setup_call_cleanup(
236
+ ( current_prolog_flag(access_level, OldLevel),
237
+ current_prolog_flag(autoload, OldAutoLoad),
238
+ set_prolog_flag(access_level, system),
239
+ set_prolog_flag(autoload, false)
240
+ ),
241
+ list_autoload_(OldLevel),
242
+ ( set_prolog_flag(access_level, OldLevel),
243
+ set_prolog_flag(autoload, OldAutoLoad)
244
+ )).
245
+
246
+ list_autoload_(SystemMode) :-
247
+ ( setof(Lib-Pred,
248
+ autoload_predicate(Module, Lib, Pred, SystemMode),
249
+ Pairs),
250
+ print_message(informational,
251
+ check(autoload(Module, Pairs))),
252
+ fail
253
+ ; true
254
+ ).
255
+
256
+ autoload_predicate(Module, Library, Name/Arity, SystemMode) :-
257
+ predicate_property(Module:Head, undefined),
258
+ check_module_enabled(Module, SystemMode),
259
+ ( \+ predicate_property(Module:Head, imported_from(_)),
260
+ functor(Head, Name, Arity),
261
+ '$find_library'(Module, Name, Arity, _LoadModule, Library),
262
+ referenced(Module:Head, Module, _)
263
+ -> true
264
+ ).
265
+
266
+ check_module_enabled(_, system) :- !.
267
+ check_module_enabled(Module, _) :-
268
+ \+ import_module(Module, system).
269
+
270
+ %! referenced(+Predicate, ?Module, -ClauseRef) is nondet.
271
+ %
272
+ % True if clause ClauseRef references Predicate.
273
+
274
+ referenced(Term, Module, Ref) :-
275
+ Goal = Module:_Head,
276
+ current_predicate(_, Goal),
277
+ '$get_predicate_attribute'(Goal, system, 0),
278
+ \+ '$get_predicate_attribute'(Goal, imported, _),
279
+ nth_clause(Goal, _, Ref),
280
+ '$xr_member'(Ref, Term).
281
+
282
+ %! list_redefined
283
+ %
284
+ % Lists predicates that are defined in the global module =user= as
285
+ % well as in a normal module; that is, predicates for which the
286
+ % local definition overrules the global default definition.
287
+
288
+ list_redefined :-
289
+ setup_call_cleanup(
290
+ ( current_prolog_flag(access_level, OldLevel),
291
+ set_prolog_flag(access_level, system)
292
+ ),
293
+ list_redefined_,
294
+ set_prolog_flag(access_level, OldLevel)).
295
+
296
+ list_redefined_ :-
297
+ current_module(Module),
298
+ Module \== system,
299
+ current_predicate(_, Module:Head),
300
+ \+ predicate_property(Module:Head, imported_from(_)),
301
+ ( global_module(Super),
302
+ Super \== Module,
303
+ '$c_current_predicate'(_, Super:Head),
304
+ \+ redefined_ok(Head),
305
+ '$syspreds':'$defined_predicate'(Super:Head),
306
+ \+ predicate_property(Super:Head, (dynamic)),
307
+ \+ predicate_property(Super:Head, imported_from(Module)),
308
+ functor(Head, Name, Arity)
309
+ -> print_message(informational,
310
+ check(redefined(Module, Super, Name/Arity)))
311
+ ),
312
+ fail.
313
+ list_redefined_.
314
+
315
+ redefined_ok('$mode'(_,_)).
316
+ redefined_ok('$pldoc'(_,_,_,_)).
317
+ redefined_ok('$pred_option'(_,_,_,_)).
318
+ redefined_ok('$table_mode'(_,_,_)).
319
+ redefined_ok('$tabled'(_,_)).
320
+ redefined_ok('$exported_op'(_,_,_)).
321
+ redefined_ok('$autoload'(_,_,_)).
322
+
323
+ global_module(user).
324
+ global_module(system).
325
+
326
+ %! list_cross_module_calls is det.
327
+ %
328
+ % List calls from one module to another using Module:Goal where the
329
+ % callee is not defined exported, public or multifile, i.e., where the
330
+ % callee should be considered _private_.
331
+
332
+ list_cross_module_calls :-
333
+ list_cross_module_calls([]).
334
+
335
+ list_cross_module_calls(Options) :-
336
+ call_cleanup(
337
+ list_cross_module_calls_guarded(Options),
338
+ retractall(cross_module_call(_,_,_))).
339
+
340
+ list_cross_module_calls_guarded(Options) :-
341
+ merge_options(Options,
342
+ [ module_class([user])
343
+ ],
344
+ WalkOptions),
345
+ prolog_walk_code([ trace_reference(_),
346
+ trace_condition(cross_module_call),
347
+ on_trace(write_call)
348
+ | WalkOptions
349
+ ]).
350
+
351
+ :- thread_local
352
+ cross_module_call/3.
353
+
354
+ :- public
355
+ cross_module_call/2,
356
+ write_call/3.
357
+
358
+ cross_module_call(Callee, Context) :-
359
+ \+ same_module_call(Callee, Context).
360
+
361
+ same_module_call(Callee, Context) :-
362
+ caller_module(Context, MCaller),
363
+ Callee = (MCallee:_),
364
+ ( ( MCaller = MCallee
365
+ ; predicate_property(Callee, exported)
366
+ ; predicate_property(Callee, built_in)
367
+ ; predicate_property(Callee, public)
368
+ ; clause_property(Context.get(clause), module(MCallee))
369
+ ; predicate_property(Callee, multifile)
370
+ )
371
+ -> true
372
+ ).
373
+
374
+ caller_module(Context, MCaller) :-
375
+ Caller = Context.caller,
376
+ ( Caller = (MCaller:_)
377
+ -> true
378
+ ; Caller == '<initialization>',
379
+ MCaller = Context.module
380
+ ).
381
+
382
+ write_call(Callee, Caller, Position) :-
383
+ cross_module_call(Callee, Caller, Position),
384
+ !.
385
+ write_call(Callee, Caller, Position) :-
386
+ ( cross_module_call(_,_,_)
387
+ -> true
388
+ ; print_message(warning, check(cross_module_calls))
389
+ ),
390
+ asserta(cross_module_call(Callee, Caller, Position)),
391
+ print_message(warning,
392
+ check(cross_module_call(Callee, Caller, Position))).
393
+
394
+ %! list_void_declarations is det.
395
+ %
396
+ % List predicates that have declared attributes, but no clauses.
397
+
398
+ list_void_declarations :-
399
+ P = _:_,
400
+ ( predicate_property(P, undefined),
401
+ ( '$get_predicate_attribute'(P, meta_predicate, Pattern),
402
+ ( '$get_predicate_attribute'(P, transparent, 1)
403
+ -> print_message(warning,
404
+ check(void_declaration(P, meta_predicate(Pattern))))
405
+ ; print_message(warning,
406
+ check(void_declaration(P, mode(Pattern))))
407
+ )
408
+ ; void_attribute(Attr),
409
+ '$get_predicate_attribute'(P, Attr, 1),
410
+ print_message(warning,
411
+ check(void_declaration(P, Attr)))
412
+ ),
413
+ fail
414
+ ; predicate_property(P, discontiguous),
415
+ \+ (predicate_property(P, number_of_clauses(N)), N > 0),
416
+ print_message(warning,
417
+ check(void_declaration(P, discontiguous))),
418
+ fail
419
+ ; true
420
+ ).
421
+
422
+ void_attribute(public).
423
+ void_attribute(volatile).
424
+ void_attribute(det).
425
+
426
+ %! list_trivial_fails is det.
427
+ %! list_trivial_fails(+Options) is det.
428
+ %
429
+ % List goals that trivially fail because there is no matching
430
+ % clause. Options:
431
+ %
432
+ % * module_class(+Classes)
433
+ % Process modules of the given Classes. The default for
434
+ % classes is =|[user]|=. For example, to include the
435
+ % libraries into the examination, use =|[user,library]|=.
436
+
437
+ :- thread_local
438
+ trivial_fail/2.
439
+
440
+ list_trivial_fails :-
441
+ list_trivial_fails([]).
442
+
443
+ list_trivial_fails(Options) :-
444
+ merge_options(Options,
445
+ [ module_class([user]),
446
+ infer_meta_predicates(false),
447
+ autoload(false),
448
+ evaluate(false),
449
+ trace_reference(_),
450
+ on_trace(check_trivial_fail)
451
+ ],
452
+ WalkOptions),
453
+
454
+ prolog_walk_code([ source(false)
455
+ | WalkOptions
456
+ ]),
457
+ findall(CRef, retract(trivial_fail(clause(CRef), _)), Clauses),
458
+ ( Clauses == []
459
+ -> true
460
+ ; print_message(warning, check(trivial_failures)),
461
+ prolog_walk_code([ clauses(Clauses)
462
+ | WalkOptions
463
+ ]),
464
+ findall(Goal-From, retract(trivial_fail(From, Goal)), Pairs),
465
+ keysort(Pairs, Sorted),
466
+ group_pairs_by_key(Sorted, Grouped),
467
+ maplist(report_trivial_fail, Grouped)
468
+ ).
469
+
470
+ %! trivial_fail_goal(:Goal)
471
+ %
472
+ % Multifile hook that tells list_trivial_fails/0 to accept Goal as
473
+ % valid.
474
+
475
+ trivial_fail_goal(pce_expansion:pce_class(_, _, template, _, _, _)).
476
+ trivial_fail_goal(pce_host:property(system_source_prefix(_))).
477
+
478
+ :- public
479
+ check_trivial_fail/3.
480
+
481
+ check_trivial_fail(MGoal0, _Caller, From) :-
482
+ ( MGoal0 = M:Goal,
483
+ atom(M),
484
+ callable(Goal),
485
+ predicate_property(MGoal0, interpreted),
486
+ \+ predicate_property(MGoal0, dynamic),
487
+ \+ predicate_property(MGoal0, multifile),
488
+ \+ trivial_fail_goal(MGoal0)
489
+ -> ( predicate_property(MGoal0, meta_predicate(Meta))
490
+ -> qualify_meta_goal(MGoal0, Meta, MGoal)
491
+ ; MGoal = MGoal0
492
+ ),
493
+ ( clause(MGoal, _)
494
+ -> true
495
+ ; assertz(trivial_fail(From, MGoal))
496
+ )
497
+ ; true
498
+ ).
499
+
500
+ report_trivial_fail(Goal-FromList) :-
501
+ print_message(warning, check(trivial_failure(Goal, FromList))).
502
+
503
+ %! qualify_meta_goal(+Module, +MetaSpec, +Goal, -QualifiedGoal)
504
+ %
505
+ % Qualify a goal if the goal calls a meta predicate
506
+
507
+ qualify_meta_goal(M:Goal0, Meta, M:Goal) :-
508
+ functor(Goal0, F, N),
509
+ functor(Goal, F, N),
510
+ qualify_meta_goal(1, M, Meta, Goal0, Goal).
511
+
512
+ qualify_meta_goal(N, M, Meta, Goal0, Goal) :-
513
+ arg(N, Meta, ArgM),
514
+ !,
515
+ arg(N, Goal0, Arg0),
516
+ arg(N, Goal, Arg),
517
+ N1 is N + 1,
518
+ ( module_qualified(ArgM)
519
+ -> add_module(Arg0, M, Arg)
520
+ ; Arg = Arg0
521
+ ),
522
+ meta_goal(N1, Meta, Goal0, Goal).
523
+ meta_goal(_, _, _, _).
524
+
525
+ add_module(Arg, M, M:Arg) :-
526
+ var(Arg),
527
+ !.
528
+ add_module(M:Arg, _, MArg) :-
529
+ !,
530
+ add_module(Arg, M, MArg).
531
+ add_module(Arg, M, M:Arg).
532
+
533
+ module_qualified(N) :- integer(N), !.
534
+ module_qualified(:).
535
+ module_qualified(^).
536
+
537
+
538
+ %! list_strings is det.
539
+ %! list_strings(+Options) is det.
540
+ %
541
+ % List strings that appear in clauses. This predicate is used to
542
+ % find portability issues for changing the Prolog flag
543
+ % =double_quotes= from =codes= to =string=, creating packed string
544
+ % objects. Warnings may be suppressed using the following
545
+ % multifile hooks:
546
+ %
547
+ % - string_predicate/1 to stop checking certain predicates
548
+ % - valid_string_goal/1 to tell the checker that a goal is
549
+ % safe.
550
+ %
551
+ % @see Prolog flag =double_quotes=.
552
+
553
+ list_strings :-
554
+ list_strings([module_class([user])]).
555
+
556
+ list_strings(Options) :-
557
+ ( prolog_program_clause(ClauseRef, Options),
558
+ clause(Head, Body, ClauseRef),
559
+ \+ ( predicate_indicator(Head, PI),
560
+ string_predicate(PI)
561
+ ),
562
+ make_clause(Head, Body, Clause),
563
+ findall(T,
564
+ ( sub_term(T, Head),
565
+ string(T)
566
+ ; Head = M:_,
567
+ goal_in_body(Goal, M, Body),
568
+ ( valid_string_goal(Goal)
569
+ -> fail
570
+ ; sub_term(T, Goal),
571
+ string(T)
572
+ )
573
+ ), Ts0),
574
+ sort(Ts0, Ts),
575
+ member(T, Ts),
576
+ message_context(ClauseRef, T, Clause, Context),
577
+ print_message(warning,
578
+ check(string_in_clause(T, Context))),
579
+ fail
580
+ ; true
581
+ ).
582
+
583
+ make_clause(Head, true, Head) :- !.
584
+ make_clause(Head, Body, (Head:-Body)).
585
+
586
+ %! list_rationals is det.
587
+ %! list_rationals(+Options) is det.
588
+ %
589
+ % List rational numbers that appear in clauses. This predicate is used
590
+ % to find portability issues for changing the Prolog flag
591
+ % `rational_syntax` to `natural`, creating rational numbers from
592
+ % <integer>/<nonneg>. Options:
593
+ %
594
+ % - module_class(+Classes)
595
+ % Determines the modules classes processed. By default only
596
+ % user code is processed. See prolog_program_clause/2.
597
+ % - arithmetic(+Bool)
598
+ % If `true` (default `false`) also warn on rationals appearing
599
+ % in arithmetic expressions.
600
+ %
601
+ % @see Prolog flag `rational_syntax` and `prefer_rationals`.
602
+
603
+ list_rationals :-
604
+ list_rationals([module_class([user])]).
605
+
606
+ list_rationals(Options) :-
607
+ ( option(arithmetic(DoArith), Options, false),
608
+ prolog_program_clause(ClauseRef, Options),
609
+ clause(Head, Body, ClauseRef),
610
+ make_clause(Head, Body, Clause),
611
+ findall(T,
612
+ ( sub_term(T, Head),
613
+ rational(T),
614
+ \+ integer(T)
615
+ ; Head = M:_,
616
+ goal_in_body(Goal, M, Body),
617
+ nonvar(Goal),
618
+ ( DoArith == false,
619
+ valid_rational_goal(Goal)
620
+ -> fail
621
+ ; sub_term(T, Goal),
622
+ rational(T),
623
+ \+ integer(T)
624
+ )
625
+ ), Ts0),
626
+ sort(Ts0, Ts),
627
+ member(T, Ts),
628
+ message_context(ClauseRef, T, Clause, Context),
629
+ print_message(warning,
630
+ check(rational_in_clause(T, Context))),
631
+ fail
632
+ ; true
633
+ ).
634
+
635
+
636
+ valid_rational_goal(_ is _).
637
+ valid_rational_goal(_ =:= _).
638
+ valid_rational_goal(_ < _).
639
+ valid_rational_goal(_ > _).
640
+ valid_rational_goal(_ =< _).
641
+ valid_rational_goal(_ >= _).
642
+
643
+
644
+ %! list_format_errors is det.
645
+ %! list_format_errors(+Options) is det.
646
+ %
647
+ % List argument errors for format/2,3.
648
+
649
+ list_format_errors :-
650
+ list_format_errors([module_class([user])]).
651
+
652
+ list_format_errors(Options) :-
653
+ ( prolog_program_clause(ClauseRef, Options),
654
+ clause(Head, Body, ClauseRef),
655
+ make_clause(Head, Body, Clause),
656
+ Head = M:_,
657
+ goal_in_body(Goal, M, Body),
658
+ format_warning(Goal, Msg),
659
+ message_context(ClauseRef, Goal, Clause, Context),
660
+ print_message(warning, check(Msg, Goal, Context)),
661
+ fail
662
+ ; true
663
+ ).
664
+
665
+ format_warning(system:format(Format, Args), Msg) :-
666
+ nonvar(Format),
667
+ nonvar(Args),
668
+ \+ is_list(Args),
669
+ Msg = format_argv(Args).
670
+ format_warning(system:format(Format, Args), Msg) :-
671
+ ground(Format),
672
+ ( is_list(Args)
673
+ -> length(Args, ArgC)
674
+ ; nonvar(Args)
675
+ -> ArgC = 1
676
+ ),
677
+ E = error(Formal,_),
678
+ catch(format_types(Format, Types), E, true),
679
+ ( var(Formal)
680
+ -> length(Types, TypeC),
681
+ TypeC =\= ArgC,
682
+ Msg = format_argc(TypeC, ArgC)
683
+ ; Msg = format_template(Formal)
684
+ ).
685
+ format_warning(system:format(_Stream, Format, Args), Msg) :-
686
+ format_warning(system:format(Format, Args), Msg).
687
+ format_warning(prolog_debug:debug(_Channel, Format, Args), Msg) :-
688
+ format_warning(system:format(Format, Args), Msg).
689
+
690
+
691
+ %! goal_in_body(-G, +M, +Body) is nondet.
692
+ %
693
+ % True when G is a goal called from Body.
694
+
695
+ goal_in_body(M:G, M, G) :-
696
+ var(G),
697
+ !.
698
+ goal_in_body(G, _, M:G0) :-
699
+ atom(M),
700
+ !,
701
+ goal_in_body(G, M, G0).
702
+ goal_in_body(G, M, Control) :-
703
+ nonvar(Control),
704
+ control(Control, Subs),
705
+ !,
706
+ member(Sub, Subs),
707
+ goal_in_body(G, M, Sub).
708
+ goal_in_body(G, M, G0) :-
709
+ callable(G0),
710
+ ( atom(M)
711
+ -> TM = M
712
+ ; TM = system
713
+ ),
714
+ predicate_property(TM:G0, meta_predicate(Spec)),
715
+ !,
716
+ ( strip_goals(G0, Spec, G1),
717
+ simple_goal_in_body(G, M, G1)
718
+ ; arg(I, Spec, Meta),
719
+ arg(I, G0, G1),
720
+ extend(Meta, G1, G2),
721
+ goal_in_body(G, M, G2)
722
+ ).
723
+ goal_in_body(G, M, G0) :-
724
+ simple_goal_in_body(G, M, G0).
725
+
726
+ simple_goal_in_body(G, M, G0) :-
727
+ ( atom(M),
728
+ callable(G0),
729
+ predicate_property(M:G0, imported_from(M2))
730
+ -> G = M2:G0
731
+ ; G = M:G0
732
+ ).
733
+
734
+ control((A,B), [A,B]).
735
+ control((A;B), [A,B]).
736
+ control((A->B), [A,B]).
737
+ control((A*->B), [A,B]).
738
+ control((\+A), [A]).
739
+
740
+ strip_goals(G0, Spec, G) :-
741
+ functor(G0, Name, Arity),
742
+ functor(G, Name, Arity),
743
+ strip_goal_args(1, G0, Spec, G).
744
+
745
+ strip_goal_args(I, G0, Spec, G) :-
746
+ arg(I, G0, A0),
747
+ !,
748
+ arg(I, Spec, M),
749
+ ( extend(M, A0, _)
750
+ -> arg(I, G, '<meta-goal>')
751
+ ; arg(I, G, A0)
752
+ ),
753
+ I2 is I + 1,
754
+ strip_goal_args(I2, G0, Spec, G).
755
+ strip_goal_args(_, _, _, _).
756
+
757
+ extend(I, G0, G) :-
758
+ callable(G0),
759
+ integer(I), I>0,
760
+ !,
761
+ length(L, I),
762
+ extend_list(G0, L, G).
763
+ extend(0, G, G).
764
+ extend(^, G, G).
765
+
766
+ extend_list(M:G0, L, M:G) :-
767
+ !,
768
+ callable(G0),
769
+ extend_list(G0, L, G).
770
+ extend_list(G0, L, G) :-
771
+ G0 =.. List,
772
+ append(List, L, All),
773
+ G =.. All.
774
+
775
+
776
+ %! message_context(+ClauseRef, +Term, +Clause, -Pos) is det.
777
+ %
778
+ % Find an as accurate as possible location for Term in Clause.
779
+
780
+ message_context(ClauseRef, Term, Clause, file_term_position(File, TermPos)) :-
781
+ clause_info(ClauseRef, File, Layout, _Vars),
782
+ ( Term = _:Goal,
783
+ prolog_codewalk:subterm_pos(Goal, Clause, ==, Layout, TermPos)
784
+ ; prolog_codewalk:subterm_pos(Term, Clause, ==, Layout, TermPos)
785
+ ),
786
+ !.
787
+ message_context(ClauseRef, _String, _Clause, file(File, Line, -1, _)) :-
788
+ clause_property(ClauseRef, file(File)),
789
+ clause_property(ClauseRef, line_count(Line)),
790
+ !.
791
+ message_context(ClauseRef, _String, _Clause, clause(ClauseRef)).
792
+
793
+
794
+ :- meta_predicate
795
+ predicate_indicator(:, -).
796
+
797
+ predicate_indicator(Module:Head, Module:Name/Arity) :-
798
+ functor(Head, Name, Arity).
799
+ predicate_indicator(Module:Head, Module:Name//DCGArity) :-
800
+ functor(Head, Name, Arity),
801
+ DCGArity is Arity-2.
802
+
803
+ %! string_predicate(:PredicateIndicator)
804
+ %
805
+ % Multifile hook to disable list_strings/0 on the given predicate.
806
+ % This is typically used for facts that store strings.
807
+
808
+ string_predicate(_:'$pldoc'/4).
809
+ string_predicate(pce_principal:send_implementation/3).
810
+ string_predicate(pce_principal:pce_lazy_get_method/3).
811
+ string_predicate(pce_principal:pce_lazy_send_method/3).
812
+ string_predicate(pce_principal:pce_class/6).
813
+ string_predicate(prolog_xref:pred_comment/4).
814
+ string_predicate(prolog_xref:module_comment/3).
815
+ string_predicate(pldoc_process:structured_comment//2).
816
+ string_predicate(pldoc_process:structured_command_start/3).
817
+ string_predicate(pldoc_process:separator_line//0).
818
+ string_predicate(pldoc_register:mydoc/3).
819
+ string_predicate(http_header:separators/1).
820
+
821
+ %! valid_string_goal(+Goal) is semidet.
822
+ %
823
+ % Multifile hook that qualifies Goal as valid for list_strings/0.
824
+ % For example, format("Hello world~n") is considered proper use of
825
+ % string constants.
826
+
827
+ % system predicates
828
+ valid_string_goal(system:format(S)) :- string(S).
829
+ valid_string_goal(system:format(S,_)) :- string(S).
830
+ valid_string_goal(system:format(_,S,_)) :- string(S).
831
+ valid_string_goal(system:string_codes(S,_)) :- string(S).
832
+ valid_string_goal(system:string_code(_,S,_)) :- string(S).
833
+ valid_string_goal(system:throw(msg(S,_))) :- string(S).
834
+ valid_string_goal('$dcg':phrase(S,_,_)) :- string(S).
835
+ valid_string_goal('$dcg':phrase(S,_)) :- string(S).
836
+ valid_string_goal(system: is(_,_)). % arithmetic allows for "x"
837
+ valid_string_goal(system: =:=(_,_)).
838
+ valid_string_goal(system: >(_,_)).
839
+ valid_string_goal(system: <(_,_)).
840
+ valid_string_goal(system: >=(_,_)).
841
+ valid_string_goal(system: =<(_,_)).
842
+ % library stuff
843
+ valid_string_goal(dcg_basics:string_without(S,_,_,_)) :- string(S).
844
+ valid_string_goal(git:read_url(S,_,_)) :- string(S).
845
+ valid_string_goal(tipc:tipc_subscribe(_,_,_,_,S)) :- string(S).
846
+ valid_string_goal(charsio:format_to_chars(Format,_,_)) :- string(Format).
847
+ valid_string_goal(charsio:format_to_chars(Format,_,_,_)) :- string(Format).
848
+ valid_string_goal(codesio:format_to_codes(Format,_,_)) :- string(Format).
849
+ valid_string_goal(codesio:format_to_codes(Format,_,_,_)) :- string(Format).
850
+
851
+
852
+ /*******************************
853
+ * EXTENSION HOOKS *
854
+ *******************************/
855
+
856
+ %! checker(:Goal, +Message:text) is nondet.
857
+ %
858
+ % Register code validation routines. Each clause defines a Goal which
859
+ % performs a consistency check executed by check/0. Message is a short
860
+ % description of the check. For example, assuming the `my_checks`
861
+ % module defines a predicate list_format_mistakes/0:
862
+ %
863
+ % ```
864
+ % :- multifile check:checker/2.
865
+ % check:checker(my_checks:list_format_mistakes,
866
+ % "errors with format/2 arguments").
867
+ % ```
868
+ %
869
+ % The predicate is dynamic, so you can disable checks with retract/1.
870
+ % For example, to stop reporting redefined predicates:
871
+ %
872
+ % ```
873
+ % retract(check:checker(list_redefined,_)).
874
+ % ```
875
+
876
+ checker(list_undefined, 'undefined predicates').
877
+ checker(list_trivial_fails, 'trivial failures').
878
+ checker(list_format_errors, 'format/2,3 and debug/3 templates').
879
+ checker(list_redefined, 'redefined system and global predicates').
880
+ checker(list_void_declarations, 'predicates with declarations but without clauses').
881
+ checker(list_autoload, 'predicates that need autoloading').
882
+ checker(check_predicate_options, 'predicate options lists').
883
+
884
+
885
+ /*******************************
886
+ * MESSAGES *
887
+ *******************************/
888
+
889
+ :- multifile
890
+ prolog:message/3.
891
+
892
+ prolog:message(check(pass(Comment))) -->
893
+ [ 'Checking ~w ...'-[Comment] ].
894
+ prolog:message(check(find_references(Preds))) -->
895
+ { length(Preds, N)
896
+ },
897
+ [ 'Scanning for references to ~D possibly undefined predicates'-[N] ].
898
+ prolog:message(check(undefined_procedures, Grouped)) -->
899
+ [ 'The predicates below are not defined. If these are defined', nl,
900
+ 'at runtime using assert/1, use :- dynamic Name/Arity.', nl, nl
901
+ ],
902
+ undefined_procedures(Grouped).
903
+ prolog:message(check(undefined_unreferenced_predicates)) -->
904
+ [ 'The predicates below are not defined, and are not', nl,
905
+ 'referenced.', nl, nl
906
+ ].
907
+ prolog:message(check(undefined_unreferenced(Pred))) -->
908
+ predicate(Pred).
909
+ prolog:message(check(autoload(Module, Pairs))) -->
910
+ { module_property(Module, file(Path))
911
+ },
912
+ !,
913
+ [ 'Into module ~w ('-[Module] ],
914
+ short_filename(Path),
915
+ [ ')', nl ],
916
+ autoload(Pairs).
917
+ prolog:message(check(autoload(Module, Pairs))) -->
918
+ [ 'Into module ~w'-[Module], nl ],
919
+ autoload(Pairs).
920
+ prolog:message(check(redefined(In, From, Pred))) -->
921
+ predicate(In:Pred),
922
+ redefined(In, From).
923
+ prolog:message(check(cross_module_calls)) -->
924
+ [ 'Qualified calls to private predicates'-[] ].
925
+ prolog:message(check(cross_module_call(Callee, _Caller, Location))) -->
926
+ { pi_head(PI, Callee) },
927
+ [ ' '-[] ],
928
+ '$messages':swi_location(Location),
929
+ [ 'Cross-module call to ~p'-[PI] ].
930
+ prolog:message(check(trivial_failures)) -->
931
+ [ 'The following goals fail because there are no matching clauses.' ].
932
+ prolog:message(check(trivial_failure(Goal, Refs))) -->
933
+ { map_list_to_pairs(sort_reference_key, Refs, Keyed),
934
+ keysort(Keyed, KeySorted),
935
+ pairs_values(KeySorted, SortedRefs)
936
+ },
937
+ goal(Goal),
938
+ [ ', which is called from'-[], nl ],
939
+ referenced_by(SortedRefs).
940
+ prolog:message(check(string_in_clause(String, Context))) -->
941
+ '$messages':swi_location(Context),
942
+ [ 'String ~q'-[String] ].
943
+ prolog:message(check(rational_in_clause(String, Context))) -->
944
+ '$messages':swi_location(Context),
945
+ [ 'Rational ~q'-[String] ].
946
+ prolog:message(check(Msg, Goal, Context)) -->
947
+ '$messages':swi_location(Context),
948
+ { pi_head(PI, Goal) },
949
+ [ nl, ' '-[] ],
950
+ predicate(PI),
951
+ [ ': '-[] ],
952
+ check_message(Msg).
953
+ prolog:message(check(void_declaration(P, Decl))) -->
954
+ predicate(P),
955
+ [ ' is declared with ', ansi(code, '~p', [Decl]), ' but has no clauses' ].
956
+
957
+ undefined_procedures([]) -->
958
+ [].
959
+ undefined_procedures([H|T]) -->
960
+ undefined_procedure(H),
961
+ undefined_procedures(T).
962
+
963
+ undefined_procedure(Pred-Refs) -->
964
+ { map_list_to_pairs(sort_reference_key, Refs, Keyed),
965
+ keysort(Keyed, KeySorted),
966
+ pairs_values(KeySorted, SortedRefs)
967
+ },
968
+ predicate(Pred),
969
+ [ ', which is referenced by', nl ],
970
+ referenced_by(SortedRefs).
971
+
972
+ redefined(user, system) -->
973
+ [ '~t~30| System predicate redefined globally' ].
974
+ redefined(_, system) -->
975
+ [ '~t~30| Redefined system predicate' ].
976
+ redefined(_, user) -->
977
+ [ '~t~30| Redefined global predicate' ].
978
+
979
+ goal(user:Goal) -->
980
+ !,
981
+ [ '~p'-[Goal] ].
982
+ goal(Goal) -->
983
+ !,
984
+ [ '~p'-[Goal] ].
985
+
986
+ predicate(Module:Name/Arity) -->
987
+ { atom(Module),
988
+ atom(Name),
989
+ integer(Arity),
990
+ functor(Head, Name, Arity),
991
+ predicate_name(Module:Head, PName)
992
+ },
993
+ !,
994
+ [ ansi(code, '~w', [PName]) ].
995
+ predicate(Module:Head) -->
996
+ { atom(Module),
997
+ callable(Head),
998
+ predicate_name(Module:Head, PName)
999
+ },
1000
+ !,
1001
+ [ ansi(code, '~w', [PName]) ].
1002
+ predicate(Name/Arity) -->
1003
+ { atom(Name),
1004
+ integer(Arity)
1005
+ },
1006
+ !,
1007
+ predicate(user:Name/Arity).
1008
+
1009
+ autoload([]) -->
1010
+ [].
1011
+ autoload([Lib-Pred|T]) -->
1012
+ [ ' ' ],
1013
+ predicate(Pred),
1014
+ [ '~t~24| from ' ],
1015
+ short_filename(Lib),
1016
+ [ nl ],
1017
+ autoload(T).
1018
+
1019
+ %! sort_reference_key(+Reference, -Key) is det.
1020
+ %
1021
+ % Create a stable key for sorting references to predicates.
1022
+
1023
+ sort_reference_key(Term, key(M:Name/Arity, N, ClausePos)) :-
1024
+ clause_ref(Term, ClauseRef, ClausePos),
1025
+ !,
1026
+ nth_clause(Pred, N, ClauseRef),
1027
+ strip_module(Pred, M, Head),
1028
+ functor(Head, Name, Arity).
1029
+ sort_reference_key(Term, Term).
1030
+
1031
+ clause_ref(clause_term_position(ClauseRef, TermPos), ClauseRef, ClausePos) :-
1032
+ arg(1, TermPos, ClausePos).
1033
+ clause_ref(clause(ClauseRef), ClauseRef, 0).
1034
+
1035
+
1036
+ referenced_by([]) -->
1037
+ [].
1038
+ referenced_by([Ref|T]) -->
1039
+ ['\t'], prolog:message_location(Ref),
1040
+ predicate_indicator(Ref),
1041
+ [ nl ],
1042
+ referenced_by(T).
1043
+
1044
+ predicate_indicator(clause_term_position(ClauseRef, _)) -->
1045
+ { nonvar(ClauseRef) },
1046
+ !,
1047
+ predicate_indicator(clause(ClauseRef)).
1048
+ predicate_indicator(clause(ClauseRef)) -->
1049
+ { clause_name(ClauseRef, Name) },
1050
+ [ '~w'-[Name] ].
1051
+ predicate_indicator(file_term_position(_,_)) -->
1052
+ [ '(initialization)' ].
1053
+ predicate_indicator(file(_,_,_,_)) -->
1054
+ [ '(initialization)' ].
1055
+
1056
+
1057
+ short_filename(Path) -->
1058
+ { short_filename(Path, Spec)
1059
+ },
1060
+ [ '~q'-[Spec] ].
1061
+
1062
+ short_filename(Path, Spec) :-
1063
+ absolute_file_name('', Here),
1064
+ atom_concat(Here, Local0, Path),
1065
+ !,
1066
+ remove_leading_slash(Local0, Spec).
1067
+ short_filename(Path, Spec) :-
1068
+ findall(LenAlias, aliased_path(Path, LenAlias), Keyed),
1069
+ keysort(Keyed, [_-Spec|_]).
1070
+ short_filename(Path, Path).
1071
+
1072
+ aliased_path(Path, Len-Spec) :-
1073
+ setof(Alias, Spec^(user:file_search_path(Alias, Spec)), Aliases),
1074
+ member(Alias, Aliases),
1075
+ Term =.. [Alias, '.'],
1076
+ absolute_file_name(Term,
1077
+ [ file_type(directory),
1078
+ file_errors(fail),
1079
+ solutions(all)
1080
+ ], Prefix),
1081
+ atom_concat(Prefix, Local0, Path),
1082
+ remove_leading_slash(Local0, Local),
1083
+ atom_length(Local, Len),
1084
+ Spec =.. [Alias, Local].
1085
+
1086
+ remove_leading_slash(Path, Local) :-
1087
+ atom_concat(/, Local, Path),
1088
+ !.
1089
+ remove_leading_slash(Path, Path).
1090
+
1091
+ check_message(format_argc(Expected, InList)) -->
1092
+ [ 'Template requires ~w arguments, got ~w'-[Expected, InList] ].
1093
+ check_message(format_template(Formal)) -->
1094
+ { message_to_string(error(Formal, _), Msg) },
1095
+ [ 'Invalid template: ~s'-[Msg] ].
1096
+ check_message(format_argv(Args)) -->
1097
+ [ 'Arguments are not in a list (deprecated): ~p'-[Args] ].