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,1153 @@
1
+ /* Part of SWI-Prolog
2
+
3
+ Author: Vitor Santos Costa
4
+ E-mail: vscosta@gmail.com
5
+ WWW: http://www.swi-prolog.org
6
+ Copyright (c) 2007-2021, Vitor Santos Costa
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(rbtrees,
36
+ [ rb_new/1, % -Tree
37
+ rb_empty/1, % ?Tree
38
+ rb_lookup/3, % +Key, -Value, +Tree
39
+ rb_update/4, % +Tree, +Key, ?NewVal, -NewTree
40
+ rb_update/5, % +Tree, +Key, -OldVal, ?NewVal, -NewTree
41
+ rb_apply/4, % +Tree, +Key, :G, -NewTree
42
+ rb_insert/4, % +Tree, +Key, ?Value, -NewTree
43
+ rb_insert_new/4, % +Tree, +Key, ?Value, -NewTree
44
+ rb_delete/3, % +Tree, +Key, -NewTree
45
+ rb_delete/4, % +Tree, +Key, -Val, -NewTree
46
+ rb_visit/2, % +Tree, -Pairs
47
+ rb_keys/2, % +Tree, +Keys
48
+ rb_map/2, % +Tree, :Goal
49
+ rb_map/3, % +Tree, :Goal, -MappedTree
50
+ rb_partial_map/4, % +Tree, +Keys, :Goal, -MappedTree
51
+ rb_fold/4, % :Goal, +Tree, +State0, -State
52
+ rb_clone/3, % +TreeIn, -TreeOut, -Pairs
53
+ rb_min/3, % +Tree, -Key, -Value
54
+ rb_max/3, % +Tree, -Key, -Value
55
+ rb_del_min/4, % +Tree, -Key, -Val, -TreeDel
56
+ rb_del_max/4, % +Tree, -Key, -Val, -TreeDel
57
+ rb_next/4, % +Tree, +Key, -Next, -Value
58
+ rb_previous/4, % +Tree, +Key, -Next, -Value
59
+ list_to_rbtree/2, % +Pairs, -Tree
60
+ ord_list_to_rbtree/2, % +Pairs, -Tree
61
+ is_rbtree/1, % @Tree
62
+ rb_size/2, % +Tree, -Size
63
+ rb_in/3 % ?Key, ?Value, +Tree
64
+ ]).
65
+ :- autoload(library(error), [domain_error/2]).
66
+
67
+ /** <module> Red black trees
68
+
69
+ Red-Black trees are balanced search binary trees. They are named because
70
+ nodes can be classified as either red or black. The code we include is
71
+ based on "Introduction to Algorithms", second edition, by Cormen,
72
+ Leiserson, Rivest and Stein. The library includes routines to insert,
73
+ lookup and delete elements in the tree.
74
+
75
+ A Red black tree is represented as a term t(Nil, Tree), where Nil is the
76
+ Nil-node, a node shared for each nil-node in the tree. Any node has the
77
+ form colour(Left, Key, Value, Right), where _colour_ is one of `red` or
78
+ `black`.
79
+
80
+ __Warning: instantiation of keys__
81
+
82
+ Red-Black trees depend on the Prolog _standard order of terms_ to
83
+ organize the keys as a (balanced) binary tree. This implies that any
84
+ term may be used as a key. The tree may produce wrong results, such as
85
+ not being able to find a key, if the ordering of keys changes after the
86
+ key has been inserted into the tree. The user is responsible to ensure
87
+ that variables used as keys or appearing in a term used as key that may
88
+ affect ordering are not unified, with the exception of unification
89
+ against new fresh variables. For this reason, _ground_ terms are safe
90
+ keys. When using non-ground terms, either make sure the variables appear
91
+ in places that do not affect the standard order relative to other keys
92
+ in the tree or make sure to not unify against these variables as long as
93
+ the tree is being used.
94
+
95
+ @see library(pairs), library(assoc)
96
+ @author Vitor Santos Costa, Jan Wielemaker, Samer Abdallah,
97
+ Peter Ludemann.
98
+ @see "Introduction to Algorithms", Second Edition Cormen, Leiserson,
99
+ Rivest, and Stein, MIT Press
100
+ */
101
+
102
+ % rbtrees.pl is derived from YAP's rbtrees.yap, with some minor editing.
103
+ % One difference is that the SWI-Prolog version assumes that a key only
104
+ % appears once in the tree - the YAP code is somewhat inconsistent in
105
+ % that (and even allows rb_lookup/3 to backtrack, plus it has
106
+ % rb_lookupall/3, which isn't in the SWI-Prolog code).
107
+
108
+ % The code has also been modified to use SWI-Prolog's '=>' operator to
109
+ % throw an existence_error(matching_rule, _) exception if Tree isn't
110
+ % instantiated (if ':-' is used, an uninstanted Tree gets set to an
111
+ % empty tree, which probably isn't the desired result).
112
+
113
+ :- meta_predicate
114
+ rb_map(+,2,-),
115
+ rb_map(?,1),
116
+ rb_partial_map(+,+,2,-),
117
+ rb_apply(+,+,2,-),
118
+ rb_fold(3,+,+,-).
119
+
120
+ /*
121
+ :- use_module(library(type_check)).
122
+
123
+ :- type rbtree(K,V) ---> t(tree(K,V),tree(K,V)).
124
+ :- type tree(K,V) ---> black(tree(K,V),K,V,tree(K,V))
125
+ ; red(tree(K,V),K,V,tree(K,V))
126
+ ; ''.
127
+ :- type cmp ---> (=) ; (<) ; (>).
128
+
129
+
130
+ :- pred rb_new(rbtree(_K,_V)).
131
+ :- pred rb_empty(rbtree(_K,_V)).
132
+ :- pred rb_lookup(K,V,rbtree(K,V)).
133
+ :- pred lookup(K,V, tree(K,V)).
134
+ :- pred lookup(cmp, K, V, tree(K,V)).
135
+ :- pred rb_min(rbtree(K,V),K,V).
136
+ :- pred min(tree(K,V),K,V).
137
+ :- pred rb_max(rbtree(K,V),K,V).
138
+ :- pred max(tree(K,V),K,V).
139
+ :- pred rb_next(rbtree(K,V),K,pair(K,V),V).
140
+ :- pred next(tree(K,V),K,pair(K,V),V,tree(K,V)).
141
+ */
142
+
143
+ %! rb_new(-Tree) is det.
144
+ %
145
+ % Create a new Red-Black tree Tree.
146
+ %
147
+ % @deprecated Use rb_empty/1.
148
+
149
+ :- det(rb_new/1).
150
+ rb_new(t(Nil,Nil)) :-
151
+ Nil = black('',_,_,'').
152
+
153
+ %! rb_empty(?Tree) is semidet.
154
+ %
155
+ % Succeeds if Tree is an empty Red-Black tree.
156
+
157
+ rb_empty(t(Nil,Nil)) :-
158
+ Nil = black('',_,_,'').
159
+
160
+ %! rb_lookup(+Key, -Value, +Tree) is semidet.
161
+ %
162
+ % True when Value is associated with Key in the Red-Black tree Tree.
163
+ % The given Key may include variables, in which case the RB tree is
164
+ % searched for a key with equivalent variables (using (==)/2). Time
165
+ % complexity is O(log N) in the number of elements in the tree.
166
+ %
167
+ % @see rb_in/3 for backtracking over keys.
168
+
169
+ rb_lookup(Key, Val, t(_,Tree)) =>
170
+ lookup(Key, Val, Tree).
171
+
172
+ lookup(_Key, _Val, black('',_,_,'')) => fail.
173
+ lookup(Key, Val, Tree) =>
174
+ arg(2,Tree,KA),
175
+ compare(Cmp,KA,Key),
176
+ lookup(Cmp,Key,Val,Tree).
177
+
178
+ lookup(>, K, V, Tree) :-
179
+ arg(1,Tree,NTree),
180
+ lookup(K, V, NTree).
181
+ lookup(<, K, V, Tree) :-
182
+ arg(4,Tree,NTree),
183
+ lookup(K, V, NTree).
184
+ lookup(=, _, V, Tree) :-
185
+ arg(3,Tree,V).
186
+
187
+ %! rb_min(+Tree, -Key, -Value) is semidet.
188
+ %
189
+ % Key is the minimum key in Tree, and is associated with Val.
190
+
191
+ rb_min(t(_,Tree), Key, Val) =>
192
+ min(Tree, Key, Val).
193
+
194
+ min(red(black('',_,_,_),Key0,Val0,_), Key, Val) => Key0=Key, Val0=Val.
195
+ min(black(black('',_,_,_),Key0,Val0,_), Key, Val) => Key0=Key, Val0=Val.
196
+ min(red(Right,_,_,_), Key, Val) =>
197
+ min(Right,Key,Val).
198
+ min(black(Right,_,_,_), Key, Val) =>
199
+ min(Right,Key,Val).
200
+ min('', _Key, _Val) => fail.
201
+
202
+ %! rb_max(+Tree, -Key, -Value) is semidet.
203
+ %
204
+ % Key is the maximal key in Tree, and is associated with Val.
205
+
206
+ rb_max(t(_,Tree), Key, Val) =>
207
+ max(Tree, Key, Val).
208
+
209
+ max(red(_,Key0,Val0,black('',_,_,_)), Key, Val) => Key0=Key, Val0=Val.
210
+ max(black(_,Key0,Val0,black('',_,_,_)), Key, Val) =>Key0=Key, Val0=Val.
211
+ max(red(_,_,_,Left), Key, Val) =>
212
+ max(Left,Key,Val).
213
+ max(black(_,_,_,Left), Key, Val) =>
214
+ max(Left,Key,Val).
215
+ max('', _Key, _Val) => fail.
216
+
217
+ %! rb_next(+Tree, +Key, -Next, -Value) is semidet.
218
+ %
219
+ % Next is the next element after Key in Tree, and is associated with
220
+ % Val. Fails if Key isn't in Tree or if Key is the maximum key.
221
+
222
+ rb_next(t(_,Tree), Key, Next, Val) =>
223
+ next(Tree, Key, Next, Val, []).
224
+
225
+ next(black('',_,_,''), _, _, _, _) => fail.
226
+ next(Tree, Key, Next, Val, Candidate) =>
227
+ arg(2,Tree,KA),
228
+ arg(3,Tree,VA),
229
+ compare(Cmp,KA,Key),
230
+ next(Cmp, Key, KA, VA, Next, Val, Tree, Candidate).
231
+
232
+ next(>, K, KA, VA, NK, V, Tree, _) :-
233
+ arg(1,Tree,NTree),
234
+ next(NTree,K,NK,V,KA-VA).
235
+ next(<, K, _, _, NK, V, Tree, Candidate) :-
236
+ arg(4,Tree,NTree),
237
+ next(NTree,K,NK,V,Candidate).
238
+ next(=, _, _, _, NK, Val, Tree, Candidate) :-
239
+ arg(4,Tree,NTree),
240
+ ( min(NTree, NK, Val)
241
+ -> true
242
+ ; Candidate = (NK-Val)
243
+ ).
244
+
245
+ %! rb_previous(+Tree, +Key, -Previous, -Value) is semidet.
246
+ %
247
+ % Previous is the previous element after Key in Tree, and is
248
+ % associated with Val. Fails if Key isn't in Tree or if Key is the
249
+ % minimum key.
250
+
251
+ rb_previous(t(_,Tree), Key, Previous, Val) =>
252
+ previous(Tree, Key, Previous, Val, []).
253
+
254
+ previous(black('',_,_,''), _, _, _, _) => fail.
255
+ previous(Tree, Key, Previous, Val, Candidate) =>
256
+ arg(2,Tree,KA),
257
+ arg(3,Tree,VA),
258
+ compare(Cmp,KA,Key),
259
+ previous(Cmp, Key, KA, VA, Previous, Val, Tree, Candidate).
260
+
261
+ previous(>, K, _, _, NK, V, Tree, Candidate) :-
262
+ arg(1,Tree,NTree),
263
+ previous(NTree,K,NK,V,Candidate).
264
+ previous(<, K, KA, VA, NK, V, Tree, _) :-
265
+ arg(4,Tree,NTree),
266
+ previous(NTree,K,NK,V,KA-VA).
267
+ previous(=, _, _, _, K, Val, Tree, Candidate) :-
268
+ arg(1,Tree,NTree),
269
+ ( max(NTree, K, Val)
270
+ -> true
271
+ ; Candidate = (K-Val)
272
+ ).
273
+
274
+ %! rb_update(+Tree, +Key, ?NewVal, -NewTree) is semidet.
275
+ %
276
+ % Tree NewTree is tree Tree, but with value for Key associated with
277
+ % NewVal. Fails if Key is not in Tree (using (==)/2). This predicate
278
+ % may fail or give unexpected results if Key is not sufficiently
279
+ % instantiated.
280
+ %
281
+ % @see rb_in/3 for backtracking over keys.
282
+
283
+ rb_update(t(Nil,OldTree), Key, OldVal, Val, NewTree2) =>
284
+ NewTree2 = t(Nil,NewTree),
285
+ update(OldTree, Key, OldVal, Val, NewTree).
286
+
287
+ %! rb_update(+Tree, +Key, -OldVal, ?NewVal, -NewTree) is semidet.
288
+ %
289
+ % Same as =|rb_update(Tree, Key, NewVal, NewTree)|= but also unifies
290
+ % OldVal with the value associated with Key in Tree.
291
+
292
+ rb_update(t(Nil,OldTree), Key, Val, NewTree2) =>
293
+ NewTree2 = t(Nil,NewTree),
294
+ update(OldTree, Key, _, Val, NewTree).
295
+
296
+ update(black(Left,Key0,Val0,Right), Key, OldVal, Val, NewTree) :-
297
+ Left \= [],
298
+ compare(Cmp,Key0,Key),
299
+ ( Cmp == (=)
300
+ -> OldVal = Val0,
301
+ NewTree = black(Left,Key0,Val,Right)
302
+ ; Cmp == (>)
303
+ -> NewTree = black(NewLeft,Key0,Val0,Right),
304
+ update(Left, Key, OldVal, Val, NewLeft)
305
+ ; NewTree = black(Left,Key0,Val0,NewRight),
306
+ update(Right, Key, OldVal, Val, NewRight)
307
+ ).
308
+ update(red(Left,Key0,Val0,Right), Key, OldVal, Val, NewTree) :-
309
+ compare(Cmp,Key0,Key),
310
+ ( Cmp == (=)
311
+ -> OldVal = Val0,
312
+ NewTree = red(Left,Key0,Val,Right)
313
+ ; Cmp == (>)
314
+ -> NewTree = red(NewLeft,Key0,Val0,Right),
315
+ update(Left, Key, OldVal, Val, NewLeft)
316
+ ; NewTree = red(Left,Key0,Val0,NewRight),
317
+ update(Right, Key, OldVal, Val, NewRight)
318
+ ).
319
+
320
+ %! rb_apply(+Tree, +Key, :G, -NewTree) is semidet.
321
+ %
322
+ % If the value associated with key Key is Val0 in Tree, and if
323
+ % call(G,Val0,ValF) holds, then NewTree differs from Tree only in that
324
+ % Key is associated with value ValF in tree NewTree. Fails if it
325
+ % cannot find Key in Tree, or if call(G,Val0,ValF) is not satisfiable.
326
+
327
+ rb_apply(t(Nil,OldTree), Key, Goal, NewTree2) =>
328
+ NewTree2 = t(Nil,NewTree),
329
+ apply(OldTree, Key, Goal, NewTree).
330
+
331
+ :- meta_predicate apply(+,?,2,-).
332
+ %apply(black('',_,_,''), _, _, _) :- !, fail.
333
+ apply(black(Left,Key0,Val0,Right), Key, Goal,
334
+ black(NewLeft,Key0,Val,NewRight)) :-
335
+ Left \= [],
336
+ compare(Cmp,Key0,Key),
337
+ ( Cmp == (=)
338
+ -> NewLeft = Left,
339
+ NewRight = Right,
340
+ call(Goal,Val0,Val)
341
+ ; Cmp == (>)
342
+ -> NewRight = Right,
343
+ Val = Val0,
344
+ apply(Left, Key, Goal, NewLeft)
345
+ ; NewLeft = Left,
346
+ Val = Val0,
347
+ apply(Right, Key, Goal, NewRight)
348
+ ).
349
+ apply(red(Left,Key0,Val0,Right), Key, Goal,
350
+ red(NewLeft,Key0,Val,NewRight)) :-
351
+ compare(Cmp,Key0,Key),
352
+ ( Cmp == (=)
353
+ -> NewLeft = Left,
354
+ NewRight = Right,
355
+ call(Goal,Val0,Val)
356
+ ; Cmp == (>)
357
+ -> NewRight = Right,
358
+ Val = Val0,
359
+ apply(Left, Key, Goal, NewLeft)
360
+ ; NewLeft = Left,
361
+ Val = Val0,
362
+ apply(Right, Key, Goal, NewRight)
363
+ ).
364
+
365
+ %! rb_in(?Key, ?Value, +Tree) is nondet.
366
+ %
367
+ % True when Key-Value is a key-value pair in red-black tree Tree. Same
368
+ % as below, but does not materialize the pairs.
369
+ %
370
+ % rb_visit(Tree, Pairs), member(Key-Value, Pairs)
371
+ %
372
+ % Leaves a choicepoint even if Key is instantiated; to avoid a
373
+ % choicepoint, use rb_lookup/3.
374
+
375
+ rb_in(Key, Val, t(_,T)) =>
376
+ enum(Key, Val, T).
377
+
378
+ enum(Key, Val, black(L,K,V,R)) =>
379
+ L \= '',
380
+ enum_cases(Key, Val, L, K, V, R).
381
+ enum(Key, Val, red(L,K,V,R)) =>
382
+ enum_cases(Key, Val, L, K, V, R).
383
+ enum(_Key, _Val, _Tree) => fail.
384
+
385
+ enum_cases(Key, Val, L, _, _, _) :-
386
+ enum(Key, Val, L).
387
+ enum_cases(Key, Val, _, Key, Val, _).
388
+ enum_cases(Key, Val, _, _, _, R) :-
389
+ enum(Key, Val, R).
390
+
391
+
392
+
393
+ /*******************************
394
+ * TREE INSERTION *
395
+ *******************************/
396
+
397
+ % We don't use parent nodes, so we may have to fix the root.
398
+
399
+ %! rb_insert(+Tree, +Key, ?Value, -NewTree) is det.
400
+ %
401
+ % Add an element with key Key and Value to the tree Tree creating a
402
+ % new red-black tree NewTree. If Key is a key in Tree, the associated
403
+ % value is replaced by Value. See also rb_insert_new/4. Does _not_
404
+ % validate that Key is sufficiently instantiated to ensure the tree
405
+ % remains valid if a key is further instantiated.
406
+
407
+ :- det(rb_insert/4).
408
+ rb_insert(t(Nil,Tree0),Key,Val,NewTree) =>
409
+ NewTree = t(Nil,Tree),
410
+ insert(Tree0,Key,Val,Nil,Tree).
411
+
412
+
413
+ insert(Tree0,Key,Val,Nil,Tree) :-
414
+ insert2(Tree0,Key,Val,Nil,TreeI,_),
415
+ fix_root(TreeI,Tree).
416
+
417
+ %
418
+ % Cormen et al present the algorithm as
419
+ % (1) standard tree insertion;
420
+ % (2) from the viewpoint of the newly inserted node:
421
+ % partially fix the tree;
422
+ % move upwards
423
+ % until reaching the root.
424
+ %
425
+ % We do it a little bit different:
426
+ %
427
+ % (1) standard tree insertion;
428
+ % (2) move upwards:
429
+ % when reaching a black node;
430
+ % if the tree below may be broken, fix it.
431
+ % We take advantage of Prolog unification
432
+ % to do several operations in a single go.
433
+ %
434
+
435
+
436
+
437
+ %
438
+ % actual insertion
439
+ %
440
+ insert2(black('',_,_,''), K, V, Nil, T, Status) =>
441
+ T = red(Nil,K,V,Nil),
442
+ Status = not_done.
443
+ insert2(red(L,K0,V0,R), K, V, Nil, NT, Flag) =>
444
+ ( K @< K0
445
+ -> NT = red(NL,K0,V0,R),
446
+ insert2(L, K, V, Nil, NL, Flag)
447
+ ; K == K0
448
+ -> NT = red(L,K0,V,R),
449
+ Flag = done
450
+ ; NT = red(L,K0,V0,NR),
451
+ insert2(R, K, V, Nil, NR, Flag)
452
+ ).
453
+ insert2(black(L,K0,V0,R), K, V, Nil, NT, Flag) =>
454
+ ( K @< K0
455
+ -> insert2(L, K, V, Nil, IL, Flag0),
456
+ fix_left(Flag0, black(IL,K0,V0,R), NT, Flag)
457
+ ; K == K0
458
+ -> NT = black(L,K0,V,R),
459
+ Flag = done
460
+ ; insert2(R, K, V, Nil, IR, Flag0),
461
+ fix_right(Flag0, black(L,K0,V0,IR), NT, Flag)
462
+ ).
463
+
464
+ % We don't use parent nodes, so we may have to fix the root.
465
+
466
+ %! rb_insert_new(+Tree, +Key, ?Value, -NewTree) is semidet.
467
+ %
468
+ % Add a new element with key Key and Value to the tree Tree creating a
469
+ % new red-black tree NewTree. Fails if Key is a key in Tree. Does
470
+ % _not_ validate that Key is sufficiently instantiated to ensure the
471
+ % tree remains valid if a key is further instantiated.
472
+
473
+ rb_insert_new(t(Nil,Tree0),Key,Val,NewTree) =>
474
+ NewTree = t(Nil,Tree),
475
+ insert_new(Tree0,Key,Val,Nil,Tree).
476
+
477
+ insert_new(Tree0,Key,Val,Nil,Tree) :-
478
+ insert_new_2(Tree0,Key,Val,Nil,TreeI,_),
479
+ fix_root(TreeI,Tree).
480
+
481
+ %
482
+ % actual insertion, copied from insert2
483
+ %
484
+ insert_new_2(black('',_,_,''), K, V, Nil, T, Status) =>
485
+ T = red(Nil,K,V,Nil),
486
+ Status = not_done.
487
+ insert_new_2(red(L,K0,V0,R), K, V, Nil, NT, Flag) =>
488
+ ( K @< K0
489
+ -> NT = red(NL,K0,V0,R),
490
+ insert_new_2(L, K, V, Nil, NL, Flag)
491
+ ; K == K0
492
+ -> fail
493
+ ; NT = red(L,K0,V0,NR),
494
+ insert_new_2(R, K, V, Nil, NR, Flag)
495
+ ).
496
+ insert_new_2(black(L,K0,V0,R), K, V, Nil, NT, Flag) =>
497
+ ( K @< K0
498
+ -> insert_new_2(L, K, V, Nil, IL, Flag0),
499
+ fix_left(Flag0, black(IL,K0,V0,R), NT, Flag)
500
+ ; K == K0
501
+ -> fail
502
+ ; insert_new_2(R, K, V, Nil, IR, Flag0),
503
+ fix_right(Flag0, black(L,K0,V0,IR), NT, Flag)
504
+ ).
505
+
506
+ %
507
+ % make sure the root is always black.
508
+ %
509
+ :- det(fix_root/2).
510
+ fix_root(black(L,K,V,R), Root) => Root = black(L,K,V,R).
511
+ fix_root(red(L,K,V,R), Root) => Root = black(L,K,V,R).
512
+
513
+ %
514
+ % How to fix if we have inserted on the left
515
+ %
516
+ :- det(fix_left/4).
517
+ fix_left(done,T0,T,Done) => T = T0, Done = done.
518
+ fix_left(not_done,Tmp,Final,Done) =>
519
+ fix_left(Tmp,Final,Done).
520
+
521
+ :- det(fix_left/3).
522
+ %
523
+ % case 1 of RB: just need to change colors.
524
+ %
525
+ fix_left(black(red(Al,AK,AV,red(Be,BK,BV,Ga)),KC,VC,red(De,KD,VD,Ep)),
526
+ red(black(Al,AK,AV,red(Be,BK,BV,Ga)),KC,VC,black(De,KD,VD,Ep)),
527
+ not_done) :- !.
528
+ fix_left(black(red(red(Al,KA,VA,Be),KB,VB,Ga),KC,VC,red(De,KD,VD,Ep)),
529
+ red(black(red(Al,KA,VA,Be),KB,VB,Ga),KC,VC,black(De,KD,VD,Ep)),
530
+ not_done) :- !.
531
+ %
532
+ % case 2 of RB: got a knee so need to do rotations
533
+ %
534
+ fix_left(black(red(Al,KA,VA,red(Be,KB,VB,Ga)),KC,VC,De),
535
+ black(red(Al,KA,VA,Be),KB,VB,red(Ga,KC,VC,De)),
536
+ done) :- !.
537
+ %
538
+ % case 3 of RB: got a line
539
+ %
540
+ fix_left(black(red(red(Al,KA,VA,Be),KB,VB,Ga),KC,VC,De),
541
+ black(red(Al,KA,VA,Be),KB,VB,red(Ga,KC,VC,De)),
542
+ done) :- !.
543
+ %
544
+ % case 4 of RB: nothing to do
545
+ %
546
+ fix_left(T,T,done).
547
+
548
+ %
549
+ % How to fix if we have inserted on the right
550
+ %
551
+ :- det(fix_right/4).
552
+ fix_right(done,T0,T,Done) => T0 = T, Done = done.
553
+ fix_right(not_done,Tmp,Final,Done) =>
554
+ fix_right(Tmp,Final,Done).
555
+
556
+ :- det(fix_right/3).
557
+ %
558
+ % case 1 of RB: just need to change colors.
559
+ %
560
+ fix_right(black(red(Ep,KD,VD,De),KC,VC,red(red(Ga,KB,VB,Be),KA,VA,Al)),
561
+ red(black(Ep,KD,VD,De),KC,VC,black(red(Ga,KB,VB,Be),KA,VA,Al)),
562
+ not_done) :- !.
563
+ fix_right(black(red(Ep,KD,VD,De),KC,VC,red(Ga,Ka,Va,red(Be,KB,VB,Al))),
564
+ red(black(Ep,KD,VD,De),KC,VC,black(Ga,Ka,Va,red(Be,KB,VB,Al))),
565
+ not_done) :- !.
566
+ %
567
+ % case 2 of RB: got a knee so need to do rotations
568
+ %
569
+ fix_right(black(De,KC,VC,red(red(Ga,KB,VB,Be),KA,VA,Al)),
570
+ black(red(De,KC,VC,Ga),KB,VB,red(Be,KA,VA,Al)),
571
+ done) :- !.
572
+ %
573
+ % case 3 of RB: got a line
574
+ %
575
+ fix_right(black(De,KC,VC,red(Ga,KB,VB,red(Be,KA,VA,Al))),
576
+ black(red(De,KC,VC,Ga),KB,VB,red(Be,KA,VA,Al)),
577
+ done) :- !.
578
+ %
579
+ % case 4 of RB: nothing to do.
580
+ %
581
+ fix_right(T,T,done).
582
+
583
+
584
+ %! rb_delete(+Tree, +Key, -NewTree).
585
+ %
586
+ % Delete element with key Key from the tree Tree, returning the value
587
+ % Val associated with the key and a new tree NewTree. Fails if Key is
588
+ % not in Tree (using (==)/2).
589
+ %
590
+ % @see rb_in/3 for backtracking over keys.
591
+
592
+ rb_delete(t(Nil,T), K, NewTree) =>
593
+ NewTree = t(Nil,NT),
594
+ delete(T, K, _, NT, _).
595
+
596
+ %! rb_delete(+Tree, +Key, -Val, -NewTree).
597
+ %
598
+ % Same as rb_delete(Tree, Key, NewTree), but also unifies Val with the
599
+ % value associated with Key in Tree.
600
+
601
+ rb_delete(t(Nil,T), K, V, NewTree) =>
602
+ NewTree = t(Nil,NT),
603
+ delete(T, K, V0, NT, _),
604
+ V = V0.
605
+
606
+ %
607
+ % I am afraid our representation is not as nice for delete
608
+ %
609
+ delete(red(L,K0,V0,R), K, V, NT, Flag) =>
610
+ delete_red(L,K0,V0,R, K, V, NT, Flag).
611
+ delete(black(L,K0,V0,R), K, V, NT, Flag) =>
612
+ delete_black(L,K0,V0,R, K, V, NT, Flag).
613
+ delete('', _K, _V, _NT, _Flag) =>
614
+ fail.
615
+
616
+ delete_red(L,K0,V0,R, K, V, NT, Flag), K @< K0 =>
617
+ delete(L, K, V, NL, Flag0),
618
+ fixup_left(Flag0,red(NL,K0,V0,R),NT, Flag).
619
+ delete_red(L,K0,V0,R, K, V, NT, Flag), K @> K0 =>
620
+ delete(R, K, V, NR, Flag0),
621
+ fixup_right(Flag0,red(L,K0,V0,NR),NT, Flag).
622
+ delete_red(L,_,V0,R, _, V, Out, Flag) => % K == K0,
623
+ V0 = V,
624
+ delete_red_node(L,R,Out,Flag).
625
+
626
+ delete_black(L,K0,V0,R, K, V, NT, Flag), K @< K0 =>
627
+ delete(L, K, V, NL, Flag0),
628
+ fixup_left(Flag0,black(NL,K0,V0,R),NT, Flag).
629
+ delete_black(L,K0,V0,R, K, V, NT, Flag), K @> K0 =>
630
+ delete(R, K, V, NR, Flag0),
631
+ fixup_right(Flag0,black(L,K0,V0,NR),NT, Flag).
632
+ delete_black(L,_,V0,R, _, V, Out, Flag) => % K == K0,
633
+ V0 = V,
634
+ delete_black_node(L,R,Out,Flag).
635
+
636
+ %! rb_del_min(+Tree, -Key, -Val, -NewTree)
637
+ %
638
+ % Delete the least element from the tree Tree, returning the key Key,
639
+ % the value Val associated with the key and a new tree NewTree. Fails
640
+ % if Tree is empty.
641
+
642
+ rb_del_min(t(Nil,T), K, Val, NewTree) =>
643
+ NewTree = t(Nil,NT),
644
+ del_min(T, K, Val, Nil, NT, _).
645
+
646
+ del_min(red(black('',_,_,_),K,V,R), K, V, Nil, Out, Flag) :-
647
+ !,
648
+ delete_red_node(Nil,R,Out,Flag).
649
+ del_min(red(L,K0,V0,R), K, V, Nil, NT, Flag) :-
650
+ del_min(L, K, V, Nil, NL, Flag0),
651
+ fixup_left(Flag0,red(NL,K0,V0,R), NT, Flag).
652
+ del_min(black(black('',_,_,_),K,V,R), K, V, Nil, Out, Flag) :-
653
+ !,
654
+ delete_black_node(Nil,R,Out,Flag).
655
+ del_min(black(L,K0,V0,R), K, V, Nil, NT, Flag) :-
656
+ del_min(L, K, V, Nil, NL, Flag0),
657
+ fixup_left(Flag0,black(NL,K0,V0,R),NT, Flag).
658
+
659
+
660
+ %! rb_del_max(+Tree, -Key, -Val, -NewTree)
661
+ %
662
+ % Delete the largest element from the tree Tree, returning the key
663
+ % Key, the value Val associated with the key and a new tree NewTree.
664
+ % Fails if Tree is empty.
665
+
666
+ rb_del_max(t(Nil,T), K, Val, NewTree) =>
667
+ NewTree = t(Nil,NT),
668
+ del_max(T, K, Val, Nil, NT, _).
669
+
670
+ del_max(red(L,K,V,black('',_,_,_)), K, V, Nil, Out, Flag) :-
671
+ !,
672
+ delete_red_node(L,Nil,Out,Flag).
673
+ del_max(red(L,K0,V0,R), K, V, Nil, NT, Flag) :-
674
+ del_max(R, K, V, Nil, NR, Flag0),
675
+ fixup_right(Flag0,red(L,K0,V0,NR),NT, Flag).
676
+ del_max(black(L,K,V,black('',_,_,_)), K, V, Nil, Out, Flag) :-
677
+ !,
678
+ delete_black_node(L,Nil,Out,Flag).
679
+ del_max(black(L,K0,V0,R), K, V, Nil, NT, Flag) :-
680
+ del_max(R, K, V, Nil, NR, Flag0),
681
+ fixup_right(Flag0,black(L,K0,V0,NR), NT, Flag).
682
+
683
+ delete_red_node(L1,L2,L1,done) :- L1 == L2, !.
684
+ delete_red_node(black('',_,_,''),R,R,done) :- !.
685
+ delete_red_node(L,black('',_,_,''),L,done) :- !.
686
+ delete_red_node(L,R,Out,Done) :-
687
+ delete_next(R,NK,NV,NR,Done0),
688
+ fixup_right(Done0,red(L,NK,NV,NR),Out,Done).
689
+
690
+ delete_black_node(L1,L2,L1,not_done) :- L1 == L2, !.
691
+ delete_black_node(black('',_,_,''),red(L,K,V,R),black(L,K,V,R),done) :- !.
692
+ delete_black_node(black('',_,_,''),R,R,not_done) :- !.
693
+ delete_black_node(red(L,K,V,R),black('',_,_,''),black(L,K,V,R),done) :- !.
694
+ delete_black_node(L,black('',_,_,''),L,not_done) :- !.
695
+ delete_black_node(L,R,Out,Done) :-
696
+ delete_next(R,NK,NV,NR,Done0),
697
+ fixup_right(Done0,black(L,NK,NV,NR),Out,Done).
698
+
699
+ delete_next(red(black('',_,_,''),K,V,R),K,V,R,done) :- !.
700
+ delete_next(black(black('',_,_,''),K,V,red(L1,K1,V1,R1)),
701
+ K,V,black(L1,K1,V1,R1),done) :- !.
702
+ delete_next(black(black('',_,_,''),K,V,R),K,V,R,not_done) :- !.
703
+ delete_next(red(L,K,V,R),K0,V0,Out,Done) :-
704
+ delete_next(L,K0,V0,NL,Done0),
705
+ fixup_left(Done0,red(NL,K,V,R),Out,Done).
706
+ delete_next(black(L,K,V,R),K0,V0,Out,Done) :-
707
+ delete_next(L,K0,V0,NL,Done0),
708
+ fixup_left(Done0,black(NL,K,V,R),Out,Done).
709
+
710
+ fixup_left(done,T,T,done).
711
+ fixup_left(not_done,T,NT,Done) :-
712
+ fixup2(T,NT,Done).
713
+
714
+ %
715
+ % case 1: x moves down, so we have to try to fix it again.
716
+ % case 1 -> 2,3,4 -> done
717
+ %
718
+ fixup2(black(black(Al,KA,VA,Be),KB,VB,
719
+ red(black(Ga,KC,VC,De),KD,VD,
720
+ black(Ep,KE,VE,Fi))),
721
+ black(T1,KD,VD,black(Ep,KE,VE,Fi)),done) :-
722
+ !,
723
+ fixup2(red(black(Al,KA,VA,Be),KB,VB,black(Ga,KC,VC,De)),
724
+ T1,
725
+ _).
726
+ %
727
+ % case 2: x moves up, change one to red
728
+ %
729
+ fixup2(red(black(Al,KA,VA,Be),KB,VB,
730
+ black(black(Ga,KC,VC,De),KD,VD,
731
+ black(Ep,KE,VE,Fi))),
732
+ black(black(Al,KA,VA,Be),KB,VB,
733
+ red(black(Ga,KC,VC,De),KD,VD,
734
+ black(Ep,KE,VE,Fi))),done) :- !.
735
+ fixup2(black(black(Al,KA,VA,Be),KB,VB,
736
+ black(black(Ga,KC,VC,De),KD,VD,
737
+ black(Ep,KE,VE,Fi))),
738
+ black(black(Al,KA,VA,Be),KB,VB,
739
+ red(black(Ga,KC,VC,De),KD,VD,
740
+ black(Ep,KE,VE,Fi))),not_done) :- !.
741
+ %
742
+ % case 3: x stays put, shift left and do a 4
743
+ %
744
+ fixup2(red(black(Al,KA,VA,Be),KB,VB,
745
+ black(red(Ga,KC,VC,De),KD,VD,
746
+ black(Ep,KE,VE,Fi))),
747
+ red(black(black(Al,KA,VA,Be),KB,VB,Ga),KC,VC,
748
+ black(De,KD,VD,black(Ep,KE,VE,Fi))),
749
+ done) :- !.
750
+ fixup2(black(black(Al,KA,VA,Be),KB,VB,
751
+ black(red(Ga,KC,VC,De),KD,VD,
752
+ black(Ep,KE,VE,Fi))),
753
+ black(black(black(Al,KA,VA,Be),KB,VB,Ga),KC,VC,
754
+ black(De,KD,VD,black(Ep,KE,VE,Fi))),
755
+ done) :- !.
756
+ %
757
+ % case 4: rotate left, get rid of red
758
+ %
759
+ fixup2(red(black(Al,KA,VA,Be),KB,VB,
760
+ black(C,KD,VD,red(Ep,KE,VE,Fi))),
761
+ red(black(black(Al,KA,VA,Be),KB,VB,C),KD,VD,
762
+ black(Ep,KE,VE,Fi)),
763
+ done).
764
+ fixup2(black(black(Al,KA,VA,Be),KB,VB,
765
+ black(C,KD,VD,red(Ep,KE,VE,Fi))),
766
+ black(black(black(Al,KA,VA,Be),KB,VB,C),KD,VD,
767
+ black(Ep,KE,VE,Fi)),
768
+ done).
769
+
770
+ fixup_right(done,T,T,done).
771
+ fixup_right(not_done,T,NT,Done) :-
772
+ fixup3(T,NT,Done).
773
+
774
+ % case 1: x moves down, so we have to try to fix it again.
775
+ % case 1 -> 2,3,4 -> done
776
+ %
777
+ fixup3(black(red(black(Fi,KE,VE,Ep),KD,VD,
778
+ black(De,KC,VC,Ga)),KB,VB,
779
+ black(Be,KA,VA,Al)),
780
+ black(black(Fi,KE,VE,Ep),KD,VD,T1),done) :-
781
+ !,
782
+ fixup3(red(black(De,KC,VC,Ga),KB,VB,
783
+ black(Be,KA,VA,Al)),T1,_).
784
+
785
+ %
786
+ % case 2: x moves up, change one to red
787
+ %
788
+ fixup3(red(black(black(Fi,KE,VE,Ep),KD,VD,
789
+ black(De,KC,VC,Ga)),KB,VB,
790
+ black(Be,KA,VA,Al)),
791
+ black(red(black(Fi,KE,VE,Ep),KD,VD,
792
+ black(De,KC,VC,Ga)),KB,VB,
793
+ black(Be,KA,VA,Al)),
794
+ done) :- !.
795
+ fixup3(black(black(black(Fi,KE,VE,Ep),KD,VD,
796
+ black(De,KC,VC,Ga)),KB,VB,
797
+ black(Be,KA,VA,Al)),
798
+ black(red(black(Fi,KE,VE,Ep),KD,VD,
799
+ black(De,KC,VC,Ga)),KB,VB,
800
+ black(Be,KA,VA,Al)),
801
+ not_done):- !.
802
+ %
803
+ % case 3: x stays put, shift left and do a 4
804
+ %
805
+ fixup3(red(black(black(Fi,KE,VE,Ep),KD,VD,
806
+ red(De,KC,VC,Ga)),KB,VB,
807
+ black(Be,KA,VA,Al)),
808
+ red(black(black(Fi,KE,VE,Ep),KD,VD,De),KC,VC,
809
+ black(Ga,KB,VB,black(Be,KA,VA,Al))),
810
+ done) :- !.
811
+ fixup3(black(black(black(Fi,KE,VE,Ep),KD,VD,
812
+ red(De,KC,VC,Ga)),KB,VB,
813
+ black(Be,KA,VA,Al)),
814
+ black(black(black(Fi,KE,VE,Ep),KD,VD,De),KC,VC,
815
+ black(Ga,KB,VB,black(Be,KA,VA,Al))),
816
+ done) :- !.
817
+ %
818
+ % case 4: rotate right, get rid of red
819
+ %
820
+ fixup3(red(black(red(Fi,KE,VE,Ep),KD,VD,C),KB,VB,black(Be,KA,VA,Al)),
821
+ red(black(Fi,KE,VE,Ep),KD,VD,black(C,KB,VB,black(Be,KA,VA,Al))),
822
+ done).
823
+ fixup3(black(black(red(Fi,KE,VE,Ep),KD,VD,C),KB,VB,black(Be,KA,VA,Al)),
824
+ black(black(Fi,KE,VE,Ep),KD,VD,black(C,KB,VB,black(Be,KA,VA,Al))),
825
+ done).
826
+
827
+ %! rb_visit(+Tree, -Pairs) is det.
828
+ %
829
+ % Pairs is an infix visit of tree Tree, where each element of Pairs is
830
+ % of the form Key-Value.
831
+
832
+ :- det(rb_visit/2).
833
+ rb_visit(t(_,T),Lf) =>
834
+ visit(T,[],Lf).
835
+
836
+ visit(black('',_,_,_),L0,L) => L0 = L.
837
+ visit(red(L,K,V,R),L0,Lf) =>
838
+ visit(L,[K-V|L1],Lf),
839
+ visit(R,L0,L1).
840
+ visit(black(L,K,V,R),L0,Lf) =>
841
+ visit(L,[K-V|L1],Lf),
842
+ visit(R,L0,L1).
843
+
844
+ :- meta_predicate map(?,2,?,?). % this is required.
845
+
846
+ %! rb_map(+Tree, :G, -NewTree) is semidet.
847
+ %
848
+ % For all nodes Key in the tree Tree, if the value associated with key
849
+ % Key is Val0 in tree Tree, and if call(G,Val0,ValF) holds, then the
850
+ % value associated with Key in NewTree is ValF. Fails if
851
+ % call(G,Val0,ValF) is not satisfiable for all Val0. If G is
852
+ % non-deterministic, rb_map/3 will backtrack over all possible values
853
+ % from call(G,Val0,ValF). You should not depend on the order of tree
854
+ % traversal (currently: key order).
855
+
856
+ rb_map(t(Nil,Tree),Goal,NewTree2) =>
857
+ NewTree2 = t(Nil,NewTree),
858
+ map(Tree,Goal,NewTree,Nil).
859
+
860
+
861
+ map(black('',_,_,''),_,Nil0,Nil) => Nil0 = Nil.
862
+ map(red(L,K,V,R),Goal,NewTree,Nil) =>
863
+ NewTree = red(NL,K,NV,NR),
864
+ call(Goal,V,NV),
865
+ map(L,Goal,NL,Nil),
866
+ map(R,Goal,NR,Nil).
867
+ map(black(L,K,V,R),Goal,NewTree,Nil) =>
868
+ NewTree = black(NL,K,NV,NR),
869
+ call(Goal,V,NV),
870
+ map(L,Goal,NL,Nil),
871
+ map(R,Goal,NR,Nil).
872
+
873
+ :- meta_predicate map(?,1). % this is required.
874
+
875
+ %! rb_map(+T, :Goal) is semidet.
876
+ %
877
+ % True if call(Goal, Value) is true for all nodes in T.
878
+
879
+ rb_map(t(_,Tree),Goal) =>
880
+ map(Tree,Goal).
881
+
882
+
883
+ map(black('',_,_,''),_) => true.
884
+ map(red(L,_,V,R),Goal) =>
885
+ call(Goal,V),
886
+ map(L,Goal),
887
+ map(R,Goal).
888
+ map(black(L,_,V,R),Goal) =>
889
+ call(Goal,V),
890
+ map(L,Goal),
891
+ map(R,Goal).
892
+
893
+ %! rb_fold(:Goal, +Tree, +State0, -State).
894
+ %
895
+ % Fold the given predicate over all the key-value pairs in Tree,
896
+ % starting with initial state State0 and returning the final state
897
+ % State. Pred is called as
898
+ %
899
+ % call(Pred, Key-Value, State1, State2)
900
+ %
901
+ % Determinism depends on Goal.
902
+
903
+ rb_fold(Pred, t(_,T), S1, S2) =>
904
+ fold(T, Pred, S1, S2).
905
+
906
+ fold(black(L,K,V,R), Pred) -->
907
+ ( {L == ''}
908
+ -> []
909
+ ; fold_parts(Pred, L, K-V, R)
910
+ ).
911
+ fold(red(L,K,V,R), Pred) -->
912
+ fold_parts(Pred, L, K-V, R).
913
+
914
+ fold_parts(Pred, L, KV, R) -->
915
+ fold(L, Pred),
916
+ call(Pred, KV),
917
+ fold(R, Pred).
918
+
919
+ %! rb_clone(+TreeIn, -TreeOut, -Pairs) is det.
920
+ %
921
+ % `Clone' the red-back tree TreeIn into a new tree TreeOut with the
922
+ % same keys as the original but with all values set to unbound values.
923
+ % Pairs is a list containing all new nodes as pairs K-V.
924
+
925
+ :- det(rb_clone/3).
926
+ rb_clone(t(Nil,T),TreeOut,Ns) =>
927
+ TreeOut = t(Nil,NT),
928
+ clone(T,Nil,NT,Ns,[]).
929
+
930
+ clone(black('',_,_,''),Nil0,Nil,Ns0,Ns) => Nil0=Nil, Ns0=Ns.
931
+ clone(red(L,K,_,R),Nil,TreeOut,NsF,Ns0) =>
932
+ TreeOut = red(NL,K,NV,NR),
933
+ clone(L,Nil,NL,NsF,[K-NV|Ns1]),
934
+ clone(R,Nil,NR,Ns1,Ns0).
935
+ clone(black(L,K,_,R),Nil,TreeOut,NsF,Ns0) =>
936
+ TreeOut = black(NL,K,NV,NR),
937
+ clone(L,Nil,NL,NsF,[K-NV|Ns1]),
938
+ clone(R,Nil,NR,Ns1,Ns0).
939
+
940
+ %! rb_partial_map(+Tree, +Keys, :G, -NewTree)
941
+ %
942
+ % For all nodes Key in Keys, if the value associated with key Key is
943
+ % Val0 in tree Tree, and if call(G,Val0,ValF) holds, then the value
944
+ % associated with Key in NewTree is ValF, otherwise it is the value
945
+ % associated with the key in Tree. Fails if Key isn't in Tree or if
946
+ % call(G,Val0,ValF) is not satisfiable for all Val0 in Keys. Assumes
947
+ % keys are sorted and not repeated (fails if this is not true).
948
+
949
+ rb_partial_map(t(Nil,T0), Map, Goal, NewTree) =>
950
+ NewTree = t(Nil,TF),
951
+ partial_map(T0, Map, [], Nil, Goal, TF).
952
+
953
+ partial_map(T,[],[],_,_,T) :- !.
954
+ partial_map(black('',_,_,_),Map,Map,Nil,_,Nil) :- !.
955
+ partial_map(red(L,K,V,R),Map,MapF,Nil,Goal,red(NL,K,NV,NR)) :-
956
+ partial_map(L,Map,MapI,Nil,Goal,NL),
957
+ ( MapI == []
958
+ -> NR = R, NV = V, MapF = []
959
+ ; MapI = [K1|MapR],
960
+ ( K == K1
961
+ -> ( call(Goal,V,NV)
962
+ -> true
963
+ ; NV = V
964
+ ),
965
+ MapN = MapR
966
+ ; NV = V,
967
+ MapN = MapI
968
+ ),
969
+ partial_map(R,MapN,MapF,Nil,Goal,NR)
970
+ ).
971
+ partial_map(black(L,K,V,R),Map,MapF,Nil,Goal,black(NL,K,NV,NR)) :-
972
+ partial_map(L,Map,MapI,Nil,Goal,NL),
973
+ ( MapI == []
974
+ -> NR = R, NV = V, MapF = []
975
+ ; MapI = [K1|MapR],
976
+ ( K == K1
977
+ -> ( call(Goal,V,NV)
978
+ -> true
979
+ ; NV = V
980
+ ),
981
+ MapN = MapR
982
+ ; NV = V,
983
+ MapN = MapI
984
+ ),
985
+ partial_map(R,MapN,MapF,Nil,Goal,NR)
986
+ ).
987
+
988
+
989
+ %! rb_keys(+Tree, -Keys) is det.
990
+ %
991
+ % Keys is unified with an ordered list of all keys in the Red-Black
992
+ % tree Tree.
993
+
994
+ :- det(rb_keys/2).
995
+ rb_keys(t(_,T),Lf) =>
996
+ keys(T,[],Lf).
997
+
998
+ keys(black('',_,_,''),L0,L) => L0 = L.
999
+ keys(red(L,K,_,R),L0,Lf) =>
1000
+ keys(L,[K|L1],Lf),
1001
+ keys(R,L0,L1).
1002
+ keys(black(L,K,_,R),L0,Lf) =>
1003
+ keys(L,[K|L1],Lf),
1004
+ keys(R,L0,L1).
1005
+
1006
+
1007
+ %! list_to_rbtree(+List, -Tree) is det.
1008
+ %
1009
+ % Tree is the red-black tree corresponding to the mapping in List,
1010
+ % which should be a list of Key-Value pairs. List should not contain
1011
+ % more than one entry for each distinct key, but this is not validated
1012
+ % by list_to_rbtree/2.
1013
+
1014
+ :- det(list_to_rbtree/2).
1015
+ list_to_rbtree(List, T) :-
1016
+ sort(List,Sorted),
1017
+ ord_list_to_rbtree(Sorted, T).
1018
+
1019
+ %! ord_list_to_rbtree(+List, -Tree) is det.
1020
+ %
1021
+ % Tree is the red-black tree corresponding to the mapping in list
1022
+ % List, which should be a list of Key-Value pairs. List should not
1023
+ % contain more than one entry for each distinct key, but this is not
1024
+ % validated by ord_list_to_rbtree/2. List is assumed
1025
+ % to be sorted according to the standard order of terms.
1026
+
1027
+ :- det(ord_list_to_rbtree/2).
1028
+ ord_list_to_rbtree([], Tree) =>
1029
+ Tree = t(Nil,Nil),
1030
+ Nil = black('', _, _, '').
1031
+ ord_list_to_rbtree([K-V], Tree) =>
1032
+ Tree = t(Nil,black(Nil,K,V,Nil)),
1033
+ Nil = black('', _, _, '').
1034
+ ord_list_to_rbtree(List, Tree2) =>
1035
+ Tree2 = t(Nil,Tree),
1036
+ Nil = black('', _, _, ''),
1037
+ Ar =.. [seq|List],
1038
+ functor(Ar,_,L),
1039
+ Height is truncate(log(L)/log(2)),
1040
+ construct_rbtree(1, L, Ar, Height, Nil, Tree).
1041
+
1042
+ construct_rbtree(L, M, _, _, Nil, Nil) :- M < L, !.
1043
+ construct_rbtree(L, L, Ar, Depth, Nil, Node) :-
1044
+ !,
1045
+ arg(L, Ar, K-Val),
1046
+ build_node(Depth, Nil, K, Val, Nil, Node).
1047
+ construct_rbtree(I0, Max, Ar, Depth, Nil, Node) :-
1048
+ I is (I0+Max)//2,
1049
+ arg(I, Ar, K-Val),
1050
+ build_node(Depth, Left, K, Val, Right, Node),
1051
+ I1 is I-1,
1052
+ NewDepth is Depth-1,
1053
+ construct_rbtree(I0, I1, Ar, NewDepth, Nil, Left),
1054
+ I2 is I+1,
1055
+ construct_rbtree(I2, Max, Ar, NewDepth, Nil, Right).
1056
+
1057
+ build_node( 0, Left, K, Val, Right, red(Left, K, Val, Right)) :- !.
1058
+ build_node( _, Left, K, Val, Right, black(Left, K, Val, Right)).
1059
+
1060
+
1061
+ %! rb_size(+Tree, -Size) is det.
1062
+ %
1063
+ % Size is the number of elements in Tree.
1064
+
1065
+ :- det(rb_size/2).
1066
+ rb_size(t(_,T),Size) =>
1067
+ size(T,0,Size).
1068
+
1069
+ size(black('',_,_,_),Sz,Sz) :- !.
1070
+ size(red(L,_,_,R),Sz0,Szf) :-
1071
+ Sz1 is Sz0+1,
1072
+ size(L,Sz1,Sz2),
1073
+ size(R,Sz2,Szf).
1074
+ size(black(L,_,_,R),Sz0,Szf) :-
1075
+ Sz1 is Sz0+1,
1076
+ size(L,Sz1,Sz2),
1077
+ size(R,Sz2,Szf).
1078
+
1079
+ %! is_rbtree(@Term) is semidet.
1080
+ %
1081
+ % True if Term is a valid Red-Black tree. Processes the entire tree,
1082
+ % checking the coloring of the nodes, the balance and the ordering of
1083
+ % keys. Does _not_ validate that keys are sufficiently instantiated
1084
+ % to ensure the tree remains valid if a key is further instantiated.
1085
+
1086
+ is_rbtree(X), var(X) =>
1087
+ fail.
1088
+ is_rbtree(t(Nil,Nil)) => true.
1089
+ is_rbtree(t(_,T)) =>
1090
+ Err = error(_,_),
1091
+ catch(check_rbtree(T), Err, is_rbtree_error(Err)).
1092
+ is_rbtree(_) =>
1093
+ fail.
1094
+
1095
+ is_rbtree_error(Err), Err = error(resource_error(_),_) => throw(Err).
1096
+ is_rbtree_error(_) => fail.
1097
+
1098
+ % This code checks if a tree is ordered and a rbtree
1099
+
1100
+ check_rbtree(black(L,K,_,R)) =>
1101
+ find_path_blacks(L, 0, Bls),
1102
+ check_rbtree(L,-inf,K,Bls),
1103
+ check_rbtree(R,K,+inf,Bls).
1104
+ check_rbtree(Node), Node = red(_,_,_,_) =>
1105
+ domain_error(rb_black, Node).
1106
+
1107
+
1108
+ find_path_blacks(black('',_,_,''), Bls0, Bls) => Bls = Bls0.
1109
+ find_path_blacks(black(L,_,_,_), Bls0, Bls) =>
1110
+ Bls1 is Bls0+1,
1111
+ find_path_blacks(L, Bls1, Bls).
1112
+ find_path_blacks(red(L,_,_,_), Bls0, Bls) =>
1113
+ find_path_blacks(L, Bls0, Bls).
1114
+
1115
+ check_rbtree(black('',_,_,''),Min,Max,Bls0) =>
1116
+ check_height(Bls0,Min,Max).
1117
+ check_rbtree(red(L,K,_,R),Min,Max,Bls) =>
1118
+ check_val(K,Min,Max),
1119
+ check_red_child(L),
1120
+ check_red_child(R),
1121
+ check_rbtree(L,Min,K,Bls),
1122
+ check_rbtree(R,K,Max,Bls).
1123
+ check_rbtree(black(L,K,_,R),Min,Max,Bls0) =>
1124
+ check_val(K,Min,Max),
1125
+ Bls is Bls0-1,
1126
+ check_rbtree(L,Min,K,Bls),
1127
+ check_rbtree(R,K,Max,Bls).
1128
+
1129
+ check_height(0,_,_) => true.
1130
+ check_height(Bls0,Min,Max) =>
1131
+ throw(error(rbtree(balance(Bls0, Min, Max)), _)).
1132
+
1133
+ check_val(K, Min, Max), (K @> Min ; Min == -inf), (K @< Max ; Max == +inf) =>
1134
+ true.
1135
+ check_val(K, Min, Max) =>
1136
+ throw(error(rbtree(order(K, Min, Max)), _)).
1137
+
1138
+ check_red_child(black(_,_,_,_)) => true.
1139
+ check_red_child(Node), Node = red(_,_,_,_) =>
1140
+ domain_error(rb_black, Node).
1141
+
1142
+
1143
+ /*******************************
1144
+ * MESSAGES *
1145
+ *******************************/
1146
+
1147
+ :- multifile
1148
+ prolog:error_message//1.
1149
+
1150
+ prolog:error_message(rbtree(balance(Bls0, Min, Max))) -->
1151
+ [ 'Unbalance ~d between ~w and ~w'-[Bls0,Min,Max] ].
1152
+ prolog:error_message(rbtree(order(K, Min, Max))) -->
1153
+ [ 'not ordered: ~w not between ~w and ~w'-[K,Min,Max] ].