List Prolog Interpreter (LPI) makes it easier to generate List Prolog programs. It works by interpreting different versions of Prolog that are in a list format. Using an algorithm that was written in SWI-Prolog, it easily parses and runs List Prolog code.
Please read the following instructions on how to install the project on your computer for writing code.
-
Use a search engine to find the Homebrew (or other) Terminal install command for your platform and install it, and search for the Terminal command to install swipl using Homebrew and install it or download and install SWI-Prolog for your machine at SWI-Prolog.
-
You may need to install gawk using Homebrew.
-
Install Translation Shell on Mac, etc. Change line in
culturaltranslationtool/ctt2.pl
trans_location("../../../gawk/trans").
to correct location of trans.
- In Terminal settings (Mac), make Bash the default shell:
/bin/bash
- In Terminal, edit the text file
~/.bashrc
using the text editor Nano:
nano ~/.bashrc
- Add the following to the file
~/.bashrc
:
export PATH="$PATH:/opt/homebrew/bin/"
- Link to swipl in Terminal:
sudo ln -s /opt/homebrew/bin/swipl /usr/local/bin/swipl
Download this repository, the Languages repository (which enables List Prolog Interpreter to be run in different languages), SSI and Cultural Translation Tool.
- Download the LPPM Repository:
mkdir GitHub
cd GitHub/
git clone https://github.com/luciangreen/List-Prolog-Package-Manager.git
cd List-Prolog-Package-Manager
swipl
['lppm'].
lppm_install("luciangreen","listprologinterpreter").
../
halt.
-
In Shell:
cd listprologinterpreter
swipl
['listprolog'].
-
Running the tests To run all tests, enter:
test(off,NTotal,Score).
To run a specific test:
test1(off,TestNumber,Passed).
where TestNumber is the test number from lpiverify4.pl.
Example of an end to end test
The query test1(Debug,1,Passed).
where Debug (trace)=off
tests the following predicate:
test(1,[[n,function],[1,1,[v,c]]],
[
[[n,function],[[v,a],[v,b],[v,c]],":-",
[
[[n,+],[[v,a],[v,b],[v,c]]]
]
]
]
,[[[[v,c], 2]]]).
This query contains the query tested, the predicate and the required result.
Also, the query test1(off,7,Passed).
test(7,[[n,reverse],[[1,2,3],[],[v,l]]],
[
[[n,reverse],[[],[v,l],[v,l]]],
[[n,reverse],[[v,l],[v,m],[v,n]],":-",
[ [[n,head],[[v,l],[v,h]]],
[[n,tail],[[v,l],[v,t]]],
[[n,wrap],[[v,h],[v,h1]]],
[[n,append],[[v,h1],[v,m],[v,o]]],
[[n,reverse],[[v,t],[v,o],[v,n]]]
]
]
],[[[[v,l], [3, 2, 1]]]]).
tests the reverse predicate.
To run all tests (main, types, open and open types) in any language:
test_all00("en",off,NTotal,Score).
test_all00("en2",off,NTotal,Score).
where "en2" is an English language with e.g. "concatenate strings"
instead of stringconcat
("en", or see available language codes - see the Languages repository for instructions about how to install different languages).
- Note 1: drag and drop contents of
test_open_and_types_open_data/
into an empty file in BBEdit (Mac) to copy and paste into Terminal for tests with input.
To run a test from one of main, types, open or open types, run one of:
test_all01(test, 4,"en2",off,1,Passed).
test_all01(test_types_cases,6,"en2",off,1,Passed).
test_all01(testopen_cases, 3,"en2",off,1,Passed).
test_all01(test_open_types, 5,"en2",off,1,Passed).
where 1 is replaced with the test number from
respectively.
- Run Prolog tests:
['lpiverify_pl.pl].
test_pl1(off,A,B).
- See note 1 above.
To run all tests (main, types, open and open types) back-translating to and from any language:
test_all_bt00("en2",off,NTotal,Score).
To run a test from one of main, types, open or open types, run one of:
test_all_bt01(test, 4,"en2",off,1,Passed).
test_all_bt01(test_types_cases,6,"en2",off,1,Passed).
test_all_bt01(testopen_cases, 3,"en2",off,1,Passed).
test_all_bt01(test_open_types, 5,"en2",off,1,Passed).
where 1 is replaced with the test number from
respectively.
- See note 1 above.
See List Prolog Documentation and List Prolog Caveats.
Text to Breasonings now has its own repository.
See Data to Types Documentation.
- To run LPI on a Prolog server:
- Move
lpi-api.pl
to the root (/username/
or~
on a server) of your machine. - Re-enter the paths to your Prolog files in it.
- Enter
[lpi-api.pl]
in SWI-Prolog andserver(8000).
. - On a local host access the algorithm at
http://127.0.0.1:8000
and replace 127.0.0.1 with your server address.
* Above: Cycle of Normal Prolog e.g. a(B,C):-d(E),f. to Simple List Prolog e.g.
[[f1, [a, b, c, d, e], (:-),
[[+, [a, b, f]],
[+, [c, f, g]],
[+, [d, g, h]],
[=, [e, h]]]]]
(Prolog-to-List-Prolog Converter), to List Prolog e.g.
[
[[n,function],[[v,a],[v,b],[v,c]],":-",
[
[[n,+],[[v,a],[v,b],[v,c]]]
]
]
]
(Simple-List-Prolog-to-List-Prolog) back to Normal Prolog (List-Prolog-to-Prolog-Converter).
See Simple-List-Prolog-to-List-Prolog, Prolog-to-List-Prolog (includes Prolog to Simple List Prolog) and List-Prolog-to-Prolog-Converter.
- To return false if an equals4 variable is in terms of itself, for example:
occurs_check([v,a],[[v,a]]).
false.
- then enter
turn_occurs_check(on).
. To returntrue.
above, indicating any occurrences have been ignored, enterturn_occurs_check(off).
(the default).
- Enter
retractall(starlog(_)),assertz(starlog(on)).
to turn on the Starlog trace displays for string_concat, atom_concat and append, e.g.
[call,[[n,append],[[1],[],variable3]],'Press c to creep, s to skip or a to abort.'] creep
[exit,[1]=[1]&[],'Press c to creep or a to abort.'] creep
We will use SemVer for versioning.
Lucian Green - Initial programmer - Lucian Academy
I licensed this project under the BSD3 License - see the LICENSE.md file for details