changeset 11868:70dedbc831e9 draft

<ais523> ` mv ibin/brachylog interps/brachylog
author HackEso <hackeso@esolangs.org>
date Tue, 16 Jul 2019 21:39:11 +0000
parents b0414b6b332f
children eb85287abe67
files ibin/brachylog/Brachylog-master/.gitignore ibin/brachylog/Brachylog-master/LICENSE ibin/brachylog/Brachylog-master/README.md ibin/brachylog/Brachylog-master/misc/brachylog_logo.png ibin/brachylog/Brachylog-master/misc/brachylog_logo.svg ibin/brachylog/Brachylog-master/misc/brachylog_mini_logo.png ibin/brachylog/Brachylog-master/src/brachylog.pl ibin/brachylog/Brachylog-master/src/constraint_variables.pl ibin/brachylog/Brachylog-master/src/metapredicates.pl ibin/brachylog/Brachylog-master/src/predicates.pl ibin/brachylog/Brachylog-master/src/symbols.pl ibin/brachylog/Brachylog-master/src/tests.pl ibin/brachylog/Brachylog-master/src/tokenize.pl ibin/brachylog/Brachylog-master/src/transpile.pl ibin/brachylog/Brachylog-master/src/utils.pl ibin/brachylog/master.zip interps/brachylog/brachylog/Brachylog-master/.gitignore interps/brachylog/brachylog/Brachylog-master/LICENSE interps/brachylog/brachylog/Brachylog-master/README.md interps/brachylog/brachylog/Brachylog-master/misc/brachylog_logo.png interps/brachylog/brachylog/Brachylog-master/misc/brachylog_logo.svg interps/brachylog/brachylog/Brachylog-master/misc/brachylog_mini_logo.png interps/brachylog/brachylog/Brachylog-master/src/brachylog.pl interps/brachylog/brachylog/Brachylog-master/src/constraint_variables.pl interps/brachylog/brachylog/Brachylog-master/src/metapredicates.pl interps/brachylog/brachylog/Brachylog-master/src/predicates.pl interps/brachylog/brachylog/Brachylog-master/src/symbols.pl interps/brachylog/brachylog/Brachylog-master/src/tests.pl interps/brachylog/brachylog/Brachylog-master/src/tokenize.pl interps/brachylog/brachylog/Brachylog-master/src/transpile.pl interps/brachylog/brachylog/Brachylog-master/src/utils.pl interps/brachylog/brachylog/master.zip
diffstat 32 files changed, 6476 insertions(+), 6476 deletions(-) [+]
line wrap: on
line diff
--- a/ibin/brachylog/Brachylog-master/.gitignore	Tue Jul 16 21:38:16 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-*.class
-
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
-
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
-
-compiled_brachylog.pl
-*.brachylog
-*.aux
-*.bbl
-*.blg
-*.log
-*.gz
-src/compiled_brachylog_eval.pl
--- a/ibin/brachylog/Brachylog-master/LICENSE	Tue Jul 16 21:38:16 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2016 - 2019 Julien Cumin
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
--- a/ibin/brachylog/Brachylog-master/README.md	Tue Jul 16 21:38:16 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-<p align="center"><a href="https://github.com/JCumin/Brachylog"><img src="https://github.com/JCumin/Brachylog/blob/master/misc/brachylog_logo.png" alt="Brachylog" width="600"/></a></p>
-
-# What is it?
-
-Brachylog is a declarative logic programming language much like Prolog. Brachylog is designed to be much terser than Prolog, while retaining some readability.
-
-Currently in development.
-
-Brachylog uses [SWI-Prolog](http://www.swi-prolog.org/) as Prolog engine.
-
-## How do I use this?
-
-### Documentation
-
-Check out [Brachylog's Wiki](https://github.com/JCumin/Brachylog/wiki) if you want to learn how to write programs in this language.
-
-You may want to watch this [**short video introduction to Brachylog**](https://www.youtube.com/watch?v=XYVhZ-MFcUs).
-
-### Try it online!
-
-You can try out Brachylog on [Try it online!](https://tio.run/nexus/brachylog2), thanks to @DennisMitchell.
-
-### Brachylog language bar
-
-[You can find here](https://abrudz.github.io/lb/brachylog) the Brachylog language bar which gives you access to all symbols used in Brachylog on any webpage (by clicking on the symbols or by inputing shortcuts), thanks to @abrudz.
-
-### The interpreter
-
-Brachylog's interpreter is entirely written in Prolog. Therefore, installing [SWI-Prolog](http://www.swi-prolog.org/) (version 7 and up) is mandatory to use Brachylog (We do not guarantee that Brachylog's interpreter will be compatible with any other Prolog implementation).
-
-To run Brachylog's interpreter, start SWI-Prolog's interpreter inside the `src` directory available in this repository, and consult the file `brachylog.pl` (`consult(brachylog).`). Alternatively, you can run the interpreter with:
-
-    $ swipl src/brachylog.pl
-
-You can then run Brachylog programs using different predicates:
-
- - `run_from_file(FileName, Input, Output)`: `FileName` is an atom (i.e. between single quotes `'`) representing the file containing your Brachylog code. For example: `run_from_file('code.brachylog',"Test Input",Z)`.
- 
- - `run_from_atom(Code, Input, Output)`: `Code` is an atom (i.e. between single quotes `'`) containing your Brachylog code. For example: `run_from_atom('∧"Hello, World!"w',_,_)`. Note that you will have to escape certain characters in `Code`.
-
- - `run(Input, Output)`: This will run a Brachylog program that has already been transpiled to Prolog using either of the two previous predicates. More precisely, this will query `brachylog_main/2` in the file `compiled_brachylog.pl`.
-
-The first two predicates will transpile your Brachylog program into Prolog, subsequently generating a file called `compiled_brachylog.pl` in the same directory that contains `brachylog.pl`. The three run predicates will then consult it and query `brachylog_main/3`.
- 
-Note that the first two run predicates also exist with either no `Output` argument, or with no `Input` nor `Output` argument, if necessary. For example, `run_from_file('code.brachylog')` is equivalent to `run_from_file('code.brachylog', _, _)`.
-
-
-### Contributors
-
-- Julien Cumin - [@JCumin](https://github.com/JCumin)
-
-- Markus Triska - [@triska](https://github.com/triska)
-
-- ais523
-
-- [@UnrelatedString](https://github.com/UnrelatedString)
Binary file ibin/brachylog/Brachylog-master/misc/brachylog_logo.png has changed
--- a/ibin/brachylog/Brachylog-master/misc/brachylog_logo.svg	Tue Jul 16 21:38:16 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="210mm"
-   height="297mm"
-   viewBox="0 0 744.09448819 1052.3622047"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="brachylog_logo.svg">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="213.76996"
-     inkscape:cy="516.56084"
-     inkscape:document-units="px"
-     inkscape:current-layer="g3417-5"
-     showgrid="false"
-     inkscape:window-width="1280"
-     inkscape:window-height="961"
-     inkscape:window-x="-8"
-     inkscape:window-y="-8"
-     inkscape:window-maximized="1"
-     inkscape:snap-global="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid3415" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Calque 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <g
-       style="font-style:normal;font-weight:normal;font-size:90px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       id="text3336">
-      <g
-         style="font-style:normal;font-weight:normal;font-size:90px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         id="g3417-5"
-         transform="translate(-9.882771,-189.29487)">
-        <path
-           id="path3380-6"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
-           d="m 145.5671,341.02921 0,24.03808 14.23828,0 q 7.16309,0 10.59082,-2.94433 3.47168,-2.98829 3.47168,-9.09668 0,-6.15235 -3.47168,-9.05274 -3.42773,-2.94433 -10.59082,-2.94433 l -14.23828,0 z m 0,-26.98243 0,19.77539 13.13965,0 q 6.50391,0 9.66797,-2.41699 3.20801,-2.46094 3.20801,-7.4707 0,-4.96582 -3.20801,-7.42676 -3.16406,-2.46094 -9.66797,-2.46094 l -13.13965,0 z m -8.87695,-7.29492 22.67578,0 q 10.15137,0 15.64453,4.21875 5.49316,4.21875 5.49316,11.99707 0,6.02051 -2.8125,9.58008 -2.8125,3.55957 -8.26171,4.43848 6.54785,1.40625 10.15136,5.88867 3.64746,4.43848 3.64746,11.11816 0,8.78907 -5.97656,13.5791 -5.97656,4.79004 -17.00684,4.79004 l -23.55468,0 0,-65.61035 z"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path3382-5"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
-           d="m 224.18526,349.29092 q 2.10938,0.43946 4.61426,2.98829 2.54883,2.54882 4.7461,6.63574 l 7.64648,13.44726 -8.56934,0 -7.11914,-12.6123 q -3.25195,-5.625 -5.97656,-6.89942 -2.68066,-1.27441 -6.24023,-1.27441 l -7.42676,0 0,20.78613 -8.12988,0 0,-49.21875 17.05078,0 q 9.58008,0 14.28222,3.47168 4.70215,3.47168 4.70215,10.72266 0,4.61426 -2.46093,7.69043 -2.46094,3.07617 -7.11915,4.26269 z m -18.32519,-19.33593 0,14.80957 8.70117,0 q 5.22949,0 7.99805,-1.88965 2.8125,-1.88965 2.8125,-5.31738 0,-3.38379 -2.59278,-5.49317 -2.54882,-2.10937 -8.21777,-2.10937 l -8.70117,0 z"
-           inkscape:connector-curvature="0" />
-        <path
-           sodipodi:nodetypes="ccccccccc"
-           inkscape:connector-curvature="0"
-           id="path3384-5"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
-           d="m 270.50362,331.05362 -10.89843,29.22363 -4.48243,12.08496 -8.56933,0 18.45703,-49.21875 10.98633,0 18.45703,49.21875 -8.56934,0 -4.48242,-12.08496" />
-        <path
-           id="path3386-9"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
-           d="m 341.03585,325.03311 0,7.5586 q -3.42773,-1.88965 -6.89941,-2.8125 -3.42774,-0.9668 -6.94336,-0.9668 -7.86621,0 -12.2168,5.00976 -4.35059,4.96582 -4.35059,13.97461 0,9.00879 4.35059,14.01856 4.35059,4.96582 12.2168,4.96582 3.51562,0 6.94336,-0.92285 3.47168,-0.9668 6.89941,-2.85645 l 0,7.4707 q -3.38379,1.58204 -7.03125,2.37305 -3.60352,0.79102 -7.69043,0.79102 -11.11816,0 -17.66601,-6.98731 -6.54786,-6.9873 -6.54786,-18.85254 0,-12.04101 6.5918,-18.94043 6.63574,-6.89941 18.14941,-6.89941 3.73536,0 7.29493,0.79102 3.55957,0.74707 6.89941,2.28515 z"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path3388-2"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
-           d="m 354.87862,323.14346 8.12989,0 0,20.08301 26.23535,0 0,-20.08301 8.12988,0 0,49.21875 -8.12988,0 0,-22.67578 -26.23535,0 0,22.67578 -8.12989,0 0,-49.21875 z"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path3392-1"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
-           d="m 468.96066,323.14346 8.08593,0 0,42.75879 28.08106,0 0,6.45996 -36.16699,0 0,-49.21875 z"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path3394-9"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
-           d="m 534.04366,328.81241 q -6.5039,0 -10.2832,5.09765 -3.7793,5.05372 -3.7793,13.88672 0,8.83301 3.73535,13.93067 3.7793,5.05371 10.32715,5.05371 6.45996,0 10.23926,-5.09766 3.7793,-5.09765 3.7793,-13.88672 0,-8.74511 -3.7793,-13.84277 -3.7793,-5.1416 -10.23926,-5.1416 z m 0,-6.85547 q 10.54688,0 16.56739,6.85547 6.0205,6.85547 6.0205,18.98437 0,12.08496 -6.0205,18.98438 -6.02051,6.85547 -16.56739,6.85547 -10.59082,0 -16.61133,-6.85547 -5.97656,-6.89942 -5.97656,-18.98438 0,-12.1289 5.97656,-18.98437 6.02051,-6.85547 16.61133,-6.85547 z"
-           inkscape:connector-curvature="0" />
-        <path
-           id="path3396-6"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
-           d="m 602.68624,365.41885 0,-11.99707 -6.81152,0 0,-6.15234 14.10644,0 0,23.20312 q -4.43847,1.58204 -9.18457,2.37305 -4.70215,0.79102 -10.10742,0.79102 -11.11816,0 -17.66601,-6.98731 -6.54786,-6.9873 -6.54786,-18.85254 0,-12.04101 6.5918,-18.94043 6.63574,-6.89941 18.14941,-6.89941 4.57032,0 8.87696,1.23047 4.35058,1.18652 8.4375,3.60351 l 0,7.47071 q -4.17481,-2.72461 -8.39356,-4.08692 -4.21875,-1.3623 -8.56933,-1.3623 -7.86621,0 -12.2168,5.00976 -4.35059,4.96582 -4.35059,13.97461 0,9.00879 4.35059,14.01856 4.35059,4.96582 12.2168,4.96582 3.47168,0 6.19629,-0.30762 2.72461,-0.35156 4.92187,-1.05469 z"
-           inkscape:connector-curvature="0" />
-        <path
-           sodipodi:nodetypes="ccccccccc"
-           inkscape:connector-curvature="0"
-           id="path3384-7-0"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:90px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 432.34529,364.45205 -10.89843,-29.22363 -4.48243,-12.08496 -8.56933,0 18.45703,49.21875 10.98633,0 18.45703,-49.21875 -8.56934,0 -4.48242,12.08496" />
-        <path
-           sodipodi:nodetypes="ccccc"
-           inkscape:connector-curvature="0"
-           id="path3384-7-0-5"
-           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:90px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 430.60403,391.65537 4.61443,-12.00213 -8.538,0 -5.34889,14.08953 c 5.72973,-1.50186 5.73359,-1.40086 9.27246,-2.0874 z" />
-        <g
-           id="g4830"
-           inkscape:export-xdpi="500"
-           inkscape:export-ydpi="500">
-          <path
-             d="m 350.7536,579.12368 -10.89844,29.22363 -4.48243,12.08496 -8.56933,0 18.45703,-49.21875 10.98633,0 18.45703,49.21875 -8.56934,0 -4.48242,-12.08496"
-             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:90px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-             id="path3384-5-9"
-             inkscape:connector-curvature="0"
-             sodipodi:nodetypes="ccccccccc" />
-          <g
-             transform="translate(-96.140005,-259.89081)"
-             id="g4792">
-            <path
-               sodipodi:nodetypes="ccccccccc"
-               inkscape:connector-curvature="0"
-               id="path3384-7-0-2"
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:90px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-               d="m 446.8936,857.40659 -10.89843,-29.22363 -4.48243,-12.08496 -8.56933,0 18.45703,49.21875 10.98633,0 18.45703,-49.21875 -8.56934,0 -4.48242,12.08496" />
-            <path
-               sodipodi:nodetypes="ccccc"
-               inkscape:connector-curvature="0"
-               id="path3384-7-0-5-4"
-               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:90px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-               d="m 446.92011,880.32308 2.84666,-7.7153 -8.538,0 -2.69264,7.68328 z" />
-          </g>
-        </g>
-      </g>
-      <path
-         style="font-style:normal;font-weight:normal;font-size:90px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 592.80738,190.35837 0,7.70896 -466,0 0,7.291 473.291,0 0,-14.99996"
-         id="path3428-2"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="cccccc" />
-      <path
-         style="font-style:normal;font-weight:normal;font-size:90px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 134.09599,190.35556 0,7.70896 466,0 0,7.291 -473.291,0 0,-14.99996"
-         id="path3428-2-2"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="cccccc" />
-    </g>
-  </g>
-</svg>
Binary file ibin/brachylog/Brachylog-master/misc/brachylog_mini_logo.png has changed
--- a/ibin/brachylog/Brachylog-master/src/brachylog.pl	Tue Jul 16 21:38:16 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,218 +0,0 @@
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-____            ____
-\   \          /   /
- \   \  ____  /   /
-  \   \/    \/   /
-   \     /\     /     BRACHYLOG       
-    \   /  \   /      A terse declarative logic programming language
-    /   \  /   \    
-   /     \/     \     Written by Julien Cumin - 2017
-  /   /\____/\   \    https://github.com/JCumin/Brachylog
- /   /  ___   \   \
-/___/  /__/    \___\
-     
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-
-:- use_module(transpile).
-:- use_module(symbols).
-:- use_module(utils).
-:- use_module(predicates).
-:- use_module(metapredicates).
-:- use_module(constraint_variables).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   RUN_FROM_FILE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-run_from_file(FilePath) :-
-    run_from_file(FilePath, 'ignore', 'ignore').
-run_from_file(FilePath, Input) :-
-    run_from_file(FilePath, Input, 'ignore').
-run_from_file(FilePath, Input, Output) :-
-    read_file(FilePath, Code),
-    !,
-    run_from_atom(Code, Input, Output).
-    
-    
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   RUN_FROM_ATOM
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-run_from_atom(Code) :-
-    run_from_atom(Code, 'ignore', 'ignore').
-run_from_atom(Code, Input) :-
-    run_from_atom(Code, Input, 'ignore').
-run_from_atom(Code, Input, Output) :-
-    parse(Code, 'compiled_brachylog.pl'),
-    !,
-    run(Input, Output).
-    
-    
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   RUN
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-run(Input, Output) :-
-    set_prolog_flag(answer_write_options, [quoted(true),
-                                           portray(true),
-                                           max_depth(10),
-                                           spacing(next_argument),
-                                           max_depth(0)]),
-    set_prolog_flag(print_write_options, [portray(true),
-                                          quoted(true),
-                                          numbervars(true),
-                                          max_depth(0)]),
-    consult('compiled_brachylog.pl'),
-    (   \+ var(Input),
-        Input \= 'ignore',
-        parse_argument(Input, ParsedInput)
-    ;   true
-    ),
-    (   \+ var(Output),
-        Output \= 'ignore',
-        parse_argument(Output, ParsedOutput)
-    ;   true
-    ),
-    !,
-    call(brachylog_main, _, _, ParsedInput, ParsedOutput),
-    (   var(Input) ->
-        brachylog_prolog_variable(ParsedInput, Input)
-    ;   true
-    ),
-    (   var(Output) ->
-        brachylog_prolog_variable(ParsedOutput, Output)
-    ;   true
-    ).
-    
-    
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   RUN_FROM_FILES_NO_FILE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-run_from_files_no_file(FilePath, InputPath, OutputPath) :-
-    read_file(FilePath, Atom),
-    !,
-    (   read_file(InputPath, Input),
-        Input \= ''
-    ;   Input = 'ignore'
-    ),
-    !,
-    (   read_file(OutputPath, Output),
-        Output \= ''
-    ;   Output = 'ignore'
-    ),
-    !,
-    parse_no_file(Atom, Predicates),
-    !,
-    (   contains_write(Atom) ->
-        ContainsWrite = 'yes'
-    ;   ContainsWrite = 'no'
-    ),
-    !,
-    set_prolog_flag(answer_write_options, [quoted(true),
-                                           portray(true),
-                                           max_depth(10),
-                                           spacing(next_argument),
-                                           max_depth(0)]),
-    set_prolog_flag(print_write_options, [portray(true),
-                                          quoted(true),
-                                          numbervars(true),
-                                          max_depth(0)]),
-    maplist(atomic_list_concat, Predicates, ConcatenatedPredicates),
-    maplist(read_term_from_atom_, ConcatenatedPredicates, AssertablePredicates),
-    maplist(assertz, AssertablePredicates),
-    (   Input \= 'ignore',
-        parse_argument(Input, ParsedInput),
-        \+ var(ParsedInput),
-        ReportInput = 'no'
-    ;   Input == 'ignore',
-        ReportInput = 'no'
-    ;   ReportInput = 'yes',
-        true
-    ),
-    (   Output \= 'ignore',
-        parse_argument(Output, ParsedOutput),
-        \+ var(ParsedOutput),
-        ReportOutput = 'no'
-    ;   Output == 'ignore',
-        ReportOutput = 'no'
-    ;   ReportOutput = 'yes',
-        true
-    ),
-    !,
-    (   call(brachylog_main, _, _, ParsedInput, ParsedOutput) ->
-        (   ReportInput = 'yes' ->
-            brachylog_prolog_variable(ParsedInput, InputProlog)
-        ;   true
-        ),
-        (   ReportOutput = 'yes' ->
-            brachylog_prolog_variable(ParsedOutput, OutputProlog)
-        ;   true
-        ),
-        (   ReportInput = 'yes',
-            Bindings = [Input=InputProlog]
-        ;   Bindings = []
-        ),
-        (   ReportOutput = 'yes',
-            BindingsFinal = [Output=OutputProlog|Bindings]
-        ;   BindingsFinal = Bindings,
-            true
-        ),
-        (   (ReportInput = 'yes' ; ReportOutput = 'yes'),
-            write('\n')
-        ;   true  
-        ),
-        reverse(BindingsFinal, RBindings),
-        report_bindings(RBindings),
-        (   ReportInput = 'no',
-            ReportOutput = 'no',
-            ContainsWrite = 'no',
-            write('true.')
-        ;   true
-        )
-    ;   (   ContainsWrite = 'no',
-            write('false.')
-        ;   true
-        )
-    ).
-
-read_term_from_atom_(A, B) :-
-    read_term_from_atom(A, B, []).
-
-% Credits to M. Triska
-% See: http://stackoverflow.com/a/38284692/2554145
-report_bindings(NameVars) :-
-    phrase(bindings(NameVars), Bs),
-    format("~s", [Bs]).
-
-bindings([])            --> [].
-bindings([E])           --> name_var(E).
-bindings([E1,E2|Rest]) --> name_var(E1), ",\n", bindings([E2|Rest]).
-
-name_var(Name=Var) -->
-    format_("~w = ~q", [Name,Var]).
-
-format_(Format, Ls) -->
-    call(format_codes(Format, Ls)).
-
-format_codes(Format, Ls, Cs0, Cs) :-
-    format(codes(Cs0, Cs), Format, Ls).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   READ_FILE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-read_file(FilePath, Code) :-
-    (   exists_file(FilePath),
-        open(FilePath, read, File),
-        read_file_(File, Chars),
-        close(File),
-        atomic_list_concat(Chars, Code)
-    ;   throw('The file does not exist.')
-    ),
-    !.
-
-read_file_(File, []) :-
-    at_end_of_stream(File).
-read_file_(File, [H|T]) :-
-    \+ at_end_of_stream(File),
-    get_char(File, H),
-    read_file_(File, T).
--- a/ibin/brachylog/Brachylog-master/src/constraint_variables.pl	Tue Jul 16 21:38:16 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-____            ____
-\   \          /   /
- \   \  ____  /   /
-  \   \/    \/   /
-   \     /\     /     BRACHYLOG       
-    \   /  \   /      A terse declarative logic programming language
-    /   \  /   \    
-   /     \/     \     Written by Julien Cumin - 2017
-  /   /\____/\   \    https://github.com/JCumin/Brachylog
- /   /  ___   \   \
-/___/  /__/    \___\
-     
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-
-:- module(constraint_variables, [constraintA/1,
-                                 constraintB/1,
-                                 constraintC/1,
-                                 constraintD/1,
-                                 constraintE/1,
-                                 constraintF/1,
-                                 constraintG/1,
-                                 constraintH/1,
-                                 constraintI/1,
-                                 constraintJ/1, % Unused
-                                 constraintK/1, % Unused
-                                 constraintL/1, % Unused
-                                 constraintM/1,
-                                 constraintN/1,
-                                 constraintO/1,
-                                 constraintP/1,
-                                 constraintQ/1, % Unused
-                                 constraintR/1,
-                                 constraintS/1,
-                                 constraintT/1,
-                                 constraintU/1, % Unused
-                                 constraintV/1, % Unused
-                                 constraintW/1,
-                                 constraintX/1,
-                                 constraintY/1,
-                                 constraintZ/1
-                                ]).
-                       
-:- use_module(library(clpfd)).
-:- use_module(utils).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   CONSTRAINT[A-Z]/1
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-constraintA(_) :-
-    true.
-
-
-constraintB(_) :-
-    true.
-
-
-constraintC([_,_]).
-
-
-constraintD('integer':X) :-
-    X in 0..9.
-
-
-constraintE([]).
-
-
-constraintF(_) :-
-    true.
-
-
-constraintG(_) :-
-    true.
-
-
-constraintH(_) :-
-    true.
-
-
-constraintI('integer':X) :-
-    X in inf..sup.
-
-
-constraintJ(_) :- % Unused
-    true.
-
-
-constraintK(_) :- % Unused
-    true.
-
-
-constraintL(_) :- % Unused
-    true.
-
-
-constraintM([_,_|_]).
-
-
-constraintN(_) :-
-    true.
-
-
-constraintO([_]).
-
-
-constraintP(_) :-
-    true.
-
-
-constraintQ(_) :- % Unused
-    true.
-
-
-constraintR(_) :-
-    true.
-
-
-constraintS('string':_).
-
-
-constraintT([_,_,_]).
-
-
-constraintU(_) :- % Unused
-    true.
-
-
-constraintV(_) :- % Unused
-    true.
-
-
-constraintW(_) :-
-    true.
-
-
-constraintX(_) :-
-    true.
-
-
-constraintY(_) :-
-    true.
-
-
-constraintZ(_) :-
-    true.
--- a/ibin/brachylog/Brachylog-master/src/metapredicates.pl	Tue Jul 16 21:38:16 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,690 +0,0 @@
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-____            ____
-\   \          /   /
- \   \  ____  /   /
-  \   \/    \/   /
-   \     /\     /     BRACHYLOG
-    \   /  \   /      A terse declarative logic programming language
-    /   \  /   \
-   /     \/     \     Written by Julien Cumin - 2017
-  /   /\____/\   \    https://github.com/JCumin/Brachylog
- /   /  ___   \   \
-/___/  /__/    \___\
-
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-
-:- module(metapredicates, [brachylog_meta_accumulate/6,
-                           brachylog_meta_bagof/6,
-                           brachylog_meta_count/6,
-                           brachylog_meta_declare/6,
-                           brachylog_meta_existence/6,
-                           brachylog_meta_find/6,
-                           brachylog_meta_groupby/6,
-                           brachylog_meta_head/6,
-                           brachylog_meta_iterate/6,
-                           brachylog_meta_leftfold/6,
-                           brachylog_meta_map/6,
-                           brachylog_meta_nonexistence/6,
-                           brachylog_meta_orderby/6,
-                           brachylog_meta_select/6,
-                           brachylog_meta_tail/6,
-                           brachylog_meta_unique/6,
-                           brachylog_meta_verify/6,
-                           brachylog_meta_zip/6
-                          ]).
-
-:- use_module(library(clpfd)).
-:- use_module(predicates).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_ACCUMULATE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_accumulate(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_accumulate(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_accumulate(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_accumulate(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_accumulate(GlobalVariables, 'default', P, Sub, Input, Output) :-
-    brachylog_meta_accumulate(GlobalVariables, 'integer':1, P, Sub, Input, Output).
-brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, 'string':Input, Output) :-
-    brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, ['string':Input], Output).
-brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, 'integer':Input, Output) :-
-    brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, ['integer':Input], Output).
-brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, 'float':Input, Output) :-
-    brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, ['float':Input], Output).
-brachylog_meta_accumulate(_, 'integer':0, _P, _Sub, Input, Input).
-brachylog_meta_accumulate(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
-    I #> 0,
-    is_brachylog_list(Input),
-    (   GlobalVariables = 'ignore',
-        call(P, Sub, Input, E)
-    ;   dif(GlobalVariables, 'ignore'),
-        call(P, GlobalVariables, Sub, Input, E)
-    ),
-    J #= I - 1,
-    append(Input, [E], F),
-    brachylog_meta_accumulate(GlobalVariables, 'integer':J, P, Sub, F, Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_BAGOF
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_bagof(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_bagof(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_bagof(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_bagof(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_bagof(_, 'integer':0, _, _, _, []).
-brachylog_meta_bagof(GlobalVariables, 'default', P, Sub, Input, Output) :-
-    bagof(X,
-        (   GlobalVariables = 'ignore',
-            call(P, Sub, Input, X)
-        ;   dif(GlobalVariables, 'ignore'),
-            call(P, GlobalVariables, Sub, Input, X)
-        ),
-        Output).
-brachylog_meta_bagof(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
-    I #> 0,
-    bagof(X, call_firstn(
-        (   GlobalVariables = 'ignore',
-            call(P, Sub, Input, X)
-        ;   dif(GlobalVariables, 'ignore'),
-            call(P, GlobalVariables, Sub, Input, X)
-        ), I),
-        Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_COUNT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_count(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_count(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_count(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_count(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_count(GlobalVariables, 'default', P, Sub, Input, Output) :-
-    brachylog_meta_count(GlobalVariables, 'integer':0, P, Sub, Input, Output).
-brachylog_meta_count(GlobalVariables, 'integer':0, P, Sub, Input, Output) :-
-    brachylog_meta_find(GlobalVariables, 'default', P, Sub, Input, E),
-    brachylog_length('default', E, Output).
-brachylog_meta_count(GlobalVariables, 'integer':1, P, Sub, Input, Output) :-
-    brachylog_meta_unique(GlobalVariables, 'default', P, Sub, Input, E),
-    brachylog_length('default', E, Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_DECLARE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_declare(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_declare(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_declare(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_declare(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_declare(GlobalVariables, 'default', P, Sub, [H,T], T) :-
-    (   GlobalVariables = 'ignore',
-        call(P, Sub, H, T)
-    ;   dif(GlobalVariables, 'ignore'),
-        call(P, GlobalVariables, Sub, H, T)
-    ).
-brachylog_meta_declare(GlobalVariables, 'integer':0, P, Sub, [H,T], [H,T]) :-
-    (   GlobalVariables = 'ignore',
-        call(P, Sub, H, T)
-    ;   dif(GlobalVariables, 'ignore'),
-        call(P, GlobalVariables, Sub, H, T)
-    ).
-brachylog_meta_declare(GlobalVariables, 'integer':1, P, Sub, [H,T], H) :-
-    (   GlobalVariables = 'ignore',
-        call(P, Sub, T, H)
-    ;   dif(GlobalVariables, 'ignore'),
-        call(P, GlobalVariables, Sub, T, H)
-    ).
-brachylog_meta_declare(GlobalVariables, 'integer':2, P, Sub, [H,T], [H,T]) :-
-    (   GlobalVariables = 'ignore',
-        call(P, Sub, T, H)
-    ;   dif(GlobalVariables, 'ignore'),
-        call(P, GlobalVariables, Sub, T, H)
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_EXISTENCE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_existence(GlobalVariables, 'first', P, Sub, [I|Input], Arg) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_existence(GlobalVariables, P, Sub, Arg, I).
-brachylog_meta_existence(GlobalVariables, 'last', P, Sub, Input, Arg) :-
-    reverse(Input, [I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_existence(GlobalVariables, P, Sub, Arg, I).
-brachylog_meta_existence(GlobalVariables, 'integer':I, P, Sub, Input, Input) :-
-    dif(I, 'default'),
-    brachylog_meta_existence(GlobalVariables, P, Sub, Input, 'integer':I).
-brachylog_meta_existence(GlobalVariables, 'default', P, Sub, Input, Output) :-
-    brachylog_meta_existence(GlobalVariables, P, Sub, Input, Output).
-
-brachylog_meta_existence(GlobalVariables, P, Sub, Input, Output) :-
-    brachylog_in('default', Input, E),
-    (   GlobalVariables = 'ignore',
-        call(P, Sub, E, Output)
-    ;   dif(GlobalVariables, 'ignore'),
-        call(P, GlobalVariables, Sub, E, Output)
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_FIND
-
-   Credits to @false for call_firstf/2 and call_nth/2
-   http://stackoverflow.com/a/20866206/2554145
-   http://stackoverflow.com/a/11400256/2554145
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_find(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_find(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_find(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_find(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_find(_, 'integer':0, _, _, _, []).
-brachylog_meta_find(GlobalVariables, 'default', P, Sub, Input, Output) :-
-    findall(X,
-        (   GlobalVariables = 'ignore',
-            call(P, Sub, Input, X)
-        ;   dif(GlobalVariables, 'ignore'),
-            call(P, GlobalVariables, Sub, Input, X)
-        ),
-        Output).
-brachylog_meta_find(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
-    I #> 0,
-    findall(X, call_firstn(
-        (   GlobalVariables = 'ignore',
-            call(P, Sub, Input, X)
-        ;   dif(GlobalVariables, 'ignore'),
-            call(P, GlobalVariables, Sub, Input, X)
-        ), I),
-        Output).
-
-call_firstn(Goal_0, N) :-
-    N + N mod 1 >= 0,         % ensures that N >=0 and N is an integer
-    call_nth(Goal_0, Nth),
-    ( Nth == N -> ! ; true ).
-
-call_nth(Goal_0, C) :-
-    State = count(0, _),
-    Goal_0,
-    arg(1, State, C1),
-    C2 is C1+1,
-    nb_setarg(1, State, C2),
-    C = C2.
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_GROUPBY
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_groupby(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_groupby(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_groupby(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_groupby(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_groupby(GlobalVariables, 'default', P, Sub, Input, Output) :-
-    (   is_brachylog_list(Input) -> FixedInput = Input
-    ;   brachylog_elements('default', Input, FixedInput)
-    ),
-    brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L),
-    brachylog_zip('default', [L,Input], L2),
-    brachylog_meta_groupby_group(L2, L3),
-    maplist(brachylog_meta_groupby_tail, L3, Output).
-
-brachylog_meta_groupby_group(L, Gs) :-
-    brachylog_meta_groupby_group(L, [], Gs).
-
-brachylog_meta_groupby_group([], Gs, Gs).
-brachylog_meta_groupby_group([[G,H]|T], TempGs, Gs) :-
-    (   member(G:L, TempGs) ->
-        reverse(L, RL),
-        reverse([H|RL], L2),
-        select(G:L, TempGs, G:L2, TempGs2)
-    ;   append(TempGs, [G:[H]], TempGs2)
-    ),
-    brachylog_meta_groupby_group(T, TempGs2, Gs).
-
-brachylog_meta_groupby_tail(_:T, T).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_HEAD
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_head(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_head(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_head(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_head(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_head(GlobalVariables, 'default', P, Sub, Input, Output) :-
-    brachylog_meta_head(GlobalVariables, 'integer':1, P, Sub, Input, Output).
-brachylog_meta_head(_, 'integer':0, _, _, Input, Input).
-brachylog_meta_head(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
-    I #> 0,
-    brachylog_head('integer':I, Input, Heads),
-    brachylog_behead('integer':I, Input, Tails),
-    brachylog_meta_map(GlobalVariables, 'default', P, Sub, Heads, NewHeads),
-    brachylog_concatenate('default', [NewHeads,Tails], Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_ITERATE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_iterate(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_iterate(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_iterate(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_iterate(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_iterate(_, 'integer':0, _, _, Input, Input).
-brachylog_meta_iterate(GlobalVariables, 'default', P, Sub, Input, Output) :-
-    I #>= 1,
-    brachylog_meta_iterate(GlobalVariables, 'integer':I, P, Sub, Input, Output).
-brachylog_meta_iterate(GlobalVariables, 'integer':1, P, Sub, Input, Output) :-
-    (   GlobalVariables = 'ignore',
-        call(P, Sub, Input, Output)
-    ;   dif(GlobalVariables, 'ignore'),
-        call(P, GlobalVariables, Sub, Input, Output)
-    ).
-brachylog_meta_iterate(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
-    I #> 1,
-    (   GlobalVariables = 'ignore',
-        call(P, Sub, Input, TOutput)
-    ;   dif(GlobalVariables, 'ignore'),
-        call(P, GlobalVariables, Sub, Input, TOutput)
-    ),
-    J #= I - 1,
-    brachylog_meta_iterate(GlobalVariables, 'integer':J, P, Sub, TOutput, Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_LEFTFOLD
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_leftfold(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_leftfold(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_leftfold(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_leftfold(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, 'string':S, Output) :-
-    brachylog_elements('default', 'string':S, E),
-    brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, E, O),
-    (   brachylog_concatenate('default', O, X),
-        X = 'string':_ ->
-        Output = X
-    ;   Output = O
-    ).
-brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, 'integer':Input, Output) :-
-    brachylog_elements('default', 'integer':Input, E),
-    brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, E, O),
-    (   brachylog_concatenate('default', O, X),
-        X = 'integer':_ ->
-        Output = X
-    ;   Output = O
-    ).
-brachylog_meta_leftfold(_, 'default', _P, _Sub, [], []).
-brachylog_meta_leftfold(_, 'default', _P, _Sub, [X], [X]).
-brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, [H,I|T], Output) :-
-    brachylog_meta_leftfold_(GlobalVariables, P, Sub, [I|T], H, Output).
-
-brachylog_meta_leftfold_(_, _P, _Sub, [], Output, Output).
-brachylog_meta_leftfold_(GlobalVariables, P, Sub, [H|T], A, Output) :-
-    (   GlobalVariables = 'ignore',
-        call(P, Sub, [A,H], E)
-    ;   dif(GlobalVariables, 'ignore'),
-        call(P, GlobalVariables, Sub, [A,H], E)
-    ),
-    brachylog_meta_leftfold_(GlobalVariables, P, Sub, T, E, Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_MAP
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_map(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_map(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_map(GlobalVariables, 'integer':0, P, Sub, Input, Output) :-
-    (   GlobalVariables = 'ignore',
-        call(P, Sub, Input, Output)
-    ;   dif(GlobalVariables, 'ignore'),
-        call(P, GlobalVariables, Sub, Input, Output)
-    ).
-brachylog_meta_map(GlobalVariables, 'default', P, Sub, Input, Output) :-
-    brachylog_meta_map(GlobalVariables, 'integer':1, P, Sub, Input, Output).
-brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, 'string':S, Output) :-
-    brachylog_elements('default', 'string':S, E),
-    brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, E, O),
-    (   brachylog_concatenate('default', O, X),
-        X = 'string':_ ->
-        Output = X
-    ;   Output = O
-    ).
-brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, 'integer':Input, Output) :-
-    brachylog_elements('default', 'integer':Input, E),
-    brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, E, O),
-    (   brachylog_concatenate('default', O, X),
-        X = 'integer':_ ->
-        Output = X
-    ;   Output = O
-    ).
-brachylog_meta_map(GlobalVariables, 'integer':1, P, Sub, Input, Output) :-
-    (   GlobalVariables = 'ignore',
-        Pred =.. [P, Sub]
-    ;   dif(GlobalVariables, 'ignore'),
-        Pred =.. [P, GlobalVariables, Sub]
-    ),
-    is_brachylog_list(Input),
-    maplist(Pred, Input, Output).
-brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
-    I #> 1,
-    J #= I - 1,
-    is_brachylog_list(Input),
-    maplist(brachylog_meta_map(GlobalVariables, 'integer':J, P, Sub), Input, Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_NONEXISTENCE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_nonexistence(GlobalVariables, 'first', P, Sub, [I|Input], Arg) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_nonexistence(GlobalVariables, P, Sub, Arg, I).
-brachylog_meta_nonexistence(GlobalVariables, 'last', P, Sub, Input, Arg) :-
-    reverse(Input, [I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_nonexistence(GlobalVariables, P, Sub, Arg, I).
-brachylog_meta_nonexistence(GlobalVariables, 'integer':I, P, Sub, Input, Input) :-
-    dif(I, 'default'),
-    brachylog_meta_nonexistence(GlobalVariables, P, Sub, Input, 'integer':I).
-brachylog_meta_nonexistence(GlobalVariables, 'default', P, Sub, Input, Output) :-
-    brachylog_meta_nonexistence(GlobalVariables, P, Sub, Input, Output).
-
-brachylog_meta_nonexistence(GlobalVariables, P, Sub, Input, Output) :-
-    brachylog_meta_map(GlobalVariables, 'default', P, Sub, Input, T),
-    brachylog_zip('default', [T,[Output]], Z),
-    brachylog_meta_map(GlobalVariables, 'default', brachylog_different, 'default', Z, _).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_ORDERBY
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_orderby(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_orderby(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_orderby(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_orderby(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_orderby(GlobalVariables, 'default', P, Sub, Input, Output) :-
-    brachylog_meta_orderby(GlobalVariables, 'integer':0, P, Sub, Input, Output).
-brachylog_meta_orderby(GlobalVariables, 'integer':0, P, Sub, Input, Output) :-
-    (   is_brachylog_list(Input) -> FixedInput = Input
-    ;   brachylog_elements('default', Input, FixedInput)
-    ),
-    brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L),
-    brachylog_zip('default', [L,Input], L2),
-    brachylog_order(integer:0, L2, SL2),
-    (   SL2 = [] ->
-        Output = []
-    ;   brachylog_zip('default', SL2, [_,Output])
-    ).
-brachylog_meta_orderby(GlobalVariables, 'integer':1, P, Sub, Input, Output) :-
-    (   is_brachylog_list(Input) -> FixedInput = Input
-    ;   brachylog_elements('default', Input, FixedInput)
-    ),
-    brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L),
-    brachylog_zip('default', [L,Input], L2),
-    brachylog_order(integer:1, L2, SL2),
-    (   SL2 = [] ->
-        Output = []
-    ;   brachylog_zip('default', SL2, [_,Output])
-    ).
-brachylog_meta_orderby(GlobalVariables, 'integer':2, P, Sub, Input, Output) :-
-    (   is_brachylog_list(Input) -> FixedInput = Input
-    ;   brachylog_elements('default', Input, FixedInput)
-    ),
-    brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L),
-    brachylog_order(integer:0, L, Output).
-brachylog_meta_orderby(GlobalVariables, 'integer':3, P, Sub, Input, Output) :-
-    (   is_brachylog_list(Input) -> FixedInput = Input
-    ;   brachylog_elements('default', Input, FixedInput)
-    ),
-    brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L),
-    brachylog_order(integer:1, L, Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_SELECT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_select(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_select(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_select(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_select(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_select(GlobalVariables, 'default', P, Sub, 'string':S, Output) :-
-    brachylog_elements('default', 'string':S, E),
-    brachylog_meta_select(GlobalVariables, 'default', P, Sub, E, O),
-    (   brachylog_concatenate('default', O, X),
-        X = 'string':_ ->
-        Output = X
-    ;   Output = O
-    ).
-brachylog_meta_select(GlobalVariables, 'default', P, Sub, 'integer':S, Output) :-
-    brachylog_elements('default', 'integer':S, E),
-    brachylog_meta_select(GlobalVariables, 'default', P, Sub, E, O),
-    (   brachylog_concatenate('default', O, X),
-        X = 'integer':_ ->
-        Output = X
-    ;   Output = O
-    ).
-brachylog_meta_select(_, 'default', _, _, [], []).
-brachylog_meta_select(GlobalVariables, 'default', P, Sub, [H|T], Output) :-
-    (   (   GlobalVariables = 'ignore',
-            call(P, Sub, H, H2)
-        ;   dif(GlobalVariables, 'ignore'),
-            call(P, GlobalVariables, Sub, H, H2)
-        )
-    *-> Output = [H2|T2]
-    ;   Output = T2
-    ),
-    brachylog_meta_select(GlobalVariables, 'default', P, Sub, T, T2).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_TAIL
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_tail(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_tail(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_tail(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_tail(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_tail(GlobalVariables, 'default', P, Sub, Input, Output) :-
-    brachylog_meta_tail(GlobalVariables, 'integer':1, P, Sub, Input, Output).
-brachylog_meta_tail(_, 'integer':0, _, _, Input, Input).
-brachylog_meta_tail(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
-    I #> 0,
-    brachylog_tail('integer':I, Input, Tails),
-    brachylog_knife('integer':I, Input, Heads),
-    brachylog_meta_map(GlobalVariables, 'default', P, Sub, Tails, NewTails),
-    brachylog_concatenate('default', [Heads,NewTails], Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_UNIQUE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_unique(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_unique(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_unique(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_unique(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_unique(GlobalVariables, 'default', P, Sub, Input, Output) :-
-    brachylog_meta_unique_(GlobalVariables, 1, -1, P, Sub, Input, [], Output).
-brachylog_meta_unique(_, 'integer':0, _, _, _, []).
-brachylog_meta_unique(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
-    brachylog_meta_unique_(GlobalVariables, 1, I, P, Sub, Input, [], Output).
-
-brachylog_meta_unique_(_, _, 0, _, _, _, ROutput, Output) :-
-    reverse(ROutput, Output).
-brachylog_meta_unique_(GlobalVariables, Nth, J, P, Sub, Input, A, Output) :-
-    J #\= 0,
-    (   call_nth(   (   GlobalVariables = 'ignore',
-                        call(P, Sub, Input, X)
-                    ;   dif(GlobalVariables, 'ignore'),
-                        call(P, GlobalVariables, Sub, Input, X)
-                    ), Nth) ->
-        (   \+ member(X, A) ->
-            M #= Nth + 1,
-            K #= J - 1,
-            brachylog_meta_unique_(GlobalVariables, M, K, P, Sub, Input, [X|A], Output)
-        ;   M #= Nth + 1,
-            brachylog_meta_unique_(GlobalVariables, M, J, P, Sub, Input, A, Output)
-        )
-    ;   reverse(A, Output)
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_VERIFY
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_verify(GlobalVariables, 'first', P, Sub, [I|Input], Arg) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_verify(GlobalVariables, P, Sub, Arg, I).
-brachylog_meta_verify(GlobalVariables, 'last', P, Sub, Input, Arg) :-
-    reverse(Input, [I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_verify(GlobalVariables, P, Sub, Arg, I).
-brachylog_meta_verify(GlobalVariables, 'integer':I, P, Sub, Input, Input) :-
-    dif(I, 'default'),
-    brachylog_meta_verify(GlobalVariables, P, Sub, Input, 'integer':I).
-brachylog_meta_verify(GlobalVariables, 'default', P, Sub, Input, Output) :-
-    brachylog_meta_verify(GlobalVariables, P, Sub, Input, Output).
-
-brachylog_meta_verify(GlobalVariables, P, Sub, Input, Output) :-
-    brachylog_length('default', Input, L),
-    brachylog_length('default', T, L),
-    brachylog_equal('default', T, _),
-    brachylog_head('default', T, Output),
-    brachylog_meta_map(GlobalVariables, 'default', P, Sub, Input, T).
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_META_ZIP
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_meta_zip(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_meta_zip(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_zip(GlobalVariables, 'last', P, Sub, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_meta_zip(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
-brachylog_meta_zip(GlobalVariables, 'default', P, Sub, Arg, Output) :-
-    brachylog_meta_map(GlobalVariables, 'default', P, Sub, Arg, O),
-    brachylog_zip('default', [Arg,O], Output).
-brachylog_meta_zip(GlobalVariables, 'integer':0, P, Sub, Arg, Output) :-
-    brachylog_meta_find(GlobalVariables, 'default', P, Sub, Arg, O),
-    brachylog_zip('default', [Arg,O], Output).
-brachylog_meta_zip(GlobalVariables, 'integer':1, P, Sub, Arg, Output) :-
-    brachylog_meta_map(GlobalVariables, 'default', P, Sub, Arg, O),
-    brachylog_zip('default', [O,Arg], Output).
-brachylog_meta_zip(GlobalVariables, 'integer':2, P, Sub, Arg, Output) :-
-    brachylog_meta_find(GlobalVariables, 'default', P, Sub, Arg, O),
-    brachylog_zip('default', [O,Arg], Output).
--- a/ibin/brachylog/Brachylog-master/src/predicates.pl	Tue Jul 16 21:38:16 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3126 +0,0 @@
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-____            ____
-\   \          /   /
- \   \  ____  /   /
-  \   \/    \/   /
-   \     /\     /     BRACHYLOG
-    \   /  \   /      A terse declarative logic programming language
-    /   \  /   \
-   /     \/     \     Written by Julien Cumin - 2017
-  /   /\____/\   \    https://github.com/JCumin/Brachylog
- /   /  ___   \   \
-/___/  /__/    \___\
-
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-
-:- module(predicates, [%Symbols                                         % Reversed version
-                       brachylog_lessequal/3,                           brachylog_lessequal_reversed/3,
-                       brachylog_greaterequal/3,                        brachylog_greaterequal_reversed/3,
-                       brachylog_contains/3,                            brachylog_contains_reversed/3,
-                       brachylog_in/3,                                  brachylog_in_reversed/3,
-                       brachylog_superset/3,                            brachylog_superset_reversed/3,
-                       brachylog_subset/3,                              brachylog_subset_reversed/3,
-                       brachylog_reverse/3,                             brachylog_reverse_reversed/3,
-                       brachylog_call_predicate/3,                      brachylog_call_predicate_reversed/3,
-                       brachylog_circular_permute_counterclockwise/3,   brachylog_circular_permute_counterclockwise_reversed/3,
-                       brachylog_circular_permute_clockwise/3,          brachylog_circular_permute_clockwise_reversed/3,
-                       brachylog_root/3,                                brachylog_root_reversed/3,
-                       brachylog_ceil/3,                                brachylog_ceil_reversed/3,
-                       brachylog_floor/3,                               brachylog_floor_reversed/3,
-                       brachylog_range_ascending/3,                     brachylog_range_ascending_reversed/3,
-                       brachylog_range_descending/3,                    brachylog_range_descending_reversed/3,
-                       brachylog_natural_integer/3,                     brachylog_natural_integer_reversed/3,
-                       brachylog_integer/3,                             brachylog_integer_reversed/3,
-                       brachylog_float/3,                               brachylog_float_reversed/3,
-                       brachylog_different/3,                           brachylog_different_reversed/3,
-                       brachylog_identity/3,                            brachylog_identity_reversed/3,
-                       brachylog_integer_division/3,                    brachylog_integer_division_reversed/3,
-                       brachylog_multiply/3,                            brachylog_multiply_reversed/3,
-                       brachylog_modulo/3,                              brachylog_modulo_reversed/3,
-                       brachylog_exp/3,                                 brachylog_exp_reversed/3,
-                       brachylog_plus/3,                                brachylog_plus_reversed/3,
-                       brachylog_minus/3,                               brachylog_minus_reversed/3,
-                       brachylog_divide/3,                              brachylog_divide_reversed/3,
-                       brachylog_less/3,                                brachylog_less_reversed/3,
-                       brachylog_equal/3,                               brachylog_equal_reversed/3,
-                       brachylog_greater/3,                             brachylog_greater_reversed/3,
-                       brachylog_transpose/3,                           brachylog_transpose_reversed/3,
-                       brachylog_power/3,                               brachylog_power_reversed/3,
-
-                       %Lowercase letters                               % Reversed version
-                       brachylog_adfix/3,                               brachylog_adfix_reversed/3,
-                       brachylog_behead/3,                              brachylog_behead_reversed/3,
-                       brachylog_concatenate/3,                         brachylog_concatenate_reversed/3,
-                       brachylog_duplicates/3,                          brachylog_duplicates_reversed/3,
-                       brachylog_factors/3,                             brachylog_factors_reversed/3,
-                       brachylog_group/3,                               brachylog_group_reversed/3,
-                       brachylog_head/3,                                brachylog_head_reversed/3,
-                       brachylog_index/3,                               brachylog_index_reversed/3,
-                       brachylog_juxtapose/3,                           brachylog_juxtapose_reversed/3,
-                       brachylog_knife/3,                               brachylog_knife_reversed/3,
-                       brachylog_length/3,                              brachylog_length_reversed/3,
-                       brachylog_order/3,                               brachylog_order_reversed/3,
-                       brachylog_permute/3,                             brachylog_permute_reversed/3,
-                       brachylog_substring/3,                           brachylog_substring_reversed/3,
-                       brachylog_tail/3,                                brachylog_tail_reversed/3,
-                       brachylog_write/3,                               brachylog_write_reversed/3,
-                       brachylog_xterminate/3,                          brachylog_xterminate_reversed/3,
-                       brachylog_zip/3,                                 brachylog_zip_reversed/3,
-
-                       %Lowercase letters with dot below                % Reversed version
-                       brachylog_to_codes/3,                            brachylog_to_codes_reversed/3,
-                       brachylog_blocks/3,                              brachylog_blocks_reversed/3,
-                       brachylog_dichotomize/3,                         brachylog_dichotomize_reversed/3,
-                       brachylog_elements/3,                            brachylog_elements_reversed/3,
-                       brachylog_to_number/3,                           brachylog_to_number_reversed/3,
-                       brachylog_lowercase/3,                           brachylog_lowercase_reversed/3,
-                       brachylog_split_lines/3,                         brachylog_split_lines_reversed/3,
-                       brachylog_occurences/3,                          brachylog_occurences_reversed/3,
-                       brachylog_random_element/3,                      brachylog_random_element_reversed/3,
-                       brachylog_shuffle/3,                             brachylog_shuffle_reversed/3,
-                       brachylog_uppercase/3,                           brachylog_uppercase_reversed/3,
-                       brachylog_writeln/3,                             brachylog_writeln_reversed/3,
-
-                       %Lowercase letters with dot above                % Reversed version
-                       brachylog_absolute_value/3,                      brachylog_absolute_value_reversed/3,
-                       brachylog_base/3,                                brachylog_base_reversed/3,
-                       brachylog_coerce/3,                              brachylog_coerce_reversed/3,
-                       brachylog_prime_decomposition/3,                 brachylog_prime_decomposition_reversed/3,
-                       brachylog_factorial/3,                           brachylog_factorial_reversed/3,
-                       brachylog_groups/3,                              brachylog_groups_reversed/3,
-                       brachylog_matrix/3,                              brachylog_matrix_reversed/3,
-                       brachylog_negate/3,                              brachylog_negate_reversed/3,
-                       brachylog_prime/3,                               brachylog_prime_reversed/3,
-                       brachylog_random_number/3,                       brachylog_random_number_reversed/3,
-                       brachylog_sign/3,                                brachylog_sign_reversed/3,
-                       brachylog_to_string/3,                           brachylog_to_string_reversed/3,
-                       brachylog_cartesian_product/3,                   brachylog_cartesian_product_reversed/3,
-
-                       %Label                                           % Reversed version
-                       brachylog_label/3,                               brachylog_label_reversed/3
-                      ]).
-
-:- use_module(library(clpfd)).
-:- use_module(utils).
-
-:- multifile clpfd:run_propagator/2.
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_LESSEQUAL
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_lessequal_reversed(S, I, O) :-
-    brachylog_lessequal(S, O, I).
-brachylog_lessequal('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_lessequal('integer':I, Arg, Output).
-brachylog_lessequal('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_lessequal('integer':I, Arg, Output).
-brachylog_lessequal('default', Input, Output) :-
-    brachylog_lessequal('integer':0, Input, Output).
-brachylog_lessequal('integer':0, 'integer':I1, 'integer':I2) :-
-    I1 #=< I2.
-brachylog_lessequal('integer':0, 'float':I1, 'integer':I2) :-
-    nonvar(I1),
-    brachylog_label('default', 'integer':I2, _),
-    I1 =< I2.
-brachylog_lessequal('integer':0, 'integer':I1, 'float':I2) :-
-    nonvar(I2),
-    brachylog_label('default', 'integer':I1, _),
-    I1 =< I2.
-brachylog_lessequal('integer':0, 'float':I1, 'float':I2) :-
-    nonvar(I1),
-    nonvar(I2),
-    I1 =< I2.
-brachylog_lessequal('integer':1, [], []).
-brachylog_lessequal('integer':1, [I], [I]).
-brachylog_lessequal('integer':1, [I,J|T], [I,J|T]) :-
-    brachylog_lessequal('integer':0, I, J),
-    brachylog_lessequal('integer':1, [J|T], [J|T]).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_GREATEREQUAL
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_greaterequal_reversed(S, I, O) :-
-    brachylog_greaterequal(S, O, I).
-brachylog_greaterequal('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_greaterequal('integer':I, Arg, Output).
-brachylog_greaterequal('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_greaterequal('integer':I, Arg, Output).
-brachylog_greaterequal('default', Input, Output) :-
-    brachylog_greaterequal('integer':0, Input, Output).
-brachylog_greaterequal('integer':0, 'integer':I1, 'integer':I2) :-
-    I1 #>= I2.
-brachylog_greaterequal('integer':0, 'float':I1, 'integer':I2) :-
-    nonvar(I1),
-    brachylog_label('default', 'integer':I2, _),
-    I1 >= I2.
-brachylog_greaterequal('integer':0, 'integer':I1, 'float':I2) :-
-    nonvar(I2),
-    brachylog_label('default', 'integer':I1, _),
-    I1 >= I2.
-brachylog_greaterequal('integer':0, 'float':I1, 'float':I2) :-
-    nonvar(I1),
-    nonvar(I2),
-    I1 >= I2.
-brachylog_greaterequal('integer':1, [], []).
-brachylog_greaterequal('integer':1, [I], [I]).
-brachylog_greaterequal('integer':1, [I,J|T], [I,J|T]) :-
-    brachylog_greaterequal('integer':0, I, J),
-    brachylog_greaterequal('integer':1, [J|T], [J|T]).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_CONTAINS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_contains_reversed(S, I, O) :-
-    brachylog_contains(S, O, I).
-brachylog_contains(Sub, Input, Output) :-
-    brachylog_in(Sub, Output, Input).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_IN
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_in_reversed(S, I, O) :-
-    brachylog_in(S, O, I).
-brachylog_in('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_in('integer':I, Arg, Output).
-brachylog_in('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_in('integer':I, Arg, Output).
-brachylog_in('default', 'string':L, 'string':[M]) :-
-    nth0(_, L, M).
-brachylog_in('integer':S, 'string':L, 'string':[M]) :-
-    nth0(S, L, M).
-brachylog_in('default', 'integer':0, 'integer':0).
-brachylog_in('integer':0, 'integer':0, 'integer':0).
-brachylog_in('default', 'integer':I, 'integer':J) :-
-    H #\= 0,
-    integer_value('integer':_:[H|T], I),
-    nth0(_, [H|T], M),
-    integer_value('integer':'positive':[M], J).
-brachylog_in('integer':S, 'integer':I, 'integer':J) :-
-    H #\= 0,
-    integer_value('integer':_:[H|T], I),
-    nth0(S, [H|T], M),
-    integer_value('integer':'positive':[M], J).
-brachylog_in('default', L, M) :-
-    is_brachylog_list(L),
-    nth0(_, L, M).
-brachylog_in('integer':S, L, M) :-
-    is_brachylog_list(L),
-    nth0(S, L, M).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_SUPERSET
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_superset_reversed(S, I, O) :-
-    brachylog_superset(S, O, I).
-brachylog_superset(Sub, Input, Output) :-
-    brachylog_subset(Sub, Output, Input).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_SUBSET
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_subset_reversed(S, I, O) :-
-    brachylog_subset(S, O, I).
-brachylog_subset('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_subset('integer':I, Arg, Output).
-brachylog_subset('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_subset('integer':I, Arg, Output).
-brachylog_subset('default', Input, Output) :-
-    brachylog_subset('integer':0, Input, Output).
-brachylog_subset('integer':0, 'string':S, 'string':T) :-
-    brachylog_subset_recur(S, T).
-brachylog_subset('integer':0, 'integer':0, 'integer':0).
-brachylog_subset('integer':0, 'integer':I, 'integer':J) :-
-    H #\= 0,
-    dif(M, []),
-    integer_value('integer':Sign:[H|L], I),
-    brachylog_subset_recur([H|L], M),
-    integer_value('integer':Sign:M, J).
-brachylog_subset('integer':0, 'float':F, 'float':G) :-
-    Sign is abs(F)/F,
-    AF is abs(F),
-    number_chars(AF, C),
-    brachylog_subset_recur(C, D),
-    dif(D, []),
-    \+ (D = ['.'|_] ; reverse(D, ['.'|_])),
-    number_chars(AG,D),
-    G is Sign*AG.
-brachylog_subset('integer':0, L, S) :-
-    is_brachylog_list(L),
-    brachylog_subset_recur(L, S).
-
-brachylog_subset_recur(L, S) :-
-    var(S),
-    length(L, Length),
-    between(0, Length, I),
-    J #= Length - I,
-    length(S, J),
-    brachylog_subset_recur_(L, S).
-brachylog_subset_recur(L, S) :-
-    nonvar(S),
-    length(S, Length),
-    I #>= Length,
-    length(L, I),
-    brachylog_subset_recur_(L, S).
-
-brachylog_subset_recur_([], []).
-brachylog_subset_recur_([H|T], [H|T2]) :-
-    brachylog_subset_recur_(T, T2).
-brachylog_subset_recur_([_|T], T2) :-
-    brachylog_subset_recur_(T, T2).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_REVERSE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_reverse_reversed(S, I, O) :-
-    brachylog_reverse(S, O, I).
-brachylog_reverse('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_reverse('integer':I, Arg, Output).
-brachylog_reverse('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_reverse('integer':I, Arg, Output).
-brachylog_reverse('default', Input, Output) :-
-    brachylog_reverse('integer':0, Input, Output).
-brachylog_reverse('integer':0, 'string':S, 'string':R) :-
-    reverse(S, R).
-brachylog_reverse('integer':0, 'integer':I, 'integer':R) :-
-    nonvar(I),
-    H #\= 0,
-    A #\= 0,
-    integer_value('integer':Sign:[H|T], I),
-    reverse([H|T], B),
-    append(Zeroes, [A|Rest], B),
-    maplist(=(0), Zeroes),
-    integer_value('integer':Sign:[A|Rest], R).
-brachylog_reverse('integer':0, 'integer':0, 'integer':0).
-brachylog_reverse('integer':0, 'integer':I, 'integer':R) :-
-    var(I),
-    H #\= 0,
-    A #\= 0,
-    integer_value('integer':Sign:[A|B], R),
-    reverse(L, [A|B]),
-    append(Zeroes, [H|T], L),
-    maplist(=(0), Zeroes),
-    integer_value('integer':Sign:[H|T], I).
-brachylog_reverse('integer':0, List, R) :-
-    reverse(List, R).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_CALL_PREDICATE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_call_predicate_reversed(S, I, O) :-
-    brachylog_call_predicate(S, O, I).
-brachylog_call_predicate('first'-GlobalVariables, ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_call_predicate(GlobalVariables, 'integer':I, Arg, Output).
-brachylog_call_predicate('last'-GlobalVariables, Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_call_predicate(GlobalVariables, 'integer':I, Arg, Output).
-brachylog_call_predicate(Name-GlobalVariables, Arg, Output) :-
-    brachylog_call_predicate(GlobalVariables, Name, Arg, Output).
-brachylog_call_predicate(GlobalVariables, CallingPredName, Input, Output) :-
-    atom(CallingPredName),
-    call(CallingPredName, GlobalVariables, 'integer':0, Input, Output).
-brachylog_call_predicate(GlobalVariables, 'integer':I, Input, Output) :-
-    (   I = 0,
-        PredName = 'brachylog_main'
-    ;   I #> 0,
-        atomic_list_concat(['brachylog_predicate_',I], PredName)
-    ),
-    call(PredName, GlobalVariables, 'integer':0, Input, Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_CIRCULAR_PERMUTE_COUNTERCLOCKWISE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_circular_permute_counterclockwise_reversed(S, I, O) :-
-    brachylog_circular_permute_counterclockwise(S, O, I).
-brachylog_circular_permute_counterclockwise('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_circular_permute_counterclockwise('integer':I, Arg, Output).
-brachylog_circular_permute_counterclockwise('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_circular_permute_counterclockwise('integer':I, Arg, Output).
-brachylog_circular_permute_counterclockwise('default', Input, Output) :-
-    brachylog_circular_permute_counterclockwise('integer':1, Input, Output).
-brachylog_circular_permute_counterclockwise('integer':0, Input, Input).
-brachylog_circular_permute_counterclockwise('integer':1, 'string':[], 'string':[]).
-brachylog_circular_permute_counterclockwise('integer':1, 'string':[H|T], 'string':S) :-
-    append(T, [H], S).
-brachylog_circular_permute_counterclockwise('integer':1, [], []).
-brachylog_circular_permute_counterclockwise('integer':1, [H|T], S) :-
-    append(T, [H], S).
-brachylog_circular_permute_counterclockwise('integer':1, 'integer':0, 'integer':0).
-brachylog_circular_permute_counterclockwise('integer':1, 'integer':I, 'integer':J) :-
-    dif(H, 0),
-    integer_value('integer':Sign:[H|T], I),
-    append(T, [H], S),
-    integer_value('integer':Sign:S, J).
-brachylog_circular_permute_counterclockwise('integer':I, Input, Output) :-
-    I #> 1,
-    brachylog_meta_iterate(ignore, 'integer':I, brachylog_circular_permute_counterclockwise, 'default', Input, Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_CIRCULAR_PERMUTE_CLOCKWISE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_circular_permute_clockwise_reversed(S, I, O) :-
-    brachylog_circular_permute_clockwise(S, O, I).
-brachylog_circular_permute_clockwise('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_circular_permute_clockwise('integer':I, Arg, Output).
-brachylog_circular_permute_clockwise('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_circular_permute_clockwise('integer':I, Arg, Output).
-brachylog_circular_permute_clockwise('default', Input, Output) :-
-    brachylog_circular_permute_clockwise('integer':1, Input, Output).
-brachylog_circular_permute_clockwise('integer':0, Input, Input).
-brachylog_circular_permute_clockwise('integer':1, 'string':[], 'string':[]).
-brachylog_circular_permute_clockwise('integer':1, 'string':L, 'string':S) :-
-    append(T, [H], L),
-    S = [H|T].
-brachylog_circular_permute_clockwise('integer':1, [], []).
-brachylog_circular_permute_clockwise('integer':1, [A|B], S) :-
-    append(T, [H], [A|B]),
-    S = [H|T].
-brachylog_circular_permute_clockwise('integer':1, 'integer':0, 'integer':0).
-brachylog_circular_permute_clockwise('integer':1, 'integer':I, 'integer':J) :-
-    dif(H2, 0),
-    integer_value('integer':Sign:[H2|T2], I),
-    append(T, [H], [H2|T2]),
-    S = [H|T],
-    integer_value('integer':Sign:S, J).
-brachylog_circular_permute_clockwise('integer':I, Input, Output) :-
-    I #> 1,
-    brachylog_meta_iterate(ignore, 'integer':I, brachylog_circular_permute_clockwise, 'default', Input, Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_ROOT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_root_reversed(S, I, O) :-
-    brachylog_root(S, O, I).
-brachylog_root('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_root('integer':I, Arg, Output).
-brachylog_root('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_root('integer':I, Arg, Output).
-brachylog_root('default', Input, Output) :-
-    brachylog_root('integer':2, Input, Output).
-brachylog_root('integer':I,'integer':E, Type:R) :-
-    (   E #= R^I ->
-        Type = 'integer'
-    ;   brachylog_label('default', ['integer':I, 'integer':E], _),
-        R is E^(1/I),
-        Type = 'float'
-    ).
-brachylog_root('integer':I,'float':E, 'float':R) :-
-    nonvar(E),
-    brachylog_label('default', 'integer':I, _),
-    R is E^(1/I).
-brachylog_root('float':I,'integer':E, 'float':R) :-
-    brachylog_label('default', 'integer':E, _),
-    R is E^(1/I).
-brachylog_root('float':I,'float':E, 'float':R) :-
-    nonvar(E),
-    R is E^(1/I).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_CEIL
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_ceil_reversed(S, I, O) :-
-    brachylog_ceil(S, O, I).
-brachylog_ceil('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_ceil('integer':I, Arg, Output).
-brachylog_ceil('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_ceil('integer':I, Arg, Output).
-brachylog_ceil('default', Input, Output) :-
-    brachylog_ceil('integer':0, Input, Output).
-brachylog_ceil('integer':0, [H|T], Output) :-
-    foldl(scompare(@>), [H|T], H, Output).
-brachylog_ceil('integer':1, 'integer':I, 'integer':I).
-brachylog_ceil('integer':1, 'float':I, 'integer':J) :-
-    nonvar(I),
-    J is ceil(I).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_FLOOR
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_floor_reversed(S, I, O) :-
-    brachylog_floor(S, O, I).
-brachylog_floor('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_floor('integer':I, Arg, Output).
-brachylog_floor('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_floor('integer':I, Arg, Output).
-brachylog_floor('default', Input, Output) :-
-    brachylog_floor('integer':0, Input, Output).
-brachylog_floor('integer':0, [H|T], Output) :-
-    foldl(scompare(@<), [H|T], H, Output).
-brachylog_floor('integer':1, 'integer':I, 'integer':I).
-brachylog_floor('integer':1, 'float':I, 'integer':J) :-
-    nonvar(I),
-    J is floor(I).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_RANGE_ASCENDING
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_range_ascending_reversed(S, I, O) :-
-    brachylog_range_ascending(S, O, I).
-brachylog_range_ascending('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_range_ascending('integer':I, Arg, Output).
-brachylog_range_ascending('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_range_ascending('integer':I, Arg, Output).
-brachylog_range_ascending('default', Input, Output) :-
-    brachylog_range_ascending('integer':0, Input, Output).
-brachylog_range_ascending('integer':0, 'integer':Input, Output) :-
-    (   0 #=< Input,
-        brachylog_range_ascending_(0, Input, Output)
-    ;   0 #> Input,
-        brachylog_range_ascending_(Input, 0, Output)
-    ).
-brachylog_range_ascending('integer':1, 'integer':Input, Output) :-
-    (   1 #=< Input,
-        brachylog_range_ascending_(1, Input, Output)
-    ;   1 #> Input,
-        brachylog_range_ascending_(Input, 1, Output)
-    ).
-brachylog_range_ascending('integer':2, ['integer':X,'integer':Y], Output) :-
-    (   X #=< Y,
-        brachylog_range_ascending_(X, Y, Output)
-    ;   X #> Y,
-        brachylog_range_ascending_(Y, X, Output)
-    ).
-brachylog_range_ascending('integer':3, ['integer':X,'integer':Y], Output) :-
-    (   X #=< Y,
-        Y2 #= Y - 1,
-        brachylog_range_ascending_(X, Y2, Output)
-    ;   X #> Y,
-        X2 #= X - 1,
-        brachylog_range_ascending_(Y, X2, Output)
-    ).
-brachylog_range_ascending('integer':4, ['integer':X,'integer':Y], Output) :-
-    (   X #=< Y,
-        X2 #= X + 1,
-        brachylog_range_ascending_(X2, Y, Output)
-    ;   X #> Y,
-        Y2 #= Y + 1,
-        brachylog_range_ascending_(Y2, X, Output)
-    ).
-brachylog_range_ascending('integer':5, 'integer':Input, Output) :-
-    (   0 #=< Input,
-        I2 #= Input - 1,
-        brachylog_range_ascending_(0, I2, Output)
-    ;   0 #> Input,
-        I2 #= Input + 1,
-        brachylog_range_ascending_(I2, 0, Output)
-    ).
-brachylog_range_ascending('integer':6, 'integer':Input, Output) :-
-    (   1 #=< Input,
-        I2 #= Input - 1,
-        brachylog_range_ascending_(1, I2, Output)
-    ;   1 #> Input,
-        I2 #= Input + 1,
-        brachylog_range_ascending_(I2, 1, Output)
-    ).
-
-brachylog_range_ascending_(I, S, ['integer':I|R]) :-
-    I #=< S,
-    if_(I = S,
-        R = [],
-        (   J #= I + 1,
-            predicates:brachylog_range_ascending_(J, S, R)
-        )
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_RANGE_DESCENDING
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_range_descending_reversed(S, I, O) :-
-    brachylog_range_descending(S, O, I).
-brachylog_range_descending('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_range_descending('integer':I, Arg, Output).
-brachylog_range_descending('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_range_descending('integer':I, Arg, Output).
-brachylog_range_descending('default', Input, Output) :-
-    brachylog_range_descending('integer':0, Input, Output).
-brachylog_range_descending('integer':Sub, Input, Output) :-
-    brachylog_range_ascending('integer':Sub, Input, ROutput),
-    brachylog_reverse('default', ROutput, Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_NATURAL_INTEGER
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_natural_integer_reversed(S, I, O) :-
-    brachylog_natural_integer(S, O, I).
-brachylog_natural_integer('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_natural_integer('integer':I, Arg, Output).
-brachylog_natural_integer('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_natural_integer('integer':I, Arg, Output).
-brachylog_natural_integer('default', Input, Output) :-
-    brachylog_natural_integer('integer':0, Input, Output).
-brachylog_natural_integer('integer':I, 'integer':Input, 'integer':Input) :-
-    I #>= 0,
-    Input #>= I.
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_INTEGER
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_integer_reversed(S, I, O) :-
-    brachylog_integer(S, O, I).
-brachylog_integer('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_integer('integer':I, Arg, Output).
-brachylog_integer('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_integer('integer':I, Arg, Output).
-brachylog_integer('default', 'integer':Input, 'integer':Input) :-
-    Input in inf..sup.
-brachylog_integer('integer':I, 'integer':Input, 'integer':Input) :-
-    I #>= 0,
-    Input #=< -I.
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_FLOAT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_float_reversed(S, I, O) :-
-    brachylog_float(S, O, I).
-brachylog_float('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_float('integer':I, Arg, Output).
-brachylog_float('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_float('integer':I, Arg, Output).
-brachylog_float('default', 'float':Input, 'float':Input).
-brachylog_float('integer':_, 'integer':Input, 'float':Input).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_DIFFERENT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_different_reversed(S, I, O) :-
-    brachylog_different(S, O, I).
-brachylog_different('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_different('integer':I, Arg, Output).
-brachylog_different('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_different('integer':I, Arg, Output).
-brachylog_different('default', 'string':S, 'string':S) :-
-    brachylog_different_(S).
-brachylog_different('default', [], []).
-brachylog_different('default', [H|T], [H|T]) :-
-    (   maplist(prepend_integer, L, [H|T]),
-        all_different(L)                        % More efficient on integers
-    ;   maplist(prepend_string, _, [H|T]),
-        brachylog_different_([H|T])
-    ;   maplist(is_brachylog_list, [H|T]),
-        brachylog_different_([H|T])
-    ).
-brachylog_different('default', 'integer':I, 'integer':I) :-
-    (   integer_value('integer':_:[_], I) ->
-        true
-    ;   H #\= 0,
-        integer_value('integer':_:[H,H2|T], I),
-        all_different([H,H2|T])
-    ).
-
-brachylog_different_([]).
-brachylog_different_([H|T]) :-
-    maplist(dif(H), T),
-    brachylog_different_(T).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_IDENTITY
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_identity_reversed(S, I, O) :-
-    brachylog_identity(S, O, I).
-brachylog_identity(_, Input, Input).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_INTEGER_DIVISION
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_integer_division_reversed(S, I, O) :-
-    brachylog_integer_division(S, O, I).
-brachylog_integer_division('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_integer_division('integer':I, Arg, Output).
-brachylog_integer_division('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_integer_division('integer':I, Arg, Output).
-brachylog_integer_division('default', Input, Output) :-
-    brachylog_integer_division('integer':0, Input, Output).
-brachylog_integer_division('integer':0, [], 'integer':1).
-brachylog_integer_division('integer':0, ['integer':I1,'integer':I2], 'integer':Division) :-
-    brachylog_label('default', ['integer':I1,'integer':I2], _),
-    Division #= I1 // I2.
-brachylog_integer_division('integer':0, ['float':I1,'integer':I2], 'integer':Division) :-
-    brachylog_label('default', 'integer':I2, _),
-    nonvar(I1),
-    D is I1 / I2,
-    brachylog_floor('integer':1, 'float':D, 'integer':Division).
-brachylog_integer_division('integer':0, ['integer':I1,'float':I2], 'integer':Division) :-
-    brachylog_label('default', 'integer':I1, _),
-    nonvar(I2),
-    D is I1 / I2,
-    brachylog_floor('integer':1, 'float':D, 'integer':Division).
-brachylog_integer_division('integer':0, ['float':I1,'float':I2], 'integer':Division) :-
-    nonvar(I1),
-    nonvar(I2),
-    D is I1 / I2,
-    brachylog_floor('integer':1, 'float':D, 'integer':Division).
-brachylog_integer_division('integer':I, Input, Output) :-
-    I #> 0,
-    brachylog_integer_division('integer':0, [Input,'integer':I], Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_MULTIPLY
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_multiply_reversed(S, I, O) :-
-    brachylog_multiply(S, O, I).
-brachylog_multiply('first', ['integer':A,'integer':B], Output) :-
-    brachylog_multiply('integer':A, 'integer':B, Output).
-brachylog_multiply('last', ['integer':A,'integer':B], Output) :-
-    brachylog_multiply('integer':B, 'integer':A, Output).
-brachylog_multiply('integer':S, 'integer':I, 'integer':J) :-
-    J #= S*I.
-brachylog_multiply('integer':S, 'float':F, 'float':G) :-
-    nonvar(F),
-    G is S*F.
-brachylog_multiply('default', [], 'integer':1).
-brachylog_multiply('default', [TypeI:I|T], TypeS:Product) :-
-    (   TypeI = 'integer',
-        TypeF = 'integer',
-        (   var(I) ->
-            I #> 0,
-            F #> 0
-        ;   true
-        ),
-        Product #= I * F,
-        TypeS = 'integer',
-        brachylog_multiply('default', T, TypeF:F)
-    ;   TypeS = 'float',
-        brachylog_multiply('default', T, TypeF:F),
-        (   TypeF = 'float',
-            TypeI = 'integer',
-            brachylog_label('default', 'integer':I, _)
-        ;   TypeI = 'float',
-            nonvar(I),
-            TypeF = 'integer',
-            brachylog_label('default', 'integer':F, _)
-        ;   TypeF = 'float',
-            TypeI = 'float',
-            nonvar(I)
-        ),
-        Product is I * F
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_MODULO
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_modulo_reversed(S, I, O) :-
-    brachylog_modulo(S, O, I).
-brachylog_modulo('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_modulo('integer':I, Arg, Output).
-brachylog_modulo('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_modulo('integer':I, Arg, Output).
-brachylog_modulo('default', Input, Output) :-
-    brachylog_modulo('integer':0, Input, Output).
-brachylog_modulo('integer':0, ['integer':I1,'integer':I2], 'integer':Rem) :-
-    Rem #= I1 mod I2.
-brachylog_modulo('integer':I, 'integer':I1, 'integer':Rem) :-
-    I #> 0,
-    Rem #= I1 mod I.
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_EXP
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_exp_reversed(S, I, O) :-
-    brachylog_exp(S, O, I).
-brachylog_exp('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_exp('integer':I, Arg, Output).
-brachylog_exp('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_exp('integer':I, Arg, Output).
-brachylog_exp('default', Input, Output) :-
-    brachylog_exp('integer':0, Input, Output).
-brachylog_exp('integer':0, 'integer':I, 'float':Exp) :-
-    brachylog_label('default', 'integer':I, _),
-    Exp is exp(I).
-brachylog_exp('integer':0, 'float':F, 'float':Exp) :-
-    nonvar(F),
-    Exp is exp(F).
-brachylog_exp('integer':1, 'integer':I, 'float':Exp) :-
-    brachylog_label('default', 'integer':I, _),
-    Exp is log(I).
-brachylog_exp('integer':1, 'float':F, 'float':Exp) :-
-    nonvar(F),
-    Exp is log(F).
-brachylog_exp('integer':2, 'integer':I, 'float':Exp) :-
-    brachylog_label('default', 'integer':I, _),
-    Exp is cos(I).
-brachylog_exp('integer':2, 'float':F, 'float':Exp) :-
-    nonvar(F),
-    Exp is cos(F).
-brachylog_exp('integer':3, 'integer':I, 'float':Exp) :-
-    brachylog_label('default', 'integer':I, _),
-    Exp is sin(I).
-brachylog_exp('integer':3, 'float':F, 'float':Exp) :-
-    nonvar(F),
-    Exp is sin(F).
-brachylog_exp('integer':4, 'integer':I, 'float':Exp) :-
-    brachylog_label('default', 'integer':I, _),
-    Exp is tan(I).
-brachylog_exp('integer':4, 'float':F, 'float':Exp) :-
-    nonvar(F),
-    Exp is tan(F).
-brachylog_exp('integer':5, 'integer':I, 'float':Exp) :-
-    brachylog_label('default', 'integer':I, _),
-    Exp is acos(I).
-brachylog_exp('integer':5, 'float':F, 'float':Exp) :-
-    nonvar(F),
-    Exp is acos(F).
-brachylog_exp('integer':6, 'integer':I, 'float':Exp) :-
-    brachylog_label('default', 'integer':I, _),
-    Exp is asin(I).
-brachylog_exp('integer':6, 'float':F, 'float':Exp) :-
-    nonvar(F),
-    Exp is asin(F).
-brachylog_exp('integer':7, 'integer':I, 'float':Exp) :-
-    brachylog_label('default', 'integer':I, _),
-    Exp is atan(I).
-brachylog_exp('integer':7, 'float':F, 'float':Exp) :-
-    nonvar(F),
-    Exp is atan(F).
-brachylog_exp('integer':8, 'integer':I, 'float':Exp) :-
-    brachylog_label('default', 'integer':I, _),
-    Exp is cosh(I).
-brachylog_exp('integer':8, 'float':F, 'float':Exp) :-
-    nonvar(F),
-    Exp is cosh(F).
-brachylog_exp('integer':9, 'integer':I, 'float':Exp) :-
-    brachylog_label('default', 'integer':I, _),
-    Exp is sinh(I).
-brachylog_exp('integer':9, 'float':F, 'float':Exp) :-
-    nonvar(F),
-    Exp is sinh(F).
-brachylog_exp('integer':10, 'integer':I, 'float':Exp) :-
-    brachylog_label('default', 'integer':I, _),
-    Exp is tanh(I).
-brachylog_exp('integer':10, 'float':F, 'float':Exp) :-
-    nonvar(F),
-    Exp is tanh(F).
-brachylog_exp('integer':11, 'integer':I, 'float':Exp) :-
-    brachylog_label('default', 'integer':I, _),
-    Exp is acosh(I).
-brachylog_exp('integer':11, 'float':F, 'float':Exp) :-
-    nonvar(F),
-    Exp is acosh(F).
-brachylog_exp('integer':12, 'integer':I, 'float':Exp) :-
-    brachylog_label('default', 'integer':I, _),
-    Exp is asinh(I).
-brachylog_exp('integer':12, 'float':F, 'float':Exp) :-
-    nonvar(F),
-    Exp is asinh(F).
-brachylog_exp('integer':13, 'integer':I, 'float':Exp) :-
-    brachylog_label('default', 'integer':I, _),
-    Exp is atanh(I).
-brachylog_exp('integer':13, 'float':F, 'float':Exp) :-
-    nonvar(F),
-    Exp is atanh(F).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_PLUS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_plus_reversed(S, I, O) :-
-    brachylog_plus(S, O, I).
-brachylog_plus('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_plus('integer':I, Arg, Output).
-brachylog_plus('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_plus('integer':I, Arg, Output).
-brachylog_plus('default', Input, Output) :-
-    brachylog_plus('integer':0, Input, Output).
-brachylog_plus('integer':I, 'integer':Input, 'integer':Output) :-
-    I #> 0,
-    Output #= Input + I.
-brachylog_plus('integer':I, 'float':Input, 'float':Output) :-
-    I #> 0,
-    nonvar(Input),
-    Output is Input + I.
-brachylog_plus('integer':0, [], 'integer':0).
-brachylog_plus('integer':0, [TypeI:I|T], TypeS:Sum) :-
-    brachylog_plus('integer':0, T, TypeF:F),
-    (   TypeI = 'integer',
-        TypeF = 'integer',
-        Sum #= I + F,
-        TypeS = 'integer'
-    ;   TypeS = 'float',
-        (   TypeF = 'float',
-            TypeI = 'integer',
-            brachylog_label('default', 'integer':I, _)
-        ;   TypeI = 'float',
-            nonvar(I),
-            TypeF = 'integer',
-            brachylog_label('default', 'integer':F, _)
-        ;   TypeF = 'float',
-            TypeI = 'float',
-            nonvar(I)
-        ),
-        Sum is I + F
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_MINUS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_minus_reversed(S, I, O) :-
-    brachylog_minus(S, O, I).
-brachylog_minus('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_minus('integer':I, Arg, Output).
-brachylog_minus('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_minus('integer':I, Arg, Output).
-brachylog_minus('default', Input, Output) :-
-    brachylog_minus('integer':0, Input, Output).
-brachylog_minus('integer':I, 'integer':Input, 'integer':Output) :-
-    I #> 0,
-    Output #= Input - I.
-brachylog_minus('integer':I, 'float':Input, 'float':Output) :-
-    I #> 0,
-    nonvar(Input),
-    Output is Input - I.
-brachylog_minus('integer':0, [], 'integer':0).
-brachylog_minus('integer':0, [TypeI:I|T], TypeS:Sum) :-
-    brachylog_minus('integer':0, T, TypeF:F),
-    (   TypeI = 'integer',
-        TypeF = 'integer',
-        Sum #= I - F,
-        TypeS = 'integer'
-    ;   TypeS = 'float',
-        (   TypeF = 'float',
-            TypeI = 'integer',
-            brachylog_label('default', 'integer':I, _)
-        ;   TypeI = 'float',
-            nonvar(I),
-            TypeF = 'integer',
-            brachylog_label('default', 'integer':F, _)
-        ;   TypeF = 'float',
-            TypeI = 'float',
-            nonvar(I)
-        ),
-        Sum is I - F
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_DIVIDE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_divide_reversed(S, I, O) :-
-    brachylog_divide(S, O, I).
-brachylog_divide('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_divide('integer':I, Arg, Output).
-brachylog_divide('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_divide('integer':I, Arg, Output).
-brachylog_divide('default', [], 'integer':1).
-brachylog_divide('default', ['integer':I1,'integer':I2], Type:Division) :-
-    brachylog_label('default', ['integer':I1,'integer':I2], _),
-    I2 #\= 0,
-    Division is I1 / I2,
-    (   integer(Division) ->
-        Type = 'integer'
-    ;   Type = 'float'
-    ).
-brachylog_divide('default', ['integer':0, 'integer':0], 'integer':_).
-brachylog_divide('default', ['float':I1,'integer':I2], 'float':Division) :-
-    brachylog_label('default', 'integer':I2, _),
-    I2 #\= 0,
-    nonvar(I1),
-    Division is I1 / I2.
-brachylog_divide('default', ['float':0.0, 'integer':0], 'float':_).
-brachylog_divide('default', ['integer':I1,'float':I2], 'float':Division) :-
-    brachylog_label('default', 'integer':I1, _),
-    nonvar(I2),
-    dif(I2, 0.0),
-    Division is I1 / I2.
-brachylog_divide('default', ['integer':0, 'float':0.0], 'float':_).
-brachylog_divide('default', ['float':I1,'float':I2], 'float':Division) :-
-    nonvar(I1),
-    nonvar(I2),
-    dif(I2, 0.0),
-    Division is I1 / I2.
-brachylog_divide('default', ['float':0.0, 'float':0.0], 'float':_).
-brachylog_divide('integer':1, 'integer':I, 'float':J) :-
-    brachylog_label('default', 'integer':I, _),
-    J is 1/I.
-brachylog_divide('integer':1, 'float':I, 'float':J) :-
-    J is 1/I.
-brachylog_divide('integer':I, Input, Output) :-
-    I #> 1,
-    brachylog_divide('default', [Input,'integer':I], Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_LESS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_less_reversed(S, I, O) :-
-    brachylog_less(S, O, I).
-brachylog_less('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_less('integer':I, Arg, Output).
-brachylog_less('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_less('integer':I, Arg, Output).
-brachylog_less('default', Input, Output) :-
-    brachylog_less('integer':0, Input, Output).
-brachylog_less('integer':0, 'integer':I1, 'integer':I2) :-
-    I1 #< I2.
-brachylog_less('integer':0, 'float':I1, 'integer':I2) :-
-    nonvar(I1),
-    brachylog_label('default', 'integer':I2, _),
-    I1 < I2.
-brachylog_less('integer':0, 'integer':I1, 'float':I2) :-
-    nonvar(I2),
-    brachylog_label('default', 'integer':I1, _),
-    I1 < I2.
-brachylog_less('integer':0, 'float':I1, 'float':I2) :-
-    nonvar(I1),
-    nonvar(I2),
-    I1 < I2.
-brachylog_less('integer':1, [], []).
-brachylog_less('integer':1, [I], [I]).
-brachylog_less('integer':1, [I,J|T], [I,J|T]) :-
-    brachylog_less('integer':0, I, J),
-    brachylog_less('integer':1, [J|T], [J|T]).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_EQUAL
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_equal_reversed(S, I, O) :-
-    brachylog_equal(S, O, I).
-brachylog_equal('first', [I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_equal(I, Arg, Output).
-brachylog_equal('last', Input, Output) :-
-    reverse(Input, [I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_equal(I, Arg, Output).
-brachylog_equal('default', [], []).
-brachylog_equal('default', [H|T], [H|T]) :-
-    maplist(=(H), T).
-brachylog_equal('default', 'string':L, 'string':L) :-
-    brachylog_equal('integer':0, L, L).
-brachylog_equal('default', 'integer':0, 'integer':0).
-brachylog_equal('default', 'integer':I, 'integer':I) :-
-    H #\= 0,
-    integer_value('integer':_:[H|T], I),
-    brachylog_equal('default', [H|T], [H|T]).
-brachylog_equal(Type:I, [Type:I|T], [Type:I|T]) :-
-    brachylog_equal('default', [Type:I|T], [Type:I|T]).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_GREATER
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_greater_reversed(S, I, O) :-
-    brachylog_greater(S, O, I).
-brachylog_greater('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_greater('integer':I, Arg, Output).
-brachylog_greater('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_greater('integer':I, Arg, Output).
-brachylog_greater('default', Input, Output) :-
-    brachylog_greater('integer':0, Input, Output).
-brachylog_greater('integer':0, 'integer':I1, 'integer':I2) :-
-    I1 #> I2.
-brachylog_greater('integer':0, 'float':I1, 'integer':I2) :-
-    nonvar(I1),
-    brachylog_label('default', 'integer':I2, _),
-    I1 > I2.
-brachylog_greater('integer':0, 'integer':I1, 'float':I2) :-
-    nonvar(I2),
-    brachylog_label('default', 'integer':I1, _),
-    I1 > I2.
-brachylog_greater('integer':0, 'float':I1, 'float':I2) :-
-    nonvar(I1),
-    nonvar(I2),
-    I1 > I2.
-brachylog_greater('integer':1, [], []).
-brachylog_greater('integer':1, [I], [I]).
-brachylog_greater('integer':1, [I,J|T], [I,J|T]) :-
-    brachylog_greater('integer':0, I, J),
-    brachylog_greater('integer':1, [J|T], [J|T]).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_TRANSPOSE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_transpose_reversed(S, I, O) :-
-    brachylog_transpose(S, O, I).
-brachylog_transpose('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_transpose('integer':I, Arg, Output).
-brachylog_transpose('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_transpose('integer':I, Arg, Output).
-brachylog_transpose('default', Input, Output) :-
-    brachylog_transpose('integer':0, Input, Output).
-brachylog_transpose('integer':0, 'string':Input, 'string':Output) :-
-    brachylog_split_lines('default', Input, Ls),
-    brachylog_elements('default', Ls, LLs),
-    brachylog_transpose('integer':0, LLs, CCs),
-    maplist(brachylog_concatenate('default'), CCs, Cs),
-    brachylog_split_lines('default', Output, Cs).
-brachylog_transpose('integer':0, Input, Output) :-
-    is_brachylog_list(Input),
-    member(X, Input),
-    is_list(X),
-    !,
-    maplist(is_brachylog_list, Input),
-    length(X, LX),
-    length(Input, LI),
-    brachylog_juxtapose('integer':LI, ['integer':LX], Lengths),
-    maplist(brachylog_length('default'), Input, Lengths),
-    brachylog_equal('default', Lengths, _),
-    transpose(Input, Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_POWER
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_power_reversed(S, I, O) :-
-    brachylog_power(S, O, I).
-brachylog_power('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_power('integer':I, Arg, Output).
-brachylog_power('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_power('integer':I, Arg, Output).
-brachylog_power('default', [], 'integer':1).
-brachylog_power('default', ['integer':I1,'integer':I2], 'integer':Power) :-
-    Power #= I1 ^ I2.
-brachylog_power('default', ['float':I1,'integer':I2], 'float':Power) :-
-    nonvar(I1),
-    brachylog_label('default', 'integer':I2, _),
-    Power is I1 ^ I2.
-brachylog_power('default', ['integer':I1,'float':I2], 'float':Power) :-
-    nonvar(I2),
-    brachylog_label('default', 'integer':I1, _),
-    Power is I1 ^ I2.
-brachylog_power('default', ['float':I1,'float':I2], 'float':Power) :-
-    nonvar(I1),
-    nonvar(I2),
-    Power is I1 ^ I2.
-brachylog_power('integer':S, 'integer':I, 'integer':J) :-
-    J #= I^S.
-brachylog_power('integer':S, 'float':I, 'float':J) :-
-    nonvar(I),
-    brachylog_label('default', 'integer':S, _),
-    J is I^S.
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_ADFIX
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_adfix_reversed(S, I, O) :-
-    brachylog_adfix(S, O, I).
-brachylog_adfix('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_adfix('integer':I, Arg, Output).
-brachylog_adfix('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_adfix('integer':I, Arg, Output).
-brachylog_adfix('default', Input, Output) :-
-    (   brachylog_adfix('integer':0, Input, Output)
-    ;   brachylog_adfix('integer':1, Input, Output)
-    ).
-brachylog_adfix('integer':0, [], []).
-brachylog_adfix('integer':0, [H|T], [H2|T2]) :-
-    (   brachylog_concatenate('default', [[H2|T2],[_|_]], [H|T])
-    ;   [H2|T2] = [H|T]
-    ).
-brachylog_adfix('integer':0, 'string':S, 'string':P) :-
-    brachylog_adfix('integer':0, S, P).
-brachylog_adfix('integer':0, 'integer':0, 'integer':0).
-brachylog_adfix('integer':0, 'integer':I, 'integer':P) :-
-    H #\= 0,
-    H2 #\= 0,
-    abs(P) #=< abs(I),
-    integer_value('integer':Sign:[H|T], I),
-    integer_value('integer':Sign:[H2|T2], P),
-    brachylog_adfix('integer':0, [H|T], [H2|T2]).
-brachylog_adfix('integer':1, [], []).
-brachylog_adfix('integer':1, [H|T], [H2|T2]) :-
-    brachylog_concatenate('default', [_,[H2|T2]], [H|T]).
-brachylog_adfix('integer':1, 'string':S, 'string':P) :-
-    brachylog_adfix('integer':1, S, P).
-brachylog_adfix('integer':1, 'integer':0, 'integer':0).
-brachylog_adfix('integer':1, 'integer':I, 'integer':P) :-
-    H #\= 0,
-    H2 #\= 0,
-    abs(P) #=< abs(I),
-    integer_value('integer':Sign:[H|T], I),
-    integer_value('integer':Sign:[H2|T2], P),
-    brachylog_adfix('integer':1, [H|T], [H2|T2]).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_BEHEAD
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_behead_reversed(S, I, O) :-
-    brachylog_behead(S, O, I).
-brachylog_behead('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_behead('integer':I, Arg, Output).
-brachylog_behead('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_behead('integer':I, Arg, Output).
-brachylog_behead('integer':0, Input, Input).
-brachylog_behead('default', Input, Output) :-
-    brachylog_behead('integer':1, Input, Output).
-brachylog_behead('integer':1, 'string':[_|T], 'string':T).
-brachylog_behead('integer':1, 'integer':0, 'integer':0).
-brachylog_behead('integer':1, 'integer':I, 'integer':J) :-
-    H #\= 0,
-    integer_value('integer':Sign:[H|T], I),
-    integer_value('integer':Sign:T, J).
-brachylog_behead('integer':1, 'float':F,'float':G) :-
-    number_codes(F,L),
-    brachylog_behead_float(L,M),
-    number_codes(G,M).
-brachylog_behead('integer':1, [_|T],T).
-brachylog_behead('integer':I, Input, Output) :-
-    I #> 1,
-    brachylog_meta_iterate(ignore, 'integer':I, brachylog_behead, 'integer':1, Input, Output).
-
-brachylog_behead_float([], []).
-brachylog_behead_float([48|T], [48|T2]) :-
-    brachylog_behead_float(T, T2).
-brachylog_behead_float([46|T], [46|T2]) :-
-    brachylog_behead_float(T, T2).
-brachylog_behead_float([H|T], [48|T2]) :-
-    H \= 46,
-    H \= 48,
-    brachylog_behead_float_(T, T2).
-
-brachylog_behead_float_([], []).
-brachylog_behead_float_([H|T], [H|T2]) :-
-    brachylog_behead_float_(T, T2).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_CONCATENATE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_concatenate_reversed(S, I, O) :-
-    brachylog_concatenate(S, O, I).
-brachylog_concatenate('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_concatenate('integer':I, Arg, Output).
-brachylog_concatenate('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_concatenate('integer':I, Arg, Output).
-brachylog_concatenate('default', Input, Output) :-
-    brachylog_concatenate('integer':0, Input, Output).
-brachylog_concatenate('integer':I, Input, Output) :-
-    I #> 0,
-    length(Input, I),
-    brachylog_concatenate('integer':0, Input, Output).
-brachylog_concatenate('integer':0, [], []).
-brachylog_concatenate('integer':0, [H|T],L) :-
-    var(L),
-    (   maplist(is_brachylog_list, [H|T]),
-        brachylog_coerce('default', L, L),
-        List = L,
-        ListOfLists = [H|T],
-        Integers = 'no'
-    ;   maplist(brachylog_concatenate_prepend_string_or_empty, ListOfLists, [H|T]),
-        brachylog_coerce('integer':2, 'string':List, L),
-        Integers = 'no'
-    ;   maplist(brachylog_concatenate_integer_value, ListOfLists, [H|T]),
-        Integers = 'yes'
-    ),
-    brachylog_concatenate_(ListOfLists, List),
-    (   Integers = 'yes',
-        List = [0],
-        L = 'integer':0
-    ;   Integers = 'yes',
-        List = [J|TList],
-        integer_value('integer':'positive':[J|TList], I),
-        L = 'integer':I
-    ;   Integers = 'no'
-    ).
-brachylog_concatenate('integer':0, [H|T], L) :-
-    nonvar(L),
-    brachylog_length('default', L, 'integer':Length),
-    (   var(T) ->
-        LengthList #> 0,
-        LengthList #=< Length,
-        indomain(LengthList),
-        length([H|T], LengthList),
-        CanContainEmpty = 'no'
-    ;   CanContainEmpty = 'yes'
-    ),
-    (   is_brachylog_list(L),
-        maplist(brachylog_coerce('default'), [H|T], [H|T]),
-        List = L,
-        ListOfLists = [H|T]
-    ;   L = 'string':List,
-        maplist(brachylog_concatenate_prepend_string_or_empty, ListOfLists, [H|T])
-    ;   L = 'integer':I,
-        (   I = 0,
-            List = [0]
-        ;   I #\= 0,
-            J #\= 0,
-            integer_value('integer':_:[J|TList], I),
-            List = [J|TList]
-        ),
-        (
-            CanContainEmpty = 'no' ->
-            maplist(brachylog_concatenate_limit_length(1, Length), [H|T])
-        ;   maplist(brachylog_concatenate_limit_length(0, Length), [H|T])
-        ),
-        maplist(brachylog_concatenate_integer_value, ListOfLists, [H|T])
-    ),
-    (
-        CanContainEmpty = 'no' ->
-        maplist(brachylog_concatenate_limit_length(1, Length), [H|T])
-    ;   maplist(brachylog_concatenate_limit_length(0, Length), [H|T])
-    ),
-    brachylog_concatenate_(ListOfLists, List).
-
-brachylog_concatenate_prepend_string_or_empty([], []).
-brachylog_concatenate_prepend_string_or_empty(S, 'string':S).
-
-brachylog_concatenate_limit_length(Min, Max, H) :-
-    Length #>= Min,
-    Length #=< Max,
-    indomain(Length),
-    brachylog_length('default', H, 'integer':Length).
-
-brachylog_concatenate_integer_value([0], 'integer':0).
-brachylog_concatenate_integer_value([], []).
-brachylog_concatenate_integer_value([H|T], 'integer':I) :-
-    H #\= 0,
-    integer_value('integer':_:[H|T], I).
-
-brachylog_concatenate_([L|T], L2) :-
-    is_brachylog_list(L2),
-    append([L|T], L2).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_DUPLICATES
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_duplicates_reversed(S, I, O) :-
-    brachylog_duplicates(S, O, I).
-brachylog_duplicates('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_duplicates('integer':I, Arg, Output).
-brachylog_duplicates('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_duplicates('integer':I, Arg, Output).
-brachylog_duplicates('default', Input, Output) :-
-    brachylog_duplicates('integer':0, Input, Output).
-brachylog_duplicates('integer':0, 'string':S, 'string':T) :-
-    list_to_set(S, T).
-brachylog_duplicates('integer':0, 'integer':I, 'integer':J) :-
-    brachylog_label('default', 'integer':I, 'integer':I),
-    number_codes(I, C),
-    list_to_set(C, S),
-    number_codes(J, S).
-brachylog_duplicates('integer':0, 'float':F, 'float':G) :-
-    number_codes(F, C),
-    list_to_set(C, S),
-    number_codes(G, S).
-brachylog_duplicates('integer':0, L, M) :-
-    is_brachylog_list(L),
-    list_to_set(L, M).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_FACTORS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_factors_reversed(S, I, O) :-
-    brachylog_factors(S, O, I).
-brachylog_factors('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_factors('integer':I, Arg, Output).
-brachylog_factors('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_factors('integer':I, Arg, Output).
-brachylog_factors('default', 'integer':N, Z) :-
-    brachylog_label('default', 'integer':N, _),
-    (   N = 0 ,
-        Z = []
-    ;   N #> 0,
-        findall('integer':X, (X #>= 1, X #=< N, I #>= 1, I #=< N, N #= X*I, indomain(X)), Z)
-    ;   N #< 0,
-        findall('integer':X, (X #=< -1, X #>= N, I #>= 1, I #=< abs(N), N #= X*I, labeling([max(X)], [X])), Z)
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_GROUP
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_group_reversed(S, I, O) :-
-    brachylog_group(S, O, I).
-brachylog_group('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_group('integer':I, Arg, Output).
-brachylog_group('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_group('integer':I, Arg, Output).
-brachylog_group('integer':0, Input, Input).
-brachylog_group('default', Input, Output) :-
-    brachylog_group('integer':1, Input, Output).
-brachylog_group('integer':1, X, [X]).
-brachylog_group('integer':I, Input, Output) :-
-    I #> 1,
-    brachylog_meta_iterate(ignore, 'integer':I, brachylog_group, 'integer':1, Input, Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_HEAD
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_head_reversed(S, I, O) :-
-    brachylog_head(S, O, I).
-brachylog_head('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_head('integer':I, Arg, Output).
-brachylog_head('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_head('integer':I, Arg, Output).
-brachylog_head('integer':0, _, []).
-brachylog_head('default', 'string':[H|_], 'string':[H]).
-brachylog_head('default', 'integer':0, 'integer':0).
-brachylog_head('default', 'integer':I, 'integer':J) :-
-    J #\= 0,
-    integer_value('integer':_:[J|_], I).
-brachylog_head('default', 'float':F, 'integer':I) :-
-    number_codes(F,L),
-    brachylog_head_float(L, 'integer':I).
-brachylog_head('default', [H|_], H).
-brachylog_head('integer':I, Input, Output) :-
-    I #> 0,
-    brachylog_length('default', Output, 'integer':I),
-    once(brachylog_concatenate('default', [Output, _], Input)).
-
-brachylog_head_float([H|T], 'integer':I) :-
-    (   (   H = 48
-        ;   H = 46
-        ) ->
-        (   T = [],
-            I = 0
-        ;   T \= [],
-            brachylog_head_float(T, 'integer':I)
-        )
-    ;   H \= 48,
-        H \= 46,
-        number_codes(I, [H])
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_INDEX
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_index_reversed(S, I, O) :-
-    brachylog_index(S, I, O).
-brachylog_index('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_index('integer':I, Arg, Output).
-brachylog_index('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_index('integer':I, Arg, Output).
-brachylog_index('default', Input, [E,'integer':I]) :-
-    brachylog_in('integer':I, Input, E).
-brachylog_index('integer':1, Input, [E,'integer':J]) :-
-    J #= I + 1,
-    brachylog_in('integer':I, Input, E).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_JUXTAPOSE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_juxtapose_reversed(S, I, O) :-
-    brachylog_juxtapose(S, O, I).
-brachylog_juxtapose('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_juxtapose('integer':I, Arg, Output).
-brachylog_juxtapose('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_juxtapose('integer':I, Arg, Output).
-brachylog_juxtapose('default', Input, Output) :-
-    brachylog_juxtapose('integer':2, Input, Output).
-brachylog_juxtapose('integer':_, [], []).
-brachylog_juxtapose('integer':0, [_|_], []).
-brachylog_juxtapose('integer':I, [H|T], Z) :-
-    var(Z),
-    Z = [HZ|TZ],
-    I #> 0,
-    length([H|T], L),
-    LZ #= I*L,
-    length([HZ|TZ], LZ),
-    append([H|T], T2, [HZ|TZ]),
-    J #= I-1,
-    brachylog_juxtapose('integer':J, [H|T], T2).
-brachylog_juxtapose('integer':I, [H|T], Z) :-
-    nonvar(Z),
-    Z = [HZ|TZ],
-    I #> 0,
-    length([HZ|TZ], LZ),
-    LZ #= I*L,
-    indomain(L),
-    length([H|T], L),
-    append([H|T], T2, [HZ|TZ]),
-    J #= I-1,
-    brachylog_juxtapose('integer':J, [H|T], T2).
-brachylog_juxtapose('integer':I, 'string':S, 'string':Z) :-
-    brachylog_juxtapose('integer':I, S, Z).
-brachylog_juxtapose('integer':J, 'integer':I, 'integer':Z) :-
-    var(Z),
-    dif(H, 0),
-    integer_value('integer':Sign:[H|T], I),
-    brachylog_juxtapose('integer':J, [H|T], LZ),
-    LZ = [HZ|_],
-    dif(HZ, 0),
-    integer_value('integer':Sign:LZ, Z).
-brachylog_juxtapose('integer':J, 'integer':I, 'integer':Z) :-
-    nonvar(Z),
-    dif(H, 0),
-    dif(HZ, 0),
-    integer_value('integer':Sign:[HZ|TZ], Z),
-    brachylog_juxtapose('integer':J, [H|T], [HZ|TZ]),
-    integer_value('integer':Sign:[H|T], I).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_KNIFE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_knife_reversed(S, I, O) :-
-    brachylog_knife(S, O, I).
-brachylog_knife('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_knife('integer':I, Arg, Output).
-brachylog_knife('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_knife('integer':I, Arg, Output).
-brachylog_knife('integer':0, Input, Input).
-brachylog_knife('default', Input, Output) :-
-    brachylog_knife('integer':1, Input, Output).
-brachylog_knife('integer':1, [_], []).
-brachylog_knife('integer':1, [H,I|T], [H2|T2]) :-
-    (   var(T) ->
-        reverse(T3, [H2|T2]),
-        reverse([H,I|T], [_|T3])
-    ;   reverse([H,I|T], [_|T3]),
-        reverse(T3, [H2|T2])
-    ).
-brachylog_knife('integer':1, 'string':S, 'string':T) :-
-    brachylog_knife('integer':1, S, T).
-brachylog_knife('integer':1, 'integer':I, 'integer':0) :-
-    I in -9..9.
-brachylog_knife('integer':1, 'integer':I, 'integer':J) :-
-    H #\= 0,
-    H2 #\= 0,
-    abs(J) #=< abs(I),
-    abs(I) #=< 10*(abs(J) + 1),
-    integer_value('integer':Sign:[H|T], I),
-    integer_value('integer':Sign:[H2|T2], J),
-    brachylog_knife('integer':1, [H|T], [H2|T2]).
-brachylog_knife('integer':I, Input, Output) :-
-    I #> 1,
-    brachylog_meta_iterate(ignore, 'integer':I, brachylog_knife, 'integer':1, Input, Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_LENGTH
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_length_reversed(S, I, O) :-
-    brachylog_length(S, O, I).
-brachylog_length('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_length('integer':I, Arg, Output).
-brachylog_length('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_length('integer':I, Arg, Output).
-brachylog_length('integer':I, Input, Input) :-
-    I #>= 0,
-    brachylog_length('default', Input, 'integer':I).
-brachylog_length('default', [], 'integer':0).
-brachylog_length('default', [H|T], 'integer':Length) :-
-    length([H|T], Length).
-brachylog_length('default', 'string':S, 'integer':Length) :-
-    length(S, Length).
-brachylog_length('default', 'integer':0, 'integer':1).
-brachylog_length('default', 'integer':I, 'integer':Length) :-
-    nonvar(Length),
-    (   Length = 1 ->
-        I in 1..9
-    ;   H #\= 0,
-        abs(I) #< 10^Length,
-        integer_value('integer':_:[H|T], I),
-        length([H|T], Length)
-    ).
-brachylog_length('default', 'integer':I, 'integer':Length) :-
-    var(Length),
-    H #\= 0,
-    Length #>= 0,
-    integer_value('integer':_:[H|T], I),
-    length([H|T], Length).
-brachylog_length('default', 'float':F, 'integer':Length) :-
-    nonvar(F),
-    length(L, Length),
-    catch(number_codes(F, L), E, (print_message(error, E), false)).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_ORDER
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_order_reversed(S, I, O) :-
-    brachylog_order(S, O, I).
-brachylog_order('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_order('integer':I, Arg, Output).
-brachylog_order('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_order('integer':I, Arg, Output).
-brachylog_order('default', Input, Output) :-
-    brachylog_order('integer':0, Input, Output).
-brachylog_order('integer':0, 'string':S, 'string':T) :-
-    (   nonvar(S),
-        msort(S, T)
-    ;   var(S),
-        msort(T, T),
-        brachylog_permute('default', 'string':T, 'string':S)
-    ).
-brachylog_order('integer':0, 'integer':I, 'integer':J) :-
-    brachylog_label('default', 'integer':I, _),
-    number_codes(I, C),
-    msort(C, D),
-    number_codes(J, D).
-brachylog_order('integer':0, [], []).
-brachylog_order('integer':0, [H|T], [H2|T2]) :-
-    (   nonvar(T),
-        brachylog_order_mixed_sort_([H|T], [H2|T2])
-    ;   var(T),
-        brachylog_order_mixed_sort_([H2|T2], [H2|T2]),
-        brachylog_permute('default', [H2|T2], [H|T])
-    ).
-brachylog_order('integer':1, Input, Output) :-
-    brachylog_order('integer':0, Input, ROutput),
-    brachylog_reverse('default', ROutput, Output).
-
-% keysort sorts by the first element of a - pair, disregarding but preserving the second
-brachylog_order_type_pair_(List, PairsList-list) :-
-    maplist(brachylog_order_type_pair_, List, PairsList).
-brachylog_order_type_pair_(Type:Value, Value-Type).
-brachylog_order_mixed_sort_(List, Sorted) :-
-    maplist(brachylog_order_type_pair_, List, IPairs),
-    keysort(IPairs, OPairs), % keysort, like msort, doesn't remove duplicates
-    maplist(brachylog_order_type_pair_, Sorted, OPairs).
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_PERMUTE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_permute_reversed(S, I, O) :-
-    brachylog_permute(S, O, I).
-brachylog_permute('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_permute('integer':I, Arg, Output).
-brachylog_permute('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_permute('integer':I, Arg, Output).
-brachylog_permute('default', Input, Output) :-
-    brachylog_permute('integer':0, Input, Output).
-brachylog_permute('integer':0, 'string':S, 'string':Permutation) :-
-    permutation(S, Permutation).
-brachylog_permute('integer':0, List, Permutation) :-
-    is_brachylog_list(List),
-    is_brachylog_list(Permutation),
-    permutation(List, Permutation).
-brachylog_permute('integer':0, 'integer':0, 'integer':0).
-brachylog_permute('integer':0, 'integer':I, 'integer':J) :-
-    H #\= 0,
-    J #\= 0,
-    integer_value('integer':Sign:[H|L], I),
-    permutation([H|L], M),
-    integer_value('integer':Sign:M, J).
-brachylog_permute('integer':0, 'float':F, 'float':G) :-
-    Sign is abs(F)/F,
-    AF is abs(F),
-    number_chars(AF, C),
-    permutation(C, D),
-    \+ ( D = ['.'|_] ; reverse(D, ['.'|_])),
-    number_chars(AG, D),
-    G is Sign*AG.
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_SUBSTRING
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_substring_reversed(S, I, O) :-
-    brachylog_substring(S, O, I).
-brachylog_substring('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_substring('integer':I, Arg, Output).
-brachylog_substring('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_substring('integer':I, Arg, Output).
-brachylog_substring('default', 'integer':0, 'integer':0).
-brachylog_substring('default', 'integer':I, 'integer':J) :-
-    H #\= 0,
-    integer_value('integer':Sign:[H|L], I),
-    brachylog_substring_recur([H|L], [H2|L2]),
-    integer_value('integer':Sign:[H2|L2], J).
-brachylog_substring('default', 'string':[], 'string':[]).
-brachylog_substring('default', 'string':[H|T], 'string':[H2|T2]) :-
-    brachylog_substring_recur([H|T], [H2|T2]).
-brachylog_substring('default', [], []).
-brachylog_substring('default', [H|T], [H2|T2]) :-
-    brachylog_substring_recur([H|T], [H2|T2]).
-brachylog_substring('integer':I, Input, Output) :-
-    brachylog_length('default', Output, 'integer':I),
-    brachylog_substring('default', Input, Output).
-
-brachylog_substring_recur([], []).
-brachylog_substring_recur([H|T], [H|T2]) :-
-    brachylog_substring_recur_(T, T2).
-brachylog_substring_recur([_|T], T2) :-
-    brachylog_substring_recur(T, T2).
-
-brachylog_substring_recur_([], []).
-brachylog_substring_recur_([H|T], [H|T2]) :-
-    brachylog_substring_recur_(T, T2).
-brachylog_substring_recur_([_|_], []).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_TAIL
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_tail_reversed(S, I, O) :-
-    brachylog_tail(S, O, I).
-brachylog_tail('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_tail('integer':I, Arg, Output).
-brachylog_tail('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_tail('integer':I, Arg, Output).
-brachylog_tail('integer':0, _, []).
-brachylog_tail('default', 'string':L, 'string':[H]) :-
-    reverse(L, [H|_]).
-brachylog_tail('default', 'integer':0, 'integer':0).
-brachylog_tail('default', 'integer':I, 'integer':Z) :-
-    J #\= 0,
-    integer_value('integer':_:[J|T], I),
-    reverse([J|T], [Z|_]).
-brachylog_tail('default', 'float':F, 'integer':I) :-
-    number_codes(F, L),
-    reverse(L, R),
-    brachylog_tail_float(R, 'integer':I).
-brachylog_tail('default', L, H) :-
-    is_brachylog_list(L),
-    reverse(L, [H|_]).
-brachylog_tail('integer':I, Input, Output) :-
-    I #> 0,
-    brachylog_length('default', Output, 'integer':I),
-    once(brachylog_concatenate('default', [_,Output], Input)).
-
-brachylog_tail_float([H|T], 'integer':I) :-
-    (   (   H = 48
-        ;   H = 46
-        ) ->
-        (   T = [],
-            I = 0
-        ;   T \= [],
-            brachylog_tail_float(T, 'integer':I)
-        )
-    ;   H \= 48,
-        H \= 46,
-        number_codes(I, [H])
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_WRITE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_write_reversed(S, I, O) :-
-    brachylog_write(S, O, I).
-brachylog_write('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_write('integer':I, Arg, Output).
-brachylog_write('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_write('integer':I, Arg, Output).
-brachylog_write('default', Input, Output) :-
-    brachylog_write('integer':0, Input, Output).
-brachylog_write('integer':Sub, I, O) :-
-  S #= Sub mod 4,
-  brachylog_write_('integer':S, I, O, T),
-  (    Sub #< 4,                         % imperative write
-       write(T)
-  ;    Sub #>= 4,
-       b_getval('declw', DOld),         % Declarative write
-       append(DOld, [T], DNew),
-       b_setval('declw', DNew)
-  ).
-
-brachylog_write_('integer':1, [List,'string':F], _, T) :-
-    is_brachylog_list(List),
-    atomic_list_concat(F, Format),
-    maplist(brachylog_write_try_label, List),
-    brachylog_prolog_variable(List, PrologList),
-    format(string(T), Format, PrologList).    % Output formatted text
-brachylog_write_('integer':1, Args, _, T) :-
-    is_brachylog_list(Args),
-    reverse(Args, ['string':F|R]),
-    reverse(R, S),
-    maplist(brachylog_write_try_label, S),
-    brachylog_prolog_variable(S, PrologS),
-    atomic_list_concat(F, Format),
-    format(string(T), Format, PrologS).    % Output formatted text
-brachylog_write_('integer':0, 'string':S, _, X) :-
-    nonvar(S),
-    atomic_list_concat(S, X).
-brachylog_write_('integer':0, 'integer':I, _, I) :-
-    brachylog_label('default', 'integer':I, _).
-brachylog_write_('integer':0, 'float':F, _, F) :-
-    nonvar(F).
-brachylog_write_('integer':0, List, _, PrologList) :-
-    is_brachylog_list(List),
-    maplist(brachylog_write_try_label, List),
-    brachylog_prolog_variable(List, PrologList).
-brachylog_write_('integer':2, I, I, T) :-
-    brachylog_write_('integer':0, I, _, T).
-brachylog_write_('integer':3, I, I, T) :-
-    brachylog_write_('integer':1, I, _, T).
-
-brachylog_write_try_label(X) :-
-    (   nonvar(X), X = 'float':_ -> true
-    ;   nonvar(X), X = 'string':_ -> true
-    ;   nonvar(X), X = [] -> true
-    ;   nonvar(X),
-        X = [H|T] ->
-        maplist(brachylog_write_try_label, [H|T])
-    ;   X = 'integer':I,
-        brachylog_label('default', 'integer':I, _)
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_XTERMINATE
-
-   TODO: Use sub to know what to remove instead
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_xterminate_reversed(S, I, O) :-
-    brachylog_xterminate(S, O, I).
-brachylog_xterminate('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_xterminate('integer':I, Arg, Output).
-brachylog_xterminate('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_xterminate('integer':I, Arg, Output).
-brachylog_xterminate('default', Input, Output) :-
-    brachylog_xterminate('integer':0, Input, Output).
-brachylog_xterminate('integer':0, [L,[]], L).
-brachylog_xterminate('integer':0, ['string':S,X], 'string':T) :-
-    \+ is_brachylog_list(X),
-    brachylog_xterminate_(X, 'string':S, 'string':T).
-brachylog_xterminate('integer':0, ['string':S,[H|T]], L3) :-
-    brachylog_xterminate_(H,'string':S, L2),
-    brachylog_xterminate('integer':0, [L2,T], L3).
-brachylog_xterminate('integer':0, [L,H|T], L3) :-
-    is_brachylog_list(L),
-    \+ is_brachylog_list(H),
-    brachylog_xterminate('integer':0, [L,[H|T]], L3).
-brachylog_xterminate('integer':0, [L,[H|T]], L3) :-
-    is_brachylog_list(L),
-    delete(L, H, L2),
-    brachylog_xterminate('integer':0, [L2,T], L3).
-
-brachylog_xterminate_(X, 'string':S, 'string':T) :-
-    brachylog_xterminate_single(X, 'string':S, 'string':T).
-brachylog_xterminate_(_, [], []).
-brachylog_xterminate_(X, [H|T], [H2|T2]) :-
-    brachylog_xterminate_single(X, H, H2),
-    brachylog_xterminate_(X, T, T2).
-
-brachylog_xterminate_single('string':L, 'string':H, 'string':Z) :-
-    (   append([A,L,B], H),
-        append(A,B,H2),
-        brachylog_xterminate_single('string':L, 'string':H2, 'string':Z)
-    ;   \+ append([_,L,_], H),
-        Z = H
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_ZIP
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_zip_reversed(S, I, O) :-
-    brachylog_zip(S, O, I).
-brachylog_zip('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_zip('integer':I, Arg, Output).
-brachylog_zip('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_zip('integer':I, Arg, Output).
-brachylog_zip('default', L,Z) :-
-    is_brachylog_list(L),
-    maplist(brachylog_length('default'), L, Lengths),
-    brachylog_order('default', Lengths, OrderedLengths),
-    reverse(OrderedLengths, ['integer':MaxLength|_]),
-    maplist(brachylog_zip_listify_integer, L, L2),
-    brachylog_zip_(L2, MaxLength, Z).
-brachylog_zip('integer':0, L, Z) :-
-    is_brachylog_list(L),
-    maplist(brachylog_length('default'), L, Lengths),
-    brachylog_order('default', Lengths, ['integer':MinLength|_]),
-    maplist(brachylog_zip_listify_integer, L, L2),
-    brachylog_zip_(L2, MinLength, Z).
-brachylog_zip('integer':1, L, Z) :-
-    is_brachylog_list(L),
-    maplist(brachylog_zip_listify_integer, L, L2),
-    brachylog_zip_no_cycling(L2, Z).
-brachylog_zip('integer':2, L, Z) :-
-    maplist(brachylog_length_reversed('default', _), L),    % fails if the lengths aren't all the same
-    brachylog_zip('default', L, Z).
-
-brachylog_zip_(_, 0, []).
-brachylog_zip_(L, I, [Heads|Z]) :-
-    I #> 0,
-    maplist(brachylog_head('default'), L, Heads),
-    maplist(brachylog_circular_permute_counterclockwise('default'), L, Tails),
-    J #= I - 1,
-    brachylog_zip_(Tails, J, Z).
-
-brachylog_zip_no_cycling([H|T], Z) :-
-    brachylog_meta_select(ignore, 'default', brachylog_head, 'default', [H|T], Heads),
-    (   Heads = [] ->
-        Z = []
-    ;   Z = [Heads|Z2],
-        brachylog_meta_select(ignore, 'default', brachylog_behead, 'default', [H|T], Tails),
-        brachylog_zip_no_cycling(Tails, Z2)
-    ).
-
-brachylog_zip_listify_integer(L, L) :-
-    L \= 'integer':_.
-brachylog_zip_listify_integer('integer':I, L) :-
-    brachylog_elements('default', 'integer':I, L).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_TO_CODES
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_to_codes_reversed(S, I, O) :-
-    brachylog_to_codes(S, O, I).
-brachylog_to_codes('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_to_codes('integer':I, Arg, Output).
-brachylog_to_codes('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_to_codes('integer':I, Arg, Output).
-brachylog_to_codes('default', 'string':[], []).
-brachylog_to_codes('default', 'string':[H|T], ['integer':I|T2]) :-
-    (   var(T) ->
-        length(T2,Length),
-        length(T,Length)
-    ;   length(T,Length),
-        length(T2,Length)
-    ),
-    maplist(prepend_integer, L, ['integer':I|T2]),
-    maplist(single_atom_code, [H|T],L).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_BLOCKS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_blocks_reversed(S, I, O) :-
-    brachylog_blocks(S, O, I).
-brachylog_blocks('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_blocks('integer':I, Arg, Output).
-brachylog_blocks('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_blocks('integer':I, Arg, Output).
-brachylog_blocks('default', [], []).
-brachylog_blocks('default', [H|T], Blocks) :-
-    brachylog_blocks('default', [H|T], H, Blocks).
-brachylog_blocks('default', 'string':[H|T], StringBlocks) :-
-    maplist(prepend_string, Blocks, StringBlocks),
-    brachylog_blocks('default', [H|T], H, Blocks),
-    !.
-
-brachylog_blocks('default', [], _, [[]]).
-brachylog_blocks('default', [H|T], H, [[H|T2]|T3]) :-
-    brachylog_blocks('default', T, H, [T2|T3]).
-brachylog_blocks('default', [H|T], I, [[],[H|T2]|T3]) :-
-    dif(H, I),
-    brachylog_blocks('default', T, H, [T2|T3]).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_DICHOTOMIZE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_dichotomize_reversed(S, I, O) :-
-    brachylog_dichotomize(S, O, I).
-brachylog_dichotomize('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_dichotomize('integer':I, Arg, Output).
-brachylog_dichotomize('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_dichotomize('integer':I, Arg, Output).
-brachylog_dichotomize('default', Input, Output) :-
-    brachylog_dichotomize('integer':2, Input, Output).
-brachylog_dichotomize('integer':I, Input, Output) :-
-    brachylog_label('default', 'integer':I, _),
-    length(Output, I),
-    brachylog_dichotomize(Input, Output).
-brachylog_dichotomize('string':L, L2) :-
-    maplist(prepend_string,M, L2),
-    brachylog_dichotomize(L, M).
-brachylog_dichotomize('integer':0, L2) :-
-    length(L2, Length),
-    length(M, Length),
-    brachylog_dichotomize([0], M),
-    maplist(maplist(prepend_integer), M, L2).
-brachylog_dichotomize('integer':I, L2) :-
-    H #\= 0,
-    integer_value('integer':_:[H|T], I),
-    length(L2, Length),
-    length(M, Length),
-    brachylog_dichotomize([H|T], M),
-    maplist(maplist(prepend_integer), M, L2).
-brachylog_dichotomize(L, L2) :-
-    is_brachylog_list(L),
-    maplist(is_brachylog_list, L2),
-    Length #= LengthL//LengthL2,
-    length(L2, LengthL2),
-    length(L, LengthL),
-    reverse(L2, [_|T]),
-    maplist(length_(Length), T),
-    append(L2, L),
-    !.
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_ELEMENTS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_elements_reversed(S, I, O) :-
-    brachylog_elements(S, O, I).
-brachylog_elements('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_elements('integer':I, Arg, Output).
-brachylog_elements('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_elements('integer':I, Arg, Output).
-brachylog_elements('default', [], []).
-brachylog_elements('default', [H|T], L) :-
-    maplist(brachylog_elements('default'), [H|T], L).
-brachylog_elements('default', 'string':S, L) :-
-    brachylog_meta_find(ignore, 'default', brachylog_in, 'default', 'string':S, L).
-brachylog_elements('default', 'integer':I, L) :-
-    brachylog_meta_find(ignore, 'default', brachylog_in, 'default', 'integer':I, L).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_TO_NUMBER
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_to_number_reversed(S, I, O) :-
-    brachylog_to_number(S, O, I).
-brachylog_to_number('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_to_number('integer':I, Arg, Output).
-brachylog_to_number('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_to_number('integer':I, Arg, Output).
-brachylog_to_number('default', 'string':S, Type:N) :-
-    atomic_list_concat(S, A),
-    atom_number(A,N),
-    (   member('.', S) ->
-        Type = 'float'
-    ;   Type = 'integer'
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_LOWERCASE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_lowercase_reversed(S, I, O) :-
-    brachylog_lowercase(S, O, I).
-brachylog_lowercase('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_lowercase('integer':I, Arg, Output).
-brachylog_lowercase('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_lowercase('integer':I, Arg, Output).
-brachylog_lowercase('default', 'string':Ls0, 'string':Ls) :-
-    maplist(downcase_atom, Ls0, Ls).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_SPLIT_LINES
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_split_lines_reversed(S, I, O) :-
-    brachylog_split_lines(S, O, I).
-brachylog_split_lines('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_split_lines('integer':I, Arg, Output).
-brachylog_split_lines('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_split_lines('integer':I, Arg, Output).
-brachylog_split_lines('default', 'string':[], ['string':[]]).
-brachylog_split_lines('default', 'string':['\n'|T], ['string':[]|T3]) :-
-    brachylog_split_lines('default', 'string':T, T3).
-brachylog_split_lines('default', 'string':['\r','\r\n'|T], ['string':[]|T3]) :-
-    brachylog_split_lines('default', 'string':T, T3).
-brachylog_split_lines('default', 'string':[H|T], ['string':[H|T2]|T3]) :-
-    dif(H, '\n'),
-    dif(H, '\r\n'),
-    brachylog_split_lines('default', 'string':T, ['string':T2|T3]).
-brachylog_split_lines('integer':1, 'string':[], ['string':[]]).
-brachylog_split_lines('integer':1, 'string':[' '|T], ['string':[]|T3]) :-
-    brachylog_split_lines('integer':1, 'string':T, T3).
-brachylog_split_lines('integer':1, 'string':[H|T], ['string':[H|T2]|T3]) :-
-    dif(H, ' '),
-    brachylog_split_lines('integer':1, 'string':T, ['string':T2|T3]).
-brachylog_split_lines('integer':2, 'string':[], ['string':[]]).
-brachylog_split_lines('integer':2, 'string':[' '|T], ['string':[]|T3]) :-
-    brachylog_split_lines('integer':2, 'string':T, T3).
-brachylog_split_lines('integer':2, 'string':['\n'|T], ['string':[]|T3]) :-
-    brachylog_split_lines('integer':2, 'string':T, T3).
-brachylog_split_lines('integer':2, 'string':['\r','\r\n'|T], ['string':[]|T3]) :-
-    brachylog_split_lines('integer':2, 'string':T, T3).
-brachylog_split_lines('integer':2, 'string':[H|T], ['string':[H|T2]|T3]) :-
-    dif(H, '\n'),
-    dif(H, '\r\n'),
-    dif(H, ' '),
-    brachylog_split_lines('integer':2, 'string':T, ['string':T2|T3]).
-brachylog_split_lines('integer':3, Input, Output) :-
-    brachylog_split_lines('default', Input, L1),
-    brachylog_meta_map(ignore, 'default', brachylog_split_lines, 'integer':1, L1, Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_OCCURENCES
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_occurences_reversed(S, I, O) :-
-    brachylog_occurences(S, O, I).
-brachylog_occurences('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_occurences('integer':I, Arg, Output).
-brachylog_occurences('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_occurences('integer':I, Arg, Output).
-brachylog_occurences('default', 'string':[], []).
-brachylog_occurences('default', 'string':[H|T], L) :-
-    brachylog_elements('default', 'string':[H|T], E),
-    brachylog_occurences('default', E, L).
-brachylog_occurences('default', 'integer':0, [['integer':0,'integer':1]]).
-brachylog_occurences('default', 'integer':I, L) :-
-    H #\= 0,
-    brachylog_elements('default', 'integer':I, ['integer':H|T]),
-    brachylog_occurences('default', ['integer':H|T], L).
-brachylog_occurences('default', [], []).
-brachylog_occurences('default', [H|T], [[H,'integer':O]|T2]) :-
-    brachylog_occurences_(H, [H|T], O, R),
-    brachylog_occurences('default', R, T2).
-
-brachylog_occurences_(_, [], 0, []).
-brachylog_occurences_(H, [H|T], I, R) :-
-    I #= J + 1,
-    brachylog_occurences_(H, T, J, R).
-brachylog_occurences_(H, [H2|T], I, [H2|R]) :-
-    dif(H, H2),
-    brachylog_occurences_(H, T, I, R).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_RANDOM_ELEMENT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_random_element_reversed(S, I, O) :-
-    brachylog_random_element(S, O, I).
-brachylog_random_element('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_random_element('integer':I, Arg, Output).
-brachylog_random_element('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_random_element('integer':I, Arg, Output).
-brachylog_random_element('default', [], []).
-brachylog_random_element('default', [H|T], R) :-
-    length([H|T], L),
-    M #= L - 1,
-    random_between(0, M, I),
-    nth0(I, [H|T], R).
-brachylog_random_element('default', 'string':S, 'string':[R]) :-
-    brachylog_random_element('default', S, R).
-brachylog_random_element('default', 'integer':0, 'integer':0).
-brachylog_random_element('default', 'integer':I, 'integer':R) :-
-    H #\= 0,
-    integer_value('integer':_:[H|T], I),
-    brachylog_random_element('default', [H|T], R).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_SHUFFLE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_shuffle_reversed(S, I, O) :-
-    brachylog_shuffle(S, O, I).
-brachylog_shuffle('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_shuffle('integer':I, Arg, Output).
-brachylog_shuffle('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_shuffle('integer':I, Arg, Output).
-brachylog_shuffle('default', [], []).
-brachylog_shuffle('default', [H|T], [H2|T2]) :-
-    random_permutation([H|T], [H2|T2]).
-brachylog_shuffle('default', 'string':S, 'string':T) :-
-    brachylog_shuffle('default', S, T).
-brachylog_shuffle('default', 'integer':I, 'integer':J) :-
-    H #\= 0,
-    integer_value('integer':Sign:[H|T], I),
-    (   H2 #\= 0,
-        brachylog_shuffle('default', [H|T], [H2|T2]) ->
-        integer_value('integer':Sign:[H2|T2], J)
-    ;   brachylog_shuffle('default', 'integer':I, 'integer':J)
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_UPPERCASE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_uppercase_reversed(S, I, O) :-
-    brachylog_uppercase(S, O, I).
-brachylog_uppercase('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_uppercase('integer':I, Arg, Output).
-brachylog_uppercase('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_uppercase('integer':I, Arg, Output).
-brachylog_uppercase('default', 'string':Ls0, 'string':Ls) :-
-    maplist(upcase_atom, Ls0, Ls).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_WRITELN
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_writeln_reversed(S, I, O) :-
-    brachylog_writeln(S, O, I).
-brachylog_writeln('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_writeln('integer':I, Arg, Output).
-brachylog_writeln('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_writeln('integer':I, Arg, Output).
-brachylog_writeln('default', I, O) :-
-    brachylog_writeln('integer':0, I, O).
-brachylog_writeln('integer':Sub, I, O) :-
-    brachylog_write('integer':Sub, I, O),
-    (    Sub #> 3,                                       % declarative write
-         brachylog_write('integer':4, 'string':['\n'], _)
-    ;    Sub #< 4,                                       % imperative write
-         brachylog_write('default', 'string':['\n'], _)
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_ABSOLUTE_VALUE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_absolute_value_reversed(S, I, O) :-
-    brachylog_absolute_value(S, O, I).
-brachylog_absolute_value('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_absolute_value('integer':I, Arg, Output).
-brachylog_absolute_value('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_absolute_value('integer':I, Arg, Output).
-brachylog_absolute_value('default', 'integer':I, 'integer':J) :-
-    J #= abs(I).
-brachylog_absolute_value('default', 'float':I, 'float':J) :-
-    nonvar(I),
-    J is abs(I).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_BASE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_base_reversed(S, I, O) :-
-    brachylog_base(S, O, I).
-brachylog_base('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_base('integer':I, Arg, Output).
-brachylog_base('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_base('integer':I, Arg, Output).
-brachylog_base('default', Input, Output) :-
-    brachylog_base('integer':2, Input, Output).
-brachylog_base('integer':1, 'integer':I, Output) :-
-    brachylog_label('default', 'integer':I, _),
-    length(Output, I),
-    (   Output = ['integer':1|_] ->
-        brachylog_equal('default', Output, _)
-    ;   true
-    ).
-brachylog_base('integer':B, 'integer':I, L) :-
-    B #> 1,
-    %brachylog_label('default', ['integer':I, 'integer':B], _),
-    (   I #>= 0
-    ;   I #< 0
-    ),
-    J #= abs(I),
-    n_base_digits(J, B, L).
-
-% Credits to @repeat
-% See: http://stackoverflow.com/a/33543199/2554145
-n_base_digits(Expr, Base, Ds) :-
-    Base #> 1,
-    Ds = [_|_],
-    N #=  Expr,
-    N #>= 0,
-    n_base_ref_acc_digits(N, Base, Ds, [], Ds).
-
-n_base_ref_acc_digits(N, Base, Ref, Ds0, Ds) :-
-    zcompare(Order, N, Base),
-    order_n_base_ref_acc_digits(Order, N, Base, Ref, Ds0, Ds).
-
-order_n_base_ref_acc_digits(<, N, _, [_], Ds0, ['integer':N|Ds0]).
-order_n_base_ref_acc_digits(=, _, _, [_,_], Ds0, ['integer':1,'integer':0|Ds0]).
-order_n_base_ref_acc_digits(>, N, Base, [_|Rs], Ds0, Ds) :-
-    N0 #= N //  Base,
-    N1 #= N mod Base,
-    n_base_ref_acc_digits(N0, Base, Rs, ['integer':N1|Ds0], Ds).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_COERCE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_coerce_reversed(S, I, O) :-
-    brachylog_coerce(S, O, I).
-brachylog_coerce('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_coerce('integer':I, Arg, Output).
-brachylog_coerce('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_coerce('integer':I, Arg, Output).
-brachylog_coerce('default', [], []).
-brachylog_coerce('default', [H|T], [H|T]).
-brachylog_coerce('integer':1, 'integer':I, 'integer':I).
-brachylog_coerce('integer':2, 'string':S, 'string':S).
-
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_PRIME_DECOMPOSITION
-
-   Credits to RosettaCode
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_prime_decomposition_reversed(S, I, O) :-
-    brachylog_prime_decomposition(S, O, I).
-brachylog_prime_decomposition('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_prime_decomposition('integer':I, Arg, Output).
-brachylog_prime_decomposition('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_prime_decomposition('integer':I, Arg, Output).
-brachylog_prime_decomposition('default', 'integer':N, Z) :-
-    N #> 0,
-    brachylog_label('default', 'integer':N, _),
-    ceiled_square_root(N, SN),
-    brachylog_prime_decomposition_1(N, SN, 2, [], L),
-    brachylog_prime_decomposition_append_integer(L, Z).
-
-brachylog_prime_decomposition_1(1, _, _, L, L) :- !.
-brachylog_prime_decomposition_1(N, SN, D, L, LF) :-
-    (   0 #= N mod D ->
-        Q #= N // D,
-        ceiled_square_root(Q, SQ),
-        brachylog_prime_decomposition_1(Q, SQ, D, [D|L], LF)
-    ;   D1 #= D + 1,
-        (   D1 #> SN ->
-            LF = [N|L]
-        ;   brachylog_prime_decomposition_2(N, SN, D1, L, LF)
-        )
-    ).
-
-brachylog_prime_decomposition_2(1, _, _, L, L) :- !.
-brachylog_prime_decomposition_2(N, SN, D, L, LF) :-
-    (   0 #= N mod D ->
-        Q #= N // D,
-        ceiled_square_root(Q, SQ),
-        brachylog_prime_decomposition_2(Q, SQ, D, [D|L], LF);
-        D1 #= D + 2,
-        (   D1 #> SN ->
-            LF = [N|L]
-        ;   brachylog_prime_decomposition_2(N, SN, D1, L, LF)
-        )
-    ).
-
-brachylog_prime_decomposition_append_integer([], []).
-brachylog_prime_decomposition_append_integer([H|T], ['integer':H|T2]) :-
-    brachylog_prime_decomposition_append_integer(T, T2).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_FACTORIAL
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_factorial_reversed(S, I, O) :-
-    brachylog_factorial(S, O, I).
-brachylog_factorial('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_factorial('integer':I, Arg, Output).
-brachylog_factorial('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_factorial('integer':I, Arg, Output).
-brachylog_factorial('default', 'integer':N, 'integer':F) :-
-    brachylog_factorial_(N, 0, 1, F).
-
-brachylog_factorial_(N, I, N0, F) :-
-    F #> 0,
-    N #>= 0,
-    I #>= 0,
-    I #=< N,
-    N0 #> 0,
-    N0 #=< F,
-    if_(I #> 2,
-        (   F #> N,
-            if_(===(N, I, N0, F, T1),
-                if_(T1 = true,
-                    N0 = F,
-                    N = I
-                ),
-                (   J #= I + 1,
-                    N1 #= N0*J,
-                    predicates:brachylog_factorial_(N, J, N1, F)
-                )
-            )
-        ),
-        if_(N = I,
-            N0 = F,
-            (   J #= I + 1,
-                N1 #= N0*J,
-                predicates:brachylog_factorial_(N, J, N1, F)
-            )
-        )
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_GROUPS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_groups_reversed(S, I, O) :-
-    brachylog_groups(S, O, I).
-brachylog_groups('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_groups('integer':I, Arg, Output).
-brachylog_groups('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_groups('integer':I, Arg, Output).
-brachylog_groups('default', Input, Output) :-
-    I in 1..sup,
-    brachylog_groups('integer':I, Input, Output).
-brachylog_groups('integer':I, 'string':Input, Output) :-
-    brachylog_groups('integer':I, Input, S),
-    maplist(prepend_string, S, Output).
-brachylog_groups('integer':I, 'integer':Input, Output) :-
-    H #\= 0,
-    integer_value('integer':_:[H|T], Input),
-    brachylog_groups('integer':I, [H|T], S),
-    maplist(brachylog_groups_ints, S, Output).
-brachylog_groups('integer':I, Input, Output) :-
-    maplist(is_brachylog_list, [Input, Output]),
-    brachylog_groups(I, [], Input, Output).
-
-brachylog_groups(_, [H|T], [], [RL]) :-
-    reverse([H|T], RL).
-brachylog_groups(I, L, Input, [RL|T2]) :-
-    length(L, I),
-    reverse(L, RL),
-    brachylog_groups(I, [], Input, T2).
-brachylog_groups(I, L, [H|T], Output) :-
-    J #< I,
-    J #>= 0,
-    length(L, J),
-    brachylog_groups(I, [H|L], T, Output).
-
-brachylog_groups_ints(I, 'integer':O) :-
-    integer_value('integer':'positive':I, O).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_MATRIX
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_matrix_reversed(S, I, O) :-
-    brachylog_matrix(S, O, I).
-brachylog_matrix('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_matrix('integer':I, Arg, Output).
-brachylog_matrix('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_matrix('integer':I, Arg, Output).
-brachylog_matrix('default', M, M) :-
-    L in 0..sup,
-    brachylog_matrix('integer':L, M, M).
-brachylog_matrix('integer':L, M, M) :-
-    length(M, L),
-    maplist(length_(L), M).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_NEGATE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_negate_reversed(S, I, O) :-
-    brachylog_negate(S, O, I).
-brachylog_negate('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_negate('integer':I, Arg, Output).
-brachylog_negate('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_negate('integer':I, Arg, Output).
-brachylog_negate('default', 'integer':I, 'integer':J) :-
-    J #= -I.
-brachylog_negate('default', 'float':I, 'float':J) :-
-    nonvar(I),
-    J is -I.
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_PRIME
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_prime_reversed(S, I, O) :-
-    brachylog_prime(S, O, I).
-brachylog_prime('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_prime('integer':I, Arg, Output).
-brachylog_prime('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_prime('integer':I, Arg, Output).
-brachylog_prime('default', 'integer':N, 'integer':N) :-
-    clpfd:make_propagator(prime(N), Prop),
-    clpfd:init_propagator(N, Prop),
-    clpfd:trigger_once(Prop).
-
-clpfd:run_propagator(prime(N), MState) :-
-    (   nonvar(N) ->
-        clpfd:kill(MState),
-        check_prime(N)
-    ;   clpfd:fd_get(N, ND, NL, NU, NPs),
-        clpfd:cis_max(NL, n(2), NNL),
-        clpfd:update_bounds(N, ND, NPs, NL, NU, NNL, NU)
-    ).
-
-:- if(current_predicate(crypto_is_prime/2)).
-probably_prime(P) :- crypto_is_prime(P, []).
-:- else.
-probably_prime(_).
-:- endif.
-
-check_prime(N) :-
-    (   N = 2 ->
-        true
-    ;   N #> 2,
-        probably_prime(N),
-        ceiled_square_root(N, SN),
-        check_prime_1(N, SN, 2, [], [_])
-    ).
-
-check_prime_1(1, _, _, L, L) :- !.
-check_prime_1(N, SN, D, L, LF) :-
-    (   0 #= N mod D ->
-        false
-    ;   D1 #= D+1,
-        (   D1 #> SN ->
-            LF = [N|L]
-        ;   check_prime_2(N, SN, D1, L, LF)
-        )
-    ).
-
-check_prime_2(1, _, _, L, L) :- !.
-check_prime_2(N, SN, D, L, LF) :-
-    (   0 #= N mod D -> false
-    ;   D1 #= D+2,
-        (   D1 #> SN ->
-            LF = [N|L]
-        ;   check_prime_2(N, SN, D1, L, LF)
-        )
-).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_RANDOM_NUMBER
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_random_number_reversed(S, I, O) :-
-    brachylog_random_number(S, O, I).
-brachylog_random_number('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_random_number('integer':I, Arg, Output).
-brachylog_random_number('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_random_number('integer':I, Arg, Output).
-brachylog_random_number('default', 'integer':I, 'integer':R) :-
-    brachylog_random_number(['integer':0,'integer':I], 'integer':R).
-brachylog_random_number('default', 'float':I, 'float':R) :-
-    brachylog_random_number(['float':0.0,'float':I], 'float':R).
-brachylog_random_number('integer':1, _, 'float':R) :-
-    brachylog_random_number(['float':0, 'float':1], 'float':R).
-brachylog_random_number('integer':2, [A,B], R) :-
-    brachylog_random_number([A,B], R).
-
-brachylog_random_number(['integer':I,'integer':J], 'integer':R) :-
-    brachylog_label('default', ['integer':I,'integer':J], _),
-    (   I #=< J ->
-        random_between(I, J, R)
-    ;   random_between(J, I, R)
-    ).
-brachylog_random_number(['float':I,'float':J], 'float':R) :-
-    random(K),
-    (   I =< J ->
-        R is I + K*(J - I)
-    ;   R is J + K*(I - J)
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_SIGN
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_sign_reversed(S, I, O) :-
-    brachylog_sign(S, O, I).
-brachylog_sign('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_sign('integer':I, Arg, Output).
-brachylog_sign('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_sign('integer':I, Arg, Output).
-brachylog_sign('default', 'integer':I, 'integer':S) :-
-    (   I = 0,
-        S = 0
-    ;   I #\= 0,
-        S in -1\/1,
-        S #= abs(I) // I
-    ).
-brachylog_sign('default', 'float':F, 'integer':S) :-
-    nonvar(F),
-    (   F =:= 0.0 -> S = 0
-    ;   F > 0.0 -> S = 1
-    ;   F < 0.0 -> S = -1
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_TO_STRING
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_to_string_reversed(S, I, O) :-
-    brachylog_to_string(S, O, I).
-brachylog_to_string('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_to_string('integer':I, Arg, Output).
-brachylog_to_string('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_to_string('integer':I, Arg, Output).
-brachylog_to_string('default', 'integer':I, 'string':S) :-
-    brachylog_label('default', 'integer':I, 'integer':I),
-    atom_number(A, I),
-    atom_chars(A, S).
-brachylog_to_string('default', 'float':F, 'string':S) :-
-    atom_number(A, F),
-    atom_chars(A, S).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_CARTESIAN_PRODUCT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_cartesian_product_reversed(S, I, O) :-
-    brachylog_cartesian_product(S, O, I).
-brachylog_cartesian_product('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_cartesian_product('integer':I, Arg, Output).
-brachylog_cartesian_product('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_cartesian_product('integer':I, Arg, Output).
-brachylog_cartesian_product('default', Input, Output) :-
-    findall(L, brachylog_meta_map('ignore', 'default', brachylog_in, 'default', Input, L), Output).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_LABEL
-
-   Credits to Markus Triska
-   See: http://codereview.stackexchange.com/questions/129924/clpfd-labeling-on-possibly-infinite-domains/129945#129945
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_label_reversed(S, I, O) :-
-    brachylog_label(S, O, I).
-brachylog_label('first', ['integer':I|Input], Output) :-
-    (   Input = [Arg] -> true
-    ;   Input = Arg
-    ),
-    brachylog_label('integer':I, Arg, Output).
-brachylog_label('last', Input, Output) :-
-    reverse(Input, ['integer':I|T]),
-    (   T = [Arg] -> true
-    ;   reverse(T, Arg)
-    ),
-    brachylog_label('integer':I, Arg, Output).
-brachylog_label('default', Input, Output) :-
-    brachylog_label('integer':0, Input, Output).
-brachylog_label('integer':0, 'integer':Z, 'integer':Z) :-
-    unsafe_indomain(Z).
-brachylog_label('integer':0, Z, Z) :-
-    is_brachylog_list(Z),
-    maplist(brachylog_label('integer':0), Z, _).
-brachylog_label('integer':1, 'integer':Z, 'integer':Z) :-
-    get_time(T),
-    T2 is ceil(1000000 * T),
-    labeling([random_value(T2)], [Z]).
-brachylog_label('integer':1, Z, Z) :-
-    is_brachylog_list(Z),
-    get_time(T),
-    T2 is ceil(1000000 * T),
-    labeling([random_value(T2)], Z).
-
-unsafe_indomain(X) :-
-    fd_inf(X, Inf0),
-    fd_sup(X, Sup0),
-    maplist(limit_pure, [Inf0,Sup0], [Inf,Sup]),
-    unsafe_indomain_(Inf, Sup, X).
-
-limit_pure(inf, inf) :- !.
-limit_pure(sup, sup) :- !.
-limit_pure(N, n(N))  :- !.
-
-unsafe_indomain_(inf, Sup, X) :-
-    infinite_down(Sup, X).
-unsafe_indomain_(n(Low), Sup, X) :-
-    unsafe_up_(Sup, Low, X).
-
-infinite_down(sup, X) :-
-    (   X = 0
-    ;   abs(X) #= abs(N),
-        positive_integer(N),
-        ( X #= N ; X #= -N )
-    ).
-infinite_down(n(Up), X ) :-
-    (   between(0, Up, X)
-    ;   abs(X) #= abs(N),
-        positive_integer(N),
-        X #= -N
-    ).
-
-unsafe_up_(sup, Low, X) :-
-    (   between(Low, 0, X)
-    ;   positive_integer(X)
-    ).
-unsafe_up_(n(Up), Low, X) :- between(Low, Up, X).
-
-% See: http://stackoverflow.com/a/39259871/2554145
-positive_integer(I) :-
-    I #> 0,
-    (   var(I) ->
-        fd_inf(I, Inf),
-        (   I #= Inf
-        ;   I #\= Inf,
-            positive_integer(I)
-        )
-    ;   true
-    ).
--- a/ibin/brachylog/Brachylog-master/src/symbols.pl	Tue Jul 16 21:38:16 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,215 +0,0 @@
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-____            ____
-\   \          /   /
- \   \  ____  /   /
-  \   \/    \/   /
-   \     /\     /     BRACHYLOG       
-    \   /  \   /      A terse declarative logic programming language
-    /   \  /   \    
-   /     \/     \     Written by Julien Cumin - 2017
-  /   /\____/\   \    https://github.com/JCumin/Brachylog
- /   /  ___   \   \
-/___/  /__/    \___\
-     
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-
-:- module(symbols, [token_predicate/2,
-                    token_variable/2,
-                    token_metapredicate/2
-                   ]).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   TOKEN_PREDICATE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-token_predicate('≤', 'brachylog_lessequal').
-token_predicate('≥', 'brachylog_greaterequal').
-token_predicate('∈', 'brachylog_contains').
-token_predicate('∋', 'brachylog_in').
-token_predicate('⊆', 'brachylog_superset').
-token_predicate('⊇', 'brachylog_subset').
-token_predicate('↔', 'brachylog_reverse').
-token_predicate('↰', 'brachylog_call_predicate').
-token_predicate('↺', 'brachylog_circular_permute_counterclockwise').
-token_predicate('↻', 'brachylog_circular_permute_clockwise').
-token_predicate('√', 'brachylog_root').
-token_predicate('⌉', 'brachylog_ceil').
-token_predicate('⌋', 'brachylog_floor').
-token_predicate('⟦', 'brachylog_range_ascending').
-token_predicate('⟧', 'brachylog_range_descending').
-token_predicate('ℕ', 'brachylog_natural_integer').
-token_predicate('ℤ', 'brachylog_integer').
-token_predicate('ℝ', 'brachylog_float').
-token_predicate('≠', 'brachylog_different').
-token_predicate('≡', 'brachylog_identity').
-token_predicate('÷', 'brachylog_integer_division').
-token_predicate('×', 'brachylog_multiply').
-token_predicate('%', 'brachylog_modulo').
-token_predicate('*', 'brachylog_exp').
-token_predicate('+', 'brachylog_plus').
-token_predicate('-', 'brachylog_minus').
-token_predicate('/', 'brachylog_divide').
-token_predicate('<', 'brachylog_less').
-token_predicate('=', 'brachylog_equal').
-token_predicate('>', 'brachylog_greater').
-token_predicate('\\', 'brachylog_transpose').
-token_predicate('^', 'brachylog_power').
-token_predicate('≜', 'brachylog_label').
-
-token_predicate('a', 'brachylog_adfix').
-token_predicate('b', 'brachylog_behead').
-token_predicate('c', 'brachylog_concatenate').
-token_predicate('d', 'brachylog_duplicates').
-token_predicate('e', '').
-token_predicate('f', 'brachylog_factors').
-token_predicate('g', 'brachylog_group').
-token_predicate('h', 'brachylog_head').
-token_predicate('i', 'brachylog_index').
-token_predicate('j', 'brachylog_juxtapose').
-token_predicate('k', 'brachylog_knife').
-token_predicate('l', 'brachylog_length').
-token_predicate('m', '').
-token_predicate('n', '').
-token_predicate('o', 'brachylog_order').
-token_predicate('p', 'brachylog_permute').
-token_predicate('q', '').
-token_predicate('r', '').
-token_predicate('s', 'brachylog_substring').
-token_predicate('t', 'brachylog_tail').
-token_predicate('u', '').
-token_predicate('v', '').
-token_predicate('w', 'brachylog_write').
-token_predicate('x', 'brachylog_xterminate').
-token_predicate('y', '').
-token_predicate('z', 'brachylog_zip').
-
-token_predicate('ạ', 'brachylog_to_codes').
-token_predicate('ḅ', 'brachylog_blocks').
-token_predicate('ḍ', 'brachylog_dichotomize').
-token_predicate('ẹ', 'brachylog_elements').
-token_predicate('ḥ', '').
-token_predicate('ị', 'brachylog_to_number').
-token_predicate('ḳ', '').
-token_predicate('ḷ', 'brachylog_lowercase').
-token_predicate('ṃ', '').
-token_predicate('ṇ', 'brachylog_split_lines').
-token_predicate('ọ', 'brachylog_occurences').
-token_predicate('ṛ', 'brachylog_random_element').
-token_predicate('ṣ', 'brachylog_shuffle').
-token_predicate('ṭ', '').
-token_predicate('ụ', 'brachylog_uppercase').
-token_predicate('ṿ', '').
-token_predicate('ẉ', 'brachylog_writeln').
-token_predicate('ỵ', '').
-token_predicate('ẓ', '').
-
-token_predicate('ȧ', 'brachylog_absolute_value').
-token_predicate('ḃ', 'brachylog_base').
-token_predicate('ċ', 'brachylog_coerce').
-token_predicate('ḋ', 'brachylog_prime_decomposition').
-token_predicate('ė', '').
-token_predicate('ḟ', 'brachylog_factorial').
-token_predicate('ġ', 'brachylog_groups').
-token_predicate('ḣ', '').
-token_predicate('ṁ', 'brachylog_matrix').
-token_predicate('ṅ', 'brachylog_negate').
-token_predicate('ȯ', '').
-token_predicate('ṗ', 'brachylog_prime').
-token_predicate('ṙ', 'brachylog_random_number').
-token_predicate('ṡ', 'brachylog_sign').
-token_predicate('ṫ', 'brachylog_to_string').
-token_predicate('ẇ', '').
-token_predicate('ẋ', 'brachylog_cartesian_product').
-token_predicate('ẏ', '').
-token_predicate('ż', '').
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   TOKEN_VARIABLE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-token_variable('Ạ', '\'string\':[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]').
-token_variable('Ḅ', '\'string\':[b,c,d,f,g,h,j,k,l,m,n,p,q,r,s,t,v,w,x,y,z]').
-%token_variable('', '').
-token_variable('Ḍ', '\'string\':[b,c,d,f,g,h,j,k,l,m,n,p,q,r,s,t,v,w,x,z]').
-token_variable('Ẹ', '\'string\':[]').
-%token_variable('', '').
-%token_variable('', '').
-token_variable('Ḥ', '\'string\':[\'H\',e,l,l,o,\',\',\' \',\'W\',o,r,l,d,\'!\']').
-token_variable('Ị', '\'string\':[\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\']').
-%token_variable('', '').
-token_variable('Ḳ', '').
-token_variable('Ḷ', '\'string\':[\'\n\']').
-token_variable('Ṃ', '').
-token_variable('Ṇ', '\'string\':[\'A\',\'B\',\'C\',\'D\',\'E\',\'F\',\'G\',\'H\',\'I\',\'J\',\'K\',\'L\',\'M\',\'N\',\'O\',\'P\',\'Q\',\'R\',\'S\',\'T\',\'U\',\'V\',\'W\',\'X\',\'Y\',\'Z\',a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9]').
-token_variable('Ọ', '').
-%token_variable('', '').
-%token_variable('', '').
-token_variable('Ṛ', '').
-token_variable('Ṣ', '\'string\':[\' \']').
-token_variable('Ṭ', '\'string\':[\' \',\'!\',\'"\',\'#\',\'$\',\'%\',\'&\',\'\\\'\',\'(\',\')\',\'*\',\'+\',\',\',\'-\',\'.\',\'/\',\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\':\',\';\',\'<\',\'=\',\'>\',\'?\',\'@\',\'A\',\'B\',\'C\',\'D\',\'E\',\'F\',\'G\',\'H\',\'I\',\'J\',\'K\',\'L\',\'M\',\'N\',\'O\',\'P\',\'Q\',\'R\',\'S\',\'T\',\'U\',\'V\',\'W\',\'X\',\'Y\',\'Z\',\'[\',\'\\\\\',\']\',\'^\',\'_\',\'`\',\'a\',\'b\',\'c\',\'d\',\'e\',\'f\',\'g\',\'h\',\'i\',\'j\',\'k\',\'l\',\'m\',\'n\',\'o\',\'p\',\'q\',\'r\',\'s\',\'t\',\'u\',\'v\',\'w\',\'x\',\'y\',\'z\',\'{\',\'|\',\'}\',\'~\']').
-token_variable('Ụ', '').
-token_variable('Ṿ', '\'string\':[a,e,i,o,u]').
-token_variable('Ẉ', '\'string\':[a,e,i,o,u,y]').
-%token_variable('', '').
-token_variable('Ỵ', '').
-token_variable('Ẓ', '\'string\':[z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a]').
-
-token_variable('Ȧ', 'ConstraintA').
-token_variable('Ḃ', 'ConstraintB').
-token_variable('Ċ', 'ConstraintC').
-token_variable('Ḋ', 'ConstraintD').
-token_variable('Ė', 'ConstraintE').
-token_variable('Ḟ', 'ConstraintF').
-token_variable('Ġ', 'ConstraintG').
-token_variable('Ḣ', 'ConstraintH').
-token_variable('İ', 'ConstraintI').
-%token_variable('', 'ConstraintJ').
-%token_variable('', 'ConstraintK').
-%token_variable('', 'ConstraintL').
-token_variable('Ṁ', 'ConstraintM').
-token_variable('Ṅ', 'ConstraintN').
-token_variable('Ȯ', 'ConstraintO').
-token_variable('Ṗ', 'ConstraintP').
-%token_variable('', 'ConstraintQ').
-token_variable('Ṙ', 'ConstraintR').
-token_variable('Ṡ', 'ConstraintS').
-token_variable('Ṫ', 'ConstraintT').
-%token_variable('', 'ConstraintU').
-%token_variable('', 'ConstraintV').
-token_variable('Ẇ', 'ConstraintW').
-token_variable('Ẋ', 'ConstraintX').
-token_variable('Ẏ', 'ConstraintY').
-token_variable('Ż', 'ConstraintZ').
-
-token_variable('π', '\'float\':3.14159265359').
-token_variable('φ', '\'float\':1.61803398875').
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   TOKEN_METAPREDICATE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-token_metapredicate('ᵃ', 'brachylog_meta_accumulate').
-token_metapredicate('ᵇ', 'brachylog_meta_bagof').
-token_metapredicate('ᶜ', 'brachylog_meta_count').
-token_metapredicate('ᵈ', 'brachylog_meta_declare').
-token_metapredicate('ᵉ', 'brachylog_meta_existence').
-token_metapredicate('ᶠ', 'brachylog_meta_find').
-token_metapredicate('ᵍ', 'brachylog_meta_groupby').
-token_metapredicate('ʰ', 'brachylog_meta_head').
-token_metapredicate('ⁱ', 'brachylog_meta_iterate').
-token_metapredicate('ʲ', '').
-token_metapredicate('ᵏ', '').
-token_metapredicate('ˡ', 'brachylog_meta_leftfold').
-token_metapredicate('ᵐ', 'brachylog_meta_map').
-token_metapredicate('ⁿ', 'brachylog_meta_nonexistence').
-token_metapredicate('ᵒ', 'brachylog_meta_orderby').
-token_metapredicate('ᵖ', '').
-token_metapredicate('ʳ', 'brachylog_meta_rightfold').
-token_metapredicate('ˢ', 'brachylog_meta_select').
-token_metapredicate('ᵗ', 'brachylog_meta_tail').
-token_metapredicate('ᵘ', 'brachylog_meta_unique').
-token_metapredicate('ᵛ', 'brachylog_meta_verify').
-token_metapredicate('ʷ', '').
-token_metapredicate('ˣ', '').
-token_metapredicate('ʸ', '').
-token_metapredicate('ᶻ', 'brachylog_meta_zip').
--- a/ibin/brachylog/Brachylog-master/src/tests.pl	Tue Jul 16 21:38:16 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,648 +0,0 @@
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-____            ____
-\   \          /   /
- \   \  ____  /   /
-  \   \/    \/   /
-   \     /\     /     BRACHYLOG       
-    \   /  \   /      A terse declarative logic programming language
-    /   \  /   \    
-   /     \/     \     Written by Julien Cumin - 2017
-  /   /\____/\   \    https://github.com/JCumin/Brachylog
- /   /  ___   \   \
-/___/  /__/    \___\
-     
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-
-:- consult(brachylog).
-
-
-:- begin_tests(predicates).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_LESSEQUAL
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('lessequal_1', all(X == [2])) :-
-    run_from_atom('1≤2', _, X).
-test('lessequal_2', all(X == [2])) :-
-    run_from_atom('_1≤2', _, X).
-test('lessequal_3', all(X == [0])) :-
-    run_from_atom('0≤0', _, X).
-test('lessequal_4', all(X == [13])) :-
-    run_from_atom('13≤13', _, X).
-test('lessequal_5', all(X == [-42])) :-
-    run_from_atom('_42≤_42', _, X).
-test('lessequal_6', all(X == [[1,2,3]])) :-
-    run_from_atom('[1,2,3]≤₁', _, X).
-test('lessequal_7', all(X == [[-1,0,1]])) :-
-    run_from_atom('[_1,0,1]≤₁', _, X).
-test('lessequal_8', all(X == [[-42,-23,-16]])) :-
-    run_from_atom('[_42,_23,_16]≤₁', _, X).
-test('lessequal_9', all(X == [[1,1,3],[1,2,3],[1,3,3]])) :-
-    run_from_atom('[1,I,3]≤₁', _, X).
-test('lessequal_10', fail) :-
-    run_from_atom('2≤1', _, _).
-test('lessequal_11', fail) :-
-    run_from_atom('2≤_1', _, _).
-test('lessequal_12', fail) :-
-    run_from_atom('[1,3,2]≤₁', _, _).
-test('lessequal_13', fail) :-
-    run_from_atom('[1,I,_1]≤₁', _, _).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_GREATEREQUAL
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('greaterequal_1', all(X == [1])) :-
-    run_from_atom('2≥1', _, X).
-test('greaterequal_2', all(X == [-1])) :-
-    run_from_atom('2≥_1', _, X).
-test('greaterequal_3', all(X == [0])) :-
-    run_from_atom('0≥0', _, X).
-test('greaterequal_4', all(X == [13])) :-
-    run_from_atom('13≥13', _, X).
-test('greaterequal_5', all(X == [-42])) :-
-    run_from_atom('_42≥_42', _, X).
-test('greaterequal_6', all(X == [[3,2,1]])) :-
-    run_from_atom('[3,2,1]≥₁', _, X).
-test('greaterequal_7', all(X == [[1,0,-1]])) :-
-    run_from_atom('[1,0,_1]≥₁', _, X).
-test('greaterequal_8', all(X == [[-16,-23,-42]])) :-
-    run_from_atom('[_16,_23,_42]≥₁', _, X).
-test('greaterequal_9', all(X == [[3,1,1],[3,2,1],[3,3,1]])) :-
-    run_from_atom('[3,I,1]≥₁', _, X).
-test('greaterequal_10', fail) :-
-    run_from_atom('1≥2', _, _).
-test('greaterequal_11', fail) :-
-    run_from_atom('_1≥2', _, _).
-test('greaterequal_12', fail) :-
-    run_from_atom('[1,3,2]≥₁', _, _).
-test('greaterequal_13', fail) :-
-    run_from_atom('[_1,I,1]≥₁', _, _).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_CONTAINS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-% Nothing, same code as brachylog_in
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_IN
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('in_1', fail) :-
-    run_from_atom('∋', [], _).
-test('in_2', fail) :-
-    run_from_atom('∋', "", _).
-test('in_3', all(X == [0])) :-
-    run_from_atom('∋', 0, X).
-test('in_4', all(X == [7])) :-
-    run_from_atom('∋', 7, X).
-test('in_5', all(X == [7])) :-
-    run_from_atom('∋', '_7', X).
-test('in_6', all(X == [1,0,2,3])) :-
-    run_from_atom('∋', 1023, X).
-test('in_7', all(X == [1,0,2,3])) :-
-    run_from_atom('∋', [1,0,2,3], X).
-test('in_8', all(X == [1023,"test"])) :-
-    run_from_atom('∋', [1023,"test"], X).
-test('in_9', all(X == ["test"])) :-
-    run_from_atom('∋', ["test"], X).
-test('in_10', all(X == ["t","e","s","t"])) :-
-    run_from_atom('∋', "test", X).
-test('in_11', all(X == [1])) :-
-    run_from_atom('∋₀', 1023, X).
-test('in_12', all(X == ["t"])) :-
-    run_from_atom('∋₀', "test", X).
-test('in_13', all(X == [1023])) :-
-    run_from_atom('∋₀', [1023,"test"], X).
-test('in_14', all(X == [0])) :-
-    run_from_atom('∋₁', 1023, X).
-test('in_15', fail) :-
-    run_from_atom('∋₄', 1023, _).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_SUPERSET
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-% Nothing, same code as brachylog_subset
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_SUBSET
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('subset_1', all(X == [[]])) :-
-    run_from_atom('⊇', [], X).
-test('subset_2', all(X == [""])) :-
-    run_from_atom('⊇', "", X).
-test('subset_3', all(X == [0])) :-
-    run_from_atom('⊇', 0, X).
-test('subset_4', all(X == [7])) :-
-    run_from_atom('⊇', 7, X).
-test('subset_5', all(X == [123,12,13,23,1,2,3])) :-
-    run_from_atom('⊇', 123, X).
-test('subset_6', all(X == [[1,2,3],[1,2],[1,3],[2,3],[1],[2],[3],[]])) :-
-    run_from_atom('⊇', [1,2,3], X).
-test('subset_7', all(X == ["test","tes","tet","tst","est","te","ts","tt","es","et","st","t","e","s","t",""])) :-
-    run_from_atom('⊇', "test", X).
-test('subset_8', fail) :-
-    run_from_atom('⊇', [1,2,3], [1,5]).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_REVERSE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('reverse_1', all(X == [0])) :-
-    run_from_atom('↔', 0, X).
-test('reverse_2', all(X == [[]])) :-
-    run_from_atom('↔', [], X).
-test('reverse_3', all(X == [""])) :-
-    run_from_atom('↔', "", X).
-test('reverse_4', all(X == [321])) :-
-    run_from_atom('↔', 123, X).
-test('reverse_5', all(X == [321])) :-
-    run_from_atom('↔', 1230, X).
-test('reverse_6', all(X == ["tset"])) :-
-    run_from_atom('↔', "test", X).
-test('reverse_7', all(X == [[0,3,2,1]])) :-
-    run_from_atom('↔', [1,2,3,0], X).
-test('reverse_8', all(X == [[1,2,3,2,1]])) :-
-    run_from_atom('↔?', '[1,2,3,I,J]', X).
-test('reverse_9', all(X == [["a","b","c","b","a"]])) :-
-    run_from_atom('↔?', '["a","b","c",I,J]', X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_CALL_PREDICATE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-% TODO
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_CIRCULAR_PERMUTE_COUNTERCLOCKWISE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('circular_permute_counterclockwise_1', all(X == [[]])) :-
-    run_from_atom('↺', [], X).
-test('circular_permute_counterclockwise_2', all(X == [""])) :-
-    run_from_atom('↺', "", X).
-test('circular_permute_counterclockwise_3', all(X == [0])) :-
-    run_from_atom('↺', 0, X).
-test('circular_permute_counterclockwise_4', all(X == [231])) :-
-    run_from_atom('↺', 123, X).
-test('circular_permute_counterclockwise_5', all(X == ["estt"])) :-
-    run_from_atom('↺', "test", X).
-test('circular_permute_counterclockwise_6', all(X == [[2,"test",1]])) :-
-    run_from_atom('↺', [1,2,"test"], X).
-test('circular_permute_counterclockwise_7', all(X == [[4,5,6,1,2,3]])) :-
-    run_from_atom('↺₃', [1,2,3,4,5,6], X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_CIRCULAR_PERMUTE_CLOCKWISE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('circular_permute_clockwise_1', all(X == [[]])) :-
-    run_from_atom('↻', [], X).
-test('circular_permute_clockwise_2', all(X == [""])) :-
-    run_from_atom('↻', "", X).
-test('circular_permute_clockwise_3', all(X == [0])) :-
-    run_from_atom('↻', 0, X).
-test('circular_permute_clockwise_4', all(X == [312])) :-
-    run_from_atom('↻', 123, X).
-test('circular_permute_clockwise_5', all(X == ["ttes"])) :-
-    run_from_atom('↻', "test", X).
-test('circular_permute_clockwise_6', all(X == [["test",1,2]])) :-
-    run_from_atom('↻', [1,2,"test"], X).
-test('circular_permute_clockwise_7', all(X == [[4,5,6,1,2,3]])) :-
-    run_from_atom('↻₃', [1,2,3,4,5,6], X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_ROOT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('root_1', all(X == [-1,1])) :-
-    run_from_atom('√', 1, X).
-test('root_2', all(X == [0])) :-
-    run_from_atom('√', 0, X).
-test('root_3', all(X == [-12,12])) :-
-    run_from_atom('√', 144, X).
-test('root_4', all(X == [2.23606797749979])) :-
-    run_from_atom('√', 5, X).
-test('root_5', throws(_)) :-
-    run_from_atom('√', '_5', _).
-test('root_6', all(X == [2.04939015319192])) :-
-    run_from_atom('√', 4.2, X).
-test('root_7', all(X == [3])) :-
-    run_from_atom('√₃', 27, X).
-test('root_8', all(X == [-3])) :-
-    run_from_atom('√₃', '_27', X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_CEIL
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('ceil_1', fail) :-
-    run_from_atom('⌉', [], _).
-test('ceil_2', all(X == [3])) :-
-    run_from_atom('⌉', [1,2,3], X).
-test('ceil_3', all(X == [-5])) :-
-    run_from_atom('⌉', '[_9,_5,_13]', X).
-test('ceil_4', all(X == ["test"])) :-
-    run_from_atom('⌉', ["test",2,3], X).
-test('ceil_5', all(X == ["z"])) :-
-    run_from_atom('⌉', ["test","z"], X).
-test('ceil_6', all(X == [123])) :-
-    run_from_atom('⌉₁', 123, X).
-test('ceil_7', all(X == [124])) :-
-    run_from_atom('⌉₁', 123.45, X).
-test('ceil_8', all(X == [-123])) :-
-    run_from_atom('⌉₁', '_123.45', X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_FLOOR
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('floor_1', fail) :-
-    run_from_atom('⌋', [], _).
-test('floor_2', all(X == [1])) :-
-    run_from_atom('⌋', [1,2,3], X).
-test('floor_3', all(X == [-13])) :-
-    run_from_atom('⌋', '[_9,_5,_13]', X).
-test('floor_4', all(X == [2])) :-
-    run_from_atom('⌋', ["test",2,3], X).
-test('floor_5', all(X == ["test"])) :-
-    run_from_atom('⌋', ["test","z"], X).
-test('floor_6', all(X == [123])) :-
-    run_from_atom('⌋₁', 123, X).
-test('floor_7', all(X == [123])) :-
-    run_from_atom('⌋₁', 123.45, X).
-test('floor_8', all(X == [-124])) :-
-    run_from_atom('⌋₁', '_123.45', X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_RANGE_ASCENDING
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('range_ascending_1', all(X == [[0]])) :-
-    run_from_atom('⟦', 0, X).
-test('range_ascending_2', all(X == [[0,1,2,3,4,5]])) :-
-    run_from_atom('⟦', 5, X).
-test('range_ascending_3', all(X == [[-5,-4,-3,-2,-1,0]])) :-
-    run_from_atom('⟦', '_5', X).
-test('range_ascending_4', all(X == [[1,2,3,4,5]])) :-
-    run_from_atom('⟦₁', 5, X).
-test('range_ascending_5', all(X == [[9,10,11,12,13]])) :-
-    run_from_atom('⟦₂', [9,13], X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_RANGE_DESCENDING
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('range_descending_1', all(X == [[0]])) :-
-    run_from_atom('⟧', 0, X).
-test('range_descending_2', all(X == [[5,4,3,2,1,0]])) :-
-    run_from_atom('⟧', 5, X).
-test('range_descending_3', all(X == [[0,-1,-2,-3,-4,-5]])) :-
-    run_from_atom('⟧', '_5', X).
-test('range_descending_4', all(X == [[5,4,3,2,1]])) :-
-    run_from_atom('⟧₁', 5, X).
-test('range_descending_5', all(X == [[13,12,11,10,9]])) :-
-    run_from_atom('⟧₂', [9,13], X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_NATURAL_INTEGER
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('natural_integer_1', all(X == [0])) :-
-    run_from_atom('ℕ', 0, X).
-test('natural_integer_2', all(X == [42])) :-
-    run_from_atom('ℕ', 42, X).
-test('natural_integer_3', fail) :-
-    run_from_atom('ℕ', "test", _).
-test('natural_integer_4', fail) :-
-    run_from_atom('ℕ', '_3', _).
-test('natural_integer_5', fail) :-
-    run_from_atom('ℕ', [1,2], _).
-test('natural_integer_6', fail) :-
-    run_from_atom('ℕ', 4.2, _).
-test('natural_integer_7', all(X == [42])) :-
-    run_from_atom('ℕ₄₂', 42, X).
-test('natural_integer_8', fail) :-
-    run_from_atom('ℕ₄₂', 41, _).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_INTEGER
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('integer_1', all(X == [0])) :-
-    run_from_atom('ℤ', 0, X).
-test('integer_2', all(X == [42])) :-
-    run_from_atom('ℤ', 42, X).
-test('integer_3', fail) :-
-    run_from_atom('ℤ', "test", _).
-test('integer_4', all(X == [-3])) :-
-    run_from_atom('ℤ', '_3', X).
-test('integer_5', fail) :-
-    run_from_atom('ℤ', [1,2], _).
-test('integer_6', fail) :-
-    run_from_atom('ℤ', 4.2, _).
-test('integer_7', all(X == [-42])) :-
-    run_from_atom('ℤ₄₂', '_42', X).
-test('integer_8', fail) :-
-    run_from_atom('ℤ₄₂', '_41', _).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_FLOAT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('float_1', all(X == [4.2])) :-
-    run_from_atom('ℝ', 4.2, X).
-test('float_2', all(X == [0.0])) :-
-    run_from_atom('ℝ', 0.0, X).
-test('float_3', all(X == [-4.2])) :-
-    run_from_atom('ℝ', '_4.2', X).
-test('float_4', fail) :-
-    run_from_atom('ℝ', 0, _).
-test('float_5', fail) :-
-    run_from_atom('ℝ', 42, _).
-test('float_6', all(X == [42])) :-
-    run_from_atom('ℝ₁', 42, X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_EMPTY
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('empty_1', nondet) :-
-    run_from_atom('∅', [], _).
-test('empty_2', nondet) :-
-    run_from_atom('∅', 0, _).
-test('empty_3', nondet) :-
-    run_from_atom('∅', "", _).
-test('empty_4', nondet) :-
-    run_from_atom('∅', 0.0, _).
-test('empty_5', fail) :-
-    run_from_atom('∅', [1], _).
-test('empty_6', fail) :-
-    run_from_atom('∅', 1, _).
-test('empty_7', fail) :-
-    run_from_atom('∅', "a", _).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_DIFFERENT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('different_1', all(X == [12345])) :-
-    run_from_atom('≠', 12345, X).
-test('different_1', fail) :-
-    run_from_atom('≠', 12344, _).
-test('different_1', all(X == [[1,2,3]])) :-
-    run_from_atom('≠', [1,2,3], X).
-test('different_1', fail) :-
-    run_from_atom('≠', [1,2,1], _).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_INTEGER_DIVISION
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('integer_division_1', all(X == [3])) :-
-    run_from_atom('÷', [6,2], X).
-test('integer_division_2', all(X == [3])) :-
-    run_from_atom('÷', [7,2], X).
-test('integer_division_3', all(X == [-3])) :-
-    run_from_atom('÷', '[_6,2]', X).
-test('integer_division_1', fail) :-
-    run_from_atom('÷', '[6,0]', _).
-test('integer_division_1', all(X == [0])) :-
-    run_from_atom('÷', '[0,_42]', X).
-test('integer_division_1', all(X == [3])) :-
-    run_from_atom('÷', [6.2,2], X).
-test('integer_division_1', all(X == [2])) :-
-    run_from_atom('÷₃', 6, X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_MULTIPLY
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('multiply_1', all(X == [1])) :-
-    run_from_atom('×', [], X).
-test('multiply_2', all(X == [12])) :-
-    run_from_atom('×', [6,2], X).
-test('multiply_3', all(X == [12])) :-
-    run_from_atom('×', [2,6], X).
-test('multiply_4', all(X == [-12])) :-
-    run_from_atom('×', '[_6,2]', X).
-test('multiply_5', all(X == [24])) :-
-    run_from_atom('×', [2,3,4], X).
-test('multiply_6', all(X == [0])) :-
-    run_from_atom('×', '[0,_42]', X).
-test('multiply_7', all(X == [12.4])) :-
-    run_from_atom('×', [6.2,2], X).
-test('multiply_8', all(X == [18])) :-
-    run_from_atom('×₃', 6, X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_MODULO
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('modulo_1', all(X == [1])) :-
-    run_from_atom('%', [4,3], X).
-test('modulo_2', all(X == [0])) :-
-    run_from_atom('%', [4,2], X).
-test('modulo_3', all(X == [4])) :-
-    run_from_atom('%', [42,19], X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_EXP
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('exp_1', all(X == [22026.465794806718])) :-
-    run_from_atom('*', 10, X).
-test('exp_2', all(X == [2.302585092994046])) :-
-    run_from_atom('*₁', 10, X).
-test('exp_3', all(X == [-0.8390715290764524])) :-
-    run_from_atom('*₂', 10, X).
-test('exp_4', all(X == [-0.5440211108893698])) :-
-    run_from_atom('*₃', 10, X).
-test('exp_5', all(X == [0.6483608274590866])) :-
-    run_from_atom('*₄', 10, X).
-test('exp_6', all(X == [1.0471975511965979])) :-
-    run_from_atom('*₅', 0.5, X).
-test('exp_7', all(X == [0.5235987755982989])) :-
-    run_from_atom('*₆', 0.5, X).
-test('exp_8', all(X == [1.4711276743037347])) :-
-    run_from_atom('*₇', 10, X).
-test('exp_9', all(X == [11013.232920103323])) :-
-    run_from_atom('*₈', 10, X).
-test('exp_10', all(X == [11013.232874703393])) :-
-    run_from_atom('*₉', 10, X).
-test('exp_11', all(X == [0.9999999958776927])) :-
-    run_from_atom('*₁₀', 10, X).
-test('exp_12', all(X == [2.993222846126381])) :-
-    run_from_atom('*₁₁', 10, X).
-test('exp_13', all(X == [2.99822295029797])) :-
-    run_from_atom('*₁₂', 10, X).
-test('exp_14', all(X == [0.5493061443340549])) :-
-    run_from_atom('*₁₃', 0.5, X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_PLUS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('plus_1', all(X == [3])) :-
-    run_from_atom('+', [1,2], X).
-test('plus_2', all(X == [2])) :-
-    run_from_atom('+', '[_3,5]', X).
-test('plus_3', all(X == [-5])) :-
-    run_from_atom('+', '[_3,_2]', X).
-test('plus_4', all(X == [21])) :-
-    run_from_atom('+', [1,2,3,4,5,6], X).
-test('plus_5', all(X == [4.6])) :-
-    run_from_atom('+', [1.2,3.4], X).
-test('plus_6', all(X == [13])) :-
-    run_from_atom('+', [13,0,0,0,0], X).
-test('plus_7', all(X == [67])) :-
-    run_from_atom('+₄₂', 25, X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_MINUS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('minus_1', all(X == [-1])) :-
-    run_from_atom('-', [1,2], X).
-test('minus_2', all(X == [-8])) :-
-    run_from_atom('-', '[_3,5]', X).
-test('minus_3', all(X == [2])) :-
-    run_from_atom('-', '[_1,_3]', X).
-test('minus_4', all(X == [-3])) :-
-    run_from_atom('-', [1,2,3,4,5,6], X).
-test('minus_5', all(X == [-2.2])) :-
-    run_from_atom('-', [1.2,3.4], X).
-test('minus_6', all(X == [13])) :-
-    run_from_atom('-', [13,0,0,0,0], X).
-test('minus_7', all(X == [-17])) :-
-    run_from_atom('-₄₂', 25, X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_DIVIDE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('divide_1', all(X == [0.5])) :-
-    run_from_atom('/', [1,2], X).
-test('divide_2', all(X == [3])) :-
-    run_from_atom('/', [6,2], X).
-test('divide_3', all(X == [-0.5])) :-
-    run_from_atom('/', '[1,_2]', X).
-test('divide_4', all(X == [0.1111111111111111])) :-
-    run_from_atom('/₁', 9, X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_LESS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('less_1', all(X == [2])) :-
-    run_from_atom('1<2', _, X).
-test('less_2', all(X == [2])) :-
-    run_from_atom('_1<2', _, X).
-test('less_3', fail) :-
-    run_from_atom('0<0', _, _).
-test('less_4', fail) :-
-    run_from_atom('13<13', _, _).
-test('less_5', fail) :-
-    run_from_atom('_42<_42', _, _).
-test('less_6', all(X == [[1,2,3]])) :-
-    run_from_atom('[1,2,3]<₁', _, X).
-test('less_7', all(X == [[-1,0,1]])) :-
-    run_from_atom('[_1,0,1]<₁', _, X).
-test('less_8', all(X == [[-42,-23,-16]])) :-
-    run_from_atom('[_42,_23,_16]<₁', _, X).
-test('less_9', all(X == [[1,2,3]])) :-
-    run_from_atom('[1,I,3]<₁', _, X).
-test('less_10', fail) :-
-    run_from_atom('2<1', _, _).
-test('less_11', fail) :-
-    run_from_atom('2<_1', _, _).
-test('less_12', fail) :-
-    run_from_atom('[1,3,2]<₁', _, _).
-test('less_13', fail) :-
-    run_from_atom('[1,I,_1]<₁', _, _).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_EQUAL
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('equal_1', all(X == [1111])) :-
-    run_from_atom('=', 1111, X).
-test('equal_2', all(X == [[]])) :-
-    run_from_atom('=', [], X).
-test('equal_3', all(X == [0])) :-
-    run_from_atom('=', 0, X).
-test('equal_4', all(X == [[42,42,42,42]])) :-
-    run_from_atom('=', '[X,Y,42,Z]', X).
-test('equal_5', fail) :-
-    run_from_atom('=', [1,1,1,2,1], _).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_GREATER
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('greater_1', all(X == [1])) :-
-    run_from_atom('2>1', _, X).
-test('greater_2', all(X == [-1])) :-
-    run_from_atom('2>_1', _, X).
-test('greater_3', fail) :-
-    run_from_atom('0>0', _, _).
-test('greater_4', fail) :-
-    run_from_atom('13>13', _, _).
-test('greater_5', fail) :-
-    run_from_atom('_42>_42', _, _).
-test('greater_6', all(X == [[3,2,1]])) :-
-    run_from_atom('[3,2,1]>₁', _, X).
-test('greater_7', all(X == [[1,0,-1]])) :-
-    run_from_atom('[1,0,_1]>₁', _, X).
-test('greater_8', all(X == [[-16,-23,-42]])) :-
-    run_from_atom('[_16,_23,_42]>₁', _, X).
-test('greater_9', all(X == [[3,2,1]])) :-
-    run_from_atom('[3,I,1]>₁', _, X).
-test('greater_10', fail) :-
-    run_from_atom('1>2', _, _).
-test('greater_11', fail) :-
-    run_from_atom('_1>2', _, _).
-test('greater_12', fail) :-
-    run_from_atom('[1,3,2]>₁', _, _).
-test('greater_13', fail) :-
-    run_from_atom('[_1,I,1]>₁', _, _).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_TRANSPOSE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('transpose_1', all(X == [[[1,4,7],[2,5,8],[3,6,9]]])) :-
-    run_from_atom('\\', [[1,2,3],[4,5,6],[7,8,9]], X).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_POWER
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-test('power_1', all(X == [8])) :-
-    run_from_atom('^', [2,3], X).
-test('power_2', all(X == [-8])) :-
-    run_from_atom('^', '[_2,3]', X).
-test('power_3', all(X == [1])) :-
-    run_from_atom('^', [1,50], X).
-test('power_4', all(X == [0])) :-
-    run_from_atom('^', [0,42], X).
-test('power_5', all(X == [1])) :-
-    run_from_atom('^', [7,0], X).
-test('power_6', all(X == [49])) :-
-    run_from_atom('^₂', 7, X).
-
-
-:- end_tests(predicates).
-
-
-% Useful templates
-test('_', all(X == [])) :-
-    run_from_atom('', _, X).
-
-test('_', fail) :-
-    run_from_atom('', _, _).
--- a/ibin/brachylog/Brachylog-master/src/tokenize.pl	Tue Jul 16 21:38:16 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,341 +0,0 @@
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-____            ____
-\   \          /   /
- \   \  ____  /   /
-  \   \/    \/   /
-   \     /\     /     BRACHYLOG       
-    \   /  \   /      A terse declarative logic programming language
-    /   \  /   \    
-   /     \/     \     Written by Julien Cumin - 2017
-  /   /\____/\   \    https://github.com/JCumin/Brachylog
- /   /  ___   \   \
-/___/  /__/    \___\
-     
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-
-:- module(tokenize, [tokenize/2]).
-
-:- use_module(symbols).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   TOKENIZE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-tokenize([], []).
-tokenize([' '|T], T2) :-
-    tokenize(T, T2).
-tokenize([Variable|T], ['variable':VariableName:'sup':Sup|T2]) :-
-    is_variable_character(Variable),
-    tokenize_variable([Variable|T], Rest, VariableName),
-    tokenize_superscript(Rest, Rest2, Sup),
-    tokenize(Rest2, T2).
-tokenize([Variable|T], ['variable':R|T2]) :-
-    (   is_variable_character_dot_above(Variable)
-    ->  token_variable(Variable, RealVariable),
-        tokenize_superscript(T, Rest, Sup),
-        R = RealVariable:'sup':Sup
-    ;   is_variable_character_dot_below(Variable)
-    ->  token_variable(Variable, R),
-        Rest = T
-    ),
-    tokenize(Rest, T2).
-tokenize([Variable|T], ['variable':RealVariable|T2]) :-
-    is_math_constant_character(Variable),
-    token_variable(Variable, RealVariable),
-    tokenize(T, T2).
-tokenize([H|T], ['variable':'Input':'sup':Sup|T2]) :-
-    is_input_character(H),
-    tokenize_superscript(T, Rest, Sup),
-    tokenize(Rest, T2).
-tokenize([H|T], ['variable':'Output':'sup':Sup|T2]) :-
-    is_output_character(H),
-    tokenize_superscript(T, Rest, Sup),
-    tokenize(Rest, T2).
-tokenize([Modifier,Predicate|T], ['predicate':PredName:Sub|T2]) :-
-    is_modifier_character(Modifier),
-    \+ (is_variable_character(Predicate)),
-    atomic_list_concat([Modifier,Predicate], Pred),
-    token_predicate(Pred, PredName),
-    tokenize_subscript(T, Rest, Sub),
-    tokenize(Rest, T2).
-tokenize([Predicate|T], ['predicate':PredName:Sub|T2]) :-
-    is_predicate_character(Predicate),
-    token_predicate(Predicate, PredName),
-    tokenize_subscript(T, Rest, Sub),
-    tokenize(Rest, T2).
-tokenize([MetaPred|T], ['metapredicate':PredName:Sup|T2]) :-
-    is_metapredicate_character(MetaPred),
-    token_metapredicate(MetaPred, PredName),
-    tokenize_superscript(T, Rest, Sup),
-    tokenize(Rest, T2).
-tokenize(['"'|T], ['variable':Variable|T2]) :-
-    tokenize_string(['"'|T], Rest, Variable),
-    tokenize(Rest, T2). 
-tokenize(['_',Digit|T], ['variable':Type:N|T2]) :-
-    is_digit_character(Digit),
-    tokenize_number([Digit|T] ,Rest, Type:X),
-    N is -X,
-    tokenize(Rest, T2).
-tokenize(['_','_'|T], T2) :-
-    tokenize(T, T2).
-tokenize([Digit|T], ['variable':Type:X|T2]) :-
-    is_digit_character(Digit),
-    tokenize_number([Digit|T], Rest, Type:X),
-    tokenize(Rest, T2).
-tokenize(['['|T], ['variable':List|T2]) :-
-    tokenize_list(['['|T], Rest, List),
-    tokenize(Rest, T2).
-tokenize([Modifier,Variable|T], ['variable':RealVariable|T2]) :-
-    is_modifier_character(Modifier),
-    is_variable_character(Variable),
-    token_variable(Modifier:Variable, RealVariable),
-    tokenize(T, T2).
-tokenize([ControlFlow|T], ['control':ControlFlow|T2]) :-
-    is_control_character(ControlFlow),
-    tokenize(T, T2).
-    
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   TOKENIZE_VARIABLE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-tokenize_variable([], [], '').
-tokenize_variable([H|T], R, Name) :-
-    (   is_variable_character(H) ->
-        tokenize_variable(T, R, TName),
-        atomic_list_concat([H, TName], Name)
-    ;   Name = '',
-        R = [H|T]
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   TOKENIZE_STRING
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-tokenize_string(['"'|T], Rest, 'string':T2) :-
-    tokenize_string_(T, Rest, T2).
-    
-tokenize_string_([], [], []).
-tokenize_string_([X,'"'|Rest], Rest, [X]) :-
-    X \= '\\',
-    X \= '"',
-    Rest \= ['"'|_],
-    !.
-tokenize_string_(['\\','"'|T], Rest, ['"'|T2]) :-
-    tokenize_string_(T, Rest, T2).
-tokenize_string_(['"','"'|T], Rest, ['"'|T2]) :-
-    tokenize_string_(T, Rest, T2).
-tokenize_string_([X|T], Rest, L) :-
-    (   X \= '"' ->
-        L = [X|T2],
-        tokenize_string_(T, Rest, T2)
-    ;   Rest = T,
-        L = []
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   TOKENIZE_NUMBER
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */  
-tokenize_number(N, Rest, Type:Number) :-
-    tokenize_number_(N, Rest, T2),
-    (   member('.', T2),
-        !,
-        Type = 'float'
-    ;   Type = 'integer'
-    ),
-    atomic_list_concat(T2, A),
-    atom_number(A, Number).
-    
-tokenize_number_([], [], []).
-tokenize_number_(['.',I|T], Rest, ['.',J|T2]) :-
-    is_digit_character(I),
-    atom_number(I, J),
-    tokenize_integer(T, Rest, T2).
-tokenize_number_(['.'], ['.'], []).
-tokenize_number_(['.',X|T], ['.',X|T], []) :-
-    \+ (is_digit_character(X)).
-tokenize_number_([X|T], [X|T], []) :-
-    \+ (is_digit_character(X)),
-    X \= '.'.
-tokenize_number_([I|T], Rest, [J|T2]) :-
-    is_digit_character(I),
-    atom_number(I, J),
-    tokenize_number_(T, Rest, T2).
-
-tokenize_integer([], [], []).
-tokenize_integer([I|T], Rest, [J|T2]) :-
-    is_digit_character(I),
-    atom_number(I, J),
-    tokenize_integer(T, Rest, T2).
-tokenize_integer([X|T], [X|T], []) :-
-    \+ (is_digit_character(X)).
-    
-    
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   TOKENIZE_LIST
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-tokenize_list(['['|T], Rest, List) :-
-    isolate_list(T, L, Rest),
-    tokenize(L, List).
-    
-isolate_list(T, List, Rest) :-
-    isolate_list(T, 1, [], L, Rest),
-    reverse(L, List).
-isolate_list([], _, L, L, []).
-isolate_list([']'|T], 1, L, L, T).
-isolate_list([']'|T], X, L, M, Rest) :-
-    X > 1,
-    Y is X - 1,
-    isolate_list(T, Y, [']'|L], M, Rest).
-isolate_list(['['|T], X, L, M, Rest) :-
-    Y is X + 1,
-    isolate_list(T, Y, ['['|L], M, Rest).
-isolate_list([H|T], X, L, M, Rest) :-
-    H \= '[',
-    H \= ']',
-    isolate_list(T, X, [H|L], M, Rest).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   TOKENIZE_SUBSCRIPT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-tokenize_subscript(L, Rest, Sub) :-
-    tokenize_subscript_(L, Rest, LSub),
-    (   LSub = 'first' ->
-        Sub = LSub
-    ;   LSub = 'last' ->
-        Sub = 'last'
-    ;   LSub = [] ->
-        Sub = 'default'
-    ;   maplist(number_codes, LSub, LC),
-        append(LC, C),
-        number_codes(ISub, C),
-        term_to_atom('integer':ISub, Sub)
-    ).
-
-tokenize_subscript_([], [], []).
-tokenize_subscript_([H|T], Rest, Ds) :-
-    (   is_subscript_character(H, D) ->
-        tokenize_subscript_(T, Rest, TDs),
-        Ds = [D|TDs]
-    ;   is_subscript_parenthesis(H, D) ->
-        Rest = T,
-        Ds = D
-    ;   Rest = [H|T],
-        Ds = []
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   TOKENIZE_SUPERSCRIPT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-tokenize_superscript(L, Rest, Sup) :-
-    tokenize_superscript_(L, Rest, LSup),
-    (   LSup = 'first' ->
-        Sup = LSup
-    ;   LSup = 'last' ->
-        Sup = 'last'
-    ;   LSup = [] ->
-        Sup = 'default'
-    ;   maplist(number_codes, LSup, LC),
-        append(LC, C),
-        number_codes(ISup, C),
-        term_to_atom('integer':ISup, Sup)
-    ).
-
-tokenize_superscript_([], [], []).
-tokenize_superscript_([H|T], Rest, Ds) :-
-    (   is_superscript_character(H, D) ->
-        tokenize_superscript_(T, Rest, TDs),
-        Ds = [D|TDs]
-    ;   is_superscript_parenthesis(H, D) ->
-        Rest = T,
-        Ds = D
-    ;   Rest = [H|T],
-        Ds = []
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   IS_X_CHARACTER
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-is_variable_character(X) :-
-    member(X, ['A', 'B', 'C', 'D', 'E',
-               'F', 'G', 'H', 'I', 'J', 
-               'K', 'L', 'M', 'N', 'O', 
-               'P', 'Q', 'R', 'S', 'T', 
-               'U', 'V', 'W', 'X', 'Y', 'Z']).
-               
-is_variable_character_dot_below(X) :-
-    member(X, ['Ạ', 'Ḅ', 'Ḍ', 'Ẹ',
-               'Ḥ', 'Ị', 'Ḳ', 'Ḷ', 
-               'Ṃ', 'Ṇ', 'Ọ', 'Ṛ', 
-               'Ṣ', 'Ṭ', 'Ụ', 'Ṿ', 
-               'Ẉ', 'Ỵ', 'Ẓ']).
-
-is_variable_character_dot_above(X) :-
-    member(X,  ['Ȧ', 'Ḃ', 'Ċ', 'Ḋ', 'Ė',
-                'Ḟ', 'Ġ', 'Ḣ', 'İ', 'Ṁ',
-                'Ṅ', 'Ȯ', 'Ṗ', 'Ṙ', 'Ṡ',
-                'Ṫ', 'Ẇ', 'Ẋ', 'Ẏ', 'Ż']).
-
-is_digit_character(X) :-
-    member(X, ['0', '1', '2', '3', '4',
-               '5', '6', '7', '8', '9']).
-
-is_predicate_character(X) :-
-    member(X, ['≤', '≥', '∈', '∋', '⊆', '⊇',
-               '↔', '↰', '↺',
-               '↻', '√', '⌉', '⌋', '⟦', '⟧',
-               'ℕ', 'ℤ', 'ℝ', '∅', '≠', '≡',
-               '÷', '×', '%', '*', '+',
-               '-', '/', '<', '=', '>', '\\',
-               '^', 'a', 'b', 'c', 'd', 'e',
-               'f', 'g', 'h', 'i', 'j', 'k',
-               'l', 'm', 'n', 'o', 'p', 'q',
-               'r', 's', 't', 'u', 'v', 'w',
-               'x', 'y', 'z', 'ạ', 'ḅ', 'ḍ',
-               'ẹ', 'ḥ', 'ị', 'ḳ', 'ḷ', 'ṃ',
-               'ṇ', 'ọ', 'ṛ', 'ṣ', 'ṭ', 'ụ',
-               'ṿ', 'ẉ', 'ỵ', 'ẓ', 'ȧ', 'ḃ',
-               'ċ', 'ḋ', 'ė', 'ḟ', 'ġ', 'ḣ',
-               'ṁ', 'ṅ', 'ȯ', 'ṗ', 'ṙ', 'ṡ',
-               'ṫ', 'ẇ', 'ẋ', 'ẏ', 'ż', '≜']).
-
-is_math_constant_character(X) :-
-    member(X, ['π', 'φ']).
-
-is_modifier_character(X) :-
-    member(X, ['$', '@', '#']).
-
-is_input_character('?').
-
-is_output_character('.').
-
-is_metapredicate_character(X) :-
-    member(X, ['ᵃ', 'ᵇ', 'ᶜ', 'ᵈ', 'ᵉ',
-               'ᶠ', 'ᵍ', 'ʰ', 'ⁱ', 'ʲ',
-               'ᵏ', 'ˡ', 'ᵐ', 'ⁿ', 'ᵒ',
-               'ᵖ', 'ʳ', 'ˢ', 'ᵗ', 'ᵘ',
-               'ᵛ', 'ʷ', 'ˣ', 'ʸ', 'ᶻ']).
-
-is_subscript_character(C, D) :-
-    nth0(D, ['₀','₁','₂','₃','₄',
-             '₅','₆','₇','₈','₉'], C).
-
-is_subscript_parenthesis('₍', 'first').
-is_subscript_parenthesis('₎', 'last').
-
-is_superscript_character(C, D) :-
-    nth0(D, ['⁰','¹','²','³','⁴',
-             '⁵','⁶','⁷','⁸','⁹'], C).
-
-is_superscript_parenthesis('⁽', 'first').
-is_superscript_parenthesis('⁾', 'last').
-
-is_control_character(X) :-
-    member(X, ['∧', '∨', '⊥', '\n', '!', '↖', '↙',
-              '\'', '(', ')', ',', ':',
-               ':', '|', '{', '}', '`',
-               '¬', '~', ';', '&', '⟨', '⟩']).
--- a/ibin/brachylog/Brachylog-master/src/transpile.pl	Tue Jul 16 21:38:16 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,641 +0,0 @@
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-____            ____
-\   \          /   /
- \   \  ____  /   /
-  \   \/    \/   /
-   \     /\     /     BRACHYLOG
-    \   /  \   /      A terse declarative logic programming language
-    /   \  /   \
-   /     \/     \     Written by Julien Cumin - 2017
-  /   /\____/\   \    https://github.com/JCumin/Brachylog
- /   /  ___   \   \
-/___/  /__/    \___\
-
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-
-:- module(transpile, [parse/2,
-                      parse_no_file/2,
-                      parse_argument/2,
-                      contains_write/1
-                     ]).
-
-:- use_module(tokenize).
-:- use_module(symbols).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   PARSE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-parse(Code, TranspiledPath) :-
-    parse_no_file(Code, Predicates),
-    open(TranspiledPath, write, File),
-    maplist(write_to_file(File), Predicates),
-    close(File).
-
-parse_no_file(Code, Predicates) :-
-    atom_chars(Code, SplittedCode),
-    tokenize(SplittedCode, TokensNoOutputs),
-    append_trailing_output(TokensNoOutputs, Tokens),
-    fix_predicates(Tokens, FixedPredicates),
-    fix_metapredicates(FixedPredicates, FixedMetapredicates),
-    fill_implicit_variables(FixedMetapredicates, FilledTokens),
-    fix_variables_superscripts(FilledTokens, FixedVariables, GlobalVariables),
-    fix_lists(FixedVariables, FixedLists),
-    fix_forks(FixedLists, FixedForks),
-    fix_arrows(FixedForks, Program),
-    atomic_list_concat(GlobalVariables, ',', G),
-    atomic_list_concat(['[', G, ']'], GlobalVariablesAtom),
-    transpile(Program, Predicates, GlobalVariablesAtom),
-    !.
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   PARSE_ARGUMENT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-parse_argument(Arg, Term) :-
-    (   atom(Arg),
-        AtomArg = Arg
-    ;   \+ atom(Arg),
-        term_to_atom(Arg, AtomArg)
-    ),
-    atom_chars(AtomArg, SplittedArg),
-    tokenize(SplittedArg, Token),
-    fix_variables_superscripts(Token, FixedSuperscripts, _),
-    fix_lists(FixedSuperscripts, Program),
-    transpile(Program, Parsed, '[]'),
-    !,
-    reverse(Parsed, [TempMainPredicate|_]),
-    nth0(3, TempMainPredicate, Atom),
-    atom_concat(',\n    ', AtomT, Atom),
-    atom_concat(ParsedArg, ' = Var_Input_Local', AtomT),
-    term_to_atom(Term, ParsedArg)
-    ;
-    throw('Incorrect variable format.').
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   APPEND_TRAILING_OUTPUT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-append_trailing_output([], ['variable':'Output':'sup':'default']).
-append_trailing_output(['control':'\n'|T], ['variable':'Output':'sup':'default','control':'\n'|T2]) :-
-    append_trailing_output(T, T2).
-append_trailing_output(['control':'}'|T], ['variable':'Output':'sup':'default','control':'}'|T2]) :-
-    append_trailing_output(T, T2).
-append_trailing_output(['control':'⟩'|T], ['variable':'Output':'sup':'default','control':'⟩'|T2]) :-
-    append_trailing_output(T, T2).
-append_trailing_output(['control':'|'|T], ['variable':'Output':'sup':'default','control':'|'|T2]) :-
-    append_trailing_output(T, T2).
-append_trailing_output([H|T], [H|T2]) :-
-    H \= 'control':'\n',
-    H \= 'control':'}',
-    H \= 'control':'⟩',
-    H \= 'control':'|',
-    append_trailing_output(T, T2).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   FIX_PREDICATES'⟨', '⟩'
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-fix_predicates(Tokens, FixedPredicates) :-
-    fix_predicates(Tokens, 1, L),
-    append(L, FixedPredicates).
-
-fix_predicates([], _, [[]]).
-fix_predicates(['control':'{'|T], I, [['predicate':PredName:0|Rest], ['control':'\n'|Predicate]|AllOtherPredicates]) :-
-    atomic_list_concat(['brachylog_predicate_',I], PredName),
-    J is I + 1,
-    fix_predicates_(T, J, [Predicate|OtherPredicates1], Z, Remaining),
-    fix_predicates(Remaining, Z, [Rest|OtherPredicates2]),
-    append(OtherPredicates1, OtherPredicates2, AllOtherPredicates).
-fix_predicates(['control':'⟨'|T], I, [['predicate':PredName:0|Rest], ['control':'\n','fork':'start'|Predicate]|AllOtherPredicates]) :-
-    atomic_list_concat(['brachylog_predicate_',I], PredName),
-    J is I + 1,
-    fix_predicates_(T, J, [Predicate|OtherPredicates1], Z, Remaining),
-    fix_predicates(Remaining, Z, [Rest|OtherPredicates2]),
-    append(OtherPredicates1, OtherPredicates2, AllOtherPredicates).
-fix_predicates(['control':'\n'|T], I, [[],['control':'\n'|Rest]|OtherPredicates]) :-
-    J is I + 1,
-    fix_predicates(T, J, [Rest|OtherPredicates]).
-fix_predicates([Type:A|T], I, [[Type:A|Rest]|OtherPredicates]) :-
-    \+ (Type = 'control', A = '{'),
-    \+ (Type = 'control', A = '}'),
-    \+ (Type = 'control', A = '⟨'),
-    \+ (Type = 'control', A = '⟩'),
-    \+ (Type = 'control', A = '\n'),
-    fix_predicates(T, I, [Rest|OtherPredicates]).
-
-fix_predicates_([], _, [[]]).
-fix_predicates_(['control':'{'|T], I, [['predicate':PredName:0|Rest], ['control':'\n'|Predicate]|AllOtherPredicates], Z, Remaining) :-
-    atomic_list_concat(['brachylog_predicate_',I], PredName),
-    J is I + 1,
-    fix_predicates_(T, J, [Predicate|OtherPredicates1], Z2, Remaining2),
-    fix_predicates_(Remaining2, Z2, [Rest|OtherPredicates2], Z, Remaining),
-    append(OtherPredicates1, OtherPredicates2, AllOtherPredicates).
-fix_predicates_(['control':'⟨'|T], I, [['predicate':PredName:0|Rest], ['control':'\n','fork':'start'|Predicate]|AllOtherPredicates], Z, Remaining) :-
-    atomic_list_concat(['brachylog_predicate_',I], PredName),
-    J is I + 1,
-    fix_predicates_(T, J, [Predicate|OtherPredicates1], Z2, Remaining2),
-    fix_predicates_(Remaining2, Z2, [Rest|OtherPredicates2], Z, Remaining),
-    append(OtherPredicates1, OtherPredicates2, AllOtherPredicates).
-fix_predicates_(['control':'}'|T], I, [[]], I, T).
-fix_predicates_(['control':'⟩'|T], I, [['fork':'end']], I, T).
-fix_predicates_([Type:A|T], I, [[Type:A|Rest]|OtherPredicates], Z, Remaining) :-
-    \+ (Type = 'control', A = '{'),
-    \+ (Type = 'control', A = '}'),
-    \+ (Type = 'control', A = '⟨'),
-    \+ (Type = 'control', A = '⟩'),
-    \+ (Type = 'control', A = '\n'),
-    fix_predicates_(T, I, [Rest|OtherPredicates], Z, Remaining).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   FIX_METAPREDICATES
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-fix_metapredicates([], []).
-fix_metapredicates(['predicate':PredName:Sub,'metapredicate':MetapredName:Sup|T], ['predicate':PredName:Sub:MetapredName:Sup|T2]) :-
-    fix_metapredicates(T, T2).
-fix_metapredicates(['predicate':PredName:Sub|T], ['predicate':PredName:Sub:'no':0|T2]) :-
-    fix_metapredicates(T, T2).
-fix_metapredicates([H|T], [H|T2]) :-
-    fix_metapredicates(T, T2).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   FILL_IMPLICIT_VARIABLES
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-fill_implicit_variables(Tokens, Program) :-
-    fill_implicit_variables(Tokens, 0, Program).
-
-fill_implicit_variables([], _, []).
-fill_implicit_variables(['control':':','predicate':A|T], I, ['control':':','predicate':A|T2]) :-
-    fill_implicit_variables(T, I, T2).
-fill_implicit_variables(['predicate':A,Type:B|T], I, ['predicate':A,'variable':V|T2]) :-
-    Type \= 'variable',
-    atom_concat('V', I, V),
-    J is I + 1,
-    fill_implicit_variables([Type:B|T], J, T2).
-fill_implicit_variables(['predicate':A], I, ['predicate':A,'variable':V]) :-
-    atom_concat('V', I, V).
-fill_implicit_variables(['predicate':A,'variable':B|T], I, ['predicate':A,'variable':B|T2]) :-
-    fill_implicit_variables(T, I, T2).
-fill_implicit_variables(['control':H,Type:B|T], I, ['control':H,'variable':V|T2]) :-
-    Type \= 'variable',
-    (   H = '∧'
-    ;   H = '∨'
-    ),
-    atom_concat('V', I, V),
-    J is I + 1,
-    fill_implicit_variables([Type:B|T], J, T2).
-fill_implicit_variables(['control':H,'variable':B,Type:C|T], I, ['control':H,'variable':B,'variable':V|T2]) :-
-    Type \= 'variable',
-    (   H = '↖'
-    ;   H = '↙'
-    ),
-    atom_concat('V', I, V),
-    J is I + 1,
-    fill_implicit_variables([Type:C|T], J, T2).
-fill_implicit_variables([Type:A|T], I, [Type:A|T2]) :-
-    Type \= 'predicate',
-    \+ (Type = 'control', A = ':', T = ['predicate':_|_]),
-    \+ (Type = 'control', A = '∧', T \= ['variable':_|_]),
-    \+ (Type = 'control', A = '∨', T \= ['variable':_|_]),
-    \+ (Type = 'control', A = '↖', T \= ['variable':_|_]),
-    \+ (Type = 'control', A = '↙', T \= ['variable':_|_]),
-    fill_implicit_variables(T, I, T2).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   FIX_VARIABLES_SUPERSCRIPTS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-fix_variables_superscripts(Input, Output, GlobalVariables) :-
-    fix_variables_superscripts_(Input, Output, GlobVars),
-    sort(GlobVars, GlobalVariables).  % Remove duplicates
-
-fix_variables_superscripts_([], [], []).
-fix_variables_superscripts_(['variable':A:'sup':Sup|T], ['variable':V|T2], [V|GlobalVariables]) :-
-    atomic_list_concat(['integer',  SupAtom], ':', Sup),
-    atom_number(SupAtom, J),
-    atomic_list_concat(['Var_',A,'_',J], V),
-    fix_variables_superscripts_(T, T2, GlobalVariables).
-fix_variables_superscripts_(['variable':A:'sup':'default'|T], ['variable':V|T2], GlobalVariables) :-
-    atomic_list_concat(['Var_',A,'_Local'], V),
-    fix_variables_superscripts_(T, T2, GlobalVariables).
-fix_variables_superscripts_(['variable':List|T], ['variable':FixedList|T2], GlobalVariables) :-
-    is_list(List),
-    fix_variables_superscripts_(List, FixedList, Vars),
-    fix_variables_superscripts_(T, T2, GlobalVariables2),
-    append(Vars, GlobalVariables2, GlobalVariables).
-fix_variables_superscripts_([X|T], [X|T2], GlobalVariables) :-
-    fix_variables_superscripts_(T, T2, GlobalVariables).
-
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   FIX_LISTS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-fix_lists([], []).
-fix_lists(['variable':List|T], ['variable':FixedList|T2]) :-
-    is_list(List),
-    fix_list(List, FixedList),
-    fix_lists(T, T2).
-fix_lists([X|T], [X|T2]) :-
-    (   X = 'variable':L,
-        \+ (is_list(L))
-    ;   X \= 'variable':_
-    ),
-    fix_lists(T, T2).
-
-fix_list([], []).
-fix_list(['control':','|T], T2) :-
-    fix_list(T, T2).
-fix_list([X|T], [Y|T2]) :-
-    X \= 'control':',',
-    (   X = 'variable':L,
-        is_list(L),
-        fix_list(L, Y)
-    ;   X = 'variable':Y
-    ;   X = 'predicate':_,
-        Y = X
-    ;   Y = X
-    ),
-    fix_list(T, T2).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   FIX_FORKS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-fix_forks(L, Z) :-
-    fix_forks(L, 0, Z).
-
-fix_forks([], _, []).     % Ignore each useless implicit var after
-fix_forks(['fork':'start', F1, _, F2, Output, 'fork':'end'|T], I, ['control':'unpair','variable':V1,F1,Output,F2,'variable':V1,'control':'∧'|T2]) :-
-    atom_concat('Fork', I, V1),
-    J is I + 1,
-    fix_forks(T, J,  T2).
-fix_forks(['fork':'start', F1, _, F2, _, F3, Output, 'fork':'end'|T], I, ['control':'&',F1,'variable':V1,'control':'&',F3,'variable':V2,'control':'∧','variable':V1,'control':';','variable':V2,F2,Output|T2]) :-
-    atom_concat('Fork', I, V1),
-    J is I + 1,
-    atom_concat('Fork', J, V2),
-    K is I + 1,
-    fix_forks(T, K, T2).
-fix_forks([H|T], I, [H|T2]) :-
-    dif(H, 'fork':'start'),
-    fix_forks(T, I, T2).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   FIX_ARROWS
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-fix_arrows([], []).
-fix_arrows(['predicate':P:_:Meta:Sup,'variable':_,'control':'↙','variable':V|T], T2) :- !,
-    (   atom(V) ->
-        V = VA
-    ;   term_to_atom(V, VA)
-    ),
-    fix_arrows(['predicate':P:VA:Meta:Sup|T], T2).
-fix_arrows(['predicate':P:Sub:Meta:_,'variable':_,'control':'↖','variable':V|T], T2) :- !,
-    (   atom(V) ->
-        V = VA
-    ;   term_to_atom(V, VA)
-    ),
-    fix_arrows(['predicate':P:Sub:Meta:VA|T], T2).
-fix_arrows(['predicate':P:_:Meta:Sup,'control':'↙','variable':V|T], T2) :- !,
-    (   atom(V) ->
-        V = VA
-    ;   term_to_atom(V, VA)
-    ),
-    fix_arrows(['predicate':P:VA:Meta:Sup|T], T2).
-fix_arrows(['predicate':P:Sub:Meta:_,'control':'↖','variable':V|T], T2) :- !,
-    (   atom(V) ->
-        V = VA
-    ;   term_to_atom(V, VA)
-    ),
-    fix_arrows(['predicate':P:Sub:Meta:VA|T], T2).
-fix_arrows([H|T], [H|T2]) :-
-    fix_arrows(T, T2).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   TRANSPILE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-transpile(Program, [[':- style_check(-singleton).'],
-                    [':- use_module(library(clpfd)).'],
-                    [':- use_module(predicates).'],
-                    [':- use_module(metapredicates).'],
-                    [':- use_module(constraint_variables).\n'],
-                    [MainPredHeader,
-                    ConstraintVariables,
-                    '    (1=1'|MainPred]|OtherPredicates], GlobalVariables) :-
-    atomic_list_concat(['brachylog_main(',
-                        GlobalVariables,
-                        ',_, Var_Input_Local,Var_Output_Local) :-\n',
-                        '    Name = brachylog_main,\n',
-                        '    GlobalVariables = ',
-                        GlobalVariables,',\n',
-                        '    nb_setval(\'declw\',[]),\n'],    % Initialize declarative write variable
-                       MainPredHeader),
-    constraint_variables(GlobalVariables, ConstraintVariables),
-    transpile_(Program, 'Var_Input_Local', no, no, 0, 0, [T|OtherPredicates], GlobalVariables),
-    reverse(T, [_|RT]),
-    reverse(RT, T2),
-    append(T2, ['\n',
-                '    ),\n',
-                '    (',
-                '(Var_Output_Local = integer:_ ; ',
-                'Var_Output_Local = [_|_], ',
-                'forall(member(E, Var_Output_Local), E = integer:_)) ',
-                '-> brachylog_label(default, Var_Output_Local, _) ',
-                '; true),\n',
-                '    nb_getval(\'declw\', DeclwFinal),\n',
-                '    maplist(write, DeclwFinal).'],    % execute declarative write
-               MainPred).
-
-transpile_([], _, _, _, _, _, [['\n    ).\n']], _).
-transpile_(['variable':B|T], A, Reverse, Negate, AppendNumber, PredNumber, [[Unification|T2]|OtherPredicates], GlobalVariables) :-
-    A \= 'nothing',
-    (   is_list(A),
-        brachylog_list_to_atom(A, Var1)
-    ;   A = Type:L,
-        term_to_atom(Type:L, Var1)
-    ;   A = Var1
-    ),
-    (   is_list(B),
-        brachylog_list_to_atom(B, Var2)
-    ;   B = _:_,
-        term_to_atom(B, Var2)
-    ;   Var2 = B
-    ),
-    (   Negate = yes,
-        UnificationAtom = ' \\= '
-    ;   Negate = no,
-        UnificationAtom = ' = '
-    ),
-    (   Reverse = no,
-        atomic_list_concat([',\n    ',Var2,UnificationAtom,Var1], Unification),
-        transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables)
-    ;   Reverse = yes,
-        atomic_list_concat([',\n    ',Var1,UnificationAtom,Var2], Unification),
-        transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables)
-    ).
-transpile_(['variable':B|T], 'nothing', _, _, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables) :-
-    transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['predicate':P:Sub:Meta:Sup,'variable':B|T], A, Reverse, Negate, AppendNumber, PredNumber, [[Predicate|T2]|OtherPredicates], GlobalVariables) :-
-    A \= 'nothing',
-    (   P = 'brachylog_call_predicate',
-        (   Sub = 'default' ->
-            RealSub = 'Name-GlobalVariables'
-        ;   atomic_list_concat(['(',Sub,')-','GlobalVariables'], RealSub)
-        )
-    ;   P \= 'brachylog_call_predicate',
-        RealSub = Sub
-    ),
-    (   is_list(A),
-        brachylog_list_to_atom(A, Var1)
-    ;   A = Type:L,
-        term_to_atom(Type:L, Var1)
-    ;   A = Var1
-    ),
-    (   is_list(B),
-        brachylog_list_to_atom(B, Var2)
-    ;   B = _:_,
-        term_to_atom(B, Var2)
-    ;   Var2 = B
-    ),
-    (   Negate = yes,
-        NegateAtom = '\\+ '
-    ;   Negate = no,
-        NegateAtom = ''
-    ),
-    (   Reverse = no ->
-        PredName = P
-    ;   atomic_list_concat([P,'_reversed'], PredName)
-    ),
-    (   atomic_list_concat(['brachylog','predicate',_], '_', P)
-    ->  atomic_list_concat([GlobalVariables,','], GlobVars)
-    ;   GlobVars = ''
-    ),
-    (   Meta = no ->
-        atomic_list_concat([',\n    ',NegateAtom,PredName,'(',GlobVars,RealSub,',',Var1,',',Var2,')'], Predicate)
-    ;   (   atomic_list_concat(['brachylog','predicate',_], '_', P)
-        ->  atomic_list_concat([GlobalVariables,','], GlobVarsMeta)
-        ;   GlobVarsMeta = 'ignore,'
-        ),
-        atomic_list_concat([',\n    ',NegateAtom,Meta,'(',GlobVarsMeta,Sup,',',PredName,',',RealSub,',',Var1,',',Var2,')'], Predicate)
-    ),
-    transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':'∧'|T], _, _, _, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables) :-
-    transpile_(T, 'nothing', no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':'&'|T], _, _, _, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables) :-
-    transpile_(T, 'Var_Input_Local', no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':'`'|T], B, _, _, AppendNumber, PredNumber, [['\n    *->\n    1=1'|T2]|OtherPredicates], GlobalVariables) :-
-    transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':'∨'|T], _, _, _, AppendNumber, PredNumber, [['\n    ;\n    1=1'|T2]|OtherPredicates], GlobalVariables) :-
-    transpile_(T, 'nothing', no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':'('|T], B, _, Negate, AppendNumber, PredNumber, [[Parenthesis|T2]|OtherPredicates], GlobalVariables) :-
-    (   Negate = yes,
-        Parenthesis = ',\n    \\+ (\n    1=1'
-    ;   Negate = no,
-        Parenthesis = ',\n    (\n    1=1'
-    ),
-    transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':')'|T], B, _, _, AppendNumber, PredNumber, [['\n    )'|T2]|OtherPredicates], GlobalVariables) :-
-    transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':'!'|T], B, _, _, AppendNumber, PredNumber, [[',\n    !'|T2]|OtherPredicates], GlobalVariables) :-
-    transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':'⊥'|T], B, _, _, AppendNumber, PredNumber, [[',\n    false'|T2]|OtherPredicates], GlobalVariables) :-
-    transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':'~'|T], B, Reverse, Negate, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables) :-
-    (   Reverse = yes,
-        NewReverse = no
-    ;   Reverse = no,
-        NewReverse = yes
-    ),
-    transpile_(T, B, NewReverse, Negate, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':'¬'|T], B, Reverse, Negate, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables) :-
-    (   Negate = yes,
-        NewNegate = no
-    ;   Negate = no,
-        NewNegate = yes
-    ),
-    transpile_(T, B, Reverse, NewNegate, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':'unpair','variable':A|T], B, _, _, AppendNumber, PredNumber, [[Unpair|T2]|OtherPredicates], GlobalVariables) :-
-    (   A = TypeA:LA,
-        term_to_atom(TypeA:LA, TailElem)
-    ;   A = TailElem
-    ),
-    (   B = TypeB:LB,
-        term_to_atom(TypeB:LB, Pair)
-    ;   B = Pair
-    ),
-    atomic_list_concat(['UnpairTemp',AppendNumber],HeadElem),
-    atomic_list_concat([',\n    ',
-                        Pair,'=[',HeadElem,',',TailElem,']'],Unpair),
-    NewAppendNumber is AppendNumber + 1,
-    transpile_(T, HeadElem, no, no, NewAppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':';',Type:A|T], B, _, _, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables) :-
-    (   Type = 'variable'
-    ;   Type = 'predicate'
-    ),
-    append([B], [A], NewVar),
-    transpile_(T, NewVar, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':',','variable':A|T], B, _, _, AppendNumber, PredNumber, [[Append|T2]|OtherPredicates], GlobalVariables) :-
-    (   is_list(A),
-        brachylog_list_to_atom(A, Arg1)
-    ;   A = TypeA:LA,
-        term_to_atom(TypeA:LA, Arg1)
-    ;   A = Arg1
-    ),
-    (   is_list(B),
-        brachylog_list_to_atom(B, Arg2)
-    ;   B = TypeB:LB,
-        term_to_atom(TypeB:LB, Arg2)
-    ;   B = Arg2
-    ),
-    atomic_list_concat(['AppendTemp',AppendNumber],TempVar),
-    atomic_list_concat([',\n    ',
-                        '((',Arg2,' == [], \\+ is_brachylog_list(',Arg1,')) -> ',TempVar,' = [',Arg1,'] ; ',
-                        'brachylog_concatenate(default,',
-                        '[',Arg2,',',Arg1,']',
-                        ',',TempVar,') -> true ; is_brachylog_list(',
-                        Arg2,
-                        '), brachylog_concatenate(default,',
-                        '[',Arg2,',[',Arg1,']]',
-                        ',',TempVar,') -> true ; brachylog_concatenate(default,',
-                        '[[',Arg2,'],[',Arg1,']],',TempVar,'))'
-                       ], Append),
-    NewAppendNumber is AppendNumber + 1,
-    transpile_(T, TempVar, no, no, NewAppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':'\n'|T], _, _, _, AppendNumber, PredNumber, [['\n    ).\n'],[ReversedPred],[PredHead|T2]|OtherPredicates], GlobalVariables) :-
-    J is PredNumber + 1,
-    constraint_variables(GlobalVariables, ConstraintVariables),
-    atomic_list_concat(['brachylog_predicate_',
-                        J,
-                        '_reversed(',
-                        GlobalVariables,
-                        ',_, Input, Output',
-                        ') :-\n',
-                        '    brachylog_predicate_',
-                        J,
-                        '(',
-                        GlobalVariables,
-                        ',_, Output, Input',
-                        ').\n'], ReversedPred),
-    atomic_list_concat(['brachylog_predicate_',
-                        J,
-                        '(',
-                        GlobalVariables,
-                        ',_, ',
-                        'Var_Input_Local',
-                        ',Var_Output_Local',
-                        ') :-\n    Name = brachylog_predicate_',
-                        J,
-                        ',\n    GlobalVariables = ',
-                        GlobalVariables,
-                        ',\n',
-                        ConstraintVariables,
-                        '    (1=1'], PredHead),
-    transpile_(T, 'Var_Input_Local', no, no, AppendNumber, J, [T2|OtherPredicates], GlobalVariables).
-transpile_(['control':'|'|T], _, _, _, AppendNumber, PredNumber, [['\n    ).\n'],[PredHead|T2]|OtherPredicates], GlobalVariables) :-
-    (   PredNumber = 0,
-        PredName = 'brachylog_main'
-    ;   PredNumber \= 0,
-        atomic_list_concat(['brachylog_predicate_',PredNumber], PredName)
-    ),
-    constraint_variables(GlobalVariables, ConstraintVariables),
-    atomic_list_concat([PredName,
-                        '(',
-                        GlobalVariables,
-                        ',_, ',
-                        'Var_Input_Local',
-                        ',Var_Output_Local',
-                        ') :-\n    Name = ',
-                        PredName,
-                        ',\n    GlobalVariables = ',
-                        GlobalVariables,
-                        ',\n',
-                        ConstraintVariables,
-                        '    (1=1'], PredHead),
-    transpile_(T, 'Var_Input_Local', no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   CONTAINS_WRITE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-contains_write(Code) :-
-    atom_chars(Code, SplittedCode),
-    tokenize(SplittedCode, Tokens),
-    fix_predicates(Tokens, FixedPredicates),
-    (   member(predicate:brachylog_write:_, FixedPredicates)
-    ;   member(predicate:brachylog_writeln:_, FixedPredicates)
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   CONSTRAINT_VARIABLES
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-constraint_variables(GlobalVariables, ConstraintVariables) :-
-    atom_chars(GlobalVariables, [_|Gs]),
-    reverse(Gs, [_|RGs]),
-    reverse(RGs, RRGs),
-    atomic_list_concat(RRGs, GGs),
-    atomic_list_concat(GlobVars, ',', GGs),
-    findall(S, (member(X, GlobVars),
-                atomic_list_concat(['Var', Name, _], '_', X),
-                atom_chars(Name, CName),
-                reverse(CName, [_,'t','n','i','a','r','t','s','n','o','C']),
-                constraint_variable(X, S)), Ss),
-    atomic_list_concat(Ss, GlobalConstraintVariables),
-    findall(T, (member(X, ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']),
-                atomic_list_concat(['    constraint',X,'(Var_Constraint',X,'_Local','),\n'], T)),
-            Ts
-    ),
-    atomic_list_concat(Ts, LocalConstraintVariables),
-    atomic_list_concat([GlobalConstraintVariables, LocalConstraintVariables], ConstraintVariables).
-
-constraint_variable(X, S) :-
-    atomic_list_concat(['Var', ConstraintName, _], '_', X),
-    atom_chars(ConstraintName, [C|Cs]),
-    downcase_atom(C, CDown),
-    atomic_list_concat([CDown|Cs], PredName),
-    atomic_list_concat(['   ',PredName,'(',X,'),\n'], S).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_LIST_TO_ATOM
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_list_to_atom(List, Atom) :-
-    brachylog_list_to_atom_(List, T2),
-    atomic_list_concat(['[',T2,']'], Atom).
-
-brachylog_list_to_atom_([], '').
-brachylog_list_to_atom_([A], AtomA) :-
-    (   is_list(A),
-        brachylog_list_to_atom(A, AtomA)
-    ;   A = _:_,
-        term_to_atom(A, AtomA)
-    ;   \+ is_list(A),
-        A \= _:_,
-        AtomA = A
-    ).
-brachylog_list_to_atom_([A,B|T], Atom) :-
-    (   is_list(A),
-        brachylog_list_to_atom(A, AtomA)
-    ;   A = _:_,
-        term_to_atom(A, AtomA)
-    ;   \+ is_list(A),
-        A \= _:_,
-        AtomA = A
-    ),
-    brachylog_list_to_atom_([B|T], T2),
-    atomic_list_concat([AtomA,',',T2], Atom).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   WRITE_TO_FILE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-write_to_file(File, []) :-
-    write(File, '\n\n').
-write_to_file(File, [H|T]) :-
-    write(File, H),
-    write_to_file(File, T).
--- a/ibin/brachylog/Brachylog-master/src/utils.pl	Tue Jul 16 21:38:16 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,195 +0,0 @@
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-____            ____
-\   \          /   /
- \   \  ____  /   /
-  \   \/    \/   /
-   \     /\     /     BRACHYLOG       
-    \   /  \   /      A terse declarative logic programming language
-    /   \  /   \    
-   /     \/     \     Written by Julien Cumin - 2017
-  /   /\____/\   \    https://github.com/JCumin/Brachylog
- /   /  ___   \   \
-/___/  /__/    \___\
-     
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-
-
-:- module(utils, [integer_value/2,
-                  brachylog_prolog_variable/2,
-                  length_/2,
-                  prepend_string/2,
-                  prepend_integer/2,
-                  is_brachylog_list/1,
-                  single_atom_code/2,
-                  ceiled_square_root/2,
-                  scompare/4,
-                  if_/3,
-                  (=)/3,
-                  (#>)/3,
-                  (===)/6
-                 ]).
-
-:- use_module(library(clpfd)).
-    
-    
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   INTEGER_VALUE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-integer_value('integer':Sign:I, E) :-
-    integer_value('integer':Sign:I, 0, E, E).
-
-integer_value('integer':Sign:[], N0, N, _) :-
-    (   Sign = 'positive',
-        N #= N0
-    ;   Sign = 'negative',
-        N #= - N0
-    ).
-integer_value('integer':Sign:[H], N0, N, M) :-
-    H in 0..9,
-    N1 #= H + N0 * 10,
-    abs(M) #>= abs(N1),
-    integer_value('integer':Sign:[], N1, N, M).
-integer_value('integer':Sign:[H,I|T], N0, N, M) :-
-    H in 0..9,
-    N1 #= H + N0 * 10,
-    abs(M) #>= abs(N1),
-    integer_value('integer':Sign:[I|T], N1, N, M).
-    
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   BRACHYLOG_PROLOG_VARIABLE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-brachylog_prolog_variable('integer':I, I) :- !.
-brachylog_prolog_variable('float':F, F) :- !.
-brachylog_prolog_variable('string':S, String) :- !,
-    escape_string_list(S, T),
-    atomic_list_concat(T, U),
-    atomic_list_concat(['"',U,'"'], A),
-    term_to_atom(String, A).
-brachylog_prolog_variable(List, PrologList) :-
-    is_list(List),
-    maplist(brachylog_prolog_variable, List, PrologList).
-    
-escape_string_list([], []).
-escape_string_list(['"'|T], ['\\','"'|T2]) :-
-    escape_string_list(T, T2).
-escape_string_list(['\\'|T], ['\\','\\'|T2]) :-
-    escape_string_list(T, T2).
-escape_string_list([H|T], [H|T2]) :-
-    H \= '"',
-    H \= '\\',
-    escape_string_list(T, T2).
-
-    
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   LENGTH_
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-length_(Length, List) :-
-    length(List, Length).
-   
-   
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   PREPEND_STRING
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-prepend_string(S, 'string':S).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   PREPEND_INTEGER
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-prepend_integer(I, 'integer':I).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   IS_BRACHYLOG_LIST
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-is_brachylog_list([]).
-is_brachylog_list([_|_]).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   SINGLE_ATOM_CODE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-single_atom_code(A, C) :-
-    catch(atom_codes(A, [C]), _, false).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   CEILED_SQUARE_ROOT
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-ceiled_square_root(0, 0).
-ceiled_square_root(N0, Root) :-
-        N1 #= N0 - 1,
-        Max in 0..N1,
-        R0^2 #= Max,
-        Root #= Root0 + 1,
-        fd_sup(R0, Root0).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   SCOMPARE
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-scompare(@>, TypeX:X, TypeY:Y, TypeZ:Z) :-
-    (   X @> Y ->
-        TypeZ:Z = TypeX:X
-    ;   TypeZ:Z = TypeY:Y
-    ).
-scompare(@<, TypeX:X, TypeY:Y, TypeZ:Z) :-
-    (   X @< Y ->
-        TypeZ:Z = TypeX:X
-    ;   TypeZ:Z = TypeY:Y
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   IF_/3
-   Credits to Ulrich Neumerkel
-   See: http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/sicstus/reif.pl
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-if_(If_1, Then_0, Else_0) :-
-    call(If_1, T),
-    (   T == true -> Then_0
-    ;   T == false -> Else_0
-    ;   nonvar(T) -> throw(error(type_error(boolean,T),
-                                 type_error(call(If_1,T),2,boolean,T)))
-    ;   throw(error(instantiation_error,instantiation_error(call(If_1,T),2)))
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   (=)/3
-   Credits to Ulrich Neumerkel
-   See: http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/sicstus/reif.pl
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-=(X, Y, T) :-
-    (   X == Y -> T = true
-    ;   X \= Y -> T = false
-    ;   T = true, X = Y
-    ;   T = false,
-        dif(X, Y)
-    ).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   (#>)/3
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-#>(X, Y, T) :-
-    zcompare(C, X, Y),
-    greater_true(C, T).
-
-greater_true(>, true).
-greater_true(<, false).
-greater_true(=, false).
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-   (===)/6
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
-===(X1, Y1, X2, Y2, T1, T) :-
-    (   X1 == Y1 -> T1 = true, T = true
-    ;   X1 \= Y1 -> T1 = true, T = false
-    ;   X2 == Y2 -> T1 = false, T = true
-    ;   X2 \= Y2 -> T1 = false, T = false
-    ;   T1 = true, T = true, X1 = Y1
-    ;   T1 = true, T = false, dif(X1, Y1)
-).
Binary file ibin/brachylog/master.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/brachylog/brachylog/Brachylog-master/.gitignore	Tue Jul 16 21:39:11 2019 +0000
@@ -0,0 +1,16 @@
+*.class
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+compiled_brachylog.pl
+*.brachylog
+*.aux
+*.bbl
+*.blg
+*.log
+*.gz
+src/compiled_brachylog_eval.pl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/brachylog/brachylog/Brachylog-master/LICENSE	Tue Jul 16 21:39:11 2019 +0000
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 - 2019 Julien Cumin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/brachylog/brachylog/Brachylog-master/README.md	Tue Jul 16 21:39:11 2019 +0000
@@ -0,0 +1,56 @@
+<p align="center"><a href="https://github.com/JCumin/Brachylog"><img src="https://github.com/JCumin/Brachylog/blob/master/misc/brachylog_logo.png" alt="Brachylog" width="600"/></a></p>
+
+# What is it?
+
+Brachylog is a declarative logic programming language much like Prolog. Brachylog is designed to be much terser than Prolog, while retaining some readability.
+
+Currently in development.
+
+Brachylog uses [SWI-Prolog](http://www.swi-prolog.org/) as Prolog engine.
+
+## How do I use this?
+
+### Documentation
+
+Check out [Brachylog's Wiki](https://github.com/JCumin/Brachylog/wiki) if you want to learn how to write programs in this language.
+
+You may want to watch this [**short video introduction to Brachylog**](https://www.youtube.com/watch?v=XYVhZ-MFcUs).
+
+### Try it online!
+
+You can try out Brachylog on [Try it online!](https://tio.run/nexus/brachylog2), thanks to @DennisMitchell.
+
+### Brachylog language bar
+
+[You can find here](https://abrudz.github.io/lb/brachylog) the Brachylog language bar which gives you access to all symbols used in Brachylog on any webpage (by clicking on the symbols or by inputing shortcuts), thanks to @abrudz.
+
+### The interpreter
+
+Brachylog's interpreter is entirely written in Prolog. Therefore, installing [SWI-Prolog](http://www.swi-prolog.org/) (version 7 and up) is mandatory to use Brachylog (We do not guarantee that Brachylog's interpreter will be compatible with any other Prolog implementation).
+
+To run Brachylog's interpreter, start SWI-Prolog's interpreter inside the `src` directory available in this repository, and consult the file `brachylog.pl` (`consult(brachylog).`). Alternatively, you can run the interpreter with:
+
+    $ swipl src/brachylog.pl
+
+You can then run Brachylog programs using different predicates:
+
+ - `run_from_file(FileName, Input, Output)`: `FileName` is an atom (i.e. between single quotes `'`) representing the file containing your Brachylog code. For example: `run_from_file('code.brachylog',"Test Input",Z)`.
+ 
+ - `run_from_atom(Code, Input, Output)`: `Code` is an atom (i.e. between single quotes `'`) containing your Brachylog code. For example: `run_from_atom('∧"Hello, World!"w',_,_)`. Note that you will have to escape certain characters in `Code`.
+
+ - `run(Input, Output)`: This will run a Brachylog program that has already been transpiled to Prolog using either of the two previous predicates. More precisely, this will query `brachylog_main/2` in the file `compiled_brachylog.pl`.
+
+The first two predicates will transpile your Brachylog program into Prolog, subsequently generating a file called `compiled_brachylog.pl` in the same directory that contains `brachylog.pl`. The three run predicates will then consult it and query `brachylog_main/3`.
+ 
+Note that the first two run predicates also exist with either no `Output` argument, or with no `Input` nor `Output` argument, if necessary. For example, `run_from_file('code.brachylog')` is equivalent to `run_from_file('code.brachylog', _, _)`.
+
+
+### Contributors
+
+- Julien Cumin - [@JCumin](https://github.com/JCumin)
+
+- Markus Triska - [@triska](https://github.com/triska)
+
+- ais523
+
+- [@UnrelatedString](https://github.com/UnrelatedString)
Binary file interps/brachylog/brachylog/Brachylog-master/misc/brachylog_logo.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/brachylog/brachylog/Brachylog-master/misc/brachylog_logo.svg	Tue Jul 16 21:39:11 2019 +0000
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="210mm"
+   height="297mm"
+   viewBox="0 0 744.09448819 1052.3622047"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="brachylog_logo.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="213.76996"
+     inkscape:cy="516.56084"
+     inkscape:document-units="px"
+     inkscape:current-layer="g3417-5"
+     showgrid="false"
+     inkscape:window-width="1280"
+     inkscape:window-height="961"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3415" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       style="font-style:normal;font-weight:normal;font-size:90px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       id="text3336">
+      <g
+         style="font-style:normal;font-weight:normal;font-size:90px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         id="g3417-5"
+         transform="translate(-9.882771,-189.29487)">
+        <path
+           id="path3380-6"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
+           d="m 145.5671,341.02921 0,24.03808 14.23828,0 q 7.16309,0 10.59082,-2.94433 3.47168,-2.98829 3.47168,-9.09668 0,-6.15235 -3.47168,-9.05274 -3.42773,-2.94433 -10.59082,-2.94433 l -14.23828,0 z m 0,-26.98243 0,19.77539 13.13965,0 q 6.50391,0 9.66797,-2.41699 3.20801,-2.46094 3.20801,-7.4707 0,-4.96582 -3.20801,-7.42676 -3.16406,-2.46094 -9.66797,-2.46094 l -13.13965,0 z m -8.87695,-7.29492 22.67578,0 q 10.15137,0 15.64453,4.21875 5.49316,4.21875 5.49316,11.99707 0,6.02051 -2.8125,9.58008 -2.8125,3.55957 -8.26171,4.43848 6.54785,1.40625 10.15136,5.88867 3.64746,4.43848 3.64746,11.11816 0,8.78907 -5.97656,13.5791 -5.97656,4.79004 -17.00684,4.79004 l -23.55468,0 0,-65.61035 z"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path3382-5"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
+           d="m 224.18526,349.29092 q 2.10938,0.43946 4.61426,2.98829 2.54883,2.54882 4.7461,6.63574 l 7.64648,13.44726 -8.56934,0 -7.11914,-12.6123 q -3.25195,-5.625 -5.97656,-6.89942 -2.68066,-1.27441 -6.24023,-1.27441 l -7.42676,0 0,20.78613 -8.12988,0 0,-49.21875 17.05078,0 q 9.58008,0 14.28222,3.47168 4.70215,3.47168 4.70215,10.72266 0,4.61426 -2.46093,7.69043 -2.46094,3.07617 -7.11915,4.26269 z m -18.32519,-19.33593 0,14.80957 8.70117,0 q 5.22949,0 7.99805,-1.88965 2.8125,-1.88965 2.8125,-5.31738 0,-3.38379 -2.59278,-5.49317 -2.54882,-2.10937 -8.21777,-2.10937 l -8.70117,0 z"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:nodetypes="ccccccccc"
+           inkscape:connector-curvature="0"
+           id="path3384-5"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
+           d="m 270.50362,331.05362 -10.89843,29.22363 -4.48243,12.08496 -8.56933,0 18.45703,-49.21875 10.98633,0 18.45703,49.21875 -8.56934,0 -4.48242,-12.08496" />
+        <path
+           id="path3386-9"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
+           d="m 341.03585,325.03311 0,7.5586 q -3.42773,-1.88965 -6.89941,-2.8125 -3.42774,-0.9668 -6.94336,-0.9668 -7.86621,0 -12.2168,5.00976 -4.35059,4.96582 -4.35059,13.97461 0,9.00879 4.35059,14.01856 4.35059,4.96582 12.2168,4.96582 3.51562,0 6.94336,-0.92285 3.47168,-0.9668 6.89941,-2.85645 l 0,7.4707 q -3.38379,1.58204 -7.03125,2.37305 -3.60352,0.79102 -7.69043,0.79102 -11.11816,0 -17.66601,-6.98731 -6.54786,-6.9873 -6.54786,-18.85254 0,-12.04101 6.5918,-18.94043 6.63574,-6.89941 18.14941,-6.89941 3.73536,0 7.29493,0.79102 3.55957,0.74707 6.89941,2.28515 z"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path3388-2"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
+           d="m 354.87862,323.14346 8.12989,0 0,20.08301 26.23535,0 0,-20.08301 8.12988,0 0,49.21875 -8.12988,0 0,-22.67578 -26.23535,0 0,22.67578 -8.12989,0 0,-49.21875 z"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path3392-1"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
+           d="m 468.96066,323.14346 8.08593,0 0,42.75879 28.08106,0 0,6.45996 -36.16699,0 0,-49.21875 z"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path3394-9"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
+           d="m 534.04366,328.81241 q -6.5039,0 -10.2832,5.09765 -3.7793,5.05372 -3.7793,13.88672 0,8.83301 3.73535,13.93067 3.7793,5.05371 10.32715,5.05371 6.45996,0 10.23926,-5.09766 3.7793,-5.09765 3.7793,-13.88672 0,-8.74511 -3.7793,-13.84277 -3.7793,-5.1416 -10.23926,-5.1416 z m 0,-6.85547 q 10.54688,0 16.56739,6.85547 6.0205,6.85547 6.0205,18.98437 0,12.08496 -6.0205,18.98438 -6.02051,6.85547 -16.56739,6.85547 -10.59082,0 -16.61133,-6.85547 -5.97656,-6.89942 -5.97656,-18.98438 0,-12.1289 5.97656,-18.98437 6.02051,-6.85547 16.61133,-6.85547 z"
+           inkscape:connector-curvature="0" />
+        <path
+           id="path3396-6"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans'"
+           d="m 602.68624,365.41885 0,-11.99707 -6.81152,0 0,-6.15234 14.10644,0 0,23.20312 q -4.43847,1.58204 -9.18457,2.37305 -4.70215,0.79102 -10.10742,0.79102 -11.11816,0 -17.66601,-6.98731 -6.54786,-6.9873 -6.54786,-18.85254 0,-12.04101 6.5918,-18.94043 6.63574,-6.89941 18.14941,-6.89941 4.57032,0 8.87696,1.23047 4.35058,1.18652 8.4375,3.60351 l 0,7.47071 q -4.17481,-2.72461 -8.39356,-4.08692 -4.21875,-1.3623 -8.56933,-1.3623 -7.86621,0 -12.2168,5.00976 -4.35059,4.96582 -4.35059,13.97461 0,9.00879 4.35059,14.01856 4.35059,4.96582 12.2168,4.96582 3.47168,0 6.19629,-0.30762 2.72461,-0.35156 4.92187,-1.05469 z"
+           inkscape:connector-curvature="0" />
+        <path
+           sodipodi:nodetypes="ccccccccc"
+           inkscape:connector-curvature="0"
+           id="path3384-7-0"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:90px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 432.34529,364.45205 -10.89843,-29.22363 -4.48243,-12.08496 -8.56933,0 18.45703,49.21875 10.98633,0 18.45703,-49.21875 -8.56934,0 -4.48242,12.08496" />
+        <path
+           sodipodi:nodetypes="ccccc"
+           inkscape:connector-curvature="0"
+           id="path3384-7-0-5"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:90px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 430.60403,391.65537 4.61443,-12.00213 -8.538,0 -5.34889,14.08953 c 5.72973,-1.50186 5.73359,-1.40086 9.27246,-2.0874 z" />
+        <g
+           id="g4830"
+           inkscape:export-xdpi="500"
+           inkscape:export-ydpi="500">
+          <path
+             d="m 350.7536,579.12368 -10.89844,29.22363 -4.48243,12.08496 -8.56933,0 18.45703,-49.21875 10.98633,0 18.45703,49.21875 -8.56934,0 -4.48242,-12.08496"
+             style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:90px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+             id="path3384-5-9"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccccccc" />
+          <g
+             transform="translate(-96.140005,-259.89081)"
+             id="g4792">
+            <path
+               sodipodi:nodetypes="ccccccccc"
+               inkscape:connector-curvature="0"
+               id="path3384-7-0-2"
+               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:90px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+               d="m 446.8936,857.40659 -10.89843,-29.22363 -4.48243,-12.08496 -8.56933,0 18.45703,49.21875 10.98633,0 18.45703,-49.21875 -8.56934,0 -4.48242,12.08496" />
+            <path
+               sodipodi:nodetypes="ccccc"
+               inkscape:connector-curvature="0"
+               id="path3384-7-0-5-4"
+               style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:90px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+               d="m 446.92011,880.32308 2.84666,-7.7153 -8.538,0 -2.69264,7.68328 z" />
+          </g>
+        </g>
+      </g>
+      <path
+         style="font-style:normal;font-weight:normal;font-size:90px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 592.80738,190.35837 0,7.70896 -466,0 0,7.291 473.291,0 0,-14.99996"
+         id="path3428-2"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccc" />
+      <path
+         style="font-style:normal;font-weight:normal;font-size:90px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 134.09599,190.35556 0,7.70896 466,0 0,7.291 -473.291,0 0,-14.99996"
+         id="path3428-2-2"
+         inkscape:connector-curvature="0"
+         sodipodi:nodetypes="cccccc" />
+    </g>
+  </g>
+</svg>
Binary file interps/brachylog/brachylog/Brachylog-master/misc/brachylog_mini_logo.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/brachylog/brachylog/Brachylog-master/src/brachylog.pl	Tue Jul 16 21:39:11 2019 +0000
@@ -0,0 +1,218 @@
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+____            ____
+\   \          /   /
+ \   \  ____  /   /
+  \   \/    \/   /
+   \     /\     /     BRACHYLOG       
+    \   /  \   /      A terse declarative logic programming language
+    /   \  /   \    
+   /     \/     \     Written by Julien Cumin - 2017
+  /   /\____/\   \    https://github.com/JCumin/Brachylog
+ /   /  ___   \   \
+/___/  /__/    \___\
+     
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+
+:- use_module(transpile).
+:- use_module(symbols).
+:- use_module(utils).
+:- use_module(predicates).
+:- use_module(metapredicates).
+:- use_module(constraint_variables).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   RUN_FROM_FILE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+run_from_file(FilePath) :-
+    run_from_file(FilePath, 'ignore', 'ignore').
+run_from_file(FilePath, Input) :-
+    run_from_file(FilePath, Input, 'ignore').
+run_from_file(FilePath, Input, Output) :-
+    read_file(FilePath, Code),
+    !,
+    run_from_atom(Code, Input, Output).
+    
+    
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   RUN_FROM_ATOM
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+run_from_atom(Code) :-
+    run_from_atom(Code, 'ignore', 'ignore').
+run_from_atom(Code, Input) :-
+    run_from_atom(Code, Input, 'ignore').
+run_from_atom(Code, Input, Output) :-
+    parse(Code, 'compiled_brachylog.pl'),
+    !,
+    run(Input, Output).
+    
+    
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   RUN
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+run(Input, Output) :-
+    set_prolog_flag(answer_write_options, [quoted(true),
+                                           portray(true),
+                                           max_depth(10),
+                                           spacing(next_argument),
+                                           max_depth(0)]),
+    set_prolog_flag(print_write_options, [portray(true),
+                                          quoted(true),
+                                          numbervars(true),
+                                          max_depth(0)]),
+    consult('compiled_brachylog.pl'),
+    (   \+ var(Input),
+        Input \= 'ignore',
+        parse_argument(Input, ParsedInput)
+    ;   true
+    ),
+    (   \+ var(Output),
+        Output \= 'ignore',
+        parse_argument(Output, ParsedOutput)
+    ;   true
+    ),
+    !,
+    call(brachylog_main, _, _, ParsedInput, ParsedOutput),
+    (   var(Input) ->
+        brachylog_prolog_variable(ParsedInput, Input)
+    ;   true
+    ),
+    (   var(Output) ->
+        brachylog_prolog_variable(ParsedOutput, Output)
+    ;   true
+    ).
+    
+    
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   RUN_FROM_FILES_NO_FILE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+run_from_files_no_file(FilePath, InputPath, OutputPath) :-
+    read_file(FilePath, Atom),
+    !,
+    (   read_file(InputPath, Input),
+        Input \= ''
+    ;   Input = 'ignore'
+    ),
+    !,
+    (   read_file(OutputPath, Output),
+        Output \= ''
+    ;   Output = 'ignore'
+    ),
+    !,
+    parse_no_file(Atom, Predicates),
+    !,
+    (   contains_write(Atom) ->
+        ContainsWrite = 'yes'
+    ;   ContainsWrite = 'no'
+    ),
+    !,
+    set_prolog_flag(answer_write_options, [quoted(true),
+                                           portray(true),
+                                           max_depth(10),
+                                           spacing(next_argument),
+                                           max_depth(0)]),
+    set_prolog_flag(print_write_options, [portray(true),
+                                          quoted(true),
+                                          numbervars(true),
+                                          max_depth(0)]),
+    maplist(atomic_list_concat, Predicates, ConcatenatedPredicates),
+    maplist(read_term_from_atom_, ConcatenatedPredicates, AssertablePredicates),
+    maplist(assertz, AssertablePredicates),
+    (   Input \= 'ignore',
+        parse_argument(Input, ParsedInput),
+        \+ var(ParsedInput),
+        ReportInput = 'no'
+    ;   Input == 'ignore',
+        ReportInput = 'no'
+    ;   ReportInput = 'yes',
+        true
+    ),
+    (   Output \= 'ignore',
+        parse_argument(Output, ParsedOutput),
+        \+ var(ParsedOutput),
+        ReportOutput = 'no'
+    ;   Output == 'ignore',
+        ReportOutput = 'no'
+    ;   ReportOutput = 'yes',
+        true
+    ),
+    !,
+    (   call(brachylog_main, _, _, ParsedInput, ParsedOutput) ->
+        (   ReportInput = 'yes' ->
+            brachylog_prolog_variable(ParsedInput, InputProlog)
+        ;   true
+        ),
+        (   ReportOutput = 'yes' ->
+            brachylog_prolog_variable(ParsedOutput, OutputProlog)
+        ;   true
+        ),
+        (   ReportInput = 'yes',
+            Bindings = [Input=InputProlog]
+        ;   Bindings = []
+        ),
+        (   ReportOutput = 'yes',
+            BindingsFinal = [Output=OutputProlog|Bindings]
+        ;   BindingsFinal = Bindings,
+            true
+        ),
+        (   (ReportInput = 'yes' ; ReportOutput = 'yes'),
+            write('\n')
+        ;   true  
+        ),
+        reverse(BindingsFinal, RBindings),
+        report_bindings(RBindings),
+        (   ReportInput = 'no',
+            ReportOutput = 'no',
+            ContainsWrite = 'no',
+            write('true.')
+        ;   true
+        )
+    ;   (   ContainsWrite = 'no',
+            write('false.')
+        ;   true
+        )
+    ).
+
+read_term_from_atom_(A, B) :-
+    read_term_from_atom(A, B, []).
+
+% Credits to M. Triska
+% See: http://stackoverflow.com/a/38284692/2554145
+report_bindings(NameVars) :-
+    phrase(bindings(NameVars), Bs),
+    format("~s", [Bs]).
+
+bindings([])            --> [].
+bindings([E])           --> name_var(E).
+bindings([E1,E2|Rest]) --> name_var(E1), ",\n", bindings([E2|Rest]).
+
+name_var(Name=Var) -->
+    format_("~w = ~q", [Name,Var]).
+
+format_(Format, Ls) -->
+    call(format_codes(Format, Ls)).
+
+format_codes(Format, Ls, Cs0, Cs) :-
+    format(codes(Cs0, Cs), Format, Ls).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   READ_FILE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+read_file(FilePath, Code) :-
+    (   exists_file(FilePath),
+        open(FilePath, read, File),
+        read_file_(File, Chars),
+        close(File),
+        atomic_list_concat(Chars, Code)
+    ;   throw('The file does not exist.')
+    ),
+    !.
+
+read_file_(File, []) :-
+    at_end_of_stream(File).
+read_file_(File, [H|T]) :-
+    \+ at_end_of_stream(File),
+    get_char(File, H),
+    read_file_(File, T).
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/brachylog/brachylog/Brachylog-master/src/constraint_variables.pl	Tue Jul 16 21:39:11 2019 +0000
@@ -0,0 +1,147 @@
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+____            ____
+\   \          /   /
+ \   \  ____  /   /
+  \   \/    \/   /
+   \     /\     /     BRACHYLOG       
+    \   /  \   /      A terse declarative logic programming language
+    /   \  /   \    
+   /     \/     \     Written by Julien Cumin - 2017
+  /   /\____/\   \    https://github.com/JCumin/Brachylog
+ /   /  ___   \   \
+/___/  /__/    \___\
+     
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+
+:- module(constraint_variables, [constraintA/1,
+                                 constraintB/1,
+                                 constraintC/1,
+                                 constraintD/1,
+                                 constraintE/1,
+                                 constraintF/1,
+                                 constraintG/1,
+                                 constraintH/1,
+                                 constraintI/1,
+                                 constraintJ/1, % Unused
+                                 constraintK/1, % Unused
+                                 constraintL/1, % Unused
+                                 constraintM/1,
+                                 constraintN/1,
+                                 constraintO/1,
+                                 constraintP/1,
+                                 constraintQ/1, % Unused
+                                 constraintR/1,
+                                 constraintS/1,
+                                 constraintT/1,
+                                 constraintU/1, % Unused
+                                 constraintV/1, % Unused
+                                 constraintW/1,
+                                 constraintX/1,
+                                 constraintY/1,
+                                 constraintZ/1
+                                ]).
+                       
+:- use_module(library(clpfd)).
+:- use_module(utils).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   CONSTRAINT[A-Z]/1
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+constraintA(_) :-
+    true.
+
+
+constraintB(_) :-
+    true.
+
+
+constraintC([_,_]).
+
+
+constraintD('integer':X) :-
+    X in 0..9.
+
+
+constraintE([]).
+
+
+constraintF(_) :-
+    true.
+
+
+constraintG(_) :-
+    true.
+
+
+constraintH(_) :-
+    true.
+
+
+constraintI('integer':X) :-
+    X in inf..sup.
+
+
+constraintJ(_) :- % Unused
+    true.
+
+
+constraintK(_) :- % Unused
+    true.
+
+
+constraintL(_) :- % Unused
+    true.
+
+
+constraintM([_,_|_]).
+
+
+constraintN(_) :-
+    true.
+
+
+constraintO([_]).
+
+
+constraintP(_) :-
+    true.
+
+
+constraintQ(_) :- % Unused
+    true.
+
+
+constraintR(_) :-
+    true.
+
+
+constraintS('string':_).
+
+
+constraintT([_,_,_]).
+
+
+constraintU(_) :- % Unused
+    true.
+
+
+constraintV(_) :- % Unused
+    true.
+
+
+constraintW(_) :-
+    true.
+
+
+constraintX(_) :-
+    true.
+
+
+constraintY(_) :-
+    true.
+
+
+constraintZ(_) :-
+    true.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/brachylog/brachylog/Brachylog-master/src/metapredicates.pl	Tue Jul 16 21:39:11 2019 +0000
@@ -0,0 +1,690 @@
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+____            ____
+\   \          /   /
+ \   \  ____  /   /
+  \   \/    \/   /
+   \     /\     /     BRACHYLOG
+    \   /  \   /      A terse declarative logic programming language
+    /   \  /   \
+   /     \/     \     Written by Julien Cumin - 2017
+  /   /\____/\   \    https://github.com/JCumin/Brachylog
+ /   /  ___   \   \
+/___/  /__/    \___\
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+
+:- module(metapredicates, [brachylog_meta_accumulate/6,
+                           brachylog_meta_bagof/6,
+                           brachylog_meta_count/6,
+                           brachylog_meta_declare/6,
+                           brachylog_meta_existence/6,
+                           brachylog_meta_find/6,
+                           brachylog_meta_groupby/6,
+                           brachylog_meta_head/6,
+                           brachylog_meta_iterate/6,
+                           brachylog_meta_leftfold/6,
+                           brachylog_meta_map/6,
+                           brachylog_meta_nonexistence/6,
+                           brachylog_meta_orderby/6,
+                           brachylog_meta_select/6,
+                           brachylog_meta_tail/6,
+                           brachylog_meta_unique/6,
+                           brachylog_meta_verify/6,
+                           brachylog_meta_zip/6
+                          ]).
+
+:- use_module(library(clpfd)).
+:- use_module(predicates).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_ACCUMULATE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_accumulate(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_accumulate(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_accumulate(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_accumulate(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_accumulate(GlobalVariables, 'default', P, Sub, Input, Output) :-
+    brachylog_meta_accumulate(GlobalVariables, 'integer':1, P, Sub, Input, Output).
+brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, 'string':Input, Output) :-
+    brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, ['string':Input], Output).
+brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, 'integer':Input, Output) :-
+    brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, ['integer':Input], Output).
+brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, 'float':Input, Output) :-
+    brachylog_meta_accumulate(GlobalVariables, Sup, P, Sub, ['float':Input], Output).
+brachylog_meta_accumulate(_, 'integer':0, _P, _Sub, Input, Input).
+brachylog_meta_accumulate(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
+    I #> 0,
+    is_brachylog_list(Input),
+    (   GlobalVariables = 'ignore',
+        call(P, Sub, Input, E)
+    ;   dif(GlobalVariables, 'ignore'),
+        call(P, GlobalVariables, Sub, Input, E)
+    ),
+    J #= I - 1,
+    append(Input, [E], F),
+    brachylog_meta_accumulate(GlobalVariables, 'integer':J, P, Sub, F, Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_BAGOF
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_bagof(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_bagof(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_bagof(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_bagof(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_bagof(_, 'integer':0, _, _, _, []).
+brachylog_meta_bagof(GlobalVariables, 'default', P, Sub, Input, Output) :-
+    bagof(X,
+        (   GlobalVariables = 'ignore',
+            call(P, Sub, Input, X)
+        ;   dif(GlobalVariables, 'ignore'),
+            call(P, GlobalVariables, Sub, Input, X)
+        ),
+        Output).
+brachylog_meta_bagof(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
+    I #> 0,
+    bagof(X, call_firstn(
+        (   GlobalVariables = 'ignore',
+            call(P, Sub, Input, X)
+        ;   dif(GlobalVariables, 'ignore'),
+            call(P, GlobalVariables, Sub, Input, X)
+        ), I),
+        Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_COUNT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_count(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_count(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_count(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_count(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_count(GlobalVariables, 'default', P, Sub, Input, Output) :-
+    brachylog_meta_count(GlobalVariables, 'integer':0, P, Sub, Input, Output).
+brachylog_meta_count(GlobalVariables, 'integer':0, P, Sub, Input, Output) :-
+    brachylog_meta_find(GlobalVariables, 'default', P, Sub, Input, E),
+    brachylog_length('default', E, Output).
+brachylog_meta_count(GlobalVariables, 'integer':1, P, Sub, Input, Output) :-
+    brachylog_meta_unique(GlobalVariables, 'default', P, Sub, Input, E),
+    brachylog_length('default', E, Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_DECLARE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_declare(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_declare(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_declare(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_declare(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_declare(GlobalVariables, 'default', P, Sub, [H,T], T) :-
+    (   GlobalVariables = 'ignore',
+        call(P, Sub, H, T)
+    ;   dif(GlobalVariables, 'ignore'),
+        call(P, GlobalVariables, Sub, H, T)
+    ).
+brachylog_meta_declare(GlobalVariables, 'integer':0, P, Sub, [H,T], [H,T]) :-
+    (   GlobalVariables = 'ignore',
+        call(P, Sub, H, T)
+    ;   dif(GlobalVariables, 'ignore'),
+        call(P, GlobalVariables, Sub, H, T)
+    ).
+brachylog_meta_declare(GlobalVariables, 'integer':1, P, Sub, [H,T], H) :-
+    (   GlobalVariables = 'ignore',
+        call(P, Sub, T, H)
+    ;   dif(GlobalVariables, 'ignore'),
+        call(P, GlobalVariables, Sub, T, H)
+    ).
+brachylog_meta_declare(GlobalVariables, 'integer':2, P, Sub, [H,T], [H,T]) :-
+    (   GlobalVariables = 'ignore',
+        call(P, Sub, T, H)
+    ;   dif(GlobalVariables, 'ignore'),
+        call(P, GlobalVariables, Sub, T, H)
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_EXISTENCE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_existence(GlobalVariables, 'first', P, Sub, [I|Input], Arg) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_existence(GlobalVariables, P, Sub, Arg, I).
+brachylog_meta_existence(GlobalVariables, 'last', P, Sub, Input, Arg) :-
+    reverse(Input, [I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_existence(GlobalVariables, P, Sub, Arg, I).
+brachylog_meta_existence(GlobalVariables, 'integer':I, P, Sub, Input, Input) :-
+    dif(I, 'default'),
+    brachylog_meta_existence(GlobalVariables, P, Sub, Input, 'integer':I).
+brachylog_meta_existence(GlobalVariables, 'default', P, Sub, Input, Output) :-
+    brachylog_meta_existence(GlobalVariables, P, Sub, Input, Output).
+
+brachylog_meta_existence(GlobalVariables, P, Sub, Input, Output) :-
+    brachylog_in('default', Input, E),
+    (   GlobalVariables = 'ignore',
+        call(P, Sub, E, Output)
+    ;   dif(GlobalVariables, 'ignore'),
+        call(P, GlobalVariables, Sub, E, Output)
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_FIND
+
+   Credits to @false for call_firstf/2 and call_nth/2
+   http://stackoverflow.com/a/20866206/2554145
+   http://stackoverflow.com/a/11400256/2554145
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_find(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_find(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_find(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_find(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_find(_, 'integer':0, _, _, _, []).
+brachylog_meta_find(GlobalVariables, 'default', P, Sub, Input, Output) :-
+    findall(X,
+        (   GlobalVariables = 'ignore',
+            call(P, Sub, Input, X)
+        ;   dif(GlobalVariables, 'ignore'),
+            call(P, GlobalVariables, Sub, Input, X)
+        ),
+        Output).
+brachylog_meta_find(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
+    I #> 0,
+    findall(X, call_firstn(
+        (   GlobalVariables = 'ignore',
+            call(P, Sub, Input, X)
+        ;   dif(GlobalVariables, 'ignore'),
+            call(P, GlobalVariables, Sub, Input, X)
+        ), I),
+        Output).
+
+call_firstn(Goal_0, N) :-
+    N + N mod 1 >= 0,         % ensures that N >=0 and N is an integer
+    call_nth(Goal_0, Nth),
+    ( Nth == N -> ! ; true ).
+
+call_nth(Goal_0, C) :-
+    State = count(0, _),
+    Goal_0,
+    arg(1, State, C1),
+    C2 is C1+1,
+    nb_setarg(1, State, C2),
+    C = C2.
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_GROUPBY
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_groupby(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_groupby(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_groupby(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_groupby(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_groupby(GlobalVariables, 'default', P, Sub, Input, Output) :-
+    (   is_brachylog_list(Input) -> FixedInput = Input
+    ;   brachylog_elements('default', Input, FixedInput)
+    ),
+    brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L),
+    brachylog_zip('default', [L,Input], L2),
+    brachylog_meta_groupby_group(L2, L3),
+    maplist(brachylog_meta_groupby_tail, L3, Output).
+
+brachylog_meta_groupby_group(L, Gs) :-
+    brachylog_meta_groupby_group(L, [], Gs).
+
+brachylog_meta_groupby_group([], Gs, Gs).
+brachylog_meta_groupby_group([[G,H]|T], TempGs, Gs) :-
+    (   member(G:L, TempGs) ->
+        reverse(L, RL),
+        reverse([H|RL], L2),
+        select(G:L, TempGs, G:L2, TempGs2)
+    ;   append(TempGs, [G:[H]], TempGs2)
+    ),
+    brachylog_meta_groupby_group(T, TempGs2, Gs).
+
+brachylog_meta_groupby_tail(_:T, T).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_HEAD
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_head(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_head(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_head(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_head(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_head(GlobalVariables, 'default', P, Sub, Input, Output) :-
+    brachylog_meta_head(GlobalVariables, 'integer':1, P, Sub, Input, Output).
+brachylog_meta_head(_, 'integer':0, _, _, Input, Input).
+brachylog_meta_head(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
+    I #> 0,
+    brachylog_head('integer':I, Input, Heads),
+    brachylog_behead('integer':I, Input, Tails),
+    brachylog_meta_map(GlobalVariables, 'default', P, Sub, Heads, NewHeads),
+    brachylog_concatenate('default', [NewHeads,Tails], Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_ITERATE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_iterate(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_iterate(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_iterate(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_iterate(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_iterate(_, 'integer':0, _, _, Input, Input).
+brachylog_meta_iterate(GlobalVariables, 'default', P, Sub, Input, Output) :-
+    I #>= 1,
+    brachylog_meta_iterate(GlobalVariables, 'integer':I, P, Sub, Input, Output).
+brachylog_meta_iterate(GlobalVariables, 'integer':1, P, Sub, Input, Output) :-
+    (   GlobalVariables = 'ignore',
+        call(P, Sub, Input, Output)
+    ;   dif(GlobalVariables, 'ignore'),
+        call(P, GlobalVariables, Sub, Input, Output)
+    ).
+brachylog_meta_iterate(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
+    I #> 1,
+    (   GlobalVariables = 'ignore',
+        call(P, Sub, Input, TOutput)
+    ;   dif(GlobalVariables, 'ignore'),
+        call(P, GlobalVariables, Sub, Input, TOutput)
+    ),
+    J #= I - 1,
+    brachylog_meta_iterate(GlobalVariables, 'integer':J, P, Sub, TOutput, Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_LEFTFOLD
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_leftfold(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_leftfold(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_leftfold(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_leftfold(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, 'string':S, Output) :-
+    brachylog_elements('default', 'string':S, E),
+    brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, E, O),
+    (   brachylog_concatenate('default', O, X),
+        X = 'string':_ ->
+        Output = X
+    ;   Output = O
+    ).
+brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, 'integer':Input, Output) :-
+    brachylog_elements('default', 'integer':Input, E),
+    brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, E, O),
+    (   brachylog_concatenate('default', O, X),
+        X = 'integer':_ ->
+        Output = X
+    ;   Output = O
+    ).
+brachylog_meta_leftfold(_, 'default', _P, _Sub, [], []).
+brachylog_meta_leftfold(_, 'default', _P, _Sub, [X], [X]).
+brachylog_meta_leftfold(GlobalVariables, 'default', P, Sub, [H,I|T], Output) :-
+    brachylog_meta_leftfold_(GlobalVariables, P, Sub, [I|T], H, Output).
+
+brachylog_meta_leftfold_(_, _P, _Sub, [], Output, Output).
+brachylog_meta_leftfold_(GlobalVariables, P, Sub, [H|T], A, Output) :-
+    (   GlobalVariables = 'ignore',
+        call(P, Sub, [A,H], E)
+    ;   dif(GlobalVariables, 'ignore'),
+        call(P, GlobalVariables, Sub, [A,H], E)
+    ),
+    brachylog_meta_leftfold_(GlobalVariables, P, Sub, T, E, Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_MAP
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_map(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_map(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_map(GlobalVariables, 'integer':0, P, Sub, Input, Output) :-
+    (   GlobalVariables = 'ignore',
+        call(P, Sub, Input, Output)
+    ;   dif(GlobalVariables, 'ignore'),
+        call(P, GlobalVariables, Sub, Input, Output)
+    ).
+brachylog_meta_map(GlobalVariables, 'default', P, Sub, Input, Output) :-
+    brachylog_meta_map(GlobalVariables, 'integer':1, P, Sub, Input, Output).
+brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, 'string':S, Output) :-
+    brachylog_elements('default', 'string':S, E),
+    brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, E, O),
+    (   brachylog_concatenate('default', O, X),
+        X = 'string':_ ->
+        Output = X
+    ;   Output = O
+    ).
+brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, 'integer':Input, Output) :-
+    brachylog_elements('default', 'integer':Input, E),
+    brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, E, O),
+    (   brachylog_concatenate('default', O, X),
+        X = 'integer':_ ->
+        Output = X
+    ;   Output = O
+    ).
+brachylog_meta_map(GlobalVariables, 'integer':1, P, Sub, Input, Output) :-
+    (   GlobalVariables = 'ignore',
+        Pred =.. [P, Sub]
+    ;   dif(GlobalVariables, 'ignore'),
+        Pred =.. [P, GlobalVariables, Sub]
+    ),
+    is_brachylog_list(Input),
+    maplist(Pred, Input, Output).
+brachylog_meta_map(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
+    I #> 1,
+    J #= I - 1,
+    is_brachylog_list(Input),
+    maplist(brachylog_meta_map(GlobalVariables, 'integer':J, P, Sub), Input, Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_NONEXISTENCE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_nonexistence(GlobalVariables, 'first', P, Sub, [I|Input], Arg) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_nonexistence(GlobalVariables, P, Sub, Arg, I).
+brachylog_meta_nonexistence(GlobalVariables, 'last', P, Sub, Input, Arg) :-
+    reverse(Input, [I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_nonexistence(GlobalVariables, P, Sub, Arg, I).
+brachylog_meta_nonexistence(GlobalVariables, 'integer':I, P, Sub, Input, Input) :-
+    dif(I, 'default'),
+    brachylog_meta_nonexistence(GlobalVariables, P, Sub, Input, 'integer':I).
+brachylog_meta_nonexistence(GlobalVariables, 'default', P, Sub, Input, Output) :-
+    brachylog_meta_nonexistence(GlobalVariables, P, Sub, Input, Output).
+
+brachylog_meta_nonexistence(GlobalVariables, P, Sub, Input, Output) :-
+    brachylog_meta_map(GlobalVariables, 'default', P, Sub, Input, T),
+    brachylog_zip('default', [T,[Output]], Z),
+    brachylog_meta_map(GlobalVariables, 'default', brachylog_different, 'default', Z, _).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_ORDERBY
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_orderby(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_orderby(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_orderby(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_orderby(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_orderby(GlobalVariables, 'default', P, Sub, Input, Output) :-
+    brachylog_meta_orderby(GlobalVariables, 'integer':0, P, Sub, Input, Output).
+brachylog_meta_orderby(GlobalVariables, 'integer':0, P, Sub, Input, Output) :-
+    (   is_brachylog_list(Input) -> FixedInput = Input
+    ;   brachylog_elements('default', Input, FixedInput)
+    ),
+    brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L),
+    brachylog_zip('default', [L,Input], L2),
+    brachylog_order(integer:0, L2, SL2),
+    (   SL2 = [] ->
+        Output = []
+    ;   brachylog_zip('default', SL2, [_,Output])
+    ).
+brachylog_meta_orderby(GlobalVariables, 'integer':1, P, Sub, Input, Output) :-
+    (   is_brachylog_list(Input) -> FixedInput = Input
+    ;   brachylog_elements('default', Input, FixedInput)
+    ),
+    brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L),
+    brachylog_zip('default', [L,Input], L2),
+    brachylog_order(integer:1, L2, SL2),
+    (   SL2 = [] ->
+        Output = []
+    ;   brachylog_zip('default', SL2, [_,Output])
+    ).
+brachylog_meta_orderby(GlobalVariables, 'integer':2, P, Sub, Input, Output) :-
+    (   is_brachylog_list(Input) -> FixedInput = Input
+    ;   brachylog_elements('default', Input, FixedInput)
+    ),
+    brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L),
+    brachylog_order(integer:0, L, Output).
+brachylog_meta_orderby(GlobalVariables, 'integer':3, P, Sub, Input, Output) :-
+    (   is_brachylog_list(Input) -> FixedInput = Input
+    ;   brachylog_elements('default', Input, FixedInput)
+    ),
+    brachylog_meta_map(GlobalVariables, 'default', P, Sub, FixedInput, L),
+    brachylog_order(integer:1, L, Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_SELECT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_select(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_select(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_select(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_select(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_select(GlobalVariables, 'default', P, Sub, 'string':S, Output) :-
+    brachylog_elements('default', 'string':S, E),
+    brachylog_meta_select(GlobalVariables, 'default', P, Sub, E, O),
+    (   brachylog_concatenate('default', O, X),
+        X = 'string':_ ->
+        Output = X
+    ;   Output = O
+    ).
+brachylog_meta_select(GlobalVariables, 'default', P, Sub, 'integer':S, Output) :-
+    brachylog_elements('default', 'integer':S, E),
+    brachylog_meta_select(GlobalVariables, 'default', P, Sub, E, O),
+    (   brachylog_concatenate('default', O, X),
+        X = 'integer':_ ->
+        Output = X
+    ;   Output = O
+    ).
+brachylog_meta_select(_, 'default', _, _, [], []).
+brachylog_meta_select(GlobalVariables, 'default', P, Sub, [H|T], Output) :-
+    (   (   GlobalVariables = 'ignore',
+            call(P, Sub, H, H2)
+        ;   dif(GlobalVariables, 'ignore'),
+            call(P, GlobalVariables, Sub, H, H2)
+        )
+    *-> Output = [H2|T2]
+    ;   Output = T2
+    ),
+    brachylog_meta_select(GlobalVariables, 'default', P, Sub, T, T2).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_TAIL
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_tail(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_tail(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_tail(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_tail(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_tail(GlobalVariables, 'default', P, Sub, Input, Output) :-
+    brachylog_meta_tail(GlobalVariables, 'integer':1, P, Sub, Input, Output).
+brachylog_meta_tail(_, 'integer':0, _, _, Input, Input).
+brachylog_meta_tail(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
+    I #> 0,
+    brachylog_tail('integer':I, Input, Tails),
+    brachylog_knife('integer':I, Input, Heads),
+    brachylog_meta_map(GlobalVariables, 'default', P, Sub, Tails, NewTails),
+    brachylog_concatenate('default', [Heads,NewTails], Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_UNIQUE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_unique(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_unique(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_unique(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_unique(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_unique(GlobalVariables, 'default', P, Sub, Input, Output) :-
+    brachylog_meta_unique_(GlobalVariables, 1, -1, P, Sub, Input, [], Output).
+brachylog_meta_unique(_, 'integer':0, _, _, _, []).
+brachylog_meta_unique(GlobalVariables, 'integer':I, P, Sub, Input, Output) :-
+    brachylog_meta_unique_(GlobalVariables, 1, I, P, Sub, Input, [], Output).
+
+brachylog_meta_unique_(_, _, 0, _, _, _, ROutput, Output) :-
+    reverse(ROutput, Output).
+brachylog_meta_unique_(GlobalVariables, Nth, J, P, Sub, Input, A, Output) :-
+    J #\= 0,
+    (   call_nth(   (   GlobalVariables = 'ignore',
+                        call(P, Sub, Input, X)
+                    ;   dif(GlobalVariables, 'ignore'),
+                        call(P, GlobalVariables, Sub, Input, X)
+                    ), Nth) ->
+        (   \+ member(X, A) ->
+            M #= Nth + 1,
+            K #= J - 1,
+            brachylog_meta_unique_(GlobalVariables, M, K, P, Sub, Input, [X|A], Output)
+        ;   M #= Nth + 1,
+            brachylog_meta_unique_(GlobalVariables, M, J, P, Sub, Input, A, Output)
+        )
+    ;   reverse(A, Output)
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_VERIFY
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_verify(GlobalVariables, 'first', P, Sub, [I|Input], Arg) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_verify(GlobalVariables, P, Sub, Arg, I).
+brachylog_meta_verify(GlobalVariables, 'last', P, Sub, Input, Arg) :-
+    reverse(Input, [I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_verify(GlobalVariables, P, Sub, Arg, I).
+brachylog_meta_verify(GlobalVariables, 'integer':I, P, Sub, Input, Input) :-
+    dif(I, 'default'),
+    brachylog_meta_verify(GlobalVariables, P, Sub, Input, 'integer':I).
+brachylog_meta_verify(GlobalVariables, 'default', P, Sub, Input, Output) :-
+    brachylog_meta_verify(GlobalVariables, P, Sub, Input, Output).
+
+brachylog_meta_verify(GlobalVariables, P, Sub, Input, Output) :-
+    brachylog_length('default', Input, L),
+    brachylog_length('default', T, L),
+    brachylog_equal('default', T, _),
+    brachylog_head('default', T, Output),
+    brachylog_meta_map(GlobalVariables, 'default', P, Sub, Input, T).
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_META_ZIP
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_meta_zip(GlobalVariables, 'first', P, Sub, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_meta_zip(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_zip(GlobalVariables, 'last', P, Sub, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_meta_zip(GlobalVariables, 'integer':I, P, Sub, Arg, Output).
+brachylog_meta_zip(GlobalVariables, 'default', P, Sub, Arg, Output) :-
+    brachylog_meta_map(GlobalVariables, 'default', P, Sub, Arg, O),
+    brachylog_zip('default', [Arg,O], Output).
+brachylog_meta_zip(GlobalVariables, 'integer':0, P, Sub, Arg, Output) :-
+    brachylog_meta_find(GlobalVariables, 'default', P, Sub, Arg, O),
+    brachylog_zip('default', [Arg,O], Output).
+brachylog_meta_zip(GlobalVariables, 'integer':1, P, Sub, Arg, Output) :-
+    brachylog_meta_map(GlobalVariables, 'default', P, Sub, Arg, O),
+    brachylog_zip('default', [O,Arg], Output).
+brachylog_meta_zip(GlobalVariables, 'integer':2, P, Sub, Arg, Output) :-
+    brachylog_meta_find(GlobalVariables, 'default', P, Sub, Arg, O),
+    brachylog_zip('default', [O,Arg], Output).
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/brachylog/brachylog/Brachylog-master/src/predicates.pl	Tue Jul 16 21:39:11 2019 +0000
@@ -0,0 +1,3126 @@
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+____            ____
+\   \          /   /
+ \   \  ____  /   /
+  \   \/    \/   /
+   \     /\     /     BRACHYLOG
+    \   /  \   /      A terse declarative logic programming language
+    /   \  /   \
+   /     \/     \     Written by Julien Cumin - 2017
+  /   /\____/\   \    https://github.com/JCumin/Brachylog
+ /   /  ___   \   \
+/___/  /__/    \___\
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+
+:- module(predicates, [%Symbols                                         % Reversed version
+                       brachylog_lessequal/3,                           brachylog_lessequal_reversed/3,
+                       brachylog_greaterequal/3,                        brachylog_greaterequal_reversed/3,
+                       brachylog_contains/3,                            brachylog_contains_reversed/3,
+                       brachylog_in/3,                                  brachylog_in_reversed/3,
+                       brachylog_superset/3,                            brachylog_superset_reversed/3,
+                       brachylog_subset/3,                              brachylog_subset_reversed/3,
+                       brachylog_reverse/3,                             brachylog_reverse_reversed/3,
+                       brachylog_call_predicate/3,                      brachylog_call_predicate_reversed/3,
+                       brachylog_circular_permute_counterclockwise/3,   brachylog_circular_permute_counterclockwise_reversed/3,
+                       brachylog_circular_permute_clockwise/3,          brachylog_circular_permute_clockwise_reversed/3,
+                       brachylog_root/3,                                brachylog_root_reversed/3,
+                       brachylog_ceil/3,                                brachylog_ceil_reversed/3,
+                       brachylog_floor/3,                               brachylog_floor_reversed/3,
+                       brachylog_range_ascending/3,                     brachylog_range_ascending_reversed/3,
+                       brachylog_range_descending/3,                    brachylog_range_descending_reversed/3,
+                       brachylog_natural_integer/3,                     brachylog_natural_integer_reversed/3,
+                       brachylog_integer/3,                             brachylog_integer_reversed/3,
+                       brachylog_float/3,                               brachylog_float_reversed/3,
+                       brachylog_different/3,                           brachylog_different_reversed/3,
+                       brachylog_identity/3,                            brachylog_identity_reversed/3,
+                       brachylog_integer_division/3,                    brachylog_integer_division_reversed/3,
+                       brachylog_multiply/3,                            brachylog_multiply_reversed/3,
+                       brachylog_modulo/3,                              brachylog_modulo_reversed/3,
+                       brachylog_exp/3,                                 brachylog_exp_reversed/3,
+                       brachylog_plus/3,                                brachylog_plus_reversed/3,
+                       brachylog_minus/3,                               brachylog_minus_reversed/3,
+                       brachylog_divide/3,                              brachylog_divide_reversed/3,
+                       brachylog_less/3,                                brachylog_less_reversed/3,
+                       brachylog_equal/3,                               brachylog_equal_reversed/3,
+                       brachylog_greater/3,                             brachylog_greater_reversed/3,
+                       brachylog_transpose/3,                           brachylog_transpose_reversed/3,
+                       brachylog_power/3,                               brachylog_power_reversed/3,
+
+                       %Lowercase letters                               % Reversed version
+                       brachylog_adfix/3,                               brachylog_adfix_reversed/3,
+                       brachylog_behead/3,                              brachylog_behead_reversed/3,
+                       brachylog_concatenate/3,                         brachylog_concatenate_reversed/3,
+                       brachylog_duplicates/3,                          brachylog_duplicates_reversed/3,
+                       brachylog_factors/3,                             brachylog_factors_reversed/3,
+                       brachylog_group/3,                               brachylog_group_reversed/3,
+                       brachylog_head/3,                                brachylog_head_reversed/3,
+                       brachylog_index/3,                               brachylog_index_reversed/3,
+                       brachylog_juxtapose/3,                           brachylog_juxtapose_reversed/3,
+                       brachylog_knife/3,                               brachylog_knife_reversed/3,
+                       brachylog_length/3,                              brachylog_length_reversed/3,
+                       brachylog_order/3,                               brachylog_order_reversed/3,
+                       brachylog_permute/3,                             brachylog_permute_reversed/3,
+                       brachylog_substring/3,                           brachylog_substring_reversed/3,
+                       brachylog_tail/3,                                brachylog_tail_reversed/3,
+                       brachylog_write/3,                               brachylog_write_reversed/3,
+                       brachylog_xterminate/3,                          brachylog_xterminate_reversed/3,
+                       brachylog_zip/3,                                 brachylog_zip_reversed/3,
+
+                       %Lowercase letters with dot below                % Reversed version
+                       brachylog_to_codes/3,                            brachylog_to_codes_reversed/3,
+                       brachylog_blocks/3,                              brachylog_blocks_reversed/3,
+                       brachylog_dichotomize/3,                         brachylog_dichotomize_reversed/3,
+                       brachylog_elements/3,                            brachylog_elements_reversed/3,
+                       brachylog_to_number/3,                           brachylog_to_number_reversed/3,
+                       brachylog_lowercase/3,                           brachylog_lowercase_reversed/3,
+                       brachylog_split_lines/3,                         brachylog_split_lines_reversed/3,
+                       brachylog_occurences/3,                          brachylog_occurences_reversed/3,
+                       brachylog_random_element/3,                      brachylog_random_element_reversed/3,
+                       brachylog_shuffle/3,                             brachylog_shuffle_reversed/3,
+                       brachylog_uppercase/3,                           brachylog_uppercase_reversed/3,
+                       brachylog_writeln/3,                             brachylog_writeln_reversed/3,
+
+                       %Lowercase letters with dot above                % Reversed version
+                       brachylog_absolute_value/3,                      brachylog_absolute_value_reversed/3,
+                       brachylog_base/3,                                brachylog_base_reversed/3,
+                       brachylog_coerce/3,                              brachylog_coerce_reversed/3,
+                       brachylog_prime_decomposition/3,                 brachylog_prime_decomposition_reversed/3,
+                       brachylog_factorial/3,                           brachylog_factorial_reversed/3,
+                       brachylog_groups/3,                              brachylog_groups_reversed/3,
+                       brachylog_matrix/3,                              brachylog_matrix_reversed/3,
+                       brachylog_negate/3,                              brachylog_negate_reversed/3,
+                       brachylog_prime/3,                               brachylog_prime_reversed/3,
+                       brachylog_random_number/3,                       brachylog_random_number_reversed/3,
+                       brachylog_sign/3,                                brachylog_sign_reversed/3,
+                       brachylog_to_string/3,                           brachylog_to_string_reversed/3,
+                       brachylog_cartesian_product/3,                   brachylog_cartesian_product_reversed/3,
+
+                       %Label                                           % Reversed version
+                       brachylog_label/3,                               brachylog_label_reversed/3
+                      ]).
+
+:- use_module(library(clpfd)).
+:- use_module(utils).
+
+:- multifile clpfd:run_propagator/2.
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_LESSEQUAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_lessequal_reversed(S, I, O) :-
+    brachylog_lessequal(S, O, I).
+brachylog_lessequal('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_lessequal('integer':I, Arg, Output).
+brachylog_lessequal('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_lessequal('integer':I, Arg, Output).
+brachylog_lessequal('default', Input, Output) :-
+    brachylog_lessequal('integer':0, Input, Output).
+brachylog_lessequal('integer':0, 'integer':I1, 'integer':I2) :-
+    I1 #=< I2.
+brachylog_lessequal('integer':0, 'float':I1, 'integer':I2) :-
+    nonvar(I1),
+    brachylog_label('default', 'integer':I2, _),
+    I1 =< I2.
+brachylog_lessequal('integer':0, 'integer':I1, 'float':I2) :-
+    nonvar(I2),
+    brachylog_label('default', 'integer':I1, _),
+    I1 =< I2.
+brachylog_lessequal('integer':0, 'float':I1, 'float':I2) :-
+    nonvar(I1),
+    nonvar(I2),
+    I1 =< I2.
+brachylog_lessequal('integer':1, [], []).
+brachylog_lessequal('integer':1, [I], [I]).
+brachylog_lessequal('integer':1, [I,J|T], [I,J|T]) :-
+    brachylog_lessequal('integer':0, I, J),
+    brachylog_lessequal('integer':1, [J|T], [J|T]).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_GREATEREQUAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_greaterequal_reversed(S, I, O) :-
+    brachylog_greaterequal(S, O, I).
+brachylog_greaterequal('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_greaterequal('integer':I, Arg, Output).
+brachylog_greaterequal('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_greaterequal('integer':I, Arg, Output).
+brachylog_greaterequal('default', Input, Output) :-
+    brachylog_greaterequal('integer':0, Input, Output).
+brachylog_greaterequal('integer':0, 'integer':I1, 'integer':I2) :-
+    I1 #>= I2.
+brachylog_greaterequal('integer':0, 'float':I1, 'integer':I2) :-
+    nonvar(I1),
+    brachylog_label('default', 'integer':I2, _),
+    I1 >= I2.
+brachylog_greaterequal('integer':0, 'integer':I1, 'float':I2) :-
+    nonvar(I2),
+    brachylog_label('default', 'integer':I1, _),
+    I1 >= I2.
+brachylog_greaterequal('integer':0, 'float':I1, 'float':I2) :-
+    nonvar(I1),
+    nonvar(I2),
+    I1 >= I2.
+brachylog_greaterequal('integer':1, [], []).
+brachylog_greaterequal('integer':1, [I], [I]).
+brachylog_greaterequal('integer':1, [I,J|T], [I,J|T]) :-
+    brachylog_greaterequal('integer':0, I, J),
+    brachylog_greaterequal('integer':1, [J|T], [J|T]).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_CONTAINS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_contains_reversed(S, I, O) :-
+    brachylog_contains(S, O, I).
+brachylog_contains(Sub, Input, Output) :-
+    brachylog_in(Sub, Output, Input).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_IN
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_in_reversed(S, I, O) :-
+    brachylog_in(S, O, I).
+brachylog_in('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_in('integer':I, Arg, Output).
+brachylog_in('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_in('integer':I, Arg, Output).
+brachylog_in('default', 'string':L, 'string':[M]) :-
+    nth0(_, L, M).
+brachylog_in('integer':S, 'string':L, 'string':[M]) :-
+    nth0(S, L, M).
+brachylog_in('default', 'integer':0, 'integer':0).
+brachylog_in('integer':0, 'integer':0, 'integer':0).
+brachylog_in('default', 'integer':I, 'integer':J) :-
+    H #\= 0,
+    integer_value('integer':_:[H|T], I),
+    nth0(_, [H|T], M),
+    integer_value('integer':'positive':[M], J).
+brachylog_in('integer':S, 'integer':I, 'integer':J) :-
+    H #\= 0,
+    integer_value('integer':_:[H|T], I),
+    nth0(S, [H|T], M),
+    integer_value('integer':'positive':[M], J).
+brachylog_in('default', L, M) :-
+    is_brachylog_list(L),
+    nth0(_, L, M).
+brachylog_in('integer':S, L, M) :-
+    is_brachylog_list(L),
+    nth0(S, L, M).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_SUPERSET
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_superset_reversed(S, I, O) :-
+    brachylog_superset(S, O, I).
+brachylog_superset(Sub, Input, Output) :-
+    brachylog_subset(Sub, Output, Input).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_SUBSET
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_subset_reversed(S, I, O) :-
+    brachylog_subset(S, O, I).
+brachylog_subset('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_subset('integer':I, Arg, Output).
+brachylog_subset('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_subset('integer':I, Arg, Output).
+brachylog_subset('default', Input, Output) :-
+    brachylog_subset('integer':0, Input, Output).
+brachylog_subset('integer':0, 'string':S, 'string':T) :-
+    brachylog_subset_recur(S, T).
+brachylog_subset('integer':0, 'integer':0, 'integer':0).
+brachylog_subset('integer':0, 'integer':I, 'integer':J) :-
+    H #\= 0,
+    dif(M, []),
+    integer_value('integer':Sign:[H|L], I),
+    brachylog_subset_recur([H|L], M),
+    integer_value('integer':Sign:M, J).
+brachylog_subset('integer':0, 'float':F, 'float':G) :-
+    Sign is abs(F)/F,
+    AF is abs(F),
+    number_chars(AF, C),
+    brachylog_subset_recur(C, D),
+    dif(D, []),
+    \+ (D = ['.'|_] ; reverse(D, ['.'|_])),
+    number_chars(AG,D),
+    G is Sign*AG.
+brachylog_subset('integer':0, L, S) :-
+    is_brachylog_list(L),
+    brachylog_subset_recur(L, S).
+
+brachylog_subset_recur(L, S) :-
+    var(S),
+    length(L, Length),
+    between(0, Length, I),
+    J #= Length - I,
+    length(S, J),
+    brachylog_subset_recur_(L, S).
+brachylog_subset_recur(L, S) :-
+    nonvar(S),
+    length(S, Length),
+    I #>= Length,
+    length(L, I),
+    brachylog_subset_recur_(L, S).
+
+brachylog_subset_recur_([], []).
+brachylog_subset_recur_([H|T], [H|T2]) :-
+    brachylog_subset_recur_(T, T2).
+brachylog_subset_recur_([_|T], T2) :-
+    brachylog_subset_recur_(T, T2).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_REVERSE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_reverse_reversed(S, I, O) :-
+    brachylog_reverse(S, O, I).
+brachylog_reverse('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_reverse('integer':I, Arg, Output).
+brachylog_reverse('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_reverse('integer':I, Arg, Output).
+brachylog_reverse('default', Input, Output) :-
+    brachylog_reverse('integer':0, Input, Output).
+brachylog_reverse('integer':0, 'string':S, 'string':R) :-
+    reverse(S, R).
+brachylog_reverse('integer':0, 'integer':I, 'integer':R) :-
+    nonvar(I),
+    H #\= 0,
+    A #\= 0,
+    integer_value('integer':Sign:[H|T], I),
+    reverse([H|T], B),
+    append(Zeroes, [A|Rest], B),
+    maplist(=(0), Zeroes),
+    integer_value('integer':Sign:[A|Rest], R).
+brachylog_reverse('integer':0, 'integer':0, 'integer':0).
+brachylog_reverse('integer':0, 'integer':I, 'integer':R) :-
+    var(I),
+    H #\= 0,
+    A #\= 0,
+    integer_value('integer':Sign:[A|B], R),
+    reverse(L, [A|B]),
+    append(Zeroes, [H|T], L),
+    maplist(=(0), Zeroes),
+    integer_value('integer':Sign:[H|T], I).
+brachylog_reverse('integer':0, List, R) :-
+    reverse(List, R).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_CALL_PREDICATE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_call_predicate_reversed(S, I, O) :-
+    brachylog_call_predicate(S, O, I).
+brachylog_call_predicate('first'-GlobalVariables, ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_call_predicate(GlobalVariables, 'integer':I, Arg, Output).
+brachylog_call_predicate('last'-GlobalVariables, Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_call_predicate(GlobalVariables, 'integer':I, Arg, Output).
+brachylog_call_predicate(Name-GlobalVariables, Arg, Output) :-
+    brachylog_call_predicate(GlobalVariables, Name, Arg, Output).
+brachylog_call_predicate(GlobalVariables, CallingPredName, Input, Output) :-
+    atom(CallingPredName),
+    call(CallingPredName, GlobalVariables, 'integer':0, Input, Output).
+brachylog_call_predicate(GlobalVariables, 'integer':I, Input, Output) :-
+    (   I = 0,
+        PredName = 'brachylog_main'
+    ;   I #> 0,
+        atomic_list_concat(['brachylog_predicate_',I], PredName)
+    ),
+    call(PredName, GlobalVariables, 'integer':0, Input, Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_CIRCULAR_PERMUTE_COUNTERCLOCKWISE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_circular_permute_counterclockwise_reversed(S, I, O) :-
+    brachylog_circular_permute_counterclockwise(S, O, I).
+brachylog_circular_permute_counterclockwise('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_circular_permute_counterclockwise('integer':I, Arg, Output).
+brachylog_circular_permute_counterclockwise('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_circular_permute_counterclockwise('integer':I, Arg, Output).
+brachylog_circular_permute_counterclockwise('default', Input, Output) :-
+    brachylog_circular_permute_counterclockwise('integer':1, Input, Output).
+brachylog_circular_permute_counterclockwise('integer':0, Input, Input).
+brachylog_circular_permute_counterclockwise('integer':1, 'string':[], 'string':[]).
+brachylog_circular_permute_counterclockwise('integer':1, 'string':[H|T], 'string':S) :-
+    append(T, [H], S).
+brachylog_circular_permute_counterclockwise('integer':1, [], []).
+brachylog_circular_permute_counterclockwise('integer':1, [H|T], S) :-
+    append(T, [H], S).
+brachylog_circular_permute_counterclockwise('integer':1, 'integer':0, 'integer':0).
+brachylog_circular_permute_counterclockwise('integer':1, 'integer':I, 'integer':J) :-
+    dif(H, 0),
+    integer_value('integer':Sign:[H|T], I),
+    append(T, [H], S),
+    integer_value('integer':Sign:S, J).
+brachylog_circular_permute_counterclockwise('integer':I, Input, Output) :-
+    I #> 1,
+    brachylog_meta_iterate(ignore, 'integer':I, brachylog_circular_permute_counterclockwise, 'default', Input, Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_CIRCULAR_PERMUTE_CLOCKWISE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_circular_permute_clockwise_reversed(S, I, O) :-
+    brachylog_circular_permute_clockwise(S, O, I).
+brachylog_circular_permute_clockwise('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_circular_permute_clockwise('integer':I, Arg, Output).
+brachylog_circular_permute_clockwise('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_circular_permute_clockwise('integer':I, Arg, Output).
+brachylog_circular_permute_clockwise('default', Input, Output) :-
+    brachylog_circular_permute_clockwise('integer':1, Input, Output).
+brachylog_circular_permute_clockwise('integer':0, Input, Input).
+brachylog_circular_permute_clockwise('integer':1, 'string':[], 'string':[]).
+brachylog_circular_permute_clockwise('integer':1, 'string':L, 'string':S) :-
+    append(T, [H], L),
+    S = [H|T].
+brachylog_circular_permute_clockwise('integer':1, [], []).
+brachylog_circular_permute_clockwise('integer':1, [A|B], S) :-
+    append(T, [H], [A|B]),
+    S = [H|T].
+brachylog_circular_permute_clockwise('integer':1, 'integer':0, 'integer':0).
+brachylog_circular_permute_clockwise('integer':1, 'integer':I, 'integer':J) :-
+    dif(H2, 0),
+    integer_value('integer':Sign:[H2|T2], I),
+    append(T, [H], [H2|T2]),
+    S = [H|T],
+    integer_value('integer':Sign:S, J).
+brachylog_circular_permute_clockwise('integer':I, Input, Output) :-
+    I #> 1,
+    brachylog_meta_iterate(ignore, 'integer':I, brachylog_circular_permute_clockwise, 'default', Input, Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_ROOT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_root_reversed(S, I, O) :-
+    brachylog_root(S, O, I).
+brachylog_root('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_root('integer':I, Arg, Output).
+brachylog_root('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_root('integer':I, Arg, Output).
+brachylog_root('default', Input, Output) :-
+    brachylog_root('integer':2, Input, Output).
+brachylog_root('integer':I,'integer':E, Type:R) :-
+    (   E #= R^I ->
+        Type = 'integer'
+    ;   brachylog_label('default', ['integer':I, 'integer':E], _),
+        R is E^(1/I),
+        Type = 'float'
+    ).
+brachylog_root('integer':I,'float':E, 'float':R) :-
+    nonvar(E),
+    brachylog_label('default', 'integer':I, _),
+    R is E^(1/I).
+brachylog_root('float':I,'integer':E, 'float':R) :-
+    brachylog_label('default', 'integer':E, _),
+    R is E^(1/I).
+brachylog_root('float':I,'float':E, 'float':R) :-
+    nonvar(E),
+    R is E^(1/I).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_CEIL
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_ceil_reversed(S, I, O) :-
+    brachylog_ceil(S, O, I).
+brachylog_ceil('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_ceil('integer':I, Arg, Output).
+brachylog_ceil('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_ceil('integer':I, Arg, Output).
+brachylog_ceil('default', Input, Output) :-
+    brachylog_ceil('integer':0, Input, Output).
+brachylog_ceil('integer':0, [H|T], Output) :-
+    foldl(scompare(@>), [H|T], H, Output).
+brachylog_ceil('integer':1, 'integer':I, 'integer':I).
+brachylog_ceil('integer':1, 'float':I, 'integer':J) :-
+    nonvar(I),
+    J is ceil(I).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_FLOOR
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_floor_reversed(S, I, O) :-
+    brachylog_floor(S, O, I).
+brachylog_floor('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_floor('integer':I, Arg, Output).
+brachylog_floor('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_floor('integer':I, Arg, Output).
+brachylog_floor('default', Input, Output) :-
+    brachylog_floor('integer':0, Input, Output).
+brachylog_floor('integer':0, [H|T], Output) :-
+    foldl(scompare(@<), [H|T], H, Output).
+brachylog_floor('integer':1, 'integer':I, 'integer':I).
+brachylog_floor('integer':1, 'float':I, 'integer':J) :-
+    nonvar(I),
+    J is floor(I).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_RANGE_ASCENDING
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_range_ascending_reversed(S, I, O) :-
+    brachylog_range_ascending(S, O, I).
+brachylog_range_ascending('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_range_ascending('integer':I, Arg, Output).
+brachylog_range_ascending('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_range_ascending('integer':I, Arg, Output).
+brachylog_range_ascending('default', Input, Output) :-
+    brachylog_range_ascending('integer':0, Input, Output).
+brachylog_range_ascending('integer':0, 'integer':Input, Output) :-
+    (   0 #=< Input,
+        brachylog_range_ascending_(0, Input, Output)
+    ;   0 #> Input,
+        brachylog_range_ascending_(Input, 0, Output)
+    ).
+brachylog_range_ascending('integer':1, 'integer':Input, Output) :-
+    (   1 #=< Input,
+        brachylog_range_ascending_(1, Input, Output)
+    ;   1 #> Input,
+        brachylog_range_ascending_(Input, 1, Output)
+    ).
+brachylog_range_ascending('integer':2, ['integer':X,'integer':Y], Output) :-
+    (   X #=< Y,
+        brachylog_range_ascending_(X, Y, Output)
+    ;   X #> Y,
+        brachylog_range_ascending_(Y, X, Output)
+    ).
+brachylog_range_ascending('integer':3, ['integer':X,'integer':Y], Output) :-
+    (   X #=< Y,
+        Y2 #= Y - 1,
+        brachylog_range_ascending_(X, Y2, Output)
+    ;   X #> Y,
+        X2 #= X - 1,
+        brachylog_range_ascending_(Y, X2, Output)
+    ).
+brachylog_range_ascending('integer':4, ['integer':X,'integer':Y], Output) :-
+    (   X #=< Y,
+        X2 #= X + 1,
+        brachylog_range_ascending_(X2, Y, Output)
+    ;   X #> Y,
+        Y2 #= Y + 1,
+        brachylog_range_ascending_(Y2, X, Output)
+    ).
+brachylog_range_ascending('integer':5, 'integer':Input, Output) :-
+    (   0 #=< Input,
+        I2 #= Input - 1,
+        brachylog_range_ascending_(0, I2, Output)
+    ;   0 #> Input,
+        I2 #= Input + 1,
+        brachylog_range_ascending_(I2, 0, Output)
+    ).
+brachylog_range_ascending('integer':6, 'integer':Input, Output) :-
+    (   1 #=< Input,
+        I2 #= Input - 1,
+        brachylog_range_ascending_(1, I2, Output)
+    ;   1 #> Input,
+        I2 #= Input + 1,
+        brachylog_range_ascending_(I2, 1, Output)
+    ).
+
+brachylog_range_ascending_(I, S, ['integer':I|R]) :-
+    I #=< S,
+    if_(I = S,
+        R = [],
+        (   J #= I + 1,
+            predicates:brachylog_range_ascending_(J, S, R)
+        )
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_RANGE_DESCENDING
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_range_descending_reversed(S, I, O) :-
+    brachylog_range_descending(S, O, I).
+brachylog_range_descending('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_range_descending('integer':I, Arg, Output).
+brachylog_range_descending('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_range_descending('integer':I, Arg, Output).
+brachylog_range_descending('default', Input, Output) :-
+    brachylog_range_descending('integer':0, Input, Output).
+brachylog_range_descending('integer':Sub, Input, Output) :-
+    brachylog_range_ascending('integer':Sub, Input, ROutput),
+    brachylog_reverse('default', ROutput, Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_NATURAL_INTEGER
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_natural_integer_reversed(S, I, O) :-
+    brachylog_natural_integer(S, O, I).
+brachylog_natural_integer('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_natural_integer('integer':I, Arg, Output).
+brachylog_natural_integer('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_natural_integer('integer':I, Arg, Output).
+brachylog_natural_integer('default', Input, Output) :-
+    brachylog_natural_integer('integer':0, Input, Output).
+brachylog_natural_integer('integer':I, 'integer':Input, 'integer':Input) :-
+    I #>= 0,
+    Input #>= I.
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_INTEGER
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_integer_reversed(S, I, O) :-
+    brachylog_integer(S, O, I).
+brachylog_integer('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_integer('integer':I, Arg, Output).
+brachylog_integer('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_integer('integer':I, Arg, Output).
+brachylog_integer('default', 'integer':Input, 'integer':Input) :-
+    Input in inf..sup.
+brachylog_integer('integer':I, 'integer':Input, 'integer':Input) :-
+    I #>= 0,
+    Input #=< -I.
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_FLOAT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_float_reversed(S, I, O) :-
+    brachylog_float(S, O, I).
+brachylog_float('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_float('integer':I, Arg, Output).
+brachylog_float('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_float('integer':I, Arg, Output).
+brachylog_float('default', 'float':Input, 'float':Input).
+brachylog_float('integer':_, 'integer':Input, 'float':Input).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_DIFFERENT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_different_reversed(S, I, O) :-
+    brachylog_different(S, O, I).
+brachylog_different('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_different('integer':I, Arg, Output).
+brachylog_different('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_different('integer':I, Arg, Output).
+brachylog_different('default', 'string':S, 'string':S) :-
+    brachylog_different_(S).
+brachylog_different('default', [], []).
+brachylog_different('default', [H|T], [H|T]) :-
+    (   maplist(prepend_integer, L, [H|T]),
+        all_different(L)                        % More efficient on integers
+    ;   maplist(prepend_string, _, [H|T]),
+        brachylog_different_([H|T])
+    ;   maplist(is_brachylog_list, [H|T]),
+        brachylog_different_([H|T])
+    ).
+brachylog_different('default', 'integer':I, 'integer':I) :-
+    (   integer_value('integer':_:[_], I) ->
+        true
+    ;   H #\= 0,
+        integer_value('integer':_:[H,H2|T], I),
+        all_different([H,H2|T])
+    ).
+
+brachylog_different_([]).
+brachylog_different_([H|T]) :-
+    maplist(dif(H), T),
+    brachylog_different_(T).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_IDENTITY
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_identity_reversed(S, I, O) :-
+    brachylog_identity(S, O, I).
+brachylog_identity(_, Input, Input).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_INTEGER_DIVISION
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_integer_division_reversed(S, I, O) :-
+    brachylog_integer_division(S, O, I).
+brachylog_integer_division('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_integer_division('integer':I, Arg, Output).
+brachylog_integer_division('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_integer_division('integer':I, Arg, Output).
+brachylog_integer_division('default', Input, Output) :-
+    brachylog_integer_division('integer':0, Input, Output).
+brachylog_integer_division('integer':0, [], 'integer':1).
+brachylog_integer_division('integer':0, ['integer':I1,'integer':I2], 'integer':Division) :-
+    brachylog_label('default', ['integer':I1,'integer':I2], _),
+    Division #= I1 // I2.
+brachylog_integer_division('integer':0, ['float':I1,'integer':I2], 'integer':Division) :-
+    brachylog_label('default', 'integer':I2, _),
+    nonvar(I1),
+    D is I1 / I2,
+    brachylog_floor('integer':1, 'float':D, 'integer':Division).
+brachylog_integer_division('integer':0, ['integer':I1,'float':I2], 'integer':Division) :-
+    brachylog_label('default', 'integer':I1, _),
+    nonvar(I2),
+    D is I1 / I2,
+    brachylog_floor('integer':1, 'float':D, 'integer':Division).
+brachylog_integer_division('integer':0, ['float':I1,'float':I2], 'integer':Division) :-
+    nonvar(I1),
+    nonvar(I2),
+    D is I1 / I2,
+    brachylog_floor('integer':1, 'float':D, 'integer':Division).
+brachylog_integer_division('integer':I, Input, Output) :-
+    I #> 0,
+    brachylog_integer_division('integer':0, [Input,'integer':I], Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_MULTIPLY
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_multiply_reversed(S, I, O) :-
+    brachylog_multiply(S, O, I).
+brachylog_multiply('first', ['integer':A,'integer':B], Output) :-
+    brachylog_multiply('integer':A, 'integer':B, Output).
+brachylog_multiply('last', ['integer':A,'integer':B], Output) :-
+    brachylog_multiply('integer':B, 'integer':A, Output).
+brachylog_multiply('integer':S, 'integer':I, 'integer':J) :-
+    J #= S*I.
+brachylog_multiply('integer':S, 'float':F, 'float':G) :-
+    nonvar(F),
+    G is S*F.
+brachylog_multiply('default', [], 'integer':1).
+brachylog_multiply('default', [TypeI:I|T], TypeS:Product) :-
+    (   TypeI = 'integer',
+        TypeF = 'integer',
+        (   var(I) ->
+            I #> 0,
+            F #> 0
+        ;   true
+        ),
+        Product #= I * F,
+        TypeS = 'integer',
+        brachylog_multiply('default', T, TypeF:F)
+    ;   TypeS = 'float',
+        brachylog_multiply('default', T, TypeF:F),
+        (   TypeF = 'float',
+            TypeI = 'integer',
+            brachylog_label('default', 'integer':I, _)
+        ;   TypeI = 'float',
+            nonvar(I),
+            TypeF = 'integer',
+            brachylog_label('default', 'integer':F, _)
+        ;   TypeF = 'float',
+            TypeI = 'float',
+            nonvar(I)
+        ),
+        Product is I * F
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_MODULO
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_modulo_reversed(S, I, O) :-
+    brachylog_modulo(S, O, I).
+brachylog_modulo('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_modulo('integer':I, Arg, Output).
+brachylog_modulo('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_modulo('integer':I, Arg, Output).
+brachylog_modulo('default', Input, Output) :-
+    brachylog_modulo('integer':0, Input, Output).
+brachylog_modulo('integer':0, ['integer':I1,'integer':I2], 'integer':Rem) :-
+    Rem #= I1 mod I2.
+brachylog_modulo('integer':I, 'integer':I1, 'integer':Rem) :-
+    I #> 0,
+    Rem #= I1 mod I.
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_EXP
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_exp_reversed(S, I, O) :-
+    brachylog_exp(S, O, I).
+brachylog_exp('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_exp('integer':I, Arg, Output).
+brachylog_exp('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_exp('integer':I, Arg, Output).
+brachylog_exp('default', Input, Output) :-
+    brachylog_exp('integer':0, Input, Output).
+brachylog_exp('integer':0, 'integer':I, 'float':Exp) :-
+    brachylog_label('default', 'integer':I, _),
+    Exp is exp(I).
+brachylog_exp('integer':0, 'float':F, 'float':Exp) :-
+    nonvar(F),
+    Exp is exp(F).
+brachylog_exp('integer':1, 'integer':I, 'float':Exp) :-
+    brachylog_label('default', 'integer':I, _),
+    Exp is log(I).
+brachylog_exp('integer':1, 'float':F, 'float':Exp) :-
+    nonvar(F),
+    Exp is log(F).
+brachylog_exp('integer':2, 'integer':I, 'float':Exp) :-
+    brachylog_label('default', 'integer':I, _),
+    Exp is cos(I).
+brachylog_exp('integer':2, 'float':F, 'float':Exp) :-
+    nonvar(F),
+    Exp is cos(F).
+brachylog_exp('integer':3, 'integer':I, 'float':Exp) :-
+    brachylog_label('default', 'integer':I, _),
+    Exp is sin(I).
+brachylog_exp('integer':3, 'float':F, 'float':Exp) :-
+    nonvar(F),
+    Exp is sin(F).
+brachylog_exp('integer':4, 'integer':I, 'float':Exp) :-
+    brachylog_label('default', 'integer':I, _),
+    Exp is tan(I).
+brachylog_exp('integer':4, 'float':F, 'float':Exp) :-
+    nonvar(F),
+    Exp is tan(F).
+brachylog_exp('integer':5, 'integer':I, 'float':Exp) :-
+    brachylog_label('default', 'integer':I, _),
+    Exp is acos(I).
+brachylog_exp('integer':5, 'float':F, 'float':Exp) :-
+    nonvar(F),
+    Exp is acos(F).
+brachylog_exp('integer':6, 'integer':I, 'float':Exp) :-
+    brachylog_label('default', 'integer':I, _),
+    Exp is asin(I).
+brachylog_exp('integer':6, 'float':F, 'float':Exp) :-
+    nonvar(F),
+    Exp is asin(F).
+brachylog_exp('integer':7, 'integer':I, 'float':Exp) :-
+    brachylog_label('default', 'integer':I, _),
+    Exp is atan(I).
+brachylog_exp('integer':7, 'float':F, 'float':Exp) :-
+    nonvar(F),
+    Exp is atan(F).
+brachylog_exp('integer':8, 'integer':I, 'float':Exp) :-
+    brachylog_label('default', 'integer':I, _),
+    Exp is cosh(I).
+brachylog_exp('integer':8, 'float':F, 'float':Exp) :-
+    nonvar(F),
+    Exp is cosh(F).
+brachylog_exp('integer':9, 'integer':I, 'float':Exp) :-
+    brachylog_label('default', 'integer':I, _),
+    Exp is sinh(I).
+brachylog_exp('integer':9, 'float':F, 'float':Exp) :-
+    nonvar(F),
+    Exp is sinh(F).
+brachylog_exp('integer':10, 'integer':I, 'float':Exp) :-
+    brachylog_label('default', 'integer':I, _),
+    Exp is tanh(I).
+brachylog_exp('integer':10, 'float':F, 'float':Exp) :-
+    nonvar(F),
+    Exp is tanh(F).
+brachylog_exp('integer':11, 'integer':I, 'float':Exp) :-
+    brachylog_label('default', 'integer':I, _),
+    Exp is acosh(I).
+brachylog_exp('integer':11, 'float':F, 'float':Exp) :-
+    nonvar(F),
+    Exp is acosh(F).
+brachylog_exp('integer':12, 'integer':I, 'float':Exp) :-
+    brachylog_label('default', 'integer':I, _),
+    Exp is asinh(I).
+brachylog_exp('integer':12, 'float':F, 'float':Exp) :-
+    nonvar(F),
+    Exp is asinh(F).
+brachylog_exp('integer':13, 'integer':I, 'float':Exp) :-
+    brachylog_label('default', 'integer':I, _),
+    Exp is atanh(I).
+brachylog_exp('integer':13, 'float':F, 'float':Exp) :-
+    nonvar(F),
+    Exp is atanh(F).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_PLUS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_plus_reversed(S, I, O) :-
+    brachylog_plus(S, O, I).
+brachylog_plus('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_plus('integer':I, Arg, Output).
+brachylog_plus('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_plus('integer':I, Arg, Output).
+brachylog_plus('default', Input, Output) :-
+    brachylog_plus('integer':0, Input, Output).
+brachylog_plus('integer':I, 'integer':Input, 'integer':Output) :-
+    I #> 0,
+    Output #= Input + I.
+brachylog_plus('integer':I, 'float':Input, 'float':Output) :-
+    I #> 0,
+    nonvar(Input),
+    Output is Input + I.
+brachylog_plus('integer':0, [], 'integer':0).
+brachylog_plus('integer':0, [TypeI:I|T], TypeS:Sum) :-
+    brachylog_plus('integer':0, T, TypeF:F),
+    (   TypeI = 'integer',
+        TypeF = 'integer',
+        Sum #= I + F,
+        TypeS = 'integer'
+    ;   TypeS = 'float',
+        (   TypeF = 'float',
+            TypeI = 'integer',
+            brachylog_label('default', 'integer':I, _)
+        ;   TypeI = 'float',
+            nonvar(I),
+            TypeF = 'integer',
+            brachylog_label('default', 'integer':F, _)
+        ;   TypeF = 'float',
+            TypeI = 'float',
+            nonvar(I)
+        ),
+        Sum is I + F
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_MINUS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_minus_reversed(S, I, O) :-
+    brachylog_minus(S, O, I).
+brachylog_minus('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_minus('integer':I, Arg, Output).
+brachylog_minus('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_minus('integer':I, Arg, Output).
+brachylog_minus('default', Input, Output) :-
+    brachylog_minus('integer':0, Input, Output).
+brachylog_minus('integer':I, 'integer':Input, 'integer':Output) :-
+    I #> 0,
+    Output #= Input - I.
+brachylog_minus('integer':I, 'float':Input, 'float':Output) :-
+    I #> 0,
+    nonvar(Input),
+    Output is Input - I.
+brachylog_minus('integer':0, [], 'integer':0).
+brachylog_minus('integer':0, [TypeI:I|T], TypeS:Sum) :-
+    brachylog_minus('integer':0, T, TypeF:F),
+    (   TypeI = 'integer',
+        TypeF = 'integer',
+        Sum #= I - F,
+        TypeS = 'integer'
+    ;   TypeS = 'float',
+        (   TypeF = 'float',
+            TypeI = 'integer',
+            brachylog_label('default', 'integer':I, _)
+        ;   TypeI = 'float',
+            nonvar(I),
+            TypeF = 'integer',
+            brachylog_label('default', 'integer':F, _)
+        ;   TypeF = 'float',
+            TypeI = 'float',
+            nonvar(I)
+        ),
+        Sum is I - F
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_DIVIDE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_divide_reversed(S, I, O) :-
+    brachylog_divide(S, O, I).
+brachylog_divide('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_divide('integer':I, Arg, Output).
+brachylog_divide('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_divide('integer':I, Arg, Output).
+brachylog_divide('default', [], 'integer':1).
+brachylog_divide('default', ['integer':I1,'integer':I2], Type:Division) :-
+    brachylog_label('default', ['integer':I1,'integer':I2], _),
+    I2 #\= 0,
+    Division is I1 / I2,
+    (   integer(Division) ->
+        Type = 'integer'
+    ;   Type = 'float'
+    ).
+brachylog_divide('default', ['integer':0, 'integer':0], 'integer':_).
+brachylog_divide('default', ['float':I1,'integer':I2], 'float':Division) :-
+    brachylog_label('default', 'integer':I2, _),
+    I2 #\= 0,
+    nonvar(I1),
+    Division is I1 / I2.
+brachylog_divide('default', ['float':0.0, 'integer':0], 'float':_).
+brachylog_divide('default', ['integer':I1,'float':I2], 'float':Division) :-
+    brachylog_label('default', 'integer':I1, _),
+    nonvar(I2),
+    dif(I2, 0.0),
+    Division is I1 / I2.
+brachylog_divide('default', ['integer':0, 'float':0.0], 'float':_).
+brachylog_divide('default', ['float':I1,'float':I2], 'float':Division) :-
+    nonvar(I1),
+    nonvar(I2),
+    dif(I2, 0.0),
+    Division is I1 / I2.
+brachylog_divide('default', ['float':0.0, 'float':0.0], 'float':_).
+brachylog_divide('integer':1, 'integer':I, 'float':J) :-
+    brachylog_label('default', 'integer':I, _),
+    J is 1/I.
+brachylog_divide('integer':1, 'float':I, 'float':J) :-
+    J is 1/I.
+brachylog_divide('integer':I, Input, Output) :-
+    I #> 1,
+    brachylog_divide('default', [Input,'integer':I], Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_LESS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_less_reversed(S, I, O) :-
+    brachylog_less(S, O, I).
+brachylog_less('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_less('integer':I, Arg, Output).
+brachylog_less('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_less('integer':I, Arg, Output).
+brachylog_less('default', Input, Output) :-
+    brachylog_less('integer':0, Input, Output).
+brachylog_less('integer':0, 'integer':I1, 'integer':I2) :-
+    I1 #< I2.
+brachylog_less('integer':0, 'float':I1, 'integer':I2) :-
+    nonvar(I1),
+    brachylog_label('default', 'integer':I2, _),
+    I1 < I2.
+brachylog_less('integer':0, 'integer':I1, 'float':I2) :-
+    nonvar(I2),
+    brachylog_label('default', 'integer':I1, _),
+    I1 < I2.
+brachylog_less('integer':0, 'float':I1, 'float':I2) :-
+    nonvar(I1),
+    nonvar(I2),
+    I1 < I2.
+brachylog_less('integer':1, [], []).
+brachylog_less('integer':1, [I], [I]).
+brachylog_less('integer':1, [I,J|T], [I,J|T]) :-
+    brachylog_less('integer':0, I, J),
+    brachylog_less('integer':1, [J|T], [J|T]).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_EQUAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_equal_reversed(S, I, O) :-
+    brachylog_equal(S, O, I).
+brachylog_equal('first', [I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_equal(I, Arg, Output).
+brachylog_equal('last', Input, Output) :-
+    reverse(Input, [I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_equal(I, Arg, Output).
+brachylog_equal('default', [], []).
+brachylog_equal('default', [H|T], [H|T]) :-
+    maplist(=(H), T).
+brachylog_equal('default', 'string':L, 'string':L) :-
+    brachylog_equal('integer':0, L, L).
+brachylog_equal('default', 'integer':0, 'integer':0).
+brachylog_equal('default', 'integer':I, 'integer':I) :-
+    H #\= 0,
+    integer_value('integer':_:[H|T], I),
+    brachylog_equal('default', [H|T], [H|T]).
+brachylog_equal(Type:I, [Type:I|T], [Type:I|T]) :-
+    brachylog_equal('default', [Type:I|T], [Type:I|T]).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_GREATER
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_greater_reversed(S, I, O) :-
+    brachylog_greater(S, O, I).
+brachylog_greater('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_greater('integer':I, Arg, Output).
+brachylog_greater('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_greater('integer':I, Arg, Output).
+brachylog_greater('default', Input, Output) :-
+    brachylog_greater('integer':0, Input, Output).
+brachylog_greater('integer':0, 'integer':I1, 'integer':I2) :-
+    I1 #> I2.
+brachylog_greater('integer':0, 'float':I1, 'integer':I2) :-
+    nonvar(I1),
+    brachylog_label('default', 'integer':I2, _),
+    I1 > I2.
+brachylog_greater('integer':0, 'integer':I1, 'float':I2) :-
+    nonvar(I2),
+    brachylog_label('default', 'integer':I1, _),
+    I1 > I2.
+brachylog_greater('integer':0, 'float':I1, 'float':I2) :-
+    nonvar(I1),
+    nonvar(I2),
+    I1 > I2.
+brachylog_greater('integer':1, [], []).
+brachylog_greater('integer':1, [I], [I]).
+brachylog_greater('integer':1, [I,J|T], [I,J|T]) :-
+    brachylog_greater('integer':0, I, J),
+    brachylog_greater('integer':1, [J|T], [J|T]).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_TRANSPOSE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_transpose_reversed(S, I, O) :-
+    brachylog_transpose(S, O, I).
+brachylog_transpose('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_transpose('integer':I, Arg, Output).
+brachylog_transpose('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_transpose('integer':I, Arg, Output).
+brachylog_transpose('default', Input, Output) :-
+    brachylog_transpose('integer':0, Input, Output).
+brachylog_transpose('integer':0, 'string':Input, 'string':Output) :-
+    brachylog_split_lines('default', Input, Ls),
+    brachylog_elements('default', Ls, LLs),
+    brachylog_transpose('integer':0, LLs, CCs),
+    maplist(brachylog_concatenate('default'), CCs, Cs),
+    brachylog_split_lines('default', Output, Cs).
+brachylog_transpose('integer':0, Input, Output) :-
+    is_brachylog_list(Input),
+    member(X, Input),
+    is_list(X),
+    !,
+    maplist(is_brachylog_list, Input),
+    length(X, LX),
+    length(Input, LI),
+    brachylog_juxtapose('integer':LI, ['integer':LX], Lengths),
+    maplist(brachylog_length('default'), Input, Lengths),
+    brachylog_equal('default', Lengths, _),
+    transpose(Input, Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_POWER
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_power_reversed(S, I, O) :-
+    brachylog_power(S, O, I).
+brachylog_power('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_power('integer':I, Arg, Output).
+brachylog_power('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_power('integer':I, Arg, Output).
+brachylog_power('default', [], 'integer':1).
+brachylog_power('default', ['integer':I1,'integer':I2], 'integer':Power) :-
+    Power #= I1 ^ I2.
+brachylog_power('default', ['float':I1,'integer':I2], 'float':Power) :-
+    nonvar(I1),
+    brachylog_label('default', 'integer':I2, _),
+    Power is I1 ^ I2.
+brachylog_power('default', ['integer':I1,'float':I2], 'float':Power) :-
+    nonvar(I2),
+    brachylog_label('default', 'integer':I1, _),
+    Power is I1 ^ I2.
+brachylog_power('default', ['float':I1,'float':I2], 'float':Power) :-
+    nonvar(I1),
+    nonvar(I2),
+    Power is I1 ^ I2.
+brachylog_power('integer':S, 'integer':I, 'integer':J) :-
+    J #= I^S.
+brachylog_power('integer':S, 'float':I, 'float':J) :-
+    nonvar(I),
+    brachylog_label('default', 'integer':S, _),
+    J is I^S.
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_ADFIX
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_adfix_reversed(S, I, O) :-
+    brachylog_adfix(S, O, I).
+brachylog_adfix('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_adfix('integer':I, Arg, Output).
+brachylog_adfix('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_adfix('integer':I, Arg, Output).
+brachylog_adfix('default', Input, Output) :-
+    (   brachylog_adfix('integer':0, Input, Output)
+    ;   brachylog_adfix('integer':1, Input, Output)
+    ).
+brachylog_adfix('integer':0, [], []).
+brachylog_adfix('integer':0, [H|T], [H2|T2]) :-
+    (   brachylog_concatenate('default', [[H2|T2],[_|_]], [H|T])
+    ;   [H2|T2] = [H|T]
+    ).
+brachylog_adfix('integer':0, 'string':S, 'string':P) :-
+    brachylog_adfix('integer':0, S, P).
+brachylog_adfix('integer':0, 'integer':0, 'integer':0).
+brachylog_adfix('integer':0, 'integer':I, 'integer':P) :-
+    H #\= 0,
+    H2 #\= 0,
+    abs(P) #=< abs(I),
+    integer_value('integer':Sign:[H|T], I),
+    integer_value('integer':Sign:[H2|T2], P),
+    brachylog_adfix('integer':0, [H|T], [H2|T2]).
+brachylog_adfix('integer':1, [], []).
+brachylog_adfix('integer':1, [H|T], [H2|T2]) :-
+    brachylog_concatenate('default', [_,[H2|T2]], [H|T]).
+brachylog_adfix('integer':1, 'string':S, 'string':P) :-
+    brachylog_adfix('integer':1, S, P).
+brachylog_adfix('integer':1, 'integer':0, 'integer':0).
+brachylog_adfix('integer':1, 'integer':I, 'integer':P) :-
+    H #\= 0,
+    H2 #\= 0,
+    abs(P) #=< abs(I),
+    integer_value('integer':Sign:[H|T], I),
+    integer_value('integer':Sign:[H2|T2], P),
+    brachylog_adfix('integer':1, [H|T], [H2|T2]).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_BEHEAD
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_behead_reversed(S, I, O) :-
+    brachylog_behead(S, O, I).
+brachylog_behead('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_behead('integer':I, Arg, Output).
+brachylog_behead('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_behead('integer':I, Arg, Output).
+brachylog_behead('integer':0, Input, Input).
+brachylog_behead('default', Input, Output) :-
+    brachylog_behead('integer':1, Input, Output).
+brachylog_behead('integer':1, 'string':[_|T], 'string':T).
+brachylog_behead('integer':1, 'integer':0, 'integer':0).
+brachylog_behead('integer':1, 'integer':I, 'integer':J) :-
+    H #\= 0,
+    integer_value('integer':Sign:[H|T], I),
+    integer_value('integer':Sign:T, J).
+brachylog_behead('integer':1, 'float':F,'float':G) :-
+    number_codes(F,L),
+    brachylog_behead_float(L,M),
+    number_codes(G,M).
+brachylog_behead('integer':1, [_|T],T).
+brachylog_behead('integer':I, Input, Output) :-
+    I #> 1,
+    brachylog_meta_iterate(ignore, 'integer':I, brachylog_behead, 'integer':1, Input, Output).
+
+brachylog_behead_float([], []).
+brachylog_behead_float([48|T], [48|T2]) :-
+    brachylog_behead_float(T, T2).
+brachylog_behead_float([46|T], [46|T2]) :-
+    brachylog_behead_float(T, T2).
+brachylog_behead_float([H|T], [48|T2]) :-
+    H \= 46,
+    H \= 48,
+    brachylog_behead_float_(T, T2).
+
+brachylog_behead_float_([], []).
+brachylog_behead_float_([H|T], [H|T2]) :-
+    brachylog_behead_float_(T, T2).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_CONCATENATE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_concatenate_reversed(S, I, O) :-
+    brachylog_concatenate(S, O, I).
+brachylog_concatenate('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_concatenate('integer':I, Arg, Output).
+brachylog_concatenate('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_concatenate('integer':I, Arg, Output).
+brachylog_concatenate('default', Input, Output) :-
+    brachylog_concatenate('integer':0, Input, Output).
+brachylog_concatenate('integer':I, Input, Output) :-
+    I #> 0,
+    length(Input, I),
+    brachylog_concatenate('integer':0, Input, Output).
+brachylog_concatenate('integer':0, [], []).
+brachylog_concatenate('integer':0, [H|T],L) :-
+    var(L),
+    (   maplist(is_brachylog_list, [H|T]),
+        brachylog_coerce('default', L, L),
+        List = L,
+        ListOfLists = [H|T],
+        Integers = 'no'
+    ;   maplist(brachylog_concatenate_prepend_string_or_empty, ListOfLists, [H|T]),
+        brachylog_coerce('integer':2, 'string':List, L),
+        Integers = 'no'
+    ;   maplist(brachylog_concatenate_integer_value, ListOfLists, [H|T]),
+        Integers = 'yes'
+    ),
+    brachylog_concatenate_(ListOfLists, List),
+    (   Integers = 'yes',
+        List = [0],
+        L = 'integer':0
+    ;   Integers = 'yes',
+        List = [J|TList],
+        integer_value('integer':'positive':[J|TList], I),
+        L = 'integer':I
+    ;   Integers = 'no'
+    ).
+brachylog_concatenate('integer':0, [H|T], L) :-
+    nonvar(L),
+    brachylog_length('default', L, 'integer':Length),
+    (   var(T) ->
+        LengthList #> 0,
+        LengthList #=< Length,
+        indomain(LengthList),
+        length([H|T], LengthList),
+        CanContainEmpty = 'no'
+    ;   CanContainEmpty = 'yes'
+    ),
+    (   is_brachylog_list(L),
+        maplist(brachylog_coerce('default'), [H|T], [H|T]),
+        List = L,
+        ListOfLists = [H|T]
+    ;   L = 'string':List,
+        maplist(brachylog_concatenate_prepend_string_or_empty, ListOfLists, [H|T])
+    ;   L = 'integer':I,
+        (   I = 0,
+            List = [0]
+        ;   I #\= 0,
+            J #\= 0,
+            integer_value('integer':_:[J|TList], I),
+            List = [J|TList]
+        ),
+        (
+            CanContainEmpty = 'no' ->
+            maplist(brachylog_concatenate_limit_length(1, Length), [H|T])
+        ;   maplist(brachylog_concatenate_limit_length(0, Length), [H|T])
+        ),
+        maplist(brachylog_concatenate_integer_value, ListOfLists, [H|T])
+    ),
+    (
+        CanContainEmpty = 'no' ->
+        maplist(brachylog_concatenate_limit_length(1, Length), [H|T])
+    ;   maplist(brachylog_concatenate_limit_length(0, Length), [H|T])
+    ),
+    brachylog_concatenate_(ListOfLists, List).
+
+brachylog_concatenate_prepend_string_or_empty([], []).
+brachylog_concatenate_prepend_string_or_empty(S, 'string':S).
+
+brachylog_concatenate_limit_length(Min, Max, H) :-
+    Length #>= Min,
+    Length #=< Max,
+    indomain(Length),
+    brachylog_length('default', H, 'integer':Length).
+
+brachylog_concatenate_integer_value([0], 'integer':0).
+brachylog_concatenate_integer_value([], []).
+brachylog_concatenate_integer_value([H|T], 'integer':I) :-
+    H #\= 0,
+    integer_value('integer':_:[H|T], I).
+
+brachylog_concatenate_([L|T], L2) :-
+    is_brachylog_list(L2),
+    append([L|T], L2).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_DUPLICATES
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_duplicates_reversed(S, I, O) :-
+    brachylog_duplicates(S, O, I).
+brachylog_duplicates('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_duplicates('integer':I, Arg, Output).
+brachylog_duplicates('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_duplicates('integer':I, Arg, Output).
+brachylog_duplicates('default', Input, Output) :-
+    brachylog_duplicates('integer':0, Input, Output).
+brachylog_duplicates('integer':0, 'string':S, 'string':T) :-
+    list_to_set(S, T).
+brachylog_duplicates('integer':0, 'integer':I, 'integer':J) :-
+    brachylog_label('default', 'integer':I, 'integer':I),
+    number_codes(I, C),
+    list_to_set(C, S),
+    number_codes(J, S).
+brachylog_duplicates('integer':0, 'float':F, 'float':G) :-
+    number_codes(F, C),
+    list_to_set(C, S),
+    number_codes(G, S).
+brachylog_duplicates('integer':0, L, M) :-
+    is_brachylog_list(L),
+    list_to_set(L, M).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_FACTORS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_factors_reversed(S, I, O) :-
+    brachylog_factors(S, O, I).
+brachylog_factors('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_factors('integer':I, Arg, Output).
+brachylog_factors('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_factors('integer':I, Arg, Output).
+brachylog_factors('default', 'integer':N, Z) :-
+    brachylog_label('default', 'integer':N, _),
+    (   N = 0 ,
+        Z = []
+    ;   N #> 0,
+        findall('integer':X, (X #>= 1, X #=< N, I #>= 1, I #=< N, N #= X*I, indomain(X)), Z)
+    ;   N #< 0,
+        findall('integer':X, (X #=< -1, X #>= N, I #>= 1, I #=< abs(N), N #= X*I, labeling([max(X)], [X])), Z)
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_GROUP
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_group_reversed(S, I, O) :-
+    brachylog_group(S, O, I).
+brachylog_group('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_group('integer':I, Arg, Output).
+brachylog_group('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_group('integer':I, Arg, Output).
+brachylog_group('integer':0, Input, Input).
+brachylog_group('default', Input, Output) :-
+    brachylog_group('integer':1, Input, Output).
+brachylog_group('integer':1, X, [X]).
+brachylog_group('integer':I, Input, Output) :-
+    I #> 1,
+    brachylog_meta_iterate(ignore, 'integer':I, brachylog_group, 'integer':1, Input, Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_HEAD
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_head_reversed(S, I, O) :-
+    brachylog_head(S, O, I).
+brachylog_head('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_head('integer':I, Arg, Output).
+brachylog_head('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_head('integer':I, Arg, Output).
+brachylog_head('integer':0, _, []).
+brachylog_head('default', 'string':[H|_], 'string':[H]).
+brachylog_head('default', 'integer':0, 'integer':0).
+brachylog_head('default', 'integer':I, 'integer':J) :-
+    J #\= 0,
+    integer_value('integer':_:[J|_], I).
+brachylog_head('default', 'float':F, 'integer':I) :-
+    number_codes(F,L),
+    brachylog_head_float(L, 'integer':I).
+brachylog_head('default', [H|_], H).
+brachylog_head('integer':I, Input, Output) :-
+    I #> 0,
+    brachylog_length('default', Output, 'integer':I),
+    once(brachylog_concatenate('default', [Output, _], Input)).
+
+brachylog_head_float([H|T], 'integer':I) :-
+    (   (   H = 48
+        ;   H = 46
+        ) ->
+        (   T = [],
+            I = 0
+        ;   T \= [],
+            brachylog_head_float(T, 'integer':I)
+        )
+    ;   H \= 48,
+        H \= 46,
+        number_codes(I, [H])
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_INDEX
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_index_reversed(S, I, O) :-
+    brachylog_index(S, I, O).
+brachylog_index('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_index('integer':I, Arg, Output).
+brachylog_index('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_index('integer':I, Arg, Output).
+brachylog_index('default', Input, [E,'integer':I]) :-
+    brachylog_in('integer':I, Input, E).
+brachylog_index('integer':1, Input, [E,'integer':J]) :-
+    J #= I + 1,
+    brachylog_in('integer':I, Input, E).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_JUXTAPOSE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_juxtapose_reversed(S, I, O) :-
+    brachylog_juxtapose(S, O, I).
+brachylog_juxtapose('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_juxtapose('integer':I, Arg, Output).
+brachylog_juxtapose('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_juxtapose('integer':I, Arg, Output).
+brachylog_juxtapose('default', Input, Output) :-
+    brachylog_juxtapose('integer':2, Input, Output).
+brachylog_juxtapose('integer':_, [], []).
+brachylog_juxtapose('integer':0, [_|_], []).
+brachylog_juxtapose('integer':I, [H|T], Z) :-
+    var(Z),
+    Z = [HZ|TZ],
+    I #> 0,
+    length([H|T], L),
+    LZ #= I*L,
+    length([HZ|TZ], LZ),
+    append([H|T], T2, [HZ|TZ]),
+    J #= I-1,
+    brachylog_juxtapose('integer':J, [H|T], T2).
+brachylog_juxtapose('integer':I, [H|T], Z) :-
+    nonvar(Z),
+    Z = [HZ|TZ],
+    I #> 0,
+    length([HZ|TZ], LZ),
+    LZ #= I*L,
+    indomain(L),
+    length([H|T], L),
+    append([H|T], T2, [HZ|TZ]),
+    J #= I-1,
+    brachylog_juxtapose('integer':J, [H|T], T2).
+brachylog_juxtapose('integer':I, 'string':S, 'string':Z) :-
+    brachylog_juxtapose('integer':I, S, Z).
+brachylog_juxtapose('integer':J, 'integer':I, 'integer':Z) :-
+    var(Z),
+    dif(H, 0),
+    integer_value('integer':Sign:[H|T], I),
+    brachylog_juxtapose('integer':J, [H|T], LZ),
+    LZ = [HZ|_],
+    dif(HZ, 0),
+    integer_value('integer':Sign:LZ, Z).
+brachylog_juxtapose('integer':J, 'integer':I, 'integer':Z) :-
+    nonvar(Z),
+    dif(H, 0),
+    dif(HZ, 0),
+    integer_value('integer':Sign:[HZ|TZ], Z),
+    brachylog_juxtapose('integer':J, [H|T], [HZ|TZ]),
+    integer_value('integer':Sign:[H|T], I).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_KNIFE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_knife_reversed(S, I, O) :-
+    brachylog_knife(S, O, I).
+brachylog_knife('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_knife('integer':I, Arg, Output).
+brachylog_knife('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_knife('integer':I, Arg, Output).
+brachylog_knife('integer':0, Input, Input).
+brachylog_knife('default', Input, Output) :-
+    brachylog_knife('integer':1, Input, Output).
+brachylog_knife('integer':1, [_], []).
+brachylog_knife('integer':1, [H,I|T], [H2|T2]) :-
+    (   var(T) ->
+        reverse(T3, [H2|T2]),
+        reverse([H,I|T], [_|T3])
+    ;   reverse([H,I|T], [_|T3]),
+        reverse(T3, [H2|T2])
+    ).
+brachylog_knife('integer':1, 'string':S, 'string':T) :-
+    brachylog_knife('integer':1, S, T).
+brachylog_knife('integer':1, 'integer':I, 'integer':0) :-
+    I in -9..9.
+brachylog_knife('integer':1, 'integer':I, 'integer':J) :-
+    H #\= 0,
+    H2 #\= 0,
+    abs(J) #=< abs(I),
+    abs(I) #=< 10*(abs(J) + 1),
+    integer_value('integer':Sign:[H|T], I),
+    integer_value('integer':Sign:[H2|T2], J),
+    brachylog_knife('integer':1, [H|T], [H2|T2]).
+brachylog_knife('integer':I, Input, Output) :-
+    I #> 1,
+    brachylog_meta_iterate(ignore, 'integer':I, brachylog_knife, 'integer':1, Input, Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_LENGTH
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_length_reversed(S, I, O) :-
+    brachylog_length(S, O, I).
+brachylog_length('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_length('integer':I, Arg, Output).
+brachylog_length('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_length('integer':I, Arg, Output).
+brachylog_length('integer':I, Input, Input) :-
+    I #>= 0,
+    brachylog_length('default', Input, 'integer':I).
+brachylog_length('default', [], 'integer':0).
+brachylog_length('default', [H|T], 'integer':Length) :-
+    length([H|T], Length).
+brachylog_length('default', 'string':S, 'integer':Length) :-
+    length(S, Length).
+brachylog_length('default', 'integer':0, 'integer':1).
+brachylog_length('default', 'integer':I, 'integer':Length) :-
+    nonvar(Length),
+    (   Length = 1 ->
+        I in 1..9
+    ;   H #\= 0,
+        abs(I) #< 10^Length,
+        integer_value('integer':_:[H|T], I),
+        length([H|T], Length)
+    ).
+brachylog_length('default', 'integer':I, 'integer':Length) :-
+    var(Length),
+    H #\= 0,
+    Length #>= 0,
+    integer_value('integer':_:[H|T], I),
+    length([H|T], Length).
+brachylog_length('default', 'float':F, 'integer':Length) :-
+    nonvar(F),
+    length(L, Length),
+    catch(number_codes(F, L), E, (print_message(error, E), false)).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_ORDER
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_order_reversed(S, I, O) :-
+    brachylog_order(S, O, I).
+brachylog_order('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_order('integer':I, Arg, Output).
+brachylog_order('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_order('integer':I, Arg, Output).
+brachylog_order('default', Input, Output) :-
+    brachylog_order('integer':0, Input, Output).
+brachylog_order('integer':0, 'string':S, 'string':T) :-
+    (   nonvar(S),
+        msort(S, T)
+    ;   var(S),
+        msort(T, T),
+        brachylog_permute('default', 'string':T, 'string':S)
+    ).
+brachylog_order('integer':0, 'integer':I, 'integer':J) :-
+    brachylog_label('default', 'integer':I, _),
+    number_codes(I, C),
+    msort(C, D),
+    number_codes(J, D).
+brachylog_order('integer':0, [], []).
+brachylog_order('integer':0, [H|T], [H2|T2]) :-
+    (   nonvar(T),
+        brachylog_order_mixed_sort_([H|T], [H2|T2])
+    ;   var(T),
+        brachylog_order_mixed_sort_([H2|T2], [H2|T2]),
+        brachylog_permute('default', [H2|T2], [H|T])
+    ).
+brachylog_order('integer':1, Input, Output) :-
+    brachylog_order('integer':0, Input, ROutput),
+    brachylog_reverse('default', ROutput, Output).
+
+% keysort sorts by the first element of a - pair, disregarding but preserving the second
+brachylog_order_type_pair_(List, PairsList-list) :-
+    maplist(brachylog_order_type_pair_, List, PairsList).
+brachylog_order_type_pair_(Type:Value, Value-Type).
+brachylog_order_mixed_sort_(List, Sorted) :-
+    maplist(brachylog_order_type_pair_, List, IPairs),
+    keysort(IPairs, OPairs), % keysort, like msort, doesn't remove duplicates
+    maplist(brachylog_order_type_pair_, Sorted, OPairs).
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_PERMUTE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_permute_reversed(S, I, O) :-
+    brachylog_permute(S, O, I).
+brachylog_permute('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_permute('integer':I, Arg, Output).
+brachylog_permute('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_permute('integer':I, Arg, Output).
+brachylog_permute('default', Input, Output) :-
+    brachylog_permute('integer':0, Input, Output).
+brachylog_permute('integer':0, 'string':S, 'string':Permutation) :-
+    permutation(S, Permutation).
+brachylog_permute('integer':0, List, Permutation) :-
+    is_brachylog_list(List),
+    is_brachylog_list(Permutation),
+    permutation(List, Permutation).
+brachylog_permute('integer':0, 'integer':0, 'integer':0).
+brachylog_permute('integer':0, 'integer':I, 'integer':J) :-
+    H #\= 0,
+    J #\= 0,
+    integer_value('integer':Sign:[H|L], I),
+    permutation([H|L], M),
+    integer_value('integer':Sign:M, J).
+brachylog_permute('integer':0, 'float':F, 'float':G) :-
+    Sign is abs(F)/F,
+    AF is abs(F),
+    number_chars(AF, C),
+    permutation(C, D),
+    \+ ( D = ['.'|_] ; reverse(D, ['.'|_])),
+    number_chars(AG, D),
+    G is Sign*AG.
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_SUBSTRING
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_substring_reversed(S, I, O) :-
+    brachylog_substring(S, O, I).
+brachylog_substring('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_substring('integer':I, Arg, Output).
+brachylog_substring('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_substring('integer':I, Arg, Output).
+brachylog_substring('default', 'integer':0, 'integer':0).
+brachylog_substring('default', 'integer':I, 'integer':J) :-
+    H #\= 0,
+    integer_value('integer':Sign:[H|L], I),
+    brachylog_substring_recur([H|L], [H2|L2]),
+    integer_value('integer':Sign:[H2|L2], J).
+brachylog_substring('default', 'string':[], 'string':[]).
+brachylog_substring('default', 'string':[H|T], 'string':[H2|T2]) :-
+    brachylog_substring_recur([H|T], [H2|T2]).
+brachylog_substring('default', [], []).
+brachylog_substring('default', [H|T], [H2|T2]) :-
+    brachylog_substring_recur([H|T], [H2|T2]).
+brachylog_substring('integer':I, Input, Output) :-
+    brachylog_length('default', Output, 'integer':I),
+    brachylog_substring('default', Input, Output).
+
+brachylog_substring_recur([], []).
+brachylog_substring_recur([H|T], [H|T2]) :-
+    brachylog_substring_recur_(T, T2).
+brachylog_substring_recur([_|T], T2) :-
+    brachylog_substring_recur(T, T2).
+
+brachylog_substring_recur_([], []).
+brachylog_substring_recur_([H|T], [H|T2]) :-
+    brachylog_substring_recur_(T, T2).
+brachylog_substring_recur_([_|_], []).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_TAIL
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_tail_reversed(S, I, O) :-
+    brachylog_tail(S, O, I).
+brachylog_tail('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_tail('integer':I, Arg, Output).
+brachylog_tail('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_tail('integer':I, Arg, Output).
+brachylog_tail('integer':0, _, []).
+brachylog_tail('default', 'string':L, 'string':[H]) :-
+    reverse(L, [H|_]).
+brachylog_tail('default', 'integer':0, 'integer':0).
+brachylog_tail('default', 'integer':I, 'integer':Z) :-
+    J #\= 0,
+    integer_value('integer':_:[J|T], I),
+    reverse([J|T], [Z|_]).
+brachylog_tail('default', 'float':F, 'integer':I) :-
+    number_codes(F, L),
+    reverse(L, R),
+    brachylog_tail_float(R, 'integer':I).
+brachylog_tail('default', L, H) :-
+    is_brachylog_list(L),
+    reverse(L, [H|_]).
+brachylog_tail('integer':I, Input, Output) :-
+    I #> 0,
+    brachylog_length('default', Output, 'integer':I),
+    once(brachylog_concatenate('default', [_,Output], Input)).
+
+brachylog_tail_float([H|T], 'integer':I) :-
+    (   (   H = 48
+        ;   H = 46
+        ) ->
+        (   T = [],
+            I = 0
+        ;   T \= [],
+            brachylog_tail_float(T, 'integer':I)
+        )
+    ;   H \= 48,
+        H \= 46,
+        number_codes(I, [H])
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_WRITE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_write_reversed(S, I, O) :-
+    brachylog_write(S, O, I).
+brachylog_write('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_write('integer':I, Arg, Output).
+brachylog_write('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_write('integer':I, Arg, Output).
+brachylog_write('default', Input, Output) :-
+    brachylog_write('integer':0, Input, Output).
+brachylog_write('integer':Sub, I, O) :-
+  S #= Sub mod 4,
+  brachylog_write_('integer':S, I, O, T),
+  (    Sub #< 4,                         % imperative write
+       write(T)
+  ;    Sub #>= 4,
+       b_getval('declw', DOld),         % Declarative write
+       append(DOld, [T], DNew),
+       b_setval('declw', DNew)
+  ).
+
+brachylog_write_('integer':1, [List,'string':F], _, T) :-
+    is_brachylog_list(List),
+    atomic_list_concat(F, Format),
+    maplist(brachylog_write_try_label, List),
+    brachylog_prolog_variable(List, PrologList),
+    format(string(T), Format, PrologList).    % Output formatted text
+brachylog_write_('integer':1, Args, _, T) :-
+    is_brachylog_list(Args),
+    reverse(Args, ['string':F|R]),
+    reverse(R, S),
+    maplist(brachylog_write_try_label, S),
+    brachylog_prolog_variable(S, PrologS),
+    atomic_list_concat(F, Format),
+    format(string(T), Format, PrologS).    % Output formatted text
+brachylog_write_('integer':0, 'string':S, _, X) :-
+    nonvar(S),
+    atomic_list_concat(S, X).
+brachylog_write_('integer':0, 'integer':I, _, I) :-
+    brachylog_label('default', 'integer':I, _).
+brachylog_write_('integer':0, 'float':F, _, F) :-
+    nonvar(F).
+brachylog_write_('integer':0, List, _, PrologList) :-
+    is_brachylog_list(List),
+    maplist(brachylog_write_try_label, List),
+    brachylog_prolog_variable(List, PrologList).
+brachylog_write_('integer':2, I, I, T) :-
+    brachylog_write_('integer':0, I, _, T).
+brachylog_write_('integer':3, I, I, T) :-
+    brachylog_write_('integer':1, I, _, T).
+
+brachylog_write_try_label(X) :-
+    (   nonvar(X), X = 'float':_ -> true
+    ;   nonvar(X), X = 'string':_ -> true
+    ;   nonvar(X), X = [] -> true
+    ;   nonvar(X),
+        X = [H|T] ->
+        maplist(brachylog_write_try_label, [H|T])
+    ;   X = 'integer':I,
+        brachylog_label('default', 'integer':I, _)
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_XTERMINATE
+
+   TODO: Use sub to know what to remove instead
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_xterminate_reversed(S, I, O) :-
+    brachylog_xterminate(S, O, I).
+brachylog_xterminate('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_xterminate('integer':I, Arg, Output).
+brachylog_xterminate('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_xterminate('integer':I, Arg, Output).
+brachylog_xterminate('default', Input, Output) :-
+    brachylog_xterminate('integer':0, Input, Output).
+brachylog_xterminate('integer':0, [L,[]], L).
+brachylog_xterminate('integer':0, ['string':S,X], 'string':T) :-
+    \+ is_brachylog_list(X),
+    brachylog_xterminate_(X, 'string':S, 'string':T).
+brachylog_xterminate('integer':0, ['string':S,[H|T]], L3) :-
+    brachylog_xterminate_(H,'string':S, L2),
+    brachylog_xterminate('integer':0, [L2,T], L3).
+brachylog_xterminate('integer':0, [L,H|T], L3) :-
+    is_brachylog_list(L),
+    \+ is_brachylog_list(H),
+    brachylog_xterminate('integer':0, [L,[H|T]], L3).
+brachylog_xterminate('integer':0, [L,[H|T]], L3) :-
+    is_brachylog_list(L),
+    delete(L, H, L2),
+    brachylog_xterminate('integer':0, [L2,T], L3).
+
+brachylog_xterminate_(X, 'string':S, 'string':T) :-
+    brachylog_xterminate_single(X, 'string':S, 'string':T).
+brachylog_xterminate_(_, [], []).
+brachylog_xterminate_(X, [H|T], [H2|T2]) :-
+    brachylog_xterminate_single(X, H, H2),
+    brachylog_xterminate_(X, T, T2).
+
+brachylog_xterminate_single('string':L, 'string':H, 'string':Z) :-
+    (   append([A,L,B], H),
+        append(A,B,H2),
+        brachylog_xterminate_single('string':L, 'string':H2, 'string':Z)
+    ;   \+ append([_,L,_], H),
+        Z = H
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_ZIP
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_zip_reversed(S, I, O) :-
+    brachylog_zip(S, O, I).
+brachylog_zip('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_zip('integer':I, Arg, Output).
+brachylog_zip('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_zip('integer':I, Arg, Output).
+brachylog_zip('default', L,Z) :-
+    is_brachylog_list(L),
+    maplist(brachylog_length('default'), L, Lengths),
+    brachylog_order('default', Lengths, OrderedLengths),
+    reverse(OrderedLengths, ['integer':MaxLength|_]),
+    maplist(brachylog_zip_listify_integer, L, L2),
+    brachylog_zip_(L2, MaxLength, Z).
+brachylog_zip('integer':0, L, Z) :-
+    is_brachylog_list(L),
+    maplist(brachylog_length('default'), L, Lengths),
+    brachylog_order('default', Lengths, ['integer':MinLength|_]),
+    maplist(brachylog_zip_listify_integer, L, L2),
+    brachylog_zip_(L2, MinLength, Z).
+brachylog_zip('integer':1, L, Z) :-
+    is_brachylog_list(L),
+    maplist(brachylog_zip_listify_integer, L, L2),
+    brachylog_zip_no_cycling(L2, Z).
+brachylog_zip('integer':2, L, Z) :-
+    maplist(brachylog_length_reversed('default', _), L),    % fails if the lengths aren't all the same
+    brachylog_zip('default', L, Z).
+
+brachylog_zip_(_, 0, []).
+brachylog_zip_(L, I, [Heads|Z]) :-
+    I #> 0,
+    maplist(brachylog_head('default'), L, Heads),
+    maplist(brachylog_circular_permute_counterclockwise('default'), L, Tails),
+    J #= I - 1,
+    brachylog_zip_(Tails, J, Z).
+
+brachylog_zip_no_cycling([H|T], Z) :-
+    brachylog_meta_select(ignore, 'default', brachylog_head, 'default', [H|T], Heads),
+    (   Heads = [] ->
+        Z = []
+    ;   Z = [Heads|Z2],
+        brachylog_meta_select(ignore, 'default', brachylog_behead, 'default', [H|T], Tails),
+        brachylog_zip_no_cycling(Tails, Z2)
+    ).
+
+brachylog_zip_listify_integer(L, L) :-
+    L \= 'integer':_.
+brachylog_zip_listify_integer('integer':I, L) :-
+    brachylog_elements('default', 'integer':I, L).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_TO_CODES
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_to_codes_reversed(S, I, O) :-
+    brachylog_to_codes(S, O, I).
+brachylog_to_codes('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_to_codes('integer':I, Arg, Output).
+brachylog_to_codes('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_to_codes('integer':I, Arg, Output).
+brachylog_to_codes('default', 'string':[], []).
+brachylog_to_codes('default', 'string':[H|T], ['integer':I|T2]) :-
+    (   var(T) ->
+        length(T2,Length),
+        length(T,Length)
+    ;   length(T,Length),
+        length(T2,Length)
+    ),
+    maplist(prepend_integer, L, ['integer':I|T2]),
+    maplist(single_atom_code, [H|T],L).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_BLOCKS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_blocks_reversed(S, I, O) :-
+    brachylog_blocks(S, O, I).
+brachylog_blocks('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_blocks('integer':I, Arg, Output).
+brachylog_blocks('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_blocks('integer':I, Arg, Output).
+brachylog_blocks('default', [], []).
+brachylog_blocks('default', [H|T], Blocks) :-
+    brachylog_blocks('default', [H|T], H, Blocks).
+brachylog_blocks('default', 'string':[H|T], StringBlocks) :-
+    maplist(prepend_string, Blocks, StringBlocks),
+    brachylog_blocks('default', [H|T], H, Blocks),
+    !.
+
+brachylog_blocks('default', [], _, [[]]).
+brachylog_blocks('default', [H|T], H, [[H|T2]|T3]) :-
+    brachylog_blocks('default', T, H, [T2|T3]).
+brachylog_blocks('default', [H|T], I, [[],[H|T2]|T3]) :-
+    dif(H, I),
+    brachylog_blocks('default', T, H, [T2|T3]).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_DICHOTOMIZE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_dichotomize_reversed(S, I, O) :-
+    brachylog_dichotomize(S, O, I).
+brachylog_dichotomize('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_dichotomize('integer':I, Arg, Output).
+brachylog_dichotomize('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_dichotomize('integer':I, Arg, Output).
+brachylog_dichotomize('default', Input, Output) :-
+    brachylog_dichotomize('integer':2, Input, Output).
+brachylog_dichotomize('integer':I, Input, Output) :-
+    brachylog_label('default', 'integer':I, _),
+    length(Output, I),
+    brachylog_dichotomize(Input, Output).
+brachylog_dichotomize('string':L, L2) :-
+    maplist(prepend_string,M, L2),
+    brachylog_dichotomize(L, M).
+brachylog_dichotomize('integer':0, L2) :-
+    length(L2, Length),
+    length(M, Length),
+    brachylog_dichotomize([0], M),
+    maplist(maplist(prepend_integer), M, L2).
+brachylog_dichotomize('integer':I, L2) :-
+    H #\= 0,
+    integer_value('integer':_:[H|T], I),
+    length(L2, Length),
+    length(M, Length),
+    brachylog_dichotomize([H|T], M),
+    maplist(maplist(prepend_integer), M, L2).
+brachylog_dichotomize(L, L2) :-
+    is_brachylog_list(L),
+    maplist(is_brachylog_list, L2),
+    Length #= LengthL//LengthL2,
+    length(L2, LengthL2),
+    length(L, LengthL),
+    reverse(L2, [_|T]),
+    maplist(length_(Length), T),
+    append(L2, L),
+    !.
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_ELEMENTS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_elements_reversed(S, I, O) :-
+    brachylog_elements(S, O, I).
+brachylog_elements('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_elements('integer':I, Arg, Output).
+brachylog_elements('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_elements('integer':I, Arg, Output).
+brachylog_elements('default', [], []).
+brachylog_elements('default', [H|T], L) :-
+    maplist(brachylog_elements('default'), [H|T], L).
+brachylog_elements('default', 'string':S, L) :-
+    brachylog_meta_find(ignore, 'default', brachylog_in, 'default', 'string':S, L).
+brachylog_elements('default', 'integer':I, L) :-
+    brachylog_meta_find(ignore, 'default', brachylog_in, 'default', 'integer':I, L).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_TO_NUMBER
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_to_number_reversed(S, I, O) :-
+    brachylog_to_number(S, O, I).
+brachylog_to_number('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_to_number('integer':I, Arg, Output).
+brachylog_to_number('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_to_number('integer':I, Arg, Output).
+brachylog_to_number('default', 'string':S, Type:N) :-
+    atomic_list_concat(S, A),
+    atom_number(A,N),
+    (   member('.', S) ->
+        Type = 'float'
+    ;   Type = 'integer'
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_LOWERCASE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_lowercase_reversed(S, I, O) :-
+    brachylog_lowercase(S, O, I).
+brachylog_lowercase('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_lowercase('integer':I, Arg, Output).
+brachylog_lowercase('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_lowercase('integer':I, Arg, Output).
+brachylog_lowercase('default', 'string':Ls0, 'string':Ls) :-
+    maplist(downcase_atom, Ls0, Ls).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_SPLIT_LINES
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_split_lines_reversed(S, I, O) :-
+    brachylog_split_lines(S, O, I).
+brachylog_split_lines('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_split_lines('integer':I, Arg, Output).
+brachylog_split_lines('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_split_lines('integer':I, Arg, Output).
+brachylog_split_lines('default', 'string':[], ['string':[]]).
+brachylog_split_lines('default', 'string':['\n'|T], ['string':[]|T3]) :-
+    brachylog_split_lines('default', 'string':T, T3).
+brachylog_split_lines('default', 'string':['\r','\r\n'|T], ['string':[]|T3]) :-
+    brachylog_split_lines('default', 'string':T, T3).
+brachylog_split_lines('default', 'string':[H|T], ['string':[H|T2]|T3]) :-
+    dif(H, '\n'),
+    dif(H, '\r\n'),
+    brachylog_split_lines('default', 'string':T, ['string':T2|T3]).
+brachylog_split_lines('integer':1, 'string':[], ['string':[]]).
+brachylog_split_lines('integer':1, 'string':[' '|T], ['string':[]|T3]) :-
+    brachylog_split_lines('integer':1, 'string':T, T3).
+brachylog_split_lines('integer':1, 'string':[H|T], ['string':[H|T2]|T3]) :-
+    dif(H, ' '),
+    brachylog_split_lines('integer':1, 'string':T, ['string':T2|T3]).
+brachylog_split_lines('integer':2, 'string':[], ['string':[]]).
+brachylog_split_lines('integer':2, 'string':[' '|T], ['string':[]|T3]) :-
+    brachylog_split_lines('integer':2, 'string':T, T3).
+brachylog_split_lines('integer':2, 'string':['\n'|T], ['string':[]|T3]) :-
+    brachylog_split_lines('integer':2, 'string':T, T3).
+brachylog_split_lines('integer':2, 'string':['\r','\r\n'|T], ['string':[]|T3]) :-
+    brachylog_split_lines('integer':2, 'string':T, T3).
+brachylog_split_lines('integer':2, 'string':[H|T], ['string':[H|T2]|T3]) :-
+    dif(H, '\n'),
+    dif(H, '\r\n'),
+    dif(H, ' '),
+    brachylog_split_lines('integer':2, 'string':T, ['string':T2|T3]).
+brachylog_split_lines('integer':3, Input, Output) :-
+    brachylog_split_lines('default', Input, L1),
+    brachylog_meta_map(ignore, 'default', brachylog_split_lines, 'integer':1, L1, Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_OCCURENCES
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_occurences_reversed(S, I, O) :-
+    brachylog_occurences(S, O, I).
+brachylog_occurences('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_occurences('integer':I, Arg, Output).
+brachylog_occurences('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_occurences('integer':I, Arg, Output).
+brachylog_occurences('default', 'string':[], []).
+brachylog_occurences('default', 'string':[H|T], L) :-
+    brachylog_elements('default', 'string':[H|T], E),
+    brachylog_occurences('default', E, L).
+brachylog_occurences('default', 'integer':0, [['integer':0,'integer':1]]).
+brachylog_occurences('default', 'integer':I, L) :-
+    H #\= 0,
+    brachylog_elements('default', 'integer':I, ['integer':H|T]),
+    brachylog_occurences('default', ['integer':H|T], L).
+brachylog_occurences('default', [], []).
+brachylog_occurences('default', [H|T], [[H,'integer':O]|T2]) :-
+    brachylog_occurences_(H, [H|T], O, R),
+    brachylog_occurences('default', R, T2).
+
+brachylog_occurences_(_, [], 0, []).
+brachylog_occurences_(H, [H|T], I, R) :-
+    I #= J + 1,
+    brachylog_occurences_(H, T, J, R).
+brachylog_occurences_(H, [H2|T], I, [H2|R]) :-
+    dif(H, H2),
+    brachylog_occurences_(H, T, I, R).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_RANDOM_ELEMENT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_random_element_reversed(S, I, O) :-
+    brachylog_random_element(S, O, I).
+brachylog_random_element('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_random_element('integer':I, Arg, Output).
+brachylog_random_element('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_random_element('integer':I, Arg, Output).
+brachylog_random_element('default', [], []).
+brachylog_random_element('default', [H|T], R) :-
+    length([H|T], L),
+    M #= L - 1,
+    random_between(0, M, I),
+    nth0(I, [H|T], R).
+brachylog_random_element('default', 'string':S, 'string':[R]) :-
+    brachylog_random_element('default', S, R).
+brachylog_random_element('default', 'integer':0, 'integer':0).
+brachylog_random_element('default', 'integer':I, 'integer':R) :-
+    H #\= 0,
+    integer_value('integer':_:[H|T], I),
+    brachylog_random_element('default', [H|T], R).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_SHUFFLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_shuffle_reversed(S, I, O) :-
+    brachylog_shuffle(S, O, I).
+brachylog_shuffle('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_shuffle('integer':I, Arg, Output).
+brachylog_shuffle('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_shuffle('integer':I, Arg, Output).
+brachylog_shuffle('default', [], []).
+brachylog_shuffle('default', [H|T], [H2|T2]) :-
+    random_permutation([H|T], [H2|T2]).
+brachylog_shuffle('default', 'string':S, 'string':T) :-
+    brachylog_shuffle('default', S, T).
+brachylog_shuffle('default', 'integer':I, 'integer':J) :-
+    H #\= 0,
+    integer_value('integer':Sign:[H|T], I),
+    (   H2 #\= 0,
+        brachylog_shuffle('default', [H|T], [H2|T2]) ->
+        integer_value('integer':Sign:[H2|T2], J)
+    ;   brachylog_shuffle('default', 'integer':I, 'integer':J)
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_UPPERCASE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_uppercase_reversed(S, I, O) :-
+    brachylog_uppercase(S, O, I).
+brachylog_uppercase('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_uppercase('integer':I, Arg, Output).
+brachylog_uppercase('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_uppercase('integer':I, Arg, Output).
+brachylog_uppercase('default', 'string':Ls0, 'string':Ls) :-
+    maplist(upcase_atom, Ls0, Ls).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_WRITELN
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_writeln_reversed(S, I, O) :-
+    brachylog_writeln(S, O, I).
+brachylog_writeln('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_writeln('integer':I, Arg, Output).
+brachylog_writeln('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_writeln('integer':I, Arg, Output).
+brachylog_writeln('default', I, O) :-
+    brachylog_writeln('integer':0, I, O).
+brachylog_writeln('integer':Sub, I, O) :-
+    brachylog_write('integer':Sub, I, O),
+    (    Sub #> 3,                                       % declarative write
+         brachylog_write('integer':4, 'string':['\n'], _)
+    ;    Sub #< 4,                                       % imperative write
+         brachylog_write('default', 'string':['\n'], _)
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_ABSOLUTE_VALUE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_absolute_value_reversed(S, I, O) :-
+    brachylog_absolute_value(S, O, I).
+brachylog_absolute_value('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_absolute_value('integer':I, Arg, Output).
+brachylog_absolute_value('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_absolute_value('integer':I, Arg, Output).
+brachylog_absolute_value('default', 'integer':I, 'integer':J) :-
+    J #= abs(I).
+brachylog_absolute_value('default', 'float':I, 'float':J) :-
+    nonvar(I),
+    J is abs(I).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_BASE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_base_reversed(S, I, O) :-
+    brachylog_base(S, O, I).
+brachylog_base('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_base('integer':I, Arg, Output).
+brachylog_base('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_base('integer':I, Arg, Output).
+brachylog_base('default', Input, Output) :-
+    brachylog_base('integer':2, Input, Output).
+brachylog_base('integer':1, 'integer':I, Output) :-
+    brachylog_label('default', 'integer':I, _),
+    length(Output, I),
+    (   Output = ['integer':1|_] ->
+        brachylog_equal('default', Output, _)
+    ;   true
+    ).
+brachylog_base('integer':B, 'integer':I, L) :-
+    B #> 1,
+    %brachylog_label('default', ['integer':I, 'integer':B], _),
+    (   I #>= 0
+    ;   I #< 0
+    ),
+    J #= abs(I),
+    n_base_digits(J, B, L).
+
+% Credits to @repeat
+% See: http://stackoverflow.com/a/33543199/2554145
+n_base_digits(Expr, Base, Ds) :-
+    Base #> 1,
+    Ds = [_|_],
+    N #=  Expr,
+    N #>= 0,
+    n_base_ref_acc_digits(N, Base, Ds, [], Ds).
+
+n_base_ref_acc_digits(N, Base, Ref, Ds0, Ds) :-
+    zcompare(Order, N, Base),
+    order_n_base_ref_acc_digits(Order, N, Base, Ref, Ds0, Ds).
+
+order_n_base_ref_acc_digits(<, N, _, [_], Ds0, ['integer':N|Ds0]).
+order_n_base_ref_acc_digits(=, _, _, [_,_], Ds0, ['integer':1,'integer':0|Ds0]).
+order_n_base_ref_acc_digits(>, N, Base, [_|Rs], Ds0, Ds) :-
+    N0 #= N //  Base,
+    N1 #= N mod Base,
+    n_base_ref_acc_digits(N0, Base, Rs, ['integer':N1|Ds0], Ds).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_COERCE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_coerce_reversed(S, I, O) :-
+    brachylog_coerce(S, O, I).
+brachylog_coerce('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_coerce('integer':I, Arg, Output).
+brachylog_coerce('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_coerce('integer':I, Arg, Output).
+brachylog_coerce('default', [], []).
+brachylog_coerce('default', [H|T], [H|T]).
+brachylog_coerce('integer':1, 'integer':I, 'integer':I).
+brachylog_coerce('integer':2, 'string':S, 'string':S).
+
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_PRIME_DECOMPOSITION
+
+   Credits to RosettaCode
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_prime_decomposition_reversed(S, I, O) :-
+    brachylog_prime_decomposition(S, O, I).
+brachylog_prime_decomposition('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_prime_decomposition('integer':I, Arg, Output).
+brachylog_prime_decomposition('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_prime_decomposition('integer':I, Arg, Output).
+brachylog_prime_decomposition('default', 'integer':N, Z) :-
+    N #> 0,
+    brachylog_label('default', 'integer':N, _),
+    ceiled_square_root(N, SN),
+    brachylog_prime_decomposition_1(N, SN, 2, [], L),
+    brachylog_prime_decomposition_append_integer(L, Z).
+
+brachylog_prime_decomposition_1(1, _, _, L, L) :- !.
+brachylog_prime_decomposition_1(N, SN, D, L, LF) :-
+    (   0 #= N mod D ->
+        Q #= N // D,
+        ceiled_square_root(Q, SQ),
+        brachylog_prime_decomposition_1(Q, SQ, D, [D|L], LF)
+    ;   D1 #= D + 1,
+        (   D1 #> SN ->
+            LF = [N|L]
+        ;   brachylog_prime_decomposition_2(N, SN, D1, L, LF)
+        )
+    ).
+
+brachylog_prime_decomposition_2(1, _, _, L, L) :- !.
+brachylog_prime_decomposition_2(N, SN, D, L, LF) :-
+    (   0 #= N mod D ->
+        Q #= N // D,
+        ceiled_square_root(Q, SQ),
+        brachylog_prime_decomposition_2(Q, SQ, D, [D|L], LF);
+        D1 #= D + 2,
+        (   D1 #> SN ->
+            LF = [N|L]
+        ;   brachylog_prime_decomposition_2(N, SN, D1, L, LF)
+        )
+    ).
+
+brachylog_prime_decomposition_append_integer([], []).
+brachylog_prime_decomposition_append_integer([H|T], ['integer':H|T2]) :-
+    brachylog_prime_decomposition_append_integer(T, T2).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_FACTORIAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_factorial_reversed(S, I, O) :-
+    brachylog_factorial(S, O, I).
+brachylog_factorial('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_factorial('integer':I, Arg, Output).
+brachylog_factorial('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_factorial('integer':I, Arg, Output).
+brachylog_factorial('default', 'integer':N, 'integer':F) :-
+    brachylog_factorial_(N, 0, 1, F).
+
+brachylog_factorial_(N, I, N0, F) :-
+    F #> 0,
+    N #>= 0,
+    I #>= 0,
+    I #=< N,
+    N0 #> 0,
+    N0 #=< F,
+    if_(I #> 2,
+        (   F #> N,
+            if_(===(N, I, N0, F, T1),
+                if_(T1 = true,
+                    N0 = F,
+                    N = I
+                ),
+                (   J #= I + 1,
+                    N1 #= N0*J,
+                    predicates:brachylog_factorial_(N, J, N1, F)
+                )
+            )
+        ),
+        if_(N = I,
+            N0 = F,
+            (   J #= I + 1,
+                N1 #= N0*J,
+                predicates:brachylog_factorial_(N, J, N1, F)
+            )
+        )
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_GROUPS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_groups_reversed(S, I, O) :-
+    brachylog_groups(S, O, I).
+brachylog_groups('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_groups('integer':I, Arg, Output).
+brachylog_groups('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_groups('integer':I, Arg, Output).
+brachylog_groups('default', Input, Output) :-
+    I in 1..sup,
+    brachylog_groups('integer':I, Input, Output).
+brachylog_groups('integer':I, 'string':Input, Output) :-
+    brachylog_groups('integer':I, Input, S),
+    maplist(prepend_string, S, Output).
+brachylog_groups('integer':I, 'integer':Input, Output) :-
+    H #\= 0,
+    integer_value('integer':_:[H|T], Input),
+    brachylog_groups('integer':I, [H|T], S),
+    maplist(brachylog_groups_ints, S, Output).
+brachylog_groups('integer':I, Input, Output) :-
+    maplist(is_brachylog_list, [Input, Output]),
+    brachylog_groups(I, [], Input, Output).
+
+brachylog_groups(_, [H|T], [], [RL]) :-
+    reverse([H|T], RL).
+brachylog_groups(I, L, Input, [RL|T2]) :-
+    length(L, I),
+    reverse(L, RL),
+    brachylog_groups(I, [], Input, T2).
+brachylog_groups(I, L, [H|T], Output) :-
+    J #< I,
+    J #>= 0,
+    length(L, J),
+    brachylog_groups(I, [H|L], T, Output).
+
+brachylog_groups_ints(I, 'integer':O) :-
+    integer_value('integer':'positive':I, O).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_MATRIX
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_matrix_reversed(S, I, O) :-
+    brachylog_matrix(S, O, I).
+brachylog_matrix('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_matrix('integer':I, Arg, Output).
+brachylog_matrix('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_matrix('integer':I, Arg, Output).
+brachylog_matrix('default', M, M) :-
+    L in 0..sup,
+    brachylog_matrix('integer':L, M, M).
+brachylog_matrix('integer':L, M, M) :-
+    length(M, L),
+    maplist(length_(L), M).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_NEGATE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_negate_reversed(S, I, O) :-
+    brachylog_negate(S, O, I).
+brachylog_negate('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_negate('integer':I, Arg, Output).
+brachylog_negate('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_negate('integer':I, Arg, Output).
+brachylog_negate('default', 'integer':I, 'integer':J) :-
+    J #= -I.
+brachylog_negate('default', 'float':I, 'float':J) :-
+    nonvar(I),
+    J is -I.
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_PRIME
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_prime_reversed(S, I, O) :-
+    brachylog_prime(S, O, I).
+brachylog_prime('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_prime('integer':I, Arg, Output).
+brachylog_prime('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_prime('integer':I, Arg, Output).
+brachylog_prime('default', 'integer':N, 'integer':N) :-
+    clpfd:make_propagator(prime(N), Prop),
+    clpfd:init_propagator(N, Prop),
+    clpfd:trigger_once(Prop).
+
+clpfd:run_propagator(prime(N), MState) :-
+    (   nonvar(N) ->
+        clpfd:kill(MState),
+        check_prime(N)
+    ;   clpfd:fd_get(N, ND, NL, NU, NPs),
+        clpfd:cis_max(NL, n(2), NNL),
+        clpfd:update_bounds(N, ND, NPs, NL, NU, NNL, NU)
+    ).
+
+:- if(current_predicate(crypto_is_prime/2)).
+probably_prime(P) :- crypto_is_prime(P, []).
+:- else.
+probably_prime(_).
+:- endif.
+
+check_prime(N) :-
+    (   N = 2 ->
+        true
+    ;   N #> 2,
+        probably_prime(N),
+        ceiled_square_root(N, SN),
+        check_prime_1(N, SN, 2, [], [_])
+    ).
+
+check_prime_1(1, _, _, L, L) :- !.
+check_prime_1(N, SN, D, L, LF) :-
+    (   0 #= N mod D ->
+        false
+    ;   D1 #= D+1,
+        (   D1 #> SN ->
+            LF = [N|L]
+        ;   check_prime_2(N, SN, D1, L, LF)
+        )
+    ).
+
+check_prime_2(1, _, _, L, L) :- !.
+check_prime_2(N, SN, D, L, LF) :-
+    (   0 #= N mod D -> false
+    ;   D1 #= D+2,
+        (   D1 #> SN ->
+            LF = [N|L]
+        ;   check_prime_2(N, SN, D1, L, LF)
+        )
+).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_RANDOM_NUMBER
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_random_number_reversed(S, I, O) :-
+    brachylog_random_number(S, O, I).
+brachylog_random_number('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_random_number('integer':I, Arg, Output).
+brachylog_random_number('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_random_number('integer':I, Arg, Output).
+brachylog_random_number('default', 'integer':I, 'integer':R) :-
+    brachylog_random_number(['integer':0,'integer':I], 'integer':R).
+brachylog_random_number('default', 'float':I, 'float':R) :-
+    brachylog_random_number(['float':0.0,'float':I], 'float':R).
+brachylog_random_number('integer':1, _, 'float':R) :-
+    brachylog_random_number(['float':0, 'float':1], 'float':R).
+brachylog_random_number('integer':2, [A,B], R) :-
+    brachylog_random_number([A,B], R).
+
+brachylog_random_number(['integer':I,'integer':J], 'integer':R) :-
+    brachylog_label('default', ['integer':I,'integer':J], _),
+    (   I #=< J ->
+        random_between(I, J, R)
+    ;   random_between(J, I, R)
+    ).
+brachylog_random_number(['float':I,'float':J], 'float':R) :-
+    random(K),
+    (   I =< J ->
+        R is I + K*(J - I)
+    ;   R is J + K*(I - J)
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_SIGN
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_sign_reversed(S, I, O) :-
+    brachylog_sign(S, O, I).
+brachylog_sign('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_sign('integer':I, Arg, Output).
+brachylog_sign('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_sign('integer':I, Arg, Output).
+brachylog_sign('default', 'integer':I, 'integer':S) :-
+    (   I = 0,
+        S = 0
+    ;   I #\= 0,
+        S in -1\/1,
+        S #= abs(I) // I
+    ).
+brachylog_sign('default', 'float':F, 'integer':S) :-
+    nonvar(F),
+    (   F =:= 0.0 -> S = 0
+    ;   F > 0.0 -> S = 1
+    ;   F < 0.0 -> S = -1
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_TO_STRING
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_to_string_reversed(S, I, O) :-
+    brachylog_to_string(S, O, I).
+brachylog_to_string('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_to_string('integer':I, Arg, Output).
+brachylog_to_string('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_to_string('integer':I, Arg, Output).
+brachylog_to_string('default', 'integer':I, 'string':S) :-
+    brachylog_label('default', 'integer':I, 'integer':I),
+    atom_number(A, I),
+    atom_chars(A, S).
+brachylog_to_string('default', 'float':F, 'string':S) :-
+    atom_number(A, F),
+    atom_chars(A, S).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_CARTESIAN_PRODUCT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_cartesian_product_reversed(S, I, O) :-
+    brachylog_cartesian_product(S, O, I).
+brachylog_cartesian_product('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_cartesian_product('integer':I, Arg, Output).
+brachylog_cartesian_product('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_cartesian_product('integer':I, Arg, Output).
+brachylog_cartesian_product('default', Input, Output) :-
+    findall(L, brachylog_meta_map('ignore', 'default', brachylog_in, 'default', Input, L), Output).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_LABEL
+
+   Credits to Markus Triska
+   See: http://codereview.stackexchange.com/questions/129924/clpfd-labeling-on-possibly-infinite-domains/129945#129945
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_label_reversed(S, I, O) :-
+    brachylog_label(S, O, I).
+brachylog_label('first', ['integer':I|Input], Output) :-
+    (   Input = [Arg] -> true
+    ;   Input = Arg
+    ),
+    brachylog_label('integer':I, Arg, Output).
+brachylog_label('last', Input, Output) :-
+    reverse(Input, ['integer':I|T]),
+    (   T = [Arg] -> true
+    ;   reverse(T, Arg)
+    ),
+    brachylog_label('integer':I, Arg, Output).
+brachylog_label('default', Input, Output) :-
+    brachylog_label('integer':0, Input, Output).
+brachylog_label('integer':0, 'integer':Z, 'integer':Z) :-
+    unsafe_indomain(Z).
+brachylog_label('integer':0, Z, Z) :-
+    is_brachylog_list(Z),
+    maplist(brachylog_label('integer':0), Z, _).
+brachylog_label('integer':1, 'integer':Z, 'integer':Z) :-
+    get_time(T),
+    T2 is ceil(1000000 * T),
+    labeling([random_value(T2)], [Z]).
+brachylog_label('integer':1, Z, Z) :-
+    is_brachylog_list(Z),
+    get_time(T),
+    T2 is ceil(1000000 * T),
+    labeling([random_value(T2)], Z).
+
+unsafe_indomain(X) :-
+    fd_inf(X, Inf0),
+    fd_sup(X, Sup0),
+    maplist(limit_pure, [Inf0,Sup0], [Inf,Sup]),
+    unsafe_indomain_(Inf, Sup, X).
+
+limit_pure(inf, inf) :- !.
+limit_pure(sup, sup) :- !.
+limit_pure(N, n(N))  :- !.
+
+unsafe_indomain_(inf, Sup, X) :-
+    infinite_down(Sup, X).
+unsafe_indomain_(n(Low), Sup, X) :-
+    unsafe_up_(Sup, Low, X).
+
+infinite_down(sup, X) :-
+    (   X = 0
+    ;   abs(X) #= abs(N),
+        positive_integer(N),
+        ( X #= N ; X #= -N )
+    ).
+infinite_down(n(Up), X ) :-
+    (   between(0, Up, X)
+    ;   abs(X) #= abs(N),
+        positive_integer(N),
+        X #= -N
+    ).
+
+unsafe_up_(sup, Low, X) :-
+    (   between(Low, 0, X)
+    ;   positive_integer(X)
+    ).
+unsafe_up_(n(Up), Low, X) :- between(Low, Up, X).
+
+% See: http://stackoverflow.com/a/39259871/2554145
+positive_integer(I) :-
+    I #> 0,
+    (   var(I) ->
+        fd_inf(I, Inf),
+        (   I #= Inf
+        ;   I #\= Inf,
+            positive_integer(I)
+        )
+    ;   true
+    ).
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/brachylog/brachylog/Brachylog-master/src/symbols.pl	Tue Jul 16 21:39:11 2019 +0000
@@ -0,0 +1,215 @@
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+____            ____
+\   \          /   /
+ \   \  ____  /   /
+  \   \/    \/   /
+   \     /\     /     BRACHYLOG       
+    \   /  \   /      A terse declarative logic programming language
+    /   \  /   \    
+   /     \/     \     Written by Julien Cumin - 2017
+  /   /\____/\   \    https://github.com/JCumin/Brachylog
+ /   /  ___   \   \
+/___/  /__/    \___\
+     
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+
+:- module(symbols, [token_predicate/2,
+                    token_variable/2,
+                    token_metapredicate/2
+                   ]).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   TOKEN_PREDICATE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+token_predicate('≤', 'brachylog_lessequal').
+token_predicate('≥', 'brachylog_greaterequal').
+token_predicate('∈', 'brachylog_contains').
+token_predicate('∋', 'brachylog_in').
+token_predicate('⊆', 'brachylog_superset').
+token_predicate('⊇', 'brachylog_subset').
+token_predicate('↔', 'brachylog_reverse').
+token_predicate('↰', 'brachylog_call_predicate').
+token_predicate('↺', 'brachylog_circular_permute_counterclockwise').
+token_predicate('↻', 'brachylog_circular_permute_clockwise').
+token_predicate('√', 'brachylog_root').
+token_predicate('⌉', 'brachylog_ceil').
+token_predicate('⌋', 'brachylog_floor').
+token_predicate('⟦', 'brachylog_range_ascending').
+token_predicate('⟧', 'brachylog_range_descending').
+token_predicate('ℕ', 'brachylog_natural_integer').
+token_predicate('ℤ', 'brachylog_integer').
+token_predicate('ℝ', 'brachylog_float').
+token_predicate('≠', 'brachylog_different').
+token_predicate('≡', 'brachylog_identity').
+token_predicate('÷', 'brachylog_integer_division').
+token_predicate('×', 'brachylog_multiply').
+token_predicate('%', 'brachylog_modulo').
+token_predicate('*', 'brachylog_exp').
+token_predicate('+', 'brachylog_plus').
+token_predicate('-', 'brachylog_minus').
+token_predicate('/', 'brachylog_divide').
+token_predicate('<', 'brachylog_less').
+token_predicate('=', 'brachylog_equal').
+token_predicate('>', 'brachylog_greater').
+token_predicate('\\', 'brachylog_transpose').
+token_predicate('^', 'brachylog_power').
+token_predicate('≜', 'brachylog_label').
+
+token_predicate('a', 'brachylog_adfix').
+token_predicate('b', 'brachylog_behead').
+token_predicate('c', 'brachylog_concatenate').
+token_predicate('d', 'brachylog_duplicates').
+token_predicate('e', '').
+token_predicate('f', 'brachylog_factors').
+token_predicate('g', 'brachylog_group').
+token_predicate('h', 'brachylog_head').
+token_predicate('i', 'brachylog_index').
+token_predicate('j', 'brachylog_juxtapose').
+token_predicate('k', 'brachylog_knife').
+token_predicate('l', 'brachylog_length').
+token_predicate('m', '').
+token_predicate('n', '').
+token_predicate('o', 'brachylog_order').
+token_predicate('p', 'brachylog_permute').
+token_predicate('q', '').
+token_predicate('r', '').
+token_predicate('s', 'brachylog_substring').
+token_predicate('t', 'brachylog_tail').
+token_predicate('u', '').
+token_predicate('v', '').
+token_predicate('w', 'brachylog_write').
+token_predicate('x', 'brachylog_xterminate').
+token_predicate('y', '').
+token_predicate('z', 'brachylog_zip').
+
+token_predicate('ạ', 'brachylog_to_codes').
+token_predicate('ḅ', 'brachylog_blocks').
+token_predicate('ḍ', 'brachylog_dichotomize').
+token_predicate('ẹ', 'brachylog_elements').
+token_predicate('ḥ', '').
+token_predicate('ị', 'brachylog_to_number').
+token_predicate('ḳ', '').
+token_predicate('ḷ', 'brachylog_lowercase').
+token_predicate('ṃ', '').
+token_predicate('ṇ', 'brachylog_split_lines').
+token_predicate('ọ', 'brachylog_occurences').
+token_predicate('ṛ', 'brachylog_random_element').
+token_predicate('ṣ', 'brachylog_shuffle').
+token_predicate('ṭ', '').
+token_predicate('ụ', 'brachylog_uppercase').
+token_predicate('ṿ', '').
+token_predicate('ẉ', 'brachylog_writeln').
+token_predicate('ỵ', '').
+token_predicate('ẓ', '').
+
+token_predicate('ȧ', 'brachylog_absolute_value').
+token_predicate('ḃ', 'brachylog_base').
+token_predicate('ċ', 'brachylog_coerce').
+token_predicate('ḋ', 'brachylog_prime_decomposition').
+token_predicate('ė', '').
+token_predicate('ḟ', 'brachylog_factorial').
+token_predicate('ġ', 'brachylog_groups').
+token_predicate('ḣ', '').
+token_predicate('ṁ', 'brachylog_matrix').
+token_predicate('ṅ', 'brachylog_negate').
+token_predicate('ȯ', '').
+token_predicate('ṗ', 'brachylog_prime').
+token_predicate('ṙ', 'brachylog_random_number').
+token_predicate('ṡ', 'brachylog_sign').
+token_predicate('ṫ', 'brachylog_to_string').
+token_predicate('ẇ', '').
+token_predicate('ẋ', 'brachylog_cartesian_product').
+token_predicate('ẏ', '').
+token_predicate('ż', '').
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   TOKEN_VARIABLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+token_variable('Ạ', '\'string\':[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]').
+token_variable('Ḅ', '\'string\':[b,c,d,f,g,h,j,k,l,m,n,p,q,r,s,t,v,w,x,y,z]').
+%token_variable('', '').
+token_variable('Ḍ', '\'string\':[b,c,d,f,g,h,j,k,l,m,n,p,q,r,s,t,v,w,x,z]').
+token_variable('Ẹ', '\'string\':[]').
+%token_variable('', '').
+%token_variable('', '').
+token_variable('Ḥ', '\'string\':[\'H\',e,l,l,o,\',\',\' \',\'W\',o,r,l,d,\'!\']').
+token_variable('Ị', '\'string\':[\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\']').
+%token_variable('', '').
+token_variable('Ḳ', '').
+token_variable('Ḷ', '\'string\':[\'\n\']').
+token_variable('Ṃ', '').
+token_variable('Ṇ', '\'string\':[\'A\',\'B\',\'C\',\'D\',\'E\',\'F\',\'G\',\'H\',\'I\',\'J\',\'K\',\'L\',\'M\',\'N\',\'O\',\'P\',\'Q\',\'R\',\'S\',\'T\',\'U\',\'V\',\'W\',\'X\',\'Y\',\'Z\',a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9]').
+token_variable('Ọ', '').
+%token_variable('', '').
+%token_variable('', '').
+token_variable('Ṛ', '').
+token_variable('Ṣ', '\'string\':[\' \']').
+token_variable('Ṭ', '\'string\':[\' \',\'!\',\'"\',\'#\',\'$\',\'%\',\'&\',\'\\\'\',\'(\',\')\',\'*\',\'+\',\',\',\'-\',\'.\',\'/\',\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\':\',\';\',\'<\',\'=\',\'>\',\'?\',\'@\',\'A\',\'B\',\'C\',\'D\',\'E\',\'F\',\'G\',\'H\',\'I\',\'J\',\'K\',\'L\',\'M\',\'N\',\'O\',\'P\',\'Q\',\'R\',\'S\',\'T\',\'U\',\'V\',\'W\',\'X\',\'Y\',\'Z\',\'[\',\'\\\\\',\']\',\'^\',\'_\',\'`\',\'a\',\'b\',\'c\',\'d\',\'e\',\'f\',\'g\',\'h\',\'i\',\'j\',\'k\',\'l\',\'m\',\'n\',\'o\',\'p\',\'q\',\'r\',\'s\',\'t\',\'u\',\'v\',\'w\',\'x\',\'y\',\'z\',\'{\',\'|\',\'}\',\'~\']').
+token_variable('Ụ', '').
+token_variable('Ṿ', '\'string\':[a,e,i,o,u]').
+token_variable('Ẉ', '\'string\':[a,e,i,o,u,y]').
+%token_variable('', '').
+token_variable('Ỵ', '').
+token_variable('Ẓ', '\'string\':[z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a]').
+
+token_variable('Ȧ', 'ConstraintA').
+token_variable('Ḃ', 'ConstraintB').
+token_variable('Ċ', 'ConstraintC').
+token_variable('Ḋ', 'ConstraintD').
+token_variable('Ė', 'ConstraintE').
+token_variable('Ḟ', 'ConstraintF').
+token_variable('Ġ', 'ConstraintG').
+token_variable('Ḣ', 'ConstraintH').
+token_variable('İ', 'ConstraintI').
+%token_variable('', 'ConstraintJ').
+%token_variable('', 'ConstraintK').
+%token_variable('', 'ConstraintL').
+token_variable('Ṁ', 'ConstraintM').
+token_variable('Ṅ', 'ConstraintN').
+token_variable('Ȯ', 'ConstraintO').
+token_variable('Ṗ', 'ConstraintP').
+%token_variable('', 'ConstraintQ').
+token_variable('Ṙ', 'ConstraintR').
+token_variable('Ṡ', 'ConstraintS').
+token_variable('Ṫ', 'ConstraintT').
+%token_variable('', 'ConstraintU').
+%token_variable('', 'ConstraintV').
+token_variable('Ẇ', 'ConstraintW').
+token_variable('Ẋ', 'ConstraintX').
+token_variable('Ẏ', 'ConstraintY').
+token_variable('Ż', 'ConstraintZ').
+
+token_variable('π', '\'float\':3.14159265359').
+token_variable('φ', '\'float\':1.61803398875').
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   TOKEN_METAPREDICATE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+token_metapredicate('ᵃ', 'brachylog_meta_accumulate').
+token_metapredicate('ᵇ', 'brachylog_meta_bagof').
+token_metapredicate('ᶜ', 'brachylog_meta_count').
+token_metapredicate('ᵈ', 'brachylog_meta_declare').
+token_metapredicate('ᵉ', 'brachylog_meta_existence').
+token_metapredicate('ᶠ', 'brachylog_meta_find').
+token_metapredicate('ᵍ', 'brachylog_meta_groupby').
+token_metapredicate('ʰ', 'brachylog_meta_head').
+token_metapredicate('ⁱ', 'brachylog_meta_iterate').
+token_metapredicate('ʲ', '').
+token_metapredicate('ᵏ', '').
+token_metapredicate('ˡ', 'brachylog_meta_leftfold').
+token_metapredicate('ᵐ', 'brachylog_meta_map').
+token_metapredicate('ⁿ', 'brachylog_meta_nonexistence').
+token_metapredicate('ᵒ', 'brachylog_meta_orderby').
+token_metapredicate('ᵖ', '').
+token_metapredicate('ʳ', 'brachylog_meta_rightfold').
+token_metapredicate('ˢ', 'brachylog_meta_select').
+token_metapredicate('ᵗ', 'brachylog_meta_tail').
+token_metapredicate('ᵘ', 'brachylog_meta_unique').
+token_metapredicate('ᵛ', 'brachylog_meta_verify').
+token_metapredicate('ʷ', '').
+token_metapredicate('ˣ', '').
+token_metapredicate('ʸ', '').
+token_metapredicate('ᶻ', 'brachylog_meta_zip').
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/brachylog/brachylog/Brachylog-master/src/tests.pl	Tue Jul 16 21:39:11 2019 +0000
@@ -0,0 +1,648 @@
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+____            ____
+\   \          /   /
+ \   \  ____  /   /
+  \   \/    \/   /
+   \     /\     /     BRACHYLOG       
+    \   /  \   /      A terse declarative logic programming language
+    /   \  /   \    
+   /     \/     \     Written by Julien Cumin - 2017
+  /   /\____/\   \    https://github.com/JCumin/Brachylog
+ /   /  ___   \   \
+/___/  /__/    \___\
+     
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+
+:- consult(brachylog).
+
+
+:- begin_tests(predicates).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_LESSEQUAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('lessequal_1', all(X == [2])) :-
+    run_from_atom('1≤2', _, X).
+test('lessequal_2', all(X == [2])) :-
+    run_from_atom('_1≤2', _, X).
+test('lessequal_3', all(X == [0])) :-
+    run_from_atom('0≤0', _, X).
+test('lessequal_4', all(X == [13])) :-
+    run_from_atom('13≤13', _, X).
+test('lessequal_5', all(X == [-42])) :-
+    run_from_atom('_42≤_42', _, X).
+test('lessequal_6', all(X == [[1,2,3]])) :-
+    run_from_atom('[1,2,3]≤₁', _, X).
+test('lessequal_7', all(X == [[-1,0,1]])) :-
+    run_from_atom('[_1,0,1]≤₁', _, X).
+test('lessequal_8', all(X == [[-42,-23,-16]])) :-
+    run_from_atom('[_42,_23,_16]≤₁', _, X).
+test('lessequal_9', all(X == [[1,1,3],[1,2,3],[1,3,3]])) :-
+    run_from_atom('[1,I,3]≤₁', _, X).
+test('lessequal_10', fail) :-
+    run_from_atom('2≤1', _, _).
+test('lessequal_11', fail) :-
+    run_from_atom('2≤_1', _, _).
+test('lessequal_12', fail) :-
+    run_from_atom('[1,3,2]≤₁', _, _).
+test('lessequal_13', fail) :-
+    run_from_atom('[1,I,_1]≤₁', _, _).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_GREATEREQUAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('greaterequal_1', all(X == [1])) :-
+    run_from_atom('2≥1', _, X).
+test('greaterequal_2', all(X == [-1])) :-
+    run_from_atom('2≥_1', _, X).
+test('greaterequal_3', all(X == [0])) :-
+    run_from_atom('0≥0', _, X).
+test('greaterequal_4', all(X == [13])) :-
+    run_from_atom('13≥13', _, X).
+test('greaterequal_5', all(X == [-42])) :-
+    run_from_atom('_42≥_42', _, X).
+test('greaterequal_6', all(X == [[3,2,1]])) :-
+    run_from_atom('[3,2,1]≥₁', _, X).
+test('greaterequal_7', all(X == [[1,0,-1]])) :-
+    run_from_atom('[1,0,_1]≥₁', _, X).
+test('greaterequal_8', all(X == [[-16,-23,-42]])) :-
+    run_from_atom('[_16,_23,_42]≥₁', _, X).
+test('greaterequal_9', all(X == [[3,1,1],[3,2,1],[3,3,1]])) :-
+    run_from_atom('[3,I,1]≥₁', _, X).
+test('greaterequal_10', fail) :-
+    run_from_atom('1≥2', _, _).
+test('greaterequal_11', fail) :-
+    run_from_atom('_1≥2', _, _).
+test('greaterequal_12', fail) :-
+    run_from_atom('[1,3,2]≥₁', _, _).
+test('greaterequal_13', fail) :-
+    run_from_atom('[_1,I,1]≥₁', _, _).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_CONTAINS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+% Nothing, same code as brachylog_in
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_IN
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('in_1', fail) :-
+    run_from_atom('∋', [], _).
+test('in_2', fail) :-
+    run_from_atom('∋', "", _).
+test('in_3', all(X == [0])) :-
+    run_from_atom('∋', 0, X).
+test('in_4', all(X == [7])) :-
+    run_from_atom('∋', 7, X).
+test('in_5', all(X == [7])) :-
+    run_from_atom('∋', '_7', X).
+test('in_6', all(X == [1,0,2,3])) :-
+    run_from_atom('∋', 1023, X).
+test('in_7', all(X == [1,0,2,3])) :-
+    run_from_atom('∋', [1,0,2,3], X).
+test('in_8', all(X == [1023,"test"])) :-
+    run_from_atom('∋', [1023,"test"], X).
+test('in_9', all(X == ["test"])) :-
+    run_from_atom('∋', ["test"], X).
+test('in_10', all(X == ["t","e","s","t"])) :-
+    run_from_atom('∋', "test", X).
+test('in_11', all(X == [1])) :-
+    run_from_atom('∋₀', 1023, X).
+test('in_12', all(X == ["t"])) :-
+    run_from_atom('∋₀', "test", X).
+test('in_13', all(X == [1023])) :-
+    run_from_atom('∋₀', [1023,"test"], X).
+test('in_14', all(X == [0])) :-
+    run_from_atom('∋₁', 1023, X).
+test('in_15', fail) :-
+    run_from_atom('∋₄', 1023, _).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_SUPERSET
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+% Nothing, same code as brachylog_subset
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_SUBSET
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('subset_1', all(X == [[]])) :-
+    run_from_atom('⊇', [], X).
+test('subset_2', all(X == [""])) :-
+    run_from_atom('⊇', "", X).
+test('subset_3', all(X == [0])) :-
+    run_from_atom('⊇', 0, X).
+test('subset_4', all(X == [7])) :-
+    run_from_atom('⊇', 7, X).
+test('subset_5', all(X == [123,12,13,23,1,2,3])) :-
+    run_from_atom('⊇', 123, X).
+test('subset_6', all(X == [[1,2,3],[1,2],[1,3],[2,3],[1],[2],[3],[]])) :-
+    run_from_atom('⊇', [1,2,3], X).
+test('subset_7', all(X == ["test","tes","tet","tst","est","te","ts","tt","es","et","st","t","e","s","t",""])) :-
+    run_from_atom('⊇', "test", X).
+test('subset_8', fail) :-
+    run_from_atom('⊇', [1,2,3], [1,5]).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_REVERSE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('reverse_1', all(X == [0])) :-
+    run_from_atom('↔', 0, X).
+test('reverse_2', all(X == [[]])) :-
+    run_from_atom('↔', [], X).
+test('reverse_3', all(X == [""])) :-
+    run_from_atom('↔', "", X).
+test('reverse_4', all(X == [321])) :-
+    run_from_atom('↔', 123, X).
+test('reverse_5', all(X == [321])) :-
+    run_from_atom('↔', 1230, X).
+test('reverse_6', all(X == ["tset"])) :-
+    run_from_atom('↔', "test", X).
+test('reverse_7', all(X == [[0,3,2,1]])) :-
+    run_from_atom('↔', [1,2,3,0], X).
+test('reverse_8', all(X == [[1,2,3,2,1]])) :-
+    run_from_atom('↔?', '[1,2,3,I,J]', X).
+test('reverse_9', all(X == [["a","b","c","b","a"]])) :-
+    run_from_atom('↔?', '["a","b","c",I,J]', X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_CALL_PREDICATE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+% TODO
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_CIRCULAR_PERMUTE_COUNTERCLOCKWISE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('circular_permute_counterclockwise_1', all(X == [[]])) :-
+    run_from_atom('↺', [], X).
+test('circular_permute_counterclockwise_2', all(X == [""])) :-
+    run_from_atom('↺', "", X).
+test('circular_permute_counterclockwise_3', all(X == [0])) :-
+    run_from_atom('↺', 0, X).
+test('circular_permute_counterclockwise_4', all(X == [231])) :-
+    run_from_atom('↺', 123, X).
+test('circular_permute_counterclockwise_5', all(X == ["estt"])) :-
+    run_from_atom('↺', "test", X).
+test('circular_permute_counterclockwise_6', all(X == [[2,"test",1]])) :-
+    run_from_atom('↺', [1,2,"test"], X).
+test('circular_permute_counterclockwise_7', all(X == [[4,5,6,1,2,3]])) :-
+    run_from_atom('↺₃', [1,2,3,4,5,6], X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_CIRCULAR_PERMUTE_CLOCKWISE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('circular_permute_clockwise_1', all(X == [[]])) :-
+    run_from_atom('↻', [], X).
+test('circular_permute_clockwise_2', all(X == [""])) :-
+    run_from_atom('↻', "", X).
+test('circular_permute_clockwise_3', all(X == [0])) :-
+    run_from_atom('↻', 0, X).
+test('circular_permute_clockwise_4', all(X == [312])) :-
+    run_from_atom('↻', 123, X).
+test('circular_permute_clockwise_5', all(X == ["ttes"])) :-
+    run_from_atom('↻', "test", X).
+test('circular_permute_clockwise_6', all(X == [["test",1,2]])) :-
+    run_from_atom('↻', [1,2,"test"], X).
+test('circular_permute_clockwise_7', all(X == [[4,5,6,1,2,3]])) :-
+    run_from_atom('↻₃', [1,2,3,4,5,6], X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_ROOT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('root_1', all(X == [-1,1])) :-
+    run_from_atom('√', 1, X).
+test('root_2', all(X == [0])) :-
+    run_from_atom('√', 0, X).
+test('root_3', all(X == [-12,12])) :-
+    run_from_atom('√', 144, X).
+test('root_4', all(X == [2.23606797749979])) :-
+    run_from_atom('√', 5, X).
+test('root_5', throws(_)) :-
+    run_from_atom('√', '_5', _).
+test('root_6', all(X == [2.04939015319192])) :-
+    run_from_atom('√', 4.2, X).
+test('root_7', all(X == [3])) :-
+    run_from_atom('√₃', 27, X).
+test('root_8', all(X == [-3])) :-
+    run_from_atom('√₃', '_27', X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_CEIL
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('ceil_1', fail) :-
+    run_from_atom('⌉', [], _).
+test('ceil_2', all(X == [3])) :-
+    run_from_atom('⌉', [1,2,3], X).
+test('ceil_3', all(X == [-5])) :-
+    run_from_atom('⌉', '[_9,_5,_13]', X).
+test('ceil_4', all(X == ["test"])) :-
+    run_from_atom('⌉', ["test",2,3], X).
+test('ceil_5', all(X == ["z"])) :-
+    run_from_atom('⌉', ["test","z"], X).
+test('ceil_6', all(X == [123])) :-
+    run_from_atom('⌉₁', 123, X).
+test('ceil_7', all(X == [124])) :-
+    run_from_atom('⌉₁', 123.45, X).
+test('ceil_8', all(X == [-123])) :-
+    run_from_atom('⌉₁', '_123.45', X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_FLOOR
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('floor_1', fail) :-
+    run_from_atom('⌋', [], _).
+test('floor_2', all(X == [1])) :-
+    run_from_atom('⌋', [1,2,3], X).
+test('floor_3', all(X == [-13])) :-
+    run_from_atom('⌋', '[_9,_5,_13]', X).
+test('floor_4', all(X == [2])) :-
+    run_from_atom('⌋', ["test",2,3], X).
+test('floor_5', all(X == ["test"])) :-
+    run_from_atom('⌋', ["test","z"], X).
+test('floor_6', all(X == [123])) :-
+    run_from_atom('⌋₁', 123, X).
+test('floor_7', all(X == [123])) :-
+    run_from_atom('⌋₁', 123.45, X).
+test('floor_8', all(X == [-124])) :-
+    run_from_atom('⌋₁', '_123.45', X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_RANGE_ASCENDING
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('range_ascending_1', all(X == [[0]])) :-
+    run_from_atom('⟦', 0, X).
+test('range_ascending_2', all(X == [[0,1,2,3,4,5]])) :-
+    run_from_atom('⟦', 5, X).
+test('range_ascending_3', all(X == [[-5,-4,-3,-2,-1,0]])) :-
+    run_from_atom('⟦', '_5', X).
+test('range_ascending_4', all(X == [[1,2,3,4,5]])) :-
+    run_from_atom('⟦₁', 5, X).
+test('range_ascending_5', all(X == [[9,10,11,12,13]])) :-
+    run_from_atom('⟦₂', [9,13], X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_RANGE_DESCENDING
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('range_descending_1', all(X == [[0]])) :-
+    run_from_atom('⟧', 0, X).
+test('range_descending_2', all(X == [[5,4,3,2,1,0]])) :-
+    run_from_atom('⟧', 5, X).
+test('range_descending_3', all(X == [[0,-1,-2,-3,-4,-5]])) :-
+    run_from_atom('⟧', '_5', X).
+test('range_descending_4', all(X == [[5,4,3,2,1]])) :-
+    run_from_atom('⟧₁', 5, X).
+test('range_descending_5', all(X == [[13,12,11,10,9]])) :-
+    run_from_atom('⟧₂', [9,13], X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_NATURAL_INTEGER
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('natural_integer_1', all(X == [0])) :-
+    run_from_atom('ℕ', 0, X).
+test('natural_integer_2', all(X == [42])) :-
+    run_from_atom('ℕ', 42, X).
+test('natural_integer_3', fail) :-
+    run_from_atom('ℕ', "test", _).
+test('natural_integer_4', fail) :-
+    run_from_atom('ℕ', '_3', _).
+test('natural_integer_5', fail) :-
+    run_from_atom('ℕ', [1,2], _).
+test('natural_integer_6', fail) :-
+    run_from_atom('ℕ', 4.2, _).
+test('natural_integer_7', all(X == [42])) :-
+    run_from_atom('ℕ₄₂', 42, X).
+test('natural_integer_8', fail) :-
+    run_from_atom('ℕ₄₂', 41, _).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_INTEGER
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('integer_1', all(X == [0])) :-
+    run_from_atom('ℤ', 0, X).
+test('integer_2', all(X == [42])) :-
+    run_from_atom('ℤ', 42, X).
+test('integer_3', fail) :-
+    run_from_atom('ℤ', "test", _).
+test('integer_4', all(X == [-3])) :-
+    run_from_atom('ℤ', '_3', X).
+test('integer_5', fail) :-
+    run_from_atom('ℤ', [1,2], _).
+test('integer_6', fail) :-
+    run_from_atom('ℤ', 4.2, _).
+test('integer_7', all(X == [-42])) :-
+    run_from_atom('ℤ₄₂', '_42', X).
+test('integer_8', fail) :-
+    run_from_atom('ℤ₄₂', '_41', _).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_FLOAT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('float_1', all(X == [4.2])) :-
+    run_from_atom('ℝ', 4.2, X).
+test('float_2', all(X == [0.0])) :-
+    run_from_atom('ℝ', 0.0, X).
+test('float_3', all(X == [-4.2])) :-
+    run_from_atom('ℝ', '_4.2', X).
+test('float_4', fail) :-
+    run_from_atom('ℝ', 0, _).
+test('float_5', fail) :-
+    run_from_atom('ℝ', 42, _).
+test('float_6', all(X == [42])) :-
+    run_from_atom('ℝ₁', 42, X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_EMPTY
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('empty_1', nondet) :-
+    run_from_atom('∅', [], _).
+test('empty_2', nondet) :-
+    run_from_atom('∅', 0, _).
+test('empty_3', nondet) :-
+    run_from_atom('∅', "", _).
+test('empty_4', nondet) :-
+    run_from_atom('∅', 0.0, _).
+test('empty_5', fail) :-
+    run_from_atom('∅', [1], _).
+test('empty_6', fail) :-
+    run_from_atom('∅', 1, _).
+test('empty_7', fail) :-
+    run_from_atom('∅', "a", _).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_DIFFERENT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('different_1', all(X == [12345])) :-
+    run_from_atom('≠', 12345, X).
+test('different_1', fail) :-
+    run_from_atom('≠', 12344, _).
+test('different_1', all(X == [[1,2,3]])) :-
+    run_from_atom('≠', [1,2,3], X).
+test('different_1', fail) :-
+    run_from_atom('≠', [1,2,1], _).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_INTEGER_DIVISION
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('integer_division_1', all(X == [3])) :-
+    run_from_atom('÷', [6,2], X).
+test('integer_division_2', all(X == [3])) :-
+    run_from_atom('÷', [7,2], X).
+test('integer_division_3', all(X == [-3])) :-
+    run_from_atom('÷', '[_6,2]', X).
+test('integer_division_1', fail) :-
+    run_from_atom('÷', '[6,0]', _).
+test('integer_division_1', all(X == [0])) :-
+    run_from_atom('÷', '[0,_42]', X).
+test('integer_division_1', all(X == [3])) :-
+    run_from_atom('÷', [6.2,2], X).
+test('integer_division_1', all(X == [2])) :-
+    run_from_atom('÷₃', 6, X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_MULTIPLY
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('multiply_1', all(X == [1])) :-
+    run_from_atom('×', [], X).
+test('multiply_2', all(X == [12])) :-
+    run_from_atom('×', [6,2], X).
+test('multiply_3', all(X == [12])) :-
+    run_from_atom('×', [2,6], X).
+test('multiply_4', all(X == [-12])) :-
+    run_from_atom('×', '[_6,2]', X).
+test('multiply_5', all(X == [24])) :-
+    run_from_atom('×', [2,3,4], X).
+test('multiply_6', all(X == [0])) :-
+    run_from_atom('×', '[0,_42]', X).
+test('multiply_7', all(X == [12.4])) :-
+    run_from_atom('×', [6.2,2], X).
+test('multiply_8', all(X == [18])) :-
+    run_from_atom('×₃', 6, X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_MODULO
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('modulo_1', all(X == [1])) :-
+    run_from_atom('%', [4,3], X).
+test('modulo_2', all(X == [0])) :-
+    run_from_atom('%', [4,2], X).
+test('modulo_3', all(X == [4])) :-
+    run_from_atom('%', [42,19], X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_EXP
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('exp_1', all(X == [22026.465794806718])) :-
+    run_from_atom('*', 10, X).
+test('exp_2', all(X == [2.302585092994046])) :-
+    run_from_atom('*₁', 10, X).
+test('exp_3', all(X == [-0.8390715290764524])) :-
+    run_from_atom('*₂', 10, X).
+test('exp_4', all(X == [-0.5440211108893698])) :-
+    run_from_atom('*₃', 10, X).
+test('exp_5', all(X == [0.6483608274590866])) :-
+    run_from_atom('*₄', 10, X).
+test('exp_6', all(X == [1.0471975511965979])) :-
+    run_from_atom('*₅', 0.5, X).
+test('exp_7', all(X == [0.5235987755982989])) :-
+    run_from_atom('*₆', 0.5, X).
+test('exp_8', all(X == [1.4711276743037347])) :-
+    run_from_atom('*₇', 10, X).
+test('exp_9', all(X == [11013.232920103323])) :-
+    run_from_atom('*₈', 10, X).
+test('exp_10', all(X == [11013.232874703393])) :-
+    run_from_atom('*₉', 10, X).
+test('exp_11', all(X == [0.9999999958776927])) :-
+    run_from_atom('*₁₀', 10, X).
+test('exp_12', all(X == [2.993222846126381])) :-
+    run_from_atom('*₁₁', 10, X).
+test('exp_13', all(X == [2.99822295029797])) :-
+    run_from_atom('*₁₂', 10, X).
+test('exp_14', all(X == [0.5493061443340549])) :-
+    run_from_atom('*₁₃', 0.5, X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_PLUS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('plus_1', all(X == [3])) :-
+    run_from_atom('+', [1,2], X).
+test('plus_2', all(X == [2])) :-
+    run_from_atom('+', '[_3,5]', X).
+test('plus_3', all(X == [-5])) :-
+    run_from_atom('+', '[_3,_2]', X).
+test('plus_4', all(X == [21])) :-
+    run_from_atom('+', [1,2,3,4,5,6], X).
+test('plus_5', all(X == [4.6])) :-
+    run_from_atom('+', [1.2,3.4], X).
+test('plus_6', all(X == [13])) :-
+    run_from_atom('+', [13,0,0,0,0], X).
+test('plus_7', all(X == [67])) :-
+    run_from_atom('+₄₂', 25, X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_MINUS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('minus_1', all(X == [-1])) :-
+    run_from_atom('-', [1,2], X).
+test('minus_2', all(X == [-8])) :-
+    run_from_atom('-', '[_3,5]', X).
+test('minus_3', all(X == [2])) :-
+    run_from_atom('-', '[_1,_3]', X).
+test('minus_4', all(X == [-3])) :-
+    run_from_atom('-', [1,2,3,4,5,6], X).
+test('minus_5', all(X == [-2.2])) :-
+    run_from_atom('-', [1.2,3.4], X).
+test('minus_6', all(X == [13])) :-
+    run_from_atom('-', [13,0,0,0,0], X).
+test('minus_7', all(X == [-17])) :-
+    run_from_atom('-₄₂', 25, X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_DIVIDE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('divide_1', all(X == [0.5])) :-
+    run_from_atom('/', [1,2], X).
+test('divide_2', all(X == [3])) :-
+    run_from_atom('/', [6,2], X).
+test('divide_3', all(X == [-0.5])) :-
+    run_from_atom('/', '[1,_2]', X).
+test('divide_4', all(X == [0.1111111111111111])) :-
+    run_from_atom('/₁', 9, X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_LESS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('less_1', all(X == [2])) :-
+    run_from_atom('1<2', _, X).
+test('less_2', all(X == [2])) :-
+    run_from_atom('_1<2', _, X).
+test('less_3', fail) :-
+    run_from_atom('0<0', _, _).
+test('less_4', fail) :-
+    run_from_atom('13<13', _, _).
+test('less_5', fail) :-
+    run_from_atom('_42<_42', _, _).
+test('less_6', all(X == [[1,2,3]])) :-
+    run_from_atom('[1,2,3]<₁', _, X).
+test('less_7', all(X == [[-1,0,1]])) :-
+    run_from_atom('[_1,0,1]<₁', _, X).
+test('less_8', all(X == [[-42,-23,-16]])) :-
+    run_from_atom('[_42,_23,_16]<₁', _, X).
+test('less_9', all(X == [[1,2,3]])) :-
+    run_from_atom('[1,I,3]<₁', _, X).
+test('less_10', fail) :-
+    run_from_atom('2<1', _, _).
+test('less_11', fail) :-
+    run_from_atom('2<_1', _, _).
+test('less_12', fail) :-
+    run_from_atom('[1,3,2]<₁', _, _).
+test('less_13', fail) :-
+    run_from_atom('[1,I,_1]<₁', _, _).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_EQUAL
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('equal_1', all(X == [1111])) :-
+    run_from_atom('=', 1111, X).
+test('equal_2', all(X == [[]])) :-
+    run_from_atom('=', [], X).
+test('equal_3', all(X == [0])) :-
+    run_from_atom('=', 0, X).
+test('equal_4', all(X == [[42,42,42,42]])) :-
+    run_from_atom('=', '[X,Y,42,Z]', X).
+test('equal_5', fail) :-
+    run_from_atom('=', [1,1,1,2,1], _).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_GREATER
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('greater_1', all(X == [1])) :-
+    run_from_atom('2>1', _, X).
+test('greater_2', all(X == [-1])) :-
+    run_from_atom('2>_1', _, X).
+test('greater_3', fail) :-
+    run_from_atom('0>0', _, _).
+test('greater_4', fail) :-
+    run_from_atom('13>13', _, _).
+test('greater_5', fail) :-
+    run_from_atom('_42>_42', _, _).
+test('greater_6', all(X == [[3,2,1]])) :-
+    run_from_atom('[3,2,1]>₁', _, X).
+test('greater_7', all(X == [[1,0,-1]])) :-
+    run_from_atom('[1,0,_1]>₁', _, X).
+test('greater_8', all(X == [[-16,-23,-42]])) :-
+    run_from_atom('[_16,_23,_42]>₁', _, X).
+test('greater_9', all(X == [[3,2,1]])) :-
+    run_from_atom('[3,I,1]>₁', _, X).
+test('greater_10', fail) :-
+    run_from_atom('1>2', _, _).
+test('greater_11', fail) :-
+    run_from_atom('_1>2', _, _).
+test('greater_12', fail) :-
+    run_from_atom('[1,3,2]>₁', _, _).
+test('greater_13', fail) :-
+    run_from_atom('[_1,I,1]>₁', _, _).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_TRANSPOSE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('transpose_1', all(X == [[[1,4,7],[2,5,8],[3,6,9]]])) :-
+    run_from_atom('\\', [[1,2,3],[4,5,6],[7,8,9]], X).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_POWER
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+test('power_1', all(X == [8])) :-
+    run_from_atom('^', [2,3], X).
+test('power_2', all(X == [-8])) :-
+    run_from_atom('^', '[_2,3]', X).
+test('power_3', all(X == [1])) :-
+    run_from_atom('^', [1,50], X).
+test('power_4', all(X == [0])) :-
+    run_from_atom('^', [0,42], X).
+test('power_5', all(X == [1])) :-
+    run_from_atom('^', [7,0], X).
+test('power_6', all(X == [49])) :-
+    run_from_atom('^₂', 7, X).
+
+
+:- end_tests(predicates).
+
+
+% Useful templates
+test('_', all(X == [])) :-
+    run_from_atom('', _, X).
+
+test('_', fail) :-
+    run_from_atom('', _, _).
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/brachylog/brachylog/Brachylog-master/src/tokenize.pl	Tue Jul 16 21:39:11 2019 +0000
@@ -0,0 +1,341 @@
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+____            ____
+\   \          /   /
+ \   \  ____  /   /
+  \   \/    \/   /
+   \     /\     /     BRACHYLOG       
+    \   /  \   /      A terse declarative logic programming language
+    /   \  /   \    
+   /     \/     \     Written by Julien Cumin - 2017
+  /   /\____/\   \    https://github.com/JCumin/Brachylog
+ /   /  ___   \   \
+/___/  /__/    \___\
+     
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+
+:- module(tokenize, [tokenize/2]).
+
+:- use_module(symbols).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   TOKENIZE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+tokenize([], []).
+tokenize([' '|T], T2) :-
+    tokenize(T, T2).
+tokenize([Variable|T], ['variable':VariableName:'sup':Sup|T2]) :-
+    is_variable_character(Variable),
+    tokenize_variable([Variable|T], Rest, VariableName),
+    tokenize_superscript(Rest, Rest2, Sup),
+    tokenize(Rest2, T2).
+tokenize([Variable|T], ['variable':R|T2]) :-
+    (   is_variable_character_dot_above(Variable)
+    ->  token_variable(Variable, RealVariable),
+        tokenize_superscript(T, Rest, Sup),
+        R = RealVariable:'sup':Sup
+    ;   is_variable_character_dot_below(Variable)
+    ->  token_variable(Variable, R),
+        Rest = T
+    ),
+    tokenize(Rest, T2).
+tokenize([Variable|T], ['variable':RealVariable|T2]) :-
+    is_math_constant_character(Variable),
+    token_variable(Variable, RealVariable),
+    tokenize(T, T2).
+tokenize([H|T], ['variable':'Input':'sup':Sup|T2]) :-
+    is_input_character(H),
+    tokenize_superscript(T, Rest, Sup),
+    tokenize(Rest, T2).
+tokenize([H|T], ['variable':'Output':'sup':Sup|T2]) :-
+    is_output_character(H),
+    tokenize_superscript(T, Rest, Sup),
+    tokenize(Rest, T2).
+tokenize([Modifier,Predicate|T], ['predicate':PredName:Sub|T2]) :-
+    is_modifier_character(Modifier),
+    \+ (is_variable_character(Predicate)),
+    atomic_list_concat([Modifier,Predicate], Pred),
+    token_predicate(Pred, PredName),
+    tokenize_subscript(T, Rest, Sub),
+    tokenize(Rest, T2).
+tokenize([Predicate|T], ['predicate':PredName:Sub|T2]) :-
+    is_predicate_character(Predicate),
+    token_predicate(Predicate, PredName),
+    tokenize_subscript(T, Rest, Sub),
+    tokenize(Rest, T2).
+tokenize([MetaPred|T], ['metapredicate':PredName:Sup|T2]) :-
+    is_metapredicate_character(MetaPred),
+    token_metapredicate(MetaPred, PredName),
+    tokenize_superscript(T, Rest, Sup),
+    tokenize(Rest, T2).
+tokenize(['"'|T], ['variable':Variable|T2]) :-
+    tokenize_string(['"'|T], Rest, Variable),
+    tokenize(Rest, T2). 
+tokenize(['_',Digit|T], ['variable':Type:N|T2]) :-
+    is_digit_character(Digit),
+    tokenize_number([Digit|T] ,Rest, Type:X),
+    N is -X,
+    tokenize(Rest, T2).
+tokenize(['_','_'|T], T2) :-
+    tokenize(T, T2).
+tokenize([Digit|T], ['variable':Type:X|T2]) :-
+    is_digit_character(Digit),
+    tokenize_number([Digit|T], Rest, Type:X),
+    tokenize(Rest, T2).
+tokenize(['['|T], ['variable':List|T2]) :-
+    tokenize_list(['['|T], Rest, List),
+    tokenize(Rest, T2).
+tokenize([Modifier,Variable|T], ['variable':RealVariable|T2]) :-
+    is_modifier_character(Modifier),
+    is_variable_character(Variable),
+    token_variable(Modifier:Variable, RealVariable),
+    tokenize(T, T2).
+tokenize([ControlFlow|T], ['control':ControlFlow|T2]) :-
+    is_control_character(ControlFlow),
+    tokenize(T, T2).
+    
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   TOKENIZE_VARIABLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+tokenize_variable([], [], '').
+tokenize_variable([H|T], R, Name) :-
+    (   is_variable_character(H) ->
+        tokenize_variable(T, R, TName),
+        atomic_list_concat([H, TName], Name)
+    ;   Name = '',
+        R = [H|T]
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   TOKENIZE_STRING
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+tokenize_string(['"'|T], Rest, 'string':T2) :-
+    tokenize_string_(T, Rest, T2).
+    
+tokenize_string_([], [], []).
+tokenize_string_([X,'"'|Rest], Rest, [X]) :-
+    X \= '\\',
+    X \= '"',
+    Rest \= ['"'|_],
+    !.
+tokenize_string_(['\\','"'|T], Rest, ['"'|T2]) :-
+    tokenize_string_(T, Rest, T2).
+tokenize_string_(['"','"'|T], Rest, ['"'|T2]) :-
+    tokenize_string_(T, Rest, T2).
+tokenize_string_([X|T], Rest, L) :-
+    (   X \= '"' ->
+        L = [X|T2],
+        tokenize_string_(T, Rest, T2)
+    ;   Rest = T,
+        L = []
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   TOKENIZE_NUMBER
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */  
+tokenize_number(N, Rest, Type:Number) :-
+    tokenize_number_(N, Rest, T2),
+    (   member('.', T2),
+        !,
+        Type = 'float'
+    ;   Type = 'integer'
+    ),
+    atomic_list_concat(T2, A),
+    atom_number(A, Number).
+    
+tokenize_number_([], [], []).
+tokenize_number_(['.',I|T], Rest, ['.',J|T2]) :-
+    is_digit_character(I),
+    atom_number(I, J),
+    tokenize_integer(T, Rest, T2).
+tokenize_number_(['.'], ['.'], []).
+tokenize_number_(['.',X|T], ['.',X|T], []) :-
+    \+ (is_digit_character(X)).
+tokenize_number_([X|T], [X|T], []) :-
+    \+ (is_digit_character(X)),
+    X \= '.'.
+tokenize_number_([I|T], Rest, [J|T2]) :-
+    is_digit_character(I),
+    atom_number(I, J),
+    tokenize_number_(T, Rest, T2).
+
+tokenize_integer([], [], []).
+tokenize_integer([I|T], Rest, [J|T2]) :-
+    is_digit_character(I),
+    atom_number(I, J),
+    tokenize_integer(T, Rest, T2).
+tokenize_integer([X|T], [X|T], []) :-
+    \+ (is_digit_character(X)).
+    
+    
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   TOKENIZE_LIST
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+tokenize_list(['['|T], Rest, List) :-
+    isolate_list(T, L, Rest),
+    tokenize(L, List).
+    
+isolate_list(T, List, Rest) :-
+    isolate_list(T, 1, [], L, Rest),
+    reverse(L, List).
+isolate_list([], _, L, L, []).
+isolate_list([']'|T], 1, L, L, T).
+isolate_list([']'|T], X, L, M, Rest) :-
+    X > 1,
+    Y is X - 1,
+    isolate_list(T, Y, [']'|L], M, Rest).
+isolate_list(['['|T], X, L, M, Rest) :-
+    Y is X + 1,
+    isolate_list(T, Y, ['['|L], M, Rest).
+isolate_list([H|T], X, L, M, Rest) :-
+    H \= '[',
+    H \= ']',
+    isolate_list(T, X, [H|L], M, Rest).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   TOKENIZE_SUBSCRIPT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+tokenize_subscript(L, Rest, Sub) :-
+    tokenize_subscript_(L, Rest, LSub),
+    (   LSub = 'first' ->
+        Sub = LSub
+    ;   LSub = 'last' ->
+        Sub = 'last'
+    ;   LSub = [] ->
+        Sub = 'default'
+    ;   maplist(number_codes, LSub, LC),
+        append(LC, C),
+        number_codes(ISub, C),
+        term_to_atom('integer':ISub, Sub)
+    ).
+
+tokenize_subscript_([], [], []).
+tokenize_subscript_([H|T], Rest, Ds) :-
+    (   is_subscript_character(H, D) ->
+        tokenize_subscript_(T, Rest, TDs),
+        Ds = [D|TDs]
+    ;   is_subscript_parenthesis(H, D) ->
+        Rest = T,
+        Ds = D
+    ;   Rest = [H|T],
+        Ds = []
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   TOKENIZE_SUPERSCRIPT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+tokenize_superscript(L, Rest, Sup) :-
+    tokenize_superscript_(L, Rest, LSup),
+    (   LSup = 'first' ->
+        Sup = LSup
+    ;   LSup = 'last' ->
+        Sup = 'last'
+    ;   LSup = [] ->
+        Sup = 'default'
+    ;   maplist(number_codes, LSup, LC),
+        append(LC, C),
+        number_codes(ISup, C),
+        term_to_atom('integer':ISup, Sup)
+    ).
+
+tokenize_superscript_([], [], []).
+tokenize_superscript_([H|T], Rest, Ds) :-
+    (   is_superscript_character(H, D) ->
+        tokenize_superscript_(T, Rest, TDs),
+        Ds = [D|TDs]
+    ;   is_superscript_parenthesis(H, D) ->
+        Rest = T,
+        Ds = D
+    ;   Rest = [H|T],
+        Ds = []
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   IS_X_CHARACTER
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+is_variable_character(X) :-
+    member(X, ['A', 'B', 'C', 'D', 'E',
+               'F', 'G', 'H', 'I', 'J', 
+               'K', 'L', 'M', 'N', 'O', 
+               'P', 'Q', 'R', 'S', 'T', 
+               'U', 'V', 'W', 'X', 'Y', 'Z']).
+               
+is_variable_character_dot_below(X) :-
+    member(X, ['Ạ', 'Ḅ', 'Ḍ', 'Ẹ',
+               'Ḥ', 'Ị', 'Ḳ', 'Ḷ', 
+               'Ṃ', 'Ṇ', 'Ọ', 'Ṛ', 
+               'Ṣ', 'Ṭ', 'Ụ', 'Ṿ', 
+               'Ẉ', 'Ỵ', 'Ẓ']).
+
+is_variable_character_dot_above(X) :-
+    member(X,  ['Ȧ', 'Ḃ', 'Ċ', 'Ḋ', 'Ė',
+                'Ḟ', 'Ġ', 'Ḣ', 'İ', 'Ṁ',
+                'Ṅ', 'Ȯ', 'Ṗ', 'Ṙ', 'Ṡ',
+                'Ṫ', 'Ẇ', 'Ẋ', 'Ẏ', 'Ż']).
+
+is_digit_character(X) :-
+    member(X, ['0', '1', '2', '3', '4',
+               '5', '6', '7', '8', '9']).
+
+is_predicate_character(X) :-
+    member(X, ['≤', '≥', '∈', '∋', '⊆', '⊇',
+               '↔', '↰', '↺',
+               '↻', '√', '⌉', '⌋', '⟦', '⟧',
+               'ℕ', 'ℤ', 'ℝ', '∅', '≠', '≡',
+               '÷', '×', '%', '*', '+',
+               '-', '/', '<', '=', '>', '\\',
+               '^', 'a', 'b', 'c', 'd', 'e',
+               'f', 'g', 'h', 'i', 'j', 'k',
+               'l', 'm', 'n', 'o', 'p', 'q',
+               'r', 's', 't', 'u', 'v', 'w',
+               'x', 'y', 'z', 'ạ', 'ḅ', 'ḍ',
+               'ẹ', 'ḥ', 'ị', 'ḳ', 'ḷ', 'ṃ',
+               'ṇ', 'ọ', 'ṛ', 'ṣ', 'ṭ', 'ụ',
+               'ṿ', 'ẉ', 'ỵ', 'ẓ', 'ȧ', 'ḃ',
+               'ċ', 'ḋ', 'ė', 'ḟ', 'ġ', 'ḣ',
+               'ṁ', 'ṅ', 'ȯ', 'ṗ', 'ṙ', 'ṡ',
+               'ṫ', 'ẇ', 'ẋ', 'ẏ', 'ż', '≜']).
+
+is_math_constant_character(X) :-
+    member(X, ['π', 'φ']).
+
+is_modifier_character(X) :-
+    member(X, ['$', '@', '#']).
+
+is_input_character('?').
+
+is_output_character('.').
+
+is_metapredicate_character(X) :-
+    member(X, ['ᵃ', 'ᵇ', 'ᶜ', 'ᵈ', 'ᵉ',
+               'ᶠ', 'ᵍ', 'ʰ', 'ⁱ', 'ʲ',
+               'ᵏ', 'ˡ', 'ᵐ', 'ⁿ', 'ᵒ',
+               'ᵖ', 'ʳ', 'ˢ', 'ᵗ', 'ᵘ',
+               'ᵛ', 'ʷ', 'ˣ', 'ʸ', 'ᶻ']).
+
+is_subscript_character(C, D) :-
+    nth0(D, ['₀','₁','₂','₃','₄',
+             '₅','₆','₇','₈','₉'], C).
+
+is_subscript_parenthesis('₍', 'first').
+is_subscript_parenthesis('₎', 'last').
+
+is_superscript_character(C, D) :-
+    nth0(D, ['⁰','¹','²','³','⁴',
+             '⁵','⁶','⁷','⁸','⁹'], C).
+
+is_superscript_parenthesis('⁽', 'first').
+is_superscript_parenthesis('⁾', 'last').
+
+is_control_character(X) :-
+    member(X, ['∧', '∨', '⊥', '\n', '!', '↖', '↙',
+              '\'', '(', ')', ',', ':',
+               ':', '|', '{', '}', '`',
+               '¬', '~', ';', '&', '⟨', '⟩']).
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/brachylog/brachylog/Brachylog-master/src/transpile.pl	Tue Jul 16 21:39:11 2019 +0000
@@ -0,0 +1,641 @@
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+____            ____
+\   \          /   /
+ \   \  ____  /   /
+  \   \/    \/   /
+   \     /\     /     BRACHYLOG
+    \   /  \   /      A terse declarative logic programming language
+    /   \  /   \
+   /     \/     \     Written by Julien Cumin - 2017
+  /   /\____/\   \    https://github.com/JCumin/Brachylog
+ /   /  ___   \   \
+/___/  /__/    \___\
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+
+:- module(transpile, [parse/2,
+                      parse_no_file/2,
+                      parse_argument/2,
+                      contains_write/1
+                     ]).
+
+:- use_module(tokenize).
+:- use_module(symbols).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   PARSE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+parse(Code, TranspiledPath) :-
+    parse_no_file(Code, Predicates),
+    open(TranspiledPath, write, File),
+    maplist(write_to_file(File), Predicates),
+    close(File).
+
+parse_no_file(Code, Predicates) :-
+    atom_chars(Code, SplittedCode),
+    tokenize(SplittedCode, TokensNoOutputs),
+    append_trailing_output(TokensNoOutputs, Tokens),
+    fix_predicates(Tokens, FixedPredicates),
+    fix_metapredicates(FixedPredicates, FixedMetapredicates),
+    fill_implicit_variables(FixedMetapredicates, FilledTokens),
+    fix_variables_superscripts(FilledTokens, FixedVariables, GlobalVariables),
+    fix_lists(FixedVariables, FixedLists),
+    fix_forks(FixedLists, FixedForks),
+    fix_arrows(FixedForks, Program),
+    atomic_list_concat(GlobalVariables, ',', G),
+    atomic_list_concat(['[', G, ']'], GlobalVariablesAtom),
+    transpile(Program, Predicates, GlobalVariablesAtom),
+    !.
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   PARSE_ARGUMENT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+parse_argument(Arg, Term) :-
+    (   atom(Arg),
+        AtomArg = Arg
+    ;   \+ atom(Arg),
+        term_to_atom(Arg, AtomArg)
+    ),
+    atom_chars(AtomArg, SplittedArg),
+    tokenize(SplittedArg, Token),
+    fix_variables_superscripts(Token, FixedSuperscripts, _),
+    fix_lists(FixedSuperscripts, Program),
+    transpile(Program, Parsed, '[]'),
+    !,
+    reverse(Parsed, [TempMainPredicate|_]),
+    nth0(3, TempMainPredicate, Atom),
+    atom_concat(',\n    ', AtomT, Atom),
+    atom_concat(ParsedArg, ' = Var_Input_Local', AtomT),
+    term_to_atom(Term, ParsedArg)
+    ;
+    throw('Incorrect variable format.').
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   APPEND_TRAILING_OUTPUT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+append_trailing_output([], ['variable':'Output':'sup':'default']).
+append_trailing_output(['control':'\n'|T], ['variable':'Output':'sup':'default','control':'\n'|T2]) :-
+    append_trailing_output(T, T2).
+append_trailing_output(['control':'}'|T], ['variable':'Output':'sup':'default','control':'}'|T2]) :-
+    append_trailing_output(T, T2).
+append_trailing_output(['control':'⟩'|T], ['variable':'Output':'sup':'default','control':'⟩'|T2]) :-
+    append_trailing_output(T, T2).
+append_trailing_output(['control':'|'|T], ['variable':'Output':'sup':'default','control':'|'|T2]) :-
+    append_trailing_output(T, T2).
+append_trailing_output([H|T], [H|T2]) :-
+    H \= 'control':'\n',
+    H \= 'control':'}',
+    H \= 'control':'⟩',
+    H \= 'control':'|',
+    append_trailing_output(T, T2).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   FIX_PREDICATES'⟨', '⟩'
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+fix_predicates(Tokens, FixedPredicates) :-
+    fix_predicates(Tokens, 1, L),
+    append(L, FixedPredicates).
+
+fix_predicates([], _, [[]]).
+fix_predicates(['control':'{'|T], I, [['predicate':PredName:0|Rest], ['control':'\n'|Predicate]|AllOtherPredicates]) :-
+    atomic_list_concat(['brachylog_predicate_',I], PredName),
+    J is I + 1,
+    fix_predicates_(T, J, [Predicate|OtherPredicates1], Z, Remaining),
+    fix_predicates(Remaining, Z, [Rest|OtherPredicates2]),
+    append(OtherPredicates1, OtherPredicates2, AllOtherPredicates).
+fix_predicates(['control':'⟨'|T], I, [['predicate':PredName:0|Rest], ['control':'\n','fork':'start'|Predicate]|AllOtherPredicates]) :-
+    atomic_list_concat(['brachylog_predicate_',I], PredName),
+    J is I + 1,
+    fix_predicates_(T, J, [Predicate|OtherPredicates1], Z, Remaining),
+    fix_predicates(Remaining, Z, [Rest|OtherPredicates2]),
+    append(OtherPredicates1, OtherPredicates2, AllOtherPredicates).
+fix_predicates(['control':'\n'|T], I, [[],['control':'\n'|Rest]|OtherPredicates]) :-
+    J is I + 1,
+    fix_predicates(T, J, [Rest|OtherPredicates]).
+fix_predicates([Type:A|T], I, [[Type:A|Rest]|OtherPredicates]) :-
+    \+ (Type = 'control', A = '{'),
+    \+ (Type = 'control', A = '}'),
+    \+ (Type = 'control', A = '⟨'),
+    \+ (Type = 'control', A = '⟩'),
+    \+ (Type = 'control', A = '\n'),
+    fix_predicates(T, I, [Rest|OtherPredicates]).
+
+fix_predicates_([], _, [[]]).
+fix_predicates_(['control':'{'|T], I, [['predicate':PredName:0|Rest], ['control':'\n'|Predicate]|AllOtherPredicates], Z, Remaining) :-
+    atomic_list_concat(['brachylog_predicate_',I], PredName),
+    J is I + 1,
+    fix_predicates_(T, J, [Predicate|OtherPredicates1], Z2, Remaining2),
+    fix_predicates_(Remaining2, Z2, [Rest|OtherPredicates2], Z, Remaining),
+    append(OtherPredicates1, OtherPredicates2, AllOtherPredicates).
+fix_predicates_(['control':'⟨'|T], I, [['predicate':PredName:0|Rest], ['control':'\n','fork':'start'|Predicate]|AllOtherPredicates], Z, Remaining) :-
+    atomic_list_concat(['brachylog_predicate_',I], PredName),
+    J is I + 1,
+    fix_predicates_(T, J, [Predicate|OtherPredicates1], Z2, Remaining2),
+    fix_predicates_(Remaining2, Z2, [Rest|OtherPredicates2], Z, Remaining),
+    append(OtherPredicates1, OtherPredicates2, AllOtherPredicates).
+fix_predicates_(['control':'}'|T], I, [[]], I, T).
+fix_predicates_(['control':'⟩'|T], I, [['fork':'end']], I, T).
+fix_predicates_([Type:A|T], I, [[Type:A|Rest]|OtherPredicates], Z, Remaining) :-
+    \+ (Type = 'control', A = '{'),
+    \+ (Type = 'control', A = '}'),
+    \+ (Type = 'control', A = '⟨'),
+    \+ (Type = 'control', A = '⟩'),
+    \+ (Type = 'control', A = '\n'),
+    fix_predicates_(T, I, [Rest|OtherPredicates], Z, Remaining).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   FIX_METAPREDICATES
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+fix_metapredicates([], []).
+fix_metapredicates(['predicate':PredName:Sub,'metapredicate':MetapredName:Sup|T], ['predicate':PredName:Sub:MetapredName:Sup|T2]) :-
+    fix_metapredicates(T, T2).
+fix_metapredicates(['predicate':PredName:Sub|T], ['predicate':PredName:Sub:'no':0|T2]) :-
+    fix_metapredicates(T, T2).
+fix_metapredicates([H|T], [H|T2]) :-
+    fix_metapredicates(T, T2).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   FILL_IMPLICIT_VARIABLES
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+fill_implicit_variables(Tokens, Program) :-
+    fill_implicit_variables(Tokens, 0, Program).
+
+fill_implicit_variables([], _, []).
+fill_implicit_variables(['control':':','predicate':A|T], I, ['control':':','predicate':A|T2]) :-
+    fill_implicit_variables(T, I, T2).
+fill_implicit_variables(['predicate':A,Type:B|T], I, ['predicate':A,'variable':V|T2]) :-
+    Type \= 'variable',
+    atom_concat('V', I, V),
+    J is I + 1,
+    fill_implicit_variables([Type:B|T], J, T2).
+fill_implicit_variables(['predicate':A], I, ['predicate':A,'variable':V]) :-
+    atom_concat('V', I, V).
+fill_implicit_variables(['predicate':A,'variable':B|T], I, ['predicate':A,'variable':B|T2]) :-
+    fill_implicit_variables(T, I, T2).
+fill_implicit_variables(['control':H,Type:B|T], I, ['control':H,'variable':V|T2]) :-
+    Type \= 'variable',
+    (   H = '∧'
+    ;   H = '∨'
+    ),
+    atom_concat('V', I, V),
+    J is I + 1,
+    fill_implicit_variables([Type:B|T], J, T2).
+fill_implicit_variables(['control':H,'variable':B,Type:C|T], I, ['control':H,'variable':B,'variable':V|T2]) :-
+    Type \= 'variable',
+    (   H = '↖'
+    ;   H = '↙'
+    ),
+    atom_concat('V', I, V),
+    J is I + 1,
+    fill_implicit_variables([Type:C|T], J, T2).
+fill_implicit_variables([Type:A|T], I, [Type:A|T2]) :-
+    Type \= 'predicate',
+    \+ (Type = 'control', A = ':', T = ['predicate':_|_]),
+    \+ (Type = 'control', A = '∧', T \= ['variable':_|_]),
+    \+ (Type = 'control', A = '∨', T \= ['variable':_|_]),
+    \+ (Type = 'control', A = '↖', T \= ['variable':_|_]),
+    \+ (Type = 'control', A = '↙', T \= ['variable':_|_]),
+    fill_implicit_variables(T, I, T2).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   FIX_VARIABLES_SUPERSCRIPTS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+fix_variables_superscripts(Input, Output, GlobalVariables) :-
+    fix_variables_superscripts_(Input, Output, GlobVars),
+    sort(GlobVars, GlobalVariables).  % Remove duplicates
+
+fix_variables_superscripts_([], [], []).
+fix_variables_superscripts_(['variable':A:'sup':Sup|T], ['variable':V|T2], [V|GlobalVariables]) :-
+    atomic_list_concat(['integer',  SupAtom], ':', Sup),
+    atom_number(SupAtom, J),
+    atomic_list_concat(['Var_',A,'_',J], V),
+    fix_variables_superscripts_(T, T2, GlobalVariables).
+fix_variables_superscripts_(['variable':A:'sup':'default'|T], ['variable':V|T2], GlobalVariables) :-
+    atomic_list_concat(['Var_',A,'_Local'], V),
+    fix_variables_superscripts_(T, T2, GlobalVariables).
+fix_variables_superscripts_(['variable':List|T], ['variable':FixedList|T2], GlobalVariables) :-
+    is_list(List),
+    fix_variables_superscripts_(List, FixedList, Vars),
+    fix_variables_superscripts_(T, T2, GlobalVariables2),
+    append(Vars, GlobalVariables2, GlobalVariables).
+fix_variables_superscripts_([X|T], [X|T2], GlobalVariables) :-
+    fix_variables_superscripts_(T, T2, GlobalVariables).
+
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   FIX_LISTS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+fix_lists([], []).
+fix_lists(['variable':List|T], ['variable':FixedList|T2]) :-
+    is_list(List),
+    fix_list(List, FixedList),
+    fix_lists(T, T2).
+fix_lists([X|T], [X|T2]) :-
+    (   X = 'variable':L,
+        \+ (is_list(L))
+    ;   X \= 'variable':_
+    ),
+    fix_lists(T, T2).
+
+fix_list([], []).
+fix_list(['control':','|T], T2) :-
+    fix_list(T, T2).
+fix_list([X|T], [Y|T2]) :-
+    X \= 'control':',',
+    (   X = 'variable':L,
+        is_list(L),
+        fix_list(L, Y)
+    ;   X = 'variable':Y
+    ;   X = 'predicate':_,
+        Y = X
+    ;   Y = X
+    ),
+    fix_list(T, T2).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   FIX_FORKS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+fix_forks(L, Z) :-
+    fix_forks(L, 0, Z).
+
+fix_forks([], _, []).     % Ignore each useless implicit var after
+fix_forks(['fork':'start', F1, _, F2, Output, 'fork':'end'|T], I, ['control':'unpair','variable':V1,F1,Output,F2,'variable':V1,'control':'∧'|T2]) :-
+    atom_concat('Fork', I, V1),
+    J is I + 1,
+    fix_forks(T, J,  T2).
+fix_forks(['fork':'start', F1, _, F2, _, F3, Output, 'fork':'end'|T], I, ['control':'&',F1,'variable':V1,'control':'&',F3,'variable':V2,'control':'∧','variable':V1,'control':';','variable':V2,F2,Output|T2]) :-
+    atom_concat('Fork', I, V1),
+    J is I + 1,
+    atom_concat('Fork', J, V2),
+    K is I + 1,
+    fix_forks(T, K, T2).
+fix_forks([H|T], I, [H|T2]) :-
+    dif(H, 'fork':'start'),
+    fix_forks(T, I, T2).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   FIX_ARROWS
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+fix_arrows([], []).
+fix_arrows(['predicate':P:_:Meta:Sup,'variable':_,'control':'↙','variable':V|T], T2) :- !,
+    (   atom(V) ->
+        V = VA
+    ;   term_to_atom(V, VA)
+    ),
+    fix_arrows(['predicate':P:VA:Meta:Sup|T], T2).
+fix_arrows(['predicate':P:Sub:Meta:_,'variable':_,'control':'↖','variable':V|T], T2) :- !,
+    (   atom(V) ->
+        V = VA
+    ;   term_to_atom(V, VA)
+    ),
+    fix_arrows(['predicate':P:Sub:Meta:VA|T], T2).
+fix_arrows(['predicate':P:_:Meta:Sup,'control':'↙','variable':V|T], T2) :- !,
+    (   atom(V) ->
+        V = VA
+    ;   term_to_atom(V, VA)
+    ),
+    fix_arrows(['predicate':P:VA:Meta:Sup|T], T2).
+fix_arrows(['predicate':P:Sub:Meta:_,'control':'↖','variable':V|T], T2) :- !,
+    (   atom(V) ->
+        V = VA
+    ;   term_to_atom(V, VA)
+    ),
+    fix_arrows(['predicate':P:Sub:Meta:VA|T], T2).
+fix_arrows([H|T], [H|T2]) :-
+    fix_arrows(T, T2).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   TRANSPILE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+transpile(Program, [[':- style_check(-singleton).'],
+                    [':- use_module(library(clpfd)).'],
+                    [':- use_module(predicates).'],
+                    [':- use_module(metapredicates).'],
+                    [':- use_module(constraint_variables).\n'],
+                    [MainPredHeader,
+                    ConstraintVariables,
+                    '    (1=1'|MainPred]|OtherPredicates], GlobalVariables) :-
+    atomic_list_concat(['brachylog_main(',
+                        GlobalVariables,
+                        ',_, Var_Input_Local,Var_Output_Local) :-\n',
+                        '    Name = brachylog_main,\n',
+                        '    GlobalVariables = ',
+                        GlobalVariables,',\n',
+                        '    nb_setval(\'declw\',[]),\n'],    % Initialize declarative write variable
+                       MainPredHeader),
+    constraint_variables(GlobalVariables, ConstraintVariables),
+    transpile_(Program, 'Var_Input_Local', no, no, 0, 0, [T|OtherPredicates], GlobalVariables),
+    reverse(T, [_|RT]),
+    reverse(RT, T2),
+    append(T2, ['\n',
+                '    ),\n',
+                '    (',
+                '(Var_Output_Local = integer:_ ; ',
+                'Var_Output_Local = [_|_], ',
+                'forall(member(E, Var_Output_Local), E = integer:_)) ',
+                '-> brachylog_label(default, Var_Output_Local, _) ',
+                '; true),\n',
+                '    nb_getval(\'declw\', DeclwFinal),\n',
+                '    maplist(write, DeclwFinal).'],    % execute declarative write
+               MainPred).
+
+transpile_([], _, _, _, _, _, [['\n    ).\n']], _).
+transpile_(['variable':B|T], A, Reverse, Negate, AppendNumber, PredNumber, [[Unification|T2]|OtherPredicates], GlobalVariables) :-
+    A \= 'nothing',
+    (   is_list(A),
+        brachylog_list_to_atom(A, Var1)
+    ;   A = Type:L,
+        term_to_atom(Type:L, Var1)
+    ;   A = Var1
+    ),
+    (   is_list(B),
+        brachylog_list_to_atom(B, Var2)
+    ;   B = _:_,
+        term_to_atom(B, Var2)
+    ;   Var2 = B
+    ),
+    (   Negate = yes,
+        UnificationAtom = ' \\= '
+    ;   Negate = no,
+        UnificationAtom = ' = '
+    ),
+    (   Reverse = no,
+        atomic_list_concat([',\n    ',Var2,UnificationAtom,Var1], Unification),
+        transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables)
+    ;   Reverse = yes,
+        atomic_list_concat([',\n    ',Var1,UnificationAtom,Var2], Unification),
+        transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables)
+    ).
+transpile_(['variable':B|T], 'nothing', _, _, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables) :-
+    transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['predicate':P:Sub:Meta:Sup,'variable':B|T], A, Reverse, Negate, AppendNumber, PredNumber, [[Predicate|T2]|OtherPredicates], GlobalVariables) :-
+    A \= 'nothing',
+    (   P = 'brachylog_call_predicate',
+        (   Sub = 'default' ->
+            RealSub = 'Name-GlobalVariables'
+        ;   atomic_list_concat(['(',Sub,')-','GlobalVariables'], RealSub)
+        )
+    ;   P \= 'brachylog_call_predicate',
+        RealSub = Sub
+    ),
+    (   is_list(A),
+        brachylog_list_to_atom(A, Var1)
+    ;   A = Type:L,
+        term_to_atom(Type:L, Var1)
+    ;   A = Var1
+    ),
+    (   is_list(B),
+        brachylog_list_to_atom(B, Var2)
+    ;   B = _:_,
+        term_to_atom(B, Var2)
+    ;   Var2 = B
+    ),
+    (   Negate = yes,
+        NegateAtom = '\\+ '
+    ;   Negate = no,
+        NegateAtom = ''
+    ),
+    (   Reverse = no ->
+        PredName = P
+    ;   atomic_list_concat([P,'_reversed'], PredName)
+    ),
+    (   atomic_list_concat(['brachylog','predicate',_], '_', P)
+    ->  atomic_list_concat([GlobalVariables,','], GlobVars)
+    ;   GlobVars = ''
+    ),
+    (   Meta = no ->
+        atomic_list_concat([',\n    ',NegateAtom,PredName,'(',GlobVars,RealSub,',',Var1,',',Var2,')'], Predicate)
+    ;   (   atomic_list_concat(['brachylog','predicate',_], '_', P)
+        ->  atomic_list_concat([GlobalVariables,','], GlobVarsMeta)
+        ;   GlobVarsMeta = 'ignore,'
+        ),
+        atomic_list_concat([',\n    ',NegateAtom,Meta,'(',GlobVarsMeta,Sup,',',PredName,',',RealSub,',',Var1,',',Var2,')'], Predicate)
+    ),
+    transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':'∧'|T], _, _, _, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables) :-
+    transpile_(T, 'nothing', no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':'&'|T], _, _, _, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables) :-
+    transpile_(T, 'Var_Input_Local', no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':'`'|T], B, _, _, AppendNumber, PredNumber, [['\n    *->\n    1=1'|T2]|OtherPredicates], GlobalVariables) :-
+    transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':'∨'|T], _, _, _, AppendNumber, PredNumber, [['\n    ;\n    1=1'|T2]|OtherPredicates], GlobalVariables) :-
+    transpile_(T, 'nothing', no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':'('|T], B, _, Negate, AppendNumber, PredNumber, [[Parenthesis|T2]|OtherPredicates], GlobalVariables) :-
+    (   Negate = yes,
+        Parenthesis = ',\n    \\+ (\n    1=1'
+    ;   Negate = no,
+        Parenthesis = ',\n    (\n    1=1'
+    ),
+    transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':')'|T], B, _, _, AppendNumber, PredNumber, [['\n    )'|T2]|OtherPredicates], GlobalVariables) :-
+    transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':'!'|T], B, _, _, AppendNumber, PredNumber, [[',\n    !'|T2]|OtherPredicates], GlobalVariables) :-
+    transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':'⊥'|T], B, _, _, AppendNumber, PredNumber, [[',\n    false'|T2]|OtherPredicates], GlobalVariables) :-
+    transpile_(T, B, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':'~'|T], B, Reverse, Negate, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables) :-
+    (   Reverse = yes,
+        NewReverse = no
+    ;   Reverse = no,
+        NewReverse = yes
+    ),
+    transpile_(T, B, NewReverse, Negate, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':'¬'|T], B, Reverse, Negate, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables) :-
+    (   Negate = yes,
+        NewNegate = no
+    ;   Negate = no,
+        NewNegate = yes
+    ),
+    transpile_(T, B, Reverse, NewNegate, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':'unpair','variable':A|T], B, _, _, AppendNumber, PredNumber, [[Unpair|T2]|OtherPredicates], GlobalVariables) :-
+    (   A = TypeA:LA,
+        term_to_atom(TypeA:LA, TailElem)
+    ;   A = TailElem
+    ),
+    (   B = TypeB:LB,
+        term_to_atom(TypeB:LB, Pair)
+    ;   B = Pair
+    ),
+    atomic_list_concat(['UnpairTemp',AppendNumber],HeadElem),
+    atomic_list_concat([',\n    ',
+                        Pair,'=[',HeadElem,',',TailElem,']'],Unpair),
+    NewAppendNumber is AppendNumber + 1,
+    transpile_(T, HeadElem, no, no, NewAppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':';',Type:A|T], B, _, _, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables) :-
+    (   Type = 'variable'
+    ;   Type = 'predicate'
+    ),
+    append([B], [A], NewVar),
+    transpile_(T, NewVar, no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':',','variable':A|T], B, _, _, AppendNumber, PredNumber, [[Append|T2]|OtherPredicates], GlobalVariables) :-
+    (   is_list(A),
+        brachylog_list_to_atom(A, Arg1)
+    ;   A = TypeA:LA,
+        term_to_atom(TypeA:LA, Arg1)
+    ;   A = Arg1
+    ),
+    (   is_list(B),
+        brachylog_list_to_atom(B, Arg2)
+    ;   B = TypeB:LB,
+        term_to_atom(TypeB:LB, Arg2)
+    ;   B = Arg2
+    ),
+    atomic_list_concat(['AppendTemp',AppendNumber],TempVar),
+    atomic_list_concat([',\n    ',
+                        '((',Arg2,' == [], \\+ is_brachylog_list(',Arg1,')) -> ',TempVar,' = [',Arg1,'] ; ',
+                        'brachylog_concatenate(default,',
+                        '[',Arg2,',',Arg1,']',
+                        ',',TempVar,') -> true ; is_brachylog_list(',
+                        Arg2,
+                        '), brachylog_concatenate(default,',
+                        '[',Arg2,',[',Arg1,']]',
+                        ',',TempVar,') -> true ; brachylog_concatenate(default,',
+                        '[[',Arg2,'],[',Arg1,']],',TempVar,'))'
+                       ], Append),
+    NewAppendNumber is AppendNumber + 1,
+    transpile_(T, TempVar, no, no, NewAppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':'\n'|T], _, _, _, AppendNumber, PredNumber, [['\n    ).\n'],[ReversedPred],[PredHead|T2]|OtherPredicates], GlobalVariables) :-
+    J is PredNumber + 1,
+    constraint_variables(GlobalVariables, ConstraintVariables),
+    atomic_list_concat(['brachylog_predicate_',
+                        J,
+                        '_reversed(',
+                        GlobalVariables,
+                        ',_, Input, Output',
+                        ') :-\n',
+                        '    brachylog_predicate_',
+                        J,
+                        '(',
+                        GlobalVariables,
+                        ',_, Output, Input',
+                        ').\n'], ReversedPred),
+    atomic_list_concat(['brachylog_predicate_',
+                        J,
+                        '(',
+                        GlobalVariables,
+                        ',_, ',
+                        'Var_Input_Local',
+                        ',Var_Output_Local',
+                        ') :-\n    Name = brachylog_predicate_',
+                        J,
+                        ',\n    GlobalVariables = ',
+                        GlobalVariables,
+                        ',\n',
+                        ConstraintVariables,
+                        '    (1=1'], PredHead),
+    transpile_(T, 'Var_Input_Local', no, no, AppendNumber, J, [T2|OtherPredicates], GlobalVariables).
+transpile_(['control':'|'|T], _, _, _, AppendNumber, PredNumber, [['\n    ).\n'],[PredHead|T2]|OtherPredicates], GlobalVariables) :-
+    (   PredNumber = 0,
+        PredName = 'brachylog_main'
+    ;   PredNumber \= 0,
+        atomic_list_concat(['brachylog_predicate_',PredNumber], PredName)
+    ),
+    constraint_variables(GlobalVariables, ConstraintVariables),
+    atomic_list_concat([PredName,
+                        '(',
+                        GlobalVariables,
+                        ',_, ',
+                        'Var_Input_Local',
+                        ',Var_Output_Local',
+                        ') :-\n    Name = ',
+                        PredName,
+                        ',\n    GlobalVariables = ',
+                        GlobalVariables,
+                        ',\n',
+                        ConstraintVariables,
+                        '    (1=1'], PredHead),
+    transpile_(T, 'Var_Input_Local', no, no, AppendNumber, PredNumber, [T2|OtherPredicates], GlobalVariables).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   CONTAINS_WRITE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+contains_write(Code) :-
+    atom_chars(Code, SplittedCode),
+    tokenize(SplittedCode, Tokens),
+    fix_predicates(Tokens, FixedPredicates),
+    (   member(predicate:brachylog_write:_, FixedPredicates)
+    ;   member(predicate:brachylog_writeln:_, FixedPredicates)
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   CONSTRAINT_VARIABLES
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+constraint_variables(GlobalVariables, ConstraintVariables) :-
+    atom_chars(GlobalVariables, [_|Gs]),
+    reverse(Gs, [_|RGs]),
+    reverse(RGs, RRGs),
+    atomic_list_concat(RRGs, GGs),
+    atomic_list_concat(GlobVars, ',', GGs),
+    findall(S, (member(X, GlobVars),
+                atomic_list_concat(['Var', Name, _], '_', X),
+                atom_chars(Name, CName),
+                reverse(CName, [_,'t','n','i','a','r','t','s','n','o','C']),
+                constraint_variable(X, S)), Ss),
+    atomic_list_concat(Ss, GlobalConstraintVariables),
+    findall(T, (member(X, ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']),
+                atomic_list_concat(['    constraint',X,'(Var_Constraint',X,'_Local','),\n'], T)),
+            Ts
+    ),
+    atomic_list_concat(Ts, LocalConstraintVariables),
+    atomic_list_concat([GlobalConstraintVariables, LocalConstraintVariables], ConstraintVariables).
+
+constraint_variable(X, S) :-
+    atomic_list_concat(['Var', ConstraintName, _], '_', X),
+    atom_chars(ConstraintName, [C|Cs]),
+    downcase_atom(C, CDown),
+    atomic_list_concat([CDown|Cs], PredName),
+    atomic_list_concat(['   ',PredName,'(',X,'),\n'], S).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_LIST_TO_ATOM
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_list_to_atom(List, Atom) :-
+    brachylog_list_to_atom_(List, T2),
+    atomic_list_concat(['[',T2,']'], Atom).
+
+brachylog_list_to_atom_([], '').
+brachylog_list_to_atom_([A], AtomA) :-
+    (   is_list(A),
+        brachylog_list_to_atom(A, AtomA)
+    ;   A = _:_,
+        term_to_atom(A, AtomA)
+    ;   \+ is_list(A),
+        A \= _:_,
+        AtomA = A
+    ).
+brachylog_list_to_atom_([A,B|T], Atom) :-
+    (   is_list(A),
+        brachylog_list_to_atom(A, AtomA)
+    ;   A = _:_,
+        term_to_atom(A, AtomA)
+    ;   \+ is_list(A),
+        A \= _:_,
+        AtomA = A
+    ),
+    brachylog_list_to_atom_([B|T], T2),
+    atomic_list_concat([AtomA,',',T2], Atom).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   WRITE_TO_FILE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+write_to_file(File, []) :-
+    write(File, '\n\n').
+write_to_file(File, [H|T]) :-
+    write(File, H),
+    write_to_file(File, T).
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/interps/brachylog/brachylog/Brachylog-master/src/utils.pl	Tue Jul 16 21:39:11 2019 +0000
@@ -0,0 +1,195 @@
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+____            ____
+\   \          /   /
+ \   \  ____  /   /
+  \   \/    \/   /
+   \     /\     /     BRACHYLOG       
+    \   /  \   /      A terse declarative logic programming language
+    /   \  /   \    
+   /     \/     \     Written by Julien Cumin - 2017
+  /   /\____/\   \    https://github.com/JCumin/Brachylog
+ /   /  ___   \   \
+/___/  /__/    \___\
+     
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+
+:- module(utils, [integer_value/2,
+                  brachylog_prolog_variable/2,
+                  length_/2,
+                  prepend_string/2,
+                  prepend_integer/2,
+                  is_brachylog_list/1,
+                  single_atom_code/2,
+                  ceiled_square_root/2,
+                  scompare/4,
+                  if_/3,
+                  (=)/3,
+                  (#>)/3,
+                  (===)/6
+                 ]).
+
+:- use_module(library(clpfd)).
+    
+    
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   INTEGER_VALUE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+integer_value('integer':Sign:I, E) :-
+    integer_value('integer':Sign:I, 0, E, E).
+
+integer_value('integer':Sign:[], N0, N, _) :-
+    (   Sign = 'positive',
+        N #= N0
+    ;   Sign = 'negative',
+        N #= - N0
+    ).
+integer_value('integer':Sign:[H], N0, N, M) :-
+    H in 0..9,
+    N1 #= H + N0 * 10,
+    abs(M) #>= abs(N1),
+    integer_value('integer':Sign:[], N1, N, M).
+integer_value('integer':Sign:[H,I|T], N0, N, M) :-
+    H in 0..9,
+    N1 #= H + N0 * 10,
+    abs(M) #>= abs(N1),
+    integer_value('integer':Sign:[I|T], N1, N, M).
+    
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   BRACHYLOG_PROLOG_VARIABLE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+brachylog_prolog_variable('integer':I, I) :- !.
+brachylog_prolog_variable('float':F, F) :- !.
+brachylog_prolog_variable('string':S, String) :- !,
+    escape_string_list(S, T),
+    atomic_list_concat(T, U),
+    atomic_list_concat(['"',U,'"'], A),
+    term_to_atom(String, A).
+brachylog_prolog_variable(List, PrologList) :-
+    is_list(List),
+    maplist(brachylog_prolog_variable, List, PrologList).
+    
+escape_string_list([], []).
+escape_string_list(['"'|T], ['\\','"'|T2]) :-
+    escape_string_list(T, T2).
+escape_string_list(['\\'|T], ['\\','\\'|T2]) :-
+    escape_string_list(T, T2).
+escape_string_list([H|T], [H|T2]) :-
+    H \= '"',
+    H \= '\\',
+    escape_string_list(T, T2).
+
+    
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   LENGTH_
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+length_(Length, List) :-
+    length(List, Length).
+   
+   
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   PREPEND_STRING
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+prepend_string(S, 'string':S).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   PREPEND_INTEGER
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+prepend_integer(I, 'integer':I).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   IS_BRACHYLOG_LIST
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+is_brachylog_list([]).
+is_brachylog_list([_|_]).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   SINGLE_ATOM_CODE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+single_atom_code(A, C) :-
+    catch(atom_codes(A, [C]), _, false).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   CEILED_SQUARE_ROOT
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+ceiled_square_root(0, 0).
+ceiled_square_root(N0, Root) :-
+        N1 #= N0 - 1,
+        Max in 0..N1,
+        R0^2 #= Max,
+        Root #= Root0 + 1,
+        fd_sup(R0, Root0).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   SCOMPARE
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+scompare(@>, TypeX:X, TypeY:Y, TypeZ:Z) :-
+    (   X @> Y ->
+        TypeZ:Z = TypeX:X
+    ;   TypeZ:Z = TypeY:Y
+    ).
+scompare(@<, TypeX:X, TypeY:Y, TypeZ:Z) :-
+    (   X @< Y ->
+        TypeZ:Z = TypeX:X
+    ;   TypeZ:Z = TypeY:Y
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   IF_/3
+   Credits to Ulrich Neumerkel
+   See: http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/sicstus/reif.pl
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+if_(If_1, Then_0, Else_0) :-
+    call(If_1, T),
+    (   T == true -> Then_0
+    ;   T == false -> Else_0
+    ;   nonvar(T) -> throw(error(type_error(boolean,T),
+                                 type_error(call(If_1,T),2,boolean,T)))
+    ;   throw(error(instantiation_error,instantiation_error(call(If_1,T),2)))
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   (=)/3
+   Credits to Ulrich Neumerkel
+   See: http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/sicstus/reif.pl
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+=(X, Y, T) :-
+    (   X == Y -> T = true
+    ;   X \= Y -> T = false
+    ;   T = true, X = Y
+    ;   T = false,
+        dif(X, Y)
+    ).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   (#>)/3
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+#>(X, Y, T) :-
+    zcompare(C, X, Y),
+    greater_true(C, T).
+
+greater_true(>, true).
+greater_true(<, false).
+greater_true(=, false).
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   (===)/6
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+===(X1, Y1, X2, Y2, T1, T) :-
+    (   X1 == Y1 -> T1 = true, T = true
+    ;   X1 \= Y1 -> T1 = true, T = false
+    ;   X2 == Y2 -> T1 = false, T = true
+    ;   X2 \= Y2 -> T1 = false, T = false
+    ;   T1 = true, T = true, X1 = Y1
+    ;   T1 = true, T = false, dif(X1, Y1)
+).
Binary file interps/brachylog/brachylog/master.zip has changed