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,283 @@
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-2020, University of Amsterdam,
7
+ VU University Amsterdam
8
+ CWI, Amsterdam
9
+ All rights reserved.
10
+
11
+ Redistribution and use in source and binary forms, with or without
12
+ modification, are permitted provided that the following conditions
13
+ are met:
14
+
15
+ 1. Redistributions of source code must retain the above copyright
16
+ notice, this list of conditions and the following disclaimer.
17
+
18
+ 2. Redistributions in binary form must reproduce the above copyright
19
+ notice, this list of conditions and the following disclaimer in
20
+ the documentation and/or other materials provided with the
21
+ distribution.
22
+
23
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
+ POSSIBILITY OF SUCH DAMAGE.
35
+ */
36
+
37
+ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
38
+ Copyright notes: findall/3, bagof/3 and setof/3 are part of the standard
39
+ folklore of Prolog. The core is findall/3 based on C code that was
40
+ written for SWI-Prolog. Older versions also used C-based implementations
41
+ of bagof/3 and setof/3. As these proved wrong, the current
42
+ implementation is modelled after an older version of Yap. Ulrich
43
+ Neumerkel fixed the variable preservation of bagof/3 and setof/3 using
44
+ an algorithm also found in Yap 6.3, where it is claimed: "uses the
45
+ SICStus algorithm to guarantee that variables will have the same names".
46
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
47
+
48
+ :- module('$bags',
49
+ [ findall/3, % +Templ, :Goal, -List
50
+ findall/4, % +Templ, :Goal, -List, +Tail
51
+ findnsols/4, % +Count, +Templ, :Goal, -List
52
+ findnsols/5, % +Count, +Templ, :Goal, -List, +Tail
53
+ bagof/3, % +Templ, :Goal, -List
54
+ setof/3 % +Templ, :Goal, -List
55
+ ]).
56
+
57
+ :- meta_predicate
58
+ findall(?, 0, -),
59
+ findall(?, 0, -, ?),
60
+ findnsols(+, ?, 0, -),
61
+ findnsols(+, ?, 0, -, ?),
62
+ bagof(?, ^, -),
63
+ setof(?, ^, -),
64
+ cleanup_bag(0, 0).
65
+
66
+ :- noprofile((
67
+ findall/4,
68
+ findall/3,
69
+ findnsols/4,
70
+ findnsols/5,
71
+ bagof/3,
72
+ setof/3,
73
+ cleanup_bag/2,
74
+ findall_loop/4)).
75
+
76
+ :- '$iso'((findall/3,
77
+ bagof/3,
78
+ setof/3)).
79
+
80
+ %! findall(-Var, +Goal, -Bag) is det.
81
+ %! findall(-Var, +Goal, -Bag, +Tail) is det.
82
+ %
83
+ % Bag holds all alternatives for Var in Goal. Bag might hold
84
+ % duplicates. Equivalent to bagof, using the existence operator
85
+ % (^) on all free variables of Goal. Succeeds with Bag = [] if
86
+ % Goal fails immediately.
87
+ %
88
+ % The findall/4 variation is a difference-list version of
89
+ % findall/3.
90
+
91
+ findall(Templ, Goal, List) :-
92
+ findall(Templ, Goal, List, []).
93
+
94
+ findall(Templ, Goal, List, Tail) :-
95
+ cleanup_bag(
96
+ findall_loop(Templ, Goal, List, Tail),
97
+ '$destroy_findall_bag').
98
+
99
+ %! cleanup_bag(:Goal, :Cleanup)
100
+ %
101
+ % Variant of setup_call_cleanup/3 that using '$new_findall_bag'/0
102
+ % directly instead of through sig_atomic/1.
103
+
104
+ cleanup_bag(_Goal, _Cleanup) :-
105
+ '$new_findall_bag',
106
+ '$call_cleanup'.
107
+
108
+ findall_loop(Templ, Goal, List, Tail) :-
109
+ ( Goal,
110
+ '$add_findall_bag'(Templ) % fails
111
+ ; '$collect_findall_bag'(List, Tail)
112
+ ).
113
+
114
+ %! findnsols(+Count, @Template, :Goal, -List) is nondet.
115
+ %! findnsols(+Count, @Template, :Goal, -List, ?Tail) is nondet.
116
+ %
117
+ % True when List is the next chunk of maximal Count instantiations
118
+ % of Template that reprensents a solution of Goal. For example:
119
+ %
120
+ % ==
121
+ % ?- findnsols(5, I, between(1, 12, I), L).
122
+ % L = [1, 2, 3, 4, 5] ;
123
+ % L = [6, 7, 8, 9, 10] ;
124
+ % L = [11, 12].
125
+ % ==
126
+ %
127
+ % @compat Ciao, but the SWI-Prolog version is non-deterministic.
128
+ % @error domain_error(not_less_than_zero, Count) if Count is less
129
+ % than 0.
130
+ % @error type_error(integer, Count) if Count is not an integer.
131
+
132
+ findnsols(Count, Template, Goal, List) :-
133
+ findnsols(Count, Template, Goal, List, []).
134
+
135
+ findnsols(Count, Template, Goal, List, Tail) :-
136
+ integer(Count),
137
+ !,
138
+ findnsols2(count(Count), Template, Goal, List, Tail).
139
+ findnsols(Count, Template, Goal, List, Tail) :-
140
+ Count = count(Integer),
141
+ integer(Integer),
142
+ !,
143
+ findnsols2(Count, Template, Goal, List, Tail).
144
+ findnsols(Count, _, _, _, _) :-
145
+ '$type_error'(integer, Count).
146
+
147
+ findnsols2(Count, Template, Goal, List, Tail) :-
148
+ nsols_count(Count, N), N > 0,
149
+ !,
150
+ copy_term(Template+Goal, Templ+G),
151
+ setup_call_cleanup(
152
+ '$new_findall_bag',
153
+ findnsols_loop(Count, Templ, G, List, Tail),
154
+ '$destroy_findall_bag').
155
+ findnsols2(Count, _, _, List, Tail) :-
156
+ nsols_count(Count, 0),
157
+ !,
158
+ Tail = List.
159
+ findnsols2(Count, _, _, _, _) :-
160
+ nsols_count(Count, N),
161
+ '$domain_error'(not_less_than_zero, N).
162
+
163
+ findnsols_loop(Count, Templ, Goal, List, Tail) :-
164
+ nsols_count(Count, FirstStop),
165
+ State = state(FirstStop),
166
+ ( call_cleanup(Goal, Det=true),
167
+ '$add_findall_bag'(Templ, Found),
168
+ Det \== true,
169
+ arg(1, State, Found),
170
+ '$collect_findall_bag'(List, Tail),
171
+ ( '$suspend_findall_bag'
172
+ ; nsols_count(Count, Incr),
173
+ NextStop is Found+Incr,
174
+ nb_setarg(1, State, NextStop),
175
+ fail
176
+ )
177
+ ; '$collect_findall_bag'(List, Tail)
178
+ ).
179
+
180
+ nsols_count(count(N), N).
181
+
182
+ %! bagof(+Var, +Goal, -Bag) is semidet.
183
+ %
184
+ % Implements Clocksin and Melish's bagof/3 predicate. Bag is
185
+ % unified with the alternatives of Var in Goal, Free variables of
186
+ % Goal are bound, unless asked not to with the existential
187
+ % quantifier operator (^).
188
+
189
+ bagof(Templ, Goal0, List) :-
190
+ '$free_variable_set'(Templ^Goal0, Goal, Vars),
191
+ ( Vars == v
192
+ -> findall(Templ, Goal, List),
193
+ List \== []
194
+ ; alloc_bind_key_list(Vars, VDict),
195
+ findall(Vars-Templ, Goal, Answers),
196
+ bind_bagof_keys(Answers, VDict),
197
+ keysort(Answers, Sorted),
198
+ pick(Sorted, Vars, List)
199
+ ).
200
+
201
+ %! alloc_bind_key_list(+Vars, -VDict) is det.
202
+ %
203
+ % Pre-allocate the variable dictionary used by bind_bagof_keys/2. By
204
+ % pre-allocating this list all variables bound become references from
205
+ % the `Vars` of each answer to this dictionary. If we do not
206
+ % preallocate we create a huge reference chain from VDict through each
207
+ % of the answers, causing serious slowdown in the subsequent keysort.
208
+ %
209
+ % The slowdown was discovered by Jan Burse.
210
+
211
+ alloc_bind_key_list(Vars, VDict) :-
212
+ functor(Vars, _, Count),
213
+ length(List, Count),
214
+ '$append'(List, _, VDict).
215
+
216
+ %! bind_bagof_keys(+VarsTemplPairs, -SharedVars)
217
+ %
218
+ % Establish a canonical binding of the _vars_ structures. This
219
+ % code was added by Ulrich Neumerkel in commit
220
+ % 1bf9e87900b3bbd61308e80a784224c856854745.
221
+
222
+ bind_bagof_keys([], _).
223
+ bind_bagof_keys([W-_|WTs], Vars) :-
224
+ term_variables(W, Vars, _),
225
+ bind_bagof_keys(WTs, Vars).
226
+
227
+ pick(Bags, Vars1, Bag1) :-
228
+ pick_first(Bags, Vars0, Bag0, RestBags),
229
+ select_bag(RestBags, Vars0, Bag0, Vars1, Bag1).
230
+
231
+ select_bag([], Vars0, Bag0, Vars1, Bag1) :- % last one: deterministic
232
+ !,
233
+ Vars0 = Vars1,
234
+ Bag0 = Bag1.
235
+ select_bag(_, Vars, Bag, Vars, Bag).
236
+ select_bag(RestBags, _, _, Vars1, Bag1) :-
237
+ pick(RestBags, Vars1, Bag1).
238
+
239
+ %! pick_first(+Bags, +Vars, -Bag1, -RestBags) is semidet.
240
+ %
241
+ % Pick the first result-bag from the list of Templ-Answer. Note
242
+ % that we pick all elements that are equal under =@=, but because
243
+ % the variables in the witness are canonized this is the same as ==.
244
+ %
245
+ % @param Bags List of Templ-Answer
246
+ % @param Vars Initial Templ (for rebinding variables)
247
+ % @param Bag1 First bag of results
248
+ % @param RestBags Remaining Templ-Answer
249
+
250
+ pick_first([Vars-Templ|T0], Vars, [Templ|T], RestBag) :-
251
+ pick_same(T0, Vars, T, RestBag).
252
+
253
+
254
+ pick_same([V-H|T0], Vars, [H|T], Bag) :-
255
+ V == Vars,
256
+ !,
257
+ pick_same(T0, Vars, T, Bag).
258
+ pick_same(Bag, _, [], Bag).
259
+
260
+
261
+ %! setof(+Var, +Goal, -Set) is semidet.
262
+ %
263
+ % Equivalent to bagof/3, but sorts the resulting bag and removes
264
+ % duplicate answers. We sort immediately after the findall/3,
265
+ % removing duplicate Templ-Answer pairs early.
266
+
267
+ setof(Templ, Goal0, List) :-
268
+ '$free_variable_set'(Templ^Goal0, Goal, Vars),
269
+ ( Vars == v
270
+ -> findall(Templ, Goal, Answers),
271
+ Answers \== [],
272
+ sort(Answers, List)
273
+ ; alloc_bind_key_list(Vars, VDict),
274
+ findall(Vars-Templ, Goal, Answers),
275
+ ( ground(Answers)
276
+ -> sort(Answers, Sorted),
277
+ pick(Sorted, Vars, List)
278
+ ; bind_bagof_keys(Answers, VDict),
279
+ sort(Answers, Sorted),
280
+ pick(Sorted, Vars, Listu),
281
+ sort(Listu, List) % Listu ordering may be nixed by Vars
282
+ )
283
+ ).
@@ -0,0 +1,388 @@
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) 2009-2025, University of Amsterdam
7
+ VU University Amsterdam
8
+ SWI-Prolog Solutions b.v.
9
+ All rights reserved.
10
+
11
+ Redistribution and use in source and binary forms, with or without
12
+ modification, are permitted provided that the following conditions
13
+ are met:
14
+
15
+ 1. Redistributions of source code must retain the above copyright
16
+ notice, this list of conditions and the following disclaimer.
17
+
18
+ 2. Redistributions in binary form must reproduce the above copyright
19
+ notice, this list of conditions and the following disclaimer in
20
+ the documentation and/or other materials provided with the
21
+ distribution.
22
+
23
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34
+ POSSIBILITY OF SUCH DAMAGE.
35
+ */
36
+
37
+ :- module('$dcg',
38
+ [ dcg_translate_rule/2, % +Rule, -Clause
39
+ dcg_translate_rule/4, % +Rule, ?Pos0, -Clause, -Pos
40
+ phrase/2, % :Rule, ?Input
41
+ phrase/3, % :Rule, ?Input, ?Rest
42
+ call_dcg/3 % :Rule, ?State0, ?State
43
+ ]).
44
+
45
+ /** <module> Grammar rule (DCG) compiler
46
+
47
+ This module provides the term-expansion rules for DCGs as well as
48
+ phrase/2,3 and call_dcg/3 for calling DCGs. The original code was copied
49
+ from C-Prolog and written by Fernando Pereira, EDCAAD, Edinburgh, 1984.
50
+ Since then many people have modified and extended this code.
51
+
52
+ DCGs have for a long time been a moving target, notably when it comes to
53
+ dealing with cuts and unification delaying for calls to non-DCG code.
54
+ This has slowly converged. This implementation attempts to be closely
55
+ compatible to the pending ISO standard for DCGs.
56
+ */
57
+
58
+ dcg_translate_rule(Rule, Clause) :-
59
+ dcg_translate_rule(Rule, _, Clause, _).
60
+
61
+ dcg_translate_rule((LP,MNT-->RP), Pos0, Clause, Pos) =>
62
+ Clause = (H:-B0,B1),
63
+ f2_pos(Pos0, PosH0, PosRP0, Pos, PosH, PosRP),
64
+ f2_pos(PosH0, PosLP0, PosMNT0, PosH, PosLP, PosMNT),
65
+ '$current_source_module'(M),
66
+ Qualify = q(M,M,_),
67
+ dcg_extend(LP, PosLP0, S0, SR, H, PosLP),
68
+ dcg_body(RP, PosRP0, Qualify, S0, S1, B0, PosRP),
69
+ dcg_body(MNT, PosMNT0, Qualify, SR, S1, B1, PosMNT).
70
+ dcg_translate_rule((LP-->RP), Pos0, Clause, Pos) =>
71
+ Clause = (H:-B),
72
+ f2_pos(Pos0, PosLP0, PosRP0, Pos, PosLP, PosRP),
73
+ dcg_extend(LP, PosLP0, S0, S, H, PosLP),
74
+ '$current_source_module'(M),
75
+ Qualify = q(M,M,_),
76
+ dcg_body(RP, PosRP0, Qualify, S0, S, B, PosRP).
77
+ dcg_translate_rule((LP,MNT==>RP), Pos0, Clause, Pos), is_list(MNT) =>
78
+ Clause = (H=>B0,B1),
79
+ f2_pos(Pos0, PosH0, PosRP0, Pos, PosH, PosRP),
80
+ f2_pos(PosH0, PosLP0, PosMNT0, PosH, PosLP, PosMNT),
81
+ '$current_source_module'(M),
82
+ Qualify = q(M,M,_),
83
+ dcg_extend(LP, PosLP0, S0, SR, H, PosLP),
84
+ dcg_body(RP, PosRP0, Qualify, S0, S1, B0, PosRP),
85
+ dcg_body(MNT, PosMNT0, Qualify, SR, S1, B1, PosMNT).
86
+ dcg_translate_rule((LP,Grd==>RP), Pos0, Clause, Pos) =>
87
+ Clause = (H,Grd=>B),
88
+ f2_pos(Pos0, PosH0, PosRP0, Pos, PosH, PosRP),
89
+ f2_pos(PosH0, PosLP0, PosGrd, PosH, PosLP, PosGrd),
90
+ dcg_extend(LP, PosLP0, S0, S, H, PosLP),
91
+ '$current_source_module'(M),
92
+ Qualify = q(M,M,_),
93
+ dcg_body(RP, PosRP0, Qualify, S0, S, B, PosRP).
94
+ dcg_translate_rule((LP==>RP), Pos0, Clause, Pos) =>
95
+ Clause = (H=>B),
96
+ f2_pos(Pos0, PosLP0, PosRP0, Pos, PosLP, PosRP),
97
+ dcg_extend(LP, PosLP0, S0, S, H, PosLP),
98
+ '$current_source_module'(M),
99
+ Qualify = q(M,M,_),
100
+ dcg_body(RP, PosRP0, Qualify, S0, S, B, PosRP).
101
+
102
+ %! dcg_body(:DCG, ?Pos0, +Qualify, ?List, ?Tail, -Goal, -Pos) is det.
103
+ %
104
+ % Translate DCG body term.
105
+
106
+ dcg_body(Var, P0, Q, S, SR, phrase(QVar, S, SR), P) :-
107
+ var(Var),
108
+ !,
109
+ qualify(Q, Var, P0, QVar, P).
110
+ dcg_body(M:X, Pos0, q(_,C,_), S, SR, Ct, Pos) :-
111
+ !,
112
+ f2_pos(Pos0, _, XP0, _, _, _),
113
+ dcg_body(X, XP0, q(M,C,Pos0), S, SR, Ct, Pos).
114
+ dcg_body([], P0, _, S, SR, S=SR, P) :- % Terminals
115
+ !,
116
+ dcg_terminal_pos(P0, P).
117
+ dcg_body(List, P0, _, S, SR, C, P) :-
118
+ ( List = [_|_]
119
+ -> !,
120
+ ( is_list(List)
121
+ -> '$append'(List, SR, OL), % open the list
122
+ C = (S = OL)
123
+ ; '$type_error'(list, List)
124
+ )
125
+ ; string(List) % double_quotes = string
126
+ -> !,
127
+ string_codes(List, Codes),
128
+ '$append'(Codes, SR, OL),
129
+ C = (S = OL)
130
+ ),
131
+ dcg_terminal_pos(P0, P).
132
+ dcg_body(!, P0, _, S, SR, (!, SR = S), P) :-
133
+ !,
134
+ dcg_cut_pos(P0, P).
135
+ dcg_body({}, P, _, S, S, true, P) :- !.
136
+ dcg_body({T}, P0, Q, S, SR, (QT, SR = S), P) :-
137
+ !,
138
+ dcg_bt_pos(P0, P1),
139
+ qualify(Q, T, P1, QT, P).
140
+ dcg_body((T,R), P0, Q, S, SR, (Tt, Rt), P) :-
141
+ !,
142
+ f2_pos(P0, PA0, PB0, P, PA, PB),
143
+ dcg_body(T, PA0, Q, S, SR1, Tt, PA),
144
+ dcg_body(R, PB0, Q, SR1, SR, Rt, PB).
145
+ dcg_body((T;R), P0, Q, S, SR, (Tt;Rt), P) :-
146
+ !,
147
+ f2_pos(P0, PA0, PB0, P, PA, PB),
148
+ dcg_body(T, PA0, Q, S, S1, T1, PA), or_delay_bind(S, SR, S1, T1, Tt),
149
+ dcg_body(R, PB0, Q, S, S2, R1, PB), or_delay_bind(S, SR, S2, R1, Rt).
150
+ dcg_body((T|R), P0, Q, S, SR, (Tt;Rt), P) :-
151
+ !,
152
+ f2_pos(P0, PA0, PB0, P, PA, PB),
153
+ dcg_body(T, PA0, Q, S, S1, T1, PA), or_delay_bind(S, SR, S1, T1, Tt),
154
+ dcg_body(R, PB0, Q, S, S2, R1, PB), or_delay_bind(S, SR, S2, R1, Rt).
155
+ dcg_body((C->T), P0, Q, S, SR, (Ct->Tt), P) :-
156
+ !,
157
+ f2_pos(P0, PA0, PB0, P, PA, PB),
158
+ dcg_body(C, PA0, Q, S, SR1, Ct, PA),
159
+ dcg_body(T, PB0, Q, SR1, SR, Tt, PB).
160
+ dcg_body((C*->T), P0, Q, S, SR, (Ct*->Tt), P) :-
161
+ !,
162
+ f2_pos(P0, PA0, PB0, P, PA, PB),
163
+ dcg_body(C, PA0, Q, S, SR1, Ct, PA),
164
+ dcg_body(T, PB0, Q, SR1, SR, Tt, PB).
165
+ dcg_body((\+ C), P0, Q, S, SR, (\+ Ct, SR = S), P) :-
166
+ !,
167
+ f1_pos(P0, PA0, P, PA),
168
+ dcg_body(C, PA0, Q, S, _, Ct, PA).
169
+ dcg_body(T, P0, Q, S, SR, QTt, P) :-
170
+ dcg_extend(T, P0, S, SR, Tt, P1),
171
+ qualify(Q, Tt, P1, QTt, P).
172
+
173
+ or_delay_bind(S, SR, S1, T, (T, SR=S)) :-
174
+ S1 == S,
175
+ !.
176
+ or_delay_bind(_S, SR, SR, T, T).
177
+
178
+ %! qualify(+QualifyInfo, +Goal, +Pos0, -QGoal, -Pos) is det.
179
+ %
180
+ % @arg QualifyInfo is a term q(Module,Context,Pos), where Module
181
+ % is the module in which Goal must be called and Context is the
182
+ % current source module.
183
+
184
+ qualify(q(M,C,_), X0, Pos0, X, Pos) :-
185
+ M == C,
186
+ !,
187
+ X = X0,
188
+ Pos = Pos0.
189
+ qualify(q(M,_,MP), X, Pos0, M:X, Pos) :-
190
+ dcg_qualify_pos(Pos0, MP, Pos).
191
+
192
+
193
+ %! dcg_extend(+Head, +Extra1, +Extra2, -NewHead)
194
+ %
195
+ % Extend Head with two more arguments (on behalf DCG compilation).
196
+ % The solution below is one option. Using =.. and append is the
197
+ % alternative. In the current version (5.3.2), the =.. is actually
198
+ % slightly faster, but it creates less garbage.
199
+
200
+ :- dynamic dcg_extend_cache/4.
201
+ :- volatile dcg_extend_cache/4.
202
+
203
+ dcg_no_extend([]).
204
+ dcg_no_extend([_|_]).
205
+ dcg_no_extend({_}).
206
+ dcg_no_extend({}).
207
+ dcg_no_extend(!).
208
+ dcg_no_extend((\+_)).
209
+ dcg_no_extend((_,_)).
210
+ dcg_no_extend((_;_)).
211
+ dcg_no_extend((_|_)).
212
+ dcg_no_extend((_->_)).
213
+ dcg_no_extend((_*->_)).
214
+ dcg_no_extend((_-->_)).
215
+
216
+ %! dcg_extend(:Rule, ?Pos0, ?List, ?Tail, -Head, -Pos) is det.
217
+ %
218
+ % Extend a non-terminal with the DCG difference list List\Tail.
219
+ % The position term is extended as well to reflect the layout of
220
+ % the created term. The additional variables are located at the
221
+ % end of the Rule.
222
+
223
+ dcg_extend(V, _, _, _, _, _) :-
224
+ var(V),
225
+ !,
226
+ throw(error(instantiation_error,_)).
227
+ dcg_extend(M:OldT, Pos0, A1, A2, M:NewT, Pos) :-
228
+ !,
229
+ f2_pos(Pos0, MPos, P0, Pos, MPos, P),
230
+ dcg_extend(OldT, P0, A1, A2, NewT, P).
231
+ dcg_extend(OldT, P0, A1, A2, NewT, P) :-
232
+ dcg_extend_cache(OldT, A1, A2, NewT),
233
+ !,
234
+ extended_pos(P0, P).
235
+ dcg_extend(OldT, P0, A1, A2, NewT, P) :-
236
+ ( callable(OldT)
237
+ -> true
238
+ ; throw(error(type_error(callable,OldT),_))
239
+ ),
240
+ ( dcg_no_extend(OldT)
241
+ -> throw(error(permission_error(define,dcg_nonterminal,OldT),_))
242
+ ; true
243
+ ),
244
+ ( compound(OldT)
245
+ -> compound_name_arity(OldT, Name, Arity),
246
+ compound_name_arity(CopT, Name, Arity)
247
+ ; CopT = OldT,
248
+ Name = OldT,
249
+ Arity = 0
250
+ ),
251
+ NewArity is Arity+2,
252
+ functor(NewT, Name, NewArity),
253
+ copy_args(1, Arity, CopT, NewT),
254
+ A1Pos is Arity+1,
255
+ A2Pos is Arity+2,
256
+ arg(A1Pos, NewT, A1C),
257
+ arg(A2Pos, NewT, A2C),
258
+ assert(dcg_extend_cache(CopT, A1C, A2C, NewT)),
259
+ OldT = CopT,
260
+ A1C = A1,
261
+ A2C = A2,
262
+ extended_pos(P0, P).
263
+
264
+ copy_args(I, Arity, Old, New) :-
265
+ I =< Arity,
266
+ !,
267
+ arg(I, Old, A),
268
+ arg(I, New, A),
269
+ I2 is I + 1,
270
+ copy_args(I2, Arity, Old, New).
271
+ copy_args(_, _, _, _).
272
+
273
+
274
+ /*******************************
275
+ * POSITION LOGIC *
276
+ *******************************/
277
+
278
+ extended_pos(Pos0, Pos) :-
279
+ '$expand':extended_pos(Pos0, 2, Pos).
280
+ f2_pos(Pos0, A0, B0, Pos, A, B) :- '$expand':f2_pos(Pos0, A0, B0, Pos, A, B).
281
+ f1_pos(Pos0, A0, Pos, A) :- '$expand':f1_pos(Pos0, A0, Pos, A).
282
+
283
+ %! dcg_bt_pos(?BraceTermPos, -Pos) is det.
284
+ %
285
+ % Position transformation for mapping of {G} to (G, S=SR).
286
+
287
+ dcg_bt_pos(Var, Var) :-
288
+ var(Var),
289
+ !.
290
+ dcg_bt_pos(brace_term_position(F,T,P0),
291
+ term_position(F,T,F,F,
292
+ [ P0,
293
+ term_position(T,T,T,T,_)
294
+ ])) :- !.
295
+ dcg_bt_pos(Pos, _) :-
296
+ expected_layout(brace_term, Pos).
297
+
298
+ dcg_cut_pos(Var, Var) :-
299
+ var(Var),
300
+ !.
301
+ dcg_cut_pos(F-T, term_position(F,T,F,T,
302
+ [ F-T,
303
+ term_position(T,T,T,T,_)
304
+ ])).
305
+ dcg_cut_pos(Pos, _) :-
306
+ expected_layout(atomic, Pos).
307
+
308
+ %! dcg_terminal_pos(+ListPos, -TermPos)
309
+
310
+ dcg_terminal_pos(Pos, _) :-
311
+ var(Pos),
312
+ !.
313
+ dcg_terminal_pos(list_position(F,T,_Elms,_Tail),
314
+ term_position(F,T,_,_,_)).
315
+ dcg_terminal_pos(F-T,
316
+ term_position(F,T,_,_,_)).
317
+ dcg_terminal_pos(string_position(F,T),
318
+ term_position(F,T,_,_,_)).
319
+ dcg_terminal_pos(Pos, _) :-
320
+ expected_layout(terminal, Pos).
321
+
322
+ %! dcg_qualify_pos(?TermPos0, ?ModuleCreatingPos, -TermPos)
323
+
324
+ dcg_qualify_pos(Var, _, _) :-
325
+ var(Var),
326
+ !.
327
+ dcg_qualify_pos(Pos,
328
+ term_position(F,T,FF,FT,[MP,_]),
329
+ term_position(F,T,FF,FT,[MP,Pos])) :- !.
330
+ dcg_qualify_pos(_, Pos, _) :-
331
+ expected_layout(f2, Pos).
332
+
333
+ expected_layout(Expected, Found) :-
334
+ '$expand':expected_layout(Expected, Found).
335
+
336
+
337
+ /*******************************
338
+ * PHRASE INTERFACE *
339
+ *******************************/
340
+
341
+ %! phrase(:RuleSet, ?List).
342
+ %! phrase(:RuleSet, ?List, ?Rest).
343
+ %
344
+ % Interface to DCGs
345
+
346
+ :- meta_predicate
347
+ phrase(//, ?),
348
+ phrase(//, ?, ?),
349
+ call_dcg(//, ?, ?).
350
+ :- noprofile((phrase/2,
351
+ phrase/3,
352
+ call_dcg/3)).
353
+ :- '$iso'((phrase/2, phrase/3)).
354
+
355
+ phrase(RuleSet, Input) :-
356
+ phrase(RuleSet, Input, []).
357
+ phrase(RuleSet, Input, Rest) :-
358
+ phrase_input(Input),
359
+ phrase_input(Rest),
360
+ call_dcg(RuleSet, Input, Rest).
361
+
362
+ call_dcg(RuleSet, Input, Rest) :-
363
+ ( strip_module(RuleSet, M, Plain),
364
+ nonvar(Plain),
365
+ dcg_special(Plain)
366
+ -> dcg_body(Plain, _, q(M,M,_), S0, S, Body, _),
367
+ Input = S0, Rest = S,
368
+ call(M:Body)
369
+ ; call(RuleSet, Input, Rest)
370
+ ).
371
+
372
+ phrase_input(Var) :- var(Var), !.
373
+ phrase_input([_|_]) :- !.
374
+ phrase_input([]) :- !.
375
+ phrase_input(Data) :-
376
+ throw(error(type_error(list, Data), _)).
377
+
378
+ dcg_special(S) :-
379
+ string(S).
380
+ dcg_special((_,_)).
381
+ dcg_special((_;_)).
382
+ dcg_special((_|_)).
383
+ dcg_special((_->_)).
384
+ dcg_special(!).
385
+ dcg_special({_}).
386
+ dcg_special([]).
387
+ dcg_special([_|_]).
388
+ dcg_special(\+_).