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,975 @@
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) 2011-2016, VU University Amsterdam
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(predicate_options,
36
+ [ predicate_options/3, % +PI, +Arg, +Options
37
+ assert_predicate_options/4, % +PI, +Arg, +Options, ?New
38
+
39
+ current_option_arg/2, % ?PI, ?Arg
40
+ current_predicate_option/3, % ?PI, ?Arg, ?Option
41
+ check_predicate_option/3, % +PI, +Arg, +Option
42
+ % Create declarations
43
+ current_predicate_options/3, % ?PI, ?Arg, ?Options
44
+ retractall_predicate_options/0,
45
+ derived_predicate_options/3, % :PI, ?Arg, ?Options
46
+ derived_predicate_options/1, % +Module
47
+ % Checking
48
+ check_predicate_options/0,
49
+ derive_predicate_options/0,
50
+ check_predicate_options/1 % :PredicateIndicator
51
+ ]).
52
+ :- autoload(library(apply),[maplist/3]).
53
+ :- use_module(library(debug),[debug/3]).
54
+ :- autoload(library(error),
55
+ [ existence_error/2,
56
+ must_be/2,
57
+ instantiation_error/1,
58
+ uninstantiation_error/1,
59
+ is_of_type/2
60
+ ]).
61
+ :- use_module(library(dialect/swi/syspred_options)).
62
+
63
+ :- autoload(library(listing),[portray_clause/1]).
64
+ :- autoload(library(lists),[member/2,nth1/3,append/3,delete/3]).
65
+ :- autoload(library(pairs),[group_pairs_by_key/2]).
66
+ :- autoload(library(prolog_clause),[clause_info/4]).
67
+
68
+
69
+ :- meta_predicate
70
+ predicate_options(:, +, +),
71
+ assert_predicate_options(:, +, +, ?),
72
+ current_predicate_option(:, ?, ?),
73
+ check_predicate_option(:, ?, ?),
74
+ current_predicate_options(:, ?, ?),
75
+ current_option_arg(:, ?),
76
+ pred_option(:,-),
77
+ derived_predicate_options(:,?,?),
78
+ check_predicate_options(:).
79
+
80
+ /** <module> Access and analyse predicate options
81
+
82
+ This module provides the developers interface for the directive
83
+ predicate_options/3. This directive allows us to specify that, e.g.,
84
+ open/4 processes options using the 4th argument and supports the option
85
+ =type= using the values =text= and =binary=. Declaring options that are
86
+ processed allows for more reliable handling of predicate options and
87
+ simplifies porting applications. This library provides the following
88
+ functionality:
89
+
90
+ * Query supported options through current_predicate_option/3
91
+ or current_predicate_options/3. This is intended to support
92
+ conditional compilation and an IDE.
93
+ * Derive additional declarations through dataflow analysis using
94
+ derive_predicate_options/0.
95
+ * Perform a compile-time analysis of the entire loaded program using
96
+ check_predicate_options/0.
97
+
98
+ Below, we describe some use-cases.
99
+
100
+ $ Quick check of a program :
101
+ This scenario is useful as an occasional check or to assess problems
102
+ with option-handling for porting an application to SWI-Prolog. It
103
+ consists of three steps: loading the program (1 and 2), deriving
104
+ option handling for application predicates (3) and running the
105
+ checker (4).
106
+
107
+ ==
108
+ 1 ?- [load].
109
+ 2 ?- autoload.
110
+ 3 ?- derive_predicate_options.
111
+ 4 ?- check_predicate_options.
112
+ ==
113
+
114
+ $ Add declarations to your program :
115
+ Adding declarations about option processes improves the quality of
116
+ the checking. The analysis of derive_predicate_options/0 may miss
117
+ options and does not derive the types for options that are processed
118
+ in Prolog code. The process is similar to the above. In steps 4 and
119
+ further, the inferred declarations are listed, inspected and added to
120
+ the source code of the module.
121
+
122
+ ==
123
+ 1 ?- [load].
124
+ 2 ?- autoload.
125
+ 3 ?- derive_predicate_options.
126
+ 4 ?- derived_predicate_options(module_1).
127
+ 5 ?- derived_predicate_options(module_2).
128
+ 6 ?- ...
129
+ ==
130
+
131
+ $ Declare option processing requirements :
132
+ If an application requires that open/4 needs to support lock(write),
133
+ it may do so using the directive below. This directive raises an
134
+ exception when loaded on a Prolog implementation that does not support
135
+ this option.
136
+
137
+ ==
138
+ :- current_predicate_option(open/4, 4, lock(write)).
139
+ ==
140
+
141
+ @see library(option) for accessing options in Prolog code.
142
+ */
143
+
144
+ :- multifile option_decl/3, pred_option/3.
145
+ :- dynamic dyn_option_decl/3.
146
+
147
+ %! predicate_options(:PI, +Arg, +Options) is det.
148
+ %
149
+ % Declare that the predicate PI processes options on Arg. Options
150
+ % is a list of options processed. Each element is one of:
151
+ %
152
+ % * Option(ModeAndType)
153
+ % PI processes Option. The option-value must comply to
154
+ % ModeAndType. Mode is one of + or - and Type is a type as
155
+ % accepted by must_be/2.
156
+ %
157
+ % * pass_to(:PI,Arg)
158
+ % The option-list is passed to the indicated predicate.
159
+ %
160
+ % Below is an example that processes the option header(boolean)
161
+ % and passes all options to open/4:
162
+ %
163
+ % ==
164
+ % :- predicate_options(write_xml_file/3, 3,
165
+ % [ header(boolean),
166
+ % pass_to(open/4, 4)
167
+ % ]).
168
+ %
169
+ % write_xml_file(File, XMLTerm, Options) :-
170
+ % open(File, write, Out, Options),
171
+ % ( option(header(true), Options, true)
172
+ % -> write_xml_header(Out)
173
+ % ; true
174
+ % ),
175
+ % ...
176
+ % ==
177
+ %
178
+ % This predicate may only be used as a _directive_ and is
179
+ % processed by expand_term/2. Option processing can be
180
+ % specified at runtime using assert_predicate_options/3, which is
181
+ % intended to support program analysis.
182
+
183
+ predicate_options(PI, Arg, Options) :-
184
+ throw(error(context_error(nodirective,
185
+ predicate_options(PI, Arg, Options)), _)).
186
+
187
+
188
+ %! assert_predicate_options(:PI, +Arg, +Options, ?New) is semidet.
189
+ %
190
+ % As predicate_options(:PI, +Arg, +Options). New is a boolean
191
+ % indicating whether the declarations have changed. If New is
192
+ % provided and =false=, the predicate becomes semidet and fails
193
+ % without modifications if modifications are required.
194
+
195
+ assert_predicate_options(PI, Arg, Options, New) :-
196
+ canonical_pi(PI, M:Name/Arity),
197
+ functor(Head, Name, Arity),
198
+ ( dyn_option_decl(Head, M, Arg)
199
+ -> true
200
+ ; New = true,
201
+ assertz(dyn_option_decl(Head, M, Arg))
202
+ ),
203
+ phrase('$predopts':option_clauses(Options, Head, M, Arg),
204
+ OptionClauses),
205
+ forall(member(Clause, OptionClauses),
206
+ assert_option_clause(Clause, New)),
207
+ ( var(New)
208
+ -> New = false
209
+ ; true
210
+ ).
211
+
212
+ assert_option_clause(Clause, New) :-
213
+ rename_clause(Clause, NewClause,
214
+ '$pred_option'(A,B,C,D), '$dyn_pred_option'(A,B,C,D)),
215
+ clause_head(NewClause, NewHead),
216
+ ( clause(NewHead, _)
217
+ -> true
218
+ ; New = true,
219
+ assertz(NewClause)
220
+ ).
221
+
222
+ clause_head(M:(Head:-_Body), M:Head) :- !.
223
+ clause_head((M:Head :-_Body), M:Head) :- !.
224
+ clause_head(Head, Head).
225
+
226
+ rename_clause(M:Clause, M:NewClause, Head, NewHead) :-
227
+ !,
228
+ rename_clause(Clause, NewClause, Head, NewHead).
229
+ rename_clause((Head :- Body), (NewHead :- Body), Head, NewHead) :- !.
230
+ rename_clause(Head, NewHead, Head, NewHead) :- !.
231
+ rename_clause(Head, Head, _, _).
232
+
233
+
234
+
235
+ /*******************************
236
+ * QUERY OPTIONS *
237
+ *******************************/
238
+
239
+ %! current_option_arg(:PI, ?Arg) is nondet.
240
+ %
241
+ % True when Arg of PI processes predicate options. Which options
242
+ % are processed can be accessed using current_predicate_option/3.
243
+
244
+ current_option_arg(Module:Name/Arity, Arg) :-
245
+ current_option_arg(Module:Name/Arity, Arg, _DefM).
246
+
247
+ current_option_arg(Module:Name/Arity, Arg, DefM) :-
248
+ atom(Name), integer(Arity),
249
+ !,
250
+ resolve_module(Module:Name/Arity, DefM:Name/Arity),
251
+ functor(Head, Name, Arity),
252
+ ( option_decl(Head, DefM, Arg)
253
+ ; dyn_option_decl(Head, DefM, Arg)
254
+ ).
255
+ current_option_arg(M:Name/Arity, Arg, M) :-
256
+ ( option_decl(Head, M, Arg)
257
+ ; dyn_option_decl(Head, M, Arg)
258
+ ),
259
+ functor(Head, Name, Arity).
260
+
261
+ %! current_predicate_option(:PI, ?Arg, ?Option) is nondet.
262
+ %
263
+ % True when Arg of PI processes Option. For example, the following
264
+ % is true:
265
+ %
266
+ % ==
267
+ % ?- current_predicate_option(open/4, 4, type(text)).
268
+ % true.
269
+ % ==
270
+ %
271
+ % This predicate is intended to support conditional compilation
272
+ % using if/1 ... endif/0. The predicate
273
+ % current_predicate_options/3 can be used to access the full
274
+ % capabilities of a predicate.
275
+
276
+ current_predicate_option(Module:PI, Arg, Option) :-
277
+ current_option_arg(Module:PI, Arg, DefM),
278
+ PI = Name/Arity,
279
+ functor(Head, Name, Arity),
280
+ catch(pred_option(DefM:Head, Option),
281
+ error(type_error(_,_),_),
282
+ fail).
283
+
284
+ %! check_predicate_option(:PI, +Arg, +Option) is det.
285
+ %
286
+ % Verify predicate options at runtime. Similar to
287
+ % current_predicate_option/3, but intended to support runtime
288
+ % checking.
289
+ %
290
+ % @error existence_error(option, OptionName) if the option is not
291
+ % supported by PI.
292
+ % @error type_error(Type, Value) if the option is supported but
293
+ % the value does not match the option type. See must_be/2.
294
+
295
+ check_predicate_option(Module:PI, Arg, Option) :-
296
+ define_predicate(Module:PI),
297
+ current_option_arg(Module:PI, Arg, DefM),
298
+ PI = Name/Arity,
299
+ functor(Head, Name, Arity),
300
+ ( pred_option(DefM:Head, Option)
301
+ -> true
302
+ ; existence_error(option, Option)
303
+ ).
304
+
305
+
306
+ pred_option(Head, Option) :-
307
+ pred_option(Head, Option, []).
308
+
309
+ pred_option(M:Head, Option, Seen) :-
310
+ ( has_static_option_decl(M),
311
+ M:'$pred_option'(Head, _, Option, Seen)
312
+ ; has_dynamic_option_decl(M),
313
+ M:'$dyn_pred_option'(Head, _, Option, Seen)
314
+ ).
315
+
316
+ has_static_option_decl(M) :-
317
+ '$c_current_predicate'(_, M:'$pred_option'(_,_,_,_)).
318
+ has_dynamic_option_decl(M) :-
319
+ '$c_current_predicate'(_, M:'$dyn_pred_option'(_,_,_,_)).
320
+
321
+
322
+ /*******************************
323
+ * TYPE&MODE CONSTRAINTS *
324
+ *******************************/
325
+
326
+ :- public
327
+ system:predicate_option_mode/2,
328
+ system:predicate_option_type/2.
329
+
330
+ add_attr(Var, Value) :-
331
+ ( get_attr(Var, predicate_options, Old)
332
+ -> put_attr(Var, predicate_options, [Value|Old])
333
+ ; put_attr(Var, predicate_options, [Value])
334
+ ).
335
+
336
+ system:predicate_option_type(Type, Arg) :-
337
+ var(Arg),
338
+ !,
339
+ add_attr(Arg, option_type(Type)).
340
+ system:predicate_option_type(callable+_N, Arg) :-
341
+ !,
342
+ must_be(callable, Arg).
343
+ system:predicate_option_type(list, Arg) :-
344
+ !,
345
+ must_be(list_or_partial_list, Arg).
346
+ system:predicate_option_type(list(Type), Arg) :-
347
+ !,
348
+ must_be(list_or_partial_list(Type), Arg).
349
+ system:predicate_option_type(Type, Arg) :-
350
+ must_be(Type, Arg).
351
+
352
+ system:predicate_option_mode(_Mode, Arg) :-
353
+ var(Arg),
354
+ !.
355
+ system:predicate_option_mode(Mode, Arg) :-
356
+ check_mode(Mode, Arg).
357
+
358
+ check_mode(input, Arg) :-
359
+ ( nonvar(Arg)
360
+ -> true
361
+ ; instantiation_error(Arg)
362
+ ).
363
+ check_mode(output, Arg) :-
364
+ ( var(Arg)
365
+ -> true
366
+ ; uninstantiation_error(Arg)
367
+ ).
368
+
369
+ attr_unify_hook([], _).
370
+ attr_unify_hook([H|T], Var) :-
371
+ option_hook(H, Var),
372
+ attr_unify_hook(T, Var).
373
+
374
+ option_hook(option_type(Type), Value) :-
375
+ is_of_type(Type, Value).
376
+ option_hook(option_mode(Mode), Value) :-
377
+ check_mode(Mode, Value).
378
+
379
+
380
+ attribute_goals(Var) -->
381
+ { get_attr(Var, predicate_options, Attrs) },
382
+ option_goals(Attrs, Var).
383
+
384
+ option_goals([], _) --> [].
385
+ option_goals([H|T], Var) -->
386
+ option_goal(H, Var),
387
+ option_goals(T, Var).
388
+
389
+ option_goal(option_type(Type), Var) --> [predicate_option_type(Type, Var)].
390
+ option_goal(option_mode(Mode), Var) --> [predicate_option_mode(Mode, Var)].
391
+
392
+
393
+ /*******************************
394
+ * OUTPUT DECLARATIONS *
395
+ *******************************/
396
+
397
+ %! current_predicate_options(:PI, ?Arg, ?Options) is nondet.
398
+ %
399
+ % True when Options is the current active option declaration for
400
+ % PI on Arg. See predicate_options/3 for the argument
401
+ % descriptions. If PI is ground and refers to an undefined
402
+ % predicate, the autoloader is used to obtain a definition of the
403
+ % predicate.
404
+
405
+ current_predicate_options(PI, Arg, Options) :-
406
+ define_predicate(PI),
407
+ setof(Arg-Option,
408
+ current_predicate_option_decl(PI, Arg, Option),
409
+ Options0),
410
+ group_pairs_by_key(Options0, Grouped),
411
+ member(Arg-Options, Grouped).
412
+
413
+ current_predicate_option_decl(PI, Arg, Option) :-
414
+ current_predicate_option(PI, Arg, Option0),
415
+ Option0 =.. [Name|Values],
416
+ maplist(mode_and_type, Values, Types),
417
+ Option =.. [Name|Types].
418
+
419
+ mode_and_type(Value, ModeAndType) :-
420
+ copy_term(Value,_,Goals),
421
+ ( memberchk(predicate_option_mode(output, _), Goals)
422
+ -> ModeAndType = -(Type)
423
+ ; ModeAndType = Type
424
+ ),
425
+ ( memberchk(predicate_option_type(Type, _), Goals)
426
+ -> true
427
+ ; Type = any
428
+ ).
429
+
430
+ define_predicate(PI) :-
431
+ ground(PI),
432
+ !,
433
+ PI = M:Name/Arity,
434
+ functor(Head, Name, Arity),
435
+ once(predicate_property(M:Head, _)).
436
+ define_predicate(_).
437
+
438
+ %! derived_predicate_options(:PI, ?Arg, ?Options) is nondet.
439
+ %
440
+ % Derive option arguments using static analysis. True when Options
441
+ % is the current _derived_ active option declaration for PI on
442
+ % Arg.
443
+
444
+ derived_predicate_options(PI, Arg, Options) :-
445
+ define_predicate(PI),
446
+ setof(Arg-Option,
447
+ derived_predicate_option(PI, Arg, Option),
448
+ Options0),
449
+ group_pairs_by_key(Options0, Grouped),
450
+ member(Arg-Options1, Grouped),
451
+ PI = M:_,
452
+ phrase(expand_pass_to_options(Options1, M), Options2),
453
+ sort(Options2, Options).
454
+
455
+ derived_predicate_option(PI, Arg, Decl) :-
456
+ current_option_arg(PI, Arg, DefM),
457
+ PI = _:Name/Arity,
458
+ functor(Head, Name, Arity),
459
+ has_dynamic_option_decl(DefM),
460
+ ( has_static_option_decl(DefM),
461
+ DefM:'$pred_option'(Head, Decl, _, [])
462
+ ; DefM:'$dyn_pred_option'(Head, Decl, _, [])
463
+ ).
464
+
465
+ %! expand_pass_to_options(+OptionsIn, +Module, -OptionsOut)// is det.
466
+ %
467
+ % Expand the options of pass_to(PI,Arg) if PI does not refer to a
468
+ % public predicate.
469
+
470
+ expand_pass_to_options([], _) --> [].
471
+ expand_pass_to_options([H|T], M) -->
472
+ expand_pass_to(H, M),
473
+ expand_pass_to_options(T, M).
474
+
475
+ expand_pass_to(pass_to(PI, Arg), Module) -->
476
+ { strip_module(Module:PI, M, Name/Arity),
477
+ functor(Head, Name, Arity),
478
+ \+ ( predicate_property(M:Head, exported)
479
+ ; predicate_property(M:Head, public)
480
+ ; M == system
481
+ ),
482
+ !,
483
+ current_predicate_options(M:Name/Arity, Arg, Options)
484
+ },
485
+ list(Options).
486
+ expand_pass_to(Option, _) -->
487
+ [Option].
488
+
489
+ list([]) --> [].
490
+ list([H|T]) --> [H], list(T).
491
+
492
+ %! derived_predicate_options(+Module) is det.
493
+ %
494
+ % Derive predicate option declarations for a module. The derived
495
+ % options are printed to the =current_output= stream.
496
+
497
+ derived_predicate_options(Module) :-
498
+ var(Module),
499
+ !,
500
+ forall(current_module(Module),
501
+ derived_predicate_options(Module)).
502
+ derived_predicate_options(Module) :-
503
+ findall(predicate_options(Module:PI, Arg, Options),
504
+ ( derived_predicate_options(Module:PI, Arg, Options),
505
+ PI = Name/Arity,
506
+ functor(Head, Name, Arity),
507
+ ( predicate_property(Module:Head, exported)
508
+ -> true
509
+ ; predicate_property(Module:Head, public)
510
+ )
511
+ ),
512
+ Decls0),
513
+ maplist(qualify_decl(Module), Decls0, Decls1),
514
+ sort(Decls1, Decls),
515
+ ( Decls \== []
516
+ -> format('~N~n~n% Predicate option declarations for module ~q~n~n',
517
+ [Module]),
518
+ forall(member(Decl, Decls),
519
+ portray_clause((:-Decl)))
520
+ ; true
521
+ ).
522
+
523
+ qualify_decl(M,
524
+ predicate_options(PI0, Arg, Options0),
525
+ predicate_options(PI1, Arg, Options1)) :-
526
+ qualify(PI0, M, PI1),
527
+ maplist(qualify_option(M), Options0, Options1).
528
+
529
+ qualify_option(M, pass_to(PI0, Arg), pass_to(PI1, Arg)) :-
530
+ !,
531
+ qualify(PI0, M, PI1).
532
+ qualify_option(_, Opt, Opt).
533
+
534
+ qualify(M:Term, M, Term) :- !.
535
+ qualify(QTerm, _, QTerm).
536
+
537
+
538
+ /*******************************
539
+ * CLEANUP *
540
+ *******************************/
541
+
542
+ %! retractall_predicate_options is det.
543
+ %
544
+ % Remove all dynamically (derived) predicate options.
545
+
546
+ retractall_predicate_options :-
547
+ forall(retract(dyn_option_decl(_,M,_)),
548
+ abolish(M:'$dyn_pred_option'/4)).
549
+
550
+
551
+ /*******************************
552
+ * COMPILE-TIME CHECKER *
553
+ *******************************/
554
+
555
+
556
+ :- thread_local
557
+ new_decl/1.
558
+
559
+ %! check_predicate_options is det.
560
+ %
561
+ % Analyse loaded program for erroneous options. This predicate
562
+ % decompiles the current program and searches for calls to
563
+ % predicates that process options. For each option list, it
564
+ % validates whether the provided options are supported and
565
+ % validates the argument type. This predicate performs partial
566
+ % dataflow analysis to track option-lists inside a clause.
567
+ %
568
+ % @see derive_predicate_options/0 can be used to derive
569
+ % declarations for predicates that pass options. This
570
+ % predicate should normally be called before
571
+ % check_predicate_options/0.
572
+
573
+ check_predicate_options :-
574
+ forall(current_module(Module),
575
+ check_predicate_options_module(Module)).
576
+
577
+ %! derive_predicate_options is det.
578
+ %
579
+ % Derive new predicate option declarations. This predicate
580
+ % analyses the loaded program to find clauses that process options
581
+ % using one of the predicates from library(option) or passes
582
+ % options to other predicates that are known to process options.
583
+ % The process is repeated until no new declarations are retrieved.
584
+ %
585
+ % @see autoload/0 may be used to complete the loaded program.
586
+
587
+ derive_predicate_options :-
588
+ derive_predicate_options(NewDecls),
589
+ ( NewDecls == []
590
+ -> true
591
+ ; print_message(informational, check_options(new(NewDecls))),
592
+ new_decls(NewDecls),
593
+ derive_predicate_options
594
+ ).
595
+
596
+ new_decls([]).
597
+ new_decls([predicate_options(PI, A, O)|T]) :-
598
+ assert_predicate_options(PI, A, O, _),
599
+ new_decls(T).
600
+
601
+
602
+ derive_predicate_options(NewDecls) :-
603
+ call_cleanup(
604
+ ( forall(
605
+ current_module(Module),
606
+ forall(
607
+ ( predicate_in_module(Module, PI),
608
+ PI = Name/Arity,
609
+ functor(Head, Name, Arity),
610
+ catch(Module:clause(Head, Body, Ref), _, fail)
611
+ ),
612
+ check_clause((Head:-Body), Module, Ref, decl))),
613
+ ( setof(Decl, retract(new_decl(Decl)), NewDecls)
614
+ -> true
615
+ ; NewDecls = []
616
+ )
617
+ ),
618
+ retractall(new_decl(_))).
619
+
620
+
621
+ check_predicate_options_module(Module) :-
622
+ forall(predicate_in_module(Module, PI),
623
+ check_predicate_options(Module:PI)).
624
+
625
+ predicate_in_module(Module, PI) :-
626
+ current_predicate(Module:PI),
627
+ PI = Name/Arity,
628
+ functor(Head, Name, Arity),
629
+ \+ predicate_property(Module:Head, imported_from(_)).
630
+
631
+ %! check_predicate_options(:PredicateIndicator) is det.
632
+ %
633
+ % Verify calls to predicates that have options in all clauses of
634
+ % the predicate indicated by PredicateIndicator.
635
+
636
+ check_predicate_options(Module:Name/Arity) :-
637
+ debug(predicate_options, 'Checking ~q', [Module:Name/Arity]),
638
+ functor(Head, Name, Arity),
639
+ forall(catch(Module:clause(Head, Body, Ref), _, fail),
640
+ check_clause((Head:-Body), Module, Ref, check)).
641
+
642
+ %! check_clause(+Clause, +Module, +Ref, +Action) is det.
643
+ %
644
+ % Action is one of
645
+ %
646
+ % * decl
647
+ % Create additional declarations
648
+ % * check
649
+ % Produce error messages
650
+
651
+ check_clause((Head:-Body), M, ClauseRef, Action) :-
652
+ !,
653
+ catch(check_body(Body, M, _, Action), E, true),
654
+ ( var(E)
655
+ -> option_decl(M:Head, Action)
656
+ ; ( clause_info(ClauseRef, File, TermPos, _NameOffset),
657
+ TermPos = term_position(_,_,_,_,[_,BodyPos]),
658
+ catch(check_body(Body, M, BodyPos, Action),
659
+ error(Formal, ArgPos), true),
660
+ compound(ArgPos),
661
+ arg(1, ArgPos, CharCount),
662
+ integer(CharCount)
663
+ -> Location = file_char_count(File, CharCount)
664
+ ; Location = clause(ClauseRef),
665
+ E = error(Formal, _)
666
+ ),
667
+ print_message(error, predicate_option_error(Formal, Location))
668
+ ).
669
+
670
+
671
+ %! check_body(+Body, +Module, +TermPos, +Action)
672
+
673
+ :- multifile
674
+ prolog:called_by/4, % +Goal, +Module, +Context, -Called
675
+ prolog:called_by/2. % +Goal, -Called
676
+
677
+ check_body(Var, _, _, _) :-
678
+ var(Var),
679
+ !.
680
+ check_body(M:G, _, term_position(_,_,_,_,[_,Pos]), Action) :-
681
+ !,
682
+ check_body(G, M, Pos, Action).
683
+ check_body((A,B), M, term_position(_,_,_,_,[PA,PB]), Action) :-
684
+ !,
685
+ check_body(A, M, PA, Action),
686
+ check_body(B, M, PB, Action).
687
+ check_body((A;B), M, term_position(_,_,_,_,[PA,PB]), Action) :-
688
+ !,
689
+ \+ \+ check_body(A, M, PA, Action),
690
+ \+ \+ check_body(B, M, PB, Action).
691
+ check_body(A=B, _, _, _) :- % partial evaluation
692
+ unify_with_occurs_check(A,B),
693
+ !.
694
+ check_body(Goal, M, term_position(_,_,_,_,ArgPosList), Action) :-
695
+ callable(Goal),
696
+ functor(Goal, Name, Arity),
697
+ ( '$get_predicate_attribute'(M:Goal, imported, DefM)
698
+ -> true
699
+ ; DefM = M
700
+ ),
701
+ ( eval_option_pred(DefM:Goal)
702
+ -> true
703
+ ; current_option_arg(DefM:Name/Arity, OptArg),
704
+ !,
705
+ arg(OptArg, Goal, Options),
706
+ nth1(OptArg, ArgPosList, ArgPos),
707
+ check_options(DefM:Name/Arity, OptArg, Options, ArgPos, Action)
708
+ ).
709
+ check_body(Goal, M, _, Action) :-
710
+ ( ( predicate_property(M:Goal, imported_from(IM))
711
+ -> true
712
+ ; IM = M
713
+ ),
714
+ prolog:called_by(Goal, IM, M, Called)
715
+ ; prolog:called_by(Goal, Called)
716
+ ),
717
+ !,
718
+ check_called_by(Called, M, Action).
719
+ check_body(Meta, M, term_position(_,_,_,_,ArgPosList), Action) :-
720
+ '$get_predicate_attribute'(M:Meta, meta_predicate, Head),
721
+ !,
722
+ check_meta_args(1, Head, Meta, M, ArgPosList, Action).
723
+ check_body(_, _, _, _).
724
+
725
+ check_meta_args(I, Head, Meta, M, [ArgPos|ArgPosList], Action) :-
726
+ arg(I, Head, AS),
727
+ !,
728
+ ( AS == 0
729
+ -> arg(I, Meta, MA),
730
+ check_body(MA, M, ArgPos, Action)
731
+ ; true
732
+ ),
733
+ succ(I, I2),
734
+ check_meta_args(I2, Head, Meta, M, ArgPosList, Action).
735
+ check_meta_args(_,_,_,_, _, _).
736
+
737
+ %! check_called_by(+CalledBy, +M, +Action) is det.
738
+ %
739
+ % Handle results from prolog:called_by/2.
740
+
741
+ check_called_by([], _, _).
742
+ check_called_by([H|T], M, Action) :-
743
+ ( H = G+N
744
+ -> ( extend(G, N, G2)
745
+ -> check_body(G2, M, _, Action)
746
+ ; true
747
+ )
748
+ ; check_body(H, M, _, Action)
749
+ ),
750
+ check_called_by(T, M, Action).
751
+
752
+ extend(Goal, N, GoalEx) :-
753
+ callable(Goal),
754
+ Goal =.. List,
755
+ length(Extra, N),
756
+ append(List, Extra, ListEx),
757
+ GoalEx =.. ListEx.
758
+
759
+
760
+ %! check_options(:Predicate, +OptionArg, +Options, +ArgPos, +Action)
761
+ %
762
+ % Verify the list Options, that is passed into Predicate on
763
+ % argument OptionArg. ArgPos is a term-position term describing
764
+ % the location of the Options list. If Options is a partial list,
765
+ % the tail is annotated with pass_to(PI, OptArg).
766
+
767
+ check_options(PI, OptArg, QOptions, ArgPos, Action) :-
768
+ debug(predicate_options, '\tChecking call to ~q', [PI]),
769
+ remove_qualifier(QOptions, Options),
770
+ must_be(list_or_partial_list, Options),
771
+ check_option_list(Options, PI, OptArg, Options, ArgPos, Action).
772
+
773
+ remove_qualifier(X, X) :-
774
+ var(X),
775
+ !.
776
+ remove_qualifier(_:X, X) :- !.
777
+ remove_qualifier(X, X).
778
+
779
+ check_option_list(Var, PI, OptArg, _, _, _) :-
780
+ var(Var),
781
+ !,
782
+ annotate(Var, pass_to(PI, OptArg)).
783
+ check_option_list([], _, _, _, _, _).
784
+ check_option_list([H|T], PI, OptArg, Options, ArgPos, Action) :-
785
+ check_option(PI, OptArg, H, ArgPos, Action),
786
+ check_option_list(T, PI, OptArg, Options, ArgPos, Action).
787
+
788
+ check_option(_, _, _, _, decl) :- !.
789
+ check_option(PI, OptArg, Opt, ArgPos, _) :-
790
+ catch(check_predicate_option(PI, OptArg, Opt), E, true),
791
+ !,
792
+ ( var(E)
793
+ -> true
794
+ ; E = error(Formal,_),
795
+ throw(error(Formal,ArgPos))
796
+ ).
797
+
798
+
799
+ /*******************************
800
+ * ANNOTATIONS *
801
+ *******************************/
802
+
803
+ %! annotate(+Var, +Term) is det.
804
+ %
805
+ % Use constraints to accumulate annotations about variables. If
806
+ % two annotated variables are unified, the attributes are joined.
807
+
808
+ annotate(Var, Term) :-
809
+ ( get_attr(Var, predopts_analysis, Old)
810
+ -> put_attr(Var, predopts_analysis, [Term|Old])
811
+ ; var(Var)
812
+ -> put_attr(Var, predopts_analysis, [Term])
813
+ ; true
814
+ ).
815
+
816
+ annotations(Var, Annotations) :-
817
+ get_attr(Var, predopts_analysis, Annotations).
818
+
819
+ predopts_analysis:attr_unify_hook(Opts, Value) :-
820
+ get_attr(Value, predopts_analysis, Others),
821
+ !,
822
+ append(Opts, Others, All),
823
+ put_attr(Value, predopts_analysis, All).
824
+ predopts_analysis:attr_unify_hook(_, _).
825
+
826
+
827
+ /*******************************
828
+ * PARTIAL EVAL *
829
+ *******************************/
830
+
831
+ eval_option_pred(swi_option:option(Opt, Options)) :-
832
+ processes(Opt, Spec),
833
+ annotate(Options, Spec).
834
+ eval_option_pred(swi_option:option(Opt, Options, _Default)) :-
835
+ processes(Opt, Spec),
836
+ annotate(Options, Spec).
837
+ eval_option_pred(swi_option:select_option(Opt, Options, Rest)) :-
838
+ ignore(unify_with_occurs_check(Rest, Options)),
839
+ processes(Opt, Spec),
840
+ annotate(Options, Spec).
841
+ eval_option_pred(swi_option:select_option(Opt, Options, Rest, _Default)) :-
842
+ ignore(unify_with_occurs_check(Rest, Options)),
843
+ processes(Opt, Spec),
844
+ annotate(Options, Spec).
845
+ eval_option_pred(swi_option:meta_options(_Cond, QOptionsIn, QOptionsOut)) :-
846
+ remove_qualifier(QOptionsIn, OptionsIn),
847
+ remove_qualifier(QOptionsOut, OptionsOut),
848
+ ignore(unify_with_occurs_check(OptionsIn, OptionsOut)).
849
+
850
+ processes(Opt, Spec) :-
851
+ compound(Opt),
852
+ functor(Opt, OptName, 1),
853
+ Spec =.. [OptName,any].
854
+
855
+
856
+ /*******************************
857
+ * NEW DECLARTIONS *
858
+ *******************************/
859
+
860
+ %! option_decl(:Head, +Action) is det.
861
+ %
862
+ % Add new declarations based on attributes left by the analysis
863
+ % pass. We do not add declarations for system modules or modules
864
+ % that already contain static declarations.
865
+ %
866
+ % @tbd Should we add a mode to include generating declarations
867
+ % for system modules and modules with static declarations?
868
+
869
+ option_decl(_, check) :- !.
870
+ option_decl(M:_, _) :-
871
+ system_module(M),
872
+ !.
873
+ option_decl(M:_, _) :-
874
+ has_static_option_decl(M),
875
+ !.
876
+ option_decl(M:Head, _) :-
877
+ compound(Head),
878
+ arg(AP, Head, QA),
879
+ remove_qualifier(QA, A),
880
+ annotations(A, Annotations0),
881
+ functor(Head, Name, Arity),
882
+ PI = M:Name/Arity,
883
+ delete(Annotations0, pass_to(PI,AP), Annotations),
884
+ Annotations \== [],
885
+ Decl = predicate_options(PI, AP, Annotations),
886
+ ( new_decl(Decl)
887
+ -> true
888
+ ; assert_predicate_options(M:Name/Arity, AP, Annotations, false)
889
+ -> true
890
+ ; assertz(new_decl(Decl)),
891
+ debug(predicate_options(decl), '~q', [Decl])
892
+ ),
893
+ fail.
894
+ option_decl(_, _).
895
+
896
+ system_module(system) :- !.
897
+ system_module(Module) :-
898
+ sub_atom(Module, 0, _, _, $).
899
+
900
+
901
+ /*******************************
902
+ * MISC *
903
+ *******************************/
904
+
905
+ canonical_pi(M:Name//Arity, M:Name/PArity) :-
906
+ integer(Arity),
907
+ PArity is Arity+2.
908
+ canonical_pi(PI, PI).
909
+
910
+ %! resolve_module(:PI, -DefPI) is det.
911
+ %
912
+ % Find the real predicate indicator pointing to the definition
913
+ % module of PI. This is similar to using predicate_property/3 with
914
+ % the property imported_from, but using
915
+ % '$get_predicate_attribute'/3 avoids auto-importing the
916
+ % predicate.
917
+
918
+ resolve_module(Module:Name/Arity, DefM:Name/Arity) :-
919
+ functor(Head, Name, Arity),
920
+ ( '$get_predicate_attribute'(Module:Head, imported, M)
921
+ -> DefM = M
922
+ ; DefM = Module
923
+ ).
924
+
925
+
926
+ /*******************************
927
+ * MESSAGES *
928
+ *******************************/
929
+ :- multifile
930
+ prolog:message//1.
931
+
932
+ prolog:message(predicate_option_error(Formal, Location)) -->
933
+ error_location(Location),
934
+ '$messages':term_message(Formal). % TBD: clean interface
935
+ prolog:message(check_options(new(Decls))) -->
936
+ [ 'Inferred declarations:'-[], nl ],
937
+ new_decls(Decls).
938
+
939
+ error_location(file_char_count(File, CharPos)) -->
940
+ { filepos_line(File, CharPos, Line, LinePos) },
941
+ [ url(File:Line:LinePos), ': ' ].
942
+ error_location(clause(ClauseRef)) -->
943
+ { clause_property(ClauseRef, file(File)),
944
+ clause_property(ClauseRef, line_count(Line))
945
+ },
946
+ !,
947
+ [ url(File:Line), ': ' ].
948
+ error_location(clause(ClauseRef)) -->
949
+ [ 'Clause ~q: '-[ClauseRef] ].
950
+
951
+ filepos_line(File, CharPos, Line, LinePos) :-
952
+ setup_call_cleanup(
953
+ ( open(File, read, In),
954
+ open_null_stream(Out)
955
+ ),
956
+ ( Skip is CharPos-1,
957
+ copy_stream_data(In, Out, Skip),
958
+ stream_property(In, position(Pos)),
959
+ stream_position_data(line_count, Pos, Line),
960
+ stream_position_data(line_position, Pos, LinePos)
961
+ ),
962
+ ( close(Out),
963
+ close(In)
964
+ )).
965
+
966
+ new_decls([]) --> [].
967
+ new_decls([H|T]) -->
968
+ [ ' :- ~q'-[H], nl ],
969
+ new_decls(T).
970
+
971
+
972
+ /*******************************
973
+ * SYSTEM DECLARATIONS *
974
+ *******************************/
975
+